From 1da948c1c8808077f10e3aa32fafd30939ee5c12 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期二, 03 十二月 2024 16:37:39 +0800
Subject: [PATCH] 新增

---
 src/views/safetyReview/expertManage/applyRecords/index.vue                       |    4 
 src/views/safetyReview/expertManage/postEvaluation/components/evaluate.vue       |  319 +++++++++++++++++++-------
 src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue       |   97 ++++++-
 src/views/safetyReview/projectManage/components/exportWord.js                    |    4 
 src/api/backManage/evaluate.js                                                   |    2 
 src/views/safetyReview/expertManage/fillForm/index.vue                           |   87 +++++-
 src/views/safetyReview/expertManage/experts/index.vue                            |   99 +++++++
 src/views/safetyReview/expertManage/postEvaluation/components/expertList.vue     |   60 ++++
 public/evaluateFile.docx                                                         |    0 
 src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue |    2 
 src/api/form.js                                                                  |   20 +
 src/views/safetyReview/expertManage/postEvaluation/index.vue                     |    2 
 src/views/safetyReview/projectManage/components/projectApproval.vue              |    4 
 13 files changed, 549 insertions(+), 151 deletions(-)

diff --git a/public/evaluateFile.docx b/public/evaluateFile.docx
new file mode 100644
index 0000000..8b1f70a
--- /dev/null
+++ b/public/evaluateFile.docx
Binary files differ
diff --git a/src/api/backManage/evaluate.js b/src/api/backManage/evaluate.js
index 88ad7a2..27f094f 100644
--- a/src/api/backManage/evaluate.js
+++ b/src/api/backManage/evaluate.js
@@ -119,7 +119,7 @@
 
 export function getExpertEvaDetail(params) {
     return request({
-        url: '/system/management/selectProjectExpertDetailList',
+        url: '/system/management/selectProjectExpertDetail',
         method: 'get',
         params: params
     })
diff --git a/src/api/form.js b/src/api/form.js
index e4f2475..8bae826 100644
--- a/src/api/form.js
+++ b/src/api/form.js
@@ -9,7 +9,16 @@
   })
 }
 
-// 获取专家列表
+// 获取专家列表(限制处室)
+export function getExpertsPerList(params) {
+  return request({
+    url: '/system/expert_info/perList',
+    method: 'get',
+    params: params
+  })
+}
+
+// 删除专家
 export function delExpert(id) {
   return request({
     url: '/system/expert_info/del/'+id,
@@ -102,4 +111,13 @@
     method: 'post',
     data: data
   })
+}
+
+// 统一修改有效期
+export function changeEmploymentDate(data) {
+  return request({
+    url: '/system/expert_info/batchChangeEmploymentDate',
+    method: 'post',
+    data: data
+  })
 }
\ No newline at end of file
diff --git a/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue b/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue
index a2de155..646a7db 100644
--- a/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue
+++ b/src/views/safetyReview/expertManage/applyRecords/components/expertForm.vue
@@ -6,8 +6,6 @@
             width="80%"
             :before-close="handleClose"
         >
-          <div class="main-title">专家信息录入</div>
-          <!--    <el-divider>专家信息录入</el-divider>-->
           <div class="main_form">
             <el-form :model="state.form" :rules="state.rules" ref="ruleFormRef" label-width="200px">
               <el-row>
@@ -89,7 +87,19 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="证件照" prop="electronicPhoto">
+                  <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>
+                      <template #tip>
+                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
+                      </template>
+                    </el-upload>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <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>
                       <template #tip>
@@ -195,7 +205,7 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="支撑方向_安全生产" prop="supportDirectionSafety">
+                  <el-form-item label="支撑方向_安全生产" prop="supportDirectionEmergency">
                     <!--              <el-radio-group v-model="form.supportDirectionSafety">-->
                     <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
                     <!--              </el-radio-group>-->
@@ -207,7 +217,7 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="支撑方向_防灾减灾救灾" prop="supportDirectionPrevention">
+                  <el-form-item label="支撑方向_防灾减灾救灾" prop="supportDirectionEmergency">
                     <!--              <el-radio-group v-model="form.supportDirectionPrevention">-->
                     <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
                     <!--              </el-radio-group>-->
@@ -231,11 +241,11 @@
               </el-row>
               <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.resumeList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'简历')" :before-remove="beforeRemove">
-                      <el-icon><Plus /></el-icon>
+                  <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-button type="primary">点击上传</el-button>
                       <template #tip>
-                        <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
+                        <div class="el-upload__tip">上传pdf格式文件尺寸小于5M,最多可上传5份</div>
                       </template>
                     </el-upload>
                   </el-form-item>
@@ -279,7 +289,7 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="专家本人意见">
+                  <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>
                       <template #tip>
@@ -291,7 +301,7 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="推荐单位意见">
+                  <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>
                       <template #tip>
@@ -400,13 +410,38 @@
 const ruleFormRef = ref()
 const assessFormRef = ref()
 const { proxy } = getCurrentInstance()
