refactor(oa): 优化项目列表查询逻辑
- 添加空列表检查避免空指针异常 - 使用流式收集项目ID用于后续范围查询 - 分别对工艺卡和送货单进行分组统计 - 通过Map结构提高查询效率避免重复数据库访问 - 保留原有VO转换及数据组装逻辑 - 确保只统计未删除的数据记录 - 提升接口性能减少不必要的循环查询
This commit is contained in:
@@ -191,25 +191,46 @@ public class OaProcessCardServiceImpl implements IOaProcessCardService {
|
||||
public List<SysOaProjectVo> queryProjectList() {
|
||||
// 拿到项目名字projectName projectNum projectCode
|
||||
List<SysOaProject> sysOaProjects = sysOaProjectMapper.selectList();
|
||||
// 现在已经有了projectId然后需要看到工艺还是发货哪个地方绑定了这个projectId
|
||||
if (sysOaProjects == null || sysOaProjects.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// 收集项目ID,后续仅在这些ID范围内分组统计
|
||||
List<Long> projectIds = sysOaProjects.stream()
|
||||
.map(SysOaProject::getProjectId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 1) 分组统计工艺卡数量(未删除)
|
||||
QueryWrapper<OaProcessCard> pcQw = Wrappers.query();
|
||||
pcQw.select("project_id AS projectId", "COUNT(1) AS cnt");
|
||||
pcQw.in(!projectIds.isEmpty(), "project_id", projectIds);
|
||||
pcQw.eq("del_flag", 0);
|
||||
pcQw.groupBy("project_id");
|
||||
Map<Long, Long> processCardCountMap = baseMapper.selectMaps(pcQw).stream()
|
||||
.collect(Collectors.toMap(
|
||||
m -> ((Number) m.get("projectId")).longValue(),
|
||||
m -> ((Number) m.get("cnt")).longValue()
|
||||
));
|
||||
|
||||
// 2) 分组统计送货单数量(未删除)
|
||||
QueryWrapper<OaDeliveryOrder> doQw = Wrappers.query();
|
||||
doQw.select("project_id AS projectId", "COUNT(1) AS cnt");
|
||||
doQw.in(!projectIds.isEmpty(), "project_id", projectIds);
|
||||
doQw.eq("del_flag", 0);
|
||||
doQw.groupBy("project_id");
|
||||
Map<Long, Long> deliveryOrderCountMap = oaDeliveryOrderMapper.selectMaps(doQw).stream()
|
||||
.collect(Collectors.toMap(
|
||||
m -> ((Number) m.get("projectId")).longValue(),
|
||||
m -> ((Number) m.get("cnt")).longValue()
|
||||
));
|
||||
|
||||
// 3) 组装返回
|
||||
List<SysOaProjectVo> sysOaProjectVos = sysOaProjects.stream()
|
||||
.map(sysOaProject -> {
|
||||
SysOaProjectVo vo = BeanUtil.toBean(sysOaProject, SysOaProjectVo.class);
|
||||
Long projectId = sysOaProject.getProjectId();
|
||||
// 统计工艺卡数量(未删除)
|
||||
Long processCardCount = baseMapper.selectCount(
|
||||
Wrappers.<OaProcessCard>lambdaQuery()
|
||||
.eq(OaProcessCard::getProjectId, projectId)
|
||||
.eq(OaProcessCard::getDelFlag, 0)
|
||||
);
|
||||
vo.setProcessCardCount(processCardCount);
|
||||
// 统计送货单数量(未删除)
|
||||
Long deliveryOrderCount = oaDeliveryOrderMapper.selectCount(
|
||||
Wrappers.<OaDeliveryOrder>lambdaQuery()
|
||||
.eq(OaDeliveryOrder::getProjectId, projectId)
|
||||
.eq(OaDeliveryOrder::getDelFlag, 0)
|
||||
);
|
||||
vo.setDeliveryOrderCount(deliveryOrderCount);
|
||||
.map(p -> {
|
||||
SysOaProjectVo vo = BeanUtil.toBean(p, SysOaProjectVo.class);
|
||||
Long pid = p.getProjectId();
|
||||
vo.setProcessCardCount(processCardCountMap.getOrDefault(pid, 0L));
|
||||
vo.setDeliveryOrderCount(deliveryOrderCountMap.getOrDefault(pid, 0L));
|
||||
return vo;
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
|
||||
Reference in New Issue
Block a user