From 7446bd01fb7eb8ee4dd80176cd0dd5b049edee99 Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期四, 18 一月 2024 16:24:49 +0800 Subject: [PATCH] 新增 --- src/views/safetyReview/projectManage/components/innerReview.vue | 263 +++++++++++ src/views/safetyReview/projectManage/components/techLeaderReview.vue | 260 +++++++++++ src/views/safetyReview/projectManage/components/siteCheckRcd.vue | 101 +++- src/views/safetyReview/projectManage/process.vue | 25 src/views/safetyReview/projectManage/components/processCtrlReview.vue | 266 ++++++++++++ src/views/safetyReview/projectManage/components/rateConclusion.vue | 186 ++++++++ src/views/safetyReview/projectManage/components/uploadReviewRcd.vue | 176 ++++++++ 7 files changed, 1,249 insertions(+), 28 deletions(-) diff --git a/src/views/safetyReview/projectManage/components/innerReview.vue b/src/views/safetyReview/projectManage/components/innerReview.vue new file mode 100644 index 0000000..b739bdc --- /dev/null +++ b/src/views/safetyReview/projectManage/components/innerReview.vue @@ -0,0 +1,263 @@ +<template> + <div class="riskBox"> + <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-date-picker + style="width: 100%" + v-model="state.formData.transmitDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item prop="leader.name" label="内部审核员"> + <el-input + v-model="state.formData.leader.name" + size="large" + placeholder="请选择内部审核员" + > + <template #append> + <el-button :icon="Search" @click="openExperts('项目负责人')"/> + </template> + </el-input> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item prop="transmitDate" label="内部审核确认日期"> + <el-date-picker + style="width: 100%" + v-model="state.formData.transmitDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </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> + <el-table :data="state.tableData" :border="true" style="margin: 20px 0"> + <el-table-column label="序号" width="60" align="center" type="index"></el-table-column> + <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 :label="1">是</el-radio> + <el-radio :label="0">否</el-radio> + </el-radio-group> + </template> + </el-table-column> + </el-table> + <el-form-item prop="technology" label="存在问题及建议"> + <el-input + v-model="state.formData.technology" + :autosize="{ minRows: 6 }" + maxlength="500" + show-word-limit + type="textarea"> + </el-input> + </el-form-item> + </el-form> + <el-dialog v-model="state.dialogImg"> + <el-image style="width: 100%; height: 100%" :src="state.dialogImageUrl"/> + </el-dialog> + <experts-list ref="expertsListRef" @getName="getSelected"></experts-list> + </div> +</template> +<script setup> + +import {defineEmits, onMounted, reactive, ref} from "vue"; +import {ElMessage} from "element-plus"; +import {Search} from '@element-plus/icons-vue' +import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import {delPic} from "@/api/login" +import { getToken } from "@/utils/auth"; +import Cookies from "js-cookie" +import ExpertsList from "./expertsList"; +const emit = defineEmits(["getNextStatus"]); + +const state = reactive({ + formData: { + id: '', + leader: { + name: '' + }, + leaderId: null, + linkMan: '', + transmitPerson: '', + transmitDate: '' + }, + 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'}] + }, + tableData: [ + {id: 1, content: '评价依据是否充分、准确、有效', status: 1}, + {id: 2, content: '评价范围是否与合同一致', status: 1}, + {id: 3, content: '危险有害因素识别是否全面', status: 1}, + {id: 4, content: '评价单元划分是否合理', status: 1}, + {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: 10, content: '文字、数据是否准确', status: 1}, + {id: 11, content: '已按要求修改完成', status: 1}, + {id: 12, content: '可报技术负责人审核', status: 1} + ], + imgLimit: 1, + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: 'Bearer ' + getToken() + }, + dialogImageUrl: '', + dialogImg: false +}) +const props = { + expandTrigger: 'hover', + value: 'name', + label: 'name' +} +const isAmin = ref(false) +const formRef = ref() +const expertsListRef = ref() +onMounted(() => { + const userInfo = JSON.parse(Cookies.get('userInfo')) + if(userInfo.identity === 0){ + isAmin.value = true; + } +}) + +const riskOpen = async (type,val) => { + if(type === 'detail' || type === 'edit' ){ + const res = await getRiskDetail({projectId: val}); + if(res.code == 200){ + state.formData = res.data; + }else { + ElMessage.warning(res.message) + } + } + if(type === 'add' || type === 'clickEdit') { + const valid = await formRef.value.validate(); + if(valid){ + if (isAmin.value) { + ElMessage.warning("当前用户暂无权限"); + return; + } + if(type === 'add'){ + const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await addRisk(data); + if (res.code == 200) { + ElMessage.success('保存成功') + formRef.value.clearValidate(); + emit('getNextStatus', res.data); + + } else { + ElMessage.warning(res.message) + } + }else if(type === 'clickEdit'){ + const { ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await editRisk(data); + if (res.code == 200) { + ElMessage.success('变更成功') + formRef.value.clearValidate(); + // emit('getNextStatus', data.project.id); + } else { + ElMessage.warning(res.message) + } + } + } + } +} + +const openExperts = (type) =>{ + expertsListRef.value.openDialog(type) +} + +const getSelected = (type,obj)=>{ + state.formData.leader.name = obj.name + state.formData.leaderId = obj.id +} + +// 图片上传 +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} + +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M' + }); + return false + } +}; + +const handlePictureCardPreview = (uploadFile) => { + state.dialogImageUrl = uploadFile.url + state.dialogImg = true +}; + + +const handleAvatarSuccess = (res, uploadFile) => { + if(res.code == 200){ + // state.registerForm.agency.reportPath = res.data.path + }else{ + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } +} + +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 + }) + } +} + +defineExpose({ + riskOpen +}); + + +</script> +<style scoped lang="scss"> +.riskBox{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } +} + +</style> diff --git a/src/views/safetyReview/projectManage/components/processCtrlReview.vue b/src/views/safetyReview/projectManage/components/processCtrlReview.vue new file mode 100644 index 0000000..1f96f84 --- /dev/null +++ b/src/views/safetyReview/projectManage/components/processCtrlReview.vue @@ -0,0 +1,266 @@ +<template> + <div class="riskBox"> + <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-date-picker + style="width: 100%" + v-model="state.formData.transmitDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item prop="leader.name" label="过程控制负责人"> + <el-input + v-model="state.formData.leader.name" + size="large" + placeholder="请选择内部审核员" + > + <template #append> + <el-button :icon="Search" @click="openExperts('过程控制负责人')"/> + </template> + </el-input> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item prop="technology" label="审核结论:是否满足过程控制要求"> + <el-radio-group v-model="state.formData.status" > + <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> + <el-table :data="state.tableData" :border="true" style="margin: 20px 0"> + <el-table-column label="序号" width="60" align="center" type="index"></el-table-column> + <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 :label="1">符合</el-radio> + <el-radio :label="0">不符合</el-radio> + </el-radio-group> + </template> + </el-table-column> + <el-table-column label="不符合描述" header-align="center" class-name="small-padding fixed-width" width="175"> + <template #default="scope"> + <el-input + v-model="state.formData.leader.name" + size="large" + disabled + placeholder="如不符合,请填写不符合描述" + /> + </template> + </el-table-column> + </el-table> + <el-form-item prop="technology" label="存在问题及建议"> + <el-input + v-model="state.formData.technology" + :autosize="{ minRows: 6 }" + maxlength="500" + show-word-limit + type="textarea"> + </el-input> + </el-form-item> + </el-form> + <el-dialog v-model="state.dialogImg"> + <el-image style="width: 100%; height: 100%" :src="state.dialogImageUrl"/> + </el-dialog> + <experts-list ref="expertsListRef" @getName="getSelected"></experts-list> + </div> +</template> +<script setup> + +import {defineEmits, onMounted, reactive, ref} from "vue"; +import {ElMessage} from "element-plus"; +import {Search} from '@element-plus/icons-vue' +import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import {delPic} from "@/api/login" +import { getToken } from "@/utils/auth"; +import Cookies from "js-cookie" +import ExpertsList from "./expertsList"; +const emit = defineEmits(["getNextStatus"]); + +const state = reactive({ + formData: { + id: '', + leader: { + name: '' + }, + leaderId: null, + linkMan: '', + transmitPerson: '', + transmitDate: '' + }, + 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'}] + }, + 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} + ], + imgLimit: 1, + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: 'Bearer ' + getToken() + }, + dialogImageUrl: '', + dialogImg: false +}) +const props = { + expandTrigger: 'hover', + value: 'name', + label: 'name' +} +const isAmin = ref(false) +const formRef = ref() +const expertsListRef = ref() +onMounted(() => { + const userInfo = JSON.parse(Cookies.get('userInfo')) + if(userInfo.identity === 0){ + isAmin.value = true; + } +}) + +const riskOpen = async (type,val) => { + if(type === 'detail' || type === 'edit' ){ + const res = await getRiskDetail({projectId: val}); + if(res.code == 200){ + state.formData = res.data; + }else { + ElMessage.warning(res.message) + } + } + if(type === 'add' || type === 'clickEdit') { + const valid = await formRef.value.validate(); + if(valid){ + if (isAmin.value) { + ElMessage.warning("当前用户暂无权限"); + return; + } + if(type === 'add'){ + const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await addRisk(data); + if (res.code == 200) { + ElMessage.success('保存成功') + formRef.value.clearValidate(); + emit('getNextStatus', res.data); + + } else { + ElMessage.warning(res.message) + } + }else if(type === 'clickEdit'){ + const { ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await editRisk(data); + if (res.code == 200) { + ElMessage.success('变更成功') + formRef.value.clearValidate(); + // emit('getNextStatus', data.project.id); + } else { + ElMessage.warning(res.message) + } + } + } + } +} + +const openExperts = (type) =>{ + expertsListRef.value.openDialog(type) +} + +const getSelected = (type,obj)=>{ + state.formData.leader.name = obj.name + state.formData.leaderId = obj.id +} + +// 图片上传 +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} + +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M' + }); + return false + } +}; + +const handlePictureCardPreview = (uploadFile) => { + state.dialogImageUrl = uploadFile.url + state.dialogImg = true +}; + + +const handleAvatarSuccess = (res, uploadFile) => { + if(res.code == 200){ + // state.registerForm.agency.reportPath = res.data.path + }else{ + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } +} + +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 + }) + } +} + +defineExpose({ + riskOpen +}); + + +</script> +<style scoped lang="scss"> +.riskBox{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } +} + +</style> diff --git a/src/views/safetyReview/projectManage/components/rateConclusion.vue b/src/views/safetyReview/projectManage/components/rateConclusion.vue new file mode 100644 index 0000000..b5d1f45 --- /dev/null +++ b/src/views/safetyReview/projectManage/components/rateConclusion.vue @@ -0,0 +1,186 @@ +<template> + <div class="riskBox"> + <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top"> + <el-row :gutter="30"> + <el-col :span="18"> + <el-form-item label="附件上传"> + <el-upload accept=".pdf,.doc,.docx" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :limit='state.imgLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove"> + <el-button type="primary">附件上传</el-button> + <template #tip> + <div class="el-upload__tip">支持上传pdf/word/doc/docx格式文件,尺寸小于2M,最多可上传3张</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> + <el-form-item prop="technology" label="评价结论"> + <el-input + v-model="state.formData.technology" + :autosize="{ minRows: 6 }" + maxlength="500" + show-word-limit + type="textarea"> + </el-input> + </el-form-item> + <el-row :gutter="30"> + <el-col :span="9"> + <el-form-item prop="technology" label="是否有评价报告修改说明"> + <el-radio-group v-model="state.formData.status" > + <el-radio :label="1">是</el-radio> + <el-radio :label="0">否</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + </el-row> + </el-form> + </div> +</template> +<script setup> + +import {defineEmits, onMounted, reactive, ref} from "vue"; +import {ElMessage} from "element-plus"; +import {Search} from '@element-plus/icons-vue' +import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import {delPic} from "@/api/login" +import { getToken } from "@/utils/auth"; +import Cookies from "js-cookie" +const emit = defineEmits(["getNextStatus"]); + +const state = reactive({ + formData: { + id: '', + leader: { + name: '' + }, + leaderId: null, + linkMan: '', + transmitPerson: '', + transmitDate: '' + }, + 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'}] + }, + tableData: [], + imgLimit: 3, + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: 'Bearer ' + getToken() + } +}) +const props = { + expandTrigger: 'hover', + value: 'name', + label: 'name' +} +const isAmin = ref(false) +const formRef = ref() +onMounted(() => { + const userInfo = JSON.parse(Cookies.get('userInfo')) + if(userInfo.identity === 0){ + isAmin.value = true; + } +}) + +const riskOpen = async (type,val) => { + if(type === 'detail' || type === 'edit' ){ + const res = await getRiskDetail({projectId: val}); + if(res.code == 200){ + state.formData = res.data; + }else { + ElMessage.warning(res.message) + } + } + if(type === 'add' || type === 'clickEdit') { + const valid = await formRef.value.validate(); + if(valid){ + if (isAmin.value) { + ElMessage.warning("当前用户暂无权限"); + return; + } + if(type === 'add'){ + const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await addRisk(data); + if (res.code == 200) { + ElMessage.success('保存成功') + formRef.value.clearValidate(); + emit('getNextStatus', res.data); + + } else { + ElMessage.warning(res.message) + } + }else if(type === 'clickEdit'){ + const { ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await editRisk(data); + if (res.code == 200) { + ElMessage.success('变更成功') + formRef.value.clearValidate(); + // emit('getNextStatus', data.project.id); + } else { + ElMessage.warning(res.message) + } + } + } + } +} + +// 图片上传 +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} + +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 2){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过2M' + }); + return false + } +}; + +const handleAvatarSuccess = (res, uploadFile) => { + if(res.code == 200){ + // state.registerForm.agency.reportPath = res.data.path + }else{ + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } +} + +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 + }) + } +} + +defineExpose({ + riskOpen +}); + + +</script> +<style scoped lang="scss"> +.riskBox{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } +} + +</style> diff --git a/src/views/safetyReview/projectManage/components/siteCheckRcd.vue b/src/views/safetyReview/projectManage/components/siteCheckRcd.vue index 1c0da84..1230979 100644 --- a/src/views/safetyReview/projectManage/components/siteCheckRcd.vue +++ b/src/views/safetyReview/projectManage/components/siteCheckRcd.vue @@ -1,6 +1,15 @@ <template> <div class="riskBox"> <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top"> + <el-row :gutter="30" style="margin-bottom: 20px"> + <el-col :span="18"> + <el-alert title="说明:现场勘验记录由项目组成员通过APP端进行信息填报,组长完成现场勘验并在APP端提交后,电脑可对资料信息完善并进行下一步操作。" type="warning" /> + </el-col> + <el-col :span="6" style="display:flex;justify-content: right"> + <el-button type="primary">全部查看</el-button> + <el-button type="primary">全部下载</el-button> + </el-col> + </el-row> <el-row :gutter="30"> <el-col :span="6"> <el-form-item prop="investigationDate" label="现场勘验时间"> @@ -36,29 +45,18 @@ </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="(response, file, fileList) => handleAvatarSuccess(response, file, fileList, 1)"--> -<!-- :on-preview="handlePictureCardPreview"--> -<!-- v-model:file-list="state.socialList"--> -<!-- list-type="picture-card"--> -<!-- :before-upload="picSize"--> -<!-- :on-remove="(file, file_list)=>{handleRemove(file, file_list, 1)}"--> -<!-- >--> -<!-- <el-icon><Plus /></el-icon>--> -<!-- <template #tip>--> -<!-- <div class="el-upload__tip">上传jpg/png图片尺寸小于5M</div>--> -<!-- </template>--> -<!-- </el-upload>--> -<!-- </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> <el-form-item prop="recordData" label="现场勘验记录"> <el-input v-model="state.formData.recordData" @@ -81,6 +79,8 @@ import {ElMessage} from "element-plus" import {Search} from '@element-plus/icons-vue' import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import {delPic} from "@/api/login" +import { getToken } from "@/utils/auth"; import Cookies from "js-cookie" const emit = defineEmits(["getNextStatus"]) import MapLocation from "./mapLocation.vue" @@ -97,6 +97,11 @@ planPersons: [], rules: { recordData: [{required: true, message: '请填写现场勘验记录', trigger: 'blur'}] + }, + imgLimit: 1, + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: 'Bearer ' + getToken() } }) @@ -163,6 +168,56 @@ state.formData.location = lng + ',' + lat } +// 图片上传 +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} + +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M' + }); + return false + } +}; + +const handlePictureCardPreview = (uploadFile) => { + state.dialogImageUrl = uploadFile.url + state.dialogImg = true +}; + + +const handleAvatarSuccess = (res, uploadFile) => { + if(res.code == 200){ + // state.registerForm.agency.reportPath = res.data.path + }else{ + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } +} + +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 + }) + } +} + defineExpose({ riskOpen }); diff --git a/src/views/safetyReview/projectManage/components/techLeaderReview.vue b/src/views/safetyReview/projectManage/components/techLeaderReview.vue new file mode 100644 index 0000000..f208022 --- /dev/null +++ b/src/views/safetyReview/projectManage/components/techLeaderReview.vue @@ -0,0 +1,260 @@ +<template> + <div class="riskBox"> + <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-date-picker + style="width: 100%" + v-model="state.formData.transmitDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item prop="leader.name" label="技术负责人"> + <el-input + v-model="state.formData.leader.name" + size="large" + placeholder="请选择内部审核员" + > + <template #append> + <el-button :icon="Search" @click="openExperts('技术负责人')"/> + </template> + </el-input> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item prop="transmitDate" label="确认日期"> + <el-date-picker + style="width: 100%" + v-model="state.formData.transmitDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </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> + <el-table :data="state.tableData" :border="true" style="margin: 20px 0"> + <el-table-column label="序号" width="60" align="center" type="index"></el-table-column> + <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 :label="1">是</el-radio> + <el-radio :label="0">否</el-radio> + </el-radio-group> + </template> + </el-table-column> + </el-table> + <el-form-item prop="technology" label="存在问题及建议"> + <el-input + v-model="state.formData.technology" + :autosize="{ minRows: 6 }" + maxlength="500" + show-word-limit + type="textarea"> + </el-input> + </el-form-item> + </el-form> + <el-dialog v-model="state.dialogImg"> + <el-image style="width: 100%; height: 100%" :src="state.dialogImageUrl"/> + </el-dialog> + <experts-list ref="expertsListRef" @getName="getSelected"></experts-list> + </div> +</template> +<script setup> + +import {defineEmits, onMounted, reactive, ref} from "vue"; +import {ElMessage} from "element-plus"; +import {Search} from '@element-plus/icons-vue' +import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import {delPic} from "@/api/login" +import { getToken } from "@/utils/auth"; +import Cookies from "js-cookie" +import ExpertsList from "./expertsList"; +const emit = defineEmits(["getNextStatus"]); + +const state = reactive({ + formData: { + id: '', + leader: { + name: '' + }, + leaderId: null, + linkMan: '', + transmitPerson: '', + transmitDate: '' + }, + 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'}] + }, + 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} + ], + imgLimit: 1, + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: 'Bearer ' + getToken() + }, + dialogImageUrl: '', + dialogImg: false +}) +const props = { + expandTrigger: 'hover', + value: 'name', + label: 'name' +} +const isAmin = ref(false) +const formRef = ref() +const expertsListRef = ref() +onMounted(() => { + const userInfo = JSON.parse(Cookies.get('userInfo')) + if(userInfo.identity === 0){ + isAmin.value = true; + } +}) + +const riskOpen = async (type,val) => { + if(type === 'detail' || type === 'edit' ){ + const res = await getRiskDetail({projectId: val}); + if(res.code == 200){ + state.formData = res.data; + }else { + ElMessage.warning(res.message) + } + } + if(type === 'add' || type === 'clickEdit') { + const valid = await formRef.value.validate(); + if(valid){ + if (isAmin.value) { + ElMessage.warning("当前用户暂无权限"); + return; + } + if(type === 'add'){ + const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await addRisk(data); + if (res.code == 200) { + ElMessage.success('保存成功') + formRef.value.clearValidate(); + emit('getNextStatus', res.data); + + } else { + ElMessage.warning(res.message) + } + }else if(type === 'clickEdit'){ + const { ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await editRisk(data); + if (res.code == 200) { + ElMessage.success('变更成功') + formRef.value.clearValidate(); + // emit('getNextStatus', data.project.id); + } else { + ElMessage.warning(res.message) + } + } + } + } +} + +const openExperts = (type) =>{ + expertsListRef.value.openDialog(type) +} + +const getSelected = (type,obj)=>{ + state.formData.leader.name = obj.name + state.formData.leaderId = obj.id +} + +// 图片上传 +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} + +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M' + }); + return false + } +}; + +const handlePictureCardPreview = (uploadFile) => { + state.dialogImageUrl = uploadFile.url + state.dialogImg = true +}; + + +const handleAvatarSuccess = (res, uploadFile) => { + if(res.code == 200){ + // state.registerForm.agency.reportPath = res.data.path + }else{ + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } +} + +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 + }) + } +} + +defineExpose({ + riskOpen +}); + + +</script> +<style scoped lang="scss"> +.riskBox{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } +} + +</style> diff --git a/src/views/safetyReview/projectManage/components/uploadReviewRcd.vue b/src/views/safetyReview/projectManage/components/uploadReviewRcd.vue new file mode 100644 index 0000000..ce8a4f0 --- /dev/null +++ b/src/views/safetyReview/projectManage/components/uploadReviewRcd.vue @@ -0,0 +1,176 @@ +<template> + <div class="riskBox"> + <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top"> + <el-row :gutter="30"> + <el-col :span="18"> + <el-form-item label="附件上传"> + <el-upload accept=".pdf,.doc,.docx" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :limit='state.imgLimit' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove"> + <el-button type="primary">上传评审记录</el-button> + <template #tip> + <div class="el-upload__tip">支持上传pdf/word/doc/docx格式文件,尺寸小于2M,最多可上传3张</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> + <el-table :data="state.tableData" :border="true" style="margin: 20px 0"> + <el-table-column label="序号" width="60" align="center" type="index"></el-table-column> + <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-button link type="primary">查看</el-button> + </template> + </el-table-column> + </el-table> + </el-form> + </div> +</template> +<script setup> + +import {defineEmits, onMounted, reactive, ref} from "vue"; +import {ElMessage} from "element-plus"; +import {Search} from '@element-plus/icons-vue' +import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import {delPic} from "@/api/login" +import { getToken } from "@/utils/auth"; +import Cookies from "js-cookie" +const emit = defineEmits(["getNextStatus"]); + +const state = reactive({ + formData: { + id: '', + leader: { + name: '' + }, + leaderId: null, + linkMan: '', + transmitPerson: '', + transmitDate: '' + }, + 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'}] + }, + tableData: [], + imgLimit: 3, + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: 'Bearer ' + getToken() + } +}) +const props = { + expandTrigger: 'hover', + value: 'name', + label: 'name' +} +const isAmin = ref(false) +const formRef = ref() +onMounted(() => { + const userInfo = JSON.parse(Cookies.get('userInfo')) + if(userInfo.identity === 0){ + isAmin.value = true; + } +}) + +const riskOpen = async (type,val) => { + if(type === 'detail' || type === 'edit' ){ + const res = await getRiskDetail({projectId: val}); + if(res.code == 200){ + state.formData = res.data; + }else { + ElMessage.warning(res.message) + } + } + if(type === 'add' || type === 'clickEdit') { + const valid = await formRef.value.validate(); + if(valid){ + if (isAmin.value) { + ElMessage.warning("当前用户暂无权限"); + return; + } + if(type === 'add'){ + const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await addRisk(data); + if (res.code == 200) { + ElMessage.success('保存成功') + formRef.value.clearValidate(); + emit('getNextStatus', res.data); + + } else { + ElMessage.warning(res.message) + } + }else if(type === 'clickEdit'){ + const { ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await editRisk(data); + if (res.code == 200) { + ElMessage.success('变更成功') + formRef.value.clearValidate(); + // emit('getNextStatus', data.project.id); + } else { + ElMessage.warning(res.message) + } + } + } + } +} + +// 图片上传 +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} + +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 2){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过2M' + }); + return false + } +}; + +const handleAvatarSuccess = (res, uploadFile) => { + if(res.code == 200){ + // state.registerForm.agency.reportPath = res.data.path + }else{ + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } +} + +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 + }) + } +} + +defineExpose({ + riskOpen +}); + + +</script> +<style scoped lang="scss"> +.riskBox{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } +} + +</style> diff --git a/src/views/safetyReview/projectManage/process.vue b/src/views/safetyReview/projectManage/process.vue index 970b2a2..2c3a2c9 100644 --- a/src/views/safetyReview/projectManage/process.vue +++ b/src/views/safetyReview/projectManage/process.vue @@ -44,6 +44,11 @@ <evaluate-plan ref="evalPlanRef" v-if="selectedObj.id === 4" @getNextStatus="getNextStatus"></evaluate-plan> <employ-notice-record ref="employNoticeRcdRef" v-if="selectedObj.id === 5" @getNextStatus="getNextStatus"></employ-notice-record> <site-check-rcd ref="siteCheckRcdRef" v-if="selectedObj.id === 6" @getNextStatus="getNextStatus"></site-check-rcd> + <inner-review ref="innerReviewRef" v-if="selectedObj.id === 7" @getNextStatus="getNextStatus"></inner-review> + <tech-leader-review ref="techReviewRef" v-if="selectedObj.id === 8" @getNextStatus="getNextStatus"></tech-leader-review> + <upload-review-rcd ref="uploadReviewRef" v-if="selectedObj.id === 9" @getNextStatus="getNextStatus"></upload-review-rcd> + <rate-conclusion ref="rateConRef" v-if="selectedObj.id === 10" @getNextStatus="getNextStatus"></rate-conclusion> + <process-ctrl-review ref="proCtrlRef" v-if="selectedObj.id === 1" @getNextStatus="getNextStatus"></process-ctrl-review> </div> <div style="display: flex;align-items: center;justify-content: center;margin-bottom: -20px"> <el-button type="primary" v-if="selectedObj.id !== 1" style="width: 80px" @click="back">上一步</el-button> @@ -82,6 +87,11 @@ import EvaluatePlan from "./components/evaluatePlan"; import EmployNoticeRecord from "./components/employNoticeRecord" import SiteCheckRcd from "./components/siteCheckRcd" +import InnerReview from "./components/innerReview" +import TechLeaderReview from "./components/techLeaderReview" +import UploadReviewRcd from "./components/uploadReviewRcd" +import RateConclusion from "./components/rateConclusion" +import ProcessCtrlReview from "./components/processCtrlReview" const route = useRoute() const menuList = ref([ @@ -197,12 +207,17 @@ const evalPlanRef = ref() const employNoticeRcdRef = ref() const siteCheckRcdRef = ref() -const isShowMenu = ref(false); +const innerReviewRef = ref() +const techReviewRef = ref() +const uploadReviewRef = ref() +const rateConRef = ref() +const proCtrlRef = ref() +const isShowMenu = ref(false) const selectedObj = ref({}) -const middleHeight = ref(0); -const middleContentHeight = ref(0); -const projectId = ref(); -const projectStatus = ref(); +const middleHeight = ref(0) +const middleContentHeight = ref(0) +const projectId = ref() +const projectStatus = ref() onMounted(() => { middleHeight.value = window.innerHeight - 250; middleContentHeight.value = window.innerHeight - 385; -- Gitblit v1.9.2