From 62629e6f9cbc51e45b54332eeadc835feda1a686 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 24 Oct 2025 18:07:01 +0800 Subject: [PATCH] =?UTF-8?q?refactor(oa):=E9=87=8D=E6=9E=84=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E6=8A=A5=E8=A1=A8=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 personalReport 方法返回类型为 PersonalReportDTO - 新增 PersonalReportDTO 类用于封装用户报表数据 - 调整 controller 层接口返回类型以匹配新的 DTO 结构 -优化 service 层数据组装逻辑,提升代码可读性- 在 VO 对象中补充用户信息、项目列表和进度统计字段 - 统一进度统计字段命名与结构,便于前端处理 --- .../OaProjectScheduleStepController.java | 7 +- .../oa/domain/dto/PersonalReportDTO.java | 38 +++++++ .../oa/domain/vo/OaProjectScheduleStepVo.java | 19 ++++ .../IOaProjectScheduleStepService.java | 4 +- .../OaProjectScheduleStepServiceImpl.java | 107 +++++++++--------- 5 files changed, 117 insertions(+), 58 deletions(-) create mode 100644 ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/PersonalReportDTO.java diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectScheduleStepController.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectScheduleStepController.java index 28abb22..d67221c 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectScheduleStepController.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/controller/OaProjectScheduleStepController.java @@ -7,6 +7,7 @@ import java.util.concurrent.TimeUnit; import com.ruoyi.common.core.AjaxResult; import com.ruoyi.oa.domain.bo.BatchBo; +import com.ruoyi.oa.domain.dto.PersonalReportDTO; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; @@ -128,10 +129,10 @@ public class OaProjectScheduleStepController extends BaseController { * @return 报表数据 */ @GetMapping("/personal") - public R> getPersonalReport( + public R getPersonalReport( @RequestParam Long poolId, @RequestParam String nickName - ) { - return R.ok(iOaProjectScheduleStepService.personalReport(poolId,nickName)); + ) { + return R.ok(iOaProjectScheduleStepService.personalReport(poolId, nickName)); } } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/PersonalReportDTO.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/PersonalReportDTO.java new file mode 100644 index 0000000..ce6bce3 --- /dev/null +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/dto/PersonalReportDTO.java @@ -0,0 +1,38 @@ +package com.ruoyi.oa.domain.dto; + +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.oa.domain.OaProjectScheduleStep; +import com.ruoyi.oa.domain.SysOaProject; +import lombok.Data; +import java.util.List; + +/** + * 个人报表顶层返回结果类 + */ +@Data +public class PersonalReportDTO { + /** 用户基本信息 */ + private SysUser userInfo; + + /** 用户负责的项目列表 */ + private List responsibleProjects; + + /** 进度统计信息 */ + private ProgressStats progressStats; + private List userSteps; + + /** + * 进度统计内部类(封装total、completed等字段) + */ + @Data + public static class ProgressStats { + /** 总进度数 */ + private Long total; + /** 已完成进度数 */ + private Long completed; + /** 待验收进度数 */ + private Long pendingAcceptance; + /** 延期进度数 */ + private Long delayed; + } +} \ No newline at end of file diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectScheduleStepVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectScheduleStepVo.java index 03cc30b..2af5558 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectScheduleStepVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaProjectScheduleStepVo.java @@ -9,6 +9,8 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.ruoyi.common.annotation.ExcelDictFormat; import com.ruoyi.common.convert.ExcelDictConvert; import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.oa.domain.SysOaProject; import com.ruoyi.oa.domain.bo.OaProjectScheduleStepBo; import com.ruoyi.system.domain.SysOss; import lombok.Data; @@ -165,4 +167,21 @@ public class OaProjectScheduleStepVo extends BaseEntity { //排序字段 private Integer sortNum; + /** 新增:用户基本信息 */ + private SysUser userInfo; + + /** 新增:用户负责的项目列表 */ + private List responsibleProjects; + + /** 新增:进度统计信息 */ + private ProgressStats progressStats; + + /** 进度统计内部类(封装total、completed等字段) */ + @Data + public static class ProgressStats { + private Long total; + private Long completed; + private Long pendingAcceptance; + private Long delayed; + } } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleStepService.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleStepService.java index a42a6fe..da20d91 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleStepService.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/IOaProjectScheduleStepService.java @@ -1,9 +1,11 @@ package com.ruoyi.oa.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.R; import com.ruoyi.oa.domain.OaProjectScheduleStep; import com.ruoyi.oa.domain.bo.BatchBo; import com.ruoyi.oa.domain.dto.NodeDTO; +import com.ruoyi.oa.domain.dto.PersonalReportDTO; import com.ruoyi.oa.domain.vo.OaProjectScheduleStepVo; import com.ruoyi.oa.domain.bo.OaProjectScheduleStepBo; import com.ruoyi.common.core.page.TableDataInfo; @@ -70,5 +72,5 @@ public interface IOaProjectScheduleStepService{ List> queryProgressByHeader(); - Map personalReport(Long poolId, String nickName); + PersonalReportDTO personalReport(Long poolId, String nickName); } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java index cb63bf8..4a53d87 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaProjectScheduleStepServiceImpl.java @@ -18,6 +18,7 @@ import com.ruoyi.oa.domain.OaProjectSchedule; import com.ruoyi.oa.domain.SysOaProject; import com.ruoyi.oa.domain.bo.BatchBo; import com.ruoyi.oa.domain.dto.NodeDTO; +import com.ruoyi.oa.domain.dto.PersonalReportDTO; import com.ruoyi.oa.mapper.OaBonusProjectRelMapper; import com.ruoyi.oa.mapper.OaProjectScheduleMapper; import com.ruoyi.oa.mapper.SysOaProjectMapper; @@ -340,83 +341,81 @@ public class OaProjectScheduleStepServiceImpl implements IOaProjectScheduleStepS * @return 包含个人信息、负责项目、进度统计的结果 */ @Override - public Map personalReport(Long poolId,String nickName) { - Map result = new HashMap<>(); - - //查询用户基本信息(sys_user表) + public PersonalReportDTO personalReport(Long poolId, String nickName) { + // 1. 查询用户基本信息 SysUser user = sysUserMapper.selectOne( Wrappers.lambdaQuery() .eq(SysUser::getNickName, nickName) - .eq(SysUser::getDelFlag, "0") // 未删除 + .eq(SysUser::getDelFlag, "0") ); if (user == null) { throw new RuntimeException("未找到用户:" + nickName); } - result.put("userInfo", user); // 个人基本信息(可按需筛选字段) - // 根据奖金池ID查询关联的项目ID(oa_bonus_project_rel表) + // 2. 查询奖金池关联的项目ID List rels = bonusProjectRelMapper.selectList( Wrappers.lambdaQuery() .eq(OaBonusProjectRel::getPoolId, poolId) .eq(OaBonusProjectRel::getDelFlag, "0") ); - if (CollUtil.isEmpty(rels)) { - result.put("responsibleProjects", Collections.emptyList()); - result.put("progressStats", Collections.emptyMap()); - return result; - } - List projectIds = rels.stream() - .map(OaBonusProjectRel::getProjectId) - .collect(Collectors.toList()); + List projectIds = CollUtil.isEmpty(rels) + ? Collections.emptyList() + : rels.stream().map(OaBonusProjectRel::getProjectId).collect(Collectors.toList()); - // 筛选用户负责的项目(sys_oa_project表:functionary = nickName) + // 3. 筛选用户负责的项目 List responsibleProjects = projectMapper.selectList( Wrappers.lambdaQuery() .in(SysOaProject::getProjectId, projectIds) - .eq(SysOaProject::getFunctionary, nickName) // 项目负责人匹配 + .eq(SysOaProject::getFunctionary, nickName) ); - result.put("responsibleProjects", responsibleProjects); // 负责的项目列表 - // 查询用户负责的进度及统计(复用进度统计逻辑,限定关联项目) - // 先查询关联项目的进度主表ID(oa_project_schedule) - List schedules = projectScheduleMapper.selectList( - Wrappers.lambdaQuery() - .in(OaProjectSchedule::getProjectId, projectIds) - .eq(OaProjectSchedule::getDelFlag, "0") - ); - if (CollUtil.isEmpty(schedules)) { - result.put("progressStats", Collections.emptyMap()); - return result; + // 4. 查询用户负责的进度步骤(核心数据) + List userSteps = new ArrayList<>(); + if (CollUtil.isNotEmpty(projectIds)) { + // 查询关联项目的进度主表 + List schedules = projectScheduleMapper.selectList( + Wrappers.lambdaQuery() + .in(OaProjectSchedule::getProjectId, projectIds) + .eq(OaProjectSchedule::getDelFlag, "0") + ); + if (CollUtil.isNotEmpty(schedules)) { + List scheduleIds = schedules.stream() + .filter(Objects::nonNull) + .map(OaProjectSchedule::getScheduleId) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + // 查询用户负责的进度步骤 + userSteps = projectScheduleStepMapper.selectList( + Wrappers.lambdaQuery() + .in(OaProjectScheduleStep::getScheduleId, scheduleIds) + .eq(OaProjectScheduleStep::getNodeHeader, nickName) + .eq(OaProjectScheduleStep::getDelFlag, "0") + .eq(OaProjectScheduleStep::getUseFlag, 1) + ); + } } - List scheduleIds = schedules.stream() - .map(OaProjectSchedule::getScheduleId) - .collect(Collectors.toList()); - //查询这些进度下的步骤,且负责人是当前用户 - LambdaQueryWrapper stepWrapper = Wrappers.lambdaQuery(); - stepWrapper.in(OaProjectScheduleStep::getScheduleId, scheduleIds) - .eq(OaProjectScheduleStep::getHeader, nickName) // 进度负责人匹配 - .eq(OaProjectScheduleStep::getDelFlag, "0") - .eq(OaProjectScheduleStep::getUseFlag, 1); - List userSteps = projectScheduleStepMapper.selectList(stepWrapper); - - // 统计进度数据(总数量、完成数、待验收数、延期数) - long total = userSteps.size(); - long completed = userSteps.stream() - .filter(step -> step.getStatus() != null && step.getStatus() == 2) // 已完成 - .count(); - long pendingAcceptance = userSteps.stream() - .filter(step -> step.getStatus() != null && step.getStatus() == 1) // 待验收 - .count(); - long delayed = userSteps.stream() + // 5. 统计进度数据 + PersonalReportDTO.ProgressStats progressStats = new PersonalReportDTO.ProgressStats(); + progressStats.setTotal((long) userSteps.size()); + progressStats.setCompleted(userSteps.stream() + .filter(step -> step.getStatus() != null && step.getStatus() == 2) + .count()); + progressStats.setPendingAcceptance(userSteps.stream() + .filter(step -> step.getStatus() != null && step.getStatus() == 1) + .count()); + progressStats.setDelayed(userSteps.stream() .filter(step -> step.getEndTime() != null && step.getOriginalEndTime() != null) - .filter(step -> step.getEndTime().isAfter(step.getOriginalEndTime())) // 实际结束>原定结束 - .count(); + .filter(step -> step.getEndTime().isAfter(step.getOriginalEndTime())) + .count()); - result.put("total", total); - result.put("completed", completed); - result.put("pendingAcceptance", pendingAcceptance); - result.put("delayed", delayed); + // 6. 封装返回DTO + PersonalReportDTO result = new PersonalReportDTO(); + result.setUserInfo(user); + result.setResponsibleProjects(responsibleProjects); + result.setProgressStats(progressStats); + result.setUserSteps(userSteps); return result; }