From 7858c25faa53dd2f4c0faae58618565ac5bb50ae Mon Sep 17 00:00:00 2001
From: zzw <228544128@qq.com>
Date: 星期三, 14 十月 2026 13:07:22 +0800
Subject: [PATCH] feat: add engineering order print and externalize app config
---
emergency-repair-server/src/main/java/com/emergencyrepair/business/service/BusinessService.java | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 161 insertions(+), 6 deletions(-)
diff --git a/emergency-repair-server/src/main/java/com/emergencyrepair/business/service/BusinessService.java b/emergency-repair-server/src/main/java/com/emergencyrepair/business/service/BusinessService.java
index b36be6c..4ba1218 100644
--- a/emergency-repair-server/src/main/java/com/emergencyrepair/business/service/BusinessService.java
+++ b/emergency-repair-server/src/main/java/com/emergencyrepair/business/service/BusinessService.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.emergencyrepair.business.dto.Requests;
+import com.emergencyrepair.business.dto.CompletionFaultQueryItem;
import com.emergencyrepair.business.entity.Acceptance;
import com.emergencyrepair.business.entity.CompletionInfo;
import com.emergencyrepair.business.entity.Fault;
@@ -32,6 +33,7 @@
import java.util.Arrays;
import java.util.Collections;
import java.util.Collection;
+import java.util.Comparator;
import java.util.Objects;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
@@ -45,7 +47,7 @@
public class BusinessService {
private static final DateTimeFormatter FAULT_DATE_FORMAT = DateTimeFormatter.ofPattern("yyMMdd");
private static final Object FAULT_CODE_LOCK = new Object();
- @Value("${fault-code.prefix:\u6f5c1\u57fa-}")
+ @Value("${fault-code.prefix:鍥哄畾鍓嶇紑-}")
private String faultCodePrefix;
private final FaultMapper faultMapper;
private final JdbcTemplate jdbcTemplate;
@@ -251,7 +253,7 @@
throw new BusinessException("璇峰~鍐欓攢椤圭悊鐢�");
}
String cancelledBy = StringUtils.hasText(request.getCancelledBy())
- ? request.getCancelledBy().trim() : "rk_XCB鍔╃悊";
+ ? request.getCancelledBy().trim() : "rk_绗竴瀹℃壒浜�";
for (Long id : request.getIds()) {
Fault fault = requireFault(id);
if (!StatusConstants.Task.REPORTED_XCB.equals(fault.getTaskStatus())
@@ -305,7 +307,7 @@
Fault fault = requireFault(id);
if (!StatusConstants.Task.REPORTED_XCB.equals(fault.getTaskStatus())
&& !StatusConstants.Task.RETURNED.equals(fault.getTaskStatus())) {
- throw new BusinessException("鏁呴殰 " + fault.getFaultCode() + " 褰撳墠鐘舵�佷笉鍏佽rk_XCB鍔╃悊瀹℃牳");
+ throw new BusinessException("鏁呴殰 " + fault.getFaultCode() + " 褰撳墠鐘舵�佷笉鍏佽rk_绗竴瀹℃壒浜哄鏍�");
}
index++;
fault.setContractorIds(contractorIds);
@@ -332,21 +334,21 @@
LocalDateTime now = LocalDateTime.now();
switch (request.getStage()) {
case "CMB":
- requireStatus(fault, StatusConstants.Task.XCB_REVIEWED, "rk_CMB棰嗗瀹℃壒");
+ requireStatus(fault, StatusConstants.Task.XCB_REVIEWED, "rk_绗簩瀹℃壒浜哄鎵�");
fault.setCmbOpinion(request.getOpinion());
fault.setCmbResult(pass ? "閫氳繃" : "涓嶉�氳繃");
fault.setCmbTime(now);
fault.setTaskStatus(pass ? StatusConstants.Task.CMB_APPROVED : StatusConstants.Task.RETURNED);
break;
case "JCC_ASSISTANT":
- requireStatus(fault, StatusConstants.Task.CMB_APPROVED, "rk_JCC鍔╃悊瀹℃壒");
+ requireStatus(fault, StatusConstants.Task.CMB_APPROVED, "rk_绗笁瀹℃壒浜哄鎵�");
fault.setJccAssistantOpinion(request.getOpinion());
fault.setJccAssistantResult(pass ? "閫氳繃" : "涓嶉�氳繃");
fault.setJccAssistantTime(now);
fault.setTaskStatus(pass ? StatusConstants.Task.JCC_ASSISTANT_APPROVED : StatusConstants.Task.RETURNED);
break;
case "JCC_DIRECTOR":
- requireStatus(fault, StatusConstants.Task.JCC_ASSISTANT_APPROVED, "rk_JCC澶勯暱瀹℃壒");
+ requireStatus(fault, StatusConstants.Task.JCC_ASSISTANT_APPROVED, "rk_绗洓瀹℃壒浜哄鎵�");
fault.setJccDirectorOpinion(request.getOpinion());
fault.setJccDirectorResult(pass ? "閫氳繃" : "涓嶉�氳繃");
fault.setJccDirectorTime(now);
@@ -406,6 +408,159 @@
return created;
}
+ public List<CompletionFaultQueryItem> listCompletionQueries(String keyword, String completionStatus,
+ String contractorName, LocalDate startDate,
+ LocalDate endDate) {
+ List<CompletionInfo> completions = completionInfoMapper.selectList(Wrappers.<CompletionInfo>lambdaQuery()
+ .orderByDesc(CompletionInfo::getSubmitTime).orderByDesc(CompletionInfo::getUpdateTime));
+ if (completions.isEmpty()) {
+ return Collections.emptyList();
+ }
+
+ Set<Long> workOrderIds = completions.stream().map(CompletionInfo::getWorkOrderId)
+ .filter(Objects::nonNull).collect(Collectors.toSet());
+ if (workOrderIds.isEmpty()) {
+ return Collections.emptyList();
+ }
+ Map<Long, WorkOrder> workOrderMap = workOrderMapper.selectBatchIds(workOrderIds).stream()
+ .collect(Collectors.toMap(WorkOrder::getId, item -> item));
+ Set<Long> faultIds = workOrderMap.values().stream().map(WorkOrder::getFaultId)
+ .filter(Objects::nonNull).collect(Collectors.toSet());
+ if (faultIds.isEmpty()) {
+ return Collections.emptyList();
+ }
+ Map<Long, Fault> faultMap = faultMapper.selectBatchIds(faultIds).stream()
+ .collect(Collectors.toMap(Fault::getId, item -> item));
+
+ String normalizedKeyword = StringUtils.hasText(keyword) ? keyword.trim().toLowerCase() : null;
+ String normalizedContractor = StringUtils.hasText(contractorName) ? contractorName.trim().toLowerCase() : null;
+ Map<Long, CompletionFaultQueryItem> grouped = new LinkedHashMap<>();
+ for (CompletionInfo completion : completions) {
+ WorkOrder workOrder = workOrderMap.get(completion.getWorkOrderId());
+ if (workOrder == null) {
+ continue;
+ }
+ if (StringUtils.hasText(completionStatus)
+ && !completionStatus.equalsIgnoreCase(workOrder.getCompletionStatus())) {
+ continue;
+ }
+ if (normalizedContractor != null && !containsIgnoreCase(workOrder.getContractorName(), normalizedContractor)) {
+ continue;
+ }
+ LocalDate completionDate = completion.getFinishDate() != null
+ ? completion.getFinishDate()
+ : (completion.getSubmitTime() == null ? null : completion.getSubmitTime().toLocalDate());
+ if (startDate != null && (completionDate == null || completionDate.isBefore(startDate))) {
+ continue;
+ }
+ if (endDate != null && (completionDate == null || completionDate.isAfter(endDate))) {
+ continue;
+ }
+
+ Fault fault = faultMap.get(workOrder.getFaultId());
+ if (fault == null) {
+ continue;
+ }
+ CompletionFaultQueryItem.WorkOrderCompletionItem workOrderItem = buildCompletionWorkOrderItem(workOrder, completion);
+ if (normalizedKeyword != null && !matchesCompletionKeyword(fault, workOrderItem, normalizedKeyword)) {
+ continue;
+ }
+
+ CompletionFaultQueryItem item = grouped.get(fault.getId());
+ if (item == null) {
+ item = new CompletionFaultQueryItem();
+ item.setFaultId(String.valueOf(fault.getId()));
+ item.setFaultCode(fault.getFaultCode());
+ item.setXNo(fault.getXNo());
+ item.setEquipmentName(fault.getEquipmentName());
+ item.setParentSystem(fault.getParentSystem());
+ item.setEngineeringMajor(fault.getEngineeringMajor());
+ item.setTeamMajor(fault.getTeamMajor());
+ item.setReportUnit(fault.getReportUnit());
+ item.setReportDate(fault.getReportDate());
+ item.setOwner(fault.getOwner());
+ item.setEngineeringNameDesc(fault.getEngineeringNameDesc());
+ item.setTaskStatus(fault.getTaskStatus());
+ grouped.put(fault.getId(), item);
+ }
+ item.getWorkOrders().add(workOrderItem);
+ }
+
+ List<CompletionFaultQueryItem> result = new ArrayList<>(grouped.values());
+ result.forEach(item -> item.getWorkOrders().sort(Comparator.comparing(
+ CompletionFaultQueryItem.WorkOrderCompletionItem::getWorkOrderNo,
+ Comparator.nullsLast(String::compareTo))));
+ result.sort(Comparator.comparing(CompletionFaultQueryItem::getReportDate,
+ Comparator.nullsLast(Comparator.reverseOrder())));
+ return result;
+ }
+
+ private CompletionFaultQueryItem.WorkOrderCompletionItem buildCompletionWorkOrderItem(
+ WorkOrder workOrder, CompletionInfo completion) {
+ CompletionFaultQueryItem.WorkOrderCompletionItem item = new CompletionFaultQueryItem.WorkOrderCompletionItem();
+ item.setWorkOrderId(String.valueOf(workOrder.getId()));
+ item.setWorkOrderNo(workOrder.getWorkOrderNo());
+ item.setContractorName(workOrder.getContractorName());
+ item.setCompletionStatus(workOrder.getCompletionStatus());
+ item.setEngineeringNo(completion.getEngineeringNo());
+ item.setStartDate(completion.getStartDate());
+ item.setFinishDate(completion.getFinishDate());
+ item.setContractorPerson(completion.getContractorPerson());
+ item.setTInternalConstruction(completion.getTInternalConstruction());
+ item.setRelatedProject(completion.getRelatedProject());
+ item.setDurationDays(completion.getDurationDays());
+ item.setPersonCount(completion.getPersonCount());
+ item.setAcceptanceMode(completion.getAcceptanceMode());
+ item.setQualityInfo(completion.getQualityInfo());
+ item.setReasonAnalysis(completion.getReasonAnalysis());
+ item.setFaultDescription(completion.getFaultDescription());
+ item.setItemName(completion.getItemName());
+ item.setSubmitTime(completion.getSubmitTime());
+ List<Requests.SolutionItem> solutions = parseJsonList(completion.getSolutionsJson(), Requests.SolutionItem.class);
+ if (solutions.isEmpty() && StringUtils.hasText(completion.getSolution())) {
+ Requests.SolutionItem legacy = new Requests.SolutionItem();
+ legacy.setContent(completion.getSolution());
+ solutions.add(legacy);
+ }
+ item.setSolutions(solutions);
+ item.setMaterials(parseJsonList(completion.getConsumablesJson(), Requests.MaterialItem.class));
+ return item;
+ }
+
+ private boolean matchesCompletionKeyword(Fault fault, CompletionFaultQueryItem.WorkOrderCompletionItem item,
+ String keyword) {
+ if (containsIgnoreCase(fault.getFaultCode(), keyword)
+ || containsIgnoreCase(fault.getXNo(), keyword)
+ || containsIgnoreCase(fault.getEquipmentName(), keyword)
+ || containsIgnoreCase(fault.getEngineeringNameDesc(), keyword)
+ || containsIgnoreCase(fault.getReportUnit(), keyword)
+ || containsIgnoreCase(item.getWorkOrderNo(), keyword)
+ || containsIgnoreCase(item.getContractorName(), keyword)
+ || containsIgnoreCase(item.getEngineeringNo(), keyword)
+ || containsIgnoreCase(item.getItemName(), keyword)
+ || containsIgnoreCase(item.getContractorPerson(), keyword)) {
+ return true;
+ }
+ return item.getSolutions().stream().anyMatch(solution -> containsIgnoreCase(solution.getContent(), keyword))
+ || item.getMaterials().stream().anyMatch(material -> containsIgnoreCase(material.getName(), keyword)
+ || containsIgnoreCase(material.getSpecification(), keyword));
+ }
+
+ private boolean containsIgnoreCase(String value, String keyword) {
+ return StringUtils.hasText(value) && value.toLowerCase().contains(keyword);
+ }
+
+ private <T> List<T> parseJsonList(String json, Class<T> type) {
+ if (!StringUtils.hasText(json)) {
+ return new ArrayList<>();
+ }
+ try {
+ return objectMapper.readValue(json, objectMapper.getTypeFactory().constructCollectionType(List.class, type));
+ } catch (Exception exception) {
+ return new ArrayList<>();
+ }
+ }
+
public List<WorkOrder> listWorkOrders(String status, String keyword, boolean completionReportable) {
LambdaQueryWrapper<WorkOrder> query = Wrappers.lambdaQuery();
if (completionReportable) {
--
Gitblit v1.9.1