From a6a8e49af8c8172f4209dd94e65f53f17825cc44 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期四, 21 十一月 2024 17:30:12 +0800
Subject: [PATCH] 项目管理

---
 src/views/safetyReview/projectManage/components/chooseExpert.vue |  305 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 300 insertions(+), 5 deletions(-)

diff --git a/src/views/safetyReview/projectManage/components/chooseExpert.vue b/src/views/safetyReview/projectManage/components/chooseExpert.vue
index ada0125..d0face4 100644
--- a/src/views/safetyReview/projectManage/components/chooseExpert.vue
+++ b/src/views/safetyReview/projectManage/components/chooseExpert.vue
@@ -1,23 +1,308 @@
-
 <template>
-  <div>专家选用</div>
+  <div class="expertChoose">
+    <div style="margin-bottom: 50px">
+      <div class="fTop">
+        <span style="font-weight: 600">固定选用部分</span>
+        <el-button type="primary" 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)" >删除</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">
+        <el-row :gutter="24">
+          <el-col :span="8">
+            <el-form-item label="专业领域:">
+              <el-cascader
+                  style="width: 100%"
+                  v-model="expertType"
+                  :options="domainList"
+                  :props="{ expandTrigger: 'hover',value: 'id',label: 'classifyName',multiple: true }"
+                  @change="professionChange"
+                  collapse-tags
+                  collapse-tags-tooltip
+                  clearable
+              >
+              </el-cascader>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="允许级别:">
+              <el-checkbox-group v-model="queryParams.ratingLevel">
+                <el-checkbox v-for="item in state.levelList" :label="item.id" :key="item.id">{{ item.name }}</el-checkbox>
+              </el-checkbox-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item style="float: right;">
+              <el-button style="width: 100px;margin-right: -32px;" type="primary" @click="random">随机抽取</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24">
+          <el-col :span="24">
+            <el-form-item label="拟选用人数:">
+              <el-input
+                  clearable
+                  v-model.trim="queryParams.num"
+                  placeholder="请输入拟选用人数"
+                  @input="queryParams.num = queryParams.num.replace(/[^0-9]/g,' ')"
+              >
+              </el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <el-table v-loading="rLoading"  :data="randomDataList" :border="true" ref="rTableRef" 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="delR(scope.row)" >删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <experts-list ref="expertsListRef" @getName="getSelected"></experts-list>
+  </div>
 </template>
 
 <script setup>
+import {onMounted, reactive, ref} from "vue";
+import expertsList from './expertsList.vue'
+import {getExpertTypes} from "@/api/form";
+import {ElMessage} from "element-plus";
+import {addProject, choose, expertRound, getCheckInfo} from "@/api/projectManage";
+
 const emit = defineEmits(["getNextStatus"]);
