From 3f6bf89b1985b6668f02ffcc9af577b412e92e45 Mon Sep 17 00:00:00 2001 From: zhouwx <1175765986@qq.com> Date: 星期一, 24 三月 2025 17:17:45 +0800 Subject: [PATCH] bug修改 --- src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue | 422 +++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 347 insertions(+), 75 deletions(-) diff --git a/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue b/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue index 1c002f1..45aebc7 100644 --- a/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue +++ b/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue @@ -3,20 +3,20 @@ <el-dialog v-model="dialogVisible" :title="state.title" - width="800px" + width="900px" :before-close="handleClose" > - <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRules" label-width="110px" > + <el-form :model="state.form" size="default" ref="superRef" :rules="state.formRulesOut" label-width="150px" > <el-row :gutter="22"> <el-col :span="11"> <el-form-item label="姓名:" prop="name" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.name" ></el-input> + <el-input v-model.trim="state.form.name" placeholder="请输入姓名"></el-input> </el-form-item> </el-col> <el-col :span="11"> <el-form-item label="手机号:" prop="phone" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.phone" :maxlength="11" ></el-input> + <el-input v-model.trim="state.form.phone" :maxlength="11" placeholder="手机号"></el-input> </el-form-item> </el-col> @@ -24,7 +24,7 @@ <el-row :gutter="22"> <el-col :span="11"> <el-form-item label="用户名:" prop="username" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.username" :disabled="state.title === '编辑'"></el-input> + <el-input v-model.trim="state.form.username" :disabled="state.title === '编辑'" placeholder="请输入用户名"></el-input> </el-form-item> </el-col> <el-col :span="11"> @@ -39,32 +39,53 @@ <el-row :gutter="22"> <el-col :span="11"> <el-form-item label="所属机构:" prop="agencyId" v-if="state.title !== '修改密码'"> - <el-select v-model="state.form.agencyId" v-loadMore="loadMore" class="m-2" placeholder="请选择机构" popper-class="more_select_dropdown" @change="selectChange" > + <el-input v-if="isAgency" v-model="state.agencyName" disabled></el-input> + <el-select v-model="state.form.agencyName" @change="selectValue" v-else style="width: 100%" v-loadMore="loadMore" class="m-2" placeholder="请选择机构" popper-class="more_select_dropdown" > <el-option v-for="item in state.agencyList" :key="item.id" :label="item.name" - :value="item.id" + :value="item.name" /> </el-select> </el-form-item> </el-col> <el-col :span="11"> <el-form-item label="职务:" prop="post" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.post" :maxlength="11" ></el-input> +<!-- <el-input v-model.trim="state.form.post" :maxlength="11" ></el-input>--> + <el-select v-model="state.form.post" class="m-2" style="width: 100%" placeholder="请选择职务" popper-class="more_select_dropdown" > + <el-option + v-for="item in props.postList" + :key="item.id" + :label="item.name" + :value="item.name" + /> + </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="22"> <el-col :span="11"> <el-form-item label="职称:" prop="jobTitle" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.jobTitle" :maxlength="11" ></el-input> + <el-input v-model.trim="state.form.jobTitle" :maxlength="11" placeholder="请输入职称"></el-input> </el-form-item> </el-col> <el-col :span="11"> - <el-form-item label="专业方向:" prop="major" v-if="state.title !== '修改密码'"> - <el-input v-model.trim="state.form.major" :maxlength="11" ></el-input> + <el-form-item label="专业方向:" prop="majorShow" v-if="state.title !== '修改密码'" > + <el-select v-model="state.form.majorShow" value-key="id" class="m-2" style="width: 100%" multiple placeholder="请选择专业方向" popper-class="more_select_dropdown" @change="selectChange"> + <el-option + v-for="item in props.majorList" + :key="item.id" + :label="item.label" + :value="item" + /> + </el-select> </el-form-item> + <div v-for="(item,index) in state.form.majorShow" :key="item.id" style="margin-bottom: 20px" > + <el-form-item :label="item.label+'证书编号:'" > + <el-input v-model="item.certificateNo" :placeholder="'请输入'+item.label+'证书编号'"></el-input> + </el-form-item> + </div> </el-col> </el-row> <el-row :gutter="22"> @@ -79,13 +100,31 @@ </el-form-item> </el-col> </el-row> - <el-form-item label="专家类型:" prop="expertType" v-if="state.title !== '修改密码'"> + <el-row :gutter="22"> + <el-col :span="11"> + <el-form-item label="专家类型:" prop="expertType" v-if="state.title !== '修改密码'"> <el-radio-group v-model="state.form.expertType" class="ml-4"> - <el-radio :label="1" >安全评价</el-radio> - <el-radio :label="2" >检验检测</el-radio> + <el-radio :label="1" >安全评价</el-radio> + <el-radio :label="2" >检验检测</el-radio> </el-radio-group> - </el-form-item> - + </el-form-item> + </el-col> + <el-col :span="11"> + <el-form-item label="评价师等级:" prop="level" v-if="state.title !== '修改密码'"> + <el-select v-model="state.form.level" class="m-2" style="width: 100%" placeholder="请选择评价师等级" popper-class="more_select_dropdown" > + <el-option + v-for="item in props.levelList" + :key="item.id" + :label="item.name" + :value="item.name" + /> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-form-item> + <div style="margin-left: -50px"><span style="font-size: 16px;color: #ed5565;">提示:疆外企业无需上传社保、医保、工资清单,疆内企业需每季度进行更新。</span></div> + </el-form-item> <el-form-item prop="socialAttach" label="社保:" v-if="state.title !== '修改密码'"> <el-upload accept="image/*" @@ -143,7 +182,27 @@ <div class="el-upload__tip">上传jpg/png图片尺寸小于5M</div> </template> </el-upload> - + </el-form-item> + <el-form-item prop="idPhoto" label="证件照:" v-if="state.title !== '修改密码'"> + <el-upload + accept="image/*" + :action="state.uploadUrl" + :headers="state.header" + method="post" + :on-change="handleChangePic" + :on-success="handlePhotoSuccess" + :on-preview="handlePictureCardPreview" + v-model:file-list="state.photoList" + list-type="picture-card" + :before-upload="picSize" + :on-remove="handlePhotoRemove" + :limit="2" + > + <el-icon><Plus /></el-icon> + <template #tip> + <div class="el-upload__tip">上传jpg/png图片尺寸小于5M</div> + </template> + </el-upload> </el-form-item> </el-form> <template #footer > @@ -159,7 +218,7 @@ </div> </template> <script setup> -import {reactive, ref, toRefs, defineEmits, onMounted, nextTick} from 'vue' +import {reactive, ref, toRefs, defineEmits, defineProps, onMounted, nextTick} from 'vue' import { View } from "@element-plus/icons-vue"; import {ElMessage} from "element-plus"; import {verifyPhone, verifyPwd, verifyUsername} from "../../../../../utils/validate"; @@ -170,8 +229,11 @@ import {resetUserPwd} from "../../../../../api/sysUsers"; import {getToken} from "@/utils/auth"; import {getInsitutionList} from "@/api/backManage/insitution"; +import {getDictList} from "@/api/backManage/evaluate"; +import Cookies from "js-cookie"; const emit = defineEmits(["getList"]); +const props = defineProps(['majorList','levelList','postList']) const dialogVisible = ref(false) const superRef = ref(null) @@ -190,7 +252,20 @@ if(!verifyPhone(value)){ callback(new Error('手机号格式有误')) }else{ - checkPhone({phone:value,id: state.form.id}).then((res)=>{ + let param = {} + if(state.title=='新增') { + param = { + phone:value, + identity: 2 + } + }else if(state.title=='编辑'){ + param = { + phone:value, + id: state.form.id, + identity: 2 + } + } + checkPhone(param).then((res)=>{ if(res.data == false){ callback(new Error('该手机号已被绑定用户,请更换其他手机号')) }else{ @@ -206,9 +281,20 @@ callback(new Error('请输入登录时用户名')) }else{ if(!verifyUsername(value)){ - callback(new Error('用户名须使用字母+数字,长度在5-16之间')) + callback(new Error('用户名须使用字母或数字,长度在5-16之间')) }else{ - checkUserName({username:value,id: state.form.id}).then((res)=>{ + let param = {} + if(state.title=='新增') { + param = { + username:value + } + }else if(state.title=='编辑'){ + param = { + username:value, + id: state.form.id + } + } + checkUserName(param).then((res)=>{ if(res.data == false){ callback(new Error('用户名已被占用,请更换其他用户名')) }else{ @@ -224,7 +310,7 @@ callback(new Error('请输入密码')) }else{ if(!verifyPwd(value)){ - callback(new Error('密码须包含字母、数字、特殊字符(不包括下划线),长度在6-16之间')) + callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间')) }else{ callback() } @@ -243,30 +329,53 @@ socialAttach: [], medicalAttach: [], salaryAttach: [], + idPhoto: '', post: '', jobTitle: '', + level: '', + majorShow: [], major: '', expertType: 1, password: '', confirmPassword: '', }, + agencyName:'', socialList: [], medicalList: [], salaryList: [], - formRules:{ + photoList: [], + formRulesIn:{ name: [{ required: true, message: '请输入姓名', trigger: 'blur' }], username: [{ required: true, validator: validateUsername, trigger: 'blur' }], password: [{ required: true, validator: validatePwd, trigger: 'blur' }], confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }], phone: [{ required: true, validator: validateUserPhone, trigger: 'blur' }], - post: [{ required: true, message: '请输入职务', trigger: 'blur' }], + post: [{ required: true, message: '请选择职务', trigger: 'change' }], jobTitle:[{ required: true, message: '请输入职称', trigger: 'blur' }], - major:[{ required: true, message: '请输入专业方向', trigger: 'blur' }], - // agencyId: [{ required: true, message: '请选择所属机构', trigger: 'blur' }], + level: [{ required: true, message: '请选择评价师等级', trigger: 'change' }], + majorShow:[{ required: true, message: '请选择专业方向', trigger: 'change' }], + agencyId: [{ required: true, message: '请选择所属机构', trigger: 'change' }], socialAttach: [{required: true, trigger: "blur", message: "请上传社保图片"}], medicalAttach: [{required: true, trigger: "blur", message: "请上传医保图片"}], salaryAttach: [{required: true, trigger: "blur", message: "请上传工资清单"}], + idPhoto: [{required: true, trigger: "blur", message: "请上传近期证件照"}], }, + formRulesOut:{ + name: [{ required: true, message: '请输入姓名', trigger: 'blur' }], + username: [{ required: true, validator: validateUsername, trigger: 'blur' }], + password: [{ required: true, validator: validatePwd, trigger: 'blur' }], + confirmPassword: [{ required: true, validator: equalToPassword, trigger: 'blur' }], + phone: [{ required: true, validator: validateUserPhone, trigger: 'blur' }], + post: [{ required: true, message: '请选择职务', trigger: 'change' }], + jobTitle:[{ required: true, message: '请输入职称', trigger: 'blur' }], + level: [{ required: true, message: '请选择评价师等级', trigger: 'change' }], + majorShow:[{ required: true, message: '请选择专业方向', trigger: 'change' }], + agencyId: [{ required: true, message: '请选择所属机构', trigger: 'change' }], + // socialAttach: [{required: true, trigger: "blur", message: "请上传社保图片"}], + // medicalAttach: [{required: true, trigger: "blur", message: "请上传医保图片"}], + // salaryAttach: [{required: true, trigger: "blur", message: "请上传工资清单"}], + idPhoto: [{required: true, trigger: "blur", message: "请上传近期证件照"}], + }, areaList: [], agencyList: [], header: { @@ -276,15 +385,34 @@ dialogImageUrl: '', dialogImg: false, pageNum: 1, - pageSize: 10, + pageSize: 10 }) +const isAgency = ref(false); onMounted(()=>{ - getAgency() + }) + +const attribute = ref(null); +const getUserInfoAgency = () => { + const userInfo = JSON.parse(Cookies.get('userInfo')) + if (userInfo.identity === 1) { + state.agencyName = userInfo.agentName; + state.form.agencyId = userInfo.agentId; + isAgency.value = true; + attribute.value = JSON.parse(Cookies.get('attribute')) + console.log("attribute", attribute.value) + + } else { + getAgency('open') + } +} + + const openDialog = async (type, value) => { - getArea() + await getUserInfoAgency(); + await getArea() state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='pwd' ? '修改密码' : '查看' ; if(type === 'edit') { const param = { @@ -293,6 +421,7 @@ const res = await getUserById(param); if(res.code == 200){ state.form = res.data + state.form.agencyName = res.data.agency.name state.socialList = res.data.socialAttach.map(url => { return { url: import.meta.env.VITE_APP_BASE_API +'/'+url.path, @@ -311,10 +440,37 @@ name: url.name } }); + const obj = { + url: import.meta.env.VITE_APP_BASE_API +'/'+ res.data.idPhoto + } + state.photoList.push(obj); + if(res.data.certificateNo){ + const arr = [] + const certificateList = JSON.parse(res.data.certificateNo) + for( let key in certificateList) { + arr.push( { + id: parseInt(key), + certificateNo: certificateList[key], + }) + arr.forEach((item,index) => { + item.label = res.data.majorNames[index] + }) + } + state.form.majorShow = arr; + console.log(state.form,'certificateList') + } + }else{ ElMessage.warning(res.message) } + }else if(type === 'add'){ + console.log("aa",props.majorList) + props.majorList.forEach(item => { + if(item.certificateNo){ + item.certificateNo = '' + } + }) } if(type == 'pwd'){ state.form.id = value.id @@ -340,21 +496,36 @@ } const onSubmit = async () => { + let isCode = false; const valid = await superRef.value.validate(); if(valid){ + state.form.majorShow.forEach(item => { + if(item.certificateNo === undefined || item.certificateNo === ''){ + isCode = true; + } + }) + if(isCode){ + ElMessage.warning('请输入对应的证书编号') + return ; + } if(state.title == '新增'){ const {confirmPassword,id,socialList,salaryList,medicalList,...data} = state.form data.password = Base64.encode(data.password) + let obj = {}; + data.majorShow.forEach(item => { + obj[item.id] = item.certificateNo; + }) + data.major = JSON.stringify(obj); + delete data.majorShow; + console.log('data',data) const res = await addExpert(data); if(res.code == 200){ ElMessage.success(res.message) emit('getList') + reset(); superRef.value.clearValidate(); - superRef.value.resetFields(); - state.salaryList = []; - state.medicalList = []; - state.socialList = []; + dialogVisible.value = false; }else{ ElMessage.warning(res.message) @@ -362,13 +533,22 @@ }else if(state.title == '编辑'){ const {confirmPassword,socialList,salaryList,medicalList,...data} = state.form data.password = Base64.encode(data.password) + let obj = {}; + data.majorShow.forEach(item => { + obj[item.id] = item.certificateNo; + }) + data.major = JSON.stringify(obj); + delete data.majorShow; + delete data.certificateNo; + delete data.majorNames; console.log('editdata',data) const res = await editExpert(data) if(res.code == 200){ ElMessage.success(res.message) emit('getList') - superRef.value.clearValidate(); reset() + superRef.value.clearValidate(); + dialogVisible.value = false; }else{ ElMessage.warning(res.message) @@ -381,8 +561,9 @@ if(res.code == 200){ ElMessage.success(res.message) emit('getList') - superRef.value.clearValidate(); reset() + superRef.value.clearValidate(); + dialogVisible.value = false; }else{ ElMessage.warning(res.message) @@ -409,9 +590,12 @@ socialAttach: [], medicalAttach: [], salaryAttach: [], + idPhoto: '', post: '', jobTitle: '', - major: '', + level:'', + majorShow: [], + major:'', expertType: 1, password: '', confirmPassword: '', @@ -419,6 +603,8 @@ state.salaryList = []; state.medicalList = []; state.socialList = []; + state.photoList = []; + state.form.selectMajorList = []; } const picSize = async (rawFile) => { if(rawFile.size / 1024 / 1024 > 5){ @@ -468,62 +654,138 @@ } } +const handlePhotoSuccess = (res,file) => { + if(res.code == 200){ + state.form.idPhoto = res.data.path; + }else{ + ElMessage({ + type: 'warning', + message: '文件上传失败' + }) + } +} +const handleChangePic = (file,fileList) => { + if (fileList.length > 1) { + state.photoList.splice(0, 1); + } +} + +const handlePhotoRemove = async (file) => { + if (file && file.status == 'success') { + // state.form.idPhoto = '' + + let path = "" + if (file.response && file.response.data) { + path = file.response.data.path + } else { + const base = import.meta.env.VITE_APP_BASE_API + path = file.url.substring(base.length + 1, file.url.length) + } + await delPic({path: path}).then(res => { + if (res.code == 200) { + // ElMessage({ + // type: 'success', + // message: '文件已删除' + // }) + state.form.idPhoto = '' + } else { + ElMessage({ + type: 'warning', + message: res.message + }) + } + }).catch(() => { + state.form.idPhoto = '' + }); +} + + + // const res = await delPic({path: path}) + // if(res.code == 200){ + // ElMessage({ + // type: 'success', + // message: '文件已删除' + // }) + // state.form.idPhoto = '' + // }else{ + // ElMessage({ + // type: 'warning', + // message: res.message + // }) + // } +} const handleRemove = async (file, uploadFiles,type) => { + if(file && file.status == 'success') { + let path = "" - if(state.title === '编辑') { - const base = import.meta.env.VITE_APP_BASE_API - path = file.url.substring(base.length+1,file.url.length ) - }else { - path = file.response.data.path + if (state.title === '编辑') { + const base = import.meta.env.VITE_APP_BASE_API + path = file.url.substring(base.length + 1, file.url.length) + } else { + path = file.response.data.path } - const res = await delPic({path: path}) - if(res.code == 200){ + await delPic({path: path}).then(res => { + if (res.code == 200) { + // ElMessage({ + // type: 'success', + // message: '文件已删除' + // }) + } else { ElMessage({ - type: 'success', - message: '文件已删除' + type: 'warning', + message: res.message }) - }else{ - ElMessage({ - type: 'warning', - message: res.message - }) - } - if(type === 1){ + } + }).catch(() => { + if (type === 1) { state.form.socialAttach = state.form.socialAttach.filter(item => item.path !== path) - }else if(type === 2){ + } else if (type === 2) { state.form.medicalAttach = state.form.medicalAttach.filter(item => item.path !== path) - }else { + } else { state.form.salaryAttach = state.form.salaryAttach.filter(item => item.path !== path) + } + }); + + if (type === 1) { + state.form.socialAttach = state.form.socialAttach.filter(item => item.path !== path) + } else if (type === 2) { + state.form.medicalAttach = state.form.medicalAttach.filter(item => item.path !== path) + } else { + state.form.salaryAttach = state.form.salaryAttach.filter(item => item.path !== path) } + } } const finshed = ref(false) -const getAgency = async () => { +const getAgency = async (type) => { + if (type === 'open' && state.pageNum !== 1) { + + } else { const queryParams = { - pageNum: state.pageNum, - pageSize: state.pageSize, + pageNum: state.pageNum, + pageSize: state.pageSize, } const res = await getInsitutionList(queryParams) - if(res.code == 200){ - if(res.data.pageNum === state.pageNum){ - finshed.value = false; - if(state.pageNum == 1){ - state.agencyList = res.data.list - }else { - state.agencyList =state.agencyList .concat(res.data.list) - } - }else { - finshed.value = true; + if (res.code == 200) { + if (res.data.pageNum === state.pageNum) { + finshed.value = false; + if (state.pageNum == 1) { + state.agencyList = res.data.list + } else { + state.agencyList = state.agencyList.concat(res.data.list) } + } else { + finshed.value = true; + } - }else{ - ElMessage.warning(res.message) + } else { + ElMessage.warning(res.message) } + } } - //触底函数 @@ -531,14 +793,24 @@ console.log(' 触底了'); // 防抖处理 setTimeout(() => { - if (finshed.value) return //值为true,则代表没有数据了 - state.pageNum += 1 - getAgency() + if (finshed.value) return //值为true,则代表没有数据了 + state.pageNum += 1 + getAgency('') }, 500) } + //选中值发生变化时触发 -const selectChange = () => { - console.log('选中的xxxx') +const selectChange = (val) => { + // state.form.selectMajorList= val; + console.log('选中的xxxx',val) +} +const selectValue = (val) => { + state.agencyList.forEach(item => { + if(item.name === val){ + state.form.agencyId = item.id + } + }) + } defineExpose({ -- Gitblit v1.9.2