更新
This commit is contained in:
parent
359d12dcd7
commit
9c19c93532
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -384,4 +384,14 @@ public interface DlRepairTicketsService extends IService<DlRepairTickets> {
|
||||
* @return 班组下工时项目列表(含完成时间、完成人)
|
||||
**/
|
||||
List<DlRepairTitemRespVO> getTeamProjectStatus(String ticketId, String workType);
|
||||
|
||||
/**
|
||||
* 根据工单ID统计班组完成进度及各班组下工时项目情况
|
||||
*
|
||||
* @author AI
|
||||
* @date 2025/11/18
|
||||
* @param ticketId 工单ID
|
||||
* @return 班组完成进度及工时项目列表
|
||||
**/
|
||||
List<TicketTeamProgressWithItemsVO> getTeamProgressWithItems(String ticketId);
|
||||
}
|
||||
|
||||
@ -1243,6 +1243,137 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
|
||||
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和班组统计该班组下工时项目完成情况
|
||||
*
|
||||
|
||||
Loading…
Reference in New Issue
Block a user