From 965cd9cc87ee705eb8d6ce259ee33d26291fe0d3 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期三, 11 三月 2026 10:53:29 +0800
Subject: [PATCH] feat: 产品类别汇总统计

---
 src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java |   61 ++++++++++++++++++++++++------
 1 files changed, 48 insertions(+), 13 deletions(-)

diff --git a/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java b/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
index 9cdd367..f6d2414 100644
--- a/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
+++ b/src/main/java/com/ruoyi/productionPlan/service/impl/ProductionPlanServiceImpl.java
@@ -11,6 +11,7 @@
 import com.ruoyi.common.utils.http.HttpUtils;
 import com.ruoyi.framework.config.AliDingConfig;
 import com.ruoyi.productionPlan.dto.ProductionPlanDto;
+import com.ruoyi.productionPlan.dto.ProductionPlanSummaryDto;
 import com.ruoyi.productionPlan.mapper.ProductionPlanMapper;
 import com.ruoyi.productionPlan.pojo.ProductionPlan;
 import com.ruoyi.productionPlan.service.ProductionPlanService;
@@ -26,9 +27,9 @@
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.locks.ReentrantLock;
+import java.util.stream.Collectors;
 
 /**
  * <br>
@@ -133,8 +134,8 @@
                 List<ProductionPlan> list = parseProductionPlans(dataArr, dataSyncType, totalCount);
                 if (!list.isEmpty()) {
                     //  澶勭悊鏇存柊鎴栨柊澧�
-                    processSaveOrUpdate(list);
-                    totalSynced += list.size();
+                    int affected = processSaveOrUpdate(list);
+                    totalSynced += affected;
                 }
 
                 //  鍒ゆ柇鏄惁杩樻湁涓嬩竴椤�
@@ -277,19 +278,48 @@
         return list;
     }
 
-    private void processSaveOrUpdate(List<ProductionPlan> list) {
+    private int processSaveOrUpdate(List<ProductionPlan> list) {
+        if (list == null || list.isEmpty()) {
+            return 0;
+        }
+        int affected = 0;
+
+        //  鍘婚噸 formInstanceId
+        Set<String> formIds = list.stream()
+                .map(ProductionPlan::getFormInstanceId)
+                .collect(Collectors.toSet());
+
+        //  鏌ヨ鏁版嵁搴撳凡鏈夋暟鎹�
+        List<ProductionPlan> existList = this.list(new LambdaQueryWrapper<ProductionPlan>().in(ProductionPlan::getFormInstanceId, formIds));
+
+        //  Map (formInstanceId + materialCode)
+        Map<String, ProductionPlan> existMap = new HashMap<>();
+        for (ProductionPlan p : existList) {
+            String key = p.getFormInstanceId() + "_" + p.getMaterialCode();
+            existMap.put(key, p);
+        }
+
+        //  閬嶅巻鍚屾鏁版嵁
         for (ProductionPlan plan : list) {
-            LambdaQueryWrapper<ProductionPlan> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(ProductionPlan::getFormInstanceId, plan.getFormInstanceId())
-                    .eq(ProductionPlan::getMaterialCode, plan.getMaterialCode());
-            ProductionPlan existing = this.getOne(queryWrapper);
-            if (existing != null) {
-                plan.setId(existing.getId());
-                this.updateById(plan);
-            } else {
+            String key = plan.getFormInstanceId() + "_" + plan.getMaterialCode();
+            ProductionPlan exist = existMap.get(key);
+            if (exist == null) {
+                // 鏂板
                 this.save(plan);
+                affected++;
+                log.info("鏂板鏁版嵁 formInstanceId={}, materialCode={}", plan.getFormInstanceId(), plan.getMaterialCode());
+            } else {
+                // 鍒ゆ柇鏄惁闇�瑕佹洿鏂�
+                if (exist.getFormModifiedTime() == null || !exist.getFormModifiedTime().equals(plan.getFormModifiedTime())) {
+                    plan.setId(exist.getId());
+                    plan.setCreateTime(exist.getCreateTime());
+                    this.updateById(plan);
+                    affected++;
+                    log.info("鏇存柊鏁版嵁 formInstanceId={}, materialCode={}", plan.getFormInstanceId(), plan.getMaterialCode());
+                }
             }
         }
+        return affected;
     }
 
     private LocalDateTime parseUtcTime(String utcString) {
@@ -304,4 +334,9 @@
             return null;
         }
     }
+
+    @Override
+    public List<ProductionPlanSummaryDto> summaryByProductType(ProductionPlanSummaryDto query) {
+        return baseMapper.selectSummaryByProductType(query);
+    }
 }

--
Gitblit v1.9.3