常熟上料功能

uat-temp-nht-2506120000-jialiao
jason 1 month ago
parent 1f2bf0a276
commit 3231d46ea5

@ -0,0 +1,11 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerPartsModel;
import io.swagger.annotations.ApiOperation;
import java.util.Map;
public interface IMesContainerBindDispatchService {
@ApiOperation(value = "编码规则匹配")
default Map<String, Object> matchNumberRule(String organizeCode, String barcode, MesContainerPartsModel model) { return null; }
}

@ -0,0 +1,21 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerSnBindModel;
import io.swagger.annotations.ApiOperation;
public interface IMesContainerSnBindService {
@ApiOperation("扫描容器条码")
MesContainerSnBindModel doScanContainer(MesContainerSnBindModel model);
@ApiOperation("扫描零件条码")
MesContainerSnBindModel doScanBarcode(MesContainerSnBindModel model);
@ApiOperation("清空")
MesContainerSnBindModel doClear(MesContainerSnBindModel model);
@ApiOperation("删除")
MesContainerSnBindModel doDeleteDetails(MesContainerSnBindModel model);
@ApiOperation("强制关箱")
MesContainerSnBindModel doClosePackage(MesContainerSnBindModel model);
}

@ -0,0 +1,9 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerSn;
public interface IMesContainerSnService {
MesContainerSn getContainerSn(String organizeCode, String containerSn);
MesContainerSn checkContainerSn(String organizeCode, String containerSn);
}

@ -0,0 +1,4 @@
package cn.estsh.i3plus.ext.mes.pcn.api.busi;
public interface IMesContainerTypeService {
}

