马宇豪
2024-12-10 17527437977dc2e2c39c739796e8afd881df35a1
src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue
@@ -10,13 +10,21 @@
            <el-form :model="state.form" :rules="state.rules" ref="ruleFormRef" label-width="200px">
              <el-row>
                <el-col :span="20">
                  <el-form-item label="专业类别" prop="domain">
              <el-form-item label="专业类别" prop="profession">
<!--                <el-cascader-->
<!--                    :disabled="state.disable"-->
<!--                    style="width: 100%"-->
<!--                    v-model="state.form.domain"-->
<!--                    :options="state.expertsType"-->
<!--                    :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false}"-->
<!--                    @change="professionChange"></el-cascader>-->
                    <el-cascader
                        :disabled="state.disable"
                        style="width: 100%"
                        v-model="state.form.domain"
                    clearable
                    :disabled="state.disable"
                    v-model="state.form.profession"
                        :options="state.expertsType"
                        :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false }"
                    :props="{ expandTrigger: 'hover', value: 'id',label: 'classifyName'}"
                        @change="professionChange"></el-cascader>
                  </el-form-item>
                </el-col>
@@ -27,6 +35,7 @@
                    <el-cascader
                        style="width: 100%"
                        clearable
                    :disabled="state.disable"
                        v-model="state.form.deptId"
                        :options="state.deptList"
                        :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',emitPath: false}"></el-cascader>
@@ -88,8 +97,16 @@
              <el-row>
                <el-col :span="20">
                  <el-form-item label="职称或资质证明材料" prop="evidence">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'著作')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.evidenceList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证明')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post"
                           :disabled="state.disable"
                           :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'著作')"
                           :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8'
                           v-model:file-list="state.evidenceList" list-type="picture-card" :before-upload="picSize"
                           :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证明')"
                           :before-remove="beforeRemove">
                  <el-icon>
                    <Plus/>
                  </el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
