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/production/service/impl/ProductionCostingServiceImpl.java     |   26 +++-
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |   33 +----
 src/main/resources/mapper/production/ProductionCostingMapper.xml                      |    3 
 src/main/resources/mapper/production/ProductionCostingFactorMapper.xml                |    2 
 src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java             |    3 
 src/main/java/com/ruoyi/production/bean/vo/ProductionCostingRawVo.java                |    7 +
 src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java                          |    5 
 src/main/java/com/ruoyi/production/bean/vo/ProductionCostingDetailVo.java             |    5 
 src/main/java/com/ruoyi/production/enums/MajorCategoryEnum.java                       |  118 +++++++++++++++++++
 src/main/java/com/ruoyi/technology/service/impl/TechnologyOperationServiceImpl.java   |    1 
 src/main/java/com/ruoyi/staff/service/impl/StaffSalaryMainServiceImpl.java            |  145 +++++++++++++++--------
 src/main/resources/mapper/production/ProductionAccountMapper.xml                      |    2 
 src/main/java/com/ruoyi/production/pojo/ProductionCostingFactor.java                  |    4 
 src/main/resources/mapper/technology/TechnologyOperationMapper.xml                    |    1 
 src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java                      |    4 
 15 files changed, 271 insertions(+), 88 deletions(-)

diff --git a/src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java b/src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java
index 9f6a258..0a06b18 100644
--- a/src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java
+++ b/src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java
@@ -39,6 +39,11 @@
         IGNORE_TABLES.add("product_model");
         IGNORE_TABLES.add("ai_chat_session");
         IGNORE_TABLES.add("product");
+        // 鐢熶骇鏍哥畻閰嶇疆琛ㄦ病鏈� dept_id 鍒楋紝鑻ヨ杩藉姞閮ㄩ棬鏁版嵁鏉冮檺鏉′欢浼氱洿鎺� SQL 鎶ラ敊
+        IGNORE_TABLES.add("production_costing_process");
+        IGNORE_TABLES.add("production_costing_standard");
+        IGNORE_TABLES.add("production_costing_factor");
+        IGNORE_TABLES.add("production_costing_workday");
 
     }
 }
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
index ad13722..217780e 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
@@ -72,6 +72,9 @@
     @Schema(description = "浜у搧鍚嶇О")
     private String productName;
 
+    @Schema(description = "鎶ュ伐浜у搧澶х被锛氬皬鎻愮惔/涓彁鐞�/澶ф彁鐞�/璐濇柉锛屾湭褰掔被涓� null")
+    private String majorCategory;
+
     @Schema(description = "浜у搧瑙勬牸鍨嬪彿")
     private String productModelName;
 
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionCostingDetailVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionCostingDetailVo.java
index e2f3e38..6532124 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionCostingDetailVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionCostingDetailVo.java
@@ -39,6 +39,8 @@
 
     @Excel(name = "灏忔彁鐞存暟閲�")
     private BigDecimal violinQty;
+    @Excel(name = "涓彁鐞存暟閲�")
+    private BigDecimal violaQty;
     @Excel(name = "澶ф彁鐞存暟閲�")
     private BigDecimal celloQty;
     @Excel(name = "璐濇柉鏁伴噺")
@@ -46,6 +48,9 @@
 
     @Excel(name = "灏忔彁鐞存姌绠楃巼")
     private BigDecimal violinFactor;
+    @Excel(name = "涓彁鐞存姌绠楃巼")
+    private BigDecimal violaFactor;
+    /** 澶ф彁鐞存姌绠楃巼 */
     @Excel(name = "澶ф彁鐞存姌绠楃巼")
     private BigDecimal celloFactor;
     @Excel(name = "璐濇柉鎶樼畻鐜�")
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionCostingRawVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionCostingRawVo.java
index 5071e7c..310688a 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionCostingRawVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionCostingRawVo.java
@@ -22,7 +22,12 @@
     private String processName;
     private Integer deptType;
     private Long productModelId;
