From 66990bd395140b9a08712b9f09d6394643274232 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E7=B1=B3?= <470431449@qq.com> Date: Fri, 5 Jan 2024 18:14:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E5=B8=83Mbom?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nflg/product/bomnew/api/user/PBomApi.java | 2 +- .../product/bomnew/constant/EBomConstant.java | 2 + .../pojo/dto/TechnologyPackageParam.java | 4 + .../pojo/entity/BomNewEbomChildEntity.java | 4 + .../pojo/entity/BomNewPbomChildEntity.java | 7 + .../bomnew/pojo/vo/BomNewEbomParentVO.java | 3 + .../bomnew/pojo/vo/BomNewPbomParentVO.java | 3 + .../service/BomNewPbomParentService.java | 20 +- .../domain/EBom/VirtualPackageBase.java | 1 + .../service/domain/PBom/ConvertToMBom.java | 284 +++++++++++++++++- .../service/domain/PBom/ConvertToMBomDTO.java | 278 +++++++++++++++++ .../domain/PBom/ConvertToMbomUtil.java | 126 ++++++++ .../PBom/TechnologyPackageParamBuilder.java | 4 +- .../mapper/master/BomNewEbomChildMapper.xml | 3 +- .../mapper/master/BomNewPbomChildMapper.xml | 3 +- 15 files changed, 733 insertions(+), 11 deletions(-) create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMBomDTO.java create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMbomUtil.java diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/PBomApi.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/PBomApi.java index 0a5cc70a..a479d7d8 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/PBomApi.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/PBomApi.java @@ -172,7 +172,7 @@ public class PBomApi extends BaseApi { @GetMapping("convertToMBom") @ApiOperation("发布MBom") - public ResultVO convertToMBom(@RequestParam("bomRowId") Long bomRowId) { + public ResultVO convertToMBom(@RequestParam("bomRowId") Long bomRowId) throws ExecutionException, InterruptedException { BomNewPbomParentEntity parent = bomNewPbomParentService.getById(bomRowId); VUtils.isTure(!parent.getMaterialNo().startsWith("31")).throwMessage("只有31开头的物料才可以发布"); VUtils.isTure(!PBomStatusEnum.PUBLISH.equalsValue(parent.getStatus())).throwMessage("只有已发布的BOM才能生成MBom"); diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EBomConstant.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EBomConstant.java index b971ffc2..3dc8b171 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EBomConstant.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EBomConstant.java @@ -19,4 +19,6 @@ public class EBomConstant { //仙桃分厂代码 public static final String XIAN_TAO_FACTORY_CODE_1020="1020"; + + public static final String XIAN_TAO_FACTORY_Name_1020="仙桃"; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/TechnologyPackageParam.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/TechnologyPackageParam.java index 9432f5ef..7cd9fc15 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/TechnologyPackageParam.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/TechnologyPackageParam.java @@ -25,6 +25,10 @@ public class TechnologyPackageParam { @ApiModelProperty("工艺包物料编码") private String technologyPackageMaterialNo; + @ApiModelProperty("项目类别") + @NotNull(message = "项目类别不能为空") + private String projectType; + @ApiModelProperty("工艺包类型rowId(创建工艺包时用)") private Long technologyPackageTypeRowId; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewEbomChildEntity.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewEbomChildEntity.java index 6e98d730..39370dac 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewEbomChildEntity.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewEbomChildEntity.java @@ -202,6 +202,10 @@ public class BomNewEbomChildEntity implements Serializable { @ApiModelProperty(value = "备注") private String remark; + @TableField(value = "virtual_part_type") + @ApiModelProperty(value = "0-非虚拟包 1-发货包 2-制作包 4-直发包 8-发货前装配包") + private Integer virtualPartType; + private static final long serialVersionUID = -14147430944632372L; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomChildEntity.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomChildEntity.java index 0fc67141..cb0b7b35 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomChildEntity.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomChildEntity.java @@ -216,6 +216,13 @@ public class BomNewPbomChildEntity implements Serializable { @ApiModelProperty(value = "来源行-父项物料编码") private String sourceParentMaterialNo; + /** + * 0-非虚拟包 1-发货包 2-制作包 4-直发包 8-发货前装配包 + */ + @TableField(value = "virtual_part_type") + @ApiModelProperty(value = "0-非虚拟包 1-发货包 2-制作包 4-直发包 8-发货前装配包") + private Integer virtualPartType; + private static final long serialVersionUID = -76633783850936076L; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewEbomParentVO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewEbomParentVO.java index 4cdd8cb2..d64f5a13 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewEbomParentVO.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewEbomParentVO.java @@ -308,6 +308,9 @@ public class BomNewEbomParentVO extends BaseMaterialVO implements Serializable { @ApiModelProperty("是否虚拟件") private Integer virtualPartIs; + @ApiModelProperty("0-非虚拟包 1-发货包 2-制作包 4-直发包 8-发货前装配包") + private Integer virtualPartType; + 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/BomNewPbomParentVO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewPbomParentVO.java index 55e88a1e..dde973dd 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewPbomParentVO.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomNewPbomParentVO.java @@ -246,6 +246,9 @@ public class BomNewPbomParentVO extends BaseMaterialVO implements Serializable { @ApiModelProperty("是否虚拟件 0-否 1-是") private Integer virtualPartIs; + @ApiModelProperty("虚拟件类型 0-非虚拟包 1-发货包 2-制作包 4-直发包 8-发货前装配包") + private Integer virtualPartType; + @ApiModelProperty("子级") List childNodes; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewPbomParentService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewPbomParentService.java index 141a3f53..1fc0213a 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewPbomParentService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewPbomParentService.java @@ -16,6 +16,7 @@ import com.nflg.product.bomnew.pojo.entity.*; import com.nflg.product.bomnew.pojo.query.BomNewPbomParentQuery; import com.nflg.product.bomnew.pojo.vo.*; import com.nflg.product.bomnew.service.domain.PBom.BomCopy; +import com.nflg.product.bomnew.service.domain.PBom.ConvertToMBom; import com.nflg.product.bomnew.service.domain.PBom.PBomDetailTask; import com.nflg.product.bomnew.service.domain.PBom.TechnologyPackageParamBuilder; import com.nflg.product.bomnew.util.*; @@ -67,6 +68,11 @@ public class BomNewPbomParentService extends ServiceImpl allChild = getAllBom(bomRowId, 0); + ConvertToMBom convertToMBom=new ConvertToMBom(rootParent ,allChild); + convertToMBom.convertToMBom(); + if(CollUtil.isNotEmpty(convertToMBom.getMBomParentResult())){ + mBomParentService.saveOrUpdateBatch(convertToMBom.getMBomParentResult()); + } + if(CollUtil.isNotEmpty(convertToMBom.getMBomDetailResult())){ + mBomDetailService.saveOrUpdateBatch(convertToMBom.getMBomDetailResult()); + } return true; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/VirtualPackageBase.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/VirtualPackageBase.java index d90e329f..e5e00b38 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/VirtualPackageBase.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/VirtualPackageBase.java @@ -114,6 +114,7 @@ public abstract class VirtualPackageBase { childEntity.setNum(new BigDecimal(1)); childEntity.setEditStatus(EbomEditStatusEnum.HANDLER_CREATED.getValue()); childEntity.setSource(EBomSourceEnum.FROM_MDM.getValue()); + childEntity.setVirtualPartType(virtualPackageTypeEnum.getValue()); this.childResult.add(childEntity); return childEntity; } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMBom.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMBom.java index 510e6346..f6538bcc 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMBom.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMBom.java @@ -1,17 +1,293 @@ package com.nflg.product.bomnew.service.domain.PBom; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.excel.enums.BooleanEnum; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.google.common.collect.ImmutableList; +import com.nflg.product.base.core.conmon.util.SessionUtil; +import com.nflg.product.bomnew.constant.EBomConstant; +import com.nflg.product.bomnew.constant.ProductionFactoryCodeInputTypeEnum; +import com.nflg.product.bomnew.constant.VirtualPackageTypeEnum; +import com.nflg.product.bomnew.pojo.entity.BomNewMbomDetailEntity; +import com.nflg.product.bomnew.pojo.entity.BomNewMbomParentEntity; +import com.nflg.product.bomnew.pojo.entity.BomNewPbomParentEntity; +import com.nflg.product.bomnew.pojo.vo.BomNewPbomParentVO; +import com.nflg.product.bomnew.service.BomNewMbomParentService; +import com.nflg.product.bomnew.service.BomNewPbomParentService; +import com.nflg.product.bomnew.util.CTreePBomUtils; +import com.nflg.product.bomnew.util.VUtils; +import com.nflg.product.bomnew.util.VersionUtil; import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; /** * PBOM转MBOM */ public class ConvertToMBom { - @ApiModelProperty("BOM版本行id") - private Long bomRowId; + private BomNewPbomParentEntity parent; - public ConvertToMBom(Long inBomRowId){ - this.bomRowId=inBomRowId; + private List allChild_1020; + + private List allChild_1010; + + @Getter + List mBomParentResult = new ArrayList<>(); + + @Getter + List mBomDetailResult = new ArrayList<>(); + + + public ConvertToMBom(BomNewPbomParentEntity inRootParent, List inAllChild) { + this.parent = inRootParent; + this.allChild_1010 = Convert.toList(ConvertToMBomDTO.class, inAllChild); + Collections.copy(allChild_1010, allChild_1020); + } + + /** + * 转换MBom + */ + public void convertToMBom() { + handler1010(); + handler1020(); + + buildMBom(EBomConstant.MAIN_FACTORY_CODE_1010); + buildMBom(EBomConstant.XIAN_TAO_FACTORY_CODE_1020); + } + + /** + * 构建MBom明细 + * + * @param + */ + private void buildMBom(String facCode) { + BomNewMbomParentEntity mBomParent = new BomNewMbomParentEntity(); + BeanUtil.copyProperties(parent, mBomParent); + BomNewMbomParentEntity oldParent = SpringUtil.getBean(BomNewMbomParentService.class).lambdaQuery().eq(BomNewMbomParentEntity::getMaterialNo, parent.getMaterialNo()) + .eq(BomNewMbomParentEntity::getLastVersionIs, 1).eq(BomNewMbomParentEntity::getFacCode,facCode).one(); + if (Objects.nonNull(oldParent)) { + mBomParent.setCurrentVersion(VersionUtil.getNextVersion(oldParent.getCurrentVersion())); + oldParent.setLastVersionIs(0); + this.mBomParentResult.add(oldParent); + } else { + mBomParent.setCurrentVersion(VersionUtil.getNextVersion("")); + } + mBomParent.setRowId(IdWorker.getId()); + mBomParent.setFacCode(facCode); + mBomParent.setCreatedBy(SessionUtil.getUserCode()); + mBomParent.setCreatedTime(LocalDateTime.now()); + mBomParent.setModifyTime(LocalDateTime.now()); + this.mBomParentResult.add(mBomParent); + + buildChild(EBomConstant.MAIN_FACTORY_CODE_1010.equals(facCode)? allChild_1010:allChild_1020,mBomParent.getRowId()); + + + } + + + + /** + * 构建子级 + * + * @param allChild + */ + private void buildChild(List allChild, Long bomRowId) { + List childBomTree = ConvertToMbomUtil.toTree(parent.getRowId(), allChild_1010, ConvertToMBomDTO::getRelParentRowId, ConvertToMBomDTO::getBomRowId); + + List parentChildren; + Long parentRowId = 0L; + for (ConvertToMBomDTO item : childBomTree) { + //构建子级 + if (item.getDelIs().equals(0)) { + parentRowId = buildChildDo(item, bomRowId, 0L); + } + parentChildren = item.getChildNodes(); + while (CollUtil.isNotEmpty(parentChildren)) { + for (ConvertToMBomDTO itemChild : parentChildren) { + if (item.getDelIs().equals(0)) { + parentRowId = buildChildDo(itemChild, bomRowId, parentRowId); + } + parentChildren = itemChild.getChildNodes(); + } + } + } + + } + + /** + * 处理制作下为空的虚拟包 + * 当制作下子级为空时--删除该发货,制作,和直发 + * @param allChildTree + */ + private void handEmptyMakePackage(List allChildTree){ + + List childBomTree = ConvertToMbomUtil.toTree(parent.getRowId(), allChild_1020, ConvertToMBomDTO::getRelParentRowId, ConvertToMBomDTO::getBomRowId); + for (ConvertToMBomDTO item : allChildTree) { + if(VirtualPackageTypeEnum.DELIVERY_PACKAGE.equalsValue(item.getVirtualPartType()) ){ + List makeChild = item.getChildNodes().stream().filter(u -> VirtualPackageTypeEnum.MAKING_PACKAGE.equalsValue(u.getVirtualPartType())).collect(Collectors.toList()); + + if(CollUtil.isEmpty(makeChild) || CollUtil.isEmpty(makeChild.get(0).getChildNodes().stream().filter(u->u.getDelIs().equals(0)).collect(Collectors.toList()))){ + item.setRelParentRowId(0L); + } + } + + } + } + + private Long buildChildDo(ConvertToMBomDTO dto, Long bomRowId, Long parentRowId) { + BomNewMbomDetailEntity child = new BomNewMbomDetailEntity(); + BeanUtil.copyProperties(dto, child); + child.setRowId(IdWorker.getId()); + child.setBomRowId(bomRowId); + child.setFacCode(dto.getProductionFactoryCode()); + child.setParentRowId(parentRowId); + child.setCreatedBy(SessionUtil.getUserCode()); + child.setCreatedTime(LocalDateTime.now()); + child.setModifyTime(LocalDateTime.now()); + this.mBomDetailResult.add(child); + return child.getRowId(); + + } + + private void handler1010() { + + List childBomTree = ConvertToMbomUtil.toTree(parent.getRowId(), allChild_1010, ConvertToMBomDTO::getParentRowId, ConvertToMBomDTO::getBomRowId); + + List parentChildren; + + for (ConvertToMBomDTO item : childBomTree) { + //默认 + item.setRelParentRowId(item.getParentRowId()); + setDel(item, EBomConstant.MAIN_FACTORY_CODE_1010); + parentChildren = item.getChildNodes(); + + while (CollUtil.isNotEmpty(parentChildren)) { + for (ConvertToMBomDTO childItem : parentChildren) { + //默认 + childItem.setRelParentRowId(childItem.getParentRowId()); + setDel(childItem, EBomConstant.MAIN_FACTORY_CODE_1010); + + handlerMaterial(childItem, EBomConstant.MAIN_FACTORY_CODE_1010); + parentChildren = childItem.getChildNodes(); + } + } + } + } + + /** + * 处理1020 + */ + private void handler1020() { + List childBomTree = ConvertToMbomUtil.toTree(parent.getRowId(), allChild_1020, ConvertToMBomDTO::getParentRowId, ConvertToMBomDTO::getBomRowId); + //虚拟包名称加仙桃 + initFac1020Info(childBomTree); + + List parentChildren; + + //31下直发包 + ConvertToMBomDTO directDeliveryPackage; + + ConvertToMBomDTO parentNode = Convert.convert(ConvertToMBomDTO.class, parent); + for (ConvertToMBomDTO item : childBomTree) { + //默认 + item.setRelParentRowId(item.getParentRowId()); + setDel(item, EBomConstant.XIAN_TAO_FACTORY_CODE_1020); + parentChildren = item.getChildNodes(); + directDeliveryPackage = item.getChildNodes().stream().filter(u -> VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(u.getVirtualPartType())).collect(Collectors.toList()).get(0); + VUtils.isTure(Objects.isNull(directDeliveryPackage)).throwMessage("发货包下,没有直发包"); + while (CollUtil.isNotEmpty(parentChildren)) { + parentNode = item; + for (ConvertToMBomDTO childItem : parentChildren) { + + //默认 + childItem.setRelParentRowId(childItem.getParentRowId()); + setDel(childItem, EBomConstant.XIAN_TAO_FACTORY_CODE_1020); + //非31下的直发包 + if (VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.equalsValue(parentNode.getVirtualPartType()) && parentNode.getRowId() != directDeliveryPackage.getRowId()) { + handlerDirectDeliveryPackage(childItem, EBomConstant.XIAN_TAO_FACTORY_CODE_1020, directDeliveryPackage); + } else { + handlerMaterial(childItem, EBomConstant.XIAN_TAO_FACTORY_CODE_1020); + } + parentChildren = childItem.getChildNodes(); + parentNode = childItem; + } + } + } + //处理制作包无下级的情况 + handEmptyMakePackage(childBomTree); + } + + /** + * 处理直发包下的物料 + * 所有直发包,归到31下的直发包 + */ + private void handlerDirectDeliveryPackage(ConvertToMBomDTO childItem, String facCode, ConvertToMBomDTO directDeliveryPackage) { + ConvertToMBomDTO relParent = getParent(childItem.getParentRowId(), facCode); + while (Objects.nonNull(relParent) && !VirtualPackageTypeEnum.MAKING_PACKAGE.equalsValue(relParent.getVirtualPartType())) { + childItem.setNum(NumberUtil.mul(childItem.getNum(), relParent.getNum())); + relParent = getParent(relParent.getParentRowId(), facCode); + } + childItem.setRelParentRowId(directDeliveryPackage.getBomRowId()); + } + + /** + * 处理一般材料 + * + * @param childItem + * @param facCode + */ + private void handlerMaterial(ConvertToMBomDTO childItem, String facCode) { + ConvertToMBomDTO relParent = getParent(childItem.getParentRowId(), facCode); + while (Objects.nonNull(relParent) && relParent.getDelIs().equals(1)) { + childItem.setNum(NumberUtil.mul(childItem.getNum(), relParent.getNum())); + relParent = getParent(relParent.getParentRowId(), facCode); + } + childItem.setRelParentRowId(relParent.getBomRowId()); + } + + private void setDel(ConvertToMBomDTO item, String facCode) { + if (!item.getProductionFactoryCode().equals(facCode)) { + item.setDelIs(1); + } + } + + //获取父节点 + private ConvertToMBomDTO getParent(Long parentRowId, String facCode) { + if (parentRowId <= 0) return null; + List data = EBomConstant.MAIN_FACTORY_CODE_1010.equals(facCode) ? allChild_1010 : allChild_1020; + return data.stream().filter(u -> parentRowId.equals(u.getBomRowId())).collect(Collectors.toList()).get(0); + } + + + /** + * 1020-名称加仙桃 + */ + private void initFac1020Info(List childBomTree) { + + for (ConvertToMBomDTO item : childBomTree) { + item.setMaterialName(item.getMaterialName() + EBomConstant.XIAN_TAO_FACTORY_Name_1020); + item.setProductionFactoryCode(EBomConstant.XIAN_TAO_FACTORY_CODE_1020); + item.setProductionFactoryCode(EBomConstant.XIAN_TAO_FACTORY_CODE_1020); + item.setProductionFactoryCodeInputType(ProductionFactoryCodeInputTypeEnum.DEFAULT.getValue()); + for (ConvertToMBomDTO itemChild : item.getChildNodes()) { + itemChild.setMaterialName(item.getMaterialName() + EBomConstant.XIAN_TAO_FACTORY_Name_1020); + itemChild.setProductionFactoryCode(EBomConstant.XIAN_TAO_FACTORY_CODE_1020); + itemChild.setProductionFactoryCode(EBomConstant.XIAN_TAO_FACTORY_CODE_1020); + itemChild.setProductionFactoryCodeInputType(ProductionFactoryCodeInputTypeEnum.DEFAULT.getValue()); + } + } } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMBomDTO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMBomDTO.java new file mode 100644 index 00000000..13d885d2 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMBomDTO.java @@ -0,0 +1,278 @@ +package com.nflg.product.bomnew.service.domain.PBom; + +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.nflg.product.bomnew.pojo.vo.BaseMaterialVO; +import com.nflg.product.bomnew.pojo.vo.BomNewPbomParentVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +/** + * pbom转mbom + */ +@Data +public class ConvertToMBomDTO extends BaseMaterialVO implements Serializable { + + + /** + * 主键行ID-雪花 + */ + @ApiModelProperty(value = "主键行ID-雪花") + private Long rowId=0L; + + + @ApiModelProperty("Bom行ID") + private Long bomRowId=0L; + + + @ApiModelProperty("父级行id") + private Long parentRowId=0L; + /** + * 批号-来自plm-临时 + */ + @ApiModelProperty(value = "批号-来自plm-临时") + private String batchNo; + + + + /** + * 工厂编码 + */ + @ApiModelProperty(value = "工厂编码") + private String facCode; + + + + /** + * 排序号 + */ + @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; + + + + /** + * 是否跟节点 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; + + /** + * 是否最新版:0-否 1-是 + */ + @ApiModelProperty(value = "是否最新版:0-否 1-是") + private Integer lastVersionIs; + + /** + * 1=待处理、2=暂存 3=已处理 + */ + @ApiModelProperty(value = "1=待处理、2=暂存 3=已处理") + private Integer editStatus; + + /** + * BOM状态:1=待发布 2=待分配工厂 3=已分配工厂 4=已发布 + */ + @ApiModelProperty(value = "BOM状态:1=待发布 2=待分配工厂 3=已分配工厂 4=已发布") + private Integer status; + + /** + * 是否用户跟节点 0-否 1-是 + */ + @ApiModelProperty(value = "是否用户跟节点 0-否 1-是") + private Integer userRootIs; + + /** + * 是否虚拟包 0-否 1-是 + */ + @ApiModelProperty(value = "是否虚拟包 0-否 1-是") + private Integer virtualPackageIs; + + /** + * 来源行ID(EBOM中的行ID) + */ + @ApiModelProperty(value = "来源行ID(EBOM中的行ID)") + private Long 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 releaseTime; + + /** + * 发布人 + */ + @ApiModelProperty(value = "发布人") + private String releaseUserName; + + /** + * 版本过期时间=下个版本的创建时间 + */ + @ApiModelProperty(value = "版本过期时间=下个版本的创建时间") + private LocalDateTime expireEndTime; + + /** + * 备注 + */ + @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 String orderNo; + + /** + * 修改时间 + */ + @ApiModelProperty(value = "修改时间") + private LocalDateTime modifyTime; + + @ApiModelProperty("生产工厂") + private String productionFactoryCode; + + @ApiModelProperty("生产工厂设置方式 0-默认 1-规则匹配 2-手工") + private Integer productionFactoryCodeInputType; + + @ApiModelProperty("是否虚拟件 0-否 1-是") + private Integer virtualPartIs; + + @ApiModelProperty("虚拟件类型 0-非虚拟包 1-发货包 2-制作包 4-直发包 8-发货前装配包") + private Integer virtualPartType; + + + @ApiModelProperty("是否删除") + public Integer delIs=0; + + + + @ApiModelProperty("提层后的父级行Id") + private Long relParentRowId; + + @ApiModelProperty("转到MbOM后的RowId") + private Long mBomChildRowId= IdWorker.getId(); + + @ApiModelProperty("转到mBOM后的父级Id") + private Long mBomParentRowId=0L; + + @ApiModelProperty("子级") + List childNodes; + + + + @Override + public Object clone() { + try { + ConvertToMBomDTO obj = (ConvertToMBomDTO) super.clone(); + + return obj; + } catch (CloneNotSupportedException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMbomUtil.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMbomUtil.java new file mode 100644 index 00000000..4906ac07 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/ConvertToMbomUtil.java @@ -0,0 +1,126 @@ +package com.nflg.product.bomnew.service.domain.PBom; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; + +import com.nflg.product.bomnew.util.TreeNode; + +import javax.validation.constraints.NotNull; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** +* +* @author 大米 +* @date 2023/11/18 16:19 +*/ +public class ConvertToMbomUtil { + + + /** + * + * + * @param dataList 数据 + * @param keyFun id + * @param parentKeyFun 父级id + * @param rootKey 顶层的 id 值 ,比如部门树的顶层id是0 + */ + public static List toTree(K rootKey, + Collection dataList, + @NotNull Function parentKeyFun, + @NotNull Function keyFun) { + return toFilterTree(rootKey, dataList, parentKeyFun, keyFun, null); + } + + /** + * + * + * @param rootKey 顶层的 id 值 ,比如部门树的顶层id是0 + * @param dataList 数据列 + * @param parentKeyFun 取父级id的方法引用 + * @param keyFun 取子级id的方法引用 + * @param filterNoDataFun 存在这种场景,选人的时候,某个子部门以及父部门下没有下挂任何人员,那么这两个部门直接隐藏,避免对用户造成干扰, + * 这个参数表示部门实体类,人员字段的方法引用 + */ + public static List toFilterTree(K rootKey, + Collection dataList, + @NotNull Function parentKeyFun, + @NotNull Function keyFun, + Function filterNoDataFun) { + if (CollUtil.isEmpty(dataList)) { + return Collections.emptyList(); + } + + // 根据父节点,对列表进行分组 + Map> groupParentKeyMap = dataList.stream().filter(t -> parentKeyFun.apply(t) != null).collect(Collectors.groupingBy(parentKeyFun)); + List rootNodes; + if (rootKey == null) { + rootNodes = dataList.stream().filter(t -> parentKeyFun.apply(t) == null).collect(Collectors.toList()); + } else { + rootNodes = groupParentKeyMap.getOrDefault(rootKey, Collections.emptyList()); + } + + return handlerChildTree(rootNodes, groupParentKeyMap, keyFun, filterNoDataFun); + } + + /** + * 列表转树 + */ + private static List handlerChildTree(Collection rootNodes, Map> groupParentKeyMap, + Function keyFun, Function filterNoDataFun) { + if (CollUtil.isEmpty(rootNodes)) { + return Collections.emptyList(); + } + List nodes = new ArrayList<>(); + for (T t : rootNodes) { + List childNodesData = groupParentKeyMap.getOrDefault(keyFun.apply(t), Collections.emptyList()); + ConvertToMBomDTO node =new ConvertToMBomDTO(); + BeanUtil.copyProperties(t,node); + + List treeNodes = handlerChildTree(childNodesData, groupParentKeyMap, keyFun, filterNoDataFun); + if (filterNoDataFun != null && CollUtil.isEmpty(treeNodes)) { + if (skipNoDataNode(filterNoDataFun, t)) { + continue; + } + } + nodes.add(node); + node.setChildNodes(treeNodes); + } + return nodes; + } + + /** + * 判断是否为空数据,如果没有数据则隐藏 + */ + @SuppressWarnings("rawtypes") + private static boolean skipNoDataNode(Function filterNoDataFun, T t) { + D filterData = filterNoDataFun.apply(t); + if (filterData == null) { + return true; + } + if (filterData instanceof Collection) { + Collection filterDataList = (Collection) filterData; + return CollUtil.isEmpty(filterDataList); + } + return false; + } + + /** + * 树转list + */ + public static List toList(List> treeNodeList) { + List resultList = new ArrayList<>(); + for (TreeNode treeNode : treeNodeList) { + if (treeNode == null || treeNode.getData() == null) { + continue; + } + resultList.add(treeNode.getData()); + if (CollUtil.isNotEmpty(treeNode.getChildNodes())) { + resultList.addAll(toList(treeNode.getChildNodes())); + } + } + return resultList; + } +} + diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/TechnologyPackageParamBuilder.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/TechnologyPackageParamBuilder.java index 8a5127c7..15883eef 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/TechnologyPackageParamBuilder.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/TechnologyPackageParamBuilder.java @@ -124,7 +124,7 @@ public class TechnologyPackageParamBuilder { newBom.setMaterialTexture(packageMaterial.getMaterialTexture()); newBom.setMaterialUnit(packageMaterial.getMaterialUnit()); newBom.setNum(new BigDecimal(1)); - newBom.setProjectType("L"); + newBom.setProjectType(packageMaterial.getProjectType()); newBom.setBomExist(packageParam.getLevelBelong().equals(0)?1:0); newBom.setLastVersionIs(1); newBom.setCurrentVersion(Objects.isNull(oldBom)? VersionUtil.getNextVersion(""):VersionUtil.getNextVersion(oldBom.getCurrentVersion())); @@ -158,7 +158,7 @@ public class TechnologyPackageParamBuilder { child.setMaterialUnit(packageMaterial.getMaterialUnit()); child.setMaterialCategoryCode(packageMaterial.getMaterialCategoryCode()); child.setNum(new BigDecimal(1)); - child.setProjectType("L"); + child.setProjectType(packageParam.getProjectType()); child.setCreatedBy(SessionUtil.getUserCode()); child.setCreatedTime(LocalDateTime.now()); child.setModifyTime(LocalDateTime.now()); diff --git a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewEbomChildMapper.xml b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewEbomChildMapper.xml index 7913bbbb..cd114984 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewEbomChildMapper.xml +++ b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewEbomChildMapper.xml @@ -29,6 +29,7 @@ + @@ -36,7 +37,7 @@ row_id, parent_row_id, identity_no, order_number, drawing_no, material_no, material_name, material_desc, material_texture, material_unit, material_category_code, unit_weight, num, total_weight, project_type, project_type_input_type, created_by,virtual_part_is, created_time, modify_time, edit_status, exception_status, source, - source_row_id, remark + source_row_id, remark,virtual_part_type diff --git a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewPbomChildMapper.xml b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewPbomChildMapper.xml index c4730e6e..fbdd018d 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewPbomChildMapper.xml +++ b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewPbomChildMapper.xml @@ -32,11 +32,12 @@ + - row_id, parent_row_id, identity_no, fac_code, order_number, drawing_no, material_no, material_name, material_desc, material_texture, material_unit, material_category_code, unit_weight, num, total_weight, project_type, production_factory_code,production_factory_code_input_type, set_production_factory_time, super_material_status, virtual_part_is, created_by, created_time, modify_time, source_row_id, remark, source_parent_material_no + row_id, parent_row_id, identity_no, fac_code, order_number, drawing_no, material_no, material_name, material_desc, material_texture, material_unit, material_category_code, unit_weight, num, total_weight, project_type, production_factory_code,production_factory_code_input_type, set_production_factory_time, super_material_status, virtual_part_is, created_by, created_time, modify_time, source_row_id, remark, source_parent_material_no ,virtual_part_type