From a8ef7c1a4b2ab6acd91a0520e6258bd753d17f20 Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期三, 16 八月 2023 15:58:20 +0800 Subject: [PATCH] 人员证书类型 --- src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue | 497 ++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 306 insertions(+), 191 deletions(-) diff --git a/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue b/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue index 9d124d1..008a6a7 100644 --- a/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue +++ b/src/views/newSpecialWorkSystem/workTicket/zysq/components/fire.vue @@ -4,13 +4,13 @@ <div class="homeCard"> <el-row> <el-col :span="12"> - <el-form-item label="作业申请单位" prop="workDetail.involvedDepIds"> - <el-cascader style="width: 100%" v-model="form.workDetail.involvedDepIds" :options="departList" :props="depProps" :show-all-levels="false"/> + <el-form-item label="作业申请单位" prop="applyDepId"> + <el-cascader style="width: 100%" v-model="form.applyDepId" :options="departList2" :props="props" :show-all-levels="false" placeholder="明确到具体车间" @change="findParent" clearable/> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="动火级别" prop="workLevel"> - <el-select v-model="form.workLevel"> + <el-select v-model="form.workLevel" clearable> <el-option v-for="item in workLevelList" :key="item.value" @@ -35,19 +35,19 @@ <el-col :span="12"> <el-form-item label="作业地点及动火部位" prop="workLocation"> <el-input - v-model="form.workContent" + v-model="form.workLocation" :autosize="{ minRows: 1 }" type="textarea" - placeholder="请输入作业内容" + placeholder="请输入作业地点及动火部位" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> - <el-form-item label="动火方式" prop="workDetail.hotMethod"> + <el-form-item label="动火方式" prop="workDetail.workMethod"> <el-input - v-model="form.workDetail.hotMethod" + v-model="form.workDetail.workMethod" :autosize="{ minRows: 1 }" type="textarea" placeholder="请输入动火方式" @@ -55,12 +55,12 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="动火人级证书编号" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> + <el-form-item label="作业人及证件编号" prop="operatorUids"> + <el-select v-model="form.operatorUids" filterable multiple clearable> <el-option - v-for="item in workerList" + v-for="item in spList.opList" :key="item.uid" - :label="item.username" + :label="item.realName" :value="item.uid" /> </el-select> @@ -69,13 +69,13 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="作业单位" prop="workDetail.involvedDepIds"> - <el-cascader style="width: 100%" v-model="form.workDetail.involvedDepIds" :props="depProps" :options="departList" :show-all-levels="false"/> + <el-form-item label="作业单位" prop="workDepId"> + <el-cascader style="width: 100%" v-model="form.workDepId" :props="depProps" :options="departList" :show-all-levels="false"/> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="作业负责人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> + <el-form-item label="作业负责人" prop="headUids"> + <el-select v-model="form.headUids" multiple filterable @change="getStartEndIds" clearable> <el-option v-for="item in workerList" :key="item.uid" @@ -88,8 +88,8 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="分析人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> + <el-form-item label="分析人" prop="analystUids"> + <el-select v-model="form.analystUids" filterable multiple clearable> <el-option v-for="item in workerList" :key="item.uid" @@ -99,27 +99,23 @@ </el-select> </el-form-item> </el-col> - <el-col :span="12"> - <el-form-item label="关联其他特殊作业" prop="workDetail.otherSpecialWork"> - <el-select v-model="form.workDetail.otherSpecialWork" multiple> - <el-option - v-for="item in otherWorkList" - :key="item.value" - :label="item.label" - :value="item.label" - /> + <el-col :span="12" class="valueSelect"> + <el-form-item label="关联其他特殊作业"> + <el-select v-model="form.involveOtherWork" multiple clearable :teleported="false" @click="openWorkSelect"> + <el-option v-for="item in otherWorks" :key="item.workApplyId" :label="item.workContent" :value="item.workApplyId"> + </el-option> </el-select> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> - <el-form-item label="分析人" prop="operatorUids"> - <el-select v-model="form.operatorUids" multiple> + <el-form-item label="监护人" prop="guardianUids"> + <el-select v-model="form.guardianUids" filterable multiple @change="getSafetyIds" clearable> <el-option - v-for="item in workerList" + v-for="item in spList.jhList" :key="item.uid" - :label="item.username" + :label="item.realName" :value="item.uid" /> </el-select> @@ -127,7 +123,7 @@ </el-col> <el-col :span="12"> <el-form-item label="绑定执法仪" prop="cameraIds"> - <el-select v-model="form.cameraIds" multiple> + <el-select v-model="form.cameraIds" multiple clearable> <el-option v-for="item in deviceList" :key="item.id" @@ -139,23 +135,34 @@ </el-col> </el-row> <el-row> +<!-- <el-col :span="12">--> +<!-- <el-form-item label="动火作业实施时间" prop="expStartTime">--> +<!-- <el-date-picker--> +<!-- v-model="form.expStartTime"--> +<!-- format="YYYY-MM-DD HH:mm"--> +<!-- value-format="YYYY-MM-DD HH:mm:00"--> +<!-- type="datetimerange"--> +<!-- range-separator="至"--> +<!-- start-placeholder="开始时间"--> +<!-- end-placeholder="结束时间"--> +<!-- />--> +<!-- </el-form-item>--> +<!-- </el-col>--> <el-col :span="12"> - <el-form-item label="动火作业实施时间" prop="workTimeLine"> + <el-form-item label="预计(整体)开始时间" prop="expStartTime"> <el-date-picker - v-model="form.workTimeLine" + v-model="form.expStartTime" format="YYYY-MM-DD HH:mm" value-format="YYYY-MM-DD HH:mm:00" - type="datetimerange" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" + type="datetime" + style="width: 100%" /> </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="预计(整体)完成时间" prop="workTimeLine"> + <el-form-item label="预计(整体)完成时间" prop="expEndTime"> <el-date-picker - v-model="form.workTimeLine" + v-model="form.expEndTime" format="YYYY-MM-DD HH:mm" value-format="YYYY-MM-DD HH:mm:00" type="datetime" @@ -166,9 +173,19 @@ </el-row> <el-row> <el-col :span="12"> - <el-form-item label="备注" prop="info"> + <el-form-item label="风险辨识" prop="riskIdentification"> <el-input - v-model="form.workContent" + v-model="form.riskIdentification" + :autosize="{ minRows: 1 }" + type="textarea" + placeholder="请输入风险辨识" + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="备注" prop="remark"> + <el-input + v-model="form.remark" :autosize="{ minRows: 1 }" type="textarea" placeholder="请输入作业备注" @@ -176,26 +193,26 @@ </el-form-item> </el-col> </el-row> - <el-row> - <el-table :data="safeData" style="width: 100%" border> - <el-table-column type="index" label="序号" width="80px"/> - <el-table-column prop="name" label="安全措施"/> - <el-table-column prop="address" label="确认人"> - <template #default="scope"> + <el-row style="display: flex;justify-content: center"> + <el-table :data="safetyMeasureBasicList" style="width: 90%" border> + <el-table-column type="index" label="序号" width="100px" align="center"/> + <el-table-column prop="measureContent" label="安全措施"/> +<!-- <el-table-column prop="address" label="确认人">--> +<!-- <template #default="scope">--> - </template> - </el-table-column> - <el-table-column prop="address" label="操作"> - <template #default="scope"> - <el-button link type="primary" size="small" :icon="Edit">修改确认人</el-button> - </template> - </el-table-column> +<!-- </template>--> +<!-- </el-table-column>--> +<!-- <el-table-column prop="address" label="操作">--> +<!-- <template #default="scope">--> +<!-- <el-button link type="primary" size="small" :icon="Edit">修改确认人</el-button>--> +<!-- </template>--> +<!-- </el-table-column>--> </el-table> </el-row> <el-row> <el-col :span="12"> - <el-form-item label="其他安全措施填报人" prop="info"> - <el-select v-model="form.operatorUids" multiple> + <el-form-item label="安全措施确认人" prop="safetyMeasureUids"> + <el-select v-model="form.safetyMeasureUids" filterable multiple clearable> <el-option v-for="item in workerList" :key="item.uid" @@ -206,34 +223,58 @@ </el-form-item> </el-col> </el-row> - <el-row> - <el-table :data="form.reviewData" style="width: 100%" border> - <el-table-column prop="item" label="审批签字项目"/> - <el-table-column prop="isCheck" label="是否必签"> +<!-- <el-row>--> +<!-- <el-col :span="12">--> +<!-- <el-form-item label="其他安全措施">--> +<!-- <el-input--> +<!-- v-model="form.workContent"--> +<!-- :autosize="{ minRows: 2 }"--> +<!-- type="textarea"--> +<!-- placeholder="请输入其他安全措施"--> +<!-- />--> +<!-- </el-form-item>--> +<!-- </el-col>--> +<!-- <el-col :span="12">--> +<!-- <el-form-item label="编制人">--> +<!-- <el-input--> +<!-- v-model="form.workContent"--> +<!-- placeholder="请输入编制人"--> +<!-- />--> +<!-- </el-form-item>--> +<!-- </el-col>--> +<!-- </el-row>--> + <el-row style="display: flex;justify-content: center"> + <el-table :data="form.approvalDepBasicList" style="width: 90%" border> + <el-table-column prop="content" label="审批签字项目" align="center"/> + <el-table-column prop="approvalType" label="是否必签" align="center"> <template #default="scope"> - <el-radio-group v-model="scope.row.isCheck"> - <el-radio :label="1">所有必签</el-radio> - <el-radio :label="2">任一</el-radio> - <el-radio :label="3">非必签</el-radio> - </el-radio-group> + <el-form-item label="" prop="acceptUid"> + <el-radio-group v-model="scope.row.approvalType"> + <el-radio :label="0">所有必签</el-radio> + <el-radio :label="1">任一</el-radio> + <el-radio :label="2">非必签</el-radio> + </el-radio-group> + </el-form-item> </template> </el-table-column> - <el-table-column prop="names" label="审批人"> + <el-table-column prop="approvalUids" label="审批人" align="center"> <template #default="scope"> - - </template> - </el-table-column> - <el-table-column prop="address" label="操作"> - <template #default="scope"> - <el-button link type="primary" size="small" :icon="Edit">选择审批人</el-button> + <el-select v-model="scope.row.approvalUids" filterable multiple :disabled="isFirstRow(scope.$index)" clearable> + <el-option + v-for="item in workerList" + :key="item.uid" + :label="item.username" + :value="item.uid" + /> + </el-select> </template> </el-table-column> </el-table> </el-row> <el-row> <el-col :span="12"> - <el-form-item label="完工验收" prop="info"> - <el-select v-model="form.operatorUids"> + <el-form-item label="完工验收" prop="acceptUid"> + <el-select v-model="form.acceptUid" filterable clearable> <el-option v-for="item in workerList" :key="item.uid" @@ -244,8 +285,8 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item label="现场开始结束确认人" prop="info"> - <el-select v-model="form.operatorUids" multiple> + <el-form-item label="现场开始结束确认人" prop="startOrEndUids"> + <el-select v-model="form.startOrEndUids" filterable multiple clearable> <el-option v-for="item in workerList" :key="item.uid" @@ -261,6 +302,7 @@ <div class="applyBtn"> <el-button type="primary" size="large" plain @click="submitForm(ruleFormRef)">提交申报</el-button> </div> + <work-select ref="workSelectRef" @refreshWorks="getSelected()"></work-select> </div> </template> @@ -274,84 +316,49 @@ import { ElMessage, ElMessageBox } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus' import { workApplyApi } from '/@/api/specialWorkSystem/workApply'; + import workSelect from "/@/views/newSpecialWorkSystem/workTicket/zysq/components/workSelect.vue"; interface stateType { form: Object, workLevelList: Array<any>, - otherWorkList: Array<any>, equipmentDialog: boolean, + props:{}, depProps:{}, - safeData: [] + safetyMeasureBasicList: [] } export default defineComponent({ name: 'fireForm', - components: { - - }, - props:['departList','workerList','deviceList'], + components: {workSelect}, + props:['departList','departList2','workerList','deviceList','otherWorks','spList'], setup(props: any, context: any) { const userInfo = useUserInfo() const { userInfos } = storeToRefs(userInfo); const state = reactive<stateType>({ equipmentDialog: false, + safetyMeasureBasicList: [], form: { - operatorUids: [], - workType: 1, - workLevel: null, - workContent: '', - workLocation: '', - maBaseId: null, - hazardIdentification: '', + workType: 1, + workLevel: null, + applyDepId: null, + seDepId: null, + expStartTime: '', + expEndTime: '', + operatorUids: [], + headUids: [], + analystUids: [], + guardianUids: [], + workDepId: null, + workContent: '', + workLocation: '', + riskIdentification: '', + involveOtherWork: [], + safetyMeasureUids: [], + approvalDepBasicList: [], + acceptUid: null, + startOrEndUids: [], cameraIds: [], - workDetail:{ - hotMethod: '', - otherSpecialWork: [] - }, - receiveUids: [], - workTimeLine: [], - expStartTime: '', - expEndTime: '', - reviewData: [ - { - item: '作业负责人意见', - isCheck: null, - names: [] - }, - { - item: '车间主任意见', - isCheck: null, - names: [] - }, - { - item: '运营安环科意见', - isCheck: null, - names: [] - }, - { - item: '运营单位负责人意见', - isCheck: null, - names: [] - }, - { - item: '事业部安环科意见', - isCheck: null, - names: [] - }, - { - item: '事业部负责人审批意见', - isCheck: null, - names: [] - }, - { - item: '公司主要负责人审批意见', - isCheck: null, - names: [] - }, - { - item: '岗位当班班长验票情况', - isCheck: null, - names: [] - } - ] + workDetail: { + workMethod: '' + } }, workLevelList: [ { @@ -367,65 +374,158 @@ value: 3 } ], - otherWorkList: [ - { - label: "动火作业", - value: 1 - }, - { - label: "受限空间作业", - value: 2 - }, - { - label: "吊装作业", - value: 3 - }, - { - label: "动土作业", - value: 4 - }, - { - label: "断路作业", - value: 5 - }, - { - label: "高处作业", - value: 6 - }, - { - label: "临时用电作业", - value: 7 - }, - { - label: "盲板抽堵作业", - value: 8 - } - ], + props:{ + expandTrigger: 'hover', + label: 'depName', + value: 'depId', + emitPath: false + }, depProps:{ expandTrigger: 'hover', label: 'depName', - value: 'depId' - }, - safeData: [] + value: 'depId', + checkStrictly: true, + emitPath: false + } }); const ruleFormRef = ref<FormInstance>() const applyRules = reactive<FormRules>({ - operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workType: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workLevel: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + applyDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workLevel: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workContent: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], workLocation: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - hazardIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + operatorUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + workDepId: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + headUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + analystUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + guardianUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + riskIdentification: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], cameraIds: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - workTimeLine: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], - "workDetail.hotMethod": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] + expStartTime: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + expEndTime: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + safetyMeasureUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + acceptUid: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + startOrEndUids: [{ required: true, message: '该内容不能为空', trigger: 'blur' }], + "workDetail.workMethod": [{ required: true, message: '该内容不能为空', trigger: 'blur' }] }); + const workSelectRef = ref() // 页面载入时执行方法 onMounted(() => { - state.form.involvedDepIds = userInfos.value.depId - }); + getBasicData() + }); + const openWorkSelect = ()=>{ + workSelectRef.value.openDialog(state.form.involveOtherWork) + } + + const getSelected = ()=>{ + state.form.involveOtherWork = workSelectRef.value.selected + } + + const findParent = ()=>{ + state.form.seDepId = findNearestDepLevel2DepId(props.departList2,state.form.applyDepId) + console.log(state.form.seDepId,'state.form.seDepId') + } + + // 获取基础数据 + const getBasicData = async ()=>{ + const res = await workApplyApi().getFormData(1) + if (res.data.code === '200') { + state.safetyMeasureBasicList = JSON.parse(JSON.stringify(res.data.data.safetyMeasureBasicList)) + if(res.data.data.approvalDepBasicList && res.data.data.approvalDepBasicList.length>0){ + state.form.approvalDepBasicList = res.data.data.approvalDepBasicList.map(({id,content})=>({ + content, + approvalDepBasicId: id, + approvalUids: [], + approvalType: null + })) + }else{ + state.form.approvalDepBasicList = [] + } + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + } + }; + + const getStartEndIds = ()=>{ + state.form.startOrEndUids = state.form.headUids + state.form.approvalDepBasicList[0].approvalUids = state.form.headUids + } + + const getSafetyIds = ()=>{ + state.form.safetyMeasureUids = state.form.guardianUids + } + + const isFirstRow = (index)=> { + return index === 0; + } + + const submitForm = async (formEl: FormInstance | undefined) => { + console.log(state.form.involveOtherWork,555) + if (!formEl) return + await formEl.validate(async (valid, fields) => { + if (valid) { + for(let i of state.form.approvalDepBasicList){ + if(i.approvalUids.length == 0){ + ElMessage({ + type: 'warning', + message: '部分审批人未配置' + }); + return + } + } + // if(Array.isArray(state.form.involveOtherWork)){ + // state.form.involveOtherWork = state.form.involveOtherWork.join(',') + // } + const res = await workApplyApi().submitFireApply(state.form) + if (res.data.code === '200') { + ElMessage({ + type: 'success', + message: '提交成功!' + }); + formEl.resetFields() + getBasicData() + } else { + ElMessage({ + type: 'warning', + message: res.data.msg + }); + // state.form.involveOtherWork = state.form.involveOtherWork.split(',') + } + } else { + console.log('error submit!', fields) + } + }) + } + + const findNearestDepLevel2DepId = (data, targetDepId) => { + let nearestDepId = null; + const traverseTree = (node) => { + if (node.depId === targetDepId) { + return true; + } + if (node.children && node.children.length > 0) { + for (const child of node.children) { + const found = traverseTree(child); + if (found) { + if (child.depLevel === 2) { + nearestDepId = child.depId; + } + return true; + } + } + } + return false; + }; + for (const root of data) { + traverseTree(root); + } + return nearestDepId; + }; // 折线图 const renderMenu = async (value: string) => { @@ -435,6 +535,15 @@ }; return { renderMenu, + getBasicData, + getStartEndIds, + getSafetyIds, + isFirstRow, + submitForm, + findParent, + openWorkSelect, + getSelected, + workSelectRef, Search, ruleFormRef, applyRules, @@ -449,9 +558,12 @@ width: 100%; height: 100vh; overflow: hidden; - position: relative; overflow-y: scroll; - padding: 40px 0 100px; + &::-webkit-scrollbar{ + width: 0; + background-color: transparent; + } + .homeCard{ width: 100%; padding: 20px; @@ -459,13 +571,12 @@ background: #fff; border-radius: 4px; margin-bottom: 20px; + position: relative; } .applyBtn{ - position: absolute; - z-index: 999; width: 100%; background: #fff; - padding-top: 15px; + padding: 20px 0; box-shadow: 0 -3px 8px rgba(150,150,150,.1); display: flex; align-items: center; @@ -490,7 +601,11 @@ width: 100% !important; } } - + .valueSelect{ + ::v-deep(.el-popper){ + display: none !important; + } + } .tab-i{ margin-bottom: 15px; -- Gitblit v1.9.2