马宇豪
2024-12-10 17527437977dc2e2c39c739796e8afd881df35a1
修改
已修改8个文件
350 ■■■■ 文件已修改
src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue 171 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/checkProgress/index.vue 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/fillForm/index.vue 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/postEvaluation/components/evaluate.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/expertManage/postEvaluation/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/projectApproval.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/components/projectArchive.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/safetyReview/projectManage/index.vue 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
src/views/safetyReview/expertManage/checkProgress/index.vue
@@ -7,13 +7,19 @@
      <el-form-item label="手机号:">
        <el-input v-model.trim="queryParams.phone" placeholder="请输入申报时预留的手机号"></el-input>
      </el-form-item>
      <el-form-item label="业务处室:">
      <el-form-item label="专业领域:">
<!--        <el-cascader-->
<!--            clearable-->
<!--            placeholder="请选择申请的业务处室"-->
<!--            v-model="queryParams.deptId"-->
<!--            :options="deptList"-->
<!--            :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',checkStrictly: true,emitPath: false}"></el-cascader>-->
        <el-cascader
            clearable
            placeholder="请选择申请的业务处室"
            v-model="queryParams.deptId"
            :options="deptList"
            :props="{ expandTrigger: 'hover', value: 'deptId',label: 'deptName',checkStrictly: true,emitPath: false}"></el-cascader>
            v-model="queryParams.domain"
            :options="expertsType"
            :props="{ expandTrigger: 'hover',value: 'classifyName',label: 'classifyName',emitPath: false }"
            @change="professionChange"></el-cascader>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" icon="Search" @click="onSubmit(formRef)" v-preReClick>进度查询</el-button>
