增加项目管理功能

dev_xd
haha 2024-09-04 00:20:16 +08:00
parent 9519000083
commit 1c95a50d1c
5 changed files with 209 additions and 55 deletions

View File

@ -45,10 +45,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="updateBy" column="update_by" /> <result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" /> <result property="updateTime" column="update_time" />
<result property="remark" column="remark" /> <result property="remark" column="remark" />
<association property="setting" column="ps_id" javaType="ProProjectInfoSetting" resultMap="ProProjectInfoSettingResult" />
<collection property="projectDeptsList" javaType="java.util.List" resultMap="ProProjectInfoDeptsResult" />
</resultMap>
<resultMap id="ProProjectInfoDeptsResult" type="ProProjectInfoDepts">
<result property="id" column="pd_id" />
<result property="projectId" column="id" />
<result property="projectName" column="project_name" />
<result property="deptType" column="pd_type" />
<result property="deptName" column="pd_name" />
<result property="deptCode" column="pd_code" />
<result property="leader" column="pd_leader" />
<result property="phone" column="pd_phone" />
</resultMap>
<resultMap id="ProProjectInfoSettingResult" type="ProProjectInfoSetting">
<result property="id" column="ps_id" />
<result property="projectId" column="id" />
<result property="projectName" column="project_name" />
<result property="orgName" column="ps_org_name" />
<result property="orgLogo" column="ps_org_logo" />
<result property="orgImage" column="ps_org_image" />
<result property="orgVideo" column="ps_org_video" />
<result property="orgPlane" column="ps_org_plane" />
</resultMap> </resultMap>
<sql id="selectProProjectInfoVo"> <sql id="selectProProjectInfoVo">
select pi.id, pi.dept_id, sd.dept_name, pi.vis_dept_id, pi.dis_dept_id, pi.project_name, pi.project_code, pi.simple_name, pi.project_type, pi.project_level, pi.project_regional, pi.project_address, pi.project_nature, pi.licence_number, pi.project_person, pi.project_person_phone, pi.longitude, pi.latitude, pi.project_time_limit, pi.total_investment, pi.floor_area, pi.total_output_value, pi.planned_completion_time, pi.scheduled_start_time, pi.actual_operating_time, pi.actual_completion_time, pi.contract_amount, pi.paid_amount, pi.on_account_amount, pi.project_schedule, pi.project_summarize, pi.project_qr_code, pi.project_status, pi.project_sort, pi.is_del, pi.create_by, pi.create_time, pi.update_by, pi.update_time, pi.remark from pro_project_info pi select pi.id, pi.dept_id, sd.dept_name, pi.vis_dept_id, pi.dis_dept_id, pi.project_name, pi.project_code, pi.simple_name, pi.project_type, pi.project_level, pi.project_regional, pi.project_address, pi.project_nature, pi.licence_number, pi.project_person, pi.project_person_phone, pi.longitude, pi.latitude, pi.project_time_limit, pi.total_investment, pi.floor_area, pi.total_output_value, pi.planned_completion_time, pi.scheduled_start_time, pi.actual_operating_time, pi.actual_completion_time, pi.contract_amount, pi.paid_amount, pi.on_account_amount, pi.project_schedule, pi.project_summarize, pi.project_qr_code, pi.project_status, pi.project_sort, pi.is_del, pi.create_by, pi.create_time, pi.update_by, pi.update_time, pi.remark
from pro_project_info pi
left join sys_dept sd on sd.dept_id = pi.dept_id left join sys_dept sd on sd.dept_id = pi.dept_id
</sql> </sql>
@ -73,7 +95,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select> </select>
<select id="selectProProjectInfoById" parameterType="Long" resultMap="ProProjectInfoResult"> <select id="selectProProjectInfoById" parameterType="Long" resultMap="ProProjectInfoResult">
<include refid="selectProProjectInfoVo"/> select pi.id, pi.dept_id, sd.dept_name, pi.vis_dept_id, pi.dis_dept_id, pi.project_name,
pi.project_code, pi.simple_name, pi.project_type, pi.project_level, pi.project_regional, pi.project_address, pi.project_nature,
pi.licence_number, pi.project_person, pi.project_person_phone, pi.longitude, pi.latitude, pi.project_time_limit, pi.total_investment,
pi.floor_area, pi.total_output_value, pi.planned_completion_time, pi.scheduled_start_time, pi.actual_operating_time, pi.actual_completion_time,
pi.contract_amount, pi.paid_amount, pi.on_account_amount, pi.project_schedule, pi.project_summarize, pi.project_qr_code, pi.project_status,
pi.project_sort, pi.is_del, pi.create_by, pi.create_time, pi.update_by, pi.update_time, pi.remark,
pd.id pd_id,pd.dept_type pd_type,pd.dept_name pd_name,pd.dept_code pd_code,pd.leader pd_leader,pd.phone pd_phone,
ps.id ps_id,ps.org_name ps_org_name,ps.org_logo ps_org_logo,ps.org_image ps_org_image,ps.org_video ps_org_video,ps.org_plane ps_org_plane
from pro_project_info pi
left join sys_dept sd on sd.dept_id = pi.dept_id
left join pro_project_info_depts pd on pi.id=pd.project_id
left join pro_project_info_setting ps on pi.id=ps.project_id
where pi.id = #{id} where pi.id = #{id}
</select> </select>

