马宇豪
2024-11-21 cc3e08bda13360c88b7189e8f8d043b60783c7fb
src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue
@@ -12,29 +12,29 @@
            <el-form :model="state.form" :rules="state.rules" ref="ruleFormRef" label-width="200px">
              <el-row>
                <el-col :span="20">
                  <el-form-item label="专业类别" prop="profession">
                  <el-form-item label="专业类别" prop="domain">
                    <el-cascader
                        :disabled="state.disable"
                        style="width: 100%"
                        v-model="state.form.profession"
                        v-model="state.form.domain"
                        :options="state.expertsType"
                        :props="{ expandTrigger: 'hover',value: 'id',label: 'classifyName' }"
                        :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false }"
                        @change="professionChange"></el-cascader>
                  </el-form-item>
                </el-col>
              </el-row>
              <!--        <el-row>-->
              <!--          <el-col :span="20">-->
              <!--            <el-form-item label="填报日期" prop="date">-->
              <!--              <el-date-picker-->
              <!--                style="width: 100%"-->
              <!--                v-model="form.date"-->
              <!--                type="date"-->
              <!--                placeholder="选择日期">-->
              <!--              </el-date-picker>-->
              <!--            </el-form-item>-->
              <!--          </el-col>-->
              <!--        </el-row>-->
              <el-row>
                <el-col :span="20">
                  <el-form-item label="业务处室:" prop="deptId">
                    <el-cascader
                        style="width: 100%"
                        clearable
                        v-model="state.form.deptId"
                        :options="state.deptList"
                        :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',emitPath: false}"></el-cascader>
                  </el-form-item>
                </el-col>
              </el-row>
              <el-row>
                <el-col :span="20">
                  <el-form-item label="姓名" prop="name">
@@ -58,7 +58,7 @@
                    <el-date-picker
                        style="width: 100%"
                        v-model="state.form.birthday"
                        value-format="YYYY-MM-DD 00:00:00"
                        value-format="YYYY-MM-DD"
                        type="date"
                        placeholder="选择日期" :disabled="state.disable">
                    </el-date-picker>
@@ -310,7 +310,39 @@
              </el-row>
            </el-form>
            <el-dialog v-model="imgDialog">
              <img w-full :src="state.dialogImageUrl" alt="">
              <img style="width: 100%" w-full :src="state.dialogImageUrl" alt="">
            </el-dialog>
            <el-dialog
                v-model="state.assessDialog"
                title="评定详情"
                width="50%"
                :before-close="closeAssess"
            >
              <el-form :model="state.assessForm" :rules="state.assessRules" ref="assessFormRef" label-width="200px">
                <el-form-item label="专家聘用期限" prop="employTime">
                  <el-date-picker
                      v-model="state.assessForm.employTime"
                      type="daterange"
                      range-separator="至"
                      start-placeholder="开始日期"
                      end-placeholder="结束日期"
                      value-format="YYYY-MM-DD"
                  />
                </el-form-item>
                <el-form-item label="专家评定等级" prop="ratingLevel">
                  <el-radio-group v-model="state.assessForm.ratingLevel">
                    <el-radio label="1">一级</el-radio>
                    <el-radio label="2">二级</el-radio>
                    <el-radio label="3">三级</el-radio>
                  </el-radio-group>
                </el-form-item>
              </el-form>
              <template #footer>
                <span class="dialog-footer">
                  <el-button @click="closeAssess" size="default">取 消</el-button>
                  <el-button type="primary" @click="assessSubmit(assessFormRef)" size="default" v-preReClick>确认</el-button>
                </span>
              </template>
            </el-dialog>
          </div>
            <template #footer>
@@ -319,25 +351,29 @@
                  <el-button type="primary" @click="onSubmit(ruleFormRef)" size="default" v-preReClick>确认</el-button>
              </span>
              <span class="dialog-footer" v-if="state.title == '评定'">
                  <el-button type="danger" size="default" @click="assess(3)"  v-preReClick>评定驳回</el-button>
                  <el-button type="primary" @click="assess(2)" size="default" v-preReClick>评定通过</el-button>
                  <el-button type="danger" size="default" @click="startAssess(3)"  v-preReClick>评定驳回</el-button>
                  <el-button type="primary" @click="startAssess(2)" size="default" v-preReClick>评定通过</el-button>
              </span>
            </template>
        </el-dialog>
    </div>
