From 048ac5570699539ca2d467641f5e0e163f95c91a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Wed, 5 Jun 2024 16:21:31 +0800 Subject: [PATCH] =?UTF-8?q?feat(pbom):=20=E9=87=8D=E5=86=99=E5=A4=8D?= =?UTF-8?q?=E5=88=B6=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../product/bomnew/api/user/PBomV2Api.java | 40 ++++ .../mapper/master/BomNewPbomParentMapper.java | 2 + .../product/bomnew/pojo/dto/PbomSaveDTO.java | 39 ++++ .../pojo/entity/BomNewPbomParentEntity.java | 6 +- .../bomnew/pojo/query/CopyPBomV2Query.java | 45 +++++ .../service/BomNewEbomParentService.java | 1 + .../service/BomNewPbomParentService.java | 189 ++++++++++++++++++ .../mapper/master/BomNewPbomParentMapper.xml | 17 ++ 8 files changed, 336 insertions(+), 3 deletions(-) create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/PBomV2Api.java create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/PbomSaveDTO.java create mode 100644 nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/query/CopyPBomV2Query.java diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/PBomV2Api.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/PBomV2Api.java new file mode 100644 index 00000000..6fef49a6 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/api/user/PBomV2Api.java @@ -0,0 +1,40 @@ +package com.nflg.product.bomnew.api.user; + +import com.nflg.product.base.core.api.BaseApi; +import com.nflg.product.bomnew.pojo.query.CopyPBomV2Query; +import com.nflg.product.bomnew.service.BomNewPbomParentService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import nflg.product.common.vo.ResultVO; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.validation.Valid; + +/** + * @author 曹鹏飞 + * @date 2024/6/5 13:35:15 + */ +@Api(tags = "PBom接口V2") +@RestController +@RequestMapping("pbom/v2") +public class PBomV2Api extends BaseApi { + + @Resource + private BomNewPbomParentService bomNewPbomParentService; + + /** + * 复制 + * @param param + * @return + */ + @PostMapping("copyFrom") + @ApiOperation("复制从") + public ResultVO copyFrom(@Valid @RequestBody CopyPBomV2Query param) { + bomNewPbomParentService.copyFromV2(param); + return ResultVO.success(); + } +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewPbomParentMapper.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewPbomParentMapper.java index 4196a283..0628c2e8 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewPbomParentMapper.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/mapper/master/BomNewPbomParentMapper.java @@ -11,6 +11,7 @@ import org.apache.ibatis.annotations.Param; import java.util.Collection; import java.util.List; +import java.util.Set; /** * t_bom_new_pbom_parent 表数据库访问层 @@ -64,4 +65,5 @@ public interface BomNewPbomParentMapper extends BaseMapper bomRowIds); + List getLatestParents(Set materialNos, String facCode); } diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/PbomSaveDTO.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/PbomSaveDTO.java new file mode 100644 index 00000000..a3b5d5f5 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/dto/PbomSaveDTO.java @@ -0,0 +1,39 @@ +package com.nflg.product.bomnew.pojo.dto; + +import lombok.Data; + +import java.util.*; + +/** + * @author 曹鹏飞 + * @date 2024/6/5 14:28:04 + */ +@Data +public class PbomSaveDTO { + + private Set rowIdsForDelete = new HashSet<>(); + + private List dataForAdd = new ArrayList<>(); + + private List dataForUpdate = new ArrayList<>(); + + public void addToDelete(Long rowId) { + rowIdsForDelete.add(rowId); + } + + public void addToDelete(Collection rowId) { + rowIdsForDelete.addAll(rowId); + } + + public void addToAdd(T data) { + dataForAdd.add(data); + } + + public void addToAdd(Collection data) { + dataForAdd.addAll(data); + } + + public void addToUpdate(T data) { + dataForUpdate.add(data); + } +} diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomParentEntity.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomParentEntity.java index 08edaf96..2c595ceb 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomParentEntity.java +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/entity/BomNewPbomParentEntity.java @@ -174,11 +174,11 @@ public class BomNewPbomParentEntity implements Serializable { private Integer editStatus; /** - * BOM状态:1=待发布 2=待分配工厂 3=已分配工厂 4=已发布 + * BOM状态:1=待发布 2-借用件 4=已发布 8=待分配工厂 16=已分配工厂 * @see com.nflg.product.bomnew.constant.PBomStatusEnum */ @TableField(value = "status") - @ApiModelProperty(value = "BOM状态:1=待发布 4=已发布 8=待分配工厂 16=已分配工厂") + @ApiModelProperty(value = "BOM状态:1=待发布 2-借用件 4=已发布 8=待分配工厂 16=已分配工厂") private Integer status; /** @@ -366,7 +366,7 @@ public class BomNewPbomParentEntity implements Serializable { * 来源 1-ebom转换 2-dqbom转换 3-从SAP导入 */ @TableField(value = "source") - @ApiModelProperty(value = "来源 1-ebom转换 2-dqbom转换 3-从SAP导入") + @ApiModelProperty(value = "来源 1-ebom转换 2-dqbom转换 3-从SAP导入 4-复制") private Integer source; private static final long serialVersionUID = -31999878274445137L; diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/query/CopyPBomV2Query.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/query/CopyPBomV2Query.java new file mode 100644 index 00000000..a7dfc8ce --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/pojo/query/CopyPBomV2Query.java @@ -0,0 +1,45 @@ +package com.nflg.product.bomnew.pojo.query; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; + +/** + * @author 曹鹏飞 + * @date 2024/6/5 13:38:22 + */ +@Data +@Accessors(chain = true) +@ApiModel(value = "com-nflg-product-bomnew-pojo-new-query-CopyPBomV2Query") +public class CopyPBomV2Query { + + /** + * 源Bom行ID + */ + @ApiModelProperty("源Bom行ID") + @NotNull(message = "源Bom行ID不能为空") + private Long sourceBomRowId; + + /** + * 目标工厂编码 + */ + @ApiModelProperty("目标工厂编码") + @NotNull(message = "目标工厂编码不能为空") + private String targetFacCode; + + /** + * 复制模式 0-单层;1-多层 + */ + @ApiModelProperty("复制模式 0-单层;1-多层") + @NotNull(message = "复制模式不能为空") + private Integer copyType; + + /** + * 如果存在于工作表是否覆盖 + */ + @ApiModelProperty("如果存在于工作表是否覆盖") + private Boolean replaceIfExistDraft; +} 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 8dbfe7df..e737dd37 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 @@ -48,6 +48,7 @@ import java.io.OutputStream; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; 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 66d1c215..265a918f 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 @@ -25,11 +25,13 @@ import com.nflg.product.bomnew.pojo.dto.sap.impart2.ImportSapParamDTO; import com.nflg.product.bomnew.pojo.dto.sap.impart2.T1DTO; import com.nflg.product.bomnew.pojo.entity.*; import com.nflg.product.bomnew.pojo.query.BomNewPbomParentQuery; +import com.nflg.product.bomnew.pojo.query.CopyPBomV2Query; import com.nflg.product.bomnew.pojo.query.PbomImportToSAPQuery; import com.nflg.product.bomnew.pojo.vo.*; import com.nflg.product.bomnew.service.domain.PBom.*; import com.nflg.product.bomnew.service.domain.Sap; import com.nflg.product.bomnew.util.*; +import lombok.extern.slf4j.Slf4j; import nflg.product.common.constant.STATE; import nflg.product.common.vo.ResultVO; import org.springframework.beans.factory.annotation.Qualifier; @@ -60,6 +62,7 @@ import java.util.stream.Collectors; * @since 2024-01-01 10:39:57 */ @Service +@Slf4j public class BomNewPbomParentService extends ServiceImpl { @@ -1231,4 +1234,190 @@ public class BomNewPbomParentService extends ServiceImpl dtoParent = new PbomSaveDTO<>(); + PbomSaveDTO dtoChild = new PbomSaveDTO<>(); + BomNewPbomParentEntity old = lambdaQuery() + .eq(BomNewPbomParentEntity::getMaterialNo, source.getMaterialNo()) + .ge(BomNewPbomParentEntity::getStatus, PBomStatusEnum.PUBLISH.getValue()) + .eq(BomNewPbomParentEntity::getFacCode, param.getTargetFacCode()) + .orderByDesc(BomNewPbomParentEntity::getCurrentVersion) + .last(" limit 1") + .one(); + if (Objects.isNull(old)) { + //正式表不已存在记录,检查工作表是否存在记录 + old = lambdaQuery() + .eq(BomNewPbomParentEntity::getMaterialNo, source.getMaterialNo()) + .lt(BomNewPbomParentEntity::getStatus, PBomStatusEnum.PUBLISH.getValue()) + .eq(BomNewPbomParentEntity::getFacCode, param.getTargetFacCode()) + .orderByDesc(BomNewPbomParentEntity::getCurrentVersion) + .last(" limit 1") + .one(); + if (Objects.nonNull(old)) { + VUtils.isTure(!StrUtil.equals(SessionUtil.getUserCode(), old.getCreatedBy())) + .throwMessage(StrUtil.format("该bom已被{}创建", old.getCreatedBy())); + + if (Objects.isNull(param.getReplaceIfExistDraft())) { + throw new NflgBusinessException(STATE.InconsistentDataError, "你已在工作表创建了该记录,请选择是否覆盖?"); + } else if (param.getReplaceIfExistDraft()) { + dtoParent.addToDelete(old.getRowId()); + BomNewPbomParentEntity top = buildPbomParent(source, param.getTargetFacCode(), old.getCurrentVersion()); + dtoParent.addToAdd(top); + //删除原数据的下级 + dtoChild.addToDelete(pbomChildService.lambdaQuery() + .select(BomNewPbomChildEntity::getRowId) + .eq(BomNewPbomChildEntity::getParentRowId, old.getRowId()) + .list() + .stream() + .map(BomNewPbomChildEntity::getRowId) + .collect(Collectors.toSet())); + //复制子级 + List cs = copyChildren(source.getRowId(), param.getTargetFacCode(), top.getRowId()); + if (CollUtil.isNotEmpty(cs)) { + dtoChild.addToAdd(cs); + if (param.getCopyType() == 1) { + //多层复制模式 + copy(cs, param.getTargetFacCode(), dtoParent, dtoChild); + } + } + } + } + } else { + //正式表已存在记录 + BomNewPbomParentEntity top = buildPbomParent(source, param.getTargetFacCode(), VersionUtil.getNextVersion(old.getCurrentVersion())); + dtoParent.addToAdd(top); + //复制子级 + List cs = copyChildren(source.getRowId(), param.getTargetFacCode(), top.getRowId()); + if (CollUtil.isNotEmpty(cs)) { + dtoChild.addToAdd(cs); + if (param.getCopyType() == 1) { + //多层复制模式 + copy(cs, param.getTargetFacCode(), dtoParent, dtoChild); + } + } + } + + if (CollUtil.isNotEmpty(dtoParent.getRowIdsForDelete())) { + Integer count = this.getBaseMapper().deleteBatchIds(dtoParent.getRowIdsForDelete()); + log.debug("copyFromV2 删除parent{}个", count); + } + if (CollUtil.isNotEmpty(dtoParent.getDataForAdd())) { + this.saveBatch(dtoParent.getDataForAdd()); + log.debug("copyFromV2 添加parent{}个", dtoParent.getDataForAdd().size()); + } + if (CollUtil.isNotEmpty(dtoParent.getDataForUpdate())) { + this.updateBatchById(dtoParent.getDataForUpdate()); + log.debug("copyFromV2 更新parent{}个", dtoParent.getDataForUpdate().size()); + } + + if (CollUtil.isNotEmpty(dtoChild.getRowIdsForDelete())) { + Integer count = pbomChildService.getBaseMapper().deleteBatchIds(dtoChild.getRowIdsForDelete()); + log.debug("copyFromV2 删除child{}个", count); + } + if (CollUtil.isNotEmpty(dtoChild.getDataForAdd())) { + pbomChildService.saveBatch(dtoChild.getDataForAdd()); + log.debug("copyFromV2 添加child{}个", dtoChild.getDataForAdd().size()); + } + if (CollUtil.isNotEmpty(dtoChild.getDataForUpdate())) { + pbomChildService.updateBatchById(dtoChild.getDataForUpdate()); + log.debug("copyFromV2 更新child{}个", dtoChild.getDataForUpdate().size()); + } + } + + private void copy(List cs, String targetFacCode + , PbomSaveDTO dtoParent, PbomSaveDTO dtoChild) { + List ps = getLatestParents(cs.stream().map(BomNewPbomChildEntity::getMaterialNo).collect(Collectors.toSet()) + , targetFacCode); + if (CollUtil.isNotEmpty(ps)) { + ps.forEach(p -> { + BomNewPbomParentEntity np = copyParent(p, targetFacCode); + if (Objects.nonNull(np)) { + dtoParent.addToAdd(np); + List ccs = copyChildren(p.getRowId(), targetFacCode, np.getRowId()); + if (CollUtil.isNotEmpty(ccs)) { + dtoChild.addToAdd(ccs); + copy(ccs, targetFacCode, dtoParent, dtoChild); + } + } + }); + } + } + + private BomNewPbomParentEntity copyParent(BomNewPbomParentEntity parent, String targetFacCode) { + if (lambdaQuery() + .eq(BomNewPbomParentEntity::getMaterialNo, parent.getMaterialNo()) + .eq(BomNewPbomParentEntity::getStatus, PBomStatusEnum.WAIT_PUBLISH.getValue()) + .exists()) { + //工作表不存在记录,则添加 + return buildPbomParent(parent, targetFacCode, parent.getCurrentVersion()); + } + return null; + } + + private List getLatestParents(Set materialNos, String facCode) { + return this.getBaseMapper().getLatestParents(materialNos, facCode); + } + + private List copyChildren(Long parentRowId, String targetFacCode, Long newParentRowId) { + List cc = pbomChildService.lambdaQuery() + .eq(BomNewPbomChildEntity::getParentRowId, parentRowId) + .list(); + cc.forEach(it -> { + it.setRowId(IdWorker.getId()); + it.setParentRowId(newParentRowId); + it.setSource(4); + it.setCreatedBy(SessionUtil.getUserCode()); + it.setCreatedTime(LocalDateTime.now()); + it.setFacCode(targetFacCode); + it.setSourceRowId(0L); + it.setIdentityNo(newParentRowId + "_" + it.getRowId()); + it.setModifyTime(null); + }); + return cc; + } + + private BomNewPbomParentEntity buildPbomParent(BomNewPbomParentEntity source, String targetFacCode, String currentVersion) { + BomNewPbomParentEntity newP = Convert.convert(BomNewPbomParentEntity.class, source); + newP.setRowId(IdWorker.getId()); + newP.setExpireEndTime(null); + newP.setLastConvertMbomTime(null); + newP.setLastConvertMbomUserName(""); + newP.setNoticeNums(""); + newP.setOrderNo(""); + newP.setRemark(""); + newP.setSapState(1); + newP.setSapTime(null); + newP.setSuperMaterialStatus(0); + newP.setCreatedBy(SessionUtil.getUserCode()); + newP.setCreatedJob(userRoleService.technician() ? UserJobEnum.ENGINEER.getValue() : UserJobEnum.DESIGNER.getValue()); + newP.setDeptName(SessionUtil.getDepartName()); + newP.setDeptRowId(SessionUtil.getDepartRowId()); + newP.setTechnologyUserCode(SessionUtil.getUserCode()); + newP.setTechnologyUserName(SessionUtil.getRealName()); + newP.setBatchNo(""); + newP.setCreatedTime(LocalDateTime.now()); + newP.setSource(4); + newP.setEditStatus(PBomEditStatusEnum.HANDLER_CREATED.getValue()); + newP.setStatus(PBomStatusEnum.WAIT_PUBLISH.getValue()); + newP.setUserRootIs(1); + newP.setRootIs(newP.getMaterialNo().startsWith("31") ? 1 : 0); + newP.setReleaseUserName(""); + newP.setReleaseTime(null); + newP.setSourceRowId(0L); + newP.setFacCode(targetFacCode); + newP.setModifyTime(null); + newP.setChangeDesc(""); + newP.setLastVersionIs(0); + newP.setBomExist(1); + newP.setCurrentVersion(currentVersion); + newP.setDeviseName(""); + newP.setDeviseUserCode(""); + return newP; + } } diff --git a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewPbomParentMapper.xml b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewPbomParentMapper.xml index dd96d7b2..2ad9c203 100644 --- a/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewPbomParentMapper.xml +++ b/nflg_project_dev/nflg-bom-new/src/main/resources/mapper/master/BomNewPbomParentMapper.xml @@ -242,6 +242,23 @@ SET p.bom_exist = (IF(EXISTS (SELECT 1 FROM t_bom_new_pbom_child WHERE parent_row_id = p.row_id), 1, 0)) WHERE p.row_id = #{rowId}; +