优化基于CID 的用户统计

This commit is contained in:
2025-11-13 10:48:13 +08:00
parent d6e0378c65
commit 84dec30ebd
13 changed files with 106 additions and 67 deletions

View File

@@ -1,11 +1,10 @@
package com.sdm.system.model.req.user; package com.sdm.common.entity.req.system;
import com.sdm.system.model.req.BaseReq; import com.sdm.common.entity.BaseReq;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import org.springframework.web.bind.annotation.RequestParam;
@Data @Data
public class QueryGroupDetailReq extends BaseReq { public class QueryGroupDetailReq extends BaseReq {

View File

@@ -1,15 +1,12 @@
package com.sdm.system.model.resp; package com.sdm.common.entity.resp.system;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.system.CIDUserResp;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List; import java.util.List;
/** /**

View File

@@ -1,4 +1,4 @@
package com.sdm.system.model.resp; package com.sdm.common.entity.resp.system;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;

View File

@@ -3,10 +3,12 @@ package com.sdm.common.feign.impl.system;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.LaunchApproveReq; import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.entity.req.system.QueryGroupDetailReq;
import com.sdm.common.entity.req.system.UserListReq; import com.sdm.common.entity.req.system.UserListReq;
import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.entity.resp.system.SysUserGroupDetailResp;
import com.sdm.common.feign.inter.system.ISysUserFeignClient; import com.sdm.common.feign.inter.system.ISysUserFeignClient;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -64,4 +66,21 @@ public class SysUserFeignClientImpl implements ISysUserFeignClient {
return SdmResponse.failed("人员信息未查到"); return SdmResponse.failed("人员信息未查到");
} }
} }
@Override
public SdmResponse<SysUserGroupDetailResp> queryGroupDetail(QueryGroupDetailReq req) {
SdmResponse<SysUserGroupDetailResp> sdmResponse;
try {
log.info("查询用户组信息开始,请求参数:{}",req.toString());
sdmResponse = sysUserClient.queryGroupDetail(req);
log.info("查询用户组信息结束,返回结果:{}",sdmResponse);
if (!sdmResponse.isSuccess() || sdmResponse.getData() == null){
return SdmResponse.failed("查询用户组信息失败");
}
return sdmResponse;
} catch (Exception e) {
log.error("查询用户组信息失败", e);
return SdmResponse.failed("查询用户组信息失败");
}
}
} }

View File

@@ -2,10 +2,13 @@ package com.sdm.common.feign.inter.system;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.LaunchApproveReq; import com.sdm.common.entity.req.system.LaunchApproveReq;
import com.sdm.common.entity.req.system.QueryGroupDetailReq;
import com.sdm.common.entity.req.system.UserListReq; import com.sdm.common.entity.req.system.UserListReq;
import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.system.SysUserGroupDetailResp;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import org.springframework.cloud.openfeign.FeignClient; import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@@ -26,4 +29,10 @@ public interface ISysUserFeignClient {
@PostMapping("/user/listUser") @PostMapping("/user/listUser")
SdmResponse<PageDataResp<List<CIDUserResp>>> listUser(@RequestBody UserListReq req); SdmResponse<PageDataResp<List<CIDUserResp>>> listUser(@RequestBody UserListReq req);
/**
* 根据用户组id查询用户组及组成员列表详情
*/
@PostMapping("/queryGroupDetail")
SdmResponse<SysUserGroupDetailResp> queryGroupDetail(@RequestBody @Validated QueryGroupDetailReq req);
} }

View File

