From 76c84d95506998f546e6f3ebbf70414c0dd9da9d Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期五, 15 五月 2026 17:15:15 +0800
Subject: [PATCH] refactor(stock): 优化库存记录服务中的仓库信息处理逻辑

---
 src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java |  115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 109 insertions(+), 6 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 b93e14a..13320da 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -1,6 +1,9 @@
 package com.ruoyi.basic.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.basic.dto.ProductDto;
 import com.ruoyi.basic.dto.ProductTreeDto;
@@ -9,21 +12,20 @@
 import com.ruoyi.basic.pojo.Product;
 import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.basic.service.IProductService;
+import com.ruoyi.basic.vo.ProductModelVo;
 import com.ruoyi.common.utils.bean.BeanUtils;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.stock.mapper.WarehouseInfoMapper;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
-import org.springframework.web.multipart.MultipartFile;
 
-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;
@@ -37,6 +39,12 @@
         // 濡傛灉鏈変骇鍝佸悕绉版潯浠讹紝娣诲姞鍒版煡璇腑
         if (productDto.getProductName() != null && !productDto.getProductName().isEmpty()) {
             queryWrapper.like(Product::getProductName, productDto.getProductName());
+        }
+        // 娴疆鐢ㄤ簬鍖哄垎鎴愬搧鍜岀墿鏂�
+        if (productDto.getProductType() != null && !productDto.getProductType().isEmpty()) {
+            if (productDto.getProductType().equals("鎴愬搧")) {
+                queryWrapper.eq(Product::getProductName, productDto.getProductType());
+            } else queryWrapper.ne(Product::getProductName, "鎴愬搧");
         }
 
         // 鏌ヨ鏍硅妭鐐瑰垪琛�
@@ -52,7 +60,99 @@
         return tree;
     }
 
+    @Override
+    public IPage<ProductModelVo> listPageProductModel(Page<ProductModelVo> page, ProductModel productModel) {
+        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);
+        List<Map<String, Object>> unqualifiedBatchRows =
+                productModelMapper.selectUnqualifiedBatchNoQtyByProductModelIds(productModelIds);
+        batchRows.addAll(unqualifiedBatchRows);
+        Map<Long, HashMap<String, HashMap<String, BigDecimal>>> batchNoQtyMapsByProductModelId =
+                buildBatchNoQtyMaps(batchRows);
+        for (ProductModelVo record : records) {
+            record.setBatchNoMaps(toBatchNoMaps(
+                    batchNoQtyMapsByProductModelId.getOrDefault(record.getId(), new HashMap<>())));
+        }
+    }
+
+    private Map<Long, HashMap<String, HashMap<String, BigDecimal>>> buildBatchNoQtyMaps(
+            List<Map<String, Object>> batchRows) {
+        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);
+        }
+        return batchNoQtyMapsByProductModelId;
+    }
+
+    private HashMap<String, List<Map<String, BigDecimal>>> toBatchNoMaps(
+            HashMap<String, HashMap<String, BigDecimal>> stockBatchNoQtyMaps) {
+        HashMap<String, List<Map<String, BigDecimal>>> batchNoMaps = 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);
+        }
+        return 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) {
@@ -83,6 +183,9 @@
 
     @Override
     public int addOrEditProduct(ProductDto productDto) {
+        if (ObjectUtils.isEmpty(productDto.getParentId())) {
+            throw new IllegalArgumentException("璇烽�夋嫨鐖惰妭鐐�");
+        }
         if (productDto.getId() == null) {
             // 鏂板浜у搧閫昏緫
             if (productDto.getParentId() == null) {

--
Gitblit v1.9.3