代码完善
|
|
@ -1,4 +1,4 @@
|
|||
# VITE_API_BASE_URL = http://112.29.103.165:1616
|
||||
# VITE_API_BASE_URL = /api
|
||||
VITE_API_BASE_URL = http://192.168.0.14:1999/hd-realname/prod-api
|
||||
VITE_API_BASE_URL = /api
|
||||
# VITE_API_BASE_URL = http://192.168.0.14:1999/hd-realname/prod-api
|
||||
# VITE_API_BASE_URL = http://192.168.0.234:38080
|
||||
|
|
|
|||
|
|
@ -46,10 +46,13 @@
|
|||
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
|
||||
"<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.INTERNET\"/>"
|
||||
"<uses-permission android:name=\"android.permission.INTERNET\"/>",
|
||||
"<uses-permission android:name=\"android.permission.READ_MEDIA_IMAGES\" />",
|
||||
"<uses-permission android:name=\"android.permission.READ_MEDIA_VIDEO\" />"
|
||||
],
|
||||
"minSdkVersion" : 24,
|
||||
"abiFilters" : [ "armeabi-v7a" ]
|
||||
"targetSdkVersion" : 33,
|
||||
"abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86_64" ]
|
||||
},
|
||||
"webview" : {
|
||||
"allowFileAccess" : true,
|
||||
|
|
|
|||
|
|
@ -197,8 +197,8 @@
|
|||
{
|
||||
"pagePath": "pages/attendance/index",
|
||||
"text": "考勤",
|
||||
"iconPath": "static/image/home.png",
|
||||
"selectedIconPath": "static/image/home-active.png"
|
||||
"iconPath": "static/image/attendance.png",
|
||||
"selectedIconPath": "static/image/attendance-active.png"
|
||||
},
|
||||
{
|
||||
"pagePath": "pages/my/index",
|
||||
|
|
|
|||
|
|
@ -3,60 +3,113 @@
|
|||
<view class="contract-details">
|
||||
<view> 合同见证照片 </view>
|
||||
<view class="contract-image">
|
||||
<view class="contract-image-item" v-for="item in 5" :key="item">
|
||||
<view
|
||||
:key="item.id"
|
||||
class="contract-image-item"
|
||||
v-for="(item, index) in contractInfo?.files"
|
||||
>
|
||||
<up-image
|
||||
src="https://cdn.uviewui.com/uview/album/1.jpg"
|
||||
height="100px"
|
||||
:width="'calc((100% - 40rpx) / 5)' + 'px'"
|
||||
:src="item.lsUrl"
|
||||
mode="scaleToFill"
|
||||
@tap="onTapViewImage(index)"
|
||||
:width="'calc((100% - 40rpx) / 5)' + 'px'"
|
||||
/>
|
||||
|
||||
<text> 工作内容页 </text>
|
||||
<text> {{ contractFileTitle[item.sourceType] }} </text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="contract-content">
|
||||
<view v-for="item in contractContent" :key="item.title" class="contract-content-item">
|
||||
<text>{{ item.title }}</text>
|
||||
<text>{{ item.content }}</text>
|
||||
<text>{{ contractInfo[item.contentKey] || '-' }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup name="ContractDetails">
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { ref } from 'vue'
|
||||
|
||||
const contractInfo = ref({})
|
||||
const contractFileTitle = {
|
||||
1: '人员手持合同照',
|
||||
2: '工作内容页',
|
||||
3: '薪酬约定页',
|
||||
4: '本人签名页',
|
||||
5: '其他照片',
|
||||
}
|
||||
|
||||
const contractContent = [
|
||||
{
|
||||
title: '合同编号',
|
||||
content: '1234567890',
|
||||
contentKey: 'contractCode',
|
||||
},
|
||||
|
||||
{
|
||||
title: '合同期限类型',
|
||||
content: '长期',
|
||||
contentKey: 'contractTermType',
|
||||
},
|
||||
|
||||
{
|
||||
title: '合同签订日期',
|
||||
content: '2021-01-01',
|
||||
contentKey: 'contractStartDate',
|
||||
},
|
||||
{
|
||||
title: '合同终止日期',
|
||||
content: '2021-01-01',
|
||||
contentKey: 'contractStopDate',
|
||||
},
|
||||
{
|
||||
title: '工资核定方式',
|
||||
content: '2021-01-01',
|
||||
contentKey: 'wageApprovedWay',
|
||||
},
|
||||
{
|
||||
title: '工资核定标准',
|
||||
content: '2021-01-01',
|
||||
contentKey: 'wageCriterion',
|
||||
},
|
||||
{
|
||||
title: '合同类型',
|
||||
content: '2021-01-01',
|
||||
contentKey: 'contractType',
|
||||
},
|
||||
]
|
||||
|
||||
const onTapViewImage = (index) => {
|
||||
uni.previewImage({
|
||||
loop: true,
|
||||
current: index,
|
||||
urls: contractInfo.value.files.map((item) => item.lsUrl),
|
||||
})
|
||||
}
|
||||
|
||||
onLoad(() => {
|
||||
const app = getApp()
|
||||
const contractParams = app.globalData.contractParams
|
||||
|
||||
if (contractParams) {
|
||||
const {
|
||||
files,
|
||||
contractCode,
|
||||
wageCriterion,
|
||||
wageApprovedWay,
|
||||
contractStopDate,
|
||||
contractTermType,
|
||||
contractStartDate,
|
||||
} = contractParams
|
||||
|
||||
contractInfo.value = {
|
||||
files,
|
||||
contractCode,
|
||||
wageCriterion,
|
||||
wageApprovedWay,
|
||||
contractTermType,
|
||||
contractStopDate,
|
||||
contractStartDate,
|
||||
contractType: '纸质合同',
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
|
@ -83,7 +136,9 @@ const contractContent = [
|
|||
flex-direction: column;
|
||||
|
||||
text {
|
||||
margin-top: 10rpx;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3,44 +3,82 @@
|
|||
<view class="wage-card-details">
|
||||
<view> 工资卡见证照片 </view>
|
||||
<view class="wage-card-image">
|
||||
<view class="wage-card-image-item" v-for="item in 4" :key="item">
|
||||
<view
|
||||
:key="item.id"
|
||||
class="wage-card-image-item"
|
||||
v-for="(item, index) in wageCardInfo?.files"
|
||||
>
|
||||
<up-image
|
||||
src="https://cdn.uviewui.com/uview/album/1.jpg"
|
||||
:src="item.lsUrl"
|
||||
height="100px"
|
||||
:width="'calc((100% - 40rpx) / 5)' + 'px'"
|
||||
mode="scaleToFill"
|
||||
@tap="onTapViewImage(index)"
|
||||
:width="'calc((100% - 40rpx) / 4)' + 'px'"
|
||||
/>
|
||||
|
||||
<text> 工作内容页 </text>
|
||||
<text> {{ wageCardFileTitle[item.sourceType] }} </text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="wage-card-content">
|
||||
<view v-for="item in wageCardContent" :key="item.title" class="wage-card-content-item">
|
||||
<text>{{ item.title }}</text>
|
||||
<text>{{ item.content }}</text>
|
||||
<text>{{ wageCardInfo[item.contentKey] || '-' }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup name="WageCardDetails">
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import { ref } from 'vue'
|
||||
const wageCardInfo = ref({})
|
||||
const wageCardFileTitle = {
|
||||
1: '手持银行卡、承诺书',
|
||||
2: '银行卡照片',
|
||||
3: '个人工资卡承诺书',
|
||||
4: '其它照片',
|
||||
}
|
||||
const wageCardContent = [
|
||||
{
|
||||
title: '银行卡号',
|
||||
content: '1234567890',
|
||||
contentKey: 'bankCardCode',
|
||||
},
|
||||
|
||||
{
|
||||
title: '银行名称',
|
||||
content: '中国银行',
|
||||
contentKey: 'bankName',
|
||||
},
|
||||
|
||||
{
|
||||
title: '支行名称',
|
||||
content: '中国银行',
|
||||
contentKey: 'bankBranchName',
|
||||
},
|
||||
]
|
||||
|
||||
const onTapViewImage = (index) => {
|
||||
uni.previewImage({
|
||||
loop: true,
|
||||
current: index,
|
||||
urls: wageCardInfo.value.files.map((item) => item.lsUrl),
|
||||
})
|
||||
}
|
||||
|
||||
onLoad(() => {
|
||||
const app = getApp()
|
||||
const contractParams = app.globalData.contractParams
|
||||
|
||||
if (contractParams) {
|
||||
const { wageFiles, bankName, bankCardCode, bankBranchName } = contractParams
|
||||
|
||||
wageCardInfo.value = {
|
||||
bankName,
|
||||
bankCardCode,
|
||||
bankBranchName,
|
||||
files: wageFiles,
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
|
@ -67,7 +105,9 @@ const wageCardContent = [
|
|||
flex-direction: column;
|
||||
|
||||
text {
|
||||
margin-top: 10rpx;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -25,9 +25,9 @@
|
|||
<up-input
|
||||
clearable
|
||||
prefixIcon="account"
|
||||
class="custom-input"
|
||||
placeholder="请输入用户名"
|
||||
v-model="opinionModel.username"
|
||||
class="custom-input"
|
||||
/>
|
||||
</up-form-item>
|
||||
|
||||
|
|
@ -36,10 +36,10 @@
|
|||
<up-input
|
||||
clearable
|
||||
prefixIcon="lock"
|
||||
class="custom-input"
|
||||
placeholder="请输入密码"
|
||||
:password="!showPassword"
|
||||
v-model="opinionModel.password"
|
||||
class="custom-input"
|
||||
>
|
||||
<template #suffix>
|
||||
<!-- <u-icon
|
||||
|
|
@ -65,10 +65,10 @@
|
|||
<view style="width: 35%" class="img-content" ref="imgContentRef">
|
||||
<up-image
|
||||
:src="codeUrl"
|
||||
mode="scaleToFill"
|
||||
@tap="onHandleCodeImg"
|
||||
:width="imgWidth + 'px'"
|
||||
:height="imgHeight + 'px'"
|
||||
mode="scaleToFill"
|
||||
/>
|
||||
</view>
|
||||
</up-form-item>
|
||||
|
|
@ -77,10 +77,11 @@
|
|||
<up-form-item prop="remember" class="remember-item">
|
||||
<up-checkbox
|
||||
usedAlone
|
||||
size="16"
|
||||
name="agree"
|
||||
iconSize="14"
|
||||
label="记住密码"
|
||||
v-model:checked="remember"
|
||||
iconSize="14"
|
||||
>
|
||||
</up-checkbox>
|
||||
</up-form-item>
|
||||
|
|
@ -88,12 +89,12 @@
|
|||
<!-- 登录按钮 -->
|
||||
<up-form-item class="login-btn-item">
|
||||
<up-button
|
||||
type="primary"
|
||||
text="登录"
|
||||
@tap="onSubmitLogin"
|
||||
type="primary"
|
||||
shape="circle"
|
||||
color="linear-gradient(135deg, #2979ff, #5e35b1)"
|
||||
class="login-btn"
|
||||
@tap="onSubmitLogin"
|
||||
color="linear-gradient(135deg, #2979ff, #5e35b1)"
|
||||
/>
|
||||
</up-form-item>
|
||||
</up-form>
|
||||
|
|
|
|||
|
|
@ -64,11 +64,11 @@
|
|||
v-model="editPasswordAgainModel.newPassword"
|
||||
>
|
||||
<template #suffix>
|
||||
<u-icon
|
||||
<!-- <u-icon
|
||||
:name="!showPassword_2 ? 'eye-fill' : 'eye'"
|
||||
@tap="showPassword_2 = !showPassword_2"
|
||||
size="20"
|
||||
/>
|
||||
/> -->
|
||||
</template>
|
||||
</up-input>
|
||||
</up-form-item>
|
||||
|
|
@ -81,11 +81,11 @@
|
|||
v-model="editPasswordAgainModel.newPasswordAgain"
|
||||
>
|
||||
<template #suffix>
|
||||
<u-icon
|
||||
<!-- <u-icon
|
||||
:name="!showPassword_3 ? 'eye-fill' : 'eye'"
|
||||
@tap="showPassword_3 = !showPassword_3"
|
||||
size="20"
|
||||
/>
|
||||
/> -->
|
||||
</template>
|
||||
</up-input>
|
||||
</up-form-item>
|
||||
|
|
@ -245,7 +245,9 @@ const onHandleSubmit = () => {
|
|||
// 调后台接口修改密码
|
||||
const editParams = {
|
||||
password: editPasswordAgainModel.value.newPassword,
|
||||
id: memberStore.userInfo.id,
|
||||
phonenumber: editPasswordModel.value.username,
|
||||
oldPassword: editPasswordModel.value.oldPassword,
|
||||
// id: memberStore.userInfo.id,
|
||||
}
|
||||
console.log(
|
||||
'%c🔍 修改密码请求入参 %c',
|
||||
|
|
|
|||
|
|
@ -1,93 +1,132 @@
|
|||
<template>
|
||||
<!-- 人员资质查询 -->
|
||||
<view class="aptitude-query">
|
||||
<view class="taps-container">
|
||||
<view class="aptitude-query app-container">
|
||||
<!-- <view class="taps-container">
|
||||
<view :class="{ active: activeName === '姓名' }" @tap="activeName = '姓名'">
|
||||
姓名
|
||||
</view>
|
||||
<view :class="{ active: activeName === '组织' }" @tap="activeName = '组织'">
|
||||
组织
|
||||
</view>
|
||||
</view>
|
||||
</view> -->
|
||||
|
||||
<view class="search-container" v-if="activeName === '姓名'">
|
||||
<view class="search-container">
|
||||
<up-search
|
||||
bgColor="#fff"
|
||||
placeholder="请输入"
|
||||
v-model="nameValue"
|
||||
:show-action="false"
|
||||
borderColor="#3c9cff"
|
||||
@search="onSearchName"
|
||||
searchIconColor="#3c9cff"
|
||||
@clickIcon="onSearchName"
|
||||
v-model="queryParams.workerName"
|
||||
/>
|
||||
</view>
|
||||
|
||||
<view class="list-container" v-if="activeName === '姓名'">
|
||||
<view class="list-item" v-for="item in 10" :key="item" @tap="onPersonDetails(item)">
|
||||
<scroll-view
|
||||
scroll-y
|
||||
v-if="total > 0"
|
||||
class="list-container"
|
||||
@scrolltolower="onHandleScrollToLower"
|
||||
>
|
||||
<view
|
||||
class="list-item"
|
||||
v-for="item in personList"
|
||||
:key="item.workerId"
|
||||
@tap="onPersonDetails(item)"
|
||||
>
|
||||
<view>
|
||||
<text>姓名</text>
|
||||
<text>李思思</text>
|
||||
<text>{{ item.workerName }}</text>
|
||||
</view>
|
||||
<view>
|
||||
<text>身份证</text>
|
||||
<text>李思思</text>
|
||||
<text>{{ item.idNumber }}</text>
|
||||
</view>
|
||||
<view>
|
||||
<text>工种</text>
|
||||
<text>李思思</text>
|
||||
<text>{{ item.postName }}</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="loading-text">
|
||||
{{ !hasMore ? '没有更多数据了~' : '正在加载...' }}
|
||||
</view>
|
||||
</scroll-view>
|
||||
|
||||
<view v-if="total === 0" class="empty-content">
|
||||
<up-empty :icon="Empty" />
|
||||
</view>
|
||||
|
||||
<view v-if="activeName === '组织'">
|
||||
<!-- <view v-if="activeName === '组织'">
|
||||
<u-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick" />
|
||||
</view>
|
||||
</view> -->
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup name="AptitudeQuery">
|
||||
import { ref } from 'vue'
|
||||
import { onMounted, ref, computed } from 'vue'
|
||||
import { getAttendanceRecordAPI } from '@/services/attendance.js'
|
||||
import { useCommonStore } from '@/stores'
|
||||
import { debounce } from 'lodash-es'
|
||||
import Empty from '@/static/image/Empty.png'
|
||||
|
||||
const activeName = ref('姓名')
|
||||
const nameValue = ref('')
|
||||
const personList = ref([])
|
||||
const total = ref(0)
|
||||
const commonStore = useCommonStore() // 工程信息
|
||||
|
||||
const defaultProps = {
|
||||
children: 'children',
|
||||
label: 'label',
|
||||
nodeKey: 'id',
|
||||
const queryParams = ref({
|
||||
pageNum: 1,
|
||||
pageSize: 12,
|
||||
workerName: '',
|
||||
proName: commonStore?.activeProjectName,
|
||||
})
|
||||
|
||||
// 获取人员列表
|
||||
const getPersonList = async () => {
|
||||
const res = await getAttendanceRecordAPI(queryParams.value)
|
||||
total.value = res?.total
|
||||
personList.value = [...personList.value, ...res?.rows]
|
||||
}
|
||||
|
||||
const treeData = ref([
|
||||
{
|
||||
id: 1,
|
||||
label: '一级 1',
|
||||
children: [
|
||||
{
|
||||
id: 2,
|
||||
label: '二级 1-1',
|
||||
children: [
|
||||
{ id: 3, label: '三级 1-1-1' },
|
||||
{ id: 4, label: '三级 1-1-2' },
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
])
|
||||
// 滚动到底部
|
||||
const onHandleScrollToLower = debounce(() => {
|
||||
if (hasMore.value) {
|
||||
queryParams.value.pageNum++
|
||||
getPersonList()
|
||||
}
|
||||
}, 1000)
|
||||
|
||||
const onSearchName = () => {
|
||||
queryParams.value.pageNum = 1
|
||||
personList.value = []
|
||||
getPersonList()
|
||||
}
|
||||
|
||||
// 是否还有更多数据
|
||||
const hasMore = computed(() => {
|
||||
return personList.value.length < total.value
|
||||
})
|
||||
|
||||
// 查看人员详情
|
||||
const onPersonDetails = (item) => {
|
||||
uni.navigateTo({
|
||||
url: `/pages/person-details/index?id=${item.id}`,
|
||||
url: `/pages/person-details/index?id=${item.workerId}`,
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getPersonList()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.aptitude-query {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
padding: 20rpx;
|
||||
box-sizing: border-box;
|
||||
flex-direction: column;
|
||||
// height: 100%;
|
||||
// display: flex;
|
||||
// padding: 20rpx;
|
||||
// box-sizing: border-box;
|
||||
// flex-direction: column;
|
||||
background-color: #fff;
|
||||
}
|
||||
.taps-container {
|
||||
|
|
|
|||
|
|
@ -3,19 +3,11 @@
|
|||
<view class="person-check">
|
||||
<view class="person-check-item">
|
||||
<view @tap="onFaceRecognition">
|
||||
<up-image
|
||||
width="80px"
|
||||
height="80px"
|
||||
src="https://cdn.uviewui.com/uview/album/1.jpg"
|
||||
/>
|
||||
<up-image width="60px" height="60px" :src="FaceIcon" />
|
||||
<text>人脸识别</text>
|
||||
</view>
|
||||
<view @tap="onPersonCheck">
|
||||
<up-image
|
||||
width="80px"
|
||||
height="80px"
|
||||
src="https://cdn.uviewui.com/uview/album/1.jpg"
|
||||
/>
|
||||
<up-image width="60px" height="60px" :src="CheckIcon" />
|
||||
<text>人员资质查询</text>
|
||||
</view>
|
||||
</view>
|
||||
|
|
@ -24,9 +16,11 @@
|
|||
|
||||
<script setup name="PersonCheck">
|
||||
import { ref } from 'vue'
|
||||
import FaceIcon from '@/static/image/face.png'
|
||||
import CheckIcon from '@/static/image/person-qua.png'
|
||||
|
||||
const onFaceRecognition = () => {
|
||||
uni.$u.toast('功能正在开发中,敬请期待...')
|
||||
// uni.$u.toast('功能正在开发中,敬请期待...')
|
||||
// console.log('onFaceRecognition')
|
||||
|
||||
// 打开前置摄像头
|
||||
|
|
@ -36,6 +30,21 @@ const onFaceRecognition = () => {
|
|||
// console.log(result)
|
||||
// },
|
||||
// })
|
||||
|
||||
uni.chooseImage({
|
||||
count: 1, // 最多选择1张图片
|
||||
sizeType: ['original', 'compressed'],
|
||||
sourceType: ['camera', 'album'], // 选择图片的来源
|
||||
success: (res) => {
|
||||
console.log(res, '----选取的文件')
|
||||
},
|
||||
fail: (err) => {
|
||||
uni.$u.toast({
|
||||
title: '选择图片失败',
|
||||
icon: 'none',
|
||||
})
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
// 打开人员资质查询页面
|
||||
|
|
|
|||
|
|
@ -5,17 +5,17 @@
|
|||
<view class="person-info">
|
||||
<view class="person-info-left">
|
||||
<up-image
|
||||
src="https://cdn.uviewui.com/uview/album/1.jpg"
|
||||
width="100px"
|
||||
height="140px"
|
||||
mode="scaleToFill"
|
||||
:src="personDetails?.facePhoto"
|
||||
/>
|
||||
</view>
|
||||
<view class="person-info-right">
|
||||
<view class="name">
|
||||
<text>李思思</text>
|
||||
<text class="ellipsis-text">{{ personDetails?.name }}</text>
|
||||
<text :style="{ color: initColor }">
|
||||
{{ statusName }}
|
||||
{{ initLightStatus }}
|
||||
</text>
|
||||
<up-icon
|
||||
size="16"
|
||||
|
|
@ -25,13 +25,14 @@
|
|||
name="question-circle-fill"
|
||||
/>
|
||||
</view>
|
||||
<view class="job"> 高空作业人员 </view>
|
||||
<view class="company"> xxxj建设有限公司 </view>
|
||||
<view class="project"> 66332g工程66332g工程66332g工程66332g工程 </view>
|
||||
<view class="job"> {{ personDetails?.postName }} </view>
|
||||
<view class="company"> {{ personDetails?.proName }} </view>
|
||||
<view class="project"> {{ personDetails?.subName }} </view>
|
||||
<view class="project"> {{ personDetails?.teamName }} </view>
|
||||
</view>
|
||||
|
||||
<view class="status-light">
|
||||
<up-image :src="YellowLight" width="60px" height="60px" mode="scaleToFill" />
|
||||
</view>
|
||||
<view class="status-light">
|
||||
<up-image :src="initLightImage" width="60px" height="60px" mode="scaleToFill" />
|
||||
</view>
|
||||
</view>
|
||||
<TitleTipModal TitleTip="今日考勤" />
|
||||
|
|
@ -39,63 +40,97 @@
|
|||
<view class="att-content">
|
||||
<view>
|
||||
<text> 打卡时间 :</text>
|
||||
<text>10:00:00</text>
|
||||
<text>{{ todayAttTime || '无' }}</text>
|
||||
</view>
|
||||
<view class="info-card" :class="todayAttTime ? 'success-card' : 'error-card'">
|
||||
{{ todayAttTime ? '已打卡' : '未打卡' }}
|
||||
</view>
|
||||
<view class="info-card success-card"> 已打卡 </view>
|
||||
</view>
|
||||
</view>
|
||||
<TitleTipModal TitleTip="合同信息" />
|
||||
<view class="attendance-info">
|
||||
<view class="att-content" @click="onContractDetails">
|
||||
<view class="info-item">
|
||||
<up-icon size="24" name="checkmark-circle-fill" color="#4cd964" />
|
||||
<up-icon
|
||||
size="24"
|
||||
:name="
|
||||
lightStatusList[1]?.value == '1'
|
||||
? 'checkmark-circle-fill'
|
||||
: 'close-circle-fill'
|
||||
"
|
||||
:color="initContractColor"
|
||||
/>
|
||||
<text>纸质合同</text>
|
||||
</view>
|
||||
<view class="info-card success-card"> 已签订 </view>
|
||||
<view
|
||||
class="info-card"
|
||||
:class="lightStatusList[1]?.value == '1' ? 'success-card' : 'error-card'"
|
||||
>
|
||||
{{ lightStatusList[1]?.value == '1' ? '已签订' : '未签订' }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<TitleTipModal TitleTip="工资卡信息" />
|
||||
<view class="attendance-info">
|
||||
<view class="att-content" @click="onWageCardDetails">
|
||||
<view class="info-item">
|
||||
<up-icon size="24" name="close-circle-fill" color="#dd524d" />
|
||||
<up-icon
|
||||
size="24"
|
||||
:name="
|
||||
lightStatusList[0]?.value == '1'
|
||||
? 'checkmark-circle-fill'
|
||||
: 'close-circle-fill'
|
||||
"
|
||||
:color="initWageCardColor"
|
||||
/>
|
||||
<text>工资卡见证</text>
|
||||
</view>
|
||||
<view class="info-card error-card"> 未签订 </view>
|
||||
<view
|
||||
class="info-card"
|
||||
:class="lightStatusList[0]?.value == '1' ? 'success-card' : 'error-card'"
|
||||
>
|
||||
{{ lightStatusList[0]?.value == '1' ? '已上传' : '未上传' }}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 红绿灯说明 -->
|
||||
<up-popup
|
||||
mode="center"
|
||||
@open="onOpen"
|
||||
@close="onClose"
|
||||
:show="redLightShow"
|
||||
closeOnClickOverlay
|
||||
>
|
||||
<view class="red-light-popup">
|
||||
<view class="title"> 红绿灯说明 </view>
|
||||
<view class="red-light-content">
|
||||
<view
|
||||
:class="lightStatusList[1]?.value == '1' ? 'green-light' : 'yellow-light'"
|
||||
>
|
||||
<text>
|
||||
{{ lightStatusList[1]?.value == '1' ? '绿灯' : '黄灯' }}
|
||||
</text>
|
||||
<text>
|
||||
{{
|
||||
lightStatusList[1]?.value == '1'
|
||||
? '合同和工资卡已上传'
|
||||
: '合同或工资卡未上传'
|
||||
}}
|
||||
</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<up-icon
|
||||
color="#fff"
|
||||
size="20"
|
||||
class="close-icon"
|
||||
name="close-circle"
|
||||
@click="onClose"
|
||||
/>
|
||||
</view>
|
||||
</up-popup>
|
||||
</view>
|
||||
|
||||
<!-- 红绿灯说明 -->
|
||||
<up-popup
|
||||
mode="center"
|
||||
@open="onOpen"
|
||||
@close="onClose"
|
||||
:show="redLightShow"
|
||||
closeOnClickOverlay
|
||||
>
|
||||
<view class="red-light-popup">
|
||||
<view class="title"> 红绿灯说明 </view>
|
||||
<view class="red-light-content">
|
||||
<view class="yellow-light">
|
||||
<text>黄灯</text>
|
||||
<text>合同或工资卡未上传</text>
|
||||
</view>
|
||||
<view class="green-light">
|
||||
<text>绿灯</text>
|
||||
<text>合同和工资卡已上传</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<up-icon
|
||||
color="#fff"
|
||||
size="20"
|
||||
class="close-icon"
|
||||
name="close-circle"
|
||||
@click="onClose"
|
||||
/>
|
||||
</view>
|
||||
</up-popup>
|
||||
</template>
|
||||
|
||||
<script setup name="PersonDetails">
|
||||
|
|
@ -103,13 +138,41 @@ import { ref, computed } from 'vue'
|
|||
import TitleTipModal from '@/components/TitleTipModal/index'
|
||||
import GreenLight from '@/static/image/person/green_light.png'
|
||||
import YellowLight from '@/static/image/person/yellow_light.png'
|
||||
import { getPersonDetailsByIdAPI, getPersonContractAndWageCardAPI } from '@/services/attendance.js'
|
||||
import { onLoad } from '@dcloudio/uni-app'
|
||||
import dayjs from 'dayjs'
|
||||
|
||||
const statusName = ref('黄灯')
|
||||
const redLightShow = ref(false)
|
||||
const todayAttTime = ref(null)
|
||||
|
||||
const personDetails = ref({})
|
||||
const personDetailsAll = ref({})
|
||||
const lightStatusList = ref([])
|
||||
|
||||
const initColor = computed(() => {
|
||||
if (statusName.value === '黄灯') return '#f4c622'
|
||||
if (statusName.value === '绿灯') return '#00ff00'
|
||||
if (personDetails.value.lightStatus == 1) return '#f4c622'
|
||||
if (personDetails.value.lightStatus == 2) return '#00ff00'
|
||||
})
|
||||
|
||||
const initLightStatus = computed(() => {
|
||||
if (personDetails.value.lightStatus == 1) return '黄灯'
|
||||
if (personDetails.value.lightStatus == 2) return '绿灯'
|
||||
})
|
||||
|
||||
const initLightImage = computed(() => {
|
||||
if (personDetails.value.lightStatus == 1) return YellowLight
|
||||
if (personDetails.value.lightStatus == 2) return GreenLight
|
||||
})
|
||||
|
||||
const initContractColor = computed(() => {
|
||||
if (lightStatusList.value[1]?.value == '1') return '#4cd964'
|
||||
if (lightStatusList.value[1]?.value == '0') return '#dd524d'
|
||||
})
|
||||
|
||||
const initWageCardColor = computed(() => {
|
||||
if (lightStatusList.value[0]?.value == '1') return '#4cd964'
|
||||
if (lightStatusList.value[0]?.value == '0') return '#dd524d'
|
||||
})
|
||||
|
||||
const onClose = () => {
|
||||
|
|
@ -121,16 +184,65 @@ const onOpen = () => {
|
|||
}
|
||||
|
||||
const onContractDetails = () => {
|
||||
if (lightStatusList.value[1]?.value == 0) {
|
||||
uni.$u.toast('请先签订合同')
|
||||
return
|
||||
}
|
||||
|
||||
const app = getApp()
|
||||
app.globalData.contractParams = personDetailsAll.value
|
||||
uni.navigateTo({
|
||||
url: '/pages/ContractDetails/index',
|
||||
})
|
||||
}
|
||||
|
||||
const onWageCardDetails = () => {
|
||||
if (lightStatusList.value[0]?.value == 0) {
|
||||
uni.$u.toast('请先上传工资卡')
|
||||
return
|
||||
}
|
||||
const app = getApp()
|
||||
app.globalData.contractParams = personDetailsAll.value
|
||||
uni.navigateTo({
|
||||
url: '/pages/WageCardDetails/index',
|
||||
url: `/pages/WageCardDetails/index?params=${JSON.stringify(personDetailsAll.value)}`,
|
||||
})
|
||||
}
|
||||
|
||||
// 获取人员详情数据
|
||||
const getPersonDetailsByIdFun = async (id) => {
|
||||
const res = await getPersonDetailsByIdAPI({ id })
|
||||
|
||||
const { name, lightStatus, postName, subName, teamName, proName, facePhoto, attTime } = res.data
|
||||
personDetailsAll.value = res.data
|
||||
|
||||
personDetails.value = {
|
||||
name,
|
||||
postName,
|
||||
subName,
|
||||
teamName,
|
||||
proName,
|
||||
facePhoto,
|
||||
lightStatus,
|
||||
}
|
||||
|
||||
const result = await getPersonContractAndWageCardAPI({ id })
|
||||
lightStatusList.value = result?.data
|
||||
|
||||
const date = attTime?.split(' ')[0] || null
|
||||
const time = attTime?.split(' ')[1] || null
|
||||
|
||||
// 判断是否为当天
|
||||
const isToday = dayjs(date).format('YYYY-MM-DD') === dayjs().format('YYYY-MM-DD')
|
||||
if (isToday) {
|
||||
todayAttTime.value = time
|
||||
}
|
||||
}
|
||||
|
||||
onLoad((options) => {
|
||||
if (options?.id) {
|
||||
getPersonDetailsByIdFun(options?.id)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
|
@ -143,6 +255,7 @@ const onWageCardDetails = () => {
|
|||
}
|
||||
|
||||
.person-info {
|
||||
width: 100%;
|
||||
margin: 20rpx 0;
|
||||
padding: 20rpx;
|
||||
display: flex;
|
||||
|
|
@ -190,13 +303,13 @@ const onWageCardDetails = () => {
|
|||
letter-spacing: 2rpx;
|
||||
font-weight: 500;
|
||||
}
|
||||
}
|
||||
|
||||
.status-light {
|
||||
position: absolute;
|
||||
right: 20rpx;
|
||||
top: 0;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.status-light {
|
||||
position: absolute;
|
||||
right: 20rpx;
|
||||
top: 140rpx;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.attendance-info {
|
||||
|
|
@ -233,7 +346,7 @@ const onWageCardDetails = () => {
|
|||
|
||||
.red-light-popup {
|
||||
width: 80vw;
|
||||
height: 36vh;
|
||||
height: 28vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
|
|
|
|||
|
|
@ -8,3 +8,19 @@ export const getAttendanceRecordAPI = (data) => {
|
|||
data,
|
||||
})
|
||||
}
|
||||
// 考勤页面 获取人员详情接口
|
||||
export const getPersonDetailsByIdAPI = (data) => {
|
||||
return http({
|
||||
method: 'GET',
|
||||
url: '/bmw/homePageSub/getWorkerMsgById',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 考勤页面 获取人员合同工资卡信息接口
|
||||
export const getPersonContractAndWageCardAPI = (data) => {
|
||||
return http({
|
||||
method: 'GET',
|
||||
url: '/bmw/homePageSub/getWorkerLightMsg',
|
||||
data,
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
|
After Width: | Height: | Size: 6.3 KiB |
|
|
@ -33,4 +33,11 @@
|
|||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.ellipsis-text {
|
||||
width: 30%;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 7.1 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 8.0 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 8.6 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 857 B After Width: | Height: | Size: 699 B |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 9.1 KiB |
|
|
@ -10,8 +10,8 @@ export default defineConfig({
|
|||
'/api': {
|
||||
// target: 'http://112.29.103.165:1616', // 测试环境
|
||||
// target: 'http://192.168.0.133:58080', // 梁超
|
||||
// target: 'http://192.168.0.14:1999/hd-realname/prod-api', // 测试环境
|
||||
target: 'http://192.168.0.234:38080', // 方亮
|
||||
target: 'http://192.168.0.14:1999/hd-realname/prod-api', // 测试环境
|
||||
// target: 'http://192.168.0.234:38080', // 方亮
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => {
|
||||
return path.replace(/\/api/, '')
|
||||
|
|
|
|||