From fd94ef194bf2643f227c19a446aae241a8555e34 Mon Sep 17 00:00:00 2001 From: 10001392 <1055202292@qq.com> Date: Fri, 2 Aug 2024 09:22:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=98=E6=9B=B4=E9=80=9A=E7=9F=A5=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../master/BomNewNoticeNumDetail2Mapper.java | 11 + .../entity/BomNewNoticeNumDetail2Entity.java | 77 +++++ .../service/BomNewEbomParentService.java | 319 ++++++++++++------ .../BomNewNoticeNumDetail2Service.java | 15 + .../service/BomNewNoticeNumService.java | 15 +- .../service/BomNewPbomParentService.java | 319 ++++++++++++------ .../master/BomNewNoticeNumDetail2Mapper.xml | 4 + 7 files changed, 556 insertions(+), 204 deletions(-) create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewNoticeNumDetail2Mapper.java create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewNoticeNumDetail2Entity.java create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewNoticeNumDetail2Service.java create mode 100644 nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewNoticeNumDetail2Mapper.xml diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewNoticeNumDetail2Mapper.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewNoticeNumDetail2Mapper.java new file mode 100644 index 00000000..113c3ff5 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewNoticeNumDetail2Mapper.java @@ -0,0 +1,11 @@ +package com.nflg.product.bomnew.mapper.master; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.nflg.product.bomnew.pojo.entity.BomNewNoticeNumDetail2Entity; + +/** + * @author makejava + */ +public interface BomNewNoticeNumDetail2Mapper extends BaseMapper { + +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewNoticeNumDetail2Entity.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewNoticeNumDetail2Entity.java new file mode 100644 index 00000000..4aa58a11 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewNoticeNumDetail2Entity.java @@ -0,0 +1,77 @@ +package com.nflg.product.bomnew.pojo.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * t_bom_new_notice_num_detail2 + * 变更通知单明细表2 + * + * @author makejava + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "com-nflg-product-bomnew-pojo-main-entity-BomNewNoticeNumDetail2Entity") +@TableName(value = "t_bom_new_notice_num_detail2") +public class BomNewNoticeNumDetail2Entity implements Serializable { + + /** + * 行ID 雪花 + */ + @TableId(value = "row_id", type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "行ID 雪花") + private Long rowId; + + /** + * 行ID 雪花抬头行ID + */ + @ApiModelProperty(value = "header_row_id") + private Long headerRowId; + + /** + * 父级编码 + */ + @TableField(value = "parent_material_no") + @ApiModelProperty(value = "父级编码") + private String parentMaterialNo; + + /** + * BOM行编号 + */ + @TableField(value = "order_num") + @ApiModelProperty(value = "BOM行编号") + private String orderNum; + + + /** + * 物料编码 + */ + @TableField(value = "material_no") + @ApiModelProperty(value = "物料编码") + private String materialNo; + + /** + * 变更内容 1=BOM物料增加 2=BOM物料减少 3=BOM物料替换 4=BOM物料数量变更 5=BOM项目类别变更 + */ + @TableField(value = "change_type") + @ApiModelProperty(value = "变更内容 1=BOM物料增加 2=BOM物料减少 3=BOM物料替换 4=BOM物料数量变更 5=BOM项目类别变更") + private Integer changeType; + + /** + * 变更内容 1=BOM物料增加 2=BOM物料减少 3=BOM物料替换 4=BOM物料数量变更 5=BOM项目类别变更 + */ + @TableField(value = "change_content") + @ApiModelProperty(value = "变更内容 1=BOM物料增加 2=BOM物料减少 3=BOM物料替换 4=BOM物料数量变更 5=BOM项目类别变更") + private String changeContent; + + private static final long serialVersionUID = 1L; + +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewEbomParentService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewEbomParentService.java index 5254741b..c20b4e85 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewEbomParentService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewEbomParentService.java @@ -115,6 +115,8 @@ public class BomNewEbomParentService extends ServiceImpl getParentChild( Long rowId) { @@ -2978,126 +2980,241 @@ public class BomNewEbomParentService extends ServiceImpl newestChildList = bomNewEbomChildFormalService.lambdaQuery().eq(BomNewEbomChildFormalEntity::getParentRowId, newestParent.getRowId()).list(); - List lastChildList = bomNewEbomChildFormalService.lambdaQuery().eq(BomNewEbomChildFormalEntity::getParentRowId, lastParent.getRowId()).list(); - List newestMaterialNos = newestChildList.stream().map(BomNewEbomChildFormalEntity::getMaterialNo).collect(Collectors.toList()); - List lastMaterialNos = lastChildList.stream().map(BomNewEbomChildFormalEntity::getMaterialNo).collect(Collectors.toList()); + // BOM明细集合1,如果某父级A的任一子级,相对于上一版本有变更(变更判断优先顺序:物料增加>物料减少>物料替代>改物料数量>改物料项目类别),则记录父级A到集合1 + List noticeNumDetailEntityList = new ArrayList<>(); + // BOM明细集合2,如果某父级A的子级,相对于上一版本有变更(5种情况都得考虑),则记录变更的子级到集合2 + List noticeNumDetailEntity2List = new ArrayList<>(); - // 假设旧版 [1,2,3,4,5] 新版 [3,4,5,6,7] - // 旧版和新版的交集 -> [3,4,5] - List intersection =new ArrayList<>(lastMaterialNos); - intersection.retainAll(newestMaterialNos); - // 旧版相对于新版的差集 -> [1,2] - List difference = new ArrayList<>(lastMaterialNos); - difference.removeAll(newestMaterialNos); - // 新版相对于旧版的差集 -> [6,7] - List difference2 = new ArrayList<>(newestMaterialNos); - difference2.removeAll(lastMaterialNos); + long start = System.currentTimeMillis(); + // 递归调用 + buildNoticeNumDetailList(saveEntity.getRowId(), noticeNumDetailEntityList, noticeNumDetailEntity2List, newestParent, lastParent); + long end = System.currentTimeMillis(); + log.info("【EBOM {} 生成变更通知单】递归调用耗时(ms):{}", newestParent.getMaterialNo(), (end - start)); - List saveDetailList = new ArrayList<>(); - // 物料变更的场景有5种:物料增加,物料减少,物料替代,改物料数量,改物料项目类别 - - // 两个差集元素的个数不等,则认为 difference2 的物料是增加,difference 的物料是减少 - if (difference.size() != difference2.size()) { - difference.forEach(remove -> { - BomNewEbomChildFormalEntity removeEntity = lastChildList.stream().filter(item -> item.getMaterialNo().equals(remove)).findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(removeEntity)) { - BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); - saveDetail.setRowId(IdWorker.getId()); - saveDetail.setHeaderRowId(saveEntity.getRowId()); - saveDetail.setMaterialNo(removeEntity.getMaterialNo()); - saveDetail.setDrawingNo(removeEntity.getDrawingNo()); - saveDetail.setMaterialName(removeEntity.getMaterialName()); - saveDetail.setParentMaterialNo(""); - saveDetail.setChangeType(2); - saveDetail.setChangeContent("BOM物料减少"); - saveDetailList.add(saveDetail); - } - }); - difference2.forEach(add -> { - BomNewEbomChildFormalEntity addEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(add)).findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(addEntity)) { - BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); - saveDetail.setRowId(IdWorker.getId()); - saveDetail.setHeaderRowId(saveEntity.getRowId()); - saveDetail.setMaterialNo(addEntity.getMaterialNo()); - saveDetail.setDrawingNo(addEntity.getDrawingNo()); - saveDetail.setMaterialName(addEntity.getMaterialName()); - saveDetail.setParentMaterialNo(""); - saveDetail.setChangeType(1); - saveDetail.setChangeContent("BOM物料增加"); - saveDetailList.add(saveDetail); - } - }); - } else { - // 个数相等,则认为 difference2 是 difference 的替代物料 - if (CollectionUtil.isNotEmpty(difference2)) { - difference2.forEach(replace -> { - BomNewEbomChildFormalEntity replaceEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(replace)).findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(replaceEntity)) { - BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); - saveDetail.setRowId(IdWorker.getId()); - saveDetail.setHeaderRowId(saveEntity.getRowId()); - saveDetail.setMaterialNo(replaceEntity.getMaterialNo()); - saveDetail.setDrawingNo(replaceEntity.getDrawingNo()); - saveDetail.setMaterialName(replaceEntity.getMaterialName()); - saveDetail.setParentMaterialNo(""); - saveDetail.setChangeType(3); - saveDetail.setChangeContent("BOM物料替换"); - saveDetailList.add(saveDetail); - } - }); - } + if (CollectionUtil.isNotEmpty(noticeNumDetailEntityList)) { + bomNewNoticeNumDetailService.saveBatch(noticeNumDetailEntityList); } - // 遍历交集,如果旧版和新版物料的数量不等,则认为是改物料数量;如果旧版和新版物料的项目类别不一致,则认为是改物料项目类别 - intersection.forEach(entity -> { - BomNewEbomChildFormalEntity lastChild = lastChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null); - BomNewEbomChildFormalEntity newestChild = newestChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(newestChild.getNum()) && newestChild.getNum().compareTo(lastChild.getNum()) != 0) { - BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); - saveDetail.setRowId(IdWorker.getId()); - saveDetail.setHeaderRowId(saveEntity.getRowId()); - saveDetail.setMaterialNo(newestChild.getMaterialNo()); - saveDetail.setDrawingNo(newestChild.getDrawingNo()); - saveDetail.setMaterialName(newestChild.getMaterialName()); - saveDetail.setParentMaterialNo(""); - saveDetail.setChangeType(4); - saveDetail.setChangeContent("BOM物料数量变更"); - saveDetailList.add(saveDetail); - } - if (ObjectUtil.isNotEmpty(newestChild.getProjectType()) && !newestChild.getProjectType().equals(lastChild.getProjectType())) { - BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); - saveDetail.setRowId(IdWorker.getId()); - saveDetail.setHeaderRowId(saveEntity.getRowId()); - saveDetail.setMaterialNo(newestChild.getMaterialNo()); - saveDetail.setDrawingNo(newestChild.getDrawingNo()); - saveDetail.setMaterialName(newestChild.getMaterialName()); - saveDetail.setParentMaterialNo(""); - saveDetail.setChangeType(5); - saveDetail.setChangeContent("BOM项目类别变更"); - saveDetailList.add(saveDetail); - } - }); - bomNewNoticeNumDetailService.saveBatch(saveDetailList); - bomNewNoticeNumService.sync2Oa(saveEntity, saveDetailList); + if (CollectionUtil.isNotEmpty(noticeNumDetailEntity2List)) { + bomNewNoticeNumDetail2Service.saveBatch(noticeNumDetailEntity2List); + } + bomNewNoticeNumService.sync2Oa(saveEntity, noticeNumDetailEntityList, noticeNumDetailEntity2List); } } } + + private void buildNoticeNumDetailList(Long noticeNumRowId, List noticeNumDetailEntityList, List noticeNumDetailEntity2List, + BomNewEbomParentFormalEntity newestParent, BomNewEbomParentFormalEntity lastParent) { + if (ObjectUtil.isEmpty(newestParent) || ObjectUtil.isEmpty(lastParent)) { + return; + } + List newestChildList = bomNewEbomChildFormalService.lambdaQuery().eq(BomNewEbomChildFormalEntity::getParentRowId, newestParent.getRowId()).list(); + List lastChildList = bomNewEbomChildFormalService.lambdaQuery().eq(BomNewEbomChildFormalEntity::getParentRowId, lastParent.getRowId()).list(); + if (CollectionUtil.isEmpty(newestChildList) || CollectionUtil.isEmpty(lastChildList)) { + return; + } + List newestMaterialNos = newestChildList.stream().map(BomNewEbomChildFormalEntity::getMaterialNo).collect(Collectors.toList()); + List lastMaterialNos = lastChildList.stream().map(BomNewEbomChildFormalEntity::getMaterialNo).collect(Collectors.toList()); + + // Bom明细1 是否已经添加过该父级(只需添加一次) + boolean noticeNumDetailEntityListAdded = false; + + // 假设旧版 [1,2,3,4,5] 新版 [3,4,5,6,7] + // 旧版和新版的交集 -> [3,4,5] + List intersection = new ArrayList<>(lastMaterialNos); + intersection.retainAll(newestMaterialNos); + // 旧版相对于新版的差集 -> [1,2] + List difference = new ArrayList<>(lastMaterialNos); + difference.removeAll(newestMaterialNos); + // 新版相对于旧版的差集 -> [6,7] + List difference2 = new ArrayList<>(newestMaterialNos); + difference2.removeAll(lastMaterialNos); + + // 物料变更的场景有5种:物料增加,物料减少,物料替代,改物料数量,改物料项目类别 + + // 两个差集元素的个数不等,则认为 difference2 的物料是增加,difference 的物料是减少 + if (difference.size() != difference2.size()) { + for (String add : difference2) { + BomNewEbomChildFormalEntity addEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(add)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(addEntity)) { + if (!noticeNumDetailEntityListAdded) { + BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); + saveDetail.setRowId(IdWorker.getId()); + saveDetail.setHeaderRowId(noticeNumRowId); + saveDetail.setMaterialNo(newestParent.getMaterialNo()); + saveDetail.setDrawingNo(newestParent.getDrawingNo()); + saveDetail.setMaterialName(newestParent.getMaterialName()); + saveDetail.setParentMaterialNo(""); + saveDetail.setChangeType(1); + saveDetail.setChangeContent("BOM物料增加"); + noticeNumDetailEntityList.add(saveDetail); + noticeNumDetailEntityListAdded = true; + } + BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity(); + saveDetail2.setRowId(IdWorker.getId()); + saveDetail2.setHeaderRowId(noticeNumRowId); + saveDetail2.setParentMaterialNo(newestParent.getMaterialNo()); + saveDetail2.setOrderNum(addEntity.getOrderNumber()); + saveDetail2.setMaterialNo(addEntity.getMaterialNo()); + saveDetail2.setChangeType(1); + saveDetail2.setChangeContent("BOM物料增加"); + noticeNumDetailEntity2List.add(saveDetail2); + } + } + for (String remove : difference) { + BomNewEbomChildFormalEntity removeEntity = lastChildList.stream().filter(item -> item.getMaterialNo().equals(remove)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(removeEntity)) { + if (!noticeNumDetailEntityListAdded) { + BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); + saveDetail.setRowId(IdWorker.getId()); + saveDetail.setHeaderRowId(noticeNumRowId); + saveDetail.setMaterialNo(newestParent.getMaterialNo()); + saveDetail.setDrawingNo(newestParent.getDrawingNo()); + saveDetail.setMaterialName(newestParent.getMaterialName()); + saveDetail.setParentMaterialNo(""); + saveDetail.setChangeType(2); + saveDetail.setChangeContent("BOM物料减少"); + noticeNumDetailEntityList.add(saveDetail); + noticeNumDetailEntityListAdded = true; + } + BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity(); + saveDetail2.setRowId(IdWorker.getId()); + saveDetail2.setHeaderRowId(noticeNumRowId); + saveDetail2.setParentMaterialNo(lastParent.getMaterialNo()); + saveDetail2.setOrderNum(removeEntity.getOrderNumber()); + saveDetail2.setMaterialNo(removeEntity.getMaterialNo()); + saveDetail2.setChangeType(2); + saveDetail2.setChangeContent("BOM物料减少"); + noticeNumDetailEntity2List.add(saveDetail2); + } + } + + } else { + // 个数相等,则认为 difference2 是 difference 的替代物料 + if (CollectionUtil.isNotEmpty(difference2)) { + for (String replace : difference2) { + BomNewEbomChildFormalEntity replaceEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(replace)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(replaceEntity)) { + if (!noticeNumDetailEntityListAdded) { + BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); + saveDetail.setRowId(IdWorker.getId()); + saveDetail.setHeaderRowId(noticeNumRowId); + saveDetail.setMaterialNo(newestParent.getMaterialNo()); + saveDetail.setDrawingNo(newestParent.getDrawingNo()); + saveDetail.setMaterialName(newestParent.getMaterialName()); + saveDetail.setParentMaterialNo(""); + saveDetail.setChangeType(3); + saveDetail.setChangeContent("BOM物料替换"); + noticeNumDetailEntityList.add(saveDetail); + noticeNumDetailEntityListAdded = true; + } + BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity(); + saveDetail2.setRowId(IdWorker.getId()); + saveDetail2.setHeaderRowId(noticeNumRowId); + saveDetail2.setParentMaterialNo(newestParent.getMaterialNo()); + saveDetail2.setOrderNum(replaceEntity.getOrderNumber()); + saveDetail2.setMaterialNo(replaceEntity.getMaterialNo()); + saveDetail2.setChangeType(3); + saveDetail2.setChangeContent("BOM物料替换"); + noticeNumDetailEntity2List.add(saveDetail2); + } + } + } + } + // 遍历交集,如果旧版和新版物料的数量不等,则认为是改物料数量;如果旧版和新版物料的项目类别不一致,则认为是改物料项目类别 + for (String entity : intersection) { + BomNewEbomChildFormalEntity lastChild = lastChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null); + BomNewEbomChildFormalEntity newestChild = newestChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(newestChild.getNum()) && newestChild.getNum().compareTo(lastChild.getNum()) != 0) { + if (!noticeNumDetailEntityListAdded) { + BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); + saveDetail.setRowId(IdWorker.getId()); + saveDetail.setHeaderRowId(noticeNumRowId); + saveDetail.setMaterialNo(newestParent.getMaterialNo()); + saveDetail.setDrawingNo(newestParent.getDrawingNo()); + saveDetail.setMaterialName(newestParent.getMaterialName()); + saveDetail.setParentMaterialNo(""); + saveDetail.setChangeType(4); + saveDetail.setChangeContent("BOM物料数量变更"); + noticeNumDetailEntityList.add(saveDetail); + noticeNumDetailEntityListAdded = true; + } + BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity(); + saveDetail2.setRowId(IdWorker.getId()); + saveDetail2.setHeaderRowId(noticeNumRowId); + saveDetail2.setParentMaterialNo(newestParent.getMaterialNo()); + saveDetail2.setOrderNum(newestChild.getOrderNumber()); + saveDetail2.setMaterialNo(newestChild.getMaterialNo()); + saveDetail2.setChangeType(4); + saveDetail2.setChangeContent("BOM物料数量变更:" + lastChild.getNum() + "->" + newestChild.getNum()); + noticeNumDetailEntity2List.add(saveDetail2); + } + if (ObjectUtil.isNotEmpty(newestChild.getProjectType()) && !newestChild.getProjectType().equals(lastChild.getProjectType())) { + if (!noticeNumDetailEntityListAdded) { + BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); + saveDetail.setRowId(IdWorker.getId()); + saveDetail.setHeaderRowId(noticeNumRowId); + saveDetail.setMaterialNo(newestParent.getMaterialNo()); + saveDetail.setDrawingNo(newestParent.getDrawingNo()); + saveDetail.setMaterialName(newestParent.getMaterialName()); + saveDetail.setParentMaterialNo(""); + saveDetail.setChangeType(5); + saveDetail.setChangeContent("BOM项目类别变更"); + noticeNumDetailEntityList.add(saveDetail); + noticeNumDetailEntityListAdded = true; + } + BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity(); + saveDetail2.setRowId(IdWorker.getId()); + saveDetail2.setHeaderRowId(noticeNumRowId); + saveDetail2.setParentMaterialNo(newestParent.getMaterialNo()); + saveDetail2.setOrderNum(newestChild.getOrderNumber()); + saveDetail2.setMaterialNo(newestChild.getMaterialNo()); + saveDetail2.setChangeType(5); + saveDetail2.setChangeContent("BOM项目类别变更:" + lastChild.getProjectType() + "->" + newestChild.getProjectType()); + noticeNumDetailEntity2List.add(saveDetail2); + } + BomNewEbomParentFormalEntity newestP = bomNewEbomParentFormalService.lambdaQuery().eq(BomNewEbomParentFormalEntity::getRowId, newestChild.getBomVersionRowId()).one(); + BomNewEbomParentFormalEntity lastP = bomNewEbomParentFormalService.lambdaQuery().eq(BomNewEbomParentFormalEntity::getRowId, lastChild.getBomVersionRowId()).one(); + buildNoticeNumDetailList(noticeNumRowId, noticeNumDetailEntityList, noticeNumDetailEntity2List, newestP, lastP); + } + } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewNoticeNumDetail2Service.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewNoticeNumDetail2Service.java new file mode 100644 index 00000000..d9e91726 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewNoticeNumDetail2Service.java @@ -0,0 +1,15 @@ +package com.nflg.product.bomnew.service; + + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.product.bomnew.mapper.master.BomNewNoticeNumDetail2Mapper; +import com.nflg.product.bomnew.pojo.entity.BomNewNoticeNumDetail2Entity; +import org.springframework.stereotype.Service; + + +/** + * @author makejava + */ +@Service +public class BomNewNoticeNumDetail2Service extends ServiceImpl { +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewNoticeNumService.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewNoticeNumService.java index 9a385287..e69ba21a 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewNoticeNumService.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewNoticeNumService.java @@ -14,6 +14,7 @@ import com.nflg.product.bomnew.config.NacosConfig; import com.nflg.product.bomnew.mapper.master.BomNewNoticeNumMapper; import com.nflg.product.bomnew.pojo.dto.OaNoticeNumParamDto; import com.nflg.product.bomnew.pojo.dto.OaResult; +import com.nflg.product.bomnew.pojo.entity.BomNewNoticeNumDetail2Entity; import com.nflg.product.bomnew.pojo.entity.BomNewNoticeNumDetailEntity; import com.nflg.product.bomnew.pojo.entity.BomNewNoticeNumEntity; import com.nflg.product.bomnew.util.HttpUtils; @@ -61,8 +62,8 @@ public class BomNewNoticeNumService extends ServiceImpl saveDetailList) { - if (CollectionUtil.isEmpty(saveDetailList)) { + public void sync2Oa(BomNewNoticeNumEntity saveEntity, List saveDetailList, List saveDetail2List) { + if (CollectionUtil.isEmpty(saveDetailList) && CollectionUtil.isEmpty(saveDetail2List)) { return; } String employeeNo = SessionUtil.getUserCode(); @@ -85,6 +86,16 @@ public class BomNewNoticeNumService extends ServiceImpl> bomList2 = new ArrayList<>(saveDetail2List.size()); + saveDetail2List.forEach(saveDetail2 -> { + Map bom = new HashMap<>(); + bom.put("parentMaterialNo", saveDetail2.getParentMaterialNo()); // 父级编码 + bom.put("orderNum", saveDetail2.getOrderNum()); // BOM行编号 + bom.put("materialNo", saveDetail2.getMaterialNo()); // 编码 + bom.put("changeContent", saveDetail2.getChangeContent()); // 变更内容 + bomList2.add(bom); + }); + main.put("bomList2", bomList2); log.info("发起变更通知单-JSON:" + JSONArray.toJSONString(main)); HttpUtils httpUtils = new HttpUtils(); try { 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 246a1529..205cc6bd 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 @@ -120,6 +120,8 @@ public class BomNewPbomParentService extends ServiceImpl newestChildList = bomNewPbomChildFormalService.lambdaQuery().eq(BomNewPbomChildFormalEntity::getParentRowId, newestParent.getRowId()).list(); - List lastChildList = bomNewPbomChildFormalService.lambdaQuery().eq(BomNewPbomChildFormalEntity::getParentRowId, lastParent.getRowId()).list(); - List newestMaterialNos = newestChildList.stream().map(BomNewPbomChildFormalEntity::getMaterialNo).collect(Collectors.toList()); - List lastMaterialNos = lastChildList.stream().map(BomNewPbomChildFormalEntity::getMaterialNo).collect(Collectors.toList()); + // BOM明细集合1,如果某父级A的任一子级,相对于上一版本有变更(变更判断优先顺序:物料增加>物料减少>物料替代>改物料数量>改物料项目类别),则记录父级A到集合1 + List noticeNumDetailEntityList = new ArrayList<>(); + // BOM明细集合2,如果某父级A的子级,相对于上一版本有变更(5种情况都得考虑),则记录变更的子级到集合2 + List noticeNumDetailEntity2List = new ArrayList<>(); - // 假设旧版 [1,2,3,4,5] 新版 [3,4,5,6,7] - // 旧版和新版的交集 -> [3,4,5] - List intersection =new ArrayList<>(lastMaterialNos); - intersection.retainAll(newestMaterialNos); - // 旧版相对于新版的差集 -> [1,2] - List difference = new ArrayList<>(lastMaterialNos); - difference.removeAll(newestMaterialNos); - // 新版相对于旧版的差集 -> [6,7] - List difference2 = new ArrayList<>(newestMaterialNos); - difference2.removeAll(lastMaterialNos); + long start = System.currentTimeMillis(); + // 递归调用 + buildNoticeNumDetailList(saveEntity.getRowId(), noticeNumDetailEntityList, noticeNumDetailEntity2List, newestParent, lastParent); + long end = System.currentTimeMillis(); + log.info("【PBOM {} 生成变更通知单】递归调用耗时(ms):{}", newestParent.getMaterialNo(), (end - start)); - List saveDetailList = new ArrayList<>(); - // 物料变更的场景有5种:物料增加,物料减少,物料替代,改物料数量,改物料项目类别 - - // 两个差集元素的个数不等,则认为 difference2 的物料是增加,difference 的物料是减少 - if (difference.size() != difference2.size()) { - difference.forEach(remove -> { - BomNewPbomChildFormalEntity removeEntity = lastChildList.stream().filter(item -> item.getMaterialNo().equals(remove)).findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(removeEntity)) { - BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); - saveDetail.setRowId(IdWorker.getId()); - saveDetail.setHeaderRowId(saveEntity.getRowId()); - saveDetail.setMaterialNo(removeEntity.getMaterialNo()); - saveDetail.setDrawingNo(removeEntity.getDrawingNo()); - saveDetail.setMaterialName(removeEntity.getMaterialName()); - saveDetail.setParentMaterialNo(""); - saveDetail.setChangeType(2); - saveDetail.setChangeContent("BOM物料减少"); - saveDetailList.add(saveDetail); - } - }); - difference2.forEach(add -> { - BomNewPbomChildFormalEntity addEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(add)).findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(addEntity)) { - BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); - saveDetail.setRowId(IdWorker.getId()); - saveDetail.setHeaderRowId(saveEntity.getRowId()); - saveDetail.setMaterialNo(addEntity.getMaterialNo()); - saveDetail.setDrawingNo(addEntity.getDrawingNo()); - saveDetail.setMaterialName(addEntity.getMaterialName()); - saveDetail.setParentMaterialNo(""); - saveDetail.setChangeType(1); - saveDetail.setChangeContent("BOM物料增加"); - saveDetailList.add(saveDetail); - } - }); - } else { - // 个数相等,则认为 difference2 是 difference 的替代物料 - if (CollectionUtil.isNotEmpty(difference2)) { - difference2.forEach(replace -> { - BomNewPbomChildFormalEntity replaceEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(replace)).findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(replaceEntity)) { - BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); - saveDetail.setRowId(IdWorker.getId()); - saveDetail.setHeaderRowId(saveEntity.getRowId()); - saveDetail.setMaterialNo(replaceEntity.getMaterialNo()); - saveDetail.setDrawingNo(replaceEntity.getDrawingNo()); - saveDetail.setMaterialName(replaceEntity.getMaterialName()); - saveDetail.setParentMaterialNo(""); - saveDetail.setChangeType(3); - saveDetail.setChangeContent("BOM物料替换"); - saveDetailList.add(saveDetail); - } - }); - } + if (CollectionUtil.isNotEmpty(noticeNumDetailEntityList)) { + bomNewNoticeNumDetailService.saveBatch(noticeNumDetailEntityList); } - // 遍历交集,如果旧版和新版物料的数量不等,则认为是改物料数量;如果旧版和新版物料的项目类别不一致,则认为是改物料项目类别 - intersection.forEach(entity -> { - BomNewPbomChildFormalEntity lastChild = lastChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null); - BomNewPbomChildFormalEntity newestChild = newestChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null); - if (ObjectUtil.isNotEmpty(newestChild.getNum()) && newestChild.getNum().compareTo(lastChild.getNum()) != 0) { - BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); - saveDetail.setRowId(IdWorker.getId()); - saveDetail.setHeaderRowId(saveEntity.getRowId()); - saveDetail.setMaterialNo(newestChild.getMaterialNo()); - saveDetail.setDrawingNo(newestChild.getDrawingNo()); - saveDetail.setMaterialName(newestChild.getMaterialName()); - saveDetail.setParentMaterialNo(""); - saveDetail.setChangeType(4); - saveDetail.setChangeContent("BOM物料数量变更"); - saveDetailList.add(saveDetail); - } - if (ObjectUtil.isNotEmpty(newestChild.getProjectType()) && !newestChild.getProjectType().equals(lastChild.getProjectType())) { - BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); - saveDetail.setRowId(IdWorker.getId()); - saveDetail.setHeaderRowId(saveEntity.getRowId()); - saveDetail.setMaterialNo(newestChild.getMaterialNo()); - saveDetail.setDrawingNo(newestChild.getDrawingNo()); - saveDetail.setMaterialName(newestChild.getMaterialName()); - saveDetail.setParentMaterialNo(""); - saveDetail.setChangeType(5); - saveDetail.setChangeContent("BOM项目类别变更"); - saveDetailList.add(saveDetail); - } - }); - bomNewNoticeNumDetailService.saveBatch(saveDetailList); - bomNewNoticeNumService.sync2Oa(saveEntity, saveDetailList); + if (CollectionUtil.isNotEmpty(noticeNumDetailEntity2List)) { + bomNewNoticeNumDetail2Service.saveBatch(noticeNumDetailEntity2List); + } + bomNewNoticeNumService.sync2Oa(saveEntity, noticeNumDetailEntityList, noticeNumDetailEntity2List); } } } + + private void buildNoticeNumDetailList(Long noticeNumRowId, List noticeNumDetailEntityList, List noticeNumDetailEntity2List, + BomNewPbomParentFormalEntity newestParent, BomNewPbomParentFormalEntity lastParent) { + if (ObjectUtil.isEmpty(newestParent) || ObjectUtil.isEmpty(lastParent)) { + return; + } + List newestChildList = bomNewPbomChildFormalService.lambdaQuery().eq(BomNewPbomChildFormalEntity::getParentRowId, newestParent.getRowId()).list(); + List lastChildList = bomNewPbomChildFormalService.lambdaQuery().eq(BomNewPbomChildFormalEntity::getParentRowId, lastParent.getRowId()).list(); + if (CollectionUtil.isEmpty(newestChildList) || CollectionUtil.isEmpty(lastChildList)) { + return; + } + List newestMaterialNos = newestChildList.stream().map(BomNewPbomChildFormalEntity::getMaterialNo).collect(Collectors.toList()); + List lastMaterialNos = lastChildList.stream().map(BomNewPbomChildFormalEntity::getMaterialNo).collect(Collectors.toList()); + + // Bom明细1 是否已经添加过该父级(只需添加一次) + boolean noticeNumDetailEntityListAdded = false; + + // 假设旧版 [1,2,3,4,5] 新版 [3,4,5,6,7] + // 旧版和新版的交集 -> [3,4,5] + List intersection = new ArrayList<>(lastMaterialNos); + intersection.retainAll(newestMaterialNos); + // 旧版相对于新版的差集 -> [1,2] + List difference = new ArrayList<>(lastMaterialNos); + difference.removeAll(newestMaterialNos); + // 新版相对于旧版的差集 -> [6,7] + List difference2 = new ArrayList<>(newestMaterialNos); + difference2.removeAll(lastMaterialNos); + + // 物料变更的场景有5种:物料增加,物料减少,物料替代,改物料数量,改物料项目类别 + + // 两个差集元素的个数不等,则认为 difference2 的物料是增加,difference 的物料是减少 + if (difference.size() != difference2.size()) { + for (String add : difference2) { + BomNewPbomChildFormalEntity addEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(add)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(addEntity)) { + if (!noticeNumDetailEntityListAdded) { + BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); + saveDetail.setRowId(IdWorker.getId()); + saveDetail.setHeaderRowId(noticeNumRowId); + saveDetail.setMaterialNo(newestParent.getMaterialNo()); + saveDetail.setDrawingNo(newestParent.getDrawingNo()); + saveDetail.setMaterialName(newestParent.getMaterialName()); + saveDetail.setParentMaterialNo(""); + saveDetail.setChangeType(1); + saveDetail.setChangeContent("BOM物料增加"); + noticeNumDetailEntityList.add(saveDetail); + noticeNumDetailEntityListAdded = true; + } + BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity(); + saveDetail2.setRowId(IdWorker.getId()); + saveDetail2.setHeaderRowId(noticeNumRowId); + saveDetail2.setParentMaterialNo(newestParent.getMaterialNo()); + saveDetail2.setOrderNum(addEntity.getOrderNumber()); + saveDetail2.setMaterialNo(addEntity.getMaterialNo()); + saveDetail2.setChangeType(1); + saveDetail2.setChangeContent("BOM物料增加"); + noticeNumDetailEntity2List.add(saveDetail2); + } + } + for (String remove : difference) { + BomNewPbomChildFormalEntity removeEntity = lastChildList.stream().filter(item -> item.getMaterialNo().equals(remove)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(removeEntity)) { + if (!noticeNumDetailEntityListAdded) { + BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); + saveDetail.setRowId(IdWorker.getId()); + saveDetail.setHeaderRowId(noticeNumRowId); + saveDetail.setMaterialNo(newestParent.getMaterialNo()); + saveDetail.setDrawingNo(newestParent.getDrawingNo()); + saveDetail.setMaterialName(newestParent.getMaterialName()); + saveDetail.setParentMaterialNo(""); + saveDetail.setChangeType(2); + saveDetail.setChangeContent("BOM物料减少"); + noticeNumDetailEntityList.add(saveDetail); + noticeNumDetailEntityListAdded = true; + } + BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity(); + saveDetail2.setRowId(IdWorker.getId()); + saveDetail2.setHeaderRowId(noticeNumRowId); + saveDetail2.setParentMaterialNo(lastParent.getMaterialNo()); + saveDetail2.setOrderNum(removeEntity.getOrderNumber()); + saveDetail2.setMaterialNo(removeEntity.getMaterialNo()); + saveDetail2.setChangeType(2); + saveDetail2.setChangeContent("BOM物料减少"); + noticeNumDetailEntity2List.add(saveDetail2); + } + } + + } else { + // 个数相等,则认为 difference2 是 difference 的替代物料 + if (CollectionUtil.isNotEmpty(difference2)) { + for (String replace : difference2) { + BomNewPbomChildFormalEntity replaceEntity = newestChildList.stream().filter(item -> item.getMaterialNo().equals(replace)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(replaceEntity)) { + if (!noticeNumDetailEntityListAdded) { + BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); + saveDetail.setRowId(IdWorker.getId()); + saveDetail.setHeaderRowId(noticeNumRowId); + saveDetail.setMaterialNo(newestParent.getMaterialNo()); + saveDetail.setDrawingNo(newestParent.getDrawingNo()); + saveDetail.setMaterialName(newestParent.getMaterialName()); + saveDetail.setParentMaterialNo(""); + saveDetail.setChangeType(3); + saveDetail.setChangeContent("BOM物料替换"); + noticeNumDetailEntityList.add(saveDetail); + noticeNumDetailEntityListAdded = true; + } + BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity(); + saveDetail2.setRowId(IdWorker.getId()); + saveDetail2.setHeaderRowId(noticeNumRowId); + saveDetail2.setParentMaterialNo(newestParent.getMaterialNo()); + saveDetail2.setOrderNum(replaceEntity.getOrderNumber()); + saveDetail2.setMaterialNo(replaceEntity.getMaterialNo()); + saveDetail2.setChangeType(3); + saveDetail2.setChangeContent("BOM物料替换"); + noticeNumDetailEntity2List.add(saveDetail2); + } + } + } + } + // 遍历交集,如果旧版和新版物料的数量不等,则认为是改物料数量;如果旧版和新版物料的项目类别不一致,则认为是改物料项目类别 + for (String entity : intersection) { + BomNewPbomChildFormalEntity lastChild = lastChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null); + BomNewPbomChildFormalEntity newestChild = newestChildList.stream().filter(item -> item.getMaterialNo().equals(entity)).findFirst().orElse(null); + if (ObjectUtil.isNotEmpty(newestChild.getNum()) && newestChild.getNum().compareTo(lastChild.getNum()) != 0) { + if (!noticeNumDetailEntityListAdded) { + BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); + saveDetail.setRowId(IdWorker.getId()); + saveDetail.setHeaderRowId(noticeNumRowId); + saveDetail.setMaterialNo(newestParent.getMaterialNo()); + saveDetail.setDrawingNo(newestParent.getDrawingNo()); + saveDetail.setMaterialName(newestParent.getMaterialName()); + saveDetail.setParentMaterialNo(""); + saveDetail.setChangeType(4); + saveDetail.setChangeContent("BOM物料数量变更"); + noticeNumDetailEntityList.add(saveDetail); + noticeNumDetailEntityListAdded = true; + } + BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity(); + saveDetail2.setRowId(IdWorker.getId()); + saveDetail2.setHeaderRowId(noticeNumRowId); + saveDetail2.setParentMaterialNo(newestParent.getMaterialNo()); + saveDetail2.setOrderNum(newestChild.getOrderNumber()); + saveDetail2.setMaterialNo(newestChild.getMaterialNo()); + saveDetail2.setChangeType(4); + saveDetail2.setChangeContent("BOM物料数量变更:" + lastChild.getNum() + "->" + newestChild.getNum()); + noticeNumDetailEntity2List.add(saveDetail2); + } + if (ObjectUtil.isNotEmpty(newestChild.getProjectType()) && !newestChild.getProjectType().equals(lastChild.getProjectType())) { + if (!noticeNumDetailEntityListAdded) { + BomNewNoticeNumDetailEntity saveDetail = new BomNewNoticeNumDetailEntity(); + saveDetail.setRowId(IdWorker.getId()); + saveDetail.setHeaderRowId(noticeNumRowId); + saveDetail.setMaterialNo(newestParent.getMaterialNo()); + saveDetail.setDrawingNo(newestParent.getDrawingNo()); + saveDetail.setMaterialName(newestParent.getMaterialName()); + saveDetail.setParentMaterialNo(""); + saveDetail.setChangeType(5); + saveDetail.setChangeContent("BOM项目类别变更"); + noticeNumDetailEntityList.add(saveDetail); + noticeNumDetailEntityListAdded = true; + } + BomNewNoticeNumDetail2Entity saveDetail2 = new BomNewNoticeNumDetail2Entity(); + saveDetail2.setRowId(IdWorker.getId()); + saveDetail2.setHeaderRowId(noticeNumRowId); + saveDetail2.setParentMaterialNo(newestParent.getMaterialNo()); + saveDetail2.setOrderNum(newestChild.getOrderNumber()); + saveDetail2.setMaterialNo(newestChild.getMaterialNo()); + saveDetail2.setChangeType(5); + saveDetail2.setChangeContent("BOM项目类别变更:" + lastChild.getProjectType() + "->" + newestChild.getProjectType()); + noticeNumDetailEntity2List.add(saveDetail2); + } + BomNewPbomParentFormalEntity newestP = bomNewPbomParentFormalService.lambdaQuery().eq(BomNewPbomParentFormalEntity::getRowId, newestChild.getBomVersionRowId()).one(); + BomNewPbomParentFormalEntity lastP = bomNewPbomParentFormalService.lambdaQuery().eq(BomNewPbomParentFormalEntity::getRowId, lastChild.getBomVersionRowId()).one(); + buildNoticeNumDetailList(noticeNumRowId, noticeNumDetailEntityList, noticeNumDetailEntity2List, newestP, lastP); + } + } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewNoticeNumDetail2Mapper.xml b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewNoticeNumDetail2Mapper.xml new file mode 100644 index 00000000..aa3d4a94 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewNoticeNumDetail2Mapper.xml @@ -0,0 +1,4 @@ + + + +