-var validatePass = (rule, value, callback) => {
-  if (state.fileList.length == 0) {
-    callback(new Error('请上传证件照'));
+let validatePass = (rule, value, callback) => {
+  if (state.resumeList.length == 0) {
+    callback(new Error('请上传工作简历'));
   } else {
     callback();
   }
 }
+
+let validateEvidence = (rule, value, callback) => {
+  if (state.evidenceList.length == 0) {
+    callback(new Error('请上传证明材料'));
+  } else {
+    callback();
+  }
+}
+
+let validateOneOfTwo = (rule, value, callback) => {
+  if (state.proAdviceList.length == 0 && state.adviceList.length == 0) {
+    callback(new Error('专家本人意见和推荐单位意见须至少上传一项'));
+  } else {
+    callback();
+  }
+}
+
+let validateOneOfThree = (rule, value, callback) => {
+  if (state.form.supportDirectionSafety.length==0&&state.form.supportDirectionSafety.length==0&&state.form.supportDirectionSafety.length==0) {
+    callback(new Error('请至少从三种支撑方向中勾选一种'));
+  } else {
+    callback();
+  }
+}
+
 let validatePhone = (rule, value, callback)=>{
   if(value === ''){
     callback(new Error('请输入手机号'))
@@ -458,6 +493,7 @@
     supportDirectionSafety: [],
     supportDirectionPrevention: [],
     supportDirectionEmergency: [],
+    evidence: '',
     resumeKey: '',
     paperSituationKey: '',
     rewardKey: '',
@@ -502,6 +538,7 @@
     Authorization: 'Bearer ' + getToken()
   },
   fileList: [],
+  evidenceList: [],
   resumeList: [],
   inventionList: [],
   rewardList: [],
@@ -517,8 +554,11 @@
     birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }],
     phone:[{ required: true, validator: validatePhone, trigger: 'blur' }],
     title: [{ required: true, message: '请填写职称', trigger: 'blur' }],
-    electronicPhoto: [{ required: true,validator: validatePass, trigger: 'blur' }],
+    evidence: [{ required: true,validator: validateEvidence, trigger: 'blur' }],
+    resumeKey: [{ required: true,validator: validatePass, trigger: 'blur' }],
+    recommendUnitOpinionKey: [{ required: true,validator: validateOneOfTwo, trigger: 'blur' }],
     idCard: [{ required: true, validator: verifyId, trigger: 'blur' }],
+    supportDirectionEmergency: [{ required: true,validator: validateOneOfThree, trigger: 'blur' }],
     dutyStatus: [{ required: true, message: '请选择在岗情况', trigger: 'blur' }],
     companyName: [{ required: true, message: '请填写单位全称', trigger: 'blur' }],
     degree: [{ required: true, message: '请填写最高学历', trigger: 'blur' }]
@@ -562,12 +602,22 @@
             }else{
               state.form.supportDirectionEmergency = []
             }
