From 7b4fdb4289ded1adc3dc8466a8d0225a86a81e6a Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期三, 28 一月 2026 16:21:24 +0800
Subject: [PATCH] refactor(home): 删除质检信息,删除销售信息,回滚对应的库存信息

---
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java |  282 +++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 226 insertions(+), 56 deletions(-)

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 6085d2d..137c5fb 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -2,8 +2,8 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.home.mapper.HomeMapper;
 import com.ruoyi.approve.mapper.ApproveProcessMapper;
 import com.ruoyi.approve.pojo.ApproveProcess;
 import com.ruoyi.basic.mapper.CustomerMapper;
@@ -12,7 +12,6 @@
 import com.ruoyi.basic.mapper.SupplierManageMapper;
 import com.ruoyi.basic.pojo.Customer;
 import com.ruoyi.basic.pojo.Product;
-import com.ruoyi.basic.pojo.ProductModel;
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.collaborativeApproval.mapper.NoticeMapper;
 import com.ruoyi.collaborativeApproval.pojo.Notice;
@@ -52,6 +51,7 @@
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.staff.mapper.StaffOnJobMapper;
 import com.ruoyi.staff.pojo.StaffOnJob;
+import com.ruoyi.stock.mapper.StockInventoryMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -83,6 +83,9 @@
 
     @Autowired
     private SalesLedgerProductMapper salesLedgerProductMapper;
+
+    @Autowired
+    private StockInventoryMapper stockInventoryMapper;
 
     @Autowired
     private ProcurementRecordMapper procurementRecordStorageMapper;
@@ -125,6 +128,9 @@
     @Autowired
     private SysUserDeptMapper sysUserDeptMapper;
 
