From b215fb6dfd4ede3cb1b08985bb04ef5803a52454 Mon Sep 17 00:00:00 2001
From: zhouwenxuan <1175765986@qq.com>
Date: 星期三, 17 一月 2024 16:32:12 +0800
Subject: [PATCH] bug修改

---
 src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue |  316 +++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 262 insertions(+), 54 deletions(-)

diff --git a/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue b/src/views/safetyReview/userManage/expertUsers/components/expertDialog.vue
index 3c833b2..e0a22b9 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.formRules" 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" ></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,7 +39,7 @@
                 <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-select v-model="state.form.agencyId"  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"
@@ -51,20 +51,40 @@
                     </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 state.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 state.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,12 +99,29 @@
                         </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 state.levelList"
+                          :key="item.id"
+                          :label="item.name"
+                          :value="item.name"
+                      />
+                    </el-select>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+
 
                 <el-form-item prop="socialAttach" label="社保:" v-if="state.title !== '修改密码'">
                     <el-upload
@@ -149,7 +186,7 @@
             <template #footer >
                     <span class="dialog-footer">
                         <el-button @click="handleClose" size="default">取 消</el-button>
-                        <el-button type="primary"  @click="onSubmit" size="default">确认</el-button>
+                        <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
                     </span>
             </template>
             <el-dialog v-model="state.dialogImg">
@@ -159,17 +196,18 @@
     </div>
 </template>
 <script setup>
-import {reactive, ref, toRefs, defineEmits, onMounted} from 'vue'
+import {reactive, ref, toRefs, defineEmits, onMounted, nextTick} from 'vue'
 import { View } from "@element-plus/icons-vue";
 import {ElMessage} from "element-plus";
 import {verifyPhone, verifyPwd, verifyUsername} from "../../../../../utils/validate";
 import {checkUserName, checkPhone, delPic} from "@/api/login"
 import { getRegionTree } from "@/api/area"
-import {addExpert, addMonitor, editMonitor, getMonitorList} from "@/api/sysUsers"
+import {addExpert, addMonitor, editExpert, editMonitor, getMonitorList, getUserById} from "@/api/sysUsers"
 import {Base64} from "js-base64"
 import {resetUserPwd} from "../../../../../api/sysUsers";
 import {getToken} from "@/utils/auth";
 import {getInsitutionList} from "@/api/backManage/insitution";
+import {getDictList} from "@/api/backManage/evaluate";
 
 const emit = defineEmits(["getList"]);
 const dialogVisible = ref(false)
