更新
This commit is contained in:
parent
ca8bf8fd5b
commit
618c7868b3
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -373,4 +373,15 @@ public interface DlRepairTicketsService extends IService<DlRepairTickets> {
|
||||
* @return 班组完成进度列表
|
||||
**/
|
||||
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);
|
||||
}
|
||||
|
||||
@ -1170,24 +1170,8 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
// 项目 ID 集合
|
||||
Set<String> itemIds = items.stream()
|
||||
.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());
|
||||
}
|
||||
// 查询当前工单的完成记录,构建 repairItemId -> 完成记录 映射
|
||||
Map<String, RepairRecords> finishedRecordMap = buildFinishedRecordMap(ticketId, items);
|
||||
|
||||
// 当前工单涉及到的维修工人(用于获取工种/班组)
|
||||
List<RepairWorker> workers = repairWorkerService.listByTicketId(ticketId);
|
||||
@ -1221,7 +1205,7 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
|
||||
if (itemWorkTypes.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
boolean finished = finishedItemIds.contains(item.getId());
|
||||
boolean finished = finishedRecordMap.containsKey(item.getId());
|
||||
for (String workType : itemWorkTypes) {
|
||||
TicketTeamProgressVO vo = progressMap.get(workType);
|
||||
if (vo == null) {
|
||||
@ -1259,6 +1243,145 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
|
||||
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) {
|
||||
// 直接使用 mapper 查询已完成工单并按 repairType 分组
|
||||
@ -3185,4 +3308,3 @@ public class DlRepairTicketsServiceImpl extends ServiceImpl<DlRepairTicketsMappe
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -31,4 +31,24 @@ public class DlRepairTitemRespVO extends DlRepairTitem {
|
||||
* 维修项目的维修过程图片
|
||||
**/
|
||||
private List<RepairRecordsItem> recordsItemList;
|
||||
|
||||
/**
|
||||
* 完成时间(施工完成自检记录时间)
|
||||
*/
|
||||
private Date finishTime;
|
||||
|
||||
/**
|
||||
* 完成人姓名
|
||||
*/
|
||||
private String finisherName;
|
||||
|
||||
/**
|
||||
* 完成人ID
|
||||
*/
|
||||
private Long finisherId;
|
||||
|
||||
/**
|
||||
* 是否已完成
|
||||
*/
|
||||
private Boolean finished;
|
||||
}
|
||||
|
||||
@ -32,6 +32,10 @@
|
||||
<version>2.1.0-jdk8-snapshot</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-test</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<properties>
|
||||
<maven.compiler.source>8</maven.compiler.source>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user