This commit is contained in:
sunhaoyuan 2025-11-18 17:07:16 +08:00
parent ca8bf8fd5b
commit 618c7868b3
5 changed files with 192 additions and 20 deletions

View File

@ -212,4 +212,19 @@ public class DlRepairTitemController {
public CommonResult<?> getTeamProgress(@RequestParam("ticketId") String ticketId) { public CommonResult<?> getTeamProgress(@RequestParam("ticketId") String ticketId) {
return success(dlRepairTicketsService.getTeamProgress(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));
}
} }

View File

@ -373,4 +373,15 @@ public interface DlRepairTicketsService extends IService<DlRepairTickets> {
* @return 班组完成进度列表 * @return 班组完成进度列表
**/ **/
List<TicketTeamProgressVO> getTeamProgress(String ticketId); List<TicketTeamProgressVO> getTeamProgress(String ticketId);
/**
* 根据工单ID和班组统计该班组下工时项目完成情况
*
* @author AI
* @date 2025/11/18
* @param ticketId 工单ID
* @param workType 班组编码工种类型
* @return 班组下工时项目列表含完成时间完成人
**/
List<DlRepairTitemRespVO> getTeamProjectStatus(String ticketId, String workType);
} }

View File

@ -1170,24 +1170,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
return Collections.emptyList(); return Collections.emptyList();
} }
// 项目 ID 集合 // 查询当前工单的完成记录构建 repairItemId -> 完成记录 映射
Set<String> itemIds = items.stream() Map<String, RepairRecords> finishedRecordMap = buildFinishedRecordMap(ticketId, items);
.map(DlRepairTitem::getId)
.filter(StringUtils::isNotEmpty)
.collect(Collectors.toSet());
// 查询记录表中已完成的项目施工完成自检
Set<String> finishedItemIds = Collections.emptySet();
if (CollectionUtil.isNotEmpty(itemIds)) {
List<RepairRecords> finishedRecords = repairRecordsService.list(Wrappers.<RepairRecords>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());
}
// 当前工单涉及到的维修工人用于获取工种/班组 // 当前工单涉及到的维修工人用于获取工种/班组
List<RepairWorker> workers = repairWorkerService.listByTicketId(ticketId); List<RepairWorker> workers = repairWorkerService.listByTicketId(ticketId);
@ -1221,7 +1205,7 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
if (itemWorkTypes.isEmpty()) { if (itemWorkTypes.isEmpty()) {
continue; continue;
} }
boolean finished = finishedItemIds.contains(item.getId()); boolean finished = finishedRecordMap.containsKey(item.getId());
for (String workType : itemWorkTypes) { for (String workType : itemWorkTypes) {
TicketTeamProgressVO vo = progressMap.get(workType); TicketTeamProgressVO vo = progressMap.get(workType);
if (vo == null) { if (vo == null) {
@ -1259,6 +1243,145 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
return resultList; return resultList;
} }
/**
* 根据工单ID和班组统计该班组下工时项目完成情况
*
* @param ticketId 工单ID
* @param workType 班组编码工种类型
* @return 班组下工时项目列表含完成时间完成人
* @author AI
* @date 2025/11/18
*/
@Override
public List<DlRepairTitemRespVO> getTeamProjectStatus(String ticketId, String workType) {
// 查询当前工单下的所有工时项目
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();
}
// 目标班组下的用户ID集合
Set<Long> 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<DlRepairTitemRespVO> 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<String, RepairRecords> buildFinishedRecordMap(String ticketId, List<DlRepairTitem> items) {
Set<String> itemIds = items.stream()
.map(DlRepairTitem::getId)
.filter(StringUtils::isNotEmpty)
.collect(Collectors.toSet());
if (CollectionUtil.isEmpty(itemIds)) {
return Collections.emptyMap();
}
List<RepairRecords> finishedRecords = repairRecordsService.list(Wrappers.<RepairRecords>lambdaQuery()
.eq(RepairRecords::getTicketId, ticketId)
.eq(RepairRecords::getType, RecordTypeEnum.SGWCZJ.getCode())
.in(RepairRecords::getRepairItemId, itemIds));
if (CollectionUtil.isEmpty(finishedRecords)) {
return Collections.emptyMap();
}
// 取每个 repairItemId 最新的一条记录
Map<String, RepairRecords> 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<String, Long> getOverStatsByRepairType(String startDate, String endDate, String busiFrom, String cusFrom) { private Map<String, Long> getOverStatsByRepairType(String startDate, String endDate, String busiFrom, String cusFrom) {
// 直接使用 mapper 查询已完成工单并按 repairType 分组 // 直接使用 mapper 查询已完成工单并按 repairType 分组
@ -3185,4 +3308,3 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
} }
} }

View File

@ -31,4 +31,24 @@ public class DlRepairTitemRespVO extends DlRepairTitem {
* 维修项目的维修过程图片 * 维修项目的维修过程图片
**/ **/
private List<RepairRecordsItem> recordsItemList; private List<RepairRecordsItem> recordsItemList;
/**
* 完成时间施工完成自检记录时间
*/
private Date finishTime;
/**
* 完成人姓名
*/
private String finisherName;
/**
* 完成人ID
*/
private Long finisherId;
/**
* 是否已完成
*/
private Boolean finished;
} }

View File

@ -32,6 +32,10 @@
<version>2.1.0-jdk8-snapshot</version> <version>2.1.0-jdk8-snapshot</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
</dependencies> </dependencies>
<properties> <properties>
<maven.compiler.source>8</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>