View File

@ -2,6 +2,10 @@ package com.yanzhu.manage.service.impl;
import java.util.List; import java.util.List;
import com.yanzhu.common.core.utils.DateUtils; import com.yanzhu.common.core.utils.DateUtils;
import com.yanzhu.manage.domain.ProProjectInfoDepts;
import com.yanzhu.manage.domain.ProProjectInfoSetting;
import com.yanzhu.manage.mapper.ProProjectInfoDeptsMapper;
import com.yanzhu.manage.mapper.ProProjectInfoSettingMapper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.yanzhu.manage.mapper.ProProjectInfoMapper; import com.yanzhu.manage.mapper.ProProjectInfoMapper;
@ -19,7 +23,10 @@ public class ProProjectInfoServiceImpl implements IProProjectInfoService
{ {
@Autowired @Autowired
private ProProjectInfoMapper proProjectInfoMapper; private ProProjectInfoMapper proProjectInfoMapper;
@Autowired
private ProProjectInfoDeptsMapper deptsMapper;
@Autowired
private ProProjectInfoSettingMapper settingMapper;
/** /**
* *
* *
@ -67,6 +74,26 @@ public class ProProjectInfoServiceImpl implements IProProjectInfoService
public int updateProProjectInfo(ProProjectInfo proProjectInfo) public int updateProProjectInfo(ProProjectInfo proProjectInfo)
{ {
proProjectInfo.setUpdateTime(DateUtils.getNowDate()); proProjectInfo.setUpdateTime(DateUtils.getNowDate());
List<ProProjectInfoDepts> depts= proProjectInfo.getProjectDeptsList();
if(depts!=null){
depts.forEach(dept->{
dept.setProjectId(proProjectInfo.getId());
if(dept.getId()!=null){
deptsMapper.updateProProjectInfoDepts(dept);
}else{
deptsMapper.insertProProjectInfoDepts(dept);
}
});
}
ProProjectInfoSetting setting= proProjectInfo.getSetting();
if(setting!=null){
setting.setProjectId(proProjectInfo.getId());
if(setting.getId()!=null){
settingMapper.updateProProjectInfoSetting(setting);
}else{
settingMapper.insertProProjectInfoSetting(setting);
}
}
return proProjectInfoMapper.updateProProjectInfo(proProjectInfo); return proProjectInfoMapper.updateProProjectInfo(proProjectInfo);
} }

View File

@ -1,5 +1,5 @@
<template> <template>
<el-dialog :title="title" v-model="show" width="800px" append-to-body custom-class="baidu-map-dialog" <el-dialog :title="title" v-model="show" width="800px" append-to-body class="baidu-map-dialog"
:close-on-click-modal="false" :close-on-press-escape="false" > :close-on-click-modal="false" :close-on-press-escape="false" >
<div class="div-info"> <div class="div-info">
<div>经度纬度:{{point?(point.lng.toFixed(5)+","+point.lat.toFixed(5)):'' }}</div> <div>经度纬度:{{point?(point.lng.toFixed(5)+","+point.lat.toFixed(5)):'' }}</div>

View File

@ -53,7 +53,7 @@
</el-table-column> </el-table-column>
<el-table-column label="项目排序" align="center" prop="projectSort" width="120"> <el-table-column label="项目排序" align="center" prop="projectSort" width="120">
<template #default="scope"> <template #default="scope">
<el-input-number size="mini" v-model="scope.row.projectSort" :min="1" :max="999" <el-input-number v-model="scope.row.projectSort" :min="1" :max="999"
@change="setProjectSort(scope.row, $event)"></el-input-number> @change="setProjectSort(scope.row, $event)"></el-input-number>
</template> </template>
</el-table-column> </el-table-column>
@ -114,21 +114,21 @@
v-model:limit="queryParams.pageSize" @pagination="getList" /> v-model:limit="queryParams.pageSize" @pagination="getList" />
<!-- 添加或修改项目信息对话框 --> <!-- 添加或修改项目信息对话框 -->
<el-dialog :title="title" v-model="open" width="1080px" append-to-body> <el-dialog :title="title" v-model="open" width="1080px" append-to-body :close-on-click-modal="false" :close-on-press-escape="false" class="project-info-edit-dlg">
<el-form ref="proProjectInfoRef" :model="form" :rules="rules" label-width="100px"> <el-form ref="proProjectInfoRef" :model="form" :rules="rules" label-width="100px">
<el-tabs v-model="activeName" type="card" class="demo-tabs"> <el-tabs v-model="activeName" type="card" class="demo-tabs">
<el-tab-pane label="项目基本信息" name="base"> <el-tab-pane label="项目基本信息" name="base">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="16"> <el-col :span="8">
<el-form-item label="归属单位" prop="deptId"> <el-form-item label="归属单位" prop="deptId">
<el-select v-model="form.deptId" placeholder="请选择公司" clearable> <el-select v-model="form.deptId" placeholder="请选择公司" clearable @change="doChangeComp">
<el-option v-for="dict in deptOptions" :key="dict.deptId" :label="dict.deptName" <el-option v-for="dict in data.compOptions" :key="dict.deptId" :label="dict.deptName"
:value="dict.deptId"></el-option> :value="dict.deptId"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8"> <el-col :span="8">
<el-form-item label="显示层级" prop="disDeptId"> <el-form-item label="归属部门" prop="disDeptId">
<el-tree-select v-model="form.disDeptId" :data="deptOptions" <el-tree-select v-model="form.disDeptId" :data="deptOptions"
:props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="请选择显示层级" :props="{ value: 'id', label: 'label', children: 'children' }" value-key="id" placeholder="请选择显示层级"
check-strictly style="width:100%" /> check-strictly style="width:100%" />
@ -255,40 +255,29 @@
</el-col> </el-col>
</el-row> </el-row>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="参建单位信息" name="depts"> <el-tab-pane label="参建单位信息" name="depts" v-if="data.opt=='edit'">
<el-row :gutter="10" class="mb8"> <div v-for="(it,idx) in projectDeptsList" :key="idx" class="prj-dept-item">
<el-col :span="1.5"> <div class="dept-item-header">
<el-button type="primary" icon="Plus" @click="handleAddDepts"></el-button> <el-icon size="14" color="#2196F3"><OfficeBuilding /></el-icon>
<span class="sp-header">{{ it.deptType }}</span>
</div>
<el-row>
<el-col :span="8">
<span class="sp-label">{{ it.deptType }}名称</span>
<el-input v-model="it.deptName" class="txt-dept-name"/>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="8">
<el-button type="danger" icon="Delete" @click="handleDeleteDepts"></el-button> <span class="sp-label">负责人姓名</span>
<el-input v-model="it.leader" class="txt-leader"/>
</el-col>
<el-col :span="8">
<span class="sp-label">负责人联系电话</span>
<el-input v-model="it.phone" class="txt-phone"/>
</el-col> </el-col>
</el-row> </el-row>
<el-table :data="projectDeptsList" :row-class-name="rowProjectDeptsIndex" </div>
@selection-change="handleDeptsSelectionChange" ref="projectDeptsRef">
<el-table-column type="selection" width="50" align="center" />
<el-table-column label="序号" align="center" prop="index" width="50" />
<el-table-column label="单位类型" prop="deptType" align="center">
<template #default="scope">
<el-select v-model="scope.row.deptType" placeholder="请选择单位类型">
<el-option v-for="dict in pro_dept_type" :key="dict.value" :label="dict.label"
:value="dict.value"></el-option>
</el-select>
</template>
</el-table-column>
<el-table-column label="单位负责人" prop="leader" align="center">
<template #default="scope">
<el-input v-model="scope.row.leader" placeholder="请输入负责人姓名" />
</template>
</el-table-column>
<el-table-column label="负责人联系电话" prop="phone" align="center">
<template #default="scope">
<el-input v-model="scope.row.phone" placeholder="请输入负责人联系电话" />
</template>
</el-table-column>
</el-table>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="项目大屏设置" name="setting"> <el-tab-pane label="项目大屏设置" name="setting" v-if="data.opt=='edit'" class="pan-setting">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="项目显示名" prop="orgName"> <el-form-item label="项目显示名" prop="orgName">
@ -297,26 +286,26 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="12"> <el-col :span="12" :class="form.setting.orgLogo?'no-up':'can-up'" class="up-img">
<el-form-item label="显示LOGO" prop="orgLogo"> <el-form-item label="显示LOGO" prop="orgLogo">
<image-upload v-model="form.setting.orgLogo" :limit="1" /> <image-upload v-model="form.setting.orgLogo" :limit="1" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12" :class="form.setting.orgPlane?'no-up':'can-up'" class="up-img">
<el-form-item label="项目平面图" prop="orgPlane"> <el-form-item label="项目平面图" prop="orgPlane">
<image-upload v-model="form.setting.orgPlane" :limit="3" /> <image-upload v-model="form.setting.orgPlane" :limit="1" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24" :class="form.setting.orgImage && form.setting.orgImage.split(',').length==9?'no-up':'can-up'" class="up-img">
<el-form-item label="项目" prop="orgImage"> <el-form-item label="项目预览图" prop="orgImage">
<image-upload v-model="form.setting.orgImage" :limit="9" /> <image-upload v-model="form.setting.orgImage" :limit="9" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="24" :class="form.setting.orgVideo?'no-up':'can-up'" class="up-video">
<el-form-item label="项目视频" prop="orgVideo"> <el-form-item label="项目视频" prop="orgVideo">
<file-upload v-model="form.setting.orgVideo" :limit="1" :fileType="['mp4']" :fileSize="100" /> <file-upload v-model="form.setting.orgVideo" :limit="1" :fileType="['mp4']" :fileSize="100" />
</el-form-item> </el-form-item>
@ -395,7 +384,11 @@ const data = reactive({
projectTimeLimit: [{ required: true, message: "工程期限不能为空", trigger: "blur" }], projectTimeLimit: [{ required: true, message: "工程期限不能为空", trigger: "blur" }],
totalInvestment: [{ required: true, message: "项目总投资不能为空", trigger: "blur" }], totalInvestment: [{ required: true, message: "项目总投资不能为空", trigger: "blur" }],
contractAmount: [{ required: true, message: "合同金额不能为空", trigger: "blur" }], contractAmount: [{ required: true, message: "合同金额不能为空", trigger: "blur" }],
} },
allDeptTree:[],
compOptions:[],
opt:'',
}); });
const { queryParams, form, rules } = toRefs(data); const { queryParams, form, rules } = toRefs(data);
@ -469,6 +462,7 @@ function reset() {
setting: {} setting: {}
}; };
proxy.resetForm("proProjectInfoRef"); proxy.resetForm("proProjectInfoRef");
activeName.value="base";
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
@ -492,6 +486,7 @@ function handleSelectionChange(selection) {
/** 新增按钮操作 */ /** 新增按钮操作 */
function handleAdd() { function handleAdd() {
data.opt="add"
reset(); reset();
open.value = true; open.value = true;
title.value = "添加项目信息"; title.value = "添加项目信息";
@ -499,12 +494,30 @@ function handleAdd() {
/** 修改按钮操作 */ /** 修改按钮操作 */
function handleUpdate(row) { function handleUpdate(row) {
data.opt="edit"
reset(); reset();
const _id = row.id || ids.value const _id = row.id || ids.value
getProProjectInfo(_id).then(response => { getProProjectInfo(_id).then(response => {
form.value = response.data; form.value = response.data;
form.value.setting=response.data.setting||{
orgName:'',
orgLogo:'',
orgPlane:'',
orgImage:[],
orgVideo:''
};
open.value = true; open.value = true;
title.value = "修改项目信息"; title.value = "修改项目信息";
projectDeptsList.value=(response.data.projectDeptsList||[]).filter(d=>d.id);
if(projectDeptsList.value.length==0){
projectDeptsList.value=[
{deptType:'建设单位',deptName:'',leader:'',phone:''},
{deptType:'监理单位',deptName:'',leader:'',phone:''},
{deptType:'设计单位',deptName:'',leader:'',phone:''},
{deptType:'检测单位',deptName:'',leader:'',phone:''},
{deptType:'勘察单位',deptName:'',leader:'',phone:''},
];
}
}); });
} }
@ -543,17 +556,21 @@ function handleDeptsSelectionChange(selection) {
/** 提交按钮 */ /** 提交按钮 */
function submitForm() { function submitForm() {
debugger
proxy.$refs["proProjectInfoRef"].validate(valid => { proxy.$refs["proProjectInfoRef"].validate(valid => {
if (valid) { if (valid) {
form.value.projectDeptsList = projectDeptsList.value; form.value.projectDeptsList = projectDeptsList.value;
let postData={
...form.value
}
if (form.value.id != null) { if (form.value.id != null) {
updateProProjectInfo(form.value).then(response => { updateProProjectInfo(postData).then(response => {
proxy.$modal.msgSuccess("修改成功"); proxy.$modal.msgSuccess("修改成功");
open.value = false; open.value = false;
getList(); getList();
}); });
} else { } else {
addProProjectInfo(form.value).then(response => { addProProjectInfo(postData).then(response => {
proxy.$modal.msgSuccess("新增成功"); proxy.$modal.msgSuccess("新增成功");
open.value = false; open.value = false;
getList(); getList();
@ -595,11 +612,37 @@ function handleExport() {
/** 查询部门下拉树结构 */ /** 查询部门下拉树结构 */
function getDeptTree() { function getDeptTree() {
deptTreeSelect().then(response => {
data.allDeptTree = response.data;
});
listDept({ deptType: 2 }).then(response => { listDept({ deptType: 2 }).then(response => {
deptOptions.value = response.data; data.compOptions = response.data;
}); });
}; };
//
function doChangeComp(){
const findDept=nodes=>{
let tmps=nodes.filter(d=>d.data.deptId==form.value.deptId);
if(tmps.length>0){
return tmps[0].children;
}else{
for(let i=0;i<nodes.length;i++){
let obj=findDept(nodes[i].children);
if(obj){
return obj;
}
}
return [];
}
};
if(form.value.deptId){
deptOptions.value=findDept(data.allDeptTree);
}else{
deptOptions.value=[]
}
}
/** 地图选择 */ /** 地图选择 */
function getMapInfo() { function getMapInfo() {
mapRef.value.showDlg(); mapRef.value.showDlg();
@ -609,3 +652,54 @@ function getMapInfo() {
getList(); getList();
getDeptTree(); getDeptTree();
</script> </script>
<style lang="scss">
.project-info-edit-dlg{
.prj-dept-item{
margin-bottom: 20px;
.dept-item-header{
display: flex;
color: #2196F3;
align-items: center;
.sp-header{
display: inline-block;
margin-left: 4px;
}
}
.el-input{
display: inline-block;
width:auto;
}
.sp-label{
font-size:12px;
color:#888;
&::after{
content: ":";
}
}
}
.el-tab-pane.pan-setting{
.el-form-item{
flex-flow: column;
margin-bottom:0px;
}
.up-img{
&.no-up{
.el-upload__tip{
display: none;
}
}
}
.up-video{
&.no-up{
.el-upload__tip{
display: none;
}
.upload-file-uploader{
display: none;
}
}
}
}
}
</style>

View File

@ -132,7 +132,7 @@
@pagination="getList" @pagination="getList"
/> />
<!-- 预览界面 --> <!-- 预览界面 -->
<el-dialog :title="preview.title" v-model="preview.open" width="80%" top="5vh" append-to-body custom-class="scrollbar"> <el-dialog :title="preview.title" v-model="preview.open" width="80%" top="5vh" append-to-body class="scrollbar">
<el-tabs v-model="preview.activeName"> <el-tabs v-model="preview.activeName">
<el-tab-pane <el-tab-pane
v-for="(value, key) in preview.data" v-for="(value, key) in preview.data"