From 140d1b80e9a012162c182ebd5b172ba9e429a6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Sun, 21 Apr 2024 10:45:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=94=B5=E6=B0=94=E4=B8=93=E7=94=A8bom?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/bomnew/api/user/DQBomApi.java | 23 ++- .../product/bomnew/constant/BomConstant.java | 2 + .../constant/EBomExceptionStatusEnum.java | 9 ++ .../master/BomNewDQbomParentMapper.java | 4 + .../pojo/entity/BomNewDQbomChildEntity.java | 21 +++ .../pojo/entity/BomNewDQbomParentEntity.java | 43 ++++++ .../bomnew/pojo/vo/BomDQbomEditDetailVO.java | 24 +++ .../product/bomnew/pojo/vo/BomNewDQbomVO.java | 29 ++++ .../BomNewDQbomExceptionCheckService.java | 142 +++++++++++++----- .../bomnew/service/DQBomImportService.java | 84 +++++++---- .../bomnew/service/DQBomParentService.java | 9 ++ .../product/bomnew/service/DQBomService.java | 131 ++++++++++++++-- .../mapper/master/BomNewDQbomParentMapper.xml | 85 +++++++++-- .../bomnew/service/test/OtherTest.java | 6 +- .../exception/BaseGlobalExceptionHandle.java | 2 +- 15 files changed, 506 insertions(+), 108 deletions(-) create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomDQbomEditDetailVO.java diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/DQBomApi.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/DQBomApi.java index 115ae4dd..5e0e386e 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/DQBomApi.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/DQBomApi.java @@ -7,6 +7,7 @@ import com.mzt.logapi.starter.annotation.LogRecord; import com.nflg.product.base.core.api.BaseApi; import com.nflg.product.bomnew.pojo.query.BomNewDQbomPageQuery; import com.nflg.product.bomnew.pojo.query.BomNewDQbomSaveQuery; +import com.nflg.product.bomnew.pojo.vo.BomDQbomEditDetailVO; import com.nflg.product.bomnew.pojo.vo.BomNewDQbomVO; import com.nflg.product.bomnew.pojo.vo.DQbomExcelVO; import com.nflg.product.bomnew.pojo.vo.OperationErrorMsgVO; @@ -84,7 +85,7 @@ public class DQBomApi extends BaseApi { @PostMapping("importBomSave") @LogRecord(success = "电气BOM-确认导入,操作结果:{{#_ret}}", bizNo = "", type = "电气BOM导入") public ResultVO importBomSave() { - dqBomImportService.save(); + dQBomService.checkException(dqBomImportService.save()); return ResultVO.success(); } @@ -115,7 +116,7 @@ public class DQBomApi extends BaseApi { * @param query 保存的数据 * @return */ - @GetMapping("temporary") + @PostMapping("temporary") @ApiOperation("暂存") public ResultVO temporary(@Valid @RequestBody @NotNull BomNewDQbomSaveQuery query) { dQBomService.save(query); @@ -140,7 +141,7 @@ public class DQBomApi extends BaseApi { * @return */ @PostMapping("deleteBom") - @ApiOperation("批量删除") + @ApiOperation("删除bom") public ResultVO deleteBom(@Valid @RequestBody @NotNull Long rowId) { dQBomService.deleteBom(rowId); return ResultVO.success(); @@ -178,8 +179,8 @@ public class DQBomApi extends BaseApi { */ @PostMapping("submit") @ApiOperation("提交") - public ResultVO submit(@Valid @RequestBody @NotNull Long bomRowId) { - dQBomService.submit(bomRowId); + public ResultVO submit(@Valid @RequestBody @NotNull BomNewDQbomSaveQuery query) { + dQBomService.submit(query); return ResultVO.success(); } @@ -206,4 +207,16 @@ public class DQBomApi extends BaseApi { dQBomService.importToSAP(rootBomRowId); return ResultVO.success(); } + + /** + * 编辑物料列表 + * @param rowId rowId + * @param bomRowId bom的rowId + * @return + */ + @GetMapping("editDetail") + @ApiOperation("编辑物料列表") + public ResultVO editDetail(@Valid @RequestParam("rowId") @NotNull Long rowId, @Valid @RequestParam("bomRowId") @NotNull Long bomRowId) { + return ResultVO.success(dQBomService.editDetail(rowId, bomRowId)); + } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/BomConstant.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/BomConstant.java index 7fd3fad3..75424e1e 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/BomConstant.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/BomConstant.java @@ -9,4 +9,6 @@ public class BomConstant { public static final String SAP_YDBOM="1"; + public static final String MATERIAL_NO_TEMPORARY_PREFIX = "TN"; + public static final String DRAWING_NO_TEMPORARY_PREFIX = "TD"; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EBomExceptionStatusEnum.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EBomExceptionStatusEnum.java index 3bf23f12..afe29dc7 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EBomExceptionStatusEnum.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EBomExceptionStatusEnum.java @@ -20,8 +20,17 @@ public enum EBomExceptionStatusEnum implements ValueEnum { //11=未填写变更原因和技术通知单 //12=数量需要用户确认 //13=项目类型需要用户确认 +/* + * 初始状态 + */ INIT(-1, ""), + /* + * 正常 + */ OK(1, "正常"), + /* + * 冻结/完全弃用异常(物料的状态冻结或者完全弃用) + */ EXCEPT_NO_2(2, "冻结/完全弃用异常(物料的状态冻结或者完全弃用)"), EXCEPT_NO_3(3, "递归异常(出现子级包含父级的异常情况)"), EXCEPT_NO_4(4, "数据不完整异常(物料编号或数量没有填写)"), diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewDQbomParentMapper.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewDQbomParentMapper.java index 9bcf2bc8..7b88b11a 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewDQbomParentMapper.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewDQbomParentMapper.java @@ -23,4 +23,8 @@ public interface BomNewDQbomParentMapper extends BaseMapper getChildren(Long bomRowId); + + List getBom(String materialNo, String drawingNo, String materialName); + + List getVOById(Long parentRowId); } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewDQbomChildEntity.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewDQbomChildEntity.java index 48b328ea..85124f1d 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewDQbomChildEntity.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewDQbomChildEntity.java @@ -121,6 +121,20 @@ public class BomNewDQbomChildEntity implements Serializable { @ApiModelProperty(value = "总重") private BigDecimal totalWeight; + /** + * 处理状态:1=待处理、2=已处理 + */ + @TableField(value = "edit_status") + @ApiModelProperty(value = "处理状态") + private Integer editStatus = 1; + + /** + * 转换状态:1=待转换、2=已转换(已发布PBOM) + */ + @TableField(value = "status") + @ApiModelProperty(value = "转换状态") + private Integer status = 1; + /** * 异常状态 * @see com.nflg.product.bomnew.constant.EBomExceptionStatusEnum @@ -177,4 +191,11 @@ public class BomNewDQbomChildEntity implements Serializable { @TableField(value = "modify_time") @ApiModelProperty(value = "修改时间") private LocalDateTime modifyTime; + + /** + * 来源 1-EXCE导入 2-MDM创建 + */ + @TableField(value = "source") + @ApiModelProperty(value = "来源") + private Integer source; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewDQbomParentEntity.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewDQbomParentEntity.java index d7a40473..c9af564d 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewDQbomParentEntity.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewDQbomParentEntity.java @@ -79,6 +79,20 @@ public class BomNewDQbomParentEntity implements Serializable { @ApiModelProperty(value = "单重") private BigDecimal unitWeight; + /** + * 数量 + */ + @TableField(value = "num") + @ApiModelProperty(value = "数量") + private BigDecimal num; + + /** + * 总重 + */ + @TableField(value = "total_weight") + @ApiModelProperty(value = "总重") + private BigDecimal totalWeight; + /** * 版本号 */ @@ -86,6 +100,13 @@ public class BomNewDQbomParentEntity implements Serializable { @ApiModelProperty(value = "版本号") private String currentVersion; + /** + * 项目类别 + */ + @TableField(value = "project_type") + @ApiModelProperty(value = "项目类别") + private String projectType; + /** * 是否跟节点 0-否 1-是 */ @@ -156,6 +177,21 @@ public class BomNewDQbomParentEntity implements Serializable { @ApiModelProperty(value = "创建人员所属岗位") private Integer createdJob; + /** + * 异常状态 + * @see com.nflg.product.bomnew.constant.EBomExceptionStatusEnum + */ + @TableField(value = "exception_status") + @ApiModelProperty(value = "异常状态") + private Integer exceptionStatus = -1; + + /** + * 异常标记 + */ + @TableField(value = "exception_tag") + @ApiModelProperty(value = "异常标记") + private String exceptionTag; + /** * 版本过期时间(下个版本的创建时间) */ @@ -197,4 +233,11 @@ public class BomNewDQbomParentEntity implements Serializable { @TableField(value = "sap_time") @ApiModelProperty(value = "导入SAP时间") private LocalDateTime sapTime; + + /** + * 备注 + */ + @TableField(value = "remark") + @ApiModelProperty(value = "备注") + private String remark; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomDQbomEditDetailVO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomDQbomEditDetailVO.java new file mode 100644 index 00000000..694adb89 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomDQbomEditDetailVO.java @@ -0,0 +1,24 @@ +package com.nflg.product.bomnew.pojo.vo; + +/** + * @author 曹鹏飞 + * @date 2024/4/19 10:55:57 + */ + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@Data +@Accessors(chain = true) +@ApiModel(value = "com-nflg-product-bomnew-pojo-new-vo-BomDQbomEditDetailVO") +public class BomDQbomEditDetailVO implements Serializable { + + private BomNewDQbomVO parent; + + private List datas = new ArrayList<>(); +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewDQbomVO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewDQbomVO.java index e5286ec8..d646665a 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewDQbomVO.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewDQbomVO.java @@ -1,5 +1,6 @@ package com.nflg.product.bomnew.pojo.vo; +import com.baomidou.mybatisplus.annotation.TableField; import com.nflg.product.bomnew.pojo.entity.BomNewDQbomChildEntity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -7,6 +8,7 @@ import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; +import java.util.List; /** * @author 曹鹏飞 @@ -47,8 +49,35 @@ public class BomNewDQbomVO extends BomNewDQbomChildEntity implements Serializabl @ApiModelProperty(value = "物料状态") private Integer systemMaterialState; + /** + * 是否跟节点 0-否 1-是 + */ + @TableField(value = "root_is") + @ApiModelProperty(value = "是否跟节点") + private Integer rootIs; + + /** + * 子级bom + */ + @ApiModelProperty(value = "子级bom") + private List childNodes; + /** * 父级物料编码 */ private String parentMaterialNo; + + /** + * 是否有子节点: 0-否 1-是 + */ + @TableField(value = "bom_exist") + @ApiModelProperty(value = "是否有子节点") + private Integer bomExist; + + /** + * 是否最新版:0-否 1-是 + */ + @TableField(value = "last_version_is") + @ApiModelProperty(value = "是否最新版") + private Integer lastVersionIs = 1; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewDQbomExceptionCheckService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewDQbomExceptionCheckService.java index 15e5d444..e6b2c603 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewDQbomExceptionCheckService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewDQbomExceptionCheckService.java @@ -3,6 +3,7 @@ package com.nflg.product.bomnew.service; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.nflg.product.bomnew.constant.BomConstant; import com.nflg.product.bomnew.constant.EBomExceptionStatusEnum; import com.nflg.product.bomnew.constant.MaterialGetEnum; import com.nflg.product.bomnew.pojo.entity.BomNewDQbomChildEntity; @@ -10,60 +11,58 @@ import com.nflg.product.bomnew.pojo.entity.BomNewDQbomParentEntity; import com.nflg.product.bomnew.pojo.vo.BaseMaterialVO; import com.nflg.product.bomnew.util.VUtils; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; -/** - * @author 曹鹏飞 - * @date 2024/4/11 15:30:16 - */ -@Service + @Slf4j public class BomNewDQbomExceptionCheckService { - @Resource MaterialMainService materialMainService; - @Resource DQBomParentService dQBomParentService; - @Resource DQBomChildService dQBomChildService; private List parents = new ArrayList<>(); private List children = new ArrayList<>(); - private List materialVOS; + private List materialVOS = new ArrayList<>(); - public void check(Long parentRowId) { - VUtils.isTure(ObjectUtil.isNull(parentRowId) || parentRowId == 0L).throwMessage("无效的参数:" + parentRowId); + public BomNewDQbomExceptionCheckService(DQBomParentService dQBomParentService, DQBomChildService dQBomChildService, MaterialMainService materialMainService) { + this.dQBomParentService = dQBomParentService; + this.dQBomChildService = dQBomChildService; + this.materialMainService = materialMainService; + } + + public void check(Long bomRowId) { + VUtils.isTure(ObjectUtil.isNull(bomRowId) || bomRowId == 0L).throwMessage("无效的参数:" + bomRowId); parents.clear(); children.clear(); - BomNewDQbomParentEntity parent = dQBomParentService.getById(parentRowId); - VUtils.isTure(ObjectUtil.isNull(parent)).throwMessage("未找到数据:" + parentRowId); + BomNewDQbomParentEntity parent = dQBomParentService.getById(bomRowId); + VUtils.isTure(ObjectUtil.isNull(parent)).throwMessage("未找到数据:" + bomRowId); + + parents.add(parent); buildData(parent); check(); } private void buildData(BomNewDQbomParentEntity parent) { - parents.add(parent); - - BomNewDQbomChildEntity child = dQBomChildService.getRoot(parent.getMaterialNo()); - children.add(child); - List cc = dQBomChildService.getByParentRowId(parent.getRowId()); if (CollUtil.isNotEmpty(cc)) { children.addAll(cc); List pp = dQBomParentService.getLatestByMaterialNo(cc.stream() .map(BomNewDQbomChildEntity::getMaterialNo) .collect(Collectors.toList())); + pp.removeIf(p -> p.getRootIs() == 1 || p.getUserRootIs() == 1 + || parents.stream().anyMatch(pi -> StrUtil.equals(pi.getMaterialNo(), p.getMaterialNo()))); parents.addAll(pp); pp.forEach(this::buildData); } @@ -78,48 +77,111 @@ public class BomNewDQbomExceptionCheckService { private void check() { List materialNos = children.stream().map(BomNewDQbomChildEntity::getMaterialNo).collect(Collectors.toList()); - materialVOS = materialMainService.getMaterialBaseInfo(materialNos); - check(children.get(0)); + materialNos.add(parents.get(0).getMaterialNo()); + materialNos = materialNos.stream().filter(StrUtil::isNotBlank).distinct().collect(Collectors.toList()); + if (CollUtil.isNotEmpty(materialNos)) { + materialVOS = materialMainService.getMaterialBaseInfo(materialNos); + } + + children.forEach(this::checkChild); + parents.forEach(this::checkParent); + checkTree(parents.get(0)); + + save(); } - private EBomExceptionStatusEnum check(BomNewDQbomChildEntity child) { - BomNewDQbomParentEntity parent = parents.stream().filter(p -> p.getMaterialNo().equals(child.getMaterialNo())) - .findFirst() - .orElse(null); - VUtils.isTure(ObjectUtil.isNull(parent)).throwMessage(StrUtil.format("编号为{}的数据不完整", child.getMaterialNo())); + @Transactional(rollbackFor = Exception.class) + public void save() { + if (CollUtil.isNotEmpty(parents)) { + dQBomParentService.updateBatchById(parents); + } + if (CollUtil.isNotEmpty(children)) { + dQBomChildService.updateBatchById(children); + } + } + private boolean checkTree(BomNewDQbomParentEntity parent) { + List cc = children.stream() + .filter(c -> Objects.equals(c.getParentRowId(), parent.getRowId())) + .collect(Collectors.toList()); + Set cm = cc.stream().map(BomNewDQbomChildEntity::getMaterialNo).distinct().collect(Collectors.toSet()); + List pp = parents.stream().filter(p -> cm.contains(p.getMaterialNo())).collect(Collectors.toList()); + + boolean hasError; + + if (CollUtil.isEmpty(pp)) { + hasError = cc.stream().anyMatch(c -> !Objects.equals(c.getExceptionStatus(), EBomExceptionStatusEnum.OK.getValue())); + } else { + hasError = pp.stream().anyMatch(this::checkTree); + } + if (Objects.equals(parent.getExceptionStatus(), EBomExceptionStatusEnum.OK.getValue()) && hasError) { + parent.setExceptionStatus(EBomExceptionStatusEnum.EXCEPT_NO_14.getValue()); + } + return !Objects.equals(parent.getExceptionStatus(), EBomExceptionStatusEnum.OK.getValue()); + } + + + private void checkParent(BomNewDQbomParentEntity parent) { EBomExceptionStatusEnum status = EBomExceptionStatusEnum.OK; - assert parent != null; - if ("T".equals(child.getProjectType())) { - child.setExceptionStatus(EBomExceptionStatusEnum.OK.getValue()); - } else if (child.getMaterialNo().startsWith("M")) { + if ("T".equals(parent.getProjectType())) { + parent.setExceptionStatus(EBomExceptionStatusEnum.OK.getValue()); + } else if (parent.getMaterialNo().startsWith(BomConstant.MATERIAL_NO_TEMPORARY_PREFIX)) { status = EBomExceptionStatusEnum.EXCEPT_NO_4; } else { - BaseMaterialVO materialVO = materialVOS.stream().filter(v -> v.getMaterialNo().equals(child.getMaterialNo())).findFirst().orElse(null); + BaseMaterialVO materialVO = materialVOS.stream().filter(v -> v.getMaterialNo().equals(parent.getMaterialNo())) + .findFirst() + .orElse(null); if (materialVO == null) { status = EBomExceptionStatusEnum.EXCEPT_NO_7; } else if (materialVO.getMaterialState().equals(MaterialGetEnum.MaterialStateEnum.STATE_NO_4.getValue())) { status = EBomExceptionStatusEnum.EXCEPT_NO_2; } else if (!materialVO.getMaterialName().equals(parent.getMaterialName())) { status = EBomExceptionStatusEnum.EXCEPT_NO_15; - } else if (Objects.isNull(child.getNum()) || child.getNum().equals(BigDecimal.ZERO)) { + } else if (Objects.isNull(parent.getNum()) || parent.getNum().equals(BigDecimal.ZERO)) { status = EBomExceptionStatusEnum.EXCEPT_NO_4; - } else if (Objects.equals(materialVO.getMaterialUnit(), parent.getMaterialUnit())) { + } else if (!Objects.equals(materialVO.getMaterialUnit(), parent.getMaterialUnit())) { status = EBomExceptionStatusEnum.EXCEPT_NO_16; } } //检查下级节点 - List cc = children.stream().filter(c -> c.getParentRowId().equals(parent.getRowId())) - .collect(Collectors.toList()); - boolean hasError = cc.stream().map(this::check) - .collect(Collectors.toList()) - .stream().anyMatch(e -> !e.equals(EBomExceptionStatusEnum.OK)); + boolean hasError = children.stream().anyMatch(c -> c.getParentRowId().equals(parent.getRowId()) + && !Objects.equals(c.getExceptionStatus(), EBomExceptionStatusEnum.OK.getValue())); if (status == EBomExceptionStatusEnum.OK && hasError) { status = EBomExceptionStatusEnum.EXCEPT_NO_14; } + parent.setExceptionStatus(status.getValue()); + } + + // private boolean checkChildren() { + // return children.stream().map(this::checkChild) + // .collect(Collectors.toList()) + // .stream().anyMatch(e -> e); + // } + + private void checkChild(BomNewDQbomChildEntity child) { + EBomExceptionStatusEnum status = EBomExceptionStatusEnum.OK; + if ("T".equals(child.getProjectType())) { + child.setExceptionStatus(EBomExceptionStatusEnum.OK.getValue()); + } else if (child.getMaterialNo().startsWith(BomConstant.MATERIAL_NO_TEMPORARY_PREFIX)) { + status = EBomExceptionStatusEnum.EXCEPT_NO_4; + } else { + BaseMaterialVO materialVO = materialVOS.stream().filter(v -> v.getMaterialNo().equals(child.getMaterialNo())) + .findFirst() + .orElse(null); + if (materialVO == null) { + status = EBomExceptionStatusEnum.EXCEPT_NO_7; + } else if (materialVO.getMaterialState().equals(MaterialGetEnum.MaterialStateEnum.STATE_NO_4.getValue())) { + status = EBomExceptionStatusEnum.EXCEPT_NO_2; + } else if (!materialVO.getMaterialName().equals(child.getMaterialName())) { + status = EBomExceptionStatusEnum.EXCEPT_NO_15; + } else if (Objects.isNull(child.getNum()) || child.getNum().equals(BigDecimal.ZERO)) { + status = EBomExceptionStatusEnum.EXCEPT_NO_4; + } else if (!Objects.equals(materialVO.getMaterialUnit(), child.getMaterialUnit())) { + status = EBomExceptionStatusEnum.EXCEPT_NO_16; + } + } child.setExceptionStatus(status.getValue()); - return status; } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomImportService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomImportService.java index 34f6bb64..0bd6a78e 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomImportService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomImportService.java @@ -6,6 +6,9 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.fasterxml.jackson.core.JsonProcessingException; import com.nflg.product.base.core.conmon.util.SessionUtil; import com.nflg.product.base.core.exception.NflgBusinessException; +import com.nflg.product.bomnew.constant.BomConstant; +import com.nflg.product.bomnew.constant.EBomExceptionStatusEnum; +import com.nflg.product.bomnew.constant.OriginalConstant; import com.nflg.product.bomnew.constant.UserJobEnum; import com.nflg.product.bomnew.pojo.dto.BaseImportExcelDTO; import com.nflg.product.bomnew.pojo.entity.BomNewDQbomChildEntity; @@ -22,6 +25,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.io.IOException; +import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @@ -83,25 +87,27 @@ public class DQBomImportService { } } - public void save() { + public Long save() { Pair, List> pcs = BOMMAP.get(SessionUtil.getUserCode()); VUtils.isTure(pcs == null).throwMessage("数据已丢失,请重新导入"); - save(pcs.getLeft(), pcs.getRight()); BOMMAP.remove(SessionUtil.getUserCode()); + return save(pcs.getLeft(), pcs.getRight()); } @Transactional(rollbackFor = Exception.class) - public void save(List parents, List children) { - checkExceptionStatus(parents, children); + public Long save(List parents, List children) { + // checkExceptionStatus(parents, children); dQBomParentService.setLastVersionIs0(parents.stream().map(BomNewDQbomParentEntity::getMaterialNo).collect(Collectors.toList())); dQBomParentService.saveBatch(parents); dQBomChildService.saveBatch(children); + BomNewDQbomParentEntity root = parents.stream().filter(p -> p.getRootIs() == 1).findFirst().orElseThrow(() -> new NflgBusinessException(STATE.BusinessError, "根节点不存在")); + return root.getRowId(); } - private void checkExceptionStatus(List parents, List children) { - BomNewDQbomExceptionCheckService checkService = new BomNewDQbomExceptionCheckService(); - checkService.check(parents, children); - } + // private void checkExceptionStatus(List parents, List children) { + // BomNewDQbomExceptionCheckService checkService = new BomNewDQbomExceptionCheckService(dQBomParentService, dQBomChildService, materialMainService); + // checkService.check(parents, children); + // } private void checkInconsistentData(BomNewDQbomParentEntity parent, List parents, List children) throws JsonProcessingException { log.debug("checkInconsistentData,parent:" + JsonUtil.toJson(parent)); @@ -187,20 +193,28 @@ public class DQBomImportService { parent.setDrawingNo(data.getDrawingNo()); parent.setMaterialNo(data.getMaterialNo()); parent.setMaterialName(data.getMaterialName()); + parent.setMaterialTexture(data.getMaterialTexture()); parent.setMaterialUnit(data.getMaterial_unit()); parent.setUnitWeight(data.getUnitWeight()); + parent.setNum(Objects.isNull(data.getNum()) ? BigDecimal.ZERO : data.getNum()); + parent.setTotalWeight(BomUtil.calculateTotalWeight(data.getNum(), data.getUnitWeight())); + parent.setProjectType(data.getProjectType()); + parent.setCurrentVersion(OriginalConstant.DEFAULT_BOM_VERSION); parent.setRootIs(parentRowIdMap.containsKey(data.getLevel() - 1) ? 0 : 1); parent.setUserRootIs(parentRowIdMap.containsKey(data.getLevel() - 1) ? 0 : 1); parent.setLastVersionIs(1); + parent.setEditStatus(1); + parent.setStatus(1); + parent.setExceptionStatus(EBomExceptionStatusEnum.INIT.getValue()); parent.setCreatedBy(SessionUtil.getUserCode()); parent.setCreatedName(SessionUtil.getRealName()); parent.setCreatedJob(userRoleService.technician() ? UserJobEnum.ENGINEER.getValue() : UserJobEnum.DESIGNER.getValue()); - //parent.setRemark(data.getRemark()); - // if (index == datas.size() - 1 || datas.get(index + 1).getLevel() <= data.getLevel()) { - // parent.setBomExist(0); - // } else { + parent.setRemark(data.getRemark()); + if (index == datas.size() - 1 || datas.get(index + 1).getLevel() <= data.getLevel()) { + parent.setBomExist(0); + } else { parent.setBomExist(1); - // } + } parent.setSource(1); parents.add(parent); } @@ -208,25 +222,39 @@ public class DQBomImportService { parentRowIdMap.put(data.getLevel(), parent.getRowId()); } - BomNewDQbomChildEntity child = new BomNewDQbomChildEntity(); - child.setRowId(IdWorker.getId()); - child.setParentRowId(parentRowIdMap.getOrDefault(data.getLevel() - 1, 0L)); - child.setIdentityNo(child.getParentRowId() + "_" + child.getRowId()); if (index == 0) { orderMap.put(data.getLevel(), 1); } else { orderMap.put(data.getLevel(), orderMap.getOrDefault(data.getLevel(), 0) + 1); } - child.setOrderNumber(StrUtil.padPre(String.valueOf(orderMap.get(data.getLevel())), 3, '0')); - child.setDrawingNo(data.getDrawingNo()); - child.setMaterialNo(data.getMaterialNo()); - child.setNum(data.getNum()); - child.setTotalWeight(BomUtil.calculateTotalWeight(data.getNum(), data.getUnitWeight())); - child.setCreatedName(SessionUtil.getRealName()); - child.setCreatedBy(SessionUtil.getUserCode()); - child.setProjectType(data.getProjectType()); - child.setRemark(data.getRemark()); - children.add(child); + + if (index > 0) { + BomNewDQbomChildEntity child = new BomNewDQbomChildEntity(); + child.setRowId(IdWorker.getId()); + child.setParentRowId(parentRowIdMap.getOrDefault(data.getLevel() - 1, 0L)); + child.setIdentityNo(child.getParentRowId() + "_" + child.getRowId()); + child.setLevel(data.getLevel()); + child.setMaterialName(data.getMaterialName()); + child.setMaterialTexture(data.getMaterialTexture()); + child.setMaterialUnit(data.getMaterial_unit()); + child.setUnitWeight(data.getUnitWeight()); + child.setTotalWeight(BomUtil.calculateTotalWeight(data.getNum(), data.getUnitWeight())); + child.setOrderNumber(StrUtil.padPre(String.valueOf(orderMap.get(data.getLevel())), 3, '0')); + child.setDrawingNo(data.getDrawingNo()); + child.setCurrentVersion(parent == null ? OriginalConstant.DEFAULT_BOM_VERSION : parent.getCurrentVersion()); + child.setMaterialNo(data.getMaterialNo()); + child.setExceptionStatus(EBomExceptionStatusEnum.INIT.getValue()); + child.setNum(Objects.isNull(data.getNum()) ? BigDecimal.ZERO : data.getNum()); + child.setTotalWeight(BomUtil.calculateTotalWeight(data.getNum(), data.getUnitWeight())); + child.setCreatedName(SessionUtil.getRealName()); + child.setCreatedBy(SessionUtil.getUserCode()); + child.setProjectType(data.getProjectType()); + child.setRemark(data.getRemark()); + child.setEditStatus(1); + child.setStatus(1); + child.setSource(1); + children.add(child); + } } return Pair.of(parents, children); } @@ -245,7 +273,7 @@ public class DQBomImportService { if (p != null) { dQbomExcelVO.setMaterialNo(p.getMaterialNo()); } else { - dQbomExcelVO.setMaterialNo("T" + IdWorker.getIdStr()); + dQbomExcelVO.setMaterialNo(BomConstant.DRAWING_NO_TEMPORARY_PREFIX + IdWorker.getIdStr()); } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomParentService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomParentService.java index 8dbb7d31..3b9c21e5 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomParentService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomParentService.java @@ -3,6 +3,7 @@ package com.nflg.product.bomnew.service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nflg.product.bomnew.mapper.master.BomNewDQbomParentMapper; import com.nflg.product.bomnew.pojo.entity.BomNewDQbomParentEntity; +import com.nflg.product.bomnew.pojo.vo.BomNewDQbomVO; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -46,4 +47,12 @@ public class DQBomParentService extends ServiceImpl getBom(String materialNo, String drawingNo, String materialName) { + return this.getBaseMapper().getBom(materialNo, drawingNo, materialName); + } + + public List getVOById(Long parentRowId) { + return this.getBaseMapper().getVOById(parentRowId); + } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomService.java index 1df629e7..6e0611fb 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/DQBomService.java @@ -19,10 +19,7 @@ import com.nflg.product.bomnew.pojo.entity.BomNewDQbomChildEntity; import com.nflg.product.bomnew.pojo.entity.BomNewDQbomParentEntity; import com.nflg.product.bomnew.pojo.query.BomNewDQbomPageQuery; import com.nflg.product.bomnew.pojo.query.BomNewDQbomSaveQuery; -import com.nflg.product.bomnew.pojo.vo.BaseMaterialVO; -import com.nflg.product.bomnew.pojo.vo.BomNewDQbomSaveVO; -import com.nflg.product.bomnew.pojo.vo.BomNewDQbomVO; -import com.nflg.product.bomnew.pojo.vo.DQbomExcelVO; +import com.nflg.product.bomnew.pojo.vo.*; import com.nflg.product.bomnew.util.BomUtil; import com.nflg.product.bomnew.util.VUtils; import lombok.extern.slf4j.Slf4j; @@ -33,10 +30,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Objects; +import java.util.*; import java.util.stream.Collectors; /** @@ -60,9 +54,91 @@ public class DQBomService { UserRoleService userRoleService; public Page getPageList(BomNewDQbomPageQuery query) { - Page ret = dQBomParentService.getBaseMapper().getPageList(new Page<>(query.getPage(), query.getPageSize()), query, SessionUtil.getUserCode()); - initMaterialInfo(ret.getRecords()); - return ret; + Page result = dQBomParentService.getBaseMapper().getPageList(new Page<>(query.getPage(), query.getPageSize()), query, SessionUtil.getUserCode()); + initMaterialInfo(result.getRecords()); + if (StrUtil.isBlank(query.getMaterialNo()) && StrUtil.isBlank(query.getDrawingNo()) && StrUtil.isBlank(query.getMaterialName())) { + //列表搜索 + return result; + } + //根据编号或图号搜索 + //从顶级开始查找 + List roots = result.getRecords().stream() + .filter(r -> StrUtil.equals(r.getMaterialNo(), query.getMaterialNo()) + || StrUtil.equals(r.getDrawingNo(), query.getDrawingNo()) + || r.getMaterialName().contains(query.getMaterialName())) + .collect(Collectors.toList()); + roots.forEach(this::buildChildren); + //从子级开始查找 + List boms = dQBomParentService.getBom(query.getMaterialNo(), query.getDrawingNo(), query.getMaterialName()); + boms.removeIf(c -> Objects.equals(c.getLastVersionIs(), 0)); + boms.forEach(this::buildChildren); + roots.addAll(boms.stream().filter(b -> b.getRootIs() == 0).map(this::buildParent).flatMap(List::stream).collect(Collectors.toList())); + + Map> map = roots.stream().collect(Collectors.groupingBy(BomNewDQbomVO::getMaterialNo)); + List results = new ArrayList<>(); + map.forEach((k, v) -> { + if (v.size() == 1) { + results.add(v.get(0)); + } else { + BomNewDQbomVO f1 = v.get(0); + for (int i = 1; i < v.size(); i++) { + merge(f1, v.get(i)); + } + results.add(f1); + } + }); + + results.sort((r1, r2) -> r1.getBomRowId() >= r2.getBomRowId() ? r1.getBomRowId() > r2.getBomRowId() ? 1 : 0 : -1); + + Page pageResult = new Page<>(); + pageResult.setPages(1); + pageResult.setCurrent(1); + pageResult.setTotal(results.size()); + pageResult.setRecords(results); + return pageResult; + } + + private void merge(BomNewDQbomVO v1, BomNewDQbomVO v2) { + v1.getChildNodes().addAll(v2.getChildNodes()); + } + + private List buildParent(BomNewDQbomVO vo) { + List parents = dQBomParentService.getVOById(vo.getParentRowId()); + parents.removeIf(c -> 0 == c.getLastVersionIs()); + if (parents.isEmpty()) { + return CollUtil.toList(vo); + } else { + List datas = new ArrayList<>(); + parents.forEach(p -> { + if (Objects.isNull(vo.getStatus())) { + vo.setStatus(p.getStatus()); + // vo.setCurrentVersion("A00"); + } + // if (Objects.equals(vo.getBomExist(), 0) && Objects.equals(vo.getShouldBomExist(), 1)) { + // vo.setCurrentVersion("A-1"); + // } + p.setChildNodes(CollUtil.toList(vo)); + datas.addAll(buildParent(p)); + }); + return datas; + } + } + + private void buildChildren(BomNewDQbomVO vo) { + List children = getChild(vo.getBomRowId()); + //children.removeIf(c -> c.getLastVersionIs() != 1); + vo.setChildNodes(children); + children.forEach(c -> { + if (Objects.isNull(c.getStatus())) { + c.setStatus(vo.getStatus()); + } + if (c.getBomRowId() != 0) { + List cc = getChild(c.getBomRowId()); + //cc.removeIf(ci -> ci.getLastVersionIs() != 1); + c.setChildNodes(cc); + cc.forEach(this::buildChildren); + } + }); } public List getChild(Long bomRowId) { @@ -74,6 +150,7 @@ public class DQBomService { private void initMaterialInfo(List data) { List materialNos = data.stream().map(BomNewDQbomVO::getMaterialNo).collect(Collectors.toList()); + if (CollUtil.isEmpty(materialNos)) return; List materialBaseInfos = materialMainService.getMaterialBaseInfo(materialNos); data.forEach(d -> { BaseMaterialVO bm = materialBaseInfos.stream().filter(m -> m.getMaterialNo().equals(d.getMaterialNo())).findFirst().orElse(null); @@ -85,12 +162,20 @@ public class DQBomService { }); } + /** + * 异常检查 + * @param rootRowId 根节点id + */ + public void checkException(Long rootRowId) { + checkException(CollUtil.toList(rootRowId)); + } + /** * 异常检查 * @param rootRowIds 根节点id列表 */ public void checkException(List rootRowIds) { - BomNewDQbomExceptionCheckService checkService = new BomNewDQbomExceptionCheckService(); + BomNewDQbomExceptionCheckService checkService = new BomNewDQbomExceptionCheckService(dQBomParentService, dQBomChildService, materialMainService); rootRowIds.forEach(checkService::check); } @@ -215,13 +300,15 @@ public class DQBomService { } } - public void submit(Long bomRowId) { + public void submit(BomNewDQbomSaveQuery query) { + save(query); + dQBomParentService.lambdaUpdate() - .eq(BomNewDQbomParentEntity::getRowId, bomRowId) + .eq(BomNewDQbomParentEntity::getRowId, query.getParent().getRowId()) .set(BomNewDQbomParentEntity::getEditStatus, EbomEditStatusEnum.HANDLER_FINISHED.getValue()) .set(BomNewDQbomParentEntity::getModifyTime, LocalDateTime.now()) .update(); - checkException(CollUtil.toList(bomRowId)); + //checkException(CollUtil.toList(query.getParent().getRowId())); } public List exportBom(Long rootBomRowId) { @@ -277,4 +364,18 @@ public class DQBomService { dQBomParentService.updateById(parentEntity); } } + + public BomDQbomEditDetailVO editDetail(Long rowId, Long bomRowId) { + BomDQbomEditDetailVO vo = new BomDQbomEditDetailVO(); + BomNewDQbomParentEntity parent = dQBomParentService.getById(bomRowId); + BomNewDQbomChildEntity child = dQBomChildService.getById(rowId); + VUtils.isTure(Objects.isNull(parent) && Objects.isNull(child)).throwMessage("无效的数据"); + if (!Objects.isNull(parent)) { + vo.setParent(Convert.convert(BomNewDQbomVO.class, parent)); + vo.setDatas(getChild(bomRowId)); + } else if (!Objects.isNull(child)) { + vo.setParent(Convert.convert(BomNewDQbomVO.class, child)); + } + return vo; + } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewDQbomParentMapper.xml b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewDQbomParentMapper.xml index d8833ba9..9b972a29 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewDQbomParentMapper.xml +++ b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewDQbomParentMapper.xml @@ -29,36 +29,45 @@ @@ -86,7 +95,7 @@ + + + + \ No newline at end of file diff --git a/nflg_project_dev/nflg-bom-new/src/test/java/com/nflg/product/bomnew/service/test/OtherTest.java b/nflg_project_dev/nflg-bom-new/src/test/java/com/nflg/product/bomnew/service/test/OtherTest.java index f52d955d..4f43003b 100644 --- a/nflg_project_dev/nflg-bom-new/src/test/java/com/nflg/product/bomnew/service/test/OtherTest.java +++ b/nflg_project_dev/nflg-bom-new/src/test/java/com/nflg/product/bomnew/service/test/OtherTest.java @@ -109,7 +109,7 @@ public class OtherTest { } @Test - public void test10() { + public void test13() { BigDecimal num = BigDecimal.valueOf(1.2); BigDecimal unitWeight = BigDecimal.valueOf(23.5656224); BigDecimal totalWeight = BigDecimal.valueOf(28.27874688); @@ -118,7 +118,7 @@ public class OtherTest { } @Test - public void test11() { + public void test14() { BigDecimal num = BigDecimal.valueOf(3); BigDecimal unitWeight = BigDecimal.valueOf(23.5000); BigDecimal totalWeight = BomUtil.calculateTotalWeight(num, unitWeight); @@ -128,7 +128,7 @@ public class OtherTest { } @Test - public void test12() { + public void test15() { BigDecimal num = BigDecimal.valueOf(3); BigDecimal unitWeight = BigDecimal.valueOf(23.552560); BigDecimal totalWeight = BomUtil.calculateTotalWeight(num, unitWeight); diff --git a/nflg_project_dev/nflg-boot-base/nflg-boot-core/src/main/java/com/nflg/product/base/core/exception/BaseGlobalExceptionHandle.java b/nflg_project_dev/nflg-boot-base/nflg-boot-core/src/main/java/com/nflg/product/base/core/exception/BaseGlobalExceptionHandle.java index 8348eea3..3319d282 100644 --- a/nflg_project_dev/nflg-boot-base/nflg-boot-core/src/main/java/com/nflg/product/base/core/exception/BaseGlobalExceptionHandle.java +++ b/nflg_project_dev/nflg-boot-base/nflg-boot-core/src/main/java/com/nflg/product/base/core/exception/BaseGlobalExceptionHandle.java @@ -105,7 +105,7 @@ public class BaseGlobalExceptionHandle { public ResultVO handleDataIntegrityViolationException(DataIntegrityViolationException e) { log.error(e.getMessage(), e); // return ResultVO.error("字段太长,超出数据库字段的长度"); - return ResultVO.error("字段太长,超出数据库字段的长度"); + return ResultVO.error("数据不完整"); } @ExceptionHandler(value = SQLException.class)