对比新文件 |
| | |
| | | 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 |
| | | }) |
| | | } |
对比新文件 |
| | |
| | | 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' |
| | | }) |
| | | } |
对比新文件 |
| | |
| | | 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 |
| | | }) |
| | | } |
对比新文件 |
| | |
| | | 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 |
| | | }) |
| | | } |
对比新文件 |
| | |
| | | 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 |
| | | }) |
| | | } |
对比新文件 |
| | |
| | | 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 |
| | | }) |
| | | } |
对比新文件 |
| | |
| | | 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 |
| | | }) |
| | | } |
| | |
| | | const state = reactive({ |
| | | formData: { |
| | | id: '', |
| | | projectId: null, |
| | | contractSignDate: '', |
| | | contractMoney: '', |
| | | contractIntroduction: '' |
对比新文件 |
| | |
| | | <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> |
| | |
| | | </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-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> |
| | |
| | | </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'}] |
| | | } |
| | | }) |
| | | |
| | |
| | | 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) |
| | | } |
| | |
| | | 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(); |
| | |
| | | } |
| | | } |
| | | |
| | | 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 |
| | | }); |
| | |
| | | v-model="state.formData.auser.name" |
| | | size="large" |
| | | placeholder="请选择机构评价负责人" |
| | | @focus="openExperts('机构评价负责人')" |
| | | > |
| | | <template #append> |
| | | <el-button :icon="Search" @click="openExperts('机构评价负责人')"/> |
| | |
| | | </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"> |
| | |
| | | </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> |
| | |
| | | </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: '' |
| | |
| | | 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'}] |
| | | }, |
| | |
| | | {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) |
| | | } |
| | |
| | | } |
| | | 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(); |
| | |
| | | } |
| | | }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(); |
| | |
| | | } |
| | | } |
| | | |
| | | 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({ |
| | |
| | | v-model="state.formData.leader.name" |
| | | size="large" |
| | | placeholder="请选择项目负责人" |
| | | @focus="openExperts('项目负责人')" |
| | | > |
| | | <template #append> |
| | | <el-button :icon="Search" @click="openExperts('项目负责人')"/> |
| | |
| | | v-model="state.formData.transmitPerson" |
| | | size="large" |
| | | placeholder="请选择任务下达人" |
| | | @focus="openExperts('任务下达人')" |
| | | > |
| | | <template #append> |
| | | <el-button :icon="Search" @click="openExperts('任务下达人')"/> |
| | |
| | | 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"]); |
| | |
| | | const state = reactive({ |
| | | formData: { |
| | | id: '', |
| | | projectId: null, |
| | | leader: { |
| | | name: '' |
| | | }, |
| | | fax: '', |
| | | leaderId: null, |
| | | linkMan: '', |
| | | transmitPerson: '', |
| | |
| | | }) |
| | | |
| | | 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 { |
| | |
| | | } |
| | | 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(); |
| | |
| | | <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="选择日期" |
| | |
| | | <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="请选择内部审核员" |
| | | > |
| | |
| | | </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="选择日期" |
| | |
| | | </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"/> |
| | |
| | | </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 |
| | |
| | | </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> |
| | |
| | | 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" |
| | |
| | | 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() |
| | |
| | | }) |
| | | |
| | | 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) |
| | | } |
| | |
| | | } |
| | | 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(); |
| | |
| | | } |
| | | }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(); |
| | |
| | | } |
| | | |
| | | 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 |
| | | } |
| | | |
| | | // 图片上传 |
| | |
| | | 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; |
| | |
| | | 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('保存成功') |
| | |
| | | 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 |
| | |
| | | }) |
| | | |
| | | const riskOpen = async (type,val) => { |
| | | state.formData.projectId = val |
| | | if(type === 'detail' || type === 'edit' ){ |
| | | const res = await getRiskDetail({projectId: val}); |
| | | if(res.code == 200){ |
| | |
| | | if (res.code == 200) { |
| | | ElMessage.success('保存成功') |
| | | formRef.value.clearValidate(); |
| | | emit('getNextStatus', res.data); |
| | | |
| | | emit('getNextStatus', res.data) |
| | | } else { |
| | | ElMessage.warning(res.message) |
| | | } |
| | |
| | | <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="选择日期" |
| | |
| | | </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" |
| | |
| | | <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: { |
| | |
| | | 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) |
| | |
| | | }); |
| | | |
| | | 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) |
| | | } |
| | |
| | | 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 { |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | 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) |
| | | } |
| | | } |
| | | |
| | |
| | | }; |
| | | |
| | | 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', |
| | |
| | | } |
| | | } |
| | | |
| | | 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({ |
| | |
| | | <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="选择日期" |
| | |
| | | </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('技术负责人')"/> |
| | |
| | | </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="选择日期" |
| | |
| | | </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"/> |
| | |
| | | </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 |
| | |
| | | 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() |
| | |
| | | }) |
| | | |
| | | 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) |
| | | } |
| | |
| | | } |
| | | 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(); |
| | |
| | | } |
| | | }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(); |
| | |
| | | } |
| | | |
| | | 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 |
| | | } |
| | | |
| | | // 图片上传 |
| | |
| | | }); |
| | | return false |
| | | } |
| | | }; |
| | | |
| | | const handlePictureCardPreview = (uploadFile) => { |
| | | state.dialogImageUrl = uploadFile.url |
| | | state.dialogImg = true |
| | | }; |
| | | |
| | | |
| | |
| | | <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> |
| | |
| | | </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> |
| | |
| | | <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(() => { |
| | |
| | | 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(); |
| | |
| | | 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) |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | 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', |
| | |
| | | } |
| | | |
| | | 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({ |
对比新文件 |
| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | // }, 100) |
| | | } |
| | | |
| | | const nextMenu = (id) => { |
| | | const nextMenu = (id) => { |
| | | menuList.value[id].subMenus.forEach( item => { |
| | | if(item.id === selectedObj.value.id + 1){ |
| | | chooseSubMenu(item,true); |
| | |
| | | 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){ |
| | |
| | | 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: |