zhouwenxuan
2024-01-24 20195d0e1cbbf3e8bfd20e2baf53e2115f663da3
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,8 @@
                <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.agencyId" 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"
@@ -51,20 +52,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 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,12 +100,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 props.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
@@ -143,13 +181,33 @@
                            <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 >
                    <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,19 +217,22 @@
    </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, onMounted} 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";
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";
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 +251,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 +278,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 +307,7 @@
        callback(new Error('请输入密码'))
    }else{
        if(!verifyPwd(value)){
            callback(new Error('密码须包含字母、数字、特殊字符(不包括下划线),长度在6-16之间'))
            callback(new Error('密码须包含字母、数字、特殊字符,长度在6-16之间'))
        }else{
            callback()
        }
@@ -243,29 +326,36 @@
        socialAttach: [],
        medicalAttach: [],
        salaryAttach: [],
        idPhoto: '',
        post: '',
        jobTitle: '',
        level: '',
        majorShow: [],
        major: '',
        expertType: 1,
        password: '',
        confirmPassword: '',
    },
    agencyName:'',
    socialList: [],
    medicalList: [],
    salaryList: [],
    photoList: [],
    formRules:{
        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: "请上传近期证件照"}],
    },
    areaList: [],
    agencyList: [],
@@ -276,22 +366,73 @@
    dialogImageUrl: '',
    dialogImg: false,
    pageNum: 1,
    pageSize: 10,
    pageSize: 10
})
const isAgency = ref(false);
onMounted(()=>{
    getAgency()
    const userInfo = JSON.parse(Cookies.get('userInfo'))
    state.agencyName = userInfo.agentName;
    state.form.agencyId = userInfo.agentId;
    if(userInfo.identity === 1){
      isAgency.value = true;
    }
    console.log("userinfo",userInfo)
})
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 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.majorShow,'certificateList')
            }
        }else{
            ElMessage.warning(res.message)
        }
    }
    if(type == 'pwd'){
        state.form.id = value.id
@@ -317,11 +458,28 @@
}
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){
@@ -332,23 +490,33 @@
                state.salaryList = [];
                state.medicalList = [];
                state.socialList = [];
                state.photoList = [];
                dialogVisible.value = false;
            }else{
                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 +526,7 @@
                ElMessage.success(res.message)
                emit('getList')
                superRef.value.clearValidate();
                superRef.value.resetFields();
                reset()
                dialogVisible.value = false;
            }else{
                ElMessage.warning(res.message)
@@ -369,12 +537,37 @@
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: [],
       idPhoto: '',
       post: '',
       jobTitle: '',
       level:'',
       majorShow: [],
       major:'',
       expertType: 1,
       password: '',
       confirmPassword: '',
   }
    state.salaryList = [];
    state.medicalList = [];
    state.socialList = [];
    state.photoList = [];
    state.form.selectMajorList = [];
}
const picSize = async (rawFile) => {
    if(rawFile.size / 1024 / 1024 > 5){
@@ -424,11 +617,57 @@
    }
}
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) => {
  console.log("fileD",file)
  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 )
  }
  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) => {
    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 +681,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 +696,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
@@ -474,20 +713,21 @@
}
//触底函数
const loadMore = () => {
    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({