From 72b79f49a078c089466b54659c106ad2bbc4a807 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期二, 03 十二月 2024 16:28:49 +0800
Subject: [PATCH] 项目管理修改

---
 src/views/safetyReview/projectManage/components/basicInfo.vue       |  183 +++++++++++++++++++++++------
 src/views/safetyReview/projectManage/components/chooseExpert.vue    |   52 ++++----
 public/example.docx                                                 |    0 
 src/views/safetyReview/projectManage/index.vue                      |   11 -
 src/views/safetyReview/projectManage/components/projectApproval.vue |   82 ++++++++++--
 5 files changed, 237 insertions(+), 91 deletions(-)

diff --git a/public/example.docx b/public/example.docx
index f74ad38..28cf2fb 100644
--- a/public/example.docx
+++ b/public/example.docx
Binary files differ
diff --git a/src/views/safetyReview/projectManage/components/basicInfo.vue b/src/views/safetyReview/projectManage/components/basicInfo.vue
index e26a50e..6d26340 100644
--- a/src/views/safetyReview/projectManage/components/basicInfo.vue
+++ b/src/views/safetyReview/projectManage/components/basicInfo.vue
@@ -8,20 +8,20 @@
       </el-col>
     </el-row>
     <el-form ref="formRef" :model="state.formData" :rules="state.rules" class="register-form" label-position="top">
-      <el-row :gutter="30">
-        <el-col :span="6">
-          <el-form-item prop="projectName" label="项目名称">
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item prop="projectName" label="项目名称(事由)">
             <el-input
                 maxlength="100"
                 show-word-limit
                 v-model.trim="state.formData.projectName"
                 size="large"
-                placeholder="请输入项目名称"
+                placeholder="请输入项目名称(事由)"
             >
             </el-input>
           </el-form-item>
         </el-col>
-        <el-col :span="6">
+        <el-col :span="12">
           <el-form-item prop="projectDateStart" label="项目预计时间区间">
             <el-date-picker
                 v-model="searchTime"
@@ -35,48 +35,75 @@
             />
           </el-form-item>
         </el-col>
-        <el-col :span="6">
-          <el-form-item prop="companyName" label="被检查/对接单位">
-            <el-input
-                v-model.trim="state.formData.companyName"
-                size="large"
-                placeholder="请输入被检查/对接单位"
-            >
-            </el-input>
-          </el-form-item>
-        </el-col>
-        <el-col :span="6">
-          <el-form-item prop="projectAddress" label="项目地点">
+
+      </el-row>
+      <el-row :gutter="24">
+        <el-col :span="12">
+          <el-form-item prop="projectAddress" label="目的地及相关企业名称等">
             <el-input
                 v-model.trim="state.formData.projectAddress"
                 size="large"
-                placeholder="请输入项目地点"
+                placeholder="请输入目的地及相关企业名称等"
             >
             </el-input>
           </el-form-item>
         </el-col>
-      </el-row>
-      <el-row :gutter="24">
-        <el-col :span="6">
-          <el-form-item prop="deptUserName" label="处室带队人员">
-            <el-input
-                v-model.trim="state.formData.deptUserName"
-                size="large"
-                placeholder="请输入处室带队人员"
-            >
-            </el-input>
+        <el-col :span="12">
+          <el-form-item prop="jobCategoryArr" label="工作类别">
+            <el-checkbox-group v-model="state.formData.jobCategoryArr">
+              <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>
       </el-row>
       <el-row :gutter="24">
         <el-col :span="24">