@@ -42,7 +48,7 @@
import {ElMessage, ElMessageBox} from "element-plus"
import {verifyPhone, verifyIdCard} from "../../../../utils/validate"
import { getToken } from "@/utils/auth"
import {getExpertsList, queryApprove} from "@/api/form";
import {getExpertsList, getExpertTypes, queryApprove} from "@/api/form";
import {listOutDept} from "@/api/system/dept";
const { proxy } = getCurrentInstance();
const router = useRouter()
@@ -73,19 +79,21 @@
  queryParams: {
    idCard: '',
    phone: '',
    deptId: null
    domain: ''
  },
  expertsType: [],
  formRules:{
  },
  result: {}
})
const {queryParams,formRules,result} = toRefs(data)
const {queryParams,expertsType,formRules,result} = toRefs(data)
const deptList = ref([]);
onMounted(()=>{
  getDepList()
})
const showProgress = ref(false)
const formRef = ref()
@@ -96,9 +104,23 @@
}
onMounted(()=>{
  getExpertsType()
})
const getExpertsType = async ()=>{
  const res = await getExpertTypes()
  if(res.code == 200){
    data.expertsType = res.data
  }else{
    ElMessage({
      type: 'warning',
      message: res.msg
    })
  }
}
const professionChange=(value)=> {
  console.log(value,'val')
}
const onSubmit = async (formEl)=> {
  if (!formEl) return
  await formEl.validate(async (valid, fields) => {
@@ -133,7 +155,7 @@
  data.queryParams = {
    idCard: '',
    phone: '',
    deptId: null
    domain: ''
  }
  showProgress.value = false
}
src/views/safetyReview/expertManage/fillForm/index.vue
@@ -5,13 +5,14 @@
            <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
                        style="width: 100%"
                        clearable
                        v-model="state.form.domain"
                        :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>
@@ -395,6 +396,9 @@
  form:{
    name:'',
    sex:'',
    profession: [],
    bigClassify: null,
    smallClassify: null,
    domain: '',
    deptId: null,
    birthday: '',
@@ -467,7 +471,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' }],
@@ -500,17 +504,34 @@
    }
  }
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;
}
  function getDepList() {
    listOutDept({}).then(response => {
      state.deptList = proxy.handleTree(response.data, "deptId",'parentId','children');
    });
  }
  const professionChange=(value)=> {
    console.log(value,'val')
  }
  // 图片上传
  const showTip =()=>{
@@ -588,6 +609,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(','):''
@@ -598,6 +622,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
      delete data.id
      const res= await addExpertInfo(data)
      if(res.code == 200){
@@ -605,6 +630,9 @@
        state.form = {
          name:'',
          sex:'',
          profession: [],
          bigClassify: null,
          smallClassify: null,
          domain: '',
          birthday: '',
          phone:'',
src/views/safetyReview/expertManage/postEvaluation/components/evaluate.vue
@@ -150,14 +150,7 @@
        <el-row>
          <el-col :span="12">
            <el-form-item label="计费标准" prop="freightBasis">
              <el-input v-model.trim="state.form.freightBasis" :readonly="state.disable"><template #append>天/课时</template></el-input>
<!--              <el-select v-model="state.form.freightBasis" placeholder="计费标准" clearable>-->
<!--                <el-option :key="0" label="前三天600/天" :value="600"/>-->
<!--                <el-option :key="1" label="前三天800/天" :value="800"/>-->
<!--                <el-option :key="1" label="前三天1000/天" :value="1000"/>-->
<!--                <el-option :key="2" label="前三天1200/天" :value="1200"/>-->
<!--                <el-option :key="2" label="前三天1500/天" :value="1500"/>-->
<!--              </el-select>-->
              <el-input v-model.number.trim="state.form.freightBasis" :readonly="state.disable" @input="getExpertFee"><template #append>天/课时</template></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
@@ -169,7 +162,7 @@
        <el-row>
          <el-col :span="12">
            <el-form-item label="计费时长" prop="billingDuration">
              <el-input v-model.number.trim="state.form.billingDuration" type="number" :readonly="state.disable"><template #append>天/课时</template></el-input>
              <el-input v-model.number.trim="state.form.billingDuration" type="number" :readonly="state.disable" @input="getExpertFee"><template #append>天/课时</template></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
@@ -179,17 +172,17 @@
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="8">
            <el-form-item label="应纳税所得额">
              <el-input v-model.trim="taxIncome" type="number" readonly><template #append>元</template></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
            <el-form-item label="应缴个税">
<!--          <el-col :span="8">-->
<!--            <el-form-item label="应纳税所得额">-->
<!--              <el-input v-model.trim="taxIncome" type="number" readonly><template #append>元</template></el-input>-->
<!--            </el-form-item>-->
<!--          </el-col>-->
          <el-col :span="12">
            <el-form-item label="应缴税费">
              <el-input v-model.trim="taxPay" type="number" readonly><template #append>元</template></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="8">
          <el-col :span="12">
            <el-form-item label="税后金额">
              <el-input v-model="afterTaxIncome" type="number" readonly><template #append>元</template></el-input>
            </el-form-item>
@@ -345,6 +338,12 @@
  }
})
const getExpertFee = ()=>{
  if((state.form.freightBasis && state.form.freightBasis > 0) && (state.form.billingDuration && state.form.billingDuration > 0)){
    state.form.taxExpertFee = state.form.freightBasis * state.form.billingDuration
  }
}
const taxIncome = computed(()=>{
  const expertIncomeValue = state.form.taxExpertFee
  if (expertIncomeValue == null || expertIncomeValue === 0 || expertIncomeValue <= 800) {
@@ -358,26 +357,36 @@
})
const taxPay = computed(()=>{
  const taxIncomeValue = taxIncome.value
  if (taxIncomeValue == null || taxIncomeValue === 0) {
  // const taxIncomeValue = taxIncome.value
  // if (taxIncomeValue == null || taxIncomeValue === 0) {
  //   return 0
  // }
  // if (taxIncomeValue <= 20000) {
  //   return taxIncomeValue * 0.2
  // } else if (taxIncomeValue <= 50000) {
  //   return taxIncomeValue * 0.3 - 2000
  // } else {
  //   return taxIncomeValue * 0.4 - 7000
  // }
  const expertIncomeValue = state.form.taxExpertFee
  if(expertIncomeValue == null || expertIncomeValue === 0 || expertIncomeValue <= 800){
    return 0
  }
  if (taxIncomeValue <= 20000) {
    return taxIncomeValue * 0.2;
  } else if (taxIncomeValue <= 50000) {
    return taxIncomeValue * 0.3 - 2000;
  if(expertIncomeValue / 1.01 - 800>0){
    return ((expertIncomeValue / 1.01 - 800) * 0.2).toFixed(2)
  } else {
    return taxIncomeValue * 0.4 - 7000;
    return 0
  }
})
const afterTaxIncome = computed(()=>{
  const expertIncomeValue = state.form.taxExpertFee
  const taxPayValue = taxPay.value
  if ((expertIncomeValue == null || expertIncomeValue == 0)|| (taxPayValue == null || taxPayValue == 0)) {
  if (expertIncomeValue == null || expertIncomeValue == 0) {
    return 0
  }
  return expertIncomeValue - taxPayValue;
  return (expertIncomeValue - taxPayValue).toFixed(2)
})
const openDialog = async (type, value, projectName, projectCheckTime) => {
src/views/safetyReview/expertManage/postEvaluation/index.vue
@@ -50,7 +50,7 @@
        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
          <template #default="scope">
            <el-button type="primary" v-if="scope.row.evaluationState == 0" link @click="openDialog('edit',scope.row)">开始评估</el-button>
            <el-button type="primary" v-if="scope.row.evaluationState == 1" link @click="openDialog('edit',scope.row)">修改评估</el-button>
            <el-button type="primary" v-if="scope.row.evaluationState == 1" link @click="openDialog('edit',scope.row)">查看</el-button>
          </template>
        </el-table-column>
      </el-table>
src/views/safetyReview/projectManage/components/projectApproval.vue
@@ -86,7 +86,7 @@
          <el-upload  :disabled="projectType==='view' || isView" accept=".pdf" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='1' v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)">
            <el-button type="primary">上传附件PDF</el-button>
            <template #tip>
              <div class="el-upload__tip">上传文件尺寸小于5M,最多可上传1份</div>
              <div class="el-upload__tip">上传文件尺寸小于15M,最多可上传1份</div>
            </template>
          </el-upload>
        </div>
@@ -352,10 +352,10 @@
}
const picSize = async (rawFile) => {
  if(rawFile.size / 1024 / 1024 > 5){
  if(rawFile.size / 1024 / 1024 > 15){
    ElMessage({
      type: 'warning',
      message: '文件大小不能超过5M'
      message: '文件大小不能超过15M'
    });
    return false
  }
src/views/safetyReview/projectManage/components/projectArchive.vue
@@ -35,7 +35,7 @@
            :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)">
          <el-button type="primary">上传附件PDF</el-button>
          <template #tip>
            <div class="el-upload__tip">上传文件尺寸小于5M,最多可上传1份</div>
            <div class="el-upload__tip">上传文件尺寸小于15M,最多可上传1份</div>
          </template>
        </el-upload>
      </el-form-item>
@@ -181,10 +181,10 @@
}
const picSize = async (rawFile) => {
  if(rawFile.size / 1024 / 1024 > 5){
  if(rawFile.size / 1024 / 1024 > 15){
    ElMessage({
      type: 'warning',
      message: '文件大小不能超过5M'
      message: '文件大小不能超过15M'
    });
    return false
  }
src/views/safetyReview/projectManage/index.vue
@@ -297,21 +297,21 @@
    const title = [["自治区应急管理厅外聘专家劳务费发放表"]]
    // 固定一行:填报处室和单位
    const fixedHeader = [
      ["填报处室:" + row.deptName, "", "", "", "", "单位:元", "", "", "", "","","",""]
      ["填报处室:" + row.deptName, "", "", "", "", "单位:元", "", "", "", "","",""]
    ]
    if(res.data && res.data[0] && Array.isArray(res.data[0].projectExpertExportResps) && res.data[0].projectExpertExportResps.length>0){
      let mainData = res.data[0].projectExpertExportResps
      const data = mainData.map((item,index)=>{
        return [index+1,item.name,item.companyName,item.title,item.idCard,item.freightBasis,item.billingDuration,item.taxExpertFee,item.taxableIncome,item.incomeTaxPayable,item.afterTaxAmount,item.openBank,item.bankCard]
        return [index+1,item.name,item.companyName,item.title,item.idCard,item.freightBasis,item.billingDuration,item.taxExpertFee,item.incomeTaxPayable,item.afterTaxAmount,item.openBank,item.bankCard]
      })
      // 定义表头
      const headers = [
        ["序号", "姓名", "工作单位", "职称", "身份证号", "计费标准", "计费时长", "专家费", "应纳税所得额", "应缴个税", "税后金额", "开户银行", "卡号"]
        ["序号", "姓名", "工作单位", "职称", "身份证号", "计费标准", "计费时长", "专家费", "应缴税费", "税后金额", "开户银行", "卡号"]
      ]
      // 固定一行:经办人和负责人
      const footer = [
        ["经办人:", "", "", "", "", "处室负责人:", "", "", "", "","","",""]
        ["经办人:", "", "", "", "", "处室负责人:", "", "", "", "","",""]
      ]
      // 创建工作表
      const ws = XLSX.utils.aoa_to_sheet([
@@ -325,11 +325,11 @@
      const dataRowCount = data.length;
      // 合并单元格的范围
      ws['!merges'] = [
        { s: { r: 0, c: 0 }, e: { r: 0, c: 12 } },  // 合并标题:第1行 0列到12列
        { s: { r: 0, c: 0 }, e: { r: 0, c: 11 } },  // 合并标题:第1行 0列到12列
        { s: { r: 1, c: 0 }, e: { r: 1, c: 4 } },  // 合并填报处室:第2行 第0列到4列
        { s: { r: 1, c: 5 }, e: { r: 1, c: 12 } },  // 合并单位:第2行 第5列到12列
        { s: { r: 1, c: 5 }, e: { r: 1, c: 11 } },  // 合并单位:第2行 第5列到12列
        { s: { r: 3 + dataRowCount, c: 0 }, e: { r: 3 + dataRowCount, c: 4 } },  // 合并经办人:最后一行的第0列到4列
        { s: { r: 3 + dataRowCount, c: 5 }, e: { r: 3 + dataRowCount, c: 12 } },  // 合并负责人:最后一行的第5列到12列
        { s: { r: 3 + dataRowCount, c: 5 }, e: { r: 3 + dataRowCount, c: 11 } },  // 合并负责人:最后一行的第5列到12列
      ]
      // 设置标题
      if (!ws['A1']) ws['A1'] = {}; // 确保 A1 单元格存在