-            state.fileList.push({
-              name: state.form.electronicPhoto,
-              url: state.form.electronicPhoto,
-            })
+            if(state.form.electronicPhoto!== ''){
+              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.evidence !== ''){
+              state.evidenceList = state.form.evidence.split(',').map(i=>{
                 return {
                   name: i,
                   url: i,
@@ -797,14 +847,11 @@
   if (!formEl) return
   await formEl.validate(async (valid, fields) => {
     if (valid) {
-      if(state.form.supportDirectionSafety.length==0&&state.form.supportDirectionSafety.length==0&&state.form.supportDirectionSafety.length==0){
-        ElMessage.warning('请至少选择一种支撑方向')
-        return
-      }
       let data = JSON.parse(JSON.stringify(state.form))
       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.evidence = state.evidenceList.map(i=>i.name).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(',')
@@ -817,6 +864,7 @@
         if(res.code == 200){
           ElMessage.success(res.msg)
           state.fileList = []
+          state.evidenceList = []
           state.resumeList = []
           state.inventionList = []
           state.rewardList = []
@@ -834,6 +882,7 @@
         if(res.code == 200){
           ElMessage.success(res.msg)
           state.fileList = []
+          state.evidenceList = []
           state.resumeList = []
           state.inventionList = []
           state.rewardList = []
@@ -902,6 +951,7 @@
         supportDirectionSafety: [],
         supportDirectionPrevention: [],
         supportDirectionEmergency: [],
+        evidence: '',
         resumeKey: '',
         paperSituationKey: '',
         rewardKey: '',
@@ -912,6 +962,7 @@
         source: 2
       }
       state.fileList = []
+      state.evidenceList = []
       state.resumeList = []
       state.inventionList = []
       state.rewardList = []
diff --git a/src/views/safetyReview/expertManage/applyRecords/index.vue b/src/views/safetyReview/expertManage/applyRecords/index.vue
index e5e8cd6..ceef8b8 100644
--- a/src/views/safetyReview/expertManage/applyRecords/index.vue
+++ b/src/views/safetyReview/expertManage/applyRecords/index.vue
@@ -100,7 +100,7 @@
 import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
 import {ElMessage, ElMessageBox} from "element-plus";
 import ExpertForm from "./components/expertForm";
-import {delExpert, getExpertsList, getExpertTypes} from "../../../../api/form";
+import {delExpert, getExpertsList, getExpertsPerList, getExpertTypes} from "../../../../api/form";
 import { Plus } from '@element-plus/icons-vue'
 
 const loading = ref(false);
@@ -184,7 +184,7 @@
 
 const getList = async () => {
   loading.value = true;
-  const res = await getExpertsList(data.queryParams)
+  const res = await getExpertsPerList(data.queryParams)
   if(res.code == 200){
     data.expertList = res.rows
     data.total = res.total
diff --git a/src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue b/src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue
index 09328b7..a5ce1ee 100644
--- a/src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue
+++ b/src/views/safetyReview/expertManage/evaluateRecord/components/evaluateDetail.vue
@@ -75,7 +75,7 @@
         }
         const res = await getExpertEvaDetail(param);
         if(res.code === 200){
-            state.form.tableData = res.data
+            state.form.tableData = res.data.expertDetails
         }else{
             ElMessage.warning(res.msg)
         }
diff --git a/src/views/safetyReview/expertManage/experts/index.vue b/src/views/safetyReview/expertManage/experts/index.vue
index d66a7ac..c3c9aa3 100644
--- a/src/views/safetyReview/expertManage/experts/index.vue
+++ b/src/views/safetyReview/expertManage/experts/index.vue
@@ -42,10 +42,12 @@
         <el-form-item>
           <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
           <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+          <el-button icon="Edit" @click="openSetDate">一键设置有效期</el-button>
         </el-form-item>
       </el-form>
-      <el-table v-loading="loading" :data="expertList" :border="true">
-        <el-table-column type="index" width="55" align="center" />
+      <el-table v-loading="loading" ref="multipleTableRef" :data="expertList" :border="true" @selection-change="handleSelectionChange" :row-key="(row) => { return row.id }">
+        <el-table-column type="selection" width="55" :reserve-selection="true"/>
+        <el-table-column type="index" width="55" align="center" label="序号"/>
         <el-table-column label="姓名" align="center" prop="name" />
         <el-table-column label="身份证号" align="center" prop="idCard" />
         <el-table-column label="出生日期" align="center" prop="birthday">
@@ -94,6 +96,7 @@
         </el-table-column>
         <el-table-column label="操作" align="center" fixed="right" class-name="small-padding fixed-width">
           <template #default="scope">
+            <el-button type="primary" link @click="openDialog('edit',scope.row)">编辑</el-button>
             <el-button type="primary" link @click="openDialog('view',scope.row)">查看</el-button>
           </template>
         </el-table-column>
@@ -105,6 +108,31 @@
           v-model:limit="queryParams.pageSize"
           @pagination="getList"
       />
+      <el-dialog
+          v-model="assessDialog"
+          title="修改有效期"
+          width="50%"
+          :before-close="closeAssess"
+      >
+        <el-form :model="assessForm" :rules="assessRules" ref="assessFormRef" label-width="200px">
+          <el-form-item label="专家聘用期限" prop="employTime">
+            <el-date-picker
+                v-model="assessForm.employTime"
+                type="daterange"
+                range-separator="至"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="YYYY-MM-DD"
+            />
+          </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>
       <expert-form ref="expertFormRef" @getList="getList"></expert-form>
     </div>
 </template>
@@ -113,10 +141,11 @@
 import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
 import {ElMessage, ElMessageBox} from "element-plus";
 import ExpertForm from "../applyRecords/components/expertForm";
-import {delExpert, getExpertsList, getExpertTypes} from "../../../../api/form";
+import {changeApprove, changeEmploymentDate, delExpert, getExpertsList, getExpertTypes} from "../../../../api/form";
 import {useRouter} from "vue-router";
 const router = useRouter();
-const loading = ref(false);
+const loading = ref(false)
+
 const data = reactive({
   showSearch: true,
   total: 0,
@@ -159,10 +188,20 @@
       label: '其他'
     }
   ],
+  multipleSelection: [],
+  assessDialog: false,
+  assessForm: {
+    employTime: []
+  },
+  assessRules: {
+    employTime:[{ required: true, message: '请选择有效期', trigger: 'blur' }],
+  }
 });
 
-const { showSearch,total, expertTypes,expertList,queryParams,classiFy,searchTime} = toRefs(data);
+const { showSearch,total, expertTypes,expertList,queryParams,searchTime,assessForm,assessDialog,assessRules,multipleSelection} = toRefs(data);
 const expertFormRef = ref()
+const assessFormRef = ref()
+const multipleTableRef = ref()
 onMounted(()=>{
   getList()
   getTypes()
@@ -171,6 +210,10 @@
 onUnmounted(()=>{
 
 })
+
+const handleSelectionChange = (val) => {
+  data.multipleSelection = val
+}
 
 const getTypes = async()=> {
   const res = await getExpertTypes()
@@ -269,6 +312,52 @@
   expertFormRef.value.openDialog(type, value);
 }
 
+const openSetDate = ()=>{
+  if(data.multipleSelection.length>0){
+    data.assessDialog = true
+  }else{
+    ElMessage.warning('请选择要设置的人员')
+  }
+}
+
+const assessSubmit = async (formEl)=> {
+  if (!formEl) return
+  await formEl.validate(async (valid, fields) => {
+    if (valid) {
+      let params = {
+        id: data.multipleSelection.map(i=>i.id),
+        employmentDateStart: data.assessForm.employTime[0],
+        employmentDateEnd: data.assessForm.employTime[1]
+      }
+      const res = await changeEmploymentDate(params)
+      if(res.code == 200){
+        ElMessage({
+          type: 'success',
+          message: '修改成功'
+        })
+        data.multipleSelection = []
+        multipleTableRef.value.clearSelection()
+        await getList()
+        data.assessDialog = false
+      }else{
+        ElMessage({
+          type: 'warning',
+          message: res.msg
+        });
+      }
+    }else {
+      ElMessage.warning('请完善必填信息')
+    }
+  })
+}
+
+const closeAssess = ()=>{
+  assessFormRef.value.clearValidate()
+  data.assessForm = {
+    employTime: []
+  }
+  data.assessDialog = false;
+}
 const resetQuery=()=> {
   data.queryParams = {
     name: '',
diff --git a/src/views/safetyReview/expertManage/fillForm/index.vue b/src/views/safetyReview/expertManage/fillForm/index.vue
index 410ff0f..d133eb8 100644
--- a/src/views/safetyReview/expertManage/fillForm/index.vue
+++ b/src/views/safetyReview/expertManage/fillForm/index.vue
@@ -82,7 +82,19 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="证件照" prop="electronicPhoto">
+                  <el-form-item label="职称或资质证明材料" prop="evidence">
+                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :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>
+                    </el-upload>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+              <el-row>
+                <el-col :span="20">
+                  <el-form-item label="2寸免冠证件照">
                     <el-upload accept="image/*" :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" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'证件照')" :before-remove="beforeRemove">
                       <el-icon><Plus /></el-icon>
                       <template #tip>
@@ -188,7 +200,7 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="支撑方向_安全生产" prop="supportDirectionSafety">
+                  <el-form-item label="支撑方向_安全生产" prop="supportDirectionEmergency">
                     <!--              <el-radio-group v-model="form.supportDirectionSafety">-->
                     <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
                     <!--              </el-radio-group>-->
@@ -200,7 +212,7 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="支撑方向_防灾减灾救灾" prop="supportDirectionPrevention">
+                  <el-form-item label="支撑方向_防灾减灾救灾" prop="supportDirectionEmergency">
                     <!--              <el-radio-group v-model="form.supportDirectionPrevention">-->
                     <!--                <el-radio v-for="item in directionList" :label="item.value" :key="item.value">{{ item.label }}</el-radio>-->
                     <!--              </el-radio-group>-->
@@ -224,11 +236,11 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="工作简历">
-                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile,'简历')" :on-exceed="showTip" :on-preview="handlePictureCardPreview" :limit='8' v-model:file-list="state.resumeList" list-type="picture-card" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles,'简历')" :before-remove="beforeRemove">
-                      <el-icon><Plus /></el-icon>
+                  <el-form-item label="工作简历" prop="resumeKey">
+                    <el-upload accept=".pdf" multiple :action="state.uploadUrl" :headers="state.header" method="post" :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">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
+                        <div class="el-upload__tip">上传pdf格式文件尺寸小于5M,最多可上传5份</div>
                       </template>
                     </el-upload>
                   </el-form-item>
@@ -272,8 +284,8 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="专家本人意见">
-                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :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-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>
                       <template #tip>
                         <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
@@ -284,8 +296,8 @@
               </el-row>
               <el-row>
                 <el-col :span="20">
-                  <el-form-item label="推荐单位意见">
-                    <el-upload accept="image/*" multiple :action="state.uploadUrl" :headers="state.header" method="post" :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-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>
                       <template #tip>
                         <div class="el-upload__tip">上传jpg/png图片尺寸小于5M,最多可上传5张</div>
@@ -324,13 +336,38 @@
 const { proxy } = getCurrentInstance();
 const imgDialog = ref(false)
 const ruleFormRef = ref()
-var validatePass = (rule, value, callback) => {
-  if (state.fileList.length == 0) {
-    callback(new Error('请上传证件照'));
+let validatePass = (rule, value, callback) => {
+  if (state.resumeList.length == 0) {
+    callback(new Error('请上传工作简历'));
   } else {
     callback();
   }
 }
+
+let validateEvidence = (rule, value, callback) => {
+  if (state.evidenceList.length == 0) {
+    callback(new Error('请上传证明材料'));
+  } else {
+    callback();
+  }
+}
+
+let validateOneOfTwo = (rule, value, callback) => {
+  if (state.proAdviceList.length == 0 && state.adviceList.length == 0) {
+    callback(new Error('专家本人意见和推荐单位意见须至少上传一项'));
+  } else {
+    callback();
+  }
+}
+
+let validateOneOfThree = (rule, value, callback) => {
+  if (state.form.supportDirectionSafety.length==0&&state.form.supportDirectionSafety.length==0&&state.form.supportDirectionSafety.length==0) {
+    callback(new Error('请至少从三种支撑方向中勾选一种'));
+  } else {
+    callback();
+  }
+}
+
 let validatePhone = (rule, value, callback)=>{
   if(value === ''){
     callback(new Error('请输入手机号'))
@@ -380,6 +417,7 @@
     supportDirectionSafety: [],
     supportDirectionPrevention: [],
     supportDirectionEmergency: [],
+    evidence: '',
     resumeKey: '',
     paperSituationKey: '',
     rewardKey: '',
@@ -418,6 +456,7 @@
     Authorization: 'Bearer ' + getToken()
   },
   fileList: [],
+  evidenceList: [],
   resumeList: [],
   inventionList: [],
   rewardList: [],
@@ -433,8 +472,11 @@
     birthday: [{ required: true, message: '请选择出生日期', trigger: 'blur' }],
     phone:[{ required: true, validator: validatePhone, trigger: 'blur' }],
     title: [{ required: true, message: '请填写职称', trigger: 'blur' }],
-    electronicPhoto: [{ required: true,validator: validatePass, trigger: 'blur' }],
+    evidence: [{ required: true,validator: validateEvidence, trigger: 'blur' }],
+    resumeKey: [{ required: true,validator: validatePass, trigger: 'blur' }],
+    recommendUnitOpinionKey: [{ required: true,validator: validateOneOfTwo, trigger: 'blur' }],
     idCard: [{ required: true, validator: verifyId, trigger: 'blur' }],
+    supportDirectionEmergency: [{ required: true,validator: validateOneOfThree, trigger: 'blur' }],
     dutyStatus: [{ required: true, message: '请选择在岗情况', trigger: 'blur' }],
     companyName: [{ required: true, message: '请填写单位全称', trigger: 'blur' }],
     degree: [{ required: true, message: '请填写最高学历', trigger: 'blur' }]
@@ -534,7 +576,7 @@
             } else {
               ElMessage({
                 type: 'warning',
-                message: res.message
+                message: res.msg
               })
             }
           })
@@ -545,14 +587,11 @@
   if (!formEl) return
   await formEl.validate(async (valid, fields) => {
     if (valid) {
-      if(state.form.supportDirectionSafety.length==0&&state.form.supportDirectionSafety.length==0&&state.form.supportDirectionSafety.length==0){
-        ElMessage.warning('请至少选择一种支撑方向')
-        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.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.evidence = state.evidenceList.map(i=>i.name).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(',')
@@ -587,6 +626,7 @@
           supportDirectionSafety: [],
           supportDirectionPrevention: [],
           supportDirectionEmergency: [],
+          evidence: '',
           resumeKey: '',
           paperSituationKey: '',
           rewardKey: '',
@@ -597,6 +637,7 @@
           source: 1
         }
         state.fileList = []
+        state.evidenceList = []
         state.resumeList = []
         state.inventionList = []
         state.rewardList = []
diff --git a/src/views/safetyReview/expertManage/postEvaluation/components/evaluate.vue b/src/views/safetyReview/expertManage/postEvaluation/components/evaluate.vue
index 6bf903f..5bb36a7 100644
--- a/src/views/safetyReview/expertManage/postEvaluation/components/evaluate.vue
+++ b/src/views/safetyReview/expertManage/postEvaluation/components/evaluate.vue
@@ -6,81 +6,179 @@
         width="50%"
         :before-close="handleClose"
     >
-      <el-form :model="state.info" inline size="default" ref="busRef" label-width="140px">
-        <el-form-item label="姓名:">
-          <el-input v-model.trim="state.info.name" readonly></el-input>
-        </el-form-item>
-        <el-form-item label="身份证号:">
-          <el-input v-model.trim="state.info.idCard" readonly></el-input>
-        </el-form-item>
-        <el-form-item label="项目名称:">
-          <el-input v-model.trim="state.info.projectName" readonly></el-input>
-        </el-form-item>
-        <el-form-item label="是否为专家组组长:">
-          <el-input v-model.trim="state.info.teamLeader" readonly></el-input>
-        </el-form-item>
-        <el-form-item label="考评记录时间:">
-          <el-input v-model.trim="state.info.evaluateTime" readonly></el-input>
-        </el-form-item>
-        <el-form-item label="总计:">
-          <el-input v-model.trim="state.info.score" readonly></el-input>
-        </el-form-item>
+      <el-form :model="state.info" size="default" ref="busRef" label-width="140px">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="姓名">
+              <el-input v-model.trim="state.info.name" readonly></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="身份证号">
+              <el-input v-model.trim="state.info.idCard" readonly></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="项目名称">
+              <el-input v-model.trim="state.info.projectName" readonly></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="是否为专家组组长">
+              <el-input v-model.trim="state.info.teamLeader" readonly></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+<!--        <el-form-item label="考评记录时间:">-->
+<!--          <el-input v-model.trim="state.info.evaluateTime" readonly></el-input>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="总计:">-->
+<!--          <el-input v-model.trim="state.info.score" readonly></el-input>-->
+<!--        </el-form-item>-->
       </el-form>
-      <div>
-        请对专家表现进行评分:
-      </div>
-      <div style="width: 100%;display: flex;align-items: center;justify-content: space-between;margin: 25px 0 15px">
-        <div>
-          <el-button type="primary" size="default" @click="openSelectList('1')" v-preReClick>添加加分项</el-button>
-          <el-button type="default" size="default" @click="addSelect('1')" v-preReClick>自定义加分项</el-button>
+      <el-form :model="state.form" ref="evaluateRef" :rules="state.formRules" label-width="140px">
+        <el-divider>
+          专家工作表现
+        </el-divider>
+        <el-form-item label="职业道德方面" prop="professionalEthics">
+          <el-radio-group v-model="state.form.professionalEthics" style="width: 100%" :disabled="state.disable">
+            <el-radio v-for="item in state.rateList" :label="item.value">{{ item.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="公正廉洁方面" prop="impartialHonest">
+          <el-radio-group v-model="state.form.impartialHonest" style="width: 100%" :disabled="state.disable">
+            <el-radio v-for="item in state.rateList" :label="item.value">{{ item.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="综合协调组织" prop="comprehensiveCoordination">
+          <el-radio-group v-model="state.form.comprehensiveCoordination" style="width: 100%" :disabled="state.disable">
+            <el-radio v-for="item in state.rateList" :label="item.value">{{ item.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="专业能力素养" prop="professionalAbility">
+          <el-radio-group v-model="state.form.professionalAbility" style="width: 100%" :disabled="state.disable">
+            <el-radio v-for="item in state.rateList" :label="item.value">{{ item.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="意见表达能力" prop="expressingOpinions">
+          <el-radio-group v-model="state.form.expressingOpinions" style="width: 100%" :disabled="state.disable">
+            <el-radio v-for="item in state.rateList" :label="item.value">{{ item.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="其他意见建议">
+          <el-input v-model="state.form.others" type="textarea" :autosize="{ minRows: 2}" :readonly="state.disable"></el-input>
+        </el-form-item>
+        <el-form-item label="使用单位综合评价情况" label-width="180px" prop="comprehensiveEvaluation">
+          <el-radio-group v-model="state.form.comprehensiveEvaluation" style="width: 100%" :disabled="state.disable">
+            <el-radio v-for="item in state.rateList" :label="item.value">{{ item.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+
+        <el-divider>
+          量化评分(非必填)
+        </el-divider>
+        <div style="width: 100%;display: flex;align-items: center;justify-content: space-between;margin: 25px 0 15px">
+          <div>
+            <el-button type="primary" size="default" @click="openSelectList('1')" v-preReClick :disabled="state.disable">添加加分项</el-button>
+            <el-button type="default" size="default" @click="addSelect('1')" v-preReClick :disabled="state.disable">自定义加分项</el-button>
+          </div>
+          <div style="font-size: 14px">
+            加分总计:<span style="font-weight: bolder;color: #10B981">{{addTotal}}</span> 分
+          </div>
         </div>
-        <div style="font-size: 14px">
-          加分总计:<span style="font-weight: bolder;color: #10B981">{{addTotal}}</span> 分
+        <el-table :data="state.addData" border style="width: 100%">
+          <el-table-column prop="content" label="加分项"/>
+          <el-table-column prop="score" label="分值">
+            <template #default="scope">
+              <el-input v-model.trim="scope.row.score" type="number" :readonly="state.disable"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+            <template #default="scope">
+  <!--            <el-button link type="primary"  @click="openDialog('edit',scope.row)">编辑</el-button>-->
+              <el-button link type="danger"  @click="deleteSelect(scope.row,scope.$index,1)" :disabled="state.disable">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <div style="width: 100%;display: flex;align-items: center;justify-content: space-between;margin: 25px 0 15px">
+          <div>
+            <el-button type="primary" size="default" @click="openSelectList('2')" v-preReClick :disabled="state.disable">添加扣分项</el-button>
+            <el-button type="default" size="default" @click="addSelect('2')" v-preReClick :disabled="state.disable">自定义扣分项</el-button>
+          </div>
+          <div style="font-size: 14px">
+            扣分总计:<span style="font-weight: bolder;color: #EF4444">{{deductTotal}}</span> 分
+          </div>
         </div>
-      </div>
-      <el-table :data="state.addData" border style="width: 100%">
-        <el-table-column prop="content" label="加分项"/>
-        <el-table-column prop="score" label="分值">
-          <template #default="scope">
-            <el-input v-model.trim="scope.row.score" type="number"></el-input>
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
-          <template #default="scope">
-<!--            <el-button link type="primary"  @click="openDialog('edit',scope.row)">编辑</el-button>-->
-            <el-button link type="danger"  @click="deleteSelect(scope.row,scope.$index,1)" >删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div style="width: 100%;display: flex;align-items: center;justify-content: space-between;margin: 25px 0 15px">
-        <div>
-          <el-button type="primary" size="default" @click="openSelectList('2')" v-preReClick>添加扣分项</el-button>
-          <el-button type="default" size="default" @click="addSelect('2')" v-preReClick>自定义扣分项</el-button>
+        <el-table :data="state.deductData" border style="width: 100%">
+          <el-table-column prop="content" label="扣分项"/>
+          <el-table-column prop="score" label="分值">
+            <template #default="scope">
+              <el-input v-model.trim="scope.row.score" type="number" :readonly="state.disable"></el-input>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+            <template #default="scope">
+              <el-button link type="danger"  @click="deleteSelect(scope.row,scope.$index,2)" :disabled="state.disable">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <div style="margin-top: 15px">提示:如果该专家在本项目无加分项,也无扣分项,可不填。</div>
+
+        <div style="margin: 25px 0;font-size: 14px">
+          <el-form-item label="本项目考评总计" prop="score">
+            <el-input v-model.trim="state.form.score" type="number" :readonly="state.disable"><template #append>分</template></el-input>
+          </el-form-item>
         </div>
-        <div style="font-size: 14px">
-          扣分总计:<span style="font-weight: bolder;color: #EF4444">{{deductTotal}}</span> 分
-        </div>
-      </div>
-      <el-table :data="state.deductData" border style="width: 100%">
-        <el-table-column prop="content" label="扣分项"/>
-        <el-table-column prop="score" label="分值">
-          <template #default="scope">
-            <el-input v-model.trim="scope.row.score" type="number"></el-input>
-          </template>
-        </el-table-column>
-        <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
-          <template #default="scope">
-            <el-button link type="danger"  @click="deleteSelect(scope.row,scope.$index,2)" >删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <div style="margin: 25px 0;font-size: 14px;display: flex;justify-content: right">
-        本项目考评总计:<span style="font-weight: bolder;color: #2563EB">{{totalScore}}</span> 分
-      </div>
-      <div>提示:如果该专家在本项目无加分项,也无扣分项,直接点击“完成评分” 即可,不做任何分数更改。</div>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="发现重大隐患" prop="majorDangers">
+              <el-input v-model.trim="state.form.majorDangers" type="number" :readonly="state.disable" placeholder="请输入正整数,没有则填0"><template #append>条</template></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="一般隐患" prop="generalHazards">
+              <el-input v-model.trim="state.form.generalHazards" type="number" :readonly="state.disable" placeholder="请输入正整数,没有则填0"><template #append>条</template></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="内容描述">
+          <el-input v-model="state.form.content" type="textarea" :autosize="{ minRows: 2}" :readonly="state.disable"></el-input>
+        </el-form-item>
+        <el-divider></el-divider>
+        <el-form-item label="计费标准" prop="freightBasis">
+          <el-input v-model.trim="state.form.freightBasis" :readonly="state.disable"></el-input>
+        </el-form-item>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="计费时长" prop="billingDuration">
+              <el-input v-model.trim="state.form.billingDuration" type="number" :readonly="state.disable"><template #append>小时</template></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="税后金额" prop="afterTaxAmount">
+              <el-input v-model.trim="state.form.afterTaxAmount" type="number" :readonly="state.disable"><template #append>元</template></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="开户行" prop="openBank">
+              <el-input v-model.trim="state.form.openBank" :readonly="state.disable"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="银行卡号" prop="bankCard">
+              <el-input v-model.trim="state.form.bankCard" :readonly="state.disable"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
       <template #footer>
         <span class="dialog-footer">
-            <el-button type="primary" @click="confirmScore" size="default" v-preReClick>完成评分</el-button>
+          <el-button type="primary" v-if="!state.disable" @click="confirmScore" size="default" v-preReClick>完成评分</el-button>
+          <el-button type="primary" v-if="state.disable" @click="handleClose" size="default" v-preReClick>确定</el-button>
         </span>
       </template>
       <select-list ref="selectRef"  @refreshSelected="getSelected"></select-list>
@@ -115,27 +213,58 @@
 import {getExpertEvaDetail, projectExpertDetailSave} from '@/api/backManage/evaluate'
 
 const dialogVisible = ref(false)
+const evaluateRef = ref()
 const busRef = ref()
 const addRef = ref()
 const selectRef = ref()
 const emit = defineEmits(["getList"]);
 const state = reactive({
   title: '',
+  disable: false,
   addData: [],
   deductData: [],
   info: {
     name: '',
     idCard: '',
     projectName: '',
-    teamLeader: '',
-    evaluateTime: '',
-    score: ''
+    teamLeader: ''
   },
   form: {
     projectExpertId: null,
     saveData: [],
     delData: [],
-    score: null
+    score: 100,
+    professionalEthics: null,
+    impartialHonest: null,
+    comprehensiveCoordination: null,
+    professionalAbility: null,
+    expressingOpinions: null,
+    others: '',
+    comprehensiveEvaluation: null,
+    majorDangers: null,
+    generalHazards: null,
+    content: '',
+    freightBasis: '',
+    billingDuration: null,
+    afterTaxAmount: null,
+    openBank: '',
+    bankCard: '',
+  },
+  formRules: {
+    score: [{required: true, message: '请输入总分', trigger: 'blur'}],
+    professionalEthics: [{required: true, message: '该选项不能为空', trigger: 'blur'}],
+    impartialHonest: [{required: true, message: '该选项不能为空', trigger: 'blur'}],
+    comprehensiveCoordination: [{required: true, message: '该选项不能为空', trigger: 'blur'}],
+    professionalAbility: [{required: true, message: '该选项不能为空', trigger: 'blur'}],
+    expressingOpinions: [{required: true, message: '该选项不能为空', trigger: 'blur'}],
+    comprehensiveEvaluation: [{required: true, message: '该选项不能为空', trigger: 'blur'}],
+    majorDangers: [{required: true, message: '请输入重大隐患数', trigger: 'blur'}],
+    generalHazards: [{required: true, message: '请输入一般隐患数', trigger: 'blur'}],
+    freightBasis: [{required: true, message: '请输入计费标准', trigger: 'blur'}],
+    billingDuration: [{required: true, message: '请输入计费时长', trigger: 'blur'}],
+    afterTaxAmount: [{required: true, message: '请输入税后金额', trigger: 'blur'}],
+    openBank: [{required: true, message: '请输入开户行', trigger: 'blur'}],
+    bankCard: [{required: true, message: '请输入卡号', trigger: 'blur'}]
   },
   addVisible: false,
   addTitle: '',
@@ -148,6 +277,12 @@
     content: [{required: true, message: '请输入内容', trigger: 'blur'}],
     score: [{required: true, message: '请输入分值', trigger: 'blur'}],
   },
+  rateList: [
+    {label: '优秀',value: 1},
+    {label: '合格',value: 2},
+    {label: '基本合格',value: 3},
+    {label: '不合格',value: 4}
+  ]
 })
 
 const addTotal = computed(()=>{
@@ -162,24 +297,25 @@
   return Number(addTotal.value) + Number(deductTotal.value)
 })
 
-const openDialog = async (value, projectName, projectCheckTime) => {
+const openDialog = async (type, value, projectName, projectCheckTime) => {
   state.info = value
   state.form.projectExpertId = value.id
   state.info.projectName = projectName
-  state.info.evaluateTime = projectCheckTime
   state.info.teamLeader = state.info.teamLeader == 1 ? '是' : '否'
-  if (value.evaluationState === 1) {
-    state.title = '继续评分'
+  if (type === 'view') {
+    state.title = '查看'
+    state.disable = true
     const res = await getExpertEvaDetail({projectExpertId: value.id});
     if(res.code == 200){
-      state.addData = res.data.filter(i=>i.scoreType == '1')
-      state.deductData = res.data.filter(i=>i.scoreType == '2')
+      state.form = res.data
+      state.addData = res.data.expertDetails?res.data.expertDetails.filter(i=>i.scoreType == '1'):[]
+      state.deductData = res.data.expertDetails?res.data.expertDetails.filter(i=>i.scoreType == '2'):[]
     }else{
       ElMessage.warning(res.msg)
     }
-    console.log(state.addData,'add')
   }else{
     state.title = '评分'
+    state.disable = false
   }
   dialogVisible.value = true;
 }
@@ -231,15 +367,28 @@
     name: '',
     idCard: '',
     projectName: '',
-    teamLeader: '',
-    evaluateTime: '',
-    score: ''
+    teamLeader: ''
   }
   state.form = {
     projectExpertId: null,
     saveData: [],
     delData: [],
-    score: null
+    score: 100,
+    professionalEthics: null,
+    impartialHonest: null,
+    comprehensiveCoordination: null,
+    professionalAbility: null,
+    expressingOpinions: null,
+    others: '',
+    comprehensiveEvaluation: null,
+    majorDangers: null,
+    generalHazards: null,
+    content: '',
+    freightBasis: '',
+    billingDuration: null,
+    afterTaxAmount: null,
+    openBank: '',
+    bankCard: '',
   }
   state.addData = []
   state.deductData = []
@@ -270,8 +419,6 @@
 const confirmScore = async ()=>{
   state.form.saveData = [...state.addData,...state.deductData]
   state.form.delData = state.form.delData.filter((id) => !state.form.saveData.some((item) => item.id === id))
-  console.log(state.form,'form')
-  state.form.score = totalScore.value
   const res = await projectExpertDetailSave(state.form)
   if(res.code == 200){
     ElMessage.success(res.msg)
diff --git a/src/views/safetyReview/expertManage/postEvaluation/components/expertList.vue b/src/views/safetyReview/expertManage/postEvaluation/components/expertList.vue
index d5a6e59..dc2eed4 100644
--- a/src/views/safetyReview/expertManage/postEvaluation/components/expertList.vue
+++ b/src/views/safetyReview/expertManage/postEvaluation/components/expertList.vue
@@ -41,7 +41,9 @@
             <el-table-column label="考评总分" align="center" prop="score" />
             <el-table-column v-if="title == '专家评估'" label="操作" align="center" class-name="small-padding fixed-width">
               <template #default="scope">
-                <el-button type="primary" link @click="openEvaluate(scope.row)">评分</el-button>
+                <el-button v-if="scope.row.evaluationState ==0" type="primary" link @click="openEvaluate('add',scope.row)">考评与报销</el-button>
+                <el-button v-if="scope.row.evaluationState ==1" type="primary" link @click="openEvaluate('view',scope.row)">查看</el-button>
+                <el-button v-if="scope.row.evaluationState ==1" type="success" link @click="downloadFile(scope.row)">导出考评表</el-button>
               </template>
             </el-table-column>
           </el-table>
@@ -66,8 +68,10 @@
 import {ElMessage} from "element-plus";
 import Evaluate from "./evaluate";
 import {
+  getExpertEvaDetail,
   getProjectExpertEvaluationList,
 } from "@/api/backManage/evaluate";
+import {generateWordDocument} from "@/views/safetyReview/projectManage/components/exportWord";
 const dialogVisible = ref(false);
 const evaluateRef = ref()
 const emit = defineEmits(["getList"]);
@@ -80,8 +84,15 @@
     pageSize: 10
   },
   projectName: '',
+  deptName: '',
   projectCheckTime: '',
-  title: ''
+  title: '',
+  rateList: [
+    {label: '优秀',value: 1},
+    {label: '合格',value: 2},
+    {label: '基本合格',value: 3},
+    {label: '不合格',value: 4}
+  ]
 })
 const {tableData,total,queryParams,projectName,title,projectCheckTime} = toRefs(state)
 const openDialog = async (type,value) => {
@@ -92,6 +103,7 @@
   }
   state.queryParams.id = value.id
   state.projectName = value.projectName
+  state.deptName = value.deptName
   state.projectCheckTime = value.projectCheckTime
   await getEvaluationList()
   dialogVisible.value = true;
@@ -107,8 +119,48 @@
   }
 }
 
-const openEvaluate = (value)=>{
-  evaluateRef.value.openDialog(value,state.projectName,state.projectCheckTime)
+
+const downloadFile = async (val) => {
+  const res = await getExpertEvaDetail({projectExpertId: val.id});
+  if(res.code == 200){
+    let outData = res.data
+    outData.deptName = state.deptName
+    outData.name = val.name
+    outData.sex = val.sex == 0?'男':'女'
+    outData.domain = val.domain
+    outData.professionalEthics = state.rateList.find(i=>i.value == res.data.professionalEthics)?.label
+    outData.impartialHonest = state.rateList.find(i=>i.value == res.data.impartialHonest)?.label
+    outData.comprehensiveCoordination = state.rateList.find(i=>i.value == res.data.comprehensiveCoordination)?.label
+    outData.professionalAbility = state.rateList.find(i=>i.value == res.data.professionalAbility)?.label
+    outData.expressingOpinions = state.rateList.find(i=>i.value == res.data.expressingOpinions)?.label
+    outData.comprehensiveEvaluation = state.rateList.find(i=>i.value == res.data.comprehensiveEvaluation)?.label
+    try {
+      generateWordDocument('/evaluateFile.docx',outData, outData.name + '专家考评表.docx');
+    } catch (error){
+      ElMessage({
+        type: 'warning',
+        message: '导出失败'
+      });
+    }
+  }else{
+    ElMessage.warning(res.msg)
+  }
+  // data.companyName = data.companyName != '' ? data.companyName: '-'
+  // data.projectCheckTime = data.projectCheckTime != '' ? data.projectCheckTime: '-'
+  // data.tableData = state.dataList.map(item => {
+  //   return {
+  //     ...item,
+  //     ratingLevel: item.ratingLevel == 1 ? '一级' : item.ratingLevel == 2 ? '二级':item.ratingLevel == 3 ? '三级' : '',
+  //     sex: item.sex == 0 ? '男' : '女',
+  //     selectionMode: item.selectionMode == 1 ? '固定' : '随机',
+  //     teamLeader: item.teamLeader == 1 ? '是' : '否',
+  //   }
+  // })
+
+};
+
+const openEvaluate = (type,value)=>{
+  evaluateRef.value.openDialog(type,value,state.projectName,state.projectCheckTime)
 }
 
 const closeEvaluate = ()=>{
diff --git a/src/views/safetyReview/expertManage/postEvaluation/index.vue b/src/views/safetyReview/expertManage/postEvaluation/index.vue
index 7fd16d8..6846f62 100644
--- a/src/views/safetyReview/expertManage/postEvaluation/index.vue
+++ b/src/views/safetyReview/expertManage/postEvaluation/index.vue
@@ -34,7 +34,7 @@
         <el-table-column label="项目名称" align="center" prop="projectName"/>
         <el-table-column label="审批单时间" align="center" prop="projectCheckTime"/>
         <el-table-column label="结束时间" align="center" prop="projectEndTime" />
-        <el-table-column label="部门" align="center" prop="deptName" />
+        <el-table-column label="部门" align="center" prop="deptName"/>
         <el-table-column label="专家人数" align="center" prop="expertNum">
           <template #default="scope">
             <el-button type="primary" link @click="openDialog('view',scope.row)">{{scope.row.expertNum}}</el-button>
diff --git a/src/views/safetyReview/projectManage/components/exportWord.js b/src/views/safetyReview/projectManage/components/exportWord.js
index 32816b3..3ba3d7b 100644
--- a/src/views/safetyReview/projectManage/components/exportWord.js
+++ b/src/views/safetyReview/projectManage/components/exportWord.js
@@ -15,7 +15,7 @@
 }
 
 // 生成并下载 Word 文档(templatePath是word文档模版地址,data是对应的数据)
-export function generateWordDocument(templatePath, data) {
+export function generateWordDocument(templatePath, data, name) {
         loadFile(templatePath, function (error, content) {
             if (error) {
                 throw error
@@ -42,7 +42,7 @@
                     mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
                 });
 
-                saveAs(fileWord, '专家选用审批单.docx');
+                saveAs(fileWord, name);
 
                 // // 返回生成的文档 Blob
                 // resolve(fileWord);
diff --git a/src/views/safetyReview/projectManage/components/projectApproval.vue b/src/views/safetyReview/projectManage/components/projectApproval.vue
index 077e885..660e36f 100644
--- a/src/views/safetyReview/projectManage/components/projectApproval.vue
+++ b/src/views/safetyReview/projectManage/components/projectApproval.vue
@@ -381,7 +381,7 @@
 const handleRemove = async (file, uploadFile) => {
 }
 
-const templatePath = '/example.docx';
+const templatePath = '/example.docx'
 const startGeneration = async () => {
   const data = state.dataForm
   let day = new Date(data.projectDateEnd).getTime() - new Date(data.projectDateStart).getTime();
@@ -412,7 +412,7 @@
   })
   console.log('dataList',state.dataList)
   try {
-    generateWordDocument(templatePath, data);
+    generateWordDocument(templatePath, data, '专家选用审批单.docx');
   } catch (error){
     ElMessage({
       type: 'warning',

--
Gitblit v1.9.2