From f105f37d7f21e097daaf6ba6bf86b07d0ca063a4 Mon Sep 17 00:00:00 2001 From: yxw Date: Sat, 14 Sep 2024 09:01:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A3=81=E7=89=87=E5=8A=9F=E8=83=BD-=E3=80=8B?= =?UTF-8?q?=E5=BC=B9=E6=A1=86=E5=B1=95=E7=A4=BA=E6=88=90=E5=93=81=E5=88=97?= =?UTF-8?q?=E8=A1=A8Function?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/pcn/api/base/IMesCustomerPartService.java | 19 ++ .../mes/pcn/api/base/IMesPackingDefineService.java | 19 ++ .../IMesProductionCustomContextStepService.java | 2 +- .../IMesProductionDispatchContextStepService.java | 10 + .../mes/pcn/api/busi/IMesWorkOrderCutService.java | 3 + .../serviceimpl/base/MesCustomerPartService.java | 34 +++ .../serviceimpl/base/MesPackingDefineService.java | 29 ++ .../busi/MesCutRawErrorProofingService.java | 4 +- .../serviceimpl/busi/MesWorkOrderCutService.java | 25 +- .../strategy/CutWorkOrderNoPrintStrategy.java | 198 ++++++++++++++ .../CutWorkOrderPackageSnPrintStrategy.java | 202 ++++++++++++++ .../MesFunctionCutOrderDialogPrintService.java | 67 +++++ .../step/MesWorkOrderCutCheckStepService.java | 137 +++++++--- ...MesWorkOrderCutMatchingProdRuleStepService.java | 25 +- .../MesWorkOrderCutPackageSnSaveStepService.java | 167 ++++++++++++ .../MesWorkOrderCutProductSnSaveStepService.java | 303 +++++++++++++++++++++ .../step/MesWorkOrderCutSaveStepService.java | 239 +--------------- .../MesWorkOrderCutWorkOrderSaveStepService.java | 133 +++++++++ .../MesProductionCustomContextStepService.java | 9 +- .../MesProductionDispatchContextStepService.java | 18 ++ .../ext/mes/pcn/pojo/context/MesPartContext.java | 21 ++ .../mes/pcn/pojo/model/MesProduceSnPrintModel.java | 7 + .../pcn/pojo/model/MesWorkOrderCutDetailModel.java | 24 +- .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 15 +- 24 files changed, 1412 insertions(+), 298 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesCustomerPartService.java create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPackingDefineService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesCustomerPartService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackingDefineService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CutWorkOrderNoPrintStrategy.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CutWorkOrderPackageSnPrintStrategy.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionCutOrderDialogPrintService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutPackageSnSaveStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutProductSnSaveStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutWorkOrderSaveStepService.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesCustomerPartService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesCustomerPartService.java new file mode 100644 index 0000000..57a8ef6 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesCustomerPartService.java @@ -0,0 +1,19 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.base; + +import cn.estsh.i3plus.pojo.mes.bean.MesCustomerPart; +import io.swagger.annotations.ApiOperation; + + +/** + * @Description : 客户物料信息 + * @Reference : + * @Author : xinwang.yi + * @CreateDate 2024/9/12 15:18 + * @Modify: + **/ +public interface IMesCustomerPartService { + + @ApiOperation(value = "根据物料代码、客户代码查询物料信息") + MesCustomerPart getMesCustomerPartByPartNo(String erpPartNo, String custCode, String organizeCode); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPackingDefineService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPackingDefineService.java new file mode 100644 index 0000000..8d4e5bb --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPackingDefineService.java @@ -0,0 +1,19 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.base; + +import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine; +import io.swagger.annotations.ApiOperation; + + +/** + * @Description : 包装定义信息 + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/6/13 15:18 + * @Modify: + **/ +public interface IMesPackingDefineService { + + @ApiOperation(value = "查询包装定义信息") + MesPackingDefine getMesPackingDefine(String packCode, String organizeCode); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java index abdef19..e555946 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java @@ -67,7 +67,7 @@ public interface IMesProductionCustomContextStepService { void removeProductionStatisticsContext(StationRequestBean reqBean); @ApiOperation(value = "获取生产线的当前班组班次信息") - MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode); + MesProdShiftContext getMesProdShiftKvBean(String organizeCode, String workCenterCode); @ApiOperation(value = "根据装配件规则ID获取可复用条码") String getRepeatAssemblySn(String organizeCode, String workCenterCode, String workCellCode, String assemblyNosortCfgId); diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java index 4132298..8dd7111 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel; import cn.estsh.i3plus.pojo.mes.bean.MesPart; import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; @@ -192,6 +193,15 @@ public interface IMesProductionDispatchContextStepService { @ApiOperation(value = "删除料桶原材料数据集合") void removeMesRawPartChargingDataContext(StationRequestBean reqBean); + @ApiOperation(value = "获取裁片成品数据集合") + List getMesWorkOrderCutFgDataContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存裁片成品数据集合", notes = "[JSON]List") + Boolean dispatchMesWorkOrderCutFgDataContext(StationRequestBean reqBean, List workOrderCutDetailModelList); + + @ApiOperation(value = "删除裁片成品数据集合") + void removeMesWorkOrderCutFgDataContext(StationRequestBean reqBean); + @ApiOperation(value = "验证工步集死循环执行时是否超过最大执行次数") Boolean dispatchOverEndlessLoopReadTimes(StationRequestBean reqBean, String maxTimes); diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderCutService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderCutService.java index eefb7f8..389ed33 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderCutService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderCutService.java @@ -28,4 +28,7 @@ public interface IMesWorkOrderCutService { @ApiOperation(value = "查询裁片方案成品配置") List queryCutSchemeFgList(String cutCode, String organizeCode); + @ApiOperation(value = "查询裁片方案设备信息") + MesCutSchemeEquipment getCutSchemeEquipment(String cutCode, String equipmentCode, String organizeCode); + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesCustomerPartService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesCustomerPartService.java new file mode 100644 index 0000000..9f68b79 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesCustomerPartService.java @@ -0,0 +1,34 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesCustomerPartService; +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.MesCustomerPart; +import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +/** + * @PROJECT_NAME: i3plus-mes-yfai + * @DESCRIPTION: + * @USER: xinwang.yi + * @DATE: 2024-09-12 20:41 + */ +@Service +public class MesCustomerPartService implements IMesCustomerPartService { + + @Autowired + private MesCustomerPartRepository customerPartRepository; + + @Override + public MesCustomerPart getMesCustomerPartByPartNo(String erpPartNo, String custCode, String organizeCode) { + + if (StringUtils.isEmpty(erpPartNo) || StringUtils.isEmpty(custCode) || StringUtils.isEmpty(organizeCode)) return null; + + return customerPartRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.ERP_PART_NO, MesPcnExtConstWords.CUST_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), erpPartNo, custCode}); + + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackingDefineService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackingDefineService.java new file mode 100644 index 0000000..fdeffa3 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackingDefineService.java @@ -0,0 +1,29 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPackingDefineService; +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.MesPackingDefine; +import cn.estsh.i3plus.pojo.mes.repository.MesPackingDefineRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @PROJECT_NAME: i3plus-mes-yfai + * @DESCRIPTION: + * @USER: xinwang.yi + * @DATE: 2024-09-12 16:53 + */ +@Service +public class MesPackingDefineService implements IMesPackingDefineService { + + @Autowired + private MesPackingDefineRepository packingDefineRepository; + + @Override + public MesPackingDefine getMesPackingDefine(String packCode, String organizeCode) { + return packingDefineRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PACK_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), packCode}); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesCutRawErrorProofingService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesCutRawErrorProofingService.java index c804290..021556f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesCutRawErrorProofingService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesCutRawErrorProofingService.java @@ -122,7 +122,7 @@ public class MesCutRawErrorProofingService implements IMesCutRawErrorProofingSer } // 剩余需要扫描的长度 - Double surplusLength = workOrderCutMaterial.getMaterialDosage() - workOrderCutMaterial.getScanLength(); + Double surplusLength = MathOperation.sub(workOrderCutMaterial.getMaterialDosage(), workOrderCutMaterial.getScanLength()); if (surplusLength.compareTo(length) > 0) { materialSnDb.setSurplusLength(0.0); workOrderCutMaterial.setScanLength(workOrderCutMaterial.getScanLength() + length); @@ -130,7 +130,7 @@ public class MesCutRawErrorProofingService implements IMesCutRawErrorProofingSer result.setShowInfo("长度不足,请继续扫描条码"); result.setIsReset(CommonEnumUtil.FALSE); } else { - materialSnDb.setSurplusLength(length - surplusLength); + materialSnDb.setSurplusLength(MathOperation.sub(length, surplusLength)); workOrderCutMaterial.setScanLength(workOrderCutMaterial.getMaterialDosage()); boolean isUpdateWorkOrderCut = true; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderCutService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderCutService.java index 77ef28e..f1ab01b 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderCutService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderCutService.java @@ -3,14 +3,9 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderCutService; 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.MesCutScheme; -import cn.estsh.i3plus.pojo.mes.bean.MesCutSchemeFg; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCut; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderCutDetail; -import cn.estsh.i3plus.pojo.mes.repository.MesCutSchemeFgRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesCutSchemeRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutDetailRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.repository.*; +import java.util.Collections; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -38,6 +33,9 @@ public class MesWorkOrderCutService implements IMesWorkOrderCutService { @Autowired private MesCutSchemeFgRepository cutSchemeFgRepository; + @Autowired + private MesCutSchemeEquipmentRepository cutSchemeEquipmentRepository; + @Override public MesWorkOrderCut getMesWorkOrderCut(String cutWorkOrderNo, String organizeCode) { return workOrderCutRepository.getByProperty( @@ -62,10 +60,19 @@ public class MesWorkOrderCutService implements IMesWorkOrderCutService { @Override public List queryCutSchemeFgList(String cutCode, String organizeCode) { - if (StringUtils.isEmpty(organizeCode)) return null; + if (StringUtils.isEmpty(organizeCode)) return Collections.emptyList(); return cutSchemeFgRepository.findByProperty( new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.CUT_CODE}, new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), cutCode}); } + + @Override + public MesCutSchemeEquipment getCutSchemeEquipment(String cutCode, String equipmentCode, String organizeCode) { + + return cutSchemeEquipmentRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.CUT_CODE, MesPcnExtConstWords.EQUIPMENT_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), cutCode, equipmentCode}); + + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CutWorkOrderNoPrintStrategy.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CutWorkOrderNoPrintStrategy.java new file mode 100644 index 0000000..6056590 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CutWorkOrderNoPrintStrategy.java @@ -0,0 +1,198 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintDataModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; +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.codemaker.SnowflakeIdMaker; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesNumberRuleRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.impp.framework.boot.util.ResultBean; +import cn.hutool.core.bean.BeanUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.Date; + +/** + * @Description : 裁片工单标签打印 + * @Reference : + * @Author : Castle + * @CreateDate : 2024/6/17 16:43 + * @Modify: + **/ +@Component +@Slf4j +public class CutWorkOrderNoPrintStrategy implements IPrintTemplateStrategyService { + @Autowired + private MesCustomerPartRepository mesCustomerPartRDao; + + @Autowired + private ISyncFuncService syncFuncService; + + @Autowired + private SnowflakeIdMaker snowflakeIdMaker; + + @Autowired + private IMesPartService mesPartService; + + @Autowired + private IConfigService configService; + + @Autowired + private MesNumberRuleRepository numberRuleRepository; + + @Override + public MesProduceSnPrintModel execute(GenSerialNoModel genSerialNoModel, MesProduceSnPrintModel mesProduceSnPrintModel, MesNumberRule numberRule, StepResult stepResult, StationRequestBean reqBean, Boolean isStep) { + Date date = new Date(); + String organizeCode = mesProduceSnPrintModel.getOrganizeCode(); + //gz-xiaopeng + //客户条码-小鹏汽车 gz-xiaopeng + //{custPartNo}{year}{month}{day}{serialNo} + //客户零件号 + MesCustomerPart mesCustomerPart = getMesCustomerPart(mesProduceSnPrintModel); + String custPartNo = mesCustomerPart == null ? "" : mesCustomerPart.getCustPartNo(); + MesPart mesPart = mesPartService.getMesPartByPartNo(mesProduceSnPrintModel.getPartNo(), organizeCode); + numberRule = null != numberRule ? numberRule : getNumberRule(organizeCode, mesPart); + MesConfig mesConfig = configService.getMesConfigByCfgCode(MesPcnExtConstWords.ORGANIZE_NAME, organizeCode); + String organizeName = mesConfig.getCfgValue(); + if (!isStep){ + //年月日缩写 + genSerialNoModel.setYear(getYearShort(date)); + genSerialNoModel.setMonth(getMonthShort(date)); + genSerialNoModel.setDay(getDayShort(date)); + genSerialNoModel.setRuleCode(numberRule.getRuleCode()); + genSerialNoModel.setCustPartNo(custPartNo); + + //流水号 5位 每天从1开始 + for (int i = 0; i < mesProduceSnPrintModel.getPrintQty(); i++) { + ResultBean resultBean = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), organizeCode, 1); + String sn = resultBean.getResultList().get(0).toString(); + Integer serialNoLength = numberRule.getSerialnoLength(); + String serialNo = sn.substring(sn.length() - serialNoLength); + //保存条码信息 + MesProduceSn produceSn = generateMesProduceSn(mesPart, sn, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getQty()); + produceSn.setCustPartNo(custPartNo); + //封装打印信息 + MesProduceSnPrintDataModel printDataModel = getModel(produceSn, serialNo, custPartNo, organizeName); + mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(printDataModel); + mesProduceSnPrintModel.getMesProduceSnList().add(produceSn); + //保存打印记录 + MesPrintedSnLog snLog = new MesPrintedSnLog(); + BeanUtil.copyProperties(printDataModel,snLog); + snLog.setOrganizeCode(organizeCode); + ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName()); + mesProduceSnPrintModel.getMesPrintedSnLogList().add(snLog); + } + }else { + String sn = mesProduceSnPrintModel.getProductSn(); + MesProduceSn mesProduceSn = mesProduceSnPrintModel.getMesProduceSnList().get(0); + Integer serialNoLength = numberRule.getSerialnoLength(); + String serialNo = sn.substring(sn.length() - serialNoLength); + //封装打印信息 + MesProduceSnPrintDataModel printDataModel = getModel(mesProduceSn, serialNo, custPartNo, organizeName); + mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(printDataModel); + //保存打印记录 + MesPrintedSnLog snLog = new MesPrintedSnLog(); + BeanUtil.copyProperties(printDataModel,snLog); + snLog.setOrganizeCode(organizeCode); + ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName()); + mesProduceSnPrintModel.getMesPrintedSnLogList().add(snLog); + } + + return mesProduceSnPrintModel; + } + + private MesNumberRule getNumberRule(String organizeCode, MesPart part) { + if (StringUtils.isEmpty(part.getProductMatchRule())) MesPcnException.throwMesBusiException("物料[%s]未维护零件条码匹配规则", part.getPartNo()); + MesNumberRule numberRule = numberRuleRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.RULE_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), part.getProcessMatchRule()}); + if (null == numberRule) MesPcnException.throwMesBusiException("物料[%s]维护的零件条码匹配规则[%s]信息不存在", part.getPartNo(), part.getProcessMatchRule()); + return numberRule; + } + + private MesCustomerPart getMesCustomerPart(MesProduceSnPrintModel mesProduceSnPrintModel) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesProduceSnPrintModel.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesProduceSnPrintModel.getPartNo(), "erpPartNo", ddlPackBean); + MesCustomerPart mesCustomerPart = mesCustomerPartRDao.getByProperty(ddlPackBean); + /** + * 2024/07/25 打印模板不校验 客户零件号,校验客户零件号移动到条码规则中 numberRule的策略中 + */ +// if (Objects.isNull(mesCustomerPart)) { +// MesPcnException.throwMesBusiException("物料【%s】客户零件关系未维护", mesProduceSnPrintModel.getPartNo()); +// } + return mesCustomerPart; + } + + private String getYearShort(Date date) { + String yearStr = MesExtEnumUtil.YEAR_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getYear(date))); + if (StringUtils.isEmpty(yearStr)) { + MesPcnException.throwMesBusiException("【%s】年月简号不存在", TimeTool.getYear(date)); + } + return yearStr; + } + + private String getMonthShort(Date date) { + String monthStr = MesExtEnumUtil.MONTH_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getMonth(date))); + if (StringUtils.isEmpty(monthStr)) { + MesPcnException.throwMesBusiException("【%s】月简号不存在", TimeTool.getMonth(date)); + } + return monthStr; + } + + private String getDayShort(Date date) { + String day = TimeTool.getDay(date); + return day; + } + + private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, String userName, Double qty) { + MesProduceSn mesProduceSn = new MesProduceSn(); + mesProduceSn.setSerialNumber(snowflakeIdMaker.nextId() + ""); + mesProduceSn.setProductSn(sn); + mesProduceSn.setCustSn(sn); + mesProduceSn.setPartNo(mesPart.getPartNo()); + mesProduceSn.setPartName(mesPart.getPartName()); + mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate()); + mesProduceSn.setCustLabelTemplate(mesPart.getCustLabelTemplate()); + mesProduceSn.setProdLabelTemplate(mesPart.getProductLabelTemplate()); + mesProduceSn.setQty(qty); + mesProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue()); + mesProduceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); + mesProduceSn.setLotNo(TimeTool.getToday()); + mesProduceSn.setPrintCount(MesPcnExtConstWords.ONE); + mesProduceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue()); + mesProduceSn.setOrganizeCode(mesPart.getOrganizeCode()); + ConvertBean.serviceModelInitialize(mesProduceSn, userName); + return mesProduceSn; + } + private MesProduceSnPrintDataModel getModel(MesProduceSn produceSn, String no, String custPartNo, String factoryName) { + MesProduceSnPrintDataModel mesProduceSnPrintDataModel = new MesProduceSnPrintDataModel(); + mesProduceSnPrintDataModel.setFactoryName(factoryName); + mesProduceSnPrintDataModel.setPartNo(produceSn.getPartNo()); + mesProduceSnPrintDataModel.setPartName(produceSn.getPartName()); + mesProduceSnPrintDataModel.setNo(no); + mesProduceSnPrintDataModel.setBarcode(produceSn.getProductSn()); + mesProduceSnPrintDataModel.setCustPartNo(custPartNo); + mesProduceSnPrintDataModel.setPrintDate(TimeTool.getNowTime(true)); + mesProduceSnPrintDataModel.setProductDate(produceSn.getCreateDatetime()); + return mesProduceSnPrintDataModel; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CutWorkOrderPackageSnPrintStrategy.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CutWorkOrderPackageSnPrintStrategy.java new file mode 100644 index 0000000..7247340 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/CutWorkOrderPackageSnPrintStrategy.java @@ -0,0 +1,202 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintDataModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesProduceSnPrintModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.api.iservice.base.IConfigService; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; +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.codemaker.SnowflakeIdMaker; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.repository.MesCustomerPartRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesNumberRuleRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.impp.framework.boot.util.ResultBean; +import cn.hutool.core.bean.BeanUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.Date; +import java.util.List; + +/** + * @Description : 裁片工单包装标签打印 + * @Reference : + * @Author : Castle + * @CreateDate : 2024/6/17 16:43 + * @Modify: + **/ +@Component +@Slf4j +public class CutWorkOrderPackageSnPrintStrategy implements IPrintTemplateStrategyService { + @Autowired + private MesCustomerPartRepository mesCustomerPartRDao; + + @Autowired + private ISyncFuncService syncFuncService; + + @Autowired + private SnowflakeIdMaker snowflakeIdMaker; + + @Autowired + private IMesPartService mesPartService; + + @Autowired + private IConfigService configService; + + @Autowired + private MesNumberRuleRepository numberRuleRepository; + + @Override + public MesProduceSnPrintModel execute(GenSerialNoModel genSerialNoModel, MesProduceSnPrintModel mesProduceSnPrintModel, MesNumberRule numberRule, StepResult stepResult, StationRequestBean reqBean, Boolean isStep) { + Date date = new Date(); + String organizeCode = mesProduceSnPrintModel.getOrganizeCode(); + //gz-xiaopeng + //客户零件号 + MesCustomerPart mesCustomerPart = getMesCustomerPart(mesProduceSnPrintModel); + String custPartNo = mesCustomerPart == null ? "" : mesCustomerPart.getCustPartNo(); + MesPart mesPart = mesPartService.getMesPartByPartNo(mesProduceSnPrintModel.getPartNo(), organizeCode); + MesConfig mesConfig = configService.getMesConfigByCfgCode(MesPcnExtConstWords.ORGANIZE_NAME, organizeCode); + String organizeName = mesConfig.getCfgValue(); + + List workOrderCutDetailModelList = (List) mesProduceSnPrintModel.getSourceData(); + + + + if (!isStep){ + //年月日缩写 + genSerialNoModel.setYear(getYearShort(date)); + genSerialNoModel.setMonth(getMonthShort(date)); + genSerialNoModel.setDay(getDayShort(date)); + genSerialNoModel.setRuleCode(numberRule.getRuleCode()); + genSerialNoModel.setCustPartNo(custPartNo); + + //流水号 5位 每天从1开始 + for (int i = 0; i < mesProduceSnPrintModel.getPrintQty(); i++) { + ResultBean resultBean = syncFuncService.syncSerialNo(genSerialNoModel, mesProduceSnPrintModel.getUserName(), organizeCode, 1); + String sn = resultBean.getResultList().get(0).toString(); + Integer serialNoLength = numberRule.getSerialnoLength(); + String serialNo = sn.substring(sn.length() - serialNoLength); + //保存条码信息 + MesProduceSn produceSn = generateMesProduceSn(mesPart, sn, mesProduceSnPrintModel.getUserName(), mesProduceSnPrintModel.getQty()); + produceSn.setCustPartNo(custPartNo); + //封装打印信息 + MesProduceSnPrintDataModel printDataModel = getModel(produceSn, serialNo, custPartNo, organizeName); + mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(printDataModel); + mesProduceSnPrintModel.getMesProduceSnList().add(produceSn); + //保存打印记录 + MesPrintedSnLog snLog = new MesPrintedSnLog(); + BeanUtil.copyProperties(printDataModel,snLog); + snLog.setOrganizeCode(organizeCode); + ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName()); + mesProduceSnPrintModel.getMesPrintedSnLogList().add(snLog); + } + }else { + String sn = mesProduceSnPrintModel.getProductSn(); + MesProduceSn mesProduceSn = mesProduceSnPrintModel.getMesProduceSnList().get(0); + Integer serialNoLength = numberRule.getSerialnoLength(); + String serialNo = sn.substring(sn.length() - serialNoLength); + //封装打印信息 + MesProduceSnPrintDataModel printDataModel = getModel(mesProduceSn, serialNo, custPartNo, organizeName); + mesProduceSnPrintModel.getMesProduceSnPrintDataModelList().add(printDataModel); + //保存打印记录 + MesPrintedSnLog snLog = new MesPrintedSnLog(); + BeanUtil.copyProperties(printDataModel,snLog); + snLog.setOrganizeCode(organizeCode); + ConvertBean.serviceModelInitialize(snLog, mesProduceSnPrintModel.getUserName()); + mesProduceSnPrintModel.getMesPrintedSnLogList().add(snLog); + } + + return mesProduceSnPrintModel; + } + + private MesNumberRule getNumberRule(String organizeCode, MesPart part) { + if (StringUtils.isEmpty(part.getProductMatchRule())) MesPcnException.throwMesBusiException("物料[%s]未维护零件条码匹配规则", part.getPartNo()); + MesNumberRule numberRule = numberRuleRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.RULE_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), part.getProcessMatchRule()}); + if (null == numberRule) MesPcnException.throwMesBusiException("物料[%s]维护的零件条码匹配规则[%s]信息不存在", part.getPartNo(), part.getProcessMatchRule()); + return numberRule; + } + + private MesCustomerPart getMesCustomerPart(MesProduceSnPrintModel mesProduceSnPrintModel) { + DdlPackBean ddlPackBean = DdlPackBean.getDdlPackBean(mesProduceSnPrintModel.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(mesProduceSnPrintModel.getPartNo(), "erpPartNo", ddlPackBean); + MesCustomerPart mesCustomerPart = mesCustomerPartRDao.getByProperty(ddlPackBean); + /** + * 2024/07/25 打印模板不校验 客户零件号,校验客户零件号移动到条码规则中 numberRule的策略中 + */ +// if (Objects.isNull(mesCustomerPart)) { +// MesPcnException.throwMesBusiException("物料【%s】客户零件关系未维护", mesProduceSnPrintModel.getPartNo()); +// } + return mesCustomerPart; + } + + private String getYearShort(Date date) { + String yearStr = MesExtEnumUtil.YEAR_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getYear(date))); + if (StringUtils.isEmpty(yearStr)) { + MesPcnException.throwMesBusiException("【%s】年月简号不存在", TimeTool.getYear(date)); + } + return yearStr; + } + + private String getMonthShort(Date date) { + String monthStr = MesExtEnumUtil.MONTH_SHORT.valueOfDescription(Integer.parseInt(TimeTool.getMonth(date))); + if (StringUtils.isEmpty(monthStr)) { + MesPcnException.throwMesBusiException("【%s】月简号不存在", TimeTool.getMonth(date)); + } + return monthStr; + } + + private String getDayShort(Date date) { + String day = TimeTool.getDay(date); + return day; + } + + private MesProduceSn generateMesProduceSn(MesPart mesPart, String sn, String userName, Double qty) { + MesProduceSn mesProduceSn = new MesProduceSn(); + mesProduceSn.setSerialNumber(snowflakeIdMaker.nextId() + ""); + mesProduceSn.setProductSn(sn); + mesProduceSn.setCustSn(sn); + mesProduceSn.setPartNo(mesPart.getPartNo()); + mesProduceSn.setPartName(mesPart.getPartName()); + mesProduceSn.setProcessLabelTemplate(mesPart.getProcessLabelTemplate()); + mesProduceSn.setCustLabelTemplate(mesPart.getCustLabelTemplate()); + mesProduceSn.setProdLabelTemplate(mesPart.getProductLabelTemplate()); + mesProduceSn.setQty(qty); + mesProduceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.CREATE.getValue()); + mesProduceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); + mesProduceSn.setLotNo(TimeTool.getToday()); + mesProduceSn.setPrintCount(MesPcnExtConstWords.ONE); + mesProduceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue()); + mesProduceSn.setOrganizeCode(mesPart.getOrganizeCode()); + ConvertBean.serviceModelInitialize(mesProduceSn, userName); + return mesProduceSn; + } + private MesProduceSnPrintDataModel getModel(MesProduceSn produceSn, String no, String custPartNo, String factoryName) { + MesProduceSnPrintDataModel mesProduceSnPrintDataModel = new MesProduceSnPrintDataModel(); + mesProduceSnPrintDataModel.setFactoryName(factoryName); + mesProduceSnPrintDataModel.setPartNo(produceSn.getPartNo()); + mesProduceSnPrintDataModel.setPartName(produceSn.getPartName()); + mesProduceSnPrintDataModel.setNo(no); + mesProduceSnPrintDataModel.setBarcode(produceSn.getProductSn()); + mesProduceSnPrintDataModel.setCustPartNo(custPartNo); + mesProduceSnPrintDataModel.setPrintDate(TimeTool.getNowTime(true)); + mesProduceSnPrintDataModel.setProductDate(produceSn.getCreateDatetime()); + return mesProduceSnPrintDataModel; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionCutOrderDialogPrintService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionCutOrderDialogPrintService.java new file mode 100644 index 0000000..a51baee --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionCutOrderDialogPrintService.java @@ -0,0 +1,67 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService; +import cn.estsh.i3plus.platform.common.util.MesPcnConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; +import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +/** + * @Description : 工位参数按钮事件接口实现【选择工单】 + **/ +@Service +public class MesFunctionCutOrderDialogPrintService extends BaseSwsService implements IFsmModuleFunctionService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IShippingDispatchService shippingDispatchService; + + @Override + public Boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { + + //获取生产过程上下文对象 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getProductionProcessContext(reqBean); + + if (!productionProcessContext.getSuccess()) return false; + + MesWorkCell workCell = productionProcessContext.getWorkCell(); + + if (StringUtils.isEmpty(buttonDynamicModel.getFunctionValue())) { + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()), + String.format("生产线[%s]工位[%s]%s失败,裁片方案成品[%s]的有效性!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), buttonDynamicModel.getFunctionValue()), + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return false; + } + + + + reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); + reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); + reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode()); + reqBean.setForceJumpProcess(true); + shippingDispatchService.sendScanQueueNextExec(reqBean); + + return true; + + } + + @Override + public Object stepDialogDispatch(StationRequestBean reqBean, String customPageName) { + return productionDispatchContextStepService.getMesWorkOrderCutFgDataContext(reqBean); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutCheckStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutCheckStepService.java index 8892c88..3d67de7 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutCheckStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutCheckStepService.java @@ -1,5 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesCustomerPartService; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPackingDefineService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; @@ -7,7 +9,6 @@ import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; -import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; @@ -52,6 +53,12 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService { @Autowired private IMesProduceSnExtService produceSnExtService; + @Autowired + private IMesPackingDefineService packingDefineService; + + @Autowired + private IMesCustomerPartService customerPartService; + @Override public StepResult execute(StationRequestBean reqBean) { @@ -78,43 +85,49 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService { //从上下文中取出生产线对象 MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - //获取上下文产出零件信息 - List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); - //获取工单对应的条码数据信息 - List cachedProductionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); - - //验证扫描信息是否属于工艺强过码 - Boolean isCraftJumpCode = matchCraftJumpCode(productionProcessContext, equipVariableCollectContextList); - - //验证是否支持跳过 - Boolean isAllowJump = checkIsAllowJump(cachedProductionPartContextList, cachedProductionPsInContextList); + MesWorkCell workCell = productionProcessContext.getWorkCell(); - //当前不允许跳过 - if (isCraftJumpCode && !isAllowJump) - return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()). - scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前扫描信息工艺强过码[%s],当前没有可以跳过的裁片工单信息!", equipVariableCollectContextList.get(0).getEquipVariableValue())); + ////获取上下文产出零件信息 + //List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + ////获取工单对应的条码数据信息 + //List cachedProductionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); - //允许跳过,先更新数据 - if (isCraftJumpCode && isAllowJump) { - updateProductionPartAndPsInContextList(reqBean, cachedProductionPartContextList, cachedProductionPsInContextList, equipVariableCollectContextList.get(0).getEquipVariableValue()); - return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()). - scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前扫描信息工艺强过码[%s]!", equipVariableCollectContextList.get(0).getEquipVariableValue())); - } + //验证扫描信息是否属于工艺强过码 + //Boolean isCraftJumpCode = matchCraftJumpCode(productionProcessContext, equipVariableCollectContextList); + // + ////验证是否支持跳过 + //Boolean isAllowJump = checkIsAllowJump(cachedProductionPartContextList, cachedProductionPsInContextList); + + ////当前不允许跳过 + //if (isCraftJumpCode && !isAllowJump) + // return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()). + // scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前扫描信息工艺强过码[%s],当前没有可以跳过的裁片工单信息!", equipVariableCollectContextList.get(0).getEquipVariableValue())); + // + ////允许跳过,先更新数据 + //if (isCraftJumpCode && isAllowJump) { + // updateProductionPartAndPsInContextList(reqBean, cachedProductionPartContextList, cachedProductionPsInContextList, equipVariableCollectContextList.get(0).getEquipVariableValue()); + // return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.SCAN.getValue()). + // scanInfo(equipVariableCollectContextList.get(0).getEquipVariableValue()), stepResult, String.format("当前扫描信息工艺强过码[%s]!", equipVariableCollectContextList.get(0).getEquipVariableValue())); + //} //验证工单的有效性 List productionPartContextList = new ArrayList<>(); List productionPsInContextList = new ArrayList<>(); List productionPsOutContextList = new ArrayList<>(); - if (!checkWorkOrderValid(reqBean, stepResult, productionProcessContext, workCenter, + if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter, equipVariableCollectContextList, productionPartContextList, productionPsInContextList, - productionPsOutContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + productionPsOutContextList, workCell).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); - //保存零件数据信息 - if (!firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, true).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + ////保存零件数据信息 + //if (!firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, true).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); - //保存上下文产出零件信息 + //保存上下文零件信息 productionDispatchContextStepService.dispatchProductionPartContext(reqBean, productionPartContextList); + //保存上下文产出零件信息 + productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList); + //保存上下文产出零件信息 + productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList); //存储展示组件MODULE_CONTENT内容 productionDispatchContextStepService.dispatchModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList)); @@ -138,6 +151,15 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService { } + //public StepResult savePartDataMap(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productionPartContextList, Boolean isBackError) { + // + // //从一模多腔信息中搜集零件编码并去重 + // List partNoList = (productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPartContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + // + // return savePartDataMap(reqBean, resultBean, stepResult, partNoList, isBackError); + // + //} + //封装展示组件MODULE_CONTENT内容 private List> getModuleContextData(StationRequestBean reqBean, List productionPartContextList) { @@ -164,22 +186,21 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService { } //验证工单的有效性 - private StepResult checkWorkOrderValid(StationRequestBean reqBean, StepResult stepResult, + private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, List equipVariableCollectContextList, List productionPartContextList, List productionPsInContextList, - List productionPsOutContextList) { + List productionPsOutContextList, + MesWorkCell workCell) { - //搜集生产工单号 + //搜集裁片工单号 List filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); List workOrderCutNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList()); - //Map> workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrderNoList); - String cutWorkOrderNo = workOrderCutNoList.stream().findFirst().get(); - MesWorkOrderCut workOrderCut = workOrderCutService.getMesWorkOrderCut(reqBean.getOrganizeCode(), cutWorkOrderNo); + MesWorkOrderCut workOrderCut = workOrderCutService.getMesWorkOrderCut(cutWorkOrderNo, reqBean.getOrganizeCode()); if (workOrderCut == null) return stepResult.isCompleted(false).msg(String.format("请检查裁片工单信息,裁片工单[%s]无效!", cutWorkOrderNo)); @@ -189,12 +210,17 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService { if (cutScheme == null) return stepResult.isCompleted(false).msg(String.format("请检查裁片工单信息,裁片工单[%s]所属裁片配置无效!", cutWorkOrderNo)); - if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == cutScheme.getIsCheckMaterial() && workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.CHECKED_RAW.getValue()) + if (!cutScheme.getWorkCenterCode().equals(workCenter.getWorkCenterCode())) + return stepResult.isCompleted(false).msg(String.format("裁片工单[%s]所属裁片方案[%s]产线[%s]与当前产线[%s]不一致!", cutWorkOrderNo, cutScheme.getCutCode(), cutScheme.getWorkCenterCode(), workCenter.getWorkCenterCode())); + + if (workOrderCut.getWorkOrderStatus() == MesExtEnumUtil.CUT_ORDER_STATUS.COMPLETE.getValue()) + return stepResult.isCompleted(false).msg(String.format("裁片工单[%s]当前状态[%s],无需加工!", cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.valueOfDescription(workOrderCut.getWorkOrderStatus()))); + else if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == cutScheme.getIsCheckMaterial() && workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.CHECKED_RAW.getValue() && workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue()) return stepResult.isCompleted(false).msg(String.format("裁片工单[%s]未进行裁片原材料防错!", cutWorkOrderNo)); - else if (workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue() || workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue()) + else if (workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.CHECKED_RAW.getValue() && workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.RELEASED.getValue() && workOrderCut.getWorkOrderStatus() != MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue()) return stepResult.isCompleted(false).msg(String.format("裁片工单[%s]当前状态[%s]无需加工或无法加工!", cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.valueOfDescription(workOrderCut.getWorkOrderStatus()))); - List mesWorkOrderCutDetailList = workOrderCutService.queryMesWorkOrderCutDetailList(reqBean.getOrganizeCode(), cutWorkOrderNo); + List mesWorkOrderCutDetailList = workOrderCutService.queryMesWorkOrderCutDetailList(cutWorkOrderNo, reqBean.getOrganizeCode()); if (CollectionUtils.isEmpty(mesWorkOrderCutDetailList)) return stepResult.isCompleted(false).msg(String.format("请检查裁片工单信息,裁片工单[%s]明细不存在!", cutWorkOrderNo)); @@ -214,6 +240,9 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService { return stepResult.isCompleted(false).msg(String.format("请检查工单信息,裁片工单[%s]信息绑定工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", cutWorkOrderNo, workOrder.getWorkOrderNo(), workOrder.getWorkCenterCode(), reqBean.getWorkCenterCode())); } + //保存零件数据信息 + if (!firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, true).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + // 裁片方案成品配置 List mesCutSchemeFgList = workOrderCutService.queryCutSchemeFgList(cutScheme.getCutCode(), reqBean.getOrganizeCode()); @@ -222,20 +251,48 @@ public class MesWorkOrderCutCheckStepService extends BaseStepService { List fgPartNoList = mesCutSchemeFgList.stream().map(MesCutSchemeFg::getPartNo).distinct().collect(Collectors.toList()); - List worKOrderPartNoList = workOrderList.stream().map(MesWorkOrder::getWorkOrderNo).distinct().collect(Collectors.toList()); + List worKOrderPartNoList = workOrderList.stream().map(MesWorkOrder::getPartNo).distinct().collect(Collectors.toList()); worKOrderPartNoList.removeAll(fgPartNoList); if (!CollectionUtils.isEmpty(worKOrderPartNoList)) - return stepResult.isCompleted(false).msg(String.format("请检查裁片方案成品信息,零件号[%s]未在裁片方案[%]成品配置信息中维护!", worKOrderPartNoList, cutScheme.getCutCode())); + return stepResult.isCompleted(false).msg(String.format("请检查裁片方案成品信息,零件号[%s]未在裁片方案[%s]成品配置信息中维护!", worKOrderPartNoList, cutScheme.getCutCode())); + + // 最后一个工位 封装 包装条码打印所需参数 + if (workCell.getIsEndWorkCell() != null && workCell.getIsEndWorkCell() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { + + Map partDataExtContext = productionDispatchContextStepService.getPartDataExtContext(reqBean); + + for (MesCutSchemeFg mesCutSchemeFg : mesCutSchemeFgList) { + if (StringUtils.isEmpty(mesCutSchemeFg.getPackageSnRuleCode())) + return stepResult.isCompleted(false).msg(String.format("请检查裁片方案成品信息,零件号[%s]未在裁片方案[%s]成品配置信息中维护包装编码规则!", mesCutSchemeFg.getPartNo(), cutScheme.getCutCode())); + + MesPackingDefine mesPackingDefine = packingDefineService.getMesPackingDefine(mesCutSchemeFg.getPackageSnRuleCode(), reqBean.getOrganizeCode()); + + if (mesPackingDefine == null) + return stepResult.isCompleted(false).msg(String.format("裁片方案代码[%s]关联产成零件[%s]箱类别代号[%s]无效!", mesCutSchemeFg.getCutCode(), mesCutSchemeFg.getPartNo(), mesCutSchemeFg.getPackageSnRuleCode())); + + MesCustomerPart customerPart = customerPartService.getMesCustomerPartByPartNo(mesCutSchemeFg.getPartNo(), mesPackingDefine.getCustCode(), reqBean.getOrganizeCode()); + + MesPartContext mesPartContext = partDataExtContext.get(mesCutSchemeFg.getPartNo()); + mesPartContext.setCopies(cutScheme.getCopies()); + mesPartContext.setPackageSnRule(mesPackingDefine.getPackageBarcodeRule()); + mesPartContext.setPrinter(mesPackingDefine.getPrinter()); + mesPartContext.setLabelTemplate(mesPackingDefine.getPakcageTemplate()); + mesPartContext.setCustPartNo(customerPart == null ? "" : customerPart.getCustPartNo()); + + partDataExtContext.put(mesCutSchemeFg.getPartNo(), mesPartContext); + + } + + productionDispatchContextStepService.dispatchPartDataContext(reqBean, partDataExtContext); + + } Map workOrderCutDetailMap = mesWorkOrderCutDetailList.stream().collect(Collectors.toMap(MesWorkOrderCutDetail::getWorkOrderNo, Function.identity(), (x, y) -> y)); List produceSnList = produceSnExtService.getProduceSnList(reqBean.getOrganizeCode(), cutWorkOrderNo); - //获取上下文的工位 - MesWorkCell workCell = productionProcessContext.getWorkCell(); - // 获取上道工艺生产的条码并封装到进料上下文中 if (!CollectionUtils.isEmpty(produceSnList)) produceSnList.stream().filter(o -> null != o).forEach(o -> { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutMatchingProdRuleStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutMatchingProdRuleStepService.java index f2eb609..89132fd 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutMatchingProdRuleStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutMatchingProdRuleStepService.java @@ -8,6 +8,7 @@ import cn.estsh.i3plus.mes.pcn.util.PojoAttrUtil; import cn.estsh.i3plus.mes.pcn.util.StringUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesCutSchemeEquipment; import cn.estsh.i3plus.pojo.mes.bean.MesProdRuleNosortCfg; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; @@ -54,6 +55,9 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService @Autowired private IMesWorkOrderExtService workOrderExtService; + @Autowired + private IMesWorkOrderCutService workOrderCutService; + @Override public StepResult execute(StationRequestBean reqBean) { @@ -73,7 +77,7 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService //从上下文中取出生产线对象 MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - //从上下文中取出生产线对象 + //从上下文中取出设备对象 MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); //获取上下文加工规则数据信息集合 @@ -90,7 +94,7 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService Integer initSize = prodRuleContextList.size(); //封装非排序加工规则 - doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, productionProcessContext, cellEquipContext, + doHandleProdRuleData(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList); //匹配失败需要清除本次扫描/读取信息 @@ -110,19 +114,19 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService } private StepResult doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, - MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, + MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPartContextList) { //根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错) - return doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, workCenter, productionProcessContext, + return doHandleProdRuleDataByProductionPart(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, prodRuleContextList, productionPartContextList); } //根据是否存在【产出零件数据】获取剩余待匹配的加工规则数据 (只能查询到一条,否则报错) private StepResult doHandleProdRuleDataByProductionPart(StationRequestBean reqBean, StationResultBean resultBean, - StepResult stepResult, MesWorkCenter workCenter, + StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List prodRuleContextList, @@ -158,6 +162,14 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService //根据产出零件分组数据 Map> prodRuleNosortCfgMap = groupProdRuleNosortCfgList(prodRuleNosortCfgList); + String cutCode = productionPartContextList.get(0).getCutCode(); + + MesCutSchemeEquipment cutSchemeEquipment = workOrderCutService.getCutSchemeEquipment(cutCode, cellEquipContext.getEquipmentCode(), reqBean.getOrganizeCode()); + + if (cutSchemeEquipment == null) + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format( + "未维护裁片方案代码[%s]设备[%s]的裁片设备配置信息!", cutCode, cellEquipContext.getEquipmentName())); + for (MesProductionPartContext productionPartContext : productionPartContextList) { //foreignKey有值代表已经匹配过产品加工规则 @@ -174,14 +186,13 @@ public class MesWorkOrderCutMatchingProdRuleStepService extends BaseStepService MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContext( new MesProdRuleContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()) .copy(filterList.get(0)).workOrderNo(productionPartContext.getWorkOrderNo()).foreignKey(productionPartContext.foreignKey(foreignKey += 1).getForeignKey())); + prodRuleContext.setIsPrint(cutSchemeEquipment.getIsPrint()); prodRuleContextList.add(prodRuleContext); log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- 设备:{} 产出零件信息:{} 产品加工规则:{} ---", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), cellEquipContext.getEquipmentCode(), JSONObject.toJSONString(productionPartContext), JSONObject.toJSONString(prodRuleContext)); } - // 默认头道才有超工单 - //validSuperWorkOrder(reqBean, productionPartContextList, null, workCenter, stepResult, resultBean); return stepResult; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutPackageSnSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutPackageSnSaveStepService.java new file mode 100644 index 0000000..f16958c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutPackageSnSaveStepService.java @@ -0,0 +1,167 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; + +import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @Description : 保存裁片工单包装条码工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesWorkOrderCutPackageSnSaveStepService") +public class MesWorkOrderCutPackageSnSaveStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private ISyncFuncService syncFuncService; + + @Autowired + private IFsmRouteDataService fsmRouteDataService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + // 获取产成零件信息 + Map partDataContext = productionDispatchContextStepService.getPartDataExtContext(reqBean); + + //从上下文中取出工位对象 + MesWorkCell workCell = productionProcessContext.getWorkCell(); + + // 重新收集打印裁片箱条码 + List newWorkOrderCutFgDataContextList = new ArrayList<>(); + + // 最后一个工位才生成箱条码 + if (workCell.getIsEndWorkCell() != null && workCell.getIsEndWorkCell() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { + List workOrderCutFgDataContextList = productionDispatchContextStepService.getMesWorkOrderCutFgDataContext(reqBean); + + if (CollectionUtils.isEmpty(workOrderCutFgDataContextList)) + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "缺失裁片工单箱条码配置信息!"); + + for (MesWorkOrderCutDetailModel workOrderCutDetailModel : workOrderCutFgDataContextList) { + BigDecimal[] bigDecimals = divideAndRemainder(workOrderCutDetailModel); + + // 获取 商 根据商的决定生成条码次数 + double num = bigDecimals[0].doubleValue(); + + /* 如果余数 大于0 则 分为两种情况 + 1、产成数量 不大于 标包数量 + 2、剩余产成数量 生成尾数箱条码 + */ + double remainder = bigDecimals[1].doubleValue(); + + List workOrderCutPackages = new ArrayList<>(); + + // 商大于 0 则 + while (num > 0) { + // 满箱直接取标包数量 + packWorkOrderPackageList(reqBean, resultBean, workOrderCutDetailModel, partDataContext, + workOrderCutDetailModel.getPackageQty(), workOrderCutPackages, newWorkOrderCutFgDataContextList); + num--; + } + + if (remainder > 0) { + // 尾数箱取剩余产成数量 + packWorkOrderPackageList(reqBean, resultBean, workOrderCutDetailModel, partDataContext, + remainder, workOrderCutPackages, newWorkOrderCutFgDataContextList); + } + + } + + productionDispatchContextStepService.dispatchMesWorkOrderCutFgDataContext(reqBean, newWorkOrderCutFgDataContextList); + + } + + return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存裁片工单箱条码成功!"); + + } + + private void packWorkOrderPackageList(StationRequestBean reqBean, StationResultBean resultBean, + MesWorkOrderCutDetailModel workOrderCutDetailModel, + Map partDataContext, + Double qty, List workOrderCutPackages, + List newWorkOrderCutFgDataContextList) { + + MesPartContext mesPartContext = partDataContext.get(workOrderCutDetailModel.getPartNo()); + String nowTime = TimeTool.getNowTime(false); + MesWorkOrderCutPackage cutPackage = new MesWorkOrderCutPackage(); + ConvertBean.serviceModelInitialize(cutPackage, reqBean.getUserInfo()); + cutPackage.setOrganizeCode(reqBean.getOrganizeCode()); + BeanUtils.copyProperties(workOrderCutDetailModel, cutPackage); + cutPackage.setQty(qty); + cutPackage.setLotNo(nowTime); + cutPackage.setSn(doGenerateSerialNo(reqBean, resultBean, mesPartContext.getPackageSnRule(), mesPartContext)); + + MesWorkOrderCutDetailModel newWorkOrderCutDetailModel = new MesWorkOrderCutDetailModel(); + BeanUtils.copyProperties(workOrderCutDetailModel, newWorkOrderCutDetailModel); + newWorkOrderCutDetailModel.setQty(qty); + newWorkOrderCutDetailModel.setCreateDatetime(cutPackage.getCreateDatetime()); + + workOrderCutPackages.add(cutPackage); + newWorkOrderCutFgDataContextList.add(newWorkOrderCutDetailModel); + } + + private BigDecimal[] divideAndRemainder(MesWorkOrderCutDetailModel workOrderCutDetailModel) { + BigDecimal dividend = new BigDecimal(workOrderCutDetailModel.getQty().toString()); + BigDecimal divisor = new BigDecimal(workOrderCutDetailModel.getPackageQty().toString()); + return dividend.divideAndRemainder(divisor); + } + + private String doGenerateSerialNo(StationRequestBean reqBean, StationResultBean resultBean, String ruleCode, MesPart part) { + try { + return syncFuncService.syncSerialNo( + new GenSerialNoModel(ruleCode).prodLocation(reqBean.getWorkCenterCode()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(reqBean.getOrganizeCode()), + reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString(); + } catch (ImppBusiException e) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail()); + } catch (Exception e) { + String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成零件条码%s", part.getPartNo(), ruleCode, fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode())); + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.ERROR.getValue()), webMsg, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, true); + foundExThrowNoShowMsg(); + } + return null; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutProductSnSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutProductSnSaveStepService.java new file mode 100644 index 0000000..d72d6cd --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutProductSnSaveStepService.java @@ -0,0 +1,303 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.*; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; +import cn.estsh.i3plus.mes.pcn.util.StringUtil; +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.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesPart; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesProductionAssembly; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @Description : 保存裁片工单条码工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesWorkOrderCutProductSnSaveStepService") +public class MesWorkOrderCutProductSnSaveStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired + private MesWorkOrderCutRepository workOrderCutRepository; + + @Autowired + private IMesProduceSnExtService produceSnExtService; + + @Autowired + private ISyncFuncService syncFuncService; + + @Autowired + private IFsmRouteDataService fsmRouteDataService; + + @Autowired + private MesProductionAssemblyRepository productionAssemblyRepository; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //获取上下文生产扫/读信息:加工单 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean); + + String cutWorkOrderNo = equipVariableCollectContextList.get(0).getEquipVariableValue(); + + //看是否修改裁片工单状态 + //获取上下文进料零件条码信息集合 + List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + + //获取上下文产成零件条码信息集合 + List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); + + //获取上下文产出零件数据信息集合 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + //获取上下文产品加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + + if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!"); + + // 根据产出零件号分组加工规则 + Map prodRuleContextMapByOutPartNo = prodRuleContextList.stream().collect(Collectors.toMap(MesProdRuleContext::getOutPartNo, Function.identity(), (x, y) -> y)); + + // 获取产成零件信息 + Map partDataContext = productionDispatchContextStepService.getPartDataContext(reqBean); + + //从上下文中取出工位对象 + MesWorkCell workCell = productionProcessContext.getWorkCell(); + + // 无进料条码则生成条码 + if (CollectionUtils.isEmpty(productionPsInContextList)) { + + productionPsOutContextList = new ArrayList<>(); + + //获取生产线的当前班组班次信息 + MesProdShiftContext prodShiftContext = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()); + + if (null == prodShiftContext) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在生产开班记录,请重新开班!"); + + for (MesProductionPartContext mesProductionPartContext : productionPartContextList) { + + MesPart part = partDataContext.get(mesProductionPartContext.getPartNo()); + + MesProdRuleContext mesProdRuleContext = prodRuleContextMapByOutPartNo.get(part.getPartNo()); + + MesProduceSn produceSn = new MesProduceSn(); + ConvertBean.serviceModelInitialize(produceSn, reqBean.getUserInfo()); + produceSn.setOrganizeCode(reqBean.getOrganizeCode()); + produceSn.setProductSn(cutWorkOrderNo); + produceSn.setRouteCode(reqBean.getRouteCode()); + produceSn.setProcessCode(reqBean.getProcessCode()); + produceSn.setCraftCode(productionProcessContext.getCraftCode()); + + produceSn.setCustSn(produceSn.getCustSn()); + produceSn.setSerialNumber(doGenerateSerialNo(reqBean, resultBean, MesPcnExtConstWords.DEFAULT_SERIAL_NUMBER_RULE, part)); + produceSn.setQty(mesProductionPartContext.getQty()); + + produceSn.setWorkOrderNo(mesProductionPartContext.getWorkOrderNo()); + produceSn.setCustCode(mesProductionPartContext.getCustCode()); + produceSn.setCustPartNo(mesProductionPartContext.getCustPartNo()); + + produceSn.setAreaCode(workCell.getAreaCode()); + produceSn.setWorkCenterCode(workCell.getWorkCenterCode()); + produceSn.setWorkCellCode(workCell.getWorkCellCode()); + + produceSn.setPartNo(mesProductionPartContext.getPartNo()); + produceSn.setPartName(mesProductionPartContext.getPartName()); + produceSn.setProcessLabelTemplate(part.getProcessLabelTemplate()); + produceSn.setProdLabelTemplate(part.getProductLabelTemplate()); + produceSn.setCustLabelTemplate(part.getCustLabelTemplate()); + + produceSn.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue()); + produceSn.setSnStatus(workCell.getIsEndWorkCell() != null && workCell.getIsEndWorkCell() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() ? MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() : MesExtEnumUtil.PRODUCE_SN_STATUS.PROCESSING.getValue()); + produceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); + + produceSn.setShiftCode(prodShiftContext.getShiftCode()); + produceSn.setShiftGroup(prodShiftContext.getShiftGroup()); + + produceSn.setPrintCount(MesPcnExtConstWords.ZERO); + produceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); + + if (StringUtils.isEmpty(produceSn.getInWorkCenterTime())) produceSn.setInWorkCenterTime(produceSn.getModifyDatetime()); + produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10)); + + produceSn.setFid(UUID.randomUUID().toString()); + produceSn = produceSnExtService.insert(produceSn); + + MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext().copy(produceSn, mesProdRuleContext.getForeignKey()); + + log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- MesProduceSn:{} --- MesProductionPsOutContext:{}", + reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), + StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(produceSn), JSONObject.toJSONString(productionPsOutContext)); + + productionPsOutContextList.add(productionPsOutContext); + + // 新增装配件加工记录 + //saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext); + + } + + //保存上下文产出条码数据信息集合 + productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList); + + } else { + + if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!"); + + //保存零件条码信息工步 + ((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).executeInState(reqBean); + + for (MesProductionPartContext mesProductionPartContext : productionPartContextList) { + + Map productionPsOutContextMap = productionPsOutContextList.stream().collect(Collectors.toMap(MesProductionPsOutContext::getPartNo, Function.identity(), (x, y) -> y)); + + MesProductionPsOutContext productionPsOutContext = productionPsOutContextMap.get(mesProductionPartContext.getPartNo()); + + if (productionPsOutContext == null) + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("产出零件号[%s]不存在,请重置工序解决!", mesProductionPartContext.getPartNo())); + + //MesProdRuleContext mesProdRuleContext = prodRuleContextMapByOutPartNo.get(mesProductionPartContext.getPartNo()); + + // 新增装配件加工记录 + //saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext); + + } + } + + return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存裁片工单条码成功!"); + + } + + private void insertWorkOrderCutPackage(StationRequestBean reqBean, StationResultBean resultBean) { + + List workOrderCutFgDataContextList = productionDispatchContextStepService.getMesWorkOrderCutFgDataContext(reqBean); + + if (CollectionUtils.isEmpty(workOrderCutFgDataContextList)) + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "缺失裁片工单箱条码配置信息!"); + + for (MesWorkOrderCutDetailModel workOrderCutDetailModel : workOrderCutFgDataContextList) { + + } + + } + + private void saveProductionAssembly(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, + MesCellEquipContext cellEquipContext, MesProdRuleContext mesProdRuleContext, + MesProductionPsOutContext productionPsOutContext) { + + MesProductionAssembly productionAssembly = new MesProductionAssembly(); + + productionAssembly.setAssemblySn(""); + productionAssembly.setDataSource(MesExtEnumUtil.PRODUCTION_ASSEMBLY_DATA_SOURCE.NOSORT.getValue()); + productionAssembly.setIsOrigSn(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + productionAssembly.setIsSkip(CommonEnumUtil.FALSE); + + productionAssembly.setAreaCode(reqBean.getWorkCenterCode()); + productionAssembly.setWorkCenterCode(reqBean.getWorkCenterCode()); + productionAssembly.setWorkCellCode(reqBean.getWorkCellCode()); + productionAssembly.setProcessCode(reqBean.getProcessCode()); + + productionAssembly.setProcessName(productionProcessContext.getProcessName()); + productionAssembly.setCraftCode(productionProcessContext.getCraftCode()); + productionAssembly.setCraftName(productionProcessContext.getCraftName()); + + productionAssembly.setEquipmentCode(cellEquipContext.getEquipmentCode()); + + productionAssembly.setProductionRecordId(mesProdRuleContext.getProductionRecordId()); + productionAssembly.setMouldNo(mesProdRuleContext.getMouldNo()); + + if (null != productionPsOutContext) { + productionAssembly.setPartNo(productionPsOutContext.getPartNo()); + productionAssembly.setPartName(productionPsOutContext.getPartName()); + productionAssembly.setSerialNumber(productionPsOutContext.getSerialNumber()); + productionAssembly.setProductSn(productionPsOutContext.getProductSn()); + productionAssembly.setCustSn(productionPsOutContext.getCustSn()); + } + + MesScanMonitorContext scanMonitorContext = productionProcessContextStepService.dispatchScanMonitorContext(reqBean, true); + if (null != scanMonitorContext) productionAssembly.setMouldRecordId(scanMonitorContext.getMouldRecordId()); + + productionAssembly.setOrganizeCode(reqBean.getOrganizeCode()); + ConvertBean.serviceModelInitialize(productionAssembly, reqBean.getUserInfo()); + + productionAssembly.setFid(UUID.randomUUID().toString()); + + productionAssemblyRepository.insert(productionAssembly); + } + + private void updateWorkOrderCutStatus(StationRequestBean reqBean, String cutWorkOrderNo, Integer status) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(cutWorkOrderNo, MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean); + workOrderCutRepository.updateByProperties(new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.WORK_ORDER_STATUS}, + new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), status}, + packBean); + } + + private String doGenerateSerialNo(StationRequestBean reqBean, StationResultBean resultBean, String ruleCode, MesPart part) { + try { + return syncFuncService.syncSerialNo( + new GenSerialNoModel(ruleCode).prodLocation(reqBean.getWorkCenterCode()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(reqBean.getOrganizeCode()), + reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString(); + } catch (ImppBusiException e) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail()); + } catch (Exception e) { + String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成零件条码%s", part.getPartNo(), ruleCode, fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode())); + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.ERROR.getValue()), webMsg, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, true); + foundExThrowNoShowMsg(); + } + return null; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutSaveStepService.java index 1bf13ca..d446f1a 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutSaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutSaveStepService.java @@ -2,43 +2,23 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; -import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; -import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; -import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; -import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; -import cn.estsh.i3plus.mes.pcn.util.StringUtil; 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.enumutil.MesPcnEnumUtil; -import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.mes.bean.*; -import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StepResult; import cn.estsh.i3plus.pojo.mes.repository.MesProductionAssemblyRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; -import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.util.SpringContextsUtil; -import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.function.Function; -import java.util.stream.Collectors; +import java.util.*; /** * @Description : 保存加工结果工步 * @Author : wangjie @@ -51,207 +31,26 @@ public class MesWorkOrderCutSaveStepService extends BaseStepService { private IMesProductionProcessContextStepService productionProcessContextStepService; @Autowired - private IMesProductionDispatchContextStepService productionDispatchContextStepService; - - @Autowired - private IMesProductionCustomContextStepService productionCustomContextStepService; - - @Autowired - private IMesWorkOrderCutService workOrderCutService; - - @Autowired - private MesWorkOrderCutRepository workOrderCutRepository; - - @Autowired - private IFsmCommonService fsmCommonService; - - @Autowired - private MesFirstMouldNoReadStepService firstMouldNoReadStepService; - - @Autowired - private IMesProduceSnExtService produceSnExtService; - - @Autowired - private ISyncFuncService syncFuncService; - - @Autowired - private IFsmRouteDataService fsmRouteDataService; - - @Autowired private MesProductionAssemblyRepository productionAssemblyRepository; @Override public StepResult execute(StationRequestBean reqBean) { - StationResultBean resultBean = new StationResultBean(); - - //获取上下文信息 - MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); - - //配置错误 抛出异常 - if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); - - //存储生产过程上下文对象 - productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); - - //获取上下文生产扫/读信息:加工单 - List equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean); - - String cutWorkOrderNo = equipVariableCollectContextList.get(0).getEquipVariableValue(); - - //从上下文中取出工位当前要使用的设备 - MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); - - // 看是否修改裁片工单状态 - //获取工位参数 - Map wcpcMap = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean); - - //获取上下文进料零件条码信息集合 - List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); - - //获取上下文产成零件条码信息集合 - List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); - - //获取上下文产出零件数据信息集合 - List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); - - //获取上下文产品加工规则数据信息集合 - List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); - - if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!"); - - // 根据产出零件号分组加工规则 - Map prodRuleContextMapByOutPartNo = prodRuleContextList.stream().collect(Collectors.toMap(MesProdRuleContext::getOutPartNo, Function.identity(), (x, y) -> y)); - - // 获取产成零件信息 - Map partDataContext = productionDispatchContextStepService.getPartDataContext(reqBean); - - // 无进料条码则生成条码 - if (CollectionUtils.isEmpty(productionPsInContextList)) { - - productionPsOutContextList = new ArrayList<>(); - - //获取生产线的当前班组班次信息 - MesProdShiftContext prodShiftContext = productionCustomContextStepService.getMesProdShiftKvBean(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()); - - if (null == prodShiftContext) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在生产开班记录,请重新开班!"); - - //从上下文中取出工位对象 - MesWorkCell workCell = productionProcessContext.getWorkCell(); - - for (MesProductionPartContext mesProductionPartContext : productionPartContextList) { - - MesPart part = partDataContext.get(mesProductionPartContext.getPartNo()); - - MesProdRuleContext mesProdRuleContext = prodRuleContextMapByOutPartNo.get(part.getPartNo()); + //保存裁片工单条码工步 + ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCutProductSnSaveStepService")).executeInState(reqBean); - MesProduceSn produceSn = new MesProduceSn(); - ConvertBean.serviceModelInitialize(produceSn, reqBean.getUserInfo()); - produceSn.setOrganizeCode(reqBean.getOrganizeCode()); - produceSn.setProductSn(cutWorkOrderNo); - //produceSn.set - produceSn.setCustSn(produceSn.getCustSn()); - produceSn.setSerialNumber(doGenerateSerialNo(reqBean, resultBean, MesPcnExtConstWords.DEFAULT_SERIAL_NUMBER_RULE, part)); - produceSn.setQty(mesProductionPartContext.getQty()); - - produceSn.setWorkOrderNo(mesProductionPartContext.getWorkOrderNo()); - produceSn.setCustCode(mesProductionPartContext.getCustCode()); - produceSn.setCustPartNo(mesProductionPartContext.getCustPartNo()); - - produceSn.setAreaCode(workCell.getAreaCode()); - produceSn.setWorkCenterCode(workCell.getWorkCenterCode()); - produceSn.setWorkCellCode(workCell.getWorkCellCode()); - - produceSn.setPartNo(mesProductionPartContext.getPartNo()); - produceSn.setPartName(mesProductionPartContext.getPartName()); - produceSn.setProcessLabelTemplate(part.getProcessLabelTemplate()); - produceSn.setProdLabelTemplate(part.getProductLabelTemplate()); - produceSn.setCustLabelTemplate(part.getCustLabelTemplate()); - - produceSn.setSnType(MesExtEnumUtil.PRODUCE_SN_TYPE.STANDARD.getValue()); - produceSn.setSnStatus(MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue()); - produceSn.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); - - produceSn.setShiftCode(prodShiftContext.getShiftCode()); - produceSn.setShiftGroup(prodShiftContext.getShiftGroup()); - - produceSn.setPrintCount(MesPcnExtConstWords.ZERO); - produceSn.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); - - if (StringUtils.isEmpty(produceSn.getInWorkCenterTime())) produceSn.setInWorkCenterTime(produceSn.getModifyDatetime()); - produceSn.setLotNo(produceSn.getModifyDatetime().substring(0, 10)); - - produceSn.setFid(UUID.randomUUID().toString()); - produceSn = produceSnExtService.insert(produceSn); - - MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext().copy(produceSn, mesProdRuleContext.getForeignKey()); - - log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- MesProduceSn:{} --- MesProductionPsOutContext:{}", - reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), - StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(produceSn), JSONObject.toJSONString(productionPsOutContext)); - - productionPsOutContextList.add(productionPsOutContext); - - saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext); - - } - - //保存上下文产出条码数据信息集合 - productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList); - - } else { - - if (CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在加工规则信息,请重置工序解决!"); - - //保存零件条码信息工步 - ((IStepService) SpringContextsUtil.getBean("mesProductSnSaveStepService")).executeInState(reqBean); - for (MesProductionPartContext mesProductionPartContext : productionPartContextList) { - - Map productionPsOutContextMap = productionPsOutContextList.stream().collect(Collectors.toMap(MesProductionPsOutContext::getPartNo, Function.identity(), (x, y) -> y)); - - MesPart part = partDataContext.get(mesProductionPartContext.getPartNo()); - - if (part == null) - stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("产出零件号[%s]不存在,请重置工序解决!", part.getPartNo())); - - MesProductionPsOutContext productionPsOutContext = productionPsOutContextMap.get(part.getPartNo()); - - if (productionPsOutContext == null) - stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("产出零件号[%s]不存在,请重置工序解决!", part.getPartNo())); - - MesProdRuleContext mesProdRuleContext = prodRuleContextMapByOutPartNo.get(part.getPartNo()); - - saveProductionAssembly(reqBean, productionProcessContext, cellEquipContext, mesProdRuleContext, productionPsOutContext); - } - - } + //生成裁片工单包装条码工步 + ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCutPackageSnSaveStepService")).executeInState(reqBean); //生成加工记录工步 ((IStepService) SpringContextsUtil.getBean("mesProductionRecordGenerateStepService")).executeInState(reqBean); - // 是否修改工单状态为完成 - String cutOrderOrderIsComplete = wcpcMap.containsKey(MesPcnExtConstWords.CUT_ORDER_ORDER_IS_COMPLETE) ? wcpcMap.get(MesPcnExtConstWords.CUT_ORDER_ORDER_IS_COMPLETE) : null; - - if (!StringUtils.isEmpty(cutOrderOrderIsComplete)) { - - updateWorkOrderCutStatus(reqBean, cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.COMPLETE.getValue()); - - } else { - - updateWorkOrderCutStatus(reqBean, cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue()); - - } - - //保存装配记录工步 - //((IStepService) SpringContextsUtil.getBean("mesAssemblySaveStepService")).executeInState(reqBean); - - //保存工单信息工步 - ((IStepService) SpringContextsUtil.getBean("mesWorkOrderSaveStepService")).executeInState(reqBean); + //修改裁片工单、工单信息工步 + ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCutWorkOrderSaveStepService")).executeInState(reqBean); return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存加工结果成功!"); } - private void saveProductionAssembly(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, MesProdRuleContext mesProdRuleContext, MesProductionPsOutContext productionPsOutContext) { @@ -296,28 +95,4 @@ public class MesWorkOrderCutSaveStepService extends BaseStepService { productionAssemblyRepository.insert(productionAssembly); } - private void updateWorkOrderCutStatus(StationRequestBean reqBean, String cutWorkOrderNo, Integer status) { - DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); - DdlPreparedPack.getStringEqualPack(cutWorkOrderNo, MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean); - workOrderCutRepository.updateByProperties(new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.WORK_ORDER_STATUS}, - new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), status}, - packBean); - } - - private String doGenerateSerialNo(StationRequestBean reqBean, StationResultBean resultBean, String ruleCode, MesPart part) { - try { - return syncFuncService.syncSerialNo( - new GenSerialNoModel(ruleCode).prodLocation(reqBean.getWorkCenterCode()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(reqBean.getOrganizeCode()), - reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString(); - } catch (ImppBusiException e) { - stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail()); - } catch (Exception e) { - String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成零件条码%s", part.getPartNo(), ruleCode, fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode())); - this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.ERROR.getValue()), webMsg, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); - this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, true); - foundExThrowNoShowMsg(); - } - return null; - } - } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutWorkOrderSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutWorkOrderSaveStepService.java new file mode 100644 index 0000000..dc4d3da --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCutWorkOrderSaveStepService.java @@ -0,0 +1,133 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.*; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.MathOperation; +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.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderCutRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * @Description : 保存加工结果工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesWorkOrderCutWorkOrderSaveStepService") +public class MesWorkOrderCutWorkOrderSaveStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private MesWorkOrderCutRepository workOrderCutRepository; + + @Autowired + private ISyncFuncService syncFuncService; + + @Autowired + private IFsmRouteDataService fsmRouteDataService; + + @Autowired + private IMesWorkOrderExtService workOrderExtService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //获取上下文生产扫/读信息:加工单 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean); + + String cutWorkOrderNo = equipVariableCollectContextList.get(0).getEquipVariableValue(); + + //获取上下文产出零件数据信息集合 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + //从上下文中取出工位对象 + MesWorkCell workCell = productionProcessContext.getWorkCell(); + + // 为最后一个工位则将工单更新为完成 并 新增裁片工单包装条码 + if (workCell.getIsEndWorkCell() != null && workCell.getIsEndWorkCell() == CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) { + + updateWorkOrderCutStatus(reqBean, cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.COMPLETE.getValue()); + + for (MesProductionPartContext mesProductionPartContext : productionPartContextList) { + MesWorkOrder workOrder = workOrderExtService.getWorkOrder(reqBean.getOrganizeCode(), mesProductionPartContext.getWorkOrderNo()); + workOrder.setCompleteQty(MathOperation.add(workOrder.getCompleteQty(), mesProductionPartContext.getQty())); + if (MathOperation.compareTo(workOrder.getCompleteQty(), workOrder.getQty()) >= 0 && workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()) != 0) + workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.COMPLETE.getValue()); + else + workOrder.setWorkOrderStatus(MesExtEnumUtil.ORDER_STATUS.PROCESS.getValue()); + ConvertBean.serviceModelUpdate(workOrder, reqBean.getUserInfo()); + workOrder.setModifyDatetime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")).format(new Date())); + workOrderExtService.update(workOrder); + } + + } else { + + updateWorkOrderCutStatus(reqBean, cutWorkOrderNo, MesExtEnumUtil.CUT_ORDER_STATUS.PROCESS.getValue()); + + } + + return stepSuccessCompleteAndSendMsgReturn(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), "保存裁片工单成功!"); + + } + + private void updateWorkOrderCutStatus(StationRequestBean reqBean, String cutWorkOrderNo, Integer status) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(cutWorkOrderNo, MesPcnExtConstWords.CUT_WORK_ORDER_NO, packBean); + workOrderCutRepository.updateByProperties(new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.WORK_ORDER_STATUS}, + new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), status}, + packBean); + } + + private String doGenerateSerialNo(StationRequestBean reqBean, StationResultBean resultBean, String ruleCode, MesPart part) { + try { + return syncFuncService.syncSerialNo( + new GenSerialNoModel(ruleCode).prodLocation(reqBean.getWorkCenterCode()).partNo(part.getPartNo()).putDataMap(MesPart.class.getSimpleName(), part).organizeCode(reqBean.getOrganizeCode()), + reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString(); + } catch (ImppBusiException e) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail()); + } catch (Exception e) { + String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成零件条码%s", part.getPartNo(), ruleCode, fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode())); + this.sendMessage(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.ERROR.getValue()), webMsg, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, true); + foundExThrowNoShowMsg(); + } + return null; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java index d69ae9c..610f933 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java @@ -111,8 +111,13 @@ public class MesProductionCustomContextStepService extends BaseStepService imple //获取生产线的当前班组班次信息 @Override - public MesProdShiftContext getMesProdShiftKvBean(String orgainzeCode, String workCenterCode) { - List stationKvBeans = getProdShiftDataContext(orgainzeCode, workCenterCode); + public MesProdShiftContext getMesProdShiftKvBean(String organizeCode, String workCenterCode) { + + log.info("获取生产线的当前班组班次信息 --- getMesProdShiftKvBean --- start"); + + List stationKvBeans = getProdShiftDataContext(organizeCode, workCenterCode); + + log.info("获取生产线的当前班组班次信息 --- getMesProdShiftKvBean --- end"); MesProdShiftContext mesProdShiftContext = new MesProdShiftContext(); if (CollectionUtils.isEmpty(stationKvBeans)) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java index 1ac25e4..c5c1723 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java @@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.context; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; @@ -425,6 +426,23 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp } @Override + public List getMesWorkOrderCutFgDataContext(StationRequestBean reqBean) { + String mesWorkOrderCutFgDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.WORK_ORDER_CUT_FG_DATA_CONTEXT); + return !StringUtils.isEmpty(mesWorkOrderCutFgDataJson) ? JSONObject.parseArray(mesWorkOrderCutFgDataJson, MesWorkOrderCutDetailModel.class) : null; + } + + @Override + public Boolean dispatchMesWorkOrderCutFgDataContext(StationRequestBean reqBean, List workOrderCutDetailModelList) { + if (CollectionUtils.isEmpty(workOrderCutDetailModelList)) return false; + return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.WORK_ORDER_CUT_FG_DATA_CONTEXT, JSONObject.toJSONString(workOrderCutDetailModelList)); + } + + @Override + public void removeMesWorkOrderCutFgDataContext(StationRequestBean reqBean) { + removeFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.WORK_ORDER_CUT_FG_DATA_CONTEXT); + } + + @Override public Boolean dispatchOverEndlessLoopReadTimes(StationRequestBean reqBean, String maxTimes) { String item = new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES).add(reqBean.getCurFsmState().getNextStatus()).toString(); String endlessLoopReadTimes = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), item); diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPartContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPartContext.java index b2ebed9..36294d9 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPartContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPartContext.java @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.pojo.context; import cn.estsh.i3plus.pojo.mes.bean.MesPart; +import io.swagger.annotations.ApiParam; import lombok.Data; import org.springframework.beans.BeanUtils; @@ -14,6 +15,26 @@ public class MesPartContext extends MesPart implements Serializable { private static final long serialVersionUID = -1221271846639577097L; + @ApiParam("客户物料号") + private String custPartNo; + + @ApiParam("打印份数") + private Integer copies = 1; + + @ApiParam("包装条码规则") + private String packageSnRule; + + @ApiParam("标签模板") + private String labelTemplate; + + @ApiParam("产成数量") + private Double qty; + + @ApiParam("标包数量") + private Double packageQty; + + @ApiParam("打印机") + private String printer; public MesPartContext(MesPart part) { BeanUtils.copyProperties(part, this); diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesProduceSnPrintModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesProduceSnPrintModel.java index 187601e..7cff2d5 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesProduceSnPrintModel.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesProduceSnPrintModel.java @@ -9,6 +9,7 @@ import lombok.Data; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * @Description : 条码补打Model @@ -69,6 +70,12 @@ public class MesProduceSnPrintModel { private List mesPrintedSnLogList = new ArrayList<>(); + @ApiParam(name = "源数据 使用功能:1-裁片") + private Object sourceData; + + @ApiParam(name = "打印参数值 使用功能:1-裁片") + List> printParamValueList = new ArrayList<>(); + public Double getQty() { return qty == null || qty <= 0d ? 1d : qty; } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesWorkOrderCutDetailModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesWorkOrderCutDetailModel.java index a746109..987a48d 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesWorkOrderCutDetailModel.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/MesWorkOrderCutDetailModel.java @@ -33,6 +33,26 @@ public class MesWorkOrderCutDetailModel { @ApiParam("标包数量") private Double packageQty; - @ApiParam("包装条码规则") - private String packageSnRule; + // 包装条码打印所需属性 START + + @ApiParam("客户代码") + private String custCode; + + @ApiParam("客户零件号") + private String custPartNo; + + @ApiParam("生产日期") + private String lotNo; + + @ApiParam("创建时间") + private String createDatetime; + + @ApiParam("箱号") + private String packageNo; + + @ApiParam("打印份数") + private Integer copies; + + // 包装条码打印所需属性 END + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java index 4ef684c..318ceee 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/util/MesPcnExtConstWords.java @@ -410,6 +410,8 @@ public class MesPcnExtConstWords { public static final String PRODUCTION_PS_OUT_CONTEXT = "PRODUCTION_PS_OUT_CONTEXT"; // 上下文: 料桶原材料数据 public static final String RAW_PART_CHARGING_DATA_CONTEXT = "RAW_PART_CHARGING_DATA_CONTEXT"; + // 上下文: 裁片工单成品数据 + public static final String WORK_ORDER_CUT_FG_DATA_CONTEXT = "WORK_ORDER_CUT_FG_DATA_CONTEXT"; //OPC_API_PARAM @@ -442,12 +444,19 @@ public class MesPcnExtConstWords { public static final String SN = "sn"; //工单状态 public static final String WORK_ORDER_STATUS = "workOrderStatus"; - // 工位是否修改裁片工单状态为完成状态参数[工位参数] - public static final String CUT_ORDER_ORDER_IS_COMPLETE = "CUT_ORDER_ORDER_IS_COMPLETE"; // 裁片方案代码 public static final String CUT_CODE = "cutCode"; // 裁片成品列表弹框打印 - public static final String FUNCITON_CUT_ORDER_DIALOG_PRINT = "FUNCTION_CUT_ORDER_DIALOG_PRINT"; + public static final String FUNCTION_CUT_ORDER_DIALOG_PRINT = "FUNCTION_CUT_ORDER_DIALOG_PRINT"; + + // 箱类别代号 + public static final String PACK_CODE = "packCode"; + + // 客户代码 + public static final String CUST_CODE = "custCode"; + + // 模板代码 + public static final String TEMPLATE_CODE = "templateCode"; }