From 3231d46ea5a590c9eb0ef5d8c2e4d9340a984afd Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 17 Jun 2025 19:08:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B8=B8=E7=86=9F=E4=B8=8A=E6=96=99=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/busi/IMesContainerBindDispatchService.java | 11 + .../pcn/api/busi/IMesContainerSnBindService.java | 21 + .../mes/pcn/api/busi/IMesContainerSnService.java | 9 + .../mes/pcn/api/busi/IMesContainerTypeService.java | 4 + .../busi/MesContainerSnBindController.java | 118 ++++++ .../busi/MesContainerSnBindServiceImpl.java | 471 +++++++++++++++++++++ .../busi/MesContainerSnServiceImpl.java | 36 ++ .../busi/MesContainerTypeServiceImpl.java | 8 + .../containerbind/ContainerBindManager.java | 91 ++++ .../MesAbstractContainerBindDispatchService.java | 58 +++ .../MesContainerBindCooperationPartService.java | 42 ++ .../MesContainerBindProductSnService.java | 53 +++ .../MesAbstractContainerBindCheckQtyService.java | 21 + .../checkqty/MesContainerBindMixService.java | 50 +++ .../checkqty/MesContainerBindNotMixService.java | 45 ++ .../mes/pcn/pojo/model/MesContainerPartsModel.java | 40 ++ .../pcn/pojo/model/MesContainerSnBindModel.java | 60 +++ 17 files changed, 1138 insertions(+) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerBindDispatchService.java create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerSnBindService.java create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerSnService.java create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerTypeService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesContainerSnBindController.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnServiceImpl.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerTypeServiceImpl.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/ContainerBindManager.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesAbstractContainerBindDispatchService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindCooperationPartService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesAbstractContainerBindCheckQtyService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesContainerBindMixService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesContainerBindNotMixService.java create mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesContainerPartsModel.java create mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesContainerSnBindModel.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerBindDispatchService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerBindDispatchService.java new file mode 100644 index 0000000..61c7300 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerBindDispatchService.java @@ -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 matchNumberRule(String organizeCode, String barcode, MesContainerPartsModel model) { return null; } +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerSnBindService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerSnBindService.java new file mode 100644 index 0000000..3bef697 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerSnBindService.java @@ -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); +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerSnService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerSnService.java new file mode 100644 index 0000000..b7b9bf8 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerSnService.java @@ -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); +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerTypeService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerTypeService.java new file mode 100644 index 0000000..b48e57e --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesContainerTypeService.java @@ -0,0 +1,4 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +public interface IMesContainerTypeService { +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesContainerSnBindController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesContainerSnBindController.java new file mode 100644 index 0000000..bb1d806 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesContainerSnBindController.java @@ -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); + } + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java new file mode 100644 index 0000000..b7669d9 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnBindServiceImpl.java @@ -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 getContainerPackageDetail(MesContainerSnBindModel model, MesContainerSn containerSn) { + List 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 getContainerParts(String organizeCode, String containerTypeCode, String containerSn) { + List result = new ArrayList<>(); + List 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 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 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 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 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 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 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 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 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 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 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 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 packageDetails = getContainerPackageDetail(model, containerSn); + if (CollectionUtils.isEmpty(packageDetails)) { + MesPcnException.throwMesBusiException("容器条码【%s】不包含上料明细数据,请检查数据", containerSn.getContainerSn()); + } + + List deleteDetailIds = new ArrayList<>(); + Map 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 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 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; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnServiceImpl.java new file mode 100644 index 0000000..a152af3 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerSnServiceImpl.java @@ -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; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerTypeServiceImpl.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerTypeServiceImpl.java new file mode 100644 index 0000000..fd15595 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesContainerTypeServiceImpl.java @@ -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 { +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/ContainerBindManager.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/ContainerBindManager.java new file mode 100644 index 0000000..01d41ca --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/ContainerBindManager.java @@ -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 dispatchServices = new HashMap<>(); + private final Map 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 matchNumberRule(String organizeCode, String barcode, MesContainerPartsModel model) { + Map 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); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesAbstractContainerBindDispatchService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesAbstractContainerBindDispatchService.java new file mode 100644 index 0000000..b87c802 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesAbstractContainerBindDispatchService.java @@ -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; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindCooperationPartService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindCooperationPartService.java new file mode 100644 index 0000000..b442416 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindCooperationPartService.java @@ -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 matchNumberRule(String organizeCode, String barcode, MesContainerPartsModel model) { + Map 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; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java new file mode 100644 index 0000000..6f3944b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/MesContainerBindProductSnService.java @@ -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 matchNumberRule(String organizeCode, String barcode, MesContainerPartsModel model) { + Map 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; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesAbstractContainerBindCheckQtyService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesAbstractContainerBindCheckQtyService.java new file mode 100644 index 0000000..383d2f9 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesAbstractContainerBindCheckQtyService.java @@ -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 doCheck(String organizeCode, MesContainerPackage containerPackage, List packageDetails, MesContainerPartsModel matchModel, List containerParts) { return null; } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesContainerBindMixService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesContainerBindMixService.java new file mode 100644 index 0000000..3406ef7 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesContainerBindMixService.java @@ -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 doCheck(String organizeCode, MesContainerPackage containerPackage, List packageDetails, MesContainerPartsModel matchModel, List containerParts) { + Map result = new HashMap<>(); + result.put(MesPcnExtConstWords.RESULT, false); + + Set 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; + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesContainerBindNotMixService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesContainerBindNotMixService.java new file mode 100644 index 0000000..87bd349 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/rulematch/containerbind/checkqty/MesContainerBindNotMixService.java @@ -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 doCheck(String organizeCode, MesContainerPackage containerPackage, List packageDetails, MesContainerPartsModel matchModel, List containerParts) { + Map 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; + } +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesContainerPartsModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesContainerPartsModel.java new file mode 100644 index 0000000..d8f3f46 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesContainerPartsModel.java @@ -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; +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesContainerSnBindModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesContainerSnBindModel.java new file mode 100644 index 0000000..7e57566 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesContainerSnBindModel.java @@ -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 containerParts; + + @ApiParam("包装信息主表") + private MesContainerPackage containerPackage; + + @ApiParam("包装明细信息") + private List packageDetails; + + @ApiParam("条码绑定记录") + private final List bindingList = new ArrayList<>(); + + public void addPackageDetailBinding(MesContainerPackageDetailBinding binding) { + bindingList.add(binding); + } +}