From d1760bc1d708cd0a4e3e5fd4032b94b70b4a0709 Mon Sep 17 00:00:00 2001 From: "BF-202309241046\\Administrator" Date: Thu, 4 Jul 2024 22:26:34 +0800 Subject: [PATCH] =?UTF-8?q?Ebom=E6=8A=A5=E8=A1=A8=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/vo/BomNewEbomParentFormalVO.java | 598 +++++++++--------- .../bomnew/pojo/vo/ForwardReportVO.java | 17 +- .../bomnew/service/CompareReportService.java | 1 + .../service/domain/BaseForwardReport.java | 11 +- .../domain/EBom/EBomFormalTreeTask.java | 2 +- .../domain/EBom/EBomForwardReport.java | 374 ++++++++--- 6 files changed, 626 insertions(+), 377 deletions(-) diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewEbomParentFormalVO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewEbomParentFormalVO.java index 40bd3bb9..8d0c1262 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewEbomParentFormalVO.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewEbomParentFormalVO.java @@ -22,305 +22,305 @@ import java.util.Objects; @Data @Accessors(chain = true) @ApiModel(value = "com-nflg-product-bomnew-pojo-new-vo-BomNewEbomParentFormalVO") -public class BomNewEbomParentFormalVO extends BaseMaterialVO implements Serializable { - - /** - * 主键行ID-雪花 - */ - @ApiModelProperty(value = "主键行ID-雪花") - private Long rowId; - - /** - * 批号-来自plm-临时 - */ - @ApiModelProperty(value = "批号-来自plm-临时") - private String batchNo; - - - - @ApiModelProperty("物料BOM版本ID") - private Long bomRowId=0L; - - @ApiModelProperty("父级行ID") - private Long parentRowId=0L; - - - @ApiModelProperty("物料bom行ID") - private Long childBomRowId; - - - /** - * 排序号 - */ - @ApiModelProperty(value = "排序号") - private String orderNumber; - - - - - /** - * 单重 - */ - @ApiModelProperty(value = "单重") - private BigDecimal unitWeight; - - /** - * 总重 - */ - @ApiModelProperty(value = "总重") - private BigDecimal totalWeight; - - /** - * 版本号 - */ - @ApiModelProperty(value = "版本号") - private String currentVersion; - - /** - * 数量 - */ - @ApiModelProperty(value = "数量") - private BigDecimal num; - - /** - * 来源1-原BOM转换 2-EXCE导入 3-MDM创建 - */ - @ApiModelProperty(value = "来源1-原BOM转换 2-EXCE导入 3-MDM创建") - private Integer source; - - - - /** - * 项目类别输入方式: 0-自动匹配 1-手工录入 3-来自物料主数据 4-来自历史统计 - */ - @ApiModelProperty(value = "项目类别输入方式: 0-自动匹配 1-手工录入 3-来自物料主数据 4-来自历史统计") - private Integer projectTypeInputType; - - /** - * 是否跟节点 0-否 1-是 - */ - @ApiModelProperty(value = "是否跟节点 0-否 1-是") - private Integer rootIs; - - /** - * 是否应该有BOM 0-否 1-是 - */ - @ApiModelProperty(value = "是否应该有BOM 0-否 1-是") - private Integer shouldBomExist; - - /** - * 超级物料 0-否 1-是 - */ - @ApiModelProperty(value = "超级物料 0-否 1-是") - private Integer superMaterialStatus; - - /** - * 是否有BOM: 0-否 1-是 - */ - @ApiModelProperty(value = "是否有BOM: 0-否 1-是") - private Integer bomExist; - - - public Integer getBomExist(){ - if(Objects.isNull(bomExist)){ - bomExist=0; - } - return bomExist; - } - - /** - * 是否最新版:0-否 1-是 - */ - @ApiModelProperty(value = "是否最新版:0-否 1-是") - private Integer lastVersionIs; - - /** - * 1=待处理、2=已处理 - */ - @ApiModelProperty(value = "1=待处理、2=已处理") - private Integer editStatus; - - /** - * 1=待复核、2=已复核、3=已退回、4=定版(已发布PBOM) - */ - @ApiModelProperty(value = "1=待复核、2=已复核、3=已退回、4=定版(已发布PBOM)99=借用件 100=引用件") - private Integer status; - - /** - * 是否用户跟节点 0-否 1-是 - */ - @ApiModelProperty(value = "是否用户跟节点 0-否 1-是") - private Integer userRootIs; - - /** - * 异常状态:1=正常、2=冻结/完全弃用异常、3=递归异常、4=数据不完整异常、5=超级物料异常、6=重复异常 - */ - @ApiModelProperty(value = "异常状态:1=正常、2=冻结/完全弃用异常、3=递归异常、4=数据不完整异常、5=超级物料异常、6=重复异常 7=物料主数据不存在 8=项目类别为空 9=项目赋值异常(父级物料的项目类型为Q时,子级中不能存在项目类别为Q的物料) 10=项目赋值异常(当父级物料的项目类型为F时,子级中不能存在项目类型为F的物料) 11=未填写变更原因和技术通知单 12=数量需要用户确认 13=项目类型需要用户确认") - private Integer exceptionStatus; - - /** - * 来源行ID(原始BOM中的行ID) - */ - @ApiModelProperty(value = "来源行ID(原始BOM中的行ID)") - private String sourceRowId; - - /** - * 设计人员编码 - */ - @ApiModelProperty(value = "设计人员编码") - private String deviseUserCode; - - /** - * 设计人员名称 - */ - @ApiModelProperty(value = "设计人员名称") - private String deviseName; - - - - - /** - * 创建人编码 - */ - @ApiModelProperty(value = "创建人编码") - private String createdBy; - - /** - * 创建时间 - */ - @ApiModelProperty(value = "创建时间") - private LocalDateTime createdTime; - - /** - * 创建人员所属岗位 0-设计人员 1-工艺人员 2-其他 - */ - @ApiModelProperty(value = "创建人员所属岗位 0-设计人员 1-工艺人员 2-其他") - private Integer createdJob; - - /** - * 复核时间 - */ - @ApiModelProperty(value = "复核时间") - private LocalDateTime auditTime; - - /** - * 复核人 - */ - @ApiModelProperty(value = "复核人") - private String auditUserName; - - /** - * 发布时间 - */ - @ApiModelProperty(value = "发布时间") - private LocalDateTime releaseTime; - - /** - * 发布人 - */ - @ApiModelProperty(value = "发布人") - private String releaseUserName; - - /** - * 退回时间 - */ - @ApiModelProperty(value = "退回时间") - private LocalDateTime revertTime; - - /** - * 退回人 - */ - @ApiModelProperty(value = "退回人") - private String revertUserName; - - /** - * 版本过期时间=下个版本的创建时间 - */ - @ApiModelProperty(value = "版本过期时间=下个版本的创建时间") - private LocalDateTime expireEndTime; - - - public LocalDateTime getExpireEndTime(){ - // new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("9999-12-31 23:59:59"); - - return LocalDateTime.parse("9999-12-31 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - - } - - - /** - * 转换pbom时间 - */ - @ApiModelProperty(value = "转换pbom时间") - private LocalDateTime convertToEbomTime; - - /** - * 备注 - */ - @ApiModelProperty(value = "备注") - private String remark; - - /** - * 设计维护部门名称 - */ - @ApiModelProperty(value = "设计维护部门名称") - private String deptName; - - /** - * bom树的高度 - */ - @ApiModelProperty(value = "bom树的高度") - private Integer levelNum; - - /** - * 升版说明 - */ - @ApiModelProperty(value = "升版说明") - private String changeDesc; - - /** - * 通知单号 - */ - @ApiModelProperty(value = "通知单号") - private String noticeNums; - - /** - * 修改时间 - */ - @ApiModelProperty(value = "修改时间") - private LocalDateTime modifyTime; - - @ApiModelProperty("bom层级数") - private BigDecimal levelNumber; - - @ApiModelProperty("层级号如:1-1") - private String levelNo; - - @ApiModelProperty("来源行-父项物料编码") - private String sourceParentMaterialNo; - - @ApiModelProperty("是否虚拟包 0-否 1-是") - private Integer virtualPackageIs; - - - - - - @ApiModelProperty("是否虚拟件") - private Integer virtualPartIs; - - @ApiModelProperty("0-非虚拟包 1-发货包 2-制作包 4-直发包 8-发货前装配包") - private Integer virtualPartType=0; - - @ApiModelProperty("生成虚拟包的跟节点物料编码") - private String virtualPartRootMaterialNo; - - - - - private List childNodes = Collections.emptyList(); - - private static final long serialVersionUID = 1L; +public class BomNewEbomParentFormalVO extends BomNewEbomParentVO { +// +// /** +// * 主键行ID-雪花 +// */ +// @ApiModelProperty(value = "主键行ID-雪花") +// private Long rowId; +// +// /** +// * 批号-来自plm-临时 +// */ +// @ApiModelProperty(value = "批号-来自plm-临时") +// private String batchNo; +// +// +// +// @ApiModelProperty("物料BOM版本ID") +// private Long bomRowId=0L; +// +// @ApiModelProperty("父级行ID") +// private Long parentRowId=0L; +// +// +// @ApiModelProperty("物料bom行ID") +// private Long childBomRowId; +// +// +// /** +// * 排序号 +// */ +// @ApiModelProperty(value = "排序号") +// private String orderNumber; +// +// +// +// +// /** +// * 单重 +// */ +// @ApiModelProperty(value = "单重") +// private BigDecimal unitWeight; +// +// /** +// * 总重 +// */ +// @ApiModelProperty(value = "总重") +// private BigDecimal totalWeight; +// +// /** +// * 版本号 +// */ +// @ApiModelProperty(value = "版本号") +// private String currentVersion; +// +// /** +// * 数量 +// */ +// @ApiModelProperty(value = "数量") +// private BigDecimal num; +// +// /** +// * 来源1-原BOM转换 2-EXCE导入 3-MDM创建 +// */ +// @ApiModelProperty(value = "来源1-原BOM转换 2-EXCE导入 3-MDM创建") +// private Integer source; +// +// +// +// /** +// * 项目类别输入方式: 0-自动匹配 1-手工录入 3-来自物料主数据 4-来自历史统计 +// */ +// @ApiModelProperty(value = "项目类别输入方式: 0-自动匹配 1-手工录入 3-来自物料主数据 4-来自历史统计") +// private Integer projectTypeInputType; +// +// /** +// * 是否跟节点 0-否 1-是 +// */ +// @ApiModelProperty(value = "是否跟节点 0-否 1-是") +// private Integer rootIs; +// +// /** +// * 是否应该有BOM 0-否 1-是 +// */ +// @ApiModelProperty(value = "是否应该有BOM 0-否 1-是") +// private Integer shouldBomExist; +// +// /** +// * 超级物料 0-否 1-是 +// */ +// @ApiModelProperty(value = "超级物料 0-否 1-是") +// private Integer superMaterialStatus; +// +// /** +// * 是否有BOM: 0-否 1-是 +// */ +// @ApiModelProperty(value = "是否有BOM: 0-否 1-是") +// private Integer bomExist; +// +// +// public Integer getBomExist(){ +// if(Objects.isNull(bomExist)){ +// bomExist=0; +// } +// return bomExist; +// } +// +// /** +// * 是否最新版:0-否 1-是 +// */ +// @ApiModelProperty(value = "是否最新版:0-否 1-是") +// private Integer lastVersionIs; +// +// /** +// * 1=待处理、2=已处理 +// */ +// @ApiModelProperty(value = "1=待处理、2=已处理") +// private Integer editStatus; +// +// /** +// * 1=待复核、2=已复核、3=已退回、4=定版(已发布PBOM) +// */ +// @ApiModelProperty(value = "1=待复核、2=已复核、3=已退回、4=定版(已发布PBOM)99=借用件 100=引用件") +// private Integer status; +// +// /** +// * 是否用户跟节点 0-否 1-是 +// */ +// @ApiModelProperty(value = "是否用户跟节点 0-否 1-是") +// private Integer userRootIs; +// +// /** +// * 异常状态:1=正常、2=冻结/完全弃用异常、3=递归异常、4=数据不完整异常、5=超级物料异常、6=重复异常 +// */ +// @ApiModelProperty(value = "异常状态:1=正常、2=冻结/完全弃用异常、3=递归异常、4=数据不完整异常、5=超级物料异常、6=重复异常 7=物料主数据不存在 8=项目类别为空 9=项目赋值异常(父级物料的项目类型为Q时,子级中不能存在项目类别为Q的物料) 10=项目赋值异常(当父级物料的项目类型为F时,子级中不能存在项目类型为F的物料) 11=未填写变更原因和技术通知单 12=数量需要用户确认 13=项目类型需要用户确认") +// private Integer exceptionStatus; +// +// /** +// * 来源行ID(原始BOM中的行ID) +// */ +// @ApiModelProperty(value = "来源行ID(原始BOM中的行ID)") +// private String sourceRowId; +// +// /** +// * 设计人员编码 +// */ +// @ApiModelProperty(value = "设计人员编码") +// private String deviseUserCode; +// +// /** +// * 设计人员名称 +// */ +// @ApiModelProperty(value = "设计人员名称") +// private String deviseName; +// +// +// +// +// /** +// * 创建人编码 +// */ +// @ApiModelProperty(value = "创建人编码") +// private String createdBy; +// +// /** +// * 创建时间 +// */ +// @ApiModelProperty(value = "创建时间") +// private LocalDateTime createdTime; +// +// /** +// * 创建人员所属岗位 0-设计人员 1-工艺人员 2-其他 +// */ +// @ApiModelProperty(value = "创建人员所属岗位 0-设计人员 1-工艺人员 2-其他") +// private Integer createdJob; +// +// /** +// * 复核时间 +// */ +// @ApiModelProperty(value = "复核时间") +// private LocalDateTime auditTime; +// +// /** +// * 复核人 +// */ +// @ApiModelProperty(value = "复核人") +// private String auditUserName; +// +// /** +// * 发布时间 +// */ +// @ApiModelProperty(value = "发布时间") +// private LocalDateTime releaseTime; +// +// /** +// * 发布人 +// */ +// @ApiModelProperty(value = "发布人") +// private String releaseUserName; +// +// /** +// * 退回时间 +// */ +// @ApiModelProperty(value = "退回时间") +// private LocalDateTime revertTime; +// +// /** +// * 退回人 +// */ +// @ApiModelProperty(value = "退回人") +// private String revertUserName; +// +// /** +// * 版本过期时间=下个版本的创建时间 +// */ +// @ApiModelProperty(value = "版本过期时间=下个版本的创建时间") +// private LocalDateTime expireEndTime; +// +// +// public LocalDateTime getExpireEndTime(){ +// // new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("9999-12-31 23:59:59"); +// +// return LocalDateTime.parse("9999-12-31 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); +// +// } +// +// +// /** +// * 转换pbom时间 +// */ +// @ApiModelProperty(value = "转换pbom时间") +// private LocalDateTime convertToEbomTime; +// +// /** +// * 备注 +// */ +// @ApiModelProperty(value = "备注") +// private String remark; +// +// /** +// * 设计维护部门名称 +// */ +// @ApiModelProperty(value = "设计维护部门名称") +// private String deptName; +// +// /** +// * bom树的高度 +// */ +// @ApiModelProperty(value = "bom树的高度") +// private Integer levelNum; +// +// /** +// * 升版说明 +// */ +// @ApiModelProperty(value = "升版说明") +// private String changeDesc; +// +// /** +// * 通知单号 +// */ +// @ApiModelProperty(value = "通知单号") +// private String noticeNums; +// +// /** +// * 修改时间 +// */ +// @ApiModelProperty(value = "修改时间") +// private LocalDateTime modifyTime; +// +// @ApiModelProperty("bom层级数") +// private BigDecimal levelNumber; +// +// @ApiModelProperty("层级号如:1-1") +// private String levelNo; +// +// @ApiModelProperty("来源行-父项物料编码") +// private String sourceParentMaterialNo; +// +// @ApiModelProperty("是否虚拟包 0-否 1-是") +// private Integer virtualPackageIs; +// +// +// +// +// +// @ApiModelProperty("是否虚拟件") +// private Integer virtualPartIs; +// +// @ApiModelProperty("0-非虚拟包 1-发货包 2-制作包 4-直发包 8-发货前装配包") +// private Integer virtualPartType=0; +// +// @ApiModelProperty("生成虚拟包的跟节点物料编码") +// private String virtualPartRootMaterialNo; +// +// +// +// +// private List childNodes = Collections.emptyList(); +// +// private static final long serialVersionUID = 1L; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ForwardReportVO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ForwardReportVO.java index ff61407a..393fcc65 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ForwardReportVO.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/ForwardReportVO.java @@ -1,9 +1,11 @@ package com.nflg.product.bomnew.pojo.vo; +import cn.hutool.core.util.NumberUtil; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; +import java.text.DecimalFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Collections; @@ -54,6 +56,18 @@ public class ForwardReportVO extends BaseMaterialVO { @ApiModelProperty(value = "数量") private BigDecimal num; + public BigDecimal getNum(){ + + if(Objects.nonNull(num)) { + DecimalFormat df2 = new DecimalFormat("#.####"); + + return new BigDecimal(df2.format(num)); + } + return num; + } + + + /** * 单重 */ @@ -70,7 +84,8 @@ public class ForwardReportVO extends BaseMaterialVO { private String createdBy; @ApiModelProperty(value = "设计人") private String deviseName; - + @ApiModelProperty(value = "设计人员编码") + private String deviseUserCode; @ApiModelProperty(value = "创建时间-有效开始时间") private LocalDateTime createdTime; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/CompareReportService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/CompareReportService.java index c634fc33..1552a46f 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/CompareReportService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/CompareReportService.java @@ -325,6 +325,7 @@ public class CompareReportService { } ForwardReportVO fromParent = leftBomRowIdMap.get(from.getParentRowId()).get(0); ForwardReportVO toParent = rightBomRowIdMap.get(to.getParentRowId()).get(0); + if (!compareFunc.apply(fromParent).equals(compareFunc.apply(toParent))) { compareReportVO.setSymbol(ReportConstant.SymbolEnum.NON_EQ.getValue()); continue; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/BaseForwardReport.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/BaseForwardReport.java index ce7d8653..8d0b2011 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/BaseForwardReport.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/BaseForwardReport.java @@ -28,7 +28,7 @@ public abstract class BaseForwardReport { protected void sumLevel(List bomList) { //分层统计,避免使用遍历树统计 Map> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getLevelNum)); - Map> bomParentMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); + Map> bomParentMap = bomList.stream().filter(u->Objects.nonNull(u.getParentRowId())&&u.getParentRowId()>0).collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); listMap.forEach((key, value) -> { value.forEach(parent -> { List dataList = bomParentMap.get(parent.getBomRowId()); @@ -53,6 +53,9 @@ public abstract class BaseForwardReport { protected List leafMergeMaterialNo(List convertBomList) { //无子级的数据 List leafList = convertBomList.stream().filter(item -> (item.getBomRowId() == null || item.getBomRowId().longValue() == 0)).collect(Collectors.toList()); + + + //相同物料合并统计 Map> materialNoListMap = leafList.stream().collect(Collectors.groupingBy(ForwardReportVO::getMaterialNo)); List sumList = new ArrayList<>(); @@ -116,11 +119,11 @@ public abstract class BaseForwardReport { */ protected List listToList(List bomList, Long parentRowId) { - Map> listMap = bomList.stream().collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); + Map> listMap = bomList.stream().filter(item ->Objects.nonNull(item.getParentRowId())&&item.getParentRowId()>0).collect(Collectors.groupingBy(ForwardReportVO::getParentRowId)); //第一层数据 - List parentChildList = bomList.stream().filter(item -> Objects.equals(parentRowId, item.getParentRowId())).collect(Collectors.toList()); + List parentChildList = bomList.stream().filter(item -> Objects.equals(parentRowId, item.getRowId())).collect(Collectors.toList()); //无bom数据直接展示 - List rootList = parentChildList.stream().filter(item -> item.getBomRowId() == null || item.getBomRowId().longValue() == 0).collect(Collectors.toList()); + List rootList = parentChildList.stream().filter(item -> Objects.isNull(item.getBomRowId()) || item.getBomRowId().longValue() == 0).collect(Collectors.toList()); //第一层数据有bom List moreBomList = parentChildList.stream().filter(item -> item.getBomRowId() != null && item.getBomRowId().longValue() > 0).collect(Collectors.toList()); //采用前序遍历 前->左->右 输出 diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomFormalTreeTask.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomFormalTreeTask.java index 18a2d8e2..d0abc259 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomFormalTreeTask.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomFormalTreeTask.java @@ -29,7 +29,7 @@ public class EBomFormalTreeTask extends RecursiveTask bomDetail; - + private boolean isNewVersion; @Getter @Setter diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomForwardReport.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomForwardReport.java index 7bdef0d9..1a74755b 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomForwardReport.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomForwardReport.java @@ -4,29 +4,28 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.TypeReference; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.common.collect.ImmutableList; import com.nflg.product.bomnew.constant.EBomConstant; import com.nflg.product.bomnew.constant.OriginalConstant; import com.nflg.product.bomnew.constant.ReportConstant; +import com.nflg.product.bomnew.pojo.entity.BomNewEbomParentEntity; import com.nflg.product.bomnew.pojo.entity.BomNewEbomParentFormalEntity; import com.nflg.product.bomnew.pojo.query.ReverseReportQuery; -import com.nflg.product.bomnew.pojo.vo.BomNewEbomParentFormalVO; -import com.nflg.product.bomnew.pojo.vo.ForwardReportVO; -import com.nflg.product.bomnew.pojo.vo.ReportBomVO; -import com.nflg.product.bomnew.pojo.vo.ReportBomVersionVO; +import com.nflg.product.bomnew.pojo.vo.*; import com.nflg.product.bomnew.service.BomNewEbomParentFormalService; +import com.nflg.product.bomnew.service.BomNewEbomParentService; import com.nflg.product.bomnew.service.MaterialMainService; import com.nflg.product.bomnew.service.domain.BaseForwardReport; +import com.nflg.product.bomnew.util.FieldGetterUtil; import com.nflg.product.bomnew.util.ListCommonUtil; import com.nflg.product.bomnew.util.MaterialshouldBomExistUtil; import com.nflg.product.bomnew.util.VersionUtil; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.atomic.AtomicInteger; @@ -43,6 +42,12 @@ public class EBomForwardReport extends BaseForwardReport { super(query); } + boolean isNewVersion(){ + if (query.getVersionStrategy().compareTo(ReportConstant.VersionStrategyEnum.NEW.getValue()) == 0) { + return true; + } + return false; + } QueryWrapper buildQuery() { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -62,10 +67,41 @@ public class EBomForwardReport extends BaseForwardReport { } + return queryWrapper; } + + + + + public void buildQueryParam( QueryWrapper queryWrapper) { + + queryWrapper .eq(FieldGetterUtil.getFieldInfo(BomNewEbomParentEntity::getMaterialNo), query.getMaterialNo()); + if (StrUtil.isNotBlank(query.getDrawingNo())) { + queryWrapper .eq(FieldGetterUtil.getFieldInfo(BomNewEbomParentEntity::getDrawingNo), query.getDrawingNo()); + } + if (query.getVersionStrategy().compareTo(ReportConstant.VersionStrategyEnum.DEFINE.getValue()) == 0) { + queryWrapper .eq(FieldGetterUtil.getFieldInfo(BomNewEbomParentEntity::getCurrentVersion), query.getBomVersion()); + }else if(query.getVersionStrategy().compareTo(ReportConstant.VersionStrategyEnum.ALL.getValue()) == 0 + && StrUtil.isNotEmpty(query.getBomVersion())){ + queryWrapper .eq(FieldGetterUtil.getFieldInfo(BomNewEbomParentEntity::getCurrentVersion), query.getBomVersion()); + } + + if (StrUtil.isNotBlank(query.getStartDate()) && StrUtil.isNotBlank(query.getEndDate())) { + queryWrapper .ge(FieldGetterUtil.getFieldInfo(BomNewEbomParentEntity::getCreatedTime), query.getStartDate()) + .le(FieldGetterUtil.getFieldInfo(BomNewEbomParentEntity::getConvertToEbomTime), query.getEndDate()); + + } + + } + + + + + + List getParent() { QueryWrapper queryWrapper = buildQuery(); List list = SpringUtil.getBean(BomNewEbomParentFormalService.class).list(queryWrapper); @@ -75,6 +111,139 @@ public class EBomForwardReport extends BaseForwardReport { return list; } + List getParentV2() { + + List rlist=null; + + if(isNewVersion()){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + buildQueryParam(queryWrapper); + List list = SpringUtil.getBean(BomNewEbomParentService.class).list(queryWrapper); + rlist=Convert.convert(new TypeReference>() { + }, list); + }else{ + QueryWrapper queryWrapper = new QueryWrapper<>(); + buildQueryParam(queryWrapper); + List list = SpringUtil.getBean(BomNewEbomParentFormalService.class).list(queryWrapper); + rlist=Convert.convert(new TypeReference>() { + }, list); + } + + if(CollUtil.isNotEmpty(rlist)){ + rlist.forEach(item->{ + item.setBomRowId(item.getRowId()); + }); + } + + return rlist; + } + + + + List< BomNewEbomParentVO> getParentChildList(List bomRowId){ + List< BomNewEbomParentVO> parentChildList=null; + if(isNewVersion()){ + parentChildList = SpringUtil.getBean(BomNewEbomParentService.class).getParentChildBatch(bomRowId); + }else{ + List< BomNewEbomParentFormalVO > childList= SpringUtil.getBean(BomNewEbomParentFormalService.class).getParentChildBatch(bomRowId); + if(CollUtil.isNotEmpty(childList)){ + parentChildList =(List< BomNewEbomParentVO>)(List)childList; + + // parentChildList= Collections.unmodifiableList(childList ); + + + } + + } + return parentChildList; + } + + List< BomNewEbomParentVO> getParentList(List bomRowId){ + List< BomNewEbomParentVO> parentList=null; + if(isNewVersion()){ + List bomlist = SpringUtil.getBean(BomNewEbomParentService.class).lambdaQuery().in(BomNewEbomParentEntity::getRowId, bomRowId).list(); + parentList=Convert.convert(new TypeReference>() { + },bomlist); + }else{ + + List bomlist = SpringUtil.getBean(BomNewEbomParentFormalService.class).lambdaQuery().in(BomNewEbomParentFormalEntity::getRowId, bomRowId).list(); + + parentList=Convert.convert(new TypeReference>() { + },bomlist); + + } + return parentList; + } + + /* + + bom 子级同步有bom版本号 + */ + + void bomUpAndLowLevel( List parent,List< BomNewEbomParentVO> parentChildList,int levelNum,AtomicInteger orderNum){ + + if (CollectionUtil.isNotEmpty(parentChildList)) { + + List bomRowIds = parentChildList.stream().filter(u -> Objects.nonNull(u.getBomRowId()) && u.getBomRowId() > 0).map(BomNewEbomParentVO::getBomRowId).collect(Collectors.toList()); + Map parentEntityMap=null; + if(CollUtil.isNotEmpty(bomRowIds)) { + List< BomNewEbomParentVO> bomlist = getParentList(bomRowIds); + + parentEntityMap = ListCommonUtil.listToMap(bomlist, BomNewEbomParentVO::getRowId); + } + + Map noBomParentEntityMap=ListCommonUtil.listToMap(parent, BomNewEbomParentVO::getRowId); + + + for (BomNewEbomParentVO vo : + parentChildList) { + + if (Objects.nonNull(parentEntityMap) && parentEntityMap.containsKey(vo.getBomRowId())) { + // vo.setCreatedTime(forwardReportVO.getCreatedTime()); + // vo.setExpireEndTime(parentFormal.getConvertToEbomTime()); + + BomNewEbomParentVO ebomParentEntity = parentEntityMap.get(vo.getBomRowId()); + vo.setLevelNum(levelNum); + vo.setOrderNumber(orderNum.getAndIncrement() + ""); + vo.setDeviseName(ebomParentEntity.getDeviseName()); + vo.setDeviseUserCode(ebomParentEntity.getDeviseUserCode()); + vo.setCurrentVersion(ebomParentEntity.getCurrentVersion()); + + } else { + vo.setLevelNum(levelNum); + vo.setOrderNumber(orderNum.getAndIncrement() + ""); + + if(Objects.nonNull(noBomParentEntityMap) && noBomParentEntityMap.containsKey(vo.getParentRowId())){ + BomNewEbomParentVO parentVO=noBomParentEntityMap.get(vo.getParentRowId()); + vo.setDeviseName(parentVO.getDeviseName()); + vo.setDeviseUserCode(parentVO.getDeviseUserCode()); + + } + + + + if (MaterialshouldBomExistUtil.checkShouldBomExist(vo)) { + vo.setCurrentVersion(OriginalConstant.NO_BOM_VERSION); + } else { + vo.setCurrentVersion(OriginalConstant.DEFAULT_BOM_VERSION); + } + + + } + + } + + + + // Collections.sort(nodeList, (option0, option1) -> option0.getOrderNumber().compareTo(option1.getOrderNumber())); + + } + + + } + + + /** * 最大的版本号 * @@ -107,68 +276,73 @@ public class EBomForwardReport extends BaseForwardReport { */ ReportBomVO singleReport() { - List listParent = getParent(); + List< BomNewEbomParentVO> listParent = getParentV2(); if (CollUtil.isEmpty(listParent)) { return null; } - BomNewEbomParentFormalEntity parentFormal0 = listParent.get(0); - ForwardReportVO forwardReportVO = Convert.convert(ForwardReportVO.class, parentFormal0); + + ForwardReportVO forwardReportVO =Convert.convert( ForwardReportVO.class,listParent.get(0)); List nodesList = new ArrayList<>(); - for (BomNewEbomParentFormalEntity parentFormal : listParent) { + for (BomNewEbomParentVO parentFormal : listParent) { + List< BomNewEbomParentVO> parentChildList = getParentChildList(ImmutableList.of(parentFormal.getRowId())); - List parentChildList = SpringUtil.getBean(BomNewEbomParentFormalService.class).getParentChild(parentFormal.getRowId()); initMaterialInfo(parentChildList); + AtomicInteger orderNum = new AtomicInteger(1); + parentFormal.setLevelNum(1); + parentFormal.setOrderNumber(orderNum.getAndIncrement()+""); + nodesList.add(Convert.convert(ForwardReportVO.class,parentFormal)); +// if (CollectionUtil.isNotEmpty(parentChildList)) { +// +// List bomRowIds = parentChildList.stream().filter(u -> Objects.nonNull(u.getBomRowId()) && u.getBomRowId() > 0).map(BomNewEbomParentVO::getBomRowId).collect(Collectors.toList()); +// Map parentEntityMap=null; +// if(CollUtil.isNotEmpty(bomRowIds)) { +// List< BomNewEbomParentVO> bomlist = getParentList(bomRowIds); +// +// parentEntityMap = ListCommonUtil.listToMap(bomlist, BomNewEbomParentVO::getRowId); +// } +// +// for (BomNewEbomParentVO vo : +// parentChildList) { +// +// if (Objects.nonNull(parentEntityMap) && parentEntityMap.containsKey(vo.getBomRowId())) { +// // vo.setCreatedTime(forwardReportVO.getCreatedTime()); +// // vo.setExpireEndTime(parentFormal.getConvertToEbomTime()); +// +// BomNewEbomParentVO ebomParentEntity = parentEntityMap.get(vo.getBomRowId()); +// vo.setLevelNum(2); +// vo.setOrderNumber(orderNum.incrementAndGet() + ""); +// vo.setDeviseName(ebomParentEntity.getDeviseName()); +// vo.setDeviseUserCode(ebomParentEntity.getDeviseUserCode()); +// vo.setCurrentVersion(ebomParentEntity.getCurrentVersion()); +// +// +// } else { +// vo.setLevelNum(2); +// vo.setOrderNumber(orderNum.incrementAndGet() + ""); +// vo.setDeviseName(parentFormal.getDeviseName()); +// vo.setDeviseUserCode(parentFormal.getDeviseUserCode()); +// if (MaterialshouldBomExistUtil.checkShouldBomExist(vo)) { +// vo.setCurrentVersion(OriginalConstant.NO_BOM_VERSION); +// } else { +// vo.setCurrentVersion(OriginalConstant.DEFAULT_BOM_VERSION); +// } +// +// +// } +// +// } +// +// +// +// // Collections.sort(nodeList, (option0, option1) -> option0.getOrderNumber().compareTo(option1.getOrderNumber())); +// +// } - if (CollectionUtil.isNotEmpty(parentChildList)) { - - List bomRowIds = parentChildList.stream().filter(u -> Objects.nonNull(u.getBomRowId()) && u.getBomRowId() > 0).map(BomNewEbomParentFormalVO::getBomRowId).collect(Collectors.toList()); - Map parentEntityMap=null; - if(CollUtil.isNotEmpty(bomRowIds)) { - List bomlist = SpringUtil.getBean(BomNewEbomParentFormalService.class).lambdaQuery().in(BomNewEbomParentFormalEntity::getRowId, bomRowIds).list(); - - parentEntityMap = ListCommonUtil.listToMap(bomlist, BomNewEbomParentFormalEntity::getRowId); - } - AtomicInteger orderNum = new AtomicInteger(); - for (BomNewEbomParentFormalVO vo : - parentChildList) { - - if (Objects.nonNull(parentEntityMap) && parentEntityMap.containsKey(vo.getBomRowId())) { - // vo.setCreatedTime(forwardReportVO.getCreatedTime()); - // vo.setExpireEndTime(parentFormal.getConvertToEbomTime()); - - BomNewEbomParentFormalEntity ebomParentEntity = parentEntityMap.get(vo.getBomRowId()); - vo.setLevelNum(1); - vo.setOrderNumber(orderNum.incrementAndGet() + ""); - vo.setDeviseName(ebomParentEntity.getDeviseName()); - vo.setDeviseUserCode(ebomParentEntity.getDeviseUserCode()); - vo.setCurrentVersion(ebomParentEntity.getCurrentVersion()); - - - } else { - vo.setLevelNum(1); - vo.setOrderNumber(orderNum.incrementAndGet() + ""); - vo.setDeviseName(parentFormal.getDeviseName()); - vo.setDeviseName(parentFormal.getDeviseUserCode()); - if (MaterialshouldBomExistUtil.checkShouldBomExist(vo)) { - vo.setCurrentVersion(OriginalConstant.NO_BOM_VERSION); - } else { - vo.setCurrentVersion(OriginalConstant.DEFAULT_BOM_VERSION); - } - - - } - - } - - - - // Collections.sort(nodeList, (option0, option1) -> option0.getOrderNumber().compareTo(option1.getOrderNumber())); - - } + bomUpAndLowLevel(ImmutableList.of(parentFormal),parentChildList,2,orderNum); List nodeList = Convert.convert(new TypeReference>() { }, parentChildList); @@ -236,8 +410,65 @@ public class EBomForwardReport extends BaseForwardReport { return null; } - void initMaterialInfo(List list) { - SpringUtil.getBean(MaterialMainService.class).intiMaterialInfo(list, BomNewEbomParentFormalVO::getMaterialNo, EBomConstant.EBOM_IGNORED_FIELDS_INIT_MATERIAL_DEFAULT2); + + /** + * 迭代查询整颗树 + + * @return + */ + List bomDetailTreeList(BomNewEbomParentVO parentBomRow) { + + int levelNum = 1; + AtomicInteger orderNum = new AtomicInteger(1); + if(ObjectUtil.isNull( parentBomRow)){ + return null; + } + List voList = new ArrayList<>(); + parentBomRow.setLevelNum(levelNum); + parentBomRow.setOrderNumber(orderNum.getAndIncrement()+""); + + voList.add( parentBomRow ); + + + levelNum++; + List rowIdList = new ArrayList<>( Arrays.asList(parentBomRow.getRowId()) ); + + List parentVOList=new ArrayList<>(Arrays.asList(parentBomRow)); + + while (!rowIdList.isEmpty()) { + List< BomNewEbomParentVO> parentChildList= getParentChildList(rowIdList); + rowIdList.clear(); + if (CollUtil.isNotEmpty(parentChildList)) { + bomUpAndLowLevel(parentVOList,parentChildList,levelNum,orderNum); + + voList.addAll(parentChildList); + levelNum++; + List nextBomId = parentChildList.stream().filter(u -> ObjectUtil.isNotNull(u.getBomRowId()) && u.getBomRowId() > 0) + .map(BomNewEbomParentVO::getBomRowId).collect(Collectors.toList()); + parentVOList.clear(); + parentVOList.addAll(parentChildList.stream().filter(u -> ObjectUtil.isNotNull(u.getBomRowId()) && u.getBomRowId() > 0) + .collect(Collectors.toList())); + + if (CollUtil.isNotEmpty(nextBomId)) { + rowIdList.addAll(nextBomId); + } + + } + + } + return voList; + + } + + + + + + + + + void initMaterialInfo(List list) { + SpringUtil.getBean(MaterialMainService.class).intiMaterialInfo(list, BomNewEbomParentVO::getMaterialNo, EBomConstant.EBOM_IGNORED_FIELDS_INIT_MATERIAL_DEFAULT2); } @@ -249,18 +480,18 @@ public class EBomForwardReport extends BaseForwardReport { ReportBomVO multiReport() { - List listParent = getParent(); + List listParent = getParentV2(); if (CollUtil.isEmpty(listParent)) { return null; } - BomNewEbomParentFormalEntity parentFormal0 = listParent.get(0); + BomNewEbomParentVO parentFormal0 = listParent.get(0); ForwardReportVO forwardReportVO = Convert.convert(ForwardReportVO.class, parentFormal0); List nodesList = new ArrayList<>(); - for (BomNewEbomParentFormalEntity parentFormal : listParent) { + for (BomNewEbomParentVO parentFormal : listParent) { - List bomList = bomDetailList(parentFormal.getRowId()); + List bomList = bomDetailTreeList(parentFormal); if(CollUtil.isEmpty(bomList)){ continue; } @@ -294,37 +525,36 @@ public class EBomForwardReport extends BaseForwardReport { * @return */ ReportBomVO sumReport() { - List listParent = getParent(); + List listParent = getParentV2(); if (CollUtil.isEmpty(listParent)) { return null; } - BomNewEbomParentFormalEntity parentFormal0 = listParent.get(0); + BomNewEbomParentVO parentFormal0 = listParent.get(0); ForwardReportVO forwardReportVO = Convert.convert(ForwardReportVO.class, parentFormal0); List nodesList = new ArrayList<>(); - for (BomNewEbomParentFormalEntity parentFormal : listParent) { + for (BomNewEbomParentVO parentFormal : listParent) { - List bomList = bomDetailList(parentFormal.getRowId()); + List bomList = bomDetailTreeList(parentFormal ); if(CollUtil.isEmpty(bomList)){ continue; } List convertBomList = Convert.convert(new TypeReference>() { }, bomList); - sumLevel(convertBomList); //无子级的数据 List nodeList = leafMergeMaterialNo(convertBomList); nodesList.addAll(nodeList); - AtomicInteger orderNum = new AtomicInteger(); + AtomicInteger orderNum = new AtomicInteger(1); for (ForwardReportVO vo : nodeList) { vo.setLevelNum(1); vo.setOrderNumber(orderNum.incrementAndGet() + ""); vo.setExpireEndTime(parentFormal.getConvertToEbomTime()); - vo.setDeviseName(forwardReportVO.getDeviseName()); + // vo.setDeviseName(forwardReportVO.getDeviseName()); } }