From 4d99e718536ac77dff26dde8da7a59cdc9b52de8 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期三, 20 五月 2026 10:13:57 +0800
Subject: [PATCH] fix:1.生产报工优化

---
 src/main/java/com/ruoyi/stock/support/FinishedProductStockDimensionResolver.java |  184 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 184 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/stock/support/FinishedProductStockDimensionResolver.java b/src/main/java/com/ruoyi/stock/support/FinishedProductStockDimensionResolver.java
new file mode 100644
index 0000000..5ca047b
--- /dev/null
+++ b/src/main/java/com/ruoyi/stock/support/FinishedProductStockDimensionResolver.java
@@ -0,0 +1,184 @@
+package com.ruoyi.stock.support;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.production.mapper.ProductProcessMapper;
+import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
+import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.mapper.ProductionProductOutputMapper;
+import com.ruoyi.production.pojo.ProductProcess;
+import com.ruoyi.production.pojo.ProductProcessRouteItem;
+import com.ruoyi.production.pojo.ProductionProductMain;
+import com.ruoyi.production.pojo.ProductionProductOutput;
+import org.springframework.stereotype.Component;
+
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+@Component
+public class FinishedProductStockDimensionResolver {
+
+    private static final String PROCESS_COPPER = "鍗伴摐";
+    private static final String PROCESS_SILVER = "鍗伴摱";
+    private static final String PROCESS_CATEGORY_COPPER = "閾滄瀬";
+    private static final String PROCESS_CATEGORY_SILVER = "閾舵瀬";
+    private static final String VOLTAGE_PARAMETER = "鐢靛帇";
+
+    private final ProductionProductMainMapper productionProductMainMapper;
+    private final ProductionProductOutputMapper productionProductOutputMapper;
+    private final ProductProcessRouteItemMapper productProcessRouteItemMapper;
+    private final ProductProcessMapper productProcessMapper;
+
+    public FinishedProductStockDimensionResolver(ProductionProductMainMapper productionProductMainMapper,
+                                                 ProductionProductOutputMapper productionProductOutputMapper,
+                                                 ProductProcessRouteItemMapper productProcessRouteItemMapper,
+                                                 ProductProcessMapper productProcessMapper) {
+        this.productionProductMainMapper = productionProductMainMapper;
+        this.productionProductOutputMapper = productionProductOutputMapper;
+        this.productProcessRouteItemMapper = productProcessRouteItemMapper;
+        this.productProcessMapper = productProcessMapper;
+    }
+
+    /**
+     * 瑙f瀽鎴愬搧鍏ュ簱绫诲埆銆�
+     * 褰撳伐搴忎负鍗伴摐鏃惰繑鍥為摐鏋侊紝褰撳伐搴忎负鍗伴摱鏃惰繑鍥為摱鏋併��
+     */
+    public String resolveProcessCategory(Long productMainId) {
+        ProductionProductMain productionProductMain = loadProductionMain(productMainId);
+        ProductProcessRouteItem routeItem = loadRouteItem(productionProductMain);
+        if (routeItem.getProductRouteId() == null) {
+            throw new ServiceException("宸ヨ壓璺嚎鏈粦瀹氬伐鑹烘槑缁嗭紝鏃犳硶纭畾鎴愬搧绫诲埆");
+        }
+        return resolveProcessCategoryByRouteId(routeItem.getProductRouteId());
+    }
+
+    /**
+     * 瑙f瀽鎴愬搧鍏ュ簱鐢靛帇锛屾潵婧愪簬鎶ュ伐 otherData 涓殑鈥滅數鍘嬧�濆弬鏁般��
+     */
+    public String resolveVoltage(Long productMainId) {
+        List<ProductionProductOutput> outputs = loadOutputs(productMainId);
+        for (ProductionProductOutput output : outputs) {
+            String voltage = resolveVoltageValue(output.getOtherData());
+            if (StringUtils.isNotBlank(voltage)) {
+                return voltage;
+            }
+        }
+        throw new ServiceException("璇烽厤缃弬鏁扮數鍘�");
+    }
+
+    private ProductionProductMain loadProductionMain(Long productMainId) {
+        if (productMainId == null) {
+            throw new ServiceException("鎶ュ伐ID涓嶈兘涓虹┖");
+        }
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productMainId);
+        if (productionProductMain == null) {
+            throw new ServiceException("鎶ュ伐璁板綍涓嶅瓨鍦紝鏃犳硶纭畾鎴愬搧搴撳瓨缁村害");
+        }
+        return productionProductMain;
+    }
+
+    private ProductProcessRouteItem loadRouteItem(ProductionProductMain productionProductMain) {
+        if (productionProductMain.getProductProcessRouteItemId() == null) {
+            throw new ServiceException("鎶ュ伐鏈叧鑱斿伐鑹鸿矾绾挎槑缁嗭紝鏃犳硶纭畾鎴愬搧搴撳瓨缁村害");
+        }
+        ProductProcessRouteItem routeItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId());
+        if (routeItem == null) {
+            throw new ServiceException("宸ヨ壓璺嚎鏄庣粏涓嶅瓨鍦紝鏃犳硶纭畾鎴愬搧搴撳瓨缁村害");
+        }
+        return routeItem;
+    }
+
+    private List<ProductionProductOutput> loadOutputs(Long productMainId) {
+        List<ProductionProductOutput> outputs = productionProductOutputMapper.selectList(
+                new LambdaQueryWrapper<ProductionProductOutput>()
+                        .eq(ProductionProductOutput::getProductMainId, productMainId)
+        );
+        if (CollectionUtils.isEmpty(outputs)) {
+            throw new ServiceException("鎶ュ伐杈撳嚭璁板綍涓嶅瓨鍦紝鏃犳硶纭畾鎴愬搧搴撳瓨缁村害");
+        }
+        return outputs;
+    }
+
+    private String resolveProcessCategoryByRouteId(Long productRouteId) {
+        List<ProductProcessRouteItem> routeItems = productProcessRouteItemMapper.selectList(
+                new LambdaQueryWrapper<ProductProcessRouteItem>()
+                        .eq(ProductProcessRouteItem::getProductRouteId, productRouteId)
+        );
+        if (CollectionUtils.isEmpty(routeItems)) {
+            throw new ServiceException("璁㈠崟宸ヨ壓璺嚎鏈厤缃伐搴忥紝鏃犳硶纭畾鎴愬搧绫诲埆");
+        }
+        Set<Long> processIds = routeItems.stream()
+                .map(ProductProcessRouteItem::getProcessId)
+                .filter(id -> id != null)
+                .collect(Collectors.toSet());
+        if (processIds.isEmpty()) {
+            throw new ServiceException("璁㈠崟宸ヨ壓璺嚎鏈厤缃伐搴忥紝鏃犳硶纭畾鎴愬搧绫诲埆");
+        }
+        List<ProductProcess> processes = productProcessMapper.selectBatchIds(processIds);
+        Set<String> matchedCategories = processes.stream()
+                .map(ProductProcess::getName)
+                .filter(name -> PROCESS_COPPER.equals(name) || PROCESS_SILVER.equals(name))
+                .collect(Collectors.toCollection(LinkedHashSet::new));
+        if (matchedCategories.isEmpty()) {
+            throw new ServiceException("璁㈠崟宸ヨ壓璺嚎鏈厤缃嵃閾�/鍗伴摱宸ュ簭锛屾棤娉曠‘瀹氭垚鍝佺被鍒�");
+        }
+        if (matchedCategories.size() > 1) {
+            throw new ServiceException("璁㈠崟宸ヨ壓璺嚎鍚屾椂閰嶇疆浜嗗嵃閾滃拰鍗伴摱锛屾棤娉曠‘瀹氭垚鍝佺被鍒�");
+        }
+        String matchedProcess = matchedCategories.iterator().next();
+        if (PROCESS_COPPER.equals(matchedProcess)) {
+            return PROCESS_CATEGORY_COPPER;
+        }
+        return PROCESS_CATEGORY_SILVER;
+    }
+
+    private String resolveVoltageValue(String otherData) {
+        if (StringUtils.isBlank(otherData)) {
+            return null;
+        }
+        Object parsed;
+        try {
+            parsed = JSON.parse(otherData);
+        } catch (Exception ex) {
+            throw new ServiceException("鎶ュ伐鍙傛暟鏍煎紡閿欒锛屾棤娉曡В鏋愮數鍘�");
+        }
+        String voltage = StringUtils.trim(findVoltageValue(parsed));
+        return StringUtils.isBlank(voltage) ? null : voltage;
+    }
+
+    private String findVoltageValue(Object node) {
+        if (node instanceof JSONArray) {
+            JSONArray array = (JSONArray) node;
+            for (Object item : array) {
+                String voltage = findVoltageValue(item);
+                if (StringUtils.isNotBlank(voltage)) {
+                    return voltage;
+                }
+            }
+            return null;
+        }
+        if (node instanceof JSONObject) {
+            JSONObject object = (JSONObject) node;
+            if (VOLTAGE_PARAMETER.equals(StringUtils.trim(object.getString("parameterItem")))) {
+                String value = StringUtils.trim(object.getString("value"));
+                if (StringUtils.isNotBlank(value)) {
+                    return value;
+                }
+            }
+            for (Object value : object.values()) {
+                String voltage = findVoltageValue(value);
+                if (StringUtils.isNotBlank(voltage)) {
+                    return voltage;
+                }
+            }
+        }
+        return null;
+    }
+}

--
Gitblit v1.9.3