@@ -100,8 +117,15 @@
              <el-row>
                <el-col :span="20">
                  <el-form-item label="2寸免冠证件照">
                    <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" :disabled="state.disable" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'证件照')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证件照')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                <el-upload accept="image/*" :action="state.uploadUrl" :headers="state.header" :disabled="state.disable"
                           method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'证件照')"
                           :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1'
                           v-model:file-list="state.fileList" list-type="picture-card" :before-upload="picSize"
                           :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证件照')"
                           :before-remove="beforeRemove">
                  <el-icon>
                    <Plus/>
                  </el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传1张</div>
                      </template>
@@ -210,7 +234,10 @@
                    <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
                    <!--              </el-radio-group>-->
                    <el-checkbox-group v-model="state.form.supportDirectionSafety" :disabled="state.disable">
                      <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{ item.label }}</el-checkbox>
                  <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{
                      item.label
                    }}
                  </el-checkbox>
                    </el-checkbox-group>
                  </el-form-item>
                </el-col>
@@ -222,7 +249,10 @@
                    <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
                    <!--              </el-radio-group>-->
                    <el-checkbox-group v-model="state.form.supportDirectionPrevention" :disabled="state.disable">
                      <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{ item.label }}</el-checkbox>
                  <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{
                      item.label
                    }}
                  </el-checkbox>
                    </el-checkbox-group>
                  </el-form-item>
                </el-col>
@@ -234,7 +264,10 @@
                    <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
                    <!--              </el-radio-group>-->
                    <el-checkbox-group v-model="state.form.supportDirectionEmergency" :disabled="state.disable">
                      <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{ item.label }}</el-checkbox>
                  <el-checkbox v-for="item in state.directionList" :label="item.value" :key="item.value">{{
                      item.label
                    }}
                  </el-checkbox>
                    </el-checkbox-group>
                  </el-form-item>
                </el-col>
@@ -242,7 +275,12 @@
              <el-row>
                <el-col :span="20">
                  <el-form-item label="工作简历" prop="resumeKey">
                    <el-upload accept=".pdf" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'简历')" :on-exceed="showTip" :limit='8' v-model:file-list="state.resumeList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'简历')" :before-remove="beforeRemove">
                <el-upload accept=".pdf" multiple :action="state.uploadUrl" :headers="state.header" method="post"
                           :disabled="state.disable"
                           :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'简历')"
                           :on-exceed="showTip" :limit='8' v-model:file-list="state.resumeList" :before-upload="picSize"
                           :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'简历')"
                           :before-remove="beforeRemove">
                      <el-button type="primary">点击上传</el-button>
                      <template #tip>
                        <div class="el-upload__tip">上传pdf格式文件尺寸小于5M,最多可上传5份</div>
@@ -254,8 +292,16 @@
              <el-row>
                <el-col :span="20">
                  <el-form-item label="发明、著作、学术论文情况(何时、何地出版或发表)">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'著作')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.inventionList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'著作')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post"
                           :disabled="state.disable"
                           :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'著作')"
                           :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8'
                           v-model:file-list="state.inventionList" list-type="picture-card" :before-upload="picSize"
                           :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'著作')"
                           :before-remove="beforeRemove">
                  <el-icon>
                    <Plus/>
                  </el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
@@ -266,8 +312,16 @@
              <el-row>
                <el-col :span="20">
                  <el-form-item label="受过何种奖励">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'奖励')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.rewardList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'奖励')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post"
                           :disabled="state.disable"
                           :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'奖励')"
                           :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8'
                           v-model:file-list="state.rewardList" list-type="picture-card" :before-upload="picSize"
                           :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'奖励')"
                           :before-remove="beforeRemove">
                  <el-icon>
                    <Plus/>
                  </el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
@@ -278,8 +332,16 @@
              <el-row>
                <el-col :span="20">
                  <el-form-item label="应急管理相关工作主要业绩及研究成果">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'研究')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.achievementList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'研究')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post"
                           :disabled="state.disable"
                           :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'研究')"
                           :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8'
                           v-model:file-list="state.achievementList" list-type="picture-card" :before-upload="picSize"
                           :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'研究')"
                           :before-remove="beforeRemove">
                  <el-icon>
                    <Plus/>
                  </el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
@@ -290,8 +352,16 @@
              <el-row>
                <el-col :span="20">
                  <el-form-item label="专家本人意见" prop="recommendUnitOpinionKey">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'本人')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.proAdviceList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'本人')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post"
                           :disabled="state.disable"
                           :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'本人')"
                           :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8'
                           v-model:file-list="state.proAdviceList" list-type="picture-card" :before-upload="picSize"
                           :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'本人')"
                           :before-remove="beforeRemove">
                  <el-icon>
                    <Plus/>
                  </el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
@@ -302,8 +372,16 @@
              <el-row>
                <el-col :span="20">
                  <el-form-item label="推荐单位意见" prop="recommendUnitOpinionKey">
                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :disabled="state.disable" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'单位')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.adviceList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'单位')" :before-remove="beforeRemove">
                      <el-icon><Plus /></el-icon>
                <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post"
                           :disabled="state.disable"
                           :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'单位')"
                           :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8'
                           v-model:file-list="state.adviceList" list-type="picture-card" :before-upload="picSize"
                           :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'单位')"
                           :before-remove="beforeRemove">
                  <el-icon>
                    <Plus/>
                  </el-icon>
                      <template #tip>
                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
                      </template>
@@ -314,7 +392,8 @@
              <el-row>
                <el-col :span="20">
                  <el-form-item label="补充说明">
                    <el-input v-model="state.form.remark" type="textarea" :autosize="{ minRows: 2}" :readonly="state.disable"></el-input>
                <el-input v-model="state.form.remark" type="textarea" :autosize="{ minRows: 2}"
                          :readonly="state.disable"></el-input>
                  </el-form-item>
                </el-col>
              </el-row>
@@ -377,7 +456,8 @@
              <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>
                  <el-button type="primary" @click="assessSubmit(assessFormRef)" size="default"
                             v-preReClick>确认</el-button>
                </span>
              </template>
            </el-dialog>
@@ -404,6 +484,7 @@
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)
@@ -471,6 +552,9 @@
    id: null,
    name:'',
    sex:'',
    profession: [],
    bigClassify: null,
    smallClassify: null,
    domain: '',
    deptId: null,
    birthday: '',
@@ -549,7 +633,7 @@
  rules:{
    name:[{ required: true, message: '请填写姓名', trigger: 'blur' }],
    sex:[{ required: true, message: '请选择性别', trigger: 'blur' }],
    domain: [{ required: true, message: '请选择专业类别', trigger: 'blur' }],
    profession: [{required: true, message: '请选择专业类别', trigger: 'blur'}],
    deptId: [{ required: true, message: '请选择业务处室', trigger: 'blur' }],
    birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }],
    phone:[{ required: true, validator: validatePhone, trigger: 'blur' }],
@@ -572,6 +656,29 @@
  onMounted(()=>{
  })
const professionChange = (value) => {
  if (!value) {
    state.form.profession = []
    state.form.bigClassify = null
    state.form.smallClassify = null
  }
}
const findNodeById = (data,value)=> {
  for (const node of data) {
    if (node.id === value) {
      return node.classifyName;
    }
    if (node.children) {
      const foundNode = findNodeById(node.children, value);
      if (foundNode) {
        return foundNode;
      }
    }
  }
  return null;
}
  const openDialog = (type, value) => {
    state.title = type === 'add' ? '新增' : type ==='edit' ? '编辑' : type ==='view' ?'查看':'评定'
    getExpertsType()
@@ -587,6 +694,7 @@
                state.form[i] = val[i]
              }
            }
          state.form.profession = [val.bigClassify,val.smallClassify]
            if(val.supportDirectionSafety && val.supportDirectionSafety!==''){
              state.form.supportDirectionSafety = val.supportDirectionSafety.split(',').map(i=>Number(i))
            }else{
@@ -764,11 +872,6 @@
  });
}
  const professionChange=(value)=> {
    console.log(value,'val')
  }
  // 图片上传
  const showTip =()=>{
@@ -848,6 +951,9 @@
  await formEl.validate(async (valid, fields) => {
    if (valid) {
      let data = JSON.parse(JSON.stringify(state.form))
      data.bigClassify = data.profession[0]
      data.smallClassify = data.profession[1]
      data.domain = findNodeById(state.expertsType,data.smallClassify)
      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(','):''
@@ -858,6 +964,7 @@
      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)
@@ -929,6 +1036,9 @@
        id: null,
        name:'',
        sex:'',
      profession: [],
      bigClassify: null,
      smallClassify: null,
        domain: '',
        deptId: null,
        birthday: '',
@@ -987,6 +1097,7 @@
    :deep(.el-form .el-form-item__label) {
        font-size: 15px;
    }
    .file {
        display: flex;
        flex-direction: column;