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