Merge remote-tracking branch 'origin/master'

This commit is contained in:
Mr.j 2025-08-06 16:52:03 +08:00
commit e7d892f8a2
9 changed files with 172 additions and 27 deletions

View File

@ -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")

View File

@ -26,9 +26,6 @@ public class ProjectBudgetInfoReq implements Serializable {
@ApiModelProperty("预算名称")
private String budgetName;
@ApiModelProperty("预算类型")
private String budgetType;
@ApiModelProperty("预算金额(万元)")
private Double budgetAmount;

View File

@ -16,7 +16,5 @@ import lombok.EqualsAndHashCode;
@ApiModel("项目预算信息响应实体")
public class ProjectBudgetInfoResp extends ProjectBudgetInfoEntity {
@ApiModelProperty("预算类型描述")
private String budgetTypeDesc;
}

View File

@ -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<ProjectMemberResp> projectMembers;
@ -152,9 +172,6 @@ public class ProjectDetailResp {
@ApiModelProperty("预算名称")
private String budgetName;
@ApiModelProperty("预算类型")
private String budgetType;
@ApiModelProperty("预算金额(万元)")
private Double budgetAmount;

View File

@ -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<TeamMemberResp> 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;
}
}
}

View File

@ -62,9 +62,6 @@ public class ProjectBudgetInfoServiceImpl extends ServiceImpl<ProjectBudgetInfoM
@Override
public List<ProjectBudgetInfoResp> detailByProjectId(String projectId) {
List<ProjectBudgetInfoResp> projectBudgetInfoList= this.baseMapper.detailByProjectId(projectId);
projectBudgetInfoList.forEach(resp -> {
resp.setBudgetTypeDesc(BudgeTypeEnum.getDescByCode(resp.getBudgetType()));
});
return projectBudgetInfoList;
}

View File

@ -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<ProjectMemberMapper, P
resp.setStatusLabel(ProjectStatusEnum.getDescByCode(resp.getStatus()));
// 获取项目人员信息
resp.setProjectMembers(selectByProjectId(projectId));
List<ProjectMemberResp> 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<ProjectBudgetInfoEntity> 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<ProjectTaskEntity> 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<TurbineEntity> turbines = turbineService.lambdaQuery()
@ -307,9 +352,6 @@ public class ProjectMemberServiceImpl extends ServiceImpl<ProjectMemberMapper, P
}).collect(Collectors.toList()));
// 获取项目任务信息
List<ProjectTaskEntity> 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<ProjectMemberMapper, P
}).collect(Collectors.toList()));
// 获取项目预算信息
List<ProjectBudgetInfoEntity> 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<ProjectMemberMapper, P
item.setConstructionTeamLeaderName(memberNames.get("TEAM_LEADER"));
item.setConstructorNames(memberNames.get("CONSTRUCTOR"));
// 设置项目经理
item.setManager(memberNames.get("PROJECT_MANAGER"));
// 设置团队规模
item.setTeamSize(members.size());
// 转换为团队成员列表
List<ProjectKanbanDataResp.ProjectKanbanItem.TeamMemberResp> 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<ProjectMemberMapper, P
// 计算项目进度百分比
if (taskCount > 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<ProjectBudgetInfoEntity> 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());
}

View File

@ -3,7 +3,7 @@
<mapper namespace="com.dite.znpt.mapper.ProjectBudgetInfoMapper">
<sql id="Base_Column_List">
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
</sql>
@ -23,9 +23,6 @@
<if test="budgetName != null and budgetName != ''">
and a.budget_name like concat ('%', #{budgetName}, '%')
</if>
<if test="budgetType != null and budgetType != ''">
and a.budget_type like concat ('%', #{budgetType}, '%')
</if>
<if test="budgetAmount != null">
and a.budget_amount = #{budgetAmount}
</if>

View File

@ -24,6 +24,7 @@ import java.util.List;
* @date 2025/08/05
* @Description: 项目人员管理Controller
*/
@Api(tags = "项目人员管理")
@RestController
@RequestMapping("/project-member")