From 7fc22ba84cd2d9d1bc3d8f8f67f4c303fb1bc731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 8 Jan 2025 15:08:31 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=88=90=E6=9C=AC=E5=88=86=E6=9E=90):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9B=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/entity/EBomParentEntity.java | 7 ++ .../pojo/vo/BomCostMultilayerVO.java | 3 + .../pojo/vo/MaterialTypeCompositionVO.java | 4 + .../service/ProductCostAnalysisService.java | 98 +++++++++++-------- .../technology/util/BigDecimalUtil.java | 13 +++ 5 files changed, 82 insertions(+), 43 deletions(-) diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/entity/EBomParentEntity.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/entity/EBomParentEntity.java index 95f6b194..1c42e16a 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/entity/EBomParentEntity.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/entity/EBomParentEntity.java @@ -89,4 +89,11 @@ public class EBomParentEntity implements Serializable { @ApiModelProperty(value = "1=待复核、2=已复核、3=已退回、4=定版(已发布PBOM)") @JsonIgnore private Integer status; + + /** + * 是否有BOM + */ + @TableField(value = "bom_exist") + @ApiModelProperty(value = "是否有BOM") + private Integer bomExist; } diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java index 9b51d73b..f6a470b4 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/BomCostMultilayerVO.java @@ -80,5 +80,8 @@ public class BomCostMultilayerVO implements Serializable { @ApiModelProperty("物料行id") private Long materialRowId; + @ApiModelProperty("是否有下级") + private boolean hasChildren = false; + private String relCategoryCode; } diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialTypeCompositionVO.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialTypeCompositionVO.java index 89ad8772..d2c1f850 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialTypeCompositionVO.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/pojo/vo/MaterialTypeCompositionVO.java @@ -1,6 +1,7 @@ package com.nflg.product.technology.pojo.vo; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.nflg.product.base.core.config.BigDecimalSerializer; import io.swagger.annotations.ApiModel; @@ -23,6 +24,9 @@ public class MaterialTypeCompositionVO implements Serializable { @ApiModelProperty("物料分类(中类)") private String materialCategoryName; + @JsonIgnore + private String materialCategoryCode; + @ApiModelProperty("数量") private BigDecimal num = BigDecimal.ZERO; diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java index 03673a32..aef8c3f0 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/service/ProductCostAnalysisService.java @@ -56,6 +56,7 @@ public class ProductCostAnalysisService { EBomParentEntity parent = ebomService.getParent(materialNo); BomCostMultilayerVO vo = new BomCostMultilayerVO(); vo.setTotalNum(BigDecimal.ONE); + vo.setHasChildren(true); buildMultilayerChildren(parent.getRowId(), vo, materials, datas, false); return vo.getChildren(); } @@ -69,6 +70,7 @@ public class ProductCostAnalysisService { EBomParentEntity parent = ebomService.getParent(materialNo); BomCostMultilayerVO vo = new BomCostMultilayerVO(); vo.setMaterialNo(parent.getMaterialNo()); + vo.setHasChildren(true); EBomDTO pm = materials.stream().filter(m -> StrUtil.equals(m.getMaterialNo(), parent.getMaterialNo())).findFirst().orElse(null); if (Objects.nonNull(pm)) { vo.setMaterialDesc(pm.getMaterialDesc()); @@ -99,44 +101,48 @@ public class ProductCostAnalysisService { private void buildMultilayerChildren(long parentRowId, BomCostMultilayerVO pvo, List materials, List datas, boolean recursion) { List children = ebomService.getChildren(parentRowId); children.forEach(child -> { - BomCostMultilayerVO cvo = new BomCostMultilayerVO(); - cvo.setMaterialNo(child.getMaterialNo()); - EBomDTO cpm = materials.stream().filter(m -> StrUtil.equals(m.getMaterialNo(), child.getMaterialNo())).findFirst().orElse(null); - if (Objects.nonNull(cpm)) { - cvo.setMaterialDesc(cpm.getMaterialDesc()); - cvo.setMaterialCategoryName(cpm.getCategoryName()); - cvo.setMaterialUnit(cpm.getMaterialUnit()); - cvo.setMaterialRowId(cpm.getMaterialRowId()); - cvo.setRelCategoryCode(cpm.getRelCategoryCode()); - } - if (StrUtil.equals(child.getProjectType(), BomConstant.PROJECT_TYPE_TEMPORARY)) { - //T项 - cvo.setMaterialDesc(child.getMaterialDesc()); - } - EBomCostCacheDTO ccost = datas.stream().filter(d -> StrUtil.equals(d.getMaterialNo(), child.getMaterialNo())).findFirst().orElse(null); - if (Objects.nonNull(ccost)) { - cvo.setNum(child.getNum()); - cvo.setTotalNum(cvo.getNum().multiply(pvo.getTotalNum())); - cvo.setTotalCost(ccost.getTotalCost().multiply(cvo.getTotalNum())); - if (ccost.isHasChildren()) { - cvo.setPrice(ccost.getTotalCost()); - cvo.setMaterialCost(ccost.getMaterialCost().setScale(2, RoundingMode.UP).toPlainString()); - cvo.setTotalMaterialCost(ccost.getMaterialCost().multiply(cvo.getTotalNum()).setScale(2, RoundingMode.UP).toPlainString()); - cvo.setPaintCost(ccost.getPaintCost().setScale(2, RoundingMode.UP).toPlainString()); - cvo.setTotalPaintCost(ccost.getPaintCost().multiply(cvo.getTotalNum()).setScale(2, RoundingMode.UP).toPlainString()); - cvo.setDirectManualProductionCost(ccost.getDirectManualProductionCost().multiply(cvo.getTotalNum()).setScale(2, RoundingMode.UP).toPlainString()); - cvo.setTotalDirectManualProductionCost(ccost.getDirectManualProductionCost().setScale(2, RoundingMode.UP).toPlainString()); - cvo.setAuxiliaryManufacturingCost(ccost.getAuxiliaryManufacturingCost().setScale(2, RoundingMode.UP).toPlainString()); - cvo.setTotalAuxiliaryManufacturingCost(ccost.getAuxiliaryManufacturingCost().multiply(cvo.getTotalNum()).setScale(2, RoundingMode.UP).toPlainString()); - } else { - cvo.setPrice(ccost.isPurchasedParts() ? ccost.getPurchasedPartsCost() : ccost.getSteelsCost()); + if (!StrUtil.equals(child.getProjectType(), BomConstant.PROJECT_TYPE_TEMPORARY)) { + BomCostMultilayerVO cvo = new BomCostMultilayerVO(); + cvo.setMaterialNo(child.getMaterialNo()); + EBomDTO cpm = materials.stream().filter(m -> StrUtil.equals(m.getMaterialNo(), child.getMaterialNo())).findFirst().orElse(null); + if (Objects.nonNull(cpm)) { + cvo.setMaterialDesc(cpm.getMaterialDesc()); + cvo.setMaterialCategoryName(cpm.getCategoryName()); + cvo.setMaterialUnit(cpm.getMaterialUnit()); + cvo.setMaterialRowId(cpm.getMaterialRowId()); + cvo.setRelCategoryCode(cpm.getRelCategoryCode()); } - } - pvo.getChildren().add(cvo); - if (recursion) { + //if (StrUtil.equals(child.getProjectType(), BomConstant.PROJECT_TYPE_TEMPORARY)) { + // //T项 + // cvo.setMaterialDesc(child.getMaterialDesc()); + //} + EBomCostCacheDTO ccost = datas.stream().filter(d -> StrUtil.equals(d.getMaterialNo(), child.getMaterialNo())).findFirst().orElse(null); + if (Objects.nonNull(ccost)) { + cvo.setNum(child.getNum()); + cvo.setTotalNum(cvo.getNum().multiply(pvo.getTotalNum())); + if (ccost.isHasChildren()) { + cvo.setPrice(ccost.getTotalCost()); + cvo.setMaterialCost(ccost.getMaterialCost().setScale(2, RoundingMode.UP).toPlainString()); + cvo.setTotalMaterialCost(ccost.getMaterialCost().multiply(cvo.getTotalNum()).setScale(2, RoundingMode.UP).toPlainString()); + cvo.setPaintCost(ccost.getPaintCost().setScale(2, RoundingMode.UP).toPlainString()); + cvo.setTotalPaintCost(ccost.getPaintCost().multiply(cvo.getTotalNum()).setScale(2, RoundingMode.UP).toPlainString()); + cvo.setDirectManualProductionCost(ccost.getDirectManualProductionCost().multiply(cvo.getTotalNum()).setScale(2, RoundingMode.UP).toPlainString()); + cvo.setTotalDirectManualProductionCost(ccost.getDirectManualProductionCost().setScale(2, RoundingMode.UP).toPlainString()); + cvo.setAuxiliaryManufacturingCost(ccost.getAuxiliaryManufacturingCost().setScale(2, RoundingMode.UP).toPlainString()); + cvo.setTotalAuxiliaryManufacturingCost(ccost.getAuxiliaryManufacturingCost().multiply(cvo.getTotalNum()).setScale(2, RoundingMode.UP).toPlainString()); + cvo.setTotalCost(ccost.getTotalCost().multiply(cvo.getTotalNum())); + } else { + cvo.setPrice(ccost.isPurchasedParts() ? ccost.getPurchasedPartsCost() : ccost.getSteelsCost()); + cvo.setTotalCost(cvo.getPrice().multiply(cvo.getNum())); + } + } + pvo.getChildren().add(cvo); EBomParentEntity cparent = ebomService.getParent(child.getMaterialNo()); if (Objects.nonNull(cparent)) { - buildMultilayerChildren(cparent.getRowId(), cvo, materials, datas, recursion); + cvo.setHasChildren(cparent.getBomExist() == 1); + if (recursion) { + buildMultilayerChildren(cparent.getRowId(), cvo, materials, datas, recursion); + } } } }); @@ -159,7 +165,7 @@ public class ProductCostAnalysisService { EBomDTO cpm = materials.stream().filter(m -> StrUtil.equals(m.getMaterialNo(), element.getMaterialNo())) .findFirst() .orElse(null); - if (Objects.nonNull(cpm) && cpm.getMaterialPrice().compareTo(price) > 0) { + if (Objects.nonNull(cpm) && BigDecimalUtil.compareTo(cpm.getMaterialPrice(), price) > 0) { element.setMaterialDesc(cpm.getMaterialDesc()); element.setMaterialCategoryName(cpm.getCategoryName()); element.setMaterialUnit(cpm.getMaterialUnit()); @@ -168,6 +174,7 @@ public class ProductCostAnalysisService { element.setInventory(cpm.getInventory()); element.setLeadTime(cpm.getLeadTime()); element.setPrice(cpm.getMaterialPrice()); + element.setTotalPrice(element.getPrice().multiply(element.getNum())); } else { iterator.remove(); } @@ -192,8 +199,6 @@ public class ProductCostAnalysisService { if (Objects.isNull(cvo)) { cvo = new MaterialCostVO(); cvo.setMaterialNo(child.getMaterialNo()); - cvo.setTotalPrice(ccost.getTotalCost().multiply(tnum)); - //cvo.setPrice(ccost.getTotalCost()); cvo.setNum(tnum); pvo.getCosts().add(cvo); } else { @@ -209,6 +214,9 @@ public class ProductCostAnalysisService { } private void bindMaterialCompositionVO(BigDecimal num, EBomChildEntity child, List datas, List mvos, List pvos) { + if (StrUtil.equals(BomConstant.PROJECT_TYPE_TEMPORARY, child.getProjectType())) { + return; + } EBomCostCacheDTO dto = datas.stream().filter(d -> StrUtil.equals(d.getMaterialNo(), child.getMaterialNo())).findFirst().orElse(null); MaterialCostVO vo = null; if (dto.isPurchasedParts()) { @@ -280,6 +288,9 @@ public class ProductCostAnalysisService { } private void bindMaterialTypeCompositionVO(BigDecimal num, EBomChildEntity child, List datas, List vos) { + if (StrUtil.equals(BomConstant.PROJECT_TYPE_TEMPORARY, child.getProjectType())) { + return; + } EBomCostCacheDTO dto = datas.stream().filter(d -> StrUtil.equals(d.getMaterialNo(), child.getMaterialNo())).findFirst().orElse(null); MaterialCostVO vo = vos.stream().filter(v -> Objects.equals(v.getMaterialNo(), child.getMaterialNo())).findFirst().orElseGet(() -> { MaterialCostVO v = new MaterialCostVO(); @@ -289,9 +300,9 @@ public class ProductCostAnalysisService { vos.add(v); return v; }); - final BigDecimal nt = vo.getNum().add(num.multiply(child.getNum())); - vo.setNum(vo.getNum().add(nt)); - vo.setTotalPrice(vo.getNum().multiply(dto.getTotalCost())); + final BigDecimal nt = num.multiply(child.getNum()); + //vo.setNum(BigDecimal.ONE); + vo.setTotalPrice(vo.getTotalPrice().add(nt.multiply(dto.getTotalCost()))); EBomParentEntity parent = ebomService.getParent(child.getMaterialNo()); if (Objects.nonNull(parent)) { List children = ebomService.getChildren(parent.getRowId()); @@ -313,14 +324,15 @@ public class ProductCostAnalysisService { vos.forEach(v -> { String code = StrUtil.sub(v.getCategoryCode(), 0, 4); String type = categories.stream().filter(c -> StrUtil.equals(c.get("category_code"), code)).findFirst().map(m -> m.get("category_name")).orElse(null); - MaterialTypeCompositionVO vv = rvos.stream().filter(r -> StrUtil.equals(r.getMaterialCategoryName(), type)).findFirst() + MaterialTypeCompositionVO vv = rvos.stream().filter(r -> StrUtil.equals(r.getMaterialCategoryCode(), code)).findFirst() .orElseGet(() -> { MaterialTypeCompositionVO rv = new MaterialTypeCompositionVO(); + rv.setMaterialCategoryCode(code); rv.setMaterialCategoryName(type); rvos.add(rv); return rv; }); - vv.setNum(vv.getNum().add(v.getNum())); + vv.setNum(vv.getNum().add(BigDecimal.ONE)); vv.setTotalCost(vv.getTotalCost().add(v.getTotalPrice())); }); return rvos; diff --git a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/util/BigDecimalUtil.java b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/util/BigDecimalUtil.java index e19c45b2..69478fa0 100644 --- a/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/util/BigDecimalUtil.java +++ b/nflg_project_dev/nflg-technology/src/main/java/com/nflg/product/technology/util/BigDecimalUtil.java @@ -58,4 +58,17 @@ public class BigDecimalUtil { return value.intValue(); } } + + public static int compareTo(BigDecimal v1, BigDecimal v2) { + if (v1 == null && v2 == null) { + return 0; + } + if (v2 == null) { + return 1; + } + if (v1 == null) { + return -1; + } + return v1.compareTo(v2); + } }