|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|
}
|