-          <el-form-item prop="remark" label="概况描述">
+          <el-form-item prop="deptUserName" label="处室人员及职务">
+            <div style="display: flex">
+              <div style="display: flex;flex-direction: column;">
+                <div v-for="(item,index) in state.personNameJob" :key="index" style="display:flex;margin-bottom: 5px" >
+                  <div>
+                    <span style="font-size: 14px;font-weight: 500">姓名:</span>
+                    <el-input
+                        v-model.trim="item.deptUserName"
+                        size="large"
+                        placeholder="请输入姓名"
+                        style="width: 200px;"
+                        clearable
+                    >
+                    </el-input>
+                  </div>
+                  <div style="margin-left: 20px;display: flex;align-items: center">
+                    <span>职务:</span>
+                    <el-input
+                        v-model.trim="item.deptPostName"
+                        size="large"
+                        placeholder="请输入职务"
+                        style="width: 200px;"
+                        clearable
+                    >
+                    </el-input>
+                    <el-icon style="margin-left: 5px;cursor: pointer" :size="20" color="red" v-if="index !== 0" @click="delPerson(index)" >
+                      <Delete  />
+                    </el-icon>
+                  </div>
+                </div>
+
+              </div>
+              <el-button style="margin-left: 5px;color: white" color="#0FC7F0" @click="addPerson">增加一行</el-button>
+            </div>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="24">
+        <el-col :span="24">
+          <el-form-item prop="remark" label="备注">
             <el-input
                 type="textarea"
                 :rows="6"
                 v-model.trim="state.formData.remark"
                 size="large"
-                placeholder="请输入概况描述"
+                placeholder="请输入备注"
             >
             </el-input>
           </el-form-item>
@@ -102,19 +129,49 @@
     projectName: '',
     projectDateStart: '',
     projectDateEnd: '',
-    companyName: '',
+    jobCategoryArr: [],
     projectAddress: '',
-    deptUserName: '',
+    deptPostName: {
+      postVos: []
+    },
     remark: ''
   },
+  personNameJob: [
+    {
+      deptPostName: '',
+      deptUserName: ''
+    }
+  ],
   rules: {
-    projectName: [{ required: true, message: "项目名称不能为空", trigger: "blur" }],
+    projectName: [{ required: true, message: "项目名称(事由)不能为空", trigger: "blur" }],
     projectDateStart: [{ required: true, message: "项目预计时间不能为空", trigger: "change" }],
-    projectAddress: [{ required: true, message: "项目地点不能为空", trigger: "blur" }],
-    deptUserName: [{ required: true, message: "处室带队人员不能为空", trigger: "blur" }],
-    remark: [{ required: true, message: "概况描述不能为空", trigger: "blur" }],
+    projectAddress: [{ required: true, message: "目的地及相关企业名称等不能为空", trigger: "blur" }],
+    // deptUserName: [{ required: true, message: "处室人人员及职务不能为空", trigger: "blur" }],
+    jobCategoryArr: [{ required: true, message: "工作类别不能为空", trigger: "blur" }],
   },
-  isAdmin: false
+  isAdmin: false,
+  directionList: [
+    {
+      value: '1',
+      label: '现场检查'
+    },
+    {
+      value: '2',
+      label: '调查评估'
+    },
+    {
+      value: '3',
+      label: '咨询服务'
+    },
+    {
+      value: '4',
+      label: '教育培训'
+    },
+    {
+      value: '5',
+      label: '其他'
+    }
+  ],
 })
 const formRef = ref();
 const userInfo = ref()
@@ -138,8 +195,17 @@
   }
   if(type === 'add'){
     if(valid){
+      for(let i = 0; i < state.personNameJob.length; i++){
+        if(state.personNameJob[i].deptPostName === '' || state.personNameJob[i].deptUserName === ''){
+          ElMessage.warning("请输入处室人员及职务");
+          return
+        }
+      }
       //保存按钮
-      const {id,...data} = state.formData
+      const {id,jobCategoryArr,...data} = state.formData
+      data.jobCategory = Array.isArray(state.formData.jobCategoryArr)? state.formData.jobCategoryArr.join(',') : ''
+      data.deptPostName.postVos = state.personNameJob
+      console.log('data',data)
       const res = await addProject(data);
       if(res.code == 200){
         ElMessage.success('新增成功')
@@ -152,7 +218,15 @@
   }else if(type === 'clickEdit'){
     if(valid){
       //变更按钮
-      const {...data} = state.formData
+      for(let i = 0; i < state.personNameJob.length; i++){
+        if(state.personNameJob[i].deptPostName === '' || state.personNameJob[i].deptUserName === ''){
+          ElMessage.warning("请输入处室人员及职务");
+          return
+        }
+      }
+      const {jobCategoryArr,...data} = state.formData
+      data.jobCategory = Array.isArray(state.formData.jobCategoryArr)? state.formData.jobCategoryArr.join(',') : ''
+      data.deptPostName.postVos = state.personNameJob
       const res = await addProject(data);
       if(res.code == 200){
         ElMessage.success('修改成功')
@@ -171,8 +245,23 @@
           }
         }
         searchTime.value = [res.data.projectDateStart,res.data.projectDateEnd]
-      }
+        if(res.data.jobCategory && res.data.jobCategory!==''){
+          state.formData.jobCategoryArr = res.data.jobCategory.split(',')
+        }else{
+          state.formData.jobCategoryArr = []
+        }
+        if(res.data.deptPostName && res.data.deptPostName.postVos.length>0){
+          state.personNameJob = res.data.deptPostName.postVos
+        }else {
+          state.personNameJob = [
+            {
+              deptPostName: '',
+              deptUserName: ''
+            }
+          ]
+        }
 
+      }
     }else{
       ElMessage.warning(res.message)
     }
