From 5c357cd927e74cc57531bd0a95338635e39be9af Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期一, 29 一月 2024 09:45:06 +0800 Subject: [PATCH] 修改强密码 --- src/views/safetyReview/projectManage/components/deviceDialog.vue | 140 ++++ src/views/safetyReview/projectManage/components/employNoticeRecord.vue | 110 +- src/views/safetyReview/projectManage/components/evaluatePlan.vue | 271 ++++--- src/views/safetyReview/projectManage/components/innerReview.vue | 122 ++- src/api/projectManage/evaTaskNotice.js | 25 src/views/safetyReview/projectManage/components/siteCheckRcd.vue | 391 ++++++++++- src/views/safetyReview/projectManage/components/signConfirm.vue | 4 src/api/projectManage/siteCheckRcd.js | 48 + src/views/safetyReview/projectManage/components/uploadReviewRcd.vue | 184 +++-- src/api/projectManage/innerReview.js | 25 src/views/safetyReview/projectManage/components/riskAnalysis.vue | 13 src/views/safetyReview/projectManage/components/worksDialog.vue | 205 ++++++ src/api/projectManage/rateConclude.js | 25 src/api/projectManage/employNoticeRcd.js | 25 src/api/projectManage/processCtrl.js | 25 src/views/safetyReview/projectManage/components/contractManage.vue | 1 src/views/safetyReview/projectManage/components/techLeaderReview.vue | 121 +- src/api/projectManage/evaPlan.js | 95 ++ src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue | 17 src/views/safetyReview/projectManage/process.vue | 83 ++ 20 files changed, 1,497 insertions(+), 433 deletions(-) diff --git a/src/api/projectManage/employNoticeRcd.js b/src/api/projectManage/employNoticeRcd.js new file mode 100644 index 0000000..bcfbde9 --- /dev/null +++ b/src/api/projectManage/employNoticeRcd.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function addWorkRecord(data) { + return request({ + url: '/manage/work-notification/add', + method: 'post', + data: data + }) +} + +export function editWorkRecord(params) { + return request({ + url: `/manage/work-notification/edit`, + method: 'put', + data: params + }) +} + +export function getWorkDetail(data) { + return request({ + url: '/manage/work-notification/getWorkNotificationByProjectId', + method: 'get', + params: data + }) +} diff --git a/src/api/projectManage/evaPlan.js b/src/api/projectManage/evaPlan.js new file mode 100644 index 0000000..de5da71 --- /dev/null +++ b/src/api/projectManage/evaPlan.js @@ -0,0 +1,95 @@ +import request from '@/utils/request' + +export function addRecord(data) { + return request({ + url: '/manage/estimate-plan/add', + method: 'post', + data: data + }) +} + +export function editRecord(params) { + return request({ + url: `/manage/estimate-plan/edit`, + method: 'put', + data: params + }) +} + +export function getDetail(data) { + return request({ + url: '/manage/estimate-plan/getPlanByProjectId', + method: 'get', + params: data + }) +} + +export function addWorks(data) { + return request({ + url: '/manage/plan-person/add', + method: 'post', + data: data + }) +} + +export function getWorks(data) { + return request({ + url: `/manage/plan-person/getPlanPersonByProjectId`, + method: 'get', + params: data + }) +} + +export function getWorksDetail(data) { + return request({ + url: `/manage/plan-person/getPlanPersonByPersonId`, + method: 'get', + params: data + }) +} + +export function editWorks(params) { + return request({ + url: `/manage/plan-person/edit`, + method: 'put', + data: params + }) +} + +export function delWorks(id) { + return request({ + url: '/manage/plan-person/remove/' + id, + method: 'delete' + }) +} + +export function addDevice(data) { + return request({ + url: '/manage/device/add', + method: 'post', + data: data + }) +} + +export function getDevice(data) { + return request({ + url: `/manage/device/getDeviceByProjectId`, + method: 'get', + params: data + }) +} + +export function editDevice(params) { + return request({ + url: `/manage/device/edit`, + method: 'put', + data: params + }) +} + +export function delDevice(id) { + return request({ + url: `/manage/device/remove/` + id, + method: 'delete' + }) +} \ No newline at end of file diff --git a/src/api/projectManage/evaTaskNotice.js b/src/api/projectManage/evaTaskNotice.js new file mode 100644 index 0000000..8880227 --- /dev/null +++ b/src/api/projectManage/evaTaskNotice.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function addRecord(data) { + return request({ + url: '/manage/estimate-task/add', + method: 'post', + data: data + }) +} + +export function editRecord(params) { + return request({ + url: `/manage/estimate-task/edit`, + method: 'put', + data: params + }) +} + +export function getDetail(data) { + return request({ + url: '/manage/estimate-task/getTaskByProjectId', + method: 'get', + params: data + }) +} diff --git a/src/api/projectManage/innerReview.js b/src/api/projectManage/innerReview.js new file mode 100644 index 0000000..b1de8b7 --- /dev/null +++ b/src/api/projectManage/innerReview.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function addInnerReview(data) { + return request({ + url: '/manage/ass-audit/add', + method: 'post', + data: data + }) +} + +export function editInnerReview(params){ + return request({ + url: `/manage/ass-audit/edit`, + method: 'put', + data: params + }) +} + +export function getInnerReviewDetail(data){ + return request({ + url: '/manage/ass-audit/getAuditByProjectId', + method: 'get', + params: data + }) +} \ No newline at end of file diff --git a/src/api/projectManage/processCtrl.js b/src/api/projectManage/processCtrl.js new file mode 100644 index 0000000..9c82701 --- /dev/null +++ b/src/api/projectManage/processCtrl.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function addProcessCtrl(data) { + return request({ + url: '/manage/process-audit/add', + method: 'post', + data: data + }) +} + +export function editProcessCtrl(params){ + return request({ + url: `/manage/process-audit/edit`, + method: 'put', + data: params + }) +} + +export function getProcessCtrlDetail(data){ + return request({ + url: '/manage/process-audit/getProcessByProjectId', + method: 'get', + params: data + }) +} \ No newline at end of file diff --git a/src/api/projectManage/rateConclude.js b/src/api/projectManage/rateConclude.js new file mode 100644 index 0000000..efacd25 --- /dev/null +++ b/src/api/projectManage/rateConclude.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function addRateConclude(data) { + return request({ + url: '/manage/conclusion/add', + method: 'post', + data: data + }) +} + +export function editRateConclude(params){ + return request({ + url: `/manage/conclusion/edit`, + method: 'put', + data: params + }) +} + +export function getRateConcludeDetail(data){ + return request({ + url: '/manage/conclusion/getConclusionByProjectId', + method: 'get', + params: data + }) +} \ No newline at end of file diff --git a/src/api/projectManage/siteCheckRcd.js b/src/api/projectManage/siteCheckRcd.js new file mode 100644 index 0000000..7f02b73 --- /dev/null +++ b/src/api/projectManage/siteCheckRcd.js @@ -0,0 +1,48 @@ +import request from '@/utils/request' + +export function addSiteCheck(data) { + return request({ + url: '/manage/investigation/add', + method: 'post', + data: data + }) +} + +export function editSiteCheck(params) { + return request({ + url: `/manage/investigation/edit`, + method: 'put', + data: params + }) +} + +export function getSiteCheckDetail(data) { + return request({ + url: '/manage/investigation/getInvestigationByProjectId', + method: 'get', + params: data + }) +} + +export function getFiles(data) { + return request({ + url: `/manage/accessory-file/getAccessoryFileByProjectId`, + method: 'get', + params: data + }) +} + +export function delFile(id) { + return request({ + url: `/manage/accessory-file/remove/` + id, + method: 'delete' + }) +} + +export function getReviewDone(data) { + return request({ + url: `/manage/review-record/doReview`, + method: 'post', + data: data + }) +} \ No newline at end of file diff --git a/src/views/safetyReview/projectManage/components/contractManage.vue b/src/views/safetyReview/projectManage/components/contractManage.vue index 55d76a6..54d456c 100644 --- a/src/views/safetyReview/projectManage/components/contractManage.vue +++ b/src/views/safetyReview/projectManage/components/contractManage.vue @@ -54,6 +54,7 @@ const state = reactive({ formData: { id: '', + projectId: null, contractSignDate: '', contractMoney: '', contractIntroduction: '' diff --git a/src/views/safetyReview/projectManage/components/deviceDialog.vue b/src/views/safetyReview/projectManage/components/deviceDialog.vue new file mode 100644 index 0000000..b399a7d --- /dev/null +++ b/src/views/safetyReview/projectManage/components/deviceDialog.vue @@ -0,0 +1,140 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="title" + width="500px" + :before-close="handleClose" + > + <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-position="top"> + <el-form-item label="设备名称:" prop="deviceName"> + <el-input v-model="state.form.deviceName" maxlength="30" show-word-limit type="text" size="large"/> + </el-form-item> + <el-form-item label="开始时间:" prop="startDate"> + <el-date-picker + style="width: 100%" + v-model="state.form.startDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </el-form-item> + <el-form-item label="结束时间:" prop="endDate"> + <el-date-picker + style="width: 100%" + v-model="state.form.endDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </el-form-item> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="handleClose" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> + </span> + </template> + </el-dialog> + </div> +</template> +<script setup> +import {defineProps, nextTick, reactive, ref, toRefs} from 'vue' +import {ElMessage} from "element-plus"; +import {addDevice, editDevice} from "@/api/projectManage/evaPlan" +const dialogVisible = ref(false) +const title = ref("") +const busRef = ref() +const props = defineProps(['workList','typeList']) +const emit = defineEmits(["getList"]) +const state = reactive({ + form: { + id: null, + projectId: null, + deviceName: '', + startDate: '', + endDate: '' + }, + formRules:{ + deviceName: [{ required: true, message: '请填写设备名称', trigger: 'blur' }], + startDate: [{ required: true, message: '请选择开始日期', trigger: 'blur' }], + endDate: [{ required: true, message: '请选择结束日期', trigger: 'blur' }] + } +}) + +const openDialog = async (type, value,projectId) => { + title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + state.form.projectId = projectId + if(type == 'add'){ + nextTick(()=>{ + busRef.value.resetFields() + }) + }else if(type === 'edit') { + state.form = JSON.parse(JSON.stringify(value)) + } + dialogVisible.value = true; +} + +const onSubmit = async () => { + const valid = await busRef.value.validate(); + if(valid){ + if(title.value === '新增'){ + const {id,...data} = state.form + const res = await addDevice(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '新增成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + busRef.value.resetFields() + dialogVisible.value = false; + }else if(title.value === '编辑'){ + const {...data} = state.form + const res = await editDevice(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '修改成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + busRef.value.resetFields() + dialogVisible.value = false; + } + } +} + +const handleClose = () => { + busRef.value.clearValidate(); + busRef.value.resetFields() + dialogVisible.value = false; +} + +defineExpose({ + openDialog +}); + +</script> + +<style scoped lang="scss"> +.notice{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } + .file { + display: flex; + flex-direction: column; + align-items: flex-start; + } +} +</style> diff --git a/src/views/safetyReview/projectManage/components/employNoticeRecord.vue b/src/views/safetyReview/projectManage/components/employNoticeRecord.vue index 7fa0b69..e3a816d 100644 --- a/src/views/safetyReview/projectManage/components/employNoticeRecord.vue +++ b/src/views/safetyReview/projectManage/components/employNoticeRecord.vue @@ -29,29 +29,6 @@ </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> <el-col :span="18"> <div style="display: flex;align-items: center">项目组成员<el-icon style="margin-left: 10px;margin-right: 4px"><InfoFilled /></el-icon><span style="font-size: 13px">金属、非金属矿及其他矿采选业:安全、机械、电气、采矿、通风、地质、水工结构</span></div> @@ -60,31 +37,21 @@ <el-table :data="state.planPersons" :border="true" style="margin: 20px 0"> <el-table-column label="序号" width="60" align="center" type="index"></el-table-column> <el-table-column label="评价组成员" prop="person.name" header-align="center" :show-overflow-tooltip="true"/> - <el-table-column label="资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true"/> - <el-table-column label="专业能力" prop="person.major" header-align="center" :show-overflow-tooltip="true"/> - <el-table-column label="承担工作" header-align="center" class-name="small-padding fixed-width"> + <el-table-column label="专业能力/资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true"> <template #default="scope"> - <el-select v-model="scope.row.work" multiple placeholder="承担工作" style="width: 100%" size="large" disabled> - <el-option v-for="item in state.workList" :key="item.value" :label="item.label" :value="item.value"/> - </el-select> + {{ getCertNo(scope.row) }} </template> </el-table-column> - <el-table-column label="承诺后期前往现场勘验" header-align="center" class-name="small-padding fixed-width"> + <el-table-column label="承担工作" prop="work" header-align="center" class-name="small-padding fixed-width"></el-table-column> + <el-table-column label="承诺后期前往现场勘验" prop="laterPromise" header-align="center" class-name="small-padding fixed-width"> <template #default="scope"> - <el-radio-group v-model="scope.row.laterPromise" size="large" disabled> - <el-radio :label="1" size="large">是</el-radio> - <el-radio :label="0" size="large">否</el-radio> - </el-radio-group> + {{(scope.row.laterPromise==1 || scope.row.laterPromise==true)?'是':'否'}} </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.reason" maxlength="30" show-word-limit type="text" size="large" readonly/> - </template> - </el-table-column> + <el-table-column label="未到现场勘验原因" prop="reason" header-align="center" class-name="small-padding fixed-width"></el-table-column> <el-table-column label="是否已告知" header-align="center" class-name="small-padding fixed-width"> <template #default="scope"> - <el-radio-group v-model="scope.row.informed" size="large"> + <el-radio-group v-model="scope.row.informed" size="large" @change="(value)=>changePerson(value,scope.row)"> <el-radio :label="1" size="large">是</el-radio> <el-radio :label="0" size="large">否</el-radio> </el-radio-group> @@ -96,25 +63,29 @@ </template> <script setup> -import {defineEmits, onMounted, reactive, ref} from "vue" +import {defineEmits, defineProps, onMounted, reactive, ref, watchEffect} from "vue" import {ElMessage} from "element-plus" import {Search} from '@element-plus/icons-vue' -import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import {addWorkRecord, editWorkRecord, getWorkDetail} from "@/api/projectManage/employNoticeRcd" +import {getWorks, editWorks} from "@/api/projectManage/evaPlan" import Cookies from "js-cookie" +const props = defineProps(['projectId']) const emit = defineEmits(["getNextStatus"]) const state = reactive({ formData: { + id: null, projectId: null, timeRange: [], serviceStartDate: '', serviceEndDate: '', investigationPlanDate: '' }, + projectId: null, planPersons: [], rules: { timeRange: [{required: true, message: '请选择技术服务期限', trigger: 'blur'}], - investigationPlanDate: [{required: true, message: '请选择计划现场勘验时间', trigger: 'blur'}], + investigationPlanDate: [{required: true, message: '请选择计划现场勘验时间', trigger: 'blur'}] } }) @@ -125,16 +96,19 @@ if(userInfo.identity === 0){ isAmin.value = true; } + // getWorksList(props.projectId) }); + const riskOpen = async (type,val) => { - console.log("type",type,val) + state.formData.projectId = val + state.projectId = val + await getWorksList(val) if(type === 'detail' || type === 'edit' ){ - const res = await getRiskDetail({projectId: val}); + const res = await getWorkDetail({projectId: val}) if(res.code == 200){ - state.formData = res.data; - state.formData.project.business = parseInt(res.data.project.business); - state.formData.project.area = [res.data.project.province,res.data.project.city]; + state.formData = JSON.parse(JSON.stringify(res.data)) + state.formData.timeRange = [state.formData.serviceStartDate,state.formData.serviceEndDate] }else { ElMessage.warning(res.message) } @@ -149,19 +123,19 @@ state.formData.serviceStartDate = state.formData.timeRange[0] state.formData.serviceEndDate = state.formData.timeRange[1] if(type === 'add'){ - const {projectId,timeRange, ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await addRisk(data); + const {timeRange,id,...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await addWorkRecord(data) if (res.code == 200) { ElMessage.success('保存成功') formRef.value.clearValidate(); emit('getNextStatus', res.data); - } else { ElMessage.warning(res.message) } + }else if(type === 'clickEdit'){ const {timeRange, ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await editRisk(data); + const res = await editWorkRecord(data); if (res.code == 200) { ElMessage.success('变更成功') formRef.value.clearValidate(); @@ -174,6 +148,38 @@ } } +const getWorksList = async (id) =>{ + const works = await getWorks({projectId: id ? id : props.projectId}) + if(works.code == 200){ + state.planPersons = works.data + }else { + ElMessage.warning(works.message) + } +} + +const getCertNo = (row)=>{ + const obj = JSON.parse(row.person.certificateNo) + const noArr = Object.values(obj) + return row.person.majorNames.map((item,index)=>{ + return item + '(' + noArr[index] + ')' + }).join(',') +} + +const changePerson = async (value,row)=>{ + const params = { + id: row.id, + projectId: row.projectId, + informed: value + } + const res = await editWorks(params) + if(res.code === 200){ + console.log(res.message) + }else{ + ElMessage.warning(res.message) + } + await getWorksList(props.projectId) +} + defineExpose({ riskOpen }); diff --git a/src/views/safetyReview/projectManage/components/evaluatePlan.vue b/src/views/safetyReview/projectManage/components/evaluatePlan.vue index 13876a2..2f62a3d 100644 --- a/src/views/safetyReview/projectManage/components/evaluatePlan.vue +++ b/src/views/safetyReview/projectManage/components/evaluatePlan.vue @@ -32,6 +32,7 @@ v-model="state.formData.auser.name" size="large" placeholder="请选择机构评价负责人" + @focus="openExperts('机构评价负责人')" > <template #append> <el-button :icon="Search" @click="openExperts('机构评价负责人')"/> @@ -39,19 +40,6 @@ </el-input> </el-form-item> </el-col> -<!-- <el-col :span="6">--> -<!-- <el-form-item prop="deliver" label="技术负责人">--> -<!-- <el-input--> -<!-- v-model="state.formData.deliver"--> -<!-- size="large"--> -<!-- placeholder="请选择技术负责人"--> -<!-- >--> -<!-- <template #append>--> -<!-- <el-button :icon="Search" @click="openExperts('技术负责人')"/>--> -<!-- </template>--> -<!-- </el-input>--> -<!-- </el-form-item>--> -<!-- </el-col>--> </el-row> <el-row> <el-col :span="18"> @@ -92,38 +80,30 @@ </el-col> <el-col :span="6"> <div style="width: 100%;display: flex;justify-content: right"> - <el-button type="primary" icon="Plus" @click="openExperts('项目组成员')">添加成员</el-button> + <el-button type="primary" icon="Plus" @click="openWorksDialog('add',{})">添加成员</el-button> </div> </el-col> </el-row> - <el-table :data="state.formData.planPersons" :border="true" style="margin: 20px 0"> + <el-table :data="state.planPersons" :border="true" style="margin: 20px 0"> <el-table-column label="序号" width="60" align="center" type="index"></el-table-column> <el-table-column label="评价组成员" prop="person.name" header-align="center" :show-overflow-tooltip="true"/> - <el-table-column label="资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true"/> - <el-table-column label="专业能力" prop="person.major" header-align="center" :show-overflow-tooltip="true"/> - <el-table-column label="承担工作" header-align="center" class-name="small-padding fixed-width"> + <el-table-column label="专业能力/资格证书" prop="person.certificateNo" header-align="center" :show-overflow-tooltip="true"> <template #default="scope"> - <el-select v-model="scope.row.work" multiple placeholder="承担工作" style="width: 100%" size="large"> - <el-option v-for="item in state.workList" :key="item.value" :label="item.label" :value="item.value"/> - </el-select> + {{ getCertNo(scope.row) }} </template> </el-table-column> - <el-table-column label="承诺后期前往现场勘验" header-align="center" class-name="small-padding fixed-width"> +<!-- <el-table-column label="专业能力" header-align="center" :show-overflow-tooltip="true"></el-table-column>--> + <el-table-column label="承担工作" prop="work" header-align="center" class-name="small-padding fixed-width"></el-table-column> + <el-table-column label="承诺后期前往现场勘验" prop="laterPromise" header-align="center" class-name="small-padding fixed-width"> <template #default="scope"> - <el-radio-group v-model="scope.row.laterPromise" size="large"> - <el-radio :label="1" size="large">是</el-radio> - <el-radio :label="0" size="large">否</el-radio> - </el-radio-group> + {{(scope.row.laterPromise==1 || scope.row.laterPromise==true)?'是':'否'}} </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.reason" maxlength="30" show-word-limit type="text" size="large"/> - </template> - </el-table-column> + <el-table-column label="未到现场勘验原因" prop="reason" header-align="center" class-name="small-padding fixed-width"></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="delMember(scope.$index)">删除</el-button> + <el-button link @click="openWorksDialog('edit',scope.row)">修改</el-button> + <el-button link type="danger" @click="delMember(scope.row)">删除</el-button> </template> </el-table-column> </el-table> @@ -133,63 +113,52 @@ </el-col> <el-col :span="6"> <div style="width: 100%;display: flex;justify-content: right"> - <el-button type="primary" icon="Plus" @click="addDevice">添加设备</el-button> + <el-button type="primary" icon="Plus" @click="openDeviceDialog('add',{})">添加设备</el-button> </div> </el-col> </el-row> - <el-table :data="state.formData.devices" :border="true" style="margin: 20px 0"> + <el-table :data="state.devices" :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"> + <el-table-column label="设备名称" prop="deviceName" header-align="center" class-name="small-padding fixed-width"/> + <el-table-column label="开始时间" prop="startDate" header-align="center" class-name="small-padding fixed-width"> <template #default="scope"> - <el-input v-model="scope.row.deviceName" maxlength="30" show-word-limit type="text" size="large"/> + {{scope.row.startDate.substring(0,10)}} </template> </el-table-column> - <el-table-column label="开始时间" header-align="center" class-name="small-padding fixed-width"> + <el-table-column label="结束时间" prop="endDate" 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-date-picker - style="width: 100%" - v-model="scope.row.endDate" - type="date" - value-format="YYYY-MM-DD 00:00:00" - placeholder="选择日期" - size="large" - /> + {{scope.row.endDate.substring(0,10)}} </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="delDevice(scope.$index)">删除</el-button> + <el-button link @click="openDeviceDialog('edit',scope.row)">修改</el-button> + <el-button link type="danger" @click="delDeviceItem(scope.row)">删除</el-button> </template> </el-table-column> </el-table> </el-form> <experts-list ref="expertsListRef" @getName="getSelected"></experts-list> + <works-dialog ref="worksRef" @getList="getWorksList" :workList="state.workList" :typeList="state.jobTypeList"></works-dialog> + <device-dialog ref="deviceRef" @getList="getDeviceList"></device-dialog> </div> </template> <script setup> -import {defineEmits, onMounted, reactive, ref} from "vue" -import {ElMessage} from "element-plus" +import {defineEmits, defineProps, onMounted, reactive, ref} from "vue" +import {ElMessage, ElMessageBox} from "element-plus" import {Search} from '@element-plus/icons-vue' -import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import {addRecord, editRecord, getDetail, getWorks, getDevice, delWorks, delDevice} from "@/api/projectManage/evaPlan" import Cookies from "js-cookie" import ExpertsList from "./expertsList" +import WorksDialog from './worksDialog' +import DeviceDialog from './deviceDialog' +const props = defineProps(['projectId']) const emit = defineEmits(["getNextStatus"]) const state = reactive({ formData: { + id: null, projectId: null, auser: { name: '' @@ -198,69 +167,87 @@ estimateSchedules: [ { id: 1, + sort: 1, name: '勘验准备', startDate: '', endDate: '', - scheduleType: 1 + scheduleType: 1, + projectId: null }, { id: 2, + sort: 2, name: '现场勘验', startDate: '', endDate: '', - scheduleType: 2 + scheduleType: 2, + projectId: null }, { id: 3, + sort: 3, name: '材料分析整理', startDate: '', endDate: '', - scheduleType: 3 + scheduleType: 3, + projectId: null }, { id: 4, + sort: 4, name: '评价报告编写', startDate: '', endDate: '', - scheduleType: 4 + scheduleType: 4, + projectId: null }, { id: 5, + sort: 5, name: '整改情况现场确认', startDate: '', endDate: '', - scheduleType: 5 + scheduleType: 5, + projectId: null }, { id: 6, + sort: 6, name: '整理评价报告', startDate: '', endDate: '', - scheduleType: 6 + scheduleType: 6, + projectId: null }, { id: 7, + sort: 7, name: '报告审核', startDate: '', endDate: '', - scheduleType: 7 + scheduleType: 7, + projectId: null }, { id: 8, + sort: 8, name: '报告修改', startDate: '', endDate: '', - scheduleType: 8 + scheduleType: 8, + projectId: null }, ], planPersons: [], devices: [], startDate: '', - endDate: '', - id: '' + endDate: '' }, + projectId: null, + planPersons: [], + devices: [], rules: { - "auser.name": [{required: true, message: '请填写机构评价负责人', trigger: 'blur'}], + "auser.name": [{required: true, message: '请填写机构评价负责人', trigger: 'change'}], startDate: [{required: true, message: '请选择评价开始时间', trigger: 'blur'}], endDate: [{required: true, message: '请选择评价结束时间', trigger: 'blur'}] }, @@ -269,31 +256,37 @@ {value: '文字校对',label: '文字校对'}, {value: '现场勘验',label: '现场勘验'}, {value: '资料收集整理',label: '资料收集整理'} + ], + jobTypeList: [ + {value: 1,label: '普通人员'}, + {value: 2,label: '组长'}, ] }) -const props = { - expandTrigger: 'hover', - value: 'name', - label: 'name' -} + const isAmin = ref(false) const formRef = ref() const expertsListRef = ref() +const worksRef = ref() +const deviceRef = ref() onMounted(() => { const userInfo = JSON.parse(Cookies.get('userInfo')) if(userInfo.identity === 0){ - isAmin.value = true; + isAmin.value = true } -}); +}) const riskOpen = async (type,val) => { - console.log("type",type,val) + state.formData.projectId = val + state.projectId = val + for(let i of state.formData.estimateSchedules){ + i.projectId = val + } + await getWorksList(val) + await getDeviceList(val) if(type === 'detail' || type === 'edit' ){ - const res = await getRiskDetail({projectId: val}); + const res = await getDetail({projectId: val}) if(res.code == 200){ - state.formData = res.data; - state.formData.project.business = parseInt(res.data.project.business); - state.formData.project.area = [res.data.project.province,res.data.project.city]; + state.formData = JSON.parse(JSON.stringify(res.data)) }else { ElMessage.warning(res.message) } @@ -307,10 +300,8 @@ } if(type === 'add'){ const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) - delete data.project.area; - delete data.project.id; - console.log('data', data) - const res = await addRisk(data); + console.log(data) + const res = await addRecord(data); if (res.code == 200) { ElMessage.success('保存成功') formRef.value.clearValidate(); @@ -321,9 +312,7 @@ } }else if(type === 'clickEdit'){ const { ...data} = JSON.parse(JSON.stringify(state.formData)) - delete data.project.area; - console.log('data', data) - const res = await editRisk(data); + const res = await editRecord(data); if (res.code == 200) { ElMessage.success('变更成功') formRef.value.clearValidate(); @@ -336,46 +325,88 @@ } } +const getWorksList = async (id) =>{ + const works = await getWorks({projectId: id ? id : props.projectId}) + if(works.code == 200){ + state.planPersons = works.data + }else { + ElMessage.warning(works.message) + } +} + +const getDeviceList = async (id) =>{ + const device = await getDevice({projectId: id ? id : props.projectId}) + if(device.code == 200){ + state.devices = device.data + }else { + ElMessage.warning(device.message) + } +} + +const getCertNo = (row)=>{ + const obj = JSON.parse(row.person.certificateNo) + const noArr = Object.values(obj) + return row.person.majorNames.map((item,index)=>{ + return item + '(' + noArr[index] + ')' + }).join(',') +} + const openExperts = (type) =>{ expertsListRef.value.openDialog(type) } const getSelected = (type,obj)=>{ - if(type == '项目负责人'){ - state.formData.auser.name = obj.name - state.formData.auserId = obj.id - }else{ - let member = { - person: { - name: obj.name, - certificateNo: obj.certificateNo?obj.certificateNo:'', - major: obj.speciality, - }, - informed: 0, - work: '', - laterPromise: 0, - reason: '' - } - state.formData.planPersons.push(member) - } + state.formData.auser.name = obj.name + state.formData.auserId = obj.id } -const delMember = (index)=>{ - state.formData.planPersons.splice(index,1) +const openWorksDialog = (type,data)=>{ + worksRef.value.openDialog(type,data,props.projectId) } -const addDevice = ()=>{ - let device = { - projectId: null, - deviceName: '', - startDate: '', - endDate: '' - } - state.formData.devices.push(device) +const openDeviceDialog = (type,data)=>{ + deviceRef.value.openDialog(type,data,props.projectId) } -const delDevice = (index)=>{ - state.formData.devices.splice(index,1) +const delMember = (row)=>{ + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delWorks(row.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getWorksList() + }else{ + ElMessage.warning(res.message) + } + }) +} + +const delDeviceItem = (row)=>{ + console.log(row,'row') + ElMessageBox.confirm( + '确定删除此条数据?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delDevice(row.id) + if(res.code == 200){ + ElMessage.success('数据删除成功') + await getDeviceList() + }else{ + ElMessage.warning(res.message) + } + }) } defineExpose({ diff --git a/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue b/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue index d468496..df6b87e 100644 --- a/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue +++ b/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue @@ -8,6 +8,7 @@ v-model="state.formData.leader.name" size="large" placeholder="请选择项目负责人" + @focus="openExperts('项目负责人')" > <template #append> <el-button :icon="Search" @click="openExperts('项目负责人')"/> @@ -53,6 +54,7 @@ v-model="state.formData.transmitPerson" size="large" placeholder="请选择任务下达人" + @focus="openExperts('任务下达人')" > <template #append> <el-button :icon="Search" @click="openExperts('任务下达人')"/> @@ -82,7 +84,7 @@ 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 {addRecord, editRecord, getDetail} from "@/api/projectManage/evaTaskNotice"; import Cookies from "js-cookie" import ExpertsList from "./expertsList"; const emit = defineEmits(["getNextStatus"]); @@ -90,9 +92,11 @@ const state = reactive({ formData: { id: '', + projectId: null, leader: { name: '' }, + fax: '', leaderId: null, linkMan: '', transmitPerson: '', @@ -121,8 +125,9 @@ }) const riskOpen = async (type,val) => { + state.formData.projectId = val if(type === 'detail' || type === 'edit' ){ - const res = await getRiskDetail({projectId: val}); + const res = await getDetail({projectId: val}); if(res.code == 200){ state.formData = res.data; }else { @@ -138,18 +143,18 @@ } if(type === 'add'){ const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await addRisk(data); + const res = await addRecord(data); if (res.code == 200) { ElMessage.success('保存成功') formRef.value.clearValidate(); - emit('getNextStatus', res.data); + emit('getNextStatus', state.formData.projectId); } else { ElMessage.warning(res.message) } - }else if(type === 'clickEdit'){ + }else{ const { ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await editRisk(data); + const res = await editRecord(data); if (res.code == 200) { ElMessage.success('变更成功') formRef.value.clearValidate(); diff --git a/src/views/safetyReview/projectManage/components/innerReview.vue b/src/views/safetyReview/projectManage/components/innerReview.vue index fab78be..ba24145 100644 --- a/src/views/safetyReview/projectManage/components/innerReview.vue +++ b/src/views/safetyReview/projectManage/components/innerReview.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="选择日期" @@ -17,7 +17,7 @@ <el-col :span="6"> <el-form-item prop="leader.name" label="内部审核员"> <el-input - v-model="state.formData.leader.name" + v-model="state.formData.assessor.name" size="large" placeholder="请选择内部审核员" > @@ -28,10 +28,10 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item prop="transmitDate" label="内部审核确认日期"> + <el-form-item label="内部审核确认日期"> <el-date-picker style="width: 100%" - v-model="state.formData.transmitDate" + v-model="state.formData.affirmDate" type="date" value-format="YYYY-MM-DD 00:00:00" placeholder="选择日期" @@ -40,18 +40,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="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-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"/> @@ -64,9 +64,9 @@ </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 @@ -74,9 +74,9 @@ </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> +<!-- <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> @@ -85,7 +85,7 @@ 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 {addInnerReview, editInnerReview, getInnerReviewDetail} from "@/api/projectManage/innerReview" import {delPic} from "@/api/login" import { getToken } from "@/utils/auth"; import Cookies from "js-cookie" @@ -95,48 +95,44 @@ const state = reactive({ formData: { id: '', - leader: { + projectId: '', + auditDate:'', + auditType: 1, + assessor: { name: '' }, - leaderId: null, - linkMan: '', - transmitPerson: '', - transmitDate: '' + assessorId: null, + affirmDate: '', + 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'}] + "assessor.name": [{required: true, message: '请选择内部审核员', trigger: 'blur'}], + auditDate: [{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} + {id: 1, content: '评价依据是否充分、准确、有效',key: 'isBasis', status: 1}, + {id: 2, content: '评价范围是否与合同一致', key: 'isScope', status: 1}, + {id: 3, content: '危险有害因素识别是否全面', key: 'isDangerOverall', status: 1}, + {id: 4, content: '评价单元划分是否合理', key: 'isUnitDivision', status: 1}, + {id: 5, content: '评价方法选择是否适当', key: 'isMethodSelection', status: 1}, + {id: 6, content: '对策措施与建议是否可行', key: 'isMeasure', status: 1}, + {id: 7, content: '结论是否正确', key: 'isConclusion', status: 1}, + {id: 8, content: '格式是否符合要求', key: 'isFormat', status: 1}, + {id: 9, content: '附件与附图是否有效及规范', key: 'isFile', status: 1}, + {id: 10, content: '文字、数据是否准确', key: 'isText', status: 1}, + {id: 11, content: '已按要求修改完成', key: 'isAmendFinish', status: 1}, + {id: 12, content: '可报技术负责人审核', key: 'isReportAudit', status: 1} ], imgLimit: 1, fileList: [], uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', header: { - Authorization: 'Bearer ' + getToken() + Authorization: getToken() }, dialogImageUrl: '', dialogImg: false }) -const props = { - expandTrigger: 'hover', - value: 'name', - label: 'name' -} + const isAmin = ref(false) const formRef = ref() const expertsListRef = ref() @@ -148,10 +144,18 @@ }) const riskOpen = async (type,val) => { + state.formData.projectId = val if(type === 'detail' || type === 'edit' ){ - const res = await getRiskDetail({projectId: val}); + const res = await getInnerReviewDetail({projectId: val,auditType: 1}); if(res.code == 200){ - state.formData = res.data; + state.formData = res.data + for(let key in res.data){ + for(let item of state.tableData){ + if(item.key == key){ + item.status = res.data[key]==true?1:0 + } + } + } }else { ElMessage.warning(res.message) } @@ -165,7 +169,10 @@ } if(type === 'add'){ const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await addRisk(data); + for(let i of state.tableData){ + data[i.key] = i.status + } + const res = await addInnerReview(data); if (res.code == 200) { ElMessage.success('保存成功') formRef.value.clearValidate(); @@ -176,7 +183,10 @@ } }else if(type === 'clickEdit'){ const { ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await editRisk(data); + for(let i of state.tableData){ + data[i.key] = i.status + } + const res = await editInnerReview(data); if (res.code == 200) { ElMessage.success('变更成功') formRef.value.clearValidate(); @@ -194,8 +204,8 @@ } const getSelected = (type,obj)=>{ - state.formData.leader.name = obj.name - state.formData.leaderId = obj.id + state.formData.assessor.name = obj.name + state.formData.assessorId = obj.id } // 图片上传 diff --git a/src/views/safetyReview/projectManage/components/riskAnalysis.vue b/src/views/safetyReview/projectManage/components/riskAnalysis.vue index ac08f96..d05904d 100644 --- a/src/views/safetyReview/projectManage/components/riskAnalysis.vue +++ b/src/views/safetyReview/projectManage/components/riskAnalysis.vue @@ -365,7 +365,11 @@ if(res.code == 200){ state.formData = res.data; state.formData.project.business = parseInt(res.data.project.business); - state.formData.project.area = [res.data.project.province,res.data.project.city]; + if(res.data.project.province == '北京市' || res.data.project.province == '天津市' || res.data.project.province == '上海市' || res.data.project.province == '重庆市' || res.data.project.province == '香港特别行政区' || res.data.project.province == '澳门特别行政区'){ + state.formData.project.area = [res.data.project.province] + }else{ + state.formData.project.area = [res.data.project.province,res.data.project.city]; + } state.tableData[0].status = res.data.isInBusiness ? 1 : 0; state.tableData[1].status = res.data.isSatisfyNeed ? 1 : 0; state.tableData[2].status = res.data.isNeedExpert ? 1 : 0; @@ -387,13 +391,15 @@ const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) delete data.project.area; delete data.project.id; + if(data.project.province == '北京市' || data.project.province == '天津市' || data.project.province == '上海市' || data.project.province == '重庆市' || data.project.province == '香港特别行政区' || data.project.province == '澳门特别行政区'){ + data.project.city = data.project.province + } data.isInBusiness = state.tableData[0].status === 1; data.isSatisfyNeed = state.tableData[1].status === 1; data.isNeedExpert = state.tableData[2].status === 1; data.isFinishReport = state.tableData[3].status === 1; data.isAcceptChargess = state.tableData[4].status === 1; data.isFeasibility = state.tableData[5].status === 1; - console.log('data', data) const res = await addRisk(data); if (res.code == 200) { ElMessage.success('保存成功') @@ -407,6 +413,9 @@ const { ...data} = JSON.parse(JSON.stringify(state.formData)) data.id = val; data.project.id = val; + if(data.project.province == '北京市' || data.project.province == '天津市' || data.project.province == '上海市' || data.project.province == '重庆市' || data.project.province == '香港特别行政区' || data.project.province == '澳门特别行政区'){ + data.project.city = data.project.province + } delete data.project.area; data.isInBusiness = state.tableData[0].status === 1 data.isSatisfyNeed = state.tableData[1].status === 1 diff --git a/src/views/safetyReview/projectManage/components/signConfirm.vue b/src/views/safetyReview/projectManage/components/signConfirm.vue index 2d4c53a..5c66699 100644 --- a/src/views/safetyReview/projectManage/components/signConfirm.vue +++ b/src/views/safetyReview/projectManage/components/signConfirm.vue @@ -96,6 +96,7 @@ }) const riskOpen = async (type,val) => { + state.formData.projectId = val if(type === 'detail' || type === 'edit' ){ const res = await getRiskDetail({projectId: val}); if(res.code == 200){ @@ -117,8 +118,7 @@ if (res.code == 200) { ElMessage.success('保存成功') formRef.value.clearValidate(); - emit('getNextStatus', res.data); - + emit('getNextStatus', res.data) } else { ElMessage.warning(res.message) } diff --git a/src/views/safetyReview/projectManage/components/siteCheckRcd.vue b/src/views/safetyReview/projectManage/components/siteCheckRcd.vue index 1230979..514bd3e 100644 --- a/src/views/safetyReview/projectManage/components/siteCheckRcd.vue +++ b/src/views/safetyReview/projectManage/components/siteCheckRcd.vue @@ -5,17 +5,17 @@ <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-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="现场勘验时间"> <el-date-picker style="width: 100%" - v-model="state.formData.investigationPlanDate" + v-model="state.formData.investigationDate" type="date" value-format="YYYY-MM-DD 00:00:00" placeholder="选择日期" @@ -24,7 +24,7 @@ </el-form-item> </el-col> <el-col :span="12"> - <el-form-item prop="investigationDate" label="现场勘验位置"> + <el-form-item prop="location" label="现场勘验位置"> <el-input v-model="state.formData.location" size="large" @@ -39,51 +39,115 @@ <el-col :span="6"> <el-form-item prop="isSafetyCheck" label="编制现场安全检查表"> <el-radio-group v-model="state.formData.isSafetyCheck" size="large"> - <el-radio :label="true" size="large">是</el-radio> - <el-radio :label="false" size="large">否</el-radio> + <el-radio :label="1" size="large">是</el-radio> + <el-radio :label="0" size="large">否</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-col :span="24" v-if="state.formData.isSafetyCheck == 1"> + <el-form-item label="安全检查表上传" prop="assAccessoryFiles"> + <el-upload accept="image/*,.pdf,.doc,.docx,.xlsx,.xls" :action="state.uploadUrl" :data="{moduleType: 5,projectId: props.projectId}" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,5)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="state.safetyList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,5)" :before-remove="beforeRemove"> + <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-col :span="24" v-if="state.formData.isSafetyCheck == 0"> + <el-form-item prop="recordData" label="现场勘验记录"> + <el-input + v-model="state.formData.recordData" + :autosize="{ minRows: 6 }" + maxlength="200" + show-word-limit + type="textarea"> + </el-input> + </el-form-item> + </el-col> + </el-row> + <el-row style="border: 1px dashed #999;border-radius: 4px;padding: 10px;margin-top: 20px"> + <el-col :span="24"> + <el-form-item label="主要装置前合影照片" prop="deviceImages"> + <el-upload accept="image/*" :action="state.uploadUrl" :data="{moduleType: 1,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,1)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.beforeDeviceList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,1)" :before-remove="beforeRemove"> <el-icon><Plus /></el-icon> <template #tip> - <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div> + <div class="el-upload__tip">上传照片尺寸小于5M,最多可上传10张</div> </template> </el-upload> </el-form-item> </el-col> </el-row> - <el-form-item prop="recordData" label="现场勘验记录"> - <el-input - v-model="state.formData.recordData" - :autosize="{ minRows: 6 }" - maxlength="200" - show-word-limit - type="textarea"> - </el-input> - </el-form-item> - <el-form-item label="企业陪同照片"> - - </el-form-item> + <el-row style="border: 1px dashed #999;border-radius: 4px;padding: 10px;margin-top: 20px"> + <el-col :span="24"> + <el-form-item label="现场勘验照片" prop="investingationImages"> + <el-upload accept="image/*" :action="state.uploadUrl" :data="{moduleType: 2,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,2)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.siteCheckList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,2)" :before-remove="beforeRemove"> + <el-icon><Plus /></el-icon> + <template #tip> + <div class="el-upload__tip">上传照片尺寸小于5M,最多可上传10张</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> + <el-row style="border: 1px dashed #999;border-radius: 4px;padding: 10px;margin-top: 20px;margin-bottom: 20px"> + <el-col :span="24"> + <el-form-item label="企业陪同人员照片" prop="ccompanyImages"> + <el-upload accept="image/*" :action="state.uploadUrl" :data="{moduleType: 3,projectId: props.projectId}" list-type="picture-card" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,3)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='10' v-model:file-list="state.companyList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,3)" :before-remove="beforeRemove"> + <el-icon><Plus /></el-icon> + <template #tip> + <div class="el-upload__tip">上传照片尺寸小于5M,最多可上传10张</div> + </template> + </el-upload> + </el-form-item> + </el-col> + </el-row> </el-form> + <el-dialog v-model="state.imgDialog"> + <img style="width: 100%" :src="state.imgUrl" alt="Preview Image" /> + </el-dialog> <map-location ref="mapLocationRef" @giveLatLng="achieveLatLng"></map-location> </div> </template> <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 {delPic} from "@/api/login" +import {addSiteCheck,editSiteCheck,getSiteCheckDetail, delFile, getFiles} from "@/api/projectManage/siteCheckRcd"; import { getToken } from "@/utils/auth"; import Cookies from "js-cookie" +const props = defineProps(['projectId']) const emit = defineEmits(["getNextStatus"]) import MapLocation from "./mapLocation.vue" + +let checkSafetyFiles = (rule, value, callback)=>{ + if(state.safetyList.length === 0){ + callback(new Error('请上传现场安全检查表')) + }else{ + callback() + } +} + +let checkInvestFiles = (rule, value, callback)=>{ + if(state.siteCheckList.length === 0){ + callback(new Error('请上传现场勘验照片')) + }else{ + callback() + } +} + +let checkCompanyFiles = (rule, value, callback)=>{ + if(state.companyList.length === 0){ + callback(new Error('请上传企业陪同人员照片')) + }else{ + callback() + } +} + + const state = reactive({ formData: { @@ -92,17 +156,34 @@ investigationDate: '', location: '', isSafetyCheck: null, - recordData: '' + recordData: '', + assAccessoryFiles: [], + deviceImages: [], + investingationImages: [], + ccompanyImages:[] }, + projectId: null, planPersons: [], rules: { - recordData: [{required: true, message: '请填写现场勘验记录', trigger: 'blur'}] + investigationDate: [{required: true, message: '请选择现场勘验时间', trigger: 'blur'}], + location: [{required: true, message: '请选择现场勘验位置', trigger: 'blur'}], + isSafetyCheck: [{required: true, message: '请选择现场勘验位置', trigger: 'blur'}], + recordData: [{required: true, message: '请填写现场勘验记录', trigger: 'blur'}], + assAccessoryFiles: [{required: true, validator: checkSafetyFiles, trigger: 'blur'}], + // investingationImages: [{required: true, validator: checkInvestFiles, trigger: 'blur'}], + // ccompanyImages: [{required: true, validator: checkCompanyFiles, trigger: 'blur'}] }, + beforeDeviceList: [], + siteCheckList: [], + companyList: [], + safetyList: [], 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() + }, + imgDialog: false, + imgUrl: '' }) const isAmin = ref(false) @@ -116,13 +197,48 @@ }); const riskOpen = async (type,val) => { - console.log("type",type,val) + state.formData.projectId = val + state.projectId = val if(type === 'detail' || type === 'edit' ){ - const res = await getRiskDetail({projectId: val}); + const res = await getSiteCheckDetail({projectId: val}); if(res.code == 200){ state.formData = res.data; - state.formData.project.business = parseInt(res.data.project.business); - state.formData.project.area = [res.data.project.province,res.data.project.city]; + state.beforeDeviceList = res.data.deviceImages.map(i=>{ + return { + name: i.fileName, + url: import.meta.env.VITE_APP_BASE_API + '/' + i.path, + id: i.id, + projectId: i.projectId, + moduleType: i.moduleType + } + }) + state.siteCheckList = res.data.investingationImages.map(i=>{ + return { + name: i.fileName, + url: import.meta.env.VITE_APP_BASE_API + '/' + i.path, + id: i.id, + projectId: i.projectId, + moduleType: i.moduleType + } + }) + state.companyList = res.data.ccompanyImages.map(i=>{ + return { + name: i.fileName, + url: import.meta.env.VITE_APP_BASE_API + '/' + i.path, + id: i.id, + projectId: i.projectId, + moduleType: i.moduleType + } + }) + state.safetyList = res.data.assAccessoryFiles.map(i=>{ + return { + name: i.fileName, + url: import.meta.env.VITE_APP_BASE_API + '/' + i.path, + id: i.id, + projectId: i.projectId, + moduleType: i.moduleType + } + }) }else { ElMessage.warning(res.message) } @@ -135,21 +251,49 @@ return; } if(type === 'add'){ - const {projectId, ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await addRisk(data); + if(state.formData.isSafetyCheck == 1){ + state.formData.recordData = '' + } + const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await addSiteCheck(data); if (res.code == 200) { ElMessage.success('保存成功') + if(state.formData.isSafetyCheck == 0){ + const res = await delFile(state.safetyList[0].id) + if(res.code == 200){ + console.log('删除原有附件') + await getSafetyFiles() + }else{ + ElMessage({ + type: 'warning', + message: res.message + }) + } + } formRef.value.clearValidate(); emit('getNextStatus', res.data); - } else { ElMessage.warning(res.message) } }else if(type === 'clickEdit'){ + if(state.formData.isSafetyCheck == 1){ + state.formData.recordData = '' + } const { ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await editRisk(data); + const res = await editSiteCheck(data); if (res.code == 200) { ElMessage.success('变更成功') + if(state.formData.isSafetyCheck == 0){ + const res = await delFile(state.safetyList[0].id) + if(res.code == 200){ + await getSafetyFiles() + }else{ + ElMessage({ + type: 'warning', + message: res.message + }) + } + } formRef.value.clearValidate(); // emit('getNextStatus', data.project.id); } else { @@ -157,6 +301,90 @@ } } } + } +} + +const getBeforeFiles = async (id)=>{ + const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 1}) + if(res.code == 200){ + if(res.data && res.data.length>0){ + state.beforeDeviceList = res.data.map(i=>{ + return { + name: i.fileName, + url: import.meta.env.VITE_APP_BASE_API + '/' + i.path, + id: i.id, + projectId: i.projectId, + moduleType: i.moduleType + } + }) + }else{ + state.beforeDeviceList=[] + } + }else { + ElMessage.warning(res.message) + } +} + +const getSiteCheckFiles = async (id)=>{ + const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 2}) + if(res.code == 200){ + if(res.data && res.data.length>0){ + state.siteCheckList = res.data.map(i=>{ + return { + name: i.fileName, + url: import.meta.env.VITE_APP_BASE_API + '/' + i.path, + id: i.id, + projectId: i.projectId, + moduleType: i.moduleType + } + }) + }else{ + state.siteCheckList = [] + } + }else { + ElMessage.warning(res.message) + } +} + +const getCompanyFiles = async (id)=>{ + const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 3}) + if(res.code == 200){ + if(res.data && res.data.length>0){ + state.companyList = res.data.map(i=>{ + return { + name: i.fileName, + url: import.meta.env.VITE_APP_BASE_API + '/' + i.path, + id: i.id, + projectId: i.projectId, + moduleType: i.moduleType + } + }) + }else{ + state.companyList=[] + } + }else { + ElMessage.warning(res.message) + } +} + +const getSafetyFiles = async (id)=>{ + const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 5}) + if(res.code == 200){ + if(res.data && res.data.length>0){ + state.safetyList = res.data.map(i=>{ + return { + name: i.fileName, + url: import.meta.env.VITE_APP_BASE_API + '/' + i.path, + id: i.id, + projectId: i.projectId, + moduleType: i.moduleType + } + }) + }else{ + state.safetyList = [] + } + }else { + ElMessage.warning(res.message) } } @@ -187,14 +415,27 @@ }; const handlePictureCardPreview = (uploadFile) => { - state.dialogImageUrl = uploadFile.url - state.dialogImg = true + console.log(uploadFile,'file') + state.imgUrl = uploadFile.url + state.imgDialog = true }; -const handleAvatarSuccess = (res, uploadFile) => { +const handleAvatarSuccess = (res, uploadFile, type) => { if(res.code == 200){ - // state.registerForm.agency.reportPath = res.data.path + if(type == 1){ + getBeforeFiles() + } + if(type == 2){ + getSiteCheckFiles() + } + if(type == 3){ + getCompanyFiles() + } + if(type == 5){ + console.log(res,'res') + getSafetyFiles() + } }else{ ElMessage({ type: 'warning', @@ -203,19 +444,55 @@ } } -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, uploadFiles,type) => { + ElMessageBox.confirm( + '确定删除该附件?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delFile(file.id) + if(res.code == 200){ + ElMessage({ + type: 'success', + message: '文件已删除' + }) + if(type == 1){ + await getBeforeFiles() + } + if(type == 2){ + await getSiteCheckFiles() + } + if(type == 3){ + await getCompanyFiles() + } + if(type == 5){ + await getSafetyFiles() + } + }else{ + ElMessage({ + type: 'warning', + message: res.message + }) + } + }) + .catch(()=>{ + if(type == 1){ + getBeforeFiles() + } + if(type == 2){ + getSiteCheckFiles() + } + if(type == 3){ + getCompanyFiles() + } + if(type == 5){ + getSafetyFiles() + } + }) } defineExpose({ diff --git a/src/views/safetyReview/projectManage/components/techLeaderReview.vue b/src/views/safetyReview/projectManage/components/techLeaderReview.vue index f208022..d928c0e 100644 --- a/src/views/safetyReview/projectManage/components/techLeaderReview.vue +++ b/src/views/safetyReview/projectManage/components/techLeaderReview.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,11 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item prop="leader.name" label="技术负责人"> + <el-form-item prop="assessor.name" label="技术负责人"> <el-input - v-model="state.formData.leader.name" + v-model="state.formData.assessor.name" size="large" - placeholder="请选择内部审核员" + placeholder="请选择技术负责人" > <template #append> <el-button :icon="Search" @click="openExperts('技术负责人')"/> @@ -28,10 +28,10 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item prop="transmitDate" label="确认日期"> + <el-form-item label="确认日期"> <el-date-picker style="width: 100%" - v-model="state.formData.transmitDate" + v-model="state.formData.affirmDate" type="date" value-format="YYYY-MM-DD 00:00:00" placeholder="选择日期" @@ -40,18 +40,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="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-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"/> @@ -64,9 +64,9 @@ </template> </el-table-column> </el-table> - <el-form-item prop="technology" label="存在问题及建议"> + <el-form-item label="存在问题及建议"> <el-input - v-model="state.formData.technology" + v-model="state.formData.suggestions" :autosize="{ minRows: 6 }" maxlength="500" show-word-limit @@ -85,54 +85,50 @@ 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 {addInnerReview, editInnerReview, getInnerReviewDetail} from "@/api/projectManage/innerReview" import {delPic} from "@/api/login" import { getToken } from "@/utils/auth"; import Cookies from "js-cookie" import ExpertsList from "./expertsList"; -const emit = defineEmits(["getNextStatus"]); +const emit = defineEmits(["getNextStatus"]) const state = reactive({ formData: { id: '', - leader: { + projectId: '', + auditDate:'', + auditType: 2, + assessor: { name: '' }, - leaderId: null, - linkMan: '', - transmitPerson: '', - transmitDate: '' + assessorId: null, + affirmDate: '', + 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'}] + "assessor.name": [{required: true, message: '请选择内部审核员', trigger: 'blur'}], + auditDate: [{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: '报告中所列评价依据是否得到引用和验证',key: 'isBasisQuote', status: 1}, + {id: 2, content: '现场收集的有关资料是否齐全、有效',key: 'isData', status: 1}, + {id: 3, content: '危险有害因素识别是否充分', key: 'isDangerFull',status: 1}, + {id: 4, content: '报告是否有重大遗漏', key: 'isOmission',status: 1}, + {id: 5, content: '评价方法选用是否合理', key: 'isMethodRational',status: 1}, + {id: 6, content: '对策措施及建议是否具有针对性、合理性', key: 'isMeasureEquitable',status: 1}, + {id: 7, content: '评价结论及格式是否正确', key: 'isConclusionRight',status: 1}, + {id: 8, content: '已按要求修改完成', key: 'isAmendFinish',status: 1}, + {id: 9, content: '可报过程控制负责人审核', key: 'isReportAudit',status: 1} ], imgLimit: 1, uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', header: { - Authorization: 'Bearer ' + getToken() + Authorization: getToken() }, dialogImageUrl: '', dialogImg: false }) -const props = { - expandTrigger: 'hover', - value: 'name', - label: 'name' -} + const isAmin = ref(false) const formRef = ref() const expertsListRef = ref() @@ -144,10 +140,18 @@ }) const riskOpen = async (type,val) => { + state.formData.projectId = val if(type === 'detail' || type === 'edit' ){ - const res = await getRiskDetail({projectId: val}); + const res = await getInnerReviewDetail({projectId: val,auditType: 2}); if(res.code == 200){ - state.formData = res.data; + state.formData = res.data + for(let key in res.data){ + for(let item of state.tableData){ + if(item.key == key){ + item.status = res.data[key]==true?1:0 + } + } + } }else { ElMessage.warning(res.message) } @@ -161,7 +165,10 @@ } if(type === 'add'){ const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await addRisk(data); + for(let i of state.tableData){ + data[i.key] = i.status + } + const res = await addInnerReview(data); if (res.code == 200) { ElMessage.success('保存成功') formRef.value.clearValidate(); @@ -172,7 +179,10 @@ } }else if(type === 'clickEdit'){ const { ...data} = JSON.parse(JSON.stringify(state.formData)) - const res = await editRisk(data); + for(let i of state.tableData){ + data[i.key] = i.status + } + const res = await editInnerReview(data); if (res.code == 200) { ElMessage.success('变更成功') formRef.value.clearValidate(); @@ -190,8 +200,8 @@ } const getSelected = (type,obj)=>{ - state.formData.leader.name = obj.name - state.formData.leaderId = obj.id + state.formData.assessor.name = obj.name + state.formData.assessorId = obj.id } // 图片上传 @@ -210,11 +220,6 @@ }); return false } -}; - -const handlePictureCardPreview = (uploadFile) => { - state.dialogImageUrl = uploadFile.url - state.dialogImg = true }; diff --git a/src/views/safetyReview/projectManage/components/uploadReviewRcd.vue b/src/views/safetyReview/projectManage/components/uploadReviewRcd.vue index ce8a4f0..b6ed5c3 100644 --- a/src/views/safetyReview/projectManage/components/uploadReviewRcd.vue +++ b/src/views/safetyReview/projectManage/components/uploadReviewRcd.vue @@ -4,10 +4,10 @@ <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-upload accept="image/*,.pdf,.doc,.docx" :action="state.uploadUrl" :data="{moduleType: 6,projectId: props.projectId}" :headers="state.header" method="post" :on-success="handleAvatarSuccess" :on-exceed="showTip" v-model:file-list="state.fileList" :before-upload="picSize"> <el-button type="primary">上传评审记录</el-button> <template #tip> - <div class="el-upload__tip">支持上传pdf/word/doc/docx格式文件,尺寸小于2M,最多可上传3张</div> + <div class="el-upload__tip">上传文件尺寸尺寸小于2M</div> </template> </el-upload> </el-form-item> @@ -15,10 +15,11 @@ </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"> + <el-table-column label="原名称" prop="originName" header-align="center" :show-overflow-tooltip="true"/> + <el-table-column label="操作" header-align="center" class-name="small-padding fixed-width" width="120"> <template #default="scope"> - <el-button link type="primary">查看</el-button> + <el-button link type="primary" @click="checkFile(scope.row)">查看</el-button> + <el-button link type="danger" @click="handleRemove(scope.row,[])">删除</el-button> </template> </el-table-column> </el-table> @@ -28,43 +29,25 @@ <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 {delPic} from "@/api/login" +import {delFile, getFiles, getReviewDone} from "@/api/projectManage/siteCheckRcd"; import { getToken } from "@/utils/auth"; import Cookies from "js-cookie" +import axios from 'axios' const emit = defineEmits(["getNextStatus"]); - +const props = defineProps(['projectId']) 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'}] - }, + formData: {}, + rules: {}, tableData: [], - imgLimit: 3, - 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() + }, + fileList: [] }) -const props = { - expandTrigger: 'hover', - value: 'name', - label: 'name' -} + const isAmin = ref(false) const formRef = ref() onMounted(() => { @@ -72,16 +55,12 @@ if(userInfo.identity === 0){ isAmin.value = true; } + getReviewFiles(props.projectId) }) 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) - } + await getReviewFiles } if(type === 'add' || type === 'clickEdit') { const valid = await formRef.value.validate(); @@ -91,28 +70,53 @@ 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 { + const res = await getFiles({projectId: val,moduleType: 6}) + if(res.code == 200){ + if(res.data && res.data.length>0){ + state.tableData = res.data + ElMessage.success('保存成功') + getReviewDone({projectId: val}).then((res)=>{ + if(res.code == 200){ + emit('getNextStatus', val); + }else{ + ElMessage.warning(res.message) + } + }) + }else{ + state.tableData=[] + ElMessage.warning('请上传评审记录附件') + } + }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 { + const res = await getFiles({projectId: val,moduleType: 6}) + if(res.code == 200){ + if(res.data && res.data.length>0){ + state.tableData = res.data + ElMessage.success('变更成功') + }else{ + state.tableData=[] + ElMessage.warning('请上传评审记录附件') + } + }else { ElMessage.warning(res.message) } } } + } +} + +const getReviewFiles = async (id)=>{ + const res = await getFiles({projectId: id ? id : props.projectId,moduleType: 6}) + if(res.code == 200){ + if(res.data && res.data.length>0){ + state.tableData = res.data + }else{ + state.tableData=[] + } + }else { + ElMessage.warning(res.message) } } @@ -125,18 +129,25 @@ } const picSize = async (rawFile) => { - if(rawFile.size / 1024 / 1024 > 2){ + if(rawFile.size / 1024 / 1024 > 5){ ElMessage({ type: 'warning', - message: '文件大小不能超过2M' + message: '文件大小不能超过5M' }); return false } }; -const handleAvatarSuccess = (res, uploadFile) => { +const handlePictureCardPreview = (uploadFile) => { + console.log(uploadFile,'file') + state.imgUrl = uploadFile.url + state.imgDialog = true +}; + + +const handleAvatarSuccess = (res, uploadFile, type) => { if(res.code == 200){ - // state.registerForm.agency.reportPath = res.data.path + getReviewFiles() }else{ ElMessage({ type: 'warning', @@ -146,18 +157,49 @@ } 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 - }) - } + ElMessageBox.confirm( + '确定删除该附件?', + '提示', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + }) + .then( async() => { + const res = await delFile(file.id) + if(res.code == 200){ + ElMessage({ + type: 'success', + message: '文件已删除' + }) + await getReviewFiles() + }else{ + ElMessage({ + type: 'warning', + message: res.message + }) + } + }) + .catch(()=>{ + getReviewFiles() + }) +} + +const checkFile = async (file)=>{ + axios.get(import.meta.env.VITE_APP_BASE_API +'/' + file.path,{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: '文件读取失败' + }); + } + }) } defineExpose({ diff --git a/src/views/safetyReview/projectManage/components/worksDialog.vue b/src/views/safetyReview/projectManage/components/worksDialog.vue new file mode 100644 index 0000000..0ec4dc4 --- /dev/null +++ b/src/views/safetyReview/projectManage/components/worksDialog.vue @@ -0,0 +1,205 @@ +<template> + <div class="notice"> + <el-dialog + v-model="dialogVisible" + :title="title" + width="500px" + :before-close="handleClose" + > + <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-position="top"> + <el-form-item label="评价组成员:" prop="person.name"> + <el-input + v-model="state.form.person.name" + size="large" + placeholder="请选择评价组成员" + @focus="openExperts('评价组成员')" + > + <template #append> + <el-button :icon="Search" @click="openExperts('评价组成员')"/> + </template> + </el-input> + </el-form-item> + <el-form-item label="工作类型:" prop="jobType"> + <el-select v-model="state.form.jobType" placeholder="工作类型" style="width: 100%" size="large"> + <el-option v-for="(item,index) in props.typeList" :key="index" :label="item.label" :value="item.value"/> + </el-select> + </el-form-item> +<!-- <el-form-item label="专业能力:" prop="person.major">--> +<!-- <el-select v-model="state.form.person.majorName" placeholder="专业能力" style="width: 100%" size="large" @change="getCerNo">--> +<!-- <el-option v-for="(item,index) in state.form.person.majorNames" :key="index" :label="item" :value="item"/>--> +<!-- </el-select>--> +<!-- </el-form-item>--> +<!-- <el-form-item label="资格证书:" prop="person.certificateNo">--> +<!-- <el-input--> +<!-- v-model="state.form.person.certificateNo"--> +<!-- size="large"--> +<!-- readonly--> +<!-- />--> +<!-- </el-form-item>--> + <el-form-item label="承担工作:" prop="work"> + <el-select v-model="state.form.work" multiple placeholder="承担工作" style="width: 100%" size="large"> + <el-option v-for="item in props.workList" :key="item.value" :label="item.label" :value="item.value"/> + </el-select> + </el-form-item> + <el-form-item label="承诺后期前往现场勘验:" prop="laterPromise"> + <el-radio-group v-model="state.form.laterPromise" size="large"> + <el-radio :label="1" size="large">是</el-radio> + <el-radio :label="0" size="large">否</el-radio> + </el-radio-group> + </el-form-item> + <el-form-item label="未到现场勘验原因:"> + <el-input v-model="state.form.reason" maxlength="30" show-word-limit type="text" size="large"/> + </el-form-item> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="handleClose" size="default">取 消</el-button> + <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> + </span> + </template> + <experts-list ref="expertsListRef" @getName="getSelected"></experts-list> + </el-dialog> + </div> +</template> +<script setup> +import {defineProps, nextTick, reactive, ref, toRefs} from 'vue' +import {ElMessage} from "element-plus"; +import {Search} from '@element-plus/icons-vue' +import {addWorks, editWorks} from "@/api/projectManage/evaPlan" +import ExpertsList from "./expertsList" + +const dialogVisible = ref(false); +const title = ref(""); +const busRef = ref(); +const expertsListRef = ref() +const props = defineProps(['workList','typeList']) +const emit = defineEmits(["getList"]); +const state = reactive({ + form: { + id: null, + person: { + name: '', + // major: {}, + // certificateNo: '', + // certs: '', + // majorName: '', + // majorNames: [], + // ids: [] + }, + personId: null, + jobType: null, + projectId: null, + informed: 0, + work: [], + laterPromise: 0, + reason: '' + }, + formRules:{ + 'person.name': [{ required: true, message: '请选择评价组成员', trigger: 'change' }], + 'person.major': [{ required: true, message: '请选择专业能力', trigger: 'blur' }], + work: [{ required: true, message: '请选择承担工作', trigger: 'blur' }], + jobType: [{ required: true, message: '请选择工作类型', trigger: 'blur' }] + }, + +}) + +const openDialog = async (type, value,projectId) => { + title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' + state.form.projectId = projectId + if(type == 'add'){ + nextTick(()=>{ + busRef.value.resetFields() + }) + }else if(type === 'edit') { + state.form = JSON.parse(JSON.stringify(value)) + state.form.work = value.work.split(',') + state.form.laterPromise = value.laterPromise?1:0 + } + dialogVisible.value = true; +} + +const openExperts = (type) =>{ + expertsListRef.value.openDialog(type) +} + +const getSelected = (type,obj)=>{ + state.form.person.name = obj.name + state.form.personId = obj.id + // state.form.person.certs = obj.certificateNo + // state.form.person.majorNames = obj.majorNames + // state.form.person.ids = obj.major.split(',') +} + +// const getCerNo = () =>{ +// const i = state.form.person.majorNames.indexOf(state.form.person.majorName) +// const obj = JSON.parse(state.form.person.certs) +// state.form.person.certificateNo = Object.values(obj)[i] +// state.form.person.major[state.form.person.ids[i]] = state.form.person.certificateNo +// } + +const onSubmit = async () => { + const valid = await busRef.value.validate(); + if(valid){ + if(title.value === '新增'){ + const {id,work,...data} = state.form + data['work'] = state.form.work.join(',') + // const {name,major,...rest} = state.form.person + // data.person = { name,major } + // data.person.major = JSON.stringify(state.form.person.major) + const res = await addWorks(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '新增成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + busRef.value.resetFields() + dialogVisible.value = false; + }else if(title.value === '编辑'){ + const {...data} = state.form + data['work'] = state.form.work.join(',') + const res = await editWorks(data) + if(res.code === 200){ + ElMessage({ + type: 'success', + message: '修改成功' + }); + }else{ + ElMessage.warning(res.message) + } + emit("getList") + busRef.value.clearValidate(); + busRef.value.resetFields() + dialogVisible.value = false; + } + } +} + +const handleClose = () => { + busRef.value.clearValidate(); + busRef.value.resetFields() + dialogVisible.value = false; +} + +defineExpose({ + openDialog +}); + +</script> + +<style scoped lang="scss"> +.notice{ + :deep(.el-form .el-form-item__label) { + font-size: 15px; + } + .file { + display: flex; + flex-direction: column; + align-items: flex-start; + } +} +</style> diff --git a/src/views/safetyReview/projectManage/process.vue b/src/views/safetyReview/projectManage/process.vue index 3cba04f..9f2aa33 100644 --- a/src/views/safetyReview/projectManage/process.vue +++ b/src/views/safetyReview/projectManage/process.vue @@ -41,14 +41,14 @@ <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> - <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> + <evaluate-plan ref="evalPlanRef" v-if="selectedObj.id === 4" @getNextStatus="getNextStatus" :projectId="projectId"></evaluate-plan> + <employ-notice-record ref="employNoticeRcdRef" v-if="selectedObj.id === 5" @getNextStatus="getNextStatus" :projectId="projectId"></employ-notice-record> + <site-check-rcd ref="siteCheckRcdRef" v-if="selectedObj.id === 6" @getNextStatus="getNextStatus" :projectId="projectId"></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 === 11" @getNextStatus="getNextStatus"></process-ctrl-review> + <upload-review-rcd ref="uploadReviewRef" v-if="selectedObj.id === 9" @getNextStatus="getNextStatus" :projectId="projectId"></upload-review-rcd> + <rate-conclusion ref="rateConRef" v-if="selectedObj.id === 10" @getNextStatus="getNextStatus" :projectId="projectId"></rate-conclusion> + <process-ctrl-review ref="proCtrlRef" v-if="selectedObj.id === 11" @getNextStatus="getNextStatus" :projectId="projectId"></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> @@ -527,7 +527,7 @@ // }, 100) } -const nextMenu = (id) => { +const nextMenu = (id) => { menuList.value[id].subMenus.forEach( item => { if(item.id === selectedObj.value.id + 1){ chooseSubMenu(item,true); @@ -565,8 +565,7 @@ goRouter(selectedObj.value.id,'clickEdit') } const getNextStatus = async (val) => { - projectId.value = val; - console.log("val",val) + projectId.value = val const res = await getProjectStatus(val); if(res.code == 200){ if(res.data <=4){ @@ -740,21 +739,87 @@ console.log("3") break; case 4: + if(type === 'add'){ + evalPlanRef.value.riskOpen('add',projectId.value); + }else if (type === 'clickEdit'){ + evalPlanRef.value.riskOpen('clickEdit',projectId.value); + }else { + if(projectStatus.value === 'view' || projectStatus.value === 'add'){ + evalPlanRef.value.riskOpen('detail',projectId.value); + }else if(projectStatus.value === 'edit'){ + evalPlanRef.value.riskOpen('edit',projectId.value); + } + } console.log("4") break; case 5: + if(type === 'add'){ + employNoticeRcdRef.value.riskOpen('add',projectId.value); + }else if (type === 'clickEdit'){ + employNoticeRcdRef.value.riskOpen('clickEdit',projectId.value); + }else { + if(projectStatus.value === 'view' || projectStatus.value === 'add'){ + employNoticeRcdRef.value.riskOpen('detail',projectId.value); + }else if(projectStatus.value === 'edit'){ + employNoticeRcdRef.value.riskOpen('edit',projectId.value); + } + } console.log("5") break; case 6: + if(type === 'add'){ + siteCheckRcdRef.value.riskOpen('add',projectId.value); + }else if (type === 'clickEdit'){ + siteCheckRcdRef.value.riskOpen('clickEdit',projectId.value); + }else { + if(projectStatus.value === 'view' || projectStatus.value === 'add'){ + siteCheckRcdRef.value.riskOpen('detail',projectId.value); + }else if(projectStatus.value === 'edit'){ + siteCheckRcdRef.value.riskOpen('edit',projectId.value); + } + } console.log("6") break; case 7: + if(type === 'add'){ + innerReviewRef.value.riskOpen('add',projectId.value); + }else if (type === 'clickEdit'){ + innerReviewRef.value.riskOpen('clickEdit',projectId.value); + }else { + if(projectStatus.value === 'view' || projectStatus.value === 'add'){ + innerReviewRef.value.riskOpen('detail',projectId.value); + }else if(projectStatus.value === 'edit'){ + innerReviewRef.value.riskOpen('edit',projectId.value); + } + } console.log("7") break; case 8: + if(type === 'add'){ + techReviewRef.value.riskOpen('add',projectId.value); + }else if (type === 'clickEdit'){ + techReviewRef.value.riskOpen('clickEdit',projectId.value); + }else { + if(projectStatus.value === 'view' || projectStatus.value === 'add'){ + techReviewRef.value.riskOpen('detail',projectId.value); + }else if(projectStatus.value === 'edit'){ + techReviewRef.value.riskOpen('edit',projectId.value); + } + } console.log("8") break; case 9: + if(type === 'add'){ + uploadReviewRef.value.riskOpen('add',projectId.value); + }else if (type === 'clickEdit'){ + uploadReviewRef.value.riskOpen('clickEdit',projectId.value); + }else { + if(projectStatus.value === 'view' || projectStatus.value === 'add'){ + uploadReviewRef.value.riskOpen('detail',projectId.value); + }else if(projectStatus.value === 'edit'){ + uploadReviewRef.value.riskOpen('edit',projectId.value); + } + } console.log("9") break; case 10: -- Gitblit v1.9.2