From 4336d99906953517399187638925817d969c4e10 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期四, 14 五月 2026 14:18:14 +0800
Subject: [PATCH] refactor(stock): 优化库存管理和产品模型查询功能
---
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