@@ -189,7 +278,7 @@
     projectName: '',
     projectDateStart: '',
     projectDateEnd: '',
-    companyName: '',
+    jobCategoryArr: [],
     projectAddress: '',
     deptUserName: '',
     remark: ''
@@ -205,6 +294,18 @@
     state.formData.projectDateEnd = searchTime.value[1]
   }
 }
+const addPerson = () => {
+  const obj = {
+    deptPostName: '',
+    deptUserName: ''
+  }
+  state.personNameJob.push(obj)
+}
+
+const delPerson = (val) => {
+  state.personNameJob = state.personNameJob.filter((item,index) => index != val)
+}
+
 defineExpose({
   riskOpen
 });
diff --git a/src/views/safetyReview/projectManage/components/chooseExpert.vue b/src/views/safetyReview/projectManage/components/chooseExpert.vue
index 495fbf7..17d3b67 100644
--- a/src/views/safetyReview/projectManage/components/chooseExpert.vue
+++ b/src/views/safetyReview/projectManage/components/chooseExpert.vue
@@ -1,31 +1,31 @@
 <template>
   <div class="expertChoose">
-    <div style="margin-bottom: 50px">
-      <div class="fTop">
-        <span style="font-weight: 600">固定选用部分</span>
-        <el-button type="primary" :disabled="state.info.step == 4 || state.isAdmin" style="width: 100px" @click="chooseExpert('选取专家')">选取专家</el-button>
-      </div>
-      <el-table v-loading="fLoading"  :data="fixedDataList" :border="true" ref="fTableRef" style="width: 100%;">
-        <el-table-column label="姓名" prop="name" align="center" />
-        <el-table-column label="性别" prop="sex" align="center" >
-          <template #default="scope">
-           {{scope.row.sex === 0 ? '男' : '女' }}
-          </template>
-        </el-table-column>
-        <el-table-column label="身份证号" prop="idCard" align="center" />
-        <el-table-column label="等级" prop="ratingLevel" align="center" >
-          <template #default="scope">
-            <span>{{scope.row.ratingLevel == 1 ?'一级':scope.row.ratingLevel == 1?'二级':'三级'}}</span>
-          </template>
-        </el-table-column>
-        <el-table-column label="专业领域" prop="domain" align="center" />
-        <el-table-column fixed="right" label="操作" align="center" class-name="small-padding fixed-width" width="180">
-          <template #default="scope">
-            <el-button link type="primary" @click="delF(scope.row)" :disabled="state.info.step == 4 || state.isAdmin">删除</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-    </div>
+<!--    <div style="margin-bottom: 50px">-->
+<!--      <div class="fTop">-->
+<!--        <span style="font-weight: 600">固定选用部分</span>-->
+<!--        <el-button type="primary" :disabled="state.info.step == 4 || state.isAdmin" style="width: 100px" @click="chooseExpert('选取专家')">选取专家</el-button>-->
+<!--      </div>-->
+<!--      <el-table v-loading="fLoading"  :data="fixedDataList" :border="true" ref="fTableRef" style="width: 100%;">-->
+<!--        <el-table-column label="姓名" prop="name" align="center" />-->
+<!--        <el-table-column label="性别" prop="sex" align="center" >-->
+<!--          <template #default="scope">-->
+<!--           {{scope.row.sex === 0 ? '男' : '女' }}-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+<!--        <el-table-column label="身份证号" prop="idCard" align="center" />-->
+<!--        <el-table-column label="等级" prop="ratingLevel" align="center" >-->
+<!--          <template #default="scope">-->
+<!--            <span>{{scope.row.ratingLevel == 1 ?'一级':scope.row.ratingLevel == 1?'二级':'三级'}}</span>-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+<!--        <el-table-column label="专业领域" prop="domain" align="center" />-->
+<!--        <el-table-column fixed="right" label="操作" align="center" class-name="small-padding fixed-width" width="180">-->
+<!--          <template #default="scope">-->
+<!--            <el-button link type="primary" @click="delF(scope.row)" :disabled="state.info.step == 4 || state.isAdmin">删除</el-button>-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+<!--      </el-table>-->
+<!--    </div>-->
     <div style="display: flex;flex-direction: column">
       <span style="font-weight: 600">随机选用部分</span>
       <el-form :model="queryParams" ref="queryForm" :inline="true" style="margin-top: 10px" label-width="90px">