@@ -12,6 +12,7 @@ import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
import java.util.Set;
@Mapper @Mapper
public interface SimulationNodeMapper extends BaseMapper<SimulationNode> { public interface SimulationNodeMapper extends BaseMapper<SimulationNode> {
@@ -73,7 +74,7 @@ public interface SimulationNodeMapper extends BaseMapper<SimulationNode> {
List<SpdmNodeVo> getNodeListByIds(@Param("nodeIdList") List<String> nodeIdList); List<SpdmNodeVo> getNodeListByIds(@Param("nodeIdList") List<String> nodeIdList);
List<UserGroupProjectVo> getUserGroupProjectStatistics(@Param("userGroupId") Long userGroupId, @Param("userId") Long userId); List<UserGroupProjectVo> getUserGroupProjectStatistics(@Param("userIds")Set<Long> userIds );
List<UserGroupTaskCompleteVo> getUserGroupTaskCompleteStatistics(@Param("req") GetUserGroupTaskCompleteStatisticsReq req); List<UserGroupTaskCompleteVo> getUserGroupTaskCompleteStatistics(@Param("req") GetUserGroupTaskCompleteStatisticsReq req);

View File

@@ -10,9 +10,11 @@ import com.sdm.common.entity.req.data.CreateDirReq;
import com.sdm.common.entity.req.project.DelNodeReq; import com.sdm.common.entity.req.project.DelNodeReq;
import com.sdm.common.entity.req.project.RenameNodeReq; import com.sdm.common.entity.req.project.RenameNodeReq;
import com.sdm.common.entity.req.project.SpdmNodeListReq; import com.sdm.common.entity.req.project.SpdmNodeListReq;
import com.sdm.common.entity.req.system.QueryGroupDetailReq;
import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp; import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp;
import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.entity.resp.system.SysUserGroupDetailResp;
import com.sdm.common.feign.impl.data.DataClientFeignClientImpl; import com.sdm.common.feign.impl.data.DataClientFeignClientImpl;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl; import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
import com.sdm.common.utils.RandomUtil; import com.sdm.common.utils.RandomUtil;
@@ -562,7 +564,8 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
log.error("allNodeIdList{},未查询到团队成员", allNodeIdList); log.error("allNodeIdList{},未查询到团队成员", allNodeIdList);
return SdmResponse.success(new ArrayList<>()); return SdmResponse.success(new ArrayList<>());
} }
List<Long> userIdList = spdmNodeMemberVoList.stream().map(SpdmNodeMemberVo::getUserId).distinct().collect(Collectors.toList());; List<Long> userIdList = spdmNodeMemberVoList.stream().map(SpdmNodeMemberVo::getUserId).distinct().collect(Collectors.toList());
;
// 查询node节点下的task的成员仿真负责人和执行人 // 查询node节点下的task的成员仿真负责人和执行人
List<SimulationTask> taskList = simulationTaskService.lambdaQuery().in(SimulationTask::getNodeId, allNodeIdList).list(); List<SimulationTask> taskList = simulationTaskService.lambdaQuery().in(SimulationTask::getNodeId, allNodeIdList).list();
@@ -701,23 +704,40 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
@Override @Override
public SdmResponse getUserGroupProjectStatistics(Long userGroupId, Long userId) { public SdmResponse getUserGroupProjectStatistics(Long userGroupId, Long userId) {
List<UserGroupProjectVo> userGroupProjectStatistics = this.baseMapper.getUserGroupProjectStatistics(userGroupId, userId); QueryGroupDetailReq req = new QueryGroupDetailReq();
req.setCurrent(1);
req.setSize(1000);
req.setId(userGroupId);
req.setTenantId(ThreadLocalContext.getTenantId());
SdmResponse<SysUserGroupDetailResp> sysUserGroupDetailRespSdmResponse = sysUserFeignClient.queryGroupDetail(req);
if (!sysUserGroupDetailRespSdmResponse.isSuccess()
|| ObjectUtils.isEmpty(sysUserGroupDetailRespSdmResponse.getData())
|| ObjectUtils.isEmpty(sysUserGroupDetailRespSdmResponse.getData().getUsers())
|| ObjectUtils.isEmpty(sysUserGroupDetailRespSdmResponse.getData().getUsers().getData())) {
return SdmResponse.success();
}
Map<Long, String> userId2Nickname = sysUserGroupDetailRespSdmResponse.getData().getUsers().getData().stream().collect(Collectors.toMap(CIDUserResp::getUserId, CIDUserResp::getNickname));
Set<Long> userIds = new HashSet<>();
if (ObjectUtils.isEmpty(userId)) {
userIds = userId2Nickname.keySet();
}else {
userIds.add(userId);
}
List<UserGroupProjectVo> userGroupProjectStatistics = this.baseMapper.getUserGroupProjectStatistics(userIds);
if (CollectionUtils.isEmpty(userGroupProjectStatistics)) { if (CollectionUtils.isEmpty(userGroupProjectStatistics)) {
return SdmResponse.success(new ArrayList<>()); return SdmResponse.success(new ArrayList<>());
} }
// 按用户ID统计项目数量 // 按用户ID统计项目数量
Map<Long, Integer> userProjectCountMap = new HashMap<>(); Map<Long, Integer> userProjectCountMap = new HashMap<>();
// 存储每个用户的详细信息使用LinkedHashMap保持插入顺序
Map<Long, UserGroupProjectVo> userId2UserGroupProjectVo = new LinkedHashMap<>();
for (UserGroupProjectVo vo : userGroupProjectStatistics) { for (UserGroupProjectVo vo : userGroupProjectStatistics) {
Long userIdKey = vo.getUserId(); Long userIdKey = vo.getUserId();
userProjectCountMap.put(userIdKey, userProjectCountMap.getOrDefault(userIdKey, 0) + 1); userProjectCountMap.put(userIdKey, userProjectCountMap.getOrDefault(userIdKey, 0) + 1);
// 只保存第一个遇到的用户信息,或者可以考虑保存最新的
if (!userId2UserGroupProjectVo.containsKey(userIdKey)) {
userId2UserGroupProjectVo.put(userIdKey, vo);
}
} }
// 转换为List<Map<String, Object>>格式,便于前端展示 // 转换为List<Map<String, Object>>格式,便于前端展示
@@ -726,7 +746,7 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
for (Map.Entry<Long, Integer> entry : userProjectCountMap.entrySet()) { for (Map.Entry<Long, Integer> entry : userProjectCountMap.entrySet()) {
Map<String, Object> item = new HashMap<>(); Map<String, Object> item = new HashMap<>();
item.put("userId", entry.getKey()); item.put("userId", entry.getKey());
item.put("userName", userId2UserGroupProjectVo.get(entry.getKey()).getNickname()); item.put("userName", userId2Nickname.get(entry.getKey()));
item.put("projectCount", entry.getValue()); item.put("projectCount", entry.getValue());
userResult.add(item); userResult.add(item);
} }

View File

@@ -331,20 +331,12 @@
select select
nm.nodeId, nm.nodeId,
nm.user_id as userId, nm.user_id as userId,
su.nickname, from simulation_node_member
sur.groupId where user_id in (
from simulation_node_member nm <foreach collection='userIds' item='userId' index='index' separator=','>
LEFT JOIN sys_user su on nm.user_id = su.id #{userId}
left join sys_user_group_relation sur on sur.userId = su.id </foreach>
<where> )
nm.user_id is not null and sur.groupId is not null
<if test="userGroupId != null">
and sur.groupId = #{userGroupId}
</if>
<if test="userId != null">
and nm.user_id = #{userId}
</if>
</where>
</select> </select>
<select id="getUserGroupTaskCompleteStatistics" <select id="getUserGroupTaskCompleteStatistics"

View File

@@ -1,16 +1,16 @@
package com.sdm.system.controller; package com.sdm.system.controller;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.QueryGroupDetailReq;
import com.sdm.common.entity.req.system.UserListReq; import com.sdm.common.entity.req.system.UserListReq;
import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.system.CIDRoleResp; import com.sdm.common.entity.resp.system.CIDRoleResp;
import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.feign.inter.system.ISysUserFeignClient; import com.sdm.common.feign.inter.system.ISysUserFeignClient;
import com.sdm.system.model.entity.SysRole;
import com.sdm.system.model.req.user.*; import com.sdm.system.model.req.user.*;
import com.sdm.system.model.resp.SysUserGroupDetailResp; import com.sdm.common.entity.resp.system.SysUserGroupDetailResp;
import com.sdm.system.model.resp.SysUserGroupResp; import com.sdm.common.entity.resp.system.SysUserGroupResp;
import com.sdm.system.service.ISysUserService; import com.sdm.system.service.ISysUserService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;

View File

@@ -2,6 +2,7 @@ package com.sdm.system.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.QueryGroupDetailReq;
import com.sdm.common.entity.req.system.UserListReq; import com.sdm.common.entity.req.system.UserListReq;
import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.system.CIDRoleResp; import com.sdm.common.entity.resp.system.CIDRoleResp;
@@ -9,8 +10,8 @@ import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.system.model.entity.SysUser; import com.sdm.system.model.entity.SysUser;
import com.sdm.system.model.req.user.*; import com.sdm.system.model.req.user.*;
import com.sdm.system.model.resp.SysUserGroupDetailResp; import com.sdm.common.entity.resp.system.SysUserGroupDetailResp;
import com.sdm.system.model.resp.SysUserGroupResp; import com.sdm.common.entity.resp.system.SysUserGroupResp;
import java.util.List; import java.util.List;

View File

@@ -6,17 +6,17 @@ import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext; import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.req.system.QueryGroupDetailReq;
import com.sdm.common.entity.req.system.UserListReq; import com.sdm.common.entity.req.system.UserListReq;
import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
import com.sdm.common.entity.resp.system.CIDRoleResp; import com.sdm.common.entity.resp.system.CIDRoleResp;
import com.sdm.system.dao.SysUserMapper; import com.sdm.system.dao.SysUserMapper;
import com.sdm.system.model.entity.SysRole;
import com.sdm.system.model.entity.SysUser; import com.sdm.system.model.entity.SysUser;
import com.sdm.system.model.req.user.*; import com.sdm.system.model.req.user.*;
import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.system.model.resp.SysUserGroupDetailResp; import com.sdm.common.entity.resp.system.SysUserGroupDetailResp;
import com.sdm.system.model.resp.SysUserGroupResp; import com.sdm.common.entity.resp.system.SysUserGroupResp;
import com.sdm.system.service.ISysUserService; import com.sdm.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;

View File

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import com.sdm.common.common.SdmResponse; import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.QueryGroupDetailReq;
import com.sdm.common.entity.req.system.UserListReq; import com.sdm.common.entity.req.system.UserListReq;
import com.sdm.common.entity.req.system.UserQueryReq; import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.PageDataResp;
@@ -15,7 +16,7 @@ import com.sdm.system.dao.SysUserMapper;
import com.sdm.system.model.entity.*; import com.sdm.system.model.entity.*;
import com.sdm.system.model.req.user.*; import com.sdm.system.model.req.user.*;
import com.sdm.common.entity.resp.system.CIDUserResp; import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.system.model.resp.SysUserGroupResp; import com.sdm.common.entity.resp.system.SysUserGroupResp;
import com.sdm.system.service.*; import com.sdm.system.service.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;

View File

@@ -1,3 +1,3 @@
spring: spring:
profiles: profiles:
active: dev active: local