@ -0,0 +1,118 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesContainerSnBindService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.constant.MesCommonConstant;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerSnBindModel;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.impp.framework.boot.exception.ImppBusiException;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ResultBean;
import cn.estsh.impp.framework.boot.util.ValidatorBean;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Objects;
@Slf4j
@RestController
@Api(tags = "容器条码绑定")
@RequestMapping(MesCommonConstant.MES_YANFEN + "/container-sn-bind")
public class MesContainerSnBindController {
@Autowired
private IMesContainerSnBindService containerSnBindService;
@PostMapping("/scan-container")
@ApiOperation(value = "扫描信息")
public ResultBean doScanContainer(@RequestBody MesContainerSnBindModel model) {
try {
ValidatorBean.checkNotNull(model.getContainerSn(), "容器条码不能为空");
ValidatorBean.checkNotNull(model.getOrganizeCode(), "工厂代码不能为空");
ValidatorBean.checkNotNull(model.getUserName(), "操作人不能为空");
model = containerSnBindService.doScanContainer(model);
return ResultBean.success("扫描成功").setResultObject(model);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping("/scan-sn")
@ApiOperation(value = "扫描信息")
public ResultBean doScanSn(@RequestBody MesContainerSnBindModel model) {
try {
ValidatorBean.checkNotNull(model.getContainerSn(), "容器条码不能为空");
ValidatorBean.checkNotNull(model.getBarCode(), "零件条码不能为空");
ValidatorBean.checkNotNull(model.getOrganizeCode(), "工厂代码不能为空");
ValidatorBean.checkNotNull(model.getUserName(), "操作人不能为空");
if (Objects.equals(model.getBindIsChoosePart(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue())) {
if (StringUtils.isEmpty(model.getPartNo())) {
MesPcnException.throwMesBusiException("需要选择零件号");
}
}
model = containerSnBindService.doScanBarcode(model);
return ResultBean.success("扫描成功").setResultObject(model);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping("/clear")
@ApiOperation(value = "清空")
public ResultBean doClear(@RequestBody MesContainerSnBindModel model) {
try {
ValidatorBean.checkNotNull(model.getContainerSn(), "容器条码不能为空");
ValidatorBean.checkNotNull(model.getOrganizeCode(), "工厂代码不能为空");
ValidatorBean.checkNotNull(model.getUserName(), "操作人不能为空");
model = containerSnBindService.doClear(model);
return ResultBean.success("清空成功").setResultObject(model);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping("/delete-details")
@ApiOperation(value = "删除")
public ResultBean doDeleteDetail(@RequestBody MesContainerSnBindModel model) {
try {
ValidatorBean.checkNotNull(model.getContainerSn(), "容器条码不能为空");
ValidatorBean.checkNotNull(model.getOrganizeCode(), "工厂代码不能为空");
ValidatorBean.checkNotNull(model.getUserName(), "操作人不能为空");
ValidatorBean.checkNotNull(model.getPackageDetails(), "请选择要删除的条码");
model = containerSnBindService.doDeleteDetails(model);
return ResultBean.success("删除成功成功").setResultObject(model);
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
@PostMapping("/close-package")
@ApiOperation(value = "强制关箱")
public ResultBean doClosePackage(@RequestBody MesContainerSnBindModel model) {
try {
ValidatorBean.checkNotNull(model.getContainerSn(), "容器条码不能为空");
ValidatorBean.checkNotNull(model.getOrganizeCode(), "工厂代码不能为空");
ValidatorBean.checkNotNull(model.getUserName(), "操作人不能为空");
containerSnBindService.doClosePackage(model);
return ResultBean.success("关箱成功");
} catch (ImppBusiException imppException) {
return ResultBean.fail(imppException);
} catch (Exception e) {
return ImppExceptionBuilder.newInstance().buildExceptionResult(e);
}
}
}

@ -0,0 +1,471 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesContainerSnBindService;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesContainerSnService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.MesNumberRuleMatchRegularExpressionService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind.ContainerBindManager;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind.checkqty.MesAbstractContainerBindCheckQtyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerPartsModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerSnBindModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.TimeTool;
import cn.estsh.i3plus.pojo.base.bean.DdlPackBean;
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.bean.recyclablepackage.MesRecyclablePackageBinding;
import cn.estsh.i3plus.pojo.mes.repository.*;
import cn.estsh.i3plus.pojo.mes.repository.recyclablepackage.MesRecyclablePackageBindingRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
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.Map;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class MesContainerSnBindServiceImpl implements IMesContainerSnBindService {
@Autowired
private IMesContainerSnService containerSnService;
@Autowired
private MesContainerTypeRepository containerTypeRDao;
@Autowired
private MesContainerTypePartRepository containerTypePartRDao;
@Autowired
private MesContainerSnPartRepository containerSnPartRDao;
@Autowired
private MesContainerPackageRepository containerPackageRDao;
@Autowired
private MesContainerPackageDetailRepository containerPackageDetailRDao;
@Autowired
private MesProduceSnRepository produceSnRDao;
@Autowired
private MesContainerPackageDetailBindingRepository detailBindingRDao;
@Autowired
private MesNumberRuleMatchRegularExpressionService matchRegularService;
private MesContainerType getMesContainerType(String organizeCode, String containerTypeCode) {
MesContainerType containerType = null;
if (!StringUtils.isEmpty(organizeCode) && StringUtils.isEmpty(containerTypeCode)) {
containerType = containerTypeRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerTypeCode});
}
return containerType;
}
private MesContainerPackage getContainerPackage(MesContainerSnBindModel model, MesContainerSn containerSn) {
MesContainerPackage containerPackage = containerPackageRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerSn"},
new Object[]{model.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerSn.getContainerSn()});
return containerPackage;
}
private List<MesContainerPackageDetail> getContainerPackageDetail(MesContainerSnBindModel model, MesContainerSn containerSn) {
List<MesContainerPackageDetail> packageDetails = containerPackageDetailRDao.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerSn"},
new Object[]{model.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerSn.getContainerSn()});
return packageDetails;
}
private List<MesContainerPartsModel> getContainerParts(String organizeCode, String containerTypeCode, String containerSn) {
List<MesContainerPartsModel> result = new ArrayList<>();
List<MesContainerSnPart> snPartList = containerSnPartRDao.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode", "containerSn"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerTypeCode, containerSn});
if (!CollectionUtils.isEmpty(snPartList)) {
for (MesContainerSnPart snPart : snPartList) {
MesContainerPartsModel model = MesContainerPartsModel.builder()
.partNo(snPart.getPartNo())
.partName(snPart.getPartName())
.matchType(snPart.getMatchType())
.matchRule(snPart.getMatchRule())
.qty(snPart.getQty())
.build();
result.add(model);
}
} else {
List<MesContainerTypePart> partList = containerTypePartRDao.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerTypeCode});
if (!CollectionUtils.isEmpty(partList)) {
for (MesContainerTypePart partPart : partList) {
MesContainerPartsModel model = MesContainerPartsModel.builder()
.partNo(partPart.getPartNo())
.partName(partPart.getPartName())
.matchType(partPart.getMatchType())
.matchRule(partPart.getMatchRule())
.qty(partPart.getQty())
.build();
result.add(model);
}
}
}
return result;
}
private MesContainerPartsModel getContainerPartsByPartNo(String organizeCode, String containerTypeCode, String containerSn, String partNo) {
MesContainerPartsModel model = null;
MesContainerSnPart snPart = containerSnPartRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode", "containerSn", "partNo"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerTypeCode, containerSn, partNo});
if (snPart != null) {
model = MesContainerPartsModel.builder()
.partNo(snPart.getPartNo())
.partName(snPart.getPartName())
.matchType(snPart.getMatchType())
.matchRule(snPart.getMatchRule())
.qty(snPart.getQty())
.build();
} else {
MesContainerTypePart typePart = containerTypePartRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode", "partNo"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerTypeCode, partNo});
if (typePart != null) {
model = MesContainerPartsModel.builder()
.partNo(typePart.getPartNo())
.partName(typePart.getPartName())
.matchType(typePart.getMatchType())
.matchRule(typePart.getMatchRule())
.qty(typePart.getQty())
.build();
}
}
return model;
}
private MesContainerPartsModel getContainerPartsByBarcode(String organizeCode, String containerTypeCode, String containerSn, String barcode) {
MesContainerPartsModel model = null;
List<MesContainerSnPart> snPartList = containerSnPartRDao.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode", "containerSn"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerTypeCode, containerSn});
if (!CollectionUtils.isEmpty(snPartList)) {
for (MesContainerSnPart snPart : snPartList) {
if (StringUtils.isEmpty(snPart.getMatchRule())) {
continue;
}
Map<String, Object> reulst = matchRegularService.matchNumberRule(organizeCode, barcode, "", snPart.getMatchRule());
if (reulst != null && Objects.equals(reulst.get(MesPcnExtConstWords.RESULT), true)) {
model = MesContainerPartsModel.builder()
.partNo(snPart.getPartNo())
.partName(snPart.getPartName())
.matchType(snPart.getMatchType())
.matchRule(snPart.getMatchRule())
.qty(snPart.getQty())
.build();
break;
}
}
}
if (model == null) {
List<MesContainerTypePart> partList = containerTypePartRDao.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerTypeCode});
if (!CollectionUtils.isEmpty(partList)) {
for (MesContainerTypePart typePart : partList) {
if (StringUtils.isEmpty(typePart.getMatchRule())) {
continue;
}
Map<String, Object> reulst = matchRegularService.matchNumberRule(organizeCode, barcode, "", typePart.getMatchRule());
if (reulst != null && Objects.equals(reulst.get(MesPcnExtConstWords.RESULT), true)) {
model = MesContainerPartsModel.builder()
.partNo(typePart.getPartNo())
.partName(typePart.getPartName())
.matchType(typePart.getMatchType())
.matchRule(typePart.getMatchRule())
.qty(typePart.getQty())
.build();
break;
}
}
}
}
return model;
}
@Override
public MesContainerSnBindModel doScanContainer(MesContainerSnBindModel model) {
//校验容器条码
MesContainerSn containerSn = containerSnService.checkContainerSn(model.getOrganizeCode(), model.getContainerSn());
MesContainerType containerType = containerTypeRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode"},
new Object[]{model.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerSn.getContainerTypeCode()});
if (containerType == null) {
MesPcnException.throwMesBusiException("容器类型代码【%s】信息不存在请检查容器类型主数据", containerSn.getContainerTypeCode());
}
if (Objects.equals(containerType.getBindIsChoosePart(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue())) {
List<MesContainerPartsModel> partsModelList = getContainerParts(model.getOrganizeCode(), containerType.getContainerTypeCode(), containerSn.getContainerSn());
if (CollectionUtils.isEmpty(partsModelList)) {
MesPcnException.throwMesBusiException("容器条码【%s】或容器类型代码【%s】未维护与容器关系请检查数据", containerSn.getContainerSn(), containerType.getContainerTypeCode());
}
model.setContainerParts(partsModelList);
model.setBindIsChoosePart(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue());
} else {
model.setBindIsChoosePart(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue());
}
MesContainerPackage containerPackage = containerPackageRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerSn"},
new Object[]{model.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerSn.getContainerSn()});
if (containerPackage != null) {
List<MesContainerPackageDetail> packageDetails = containerPackageDetailRDao.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerSn"},
new Object[]{model.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerSn.getContainerSn()});
model.setPackageDetails(packageDetails);
}
model.setContainerPackage(containerPackage);
return model;
}
@Override
public MesContainerSnBindModel doScanBarcode(MesContainerSnBindModel model) {
//校验容器条码
MesContainerSn containerSn = containerSnService.checkContainerSn(model.getOrganizeCode(), model.getContainerSn());
MesContainerType containerType = containerTypeRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode"},
new Object[]{model.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerSn.getContainerTypeCode()});
if (containerType == null) {
MesPcnException.throwMesBusiException("容器类型代码【%s】信息不存在请检查容器类型主数据", containerSn.getContainerTypeCode());
}
if (containerType.getMixType() == null) {
MesPcnException.throwMesBusiException("容器类型代码【%s】未配置混包类型请检查容器类型主数据", containerSn.getContainerTypeCode());
}
List<MesContainerPackageDetail> packageDetails;
MesContainerPackage containerPackage = containerPackageRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerSn"},
new Object[]{model.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerSn.getContainerSn()});
if (containerPackage == null) {
containerPackage = createContainerPackage(model, containerType);
packageDetails = new ArrayList<>();
} else {
if (Objects.equals(containerPackage.getPackageStatus(), MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20.getValue())) {
MesPcnException.throwMesBusiException("容器条码【%s】已关箱不能再进行上料", containerSn.getContainerSn());
}
packageDetails = containerPackageDetailRDao.findByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerSn"},
new Object[]{model.getOrganizeCode(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerSn.getContainerSn()});
}
for (MesContainerPackageDetail packageDetail : packageDetails) {
if (Objects.equals(packageDetail.getBarCode(), model.getBarCode())) {
MesPcnException.throwMesBusiException("容器条码【%s】与条码【%s】已绑定请检查数据", containerSn.getContainerSn(), model.getBarCode());
}
}
MesContainerPartsModel containerPart = checkProduceSn(model.getOrganizeCode(), containerSn, model.getBarCode(), model.getPartNo());
containerPart.setContainerType(containerType.getContainerType());
containerPart.setContainerPackage(containerPackage);
// 调用策略校验条码与容器是否可以绑定
Map<String, Object> matchResult = ContainerBindManager.INSTANCE.matchNumberRule(model.getOrganizeCode(), model.getBarCode(), containerPart);
assert matchResult != null;
if (Objects.equals(matchResult.get(MesPcnExtConstWords.RESULT), false)) {
MesPcnException.throwMesBusiException(matchResult.get(MesPcnExtConstWords.MESSAGE).toString());
}
MesContainerPackageDetail packageDetail = createContainerPackageDetail(model, containerPackage, containerPart, matchResult);
packageDetails.add(packageDetail);
MesAbstractContainerBindCheckQtyService checkQtyService = ContainerBindManager.INSTANCE.getCheckQtyService(MesExtEnumUtil.CONTAINER_TYPE_MIX_TYPE.getByValue(containerType.getMixType()));
Map<String, Object> checkQtyResult = checkQtyService.doCheck(model.getOrganizeCode(), containerPackage, packageDetails, containerPart, getContainerParts(model.getOrganizeCode(), containerType.getContainerTypeCode(), containerSn.getContainerSn()));
if (checkQtyResult != null && Objects.equals(checkQtyResult.get(MesPcnExtConstWords.RESULT), false)) {
MesPcnException.throwMesBusiException(checkQtyResult.get(MesPcnExtConstWords.MESSAGE).toString());
}
MesContainerPackageDetailBinding binding = createContainerPackageDetailBinding(containerPackage, packageDetail, MesExtEnumUtil.CONTAINER_RAW_SN_BINDING_STATUS.BINDING, model.getUserName());
model.setContainerPackage(containerPackage);
model.setPackageDetails(packageDetails);
model.addPackageDetailBinding(binding);
saveContainerPackage(model);
return model;
}
private void saveContainerPackage(MesContainerSnBindModel model) {
MesContainerPackage containerPackage = model.getContainerPackage();
if (containerPackage != null) {
containerPackage.setQty(model.getPackageDetails().size());
containerPackageRDao.save(containerPackage);
}
if (!CollectionUtils.isEmpty(model.getPackageDetails())) {
containerPackageDetailRDao.saveAll(model.getPackageDetails());
}
if (!CollectionUtils.isEmpty(model.getBindingList())) {
detailBindingRDao.saveAll(model.getBindingList());
}
}
@Override
public MesContainerSnBindModel doClear(MesContainerSnBindModel model) {
//校验容器条码
MesContainerSn containerSn = containerSnService.checkContainerSn(model.getOrganizeCode(), model.getContainerSn());
MesContainerPackage containerPackage = getContainerPackage(model, containerSn);
if (containerPackage == null) {
MesPcnException.throwMesBusiException("容器条码【%s】未生成容器条码上料主表请检查数据", containerSn.getContainerSn());
}
List<MesContainerPackageDetail> packageDetails = getContainerPackageDetail(model, containerSn);
if (CollectionUtils.isEmpty(packageDetails)) {
MesPcnException.throwMesBusiException("容器条码【%s】不包含上料明细数据请检查数据", containerSn.getContainerSn());
}
DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(model.getOrganizeCode());
DdlPreparedPack.getStringEqualPack(containerSn.getContainerSn(),"containerSn",ddlPackBean);
containerPackageDetailRDao.updateByProperties(new String[]{"modifyUser", "modifyDatetime", "isDeleted"},
new Object[]{model.getUserName(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()}, ddlPackBean);
containerPackage.setPackageStatus(MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_30.getValue());
ConvertBean.serviceModelUpdate(containerPackage, model.getUserName());
containerPackageRDao.update(containerPackage);
for (MesContainerPackageDetail packageDetail : packageDetails) {
MesContainerPackageDetailBinding binding = createContainerPackageDetailBinding(containerPackage, packageDetail, MesExtEnumUtil.CONTAINER_RAW_SN_BINDING_STATUS.UN_BINDING, model.getUserName());
detailBindingRDao.insert(binding);
}
model.setPackageDetails(new ArrayList<>());
return model;
}
@Override
public MesContainerSnBindModel doDeleteDetails(MesContainerSnBindModel model) {
//校验容器条码
MesContainerSn containerSn = containerSnService.checkContainerSn(model.getOrganizeCode(), model.getContainerSn());
MesContainerPackage containerPackage = getContainerPackage(model, containerSn);
if (containerPackage == null) {
MesPcnException.throwMesBusiException("容器条码【%s】未生成容器条码上料主表请检查数据", containerSn.getContainerSn());
}
List<MesContainerPackageDetail> packageDetails = getContainerPackageDetail(model, containerSn);
if (CollectionUtils.isEmpty(packageDetails)) {
MesPcnException.throwMesBusiException("容器条码【%s】不包含上料明细数据请检查数据", containerSn.getContainerSn());
}
List<Long> deleteDetailIds = new ArrayList<>();
Map<String, MesContainerPackageDetail> detailMap = packageDetails.stream().collect(Collectors.toMap(MesContainerPackageDetail::getBarCode, item -> item));
for (MesContainerPackageDetail detail : model.getPackageDetails()) {
MesContainerPackageDetail dbDetail = detailMap.get(detail.getBarCode());
if (null == dbDetail) {
MesPcnException.throwMesBusiException("容器条码【%s】未与条码【%s】进行绑定请检查数据", containerSn.getContainerSn(), detail.getBarCode());
}
MesContainerPackageDetailBinding binding = createContainerPackageDetailBinding(containerPackage, dbDetail, MesExtEnumUtil.CONTAINER_RAW_SN_BINDING_STATUS.UN_BINDING, model.getUserName());
detailBindingRDao.insert(binding);
deleteDetailIds.add(dbDetail.getId());
detailMap.remove(dbDetail.getBarCode());
}
containerPackageDetailRDao.deleteWeaklyByIds(deleteDetailIds.toArray(new Long[0]), model.getUserName());
containerPackage.setPackageStatus(MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_30.getValue());
ConvertBean.serviceModelUpdate(containerPackage, model.getUserName());
containerPackageRDao.update(containerPackage);
model.setPackageDetails(new ArrayList<>(detailMap.values()));
return model;
}
@Override
public MesContainerSnBindModel doClosePackage(MesContainerSnBindModel model) {
//校验容器条码
MesContainerSn containerSn = containerSnService.checkContainerSn(model.getOrganizeCode(), model.getContainerSn());
MesContainerPackage containerPackage = getContainerPackage(model, containerSn);
if (containerPackage == null) {
MesPcnException.throwMesBusiException("容器条码【%s】未生成容器条码上料主表请检查数据", containerSn.getContainerSn());
}
if (Objects.equals(containerPackage.getPackageStatus(), MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20.getValue())) {
MesPcnException.throwMesBusiException("容器条码【%s】已关箱请务重复操作", containerSn.getContainerSn());
}
List<MesContainerPackageDetail> packageDetails = getContainerPackageDetail(model, containerSn);
for (MesContainerPackageDetail detail : packageDetails) {
MesContainerPackageDetailBinding binding = createContainerPackageDetailBinding(containerPackage, detail, MesExtEnumUtil.CONTAINER_RAW_SN_BINDING_STATUS.CLOSE, model.getUserName());
detailBindingRDao.insert(binding);
}
containerPackage.setPackageStatus(MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20.getValue());
ConvertBean.serviceModelUpdate(containerPackage, model.getUserName());
containerPackageRDao.update(containerPackage);
model.setPackageDetails(packageDetails);
return model;
}
private MesContainerPartsModel checkProduceSn(String organizeCode, MesContainerSn containerSn, String barCode, String partNo) {
MesContainerPartsModel model;
MesProduceSn produceSn = produceSnRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "productSn"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), barCode});
if (produceSn != null) {
// 自制件条码
model = getContainerPartsByPartNo(organizeCode, containerSn.getContainerTypeCode(), containerSn.getContainerSn(), produceSn.getPartNo());
if (model != null) {
model.setBarcode(barCode);
}
} else {
model = getContainerPartsByBarcode(organizeCode, containerSn.getContainerTypeCode(), containerSn.getContainerSn(), barCode);
if (model != null) {
model.setBarcode(barCode);
}
}
if (model == null) {
MesPcnException.throwMesBusiException("容器条码【%s】或容器类型代码【%s】未维护与零件关系请检查数据", containerSn.getContainerSn(), containerSn.getContainerTypeCode());
}
if (!StringUtils.isEmpty(partNo) && !Objects.equals(partNo, model.getPartNo())) {
MesPcnException.throwMesBusiException("条码【%s】的零件号【%s】与选择的零件不匹配请检查数据", barCode, produceSn.getPartNo());
}
return model;
}
private MesContainerPackage createContainerPackage(MesContainerSnBindModel model, MesContainerType containerType) {
MesContainerPackage containerPackage = new MesContainerPackage();
containerPackage.setOrganizeCode(model.getOrganizeCode());
containerPackage.setContainerSn(model.getContainerSn());
containerPackage.setPackageStatus(MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_10.getValue());
containerPackage.setQty(0);
ConvertBean.serviceModelInitialize(containerPackage, model.getUserName());
return containerPackage;
}
private MesContainerPackageDetail createContainerPackageDetail(MesContainerSnBindModel model, MesContainerPackage containerPackage, MesContainerPartsModel containerPart, Map<String, Object> matchResult) {
Object qty = matchResult.get(MesPcnExtConstWords.QTY);
Object dataType = matchResult.get(MesPcnExtConstWords.DATA_TYPE);
MesContainerPackageDetail detail = new MesContainerPackageDetail();
detail.setOrganizeCode(containerPackage.getOrganizeCode());
detail.setPid(containerPackage.getId());
detail.setContainerSn(containerPackage.getContainerSn());
detail.setPartNo(containerPart.getPartNo());
detail.setPartName(containerPart.getPartName());
detail.setBarCode(model.getBarCode());
detail.setQty(qty != null ? (double)qty : 1);
detail.setLoadPartTime(TimeTool.getNowTime(true));
detail.setLotNo(StringUtils.isEmpty(containerPart.getLotNo()) ? TimeTool.getNowTime("yyyy-MM-dd") : containerPart.getLotNo());
detail.setMatchType(containerPart.getMatchType());
detail.setDataType(dataType != null ? (int)dataType : null);
detail.setSnStatus(MesExtEnumUtil.CONTAINER_BARCODE_STATUS.STATUS_10.getValue());
ConvertBean.serviceModelInitialize(detail, model.getUserName());
return detail;
}
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;
}
}

