From f00a59b4f30accf2b23ae0d58fac23d966a48d24 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期六, 13 六月 2026 20:11:51 +0800
Subject: [PATCH] fix: 优化生产订单查询

---
 src/main/resources/mapper/production/ProductionOperationTaskMapper.xml          |   14 +++++++
 src/main/java/com/ruoyi/production/bean/vo/ProductionOrderProcessTaskVo.java    |   20 ++++++++++
 src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java |   44 ++++++++++++++++++++++
 src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java               |    3 +
 src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java    |    3 +
 src/main/java/com/ruoyi/production/bean/vo/ProcessRouteStatusVo.java            |   17 ++++++++
 6 files changed, 101 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProcessRouteStatusVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProcessRouteStatusVo.java
new file mode 100644
index 0000000..ae22fb1
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProcessRouteStatusVo.java
@@ -0,0 +1,17 @@
+package com.ruoyi.production.bean.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(name = "ProcessRouteStatusVo", description = "宸ュ簭鐢熶骇杩涘害椤�")
+public class ProcessRouteStatusVo {
+
+    @Schema(description = "宸ュ簭鍚嶇О")
+    private String name;
+
+    @Schema(description = "瀹屾垚杩涘害鐧惧垎姣�")
+    private BigDecimal percentage;
+}
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderProcessTaskVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderProcessTaskVo.java
new file mode 100644
index 0000000..47d78c8
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderProcessTaskVo.java
@@ -0,0 +1,20 @@
+package com.ruoyi.production.bean.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@Schema(name = "ProductionOrderProcessTaskVo", description = "鐢熶骇璁㈠崟宸ュ簭浠诲姟杩涘害")
+public class ProductionOrderProcessTaskVo {
+
+    @Schema(description = "鐢熶骇璁㈠崟ID")
+    private Long productionOrderId;
+
+    @Schema(description = "宸ュ簭鍚嶇О")
+    private String operationName;
+
+    @Schema(description = "瀹屾垚杩涘害")
+    private BigDecimal completionStatus;
+}
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
index 01ef33a..9a8fa5f 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
@@ -44,4 +44,7 @@
 
     @Schema(description = "鏄惁宸查��鏂�")
     private Boolean returned;
+
+    @Schema(description = "宸ュ簭鐢熶骇杩涘害")
+    private List<ProcessRouteStatusVo> processRouteStatus;
 }
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java
index a09dd6f..ab38d55 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductionOperationTaskMapper.java
@@ -7,6 +7,7 @@
 import com.ruoyi.home.dto.processDataProductionStatisticsDto;
 import com.ruoyi.production.bean.dto.ProductionOperationTaskDto;
 import com.ruoyi.production.bean.vo.ProductionOperationTaskVo;
+import com.ruoyi.production.bean.vo.ProductionOrderProcessTaskVo;
 import com.ruoyi.production.pojo.ProductionOperationTask;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -43,4 +44,6 @@
     ProductionOperationTaskDto getProductWorkOrderFlowCard(@Param("id") Long id);
 
     List<ProductionOperationTaskVo> getOperation(@Param("c") ProductionOperationTaskDto dto);
+
+    List<ProductionOrderProcessTaskVo> listProcessStatusByOrderIds(@Param("orderIds") List<Long> orderIds);
 }
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..0ec5ca8 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;
     }
 
@@ -812,6 +816,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);
diff --git a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
index 973e44e..c872103 100644
--- a/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOperationTaskMapper.xml
@@ -215,4 +215,18 @@
         order by min(poro.drag_sort), poro.operation_name
     </select>
 
+    <select id="listProcessStatusByOrderIds" resultType="com.ruoyi.production.bean.vo.ProductionOrderProcessTaskVo">
+        select pot.production_order_id as productionOrderId,
+               poro.operation_name as operationName,
+               ROUND(IFNULL(pot.complete_quantity, 0) / NULLIF(pot.plan_quantity, 0) * 100, 2) AS completionStatus
+        from production_operation_task pot
+                 left join production_order_routing_operation poro
+                           on pot.production_order_routing_operation_id = poro.id
+        where pot.production_order_id in
+        <foreach collection="orderIds" item="orderId" open="(" separator="," close=")">
+            #{orderId}
+        </foreach>
+        order by pot.production_order_id, poro.drag_sort asc, pot.id asc
+    </select>
+
 </mapper>

--
Gitblit v1.9.3