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"); } } 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; 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 = "è´æ¯æç®ç") src/main/java/com/ruoyi/production/bean/vo/ProductionCostingRawVo.java
@@ -22,7 +22,12 @@ private String processName; private Integer deptType; private Long productModelId; /** 产å大类ï¼product.product_nameï¼ï¼ä¹å¨å¤æä¾æ® */ /** * æ¥å·¥äº§å大类ï¼production_product_main.major_categoryï¼ï¼å°æç´/䏿ç´/大æç´/è´æ¯ã * è¿æ¯ä¹å¨å½ç±»ç夿便®ï¼æªå½ç±»çæ¥å·¥ä¸º nullï¼ç±è°ç¨æ¹æâéä¹å¨äº§åâå¤çã */ private String majorCategory; /** 产ååç§°ï¼product.product_nameï¼ï¼ä» ä½å±ç¤ºï¼ä¸åä¸å½ç±»å¤æ */ private String productName; /** åå·/è§æ ¼ï¼product_model.modelï¼ */ private String modelName; 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("è´æ¯", "è´æ¯", "è´å¸"); /** * é ä»¶æé¤è¯ï¼ç´ç/ç´å¥/å¼ççé ä»¶åç§°éå¯è½åºç°ãè´å¸ãã大æå¥ãçåæ · * ï¼å¦âSAè´å¸å¥ââSA大æå¥âï¼ï¼å æé¤ï¼é¿å 被误å½å ¥ä¹å¨å¤§ç±»ã */ 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 å¯¹åºæä¸¾ï¼null ææªç¥åå¼è¿å 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; } /** * å ¨é¨å¤§ç±»è§èå¼ï¼ææä¸¾å£°æé¡ºåºã */ public static List<String> allCategories() { List<String> categories = new ArrayList<>(values().length); for (MajorCategoryEnum item : values()) { categories.add(item.category); } return categories; } } 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; 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); // 注æï¼getViolaFactor() çå忝â䏿ç´âï¼ä½åå²è¯ä¹æ¯ã大æç´ãæç®çï¼å¿æ¹ 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); 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) { 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)) { MajorCategoryEnum category = MajorCategoryEnum.of(majorCategory); if (category == null) { return null; } switch (category) { case VIOLIN: return violinFactor; } if ("大æç´".equals(productName)) { case VIOLA: return midViolinFactor; case CELLO: // violaFactor çååæ²¿ç¨äº violaï¼ä¸æç´ï¼ï¼åå²è¯ä¹å®ä¸ºã大æç´ãæç®çï¼å¿æ¹ return violaFactor; } if ("è´æ¯".equals(productName)) { case BASS: return bassFactor; default: return null; } 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<>(); // åéåæå®é ä¹å¨å½åï¼midViolin=䏿ç´ãcello=大æç´ï¼æ³¨æå¿ä¸åå²åå 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())) { // ä¹å¨ç±»äº§åå½å°âæåé¨é¨âsheetï¼ä¸å¨è¿éä½ä¸ºç´çé¨ççå if (MajorCategoryEnum.match(product.getProductName()) != null) { continue; } String key = product.getProductName(); @@ -1037,18 +1074,24 @@ 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()); } if ("大æç´".equals(productName)) { return operation.getViolaFactor() == null ? java.math.BigDecimal.ZERO : quantity.multiply(operation.getViolaFactor()); } if ("è´æ¯".equals(productName)) { return operation.getBassFactor() == null ? java.math.BigDecimal.ZERO : quantity.multiply(operation.getBassFactor()); } MajorCategoryEnum category = MajorCategoryEnum.of(item.getMajorCategory()); if (category == null) { return java.math.BigDecimal.ZERO; } 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; } } private Map<String, java.math.BigDecimal> buildStandardQuantityMap(List<String> operationNames) { Map<String, java.math.BigDecimal> map = new LinkedHashMap<>(); 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; 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()) 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 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 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> 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" />