+    @Autowired
+    private HomeMapper homeMapper;
+
     @Override
     public HomeBusinessDto business() {
         // 鏋勫缓缁撴灉
@@ -136,7 +142,7 @@
         salesLedgerLambdaQueryWrapper.ge(SalesLedger::getEntryDate, currentMonth.atDay(1).atStartOfDay())  // 澶т簬绛変簬鏈湀绗竴澶�
                 .lt(SalesLedger::getEntryDate, currentMonth.plusMonths(1).atDay(1).atStartOfDay()); // 灏忎簬涓嬫湀绗竴澶�
         List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(salesLedgerLambdaQueryWrapper);
-        if(!CollectionUtils.isEmpty(salesLedgers)){
+        if (!CollectionUtils.isEmpty(salesLedgers)) {
             // 鍚堣鍚堝悓閲戦
             BigDecimal contractAmount = salesLedgers.stream().map(SalesLedger::getContractAmount)
                     .filter(Objects::nonNull)
@@ -158,7 +164,7 @@
                 .lt(PurchaseLedger::getEntryDate, currentMonth.plusMonths(1).atDay(1).atStartOfDay()); // 灏忎簬涓嬫湀绗竴澶�
         // 鎵ц鏌ヨ骞惰绠楁�诲拰
         List<PurchaseLedger> purchaseLedgers = purchaseLedgerMapper.selectList(queryWrapper);
-        if(!CollectionUtils.isEmpty(purchaseLedgers)){
+        if (!CollectionUtils.isEmpty(purchaseLedgers)) {
             LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductMapperLambdaQueryWrapperCopy = new LambdaQueryWrapper<SalesLedgerProduct>();
             salesLedgerProductMapperLambdaQueryWrapperCopy.eq(SalesLedgerProduct::getType, 2)
                     .in(SalesLedgerProduct::getSalesLedgerId, purchaseLedgers.stream().map(PurchaseLedger::getId).collect(Collectors.toList()));
@@ -177,46 +183,13 @@
             homeBusinessDto.setMonthPurchaseHaveMoney(unReceiptPaymentAmount.setScale(2, RoundingMode.HALF_UP).toString());
         }
         // 缁熻搴撳瓨
-//        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null);
-//        BigDecimal stockAmount = procurementRecordStorages.stream()
-//                .map(ProcurementRecordStorage::getInboundNum)
-//                .filter(Objects::nonNull)
-//                .reduce(BigDecimal.ZERO, BigDecimal::add);
-//        // 鑷畾涔夊簱瀛�
-//        List<CustomStorage> customStorages = customStorageMapper.selectList(null);
-//        BigDecimal customStockAmount = customStorages.stream()
-//                .map(CustomStorage::getInboundNum)
-//                .filter(Objects::nonNull)
-//                .reduce(BigDecimal.ZERO, BigDecimal::add);
-//        List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null);
-//        BigDecimal outboundAmount = procurementRecordOuts.stream()
-//                .map(ProcurementRecordOut::getInboundNum)
-//                .filter(Objects::nonNull)
-//                .reduce(BigDecimal.ZERO, BigDecimal::add);
-//        BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount);
-        IPage<ProductModel> productModelIPage = productModelMapper.listPageProductModel(new Page<>(1, -1), new ProductModel());
-        if(!CollectionUtils.isEmpty(productModelIPage.getRecords())){
-            //鑾峰彇瑙勬牸id
-            List<Long> modelIds = productModelIPage.getRecords().stream().map(ProductModel::getId).collect(Collectors.toList());
-            BigDecimal stockQuantityTotal = modelIds.stream()
-                    .map(stockUtils::getStockQuantity)
-                    .map(map -> map.get("stockQuantity"))
-                    .filter(Objects::nonNull)
-                    .reduce(BigDecimal.ZERO, BigDecimal::add);
-            homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
-        }
+        BigDecimal stockQuantityTotal = stockInventoryMapper.selectTotal();
+        homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString());
+
 
         // 鑾峰彇褰撳ぉ鍏ュ簱鏁伴噺
-        LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        procurementRecordStorageLambdaQueryWrapper.ge(ProcurementRecordStorage::getCreateTime, now)  // 澶т簬绛変簬褰撳ぉ
-                .lt(ProcurementRecordStorage::getCreateTime, now.plusDays(1)); // 灏忎簬鏄庡ぉ
-        List<ProcurementRecordStorage> procurementRecordStorages1 = procurementRecordStorageMapper.selectList(procurementRecordStorageLambdaQueryWrapper);
-        BigDecimal stockAmount1 = procurementRecordStorages1.stream()
-                .map(ProcurementRecordStorage::getInboundNum)
-                .filter(Objects::nonNull)
-                .reduce(BigDecimal.ZERO, BigDecimal::add);
-//        homeBusinessDto.setInventoryNum(stock.setScale(2, RoundingMode.HALF_UP).toString());
-        homeBusinessDto.setTodayInventoryNum(stockAmount1.setScale(2, RoundingMode.HALF_UP).toString());
+        BigDecimal bigDecimal = stockInventoryMapper.selectTotalByDate(LocalDate.now());
+        homeBusinessDto.setTodayInventoryNum(bigDecimal.setScale(2, RoundingMode.HALF_UP).toString());
         return homeBusinessDto;
     }
 
@@ -254,9 +227,9 @@
         BigDecimal subtract = weekContractAmount.subtract(lastYearWeekContractAmount);
         String weekYny = "";
         // 鍛ㄥ悓姣�
-        if(subtract.compareTo(BigDecimal.ZERO) == 0 || lastYearWeekContractAmount.compareTo(BigDecimal.ZERO) == 0){
+        if (subtract.compareTo(BigDecimal.ZERO) == 0 || lastYearWeekContractAmount.compareTo(BigDecimal.ZERO) == 0) {
             weekYny = "0.00";
-        }else{
+        } else {
             weekYny = String.format("%.2f", subtract.divide(lastYearWeekContractAmount, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")));
 
         }
@@ -279,9 +252,9 @@
         BigDecimal subtract1 = todayContractAmount.subtract(lastYearYesterdayContractAmount); // 淇敼锛氫娇鐢� todayContractAmount 鑰屼笉鏄� yesterdayContractAmount
         // 鏃ョ幆姣�
         String chain = "";
-        if(subtract1.compareTo(BigDecimal.ZERO) == 0 || lastYearYesterdayContractAmount.compareTo(BigDecimal.ZERO) == 0){
+        if (subtract1.compareTo(BigDecimal.ZERO) == 0 || lastYearYesterdayContractAmount.compareTo(BigDecimal.ZERO) == 0) {
             chain = "0.00";
-        }else{
+        } else {
             chain = String.format("%.2f", subtract1.divide(lastYearYesterdayContractAmount, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100")));
         }
 
@@ -295,14 +268,14 @@
         Map<String, BigDecimal> collect = salesLedgers.stream().collect(Collectors.groupingBy(SalesLedger::getCustomerName, Collectors.reducing(BigDecimal.ZERO,
                 SalesLedger::getContractAmount, BigDecimal::add)));
         List<MapDto> mapDtos = new ArrayList<>();
-        collect.forEach((k,v)->{
+        collect.forEach((k, v) -> {
             MapDto mapDto = new MapDto();
             mapDto.setName(k);
             // 淇敼锛氬皢閲戦鍊间繚鐣欎袱浣嶅皬鏁�
             mapDto.setValue(v.setScale(2, RoundingMode.HALF_UP).toString());
-            if(contractAmount.compareTo(new BigDecimal(0)) == 0){
+            if (contractAmount.compareTo(new BigDecimal(0)) == 0) {
                 mapDto.setRate("0");
-            }else{
+            } else {
                 mapDto.setRate(String.format("%.2f", v.divide(contractAmount, 2, RoundingMode.HALF_UP).multiply(new BigDecimal("100"))));
             }
             mapDtos.add(mapDto);
@@ -348,7 +321,7 @@
                     .filter(inspect -> inspect.getInspectType().equals(1))
                     .map(QualityInspect::getQuantity)
                     .reduce(BigDecimal.ZERO, BigDecimal::add);
-            processNum= processNum.add(reduce1);
+            processNum = processNum.add(reduce1);
             BigDecimal reduce2 = monthInspects.stream()
                     .filter(inspect -> inspect.getInspectType().equals(2))
                     .map(QualityInspect::getQuantity)
@@ -435,7 +408,6 @@
     }
 
     /**
-     *
      * @param type 1-鍛� 2-鏈� 3-瀛e害
      * @return
      */
@@ -444,7 +416,7 @@
         LocalDate today = LocalDate.now();
         LocalDate startDate = null;
         LocalDate endDate = null;
-        switch (type){
+        switch (type) {
             case 1:
                 // 鑾峰彇鏈懆鍛ㄤ竴
                 startDate = today.with(DayOfWeek.MONDAY);
@@ -502,6 +474,7 @@
 
         return statisticsReceivablePayableDto;
     }
+
     public static <T> BigDecimal sumAmount(List<T> list, java.util.function.Function<T, BigDecimal> amountExtractor) {
         return list.stream()
                 // 鎻愬彇閲戦鏃讹紝灏唍ull鏇挎崲涓築igDecimal.ZERO
@@ -509,6 +482,7 @@
                 // 绱姞锛屽垵濮嬪�间负0锛岄伩鍏嶇┖娴侀棶棰�
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
     }
+
     @Autowired
     private DeviceRepairMapper deviceRepairMapper;
 
@@ -551,9 +525,10 @@
         productionProgressDto.setTotalOrderCount(totalCount);
         productionProgressDto.setCompletedOrderCount(count);
         productionProgressDto.setUncompletedOrderCount(count2);
-        productionProgressDto.setPartialCompletedOrderCount(totalCount-count-count2);
+        productionProgressDto.setPartialCompletedOrderCount(totalCount - count - count2);
         return productionProgressDto;
     }
+
     @Override
     public ProductionTurnoverDto workInProcessTurnover() {
         ProductionTurnoverDto productionTurnoverDto = new ProductionTurnoverDto();
@@ -566,15 +541,15 @@
                 .map(ProductWorkOrder::getPlanQuantity)
                 .mapToLong(BigDecimal::longValue)
                 .sum();
-        if (sum == 0)return null;
+        if (sum == 0) return null;
         productionTurnoverDto.setTotalOrderCount(sum);//鎬诲湪鍒跺搧鏁伴噺
-        productionTurnoverDto.setAverageTurnoverDays(BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(ChronoUnit.DAYS.between(LocalDateTime.now().minusMonths(1), LocalDateTime.now())),2,RoundingMode.HALF_UP));
+        productionTurnoverDto.setAverageTurnoverDays(BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(ChronoUnit.DAYS.between(LocalDateTime.now().minusMonths(1), LocalDateTime.now())), 2, RoundingMode.HALF_UP));
         long completeQuantity = productWorkOrders.stream()
                 .filter(productWorkOrder -> productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) >= 0)
                 .map(ProductWorkOrder::getCompleteQuantity)
                 .mapToLong(BigDecimal::longValue)
                 .sum();
-        productionTurnoverDto.setTurnoverEfficiency(BigDecimal.valueOf(completeQuantity).divide(BigDecimal.valueOf(sum),2,RoundingMode.HALF_UP));
+        productionTurnoverDto.setTurnoverEfficiency(BigDecimal.valueOf(completeQuantity).divide(BigDecimal.valueOf(sum), 2, RoundingMode.HALF_UP));
         Map<String, List<ProductWorkOrderDto>> map = productWorkOrders.stream()
                 .filter(productWorkOrder -> productWorkOrder.getPlanQuantity().compareTo(productWorkOrder.getCompleteQuantity()) > 0)
                 .collect(Collectors.groupingBy(ProductWorkOrderDto::getProcessName));
@@ -928,4 +903,199 @@
         }
         return result;
     }
+
+    @Override
+    public List<MapDto> productSalesAnalysis() {
+        // 鑾峰彇鎵�鏈変骇鍝佸ぇ绫荤殑閿�鍞
+        List<Map<String, Object>> analysisResults = salesLedgerProductMapper.selectProductSalesAnalysis();
+        if (CollectionUtils.isEmpty(analysisResults)) {
+            return new ArrayList<>();
+        }
+
+        // 璁$畻鎬婚攢鍞
+        BigDecimal totalSalesAmount = analysisResults.stream()
+                .map(r -> (BigDecimal) r.get("value"))
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        return analysisResults.stream()
+                .map(result -> {
+                    MapDto mapDto = new MapDto();
+                    String name = (String) result.get("name");
+                    BigDecimal value = (BigDecimal) result.get("value");
+
+                    mapDto.setName(name);
+                    mapDto.setValue(value != null ? value.setScale(2, RoundingMode.HALF_UP).toString() : "0.00");
+
+                    if (totalSalesAmount.compareTo(BigDecimal.ZERO) == 0 || value == null) {
+                        mapDto.setRate("0.00");
+                    } else {
+                        String rate = value.divide(totalSalesAmount, 4, RoundingMode.HALF_UP)
+                                .multiply(new BigDecimal("100"))
+                                .setScale(2, RoundingMode.HALF_UP)
+                                .toString();
+                        mapDto.setRate(rate);
+                    }
+                    return mapDto;
+                })
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<MapDto> rawMaterialPurchaseAmountRatio() {
+        // 鑾峰彇鎵�鏈夊師鏉愭枡鐨勯噰璐
+        List<Map<String, Object>> analysisResults = salesLedgerProductMapper.selectRawMaterialPurchaseAnalysis();
+        if (CollectionUtils.isEmpty(analysisResults)) {
+            return new ArrayList<>();
+        }
+
+        // 璁$畻鎬婚噰璐
+        BigDecimal totalPurchaseAmount = analysisResults.stream()
+                .map(r -> (BigDecimal) r.get("value"))
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        return analysisResults.stream()
+                .map(result -> {
+                    MapDto mapDto = new MapDto();
+                    String name = (String) result.get("name");
+                    BigDecimal value = (BigDecimal) result.get("value");
+
+                    mapDto.setName(name);
+                    mapDto.setValue(value != null ? value.setScale(2, RoundingMode.HALF_UP).toString() : "0.00");
+
+                    if (totalPurchaseAmount.compareTo(BigDecimal.ZERO) == 0 || value == null) {
+                        mapDto.setRate("0.00");
+                    } else {
+                        String rate = value.divide(totalPurchaseAmount, 4, RoundingMode.HALF_UP)
+                                .multiply(new BigDecimal("100"))
+                                .setScale(2, RoundingMode.HALF_UP)
+                                .toString();
+                        mapDto.setRate(rate);
+                    }
+                    return mapDto;
+                })
+                .collect(Collectors.toList());
+    }
+
+    @Override
+    public List<MapDto> salesPurchaseStorageProductCount() {
+        LocalDate now = LocalDate.now();
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+
+        String currentMonthStart = now.with(TemporalAdjusters.firstDayOfMonth()).format(dtf);
+        String currentMonthNow = now.format(dtf);
+
+        LocalDate lastMonth = now.minusMonths(1);
+        String lastMonthStart = lastMonth.with(TemporalAdjusters.firstDayOfMonth()).format(dtf);
+        String lastMonthEnd = lastMonth.with(TemporalAdjusters.lastDayOfMonth()).format(dtf);
+
+        // 閿�鍞�
+        int currentSales = salesLedgerProductMapper.selectProductCountByTypeAndDate(1, currentMonthStart, currentMonthNow);
+        int lastSales = salesLedgerProductMapper.selectProductCountByTypeAndDate(1, lastMonthStart, lastMonthEnd);
+
+        // 閲囪喘
+        int currentPurchase = salesLedgerProductMapper.selectProductCountByTypeAndDate(2, currentMonthStart, currentMonthNow);
+        int lastPurchase = salesLedgerProductMapper.selectProductCountByTypeAndDate(2, lastMonthStart, lastMonthEnd);
+
+        // 鍌ㄥ瓨
+        int currentStorage = stockInventoryMapper.selectStorageProductCountByDate(currentMonthStart, currentMonthNow);
+        int lastStorage = stockInventoryMapper.selectStorageProductCountByDate(lastMonthStart, lastMonthEnd);
+
+        List<MapDto> list = new ArrayList<>();
+        list.add(createMapDto("閿�鍞骇鍝佹暟", currentSales, lastSales));
+        list.add(createMapDto("閲囪喘浜у搧鏁�", currentPurchase, lastPurchase));
+        list.add(createMapDto("鍌ㄥ瓨浜у搧鏁�", currentStorage, lastStorage));
+
+        return list;
+    }
+
+    private MapDto createMapDto(String name, int current, int last) {
+        MapDto dto = new MapDto();
+        dto.setName(name);
+        dto.setValue(String.valueOf(current));
+
+        if (last == 0) {
+            dto.setRate(current > 0 ? "100.00" : "0.00");
+        } else {
+            BigDecimal curDec = new BigDecimal(current);
+            BigDecimal lastDec = new BigDecimal(last);
+            // 澧為暱鐜�
+            String rate = curDec.subtract(lastDec)
+                    .divide(lastDec, 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal("100"))
+                    .setScale(2, RoundingMode.HALF_UP)
+                    .toString();
+            dto.setRate(rate);
+        }
+        return dto;
+    }
+
+    @Override
+    public List<Map<String, Object>> productInOutAnalysis(Integer type) {
+        String targetName;
+        if (type == 1) {
+            targetName = "鍘熸潗鏂�";
+        } else if (type == 2) {
+            targetName = "鎴愬搧";
+        } else if (type == 3) {
+            targetName = "鍗婃垚鍝�";
+        } else {
+            return new ArrayList<>();
+        }
+
+        LambdaQueryWrapper<Product> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Product::getProductName, targetName).isNull(Product::getParentId);
+        Product rootCategory = productMapper.selectOne(queryWrapper);
+
+        if (rootCategory == null) {
+            log.warn("鏈壘鍒板悕绉颁负 {} 鐨勯《绾т骇鍝佸垎绫�", targetName);
+            return new ArrayList<>();
+        }
+        Long rootCategoryId = rootCategory.getId();
+
+        LocalDate now = LocalDate.now();
+        DateTimeFormatter displayDtf = DateTimeFormatter.ofPattern("M/d");
+
+        String startDate = now.minusDays(6).toString();
+        String endDate = now.toString();
+
+        List<Map<String, Object>> inCounts = stockInventoryMapper.selectDailyStockInCounts(rootCategoryId, startDate, endDate + " 23:59:59");
+
+        List<Map<String, Object>> outCounts = stockInventoryMapper.selectDailyStockOutCounts(rootCategoryId, startDate, endDate + " 23:59:59");
+
+        Map<LocalDate, BigDecimal> inMap = inCounts.stream()
+                .collect(Collectors.toMap(
+                        m -> ((java.sql.Date) m.get("date")).toLocalDate(),
+                        m -> (BigDecimal) m.get("count"),
+                        BigDecimal::add
+                ));
+
+        Map<LocalDate, BigDecimal> outMap = outCounts.stream()
+                .collect(Collectors.toMap(
+                        m -> ((java.sql.Date) m.get("date")).toLocalDate(),
+                        m -> (BigDecimal) m.get("count"),
+                        BigDecimal::add
+                ));
+
+        List<Map<String, Object>> result = new ArrayList<>();
+
+        for (int i = 6; i >= 0; i--) {
+            LocalDate date = now.minusDays(i);
+
+            Map<String, Object> dataPoint = new LinkedHashMap<>();
+            dataPoint.put("date", date.format(displayDtf)); // 1/23
+            dataPoint.put("inCount", inMap.getOrDefault(date, BigDecimal.ZERO));
+            dataPoint.put("outCount", outMap.getOrDefault(date, BigDecimal.ZERO));
+
+            result.add(dataPoint);
+        }
+
+        return result;
+    }
+
+    @Override
+    public List<MapDto> productTurnoverDays() {
+        return homeMapper.productTurnoverDays();
+    }
 }

--
Gitblit v1.9.3