diff --git a/src/views/safetyReview/projectManage/components/projectApproval.vue b/src/views/safetyReview/projectManage/components/projectApproval.vue
index 863986d..077e885 100644
--- a/src/views/safetyReview/projectManage/components/projectApproval.vue
+++ b/src/views/safetyReview/projectManage/components/projectApproval.vue
@@ -1,33 +1,35 @@
 <template>
   <div class="approval">
-    <el-form :model="state.dataForm" ref="dataForm" :inline="true" style="margin-top: 10px" label-width="130px" >
+    <el-form :model="state.dataForm" ref="dataForm" :inline="true" style="margin-top: 10px" label-width="180px" >
       <el-row :gutter="24">
         <el-col :span="12">
-          <el-form-item label="项目名称:">
+          <el-form-item label="项目名称(事由):">
            <span>{{state.dataForm.projectName}}</span>
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="被检查/对接单位:">
-            <span>{{state.dataForm.companyName ? state.dataForm.companyName: '--'}}</span>
+          <el-form-item label="项目预计时间区间:">
+            <span>{{state.dataForm.projectDateStart}}—{{state.dataForm.projectDateEnd}}</span>
           </el-form-item>
         </el-col>
       </el-row>
       <el-row :gutter="24">
         <el-col :span="12">
-          <el-form-item label="计划实行时间:">
-            <span>{{state.dataForm.projectDateStart}}—{{state.dataForm.projectDateEnd}}</span>
+          <el-form-item label="目的地及相关企业名称等:">
+            <span>{{state.dataForm.projectAddress}}</span>
           </el-form-item>
         </el-col>
         <el-col :span="12">
-          <el-form-item label="项目地点:">
-            <span>{{state.dataForm.projectAddress}}</span>
+          <el-form-item prop="jobCategoryArr" label="工作类别">
+            <el-checkbox-group v-model="state.jobCategoryArr" disabled>
+              <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>
       </el-row>
       <el-row :gutter="24">
         <el-col :span="24">
-          <el-form-item label="项目概况:">
+          <el-form-item label="备注:">
             <span>{{state.dataForm.remark}}</span>
           </el-form-item>
         </el-col>
@@ -108,6 +110,7 @@
 import {generateWordDocument} from "@/views/safetyReview/projectManage/components/exportWord";
 import {addProject, checkProject, choose, getCheckInfo, getFileInfo, getProjectList} from "@/api/projectManage";
 import Cookies from "js-cookie";
+import moment from "moment";
 const emit = defineEmits(["getNextStatus","backStatus"]);
 const prop = defineProps(['projectId'])
 const tableRef = ref()
@@ -124,6 +127,7 @@
     projectCheckTime: '',
     state: ''
   },
+  jobCategoryArr: [],
   queryParams: {
     pageNum: 1,
     pageSize: 20,
@@ -137,7 +141,29 @@
   },
   fileList: [],
   projectId: null,
-  isAdmin: false
+  isAdmin: false,
+  directionList: [
+    {
+      value: '1',
+      label: '现场检查'
+    },
+    {
+      value: '2',
+      label: '调查评估'
+    },
+    {
+      value: '3',
+      label: '咨询服务'
+    },
+    {
+      value: '4',
+      label: '教育培训'
+    },
+    {
+      value: '5',
+      label: '其他'
+    }
+  ],
 });
 const projectType = ref('')
 const userInfo = ref()
