增加待办事项和入场文件

This commit is contained in:
BianLzhaoMin 2026-01-07 18:59:07 +08:00
parent 3a18a1a788
commit b8b59ee576
11 changed files with 2401 additions and 3 deletions

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 获取人员入场附件接口
export const getEntryFileAPI = (data) => {
return request({
url: '/bmw/worker/getWorkerFileMsg',
method: 'GET',
params: data,
})
}

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 待办事项 获取待办事项列表接口
export const getTodoListAPI = (data) => {
return request({
url: '/bmw/todo/list',
method: 'get',
params: data,
})
}

View File

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1767782310782" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4964" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M888.37 698.15c-33.83-36.33-97.11-91.01-97.11-270.13 0.08-132.57-93.96-246.54-224.13-271.64V119.9c0-30.95-25.09-56.03-56.03-56.03s-56.03 25.09-56.03 56.03v36.48c-130.17 25.1-224.21 139.07-224.13 271.64 0 179.1-63.29 233.77-97.11 270.13a54.742 54.742 0 0 0-14.72 38.1c0 30.95 25.09 56.03 56.03 56.03H847.24c30.95 0.16 56.16-24.79 56.33-55.74v-0.3a54.68 54.68 0 0 0-15.07-38.01l-0.13-0.08z m-651.03 10c37.16-48.95 77.77-130.14 77.97-279.1v-1c0-108.31 87.8-196.11 196.11-196.11s196.11 87.8 196.11 196.11v1c0.21 148.99 40.82 230.03 77.97 279.1H237.34z m274 252.24c61.89 0 112.06-50.17 112.06-112.06H399.27c0 61.88 50.17 112.06 112.07 112.06z" p-id="4965" fill="#5a5e66"></path></svg>

After

Width:  |  Height:  |  Size: 1012 B

View File

@ -0,0 +1,30 @@
<template>
<div>
<el-badge :value="1" class="item">
<svg-icon
class-name="size-icon"
icon-class="message_1"
@click="handleClick"
style="font-size: 22px; cursor: pointer"
/>
</el-badge>
</div>
</template>
<script>
export default {
data() {},
methods: {
handleClick() {
this.$router.push('/construction-person/to-do')
},
},
}
</script>
<style scoped>
::v-deep .el-badge__content.is-fixed {
top: 10px;
}
</style>

View File

