From 18e2812133add57c3b707f39555321e2a598eea2 Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期四, 18 一月 2024 13:54:50 +0800 Subject: [PATCH] 新增 --- src/views/safetyReview/projectManage/components/employNoticeRecord.vue | 190 +++++++ src/views/safetyReview/projectManage/components/evaluatePlan.vue | 306 ++++++++--- src/views/safetyReview/baseSet/expertsType/index.vue | 2 src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue | 69 -- src/views/safetyReview/projectManage/components/mapLocation.vue | 118 ++++ src/views/safetyReview/userManage/expertUsers/index.vue | 143 ++++ src/views/safetyReview/projectManage/components/siteCheckRcd.vue | 179 ++++++ src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue | 112 +--- src/views/safetyReview/projectManage/process.vue | 19 src/views/safetyReview/projectManage/components/expertsList.vue | 375 ++++++++----- src/views/safetyReview/projectManage/components/riskAnalysis.vue | 17 11 files changed, 1,114 insertions(+), 416 deletions(-) diff --git a/src/views/safetyReview/baseSet/expertsType/index.vue b/src/views/safetyReview/baseSet/expertsType/index.vue index 55ecca9..019b523 100644 --- a/src/views/safetyReview/baseSet/expertsType/index.vue +++ b/src/views/safetyReview/baseSet/expertsType/index.vue @@ -44,7 +44,7 @@ <!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>--> </el-row> - <el-table v-loading="state.loading" :data="state.expertList" :tree-props="{children: 'children', hasChildren: 'hasChildren'}" :border="true"> + <el-table v-loading="state.loading" :data="state.expertList" row-key="id" :border="true"> <el-table-column label="分类名称" align="center" prop="classifyName" /> <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <template #default="scope"> diff --git a/src/views/safetyReview/projectManage/components/employNoticeRecord.vue b/src/views/safetyReview/projectManage/components/employNoticeRecord.vue new file mode 100644 index 0000000..7fa0b69 --- /dev/null +++ b/src/views/safetyReview/projectManage/components/employNoticeRecord.vue @@ -0,0 +1,190 @@ +<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="12"> + <el-form-item prop="timeRange" label="技术服务期限"> + <el-date-picker + v-model="state.formData.timeRange" + style="width: 100%" + type="daterange" + range-separator="至" + start-placeholder="开始日期" + end-placeholder="结束日期" + value-format="YYYY-MM-DD 00:00:00" + size="large" + /> + </el-form-item> + </el-col> + <el-col :span="6"> + <el-form-item prop="investigationPlanDate" label="计划现场勘验时间"> + <el-date-picker + style="width: 100%" + v-model="state.formData.investigationPlanDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </el-form-item> + </el-col> + </el-row> +<!-- <el-row :gutter="30">--> +<!-- <el-col :span="6">--> +<!-- <el-form-item label="附件上传">--> +<!-- <el-upload--> +<!-- accept="image/*"--> +<!-- :action="state.uploadUrl"--> +<!-- :headers="state.header"--> +<!-- method="post"--> +<!-- :on-success="(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> + </el-col> + </el-row> + <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"> + <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> + </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="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> + </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="是否已告知" header-align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-radio-group v-model="scope.row.informed" size="large"> + <el-radio :label="1" size="large">是</el-radio> + <el-radio :label="0" size="large">否</el-radio> + </el-radio-group> + </template> + </el-table-column> + </el-table> + </el-form> + </div> +</template> +<script setup> + +import {defineEmits, onMounted, reactive, ref} from "vue" +import {ElMessage} from "element-plus" +import {Search} from '@element-plus/icons-vue' +import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import Cookies from "js-cookie" +const emit = defineEmits(["getNextStatus"]) + +const state = reactive({ + formData: { + projectId: null, + timeRange: [], + serviceStartDate: '', + serviceEndDate: '', + investigationPlanDate: '' + }, + planPersons: [], + rules: { + timeRange: [{required: true, message: '请选择技术服务期限', trigger: 'blur'}], + investigationPlanDate: [{required: true, message: '请选择计划现场勘验时间', trigger: 'blur'}], + } +}) + +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) => { + console.log("type",type,val) + if(type === 'detail' || type === 'edit' ){ + const res = await getRiskDetail({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]; + }else { + ElMessage.warning(res.message) + } + } + if(type === 'add' || type === 'clickEdit') { + const valid = await formRef.value.validate(); + if(valid){ + if (isAmin.value) { + ElMessage.warning("当前用户暂无权限"); + return; + } + 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); + 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); + 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/components/evaluatePlan.vue b/src/views/safetyReview/projectManage/components/evaluatePlan.vue index 3446e59..13876a2 100644 --- a/src/views/safetyReview/projectManage/components/evaluatePlan.vue +++ b/src/views/safetyReview/projectManage/components/evaluatePlan.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="evalStartDate" label="评价开始时间"> + <el-form-item prop="startDate" label="评价开始时间"> <el-date-picker style="width: 100%" - v-model="state.formData.evalStartDate" + v-model="state.formData.startDate" type="date" value-format="YYYY-MM-DD 00:00:00" placeholder="选择日期" @@ -15,10 +15,10 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item prop="evalEndDate" label="评价结束时间"> + <el-form-item prop="endDate" label="评价结束时间"> <el-date-picker style="width: 100%" - v-model="state.formData.evalEndDate" + v-model="state.formData.endDate" type="date" value-format="YYYY-MM-DD 00:00:00" placeholder="选择日期" @@ -27,9 +27,9 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item prop="deliver" label="机构评价负责人"> + <el-form-item prop="auser.name" label="机构评价负责人"> <el-input - v-model="state.formData.deliver" + v-model="state.formData.auser.name" size="large" placeholder="请选择机构评价负责人" > @@ -39,23 +39,28 @@ </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 :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"> + <div style="display: flex;align-items: center">评价日程安排</div> </el-col> </el-row> - <el-table :data="state.tableData" :border="true" style="margin: 20px 0"> + <el-table :data="state.formData.estimateSchedules" :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="评价日程安排" prop="name" header-align="center" :show-overflow-tooltip="true"/> <el-table-column label="开始时间" header-align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-date-picker @@ -81,6 +86,94 @@ </template> </el-table-column> </el-table> + <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> + </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> + </div> + </el-col> + </el-row> + <el-table :data="state.formData.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"> + <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> + </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="scope.row.laterPromise" size="large"> + <el-radio :label="1" size="large">是</el-radio> + <el-radio :label="0" size="large">否</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.reason" 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-button link type="danger" @click="delMember(scope.$index)">删除</el-button> + </template> + </el-table-column> + </el-table> + <el-row> + <el-col :span="18"> + <div style="display: flex;align-items: center">所需仪器设备</div> + </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> + </div> + </el-col> + </el-row> + <el-table :data="state.formData.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"> + <template #default="scope"> + <el-input v-model="scope.row.deviceName" 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-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" + /> + </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> + </template> + </el-table-column> + </el-table> </el-form> <experts-list ref="expertsListRef" @getName="getSelected"></experts-list> </div> @@ -97,57 +190,85 @@ const state = reactive({ formData: { - project: { - id: '', - + projectId: null, + auser: { + name: '' }, + auserId: null, + estimateSchedules: [ + { + id: 1, + name: '勘验准备', + startDate: '', + endDate: '', + scheduleType: 1 + }, + { + id: 2, + name: '现场勘验', + startDate: '', + endDate: '', + scheduleType: 2 + }, + { + id: 3, + name: '材料分析整理', + startDate: '', + endDate: '', + scheduleType: 3 + }, + { + id: 4, + name: '评价报告编写', + startDate: '', + endDate: '', + scheduleType: 4 + }, + { + id: 5, + name: '整改情况现场确认', + startDate: '', + endDate: '', + scheduleType: 5 + }, + { + id: 6, + name: '整理评价报告', + startDate: '', + endDate: '', + scheduleType: 6 + }, + { + id: 7, + name: '报告审核', + startDate: '', + endDate: '', + scheduleType: 7 + }, + { + id: 8, + name: '报告修改', + startDate: '', + endDate: '', + scheduleType: 8 + }, + ], + planPersons: [], + devices: [], + startDate: '', + endDate: '', id: '' }, rules: { - "project.name": [{required: true, message: '请填写项目名称', trigger: 'blur'}], - riskCharacter: [{required: true, message: '请填写行业风险特性', trigger: 'blur'}], + "auser.name": [{required: true, message: '请填写机构评价负责人', trigger: 'blur'}], + startDate: [{required: true, message: '请选择评价开始时间', trigger: 'blur'}], + endDate: [{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 - }, + workList: [ + {value: '报告编制',label: '报告编制'}, + {value: '文字校对',label: '文字校对'}, + {value: '现场勘验',label: '现场勘验'}, + {value: '资料收集整理',label: '资料收集整理'} ] }) const props = { @@ -173,12 +294,6 @@ 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.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; - state.tableData[3].status = res.data.isFinishReport ? 1 : 0; - state.tableData[4].status = res.data.isAcceptChargess ? 1 : 0; - state.tableData[5].status = res.data.isFeasibility ? 1 : 0; }else { ElMessage.warning(res.message) } @@ -194,12 +309,6 @@ const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) delete data.project.area; delete data.project.id; - 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) { @@ -213,12 +322,6 @@ }else if(type === 'clickEdit'){ const { ...data} = JSON.parse(JSON.stringify(state.formData)) delete data.project.area; - 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 editRisk(data); if (res.code == 200) { @@ -239,11 +342,40 @@ const getSelected = (type,obj)=>{ if(type == '项目负责人'){ - state.formData.project.leader = obj.name + 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) } - if(type == '任务下达人'){ - state.formData.deliver = obj.name +} + +const delMember = (index)=>{ + state.formData.planPersons.splice(index,1) +} + +const addDevice = ()=>{ + let device = { + projectId: null, + deviceName: '', + startDate: '', + endDate: '' } + state.formData.devices.push(device) +} + +const delDevice = (index)=>{ + state.formData.devices.splice(index,1) } defineExpose({ diff --git a/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue b/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue index ce56b11..d468496 100644 --- a/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue +++ b/src/views/safetyReview/projectManage/components/evaluateTaskNotice.vue @@ -3,9 +3,9 @@ <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="project.leader" label="项目负责人"> + <el-form-item prop="leader.name" label="项目负责人"> <el-input - v-model="state.formData.project.leader" + v-model="state.formData.leader.name" size="large" placeholder="请选择项目负责人" > @@ -16,9 +16,9 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item prop="project.contactor" label="联系人"> + <el-form-item prop="linkMan" label="联系人"> <el-input - v-model="state.formData.project.contactor" + v-model="state.formData.linkMan" size="large" placeholder="请选择联系人" > @@ -26,9 +26,9 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item prop="project.phone" label="联系电话"> + <el-form-item prop="linkPhone" label="联系电话"> <el-input - v-model="state.formData.project.phone" + v-model="state.formData.linkPhone" size="large" placeholder="请选择联系电话" > @@ -38,7 +38,7 @@ <el-col :span="6"> <el-form-item label="传真"> <el-input - v-model="state.formData.project.fax" + v-model="state.formData.fax" size="large" placeholder="请选择传真" > @@ -48,9 +48,9 @@ </el-row> <el-row :gutter="30"> <el-col :span="6"> - <el-form-item prop="deliver" label="任务下达人"> + <el-form-item label="任务下达人"> <el-input - v-model="state.formData.deliver" + v-model="state.formData.transmitPerson" size="large" placeholder="请选择任务下达人" > @@ -61,10 +61,10 @@ </el-form-item> </el-col> <el-col :span="6"> - <el-form-item prop="deliverDate" label="任务下达时间"> + <el-form-item prop="transmitDate" label="任务下达时间"> <el-date-picker style="width: 100%" - v-model="state.formData.deliverDate" + v-model="state.formData.transmitDate" type="date" value-format="YYYY-MM-DD 00:00:00" placeholder="选择日期" @@ -90,56 +90,20 @@ const state = reactive({ formData: { id: '', - deliver: '', - deliverDate: '', - project: { - id: '', - leader: '', - contactor: '', - phone: '' - } + leader: { + name: '' + }, + leaderId: null, + linkMan: '', + transmitPerson: '', + transmitDate: '' }, rules: { - "project.leader": [{required: true, message: '请选择项目负责人', trigger: 'blur'}], - "project.contactor": [{required: true, message: '请输入联系人', trigger: 'blur'}], - "project.phone": [{required: true, message: '请输入联系电话', trigger: 'blur'}], - deliverDate: [{required: true, message: '请选择任务下达时间', trigger: 'blur'}] - }, - estimateTypeList: [], - addressList: [], - businessList: [], - 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 - }, - ] + "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'}] + } }) const props = { expandTrigger: 'hover', @@ -157,19 +121,10 @@ }) const riskOpen = async (type,val) => { - console.log("type",type,val) if(type === 'detail' || type === 'edit' ){ const res = await getRiskDetail({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.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; - state.tableData[3].status = res.data.isFinishReport ? 1 : 0; - state.tableData[4].status = res.data.isAcceptChargess ? 1 : 0; - state.tableData[5].status = res.data.isFeasibility ? 1 : 0; }else { ElMessage.warning(res.message) } @@ -183,15 +138,6 @@ } if(type === 'add'){ const {id, ...data} = JSON.parse(JSON.stringify(state.formData)) - delete data.project.area; - delete data.project.id; - 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('保存成功') @@ -203,13 +149,6 @@ } }else if(type === 'clickEdit'){ const { ...data} = JSON.parse(JSON.stringify(state.formData)) - delete data.project.area; - 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; const res = await editRisk(data); if (res.code == 200) { ElMessage.success('变更成功') @@ -229,10 +168,11 @@ const getSelected = (type,obj)=>{ if(type == '项目负责人'){ - state.formData.project.leader = obj.name + state.formData.leader.name = obj.name + state.formData.leaderId = obj.id } if(type == '任务下达人'){ - state.formData.deliver = obj.name + state.formData.transmitPerson = obj.name } } diff --git a/src/views/safetyReview/projectManage/components/expertsList.vue b/src/views/safetyReview/projectManage/components/expertsList.vue index e08a46a..fbe7987 100644 --- a/src/views/safetyReview/projectManage/components/expertsList.vue +++ b/src/views/safetyReview/projectManage/components/expertsList.vue @@ -4,69 +4,146 @@ v-model="dialogVisible" :title="title" width="60%" - :before-close="handleClose" > - <el-form :model="state.queryParams" ref="queryForm" :inline="true" v-show="state.showSearch" label-width="90px"> + <el-form :model="queryParams" :inline="true" label-width="90px"> <el-form-item label="专业类别"> - <el-cascader - clearable - v-model="state.classiFy" - :options="state.expertTypes" - :props="{ expandTrigger: 'hover', value: 'id',label: 'classifyName'}" - @change="handleChange"></el-cascader> + <el-radio-group v-model="queryParams.expertType"> + <el-radio-button label="">全部</el-radio-button> + <el-radio-button label="1">安全评价</el-radio-button> + <el-radio-button label="2">检验检测</el-radio-button> + </el-radio-group> </el-form-item> - <el-form-item label="在岗情况" prop="dutyStatus"> - <el-select v-model="state.queryParams.dutyStatus" placeholder="岗位状态" clearable> - <el-option :key="0" label="在岗" :value="0"/> - <el-option :key="1" label="退休" :value="1"/> - </el-select> - </el-form-item> - <el-form-item label="时间范围" prop="searchTime"> - <el-date-picker - v-model="state.searchTime" - type="daterange" - @change="changeTime" - range-separator="至" - start-placeholder="开始日期" - end-placeholder="结束日期" - value-format="YYYY-MM-DD" + <el-form-item label="姓名"> + <el-input + v-model="queryParams.name" + placeholder="姓名" + style="width: 250px" /> </el-form-item> + <el-form-item label="手机号"> + <el-input + v-model="queryParams.phone" + placeholder="手机号" + style="width: 250px" + /> + </el-form-item> + <el-form-item label="评价师等级"> + <el-select v-model="queryParams.level" style="width: 250px" placeholder="评价师等级" > + <el-option + v-for="item in levelList" + :key="item.id" + :label="item.name" + :value="item.name" + /> + </el-select> + </el-form-item> + <el-form-item label="专业方向"> + <el-select v-model="queryParams.major" value-key="id" style="width: 250px" placeholder="专业方向"> + <el-option + v-for="item in majorList" + :key="item.id" + :label="item.label" + :value="item.id" + /> + </el-select> + </el-form-item> + <el-form-item label="专业方向"> + <el-select v-model="queryParams.post" style="width: 250px" placeholder="请选择职务"> + <el-option + v-for="item in postList" + :key="item.id" + :label="item.name" + :value="item.name" + /> + </el-select> + </el-form-item> <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> - <el-button icon="Refresh" @click="resetQuery">重置</el-button> + <el-button type="primary" icon="Search" @click="search">搜索</el-button> + <el-button icon="Refresh" @click="research">重置</el-button> </el-form-item> </el-form> - <el-table ref="tableRef" v-loading="loading" :data="state.expertList" :border="true" @select="select" @selection-change="handleSelectionChange"> + <el-table v-loading="loading" ref="tableRef" :data="dataList" :border="true" @select="select" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" /> - <el-table-column type="index" width="55" align="center" /> - <el-table-column label="姓名" align="center" prop="name" /> - <el-table-column label="出生日期" align="center" prop="birthday" /> - <el-table-column label="学历" align="center" prop="degree" /> - <el-table-column label="职称" align="center" prop="title"/> - <el-table-column label="专业" align="center" prop="speciality" /> - <el-table-column label="推荐类别组别" align="center"> + <el-table-column label="用户ID" prop="id" align="center" /> + <el-table-column label="姓名" prop="name" align="center" width="110" /> + <el-table-column label="手机号" prop="phone" align="center" width="125" /> + <el-table-column label="用户名" prop="username" align="center" width="110" /> + <el-table-column label="性别" prop="sex" align="center" > <template #default="scope"> - {{findNodeById(state.expertTypes,scope.row.bigClassify)}}/{{findNodeById(state.expertTypes,scope.row.smallClassify)}} + <span v-if="scope.row.sex === 0">男</span> + <span v-if="scope.row.sex === 1">女</span> </template> </el-table-column> - <el-table-column label="联系电话" align="center" prop="phone"/> - <el-table-column label="申请时间" align="center" prop="createTime"> + <el-table-column label="所属机构" prop="agency.name" align="center" width="110" /> + <el-table-column label="社保" prop="socialSecurity" align="center" width="120"> <template #default="scope"> - {{scope.row.createTime?scope.row.createTime.substring(0,10):''}} + <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="medicalInsurance" align="center" width="120"> + <template #default="scope"> + <div class="demo-image__preview" v-if="scope.row.medicalAttach && scope.row.medicalAttach.length>0"> + <el-image + style="width: 100px; height: 100px" + :src="scope.row.medicalAttach[0]" + :zoom-rate="1.2" + :max-scale="7" + :min-scale="0.2" + :preview-src-list="scope.row.medicalAttach" + :initial-index="0" + fit="cover" + preview-teleported="true" + /> + </div> + </template> + </el-table-column> + <el-table-column label="工资清单" prop="salaryList" align="center" width="120"> + <template #default="scope"> + <div class="demo-image__preview" v-if="scope.row.salaryAttach && scope.row.salaryAttach.length>0"> + <el-image + style="width: 100px; height: 100px" + :src= "scope.row.salaryAttach[0]" + :zoom-rate="1.2" + :max-scale="7" + :min-scale="0.2" + :preview-src-list="scope.row.salaryAttach" + :initial-index="0" + fit="cover" + preview-teleported="true" + /> + </div> + </template> + </el-table-column> + <el-table-column label="职务" prop="post" align="center" width="120" /> + <el-table-column label="职称" prop="jobTitle" align="center" /> + <el-table-column label="专业方向" prop="majorNames" align="center" width="100" /> + <el-table-column label="评价师等级" prop="level" align="center" width="100" /> + <el-table-column label="业绩汇总" prop="summary" align="center" /> + <el-table-column label="最近评价时间" prop="lastTime" align="center" width="120" /> </el-table> + <pagination - v-show="state.total > 0" - :total="state.total" - v-model:page="state.queryParams.pageNum" - v-model:limit="state.queryParams.pageSize" + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" @pagination="getList" /> <template #footer> <span class="dialog-footer"> - <el-button @click="handleClose" size="default">取 消</el-button> + <el-button @click="dialogVisible = false" size="default">取 消</el-button> <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button> </span> </template> @@ -74,84 +151,120 @@ </div> </template> <script setup> -import {defineEmits, reactive, ref, toRefs} from 'vue' -import Editor from "@/components/Editor/index.vue"; -import {ElMessage} from "element-plus"; -import {addArea, editArea, getArea} from "@/api/backManage/area"; -import {getExpertsList, getExpertTypes} from "../../../../api/form"; - -const dialogVisible = ref(false) -const title = ref("") -const loading = ref(false) -const tableRef = ref() -const emit = defineEmits([""]); -const state = reactive({ - showSearch: true, - total: 0, - expertTypes: [], - expertList: [], +import {getCurrentInstance, onMounted, reactive, ref, toRefs,defineEmits} from "vue"; +import {getDictList} from "@/api/backManage/evaluate"; +import {ElMessage, ElMessageBox} from "element-plus"; +import Cookies from "js-cookie"; +import {delMonitor, getExpertList, getMonitorList} from "@/api/sysUsers"; +const { proxy } = getCurrentInstance(); +const loading = ref(false); +const emit = defineEmits(['getName']) +const data = reactive({ queryParams: { pageNum: 1, pageSize: 10, - state: 2, - bigClassify: null, - smallClassify: null, - dutyStatus: null, - params: { - startTime: '', - endTime: '' - } + expertType: "", + name: '', + phone: '', + level: '', + major: null, + post: '' }, - classiFy: [], - searchTime: [], + total: 0, + dataList: [], + majorList: [], + levelList: [ + { + id: '1', + name: '一级' + }, + { + id: '2', + name: '二级' + }, + { + id: '3', + name: '三级' + }, + { + id: '4', + name: '其他' + }, + ], + postList: [ + { + id: '1', + name: '法人' + }, + { + id: '2', + name: '过程控制负责人' + }, + { + id: '3', + name: '机构负责人' + }, + { + id: '4', + name: '技术负责人' + }, + { + id: '5', + name: '员工' + }, + ], + dialogVisible: false, + title: '', selected: [] }) +const tableRef = ref() +const { queryParams, total, dataList, majorList, levelList, postList, dialogVisible,title,selected } = toRefs(data); const openDialog = (type) => { - resetQuery() - getTypes() - state.selected = [] - title.value = type - dialogVisible.value = true + getMajor() + research() + data.selected = [] + data.title = type + data.dialogVisible = true } const onSubmit = async () => { - if(state.selected.length>0) - emit('getName',title.value,state.selected[state.selected.length - 1]) - dialogVisible.value = false -} - -const handleQuery=()=> { - state.queryParams.pageNum = 1 - if(state.classiFy && state.classiFy.length>0){ - state.queryParams.bigClassify = state.classiFy[0] - state.queryParams.smallClassify = state.classiFy[1] - } - if(state.searchTime && state.searchTime.length>0){ - state.queryParams.params.startTime = state.searchTime[0] - state.queryParams.params.endTime = state.searchTime[1] - } - getList() + if(data.selected.length>0) + emit('getName',data.title,data.selected[data.selected.length - 1]) + data.dialogVisible = false } const getList = async () => { - loading.value = true; - const res = await getExpertsList(state.queryParams) + loading.value = true + const res = await getExpertList(data.queryParams) if(res.code == 200){ - state.expertList = res.data.list - state.total = res.data.total + data.dataList = res.data.list.map(item => { + return{ + ...item, + socialAttach: item.socialAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}), + medicalAttach: item.medicalAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}), + salaryAttach: item.salaryAttach.map(s => { return import.meta.env.VITE_APP_BASE_API + '/' + s.path}) + } + }) + console.log('RES',data.dataList) + data.total = res.data.total }else{ - ElMessage.warning(res.msg) + ElMessage.warning(res.message) } - loading.value = false; + loading.value = false } -const getTypes = async()=> { - const res = await getExpertTypes() - if(res.code == 200){ - state.expertTypes = res.data +const getMajor = async () => { + const queryParams = { + pageNum: 1, + pageSize: 50, + dictType: 'sys_major_orientation' + } + const res = await getDictList(queryParams); + if(res.code === 200){ + data.majorList = res.data.list }else{ - ElMessage.warning(res.msg) + ElMessage.warning(res.message) } } @@ -164,58 +277,26 @@ }) const handleSelectionChange = (val) => { - state.selected = val + data.selected = val } -const resetQuery=()=> { - state.queryParams = { +const search = ()=>{ + data.queryParams.pageNum = 1 + getList() +} + +const research = ()=>{ + data.queryParams = { pageNum: 1, pageSize: 10, - state: 2, - bigClassify: null, - smallClassify: null, - dutyStatus: null, - params: { - startTime: '', - endTime: '' - } - }; - state.classiFy = [] - state.searchTime = [] - handleQuery() -} - -const handleChange=(value)=> { - if(!value){ - data.classiFy = [] - data.queryParams.bigClassify = "" - data.queryParams.smallClassify = "" + expertType: "", + name: '', + phone: '', + level: '', + major: null, + post: '' } -} -const changeTime=(value)=>{ - if(!value){ - data.queryParams.params.endTime = "" - data.queryParams.params.startTime = "" - } -} - -const findNodeById = (data,value)=> { - for (const node of data) { - if (node.id === value) { - return node.classifyName; - } - if (node.children) { - const foundNode = findNodeById(node.children, value); - if (foundNode) { - return foundNode; - } - } - } - return null; -} - -const handleClose = () => { - dialogVisible.value = false; + getList() } defineExpose({ diff --git a/src/views/safetyReview/projectManage/components/mapLocation.vue b/src/views/safetyReview/projectManage/components/mapLocation.vue new file mode 100644 index 0000000..27b8fd2 --- /dev/null +++ b/src/views/safetyReview/projectManage/components/mapLocation.vue @@ -0,0 +1,118 @@ +<template> + <el-dialog + v-model="state.mapLocationVisible" + append-to-body + :close-on-click-modal="false" + width="75%" + :title="state.title" + > + <div class="mapLocation_head"> + <div> + <el-alert + title="点击地点获取经纬度信息" + type="info" + :closable="false" + > + </el-alert> + </div> + <div class="mapLocation_latlng"> + <span>经度:</span> + <el-input class="mapLocation_latlng_input" id="lng" v-model="state.longitude"></el-input> + </div> + <div class="mapLocation_latlng"> + <span>纬度:</span> + <el-input class="mapLocation_latlng_input" id="lat" v-model="state.latitude"></el-input> + </div> + </div> + <div class="mapLocation_body"> + <baidu-map class="map" ak="BkZdiHBj9aGrMdVFM48r2njNiMzsekga" v="3.0" type="API" :center="state.center" :zoom="15" scroll-wheel-zoom @ready="initMap" @click="getPosition"> + <bm-marker :position="{lng: state.longitude, lat: state.latitude}" :dragging="true" animation="BMAP_ANIMATION_BOUNCE"> + <bm-label content="选择地点" :labelStyle="{color: 'red', fontSize : '24px'}" :offset="{width: -35, height: 30}"/> + </bm-marker> + </baidu-map> + </div> + <div align="right" style="margin-top: 10px"> + <el-button @click="state.mapLocationVisible = false">取消</el-button> + <el-button type="primary" @click="submitLatLng()">确认</el-button> + </div> + </el-dialog> +</template> + +<script setup> +import {ref, onMounted, reactive, toRefs, defineComponent,defineExpose,defineEmits} from 'vue'; +import { BaiduMap,BmMarker } from 'vue-baidu-map-3x' +const state = reactive({ + title: '', + longitude: '', + latitude: '', + mapLocationVisible: false, + center: { + lng: '116.404', + lat: '39.915' + } +}) + +const emit = defineEmits(['giveLatLng']) + +onMounted(() => { + // ...(mounted钩子中的代码不变) +}); +const map = reactive({}) + +const getPosition = ({type, target, point, pixel, overlay})=>{ + state.longitude = point.lng + state.latitude = point.lat +} + +const openMapLocation=(longitude,latitude)=>{ + state.longitude = longitude + state.latitude = latitude + state.mapLocationVisible = true +} + +const submitLatLng=()=>{ + state.mapLocationVisible = false + emit('giveLatLng',state.longitude,state.latitude); +} + +const initMap=()=>{ + +} + +defineExpose({ + openMapLocation +}) +</script> + +<style lang="scss" scoped> +.map { + width: 100%; + height: 500px; + + :deep(.BMap_cpyCtrl){ + display: none!important; + visibility: hidden!important; + } + + :deep(.anchorBL) { + display: none!important; + visibility: hidden!important; + } +} +.mapLocation_head{ + width:100%; + height:100px; +} +.mapLocation_body{ + width:100%; + height:500px +} +.mapLocation_latlng{ + padding-top:10px; + display:inline-block; + margin-right: 20px; +} +.mapLocation_latlng_input{ + width:250px; +} +</style> diff --git a/src/views/safetyReview/projectManage/components/riskAnalysis.vue b/src/views/safetyReview/projectManage/components/riskAnalysis.vue index cc167a3..ac08f96 100644 --- a/src/views/safetyReview/projectManage/components/riskAnalysis.vue +++ b/src/views/safetyReview/projectManage/components/riskAnalysis.vue @@ -195,7 +195,7 @@ size="large" maxlength="30" show-word-limit - placeholder="请输入风险评估人意见" + placeholder="风险评估人意见" > </el-input> </el-form-item> @@ -207,7 +207,7 @@ show-word-limit v-model="state.formData.agencyOpinon" size="large" - placeholder="请输入机构评价负责人意见" + placeholder="机构评价负责人意见" > </el-input> </el-form-item> @@ -408,13 +408,12 @@ data.id = val; data.project.id = val; delete data.project.area; - 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) + 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 const res = await editRisk(data); if (res.code == 200) { ElMessage.success('变更成功') diff --git a/src/views/safetyReview/projectManage/components/siteCheckRcd.vue b/src/views/safetyReview/projectManage/components/siteCheckRcd.vue new file mode 100644 index 0000000..1c0da84 --- /dev/null +++ b/src/views/safetyReview/projectManage/components/siteCheckRcd.vue @@ -0,0 +1,179 @@ +<template> + <div class="riskBox"> + <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top"> + <el-row :gutter="30"> + <el-col :span="6"> + <el-form-item prop="investigationDate" label="现场勘验时间"> + <el-date-picker + style="width: 100%" + v-model="state.formData.investigationPlanDate" + type="date" + value-format="YYYY-MM-DD 00:00:00" + placeholder="选择日期" + size="large" + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item prop="investigationDate" label="现场勘验位置"> + <el-input + v-model="state.formData.location" + size="large" + placeholder="请填写现场勘验位置" + > + <template #append> + <el-button :icon="Search" @click="openLocation"/> + </template> + </el-input> + </el-form-item> + </el-col> + <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-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="(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-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-form> + <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 {Search} from '@element-plus/icons-vue' +import {addRisk, editRisk, getRiskDetail} from "@/api/projectManage/riskAnalysis" +import Cookies from "js-cookie" +const emit = defineEmits(["getNextStatus"]) +import MapLocation from "./mapLocation.vue" + +const state = reactive({ + formData: { + id: null, + projectId: null, + investigationDate: '', + location: '', + isSafetyCheck: null, + recordData: '' + }, + planPersons: [], + rules: { + recordData: [{required: true, message: '请填写现场勘验记录', trigger: 'blur'}] + } +}) + +const isAmin = ref(false) +const formRef = ref() +const mapLocationRef = ref() +onMounted(() => { + const userInfo = JSON.parse(Cookies.get('userInfo')) + if(userInfo.identity === 0){ + isAmin.value = true; + } +}); + +const riskOpen = async (type,val) => { + console.log("type",type,val) + if(type === 'detail' || type === 'edit' ){ + const res = await getRiskDetail({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]; + }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 {projectId, ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await addRisk(data); + if (res.code == 200) { + ElMessage.success('保存成功') + formRef.value.clearValidate(); + emit('getNextStatus', res.data); + + } else { + ElMessage.warning(res.message) + } + }else if(type === 'clickEdit'){ + const { ...data} = JSON.parse(JSON.stringify(state.formData)) + const res = await editRisk(data); + if (res.code == 200) { + ElMessage.success('变更成功') + formRef.value.clearValidate(); + // emit('getNextStatus', data.project.id); + } else { + ElMessage.warning(res.message) + } + } + } + } +} + +const openLocation = ()=>{ + mapLocationRef.value.openMapLocation(state.formData.location.split(',')[0],state.formData.location.split(',')[1]) +} + +const achieveLatLng=(lng,lat)=>{ + state.formData.location = lng + ',' + lat +} + +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 e40806e..970b2a2 100644 --- a/src/views/safetyReview/projectManage/process.vue +++ b/src/views/safetyReview/projectManage/process.vue @@ -38,10 +38,12 @@ <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 === 1" @getNextStatus="getNextStatus"></rickAnalysis> + <rickAnalysis ref="riskRef" v-if="selectedObj.id === 2" @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> </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> @@ -53,7 +55,7 @@ </el-card> </div> <div class="bottom"> - <el-button type="primary" v-if="selectedObj.id === 1" plain @click="downloadFile"> + <el-button type="primary" v-if="selectedObj.id === 3" plain @click="downloadFile"> 评价任务通知书<el-icon class="el-icon--right"><Download /></el-icon> </el-button> </div> @@ -74,10 +76,12 @@ import status2Png from "@/assets/images/status2.png" import itemStatus2Png from "@/assets/images/itemStatus2.png" import { useRoute } from 'vue-router' -import {getProjectStatus} from "@/api/projectManage/project"; +import {getProjectStatus} from "@/api/projectManage/project" import ContractManage from "./components/contractManage"; -import EvaluateTaskNotice from "./components/evaluateTaskNotice"; +import EvaluateTaskNotice from "./components/evaluateTaskNotice" import EvaluatePlan from "./components/evaluatePlan"; +import EmployNoticeRecord from "./components/employNoticeRecord" +import SiteCheckRcd from "./components/siteCheckRcd" const route = useRoute() const menuList = ref([ @@ -161,8 +165,7 @@ id: 11, name: '过程控制负责人审核', status: 0 - }, - + } ] }, { @@ -191,6 +194,9 @@ const riskRef = ref(); const contractMngRef = ref() const evaluteRef = ref() +const evalPlanRef = ref() +const employNoticeRcdRef = ref() +const siteCheckRcdRef = ref() const isShowMenu = ref(false); const selectedObj = ref({}) const middleHeight = ref(0); @@ -511,7 +517,6 @@ } const clickEdit = () => { - goRouter(selectedObj.value.id,'clickEdit') } const getNextStatus = async (val) => { diff --git a/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue b/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue index 7ef55dd..4ba643a 100644 --- a/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue +++ b/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue @@ -54,7 +54,7 @@ <!-- <el-input v-model.trim="state.form.post" :maxlength="11" ></el-input>--> <el-select v-model="state.form.post" class="m-2" style="width: 100%" placeholder="请选择职务" popper-class="more_select_dropdown" > <el-option - v-for="item in state.postList" + v-for="item in props.postList" :key="item.id" :label="item.name" :value="item.name" @@ -73,7 +73,7 @@ <el-form-item label="专业方向:" prop="majorShow" v-if="state.title !== '修改密码'" > <el-select v-model="state.form.majorShow" value-key="id" class="m-2" style="width: 100%" multiple placeholder="请选择专业方向" popper-class="more_select_dropdown" @change="selectChange"> <el-option - v-for="item in state.majorList" + v-for="item in props.majorList" :key="item.id" :label="item.label" :value="item" @@ -112,7 +112,7 @@ <el-form-item label="评价师等级:" prop="level" v-if="state.title !== '修改密码'"> <el-select v-model="state.form.level" class="m-2" style="width: 100%" placeholder="请选择评价师等级" popper-class="more_select_dropdown" > <el-option - v-for="item in state.levelList" + v-for="item in props.levelList" :key="item.id" :label="item.name" :value="item.name" @@ -196,7 +196,7 @@ </div> </template> <script setup> -import {reactive, ref, toRefs, defineEmits, onMounted, nextTick} from 'vue' +import {reactive, ref, toRefs, defineEmits, defineProps, onMounted, nextTick} from 'vue' import { View } from "@element-plus/icons-vue"; import {ElMessage} from "element-plus"; import {verifyPhone, verifyPwd, verifyUsername} from "../../../../../utils/validate"; @@ -207,9 +207,8 @@ import {resetUserPwd} from "../../../../../api/sysUsers"; import {getToken} from "@/utils/auth"; import {getInsitutionList} from "@/api/backManage/insitution"; -import {getDictList} from "@/api/backManage/evaluate"; - const emit = defineEmits(["getList"]); +const props = defineProps(['majorList','levelList','postList']) const dialogVisible = ref(false) const superRef = ref(null) @@ -339,53 +338,11 @@ dialogImageUrl: '', dialogImg: false, pageNum: 1, - pageSize: 10, - postList: [ - { - id: '1', - name: '法人' - }, - { - id: '2', - name: '过程控制负责人' - }, - { - id: '3', - name: '机构负责人' - }, - { - id: '4', - name: '技术负责人' - }, - { - id: '5', - name: '员工' - }, - ], - majorList: [], - levelList: [ - { - id: '1', - name: '一级' - }, - { - id: '2', - name: '二级' - }, - { - id: '3', - name: '三级' - }, - { - id: '4', - name: '其他' - }, - ] + pageSize: 10 }) onMounted(()=>{ getAgency() - getMajor() }) const openDialog = async (type, value) => { @@ -669,20 +626,6 @@ ElMessage.warning(res.message) } } -const getMajor = async () => { - const queryParams = { - pageNum: 1, - pageSize: 50, - dictType: 'sys_major_orientation' - } - const res = await getDictList(queryParams); - if(res.code === 200){ - state.majorList = res.data.list - }else{ - ElMessage.warning(res.message) - } -} - //触底函数 diff --git a/src/views/safetyReview/userManage/expertUsers/index.vue b/src/views/safetyReview/userManage/expertUsers/index.vue index ab11d71..96d9db1 100644 --- a/src/views/safetyReview/userManage/expertUsers/index.vue +++ b/src/views/safetyReview/userManage/expertUsers/index.vue @@ -8,12 +8,50 @@ @click="openDialog('add',{})" >新增</el-button> </div> - <div style="margin-top: 15px;margin-bottom: 15px;"> - <el-radio-group v-model="queryParams.expertType" @change="changeType"> + <div style="margin-top: 15px;margin-bottom: 15px"> + <el-radio-group v-model="queryParams.expertType"> <el-radio-button label="">全部</el-radio-button> <el-radio-button label="1">安全评价</el-radio-button> <el-radio-button label="2">检验检测</el-radio-button> </el-radio-group> + </div> + <div style="margin-bottom: 15px; display: flex;align-items: center"> + <el-input + v-model="queryParams.name" + placeholder="姓名" + style="width: 220px;margin-right: 12px" + /> + <el-input + v-model="queryParams.phone" + placeholder="手机号" + style="width: 220px;margin-right: 12px" + /> + <el-select v-model="queryParams.level" style="width: 220px;margin-right: 12px" placeholder="评价师等级" > + <el-option + v-for="item in levelList" + :key="item.id" + :label="item.name" + :value="item.name" + /> + </el-select> + <el-select v-model="queryParams.major" value-key="id" style="width: 220px;margin-right: 12px" placeholder="专业方向"> + <el-option + v-for="item in majorList" + :key="item.id" + :label="item.label" + :value="item.id" + /> + </el-select> + <el-select v-model="queryParams.post" style="width: 220px;margin-right: 12px" placeholder="请选择职务"> + <el-option + v-for="item in postList" + :key="item.id" + :label="item.name" + :value="item.name" + /> + </el-select> + <el-button type="primary" icon="Filter" @click="search">查询</el-button> + <el-button type="primary" icon="Filter" @click="research">重置</el-button> </div> <!-- 表格数据 --> @@ -102,13 +140,14 @@ v-model:limit="queryParams.pageSize" @pagination="getList" /> - <expert-dialog ref="expertRef" @getList="getList"></expert-dialog> + <expert-dialog ref="expertRef" @getList="getList" :majorList="majorList" :levelList="levelList" :postList="postList"></expert-dialog> </div> </template> <script setup> import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue"; import expertDialog from "./components/expertDialog.vue" +import {getDictList} from "@/api/backManage/evaluate"; import {ElMessage, ElMessageBox} from "element-plus"; import Cookies from "js-cookie"; import {delMonitor, getExpertList, getMonitorList} from "@/api/sysUsers"; @@ -117,19 +156,64 @@ const expertRef = ref(); const data = reactive({ queryParams: { - pageNum: 1, - pageSize: 10, - expertType: "" + pageNum: 1, + pageSize: 10, + expertType: "", + name: '', + phone: '', + level: '', + major: null, + post: '' }, total: 0, - dataList: [] - - + dataList: [], + majorList: [], + levelList: [ + { + id: '1', + name: '一级' + }, + { + id: '2', + name: '二级' + }, + { + id: '3', + name: '三级' + }, + { + id: '4', + name: '其他' + }, + ], + postList: [ + { + id: '1', + name: '法人' + }, + { + id: '2', + name: '过程控制负责人' + }, + { + id: '3', + name: '机构负责人' + }, + { + id: '4', + name: '技术负责人' + }, + { + id: '5', + name: '员工' + }, + ] }); -const { queryParams, total, dataList } = toRefs(data); +const { queryParams, total, dataList, majorList, levelList, postList } = toRefs(data); onMounted(()=>{ getList() + getMajor() }) const getList = async () => { loading.value = true @@ -151,14 +235,41 @@ loading.value = false } +const getMajor = async () => { + const queryParams = { + pageNum: 1, + pageSize: 50, + dictType: 'sys_major_orientation' + } + const res = await getDictList(queryParams); + if(res.code === 200){ + data.majorList = res.data.list + }else{ + ElMessage.warning(res.message) + } +} + +const search = ()=>{ + data.queryParams.pageNum = 1 + getList() +} + +const research = ()=>{ + data.queryParams = { + pageNum: 1, + pageSize: 10, + expertType: "", + name: '', + phone: '', + level: '', + major: null, + post: '' + } + getList() +} + const openDialog = (type, value) => { expertRef.value.openDialog(type, value); -} -const changeType = (val) => { - console.log("val", val) - queryParams.expertType = val; - queryParams.pageNum = 1; - getList(); } /** 重置新增的表单以及其他数据 */ -- Gitblit v1.9.2