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 d4453296..abdb65c4 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 @@ -201,29 +201,15 @@ public class DlRepairTitemController { } /** - * @description : 根据工单ID统计班组完成进度 + * @description : 根据工单ID统计班组完成进度及工时项目情况 * @author xyc * @date 17:15 2025/11/18 * @param [ticketId] * @return cn.iocoder.yudao.framework.common.pojo.CommonResult **/ - @GetMapping("/teamProgress") - @Operation(summary = "根据工单ID统计班组完成进度") - public CommonResult getTeamProgress(@RequestParam("ticketId") String ticketId) { - return success(dlRepairTicketsService.getTeamProgress(ticketId)); - } - - /** - * @description : 根据班组查询班组下工时项目的完成情况 - * @author xyc - * @date 17:15 2025/11/18 - * @param [ticketId, workType] - * @return cn.iocoder.yudao.framework.common.pojo.CommonResult - **/ - @GetMapping("/teamProjectStatus") - @Operation(summary = "根据班组查询班组下工时项目的完成情况") - public CommonResult getTeamProjectStatus(@RequestParam("ticketId") String ticketId, - @RequestParam("workType") String workType) { - return success(dlRepairTicketsService.getTeamProjectStatus(ticketId, workType)); + @GetMapping("/teamProgressWithItems") + @Operation(summary = "根据工单ID统计班组完成进度及工时项目情况") + public CommonResult getTeamProgressWithItems(@RequestParam("ticketId") String ticketId) { + return success(dlRepairTicketsService.getTeamProgressWithItems(ticketId)); } } 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 9a94f51e..fd337499 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 @@ -384,4 +384,14 @@ public interface DlRepairTicketsService extends IService { * @return 班组下工时项目列表(含完成时间、完成人) **/ List getTeamProjectStatus(String ticketId, String workType); + + /** + * 根据工单ID统计班组完成进度及各班组下工时项目情况 + * + * @author AI + * @date 2025/11/18 + * @param ticketId 工单ID + * @return 班组完成进度及工时项目列表 + **/ + List getTeamProgressWithItems(String ticketId); } 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 a8c1556d..30c00a4a 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 @@ -1243,6 +1243,137 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl getTeamProgressWithItems(String ticketId) { + // 查询当前工单下的所有工时项目 + 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(); + } + Map workerMap = workers.stream() + .filter(item -> item.getUserId() != null) + .collect(Collectors.toMap(RepairWorker::getUserId, item -> item, (a, b) -> a)); + + // 按班组聚合统计 + Map progressMap = new HashMap<>(); + + // 用于存储每个班组对应的项目列表 + Map> teamItemsMap = new HashMap<>(); + + for (DlRepairTitem item : items) { + if (StringUtils.isEmpty(item.getRepairIds())) { + continue; + } + String[] repairIdArr = item.getRepairIds().split(","); + // 一个项目可能涉及多个班组,按班组去重 + Set itemWorkTypes = new HashSet<>(); + for (String repairIdStr : repairIdArr) { + if (StringUtils.isEmpty(repairIdStr)) { + continue; + } + RepairWorker repairWorker = workerMap.get(Long.valueOf(repairIdStr)); + if (repairWorker == null || StringUtils.isEmpty(repairWorker.getWorkType())) { + continue; + } + itemWorkTypes.add(repairWorker.getWorkType()); + } + if (itemWorkTypes.isEmpty()) { + continue; + } + + // 构建项目详情 + DlRepairTitemRespVO itemVO = new DlRepairTitemRespVO(); + itemVO.setId(item.getId()); + itemVO.setTicketId(item.getTicketId()); + itemVO.setItemName(item.getItemName()); + itemVO.setItemCount(item.getItemCount()); + itemVO.setItemUnit(item.getItemUnit()); + itemVO.setItemPrice(item.getItemPrice()); + itemVO.setItemDiscount(item.getItemDiscount()); + itemVO.setItemMoney(item.getItemMoney()); + itemVO.setItemStatus(item.getItemStatus()); + itemVO.setRepairIds(item.getRepairIds()); + itemVO.setRepairNames(item.getRepairNames()); + itemVO.setItemType(item.getItemType()); + itemVO.setProjectId(item.getProjectId()); + itemVO.setRemark(item.getRemark()); + + RepairRecords record = finishedRecordMap.get(item.getId()); + if (record != null) { + itemVO.setFinished(true); + itemVO.setFinishTime(DateUtil.date(record.getCreateTime())); + itemVO.setFinisherId(record.getDealUserId()); + itemVO.setFinisherName(record.getDealUserName()); + } else { + itemVO.setFinished(false); + } + + boolean finished = finishedRecordMap.containsKey(item.getId()); + for (String workType : itemWorkTypes) { + TicketTeamProgressWithItemsVO vo = progressMap.get(workType); + if (vo == null) { + vo = new TicketTeamProgressWithItemsVO(); + vo.setWorkType(workType); + vo.setWorkTypeName(dictDataApi.getDictDataLabel(REPAIR_WORK_TYPE, workType)); + vo.setTotalItems(0); + vo.setFinishedItems(0); + vo.setCompletionRate(BigDecimal.ZERO); + progressMap.put(workType, vo); + teamItemsMap.put(workType, new ArrayList<>()); + } + + // 添加项目到对应班组 + teamItemsMap.get(workType).add(itemVO); + + vo.setTotalItems(vo.getTotalItems() + 1); + if (finished) { + vo.setFinishedItems(vo.getFinishedItems() + 1); + } + } + } + + // 计算完成率并返回列表 + List resultList = new ArrayList<>(); + for (TicketTeamProgressWithItemsVO vo : progressMap.values()) { + if (vo.getTotalItems() != null && vo.getTotalItems() > 0) { + BigDecimal finished = new BigDecimal(vo.getFinishedItems() == null ? 0 : vo.getFinishedItems()); + BigDecimal total = new BigDecimal(vo.getTotalItems()); + BigDecimal rate = finished.divide(total, 4, RoundingMode.HALF_UP); + vo.setCompletionRate(rate); + } else { + vo.setCompletionRate(BigDecimal.ZERO); + } + + // 设置班组下的项目列表 + vo.setChildren(teamItemsMap.get(vo.getWorkType())); + + resultList.add(vo); + } + + // 默认按完成率降序排序 + resultList.sort((a, b) -> b.getCompletionRate().compareTo(a.getCompletionRate())); + return resultList; + } + /** * 根据工单ID和班组统计该班组下工时项目完成情况 *