From cc3e08bda13360c88b7189e8f8d043b60783c7fb Mon Sep 17 00:00:00 2001 From: 马宇豪 <978517621@qq.com> Date: 星期四, 21 十一月 2024 16:46:32 +0800 Subject: [PATCH] 新增 --- src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue | 348 +++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 224 insertions(+), 124 deletions(-) diff --git a/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue b/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue index 5e88339..59cf27e 100644 --- a/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue +++ b/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue @@ -12,29 +12,29 @@ <el-form :model="state.form" :rules="state.rules" ref="ruleFormRef" label-width="200px"> <el-row> <el-col :span="20"> - <el-form-item label="专业类别" prop="profession"> + <el-form-item label="专业类别" prop="domain"> <el-cascader :disabled="state.disable" style="width: 100%" - v-model="state.form.profession" + v-model="state.form.domain" :options="state.expertsType" - :props="{ expandTrigger: 'hover',value: 'id',label: 'classifyName' }" + :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false }" @change="professionChange"></el-cascader> </el-form-item> </el-col> </el-row> - <!-- <el-row>--> - <!-- <el-col :span="20">--> - <!-- <el-form-item label="填报日期" prop="date">--> - <!-- <el-date-picker--> - <!-- style="width: 100%"--> - <!-- v-model="form.date"--> - <!-- type="date"--> - <!-- placeholder="选择日期">--> - <!-- </el-date-picker>--> - <!-- </el-form-item>--> - <!-- </el-col>--> - <!-- </el-row>--> + <el-row> + <el-col :span="20"> + <el-form-item label="业务处室:" prop="deptId"> + <el-cascader + style="width: 100%" + clearable + v-model="state.form.deptId" + :options="state.deptList" + :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',emitPath: false}"></el-cascader> + </el-form-item> + </el-col> + </el-row> <el-row> <el-col :span="20"> <el-form-item label="姓名" prop="name"> @@ -58,7 +58,7 @@ <el-date-picker style="width: 100%" v-model="state.form.birthday" - value-format="YYYY-MM-DD 00:00:00" + value-format="YYYY-MM-DD" type="date" placeholder="选择日期" :disabled="state.disable"> </el-date-picker> @@ -310,7 +310,39 @@ </el-row> </el-form> <el-dialog v-model="imgDialog"> - <img w-full :src="state.dialogImageUrl" alt=""> + <img style="width: 100%" w-full :src="state.dialogImageUrl" alt=""> + </el-dialog> + <el-dialog + v-model="state.assessDialog" + title="评定详情" + width="50%" + :before-close="closeAssess" + > + <el-form :model="state.assessForm" :rules="state.assessRules" ref="assessFormRef" label-width="200px"> + <el-form-item label="专家聘用期限" prop="employTime"> + <el-date-picker + v-model="state.assessForm.employTime" + type="daterange" + range-separator="至" + start-placeholder="开始日期" + end-placeholder="结束日期" + value-format="YYYY-MM-DD" + /> + </el-form-item> + <el-form-item label="专家评定等级" prop="ratingLevel"> + <el-radio-group v-model="state.assessForm.ratingLevel"> + <el-radio label="1">一级</el-radio> + <el-radio label="2">二级</el-radio> + <el-radio label="3">三级</el-radio> + </el-radio-group> + </el-form-item> + </el-form> + <template #footer> + <span class="dialog-footer"> + <el-button @click="closeAssess" size="default">取 消</el-button> + <el-button type="primary" @click="assessSubmit(assessFormRef)" size="default" v-preReClick>确认</el-button> + </span> + </template> </el-dialog> </div> <template #footer> @@ -319,25 +351,29 @@ <el-button type="primary" @click="onSubmit(ruleFormRef)" size="default" v-preReClick>确认</el-button> </span> <span class="dialog-footer" v-if="state.title == '评定'"> - <el-button type="danger" size="default" @click="assess(3)" v-preReClick>评定驳回</el-button> - <el-button type="primary" @click="assess(2)" size="default" v-preReClick>评定通过</el-button> + <el-button type="danger" size="default" @click="startAssess(3)" v-preReClick>评定驳回</el-button> + <el-button type="primary" @click="startAssess(2)" size="default" v-preReClick>评定通过</el-button> </span> </template> </el-dialog> + </div> </template> <script setup> -import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue' +import {reactive, ref, toRefs, defineEmits, nextTick, onMounted, getCurrentInstance} from 'vue' import {ElMessage, ElMessageBox} from "element-plus" import {verifyPhone, verifyIdCard} from "../../../../../utils/validate" import {addExpertInfo, getExpertTypes, getInfo, modExpertInfo, uploadFile, changeApprove} from "@/api/form" import {delPic} from "@/api/login" import { getToken } from "@/utils/auth" import {Base64} from "js-base64" +import {listOutDept} from "@/api/system/dept"; const emit = defineEmits(["getList"]) const dialogVisible = ref(false) const imgDialog = ref(false) const ruleFormRef = ref() +const assessFormRef = ref() +const { proxy } = getCurrentInstance() var validatePass = (rule, value, callback) => { if (state.fileList.length == 0) { callback(new Error('请上传证件照')); @@ -369,13 +405,13 @@ } const state = reactive({ + assessDialog: false, form:{ id: null, name:'', sex:'', - profession: [], - bigClassify:null, - smallClassify: null, + domain: '', + deptId: null, birthday: '', phone:'', title: '', @@ -405,9 +441,14 @@ remark: '', source: 2 }, + assessForm: { + employTime: [], + ratingLevel: '' + }, hasDeleteFile: false, disable: false, expertsType: [], + deptList: [], directionList: [ { value: 1, @@ -430,7 +471,7 @@ label: '其他' } ], - uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile', + uploadUrl: import.meta.env.VITE_APP_BASE_API + '/common/upload', header: { Authorization: 'Bearer ' + getToken() }, @@ -445,7 +486,8 @@ rules:{ name:[{ required: true, message: '请填写姓名', trigger: 'blur' }], sex:[{ required: true, message: '请选择性别', trigger: 'blur' }], - profession: [{ required: true, message: '请选择专业类别', trigger: 'blur' }], + domain: [{ required: true, message: '请选择专业类别', trigger: 'blur' }], + deptId: [{ required: true, message: '请选择业务处室', trigger: 'blur' }], birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }], phone:[{ required: true, validator: validatePhone, trigger: 'blur' }], title: [{ required: true, message: '请填写职称', trigger: 'blur' }], @@ -454,6 +496,10 @@ dutyStatus: [{ required: true, message: '请选择在岗情况', trigger: 'blur' }], companyName: [{ required: true, message: '请填写单位全称', trigger: 'blur' }], degree: [{ required: true, message: '请填写最高学历', trigger: 'blur' }] + }, + assessRules:{ + employTime: [{ required: true, message: '请选择聘用期限', trigger: 'blur' }], + ratingLevel: [{ required: true, message: '请选择评定等级', trigger: 'blur' }] } }) @@ -463,98 +509,113 @@ const openDialog = (type, value) => { state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='view' ?'查看':'评定' getExpertsType() - if(type == 'edit'||type=='view'||type=='assess'){ - getInfo(value.id).then((res)=>{ - if(res.code == 200){ - if(res.data) { - const val = res.data - for(let i in state.form) { - if (validKey(i, val)) { - state.form[i] = val[i] - } - } - state.form.profession[0] = val.bigClassify - state.form.profession[1] = val.smallClassify - if(val.supportDirectionSafety){ - state.form.supportDirectionSafety = val.supportDirectionSafety.split(',').map(i=>Number(i)) - } - if(val.supportDirectionPrevention){ - state.form.supportDirectionPrevention = val.supportDirectionPrevention.split(',').map(i=>Number(i)) - } - if(val.supportDirectionEmergency){ - state.form.supportDirectionEmergency = val.supportDirectionEmergency.split(',').map(i=>Number(i)) - } - state.fileList.push({ - name: state.form.electronicPhoto, - url: import.meta.env.VITE_APP_BASE_API + '/' + state.form.electronicPhoto, - }) - if(state.form.resumeKey !== ''){ - state.resumeList = state.form.resumeKey.split(',').map(i=>{ - return { - name: i, - url: import.meta.env.VITE_APP_BASE_API + '/' + i, - } - }) - } - if(state.form.paperSituationKey !== ''){ - state.inventionList = state.form.paperSituationKey.split(',').map(i=>{ - return { - name: i, - url: import.meta.env.VITE_APP_BASE_API + '/' + i, - } - }) - } - if(state.form.rewardKey !== ''){ - state.rewardList = state.form.rewardKey.split(',').map(i=>{ - return { - name: i, - url: import.meta.env.VITE_APP_BASE_API + '/' + i, - } - }) - } - if(state.form.achievementKey !== ''){ - state.achievementList = state.form.achievementKey.split(',').map(i=>{ - return { - name: i, - url: import.meta.env.VITE_APP_BASE_API + '/' + i, - } - }) - } - if(state.form.personalOpinionKey !== ''){ - state.proAdviceList = state.form.personalOpinionKey.split(',').map(i=>{ - return { - name: i, - url: import.meta.env.VITE_APP_BASE_API + '/' + i, - } - }) - } - if(state.form.recommendUnitOpinionKey !== ''){ - state.adviceList = state.form.recommendUnitOpinionKey.split(',').map(i=>{ - return { - name: i, - url: import.meta.env.VITE_APP_BASE_API + '/' + i, - } - }) + getDepList() + state.fileList = [] + if(type == 'edit'||type=='view'||type=='assess'){ + getInfo(value.id).then((res)=>{ + if(res.code == 200){ + if(res.data) { + const val = res.data + for(let i in state.form) { + if (validKey(i, val)) { + state.form[i] = val[i] } } - dialogVisible.value = true - }else{ - ElMessage.warning('数据获取失败:'+res.message) + if(val.supportDirectionSafety && val.supportDirectionSafety!==''){ + state.form.supportDirectionSafety = val.supportDirectionSafety.split(',').map(i=>Number(i)) + }else{ + state.form.supportDirectionSafety = [] + } + if(val.supportDirectionPrevention && val.supportDirectionPrevention!==''){ + state.form.supportDirectionPrevention = val.supportDirectionPrevention.split(',').map(i=>Number(i)) + }else{ + state.form.supportDirectionPrevention = [] + } + if(val.supportDirectionEmergency && val.supportDirectionEmergency!==''){ + state.form.supportDirectionEmergency = val.supportDirectionEmergency.split(',').map(i=>Number(i)) + }else{ + state.form.supportDirectionEmergency = [] + } + state.fileList.push({ + name: state.form.electronicPhoto, + url: state.form.electronicPhoto, + }) + if(state.form.resumeKey !== ''){ + state.resumeList = state.form.resumeKey.split(',').map(i=>{ + return { + name: i, + url: i, + } + }) + } + if(state.form.paperSituationKey !== ''){ + state.inventionList = state.form.paperSituationKey.split(',').map(i=>{ + return { + name: i, + url: i, + } + }) + } + if(state.form.rewardKey !== ''){ + state.rewardList = state.form.rewardKey.split(',').map(i=>{ + return { + name: i, + url: i, + } + }) + } + if(state.form.achievementKey !== ''){ + state.achievementList = state.form.achievementKey.split(',').map(i=>{ + return { + name: i, + url: i, + } + }) + } + if(state.form.personalOpinionKey !== ''){ + state.proAdviceList = state.form.personalOpinionKey.split(',').map(i=>{ + return { + name: i, + url: i, + } + }) + } + if(state.form.recommendUnitOpinionKey !== ''){ + state.adviceList = state.form.recommendUnitOpinionKey.split(',').map(i=>{ + return { + name: i, + url: i, + } + }) + } } - }) - if(type == 'edit'){ - state.disable = false + console.log(state.form,'form') + dialogVisible.value = true }else{ - state.disable = true + ElMessage.warning('数据获取失败:'+res.msg) } - }else{ + }) + if(type == 'edit'){ state.disable = false - dialogVisible.value = true + }else{ + state.disable = true } + }else{ + state.disable = false + dialogVisible.value = true + } } const validKey=(key,obj)=>{ return key in obj + } + + const startAssess = async (num)=>{ + if(num == 2){ + state.assessDialog = true + }else{ + await assess(num) + } } const assess = (num)=>{ @@ -567,18 +628,34 @@ type: 'warning', }) .then(async() => { - const res = await changeApprove({id:state.form.id,state: num}) + let params = {} + if(num == 2){ + params = { + id: state.form.id, + state: num, + employmentDateStart: state.assessForm.employTime[0], + employmentDateEnd: state.assessForm.employTime[1], + ratingLevel: state.assessForm.ratingLevel + } + }else{ + params = { + id:state.form.id, + state: num + } + } + const res = await changeApprove(params) if(res.code == 200){ ElMessage({ type: 'success', message: '审批成功' }); emit('getList') + state.assessDialog = false dialogVisible.value = false }else{ ElMessage({ type: 'warning', - message: res.message + message: res.msg }); } }) @@ -595,6 +672,12 @@ }); } } + +function getDepList() { + listOutDept({}).then(response => { + state.deptList = proxy.handleTree(response.data, "deptId",'parentId','children'); + }); +} const professionChange=(value)=> { console.log(value,'val') @@ -628,9 +711,9 @@ const handleAvatarSuccess = (res, uploadFile,type) => { if(res.code == 200){ if(type == '证件照'){ - state.form.electronicPhoto = res.data.path + state.form.electronicPhoto = res.url }else{ - uploadFile.name = res.data.path + uploadFile.name = res.url } }else{ ElMessage({ @@ -641,6 +724,7 @@ } const handleRemove = (file, uploadFiles,type) => { + console.log(file, uploadFiles) if(file && file.status == 'success') { ElMessageBox.confirm( '该操作将永久删除此文件内容,是否继续?', @@ -667,7 +751,7 @@ } else { ElMessage({ type: 'warning', - message: res.message + message: res.msg }) } }) @@ -683,23 +767,20 @@ return } let data = JSON.parse(JSON.stringify(state.form)) - data.supportDirectionSafety = data.supportDirectionSafety.join(',') - data.supportDirectionPrevention = data.supportDirectionPrevention.join(',') - data.supportDirectionEmergency = data.supportDirectionEmergency.join(',') - data.bigClassify = data.profession[0] - data.smallClassify = data.profession[1] + data.supportDirectionSafety = Array.isArray(data.supportDirectionSafety)?data.supportDirectionSafety.join(','):'' + data.supportDirectionPrevention = Array.isArray(data.supportDirectionPrevention)?data.supportDirectionPrevention.join(','):'' + data.supportDirectionEmergency = Array.isArray(data.supportDirectionEmergency)?data.supportDirectionEmergency.join(','):'' data.resumeKey = state.resumeList.map(i=>i.name).join(',') data.paperSituationKey = state.inventionList.map(i=>i.name).join(',') data.rewardKey = state.rewardList.map(i=>i.name).join(',') data.achievementKey = state.achievementList.map(i=>i.name).join(',') data.personalOpinionKey = state.proAdviceList.map(i=>i.name).join(',') data.recommendUnitOpinionKey = state.adviceList.map(i=>i.name).join(',') - delete data.profession if(state.title == '新增'){ delete data.id const res= await addExpertInfo(data) if(res.code == 200){ - ElMessage.success(res.message) + ElMessage.success(res.msg) state.fileList = [] state.resumeList = [] state.inventionList = [] @@ -711,12 +792,12 @@ state.hasDeleteFile = false dialogVisible.value = false }else{ - ElMessage.warning(res.message) + ElMessage.warning(res.msg) } }else{ const res= await modExpertInfo(data) if(res.code == 200){ - ElMessage.success(res.message) + ElMessage.success(res.msg) state.fileList = [] state.resumeList = [] state.inventionList = [] @@ -728,13 +809,33 @@ state.hasDeleteFile = false dialogVisible.value = false }else{ - ElMessage.warning(res.message) + ElMessage.warning(res.msg) } } } else { ElMessage.warning('请完善必填信息') } }) +} + +const assessSubmit = async (formEl)=> { + if (!formEl) return + await formEl.validate(async (valid, fields) => { + if (valid) { + await assess(2) + }else { + ElMessage.warning('请完善必填信息') + } + }) +} + +const closeAssess = ()=>{ + assessFormRef.value.clearValidate() + state.assessForm = { + employTime: [], + ratingLevel: '' + } + state.assessDialog = false; } const handleClose = () => { @@ -744,9 +845,8 @@ id: null, name:'', sex:'', - profession: [], - bigClassify:null, - smallClassify: null, + domain: '', + deptId: null, birthday: '', phone:'', title: '', -- Gitblit v1.9.2