diff --git a/gateway2/src/main/resources/application-dev.yml b/gateway2/src/main/resources/application-dev.yml index 5cad0384..4ae0b766 100644 --- a/gateway2/src/main/resources/application-dev.yml +++ b/gateway2/src/main/resources/application-dev.yml @@ -91,9 +91,9 @@ management: logging: level: - com.sdm.gateway2: DEBUG - org.springframework.cloud.gateway: DEBUG - reactor.netty: DEBUG + com.sdm.gateway2: INFO + org.springframework.cloud.gateway: INFO + reactor.netty: INFO # 0单机处理,1负载均衡轮询 serverType: 0 diff --git a/gateway2/src/main/resources/application-local.yml b/gateway2/src/main/resources/application-local.yml index 15c0f0c1..2588877b 100644 --- a/gateway2/src/main/resources/application-local.yml +++ b/gateway2/src/main/resources/application-local.yml @@ -91,9 +91,9 @@ management: logging: level: - com.sdm.gateway2: DEBUG - org.springframework.cloud.gateway: DEBUG - reactor.netty: DEBUG + com.sdm.gateway2: INFO + org.springframework.cloud.gateway: INFO + reactor.netty: INFO # 0单机处理,1负载均衡轮询 serverType: 0 diff --git a/gateway2/src/main/resources/application-prod.yml b/gateway2/src/main/resources/application-prod.yml index 5cad0384..4ae0b766 100644 --- a/gateway2/src/main/resources/application-prod.yml +++ b/gateway2/src/main/resources/application-prod.yml @@ -91,9 +91,9 @@ management: logging: level: - com.sdm.gateway2: DEBUG - org.springframework.cloud.gateway: DEBUG - reactor.netty: DEBUG + com.sdm.gateway2: INFO + org.springframework.cloud.gateway: INFO + reactor.netty: INFO # 0单机处理,1负载均衡轮询 serverType: 0 diff --git a/gateway2/src/main/resources/logback.xml b/gateway2/src/main/resources/logback.xml index dc7573a6..0f0c1be6 100644 --- a/gateway2/src/main/resources/logback.xml +++ b/gateway2/src/main/resources/logback.xml @@ -50,8 +50,8 @@ - - - - + \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/controller/SimulationNodeController.java b/project/src/main/java/com/sdm/project/controller/SimulationNodeController.java index c8ac55b2..10fe395a 100644 --- a/project/src/main/java/com/sdm/project/controller/SimulationNodeController.java +++ b/project/src/main/java/com/sdm/project/controller/SimulationNodeController.java @@ -147,4 +147,32 @@ public class SimulationNodeController implements ISimuluationNodeFeignClient { } + /** + * 用户组项目统计 + */ + @GetMapping("/getUserGroupProjectStatistics") + @Operation(summary = "用户组项目统计", description = "用户组项目统计") + public SdmResponse getUserGroupProjectStatistics(@Parameter(description = "用户组ID")@RequestParam( value = "userGroupId") Integer userGroupId,@Parameter(description = "用户ID")@RequestParam( value = "userId", required = false) Integer userId) { + return nodeService.getUserGroupProjectStatistics(userGroupId,userId); + } + + /** + * 用户组任务完成情况统计 + */ + @PostMapping("/getUserGroupTaskCompleteStatistics") + @Operation(summary = "用户组任务完成情况统计", description = "用户组任务完成情况统计") + public SdmResponse getUserGroupTaskCompleteStatistics(@RequestBody @Validated GetUserGroupTaskCompleteStatisticsReq req) { + return nodeService.getUserGroupTaskCompleteStatistics(req); + } + + /** + * 用户组难度系数统计 + * + */ + @GetMapping("/getUserGroupDifficultyStatistics") + @Operation(summary = "用户组难度系数统计", description = "用户组难度系数统计") + public SdmResponse getUserGroupDifficultyStatistics(@RequestBody @Validated GetUserGroupTaskCompleteStatisticsReq req) { + return nodeService.getUserGroupDifficultyStatistics(req); + } + } diff --git a/project/src/main/java/com/sdm/project/dao/SimulationNodeMapper.java b/project/src/main/java/com/sdm/project/dao/SimulationNodeMapper.java index 173ab58e..ef784b24 100644 --- a/project/src/main/java/com/sdm/project/dao/SimulationNodeMapper.java +++ b/project/src/main/java/com/sdm/project/dao/SimulationNodeMapper.java @@ -6,14 +6,8 @@ import com.sdm.project.model.po.PerformanceNodePo; import com.sdm.project.model.po.ProjectNodePo; import com.sdm.project.model.po.TaskNodeMemberPo; import com.sdm.project.model.po.TaskNodePo; -import com.sdm.project.model.req.SpdmNodeDetailReq; -import com.sdm.project.model.req.SpdmNodeExtraReq; -import com.sdm.project.model.req.SpdmNodeRelateMemberReq; -import com.sdm.project.model.req.SpdmProjectNodeEditReq; -import com.sdm.project.model.vo.SpdmNodeDetailVo; -import com.sdm.project.model.vo.SpdmNodeExtraVo; -import com.sdm.project.model.vo.SpdmNodeMemberVo; -import com.sdm.project.model.vo.SpdmNodeVo; +import com.sdm.project.model.req.*; +import com.sdm.project.model.vo.*; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -79,4 +73,10 @@ public interface SimulationNodeMapper extends BaseMapper { List getNodeListByIds(@Param("nodeIdList") List nodeIdList); + List getUserGroupProjectStatistics(@Param("userGroupId") Integer userGroupId, @Param("userId") Integer userId); + + List getUserGroupTaskCompleteStatistics(@Param("req") GetUserGroupTaskCompleteStatisticsReq req); + + List getUserGroupDifficultyStatistics(@Param("req") GetUserGroupTaskCompleteStatisticsReq req); + } diff --git a/project/src/main/java/com/sdm/project/dao/SimulationProjectMapper.java b/project/src/main/java/com/sdm/project/dao/SimulationProjectMapper.java index 4ac123c1..939f0954 100644 --- a/project/src/main/java/com/sdm/project/dao/SimulationProjectMapper.java +++ b/project/src/main/java/com/sdm/project/dao/SimulationProjectMapper.java @@ -169,4 +169,5 @@ public interface SimulationProjectMapper { List getTaskListByTag(@Param("req") ProjectTreeReq taskTreeReq); + void getUserGroupProjectStatistics(); } diff --git a/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java b/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java new file mode 100644 index 00000000..e8acf103 --- /dev/null +++ b/project/src/main/java/com/sdm/project/model/req/GetUserGroupTaskCompleteStatisticsReq.java @@ -0,0 +1,49 @@ +package com.sdm.project.model.req; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * 用户组任务完成情况统计请求参数 + */ +@Data +@Schema(description = "用户组任务完成情况统计请求参数") +public class GetUserGroupTaskCompleteStatisticsReq { + @Schema(description = "用户组ID") + @NotNull + private Integer userGroupId; + + @Schema(description = "用户ID") + private Integer userId; + + @Schema(description = "标签1") + private String tag1; + + @Schema(description = "标签2") + private String tag2; + + @Schema(description = "标签3") + private String tag3; + + @Schema(description = "标签4") + private String tag4; + + @Schema(description = "标签5") + private String tag5; + + @Schema(description = "标签6") + private String tag6; + + @Schema(description = "标签7") + private String tag7; + + @Schema(description = "标签8") + private String tag8; + + @Schema(description = "标签9") + private String tag9; + + @Schema(description = "标签10") + private String tag10; +} \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/model/vo/UserGroupDifficultyStatisticsVo.java b/project/src/main/java/com/sdm/project/model/vo/UserGroupDifficultyStatisticsVo.java new file mode 100644 index 00000000..07400dfa --- /dev/null +++ b/project/src/main/java/com/sdm/project/model/vo/UserGroupDifficultyStatisticsVo.java @@ -0,0 +1,14 @@ +package com.sdm.project.model.vo; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +@Data +public class UserGroupDifficultyStatisticsVo { + private Integer userId; + private String userName; + private Map difficultyCount = new HashMap<>(); + private Integer totalTasks; +} diff --git a/project/src/main/java/com/sdm/project/model/vo/UserGroupDifficultyVo.java b/project/src/main/java/com/sdm/project/model/vo/UserGroupDifficultyVo.java new file mode 100644 index 00000000..807ae252 --- /dev/null +++ b/project/src/main/java/com/sdm/project/model/vo/UserGroupDifficultyVo.java @@ -0,0 +1,11 @@ +package com.sdm.project.model.vo; + +import lombok.Data; + +@Data +public class UserGroupDifficultyVo { + private float difficulty; + private Integer userId; + private String nickname; + private Integer groupId; +} diff --git a/project/src/main/java/com/sdm/project/model/vo/UserGroupProjectVo.java b/project/src/main/java/com/sdm/project/model/vo/UserGroupProjectVo.java new file mode 100644 index 00000000..8038490c --- /dev/null +++ b/project/src/main/java/com/sdm/project/model/vo/UserGroupProjectVo.java @@ -0,0 +1,14 @@ +package com.sdm.project.model.vo; + +import lombok.Data; + +/** + * 用户项目统计VO + */ +@Data +public class UserGroupProjectVo { + private String nodeId; + private Integer userId; + private String nickname; + private Integer groupId; +} diff --git a/project/src/main/java/com/sdm/project/model/vo/UserGroupTaskCompleteStatisticsVo.java b/project/src/main/java/com/sdm/project/model/vo/UserGroupTaskCompleteStatisticsVo.java new file mode 100644 index 00000000..32b5bc42 --- /dev/null +++ b/project/src/main/java/com/sdm/project/model/vo/UserGroupTaskCompleteStatisticsVo.java @@ -0,0 +1,14 @@ +package com.sdm.project.model.vo; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + +@Data +public class UserGroupTaskCompleteStatisticsVo { + private Integer userId; + private String userName; + private Map statusCount = new HashMap<>(); + private Integer totalTasks; +} \ No newline at end of file diff --git a/project/src/main/java/com/sdm/project/model/vo/UserGroupTaskCompleteVo.java b/project/src/main/java/com/sdm/project/model/vo/UserGroupTaskCompleteVo.java new file mode 100644 index 00000000..40ceac9e --- /dev/null +++ b/project/src/main/java/com/sdm/project/model/vo/UserGroupTaskCompleteVo.java @@ -0,0 +1,11 @@ +package com.sdm.project.model.vo; + +import lombok.Data; + +@Data +public class UserGroupTaskCompleteVo { + private String exeStatus; + private String nickname; + private Integer userId; + private Integer groupId; +} diff --git a/project/src/main/java/com/sdm/project/service/INodeService.java b/project/src/main/java/com/sdm/project/service/INodeService.java index cc62929d..8a50f421 100644 --- a/project/src/main/java/com/sdm/project/service/INodeService.java +++ b/project/src/main/java/com/sdm/project/service/INodeService.java @@ -30,4 +30,11 @@ public interface INodeService extends IService { SdmResponse> getAllNodeByProjectIdAndType(Integer chooseNodeId, String nextNodeType); + SdmResponse getUserGroupProjectStatistics(Integer userGroupId, Integer userId); + + SdmResponse getUserGroupTaskCompleteStatistics(GetUserGroupTaskCompleteStatisticsReq req); + + //用户组难度系数统计 + SdmResponse getUserGroupDifficultyStatistics(GetUserGroupTaskCompleteStatisticsReq req); + } diff --git a/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java b/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java index d2c52913..896e1949 100644 --- a/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java +++ b/project/src/main/java/com/sdm/project/service/impl/NodeServiceImpl.java @@ -686,4 +686,105 @@ public class NodeServiceImpl extends ServiceImpl userGroupProjectStatistics = this.baseMapper.getUserGroupProjectStatistics(userGroupId, userId); + if(CollectionUtils.isEmpty(userGroupProjectStatistics)) { + return SdmResponse.success(new ArrayList<>()); + } + + // 按用户ID统计项目数量 + Map userProjectCountMap = new HashMap<>(); + // 存储每个用户的详细信息,使用LinkedHashMap保持插入顺序 + Map userId2UserGroupProjectVo = new LinkedHashMap<>(); + + for (UserGroupProjectVo vo : userGroupProjectStatistics) { + Integer userIdKey = vo.getUserId(); + userProjectCountMap.put(userIdKey, userProjectCountMap.getOrDefault(userIdKey, 0) + 1); + // 只保存第一个遇到的用户信息,或者可以考虑保存最新的 + if (!userId2UserGroupProjectVo.containsKey(userIdKey)) { + userId2UserGroupProjectVo.put(userIdKey, vo); + } + } + + // 转换为List>格式,便于前端展示 + List> userResult = new ArrayList<>(); + // 添加用户项目统计 + for (Map.Entry entry : userProjectCountMap.entrySet()) { + Map item = new HashMap<>(); + item.put("userId", entry.getKey()); + item.put("userName", userId2UserGroupProjectVo.get(entry.getKey()).getNickname()); + item.put("projectCount", entry.getValue()); + userResult.add(item); + } + return SdmResponse.success(userResult); + } + + @Override + public SdmResponse getUserGroupTaskCompleteStatistics(GetUserGroupTaskCompleteStatisticsReq req) { + List userGroupTaskCompleteStatistics = this.baseMapper.getUserGroupTaskCompleteStatistics(req); + + // 按用户分组统计任务状态 + Map userStatisticsMap = new HashMap<>(); + + // 统计每个用户的各种状态任务数量 + for (UserGroupTaskCompleteVo item : userGroupTaskCompleteStatistics) { + Integer userId = item.getUserId(); + String exeStatus = item.getExeStatus(); + + UserGroupTaskCompleteStatisticsVo userStat = userStatisticsMap.getOrDefault(userId, new UserGroupTaskCompleteStatisticsVo()); + userStat.setUserId(userId); + userStat.setUserName(item.getNickname()); + + Map statusCount = userStat.getStatusCount(); + if (statusCount == null) { + statusCount = new HashMap<>(); + userStat.setStatusCount(statusCount); + } + + statusCount.put(exeStatus, statusCount.getOrDefault(exeStatus, 0) + 1); + userStat.setTotalTasks(userStat.getTotalTasks() == null ? 1 : userStat.getTotalTasks() + 1); + + userStatisticsMap.put(userId, userStat); + } + + // 转换为列表返回 + List result = new ArrayList<>(userStatisticsMap.values()); + + return SdmResponse.success(result); + } + + @Override + public SdmResponse getUserGroupDifficultyStatistics(GetUserGroupTaskCompleteStatisticsReq req) { + List userGroupDifficultyStatistics = this.baseMapper.getUserGroupDifficultyStatistics(req); + + // 按用户分组统计任务状态 + Map userStatisticsMap = new HashMap<>(); + + // 统计每个用户的各种状态任务数量 + for (UserGroupDifficultyVo item : userGroupDifficultyStatistics) { + Integer userId = item.getUserId(); + Float difficulty = item.getDifficulty(); + + UserGroupDifficultyStatisticsVo userStat = userStatisticsMap.getOrDefault(userId, new UserGroupDifficultyStatisticsVo()); + userStat.setUserId(userId); + userStat.setUserName(item.getNickname()); + + Map statusCount = userStat.getDifficultyCount(); + if (statusCount == null) { + statusCount = new HashMap<>(); + userStat.setDifficultyCount(statusCount); + } + + statusCount.put(difficulty, statusCount.getOrDefault(difficulty, 0) + 1); + userStat.setTotalTasks(userStat.getTotalTasks() == null ? 1 : userStat.getTotalTasks() + 1); + + userStatisticsMap.put(userId, userStat); + } + + // 转换为列表返回 + List result = new ArrayList<>(userStatisticsMap.values()); + + return SdmResponse.success(result); + } } diff --git a/project/src/main/resources/mapper/SimulationNodeMapper.xml b/project/src/main/resources/mapper/SimulationNodeMapper.xml index 5a5f25fb..553bf776 100644 --- a/project/src/main/resources/mapper/SimulationNodeMapper.xml +++ b/project/src/main/resources/mapper/SimulationNodeMapper.xml @@ -7,7 +7,8 @@ insert into simulation_node (uuid,nodeName,nodeCode,englishName,nodeType,nodeSubType,nodeStatus,parentId,folderId,nodeLevel,beginTime,endTime,finishTime,progress, - achieveStatus,nodeVersion,tenantId,description,detailImgUrl,creator,create_time,tag1,tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10) values + achieveStatus,nodeVersion,tenantId,description,detailImgUrl,creator,create_time,tag1,tag2,tag3,tag4,tag5,tag6,tag7,tag8,tag9,tag10) + values (#{addNode.uuid},#{addNode.nodeName},#{addNode.nodeCode},'',#{addNode.nodeType},#{addNode.nodeSubType},'0',#{addNode.pid}, '',1,#{addNode.beginTime},#{addNode.endTime},'',#{addNode.progressStatus},#{addNode.achieveStatus},'1',#{addNode.tenantId},#{addNode.description}, @@ -26,7 +27,8 @@ - insert into simulation_node_extra (nodeId,propertyName,propertyValue,valueType,propertyClass,creator,create_time) values + insert into simulation_node_extra + (nodeId,propertyName,propertyValue,valueType,propertyClass,creator,create_time) values (#{addNodeExtra.nodeId},#{addNodeExtra.propertyName},#{addNodeExtra.propertyValue},#{addNodeExtra.valueType},#{addNodeExtra.propertyClass},#{addNodeExtra.creator},#{addNodeExtra.createTime}) @@ -42,19 +44,19 @@ nodeCode = #{editNode.nodeCode}, - nodeSubType = #{editNode.nodeSubType}, + nodeSubType = #{editNode.nodeSubType}, - beginTime = #{editNode.beginTime}, + beginTime = #{editNode.beginTime}, - endTime = #{editNode.endTime}, + endTime = #{editNode.endTime}, - description = #{editNode.description}, + description = #{editNode.description}, - detailImgUrl = #{editNode.detailImgUrl} + detailImgUrl = #{editNode.detailImgUrl} exe_status = #{editNode.exeStatus} @@ -235,26 +237,25 @@ + + + \ No newline at end of file