@ -0,0 +1,36 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesContainerSnService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.base.util.StringUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerSn;
import cn.estsh.i3plus.pojo.mes.repository.MesContainerSnRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MesContainerSnServiceImpl implements IMesContainerSnService {
@Autowired
private MesContainerSnRepository containerSnRepository;
@Override
public MesContainerSn getContainerSn(String organizeCode, String containerSn) {
if (StringUtil.isEmptyAndNull(organizeCode) || StringUtil.isEmptyAndNull(containerSn)) {
return null;
}
return containerSnRepository.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerSn"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerSn});
}
@Override
public MesContainerSn checkContainerSn(String organizeCode, String containerSn) {
MesContainerSn mesContainerSn = getContainerSn(organizeCode, containerSn);
if (mesContainerSn == null) {
MesPcnException.throwMesBusiException("容器条码【%s】信息不存在", containerSn);
}
return mesContainerSn;
}
}

@ -0,0 +1,8 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesContainerTypeService;
import org.springframework.stereotype.Service;
@Service
public class MesContainerTypeServiceImpl implements IMesContainerTypeService {
}

@ -0,0 +1,91 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesContainerBindDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind.checkqty.MesAbstractContainerBindCheckQtyService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerPartsModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.springframework.util.StringUtils;
import java.util.HashMap;
import java.util.Map;
public class ContainerBindManager {
public static final ContainerBindManager INSTANCE = new ContainerBindManager();
private final Map<String, IMesContainerBindDispatchService> dispatchServices = new HashMap<>();
private final Map<MesExtEnumUtil.CONTAINER_TYPE_MIX_TYPE, MesAbstractContainerBindCheckQtyService> checkQtyServices = new HashMap<>();
private ContainerBindManager() {
}
public void register(MesExtEnumUtil.CONTAINER_TYPE containerType, MesExtEnumUtil.CONTAINER_PART_MATCH_TYPE matchType, IMesContainerBindDispatchService dispatchService) {
String containerKey = containerType != null ? containerType.name() : "*";
String matchKey = matchType != null ? matchType.name() : "*";
dispatchServices.put(containerKey + ":" + matchKey, dispatchService);
}
public void registerCheckQty(MesExtEnumUtil.CONTAINER_TYPE_MIX_TYPE type, MesAbstractContainerBindCheckQtyService checkQtyService) {
checkQtyServices.put(type, checkQtyService);
}
public IMesContainerBindDispatchService getDispatchService(MesExtEnumUtil.CONTAINER_TYPE containerType, MesExtEnumUtil.CONTAINER_PART_MATCH_TYPE matchType) {
assert containerType != null;
assert matchType != null;
String containerKey = containerType.name();
String matchKey = matchType.name();
IMesContainerBindDispatchService dispatchService = dispatchServices.get(containerKey + ":" + matchKey);
if (dispatchService == null) {
dispatchService = dispatchServices.get("*:" + matchKey);
}
if (dispatchService == null) {
dispatchService = dispatchServices.get(matchKey + ":*");
}
if (dispatchService == null) {
MesPcnException.throwMesBusiException("容器类型【%s】的容器零件确认方式【%s】未配置绑定策略", containerType.getDescription(), matchType.getDescription());
}
return dispatchService;
}
public MesAbstractContainerBindCheckQtyService getCheckQtyService(MesExtEnumUtil.CONTAINER_TYPE_MIX_TYPE type) {
if (type == null) {
MesPcnException.throwMesBusiException("容器类型混包类型无效");
}
MesAbstractContainerBindCheckQtyService checkQtyService = checkQtyServices.get(type);
if (checkQtyService == null) {
MesPcnException.throwMesBusiException("容器类型混包类型【%s】未配置校验数量策略", type.getDescription());
}
return checkQtyService;
}
public Map<String, Object> matchNumberRule(String organizeCode, String barcode, MesContainerPartsModel model) {
Map<String, Object> result = new HashMap<>();
result.put(MesPcnExtConstWords.RESULT, false);
if (StringUtils.isEmpty(organizeCode)) {
result.put(MesPcnExtConstWords.MESSAGE, "请检查必要参数:工厂信息!");
return result;
}
if (StringUtils.isEmpty(barcode)) {
result.put(MesPcnExtConstWords.MESSAGE, "请检查必要参数:条码信息!");
return result;
}
if (model == null || model.getContainerType() == null) {
result.put(MesPcnExtConstWords.MESSAGE, "请检查必要参数:容器类型信息!");
return result;
}
if (model.getMatchType() == null) {
result.put(MesPcnExtConstWords.MESSAGE, "请检查必要参数:匹配规则信息!");
return result;
}
MesExtEnumUtil.CONTAINER_TYPE containerType = MesExtEnumUtil.CONTAINER_TYPE.getByValue(model.getContainerType());
assert containerType != null;
MesExtEnumUtil.CONTAINER_PART_MATCH_TYPE matchType = MesExtEnumUtil.CONTAINER_PART_MATCH_TYPE.getByValue(model.getMatchType());
assert matchType != null;
IMesContainerBindDispatchService dispatchService = getDispatchService(containerType, matchType);
return dispatchService.matchNumberRule(organizeCode, barcode, model);
}
}

