diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPackageContainerSnService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPackageContainerSnService.java new file mode 100644 index 0000000..8c6b0c2 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPackageContainerSnService.java @@ -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); +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackageContainerSnServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackageContainerSnServiceImpl.java new file mode 100644 index 0000000..70b2fd3 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackageContainerSnServiceImpl.java @@ -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 getMesContainerSnParts(String organizeCode, String containSn) { + List mesContainerSnParts = getMesContainerSnPart(organizeCode, containSn); + + + List 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 masterContainerSnParts = getMesContainerSnParts(organizeCode, masterContainerSn.getContainerSn()); + List subContainerSnParts = getMesContainerSnParts(organizeCode, subContainerSn.getContainerSn()); + List subParts = subContainerSnParts.stream().map(MesContainerSnPart::getPartNo).collect(Collectors.toList()); + List masterParts = masterContainerSnParts.stream().map(MesContainerSnPart::getPartNo).collect(Collectors.toList()); + if (!masterParts.contains(subParts)) { + MesPcnException.throwBusiException("扫描的主容器条码:%s,与子容器条码不匹配,无法包装", subContainerSn.getContainerSn(),subContainerSn.getContainerSn()); + } + /** + * 验证标包 + * 1 查询子包装的上料明细 + * 2 查询总包装下面的最终条码上料明细 + * 3 校验标包是否满足 + */ + List masterPackageDetails = getMesContainerPackageDetail(organizeCode, subContainerSn.getContainerSn(), true); + + List 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 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 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 getMesContainerSnPart(String organizeCode, String sn) { + // 判断条码是否存在 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + + DdlPreparedPack.getStringEqualPack(sn, "containerSn", ddlPackBean); + + List mesContainerTypes = containerSnPartRepository.findByHqlWhere(ddlPackBean); + + return mesContainerTypes; + } + + private List getMesContainerTypePart(String organizeCode, String sn) { + // 判断条码是否存在 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + + DdlPreparedPack.getStringEqualPack(sn, "containerSn", ddlPackBean); + + List 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 getMesContainerPackageDetail(String organizeCode, String sn, boolean flag) { + List resultDetail = new ArrayList<>(); + + // 判断条码是否存在 + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(organizeCode); + + DdlPreparedPack.getStringEqualPack(sn, "containerSn", ddlPackBean); + + List 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; + } +}