diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/controller/admin/DlRepairTitemController.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/controller/admin/DlRepairTitemController.java index aeb10080..3d83bd81 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/controller/admin/DlRepairTitemController.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/controller/admin/DlRepairTitemController.java @@ -212,4 +212,19 @@ public class DlRepairTitemController { public CommonResult getTeamProgress(@RequestParam("ticketId") String ticketId) { return success(dlRepairTicketsService.getTeamProgress(ticketId)); } + + /** + * 根据班组查询班组下工时项目的完成情况 + * + * @author AI + * @date 2025/11/18 + * @param ticketId 工单ID + * @param workType 班组编码(工种类型) + **/ + @GetMapping("/teamProjectStatus") + @Operation(summary = "根据班组查询班组下工时项目的完成情况") + public CommonResult getTeamProjectStatus(@RequestParam("ticketId") String ticketId, + @RequestParam("workType") String workType) { + return success(dlRepairTicketsService.getTeamProjectStatus(ticketId, workType)); + } } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java index 6772bcae..9a94f51e 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/DlRepairTicketsService.java @@ -373,4 +373,15 @@ public interface DlRepairTicketsService extends IService { * @return 班组完成进度列表 **/ List getTeamProgress(String ticketId); + + /** + * 根据工单ID和班组统计该班组下工时项目完成情况 + * + * @author AI + * @date 2025/11/18 + * @param ticketId 工单ID + * @param workType 班组编码(工种类型) + * @return 班组下工时项目列表(含完成时间、完成人) + **/ + List getTeamProjectStatus(String ticketId, String workType); } diff --git a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java index bd5bf4df..be25f55a 100644 --- a/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java +++ b/dl-module-repair/src/main/java/cn/iocoder/yudao/module/tickets/service/impl/DlRepairTicketsServiceImpl.java @@ -1170,24 +1170,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl itemIds = items.stream() - .map(DlRepairTitem::getId) - .filter(StringUtils::isNotEmpty) - .collect(Collectors.toSet()); - - // 查询记录表中已完成的项目(施工完成自检) - Set finishedItemIds = Collections.emptySet(); - if (CollectionUtil.isNotEmpty(itemIds)) { - List finishedRecords = repairRecordsService.list(Wrappers.lambdaQuery() - .eq(RepairRecords::getTicketId, ticketId) - .eq(RepairRecords::getType, RecordTypeEnum.SGWCZJ.getCode()) - .in(RepairRecords::getRepairItemId, itemIds)); - finishedItemIds = finishedRecords.stream() - .map(RepairRecords::getRepairItemId) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - } + // 查询当前工单的完成记录,构建 repairItemId -> 完成记录 映射 + Map finishedRecordMap = buildFinishedRecordMap(ticketId, items); // 当前工单涉及到的维修工人(用于获取工种/班组) List workers = repairWorkerService.listByTicketId(ticketId); @@ -1221,7 +1205,7 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl getTeamProjectStatus(String ticketId, String workType) { + // 查询当前工单下的所有工时项目 + List items = titemService.list(new LambdaQueryWrapper() + .eq(DlRepairTitem::getTicketId, ticketId) + .eq(DlRepairTitem::getItemType, "01")); + if (CollectionUtil.isEmpty(items)) { + return Collections.emptyList(); + } + + // 查询当前工单的完成记录,构建 repairItemId -> 完成记录 映射 + Map finishedRecordMap = buildFinishedRecordMap(ticketId, items); + + // 当前工单涉及到的维修工人(用于获取工种/班组) + List workers = repairWorkerService.listByTicketId(ticketId); + if (CollectionUtil.isEmpty(workers)) { + return Collections.emptyList(); + } + // 目标班组下的用户ID集合 + Set targetUserIds = workers.stream() + .filter(item -> item.getUserId() != null) + .filter(item -> StringUtils.equals(workType, item.getWorkType())) + .map(RepairWorker::getUserId) + .collect(Collectors.toSet()); + if (CollectionUtil.isEmpty(targetUserIds)) { + return Collections.emptyList(); + } + + List resultList = new ArrayList<>(); + + for (DlRepairTitem item : items) { + if (StringUtils.isEmpty(item.getRepairIds())) { + continue; + } + String[] repairIdArr = item.getRepairIds().split(","); + boolean belongToTeam = Arrays.stream(repairIdArr) + .filter(StringUtils::isNotEmpty) + .map(Long::valueOf) + .anyMatch(targetUserIds::contains); + if (!belongToTeam) { + continue; + } + + DlRepairTitemRespVO vo = new DlRepairTitemRespVO(); + vo.setId(item.getId()); + vo.setTicketId(item.getTicketId()); + vo.setItemName(item.getItemName()); + vo.setItemCount(item.getItemCount()); + vo.setItemUnit(item.getItemUnit()); + vo.setItemPrice(item.getItemPrice()); + vo.setItemDiscount(item.getItemDiscount()); + vo.setItemMoney(item.getItemMoney()); + vo.setItemStatus(item.getItemStatus()); + vo.setRepairIds(item.getRepairIds()); + vo.setRepairNames(item.getRepairNames()); + vo.setItemType(item.getItemType()); + vo.setProjectId(item.getProjectId()); + vo.setRemark(item.getRemark()); + + RepairRecords record = finishedRecordMap.get(item.getId()); + if (record != null) { + vo.setFinished(true); + vo.setFinishTime(record.getCreateTime()); + vo.setFinisherId(record.getDealUserId()); + vo.setFinisherName(record.getDealUserName()); + } else { + vo.setFinished(false); + } + + resultList.add(vo); + } + + // 已完成的排在前面,再按完成时间倒序,其次按创建时间 + resultList.sort((a, b) -> { + int finishedCompare = Boolean.compare(Boolean.TRUE.equals(b.getFinished()), Boolean.TRUE.equals(a.getFinished())); + if (finishedCompare != 0) { + return finishedCompare; + } + Date finishTimeA = a.getFinishTime(); + Date finishTimeB = b.getFinishTime(); + if (finishTimeA != null && finishTimeB != null) { + return finishTimeB.compareTo(finishTimeA); + } + if (finishTimeA != null) { + return -1; + } + if (finishTimeB != null) { + return 1; + } + return 0; + }); + + return resultList; + } + + /** + * 构建当前工单下工时项目的完成记录映射(repairItemId -> 最新完成记录) + * + * @param ticketId 工单ID + * @param items 工时项目列表 + * @return 映射 + */ + private Map buildFinishedRecordMap(String ticketId, List items) { + Set itemIds = items.stream() + .map(DlRepairTitem::getId) + .filter(StringUtils::isNotEmpty) + .collect(Collectors.toSet()); + if (CollectionUtil.isEmpty(itemIds)) { + return Collections.emptyMap(); + } + List finishedRecords = repairRecordsService.list(Wrappers.lambdaQuery() + .eq(RepairRecords::getTicketId, ticketId) + .eq(RepairRecords::getType, RecordTypeEnum.SGWCZJ.getCode()) + .in(RepairRecords::getRepairItemId, itemIds)); + if (CollectionUtil.isEmpty(finishedRecords)) { + return Collections.emptyMap(); + } + // 取每个 repairItemId 最新的一条记录 + Map finishedRecordMap = new HashMap<>(); + finishedRecords.forEach(record -> { + String repairItemId = record.getRepairItemId(); + RepairRecords exist = finishedRecordMap.get(repairItemId); + if (exist == null || (record.getCreateTime() != null && exist.getCreateTime() != null + && record.getCreateTime().after(exist.getCreateTime()))) { + finishedRecordMap.put(repairItemId, record); + } + }); + return finishedRecordMap; + } + // 获取已完成工单按维修类型分组的统计(优化版本) private Map getOverStatsByRepairType(String startDate, String endDate, String busiFrom, String cusFrom) { // 直接使用 mapper 查询已完成工单并按 repairType 分组 @@ -3185,4 +3308,3 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl recordsItemList; + + /** + * 完成时间(施工完成自检记录时间) + */ + private Date finishTime; + + /** + * 完成人姓名 + */ + private String finisherName; + + /** + * 完成人ID + */ + private Long finisherId; + + /** + * 是否已完成 + */ + private Boolean finished; } diff --git a/dl-module-rescue/pom.xml b/dl-module-rescue/pom.xml index ded3b762..df4491ab 100644 --- a/dl-module-rescue/pom.xml +++ b/dl-module-rescue/pom.xml @@ -32,6 +32,10 @@ 2.1.0-jdk8-snapshot compile + + org.springframework.boot + spring-boot-test + 8