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 37a2b02f..7eaa0a6b 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 @@ -4,12 +4,14 @@ import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.metadata.IPage; import com.nflg.product.base.core.api.BaseApi; import com.nflg.product.bomnew.constant.PBomEditStatusEnum; +import com.nflg.product.bomnew.pojo.dto.CopyPBomParam; import com.nflg.product.bomnew.pojo.dto.EditPBomDelDTO; import com.nflg.product.bomnew.pojo.dto.EditPBomParamDTO; import com.nflg.product.bomnew.pojo.dto.TechnologyPackageParam; import com.nflg.product.bomnew.pojo.entity.BomNewTechnologyPackageTypeEntity; import com.nflg.product.bomnew.pojo.query.BomNewPbomParentQuery; import com.nflg.product.bomnew.pojo.vo.BaseMaterialVO; +import com.nflg.product.bomnew.pojo.vo.BomCopyCheckResultVO; import com.nflg.product.bomnew.pojo.vo.BomNewPbomParentVO; import com.nflg.product.bomnew.pojo.vo.BomNewTechnologyPackageTypeVO; import com.nflg.product.bomnew.service.BomNewPbomParentService; @@ -25,6 +27,7 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.IOException; import java.util.List; +import java.util.concurrent.ExecutionException; /** * t_bom_new_pbom_parent 表控制层 @@ -129,6 +132,25 @@ public class PBomApi extends BaseApi { } + @GetMapping("copyBomCheck") + @ApiOperation("复制前检查") + public ResultVO> copyBomCheck(@RequestParam("sourceBomRowId") Long sourceBomRowId , @RequestParam("targetFacCode") String targetFacCode ) throws ExecutionException, InterruptedException { + + return ResultVO.success(bomNewPbomParentService.copyBomCheck(sourceBomRowId,targetFacCode)); + + } + + @PostMapping("copyFrom") + @ApiOperation("复制从") + public ResultVO copyFrom(@Valid @RequestBody CopyPBomParam param ) throws ExecutionException, InterruptedException { + bomNewPbomParentService.copyFrom(param); + return ResultVO.success(true); + + } + + + + diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/MasterDataSourceConfig.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/MasterDataSourceConfig.java index 50af284e..fe7b79d7 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/MasterDataSourceConfig.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/config/MasterDataSourceConfig.java @@ -141,4 +141,10 @@ public class MasterDataSourceConfig { } + @Bean("getPBomDetailPool") + public ForkJoinPool getPBomDetailPool() { + return new ForkJoinPool(); + + } + } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewPbomChildMapper.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewPbomChildMapper.java index 0d2ef0ad..c83fe67f 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewPbomChildMapper.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewPbomChildMapper.java @@ -19,4 +19,6 @@ public interface BomNewPbomChildMapper extends BaseMapper void delByRowId(@Param("rowIds")List rowIds); void setVirtualPart(@Param("rowIds") List rowIds); + + void delByParentRowId(@Param("parentRowId") Long parentRowId); } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/CopyPBomParam.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/CopyPBomParam.java new file mode 100644 index 00000000..4c3ba0ee --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/CopyPBomParam.java @@ -0,0 +1,26 @@ +package com.nflg.product.bomnew.pojo.dto; + +import com.nflg.product.bomnew.pojo.vo.BomCopyCheckResultVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * PBom-复制参数 + */ +@Data +public class CopyPBomParam { + + @ApiModelProperty("源Bom行ID") + @NotNull(message = "源Bom行ID不能为空") + private Long sourceBomRowId; + + @ApiModelProperty("目标工厂编码") + @NotNull(message = "目标工厂编码不能为空") + private String targetFacCode; + + @ApiModelProperty("用户确认结果") + private List checkResult; +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomCopyCheckResultVO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomCopyCheckResultVO.java new file mode 100644 index 00000000..9a6e8c4e --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/vo/BomCopyCheckResultVO.java @@ -0,0 +1,32 @@ +package com.nflg.product.bomnew.pojo.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * PBOM复制检查结果VO + */ +@Data +public class BomCopyCheckResultVO { + @ApiModelProperty("Bom行ID") + private Long bomRowId=0L; + + @ApiModelProperty(value = "工厂编码") + private String facCode; + + @ApiModelProperty("物料编码") + private String materialNo; + + @ApiModelProperty("物料名称") + private String materialName; + + @ApiModelProperty("物料描述") + private String materialDesc; + + @ApiModelProperty(value = "版本号") + private String currentVersion; + + @ApiModelProperty("用户确认结果 0-无需处理 1-覆盖") + private Integer checkResult=0; + +} 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 4cf05af2..ea497937 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 @@ -5,16 +5,15 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.ImmutableList; -import com.nflg.product.base.core.conmon.util.SessionUtil; import com.nflg.product.base.core.exception.NflgBusinessException; import com.nflg.product.bomnew.constant.OriginalConstant; import com.nflg.product.bomnew.constant.PBomEditStatusEnum; import com.nflg.product.bomnew.constant.PBomStatusEnum; import com.nflg.product.bomnew.mapper.master.BomNewPbomParentMapper; +import com.nflg.product.bomnew.pojo.dto.CopyPBomParam; import com.nflg.product.bomnew.pojo.dto.EditPBomDelDTO; import com.nflg.product.bomnew.pojo.dto.EditPBomParamDTO; import com.nflg.product.bomnew.pojo.dto.TechnologyPackageParam; @@ -23,13 +22,16 @@ import com.nflg.product.bomnew.pojo.entity.BomNewPbomParentEntity; import com.nflg.product.bomnew.pojo.entity.BomNewTechnologyPackageTypeEntity; import com.nflg.product.bomnew.pojo.entity.MaterialMainEntity; import com.nflg.product.bomnew.pojo.query.BomNewPbomParentQuery; -import com.nflg.product.bomnew.pojo.vo.BaseMaterialVO; -import com.nflg.product.bomnew.pojo.vo.BomNewPbomEditExcelVO; -import com.nflg.product.bomnew.pojo.vo.BomNewPbomParentVO; +import com.nflg.product.bomnew.pojo.vo.*; +import com.nflg.product.bomnew.service.domain.PBom.BomCopy; +import com.nflg.product.bomnew.service.domain.PBom.PBomDetailTask; import com.nflg.product.bomnew.service.domain.PBom.TechnologyPackageParamBuilder; -import com.nflg.product.bomnew.util.*; +import com.nflg.product.bomnew.util.EecExcelUtil; +import com.nflg.product.bomnew.util.ListCommonUtil; +import com.nflg.product.bomnew.util.MaterialshouldBomExistUtil; +import com.nflg.product.bomnew.util.VUtils; import nflg.product.common.constant.STATE; -import org.apache.tomcat.util.http.ResponseUtil; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.ttzero.excel.entity.Workbook; @@ -37,12 +39,12 @@ import org.ttzero.excel.entity.Workbook; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.ForkJoinTask; import java.util.stream.Collectors; @@ -71,6 +73,10 @@ public class BomNewPbomParentService extends ServiceImpl child = this.getChild(bomRowId); List result = Convert.toList(BomNewPbomEditExcelVO.class, child); @@ -221,41 +228,44 @@ public class BomNewPbomParentService extends ServiceImpl materials = materialMainService.lambdaQuery().eq(MaterialMainEntity::getDrawingNo, drawingNo).list(); - if(CollUtil.isNotEmpty(materials)){ - return Convert.convert(BaseMaterialVO.class,materials.get(0)); + if (CollUtil.isNotEmpty(materials)) { + return Convert.convert(BaseMaterialVO.class, materials.get(0)); } - materialName=StrUtil.join("",result.getMaterialName(),technologyPackageTypeEntity.getRemark()); - materialDesc=StrUtil.join(" ",materialName,drawingNo); + materialName = StrUtil.join("", result.getMaterialName(), technologyPackageTypeEntity.getRemark()); + materialDesc = StrUtil.join(" ", materialName, drawingNo); String materialNo = materialService.addMaterial(drawingNo, materialName, materialDesc, "201201"); @@ -263,26 +273,76 @@ public class BomNewPbomParentService extends ServiceImpl copyBomCheck(Long sourceBomRowId, String targetFacCode) throws ExecutionException, InterruptedException { + checkCopyBomParam(sourceBomRowId,targetFacCode); + BomCopy bomCopy=new BomCopy(sourceBomRowId,targetFacCode,getAllBom(sourceBomRowId)); + bomCopy.check(); + return Convert.toList(BomCopyCheckResultVO.class,bomCopy.getCheckList() ) ; + } + @Transactional(rollbackFor = Exception.class) + public void copyFrom(CopyPBomParam param) throws ExecutionException, InterruptedException { + checkCopyBomParam(param.getSourceBomRowId(),param.getTargetFacCode()); + BomCopy bomCopy=new BomCopy(param.getSourceBomRowId(),param.getTargetFacCode(),getAllBom(param.getSourceBomRowId())); + bomCopy.copy(param.getCheckResult()); + + if(CollUtil.isNotEmpty(bomCopy.getParentResult())){ + this.saveOrUpdateBatch(bomCopy.getParentResult()); + } + if(CollUtil.isNotEmpty(bomCopy.getChildResult())){ + pbomChildService.saveBatch(bomCopy.getChildResult()); + } + + } + + /** + * 获取整颗树的BOM明细 + * @param rowId + * @return + * @throws ExecutionException + * @throws InterruptedException + */ + public List getAllBom(Long rowId) throws ExecutionException, InterruptedException { + List bomDetail = this.getBaseMapper().getParentChild(rowId); + PBomDetailTask detailTask = new PBomDetailTask(bomDetail); + ForkJoinTask> submit = bomDetailPool.submit(detailTask); + + List result = submit.join(); + return result; + + } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/BomCopy.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/BomCopy.java new file mode 100644 index 00000000..a570f082 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/BomCopy.java @@ -0,0 +1,144 @@ +package com.nflg.product.bomnew.service.domain.PBom; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.nflg.product.bomnew.constant.PBomStatusEnum; +import com.nflg.product.bomnew.pojo.entity.BomNewPbomChildEntity; +import com.nflg.product.bomnew.pojo.entity.BomNewPbomParentEntity; +import com.nflg.product.bomnew.pojo.vo.BomCopyCheckResultVO; +import com.nflg.product.bomnew.pojo.vo.BomNewPbomParentVO; +import com.nflg.product.bomnew.service.BomNewPbomChildService; +import com.nflg.product.bomnew.service.BomNewPbomParentService; +import com.nflg.product.bomnew.util.ListCommonUtil; +import com.nflg.product.bomnew.util.VersionUtil; +import lombok.Getter; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 复制BOM + */ +public class BomCopy { + + private Long sourceBomRowId; + + private String targetFacCode; + + //需用户确认的BOM + @Getter + private List checkList = new ArrayList<>(); + + @Getter + private List parentResult = new ArrayList<>(); + + @Getter + private List childResult = new ArrayList<>(); + + private List allBomDetail; + + private BomNewPbomParentService pBomParentService = SpringUtil.getBean(BomNewPbomParentService.class); + + public BomCopy(Long sourceBomRowId, String targetFacCode, List allBomDetail) { + this.sourceBomRowId = sourceBomRowId; + this.targetFacCode = targetFacCode; + this.allBomDetail = allBomDetail; + } + + /** + * 数据检查返回需确认的数据 + */ + public void check() { + List parents = getAllParents(); + for (BomNewPbomParentVO parent : parents) { + BomNewPbomParentEntity oldBom = getOldBom(parent); + if (Objects.nonNull(oldBom)) { + //版本相同 + if (VersionUtil.compare(parent.getCurrentVersion(), oldBom.getCurrentVersion()) == 0) { + //非已发布,需确认 + if (!PBomStatusEnum.PUBLISH.equalsValue(oldBom.getStatus())) { + checkList.add(parent); + } + } + + } + } + } + + public void copy(List checkResult) { + //获取所有单层BOM + List parents = getAllParents(); + Map checkMap=new HashMap<>(); + if(CollUtil.isNotEmpty(checkResult)){ + checkMap= ListCommonUtil.listToMap(checkResult,BomCopyCheckResultVO::getBomRowId); + } + for (BomNewPbomParentVO parent : parents) { + //目标工厂历史版本 + BomNewPbomParentEntity oldBom = getOldBom(parent);; + if (Objects.nonNull(oldBom)) { + //版本相同 + if (VersionUtil.compare(parent.getCurrentVersion(), oldBom.getCurrentVersion()) == 0) { + //非已发布 且用户确认为覆盖 + if (!PBomStatusEnum.PUBLISH.equalsValue(oldBom.getStatus()) && checkMap.containsKey(parent.getBomRowId()) && checkMap.get(parent.getBomRowId()).getCheckResult().equals(1)) { + SpringUtil.getBean(BomNewPbomChildService.class).getBaseMapper().delByParentRowId(oldBom.getRowId()); + buildChildren(oldBom.getRowId(),parent.getBomRowId()); + } + } + //版本大于已有版本,升级一个新版 + else if (VersionUtil.compare(parent.getCurrentVersion(), oldBom.getCurrentVersion()) > 0) { + buildBom(parent, oldBom.getCurrentVersion()); + //旧版是否最新改为0 + oldBom.setLastVersionIs(0); + this.parentResult.add(oldBom); + } + } else { + buildBom(parent, ""); + } + } + } + + private BomNewPbomParentEntity getOldBom(BomNewPbomParentVO parent) { + //目标工厂历史版本 + return pBomParentService.lambdaQuery().eq(BomNewPbomParentEntity::getMaterialNo, parent.getMaterialNo()) + .eq(BomNewPbomParentEntity::getLastVersionIs, 1) + .eq(BomNewPbomParentEntity::getFacCode, targetFacCode).one(); + } + + private List getAllParents() { + return allBomDetail.stream().filter(u -> u.getBomRowId() > 0).collect(Collectors.toList()); + } + + private void buildBom(BomNewPbomParentVO parent, String preVersion) { + Long oldBomRowId = parent.getBomRowId(); + BomNewPbomParentEntity newBom = new BomNewPbomParentEntity(); + BeanUtil.copyProperties(parent, newBom); + newBom.setRowId(IdWorker.getId()); + newBom.setCurrentVersion(VersionUtil.getNextVersion(preVersion)); + newBom.setFacCode(targetFacCode); + parentResult.add(newBom); + //子级 + buildChildren(newBom.getRowId(),oldBomRowId); + + } + + /** + * 构建子级 + * @param newParentRowId + * @param sourceParentRowId + */ + + private void buildChildren(Long newParentRowId, Long sourceParentRowId ){ + List children = SpringUtil.getBean(BomNewPbomChildService.class).lambdaQuery().eq(BomNewPbomChildEntity::getParentRowId, sourceParentRowId).list(); + for (BomNewPbomChildEntity child : children) { + child.setRowId(IdWorker.getId()); + child.setFacCode(targetFacCode); + child.setParentRowId(newParentRowId); + childResult.add(child); + } + } + + + +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomDetailTask.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomDetailTask.java new file mode 100644 index 00000000..ba871feb --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/domain/PBom/PBomDetailTask.java @@ -0,0 +1,103 @@ +package com.nflg.product.bomnew.service.domain.PBom; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.nflg.product.bomnew.pojo.entity.BomNewEbomParentEntity; +import com.nflg.product.bomnew.pojo.entity.BomNewPbomChildEntity; +import com.nflg.product.bomnew.pojo.entity.BomNewPbomParentEntity; +import com.nflg.product.bomnew.pojo.vo.BomNewEbomParentVO; +import com.nflg.product.bomnew.pojo.vo.BomNewPbomParentVO; +import com.nflg.product.bomnew.service.BomNewEbomParentService; +import com.nflg.product.bomnew.service.BomNewPbomChildService; +import com.nflg.product.bomnew.service.BomNewPbomParentService; +import com.nflg.product.bomnew.util.ListCommonUtil; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.RecursiveTask; +import java.util.stream.Collectors; + +/** + * @author 大米 + * @descreption + * @date 2023/7/8 9:18 + */ +public class PBomDetailTask extends RecursiveTask> { + + private List bomDetail; + + + List result = new ArrayList<>(); + + + + + public PBomDetailTask(List inBomDetail) { + bomDetail = inBomDetail; + + + } + + /** + * 处理BOM明细中未选择Bom版本的明细;使用最新版 + */ + public void handlerChildBomVersionDetail() { + List materialNos = bomDetail.stream().filter(u -> StrUtil.isNotBlank(u.getMaterialNo()) ).map(BomNewPbomParentVO::getMaterialNo).collect(Collectors.toList()); + + if (CollUtil.isNotEmpty(materialNos)) { + + List childBomlist = SpringUtil.getBean(BomNewPbomParentService.class).lambdaQuery().in(BomNewPbomParentEntity::getMaterialNo, materialNos).eq(BomNewPbomParentEntity::getLastVersionIs, 1).list(); + Map parentMap = ListCommonUtil.listToMap(childBomlist, BomNewPbomParentEntity::getMaterialNo); + for (BomNewPbomParentVO detailVO : bomDetail) { + if (parentMap.containsKey(detailVO.getMaterialNo())) { + BomNewPbomParentEntity ebomParentEntity = parentMap.get(detailVO.getMaterialNo()); + detailVO.setBomRowId(ebomParentEntity.getRowId()); + detailVO.setSourceRowId(ebomParentEntity.getSourceRowId()); + detailVO.setCurrentVersion(ebomParentEntity.getCurrentVersion()); + } + } + + + } + + + } + + /** + * 递归调用零部件BOM + * + * @return + */ + @Override + protected List compute() { + + handlerChildBomVersionDetail(); + // 最新 BOM 版本 + + result.addAll(bomDetail); + + if (CollUtil.isNotEmpty(bomDetail)) { + List childBowIds = bomDetail.stream().filter(u-> u.getBomRowId() > 0).map(u->u.getBomRowId()).collect(Collectors.toList()); + if(CollUtil.isNotEmpty(childBowIds)) { + List children = SpringUtil.getBean(BomNewPbomChildService.class).lambdaQuery().in(BomNewPbomChildEntity::getParentRowId, childBowIds).list(); + List bom = Convert.toList(BomNewPbomParentVO.class,children); + + PBomDetailTask task = new PBomDetailTask(bom); + task.fork(); + bomDetail.addAll(task.join()); + return bomDetail; + } + + } + return result; + + + } + + +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/VersionUtil.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/VersionUtil.java index 98fb8668..c09d32be 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/VersionUtil.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/util/VersionUtil.java @@ -3,10 +3,11 @@ package com.nflg.product.bomnew.util; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; +import org.springframework.data.util.Version; -import java.math.BigDecimal; import java.util.Arrays; -import java.util.Objects; + +import static org.apache.naming.SelectorContext.prefix; /** * 版本 工具类 @@ -74,4 +75,18 @@ public class VersionUtil { return nextVersion; } + /** + * 版本比较 + * @param version1 + * @param version2 + * @return version1>version2 返回>0,version1 + + + delete from t_bom_new_pbom_child where parent_row_id =#{parentRowId} + +