feat(project): 优化项目管理功能

- 添加项目信息导出功能
- 实现项目编码自动生成
- 增加项目属地变更校验
- 优化项目信息更新逻辑
-调整项目阶段和行业类型的字典转换
- 修复用户信息导出时的空指针异常
master
chenhao 2025-05-30 14:50:23 +08:00
parent d5fedeb3f5
commit 1b4f6e3c93
5 changed files with 70 additions and 25 deletions

View File

@ -63,7 +63,8 @@ public class ProjectInfoController extends BaseController
@ResponseBody @ResponseBody
public AjaxResult export(ProjectInfo projectInfo) public AjaxResult export(ProjectInfo projectInfo)
{ {
List<ProjectInfo> list = projectInfoService.selectProjectInfoList(projectInfo); //导出查询是否需要单独
List<ProjectInfo> list = projectInfoService.selectProjectInfoExportList(projectInfo);
ExcelUtil<ProjectInfo> util = new ExcelUtil<ProjectInfo>(ProjectInfo.class); ExcelUtil<ProjectInfo> util = new ExcelUtil<ProjectInfo>(ProjectInfo.class);
return util.exportExcel(list, "项目管理数据"); return util.exportExcel(list, "项目管理数据");
} }

View File

@ -34,7 +34,7 @@ public class ProjectInfo extends BaseEntity
private String projectName; private String projectName;
/** 客户code */ /** 客户code */
@Excel(name = "客户code") // @Excel(name = "客户code")
private String customerCode; private String customerCode;
/** 客户名称 */ /** 客户名称 */
@ -48,14 +48,14 @@ public class ProjectInfo extends BaseEntity
/** 属地 */ /** 属地 */
@Excel(name = "属地") @Excel(name = "属地")
private String province; private String province;
/** 项目把握度 */
@Excel(name = "项目把握度")
private String projectGraspDegree;
/** 项目阶段 */ /** 项目阶段 */
@Excel(name = "项目阶段") @Excel(name = "项目阶段")
private String projectStage; private String projectStage;
/** 项目把握度 */
@Excel(name = "项目把握度")
private String projectGraspDegree;
/** 汇智支撑人员id */ /** 汇智支撑人员id */
@Excel(name = "汇智支撑人员id") @Excel(name = "汇智支撑人员id")
@ -112,6 +112,7 @@ public class ProjectInfo extends BaseEntity
/** 项目描述 */ /** 项目描述 */
@Excel(name = "项目描述") @Excel(name = "项目描述")
private String projectDesc; private String projectDesc;
private Boolean highlight;
/** 软件项目产品信息 */ /** 软件项目产品信息 */
private List<ProjectProductInfo> softwareProjectProductInfoList; private List<ProjectProductInfo> softwareProjectProductInfoList;
/** 硬件项目产品信息 */ /** 硬件项目产品信息 */

View File

@ -58,4 +58,6 @@ public interface IProjectInfoService
* @return * @return
*/ */
public int deleteProjectInfoById(Long id); public int deleteProjectInfoById(Long id);
List<ProjectInfo> selectProjectInfoExportList(ProjectInfo projectInfo);
} }

View File