@ -0,0 +1,58 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind;
import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesContainerBindDispatchService;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerPartsModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerSnPart;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerTypePart;
import cn.estsh.i3plus.pojo.mes.repository.MesContainerSnPartRepository;
import cn.estsh.i3plus.pojo.mes.repository.MesContainerTypePartRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import org.springframework.beans.factory.annotation.Autowired;
public class MesAbstractContainerBindDispatchService implements IMesContainerBindDispatchService {
@Autowired
protected MesContainerSnPartRepository containerSnPartRDao;
@Autowired
protected MesContainerTypePartRepository containerTypePartRDao;
protected MesAbstractContainerBindDispatchService(MesExtEnumUtil.CONTAINER_TYPE containerType, MesExtEnumUtil.CONTAINER_PART_MATCH_TYPE matchType) {
ContainerBindManager.INSTANCE.register(containerType, matchType, this);
}
protected MesContainerPartsModel getContainerParts(String organizeCode, String containerTypeCode, String containerSn, String partNo) {
MesContainerPartsModel model = null;
MesContainerSnPart snPart = containerSnPartRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode", "containerSn", "partNo"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerTypeCode, containerSn, partNo});
if (snPart == null) {
MesContainerTypePart typePart = containerTypePartRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "containerTypeCode", "partNo"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), containerTypeCode, partNo});
if (typePart != null) {
model = MesContainerPartsModel.builder()
.partNo(typePart.getPartNo())
.partName(typePart.getPartName())
.matchType(typePart.getMatchType())
.matchRule(typePart.getMatchRule())
.qty(typePart.getQty())
.build();
}
} else {
model = MesContainerPartsModel.builder()
.partNo(snPart.getPartNo())
.partName(snPart.getPartName())
.matchType(snPart.getMatchType())
.matchRule(snPart.getMatchRule())
.qty(snPart.getQty())
.build();
}
if (model == null) {
MesPcnException.throwMesBusiException("容器条码【%s】或容器类型代码【%s】未维护与零件关系请检查数据", containerSn, containerTypeCode, partNo);
}
return model;
}
}

