From b609f77709c4646daf155341475ae14fc0c7943d Mon Sep 17 00:00:00 2001
From: 祖安之光 <11848914+light-of-zuan@user.noreply.gitee.com>
Date: 星期五, 27 六月 2025 13:25:30 +0800
Subject: [PATCH] 修改
---
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