From 3e144b2eb8fc9447d2d092edb71db533d12abc52 Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期四, 24 九月 2026 19:06:39 +0800
Subject: [PATCH] feat(生产核算): 新增大类「中提琴」并打通工资/核算折算

---
 src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java |  145 +++++++++++++++++++++++++++++++-----------------
 1 files changed, 94 insertions(+), 51 deletions(-)

diff --git a/src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java b/src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java
index 23b059e..367913c 100644
--- a/src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java
@@ -15,6 +15,7 @@
 import com.ruoyi.production.mapper.ProductionProductMainMapper;
 import com.ruoyi.production.bean.dto.ProductionAccountDto;
 import com.ruoyi.production.bean.dto.ProductionProductMainDto;
+import com.ruoyi.production.enums.MajorCategoryEnum;
 import com.ruoyi.production.pojo.ProductionAccount;
 import com.ruoyi.technology.mapper.TechnologyOperationMapper;
 import com.ruoyi.technology.pojo.TechnologyOperation;
@@ -361,7 +362,7 @@
     /**
      * 姹囨�诲憳宸ュ綋鏈堟湀鏃堕棿鍚堣銆�
      * 瑙勫垯锛�
-     * 1. 灏忔彁鐞� / 澶ф彁鐞� / 璐濇柉锛氭湀浜ф姌鍚堝皬鎻愮惔鏁伴噺 / 宸ュ簭鏍囧噯鏁伴噺 脳 8 + 淇ˉ鐞嗗伐鏃�
+     * 1. 灏忔彁鐞� / 涓彁鐞� / 澶ф彁鐞� / 璐濇柉锛氭湀浜ф姌鍚堝皬鎻愮惔鏁伴噺 / 宸ュ簭鏍囧噯鏁伴噺 脳 8 + 淇ˉ鐞嗗伐鏃�
      * 2. 鍏朵粬浜у搧锛氬綋鏈堝疄闄呬骇閲� / 瀵瑰簲浜у搧鏍囧噯鏁伴噺 脳 8 + 淇ˉ鐞嗗伐鏃�
      * 鏈�缁堢粨鏋滃氨鏄伐璧勮〃閲岀殑鏈堟椂闂村悎璁°��
      */
@@ -380,11 +381,13 @@
             java.math.BigDecimal productStandardQuantity = toDecimal(item.get("productStandardQuantity"));
             java.math.BigDecimal violinFactor = toDecimal(item.get("violinFactor"));
             java.math.BigDecimal violaFactor = toDecimal(item.get("violaFactor"));
+            java.math.BigDecimal midViolinFactor = toDecimal(item.get("midViolinFactor"));
             java.math.BigDecimal bassFactor = toDecimal(item.get("bassFactor"));
-            String productName = item.get("productName") == null ? null : String.valueOf(item.get("productName"));
+            // 褰掔被渚濇嵁鐢ㄦ姤宸ユ椂宸插綊闆嗗ソ鐨勫ぇ绫伙紝涓嶅啀鎷夸骇鍝佸悕绉板仛瀛楃涓叉瘮杈�
+            String majorCategory = item.get("majorCategory") == null ? null : String.valueOf(item.get("majorCategory"));
             java.math.BigDecimal rowTotal = calculateOperationTime(
                     operationType,
-                    productName,
+                    majorCategory,
                     finishedNum,
                     workHour,
                     repairWorkHour,
@@ -392,6 +395,7 @@
                     productStandardQuantity,
                     violinFactor,
                     violaFactor,
+                    midViolinFactor,
                     bassFactor
             );
             total = total.add(rowTotal).setScale(2, java.math.RoundingMode.HALF_UP);
