From 712b1df6fdee09bd92388a60a9f5d890d711387b Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 19 三月 2026 17:34:24 +0800
Subject: [PATCH] fix:1.入库管理和耗材导出优化 2.仓储物流和耗材物流导出修改 3.首页统计仓储物流和耗材物料两边的数据

---
 src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java                                 |    8 ++
 src/main/resources/mapper/consumables/ConsumablesInventoryMapper.xml                  |   17 +++++
 src/main/java/com/ruoyi/home/dto/QualityStatisticsDto.java                            |    3 +
 src/main/java/com/ruoyi/consumables/execl/ConsumablesInRecordExportData.java          |    2 
 src/main/java/com/ruoyi/quality/pojo/RawMaterial.java                                 |   17 +++++
 src/main/resources/mapper/stock/StockInventoryMapper.xml                              |   12 ++++
 src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java             |    2 
 src/main/java/com/ruoyi/consumables/service/impl/ConsumablesInventoryServiceImpl.java |    2 
 src/main/java/com/ruoyi/consumables/execl/ConsumablesInventoryExportData.java         |    9 ++-
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java                        |  104 +++++++++++++++++++---------------
 10 files changed, 123 insertions(+), 53 deletions(-)

diff --git a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
index f4d92f7..f02a11a 100644
--- a/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
@@ -5,7 +5,7 @@
 
 @Getter
 public enum StockOutQualifiedRecordTypeEnum implements BaseEnum<String> {
-    CUSTOMIZATION_STOCK_OUT("1", "鍚堟牸鑷畾涔夊嚭搴�");
+    CUSTOMIZATION_STOCK_OUT("0", "鍚堟牸鑷畾涔夊嚭搴�");
 //    PRODUCTION_REPORT_STOCK_OUT("3", "鐢熶骇鎶ュ伐-鍑哄簱");
 //    SALE_STOCK_OUT("8", "閿�鍞�-鍑哄簱"),
 //    SALE_SHIP_STOCK_OUT("13", "閿�鍞�-鍙戣揣鍑哄簱");
diff --git a/src/main/java/com/ruoyi/consumables/execl/ConsumablesInRecordExportData.java b/src/main/java/com/ruoyi/consumables/execl/ConsumablesInRecordExportData.java
index 12681e6..247e3fe 100644
--- a/src/main/java/com/ruoyi/consumables/execl/ConsumablesInRecordExportData.java
+++ b/src/main/java/com/ruoyi/consumables/execl/ConsumablesInRecordExportData.java
@@ -21,7 +21,7 @@
     @Excel(name = "鍏ュ簱鏉ユ簮")
     private String recordType;
     @Excel(name = "鍏ュ簱鏁伴噺")
-    private String ConsumablesInNum;
+    private String stockInNum;
     @Excel(name = "鍏ュ簱鏃堕棿")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
diff --git a/src/main/java/com/ruoyi/consumables/execl/ConsumablesInventoryExportData.java b/src/main/java/com/ruoyi/consumables/execl/ConsumablesInventoryExportData.java
index 01e4e6f..2714ec6 100644
--- a/src/main/java/com/ruoyi/consumables/execl/ConsumablesInventoryExportData.java
+++ b/src/main/java/com/ruoyi/consumables/execl/ConsumablesInventoryExportData.java
@@ -21,13 +21,16 @@
 
     @Excel(name = "搴撳瓨鏁伴噺")
     private BigDecimal qualitity;
-
-    @Excel(name = "棰勮鏁伴噺")
-    private BigDecimal warnNum;
+//
+//    @Excel(name = "棰勮鏁伴噺")
+//    private BigDecimal warnNum;
 
     @Excel(name = "鍐荤粨鏁伴噺")
     private BigDecimal lockedQuantity;
 
+    @Excel(name = "鍑�閲嶏紙鍚級")
+    private BigDecimal netWeight;
+
     @Excel(name = "澶囨敞")
     private String remark;
 //
diff --git a/src/main/java/com/ruoyi/consumables/service/impl/ConsumablesInventoryServiceImpl.java b/src/main/java/com/ruoyi/consumables/service/impl/ConsumablesInventoryServiceImpl.java
index 95001f1..b0ecb27 100644
--- a/src/main/java/com/ruoyi/consumables/service/impl/ConsumablesInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/consumables/service/impl/ConsumablesInventoryServiceImpl.java
@@ -162,7 +162,7 @@
                         consumablesInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode());
                         consumablesInventoryDto.setQualitity(dto.getQualitity());
                         consumablesInventoryDto.setRemark(dto.getRemark());
