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