This commit is contained in:
BianLzhaoMin 2025-11-10 15:27:42 +08:00
parent 19496ab5b8
commit e331bfc0f4
31 changed files with 748 additions and 387 deletions

View File

@ -8,14 +8,19 @@
:model="contractInfoForm"
:rules="contractInfoFormRules"
>
<up-cell style="padding: 0 13px">
<up-cell style="padding: 0 13px" v-if="isShowBottomAndTop">
<template #icon>
<text class="red-text">
非必填后期可在合同见证模块补录合同但如果部分填写则需把信息全部完善
</text>
</template>
</up-cell>
<up-form-item label="合同类型" prop="postName" :borderBottom="true">
<up-form-item
label="合同类型"
prop="postName"
:borderBottom="true"
v-if="isShowBottomAndTop"
>
<up-cell style="width: 100%" :border="false">
<template #icon> 纸质合同 </template>
</up-cell>
@ -112,7 +117,7 @@
>
<up-upload
multiple
:maxCount="1"
:maxCount="3"
:name="item.name"
accept="image"
:fileList="item.fileList"
@ -125,7 +130,7 @@
</up-form-item>
</up-form>
<view class="red-text tip-container">
<view class="red-text tip-container" v-if="isShowBottomAndTop">
<text> 提醒事项 </text>
<text> 1 未完成合同上传未黄灯人员</text>
<text> 2 生成工资册之前必须上传合同信息工资册根据合同核定标准生成</text>
@ -167,30 +172,30 @@ const contractImageList = ref([
name: 'contract',
title: '人员手持合同照',
},
{
type: 2,
fileList: [],
name: 'contract',
title: '工作内容页',
},
{
type: 3,
fileList: [],
name: 'contract',
title: '薪酬约定页',
},
{
type: 4,
fileList: [],
name: 'contract',
title: '本人签名页',
},
{
type: 5,
fileList: [],
name: 'contract',
title: '其他照片',
},
// {
// type: 2,
// fileList: [],
// name: 'contract',
// title: '',
// },
// {
// type: 3,
// fileList: [],
// name: 'contract',
// title: '',
// },
// {
// type: 4,
// fileList: [],
// name: 'contract',
// title: '',
// },
// {
// type: 5,
// fileList: [],
// name: 'contract',
// title: '',
// },
]) //
const contractInfoFormRules = ref({
@ -319,7 +324,7 @@ const checkFormStatus = () => {
let emptyFieldCount = 0
let filledFieldCount = 0
const fieldsList = [
'contractCode', //
// 'contractCode', //
'wageCriterion', //
'contractStopDate', //
'contractStartDate', //
@ -367,7 +372,7 @@ const validateContractForm = async () => {
// console.log(status)
if (status === 'partial') {
uni.$u.toast('请完善合同见证中的所有信息')
return reject(new Error('合同信息未完善'))
return reject({ isValid: false, msg: '提交失败,请完善合同见证中的信息' })
} else {
let data = {}
if (contractImageIdList.value.length > 0) {
@ -421,6 +426,12 @@ const props = defineProps({
type: Boolean,
default: false,
},
//
isShowBottomAndTop: {
type: Boolean,
default: true,
},
})
//

View File

@ -1,15 +1,16 @@
<template>
<!-- 导航栏 -->
<up-navbar :title="navBarTitle">
<up-navbar class="nav-bar-modal" :title="navBarTitle">
<template #left>
<view class="u-nav-slot" @tap="onHandleBack">
<up-icon name="arrow-left" size="20" color="#2979ff" />
返回
<up-icon name="arrow-left" size="18" :color="PRIMARY_COLOR" />
</view>
</template>
<template #right v-if="showUploadRecord">
<text style="color: #2979ff" @tap="onHandleUploadRecord">上传记录</text>
<template #right>
<slot name="right">
<!-- <up-icon name="home-fill" size="22" :color="PRIMARY_COLOR" @tap="onHandleHome" /> -->
</slot>
</template>
</up-navbar>
</template>
@ -18,44 +19,80 @@
const props = defineProps({
//
navBarTitle: {
type: String,
default: () => '个人中心',
},
//
showUploadRecord: {
type: Boolean,
default: () => false,
},
// url
uploadRecordUrl: {
type: String,
default: () => '',
},
})
const PRIMARY_COLOR = '#007aff'
//
const onHandleBack = () => {
uni.navigateBack()
}
//
const onHandleUploadRecord = () => {
uni.navigateTo({
url: props.uploadRecordUrl,
//
const onHandleHome = () => {
uni.switchTab({
url: '/pages/home/index',
})
}
</script>
<style scoped>
.u-nav-slot {
display: flex;
align-items: center;
color: #2979ff;
<style scoped lang="scss">
@import '@/uni.scss';
.nav-bar-modal {
::v-deep .u-navbar__content {
padding: 0 18px;
min-height: 50px;
background: linear-gradient(
90deg,
rgba($uni-color-primary, 0.08),
rgba($uni-color-primary, 0.02)
);
box-shadow: 0 10px 30px rgba(27, 72, 132, 0.06);
backdrop-filter: blur(12px);
transition:
background 0.3s ease,
box-shadow 0.3s ease;
}
::v-deep .u-navbar__content__title {
font-size: 17px;
font-weight: 600;
color: #1c1d21;
letter-spacing: 0.4px;
}
::v-deep .u-navbar__content__right {
display: flex;
align-items: center;
gap: 10px;
font-size: 14px;
color: #5e6170;
}
}
::v-deep .u-navbar__content__title {
font-weight: bold;
.u-nav-slot {
// display: inline-flex;
// align-items: center;
// justify-content: center;
// width: 34px;
// height: 34px;
// border-radius: 50%;
// background: rgba($uni-color-primary, 0.16);
// box-shadow: 0 6px 16px rgba($uni-color-primary, 0.18);
// transition:
// transform 0.2s ease,
// box-shadow 0.2s ease,
// background 0.2s ease;
}
.u-nav-slot:active {
transform: translateY(1px);
box-shadow: 0 3px 10px rgba($uni-color-primary, 0.25);
background: rgba($uni-color-primary, 0.24);
}
</style>

View File

@ -45,7 +45,8 @@
{
"path": "pages/attendance/record/index",
"style": {
"navigationBarTitleText": "打卡记录"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
//
@ -60,7 +61,8 @@
{
"path": "pages/my/edit-password/index",
"style": {
"navigationBarTitleText": "修改密码"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
@ -68,7 +70,8 @@
{
"path": "pages/person-entry/index",
"style": {
"navigationBarTitleText": "人员入场"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
@ -78,6 +81,7 @@
"path": "pages/person-entry/child-pages/addAndEditPerson",
"style": {
// "navigationBarTitleText": "新增人员信息"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
@ -86,7 +90,8 @@
{
"path": "pages/person-entry/child-pages/editPerson",
"style": {
"navigationBarTitleText": "修改人员信息"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
@ -94,14 +99,16 @@
{
"path": "pages/person-entry/child-pages/faceRecognition",
"style": {
"navigationBarTitleText": "人脸识别查找"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
//
{
"path": "pages/person-entry/child-pages/projectSetting",
"style": {
"navigationBarTitleText": "上海人员多工程设置"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
@ -109,7 +116,8 @@
{
"path": "pages/person-exit/index",
"style": {
"navigationBarTitleText": "人员出场"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
@ -117,56 +125,66 @@
{
"path": "pages/person-exit/data-upload/index",
"style": {
"navigationBarTitleText": "人员出场资料上传"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
//
{
"path": "pages/person-check/index",
"style": {
"navigationBarTitleText": "人员资质查询"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
// ----
{
"path": "pages/person-check/aptitude-query/index",
"style": {
"navigationBarTitleText": "人员资质查询"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
//
{
"path": "pages/att-count/index",
"style": {
"navigationBarTitleText": "考勤统计"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
// ----
{
"path": "pages/att-count/person-details/index",
"style": {
"navigationBarTitleText": "个人详情"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
//
{
"path": "pages/person-details/index",
"style": {
"navigationBarTitleText": "人员详情"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
//
{
"path": "pages/ContractDetails/index",
"style": {
"navigationBarTitleText": "合同详情"
// "navigationBarTitleText": "合同详情"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
//
{
"path": "pages/WageCardDetails/index",
"style": {
"navigationBarTitleText": "工资卡详情"
// "navigationBarTitleText": "工资卡详情"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
//
@ -181,28 +199,36 @@
{
"path": "pages/machine-setting/index",
"style": {
"navigationBarTitleText": "考勤机设置"
// "navigationBarTitleText": "考勤机设置"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
// ----
{
"path": "pages/machine-setting/components/bindSetting",
"style": {
"navigationBarTitleText": "考勤机设置"
// "navigationBarTitleText": "考勤机设置"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
//
{
"path": "pages/shProjectDetails/index",
"style": {
"navigationBarTitleText": "上海多工程设置明细"
// "navigationBarTitleText": "上海多工程设置明细"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
//
{
"path": "pages/shProjectDetails/child-pages/addProject",
"style": {
"navigationBarTitleText": "新增入场工程"
// "navigationBarTitleText": "新增入场工程"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
@ -210,42 +236,48 @@
{
"path": "pages/home/child-pages/all-project/index",
"style": {
"navigationBarTitleText": "总工程"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
// ----
{
"path": "pages/home/child-pages/lot-project/index",
"style": {
"navigationBarTitleText": "标段工程"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
// ----
{
"path": "pages/home/child-pages/useSub/index",
"style": {
"navigationBarTitleText": "在用分包"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
// ----
{
"path": "pages/home/child-pages/useTeam/index",
"style": {
"navigationBarTitleText": "在用班组"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
// ----
{
"path": "pages/home/child-pages/personInfo/index",
"style": {
"navigationBarTitleText": "人员列表"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
},
// ----
{
"path": "pages/home/child-pages/entryUnsettled/index",
"style": {
"navigationBarTitleText": "出场未上传《离场结算确认单》"
"navigationBarTitleText": "custom",
"navigationStyle": "custom"
}
}
],

View File

@ -1,6 +1,7 @@
<template>
<!-- 合同详情 -->
<view class="contract-details">
<NavBarModal navBarTitle="合同详情" />
<view class="contract-details" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view> 合同见证照片 </view>
<view class="contract-image">
<view
@ -32,7 +33,8 @@
<script setup name="ContractDetails">
import { onLoad } from '@dcloudio/uni-app'
import { ref } from 'vue'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const contractInfo = ref({})
const contractFileTitle = {
1: '人员手持合同照',

View File

@ -1,6 +1,7 @@
<template>
<!-- 工资卡详情 -->
<view class="wage-card-details">
<NavBarModal navBarTitle="工资卡详情" />
<view class="wage-card-details" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view> 工资卡见证照片 </view>
<view class="wage-card-image">
<view
@ -32,6 +33,8 @@
<script setup name="WageCardDetails">
import { onLoad } from '@dcloudio/uni-app'
import { ref } from 'vue'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const wageCardInfo = ref({})
const wageCardFileTitle = {
1: '手持银行卡、承诺书',

View File

@ -1,6 +1,7 @@
<template>
<!-- 考勤统计 -->
<view class="att-count app-container">
<NavBarModal navBarTitle="考勤统计" />
<view class="att-count app-container" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="project-name"> {{ activeProjectName || '请选择工程' }} </view>
<view class="date-picker-box">
<view>
@ -95,7 +96,8 @@ import { getAttCountListAPI } from '@/services/att-count'
import dayjs from 'dayjs'
import Empty from '@/static/image/Empty.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const commonStore = useCommonStore()
const tableContentHeight = ref('') //
const activeProjectName = ref('') //

View File

@ -1,6 +1,7 @@
<template>
<!-- 个人详情 -->
<view class="attendance-record">
<NavBarModal navBarTitle="个人详情" />
<view class="attendance-record" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="search-content">
<view style="width: 28%; margin-right: 12rpx">
<up-select
@ -51,7 +52,8 @@
import { onLoad } from '@dcloudio/uni-app'
import { ref, computed, onMounted, nextTick } from 'vue'
import { getAttCountPersonDetailsAPI } from '@/services/att-count.js'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const inputRef = ref(null)
const searchNameValue = ref('') //
const statusId = ref('') //

View File

@ -1,6 +1,11 @@
<template>
<!-- 打卡记录 -->
<view class="attendance-record app-container">
<NavBarModal navBarTitle="打卡记录" />
<view
class="attendance-record app-container"
:style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }"
>
<view class="search-content">
<view style="width: 28%; margin-right: 12rpx">
<up-select
@ -21,7 +26,7 @@
v-model="queryParams.workerName"
>
<template #suffix>
<up-icon name="search" size="24" color="#909399" @tap="onSearchName" />
<up-icon :name="SearchIcon" size="24" @tap="onSearchName" />
</template>
</up-input>
</view>
@ -31,7 +36,7 @@
<view style="width: 12%">序号</view>
<view style="width: 30%">姓名</view>
<view style="width: 22%">考勤状态</view>
<view style="width: 34%">时间</view>
<view style="width: 36%">时间</view>
</view>
<scroll-view
@ -59,7 +64,7 @@
text="未考勤"
/>
</view>
<view style="width: 34%">{{ item.attTime }}</view>
<view style="width: 36%">{{ item.attTime }}</view>
</view>
<view class="loading-text">
@ -80,7 +85,10 @@ import { ref, computed, onMounted, nextTick } from 'vue'
import { getAttendanceRecordAPI } from '@/services/attendance'
import Empty from '@/static/image/Empty.png'
import SearchIcon from '@/static/image/home/search.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const inputRef = ref(null)
const selectHeight = ref(0) //
const total = ref(0) //

View File

@ -1,6 +1,11 @@
<template>
<!-- 总工程 -->
<view class="machine-setting">
<NavBarModal navBarTitle="总工程">
<template #right>
<up-icon name="home-fill" size="22" color="#007aff" @tap="onHandleHome" />
</template>
</NavBarModal>
<view class="machine-setting" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="search-content">
<up-input
clearable
@ -57,10 +62,12 @@ import { getHomeIndexAllProjectAPI } from '@/services/home-index.js'
import { useCommonStore } from '@/stores'
import Empty from '@/static/image/Empty.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const inputRef = ref(null) //
const allProjectList = ref([]) //
const total = ref(0) //
const { safeAreaInsets } = uni.getSystemInfoSync()
const commonStore = useCommonStore() //
const queryParams = ref({
@ -112,6 +119,13 @@ const onMachineSettingItem = (item) => {
})
}
//
const onHandleHome = () => {
uni.switchTab({
url: '/pages/home/index',
})
}
onMounted(() => {
getAllProjectListFun()
})

View File

@ -1,6 +1,11 @@
<template>
<!-- 出场未结算 -->
<view class="project-list-container">
<NavBarModal navBarTitle="出场未上传《离场结算确认单》">
<template #right>
<up-icon name="home-fill" size="22" color="#007aff" @tap="onHandleHome" />
</template>
</NavBarModal>
<view class="project-list-container" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="search-content">
<view class="search-wrapper">
<up-input
@ -79,6 +84,8 @@ import { getHomeIndexEntryUnsettledMsgAPI } from '@/services/home-index.js'
import { onLoad } from '@dcloudio/uni-app'
import Empty from '@/static/image/Empty.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const inputRef = ref(null) //
const personList = ref([]) //
@ -134,6 +141,13 @@ const hasMore = computed(() => {
onLoad(async (options) => {
getPersonListFun()
})
//
const onHandleHome = () => {
uni.switchTab({
url: '/pages/home/index',
})
}
</script>
<style scoped lang="scss">

View File

@ -1,6 +1,11 @@
<template>
<!-- 标段工程 -->
<view class="project-list-container">
<NavBarModal navBarTitle="标段工程">
<template #right>
<up-icon name="home-fill" size="22" color="#007aff" @tap="onHandleHome" />
</template>
</NavBarModal>
<view class="project-list-container" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="search-content">
<view class="search-wrapper">
<up-input
@ -184,6 +189,9 @@ import {
import { onLoad } from '@dcloudio/uni-app'
import Empty from '@/static/image/Empty.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const inputRef = ref(null) //
const projectList = ref([]) //
@ -474,6 +482,13 @@ onLoad(async (options) => {
getAllProjectListFun()
})
//
const onHandleHome = () => {
uni.switchTab({
url: '/pages/home/index',
})
}
</script>
<style scoped lang="scss">

View File

@ -1,6 +1,11 @@
<template>
<!-- 标段工程 -->
<view class="project-list-container">
<NavBarModal navBarTitle="在场人员">
<template #right>
<up-icon name="home-fill" size="22" color="#007aff" @tap="onHandleHome" />
</template>
</NavBarModal>
<view class="project-list-container" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="search-content">
<view class="search-wrapper">
<up-input
@ -11,7 +16,7 @@
placeholder="输入姓名"
>
<template #suffix>
<up-icon name="search" size="24" color="#909399" @tap="onSearchName" />
<up-icon :name="searchIcon" size="24" color="#909399" @tap="onSearchName" />
</template>
</up-input>
<up-icon
@ -22,7 +27,31 @@
@tap="onOpenFilter"
/>
</view>
<view class="data-summary">已查询 {{ total }} 条数据</view>
<view v-if="isAdvancedOpen" class="advanced-search">
<up-input
clearable
class="search-name"
v-model="queryParams.subName"
placeholder="输入分包名称"
/>
<up-input
clearable
class="search-name"
v-model="queryParams.proName"
placeholder="输入工程名称"
/>
</view>
<view class="data-summary">
<text> 已查询 {{ total }} 条数据 </text>
<up-icon
size="28"
@tap="toggleAdvanced"
style="transform: rotate(270deg)"
:name="isAdvancedOpen ? closeIcon : openIcon"
/>
</view>
</view>
<scroll-view scroll-y class="project-list-content" @scrolltolower="onHandleScrollToLower">
@ -158,13 +187,20 @@ import { getSubCompanySelectList, getPostTypeList } from '@/utils/common'
import { onLoad } from '@dcloudio/uni-app'
import Empty from '@/static/image/Empty.png'
import searchIcon from '@/static/image/home/search.png'
import openIcon from '@/static/image/home/open.png'
import closeIcon from '@/static/image/home/close.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const inputRef = ref(null) //
const projectList = ref([]) //
const total = ref(0) //
const isLoading = ref(false) //
const showFilterPanel = ref(false) //
const subCompanyList = ref([]) //
const isAdvancedOpen = ref(false) //
const commonStore = useCommonStore() //
const commonPath = '/pages/home/child-pages/'
@ -172,6 +208,8 @@ const commonPath = '/pages/home/child-pages/'
const queryParams = ref({
pageNum: 1,
pageSize: 10,
subName: '', //
proName: '', //
proId: '',
subId: '',
@ -340,6 +378,10 @@ const onSearchName = () => {
getPersonListFun()
}
const toggleAdvanced = () => {
isAdvancedOpen.value = !isAdvancedOpen.value
}
//
const getPersonListFun = async (isRefresh = false) => {
const queryParamsCopy = JSON.parse(JSON.stringify(queryParams.value))
@ -519,6 +561,13 @@ onLoad(async (options) => {
}
getPersonListFun()
})
//
const onHandleHome = () => {
uni.switchTab({
url: '/pages/home/index',
})
}
</script>
<style scoped lang="scss">
@ -553,10 +602,20 @@ onLoad(async (options) => {
}
}
.advanced-search {
margin-top: 20rpx;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20rpx;
}
.data-summary {
margin-top: 20rpx;
font-size: 24rpx;
color: #4ca4fe;
display: flex;
align-items: center;
gap: 20rpx;
}
}

View File

@ -1,21 +1,51 @@
<template>
<!-- 在建工程 -->
<view class="project-list-container">
<!-- 在用分包 -->
<NavBarModal navBarTitle="在用分包">
<template #right>
<up-icon name="home-fill" size="22" color="#007aff" @tap="onHandleHome" />
</template>
</NavBarModal>
<view class="project-list-container" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="search-content">
<view class="search-wrapper">
<view class="search-header">
<view class="search-wrapper">
<up-input
clearable
ref="inputRef"
class="search-name"
v-model="queryParams.subName"
placeholder="输入分包名称"
>
<template #suffix>
<up-icon :name="searchIcon" size="26" @tap="onSearchName" />
</template>
</up-input>
</view>
</view>
<view v-if="isAdvancedOpen" class="advanced-search">
<up-input
clearable
ref="inputRef"
class="search-name"
v-model="queryParams.proName"
placeholder="输入分包名称"
>
<template #suffix>
<up-icon name="search" size="24" color="#909399" @tap="onSearchName" />
</template>
</up-input>
placeholder="输入工程名称"
/>
<up-input
clearable
class="search-name"
v-model="queryParams.subCompanyName"
placeholder="输入分公司名称"
/>
</view>
<view class="data-summary">
<text> 已查询 {{ total }} 条数据 </text>
<up-icon
size="28"
@tap="toggleAdvanced"
style="transform: rotate(270deg)"
:name="isAdvancedOpen ? closeIcon : openIcon"
/>
</view>
<view class="data-summary">已查询 {{ total }} 条数据</view>
</view>
<scroll-view scroll-y class="project-list-content" @scrolltolower="onHandleScrollToLower">
@ -74,7 +104,11 @@ import { ref, computed, onMounted } from 'vue'
import { getHomeIndexUseSubMsgAPI } from '@/services/home-index.js'
import { onLoad } from '@dcloudio/uni-app'
import Empty from '@/static/image/Empty.png'
import searchIcon from '@/static/image/home/search.png'
import openIcon from '@/static/image/home/open.png'
import closeIcon from '@/static/image/home/close.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const inputRef = ref(null) //
const projectList = ref([]) //
const total = ref(0) //
@ -88,9 +122,17 @@ const queryParams = ref({
pageSize: 10,
proId: '', //ID
mainProId: '', // ID
subName: '', //
proName: '', //
subCompanyName: '', //
})
const isAdvancedOpen = ref(false) //
const toggleAdvanced = () => {
isAdvancedOpen.value = !isAdvancedOpen.value
}
//
const rowList = ref([
{
@ -207,6 +249,13 @@ onLoad((options) => {
queryParams.value.mainProId = options?.mainProId
getUseSubProjectListFun()
})
//
const onHandleHome = () => {
uni.switchTab({
url: '/pages/home/index',
})
}
</script>
<style scoped lang="scss">
@ -226,25 +275,39 @@ onLoad((options) => {
border-radius: 10rpx;
border: 1px solid #e5e5e5;
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.08);
box-sizing: border-box;
.search-wrapper {
display: flex;
align-items: center;
// .search-header {
// display: flex;
// align-items: center;
// .search-wrapper {
// width: 85%;
// // flex: 1;
// }
// .search-actions {
// display: flex;
// align-items: center;
// justify-content: center;
// flex: 1;
// }
// }
.advanced-search {
margin-top: 20rpx;
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 20rpx;
.search-name {
flex: 1;
}
.filter-icon {
padding: 10rpx;
}
}
.data-summary {
margin-top: 20rpx;
font-size: 24rpx;
color: #4ca4fe;
display: flex;
align-items: center;
gap: 20rpx;
}
}

View File

@ -1,6 +1,11 @@
<template>
<!-- 在用班组 -->
<view class="project-list-container">
<NavBarModal navBarTitle="在用班组">
<template #right>
<up-icon name="home-fill" size="22" color="#007aff" @tap="onHandleHome" />
</template>
</NavBarModal>
<view class="project-list-container" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="search-content">
<view class="search-wrapper">
<up-input
@ -75,7 +80,8 @@ import { ref, computed, onMounted } from 'vue'
import { getHomeIndexUseTeamMsgAPI } from '@/services/home-index.js'
import { onLoad } from '@dcloudio/uni-app'
import Empty from '@/static/image/Empty.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const inputRef = ref(null) //
const projectList = ref([]) //
const total = ref(0) //
@ -194,6 +200,13 @@ onLoad((options) => {
queryParams.value.subId = options?.subId
getAllProjectListFun()
})
//
const onHandleHome = () => {
uni.switchTab({
url: '/pages/home/index',
})
}
</script>
<style scoped lang="scss">

View File

@ -1,7 +1,11 @@
<template>
<view>
<!-- 绑定设置 -->
<view class="bind-setting-container">
<NavBarModal navBarTitle="绑定设置" />
<view
class="bind-setting-container"
:style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }"
>
<!-- 通讯编码 -->
<view class="form-item">
<text class="label-text">考勤机编码</text>
@ -77,6 +81,8 @@
<script setup name="bindSetting">
import { ref, onMounted } from 'vue'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
import {
getSubcontractorListAPI,
getSubTeamContractListAPI,

View File

@ -1,6 +1,7 @@
<template>
<!-- 考勤机设置 -->
<view class="machine-setting">
<NavBarModal navBarTitle="考勤机设置" />
<view class="machine-setting" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="search-content">
<up-input
clearable
@ -77,7 +78,8 @@ import { debounce } from 'lodash-es'
import { ref, computed, onMounted, onUnmounted, nextTick } from 'vue'
import { getMachineListAPI } from '@/services/machine-setting.js'
import { useCommonStore } from '@/stores'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
import Empty from '@/static/image/Empty.png'
const inputRef = ref(null) //

View File

@ -1,6 +1,7 @@
<template>
<!-- 修改密码页面 -->
<view class="edit-password">
<NavBarModal navBarTitle="修改密码" />
<view class="edit-password" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<up-steps :current="currenSteps">
<up-steps-item title="验证账号"> </up-steps-item>
<up-steps-item title="设置密码"></up-steps-item>
@ -125,7 +126,9 @@
import { nextTick, ref, onMounted } from 'vue'
import { useMemberStore } from '@/stores'
import { checkPasswordApi, editPasswordApi } from '@/services/my.js'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const memberStore = useMemberStore() //
const showPassword_1 = ref(false) //
const showPassword_2 = ref(false) //

View File

@ -1,6 +1,10 @@
<template>
<!-- 人员资质查询 -->
<view class="aptitude-query app-container">
<NavBarModal navBarTitle="人员资质查询" />
<view
class="aptitude-query app-container"
:style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }"
>
<!-- <view class="taps-container">
<view :class="{ active: activeName === '姓名' }" @tap="activeName = '姓名'">
姓名
@ -70,7 +74,8 @@ import { getAttendanceRecordAPI } from '@/services/attendance.js'
import { useCommonStore } from '@/stores'
import { debounce } from 'lodash-es'
import Empty from '@/static/image/Empty.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const personList = ref([])
const total = ref(0)
const commonStore = useCommonStore() //

View File

@ -1,6 +1,7 @@
<template>
<!-- 人员资质查询 -->
<view class="person-check">
<NavBarModal navBarTitle="人员资质查询" />
<view class="person-check" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="person-check-item">
<view @tap="onFaceRecognition">
<up-image width="60px" height="60px" :src="FaceIcon" />
@ -28,7 +29,8 @@
import { ref } from 'vue'
import FaceIcon from '@/static/image/face.png'
import CheckIcon from '@/static/image/person-qua.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const showLoading = ref(false) //
const onFaceRecognition = () => {

View File

@ -1,6 +1,7 @@
<template>
<!-- 人员详情 -->
<view class="person-details">
<NavBarModal navBarTitle="人员详情" />
<view class="person-details" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<TitleTipModal TitleTip="基本信息" />
<view class="person-info">
<view class="person-info-left">
@ -141,7 +142,8 @@ 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'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const statusName = ref('黄灯')
const redLightShow = ref(false)
const todayAttTime = ref(null)
@ -308,7 +310,7 @@ onLoad((options) => {
.status-light {
position: absolute;
right: 20rpx;
top: 140rpx;
top: 220rpx;
border-radius: 50%;
}

View File

@ -99,7 +99,7 @@ const navBarTitle = ref('新增人员信息')
const currentStep = ref(0) //
const nextBtnRef = ref(null) // ref
const nextBtnHeight = ref(0) //
const paddingTop = ref(46) // padding
const paddingTop = ref(54) // padding
const personIdCardFormRef = ref(null) // ref
const personKeyInfoFormRef = ref(null) // ref
const personContractFormRef = ref(null) // ref
@ -151,29 +151,36 @@ const contractImageList = ref([
name: 'contract',
title: '人员手持合同照',
},
// {
// type: 2,
// fileList: [],
// name: 'contract',
// title: '',
// },
// {
// type: 3,
// fileList: [],
// name: 'contract',
// title: '',
// },
// {
// type: 4,
// fileList: [],
// name: 'contract',
// title: '',
// },
// {
// type: 5,
// fileList: [],
// name: 'contract',
// title: '',
// },
{
type: 2,
type: 6,
fileList: [],
name: 'contract',
title: '工作内容页',
},
{
type: 3,
fileList: [],
name: 'contract',
title: '薪酬约定页',
},
{
type: 4,
fileList: [],
name: 'contract',
title: '本人签名页',
},
{
type: 5,
fileList: [],
name: 'contract',
title: '其他照片',
title: '附件',
},
]) //
const contractStatus = ref('') //

View File

@ -1,6 +1,7 @@
<template>
<!-- 修改人员信息 -->
<view class="aptitude-query">
<NavBarModal navBarTitle="修改人员信息" />
<view class="aptitude-query" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="search-container">
<up-search
bgColor="#fff"
@ -65,7 +66,8 @@ import { getPersonListAPI } from '@/services/person-entry'
import { useCommonStore } from '@/stores'
import Empty from '@/static/image/Empty.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const commonStore = useCommonStore() //
const personList = ref([]) //
const total = ref(0) //

View File

@ -1,55 +1,54 @@
<template>
<!-- 上海人员多工程设置 -->
<view>
<view
class="project-setting-container"
:style="{
paddingTop: safeAreaInsets?.top + paddingTop + 'px',
}"
>
<!-- 身份证号码输入 -->
<view class="input-section">
<view class="input-label">身份证号码:</view>
<up-input
v-model="idCardNumber"
placeholder="输入身份证号码"
:clearable="true"
:maxlength="18"
class="id-card-input"
/>
</view>
<!-- 设置说明 -->
<view class="instruction-section">
<view class="instruction-title">上海人员多工程设置说明:</view>
<view class="instruction-list">
<view class="instruction-item"> 1.请确保该人员已经入场一个上海工程 </view>
<view class="instruction-item">
2.每个工程,人员只能存在一条在场数据,即一个工程只能入场一次
</view>
<view class="instruction-item">
3.如需出场,请至
<text class="instruction-link" @tap="onHandlePersonExit">人员出场</text>
模块进行单个工程出场操作
</view>
</view>
</view>
<!-- 下一步按钮 -->
<view class="next-btn">
<up-button type="primary" text="下一步" @tap="onHandleNext" />
</view>
<up-loading-icon
:vertical="true"
duration="2000"
color="#3c9cff"
:show="showLoading"
textColor="#3c9cff"
text="正在处理,请稍后..."
style="position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%)"
<NavBarModal navBarTitle="上海人员多工程设置" />
<view
class="project-setting-container"
:style="{
paddingTop: safeAreaInsets?.top + paddingTop + 'px',
}"
>
<!-- 身份证号码输入 -->
<view class="input-section">
<view class="input-label">身份证号码:</view>
<up-input
v-model="idCardNumber"
placeholder="输入身份证号码"
:clearable="true"
:maxlength="18"
class="id-card-input"
/>
</view>
<!-- 设置说明 -->
<view class="instruction-section">
<view class="instruction-title">上海人员多工程设置说明:</view>
<view class="instruction-list">
<view class="instruction-item"> 1.请确保该人员已经入场一个上海工程 </view>
<view class="instruction-item">
2.每个工程,人员只能存在一条在场数据,即一个工程只能入场一次
</view>
<view class="instruction-item">
3.如需出场,请至
<text class="instruction-link" @tap="onHandlePersonExit">人员出场</text>
模块进行单个工程出场操作
</view>
</view>
</view>
<!-- 下一步按钮 -->
<view class="next-btn">
<up-button type="primary" text="下一步" @tap="onHandleNext" />
</view>
<up-loading-icon
:vertical="true"
duration="2000"
color="#3c9cff"
:show="showLoading"
textColor="#3c9cff"
text="正在处理,请稍后..."
style="position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%)"
/>
</view>
</template>
@ -60,7 +59,7 @@ import { getShProjectSettingByIdNumberAPI } from '@/services/shProjectSetting'
const { safeAreaInsets } = uni.getSystemInfoSync()
const navBarTitle = ref('上海人员多工程设置')
const paddingTop = ref(10) // padding
const paddingTop = ref(54) // padding
const idCardNumber = ref('') //
const showLoading = ref(false) //

View File

@ -1,28 +1,32 @@
<template>
<!-- 人员入场 -->
<view
:key="item.name"
class="person-handle"
v-for="item in handleList"
@tap="handleTapPersonEntry(item)"
:style="{
background: `linear-gradient(to bottom, ${item.bgc_color_1}, ${item.bgc_color_2})`,
}"
>
<image :src="item.icon" mode="widthFix" class="icon-img" />
<view>
<view>{{ item.title }}</view>
</view>
<NavBarModal navBarTitle="人员入场" />
<up-loading-icon
:vertical="true"
duration="2000"
color="#3c9cff"
:show="showLoading"
textColor="#3c9cff"
text="正在识别中,请稍后..."
style="position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%)"
/>
<view :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view
:key="item.name"
class="person-handle"
v-for="item in handleList"
@tap="handleTapPersonEntry(item)"
:style="{
background: `linear-gradient(to bottom, ${item.bgc_color_1}, ${item.bgc_color_2})`,
}"
>
<image :src="item.icon" mode="widthFix" class="icon-img" />
<view>
<view>{{ item.title }}</view>
</view>
<up-loading-icon
:vertical="true"
duration="2000"
color="#3c9cff"
:show="showLoading"
textColor="#3c9cff"
text="正在识别中,请稍后..."
style="position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%)"
/>
</view>
</view>
</template>
@ -31,10 +35,11 @@ import AddIcon from '@/static/image/person/add.png'
import EditIcon from '@/static/image/person/edit.png'
import FaceIcon from '@/static/image/person/face.png'
import ProSettingIcon from '@/static/image/person/pro_setting.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
import { ref } from 'vue'
const showLoading = ref(false) //
const { safeAreaInsets } = uni.getSystemInfoSync()
const handleList = [
{
name: 'add',

View File

@ -1,6 +1,7 @@
<template>
<!-- 人员出场资料上传 -->
<view class="data-upload">
<NavBarModal navBarTitle="人员出场资料上传" />
<view class="data-upload" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="exit-tip">
<view class="red-text exit-tip-item">1. 出场前请确保人员合同及工资卡已上传完整</view>
<view class="red-text exit-tip-item">2. 人员出场合同自动失效不再考勤打卡</view>
@ -81,7 +82,8 @@ import { useCommonStore } from '@/stores'
import { onLoad } from '@dcloudio/uni-app'
import { editPersonEntryExitApi } from '@/services/person-entry.js'
import { decryptWithSM4, encryptWithSM4, hashWithSM3AndSalt } from '@/utils/sm.js'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const commonStore = useCommonStore()
const exitParams = ref({}) //
const fileList = ref([]) //

View File

@ -1,6 +1,7 @@
<template>
<!-- 人员出场 -->
<view class="person-exit">
<NavBarModal navBarTitle="人员出场" />
<view class="person-exit" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view class="search-content">
<view style="width: 28%; margin-right: 12rpx">
<up-select
@ -105,7 +106,9 @@ import { getPersonExitListAPI } from '@/services/person-exit.js'
import { useCommonStore } from '@/stores'
import Empty from '@/static/image/Empty.png'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const inputRef = ref(null)
const selectHeight = ref(0) //
const personExitList = ref([]) //

View File

@ -1,154 +1,155 @@
<template>
<!-- 添加入场数据 -->
<view>
<view
class="add-project-container"
:style="{
paddingBottom: nextBtnHeight + 'px',
paddingTop: safeAreaInsets?.top + paddingTop + 'px',
}"
>
<!-- 提示信息 -->
<view class="instruction-section">
<text class="instruction-text">
提交后,系统自动生成一条入场数据,该人员基础信息合同信息工资卡信息共用
</text>
</view>
<!-- 表单区域 -->
<view class="form-container">
<up-form
labelWidth="120"
labelPosition="left"
:model="formData"
:rules="formRules"
ref="formRef"
>
<!-- 姓名 -->
<up-form-item label="姓名" prop="name" :borderBottom="true">
<up-input
v-model="formData.name"
placeholder="请输入姓名"
:clearable="false"
:disabled="true"
/>
</up-form-item>
<!-- 身份证号 -->
<up-form-item label="身份证号" prop="idNumber" :borderBottom="true">
<up-input
v-model="formData.idNumber"
placeholder="请输入身份证号"
:clearable="false"
:disabled="true"
/>
</up-form-item>
<!-- 工种 -->
<up-form-item label="工种" prop="postName" :borderBottom="true">
<up-cell
isLink
size="large"
style="width: 100%"
@tap="onOpenPicker(1)"
:border="false"
>
<template #icon>
<text
:class="{ 'color-text': formData.postName }"
class="time-text"
>
{{ formData.postName || '选择选项' }}
</text>
</template>
</up-cell>
</up-form-item>
<!-- 入场工程 -->
<up-form-item label="入场工程" prop="proName" :borderBottom="true">
<up-cell
isLink
size="large"
style="width: 100%"
@tap="onOpenPicker(2)"
:border="false"
>
<template #icon>
<text :class="{ 'color-text': formData.proName }" class="time-text">
{{ formData.proName || '选择选项' }}
</text>
</template>
</up-cell>
</up-form-item>
<!-- 入场分包 -->
<up-form-item label="入场分包" prop="subName" :borderBottom="true">
<up-cell
isLink
size="large"
style="width: 100%"
@tap="onOpenPicker(3)"
:border="false"
>
<template #icon>
<text :class="{ 'color-text': formData.subName }" class="time-text">
{{ formData.subName || '选择选项' }}
</text>
</template>
</up-cell>
</up-form-item>
<!-- 入场班组 -->
<up-form-item label="入场班组" prop="teamName" :borderBottom="true">
<up-cell
isLink
size="large"
style="width: 100%"
@tap="onOpenPicker(4)"
:border="false"
>
<template #icon>
<text
:class="{ 'color-text': formData.teamName }"
class="time-text"
>
{{ formData.teamName || '选择选项' }}
</text>
</template>
</up-cell>
</up-form-item>
</up-form>
</view>
<!-- 底部按钮 -->
<view class="next-btn" ref="nextBtnRef">
<up-button
color="#909399"
text="取消"
@tap="onHandleCancel"
style="margin-right: 10px"
/>
<up-button
type="primary"
text="提交"
@tap="onHandleSubmit"
style="margin-right: 10px"
/>
<up-button color="#67c23a" text="提交并继续添加" @tap="onHandleSubmitAndContinue" />
</view>
<!-- 加载中 -->
<up-loading-icon
:vertical="true"
duration="2000"
color="#3c9cff"
:show="showLoading"
textColor="#3c9cff"
text="数据正在提交,请稍后..."
style="position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%)"
/>
<NavBarModal navBarTitle="新增入场工程" />
<view
class="add-project-container"
:style="{
paddingBottom: nextBtnHeight + 'px',
paddingTop: safeAreaInsets?.top + 54 + 'px',
}"
>
<!-- 提示信息 -->
<view class="instruction-section">
<text class="instruction-text">
提交后,系统自动生成一条入场数据,该人员基础信息合同信息工资卡信息共用
</text>
</view>
<!-- 表单区域 -->
<scroll-view scroll-y class="form-container">
<TitleTipModal TitleTip="基本信息" style="margin-top: 20rpx" />
<up-form
labelWidth="120"
labelPosition="left"
:model="formData"
:rules="formRules"
ref="formRef"
>
<!-- 姓名 -->
<up-form-item label="姓名" prop="name" :borderBottom="true">
<up-input
v-model="formData.name"
placeholder="请输入姓名"
:clearable="false"
:disabled="true"
/>
</up-form-item>
<!-- 身份证号 -->
<up-form-item label="身份证号" prop="idNumber" :borderBottom="true">
<up-input
v-model="formData.idNumber"
placeholder="请输入身份证号"
:clearable="false"
:disabled="true"
/>
</up-form-item>
<!-- 工种 -->
<up-form-item label="工种" prop="postName" :borderBottom="true">
<up-cell
isLink
size="large"
style="width: 100%"
@tap="onOpenPicker(1)"
:border="false"
>
<template #icon>
<text :class="{ 'color-text': formData.postName }" class="time-text">
{{ formData.postName || '选择选项' }}
</text>
</template>
</up-cell>
</up-form-item>
<!-- 入场工程 -->
<up-form-item label="入场工程" prop="proName" :borderBottom="true">
<up-cell
isLink
size="large"
style="width: 100%"
@tap="onOpenPicker(2)"
:border="false"
>
<template #icon>
<text :class="{ 'color-text': formData.proName }" class="time-text">
{{ formData.proName || '选择选项' }}
</text>
</template>
</up-cell>
</up-form-item>
<!-- 入场分包 -->
<up-form-item label="入场分包" prop="subName" :borderBottom="true">
<up-cell
isLink
size="large"
style="width: 100%"
@tap="onOpenPicker(3)"
:border="false"
>
<template #icon>
<text :class="{ 'color-text': formData.subName }" class="time-text">
{{ formData.subName || '选择选项' }}
</text>
</template>
</up-cell>
</up-form-item>
<!-- 入场班组 -->
<up-form-item label="入场班组" prop="teamName" :borderBottom="true">
<up-cell
isLink
size="large"
style="width: 100%"
@tap="onOpenPicker(4)"
:border="false"
>
<template #icon>
<text :class="{ 'color-text': formData.teamName }" class="time-text">
{{ formData.teamName || '选择选项' }}
</text>
</template>
</up-cell>
</up-form-item>
</up-form>
<TitleTipModal TitleTip="合同见证" style="margin-top: 20rpx" />
<ContractForm
:isShowBottomAndTop="false"
ref="personContractFormRef"
:contractInfo="contractInfo"
:contractImageList="contractImageList"
/>
</scroll-view>
<!-- 底部按钮 -->
<view class="next-btn" ref="nextBtnRef">
<up-button
color="#909399"
text="取消"
@tap="onHandleCancel"
style="margin-right: 10px"
/>
<up-button
type="primary"
text="提交"
@tap="onHandleSubmit"
style="margin-right: 10px"
/>
<up-button color="#67c23a" text="提交并继续添加" @tap="onHandleSubmitAndContinue" />
</view>
<!-- 加载中 -->
<up-loading-icon
:vertical="true"
duration="2000"
color="#3c9cff"
:show="showLoading"
textColor="#3c9cff"
text="数据正在提交,请稍后..."
style="position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%)"
/>
<!-- 工种选择器 -->
<up-picker
:show="postPickerShow"
@ -195,6 +196,8 @@
import { ref, onMounted, nextTick } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import NavBarModal from '@/components/NavBarModal/index.vue'
import ContractForm from '@/components/ContractForm/index.vue'
import TitleTipModal from '@/components/TitleTipModal/index'
import {
getPostTypeSelectListAPI,
getSubSelectListByConditionAPI,
@ -211,6 +214,7 @@ const nextBtnHeight = ref(0) // 下一步按钮高度
const formRef = ref(null) // ref
const showLoading = ref(false) //
const workerId = ref('') // ID
const personContractFormRef = ref(null) // ref
//
const formData = ref({
@ -226,6 +230,39 @@ const formData = ref({
postId: '',
id: '',
})
const contractInfo = ref({}) //
const contractImageList = ref([
{
type: 1,
fileList: [],
name: 'contract',
title: '人员手持合同照',
},
// {
// type: 2,
// fileList: [],
// name: 'contract',
// title: '',
// },
// {
// type: 3,
// fileList: [],
// name: 'contract',
// title: '',
// },
// {
// type: 4,
// fileList: [],
// name: 'contract',
// title: '',
// },
// {
// type: 5,
// fileList: [],
// name: 'contract',
// title: '',
// },
]) //
//
const formRules = ref({
@ -387,7 +424,13 @@ const submitData = async (isContinue) => {
if (!valid) {
return
}
const res = await personContractFormRef.value.validateContractForm()
if (res.isValid) {
console.log(res, 'res校验通过')
return
}
console.log(res, 'res校验失败')
showLoading.value = true
// TODO: API
const result = await addShProjectEntryAPI(formData.value)
@ -419,8 +462,9 @@ const submitData = async (isContinue) => {
}
}
} catch (error) {
console.log(error, 'error---')
showLoading.value = false
uni.$u.toast('提交失败,请重试')
uni.$u.toast(error?.msg || '提交失败,请完善基本信息!')
}
}
@ -544,6 +588,8 @@ onLoad((options) => {
.add-project-container {
height: 100%;
display: flex;
padding: 20rpx;
box-sizing: border-box;
flex-direction: column;
background-color: #fff;
}
@ -552,7 +598,6 @@ onLoad((options) => {
padding: 20rpx 30rpx;
background-color: #fff2f0;
border-left: 6rpx solid #ff4d4f;
margin: 0 30rpx 0;
.instruction-text {
color: #ff4d4f;
@ -563,8 +608,9 @@ onLoad((options) => {
.form-container {
flex: 1;
margin-top: 20rpx;
// margin-top: 20rpx;
overflow-y: auto;
// background-color: skyblue;
}
.next-btn {

View File

@ -1,6 +1,7 @@
<template>
<!-- 上海多工程设置明细 -->
<view class="person-exit">
<NavBarModal navBarTitle="上海多工程设置" />
<view class="person-exit" :style="{ paddingTop: safeAreaInsets?.top + 54 + 'px' }">
<view style="margin: 20rpx 0">
<up-button type="primary" text="新增入场工程" @tap="onHandleAddProject" />
</view>
@ -58,7 +59,8 @@ import { useCommonStore } from '@/stores'
import Empty from '@/static/image/Empty.png'
import { onLoad } from '@dcloudio/uni-app'
import NavBarModal from '@/components/NavBarModal/index.vue'
const { safeAreaInsets } = uni.getSystemInfoSync()
const shProjectList = ref([]) //
const total = ref(0) //
const commonStore = useCommonStore() //

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB