From 5175f8a60661fd6551391419068ade1a088f2b44 Mon Sep 17 00:00:00 2001 From: jing's Date: Thu, 14 Mar 2024 16:11:17 +0800 Subject: [PATCH] =?UTF-8?q?ebom=E7=BC=96=E8=BE=91=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nflg/product/bomnew/api/user/EbomApi.java | 15 +- .../bomnew/constant/EbomEditStatusEnum.java | 4 +- .../bomnew/pojo/dto/BomNewEbomImportDTO.java | 4 + .../service/BomNewEbomParentService.java | 118 +++++----- .../bomnew/service/domain/EBom/EBomEdit.java | 207 ++++++++++++++---- 5 files changed, 247 insertions(+), 101 deletions(-) diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/EbomApi.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/EbomApi.java index 15ac993b..87f7e9b3 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/EbomApi.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/EbomApi.java @@ -281,14 +281,16 @@ public class EbomApi extends BaseApi { @GetMapping("editDetail") @ApiOperation("编辑物料列表") - public ResultVO editDetail(@RequestParam("bomRowId") Long bomRowId,@RequestParam("projectType") String projectType) { - + public ResultVO editDetail(@RequestParam("rowId") Long rowId,@RequestParam("bomRowId") Long bomRowId,@RequestParam("projectType") String projectType) { + if(Objects.isNull(bomRowId)){ + VUtils.isTure(true ).throwMessage("rowId 不能为空"); + } if(Objects.isNull(bomRowId)){ VUtils.isTure(true ).throwMessage("bomRowId不能为空"); } ResultVO resultVO = new ResultVO(); - resultVO.setData(bomNewEbomParentService.editDetail(bomRowId,projectType)); + resultVO.setData(bomNewEbomParentService.editDetail(rowId,bomRowId,projectType)); return resultVO; } @@ -350,7 +352,8 @@ public class EbomApi extends BaseApi { @PostMapping("temporary") @ApiOperation("暂存") - public ResultVO temporary(@RequestBody BomNewEBomParentEditDTO dto) throws ExecutionException, InterruptedException { + @LogRecord(success = "Ebom-暂存,物料编码:{{#dto.parent.materialNo}}-版本:{{#dto.parent.currentVersion}},操作结果:{{#_ret}}", bizNo = "{{#dto.parent.rowId}}",type = "Ebom-暂存") + public ResultVO temporary(@RequestBody BomNewEBomParentEditDTO dto) throws ExecutionException, InterruptedException { return ResultVO.success(bomNewEbomParentService.temporary(dto)); } @@ -364,9 +367,11 @@ public class EbomApi extends BaseApi { } + + @PostMapping("intiException") @ApiOperation("初始化错误类型") - @LogRecord(success = "Ebom-初始化错误类型,操作结果:{{#_ret}}", bizNo = "{{#bomRowIds.toString()}}",type = "Ebom-提交") + @LogRecord(success = "Ebom-初始化错误类型,操作结果:{{#_ret}}", bizNo = "{{#bomRowIds.toString()}}",type = "Ebom-初始化错误类型") public ResultVO intiException(@RequestBody List bomRowIds) throws ExecutionException, InterruptedException { bomNewEbomParentService.batchCheckAndSaveEBomException(bomRowIds ); diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EbomEditStatusEnum.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EbomEditStatusEnum.java index 8d162090..4f029242 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EbomEditStatusEnum.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/constant/EbomEditStatusEnum.java @@ -8,8 +8,8 @@ import lombok.Getter; @Getter public enum EbomEditStatusEnum implements ValueEnum { - HANDLER_CREATED(1, "待处理"), - HANDLER_FINISHED(2, "处理完成"); + HANDLER_CREATED(1, "待处理"),//待处理=暂存 + HANDLER_FINISHED(2, "已处理"); //已处理=提交 private final Integer value; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BomNewEbomImportDTO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BomNewEbomImportDTO.java index c65fea2a..53f30874 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BomNewEbomImportDTO.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/BomNewEbomImportDTO.java @@ -17,6 +17,10 @@ public class BomNewEbomImportDTO { // private BomNewEbomParentVO parent; @ApiModelProperty("父物料id") private Long rowId; + + @ApiModelProperty("bom id") + private Long bomRowId; + @ApiModelProperty("操作类型(1:删除 2:追加)") private Integer opType; 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 e0ae536e..ec5263c4 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 @@ -914,6 +914,10 @@ public class BomNewEbomParentService extends ServiceImpl queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(BomNewEbomChildEntity::getParentRowId, dto.getRowId()).last("limit 1"); queryWrapper.lambda().orderByDesc(BomNewEbomChildEntity::getOrderNumber); @@ -948,26 +953,26 @@ public class BomNewEbomParentService extends ServiceImpl()); + }else{ + BomNewEbomParentEntity parent = this.getBaseMapper().selectById(bomRowId); + parentVO = Convert.convert(BomNewEbomParentVO.class, parent); + + parentVO.setBomRowId(parentVO.getRowId()); + parentVO.setProjectType(projectType); + parentVO.setParentRowId(0l); + materialMainService.intiMaterialInfo(ImmutableList.of(parentVO), EBomConstant.EBOM_IGNORED_FIELDS_INIT_MATERIAL_DEFAULT2); + vo.setDatas(getChild(bomRowId)); + } // materialMainService.intiMaterialInfo(ImmutableList.of(parentVO)); @@ -1303,7 +1327,7 @@ public class BomNewEbomParentService extends ServiceImpl childList = dto.getDatas(); - - if (dto.getParent().getRootIs() == null || dto.getParent().getRootIs() == 0) { - childList.add(dto.getParent()); - } // checkAndSaveEBomException(childList); //不要异步 ebomChildService.getBaseMapper().updateEBomMaterialUse(); // ThreadUtil.execAsync(() -> computeLevelNumAndRootState()); - return true; + BomNewEbomParentVO retParentVO= Convert.convert(BomNewEbomParentVO.class,eBomEdit.getParentEntity()); + retParentVO.setBomRowId(retParentVO.getRowId()); + + return retParentVO; } /** @@ -1538,7 +1556,7 @@ public class BomNewEbomParentService extends ServiceImpl checkStatus = CollectionUtil.toList(new Integer[]{ EBomExceptionStatusEnum.EXCEPT_NO_2.getValue(), @@ -1557,27 +1575,22 @@ public class BomNewEbomParentService extends ServiceImpl allBom = Convert.convert(new TypeReference>() { }, eBomEdit.childEntities); - BomNewEbomParentVO parent = Convert.convert(BomNewEbomParentVO.class - , eBomEdit.parentEntities.get(0)); - -// if (dto.getParent().getRootIs() == null || dto.getParent().getRootIs() == 0) { -// allBom.add(parent); -// } - CheckEBomException checkEBomException = new CheckEBomException(allBom); checkEBomException.checkContainExcept(checkStatus); } - if (CollectionUtil.isNotEmpty(eBomEdit.parentEntities)) { - this.saveOrUpdateBatch(eBomEdit.parentEntities); - } if (CollectionUtil.isNotEmpty(eBomEdit.childEntities)) { ebomChildService.saveOrUpdateBatch(eBomEdit.childEntities); @@ -1611,6 +1624,7 @@ public class BomNewEbomParentService extends ServiceImpl delTagList = new ArrayList<>(); List okList = delList.stream().filter(u -> Objects.equals(EBomSourceEnum.FROM_BOM.getValue(), u.getSource()) diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomEdit.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomEdit.java index f244aad0..dac923d9 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomEdit.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/EBom/EBomEdit.java @@ -19,43 +19,50 @@ import com.nflg.product.bomnew.pojo.entity.BomNewEbomChildEntity; import com.nflg.product.bomnew.pojo.entity.BomNewEbomParentEntity; import com.nflg.product.bomnew.pojo.vo.BaseMaterialVO; import com.nflg.product.bomnew.pojo.vo.BomNewEbomParentVO; +import com.nflg.product.bomnew.service.BomNewEbomParentService; import com.nflg.product.bomnew.service.MaterialMainService; import com.nflg.product.bomnew.service.UserRoleService; +import com.nflg.product.bomnew.util.MaterialshouldBomExistUtil; import com.nflg.product.bomnew.util.VUtils; +import lombok.Getter; import nflg.product.common.constant.STATE; import org.ttzero.excel.reader.Col; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; public class EBomEdit { public List parentEntities; + @Getter + private BomNewEbomParentEntity parentEntity; public List childEntities; Integer source; + List roleList; public EBomEdit(Integer source) { this.source = source; parentEntities = new ArrayList<>(); childEntities = new ArrayList<>(); + roleList = SpringUtil.getBean(UserRoleService.class).getUserPost(); } BomNewEbomParentEntity createParentBomInfo(BomNewEbomParentVO vo) { - BomNewEbomParentEntity parent = new BomNewEbomParentEntity(); - BeanUtil.copyProperties(vo,parent); + BomNewEbomParentEntity parent = Convert.convert(BomNewEbomParentEntity.class, vo); + //BeanUtil.copyProperties(vo,parent); // BaseMaterialVO material = materialVOMap.get(vo.getMaterialNo()); String batchNo = IdUtil.simpleUUID(); parent.setRowId(IdWorker.getId()); parent.setBatchNo(batchNo); - parent.setTotalWeight(NumberUtil.mul(vo.getUnitWeight(), vo.getNum())); parent.setDeviseUserCode(SessionUtil.getUserCode()); parent.setCurrentVersion("A00"); @@ -64,7 +71,7 @@ public class EBomEdit { parent.setSourceRowId(0l); parent.setSource(source); parent.setStatus(EBomStatusEnum.WAIT_CHECK.getValue()); - + parent.setNum(new BigDecimal(1)); parent.setBomExist(1); parent.setLastVersionIs(1); parent.setEditStatus(EbomEditStatusEnum.HANDLER_CREATED.getValue()); @@ -74,37 +81,102 @@ public class EBomEdit { parent.setStatus(SpringUtil.getBean(UserRoleService.class).technician() ? EBomStatusEnum.CHECKED.getValue() : EBomStatusEnum.WAIT_CHECK.getValue()); parent.setCreatedJob(SpringUtil.getBean(UserRoleService.class).technician() ? UserJobEnum.ENGINEER.getValue() : UserJobEnum.DESIGNER.getValue()); + parent.setModifyTime(LocalDateTime.now()); + + parent.setExpireEndTime( LocalDateTime.parse("9999-12-31 23:59:59", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") )); + return parent; } - - void createBom(BomNewEBomParentEditDTO createDTO){ - - List materialNos = createDTO.getDatas().stream().map(u -> u.getMaterialNo()).collect(Collectors.toList()); - materialNos.add(createDTO.getParent().getMaterialNo()); - //检查物料编码是否在主数据中存在 - List materialBaseInfo = SpringUtil.getBean(MaterialMainService.class).getMaterialBaseInfo(materialNos); - List effectiveMaterialNos = materialBaseInfo.stream().map(u -> u.getMaterialNo()).collect(Collectors.toList()); - Set difference = Sets.difference(new HashSet<>(materialNos), new HashSet<>(effectiveMaterialNos)); - VUtils.isTure(CollUtil.isNotEmpty(difference)).throwMessage(StrUtil.join(",", difference) + "在物料档案中不存在"); - - - List existBomlist =SpringUtil.getBean(MaterialMainService.class).lambdaQuery().eq(BomNewEbomParentEntity::getMaterialNo, createDTO.getParent().getMaterialNo()).list(); - - QueryWrapper - - VUtils.isTure(CollUtil.isNotEmpty(existBomlist)).throwMessage("该物料已存在BOM"); - - - - + void checkHadBom(String materialNo){ + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.lambda().eq(BomNewEbomParentEntity::getMaterialNo, materialNo); + List existBomlist = SpringUtil.getBean(BomNewEbomParentService.class).list(queryWrapper); + VUtils.isTure(CollUtil.isNotEmpty(existBomlist)).throwMessage(materialNo+"该物料已存在BOM"); } + void createRootBom(BomNewEBomParentEditDTO createDTO) { + + checkHadBom(createDTO.getParent().getMaterialNo()); + + parentEntity = createParentBomInfo(createDTO.getParent()); + parentEntity.setEditStatus(createDTO.getOpType()); + + parentEntity.setRootIs(1); + parentEntity.setUserRootIs(1); + createDTO.getDatas().forEach(k -> { + k.setParentRowId(parentEntity.getRowId()); + }); + + + if (Objects.equals(createDTO.getOpType(), EbomEditStatusEnum.HANDLER_FINISHED.getValue())) { + //工艺人员 + if (roleList.contains(EBomConstant.TECHNICIAN)) { + parentEntity.setStatus(EBomStatusEnum.CHECKED.getValue()); + } + } + + childEntities.addAll(updateOrCreateChild(createDTO)); + + } + + List updateOrCreateChild(BomNewEBomParentEditDTO dto) { + List childEntity = Convert.convert(new TypeReference>() { + }, dto.getDatas()); + + + for (BomNewEbomChildEntity child : + childEntity) { + + child.setEditStatus(dto.getOpType()); + child.setTotalWeight(NumberUtil.mul(child.getUnitWeight(), child.getNum())); + child.setModifyTime(LocalDateTime.now()); + + if (child.getMaterialName().contains(VirtualPackageTypeEnum.MAKING_PACKAGE.getConMaterialName())) { + child.setVirtualPartType(VirtualPackageTypeEnum.MAKING_PACKAGE.getValue()); + child.setVirtualPartIs(1); + + } else if (child.getMaterialName().contains(VirtualPackageTypeEnum.DELIVERY_PACKAGE.getConMaterialName())) { + child.setVirtualPartType(VirtualPackageTypeEnum.DELIVERY_PACKAGE.getValue()); + child.setVirtualPartIs(1); + } else if (child.getMaterialName().contains(VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.getConMaterialName())) { + child.setVirtualPartType(VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.getValue()); + child.setVirtualPartIs(1); + } else if (child.getMaterialName().contains(VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.getConMaterialName())) { + child.setVirtualPartType(VirtualPackageTypeEnum.PRE_ASSEMBLY_PACKAGE.getValue()); + child.setVirtualPartIs(1); + } + + + //新增数据 + if (child.getRowId() == null || child.getRowId().longValue() == 0) { + child.setRowId(IdWorker.getId()); + child.setIdentityNo(StrUtil.join("_", parentEntity.getRowId(), child.getRowId())); + child.setSource(source); + child.setCreatedTime(LocalDateTime.now()); + child.setCreatedBy(SessionUtil.getUserCode()); + child.setSourceRowId(0l); + child.setParentRowId(parentEntity.getRowId()); + if(StrUtil.isEmpty(child.getOrderNumber())){ + child.setOrderNumber("00"); + } + child.setExceptionStatus(EBomExceptionStatusEnum.OK.getValue()); + // parent.setExceptionStatus(EBomExceptionStatusEnum.OK.getValue()); + checkExcept(dto.getParent(), child); + if (StrUtil.isNotBlank(child.getProjectType())) { + child.setProjectType(child.getProjectType().toUpperCase()); + } + } + + + } + return childEntity; + } private void checkExcept(BomNewEbomParentVO parent, BomNewEbomChildEntity child) { @@ -127,32 +199,79 @@ public class EBomEdit { } - void checkDataRule(BomNewEBomParentEditDTO dto){ - if(dto.getParent()==null){ - throw new NflgBusinessException(STATE.Error,"parent 数据不能为空"); + void checkDataRule(BomNewEBomParentEditDTO dto) { + if (dto.getParent() == null) { + throw new NflgBusinessException(STATE.Error, "parent 数据不能为空"); } - if(CollUtil.isEmpty(dto.getDatas())){ - throw new NflgBusinessException(STATE.Error,"datas 数据不能为空"); + if (CollUtil.isEmpty(dto.getDatas())) { + throw new NflgBusinessException(STATE.Error, "datas 数据不能为空"); } + List materialNos = dto.getDatas().stream().map(u -> u.getMaterialNo()).collect(Collectors.toList()); + if(materialNos.contains(dto.getParent().getMaterialNo())){ + VUtils.isTure(true).throwMessage(StrUtil.format("上下级存在相同物料{}",dto.getParent().getMaterialNo())); + } + materialNos.add(dto.getParent().getMaterialNo()); + //检查物料编码是否在主数据中存在 + List materialBaseInfo = SpringUtil.getBean(MaterialMainService.class).getMaterialBaseInfo(materialNos); + List effectiveMaterialNos = materialBaseInfo.stream().map(u -> u.getMaterialNo()).collect(Collectors.toList()); + Set difference = Sets.difference(new HashSet<>(materialNos), new HashSet<>(effectiveMaterialNos)); + VUtils.isTure(CollUtil.isNotEmpty(difference)).throwMessage(StrUtil.join(",", difference) + "在物料主数据中不存在"); + } + + public void handleBom(BomNewEBomParentEditDTO dto) { + checkDataRule(dto); + //添加根节点数据 + //rowId is null 必定是未入库作为根 + if (dto.getParent().getRowId() == null || dto.getParent().getRowId().longValue() == 0) { + createRootBom(dto); + return; + } + + //缺bom + if (dto.getParent().getBomRowId() == null || dto.getParent().getBomRowId().longValue() == 0) { + + checkHadBom(dto.getParent().getMaterialNo()); + dto.getParent().setBomRowId(dto.getParent().getRowId()); + parentEntity = createParentBomInfo(dto.getParent()); + + dto.getDatas().forEach(k -> { + k.setParentRowId(parentEntity.getRowId()); + }); + parentEntity.setEditStatus(dto.getOpType()); + + }else{ + parentEntity = Convert.convert(BomNewEbomParentEntity.class, dto.getParent()); + parentEntity.setModifyTime(LocalDateTime.now()); + } + parentEntity.setEditStatus(dto.getOpType()); + //提交 + if (Objects.equals(dto.getOpType(), EbomEditStatusEnum.HANDLER_FINISHED.getValue())) { + //工艺人员 + if (roleList.contains(EBomConstant.TECHNICIAN)) { + parentEntity.setStatus(EBomStatusEnum.CHECKED.getValue()); + } + } + childEntities.addAll(updateOrCreateChild(dto)); + + } + + + /** + * 废弃 + * @param dto + */ + @Deprecated public void temporary(BomNewEBomParentEditDTO dto) { - checkDataRule(dto); + List roleList = SpringUtil.getBean(UserRoleService.class).getUserPost(); - //添加数据 - if(dto.getParent().getRowId()==null){ - - - - } - - if (dto.getParent() == null) { @@ -226,7 +345,11 @@ public class EBomEdit { } - + /** + * 废弃 + * @param dto + */ + @Deprecated public void submit(BomNewEBomParentEditDTO dto) { @@ -256,7 +379,7 @@ public class EBomEdit { if (dto.getParent().getBomRowId() == null || dto.getParent().getBomRowId().longValue() == 0) { dto.getParent().setBomRowId(dto.getParent().getRowId()); parent = createParentBomInfo(dto.getParent()); - dto.getDatas().forEach(k->{ + dto.getDatas().forEach(k -> { k.setParentRowId(parent.getRowId()); }); parent.setEditStatus(dto.getOpType()); @@ -305,7 +428,7 @@ public class EBomEdit { // parent.setExceptionStatus(EBomExceptionStatusEnum.OK.getValue()); checkExcept(dto.getParent(), child); - }else { + } else { child.setModifyTime(LocalDateTime.now()); }