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 | 104 +++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 98 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 5a7f679..13320da 100644
--- a/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -14,20 +14,18 @@
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;
@@ -41,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, "鎴愬搧");
}
// 鏌ヨ鏍硅妭鐐瑰垪琛�
@@ -61,6 +65,94 @@
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) {
--
Gitblit v1.9.3