更新
This commit is contained in:
parent
ca8bf8fd5b
commit
618c7868b3
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user