-                        consumablesInventoryDto.setWarnNum(dto.getWarnNum());
+                        consumablesInventoryDto.setNetWeight(dto.getNetWeight());
                         if (ObjectUtils.isNotEmpty(dto.getLockedQuantity()) && dto.getLockedQuantity().compareTo(dto.getQualitity()) > 0) {
                             throw new RuntimeException("鍐荤粨鏁伴噺涓嶈兘瓒呰繃鏈瀵煎叆鐨勫簱瀛樻暟閲�");
                         }
diff --git a/src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java b/src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java
index 6c5a20a..de0b719 100644
--- a/src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java
+++ b/src/main/java/com/ruoyi/home/dto/HomeBusinessDto.java
@@ -4,8 +4,6 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.math.BigDecimal;
-
 /**
  * @author :yys
  * @date : 2025/7/25 9:25
@@ -29,7 +27,13 @@
     @ApiModelProperty("褰撳墠搴撳瓨鏁伴噺")
     private String inventoryNum = "0.00";
 
+    @ApiModelProperty("褰撳墠鑰楁潗搴撳瓨鏁伴噺")
+    private String consumablesQuantityTotal = "0.00";
+
     @ApiModelProperty("浠婃棩搴撳瓨鏁伴噺")
     private String todayInventoryNum = "0.00";
 
+    @ApiModelProperty("浠婃棩鑰楁潗搴撳瓨鏁伴噺")
+    private String consumablesTodayNum = "0.00";
+
 }
diff --git a/src/main/java/com/ruoyi/home/dto/QualityStatisticsDto.java b/src/main/java/com/ruoyi/home/dto/QualityStatisticsDto.java
index 970449a..de52765 100644
--- a/src/main/java/com/ruoyi/home/dto/QualityStatisticsDto.java
+++ b/src/main/java/com/ruoyi/home/dto/QualityStatisticsDto.java
@@ -1,5 +1,6 @@
 package com.ruoyi.home.dto;
 
+import com.ruoyi.quality.pojo.RawMaterial;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -26,4 +27,6 @@
 
     private List<QualityStatisticsItem> item;
 
+    private List<RawMaterial> rawItem;
+
 }
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index 29a8c37..ddb36b9 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -19,6 +19,7 @@
 import com.ruoyi.common.enums.ApproveTypeEnum;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.consumables.mapper.ConsumablesInventoryMapper;
 import com.ruoyi.device.mapper.DeviceRepairMapper;
 import com.ruoyi.device.pojo.DeviceRepair;
 import com.ruoyi.dto.MapDto;
@@ -38,8 +39,10 @@
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
+import com.ruoyi.quality.mapper.RawMaterialMapper;
 import com.ruoyi.quality.pojo.QualityInspect;
 import com.ruoyi.quality.pojo.QualityUnqualified;
+import com.ruoyi.quality.pojo.RawMaterial;
 import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
@@ -85,6 +88,9 @@
     private StockInventoryMapper stockInventoryMapper;
 
     @Autowired
+    private ConsumablesInventoryMapper consumablesInventoryMapper;
+
+    @Autowired
     private QualityInspectMapper qualityStatisticsMapper;
 
     @Autowired
@@ -128,6 +134,9 @@
 
     @Autowired
     private QualityInspectMapper qualityInspectMapper;
+
+    @Autowired
+    private RawMaterialMapper rawMaterialMapper;
 
     @Autowired
     private QualityUnqualifiedMapper qualityUnqualifiedMapper;
@@ -202,11 +211,15 @@
         }
         // 缁熻搴撳瓨
         BigDecimal stockQuantityTotal = stockInventoryMapper.selectTotal();
+        BigDecimal consumablesQuantityTotal = consumablesInventoryMapper.selectTotal();
         homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
+        homeBusinessDto.setConsumablesQuantityTotal(consumablesQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
 
         // 鑾峰彇褰撳ぉ鍏ュ簱鏁伴噺
         BigDecimal bigDecimal = stockInventoryMapper.selectTotalByDate(LocalDate.now());
+        BigDecimal consumablesTodayNum = consumablesInventoryMapper.selectTotalByDate(LocalDate.now());
         homeBusinessDto.setTodayInventoryNum(bigDecimal.setScale(2, RoundingMode.HALF_UP).toString());
+        homeBusinessDto.setConsumablesTodayNum(consumablesTodayNum.setScale(2, RoundingMode.HALF_UP).toString());
         return homeBusinessDto;
     }
 
@@ -2389,87 +2402,88 @@
                 endDate = today.with(DayOfWeek.SUNDAY);
         }
 
-        List<QualityInspect> qualityInspectList = qualityInspectMapper
-                .selectList(new LambdaQueryWrapper<QualityInspect>()
-                        .ge(QualityInspect::getCheckTime, startDate.toString())
-                        .le(QualityInspect::getCheckTime, endDate.toString())
-                        .eq(QualityInspect::getInspectState, 1));
+        List<RawMaterial> rawMaterialList = rawMaterialMapper
+                .selectList(new LambdaQueryWrapper<RawMaterial>()
+                        .ge(RawMaterial::getCheckTime, startDate.toString())
+                        .le(RawMaterial::getCheckTime, endDate.toString())
+                        .eq(RawMaterial::getInspectState, 1));
 
         QualityStatisticsDto dto = new QualityStatisticsDto();
-        dto.setSupplierNum(sumQuantity(qualityInspectList, 0)); // 鍘熸潗鏂�
-        dto.setProcessNum(sumQuantity(qualityInspectList, 1)); // 杩囩▼
-        dto.setFactoryNum(sumQuantity(qualityInspectList, 2)); // 鍑哄巶
+        Map<Integer, BigDecimal> countMap = rawMaterialList.stream()
+                .collect(Collectors.groupingBy(
+                        RawMaterial::getCheckType,
+                        Collectors.collectingAndThen(
+                                Collectors.counting(),
+                                count -> BigDecimal.valueOf(count)
+                        )
+                ));
 
-        Map<String, List<QualityInspect>> groupedByCheckResult = qualityInspectList.stream()
-                .collect(Collectors.groupingBy(QualityInspect::getCheckResult));
+        dto.setSupplierNum(countMap.getOrDefault(0, BigDecimal.ZERO)); // 鍏ュ巶
+        dto.setProcessNum(countMap.getOrDefault(1, BigDecimal.ZERO));  // 杞﹂棿
+        dto.setFactoryNum(countMap.getOrDefault(2, BigDecimal.ZERO));  // 鍑哄巶
 
-        List<QualityInspect> qualityInspects = groupedByCheckResult.getOrDefault("涓嶅悎鏍�", new ArrayList<>());
+        // 3. 绛涢�変笉鍚堟牸鐨勮褰曪紙check_result = 0锛�
+        List<RawMaterial> unqualifiedList = rawMaterialList.stream()
+                .filter(i -> i.getCheckResult() == 0)  // 0琛ㄧず涓嶅悎鏍�
+                .collect(Collectors.toList());
 
         // 4. 澶勭悊鍥捐〃椤� (Item)
-        List<QualityStatisticsItem> itemList = new ArrayList<>();
-
-        Map<QualityInspect, LocalDate> dateMap = qualityInspects.isEmpty() ?
-                new HashMap<>() :
-                qualityInspectList.stream()
-                        .collect(Collectors.toMap(
-                                i -> i,
-                                i -> i.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(),
-                                (existing, replacement) -> existing));
+        List<RawMaterial> itemList = new ArrayList<>();
 
         if (type == 3) {
             // 瀛e害妯″紡锛氭寜鏈堝垎缁�
-            Map<String, List<QualityInspect>> groupByMonth = qualityInspects.isEmpty() ?
+            Map<String, List<RawMaterial>> groupByMonth = unqualifiedList.isEmpty() ?
                     new HashMap<>() :
-                    qualityInspects.stream()
+                    unqualifiedList.stream()
                             .collect(Collectors.groupingBy(i -> {
-                                LocalDate ld = dateMap.get(i);
+                                LocalDate ld = i.getCheckTime().toInstant()
+                                        .atZone(ZoneId.systemDefault()).toLocalDate();
                                 return ld.format(DateTimeFormatter.ofPattern("yyyy-MM"));
                             }));
 
             for (int i = 0; i < 3; i++) {
                 LocalDate monthDate = startDate.plusMonths(i);
                 String monthStr = monthDate.format(DateTimeFormatter.ofPattern("yyyy-MM"));
-                itemList.add(buildItem(monthStr, groupByMonth.getOrDefault(monthStr, new ArrayList<>())));
+                List<RawMaterial> monthData = groupByMonth.getOrDefault(monthStr, new ArrayList<>());
+                itemList.add(buildItem(monthStr, monthData));
             }
         } else {
             // 鍛ㄦ垨鏈堟ā寮忥細鎸夊ぉ鍒嗙粍
-            Map<String, List<QualityInspect>> groupByDay = qualityInspects.isEmpty() ?
+            Map<String, List<RawMaterial>> groupByDay = unqualifiedList.isEmpty() ?
                     new HashMap<>() :
-                    qualityInspects.stream()
+                    unqualifiedList.stream()
                             .collect(Collectors.groupingBy(i -> {
-                                LocalDate ld = dateMap.get(i);
+                                LocalDate ld = i.getCheckTime().toInstant()
+                                        .atZone(ZoneId.systemDefault()).toLocalDate();
                                 return ld.format(DateTimeFormatter.ofPattern("MM/dd"));
                             }));
+
             long days = ChronoUnit.DAYS.between(startDate, endDate);
             for (int i = 0; i <= days; i++) {
                 LocalDate tempDay = startDate.plusDays(i);
                 String dayStr = tempDay.format(DateTimeFormatter.ofPattern("MM/dd"));
-                itemList.add(buildItem(dayStr, groupByDay.getOrDefault(dayStr, new ArrayList<>())));
+                List<RawMaterial> dayData = groupByDay.getOrDefault(dayStr, new ArrayList<>());
+                itemList.add(buildItem(dayStr, dayData));
             }
         }
 
-        dto.setItem(itemList);
+        dto.setRawItem(itemList);
         return dto;
     }
 
-    private BigDecimal sumQuantity(List<QualityInspect> list, Integer type) {
-        return list.stream()
-                .filter(i -> i.getInspectType().equals(type))
-                .map(QualityInspect::getQuantity)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-    }
-
-    private QualityStatisticsItem buildItem(String dateLabel, List<QualityInspect> list) {
-        QualityStatisticsItem item = new QualityStatisticsItem();
+    private RawMaterial buildItem(String dateLabel, List<RawMaterial> list) {
+        RawMaterial item = new RawMaterial();
         item.setDate(dateLabel);
 
-        item.setSupplierNum(list.stream().filter(i -> i.getInspectType() == 0).map(QualityInspect::getQuantity)
-                .reduce(BigDecimal.ZERO, BigDecimal::add));
-        item.setProcessNum(list.stream().filter(i -> i.getInspectType() == 1).map(QualityInspect::getQuantity)
-                .reduce(BigDecimal.ZERO, BigDecimal::add));
-        item.setFactoryNum(list.stream().filter(i -> i.getInspectType() == 2).map(QualityInspect::getQuantity)
-                .reduce(BigDecimal.ZERO, BigDecimal::add));
+        item.setSupplierNum(
+                BigDecimal.valueOf(list.stream().filter(i -> i.getCheckType() == 0).count())
+        );
+        item.setProcessNum(
+                BigDecimal.valueOf(list.stream().filter(i -> i.getCheckType() == 1).count())
+        );
+        item.setFactoryNum(
+                BigDecimal.valueOf(list.stream().filter(i -> i.getCheckType() == 2).count())
+        );
 
         return item;
     }
diff --git a/src/main/java/com/ruoyi/quality/pojo/RawMaterial.java b/src/main/java/com/ruoyi/quality/pojo/RawMaterial.java
index bf7d158..6cf90ca 100644
--- a/src/main/java/com/ruoyi/quality/pojo/RawMaterial.java
+++ b/src/main/java/com/ruoyi/quality/pojo/RawMaterial.java
@@ -10,6 +10,7 @@
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.Date;
 
@@ -68,4 +69,20 @@
     @ApiModelProperty(value = "淇敼鏃堕棿")
     @TableField(fill = FieldFill.INSERT_UPDATE)
     private LocalDateTime updateTime;
+
+
+    @ApiModelProperty(value = "鍘熸潗鏂欎笉鍚堟牸鏁�")
+    @TableField(exist = false)
+    private BigDecimal supplierNum;
+
+    @ApiModelProperty(value = "鍑哄巶涓嶅悎鏍兼暟")
+    @TableField(exist = false)
+    private BigDecimal factoryNum;
+
+    @TableField(exist = false)
+    @ApiModelProperty(value = "杩囩▼涓嶅悎鏍兼暟")
+    private BigDecimal processNum;
+
+    @TableField(exist = false)
+    private String date;
 }
diff --git a/src/main/resources/mapper/consumables/ConsumablesInventoryMapper.xml b/src/main/resources/mapper/consumables/ConsumablesInventoryMapper.xml
index da58179..3f7f8d4 100644
--- a/src/main/resources/mapper/consumables/ConsumablesInventoryMapper.xml
+++ b/src/main/resources/mapper/consumables/ConsumablesInventoryMapper.xml
@@ -110,6 +110,8 @@
 
     <select id="listConsumablesInventoryExportData" resultType="com.ruoyi.consumables.execl.ConsumablesInventoryExportData">
         select si.qualitity,
+        -- 褰撳墠鍑�閲� = 鍏ュ簱鍑�閲� - 鍑哄簱鍑�閲�
+        (COALESCE(sir.total_net_weight,0) - COALESCE(sor.total_net_weight,0)) as net_weight,
         pm.model,
         pm.unit,
         p.product_name,
@@ -120,6 +122,21 @@
         from consumables_inventory si
         left join product_model pm on si.product_model_id = pm.id
         left join product p on pm.product_id = p.id
+        left join (
+        select
+        product_model_id,
+        sum(net_weight) as total_net_weight
+        from Consumables_in_record
+        group by product_model_id
+        ) sir on si.product_model_id = sir.product_model_id
+        -- 鍑哄簱鍑�閲�
+        left join (
+        select
+        product_model_id,
+        sum(net_weight) as total_net_weight
+        from Consumables_out_record
+        group by product_model_id
+        ) sor on si.product_model_id = sor.product_model_id
         where 1 = 1
         <if test="ew.productName != null and ew.productName !=''">
             and p.product_name like concat('%',#{ew.productName},'%')
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index 9e0ab0e..7bc72a7 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -102,6 +102,8 @@
 
     <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData">
         select si.qualitity,
+        -- 褰撳墠鍑�閲� = 鍏ュ簱鍑�閲� - 鍑哄簱鍑�閲�
+        (COALESCE(sir.total_net_weight, 0) - COALESCE(sor.total_net_weight, 0)) AS net_weight,-
         pm.model,
         pm.unit,
         p.product_name,
@@ -112,6 +114,16 @@
         from stock_inventory si
         left join product_model pm on si.product_model_id = pm.id
         left join product p on pm.product_id = p.id
+        LEFT JOIN (
+        SELECT product_model_id, SUM(net_weight) AS total_net_weight
+        FROM stock_in_record
+        GROUP BY product_model_id
+        ) sir ON si.product_model_id = sir.product_model_id
+        LEFT JOIN (
+        SELECT product_model_id, SUM(net_weight) AS total_net_weight
+        FROM stock_out_record
+        GROUP BY product_model_id
+        ) sor ON si.product_model_id = sor.product_model_id
         where 1 = 1
         <if test="ew.productName != null and ew.productName !=''">
             and p.product_name like concat('%',#{ew.productName},'%')

--
Gitblit v1.9.3