@@ -252,7 +278,8 @@
     state.dataList = res.data.projectExpertCheckResp.map(item => {
       return {
         ...item,
-        teamLeader: item.teamLeader ? item.teamLeader : 0
+        teamLeader: item.teamLeader ? item.teamLeader : 0,
+        expertName: item.name
       }
     })
     if(res.data) {
@@ -263,6 +290,11 @@
         }
       }
       state.dataForm.projectCheckTime = res.data.projectCheckTime ?res.data.projectCheckTime : ''
+      if(res.data.jobCategory && res.data.jobCategory!==''){
+        state.jobCategoryArr = res.data.jobCategory.split(',')
+      }else{
+        state.jobCategoryArr = []
+      }
     }
     state.loading = false;
   }else{
@@ -352,17 +384,33 @@
 const templatePath = '/example.docx';
 const startGeneration = async () => {
   const data = state.dataForm
-  data.companyName = data.companyName != '' ? data.companyName: '-'
-  data.projectCheckTime = data.projectCheckTime != '' ? data.projectCheckTime: '-'
+  let day = new Date(data.projectDateEnd).getTime() - new Date(data.projectDateStart).getTime();
+  let dayCount = Math.floor(day / 86400000) ;
+  data.planTime = moment(data.projectDateStart).format('YYYY年MM月DD日') + ' 至 ' + moment(data.projectDateEnd).format('YYYY年MM月DD日') +','+`共计${dayCount}天。`
+
+  // state.jobCategoryArr.forEach(item => {
+  //   let checked
+  //   const val = state.directionList.find(i => i.value === item)
+  //   typeList.push(val)
+  // })
+  state.directionList.forEach(item => {
+    if(state.jobCategoryArr.some(i => i === item.value)){
+      item.checked = false
+    }else {
+      item.checked = true
+    }
+  })
+  console.log('xx',state.directionList)
+  data.typeList = state.directionList
+
   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 ? '是' : '否',
+      selectionTime: item.selectionTime ? moment(item.selectionTime).format('YYYY年MM月DD日 HH:mm:ss') : '--',
+      expertRemark: item.expertRemark ? item.expertRemark : ''
     }
   })
+  console.log('dataList',state.dataList)
   try {
     generateWordDocument(templatePath, data);
   } catch (error){
diff --git a/src/views/safetyReview/projectManage/index.vue b/src/views/safetyReview/projectManage/index.vue
index d45e7da..3026200 100644
--- a/src/views/safetyReview/projectManage/index.vue
+++ b/src/views/safetyReview/projectManage/index.vue
@@ -63,7 +63,7 @@
       <el-table-column label="申请时间" prop="createTime" align="center" :show-overflow-tooltip="true" width="180" />
       <el-table-column label="项目名称" prop="projectName" align="center" :show-overflow-tooltip="true" width="180" />
       <el-table-column label="部门" prop="deptName" align="center" />
-      <el-table-column label="专家组组长" prop="deptUserName" align="center"  width="150"/>
+      <el-table-column label="专家组组长" prop="expertName" align="center"  width="150"/>
       <el-table-column label="专家组人数" prop="expertNum" align="center"  width="150"/>
       <el-table-column label="当前状态" prop="state" align="center"  width="200">
         <template #default="scope">
@@ -123,7 +123,6 @@
         </div>
       </template>
     </el-drawer>
-
   </div>
 
 </template>
@@ -132,11 +131,10 @@
 import {onMounted, reactive, ref} from "vue";
 // import {delProject, getProjectList, getProjectStatistics} from "@/api/projectManage/project";
 import {ElMessage, ElMessageBox} from "element-plus";
-// import {getRegionTree} from "@/api/area";
-// import {getDict} from "@/api/login";
-// import {getDictList} from "@/api/backManage/evaluate";
 import Cookies from "js-cookie"
 import {delProject, getProjectList, getProjectNum} from "@/api/projectManage";
+
+
 const router = useRouter();
 
 const loading = ref(false);
@@ -166,6 +164,7 @@
     total: 0
   }
 });
+
 const searchTime = ref([]);
 const area = ref([]);
 const stateList = ref([
@@ -303,8 +302,6 @@
   getStatistics();
 
 }
-
-
 </script>
 
 <style scoped lang="scss">

--
Gitblit v1.9.2