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 |  398 ++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 324 insertions(+), 74 deletions(-)

diff --git a/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue b/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue
index 5f79b4b..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="830px"
+            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)
 
@@ -193,12 +255,14 @@
             let param = {}
             if(state.title=='新增') {
                 param = {
-                    phone:value
+                    phone:value,
+                    identity: 2
                 }
             }else if(state.title=='编辑'){
                 param = {
                     phone:value,
-                    id: state.form.id
+                    id: state.form.id,
+                    identity: 2
                 }
             }
             checkPhone(param).then((res)=>{
@@ -246,7 +310,7 @@
         callback(new Error('请输入密码'))
     }else{
         if(!verifyPwd(value)){
-            callback(new Error('密码须包含字母、数字、特殊字符(不包括下划线),长度在6-16之间'))
+            callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间'))
         }else{
             callback()
         }
@@ -265,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: {
@@ -298,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 = {
@@ -315,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,
@@ -333,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
@@ -362,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)
@@ -384,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)
@@ -403,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)
@@ -431,9 +590,12 @@
        socialAttach: [],
        medicalAttach: [],
        salaryAttach: [],
+       idPhoto: '',
        post: '',
        jobTitle: '',
-       major: '',
+       level:'',
+       majorShow: [],
+       major:'',
        expertType: 1,
        password: '',
        confirmPassword: '',
@@ -441,6 +603,8 @@
     state.salaryList = [];
     state.medicalList = [];
     state.socialList = [];
+    state.photoList = [];
+    state.form.selectMajorList = [];
 }
 const picSize = async (rawFile) => {
     if(rawFile.size / 1024 / 1024 > 5){
@@ -490,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)
     }
+  }
 }
-
 
 
 //触底函数
@@ -553,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