@ -1,24 +1,27 @@
package com.ruoyi.sip.service.impl; package com.ruoyi.sip.service.impl;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.DictUtils; import com.ruoyi.common.utils.DictUtils;
import com.ruoyi.common.utils.ShiroUtils; import com.ruoyi.common.utils.ShiroUtils;
import com.ruoyi.sip.domain.*; import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.mapper.ProjectInfoMapper;
import com.ruoyi.sip.service.IProjectInfoService;
import com.ruoyi.sip.service.IProjectOperateLogService; import com.ruoyi.sip.service.IProjectOperateLogService;
import com.ruoyi.sip.service.IProjectProductInfoService; import com.ruoyi.sip.service.IProjectProductInfoService;
import com.ruoyi.sip.service.IProjectWorkProgressService; import com.ruoyi.sip.service.IProjectWorkProgressService;
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.ruoyi.sip.mapper.ProjectInfoMapper;
import com.ruoyi.sip.service.IProjectInfoService; import java.math.BigDecimal;
import com.ruoyi.common.core.text.Convert; import java.time.LocalDate;
import java.time.Period;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* Service * Service
@ -77,7 +80,15 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
*/ */
@Override @Override
public List<ProjectInfo> selectProjectInfoList(ProjectInfo projectInfo) { public List<ProjectInfo> selectProjectInfoList(ProjectInfo projectInfo) {
return projectInfoMapper.selectProjectInfoList(projectInfo); //todo 生成订单按钮置灰查询
List<ProjectInfo> projectInfos = projectInfoMapper.selectProjectInfoList(projectInfo);
LocalDate now = LocalDate.now();
for (ProjectInfo info : projectInfos) {
LocalDate localDate = info.getUpdateTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
Period between = Period.between(localDate, now);
info.setHighlight(between.getMonths() >= 2);
}
return projectInfos;
} }
/** /**
@ -89,6 +100,16 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
@Override @Override
public int insertProjectInfo(ProjectInfo projectInfo) { public int insertProjectInfo(ProjectInfo projectInfo) {
//生成项目编码 //生成项目编码
setProjectCode(projectInfo);
projectInfo.setCreateTime(DateUtils.getNowDate());
projectInfo.setUpdateTime(DateUtils.getNowDate());
projectInfo.setCreateBy(ShiroUtils.getUserId().toString());
int i = projectInfoMapper.insertProjectInfo(projectInfo);
saveOtherInfo(projectInfo);
return i;
}
private void setProjectCode(ProjectInfo projectInfo) {
String s = projectInfoMapper.selectMaxProjectCode(projectInfo); String s = projectInfoMapper.selectMaxProjectCode(projectInfo);
if (s == null) { if (s == null) {
projectInfo.setProjectCode(PROJECT_CODE_PREFIX + "00001"); projectInfo.setProjectCode(PROJECT_CODE_PREFIX + "00001");
@ -96,11 +117,6 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
projectInfo.setProjectCode(PROJECT_CODE_PREFIX + String.format("%0" + PROJECT_CODE_LENGTH + "d", projectInfo.setProjectCode(PROJECT_CODE_PREFIX + String.format("%0" + PROJECT_CODE_LENGTH + "d",
Integer.parseInt(s.substring(PROJECT_CODE_PREFIX.length())) + 1)); Integer.parseInt(s.substring(PROJECT_CODE_PREFIX.length())) + 1));
} }
projectInfo.setCreateTime(DateUtils.getNowDate());
projectInfo.setCreateBy(ShiroUtils.getUserId().toString());
int i = projectInfoMapper.insertProjectInfo(projectInfo);
saveOtherInfo(projectInfo);
return i;
} }
private void saveOtherInfo(ProjectInfo projectInfo1) { private void saveOtherInfo(ProjectInfo projectInfo1) {
@ -142,9 +158,22 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
@Override @Override
public int updateProjectInfo(ProjectInfo projectInfo) { public int updateProjectInfo(ProjectInfo projectInfo) {
// 获取更新前的项目信息 // 获取更新前的项目信息
ProjectInfo oldProjectInfo = projectInfoMapper.selectProjectInfoById(projectInfo.getId()); ProjectInfo oldProjectInfo = this.selectProjectInfoById(projectInfo.getId());
//变更属地校验
if (!projectInfo.getProvince().equals(oldProjectInfo.getProvince())) {
//todo 查询订单信息 如果有抛出异常
//如果没有 变更编码 是否考虑高并发加锁
setProjectCode(projectInfo);
}
int newWorkSize = projectInfo.getProjectWorkProgressList() == null ? 0 : projectInfo.getProjectWorkProgressList().size();
int existWorkSize = oldProjectInfo.getProjectWorkProgressList() == null ? 0 : oldProjectInfo.getProjectWorkProgressList().size();
boolean changeWork = newWorkSize > existWorkSize;
// 更新项目信息 // 更新项目信息
if (changeWork) {
projectInfo.setUpdateTime(DateUtils.getNowDate()); projectInfo.setUpdateTime(DateUtils.getNowDate());
}
int result = projectInfoMapper.updateProjectInfo(projectInfo); int result = projectInfoMapper.updateProjectInfo(projectInfo);
//变更其它信息 //变更其它信息
saveOtherInfo(projectInfo); saveOtherInfo(projectInfo);
@ -315,4 +344,19 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
public int deleteProjectInfoById(Long id) { public int deleteProjectInfoById(Long id) {
return projectInfoMapper.deleteProjectInfoById(id); return projectInfoMapper.deleteProjectInfoById(id);
} }
@Override
public List<ProjectInfo> selectProjectInfoExportList(ProjectInfo projectInfo) {
List<ProjectInfo> projectInfos = projectInfoMapper.selectProjectInfoList(projectInfo);
for (ProjectInfo info : projectInfos) {
info.setIndustryType(DictUtils.getDictLabel(INDUSTRY_TYPE_DICT_TYPE, info.getIndustryType()));
info.setProjectStage(DictUtils.getDictLabel(PROJECT_STAGE_DICT_TYPE, info.getIndustryType()));
if (info.getHzSupportUser() != null) {
List<SysUser> sysUsers = projectInfoMapper.selectUserById(Collections.singletonList(info.getHzSupportUser()));
Map<String, String> userMap = sysUsers.stream().collect(Collectors.toMap(item -> item.getUserId().toString(), SysUser::getUserName));
info.setHzSupportUser(userMap.getOrDefault(info.getHzSupportUser(), ""));
}
}
return projectInfos;
}
} }

View File

@ -105,9 +105,6 @@ public class ProjectProductInfoServiceImpl implements IProjectProductInfoService
} }
//新增数据 //新增数据
projectProductInfoMapper.saveBatch(addList); projectProductInfoMapper.saveBatch(addList);
//todo 记录变更信息
} }
} }