@ -0,0 +1,42 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerPartsModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesPart;
import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Component
public class MesContainerBindCooperationPartService extends MesAbstractContainerBindDispatchService {
@Autowired
private MesPartRepository mesPartRDao;
public MesContainerBindCooperationPartService() {
super(null, MesExtEnumUtil.CONTAINER_PART_MATCH_TYPE.MATCH_TYPE_20);
}
@Override
public Map<String, Object> matchNumberRule(String organizeCode, String barcode, MesContainerPartsModel model) {
Map<String, Object> result = new HashMap<>();
result.put(MesPcnExtConstWords.RESULT, true);
MesPart mesPart = mesPartRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "partNo"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), model.getPartNo()});
if (mesPart == null) {
MesPcnException.throwMesBusiException("零件号【%s】在物料表不存在, 请检查数据!", model.getPartNo());
}
result.put(MesPcnExtConstWords.DATA_TYPE, MesExtEnumUtil.CONTAINER_BARCODE_DATA_TYPE.STATUS_10.getValue());
return result;
}
}

@ -0,0 +1,53 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerPartsModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn;
import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
@Slf4j
@Component
public class MesContainerBindProductSnService extends MesAbstractContainerBindDispatchService {
@Autowired
private MesProduceSnRepository produceSnRDao;
public MesContainerBindProductSnService() {
super(null, MesExtEnumUtil.CONTAINER_PART_MATCH_TYPE.MATCH_TYPE_10);
}
@Override
public Map<String, Object> matchNumberRule(String organizeCode, String barcode, MesContainerPartsModel model) {
Map<String, Object> result = new HashMap<>();
result.put(MesPcnExtConstWords.RESULT, true);
MesProduceSn produceSn = produceSnRDao.getByProperty(
new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, "productSn"},
new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), barcode});
if (produceSn == null) {
MesPcnException.throwMesBusiException("扫描条码【%s】在条码表不存在, 请检查数据!", barcode);
}
if (!Objects.equals(produceSn.getSnStatus(), MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue()) &&
!Objects.equals(produceSn.getSnStatus(), MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue())) {
MesPcnException.throwMesBusiException("扫描条码【%s】的条码状态必须为“创建”或“已完成”, 请检查数据!", barcode);
}
if (!Objects.equals(produceSn.getQcStatus(), MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()) &&
!Objects.equals(produceSn.getQcStatus(), MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS_TO_QUALIFIED.getValue())) {
MesPcnException.throwMesBusiException("扫描条码【%s】的质量状态必须为“合格”或“可疑转正常”, 请检查数据!", barcode);
}
result.put(MesPcnExtConstWords.DATA_TYPE, MesExtEnumUtil.CONTAINER_BARCODE_DATA_TYPE.STATUS_10.getValue());
return result;
}
}

