refactor(oa): 优化项目列表查询逻辑

- 添加空列表检查避免空指针异常
- 使用流式收集项目ID用于后续范围查询
- 分别对工艺卡和送货单进行分组统计
- 通过Map结构提高查询效率避免重复数据库访问
- 保留原有VO转换及数据组装逻辑
- 确保只统计未删除的数据记录
- 提升接口性能减少不必要的循环查询
This commit is contained in:
2025-12-13 15:45:57 +08:00
parent f0e9f9626f
commit 7f5d6c1143

View File

@@ -191,25 +191,46 @@ public class OaProcessCardServiceImpl implements IOaProcessCardService {
public List<SysOaProjectVo> queryProjectList() { public List<SysOaProjectVo> queryProjectList() {
// 拿到项目名字projectName projectNum projectCode // 拿到项目名字projectName projectNum projectCode
List<SysOaProject> sysOaProjects = sysOaProjectMapper.selectList(); 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() List<SysOaProjectVo> sysOaProjectVos = sysOaProjects.stream()
.map(sysOaProject -> { .map(p -> {
SysOaProjectVo vo = BeanUtil.toBean(sysOaProject, SysOaProjectVo.class); SysOaProjectVo vo = BeanUtil.toBean(p, SysOaProjectVo.class);
Long projectId = sysOaProject.getProjectId(); Long pid = p.getProjectId();
// 统计工艺卡数量(未删除) vo.setProcessCardCount(processCardCountMap.getOrDefault(pid, 0L));
Long processCardCount = baseMapper.selectCount( vo.setDeliveryOrderCount(deliveryOrderCountMap.getOrDefault(pid, 0L));
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);
return vo; return vo;
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());