From 98ed3d5f0866c50653bd46ee1daf840d408224ae Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期二, 27 一月 2026 17:36:39 +0800
Subject: [PATCH] fix: 审批类型、产品大类分布修改

---
 src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java       |    3 
 src/main/java/com/ruoyi/home/controller/HomeController.java    |    4 
 src/main/java/com/ruoyi/common/enums/ApproveTypeEnum.java      |   42 ++++++++++
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java |  154 +++++++++++++-------------------------
 4 files changed, 101 insertions(+), 102 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
index 42ca0ba..52f500e 100644
--- a/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
+++ b/src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -131,6 +131,9 @@
      */
     private Integer approveType;
 
+    @TableField(exist = false)
+    private String approveTypeName;
+
     /**
      * 瀹℃壒澶囨敞
      */
diff --git a/src/main/java/com/ruoyi/common/enums/ApproveTypeEnum.java b/src/main/java/com/ruoyi/common/enums/ApproveTypeEnum.java
new file mode 100644
index 0000000..e79119d
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/enums/ApproveTypeEnum.java
@@ -0,0 +1,42 @@
+package com.ruoyi.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * <br>
+ * 瀹℃壒绫诲瀷鏋氫妇
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/1/27 17:10
+ */
+@Getter
+@AllArgsConstructor
+public enum ApproveTypeEnum {
+
+    PUBLIC_AFFAIRS(1, "鍏嚭绠$悊"),
+    LEAVE(2, "璇峰亣绠$悊"),
+    BUSINESS_TRIP(3, "鍑哄樊绠$悊"),
+    REIMBURSEMENT(4, "鎶ラ攢绠$悊"),
+    PURCHASE(5, "閲囪喘瀹℃壒"),
+    QUOTATION(6, "鎶ヤ环瀹℃壒"),
+    DELIVERY(7, "鍙戣揣瀹℃壒");
+
+    private final Integer code;
+    private final String name;
+
+    /**
+     * 鏍规嵁 code 鑾峰彇瀵瑰簲鐨勫悕绉�
+     */
+    public static String getNameByCode(Integer code) {
+        if (code == null) return null;
+        for (ApproveTypeEnum type : ApproveTypeEnum.values()) {
+            if (type.getCode().equals(code)) {
+                return type.getName();
+            }
+        }
+        return "";
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/home/controller/HomeController.java b/src/main/java/com/ruoyi/home/controller/HomeController.java
index d6fe834..9cbb122 100644
--- a/src/main/java/com/ruoyi/home/controller/HomeController.java
+++ b/src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -70,14 +70,14 @@
 
     @GetMapping("/supplierPurchaseRanking")
     @ApiOperation("渚涘簲鍟嗛噰璐帓鍚�")
-    public AjaxResult supplierPurchaseRanking(@RequestParam(value = "type", defaultValue = "0") Integer type) {
+    public AjaxResult supplierPurchaseRanking(@RequestParam(value = "type", defaultValue = "1") Integer type) {
         List<SupplierPurchaseRankingDto> list = homeService.supplierPurchaseRanking(type);
         return AjaxResult.success(list);
     }
 
     @GetMapping("/customerRevenueAnalysis")
     @ApiOperation("瀹㈡埛钀ユ敹璐$尞鏁板�煎垎鏋�")
-    public AjaxResult customerRevenueAnalysis(@RequestParam("customerId") Long customerId, @RequestParam(value = "type", defaultValue = "0") Integer type) {
+    public AjaxResult customerRevenueAnalysis(@RequestParam("customerId") Long customerId, @RequestParam(value = "type", defaultValue = "1") Integer type) {
         CustomerRevenueAnalysisDto dto = homeService.customerRevenueAnalysis(customerId, type);
         return AjaxResult.success(dto);
     }
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 3b48ec4..6085d2d 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -16,6 +16,7 @@
 import com.ruoyi.basic.pojo.SupplierManage;
 import com.ruoyi.collaborativeApproval.mapper.NoticeMapper;
 import com.ruoyi.collaborativeApproval.pojo.Notice;
+import com.ruoyi.common.enums.ApproveTypeEnum;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.device.mapper.DeviceRepairMapper;
 import com.ruoyi.device.pojo.DeviceRepair;
@@ -32,9 +33,11 @@
 import com.ruoyi.production.mapper.ProductWorkOrderMapper;
 import com.ruoyi.production.pojo.ProductWorkOrder;
 import com.ruoyi.project.system.domain.SysDept;
+import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.domain.SysUserDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.project.system.mapper.SysUserDeptMapper;
+import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PaymentRegistration;
@@ -44,8 +47,6 @@
 import com.ruoyi.sales.mapper.ReceiptPaymentMapper;
 import com.ruoyi.sales.mapper.SalesLedgerMapper;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.project.system.domain.SysUser;
-import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.sales.pojo.ReceiptPayment;
 import com.ruoyi.sales.pojo.SalesLedger;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -402,9 +403,15 @@
                 .ne(ApproveProcess::getApproveStatus, 2);
 //                .eq(ApproveProcess::getTenantId, loginUser.getTenantId());
         List<ApproveProcess> approveProcesses = approveProcessMapper.selectList(approveProcessLambdaQueryWrapper);
-        if(CollectionUtils.isEmpty(approveProcesses)){
+        if (CollectionUtils.isEmpty(approveProcesses)) {
             approveProcesses = new ArrayList<>();
         }
+
+        approveProcesses.forEach(a -> {
+            if (a.getApproveType() != null) {
+                a.setApproveTypeName(ApproveTypeEnum.getNameByCode(a.getApproveType()));
+            }
+        });
 //        // 鏌ヨ鏈鐢ㄥ姵淇濊褰�
 //        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 //
@@ -422,6 +429,8 @@
 //                approveProcesses.add(approveProcess);
 //            }
 //        }
+
+
         return approveProcesses;
     }
 
@@ -699,15 +708,15 @@
         LocalDate startDate;
         LocalDate endDate;
         switch (type) {
-            case 0: // 鍛�
+            case 1: // 鍛�
                 startDate = today.with(DayOfWeek.MONDAY);
                 endDate = today.with(DayOfWeek.SUNDAY);
                 break;
-            case 1: // 鏈�
+            case 2: // 鏈�
                 startDate = today.with(TemporalAdjusters.firstDayOfMonth());
                 endDate = today.with(TemporalAdjusters.lastDayOfMonth());
                 break;
-            case 2: // 瀛e害
+            case 3: // 瀛e害
                 Month currentMonth = today.getMonth();
                 Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter();
                 Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2);
@@ -749,15 +758,15 @@
         boolean groupByMonth = false;
 
         switch (type) {
-            case 0: // 鍛�
+            case 1: // 鍛�
                 start = today.with(DayOfWeek.MONDAY);
                 end = today.with(DayOfWeek.SUNDAY);
                 break;
-            case 1: // 鏈�
+            case 2: // 鏈�
                 start = today.with(TemporalAdjusters.firstDayOfMonth());
                 end = today.with(TemporalAdjusters.lastDayOfMonth());
                 break;
-            case 2: // 瀛e害
+            case 3: // 瀛e害
                 Month firstMonthOfQuarter = today.getMonth().firstMonthOfQuarter();
                 start = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth());
                 end = today.withMonth(firstMonthOfQuarter.plus(2).getValue()).with(TemporalAdjusters.lastDayOfMonth());
@@ -818,109 +827,54 @@
         ProductCategoryDistributionDto dto = new ProductCategoryDistributionDto();
         List<ProductCategoryDistributionDto.MajorCategoryDto> majorItems = new ArrayList<>();
 
-        //  鎵�鏈夌殑浜у搧澶х被鍜屽皬绫�
-        List<Product> allProducts = productMapper.selectList(new LambdaQueryWrapper<Product>());
+        // 鏌ヨ鎵�鏈夌殑浜у搧绫诲埆
+        List<Product> allProducts = productMapper.selectList(new LambdaQueryWrapper<>());
         if (CollectionUtils.isEmpty(allProducts)) {
             dto.setItems(majorItems);
             return dto;
         }
 
-        List<Product> majorCategories = allProducts.stream().filter(p -> p.getParentId() == null).collect(Collectors.toList());
-        List<Product> minorCategories = allProducts.stream().filter(p -> p.getParentId() != null).collect(Collectors.toList());
+        // 鍒嗙澶х被鍜屽皬绫�
+        List<Product> majorCategories = allProducts.stream()
+                .filter(p -> p.getParentId() == null)
+                .collect(Collectors.toList());
+        List<Product> minorCategories = allProducts.stream()
+                .filter(p -> p.getParentId() != null)
+                .collect(Collectors.toList());
 
-        //  浠� sales_ledger_product 鎷垮埌姣忎釜浜у搧鐨勫瀷鍙峰簱瀛�
-        // 闇�鍖呭惈瑙勬牸鍨嬪彿浠ユ敮鎸佷笁绾у垎甯�
-        List<Map<String, Object>> quantityMaps = salesLedgerProductMapper.selectMaps(new QueryWrapper<SalesLedgerProduct>()
-                .select("product_id", "specification_model", "type", "SUM(quantity) as sum_qty")
-                .isNotNull("product_id")
-                .groupBy("product_id", "specification_model", "type"));
+        // 鎸夌埗绫籌D瀵瑰皬绫昏繘琛屽垎缁�
+        Map<Long, List<Product>> minorGroupMap = minorCategories.stream()
+                .collect(Collectors.groupingBy(Product::getParentId));
 
-        Map<Long, Map<String, Map<Integer, BigDecimal>>> modelStockGroups = new HashMap<>();
-        for (Map<String, Object> map : quantityMaps) {
-            Long productId = Long.parseLong(map.get("product_id").toString());
-            String model = map.get("specification_model") != null ? map.get("specification_model").toString() : "鏈煡鍨嬪彿";
-            Integer type = Integer.parseInt(map.get("type").toString());
-            BigDecimal sum = map.get("sum_qty") != null ? new BigDecimal(map.get("sum_qty").toString()) : BigDecimal.ZERO;
+        int totalMinorCount = minorCategories.size();
 
-            modelStockGroups.computeIfAbsent(productId, k -> new HashMap<>())
-                    .computeIfAbsent(model, k -> new HashMap<>())
-                    .put(type, sum);
-        }
-
-        //  搴撳瓨骞舵眹鎬�
-        Map<Long, List<MapDto>> productModelsMap = new HashMap<>();
-        Map<Long, BigDecimal> productTotalStockMap = new HashMap<>();
-
-        for (Long pid : modelStockGroups.keySet()) {
-            Map<String, Map<Integer, BigDecimal>> models = modelStockGroups.get(pid);
-            BigDecimal productStock = BigDecimal.ZERO;
-            List<MapDto> modelDtos = new ArrayList<>();
-
-            for (String modelName : models.keySet()) {
-                Map<Integer, BigDecimal> types = models.get(modelName);
-                BigDecimal procurement = types.getOrDefault(2, BigDecimal.ZERO);
-                BigDecimal sales = types.getOrDefault(1, BigDecimal.ZERO);
-                BigDecimal stock = procurement.subtract(sales);
-                if (stock.compareTo(BigDecimal.ZERO) < 0) stock = BigDecimal.ZERO;
-
-                MapDto modelDto = new MapDto();
-                modelDto.setName(modelName);
-                modelDto.setValue(stock.stripTrailingZeros().toPlainString());
-                modelDtos.add(modelDto);
-                productStock = productStock.add(stock);
-            }
-            productModelsMap.put(pid, modelDtos);
-            productTotalStockMap.put(pid, productStock);
-        }
-
-        BigDecimal totalInventory = productTotalStockMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add);
-
-        //  鍨嬪彿鍗犳瘮
-        if (totalInventory.compareTo(BigDecimal.ZERO) > 0) {
-            for (List<MapDto> dtos : productModelsMap.values()) {
-                for (MapDto m : dtos) {
-                    BigDecimal val = new BigDecimal(m.getValue());
-                    m.setRate(val.multiply(new BigDecimal("100"))
-                            .divide(totalInventory, 2, RoundingMode.HALF_UP).toString());
-                }
-            }
-        }
-
-        //  鍒嗗眰鏁版嵁
         for (Product major : majorCategories) {
             ProductCategoryDistributionDto.MajorCategoryDto majorDto = new ProductCategoryDistributionDto.MajorCategoryDto();
             majorDto.setName(major.getProductName());
 
-            List<ProductCategoryDistributionDto.MinorCategoryDto> minorDtos = new ArrayList<>();
-            BigDecimal majorStock = BigDecimal.ZERO;
+            List<Product> children = minorGroupMap.getOrDefault(major.getId(), new ArrayList<>());
+            int childrenSize = children.size();
+            // 璁剧疆灏忕被鐨勬�绘暟
+            majorDto.setValue(String.valueOf(childrenSize));
 
-            for (Product minor : minorCategories) {
-                if (major.getId().equals(minor.getParentId())) {
-                    BigDecimal stock = productTotalStockMap.getOrDefault(minor.getId(), BigDecimal.ZERO);
-                    ProductCategoryDistributionDto.MinorCategoryDto minorDto = new ProductCategoryDistributionDto.MinorCategoryDto();
-                    minorDto.setName(minor.getProductName());
-                    minorDto.setValue(stock.stripTrailingZeros().toPlainString());
-
-                    if (totalInventory.compareTo(BigDecimal.ZERO) > 0) {
-                        minorDto.setRate(stock.multiply(new BigDecimal("100"))
-                                .divide(totalInventory, 2, RoundingMode.HALF_UP).toString());
-                    } else {
-                        minorDto.setRate("0.00");
-                    }
-
-                    minorDto.setChildren(productModelsMap.getOrDefault(minor.getId(), new ArrayList<>()));
-                    minorDtos.add(minorDto);
-                    majorStock = majorStock.add(stock);
-                }
-            }
-
-            majorDto.setValue(majorStock.stripTrailingZeros().toPlainString());
-
-            if (totalInventory.compareTo(BigDecimal.ZERO) > 0) {
-                majorDto.setRate(majorStock.multiply(new BigDecimal("100"))
-                        .divide(totalInventory, 2, RoundingMode.HALF_UP).toString());
+            // 璁$畻鍗犳瘮
+            if (totalMinorCount > 0) {
+                BigDecimal rate = BigDecimal.valueOf(childrenSize)
+                        .multiply(new BigDecimal("100"))
+                        .divide(BigDecimal.valueOf(totalMinorCount), 2, RoundingMode.HALF_UP);
+                majorDto.setRate(rate.toString());
             } else {
                 majorDto.setRate("0.00");
+            }
+
+            List<ProductCategoryDistributionDto.MinorCategoryDto> minorDtos = new ArrayList<>();
+            for (Product minor : children) {
+                ProductCategoryDistributionDto.MinorCategoryDto minorDto = new ProductCategoryDistributionDto.MinorCategoryDto();
+                minorDto.setName(minor.getProductName());
+                minorDto.setValue("0");
+                minorDto.setRate("0.00");
+                minorDto.setChildren(new ArrayList<>());
+                minorDtos.add(minorDto);
             }
             majorDto.setChildren(minorDtos);
             majorItems.add(majorDto);
@@ -936,15 +890,15 @@
         LocalDate startDate = null;
         LocalDate endDate = null;
         switch (type) {
-            case 0:
+            case 1:
                 startDate = today.with(DayOfWeek.MONDAY);
                 endDate = today.with(DayOfWeek.SUNDAY);
                 break;
-            case 1:
+            case 2:
                 startDate = today.with(TemporalAdjusters.firstDayOfMonth());
                 endDate = today.with(TemporalAdjusters.lastDayOfMonth());
                 break;
-            case 2:
+            case 3:
                 Month currentMonth = today.getMonth();
                 Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter();
                 Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2);

--
Gitblit v1.9.3