@ -396,6 +396,21 @@ export default {
} else { } else {
this.$set(this.queryParams, e.f_model, '') this.$set(this.queryParams, e.f_model, '')
} }
// required
if (e.required) {
const field = e.f_model
const message =
e.requiredMessage || `请选择${e.f_label || ''}`.trim()
// change
this.$set(this.formRules, field, [
{
required: true,
message,
trigger: 'change',
},
])
}
}) })
if (this.sendParams !== null) { if (this.sendParams !== null) {
for (let key in this.sendParams) { for (let key in this.sendParams) {
@ -453,7 +468,14 @@ export default {
}, },
/** 查询按钮 */ /** 查询按钮 */
handleQuery() { handleQuery() {
this.getTableList() if (this.$refs.queryFormRef) {
this.$refs.queryFormRef.validate((valid) => {
if (!valid) return
this.getTableList()
})
} else {
this.getTableList()
}
}, },
// //

View File

@ -20,8 +20,8 @@
<div class="right-menu"> <div class="right-menu">
<template v-if="device !== 'mobile'"> <template v-if="device !== 'mobile'">
<message id="message" class="right-menu-item" />
<search id="header-search" class="right-menu-item" /> <search id="header-search" class="right-menu-item" />
<screenfull <screenfull
id="screenfull" id="screenfull"
class="right-menu-item hover-effect" class="right-menu-item hover-effect"
@ -69,7 +69,7 @@ import SizeSelect from '@/components/SizeSelect'
import Search from '@/components/HeaderSearch' import Search from '@/components/HeaderSearch'
import bonusGit from '@/components/bonus/Git' import bonusGit from '@/components/bonus/Git'
import bonusDoc from '@/components/bonus/Doc' import bonusDoc from '@/components/bonus/Doc'
import Message from '@/components/Message'
export default { export default {
components: { components: {
Breadcrumb, Breadcrumb,
@ -80,6 +80,7 @@ export default {
Search, Search,
bonusGit, bonusGit,
bonusDoc, bonusDoc,
Message,
}, },
computed: { computed: {
...mapGetters(['sidebar', 'avatar', 'device']), ...mapGetters(['sidebar', 'avatar', 'device']),

View File

@ -0,0 +1,58 @@
export const formLabel = [
{
f_label: '工程',
f_model: 'proId',
f_type: 'sel',
f_width: '180px',
isShow: false, // 是否展示label
f_selList: [], // 工程列表
// 是否必选,用于 TableModel 做表单校验
required: true,
requiredMessage: '请选择工程',
},
{
f_label: '分包名称',
f_model: 'subName',
f_type: 'ipt',
f_width: '180px',
isShow: false, // 是否展示label
},
{
f_label: '班组名称',
f_model: 'teamName',
f_type: 'ipt',
f_width: '180px',
isShow: false, // 是否展示label
},
{
f_label: '人员姓名',
f_model: 'workerName',
f_type: 'ipt',
f_width: '180px',
isShow: false, // 是否展示label
},
]
export const columnsList = [
{ t_props: 'name', t_label: '人员名称' },
{ t_props: 'postName', t_label: '工种' },
{ t_props: 'subName', t_label: '所属分包' },
{ t_props: 'teamName', t_label: '所属班组' },
{
t_label: '人脸图片',
t_slot: 'faceFile',
},
{ t_label: '合同', t_slot: 'contractFile' },
{
t_label: '工资卡',
t_slot: 'wageFile',
},
]
export const dialogConfig = {
outerTitle: '人员入场附件详情',
minHeight: '90vh',
maxHeight: '90vh',
outerWidth: '90%',
outerVisible: false,
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,158 @@
<template>
<!-- 人员管理 ---- 人员入场 ---- 入场附件 -->
<div class="app-container">
<TableModel
:formLabel="formLabel"
:showOperation="true"
:showRightTools="true"
ref="subBaseInfoTableRef"
:sendParams="sendParams"
:columnsList="columnsList"
:request-api="getEntryFileAPI"
>
<template slot="legalPersonPhone" slot-scope="{ data }">
{{ desensitizePhone(data.legalPersonPhone) }}
</template>
<!-- 营业执照身份证等信息是否上传-->
<template
:slot="item.name"
slot-scope="{ data }"
v-for="item in slots"
>
<span
:key="item.name"
:style="{
color: data[item.name] == 1 ? '#67C23A' : '#F56C6C',
}"
>
{{ data[item.name] == 1 ? '已上传' : '未上传' }}
</span>
</template>
<template slot="handle" slot-scope="{ data }">
<el-button
plain
size="mini"
type="primary"
icon="el-icon-edit"
v-hasPermi="['sub:base:edit']"
@click="onHandleViewEntryFile(data)"
>
详情
</el-button>
</template>
</TableModel>
<DialogModel
:dialogConfig="dialogConfig"
@closeDialogOuter="handleCloseDialogOuter"
>
<template slot="outerContent">
<DetailsForm
:proId="proId"
ref="detailsFormRef"
:queryDetailsId="queryDetailsId"
/>
<el-row class="dialog-footer-btn">
<el-button size="medium" @click="handleCloseDialogOuter">
取消
</el-button>
<el-button
size="medium"
type="primary"
@click="onHandleConfirmAddOrEdit"
>
确定
</el-button>
</el-row>
</template>
</DialogModel>
</div>
</template>
<script>
import TableModel from '@/components/TableModel'
import DialogModel from '@/components/DialogModel'
import DetailsForm from './detailsForm.vue'
import { getEntryFileAPI } from '@/api/construction-person/entry-and-exit-manage/entry-file'
import { formLabel, columnsList, dialogConfig } from './config'
import { getLotProjectSelectListCommonFun } from '@/utils/getCommonData'
export default {
name: 'EntryFile',
components: {
TableModel,
DialogModel,
DetailsForm,
},
data() {
return {
formLabel,
columnsList,
dialogConfig,
getEntryFileAPI,
queryDetailsId: '',
proId: '',
sendParams: {
proId: '',
}, //
//
slots: [
{
name: 'faceFile',
},
{
name: 'contractFile',
},
{
name: 'wageFile',
},
],
}
},
methods: {
//
async onHandleConfirmAddOrEdit() {
this.handleCloseDialogOuter()
},
//
handleCloseDialogOuter() {
this.dialogConfig.outerVisible = false
},
//
onHandleViewEntryFile(data) {
this.queryDetailsId = data.id
this.proId = data.proId
this.dialogConfig.outerVisible = true
},
},
async created() {
const lotProjectList = await getLotProjectSelectListCommonFun()
this.formLabel[0].f_selList = lotProjectList.map((item) => {
return {
label: item.proName,
value: item.id,
}
})
if (lotProjectList && lotProjectList.length > 0) {
//
this.sendParams.proId = lotProjectList[0].id
//
this.$nextTick(() => {
if (this.$refs.subBaseInfoTableRef) {
this.$refs.subBaseInfoTableRef.getTableList()
}
})
}
},
}
</script>

View File

@ -0,0 +1,24 @@
export const formLabel = [
{
f_label: '分包名称',
f_model: 'subName',
f_type: 'ipt',
f_width: '180px',
isShow: false, // 是否展示label
},
]
export const columnsList = [
{ t_props: 'proName', t_label: '工程' },
{ t_props: 'content', t_label: '信息内容' },
{ t_props: 'updateUser', t_label: '提交人' },
{ t_props: 'createTime', t_label: '提交时间' },
]
export const dialogConfig = {
outerTitle: '人员入场附件详情',
minHeight: '90vh',
maxHeight: '90vh',
outerWidth: '90%',
outerVisible: false,
}

View File

@ -0,0 +1,84 @@
<template>
<!-- 施工人员 ---- 待办事项 -->
<div class="app-container">
<div style="margin-bottom: 10px">
<el-radio-group
size="medium"
v-model="sendParams.type"
@change="handleChangeType"
>
<el-radio-button label="1"> 考勤 </el-radio-button>
<el-radio-button label="2"> 合同 </el-radio-button>
</el-radio-group>
</div>
<TableModel
:formLabel="formLabel"
:showOperation="sendParams.type == 1"
:showRightTools="true"
ref="todoTableRef"
:sendParams="sendParams"
:columnsList="columnsList"
:request-api="getTodoListAPI"
>
<template slot="handle">
<el-button
plain
size="mini"
type="primary"
icon="el-icon-edit"
v-hasPermi="['sub:base:edit']"
@click="onHandleHandleTodo()"
>
处理
</el-button>
</template>
</TableModel>
</div>
</template>
<script>
import TableModel from '@/components/TableModel'
import DialogModel from '@/components/DialogModel'
import { getTodoListAPI } from '@/api/construction-person/todo'
import { formLabel, columnsList, dialogConfig } from './config'
export default {
name: 'ToDo',
components: {
TableModel,
DialogModel,
},
data() {
return {
formLabel,
columnsList,
dialogConfig,
getTodoListAPI,
sendParams: {
type: '1',
}, //
}
},
methods: {
//
async onHandleConfirmAddOrEdit() {
this.handleCloseDialogOuter()
},
//
onHandleHandleTodo() {
this.$router.push(
'/construction-person/attendance-manage/card-replacement-audit',
)
},
//
handleChangeType() {
this.$refs.todoTableRef.getTableList()
},
},
async created() {},
}
</script>