optimize(ebom): 导入到SAP时F项不需要提层,只需要把空的直发包丢弃

This commit is contained in:
曹鹏飞 2024-06-17 11:36:04 +08:00
parent b9f37aea55
commit 65d71b8e69
1 changed files with 18 additions and 60 deletions

View File

@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
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;
@ -23,7 +22,6 @@ import nflg.product.common.constant.STATE;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@ -37,7 +35,6 @@ public class BomNewEbomExportToSAP {
private final static String TAG = "Ebom导入到SAP";
private final String dateYMD = DateUtil.format(new Date(), "yyyyMMdd");
private final Map<String, List<T1ExtDTO>> cmap = new HashMap<>();
private final List<T1ExtDTO> children = new ArrayList<>();
private final static Logger LOGGER = LoggerFactory.getLogger(BomNewEbomExportToSAP.class);
@ -57,13 +54,15 @@ public class BomNewEbomExportToSAP {
updateSapState(rootBomRowId, SapStatusEnum.PUB_RUNNING);
SapStatusEnum state = SapStatusEnum.PUB_ERROR_ALL;
try {
buildChildrenForSap(null, root, false);
buildChildrenForSap(root);
//移除空的直发包
cmap.forEach((k, v) -> {
if (v.isEmpty()) {
children.removeIf(it -> it.isZFB() && StrUtil.equals(it.getIDNRK(), k));
}
});
Set<String> zfbMaterialNos = this.children.stream().filter(T1ExtDTO::isZFB).map(T1ExtDTO::getIDNRK).collect(Collectors.toSet());
if (CollUtil.isNotEmpty(zfbMaterialNos)) {
Set<String> allMaterialNos = this.children.stream().map(T1ExtDTO::getMATNR).collect(Collectors.toSet());
zfbMaterialNos.removeAll(allMaterialNos);
LOGGER.debug("{} 移除空的直发包:{}", TAG, String.join(",", zfbMaterialNos));
this.children.removeIf(c -> c.isZFB() && zfbMaterialNos.contains(c.getIDNRK()));
}
ImportSapParamDTO sapDto = new ImportSapParamDTO();
sapDto.setZID(RandomUtil.randomNumbers(5));
@ -91,65 +90,23 @@ public class BomNewEbomExportToSAP {
}
/**
* 构建child数据
* @param zfbMaterialNo 上层的直发包编号
* 构建child数据发包编号
* @param p 上级节点的parent
*/
private void buildChildrenForSap(String zfbMaterialNo, BomNewEbomParentEntity p, boolean ignore) {
private void buildChildrenForSap(BomNewEbomParentEntity p) {
List<BomNewEbomChildEntity> cc = getChildren(p);
for (BomNewEbomChildEntity it : cc) {
handlerItem(zfbMaterialNo, it, p, ignore);
handlerItem(it, p);
}
LOGGER.debug("children数量" + children.size());
}
private void handlerItem(String zfbMaterialNo, BomNewEbomChildEntity it, BomNewEbomParentEntity p, boolean ignore) {
if (StrUtil.equals(it.getProjectType(), ProjectTypeInputTypeEnum.ProjectTypeEnum.TYPE_F.getValue())) {
if (StrUtil.isNotBlank(zfbMaterialNo)) {
T1ExtDTO cct = cmap.get(zfbMaterialNo).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(), p.getMaterialNo(), it.getNum().toString(), it.getMaterialDesc());
cct = convert(it, p.getMaterialNo(), false, false);
cmap.get(zfbMaterialNo).add(cct);
children.add(cct);
} else {
//合并计算数量
cct.setMENGE(new BigDecimal(cct.getMENGE()).add(it.getNum()).toString());
LOGGER.debug("{} 物料提层到上级直发包且合并 编号:{},父级编号:{},数量:{},合并后总数:{},描述:{}", TAG, it.getMaterialNo(), p.getMaterialNo(), it.getNum().toString(), cct.getMENGE(), it.getMaterialDesc());
}
}
} else {
LOGGER.debug("{} 添加物料 编号:{},父级编号:{},数量:{},描述:{}", TAG, it.getMaterialNo(), p.getMaterialNo(), it.getNum().toString(), it.getMaterialDesc());
children.add(convert(it, p.getMaterialNo(), ignore, Objects.equals(it.getVirtualPartType(), VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.getValue())));
}
if (it.getVirtualPartType() > VirtualPackageTypeEnum.UN_VIRTUAL_PACKAGE.getValue()
&& !Objects.equals(it.getVirtualPartType(), VirtualPackageTypeEnum.MAKING_PACKAGE.getValue())) {
zfbMaterialNo = null;
}
private void handlerItem(BomNewEbomChildEntity it, BomNewEbomParentEntity p) {
LOGGER.debug("{} 添加物料 编号:{},父级编号:{},数量:{},描述:{}", TAG, it.getMaterialNo(), p.getMaterialNo(), it.getNum().toString(), it.getMaterialDesc());
children.add(convert(it, p.getMaterialNo(), Objects.equals(it.getVirtualPartType(), VirtualPackageTypeEnum.DIRECT_DELIVERY_PACKAGE.getValue())));
BomNewEbomParentEntity cp = getParent(it);
if (Objects.nonNull(cp)) {
List<BomNewEbomChildEntity> 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()));
zfbMaterialNo = zfp.getMaterialNo();
cmap.put(zfbMaterialNo, new ArrayList<>());
LOGGER.debug("{} 直发包 编号:{},子物料编号:{},描述:{}", TAG, zfbMaterialNo, zfc.getMaterialNo(), zfc.getMaterialDesc());
}
}
if (!ignore && cp.getUserRootIs() == 1) {
ignore = true;
}
buildChildrenForSap(zfbMaterialNo, cp, ignore);
buildChildrenForSap(cp);
}
}
@ -168,7 +125,7 @@ public class BomNewEbomExportToSAP {
}
}
private T1ExtDTO convert(BomNewEbomChildEntity child, String parentMaterialNo, boolean ignore, boolean isZFB) {
private T1ExtDTO convert(BomNewEbomChildEntity child, String parentMaterialNo, boolean isZFB) {
T1ExtDTO t = new T1ExtDTO();
t.setID(RandomUtil.randomNumbers(5));
t.setMATNR(parentMaterialNo);
@ -177,7 +134,7 @@ public class BomNewEbomExportToSAP {
t.setDATUM(dateYMD);
t.setMEINS(child.getMaterialUnit());
t.setIDNRK(child.getMaterialNo());
t.setIgnore(ignore);
t.setIgnore(false);
t.setZFB(isZFB);
if (BomConstant.PROJECT_TYPE_TEMPORARY.equals(child.getProjectType())) {
t.setIDNRK("");
@ -191,6 +148,7 @@ public class BomNewEbomExportToSAP {
.select(BomNewEbomParentEntity::getRowId, BomNewEbomParentEntity::getMaterialNo
, BomNewEbomParentEntity::getMaterialDesc, BomNewEbomParentEntity::getUserRootIs)
.eq(BomNewEbomParentEntity::getMaterialNo, c.getMaterialNo())
.eq(BomNewEbomParentEntity::getUserRootIs, 0)
.eq(BomNewEbomParentEntity::getStatus, EBomStatusEnum.PUBLISHED.getValue())
.ne(BomNewEbomParentEntity::getSource, EBomSourceEnum.FROM_SAP.getValue())
.orderByDesc(BomNewEbomParentEntity::getCurrentVersion)