@@ -190,7 +228,18 @@
         if(!verifyPhone(value)){
             callback(new Error('手机号格式有误'))
         }else{
-            checkPhone({phone:value,id: state.form.id}).then((res)=>{
+            let param = {}
+            if(state.title=='新增') {
+                param = {
+                    phone:value
+                }
+            }else if(state.title=='编辑'){
+                param = {
+                    phone:value,
+                    id: state.form.id
+                }
+            }
+            checkPhone(param).then((res)=>{
                 if(res.data == false){
                     callback(new Error('该手机号已被绑定用户,请更换其他手机号'))
                 }else{
@@ -206,9 +255,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 +284,7 @@
         callback(new Error('请输入密码'))
     }else{
         if(!verifyPwd(value)){
-            callback(new Error('密码须包含字母、数字、特殊字符(不包括下划线),长度在6-16之间'))
+            callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间'))
         }else{
             callback()
         }
@@ -245,6 +305,8 @@
         salaryAttach: [],
         post: '',
         jobTitle: '',
+        level: '',
+        majorShow: [],
         major: '',
         expertType: 1,
         password: '',
@@ -259,10 +321,11 @@
         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: "请上传工资清单"}],
@@ -277,21 +340,99 @@
     dialogImg: false,
     pageNum: 1,
     pageSize: 10,
+    postList: [
+      {
+        id: '1',
+        name: '法人'
+      },
+      {
+        id: '2',
+        name: '过程控制负责人'
+      },
+      {
+        id: '3',
+        name: '机构负责人'
+      },
+      {
+        id: '4',
+        name: '技术负责人'
+      },
+      {
+        id: '5',
+        name: '员工'
+      },
+    ],
+  majorList: [],
+  levelList: [
+    {
+      id: '1',
+      name: '一级'
+    },
+    {
+      id: '2',
+      name: '二级'
+    },
+    {
+      id: '3',
+      name: '三级'
+    },
+    {
+      id: '4',
+      name: '其他'
+    },
+  ]
 })
 
 onMounted(()=>{
     getAgency()
+    getMajor()
 })
 
-const openDialog = (type, value) => {
+const openDialog = async (type, value) => {
     getArea()
     state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='pwd' ? '修改密码' : '查看' ;
     if(type === 'edit') {
-        for(let i in state.form){
-            if(validKey(i,value)){
-                state.form[i] = value[i]
-            }
+        const param = {
+            userId: value.id
         }
+        const res = await getUserById(param);
+        if(res.code == 200){
+            state.form = res.data
+            state.socialList = res.data.socialAttach.map(url => {
+                return {
+                    url:  import.meta.env.VITE_APP_BASE_API +'/'+url.path,
+                    name: url.name
+                }
+            });
+            state.medicalList = res.data.medicalAttach.map(url => {
+                return {
+                    url:  import.meta.env.VITE_APP_BASE_API +'/'+url.path,
+                    name: url.name
+                }
+            });
+            state.salaryList = res.data.salaryAttach.map(url => {
+                return {
+                    url:  import.meta.env.VITE_APP_BASE_API +'/'+url.path,
+                    name: url.name
+                }
+            });
+            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.majorShow,'certificateList')
+        }else{
+            ElMessage.warning(res.message)
+        }
+
     }
     if(type == 'pwd'){
         state.form.id = value.id
@@ -319,9 +460,22 @@
 const onSubmit = async () => {
     const valid = await superRef.value.validate();
     if(valid){
+        state.form.majorShow.forEach(item => {
+          if(item.certificateNo == ''){
+            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){
@@ -337,18 +491,27 @@
                 ElMessage.warning(res.message)
             }
         }else if(state.title == '编辑'){
-            // const {confirmPassword,...data} = state.form
-            // data.password = Base64.encode(data.password)
-            // const res = await editMonitor(data)
-            // if(res.code == 200){
-            //     ElMessage.success(res.message)
-            //     emit('getList')
-            //     superRef.value.clearValidate();
-            //     superRef.value.resetFields();
-            //     dialogVisible.value = false;
-            // }else{
-            //     ElMessage.warning(res.message)
-            // }
+            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()
+                dialogVisible.value = false;
+            }else{
+                ElMessage.warning(res.message)
+            }
         }else{
             const {id,password} = state.form
             const data = {id,password}
@@ -358,7 +521,7 @@
                 ElMessage.success(res.message)
                 emit('getList')
                 superRef.value.clearValidate();
-                superRef.value.resetFields();
+                reset()
                 dialogVisible.value = false;
             }else{
                 ElMessage.warning(res.message)
@@ -369,12 +532,35 @@
 
 const handleClose = () => {
     superRef.value.clearValidate();
-    superRef.value.resetFields()
+    reset()
     dialogVisible.value = false;
+
+
+}
+const reset = () => {
+   state.form = {
+       id: null,
+       name: '',
+       username: '',
+       sex: 0,
+       phone: '',
+       agencyId: '',
+       socialAttach: [],
+       medicalAttach: [],
+       salaryAttach: [],
+       post: '',
+       jobTitle: '',
+       level:'',
+       majorShow: [],
+       major:'',
+       expertType: 1,
+       password: '',
+       confirmPassword: '',
+   }
     state.salaryList = [];
     state.medicalList = [];
     state.socialList = [];
-
+    state.form.selectMajorList = [];
 }
 const picSize = async (rawFile) => {
     if(rawFile.size / 1024 / 1024 > 5){
@@ -428,7 +614,14 @@
 
 
 const handleRemove = async (file, uploadFiles,type) => {
-    const path = file.response.data.path
+    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
+    }
+
     const res = await delPic({path: path})
     if(res.code == 200){
         ElMessage({
@@ -442,11 +635,11 @@
         })
     }
     if(type === 1){
-        state.form.socialAttach = state.form.socialAttach.filter(item => item.path !== file.response.data.path)
+        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 !== file.response.data.path)
+        state.form.medicalAttach = state.form.medicalAttach.filter(item => item.path !== path)
     }else {
-        state.form.salaryAttach = state.form.salaryAttach.filter(item => item.path !== file.response.data.path)
+        state.form.salaryAttach = state.form.salaryAttach.filter(item => item.path !== path)
     }
 }
 const finshed = ref(false)
@@ -457,7 +650,7 @@
     }
     const res = await getInsitutionList(queryParams)
     if(res.code == 200){
-        if(res.data.pageNum !== state.pageNum){
+        if(res.data.pageNum === state.pageNum){
             finshed.value = false;
             if(state.pageNum == 1){
                 state.agencyList = res.data.list
@@ -472,6 +665,19 @@
         ElMessage.warning(res.message)
     }
 }
+const getMajor = async () => {
+  const queryParams = {
+        pageNum: 1,
+        pageSize: 50,
+        dictType: 'sys_major_orientation'
+  }
+  const res = await getDictList(queryParams);
+  if(res.code === 200){
+    state.majorList = res.data.list
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
 
 
 
@@ -480,14 +686,16 @@
     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)
 }
 
 defineExpose({

--
Gitblit v1.9.2