@ -0,0 +1,21 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind.checkqty;
import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind.ContainerBindManager;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerPartsModel;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackageDetail;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import java.util.Map;
public class MesAbstractContainerBindCheckQtyService {
protected MesAbstractContainerBindCheckQtyService(MesExtEnumUtil.CONTAINER_TYPE_MIX_TYPE type) {
ContainerBindManager.INSTANCE.registerCheckQty(type, this);
}
@ApiOperation(value = "校验数量")
public Map<String, Object> doCheck(String organizeCode, MesContainerPackage containerPackage, List<MesContainerPackageDetail> packageDetails, MesContainerPartsModel matchModel, List<MesContainerPartsModel> containerParts) { return null; }
}

@ -0,0 +1,50 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind.checkqty;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerPartsModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackageDetail;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.*;
@Slf4j
@Component
public class MesContainerBindMixService extends MesAbstractContainerBindCheckQtyService {
public MesContainerBindMixService() {
super(MesExtEnumUtil.CONTAINER_TYPE_MIX_TYPE.MIX_TYPE_20);
}
@Override
public Map<String, Object> doCheck(String organizeCode, MesContainerPackage containerPackage, List<MesContainerPackageDetail> packageDetails, MesContainerPartsModel matchModel, List<MesContainerPartsModel> containerParts) {
Map<String, Object> result = new HashMap<>();
result.put(MesPcnExtConstWords.RESULT, false);
Set<String> partNoSet = new HashSet<>();
for (MesContainerPackageDetail packageDetail : packageDetails) {
if (StringUtils.isEmpty(packageDetail.getPartNo())) {
continue;
}
partNoSet.add(packageDetail.getPartNo());
}
for (MesContainerPartsModel containerPart : containerParts) {
if (!partNoSet.contains(containerPart.getPartNo())) {
continue;
}
if (containerPackage.getQty() >= containerPart.getQty()) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("容器条码【%s】超出了包装规格", containerPackage.getContainerSn()));
return result;
}
if ((containerPackage.getQty() + 1) == containerPart.getQty()) {
containerPackage.setPackageStatus(MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20.getValue());
}
}
result.put(MesPcnExtConstWords.RESULT, true);
return result;
}
}

