From 34eca433a02bee81572159c946fc7a6b08b448b2 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期六, 22 八月 2026 13:46:33 +0800
Subject: [PATCH] fix: 领料编号排序修改
---
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 101 insertions(+), 1 deletions(-)
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
index cd32ce4..f3340f4 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
@@ -22,6 +22,8 @@
import com.ruoyi.production.bean.vo.ProductionOrderVo;
import com.ruoyi.production.bean.vo.ProductionPlanVo;
import com.ruoyi.production.bean.vo.ProductionOrderWorkOrderDetailVo;
+import com.ruoyi.production.bean.vo.ProcessRouteStatusVo;
+import com.ruoyi.production.bean.vo.ProductionOrderProcessTaskVo;
import com.ruoyi.production.enums.ProductOrderStatusEnum;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.pojo.*;
@@ -86,6 +88,7 @@
// 鍒嗛〉鏌ヨ鐢熶骇璁㈠崟
Page<ProductionOrderVo> result = (Page<ProductionOrderVo>) baseMapper.pageProductionOrder(page, dto);
fillProductImages(result.getRecords());
+ fillProcessRouteStatus(result.getRecords());
return result;
}
@@ -94,6 +97,7 @@
// 鏌ヨ鐢熶骇璁㈠崟鍒楄〃
List<ProductionOrderVo> records = baseMapper.listProductionOrder(dto);
fillProductImages(records);
+ fillProcessRouteStatus(records);
return records;
}
@@ -552,6 +556,40 @@
return value == null ? BigDecimal.ZERO : value;
}
+ /**
+ * 鎵规鍙锋寜鍓嶇紑鏃ユ湡鍗囧簭鎺掑簭锛堟牸寮忓 20260703-ed01-001锛屾棩鏈熸棭鐨勫湪鍓嶏級
+ */
+ private void sortBatchNoList(List<String> batchNoList) {
+ if (batchNoList == null || batchNoList.size() < 2) {
+ return;
+ }
+ batchNoList.sort(Comparator
+ .comparingLong(this::batchDateKey)
+ .thenComparing(batchNo -> batchNo == null ? "" : batchNo));
+ }
+
+ /**
+ * 鎻愬彇鎵规鍙峰紑澶寸殑鏁板瓧浣滀负鎺掑簭閿紙yyyyMMdd锛夛紝鏃犳暟瀛楁椂鏀惧埌鏈�鍚�
+ */
+ private long batchDateKey(String batchNo) {
+ if (batchNo == null) {
+ return Long.MAX_VALUE;
+ }
+ String trimmed = batchNo.trim();
+ int end = 0;
+ while (end < trimmed.length() && Character.isDigit(trimmed.charAt(end))) {
+ end++;
+ }
+ if (end == 0) {
+ return Long.MAX_VALUE;
+ }
+ try {
+ return Long.parseLong(trimmed.substring(0, end));
+ } catch (NumberFormatException e) {
+ return Long.MAX_VALUE;
+ }
+ }
+
private void validateAndFillOrder(ProductionOrder productionOrder, ProductionOrder oldOrder) {
// 鏍¢獙璁㈠崟鍙傛暟骞惰ˉ榻愰粯璁ゅ��
if (productionOrder == null) {
@@ -812,6 +850,46 @@
}
}
+ private void fillProcessRouteStatus(List<ProductionOrderVo> records) {
+ if (records == null || records.isEmpty()) {
+ return;
+ }
+ List<Long> orderIds = records.stream()
+ .map(ProductionOrderVo::getId)
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ if (orderIds.isEmpty()) {
+ return;
+ }
+
+ List<ProductionOrderProcessTaskVo> tasks = productionOperationTaskMapper.listProcessStatusByOrderIds(orderIds);
+ Map<Long, List<ProcessRouteStatusVo>> statusMap = new LinkedHashMap<>();
+ if (tasks != null) {
+ for (ProductionOrderProcessTaskVo task : tasks) {
+ if (task == null || task.getProductionOrderId() == null) {
+ continue;
+ }
+ ProcessRouteStatusVo status = new ProcessRouteStatusVo();
+ status.setName(task.getOperationName() != null && !task.getOperationName().isBlank()
+ ? task.getOperationName()
+ : "鏈煡宸ュ簭");
+ BigDecimal percentage = task.getCompletionStatus() == null
+ ? BigDecimal.ZERO
+ : task.getCompletionStatus();
+ if (percentage.compareTo(new BigDecimal("100")) > 0) {
+ percentage = new BigDecimal("100");
+ }
+ status.setPercentage(percentage);
+ statusMap.computeIfAbsent(task.getProductionOrderId(), key -> new ArrayList<>()).add(status);
+ }
+ }
+
+ for (ProductionOrderVo record : records) {
+ record.setProcessRouteStatus(statusMap.getOrDefault(record.getId(), Collections.emptyList()));
+ }
+ }
+
private StorageBlobVO toStorageBlobVO(StorageBlob blob) {
// 灏嗗瓨鍌ㄦ枃浠跺璞¤浆鎹负VO
StorageBlobVO vo = BeanUtil.copyProperties(blob, StorageBlobVO.class);
@@ -1063,9 +1141,30 @@
}
}
- // 杩囨护鍑洪潪鏍硅妭鐐癸紙瀹為檯棰嗘枡椤癸級
+ // 鏀堕泦璁㈠崟鎴愬搧瑙勬牸ID锛氬寘鍚敓浜ц鍗曟垚鍝佽鏍间笌BOM鏍硅妭鐐硅鏍硷紝鐢ㄤ簬鎺掗櫎鈥滆嚜宸扁�濊繖涓�鐗╂枡
+ Set<Long> finishedProductModelIds = new HashSet<>();
+ if (productionOrder != null && productionOrder.getProductModelId() != null) {
+ finishedProductModelIds.add(productionOrder.getProductModelId());
+ }
+ bomStructureList.stream()
+ .filter(s -> s != null && (s.getParentId() == null || s.getParentId() == 0))
+ .map(ProductionBomStructureVo::getProductModelId)
+ .filter(Objects::nonNull)
+ .forEach(finishedProductModelIds::add);
+
+ // 鏀堕泦鎵�鏈夎寮曠敤涓虹埗绾х殑鑺傜偣ID锛欱OM浠庢渶鍚庝竴閬撳伐搴忓線閲岄厤缃墠涓�閬撳伐搴忥紝
+ // 涓棿鑺傜偣鏄笂涓�閬撳伐搴忕殑浜у嚭锛堣嚜鍒讹級锛屽彧鏈夋瘡鏉″垎鏀渶閲屽眰鐨勫彾瀛愯妭鐐规墠鏄湡姝i渶瑕侀鐢ㄧ殑鐗╂枡銆�
+ Set<Long> parentNodeIds = bomStructureList.stream()
+ .filter(s -> s != null && s.getParentId() != null && s.getParentId() != 0)
+ .map(ProductionBomStructureVo::getParentId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+
+ // 杩囨护鍑哄彾瀛愯妭鐐癸紙瀹為檯棰嗘枡椤癸級锛氶潪鏍硅妭鐐广�侀潪涓棿鑺傜偣锛屽苟鎺掗櫎涓庤鍗曟垚鍝佸悓瑙勬牸鐨勭墿鏂欙紙鑷埗鎴愬搧鏃犻渶棰嗘枡锛�
List<ProductionBomStructureVo> childStructureList = bomStructureList.stream()
.filter(s -> s != null && s.getParentId() != null && s.getParentId() != 0)
+ .filter(s -> s.getId() == null || !parentNodeIds.contains(s.getId()))
+ .filter(s -> s.getProductModelId() == null || !finishedProductModelIds.contains(s.getProductModelId()))
.collect(Collectors.toList());
// 閬嶅巻澶勭悊鏁版嵁骞剁粍瑁呯粨鏋�
@@ -1114,6 +1213,7 @@
List<String> batchNoList = stockBatchNoMap.get(productModelId) == null
? Collections.emptyList()
: new ArrayList<>(stockBatchNoMap.get(productModelId));
+ sortBatchNoList(batchNoList);
vo.setBatchNoList(batchNoList);
vo.setStockQuantity(stockQuantityMap.getOrDefault(productModelId, BigDecimal.ZERO));
vo.setBom(true);
--
Gitblit v1.9.3