From 3e9626a671d405b0038d1cb1ad58884b248782a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 26 Mar 2025 19:24:54 +0800 Subject: [PATCH] =?UTF-8?q?refactor(technology):=20=E9=87=8D=E6=9E=84=20BO?= =?UTF-8?q?M=20=E6=88=90=E6=9C=AC=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 优化油漆成本计算逻辑,按数量计算而非单重 - 完善损耗成本计算,增加日志记录- 调整 Redis 连接配置 --- .../technology/pojo/dto/EBomCostCacheDTO.java | 2 +- .../product/technology/pojo/dto/EBomDTO.java | 23 +++++---- .../service/BomCostCalculateService.java | 48 +++++++++++++------ .../src/main/resources/bootstrap-prod.yaml | 2 +- .../mapper/master/MaterialMainMapper.xml | 3 +- 5 files changed, 48 insertions(+), 30 deletions(-) diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/dto/EBomCostCacheDTO.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/dto/EBomCostCacheDTO.java index c614dd84..779ae50f 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/dto/EBomCostCacheDTO.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/dto/EBomCostCacheDTO.java @@ -78,7 +78,7 @@ public class EBomCostCacheDTO implements Serializable { /** * 油漆重量 */ - private BigDecimal paintWeight = BigDecimal.ONE; + private BigDecimal paintWeight = BigDecimal.ZERO; /** * 制作成本 diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/dto/EBomDTO.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/dto/EBomDTO.java index f86b2058..be72fd7d 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/dto/EBomDTO.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/dto/EBomDTO.java @@ -3,7 +3,6 @@ package com.nflg.product.technology.pojo.dto; import lombok.Data; import java.math.BigDecimal; -import java.util.Objects; @Data public class EBomDTO { @@ -82,15 +81,15 @@ public class EBomDTO { private Long ebomRowId; - /** - * 单重 - */ - private BigDecimal unitWeight; - - public BigDecimal getUnitWeight() { - if (Objects.nonNull(unitWeight)) { - return unitWeight; - } - return BigDecimal.ZERO; - } +// /** +// * 单重 +// */ +// private BigDecimal unitWeight; +// +// public BigDecimal getUnitWeight() { +// if (Objects.nonNull(unitWeight)) { +// return unitWeight; +// } +// return BigDecimal.ZERO; +// } } diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/BomCostCalculateService.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/BomCostCalculateService.java index 1cefab04..a487b1de 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/BomCostCalculateService.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/BomCostCalculateService.java @@ -92,11 +92,11 @@ public class BomCostCalculateService { config.setManday(manday); config.setVirtualWorkings(virtualWorkingService.listDTO()); List result = Collections.synchronizedList(new ArrayList<>(50)); - calculateBom(month, true, pDto, datas, config, result); + calculateBom(materialNo, month, true, pDto, datas, config, result); return result; } - private EBomCostCacheDTO calculateBom(String month, boolean isRoot, EBomDTO dto, List datas, BomCostCalculateConfig config, List result) { + private EBomCostCacheDTO calculateBom(String rootMaterialNo, String month, boolean isRoot, EBomDTO dto, List datas, BomCostCalculateConfig config, List result) { String cdata = redisTemplate.opsForValue().get(buildKey(dto)); boolean purchaseTypeIsF = materialMainAttrService.purchaseTypeIsF(dto.getMaterialNo()); boolean purchaseTypeIsE50 = materialMainAttrService.purchaseTypeIsE50(dto.getMaterialNo()); @@ -117,8 +117,6 @@ public class BomCostCalculateService { cdto.setWorkshopOfficeExpenses(calculateWorkshopOfficeExpenses(dto, config, workingHours)); cdto.setAuxiliaryDepartmentLaborCost(calculateAuxiliaryDepartmentLaborCost(dto, config, workingHours)); cdto.setAuxiliaryDepartmentExpenses(calculateAuxiliaryDepartmentExpenses(dto, config, workingHours)); - cdto.setPaintCost(calculatePaintCost(dto, month)); - cdto.setPaintWeight(dto.getUnitWeight()); cdto.setProductionCosts(calculateProductionCosts(dto, config, workingHours)); if (purchaseTypeIsF) { cdto.setHasChildren(false); @@ -135,19 +133,25 @@ public class BomCostCalculateService { if (cdto.isPurchasedParts()) { // 外购件只计算采购成本 cdto.setPurchasedPartsCost(calculatePurchasedPartsCost(dto)); + // 计算损耗成本 + cdto.setWasteCost(calculateWasteCost(dto, month)); } else { // 非外购件计算材料成本和制作成本 // 计算材料成本 cdto.setSteelsCost(calculateSteelsCost(dto)); // 计算损耗成本 cdto.setWasteCost(calculateWasteCost(dto, month)); + cdto.setPaintCost(calculatePaintCost(rootMaterialNo, dto, month)); + if (cdto.getPaintCost().compareTo(BigDecimal.ZERO) > 0) { + cdto.setPaintWeight(dto.getNum()); + } } } else { cdto.setHasChildren(true); cdto.setPurchasedParts(false); //计算子级成本 List childrenCost = children.parallelStream() - .map(c -> calculateBom(month, false, c, datas, config, result)) + .map(c -> calculateBom(rootMaterialNo, month, false, c, datas, config, result)) .collect(Collectors.toList()); for (EBomCostCacheDTO c : childrenCost) { EBomDTO dto1 = children.stream().filter(cc -> StrUtil.equals(cc.getMaterialNo(), c.getMaterialNo())).findFirst().orElse(null); @@ -163,7 +167,7 @@ public class BomCostCalculateService { cdto.setAuxiliaryDepartmentLaborCost(cdto.getAuxiliaryDepartmentLaborCost().add(c.getAuxiliaryDepartmentLaborCost().multiply(dto1.getNum()))); cdto.setAuxiliaryDepartmentExpenses(cdto.getAuxiliaryDepartmentExpenses().add(c.getAuxiliaryDepartmentExpenses().multiply(dto1.getNum()))); cdto.setPaintCost(cdto.getPaintCost().add(c.getPaintCost().multiply(dto1.getNum()))); - cdto.setPaintWeight(cdto.getPaintWeight().add(c.getPaintWeight().multiply(dto1.getUnitWeight()))); + cdto.setPaintWeight(cdto.getPaintWeight().add(c.getPaintWeight().multiply(dto1.getNum()))); if (CollectionUtil.isNotEmpty(c.getProductionCosts())) { c.getProductionCosts().forEach(pc -> { ProductionCostDTO pdto = cdto.getProductionCosts().parallelStream() @@ -197,7 +201,7 @@ public class BomCostCalculateService { List children = datas.stream() .filter(d -> StrUtil.equals(d.getParentMaterialNo(), dto.getMaterialNo())) .collect(Collectors.toList()); - children.parallelStream().forEach(c -> calculateBom(month, false, c, datas, config, result)); + children.parallelStream().forEach(c -> calculateBom(rootMaterialNo, month, false, c, datas, config, result)); } return cdto; } @@ -232,7 +236,7 @@ public class BomCostCalculateService { return productionCosts; } - private BigDecimal calculatePaintCost(EBomDTO dto, String month) { + private BigDecimal calculatePaintCost(String rootMaterialNo, EBomDTO dto, String month) { // PaintCostConfigEntity entity = paintCostConfigService.getCost(dto.getRawMaterialGroup()); // return Optional.ofNullable(entity).map(PaintCostConfigEntity::getCost).orElse(BigDecimal.ZERO); BigDecimal price = null; @@ -240,21 +244,31 @@ public class BomCostCalculateService { PaintCostConfigHistoryEntity history = paintCostConfigHistoryService.getCost(dto.getRawMaterialGroup(), month); if (Objects.nonNull(history)) { price = history.getCost(); + log.info("{},{},油漆计算:价格:{}(使用{}数据)", rootMaterialNo, dto.getMaterialNo(), price.toPlainString(), month); } } if (Objects.isNull(price)) { PaintCostConfigEntity entity = paintCostConfigService.getCost(dto.getRawMaterialGroup()); if (Objects.nonNull(entity)) { price = entity.getCost(); + log.info("{},{},油漆计算:价格:{}(使用最新数据)", rootMaterialNo, dto.getMaterialNo(), price.toPlainString()); } else { - price = BigDecimal.ZERO; + log.info("{},{},油漆计算:未配置油漆价格", rootMaterialNo, dto.getMaterialNo()); } } // VUtils.isTure(Objects.isNull(dto.getUnitWeight())).throwMessage(dto.getMaterialNo() + "未设置单重,无法计算油漆价格"); - if (Objects.isNull(dto.getUnitWeight())) { +// if (Objects.isNull(dto.getUnitWeight())) { +// log.info("{},{},油漆计算:未设置重量", rootMaterialNo, dto.getMaterialNo()); +// return BigDecimal.ZERO; +// } + if (Objects.nonNull(price)) { + log.info("{},{},油漆计算:重量{}", rootMaterialNo, dto.getMaterialNo(), dto.getNum().toPlainString()); + price = BigDecimalUtil.multiply(price, dto.getNum()); + log.info("{},{},油漆计算:费用{}", rootMaterialNo, dto.getMaterialNo(), price.toPlainString()); + return price; + } else { return BigDecimal.ZERO; } - return BigDecimalUtil.multiply(price, dto.getUnitWeight()); } private BigDecimal calculateWorkshopOfficeExpenses(EBomDTO dto, BomCostCalculateConfig config, List workHours) { @@ -350,20 +364,24 @@ public class BomCostCalculateService { if (StrUtil.isNotBlank(month)) { SteelsCostConfigHistoryEntity history = steelsCostConfigHistoryService.getCost(dto.getRawMaterialGroup(), month); if (Objects.nonNull(history)) { + log.info("{},计算损耗:损耗{}({}数据)", dto.getMaterialNo(), history.getWastage().toPlainString(), month); return history.getWastage(); } } SteelsCostConfigEntity steelsCostConfigEntity = steelsCostConfigService.getCost(dto.getRawMaterialGroup()); if (Objects.nonNull(steelsCostConfigEntity)) { + log.info("{},计算损耗:损耗{}", dto.getMaterialNo(), steelsCostConfigEntity.getWastage().toPlainString()); return steelsCostConfigEntity.getWastage(); } else { - return null; + log.info("{},计算损耗:损耗0", dto.getMaterialNo()); + return BigDecimal.ZERO; } } private BigDecimal calculateWasteCost(EBomDTO dto, String month) { //是钢材 BigDecimal price = Optional.ofNullable(dto.getMaterialPrice()).orElse(BigDecimal.ZERO); + log.info("{},计算损耗:价格{}", dto.getMaterialNo(), price.toPlainString()); BigDecimal wastage = BigDecimal.ZERO; if (StrUtil.isNotBlank(dto.getRawMaterialGroup())) { // SteelsCostConfigEntity steelsCostConfigEntity = steelsCostConfigService.getCost(dto.getRawMaterialGroup()); @@ -371,9 +389,11 @@ public class BomCostCalculateService { //// price = Optional.ofNullable(steelsCostConfigEntity.getCost()).orElse(BigDecimal.ZERO); // wastage = Optional.ofNullable(steelsCostConfigEntity.getWastage()).orElse(BigDecimal.ZERO); // } - wastage = Optional.ofNullable(getWastage(dto, month)).orElse(BigDecimal.ZERO); + wastage = getWastage(dto, month); } - return price.multiply(wastage.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP)); + price = price.multiply(wastage.divide(BigDecimal.valueOf(100), 4, RoundingMode.HALF_UP)); + log.info("{},计算损耗:费用{}", dto.getMaterialNo(), price.toPlainString()); + return price; } private String buildKey(EBomDTO dto) { diff --git a/nflg_project_dev/nflg-technology/src/main/resources/bootstrap-prod.yaml b/nflg_project_dev/nflg-technology/src/main/resources/bootstrap-prod.yaml index 4c1c8357..2cc1c2e9 100644 --- a/nflg_project_dev/nflg-technology/src/main/resources/bootstrap-prod.yaml +++ b/nflg_project_dev/nflg-technology/src/main/resources/bootstrap-prod.yaml @@ -3,7 +3,7 @@ nacos: spring: redis: database: 2 - host: 192.168.0.194 + host: 192.168.0.191 password: port: 6379 timeout: 0 diff --git a/nflg_project_dev/nflg-technology/src/main/resources/mapper/master/MaterialMainMapper.xml b/nflg_project_dev/nflg-technology/src/main/resources/mapper/master/MaterialMainMapper.xml index 4c793c1f..4fcc7acf 100644 --- a/nflg_project_dev/nflg-technology/src/main/resources/mapper/master/MaterialMainMapper.xml +++ b/nflg_project_dev/nflg-technology/src/main/resources/mapper/master/MaterialMainMapper.xml @@ -80,8 +80,7 @@