@ -0,0 +1,45 @@
package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.rulematch.containerbind.checkqty;
import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesContainerPartsModel;
import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackageDetail;
import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Slf4j
@Component
public class MesContainerBindNotMixService extends MesAbstractContainerBindCheckQtyService {
public MesContainerBindNotMixService() {
super(MesExtEnumUtil.CONTAINER_TYPE_MIX_TYPE.MIX_TYPE_10);
}
@Override
public Map<String, Object> doCheck(String organizeCode, MesContainerPackage containerPackage, List<MesContainerPackageDetail> packageDetails, MesContainerPartsModel matchModel, List<MesContainerPartsModel> containerParts) {
Map<String, Object> result = new HashMap<>();
result.put(MesPcnExtConstWords.RESULT, false);
for (MesContainerPartsModel containerPart : containerParts) {
if (!Objects.equals(containerPart.getPartNo(), matchModel.getPartNo())) {
continue;
}
if (containerPackage.getQty() >= containerPart.getQty()) {
result.put(MesPcnExtConstWords.MESSAGE, String.format("容器条码【%s】超出了包装规格", containerPackage.getContainerSn()));
return result;
}
if ((containerPackage.getQty() + 1) == containerPart.getQty()) {
containerPackage.setPackageStatus(MesExtEnumUtil.CONTAINER_PACKAGE_STATUS.STATUS_20.getValue());
}
}
result.put(MesPcnExtConstWords.RESULT, true);
return result;
}
}