@@ -402,11 +406,11 @@
     /**
      * 璁$畻鍗曟潯宸ュ簭鐨勬姌绠楀伐鏃躲��
      * 杩欓噷鏄湀鏃堕棿鍚堣鐨勬牳蹇冨垎鏀細
-     * - 灏忔彁鐞� / 澶ф彁鐞� / 璐濇柉锛氭湀浜ф姌鍚堝皬鎻愮惔鏁伴噺 / 宸ュ簭鏍囧噯鏁伴噺 脳 8 + 淇ˉ鐞嗗伐鏃讹紱
-     * - 鍏朵粬浜у搧锛氬綋鏈堝疄闄呬骇閲� / 瀵瑰簲浜у搧鏍囧噯鏁伴噺 脳 8 + 淇ˉ鐞嗗伐鏃躲��
+     * - 灏忔彁鐞� / 涓彁鐞� / 澶ф彁鐞� / 璐濇柉锛氭湀浜ф姌鍚堝皬鎻愮惔鏁伴噺 / 宸ュ簭鏍囧噯鏁伴噺 脳 8 + 淇ˉ鐞嗗伐鏃讹紱
+     * - 鍏朵粬浜у搧锛堝惈鏈綊绫绘姤宸ワ級锛氬綋鏈堝疄闄呬骇閲� / 瀵瑰簲浜у搧鏍囧噯鏁伴噺 脳 8 + 淇ˉ鐞嗗伐鏃躲��
      */
     private java.math.BigDecimal calculateOperationTime(Integer operationType,
-                                                        String productName,
+                                                        String majorCategory,
                                                         java.math.BigDecimal finishedNum,
                                                         java.math.BigDecimal workHour,
                                                         java.math.BigDecimal repairWorkHour,
@@ -414,12 +418,12 @@
                                                         java.math.BigDecimal productStandardQuantity,
                                                         java.math.BigDecimal violinFactor,
                                                         java.math.BigDecimal violaFactor,
+                                                        java.math.BigDecimal midViolinFactor,
                                                         java.math.BigDecimal bassFactor) {
-        if (isInstrumentProduct(productName)) {
-            java.math.BigDecimal foldedQuantity = calculateFoldedQuantity(
-                    finishedNum,
-                    resolveInstrumentFactor(productName, violinFactor, violaFactor, bassFactor)
-            );
+        java.math.BigDecimal instrumentFactor = resolveInstrumentFactor(
+                majorCategory, violinFactor, violaFactor, midViolinFactor, bassFactor);
+        if (instrumentFactor != null) {
+            java.math.BigDecimal foldedQuantity = calculateFoldedQuantity(finishedNum, instrumentFactor);
             if (standardQuantity.compareTo(java.math.BigDecimal.ZERO) <= 0) {
                 return java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP);
             }
@@ -440,9 +444,8 @@
     }
 
     /**
-     * 鎸変骇鍝佸悕绉板拰閰嶇疆绯绘暟鎶樼畻浜ч噺銆�
-     * 鍙灏忔彁鐞淬�佸ぇ鎻愮惔銆佽礉鏂笁绫讳骇鍝佺敓鏁堬紝
-     * 杩斿洖鐨勬槸鍙敤浜庡悗缁伐搴忔爣鍑嗘暟閲忔崲绠楃殑缁熶竴鎶樺悎浜ч噺銆�
+     * 鎸変骇閲忎笌鎶樼畻鐜囨姌绠椼�傛槸鍚﹀睘浜庝箰鍣ㄧ敱璋冪敤鏂圭敤 {@link MajorCategoryEnum} 鍒ゅ畾锛�
+     * 杩欓噷鍙仛涔樻硶锛岃繑鍥炵殑鏄彲鐢ㄤ簬鍚庣画宸ュ簭鏍囧噯鏁伴噺鎹㈢畻鐨勭粺涓�鎶樺悎浜ч噺銆�
      */
     private java.math.BigDecimal calculateFoldedQuantity(java.math.BigDecimal quantity,
                                                          java.math.BigDecimal factor) {
@@ -452,26 +455,41 @@
         return quantity.multiply(factor).setScale(2, java.math.RoundingMode.HALF_UP);
     }
 
-    private boolean isInstrumentProduct(String productName) {
-        return "灏忔彁鐞�".equals(productName)
-                || "澶ф彁鐞�".equals(productName)
-                || "璐濇柉".equals(productName);
+    /**
+     * 鍒ゆ柇鎶ュ伐澶х被鏄惁灞炰簬涔愬櫒銆傛湭褰掔被锛坽@code major_category} 涓� null锛�
+     * 濡傞浂浠�/鍘熸枡绫诲伐搴忎骇鍑猴級杩斿洖 false锛岀敱璋冪敤鏂硅蛋鈥滃叾浠栦骇鍝佲�濆垎鏀��
+     */
+    private boolean isInstrumentCategory(String majorCategory) {
+        return MajorCategoryEnum.isInstrument(majorCategory);
     }
 
-    private java.math.BigDecimal resolveInstrumentFactor(String productName,
+    /**
+     * 鎸夋姤宸ュぇ绫诲彇瀵瑰簲鎶樼畻鐜囥��
+     *
+     * @return {@code null} 琛ㄧず涓嶆槸涔愬櫒澶х被锛堝惈鏈綊绫伙級锛岃皟鐢ㄦ柟鎹璧扳�滃叾浠栦骇鍝佲�濆垎鏀�
+     */
+    private java.math.BigDecimal resolveInstrumentFactor(String majorCategory,
                                                          java.math.BigDecimal violinFactor,
                                                          java.math.BigDecimal violaFactor,
+                                                         java.math.BigDecimal midViolinFactor,
                                                          java.math.BigDecimal bassFactor) {
-        if ("灏忔彁鐞�".equals(productName)) {
-            return violinFactor;
+        MajorCategoryEnum category = MajorCategoryEnum.of(majorCategory);
+        if (category == null) {
+            return null;
         }
-        if ("澶ф彁鐞�".equals(productName)) {
-            return violaFactor;
+        switch (category) {
+            case VIOLIN:
+                return violinFactor;
+            case VIOLA:
+                return midViolinFactor;
+            case CELLO:
+                // violaFactor 鐨勫垪鍚嶆部鐢ㄤ簡 viola锛堜腑鎻愮惔锛夛紝鍘嗗彶璇箟瀹炰负銆愬ぇ鎻愮惔銆戞姌绠楃巼锛屽嬁鏀�
+                return violaFactor;
+            case BASS:
+                return bassFactor;
+            default:
+                return null;
         }
-        if ("璐濇柉".equals(productName)) {
-            return bassFactor;
-        }
-        return java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP);
     }
 
     private String formatEntryDate(java.util.Date entryDate) {
@@ -606,7 +624,7 @@
 
         Map<String, List<ProductionProductMainDto>> grouped = accountList.stream()
                 .filter(item -> item != null && item.getSchedulingUserName() != null)
-                .filter(item -> instrumentSheet == isInstrumentProduct(item.getProductName()))
+                .filter(item -> instrumentSheet == isInstrumentCategory(item.getMajorCategory()))
                 .sorted(java.util.Comparator
                         .comparing(ProductionProductMainDto::getSchedulingUserName, java.util.Comparator.nullsLast(String::compareTo))
                         .thenComparing(item -> StringUtils.isEmpty(item.getProductName()) ? "" : item.getProductName())
@@ -625,7 +643,9 @@
             Map<String, java.math.BigDecimal> convertedMap = new LinkedHashMap<>();
             Map<String, java.math.BigDecimal> foldedMap = new LinkedHashMap<>();
             Map<String, java.math.BigDecimal> violinQuantityMap = new LinkedHashMap<>();
-            Map<String, java.math.BigDecimal> violaQuantityMap = new LinkedHashMap<>();
+            // 鍙橀噺鍚嶆寜瀹為檯涔愬櫒鍛藉悕锛歮idViolin=涓彁鐞淬�乧ello=澶ф彁鐞达紙娉ㄦ剰鍕夸笌鍘嗗彶鍒楀悕 viola_factor 娣锋穯锛�
+            Map<String, java.math.BigDecimal> midViolinQuantityMap = new LinkedHashMap<>();
+            Map<String, java.math.BigDecimal> celloQuantityMap = new LinkedHashMap<>();
             Map<String, java.math.BigDecimal> bassQuantityMap = new LinkedHashMap<>();
             for (Map<String, Object> column : columns) {
                 String key = String.valueOf(column.get("key"));
@@ -633,7 +653,8 @@
                 convertedMap.put(key, java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP));
                 foldedMap.put(key, java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP));
                 violinQuantityMap.put(key, java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP));
-                violaQuantityMap.put(key, java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP));
+                midViolinQuantityMap.put(key, java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP));
+                celloQuantityMap.put(key, java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP));
                 bassQuantityMap.put(key, java.math.BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP));
             }
             for (ProductionProductMainDto item : staffItems) {
@@ -655,11 +676,14 @@
                 foldedMap.merge(key, foldedQty, java.math.BigDecimal::add);
                 convertedMap.merge(key, convertedHours, java.math.BigDecimal::add);
                 if (instrumentSheet) {
-                    if ("灏忔彁鐞�".equals(item.getProductName())) {
+                    MajorCategoryEnum category = MajorCategoryEnum.of(item.getMajorCategory());
+                    if (category == MajorCategoryEnum.VIOLIN) {
                         violinQuantityMap.merge(key, quantity, java.math.BigDecimal::add);
-                    } else if ("澶ф彁鐞�".equals(item.getProductName())) {
-                        violaQuantityMap.merge(key, quantity, java.math.BigDecimal::add);
-                    } else if ("璐濇柉".equals(item.getProductName())) {
+                    } else if (category == MajorCategoryEnum.VIOLA) {
+                        midViolinQuantityMap.merge(key, quantity, java.math.BigDecimal::add);
+                    } else if (category == MajorCategoryEnum.CELLO) {
+                        celloQuantityMap.merge(key, quantity, java.math.BigDecimal::add);
+                    } else if (category == MajorCategoryEnum.BASS) {
                         bassQuantityMap.merge(key, quantity, java.math.BigDecimal::add);
                     }
                 }
@@ -680,17 +704,29 @@
                 createDisplayNumberCell(qtyRow, dataCol, null, numStyle);
 
                 if (instrumentSheet) {
-                    Row violaRow = sheet.createRow(rowIdx++);
-                    violaRow.setHeightInPoints(24f);
-                    createEdgeCell(sheet.getWorkbook(), violaRow, 0, "", numStyle, false, false, true, true);
-                    createTextCell(violaRow, 1, "鏈堜骇澶�", numStyle);
+                    Row midViolinRow = sheet.createRow(rowIdx++);
+                    midViolinRow.setHeightInPoints(24f);
+                    createEdgeCell(sheet.getWorkbook(), midViolinRow, 0, "", numStyle, false, false, true, true);
+                    createTextCell(midViolinRow, 1, "鏈堜骇涓�", numStyle);
                     dataCol = 2;
                     for (Map<String, Object> column : columns) {
                         String key = String.valueOf(column.get("key"));
-                        createDisplayNumberCell(violaRow, dataCol++, violaQuantityMap.getOrDefault(key, java.math.BigDecimal.ZERO), numStyle);
+                        createDisplayNumberCell(midViolinRow, dataCol++, midViolinQuantityMap.getOrDefault(key, java.math.BigDecimal.ZERO), numStyle);
                     }
-                    createDisplayNumberCell(violaRow, dataCol++, null, numStyle);
-                    createDisplayNumberCell(violaRow, dataCol, null, numStyle);
+                    createDisplayNumberCell(midViolinRow, dataCol++, null, numStyle);
+                    createDisplayNumberCell(midViolinRow, dataCol, null, numStyle);
+
+                    Row celloRow = sheet.createRow(rowIdx++);
+                    celloRow.setHeightInPoints(24f);
+                    createEdgeCell(sheet.getWorkbook(), celloRow, 0, "", numStyle, false, false, true, true);
+                    createTextCell(celloRow, 1, "鏈堜骇澶�", numStyle);
+                    dataCol = 2;
+                    for (Map<String, Object> column : columns) {
+                        String key = String.valueOf(column.get("key"));
+                        createDisplayNumberCell(celloRow, dataCol++, celloQuantityMap.getOrDefault(key, java.math.BigDecimal.ZERO), numStyle);
+                    }
+                    createDisplayNumberCell(celloRow, dataCol++, null, numStyle);
+                    createDisplayNumberCell(celloRow, dataCol, null, numStyle);
 
                     Row bassRow = sheet.createRow(rowIdx++);
                     bassRow.setHeightInPoints(24f);
@@ -795,7 +831,8 @@
                 if (product == null || StringUtils.isEmpty(product.getProductName())) {
                     continue;
                 }
-                if (isInstrumentProduct(product.getProductName())) {
+                // 涔愬櫒绫讳骇鍝佸綊鍒扳�滄垚鍝侀儴闂ㄢ�漵heet锛屼笉鍦ㄨ繖閲屼綔涓虹惔鐩掗儴绛夌殑鍒�
+                if (MajorCategoryEnum.match(product.getProductName()) != null) {
                     continue;
                 }
                 String key = product.getProductName();
@@ -1037,17 +1074,23 @@
             return java.math.BigDecimal.ZERO;
         }
         java.math.BigDecimal quantity = item.getQuantity() == null ? java.math.BigDecimal.ZERO : item.getQuantity();
-        String productName = item.getProductName();
-        if ("灏忔彁鐞�".equals(productName)) {
-            return operation.getViolinFactor() == null ? java.math.BigDecimal.ZERO : quantity.multiply(operation.getViolinFactor());
+        MajorCategoryEnum category = MajorCategoryEnum.of(item.getMajorCategory());
+        if (category == null) {
+            return java.math.BigDecimal.ZERO;
         }
-        if ("澶ф彁鐞�".equals(productName)) {
-            return operation.getViolaFactor() == null ? java.math.BigDecimal.ZERO : quantity.multiply(operation.getViolaFactor());
+        switch (category) {
+            case VIOLIN:
+                return operation.getViolinFactor() == null ? java.math.BigDecimal.ZERO : quantity.multiply(operation.getViolinFactor());
+            case VIOLA:
+                return operation.getMidViolinFactor() == null ? java.math.BigDecimal.ZERO : quantity.multiply(operation.getMidViolinFactor());
+            case CELLO:
+                // violaFactor 鐨勫垪鍚嶆部鐢ㄤ簡 viola锛堜腑鎻愮惔锛夛紝鍘嗗彶璇箟瀹炰负銆愬ぇ鎻愮惔銆戠郴鏁帮紝鍕挎敼
+                return operation.getViolaFactor() == null ? java.math.BigDecimal.ZERO : quantity.multiply(operation.getViolaFactor());
+            case BASS:
+                return operation.getBassFactor() == null ? java.math.BigDecimal.ZERO : quantity.multiply(operation.getBassFactor());
+            default:
+                return java.math.BigDecimal.ZERO;
         }
-        if ("璐濇柉".equals(productName)) {
-            return operation.getBassFactor() == null ? java.math.BigDecimal.ZERO : quantity.multiply(operation.getBassFactor());
-        }
-        return java.math.BigDecimal.ZERO;
     }
 
     private Map<String, java.math.BigDecimal> buildStandardQuantityMap(List<String> operationNames) {

--
Gitblit v1.9.3