</template>
<script setup>
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted} from 'vue'
import {reactive, ref, toRefs, defineEmits, nextTick, onMounted, getCurrentInstance} from 'vue'
import {ElMessage, ElMessageBox} from "element-plus"
import {verifyPhone, verifyIdCard} from "../../../../../utils/validate"
import {addExpertInfo, getExpertTypes, getInfo, modExpertInfo, uploadFile, changeApprove} from "@/api/form"
import {delPic} from "@/api/login"
import { getToken } from "@/utils/auth"
import {Base64} from "js-base64"
import {listOutDept} from "@/api/system/dept";
const emit = defineEmits(["getList"])
const dialogVisible = ref(false)
const imgDialog = ref(false)
const ruleFormRef = ref()
const assessFormRef = ref()
const { proxy } = getCurrentInstance()
var validatePass = (rule, value, callback) => {
  if (state.fileList.length == 0) {
    callback(new Error('请上传证件照'));
@@ -369,13 +405,13 @@
}
const state = reactive({
  assessDialog: false,
  form:{
    id: null,
    name:'',
    sex:'',
    profession: [],
    bigClassify:null,
    smallClassify: null,
    domain: '',
    deptId: null,
    birthday: '',
    phone:'',
    title: '',
@@ -405,9 +441,14 @@
    remark: '',
    source: 2
  },
  assessForm: {
    employTime: [],
    ratingLevel: ''
  },
  hasDeleteFile: false,
  disable: false,
  expertsType: [],
  deptList: [],
  directionList: [
    {
      value: 1,
@@ -430,7 +471,7 @@
      label: '其他'
    }
  ],
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
  uploadUrl: import.meta.env.VITE_APP_BASE_API + '/common/upload',
  header: {
    Authorization: 'Bearer ' + getToken()
  },
@@ -445,7 +486,8 @@
  rules:{
    name:[{ required: true, message: '请填写姓名', trigger: 'blur' }],
    sex:[{ required: true, message: '请选择性别', trigger: 'blur' }],
    profession: [{ required: true, message: '请选择专业类别', trigger: 'blur' }],
    domain: [{ required: true, message: '请选择专业类别', trigger: 'blur' }],
    deptId: [{ required: true, message: '请选择业务处室', trigger: 'blur' }],
    birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }],
    phone:[{ required: true, validator: validatePhone, trigger: 'blur' }],
    title: [{ required: true, message: '请填写职称', trigger: 'blur' }],
@@ -454,6 +496,10 @@
    dutyStatus: [{ required: true, message: '请选择在岗情况', trigger: 'blur' }],
    companyName: [{ required: true, message: '请填写单位全称', trigger: 'blur' }],
    degree: [{ required: true, message: '请填写最高学历', trigger: 'blur' }]
  },
  assessRules:{
    employTime: [{ required: true, message: '请选择聘用期限', trigger: 'blur' }],
    ratingLevel: [{ required: true, message: '请选择评定等级', trigger: 'blur' }]
  }
})
@@ -463,98 +509,113 @@
  const openDialog = (type, value) => {
    state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='view' ?'查看':'评定'
    getExpertsType()
      if(type == 'edit'||type=='view'||type=='assess'){
        getInfo(value.id).then((res)=>{
          if(res.code == 200){
            if(res.data) {
              const val = res.data
              for(let i in state.form) {
                if (validKey(i, val)) {
                  state.form[i] = val[i]
                }
              }
              state.form.profession[0] = val.bigClassify
              state.form.profession[1] = val.smallClassify
              if(val.supportDirectionSafety){
                state.form.supportDirectionSafety = val.supportDirectionSafety.split(',').map(i=>Number(i))
              }
              if(val.supportDirectionPrevention){
                state.form.supportDirectionPrevention = val.supportDirectionPrevention.split(',').map(i=>Number(i))
              }
              if(val.supportDirectionEmergency){
                state.form.supportDirectionEmergency = val.supportDirectionEmergency.split(',').map(i=>Number(i))
              }
              state.fileList.push({
                name: state.form.electronicPhoto,
                url: import.meta.env.VITE_APP_BASE_API + '/' + state.form.electronicPhoto,
              })
              if(state.form.resumeKey !== ''){
                state.resumeList = state.form.resumeKey.split(',').map(i=>{
                  return {
                    name: i,
                    url: import.meta.env.VITE_APP_BASE_API + '/' + i,
                  }
                })
              }
              if(state.form.paperSituationKey !== ''){
                state.inventionList = state.form.paperSituationKey.split(',').map(i=>{
                  return {
                    name: i,
                    url: import.meta.env.VITE_APP_BASE_API + '/' + i,
                  }
                })
              }
              if(state.form.rewardKey !== ''){
                state.rewardList = state.form.rewardKey.split(',').map(i=>{
                  return {
                    name: i,
                    url: import.meta.env.VITE_APP_BASE_API + '/' + i,
                  }
                })
              }
              if(state.form.achievementKey !== ''){
                state.achievementList = state.form.achievementKey.split(',').map(i=>{
                  return {
                    name: i,
                    url: import.meta.env.VITE_APP_BASE_API + '/' + i,
                  }
                })
              }
              if(state.form.personalOpinionKey !== ''){
                state.proAdviceList = state.form.personalOpinionKey.split(',').map(i=>{
                  return {
                    name: i,
                    url: import.meta.env.VITE_APP_BASE_API + '/' + i,
                  }
                })
              }
              if(state.form.recommendUnitOpinionKey !== ''){
                state.adviceList = state.form.recommendUnitOpinionKey.split(',').map(i=>{
                  return {
                    name: i,
                    url: import.meta.env.VITE_APP_BASE_API + '/' + i,
                  }
                })
    getDepList()
    state.fileList = []
    if(type == 'edit'||type=='view'||type=='assess'){
      getInfo(value.id).then((res)=>{
        if(res.code == 200){
          if(res.data) {
            const val = res.data
            for(let i in state.form) {
              if (validKey(i, val)) {
                state.form[i] = val[i]
              }
            }
            dialogVisible.value = true
          }else{
            ElMessage.warning('数据获取失败:'+res.message)
            if(val.supportDirectionSafety && val.supportDirectionSafety!==''){
              state.form.supportDirectionSafety = val.supportDirectionSafety.split(',').map(i=>Number(i))
            }else{
              state.form.supportDirectionSafety = []
            }
            if(val.supportDirectionPrevention && val.supportDirectionPrevention!==''){
              state.form.supportDirectionPrevention = val.supportDirectionPrevention.split(',').map(i=>Number(i))
            }else{
              state.form.supportDirectionPrevention = []
            }
            if(val.supportDirectionEmergency && val.supportDirectionEmergency!==''){
              state.form.supportDirectionEmergency = val.supportDirectionEmergency.split(',').map(i=>Number(i))
            }else{
              state.form.supportDirectionEmergency = []
            }
            state.fileList.push({
              name: state.form.electronicPhoto,
              url: state.form.electronicPhoto,
            })
            if(state.form.resumeKey !== ''){
              state.resumeList = state.form.resumeKey.split(',').map(i=>{
                return {
                  name: i,
                  url: i,
                }
              })
            }
            if(state.form.paperSituationKey !== ''){
              state.inventionList = state.form.paperSituationKey.split(',').map(i=>{
                return {
                  name: i,
                  url: i,
                }
              })
            }
            if(state.form.rewardKey !== ''){
              state.rewardList = state.form.rewardKey.split(',').map(i=>{
                return {
                  name: i,
                  url: i,
                }
              })
            }
            if(state.form.achievementKey !== ''){
              state.achievementList = state.form.achievementKey.split(',').map(i=>{
                return {
                  name: i,
                  url: i,
                }
              })
            }
            if(state.form.personalOpinionKey !== ''){
              state.proAdviceList = state.form.personalOpinionKey.split(',').map(i=>{
                return {
                  name: i,
                  url: i,
                }
              })
            }
            if(state.form.recommendUnitOpinionKey !== ''){
              state.adviceList = state.form.recommendUnitOpinionKey.split(',').map(i=>{
                return {
                  name: i,
                  url: i,
                }
              })
            }
          }
        })
        if(type == 'edit'){
          state.disable = false
          console.log(state.form,'form')
          dialogVisible.value = true
        }else{
          state.disable = true
          ElMessage.warning('数据获取失败:'+res.msg)
        }
      }else{
      })
      if(type == 'edit'){
        state.disable = false
        dialogVisible.value = true
      }else{
        state.disable = true
      }
    }else{
      state.disable = false
      dialogVisible.value = true
    }
  }
  const validKey=(key,obj)=>{
    return key in obj
  }
  const startAssess = async (num)=>{
    if(num == 2){
      state.assessDialog = true
    }else{
      await assess(num)
    }
  }
  const assess = (num)=>{
@@ -567,18 +628,34 @@
          type: 'warning',
        })
        .then(async() => {
          const res = await changeApprove({id:state.form.id,state: num})
          let params = {}
          if(num == 2){
            params = {
              id: state.form.id,
              state: num,
              employmentDateStart: state.assessForm.employTime[0],
              employmentDateEnd: state.assessForm.employTime[1],
              ratingLevel: state.assessForm.ratingLevel
            }
          }else{
            params = {
              id:state.form.id,
              state: num
            }
          }
          const res = await changeApprove(params)
          if(res.code == 200){
            ElMessage({
              type: 'success',
              message: '审批成功'
            });
            emit('getList')
            state.assessDialog = false
            dialogVisible.value = false
          }else{
            ElMessage({
              type: 'warning',
              message: res.message
              message: res.msg
            });
          }
        })
@@ -595,6 +672,12 @@
      });
    }
  }