@ -0,0 +1,40 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackage;
import io.swagger.annotations.ApiParam;
import lombok.Builder;
import lombok.Data;
/**
*
*/
@Data
@Builder
public class MesContainerPartsModel {
@ApiParam(value = "容器类型")
private Integer containerType;
@ApiParam(value = "条码")
private String barcode;
@ApiParam("零件编码")
private String partNo;
@ApiParam("零件名称")
private String partName;
@ApiParam(value = "条码确认方式")
private Integer matchType;
@ApiParam(value = "条码规则")
private String matchRule;
@ApiParam("包装规格")
private Double qty;
@ApiParam("批次号")
private String lotNo;
private MesContainerPackage containerPackage;
}

@ -0,0 +1,60 @@
package cn.estsh.i3plus.ext.mes.pcn.pojo.model;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackage;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackageDetail;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerPackageDetailBinding;
import cn.estsh.i3plus.pojo.mes.bean.MesContainerTypePart;
import io.swagger.annotations.ApiParam;
import lombok.Builder;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
/**
* @Description :
* @Reference :
* @Author : jason.niu
* @CreateDate 2025/06/12 10:37
* @Modify:
**/
@Data
@Builder
public class MesContainerSnBindModel {
@ApiParam("操作人")
private String userName;
@ApiParam("工厂代码")
private String organizeCode;
@ApiParam("是否启用记忆")
private Integer isEnableMemory;
@ApiParam("容器条码")
private String containerSn;
@ApiParam("条码")
private String barCode;
@ApiParam("选择的零件编码")
private String partNo;
@ApiParam("绑定是否选零件号")
private Integer bindIsChoosePart;
@ApiParam("容器与零件关系")
private List<MesContainerPartsModel> containerParts;
@ApiParam("包装信息主表")
private MesContainerPackage containerPackage;
@ApiParam("包装明细信息")
private List<MesContainerPackageDetail> packageDetails;
@ApiParam("条码绑定记录")
private final List<MesContainerPackageDetailBinding> bindingList = new ArrayList<>();
public void addPackageDetailBinding(MesContainerPackageDetailBinding binding) {
bindingList.add(binding);
}
}
Loading…
Cancel
Save