From 8bdbbdccd542e1eeec6c8e4b176436578965fd07 Mon Sep 17 00:00:00 2001 From: wangna0328 <3402195679@qq.com> Date: Wed, 6 Aug 2025 14:43:11 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E4=BA=BA=E5=91=98=E8=B0=83?= =?UTF-8?q?=E5=BA=A6=E6=A8=A1=E5=9D=97=E5=89=8D=E7=AB=AF=E5=8D=A1=E7=89=87?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=81=94=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/ProjectBudgetInfoEntity.java | 5 - .../znpt/domain/vo/ProjectBudgetInfoReq.java | 3 - .../znpt/domain/vo/ProjectBudgetInfoResp.java | 2 - .../znpt/domain/vo/ProjectDetailResp.java | 23 ++++- .../znpt/domain/vo/ProjectKanbanDataResp.java | 66 ++++++++++++++ .../impl/ProjectBudgetInfoServiceImpl.java | 3 - .../impl/ProjectMemberServiceImpl.java | 91 +++++++++++++++++-- .../mapper/ProjectBudgetInfoMapper.xml | 5 +- 8 files changed, 171 insertions(+), 27 deletions(-) diff --git a/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java b/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java index 7b5e4bb..dc654d9 100644 --- a/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java +++ b/core/src/main/java/com/dite/znpt/domain/entity/ProjectBudgetInfoEntity.java @@ -43,11 +43,6 @@ public class ProjectBudgetInfoEntity extends AuditableEntity implements Serializ @TableField("budget_name") private String budgetName; - @ExcelProperty("预算类型") - @ApiModelProperty("预算类型") - @TableField("budget_type") - private String budgetType; - @ExcelProperty("预算金额(万元)") @ApiModelProperty("预算金额(万元)") @TableField("budget_amount") diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java index 60caa06..a75f4d4 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoReq.java @@ -26,9 +26,6 @@ public class ProjectBudgetInfoReq implements Serializable { @ApiModelProperty("预算名称") private String budgetName; - @ApiModelProperty("预算类型") - private String budgetType; - @ApiModelProperty("预算金额(万元)") private Double budgetAmount; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java index 70b2d3f..7e6c3c0 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectBudgetInfoResp.java @@ -16,7 +16,5 @@ import lombok.EqualsAndHashCode; @ApiModel("项目预算信息响应实体") public class ProjectBudgetInfoResp extends ProjectBudgetInfoEntity { - @ApiModelProperty("预算类型描述") - private String budgetTypeDesc; } diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java index 2266301..d92ce3a 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectDetailResp.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; @@ -70,12 +71,31 @@ public class ProjectDetailResp { @ApiModelProperty("结束时间") private LocalDate endDate; + @ApiModelProperty("计划开始时间") + private LocalDate plannedStartDate; + @ApiModelProperty("创建时间") private String createTime; @ApiModelProperty("更新时间") private String updateTime; + // 新增字段 - 对应前端ProjectCard接口 + @ApiModelProperty("项目预算(万元)") + private BigDecimal budget; + + @ApiModelProperty("项目经理") + private String manager; + + @ApiModelProperty("团队规模") + private Integer teamSize; + + @ApiModelProperty("准备进度百分比") + private Integer preparationProgress; + + @ApiModelProperty("项目进度百分比") + private Integer progress; + // 项目人员信息(从新关联表获取) @ApiModelProperty("项目人员列表") private List projectMembers; @@ -152,9 +172,6 @@ public class ProjectDetailResp { @ApiModelProperty("预算名称") private String budgetName; - @ApiModelProperty("预算类型") - private String budgetType; - @ApiModelProperty("预算金额(万元)") private Double budgetAmount; diff --git a/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java index f80c696..2e7e598 100644 --- a/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java +++ b/core/src/main/java/com/dite/znpt/domain/vo/ProjectKanbanDataResp.java @@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.math.BigDecimal; import java.time.LocalDate; import java.util.List; @@ -71,6 +72,9 @@ public class ProjectKanbanDataResp { @ApiModelProperty("结束时间") private LocalDate endDate; + @ApiModelProperty("计划开始时间") + private LocalDate plannedStartDate; + @ApiModelProperty("项目经理") private String projectManagerName; @@ -103,5 +107,67 @@ public class ProjectKanbanDataResp { @ApiModelProperty("更新时间") private String updateTime; + + // 新增字段 - 对应前端ProjectCard接口 + @ApiModelProperty("项目预算(万元)") + private BigDecimal budget; + + @ApiModelProperty("项目经理") + private String manager; + + @ApiModelProperty("团队规模") + private Integer teamSize; + + @ApiModelProperty("准备进度百分比") + private Integer preparationProgress; + + @ApiModelProperty("项目进度百分比") + private Integer progress; + + @ApiModelProperty("团队成员列表") + private List teamMembers; + + @Data + @ApiModel(value="TeamMemberResp对象", description="团队成员响应") + public static class TeamMemberResp { + @ApiModelProperty("成员ID") + private String memberId; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("用户姓名") + private String userName; + + @ApiModelProperty("用户账号") + private String userAccount; + + @ApiModelProperty("用户头像") + private String userAvatar; + + @ApiModelProperty("角色类型") + private String roleType; + + @ApiModelProperty("角色类型描述") + private String roleTypeDesc; + + @ApiModelProperty("岗位代码") + private String jobCode; + + @ApiModelProperty("岗位代码描述") + private String jobCodeDesc; + + @ApiModelProperty("岗位描述") + private String jobDesc; + + @ApiModelProperty("加入时间") + private LocalDate joinDate; + + @ApiModelProperty("离开时间") + private LocalDate leaveDate; + + @ApiModelProperty("状态") + private String status; + } } } \ No newline at end of file diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java index 5380782..4cb1c8d 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectBudgetInfoServiceImpl.java @@ -62,9 +62,6 @@ public class ProjectBudgetInfoServiceImpl extends ServiceImpl detailByProjectId(String projectId) { List projectBudgetInfoList= this.baseMapper.detailByProjectId(projectId); - projectBudgetInfoList.forEach(resp -> { - resp.setBudgetTypeDesc(BudgeTypeEnum.getDescByCode(resp.getBudgetType())); - }); return projectBudgetInfoList; } diff --git a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java index 8c51d1d..9ee100e 100644 --- a/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java +++ b/core/src/main/java/com/dite/znpt/service/impl/ProjectMemberServiceImpl.java @@ -19,6 +19,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -293,7 +294,51 @@ public class ProjectMemberServiceImpl extends ServiceImpl projectMembers = selectByProjectId(projectId); + resp.setProjectMembers(projectMembers); + + // 计算团队规模 + resp.setTeamSize(projectMembers.size()); + + // 获取项目经理信息 + String managerName = projectMembers.stream() + .filter(member -> "PROJECT_MANAGER".equals(member.getRoleType())) + .map(ProjectMemberResp::getUserName) + .findFirst() + .orElse(""); + resp.setManager(managerName); + + // 计算项目预算(从预算信息中汇总) + List budgets = projectBudgetInfoService.lambdaQuery() + .eq(ProjectBudgetInfoEntity::getProjectId, projectId) + .list(); + BigDecimal totalBudget = budgets.stream() + .map(budget -> BigDecimal.valueOf(budget.getBudgetAmount())) + .reduce(BigDecimal.ZERO, BigDecimal::add); + resp.setBudget(totalBudget); + + // 计算项目进度 + List tasks = projectTaskService.lambdaQuery() + .eq(ProjectTaskEntity::getProjectId, projectId) + .list(); + if (!tasks.isEmpty()) { + long completedTasks = tasks.stream() + .filter(task -> task.getStatus() != null && task.getStatus() == 2) + .count(); + resp.setProgress((int) (completedTasks * 100 / tasks.size())); + } else { + resp.setProgress(0); + } + + // 计算准备进度(基于任务状态) + if (!tasks.isEmpty()) { + long preparedTasks = tasks.stream() + .filter(task -> task.getStatus() != null && task.getStatus() >= 1) + .count(); + resp.setPreparationProgress((int) (preparedTasks * 100 / tasks.size())); + } else { + resp.setPreparationProgress(0); + } // 获取项目机组信息 List turbines = turbineService.lambdaQuery() @@ -307,9 +352,6 @@ public class ProjectMemberServiceImpl extends ServiceImpl tasks = projectTaskService.lambdaQuery() - .eq(ProjectTaskEntity::getProjectId, projectId) - .list(); resp.setTasks(tasks.stream().map(task -> { ProjectDetailResp.TaskInfo info = new ProjectDetailResp.TaskInfo(); BeanUtil.copyProperties(task, info); @@ -318,9 +360,6 @@ public class ProjectMemberServiceImpl extends ServiceImpl budgets = projectBudgetInfoService.lambdaQuery() - .eq(ProjectBudgetInfoEntity::getProjectId, projectId) - .list(); resp.setBudgets(budgets.stream().map(budget -> { ProjectDetailResp.BudgetInfo info = new ProjectDetailResp.BudgetInfo(); BeanUtil.copyProperties(budget, info); @@ -381,6 +420,22 @@ public class ProjectMemberServiceImpl extends ServiceImpl teamMembers = members.stream() + .map(member -> { + ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp teamMember = new ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp(); + BeanUtil.copyProperties(member, teamMember); + return teamMember; + }) + .collect(Collectors.toList()); + item.setTeamMembers(teamMembers); + // 统计机组数量 Long turbineCount = turbineService.lambdaQuery() .eq(TurbineEntity::getProjectId, project.getProjectId()) @@ -403,10 +458,32 @@ public class ProjectMemberServiceImpl extends ServiceImpl 0) { item.setProgressPercentage((int) (completedTaskCount * 100 / taskCount)); + item.setProgress((int) (completedTaskCount * 100 / taskCount)); } else { item.setProgressPercentage(0); + item.setProgress(0); } + // 计算准备进度(基于任务状态) + if (taskCount > 0) { + Long preparedTasks = projectTaskService.lambdaQuery() + .eq(ProjectTaskEntity::getProjectId, project.getProjectId()) + .ge(ProjectTaskEntity::getStatus, 1) + .count(); + item.setPreparationProgress((int) (preparedTasks * 100 / taskCount)); + } else { + item.setPreparationProgress(0); + } + + // 计算项目预算(从预算信息中汇总) + List budgets = projectBudgetInfoService.lambdaQuery() + .eq(ProjectBudgetInfoEntity::getProjectId, project.getProjectId()) + .list(); + BigDecimal totalBudget = budgets.stream() + .map(budget -> BigDecimal.valueOf(budget.getBudgetAmount())) + .reduce(BigDecimal.ZERO, BigDecimal::add); + item.setBudget(totalBudget); + return item; }).collect(Collectors.toList()); } diff --git a/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml b/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml index 5425a2b..14507d5 100644 --- a/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml +++ b/core/src/main/resources/mapper/ProjectBudgetInfoMapper.xml @@ -3,7 +3,7 @@ - a.budget_id, a.project_id, a.budget_name, a.budget_type, + a.budget_id, a.project_id, a.budget_name, a.budget_amount, a.budget_desc, a.update_by, a.create_time, a.create_by, a.update_time @@ -23,9 +23,6 @@ and a.budget_name like concat ('%', #{budgetName}, '%') - - and a.budget_type like concat ('%', #{budgetType}, '%') - and a.budget_amount = #{budgetAmount}