function getDepList() {
  listOutDept({}).then(response => {
    state.deptList = proxy.handleTree(response.data, "deptId",'parentId','children');
  });
}
  const professionChange=(value)=> {
    console.log(value,'val')
@@ -628,9 +711,9 @@
  const handleAvatarSuccess = (res, uploadFile,type) => {
    if(res.code == 200){
      if(type == '证件照'){
        state.form.electronicPhoto = res.data.path
        state.form.electronicPhoto = res.url
      }else{
        uploadFile.name = res.data.path
        uploadFile.name = res.url
      }
    }else{
      ElMessage({
@@ -641,6 +724,7 @@
  }
  const handleRemove = (file, uploadFiles,type) => {
    console.log(file, uploadFiles)
    if(file && file.status == 'success') {
      ElMessageBox.confirm(
          '该操作将永久删除此文件内容,是否继续?',
@@ -667,7 +751,7 @@
            } else {
              ElMessage({
                type: 'warning',
                message: res.message
                message: res.msg
              })
            }
          })
@@ -683,23 +767,20 @@
        return
      }
      let data = JSON.parse(JSON.stringify(state.form))
      data.supportDirectionSafety = data.supportDirectionSafety.join(',')
      data.supportDirectionPrevention = data.supportDirectionPrevention.join(',')
      data.supportDirectionEmergency = data.supportDirectionEmergency.join(',')
      data.bigClassify = data.profession[0]
      data.smallClassify = data.profession[1]
      data.supportDirectionSafety = Array.isArray(data.supportDirectionSafety)?data.supportDirectionSafety.join(','):''
      data.supportDirectionPrevention = Array.isArray(data.supportDirectionPrevention)?data.supportDirectionPrevention.join(','):''
      data.supportDirectionEmergency = Array.isArray(data.supportDirectionEmergency)?data.supportDirectionEmergency.join(','):''
      data.resumeKey = state.resumeList.map(i=>i.name).join(',')
      data.paperSituationKey = state.inventionList.map(i=>i.name).join(',')
      data.rewardKey = state.rewardList.map(i=>i.name).join(',')
      data.achievementKey = state.achievementList.map(i=>i.name).join(',')
      data.personalOpinionKey = state.proAdviceList.map(i=>i.name).join(',')
      data.recommendUnitOpinionKey = state.adviceList.map(i=>i.name).join(',')
      delete data.profession
      if(state.title == '新增'){
        delete data.id
        const res= await addExpertInfo(data)
        if(res.code == 200){
          ElMessage.success(res.message)
          ElMessage.success(res.msg)
          state.fileList = []
          state.resumeList = []
          state.inventionList = []
@@ -711,12 +792,12 @@
          state.hasDeleteFile = false
          dialogVisible.value = false
        }else{
          ElMessage.warning(res.message)
          ElMessage.warning(res.msg)
        }
      }else{
        const res= await modExpertInfo(data)
        if(res.code == 200){
          ElMessage.success(res.message)
          ElMessage.success(res.msg)
          state.fileList = []
          state.resumeList = []
          state.inventionList = []
@@ -728,13 +809,33 @@
          state.hasDeleteFile = false
          dialogVisible.value = false
        }else{
          ElMessage.warning(res.message)
          ElMessage.warning(res.msg)
        }
      }
    } else {
      ElMessage.warning('请完善必填信息')
    }
  })
}
const assessSubmit = async (formEl)=> {
  if (!formEl) return
  await formEl.validate(async (valid, fields) => {
    if (valid) {
      await assess(2)
    }else {
      ElMessage.warning('请完善必填信息')
    }
    })
}
const closeAssess = ()=>{
  assessFormRef.value.clearValidate()
  state.assessForm = {
    employTime: [],
    ratingLevel: ''
  }
  state.assessDialog = false;
}
const handleClose = () => {
@@ -744,9 +845,8 @@
        id: null,
        name:'',
        sex:'',
        profession: [],
        bigClassify:null,
        smallClassify: null,
        domain: '',
        deptId: null,
        birthday: '',
        phone:'',
        title: '',