From 66d9c9f157d6336d2325d65d9ec0012f325ee447 Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期五, 19 一月 2024 13:28:32 +0800 Subject: [PATCH] 新增页面组件 --- src/views/safetyReview/projectManage/components/confirmEnd.vue | 198 ++++++++++++++++++ src/views/safetyReview/projectManage/components/innerReview.vue | 1 src/views/safetyReview/projectManage/components/projectArchive.vue | 237 +++++++++++++++++++++ src/views/safetyReview/projectManage/components/signConfirm.vue | 153 +++++++++++++ src/views/safetyReview/projectManage/process.vue | 14 + src/views/safetyReview/projectManage/components/processCtrlReview.vue | 2 6 files changed, 602 insertions(+), 3 deletions(-) diff --git a/src/views/safetyReview/projectManage/components/confirmEnd.vue b/src/views/safetyReview/projectManage/components/confirmEnd.vue new file mode 100644 index 0000000..f265876 --- /dev/null +++ b/src/views/safetyReview/projectManage/components/confirmEnd.vue @@ -0,0 +1,198 @@ +<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-button type="primary" @click="addRectify">新增整改</el-button> + </el-col> + </el-row> + <el-table :data="state.rectifyList" :border="true" style="margin: 20px 0"> + <el-table-column label="序号" width="60" align="center" type="index"></el-table-column> + <el-table-column label="整改时间" header-align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-date-picker + style="width: 100%" + v-model="scope.row.startDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </template> + </el-table-column> + <el-table-column label="整改人" header-align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-input v-model="scope.row.deviceName" maxlength="50" show-word-limit type="text" size="large"/> + </template> + </el-table-column> + <el-table-column label="附件" header-align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-upload accept=".pdf" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :limit='1' v-model:file-list="state.fileList[scope.$index]" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove"> + <el-button type="primary">附件上传</el-button> + <template #tip> + <div class="el-upload__tip">上传pdf尺寸小于5M,最多可上传1张</div> + </template> + </el-upload> + </template> + </el-table-column> + <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-button link type="danger" @click="delRectify(scope.$index)">删除</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 {addRecord, editRecord, getDetail} from "@/api/projectManage/contractMng"; +import Cookies from "js-cookie"; +import { getToken } from "@/utils/auth"; + +const emit = defineEmits(["getNextStatus"]); +const state = reactive({ + formData: { + id: '', + contractSignDate: '', + contractMoney: '', + contractIntroduction: '' + }, + rectifyList: [], + rules: { + contractSignDate: [{required: true, message: '请选择合同签订日期', trigger: 'blur'}], + contractMoney: [{required: true, message: '请输入项目合同额', trigger: 'blur'}] + }, + fileList: [], + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: 'Bearer ' + getToken() + } +}) + +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) => { + state.formData.projectId = val; + if(type === 'detail' || type === 'edit' ){ + const res = await getDetail({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 addRecord(data); + if (res.code == 200) { + ElMessage.success('保存成功') + formRef.value.clearValidate(); + emit('getNextStatus', state.formData.projectId); + } else { + ElMessage.warning(res.message) + } + }else if(type === 'clickEdit'){ + const { ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await editRecord(data); + if (res.code == 200) { + ElMessage.success('变更成功') + formRef.value.clearValidate(); + // emit('getNextStatus', data.project.id); + } else { + ElMessage.warning(res.message) + } + } + } + } +} + +const addRectify = ()=>{ + let file = { + fileName: '', + deviceName: '', + startDate: '', + endDate: '' + } + state.rectifyList.push(file) +} + +const delRectify = (index)=>{ + state.rectifyList.splice(index,1) +} + +// 图片上传 +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} + +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M' + }); + 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/innerReview.vue b/src/views/safetyReview/projectManage/components/innerReview.vue index b739bdc..fab78be 100644 --- a/src/views/safetyReview/projectManage/components/innerReview.vue +++ b/src/views/safetyReview/projectManage/components/innerReview.vue @@ -124,6 +124,7 @@ {id: 12, content: '可报技术负责人审核', status: 1} ], imgLimit: 1, + fileList: [], uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', header: { Authorization: 'Bearer ' + getToken() diff --git a/src/views/safetyReview/projectManage/components/processCtrlReview.vue b/src/views/safetyReview/projectManage/components/processCtrlReview.vue index 1f96f84..53a9102 100644 --- a/src/views/safetyReview/projectManage/components/processCtrlReview.vue +++ b/src/views/safetyReview/projectManage/components/processCtrlReview.vue @@ -59,7 +59,7 @@ </el-radio-group> </template> </el-table-column> - <el-table-column label="不符合描述" header-align="center" class-name="small-padding fixed-width" width="175"> + <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" diff --git a/src/views/safetyReview/projectManage/components/projectArchive.vue b/src/views/safetyReview/projectManage/components/projectArchive.vue new file mode 100644 index 0000000..7f832e3 --- /dev/null +++ b/src/views/safetyReview/projectManage/components/projectArchive.vue @@ -0,0 +1,237 @@ +<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-button type="primary" @click="addUpload">新增附件</el-button> + </el-col> + </el-row> + <el-table :data="state.uploadList" :border="true" style="margin: 20px 0"> + <el-table-column label="序号" width="60" align="center" type="index"></el-table-column> + <el-table-column label="名称" header-align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-input v-model="scope.row.fileName" maxlength="30" show-word-limit type="text" size="large"/> + </template> + </el-table-column> + <el-table-column label="是否必须文件" header-align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-radio-group v-model="state.formData.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"> + <template #default="scope"> + <el-input v-model="scope.row.deviceName" maxlength="50" show-word-limit type="text" size="large"/> + </template> + </el-table-column> + <el-table-column label="附件上传" header-align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-upload accept="image/*,.pdf" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" :limit='1' v-model:file-list="state.fileList[scope.$index]" :before-upload="picSize" :on-remove="handleRemove" :before-remove="beforeRemove"> + <el-button type="primary">附件上传</el-button> + <template #tip> + <div class="el-upload__tip">上传图片或pdf尺寸小于5M,最多可上传1张</div> + </template> + </el-upload> + </template> + </el-table-column> + <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-button link type="danger" @click="delUpload(scope.$index)">删除</el-button> + </template> + </el-table-column> + </el-table> + <el-row :gutter="30"> + <el-col :span="6"> + <el-form-item prop="contractSignDate" label="合同签订日期"> + <el-date-picker + style="width: 100%" + v-model="state.formData.contractSignDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </el-form-item> + </el-col> + <el-col :span="18"> + <el-form-item prop="contractMoney"> + <template #label> + 项目合同额<span style="font-size: 13px;color: red;font-weight: normal;display: inline-block;margin-left: 6px">预估合同金额,归档阶段可以进行修改。仅支持数字,单位万元,小数点后最多两位,数值范围(0.01-999.99)</span> + </template> + <el-input + v-model="state.formData.contractMoney" + size="large" + type="number" + placeholder="请输入项目合同额" + > + <template #append>万元</template> + </el-input> + </el-form-item> + </el-col> + </el-row> + <el-form-item label="实际合同额说明"> + <el-input + v-model="state.formData.contractIntroduction" + :autosize="{ minRows: 6 }" + maxlength="100" + show-word-limit + type="textarea"> + </el-input> + </el-form-item> + </el-form> + </div> + +</template> +<script setup> + +import {defineEmits, onMounted, reactive, ref} from "vue"; +import {ElMessage} from "element-plus"; +import {addRecord, editRecord, getDetail} from "@/api/projectManage/contractMng"; +import Cookies from "js-cookie"; +import { getToken } from "@/utils/auth"; + +const emit = defineEmits(["getNextStatus"]); +const state = reactive({ + formData: { + id: '', + contractSignDate: '', + contractMoney: '', + contractIntroduction: '' + }, + uploadList: [], + rules: { + contractSignDate: [{required: true, message: '请选择合同签订日期', trigger: 'blur'}], + contractMoney: [{required: true, message: '请输入项目合同额', trigger: 'blur'}] + }, + fileList: [], + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + header: { + Authorization: 'Bearer ' + getToken() + } +}) + +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) => { + state.formData.projectId = val; + if(type === 'detail' || type === 'edit' ){ + const res = await getDetail({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 addRecord(data); + if (res.code == 200) { + ElMessage.success('保存成功') + formRef.value.clearValidate(); + emit('getNextStatus', state.formData.projectId); + } else { + ElMessage.warning(res.message) + } + }else if(type === 'clickEdit'){ + const { ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await editRecord(data); + if (res.code == 200) { + ElMessage.success('变更成功') + formRef.value.clearValidate(); + // emit('getNextStatus', data.project.id); + } else { + ElMessage.warning(res.message) + } + } + } + } +} + +const addUpload = ()=>{ + let file = { + fileName: '', + deviceName: '', + startDate: '', + endDate: '' + } + state.uploadList.push(file) +} + +const delUpload = (index)=>{ + state.uploadList.splice(index,1) +} + +// 图片上传 +const showTip =()=>{ + ElMessage({ + type: 'warning', + message: '超出文件上传数量' + }); +} + +const picSize = async (rawFile) => { + if(rawFile.size / 1024 / 1024 > 5){ + ElMessage({ + type: 'warning', + message: '文件大小不能超过5M' + }); + 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/signConfirm.vue b/src/views/safetyReview/projectManage/components/signConfirm.vue new file mode 100644 index 0000000..2d4c53a --- /dev/null +++ b/src/views/safetyReview/projectManage/components/signConfirm.vue @@ -0,0 +1,153 @@ +<template> + <div class="riskBox"> + <el-table v-loading="loading" ref="tableRef" :data="tableData" :border="true"> + <el-table-column type="index" width="55" /> + <el-table-column label="人员姓名" prop="name" align="center"/> + <el-table-column label="联系电话" prop="phone" align="center"/> + <el-table-column label="职位" prop="phone" align="center"/> + <el-table-column label="项目担任角色" prop="username" align="center"/> + <el-table-column label="评价师等级" prop="username" align="center"/> + <el-table-column label="专业能力" prop="username" align="center"/> + <el-table-column label="人员类型" prop="username" align="center"/> + <el-table-column label="扫脸时间" prop="username" align="center"/> + <el-table-column label="是否扫脸" prop="username" align="center"/> + <el-table-column label="是否变更" prop="username" align="center"/> + <el-table-column label="人员类型" prop="username" align="center"/> + <el-table-column label="人脸照片" prop="socialSecurity" align="center" width="120"> + <template #default="scope"> + <div class="demo-image__preview" v-if="scope.row.socialAttach && scope.row.socialAttach.length>0"> + <el-image + style="width: 100px; height: 100px" + :src= "scope.row.socialAttach[0]" + :zoom-rate="1.2" + :max-scale="7" + :min-scale="0.2" + :preview-src-list="scope.row.socialAttach" + :initial-index="0" + fit="cover" + preview-teleported="true" + /> + </div> + </template> + </el-table-column> + <el-table-column label="签字图片" prop="socialSecurity" align="center" width="120"> + <template #default="scope"> + <div class="demo-image__preview" v-if="scope.row.socialAttach && scope.row.socialAttach.length>0"> + <el-image + style="width: 100px; height: 100px" + :src= "scope.row.socialAttach[0]" + :zoom-rate="1.2" + :max-scale="7" + :min-scale="0.2" + :preview-src-list="scope.row.socialAttach" + :initial-index="0" + fit="cover" + preview-teleported="true" + /> + </div> + </template> + </el-table-column> + <el-table-column label="承诺书" prop="socialSecurity" align="center" width="120"> + <template #default="scope"> + <el-button link>承诺书</el-button> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + </div> +</template> +<script setup> + +import {defineEmits, onMounted, reactive, ref, toRefs} 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({ + loading: false, + queryParams: { + pageNum: 1, + pageSize: 10, + }, + total: 0, + tableData: [] +}) + +const {loading,queryParams,total,tableData} = toRefs(state) + +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) + } + } + } + } +} + +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 2c3a2c9..6c494dc 100644 --- a/src/views/safetyReview/projectManage/process.vue +++ b/src/views/safetyReview/projectManage/process.vue @@ -38,7 +38,7 @@ <div class="card-header">{{selectedObj.id}}- {{selectedObj.name}}</div> <div class="card-content"> <div :style="'height:' + middleContentHeight + 'px'" style="overflow-y: scroll;"> - <rickAnalysis ref="riskRef" v-if="selectedObj.id === 2" @getNextStatus="getNextStatus"></rickAnalysis> + <rickAnalysis ref="riskRef" v-if="selectedObj.id === 1" @getNextStatus="getNextStatus"></rickAnalysis> <contract-manage ref="contractMngRef" v-if="selectedObj.id === 2" @getNextStatus="getNextStatus"></contract-manage> <evaluate-task-notice ref="evaluteRef" v-if="selectedObj.id === 3" @getNextStatus="getNextStatus"></evaluate-task-notice> <evaluate-plan ref="evalPlanRef" v-if="selectedObj.id === 4" @getNextStatus="getNextStatus"></evaluate-plan> @@ -48,7 +48,10 @@ <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> + <process-ctrl-review ref="proCtrlRef" v-if="selectedObj.id === 11" @getNextStatus="getNextStatus"></process-ctrl-review> + <project-archive ref="proArchRef" v-if="selectedObj.id === 12" @getNextStatus="getNextStatus"></project-archive> + <sign-confirm ref="signConfirmRef" v-if="selectedObj.id === 13" @getNextStatus="getNextStatus"></sign-confirm> + <confirm-end ref="confirmEndRef" v-if="selectedObj.id === 14" @getNextStatus="getNextStatus"></confirm-end> </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> @@ -92,6 +95,9 @@ import UploadReviewRcd from "./components/uploadReviewRcd" import RateConclusion from "./components/rateConclusion" import ProcessCtrlReview from "./components/processCtrlReview" +import ProjectArchive from "./components/projectArchive" +import SignConfirm from "./components/signConfirm" +import ConfirmEnd from "./components/confirmEnd" const route = useRoute() const menuList = ref([ @@ -212,6 +218,10 @@ const uploadReviewRef = ref() const rateConRef = ref() const proCtrlRef = ref() +const proArchRef = ref() +const signConfirmRef = ref() +const confirmEndRef = ref() + const isShowMenu = ref(false) const selectedObj = ref({}) const middleHeight = ref(0) -- Gitblit v1.9.2