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 5cf96161..a5324f58 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 @@ -435,7 +435,9 @@ public class EbomApi extends BaseApi { @ApiOperation("导入到SAP") public ResultVO> importToSAP(@Valid @RequestBody @NotEmpty List rootBomRowIds) { VUtils.isTure(rootBomRowIds.size() > 1).throwMessage("每次只能导入1条"); - return ResultVO.success(bomNewEbomParentService.importToSAP(rootBomRowIds.get(0))); + // return ResultVO.success(bomNewEbomParentService.importToSAP(rootBomRowIds.get(0))); + BomNewEbomExportToSAP exportToSAP = new BomNewEbomExportToSAP(); + return ResultVO.success(exportToSAP.export(rootBomRowIds.get(0))); } /** diff --git a/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewEbomExportToSAP.java b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewEbomExportToSAP.java new file mode 100644 index 00000000..2b969958 --- /dev/null +++ b/nflg_project_dev/nflg-bom-new/src/main/java/com/nflg/product/bomnew/service/BomNewEbomExportToSAP.java @@ -0,0 +1,209 @@ +package com.nflg.product.bomnew.service; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.nflg.product.base.core.conmon.util.SessionUtil; +import com.nflg.product.bomnew.constant.BomConstant; +import com.nflg.product.bomnew.constant.EBomStatusEnum; +import com.nflg.product.bomnew.constant.SapStatusEnum; +import com.nflg.product.bomnew.constant.VirtualPackageTypeEnum; +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.BomNewEbomChildEntity; +import com.nflg.product.bomnew.pojo.entity.BomNewEbomParentEntity; +import com.nflg.product.bomnew.pojo.entity.BomNewSapErrorMsgEntity; +import com.nflg.product.bomnew.pojo.vo.OperationErrorMsgVO; +import com.nflg.product.bomnew.util.VUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.*; + +/** + * @author 曹鹏飞 + * @date 2024/5/30 14:32:26 + */ +public class BomNewEbomExportToSAP { + + private final static String TAG = "Ebom导入到SAP"; + + private final String dateYMD = DateUtil.format(new Date(), "yyyyMMdd"); + private final Map> cmap = new HashMap<>(); + private final List children = new ArrayList<>(); + + private final static Logger LOGGER = LoggerFactory.getLogger(BomNewEbomExportToSAP.class); + + private final BomNewEbomParentService bomNewEbomParentService = SpringUtil.getBean(BomNewEbomParentService.class); + private final BomNewEbomChildService bomNewEbomChildService = SpringUtil.getBean(BomNewEbomChildService.class); + private final BomNewSapErrorMsgService bomNewSapErrorMsgService = SpringUtil.getBean(BomNewSapErrorMsgService.class); + + public List export(Long rootBomRowId) { + BomNewEbomParentEntity root = bomNewEbomParentService.getById(rootBomRowId); + VUtils.isTure(Objects.isNull(root)).throwMessage("数据不存在"); + VUtils.isTure(root.getUserRootIs() != 1).throwMessage("请选择根节点"); + VUtils.isTure(Objects.equals(root.getSapState(), SapStatusEnum.PUB_RUNNING.getValue())) + .throwMessage("正在导入中,请等待操作完成"); + + List liErrMsg = null; + updateSapState(rootBomRowId, SapStatusEnum.PUB_RUNNING); + SapStatusEnum state = SapStatusEnum.PUB_ERROR_ALL; + try { + List children = getChildren(root); + children.forEach(it -> buildChildrenForSap(0L, root, it)); + + ImportSapParamDTO sapDto = new ImportSapParamDTO(); + sapDto.setZID(RandomUtil.randomNumbers(5)); + sapDto.setI_WERKS("1"); + sapDto.setI_STLAN("2"); + sapDto.setI_EMPNO(root.getCreatedBy()); + sapDto.setT1(this.children); + liErrMsg = SpringUtil.getBean(SapOpUtilService.class).importToSapV2(sapDto, null); + if (CollUtil.isEmpty(liErrMsg)) { + state = SapStatusEnum.PUB_SUCCESS; + } else if (sapDto.getT1().size() != liErrMsg.size()) { + state = SapStatusEnum.PUB_ERROR; + } + saveSapErrorMsg(rootBomRowId, liErrMsg); + } finally { + updateSapState(rootBomRowId, state); + } + return liErrMsg; + } + + /** + * 构建child数据 + * @param cRowId 上层的直发包rowId + * @param p 父级节点的parent + * @param c 父级节点的child + * @return 是否是空的直发包 + */ + private boolean buildChildrenForSap(Long cRowId, BomNewEbomParentEntity p, BomNewEbomChildEntity c) { + List cc = getChildren(p); + if (CollUtil.isEmpty(cc)) { + return Objects.equals(c.getVirtualPartType(), VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.getValue()); + } + boolean isEmpty = false; + for (BomNewEbomChildEntity it : cc) { + if (Objects.equals(c.getVirtualPartType(), VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.getValue())) { + if (Objects.nonNull(cRowId)) { + if (cRowId == 0L) { + LOGGER.debug("{} 添加物料 编号:{},父级编号:{},数量:{},描述:{}", TAG, it.getMaterialNo(), c.getMaterialNo(), it.getNum().toString(), it.getMaterialDesc()); + children.add(convert(it, c.getMaterialNo())); + } else { + T1DTO cct = cmap.get(cRowId).stream() + .filter(ct -> (StrUtil.equals(ct.getPOSTP(), BomConstant.PROJECT_TYPE_TEMPORARY, true) && StrUtil.equals(ct.getPOTX1(), it.getMaterialDesc())) + || (!StrUtil.equals(ct.getPOSTP(), BomConstant.PROJECT_TYPE_TEMPORARY, true) && StrUtil.equals(ct.getIDNRK(), it.getMaterialNo()))) + .findFirst() + .orElse(null); + if (Objects.isNull(cct)) { + LOGGER.debug("{} 物料提层到上级发货包 编号:{},父级编号:{},数量:{},描述:{}", TAG, it.getMaterialNo(), c.getMaterialNo(), it.getNum().toString(), it.getMaterialDesc()); + cct = convert(it, p.getMaterialNo()); + cmap.get(cRowId).add(cct); + children.add(cct); + } else { + //合并计算数量 + cct.setMENGE(new BigDecimal(cct.getMENGE()).add(it.getNum()).toString()); + LOGGER.debug("{} 物料提层到上级发货包且合并 编号:{},父级编号:{},数量:{},合并后总数:{},描述:{}", TAG, it.getMaterialNo(), c.getMaterialNo(), it.getNum().toString(), cct.getMENGE(), it.getMaterialDesc()); + } + } + } + isEmpty = true; + } else if (!Objects.equals(it.getVirtualPartType(), VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.getValue())) { + LOGGER.debug("{} 添加物料 编号:{},父级编号:{},数量:{},描述:{}", TAG, it.getMaterialNo(), c.getMaterialNo(), it.getNum().toString(), it.getMaterialDesc()); + children.add(convert(it, c.getMaterialNo())); + } + if (it.getVirtualPartType() > VirtualPackageTypeEnum.UN_VIRTUAL_PACKAGE.getValue() + && !Objects.equals(it.getVirtualPartType(), VirtualPackageTypeEnum.DELIVERY_PACKAGE.getValue())) { + cRowId = null; + } + BomNewEbomParentEntity cp = getParent(it); + if (Objects.nonNull(cp)) { + List pcs = getChildren(cp); + if (CollUtil.isNotEmpty(pcs)) { + BomNewEbomChildEntity zfc = pcs.stream() + .filter(pt -> Objects.equals(pt.getVirtualPartType(), VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.getValue())) + .findFirst() + .orElse(null); + if (Objects.nonNull(zfc)) { + BomNewEbomParentEntity zfp = getParent(zfc); + VUtils.isTure(Objects.isNull(zfp)).throwMessage(StrUtil.format("直发包({})对应的parent丢失", zfc.getMaterialNo())); + cRowId = zfp.getRowId(); + cmap.put(cRowId, new ArrayList<>()); + LOGGER.debug("{} 直发包 rowId:{},编号:{},描述:{}", TAG, cRowId, zfc.getMaterialNo(), zfc.getMaterialDesc()); + } + } + boolean b = buildChildrenForSap(cRowId, cp, it); + if (!b && Objects.equals(it.getVirtualPartType(), VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.getValue())) { + //非空的直发包 + LOGGER.debug("{} 添加物料 编号:{},父级编号:{},数量:{},描述:{}", TAG, it.getMaterialNo(), c.getMaterialNo(), it.getNum().toString(), it.getMaterialDesc()); + children.add(convert(it, c.getMaterialNo())); + } + } + } + return isEmpty; + } + + private void saveSapErrorMsg(Long rootBomRowId, List liErrMsg) { + bomNewSapErrorMsgService.getBaseMapper().delete(Wrappers.lambdaQuery(BomNewSapErrorMsgEntity.class) + .eq(BomNewSapErrorMsgEntity::getTargetRowId, rootBomRowId)); + + if (CollUtil.isNotEmpty(liErrMsg)) { + BomNewSapErrorMsgEntity sapErrorMsgEntity = new BomNewSapErrorMsgEntity(); + sapErrorMsgEntity.setTargetRowId(rootBomRowId); + sapErrorMsgEntity.setType(0); + sapErrorMsgEntity.setData(JSON.toJSONString(liErrMsg)); + sapErrorMsgEntity.setCreatedName(SessionUtil.getRealName()); + sapErrorMsgEntity.setCreatedTime(LocalDateTime.now()); + bomNewSapErrorMsgService.saveOrUpdate(sapErrorMsgEntity); + } + } + + private T1DTO convert(BomNewEbomChildEntity child, String parentMaterialNo) { + T1DTO t = new T1DTO(); + t.setID(RandomUtil.randomNumbers(5)); + t.setMATNR(parentMaterialNo); + t.setMENGE(child.getNum().toString()); + t.setPOSTP(child.getProjectType()); + t.setDATUM(dateYMD); + t.setMEINS(child.getMaterialUnit()); + t.setIDNRK(child.getMaterialNo()); + if (BomConstant.PROJECT_TYPE_TEMPORARY.equals(child.getProjectType())) { + t.setIDNRK(""); + t.setPOTX1(child.getMaterialDesc()); + } + return t; + } + + private BomNewEbomParentEntity getParent(BomNewEbomChildEntity c) { + BomNewEbomParentEntity p = bomNewEbomParentService.lambdaQuery() + .eq(BomNewEbomParentEntity::getMaterialNo, c.getMaterialNo()) + .eq(BomNewEbomParentEntity::getStatus, EBomStatusEnum.PUBLISHED.getValue()) + .orderByDesc(BomNewEbomParentEntity::getCurrentVersion) + .last(" limit 1") + .one(); + if (Objects.nonNull(p) && p.getUserRootIs() == 0) { + return p; + } + return null; + } + + private List getChildren(BomNewEbomParentEntity parent) { + return bomNewEbomChildService.lambdaQuery() + .eq(BomNewEbomChildEntity::getParentRowId, parent.getRowId()) + .list(); + } + + private void updateSapState(Long rootBomRowId, SapStatusEnum sapState) { + bomNewEbomParentService.lambdaUpdate().eq(BomNewEbomParentEntity::getRowId, rootBomRowId) + .set(BomNewEbomParentEntity::getSapTime, LocalDateTime.now()) + .set(BomNewEbomParentEntity::getSapState, sapState.getValue()) + .update(); + } +} 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 da147098..2ab2b156 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 @@ -1016,6 +1016,7 @@ public class BomNewEbomParentService extends ServiceImpl()); LOGGER.debug("{} 直发包 rowId:{},编号:{},描述:{}", TAG, ddpRowId, cpttp.getMaterialNo(), cpttp.getMaterialDesc()); @@ -130,15 +130,10 @@ public class BomNewPbomExportToSAPImpl implements IBomNewPbomExportToSAP { t.setPOSTP(child.getProjectType()); t.setDATUM(dateYMD); t.setMEINS(child.getMaterialUnit()); + t.setIDNRK(child.getMaterialNo()); if (BomConstant.PROJECT_TYPE_TEMPORARY.equals(child.getProjectType())) { t.setIDNRK(""); t.setPOTX1(child.getMaterialDesc()); - } else { - t.setIDNRK(child.getMaterialNo()); - // BaseMaterialVO bm = materialBaseInfos.stream().filter(m -> m.getMaterialNo().equals(d.getMaterialNo())).findFirst().orElse(null); - // if (!Objects.isNull(bm)) { - // t1.setMEINS(bm.getMaterialUnit()); - // } } return t; } @@ -149,7 +144,7 @@ public class BomNewPbomExportToSAPImpl implements IBomNewPbomExportToSAP { /** * 构建child数据 - * @param cRowId 顶层的的直发包rowId + * @param cRowId 顶层的直发包rowId * @param p 父级节点的parent * @param c 父级节点的child * @return @@ -182,7 +177,7 @@ public class BomNewPbomExportToSAPImpl implements IBomNewPbomExportToSAP { LOGGER.debug("{} 物料提层到顶级发货包且合并 编号:{},父级编号:{},数量:{},合并后总数:{},描述:{}", TAG, it.getMaterialNo(), c.getMaterialNo(), it.getNum().toString(), cct.getMENGE(), it.getMaterialDesc()); } } - } else { + } else if (!Objects.equals(it.getVirtualPartType(), VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.getValue())) { LOGGER.debug("{} 添加物料 编号:{},父级编号:{},数量:{},描述:{}", TAG, it.getMaterialNo(), c.getMaterialNo(), it.getNum().toString(), it.getMaterialDesc()); children.add(convert(it, c.getMaterialNo())); } @@ -200,11 +195,17 @@ public class BomNewPbomExportToSAPImpl implements IBomNewPbomExportToSAP { } private BomNewPbomParentEntity getParent(BomNewPbomChildEntity child) { - return bomNewPbomParentService.lambdaQuery() + BomNewPbomParentEntity p = bomNewPbomParentService.lambdaQuery() .eq(BomNewPbomParentEntity::getMaterialNo, child.getMaterialNo()) .eq(BomNewPbomParentEntity::getStatus, PBomStatusEnum.FACTORY_CONFIRM.getValue()) .eq(BomNewPbomParentEntity::getFacCode, child.getFacCode()) + .orderByDesc(BomNewPbomParentEntity::getCurrentVersion) + .last(" limit 1") .one(); + if (Objects.nonNull(p) && p.getUserRootIs() == 0) { + return p; + } + return null; } // private List getChildren(List parents) {