From 137910cf4fc73a3a2787a3a02718f1e1f637c368 Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期五, 14 六月 2024 16:01:17 +0800 Subject: [PATCH] bug修改 --- src/views/safetyReview/projectManage/components/processCtrlReview.vue | 260 +++++++++++++++++++++++++++++++++++---------------- 1 files changed, 178 insertions(+), 82 deletions(-) diff --git a/src/views/safetyReview/projectManage/components/processCtrlReview.vue b/src/views/safetyReview/projectManage/components/processCtrlReview.vue index 53a9102..4cd1243 100644 --- a/src/views/safetyReview/projectManage/components/processCtrlReview.vue +++ b/src/views/safetyReview/projectManage/components/processCtrlReview.vue @@ -3,10 +3,10 @@ <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top"> <el-row :gutter="30"> <el-col :span="6"> - <el-form-item prop="transmitDate" label="审核日期"> + <el-form-item prop="auditDate" label="审核日期"> <el-date-picker style="width: 100%" - v-model="state.formData.transmitDate" + v-model="state.formData.auditDate" type="date" value-format="YYYY-MM-DD 00:00:00" placeholder="选择日期" @@ -15,11 +15,12 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item prop="leader.name" label="过程控制负责人"> + <el-form-item prop="processLeader.name" label="过程控制负责人"> <el-input - v-model="state.formData.leader.name" + v-model="state.formData.processLeader.name" size="large" - placeholder="请选择内部审核员" + placeholder="请选择过程控制负责人" + @focus="openExperts('过程控制负责人')" > <template #append> <el-button :icon="Search" @click="openExperts('过程控制负责人')"/> @@ -28,23 +29,11 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item prop="technology" label="审核结论:是否满足过程控制要求"> - <el-radio-group v-model="state.formData.status" > + <el-form-item prop="isFullProcess" label="审核结论:是否满足过程控制要求"> + <el-radio-group v-model="state.formData.isFullProcess" > <el-radio :label="1">是</el-radio> <el-radio :label="0">否</el-radio> </el-radio-group> - </el-form-item> - </el-col> - </el-row> - <el-row :gutter="30"> - <el-col :span="6"> - <el-form-item label="附件上传"> - <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='state.imgLimit' v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove"> - <el-icon><Plus /></el-icon> - <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div> - </template> - </el-upload> </el-form-item> </el-col> </el-row> @@ -53,7 +42,7 @@ <el-table-column label="过程控制关键点" prop="content" header-align="center" :show-overflow-tooltip="true"/> <el-table-column label="审核结果" header-align="center" class-name="small-padding fixed-width" width="175"> <template #default="scope"> - <el-radio-group v-model="scope.row.status" > + <el-radio-group v-model="scope.row.status" @change="changeStatus(scope.row)"> <el-radio :label="1">符合</el-radio> <el-radio :label="0">不符合</el-radio> </el-radio-group> @@ -62,23 +51,35 @@ <el-table-column label="不符合描述" header-align="center" class-name="small-padding fixed-width" width="700"> <template #default="scope"> <el-input - v-model="state.formData.leader.name" + v-model="scope.row.reason" size="large" - disabled + :disabled="scope.row.status == 1" placeholder="如不符合,请填写不符合描述" /> </template> </el-table-column> </el-table> - <el-form-item prop="technology" label="存在问题及建议"> + <el-form-item prop="suggestions" label="存在问题及建议"> <el-input - v-model="state.formData.technology" + v-model="state.formData.suggestions" :autosize="{ minRows: 6 }" maxlength="500" show-word-limit type="textarea"> </el-input> </el-form-item> + <el-row :gutter="30"> + <el-col :span="18"> + <el-form-item label="附件上传" prop="assAccessoryFiles"> + <el-upload accept="image/*,.pdf,.doc,.docx,.xlsx,.xls" :action="state.uploadUrl" :data="{moduleType: 8,projectId: props.projectId}" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="state.fileList" :before-upload="picSize" :disabled="projectType === 'view' || isEnd" :on-remove="handleRemove" > + <el-button type="primary">附件上传</el-button> + <template #tip> + <div class="el-upload__tip">上传文件尺寸小于5M,最多可上传1份</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> </el-form> <el-dialog v-model="state.dialogImg"> <el-image style="width: 100%; height: 100%" :src="state.dialogImageUrl"/> @@ -89,56 +90,57 @@ <script setup> import {defineEmits, onMounted, reactive, ref} from "vue"; -import {ElMessage} from "element-plus"; +import {ElMessage, ElMessageBox} from "element-plus"; import {Search} from '@element-plus/icons-vue' -import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import {delFile, getFiles} from "@/api/projectManage/siteCheckRcd" +import {addProcessCtrl, editProcessCtrl,getProcessCtrlDetail} from "@/api/projectManage/processCtrl" import {delPic} from "@/api/login" import { getToken } from "@/utils/auth"; import Cookies from "js-cookie" import ExpertsList from "./expertsList"; +import axios from "axios"; +import { useRoute } from 'vue-router' +const route = useRoute() +const props = defineProps(['projectId']) const emit = defineEmits(["getNextStatus"]); const state = reactive({ formData: { - id: '', - leader: { - name: '' - }, - leaderId: null, - linkMan: '', - transmitPerson: '', - transmitDate: '' + id: null, + projectId: null, + auditDate: '', + processLeader: {name: ''}, + processLeaderId: null, + isFullProcess: null, + suggestions: '' }, rules: { - "leader.name": [{required: true, message: '请选择项目负责人', trigger: 'blur'}], - linkMan: [{required: true, message: '请输入联系人', trigger: 'blur'}], - linkPhone: [{required: true, message: '请输入联系电话', trigger: 'blur'}], - transmitDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}] + auditDate: [{required: true, message: '请选择审核日期', trigger: 'blur'}], + 'processLeader.name': [{required: true, message: '请选择过程控制负责人', trigger: 'change'}], + isFullProcess: [{required: true, message: '请选择审核结论', trigger: 'blur'}] }, tableData: [ - {id: 1, content: '报告中所列评价依据是否得到引用和验证', status: 1}, - {id: 2, content: '现场收集的有关资料是否齐全、有效', status: 1}, - {id: 3, content: '危险有害因素识别是否充分', status: 1}, - {id: 4, content: '报告是否有重大遗漏', status: 0}, - {id: 5, content: '评价方法选用是否合理', status: 1}, - {id: 6, content: '对策措施及建议是否具有针对性、合理性', status: 1}, - {id: 7, content: '评价结论及格式是否正确', status: 1}, - {id: 8, content: '已按要求修改完成', status: 1}, - {id: 9, content: '可报过程控制负责人审核', status: 1} + {id: 1, content: '风险分析', status: 1, key:'isRiskAnalyse', reasonKey: 'riskAnalyseDes', reason: ''}, + {id: 2, content: '签订合同', status: 1, key:'isSignContract', reasonKey: 'signContractDes', reason: ''}, + {id: 3, content: '评价任务通知书', status: 1, key:'isEstimateTask', reasonKey: 'estimateTaskDes', reason: ''}, + {id: 4, content: '编制安全评价项目计划书', status: 1, key:'isEstimatePlan', reasonKey: 'estimatePlanDes', reason: ''}, + {id: 5, content: '被评价单位提供材料清单', status: 1, key:'isProvideMaterials', reasonKey: 'provideMaterialsDes', reason: ''}, + {id: 6, content: '从业告知', status: 1, key:'isWorkNotification', reasonKey: 'workNotificationDes', reason: ''}, + {id: 7, content: '现场勘验记录及影像资料', status: 1, key:'isInvestigationSite', reasonKey: 'investigationSiteDes', reason: ''}, + {id: 8, content: '评价报告内部审核', status: 1, key:'isInteriorAudit', reasonKey: 'interiorAuditDes', reason: ''}, + {id: 9, content: '技术负责人审核', status: 1, key:'isTechnolgyAudit', reasonKey: 'technolgyAuditDes', reason: ''}, + {id: 6, content: '评价报告外审意见', status: 1, key:'isExteriorAudit', reasonKey: 'exteriorAuditDes', reason: ''}, + {id: 7, content: '评价项目网上信息公开', status: 1, key:'isOpenInformation', reasonKey: 'openInformationDes', reason: ''}, + {id: 8, content: '二维码的使用', status: 1, key:'isUseQrcode', reasonKey: 'useQrcodeDes', reason: ''}, + {id: 9, content: '报告归档材料完整性', status: 1, key:'isFullMaterials', reasonKey: 'fullMaterialsDes', reason: ''} ], - imgLimit: 1, - uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/manage/accessory-file/uploadFile', header: { - Authorization: 'Bearer ' + getToken() + Authorization: getToken() }, - dialogImageUrl: '', - dialogImg: false + disabled:false }) -const props = { - expandTrigger: 'hover', - value: 'name', - label: 'name' -} + const isAmin = ref(false) const formRef = ref() const expertsListRef = ref() @@ -147,13 +149,35 @@ if(userInfo.identity === 0){ isAmin.value = true; } + getProcessFiles(props.projectId) + isEnd.value = Cookies.get('end') + projectType.value = route.query.type; }) +const projectType = ref(''); +const isEnd = ref('') const riskOpen = async (type,val) => { + state.formData.projectId = val + isEnd.value = Cookies.get('end') + projectType.value = route.query.type; if(type === 'detail' || type === 'edit' ){ - const res = await getRiskDetail({projectId: val}); + if(type === 'detail'){ + state.disabled = true + } + const res = await getProcessCtrlDetail({projectId: val}); if(res.code == 200){ - state.formData = res.data; + state.formData = res.data + state.formData.isFullProcess = res.data.isFullProcess==true?1:0 + for(let key in res.data){ + for(let item of state.tableData){ + if(item.key == key){ + item.status = res.data[key]==true?1:0 + } + if(item.reasonKey == key){ + item.reason = res.data[key] + } + } + } }else { ElMessage.warning(res.message) } @@ -166,19 +190,38 @@ return; } if(type === 'add'){ - const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await addRisk(data); + const {id,processLeader, ...data} = JSON.parse(JSON.stringify(state.formData)) + for(let i of state.tableData){ + if(i.status == 1){ + i.reason = '' + }else{ + if(i.reason == ''){ + ElMessage.warning("请完善不符合项描述"); + return + } + } + data[i.key] = i.status + data[i.reasonKey] = i.reason + } + const res = await addProcessCtrl(data); if (res.code == 200) { ElMessage.success('保存成功') formRef.value.clearValidate(); - emit('getNextStatus', res.data); + emit('getNextStatus', val); } else { ElMessage.warning(res.message) } }else if(type === 'clickEdit'){ - const { ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await editRisk(data); + const {processLeader, ...data} = JSON.parse(JSON.stringify(state.formData)) + for(let i of state.tableData){ + data[i.key] = i.status + data[i.reasonKey] = i.reason + if(i.status == 1){ + i.reason = '' + } + } + const res = await editProcessCtrl(data); if (res.code == 200) { ElMessage.success('变更成功') formRef.value.clearValidate(); @@ -190,14 +233,41 @@ } } } +const changeStatus = (val) => { + if(val.status == 1 && val.reason != "") { + const index = state.tableData.findIndex(item => item.id == val.id) + state.tableData[index].reason = "" + } +} const openExperts = (type) =>{ expertsListRef.value.openDialog(type) } const getSelected = (type,obj)=>{ - state.formData.leader.name = obj.name - state.formData.leaderId = obj.id + state.formData.processLeader.name = obj.name + state.formData.processLeaderId = obj.id +} + +const getProcessFiles = async (id)=>{ + const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 8}) + if(res.code == 200){ + if(res.data && res.data.length>0){ + state.fileList = res.data.map(i=>{ + return { + name: i.originName, + url: import.meta.env.VITE_APP_BASE_API + '/' + i.path, + id: i.id, + projectId: i.projectId, + moduleType: i.moduleType + } + }) + }else{ + state.fileList = [] + } + }else { + ElMessage.warning(res.message) + } } // 图片上传 @@ -219,14 +289,26 @@ }; const handlePictureCardPreview = (uploadFile) => { - state.dialogImageUrl = uploadFile.url - state.dialogImg = true + axios.get(uploadFile.url,{headers:{'Content-Type': 'application/json','Authorization': `${getToken()}`,'uid':`${Cookies.get('uid')}`},responseType: 'blob'}).then(res=>{ + if (res) { + const link = document.createElement('a') + let blob = new Blob([res.data],{type: res.data.type}) + link.style.display = "none"; + link.href = URL.createObjectURL(blob); // 创建URL + window.open(link.href) + } else { + ElMessage({ + type: 'warning', + message: '文件读取失败' + }); + } + }) }; const handleAvatarSuccess = (res, uploadFile) => { if(res.code == 200){ - // state.registerForm.agency.reportPath = res.data.path + getProcessFiles() }else{ ElMessage({ type: 'warning', @@ -235,19 +317,33 @@ } } -const handleRemove = async (file, uploadFiles) => { - const res = await delPic({path: state.registerForm.agency.reportPath}) - if(res.code == 200){ - ElMessage({ - type: 'success', - message: '文件已删除' - }) - }else{ - ElMessage({ - type: 'warning', - message: res.message - }) - } +const handleRemove = async (file, uploadFile) => { + ElMessageBox.confirm( + '确定删除该附件?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delFile(file.id) + if(res.code == 200){ + ElMessage({ + type: 'success', + message: '文件已删除' + }) + await getProcessFiles() + }else{ + ElMessage({ + type: 'warning', + message: res.message + }) + } + }) + .catch(()=>{ + getProcessFiles() + }) } defineExpose({ -- Gitblit v1.9.2