-    /** 浜у搧澶х被锛坧roduct.product_name锛夛紝涔愬櫒鍒ゆ柇渚濇嵁 */
+    /**
+     * 鎶ュ伐浜у搧澶х被锛坧roduction_product_main.major_category锛夛細灏忔彁鐞�/涓彁鐞�/澶ф彁鐞�/璐濇柉銆�
+     * 杩欐槸涔愬櫒褰掔被鐨勫垽鏂緷鎹紱鏈綊绫荤殑鎶ュ伐涓� null锛岀敱璋冪敤鏂规寜鈥滈潪涔愬櫒浜у搧鈥濆鐞嗐��
+     */
+    private String majorCategory;
+    /** 浜у搧鍚嶇О锛坧roduct.product_name锛夛紝浠呬綔灞曠ず锛屼笉鍙備笌褰掔被鍒ゆ柇 */
     private String productName;
     /** 鍨嬪彿/瑙勬牸锛坧roduct_model.model锛� */
     private String modelName;
diff --git a/src/main/java/com/ruoyi/production/enums/MajorCategoryEnum.java b/src/main/java/com/ruoyi/production/enums/MajorCategoryEnum.java
new file mode 100644
index 0000000..fc1a4ee
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/enums/MajorCategoryEnum.java
@@ -0,0 +1,118 @@
+package com.ruoyi.production.enums;
+
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鐢熶骇鎶ュ伐浜у搧澶х被銆�
+ *
+ * <p>鎶ュ伐鍙尯鍒嗕箰鍣ㄥぇ绫伙紙灏忔彁鐞�/涓彁鐞�/澶ф彁鐞�/璐濇柉锛夛紝涓嶅啀鍖哄垎闆朵欢銆�
+ * 澶х被鍚屾椂鏄�屾姌鍚堝皬鎻愮惔褰撻噺銆嶆姌绠楃殑鍖归厤閿紝鍥犳杩欓噷鐨勮鑼冨�煎繀椤讳笌
+ * 鍓嶇涓嬫媺閫夐」銆亄@code production_product_main.major_category} 钀藉簱鍊间繚鎸佷竴鑷淬��</p>
+ *
+ * <p>鏈灇涓炬槸澶х被鍒ゅ畾鐨�<b>鍞竴浜嬪疄婧�</b>锛氭姤宸ュ啓鍏ユ椂鎸変骇鍝佸悕绉板綊绫伙紱
+ * 宸ヨ祫鏍哥畻涓庣敓浜ф牳绠楃洿鎺ヨ鍙栧凡钀藉簱鐨勫ぇ绫诲瓧娈碉紝涓嶅啀鍚勮嚜鍋氬瓧绗︿覆姣旇緝銆�</p>
+ *
+ * @since 2026/09/24
+ */
+@Getter
+public enum MajorCategoryEnum {
+
+    VIOLIN("灏忔彁鐞�", "灏忔彁鐞�"),
+    VIOLA("涓彁鐞�", "涓彁鐞�"),
+    CELLO("澶ф彁鐞�", "澶ф彁鐞�"),
+    BASS("璐濇柉", "璐濇柉", "璐濆徃");
+
+    /**
+     * 閰嶄欢鎺掗櫎璇嶏細鐞寸洅/鐞村/寮撶洅绛夐厤浠跺悕绉伴噷鍙兘鍑虹幇銆岃礉鍙搞�嶃�屽ぇ鎻愬銆嶇瓑瀛楁牱
+     * 锛堝鈥淪A璐濆徃濂椻�濃�淪A澶ф彁濂椻�濓級锛屽厛鎺掗櫎锛岄伩鍏嶈璇綊鍏ヤ箰鍣ㄥぇ绫汇��
+     */
+    private static final List<String> ACCESSORY_EXCLUDES = List.of("鐞寸洅", "鐞村", "寮撶洅");
+
+    /**
+     * 澶х被瑙勮寖鍊� -> 璇ュぇ绫荤殑浜у搧鍚嶇О鍖归厤鍒悕銆�
+     * 鐜板満鏁版嵁鎶娿�岃礉鏂�嶅啓浣溿�岃礉鍙搞�嶏紝鏁� BASS 閰嶄簡涓や釜鍒悕銆�
+     */
+    private static final Map<String, List<String>> CATEGORY_ALIASES = new LinkedHashMap<>();
+
+    static {
+        for (MajorCategoryEnum item : values()) {
+            CATEGORY_ALIASES.put(item.category, List.of(item.aliases));
+        }
+    }
+
+    /** 澶х被瑙勮寖鍊硷紝钀藉簱鍒� production_product_main.major_category */
+    private final String category;
+
+    /** 鐢ㄤ簬鍖归厤浜у搧鍚嶇О鐨勫埆鍚嶏紝绗竴涓笌瑙勮寖鍊肩浉鍚� */
+    private final String[] aliases;
+
+    MajorCategoryEnum(String category, String... aliases) {
+        this.category = category;
+        this.aliases = aliases;
+    }
+
+    /**
+     * 鎸変骇鍝佸悕绉板綊鍏ヤ箰鍣ㄥぇ绫汇�傝嚜搴曞悜涓婇亶鍘嗕骇鍝佹爲鏃堕�愬眰璋冪敤锛屽懡涓嵆杩斿洖銆�
+     *
+     * @param productName 浜у搧鍚嶇О锛屽彲涓� null
+     * @return 澶х被瑙勮寖鍊硷紱閰嶄欢銆侀潪涔愬櫒浜у搧銆佺┖鍊间竴寰嬭繑鍥� null
+     */
+    public static String match(String productName) {
+        if (productName == null || productName.isEmpty()) {
+            return null;
+        }
+        if (ACCESSORY_EXCLUDES.stream().anyMatch(productName::contains)) {
+            return null;
+        }
+        for (Map.Entry<String, List<String>> entry : CATEGORY_ALIASES.entrySet()) {
+            for (String alias : entry.getValue()) {
+                if (productName.contains(alias)) {
+                    return entry.getKey();
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鎸夊ぇ绫昏鑼冨�煎彇鏋氫妇銆�
+     *
+     * @param category 澶х被瑙勮寖鍊硷紝鍙负 null
+     * @return 瀵瑰簲鏋氫妇锛沶ull 鎴栨湭鐭ュ彇鍊艰繑鍥� null
+     */
+    public static MajorCategoryEnum of(String category) {
+        if (category == null || category.isEmpty()) {
+            return null;
+        }
+        for (MajorCategoryEnum item : values()) {
+            if (item.category.equals(category)) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁鏄箰鍣ㄥぇ绫汇�傛姤宸ユ湭褰掔被锛堝ぇ绫讳负 null锛夋椂杩斿洖 false锛�
+     * 鐢辫皟鐢ㄦ柟璧般�岄潪涔愬櫒浜у搧銆嶅垎鏀鐞嗐��
+     */
+    public static boolean isInstrument(String category) {
+        return of(category) != null;
+    }
+
+    /**
+     * 鍏ㄩ儴澶х被瑙勮寖鍊硷紝鎸夋灇涓惧0鏄庨『搴忋��
+     */
+    public static List<String> allCategories() {
+        List<String> categories = new ArrayList<>(values().length);
+        for (MajorCategoryEnum item : values()) {
+            categories.add(item.category);
+        }
+        return categories;
+    }
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionCostingFactor.java b/src/main/java/com/ruoyi/production/pojo/ProductionCostingFactor.java
index d0bdf8e..39de8c9 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionCostingFactor.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionCostingFactor.java
@@ -39,9 +39,13 @@
     @Schema(description = "灏忔彁鐞存姌绠楃巼锛堝熀鍑嗭級")
     private BigDecimal violinFactor;
 
+    /** 澶ф彁鐞存姌绠楃巼銆傚瓧娈靛悕娌跨敤浜� viola锛堜腑鎻愮惔锛夊睘浜庡巻鍙查敊鍚嶏紝璇箟纭负澶ф彁鐞达紝鍕挎敼 */
     @Schema(description = "澶ф彁鐞存姌绠楃巼")
     private BigDecimal violaFactor;
 
+    @Schema(description = "涓彁鐞存姌绠楃巼")
+    private BigDecimal midViolinFactor;
+
     @Schema(description = "璐濇柉鎶樼畻鐜�")
     private BigDecimal bassFactor;
 
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionCostingServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionCostingServiceImpl.java
index c674548..f20f2df 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionCostingServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionCostingServiceImpl.java
@@ -5,6 +5,7 @@
 import com.ruoyi.production.bean.vo.ProductionCostingDetailVo;
 import com.ruoyi.production.bean.vo.ProductionCostingRawVo;
 import com.ruoyi.production.bean.vo.ProductionCostingSummaryVo;
+import com.ruoyi.production.enums.MajorCategoryEnum;
 import com.ruoyi.production.mapper.ProductionCostingProcessMapper;
 import com.ruoyi.production.mapper.ProductionCostingFactorMapper;
 import com.ruoyi.production.mapper.ProductionCostingMapper;
@@ -44,9 +45,11 @@
 
     private static final BigDecimal EIGHT = new BigDecimal("8");
     private static final BigDecimal ONE = new BigDecimal("1");
-    private static final String VIOLIN = "灏忔彁鐞�";
-    private static final String CELLO = "澶ф彁鐞�";
-    private static final String BASS = "璐濇柉";
+    // 澶х被瑙勮寖鍊肩粺涓�鍙栬嚜 MajorCategoryEnum锛岄伩鍏嶈鍒欐暎钀�
+    private static final String VIOLIN = MajorCategoryEnum.VIOLIN.getCategory();
+    private static final String VIOLA = MajorCategoryEnum.VIOLA.getCategory();
+    private static final String CELLO = MajorCategoryEnum.CELLO.getCategory();
+    private static final String BASS = MajorCategoryEnum.BASS.getCategory();
 
     private final ProductionCostingMapper productionCostingMapper;
     private final ProductionCostingStandardMapper standardMapper;
@@ -121,19 +124,22 @@
                     vo.setDeptType(row.getDeptType());
                     vo.setQuantity(BigDecimal.ZERO);
                     vo.setViolinQty(BigDecimal.ZERO);
+                    vo.setViolaQty(BigDecimal.ZERO);
                     vo.setCelloQty(BigDecimal.ZERO);
                     vo.setBassQty(BigDecimal.ZERO);
                     finishedGroup.put(k, vo);
                 }
                 vo.setQuantity(vo.getQuantity().add(qty));
-                if (VIOLIN.equals(row.getProductName())) {
-                    vo.setViolinQty(vo.getViolinQty().add(qty));
-                } else if (CELLO.equals(row.getProductName())) {
+                // 鎸夋姤宸ユ椂褰掗泦濂界殑澶х被鍒嗘祦锛涙湭褰掔被锛堝闆朵欢/鍘熸枡绫绘姤宸ワ級涓庣┖鍊间竴寰嬫寜灏忔彁鐞村綋閲� 1:1 璁″叆锛�
+                // 涓庢敼鍔ㄥ墠鈥滈潪涔愬櫒浜у搧鈥濆垎鏀殑琛屼负淇濇寔涓�鑷淬��
+                String category = row.getMajorCategory();
+                if (VIOLA.equals(category)) {
+                    vo.setViolaQty(vo.getViolaQty().add(qty));
+                } else if (CELLO.equals(category)) {
                     vo.setCelloQty(vo.getCelloQty().add(qty));
-                } else if (BASS.equals(row.getProductName())) {
+                } else if (BASS.equals(category)) {
                     vo.setBassQty(vo.getBassQty().add(qty));
                 } else {
-                    // 闈炰箰鍣ㄤ骇鍝侀粯璁ゆ寜灏忔彁鐞村綋閲� 1:1 璁″叆
                     vo.setViolinQty(vo.getViolinQty().add(qty));
                 }
             }
@@ -143,13 +149,17 @@
         for (ProductionCostingDetailVo vo : finishedGroup.values()) {
             ProductionCostingFactor factor = factorMap.get(key(vo.getProcessId(), vo.getStaffId()));
             BigDecimal violinFactor = factor == null ? ONE : nzDefault(factor.getViolinFactor(), ONE);
+            // 娉ㄦ剰锛歡etViolaFactor() 鐨勫垪鍚嶆槸鈥滀腑鎻愮惔鈥濓紝浣嗗巻鍙茶涔夋槸銆愬ぇ鎻愮惔銆戞姌绠楃巼锛屽嬁鏀�
             BigDecimal celloFactor = factor == null ? ONE : nzDefault(factor.getViolaFactor(), ONE);
+            BigDecimal violaFactor = factor == null ? ONE : nzDefault(factor.getMidViolinFactor(), ONE);
             BigDecimal bassFactor = factor == null ? ONE : nzDefault(factor.getBassFactor(), ONE);
             vo.setViolinFactor(violinFactor);
             vo.setCelloFactor(celloFactor);
+            vo.setViolaFactor(violaFactor);
             vo.setBassFactor(bassFactor);
 
             BigDecimal folded = nz(vo.getViolinQty()).multiply(violinFactor)
+                    .add(nz(vo.getViolaQty()).multiply(violaFactor))
                     .add(nz(vo.getCelloQty()).multiply(celloFactor))
                     .add(nz(vo.getBassQty()).multiply(bassFactor))
                     .setScale(2, RoundingMode.HALF_UP);
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index ce9eee2..6b052c8 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -23,6 +23,7 @@
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.bean.dto.ProductionProductMainDto;
+import com.ruoyi.production.enums.MajorCategoryEnum;
 import com.ruoyi.production.enums.ProductOrderStatusEnum;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.*;
@@ -63,16 +64,6 @@
 @AllArgsConstructor
 @Transactional(rollbackFor = Exception.class)
 public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
-
-    /**
-     * 鐢熶骇鎶ュ伐澶х被锛氬彧鍖哄垎灏忔彁鐞�/澶ф彁鐞�/璐濇柉锛屼笉鍐嶅尯鍒嗛浂浠躲��
-     * key涓哄叆搴撹鑼冨�硷紝value涓轰骇鍝佸悕绉板尮閰嶅埆鍚嶏紙鐜板満鏁版嵁璐濇柉鍐欎綔鈥滆礉鍙糕�濓級銆�
-     */
-    private static final Map<String, List<String>> MAJOR_CATEGORY_PATTERNS = new LinkedHashMap<>() {{
-        put("灏忔彁鐞�", List.of("灏忔彁鐞�"));
-        put("澶ф彁鐞�", List.of("澶ф彁鐞�"));
-        put("璐濇柉", List.of("璐濇柉", "璐濆徃"));
-    }};
 
     private final ProductionProductMainMapper productionProductMainMapper;
     private final SysUserMapper userMapper;
@@ -741,7 +732,7 @@
     }
 
     /**
-     * 闇�姹傦細鐢熶骇鎶ュ伐鍙尯鍒嗕骇鍝佸ぇ绫伙紙灏忔彁鐞�/澶ф彁鐞�/璐濇柉锛夛紝涓嶅啀鍖哄垎闆朵欢銆�
+     * 闇�姹傦細鐢熶骇鎶ュ伐鍙尯鍒嗕骇鍝佸ぇ绫伙紙灏忔彁鐞�/涓彁鐞�/澶ф彁鐞�/璐濇柉锛夛紝涓嶅啀鍖哄垎闆朵欢銆�
      * 浠庝骇鍑轰骇鍝佽嚜韬悕绉板紑濮嬫部浜у搧鏍戝悜涓婂仛鍏抽敭瀛楀尮閰嶏紝鍛戒腑鍗冲彇瀵瑰簲瑙勮寖澶х被锛涙湭鍛戒腑杩斿洖 null銆�
      * 浜у搧鏍戦《灞備负鈥滄垚鍝�/鍗婃垚鍝�/鍘熸枡鈥濈瓑搴撳瓨鍒嗙被锛屼笉鑳界洿鎺ュ綋浣滃ぇ绫伙紝鍥犳蹇呴』鑷簳鍚戜笂鍙栫涓�涓懡涓殑灞傜骇銆�
      */
@@ -764,22 +755,12 @@
         return null;
     }
 
+    /**
+     * 鎸変骇鍝佸悕绉板綊鍏ヤ箰鍣ㄥぇ绫汇�傚垽瀹氳鍒欙紙鍒悕琛ㄣ�侀厤浠舵帓闄わ級闆嗕腑鍦� {@link MajorCategoryEnum}锛�
+     * 宸ヨ祫鏍哥畻銆佺敓浜ф牳绠椾篃鍏辩敤鍚屼竴濂楄鍒欙紝閬垮厤鍚勫鍐嶅啓涓�浠藉瓧绗︿覆姣旇緝銆�
+     */
     static String matchMajorCategory(String productName) {
-        if (productName == null || productName.isEmpty()) {
-            return null;
-        }
-        // 鐞寸洅/鐞村绛夐厤浠跺悕绉板彲鑳藉甫鈥滆礉鍙糕�濈瓑瀛楁牱锛堝 SA璐濆徃濂楋級锛屾帓闄ゅ悗閬垮厤璇綊澶х被銆�
-        if (productName.contains("鐞寸洅") || productName.contains("鐞村") || productName.contains("寮撶洅")) {
-            return null;
-        }
-        for (Map.Entry<String, List<String>> entry : MAJOR_CATEGORY_PATTERNS.entrySet()) {
-            for (String alias : entry.getValue()) {
-                if (productName.contains(alias)) {
-                    return entry.getKey();
-                }
-            }
-        }
-        return null;
+        return MajorCategoryEnum.match(productName);
     }
 
     private Boolean removeProductMainByProductionTask(ProductionProductMain productionProductMain) {
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) {
diff --git a/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java b/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java
index 72d8520..5fa9e4d 100644
--- a/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java
+++ b/src/main/java/com/ruoyi/technology/pojo/TechnologyOperation.java
@@ -52,9 +52,13 @@
     @Schema(description = "鏈堜骇灏忔彁鐞寸郴鏁�")
     private BigDecimal violinFactor;
 
+    /** 鏈堜骇澶ф彁鐞寸郴鏁般�傚瓧娈靛悕娌跨敤浜� viola锛堜腑鎻愮惔锛夊睘浜庡巻鍙查敊鍚嶏紝璇箟纭负澶ф彁鐞达紝鍕挎敼 */
     @Schema(description = "鏈堜骇澶ф彁鐞寸郴鏁�")
     private BigDecimal violaFactor;
 
+    @Schema(description = "鏈堜骇涓彁鐞寸郴鏁�")
+    private BigDecimal midViolinFactor;
+
     @Schema(description = "鏈堜骇璐濇柉绯绘暟")
     private BigDecimal bassFactor;
 
diff --git a/src/main/java/com/ruoyi/technology/service/impl/TechnologyOperationServiceImpl.java b/src/main/java/com/ruoyi/technology/service/impl/TechnologyOperationServiceImpl.java
index 949530a..2e65f5c 100644
--- a/src/main/java/com/ruoyi/technology/service/impl/TechnologyOperationServiceImpl.java
+++ b/src/main/java/com/ruoyi/technology/service/impl/TechnologyOperationServiceImpl.java
@@ -79,6 +79,7 @@
                         .set(TechnologyOperation::getStandardQuantity, technologyOperation.getStandardQuantity())
                         .set(TechnologyOperation::getViolinFactor, technologyOperation.getViolinFactor())
                         .set(TechnologyOperation::getViolaFactor, technologyOperation.getViolaFactor())
+                        .set(TechnologyOperation::getMidViolinFactor, technologyOperation.getMidViolinFactor())
                         .set(TechnologyOperation::getBassFactor, technologyOperation.getBassFactor())
                         .set(TechnologyOperation::getIsQuality, technologyOperation.getIsQuality())
                         .set(TechnologyOperation::getIsProduction, technologyOperation.getIsProduction())
diff --git a/src/main/resources/mapper/production/ProductionAccountMapper.xml b/src/main/resources/mapper/production/ProductionAccountMapper.xml
index 22c1963..c24c22e 100644
--- a/src/main/resources/mapper/production/ProductionAccountMapper.xml
+++ b/src/main/resources/mapper/production/ProductionAccountMapper.xml
@@ -181,7 +181,9 @@
             ifnull(p.standard_quantity, 0) as productStandardQuantity,
             ifnull(too.violin_factor, 0) as violinFactor,
             ifnull(too.viola_factor, 0) as violaFactor,
+            ifnull(too.mid_violin_factor, 0) as midViolinFactor,
             ifnull(too.bass_factor, 0) as bassFactor,
+            ppm.major_category as majorCategory,
             p.product_name as productName
         from production_account pa
                  left join production_product_main ppm on ppm.id = pa.production_product_main_id
diff --git a/src/main/resources/mapper/production/ProductionCostingFactorMapper.xml b/src/main/resources/mapper/production/ProductionCostingFactorMapper.xml
index 8f80fae..da92a85 100644
--- a/src/main/resources/mapper/production/ProductionCostingFactorMapper.xml
+++ b/src/main/resources/mapper/production/ProductionCostingFactorMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.ruoyi.production.mapper.ProductionCostingFactorMapper">
 
     <select id="selectFactorList" resultType="com.ruoyi.production.pojo.ProductionCostingFactor">
-        select f.id, f.process_id, f.staff_id, f.staff_name, f.violin_factor, f.viola_factor, f.bass_factor, f.remark,
+        select f.id, f.process_id, f.staff_id, f.staff_name, f.violin_factor, f.viola_factor, f.mid_violin_factor, f.bass_factor, f.remark,
                f.create_user, f.create_time, f.update_user, f.update_time,
                too.name as processName
         from production_costing_factor f
diff --git a/src/main/resources/mapper/production/ProductionCostingMapper.xml b/src/main/resources/mapper/production/ProductionCostingMapper.xml
index 05e3d7a..9985307 100644
--- a/src/main/resources/mapper/production/ProductionCostingMapper.xml
+++ b/src/main/resources/mapper/production/ProductionCostingMapper.xml
@@ -11,6 +11,7 @@
             too.name                                 as processName,
             cp.dept_type                             as deptType,
             ppo.product_model_id                     as productModelId,
+            ppm.major_category                       as majorCategory,
             p.product_name                           as productName,
             pm.model                                 as modelName,
             sum(ifnull(ppo.quantity, 0))             as quantity
@@ -40,7 +41,7 @@
                 </if>
             </if>
         </where>
-        group by ppm.user_id, ppm.user_name, yearMonth, too.id, too.name, cp.dept_type, ppo.product_model_id, p.product_name, pm.model
+        group by ppm.user_id, ppm.user_name, yearMonth, too.id, too.name, cp.dept_type, ppo.product_model_id, ppm.major_category, p.product_name, pm.model
         order by yearMonth desc, ppm.user_id, too.id
     </select>
 
diff --git a/src/main/resources/mapper/technology/TechnologyOperationMapper.xml b/src/main/resources/mapper/technology/TechnologyOperationMapper.xml
index 1a5f820..5f9eb67 100644
--- a/src/main/resources/mapper/technology/TechnologyOperationMapper.xml
+++ b/src/main/resources/mapper/technology/TechnologyOperationMapper.xml
@@ -14,6 +14,7 @@
         <result column="standard_quantity" property="standardQuantity" />
         <result column="violin_factor" property="violinFactor" />
         <result column="viola_factor" property="violaFactor" />
+        <result column="mid_violin_factor" property="midViolinFactor" />
         <result column="bass_factor" property="bassFactor" />
         <result column="conversion_factor" property="conversionFactor" />
         <result column="is_quality" property="isQuality" />

--
Gitblit v1.9.3