This commit is contained in:
xuyuncong 2025-11-18 17:56:29 +08:00
parent 359d12dcd7
commit 9c19c93532
3 changed files with 146 additions and 19 deletions

View File

@ -201,29 +201,15 @@ public class DlRepairTitemController {
} }
/** /**
* @description : 根据工单ID统计班组完成进度 * @description : 根据工单ID统计班组完成进度及工时项目情况
* @author xyc * @author xyc
* @date 17:15 2025/11/18 * @date 17:15 2025/11/18
* @param [ticketId] * @param [ticketId]
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?> * @return cn.iocoder.yudao.framework.common.pojo.CommonResult<?>
**/ **/
@GetMapping("/teamProgress") @GetMapping("/teamProgressWithItems")
@Operation(summary = "根据工单ID统计班组完成进度") @Operation(summary = "根据工单ID统计班组完成进度及工时项目情况")
public CommonResult<?> getTeamProgress(@RequestParam("ticketId") String ticketId) { public CommonResult<?> getTeamProgressWithItems(@RequestParam("ticketId") String ticketId) {
return success(dlRepairTicketsService.getTeamProgress(ticketId)); return success(dlRepairTicketsService.getTeamProgressWithItems(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));
} }
} }

View File

@ -384,4 +384,14 @@ public interface DlRepairTicketsService extends IService<DlRepairTickets> {
* @return 班组下工时项目列表含完成时间完成人 * @return 班组下工时项目列表含完成时间完成人
**/ **/
List<DlRepairTitemRespVO> getTeamProjectStatus(String ticketId, String workType); List<DlRepairTitemRespVO> getTeamProjectStatus(String ticketId, String workType);
/**
* 根据工单ID统计班组完成进度及各班组下工时项目情况
*
* @author AI
* @date 2025/11/18
* @param ticketId 工单ID
* @return 班组完成进度及工时项目列表
**/
List<TicketTeamProgressWithItemsVO> getTeamProgressWithItems(String ticketId);
} }

View File

@ -1243,6 +1243,137 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
return resultList; return resultList;
} }
/**
* 根据工单ID统计班组完成进度及各班组下工时项目情况
*
* @param ticketId 工单ID
* @return 班组完成进度及工时项目列表
* @author AI
* @date 2025/11/18
*/
@Override
public List<TicketTeamProgressWithItemsVO> getTeamProgressWithItems(String ticketId) {
// 查询当前工单下的所有工时项目
List<DlRepairTitem> items = titemService.list(new LambdaQueryWrapper<DlRepairTitem>()
.eq(DlRepairTitem::getTicketId, ticketId)
.eq(DlRepairTitem::getItemType, "01"));
if (CollectionUtil.isEmpty(items)) {
return Collections.emptyList();
}
// 查询当前工单的完成记录构建 repairItemId -> 完成记录 映射
Map<String, RepairRecords> finishedRecordMap = buildFinishedRecordMap(ticketId, items);
// 当前工单涉及到的维修工人用于获取工种/班组
List<RepairWorker> workers = repairWorkerService.listByTicketId(ticketId);
if (CollectionUtil.isEmpty(workers)) {
return Collections.emptyList();
}
Map<Long, RepairWorker> workerMap = workers.stream()
.filter(item -> item.getUserId() != null)
.collect(Collectors.toMap(RepairWorker::getUserId, item -> item, (a, b) -> a));
// 按班组聚合统计
Map<String, TicketTeamProgressWithItemsVO> progressMap = new HashMap<>();
// 用于存储每个班组对应的项目列表
Map<String, List<DlRepairTitemRespVO>> teamItemsMap = new HashMap<>();
for (DlRepairTitem item : items) {
if (StringUtils.isEmpty(item.getRepairIds())) {
continue;
}
String[] repairIdArr = item.getRepairIds().split(",");
// 一个项目可能涉及多个班组按班组去重
Set<String> 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<TicketTeamProgressWithItemsVO> 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和班组统计该班组下工时项目完成情况 * 根据工单ID和班组统计该班组下工时项目完成情况
* *