大包套小包逻辑

uat-temp-nht-2506120000-jialiao
xiangwei.zhang 1 month ago
parent 3231d46ea5
commit 5aa5c776af

@ -0,0 +1,8 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.impp.framework.boot.util.ResultBean;
public interface IMesPackageContainerSnService {
ResultBean packageContain(String organizeCode, String userName, String containSn, String sn);
}

@ -0,0 +1,311 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPackageContainerSnService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack;
import cn.estsh.i3plus.pojo.mes.bean.*;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.util.ResultBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @Description : -
* @Reference :
* @Author : logic
* @CreateDate : 2025/6/16 10:44
* @Modify:
**/
@Service
@Slf4j
public class MesPackageContainerSnServiceImpl implements IMesPackageContainerSnService {
@Autowired
private MesContainerSnRepository mesContainerSnRepository;
@Autowired
private MesContainerTypeRepository mesContainerTypeRepository;
@Autowired
private MesContainerTypePartRepository containerTypePartRepository;
@Autowired
private MesContainerSnPartRepository containerSnPartRepository;
@Autowired
private MesContainerPackageRepository containerPackageRepository;
@Autowired
private MesContainerPackageDetailRepository containerPackageDetailRepository;
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@Autowired
private MesContainerPackageDetailBindingRepository packageDetailBindingRepository;
/**
*
* @param organizeCode
* @param sn
* @return
*/
public ResultBean packageContain(String organizeCode,String userName, String containSn, String sn) {
ResultBean resultBean = ResultBean.success();
try {
// 是否是容器包容器
boolean isContainerToContainer = false;
// 获取容器条码 并判断是否是容器与容器绑定
MesContainerSn mesContainerSn = getMesContainerSnAndValidate(organizeCode, containSn);
MesContainerSn produceSn = getMesContainerSnAndValidate(organizeCode, sn);
if (produceSn != null) {
isContainerToContainer = true;
}
// 如果是容器套容器
if (isContainerToContainer) {
containerToContainer(organizeCode,userName, mesContainerSn, produceSn);
}
}catch (ImppBusiException e) {
resultBean.setErrorMsg(e.getErrorDetail());
resultBean.setSuccess(false);
}
return resultBean;
}
private List<MesContainerSnPart> getMesContainerSnParts(String organizeCode, String containSn) {
List<MesContainerSnPart> mesContainerSnParts = getMesContainerSnPart(organizeCode, containSn);
List<MesContainerTypePart> mesContainerTypeParts = new ArrayList<>();
if (CollectionUtils.isEmpty(mesContainerSnParts)) {
mesContainerSnParts = new ArrayList<>();
mesContainerTypeParts = getMesContainerTypePart(organizeCode, containSn);
if (CollectionUtils.isEmpty(mesContainerTypeParts)) {
MesPcnException.throwBusiException("扫描的容器条码:%s,对应容器零件类型关系不存在", containSn);
}
for (MesContainerTypePart mesContainerTypePart : mesContainerTypeParts) {
MesContainerSnPart mesContainerSnPart = new MesContainerSnPart();
mesContainerSnPart.setMatchType(mesContainerTypePart.getMatchType());
mesContainerSnPart.setContainerTypeCode(mesContainerTypePart.getContainerTypeCode());
mesContainerSnPart.setPartNo(mesContainerTypePart.getPartNo());
mesContainerSnParts.add(mesContainerSnPart);
}
}
return mesContainerSnParts;
}
public ResultBean containerToContainer(String organizeCode,String userName, MesContainerSn masterContainerSn, MesContainerSn subContainerSn) {
ResultBean resultBean = ResultBean.success();
try {
// 获取容器类型
MesContainerType mesContainerType = getMesContainerType(organizeCode, masterContainerSn.getContainerSn(), masterContainerSn.getContainerTypeCode());
if (!Objects.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), mesContainerType.getIsAllowRecursion())) {
MesPcnException.throwBusiException("扫描的容器条码:%s,不允许绑定容器", masterContainerSn.getContainerSn());
}
// 判断子容器是否是已装箱状态
MesContainerPackage masterContainerPackage = getMesContainerPackage(organizeCode, subContainerSn.getContainerSn());
MesContainerPackage subContainerPackage = getMesContainerPackage(organizeCode, subContainerSn.getContainerSn());
if (subContainerPackage == null || subContainerPackage.getPackageStatus() != 30) {
MesPcnException.throwBusiException("扫描的子容器条码:%s,不是已关箱状态", subContainerSn.getContainerSn());
}
// 获取 容器类型与零件关系
List<MesContainerSnPart> masterContainerSnParts = getMesContainerSnParts(organizeCode, masterContainerSn.getContainerSn());
List<MesContainerSnPart> subContainerSnParts = getMesContainerSnParts(organizeCode, subContainerSn.getContainerSn());
List<String> subParts = subContainerSnParts.stream().map(MesContainerSnPart::getPartNo).collect(Collectors.toList());
List<String> masterParts = masterContainerSnParts.stream().map(MesContainerSnPart::getPartNo).collect(Collectors.toList());
if (!masterParts.contains(subParts)) {
MesPcnException.throwBusiException("扫描的主容器条码:%s,与子容器条码不匹配,无法包装", subContainerSn.getContainerSn(),subContainerSn.getContainerSn());
}
/**
*
* 1
* 2
* 3
*/
List<MesContainerPackageDetail> masterPackageDetails = getMesContainerPackageDetail(organizeCode, subContainerSn.getContainerSn(), true);
List<MesContainerPackageDetail> subPackageDetails = getMesContainerPackageDetail(organizeCode, subContainerSn.getContainerSn(), false);
// 调用涛哥的根据条码对应标包验证。todo
if (masterContainerPackage == null) {
masterContainerPackage = createMesContainerPackage(userName, masterContainerSn);
}
MesContainerPackageDetail mesContainerPackageDetailBean = crreateMesContainerPackageDetail(userName, masterContainerSn, subContainerSn, masterContainerPackage);
MesContainerPackageDetailBinding containerPackageDetailBinding = createContainerPackageDetailBinding(masterContainerPackage, mesContainerPackageDetailBean, MesExtEnumUtil.CONTAINER_RAW_SN_BINDING_STATUS.BINDING, userName);
containerPackageRepository.save(masterContainerPackage);
containerPackageDetailRepository.save(mesContainerPackageDetailBean);
packageDetailBindingRepository.save(containerPackageDetailBinding);
}catch (ImppBusiException e) {
resultBean.setErrorMsg(e.getErrorDetail());
resultBean.setSuccess(false);
}
return resultBean;
}
private MesContainerPackage createMesContainerPackage(String userName, MesContainerSn masterContainerSn) {
MesContainerPackage masterContainerPackage;
// 新增上料表,和上料明细
masterContainerPackage = new MesContainerPackage();
masterContainerPackage.setId(snowflakeIdMaker.nextId());
masterContainerPackage.setContainerSn(masterContainerSn.getContainerSn());
masterContainerPackage.setContainerTypeCode(masterContainerSn.getContainerTypeCode());
masterContainerPackage.setContainerTypeName(masterContainerSn.getContainerTypeName());
masterContainerPackage.setPackageStatus(10);
masterContainerPackage.setQty(1);
ConvertBean.serviceModelInitialize(masterContainerPackage, userName);
containerPackageRepository.save(masterContainerPackage);
return masterContainerPackage;
}
private MesContainerPackageDetail crreateMesContainerPackageDetail(String userName, MesContainerSn masterContainerSn, MesContainerSn subContainerSn, MesContainerPackage masterContainerPackage) {
MesContainerPackageDetail mesContainerPackageDetailBean = new MesContainerPackageDetail();
mesContainerPackageDetailBean.setContainerSn(masterContainerSn.getContainerSn());
mesContainerPackageDetailBean.setContainerTypeCode(masterContainerSn.getContainerTypeCode());
mesContainerPackageDetailBean.setContainerTypeName(masterContainerSn.getContainerTypeName());
mesContainerPackageDetailBean.setPid(masterContainerPackage.getId());
mesContainerPackageDetailBean.setBarCode(subContainerSn.getContainerSn());
ConvertBean.serviceModelInitialize(mesContainerPackageDetailBean, userName);
return mesContainerPackageDetailBean;
}
private MesContainerPackageDetailBinding createContainerPackageDetailBinding(MesContainerPackage containerPackage, MesContainerPackageDetail packageDetail, MesExtEnumUtil.CONTAINER_RAW_SN_BINDING_STATUS snBindingStatus, String userName) {
MesContainerPackageDetailBinding binding = new MesContainerPackageDetailBinding();
binding.setOrganizeCode(containerPackage.getOrganizeCode());
binding.setPid(containerPackage.getId());
binding.setSourceId(packageDetail.getId());
binding.setContainerSn(containerPackage.getContainerSn());
binding.setBarCode(packageDetail.getBarCode());
binding.setQty(packageDetail.getQty());
binding.setSnStatus(snBindingStatus.getValue());
binding.setMatchType(packageDetail.getMatchType());
ConvertBean.serviceModelInitialize(binding, userName);
return binding;
}
private MesContainerSn getMesContainerSnAndValidate(String organizeCode, String sn) {
// 判断条码是否存在
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn, "containerSn", ddlPackBean);
List<MesContainerSn> mesContainerSns = mesContainerSnRepository.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(mesContainerSns)) {
MesPcnException.throwBusiException("扫描的容器条码:%s,不存在", sn);
}
if (mesContainerSns.size() > 1) {
MesPcnException.throwBusiException("条码:%s, 不唯一", sn);
}
return mesContainerSns.get(0);
}
private MesContainerSn getMesContainerSn(String organizeCode, String sn) {
// 判断条码是否存在
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn, "containerSn", ddlPackBean);
MesContainerSn mesContainerSn = mesContainerSnRepository.getByProperty(ddlPackBean);
return mesContainerSn;
}
private MesContainerType getMesContainerType(String organizeCode,String sn, String containerTypeCode) {
// 判断条码是否存在
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(containerTypeCode, "containerTypeCode", ddlPackBean);
List<MesContainerType> mesContainerTypes = mesContainerTypeRepository.findByHqlWhere(ddlPackBean);
if (CollectionUtils.isEmpty(mesContainerTypes)) {
MesPcnException.throwBusiException("扫描的容器条码:%s,对应容器类型不存在", sn, containerTypeCode);
}
if (mesContainerTypes.size() > 1) {
MesPcnException.throwBusiException("扫描的容器条码:%s,对应容器类型:%s,不唯一", sn, containerTypeCode);
}
return mesContainerTypes.get(0);
}
private List<MesContainerSnPart> getMesContainerSnPart(String organizeCode, String sn) {
// 判断条码是否存在
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn, "containerSn", ddlPackBean);
List<MesContainerSnPart> mesContainerTypes = containerSnPartRepository.findByHqlWhere(ddlPackBean);
return mesContainerTypes;
}
private List<MesContainerTypePart> getMesContainerTypePart(String organizeCode, String sn) {
// 判断条码是否存在
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn, "containerSn", ddlPackBean);
List<MesContainerTypePart> mesContainerTypeParts = containerTypePartRepository.findByHqlWhere(ddlPackBean);
return mesContainerTypeParts;
}
private MesContainerPackage getMesContainerPackage(String organizeCode, String sn) {
// 判断条码是否存在
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn, "containerSn", ddlPackBean);
MesContainerPackage mesContainerPackage = containerPackageRepository.getByProperty(ddlPackBean);
return mesContainerPackage;
}
/**
* flag true false
* @param organizeCode
* @param sn
* @param flag
* @return
*/
private List<MesContainerPackageDetail> getMesContainerPackageDetail(String organizeCode, String sn, boolean flag) {
List<MesContainerPackageDetail> resultDetail = new ArrayList<>();
// 判断条码是否存在
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode);
DdlPreparedPack.getStringEqualPack(sn, "containerSn", ddlPackBean);
List<MesContainerPackageDetail> mesContainerPackageDetails = containerPackageDetailRepository.findByHqlWhere(ddlPackBean);
if (flag) {
for (MesContainerPackageDetail mesContainerPackageDetail : mesContainerPackageDetails) {
if (!StringUtils.isEmpty(mesContainerPackageDetail.getPartNo())) {
resultDetail.add(mesContainerPackageDetail);
} else {
resultDetail.addAll(getMesContainerPackageDetail(organizeCode,mesContainerPackageDetail.getBarCode(), false));
}
}
} else {
resultDetail.addAll(mesContainerPackageDetails);
}
return resultDetail;
}
}
Loading…
Cancel
Save