+const fTableRef  = ref(null);
+const expertsListRef = ref(null)
+const fLoading = ref(false);
+const rLoading = ref(false);
+const fixedDataList = ref([]);
+const rTableRef  = ref(null);
+const randomDataList = ref([]);
+const queryParams = ref({
+
+})
+const expertType = ref([])
+const checkList = ref([])
+const domainList = ref([])
+const state = reactive({
+  formData: {
+    id:null,
+    step: 2,
+    saveData: [],
+    delData: []
+  },
+  levelList: [
+    {
+      id: 1,
+      name: '一级'
+    },
+    {
+      id: 2,
+      name: '二级'
+    },
+    {
+      id: 3,
+      name: '三级'
+    },
+  ]
+})
+
+
+
+onMounted(() =>{
+  getDomain()
+})
 const riskOpen = async (type,val) => {
   console.log("type",type,val)
+  if(type === 'add' || type === 'clickEdit'){
+    if(fixedDataList.value.length === 0 && randomDataList.value.length === 0){
+      ElMessage.warning('请选择专家')
+      return;
+    }
+  }
   //保存按钮
   if(type === 'add'){
+    let fData = []
+    let rData = []
     //成功后自动到下一步 项目id
-    emit('getNextStatus', 2);
+    const {...data} = state.formData
+    data.id = val
+    if(fixedDataList.value && fixedDataList.value.length > 0){
+      fData = fixedDataList.value.map(item => {
+        return {
+          expertId: item.id,
+          expertName:item.name,
+          selectionMode: 1,
+          teamLeader: 0
+        }
+      })
+    }
+    if(randomDataList.value && randomDataList.value.length > 0){
+      rData = randomDataList.value.map(item => {
+        return {
+          expertId: item.id,
+          expertName:item.name,
+          selectionMode: 2,
+          teamLeader: 0
+        }
+      })
+    }
+    data.saveData = fData.concat(rData)
 
+    const res = await choose(data);
+    if(res.code == 200){
+      ElMessage.success('新增成功')
+      emit('getNextStatus', val);
+      // reset()
+    }else{
+      ElMessage.warning(res.message)
+    }
   }else if(type === 'clickEdit'){
-    //变更按钮
+    let fData = []
+    let rData = []
+    const {...data} = state.formData
+    data.id = val
+    if(fixedDataList.value && fixedDataList.value.length > 0){
+      fData = fixedDataList.value.map(item => {
+        return {
+          id: item.expertId ? item.id : '',
+          expertId: item.expertId ? item.expertId : item.id,
+          expertName:item.name,
+          selectionMode: 1,
+          teamLeader: 0
+        }
+      })
+    }
+    if(randomDataList.value && randomDataList.value.length > 0){
+      rData = randomDataList.value.map(item => {
+        return {
+          id: item.expertId ? item.id : '',
+          expertId: item.expertId ? item.expertId : item.id,
+          expertName:item.name,
+          selectionMode: 2,
+          teamLeader: 0
+        }
+      })
+    }
+    data.saveData = fData.concat(rData)
+    const res = await choose(data);
+    if(res.code == 200){
+      ElMessage.success('修改成功')
+    }else{
+      ElMessage.warning(res.message)
+    }
 
   }else if(type === 'detail'){
-    console.log("view222222",type,val)
+    const param = {
+      id: val
+    }
+    const res = await  getCheckInfo(param);
+    if(res.code == 200){
+      fixedDataList.value = res.data.projectExpertCheckResp.filter(item => item.selectionMode === 1)
+      randomDataList.value = res.data.projectExpertCheckResp.filter(item => item.selectionMode === 2)
+      console.log('res',fixedDataList.value)
+    }else{
+      ElMessage.warning(res.message)
+    }
   }
+}
+
+const chooseExpert = (type) => {
+  expertsListRef.value.openDialog(type,fixedDataList.value,domainList.value)
+}
+const getSelected = (type,data)=>{
+  const selectData = JSON.parse(JSON.stringify(data))
+  if(fixedDataList.value && fixedDataList.value.length > 0){
+    fixedDataList.value.forEach(item => {
+      if(item.expertId){
+        selectData.forEach((i,index) => {
+          if(i.id == item.expertId){
+            selectData[index] = item
+          }
+        })
+      }
+    })
+  }
+  fixedDataList.value = selectData
+}
+const delF = (val) => {
+  if(val.expertId){
+    state.formData.delData.push(val.id)
+  }
+  fixedDataList.value = fixedDataList.value.filter(item => item.id != val.id)
+}
+
+const delR = (val) => {
+  if(val.expertId){
+    state.formData.delData.push(val.id)
+  }
+  randomDataList.value = randomDataList.value.filter(item => item.id != val.id)
+}
+const professionChange=(value)=> {
+  queryParams.value.domain = value.map(item => item[1])
+}
+const getDomain = async () => {
+  const res = await getExpertTypes()
+  if(res.code == 200){
+    domainList.value = res.data
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+
+const random = async () => {
+  console.log('11',randomDataList.value)
+  randomDataList.value.forEach(item => {
+    if(item.expertId){
+      state.formData.delData.push(item.id)
+    }
+  })
+  if(queryParams.value.num =='' || queryParams.value.num == undefined){
+    ElMessage.warning('拟选用人数不能为空')
+    return
+  }
+  rLoading.value = true
+  const res = await expertRound(queryParams.value)
+  if(res.code == 200){
+    randomDataList.value = res.data
+  }else{
+    ElMessage.warning(res.message)
+  }
+  rLoading.value = false
 }
 
 defineExpose({
@@ -27,5 +312,15 @@
 
 
 <style scoped lang="scss">
+.expertChoose{
+  display: flex;
+  flex-direction: column;
+  .fTop{
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 15px;
+  }
 
+}
 </style>

--
Gitblit v1.9.2