From 971d450e8627d7d8116c741a0306cce05ad5f57c Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期四, 14 五月 2026 14:46:01 +0800
Subject: [PATCH] fix(customer): 修复客户分配逻辑

---
 src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java |   84 ++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 81 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java b/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
index 3667bb6..609d0fd 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -14,17 +14,18 @@
 import com.ruoyi.basic.service.IProductService;
 import com.ruoyi.basic.vo.ProductModelVo;
 import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.stock.mapper.WarehouseInfoMapper;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
 
 @Service
 @AllArgsConstructor
 public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements IProductService {
 
+    private final WarehouseInfoMapper warehouseInfoMapper;
     private ProductMapper productMapper;
 
     private ProductModelMapper productModelMapper;
@@ -64,6 +65,83 @@
         return productModelMapper.listPageProductModel(page, productModel);
     }
 
+    @Override
+    public IPage<ProductModelVo> pageModelAndQua(Page<ProductModelVo> page, ProductModel productModel) {
+        IPage<ProductModelVo> result = productModelMapper.pageModelAndQua(page, productModel);
+        fillBatchNoMaps(result.getRecords());
+        return result;
+    }
+
+    private void fillBatchNoMaps(List<ProductModelVo> records) {
+        if (records == null || records.isEmpty()) {
+            return;
+        }
+
+        List<Long> productModelIds = records.stream()
+                .map(ProductModelVo::getId)
+                .filter(Objects::nonNull)
+                .toList();
+        if (productModelIds.isEmpty()) {
+            return;
+        }
+
+        List<Map<String, Object>> batchRows = productModelMapper.selectBatchNoQtyByProductModelIds(productModelIds);
+        Map<Long, HashMap<String, HashMap<String, BigDecimal>>> batchNoQtyMapsByProductModelId = new HashMap<>();
+        for (Map<String, Object> batchRow : batchRows) {
+            Long productModelId = toLong(batchRow.get("productModelId"));
+            Long warehouseId = toLong(batchRow.get("warehouseId"));
+            String batchNo = (String) batchRow.get("batchNo");
+            if (productModelId == null || warehouseId == null || batchNo == null || batchNo.isBlank()) {
+                continue;
+            }
+
+            batchNoQtyMapsByProductModelId
+                    .computeIfAbsent(productModelId, key -> new HashMap<>())
+                    .computeIfAbsent(String.valueOf(warehouseId), key -> new HashMap<>())
+                    .merge(batchNo, toBigDecimal(batchRow.get("qty")), BigDecimal::add);
+        }
+
+        for (ProductModelVo record : records) {
+            HashMap<String, List<Map<String, BigDecimal>>> batchNoMaps = new HashMap<>();
+            HashMap<String, HashMap<String, BigDecimal>> stockBatchNoQtyMaps =
+                    batchNoQtyMapsByProductModelId.getOrDefault(record.getId(), new HashMap<>());
+
+            for (Map.Entry<String, HashMap<String, BigDecimal>> entry : stockBatchNoQtyMaps.entrySet()) {
+                List<Map<String, BigDecimal>> batchList = new ArrayList<>();
+                for (Map.Entry<String, BigDecimal> batchEntry : entry.getValue().entrySet()) {
+                    Map<String, BigDecimal> batchItem = new HashMap<>();
+                    batchItem.put(batchEntry.getKey(), batchEntry.getValue());
+                    batchList.add(batchItem);
+                }
+                batchNoMaps.put(entry.getKey(), batchList);
+            }
+
+            record.setBatchNoMaps(batchNoMaps);
+        }
+    }
+
+    private Long toLong(Object value) {
+        if (value instanceof Number number) {
+            return number.longValue();
+        }
+        if (value instanceof String str && !str.isBlank()) {
+            return Long.parseLong(str);
+        }
+        return null;
+    }
+
+    private BigDecimal toBigDecimal(Object value) {
+        if (value instanceof BigDecimal bigDecimal) {
+            return bigDecimal;
+        }
+        if (value instanceof Number number) {
+            return BigDecimal.valueOf(number.doubleValue());
+        }
+        if (value instanceof String str && !str.isBlank()) {
+            return new BigDecimal(str);
+        }
+        return BigDecimal.ZERO;
+    }
 
     // 閫掑綊鏋勫缓瀛愯妭鐐�
     private List<ProductTreeDto> buildChildrenNodes(Long parentId) {

--
Gitblit v1.9.3