From 47e87b8fe1fb3dca51b662092e1bed8ff6be0be3 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Mon, 13 Jan 2025 09:59:04 +0800 Subject: [PATCH] =?UTF-8?q?=2044517=20=E8=A3=85=E7=AE=B1=E9=98=B2=E9=94=99?= =?UTF-8?q?=E5=90=8E=E5=90=90=E6=9D=A1=E7=A0=81=E9=9C=80=E6=B1=82=EF=BC=88?= =?UTF-8?q?=E8=8A=9C=E6=B9=96=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mes/pcn/api/base/IMesPackingRuleService.java | 26 ++ .../mes/pcn/api/busi/IMesPackageExtService.java | 18 + .../IMesProductionCustomContextStepService.java | 10 + .../IMesProductionProcessContextStepService.java | 9 + .../serviceimpl/base/MesPackingRuleService.java | 59 +++ .../serviceimpl/busi/MesPackageExtService.java | 30 ++ .../WuhuPackageNumberRuleStrategyService.java | 61 +++ .../print/strategy/WuhuPackageNoPrintStrategy.java | 101 +++++ .../step/MesPackageNoGenerateStepService.java | 485 +++++++++++++++++++++ .../MesProductionCustomContextStepService.java | 26 ++ .../MesProductionProcessContextStepService.java | 20 + .../pcn/pojo/context/MesPackageDataContext.java | 37 ++ .../pcn/pojo/context/MesPackageRuleContext.java | 61 +++ .../mes/pcn/pojo/model/MesProduceSnPrintModel.java | 19 +- .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 28 +- 15 files changed, 976 insertions(+), 14 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPackingRuleService.java create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPackageExtService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackingRuleService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPackageExtService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/WuhuPackageNumberRuleStrategyService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/WuhuPackageNoPrintStrategy.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesPackageNoGenerateStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPackageDataContext.java create mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPackageRuleContext.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPackingRuleService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPackingRuleService.java new file mode 100644 index 0000000..5cb6d17 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesPackingRuleService.java @@ -0,0 +1,26 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.base; + +import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine; +import cn.estsh.i3plus.pojo.mes.bean.MesPackingRule; +import cn.estsh.i3plus.pojo.mes.bean.MesPackingRuleDetail; +import io.swagger.annotations.ApiOperation; + +/** + * @Description : 成品包装规则 + * @Reference : + * @Author : wangjie + * @CreateDate 2024/6/13 15:18 + * @Modify: + **/ +public interface IMesPackingRuleService { + + @ApiOperation(value = "根据物料代码,零件类型查询成品包装明细规则") + MesPackingRuleDetail getPackingRuleDetail(String organizeCode, String partNo, String partType); + + @ApiOperation(value = "根据包装代码查询成品包装规则") + MesPackingRule getPackingRule(String organizeCode, String packageCode); + + @ApiOperation(value = "根据箱类别代号查询包装定义") + MesPackingDefine getPackingDefine(String organizeCode, String packCode); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPackageExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPackageExtService.java new file mode 100644 index 0000000..eeeca27 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesPackageExtService.java @@ -0,0 +1,18 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +import cn.estsh.i3plus.pojo.mes.bean.MesPackage; +import io.swagger.annotations.ApiOperation; + +/** + * @Description : 包装信息 + * @Reference : + * @Author : wangjie + * @CreateDate 2024/6/13 15:18 + * @Modify: + **/ +public interface IMesPackageExtService { + + @ApiOperation(value = "根据ID查询包装信息") + MesPackage getMesPackage(String organizeCode, Long id); + +} 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 1bb121b..220d388 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 @@ -9,6 +9,7 @@ import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import io.swagger.annotations.ApiOperation; import java.util.List; +import java.util.Map; /** * 获取生产过程上下文对象接口【BUSI】 @@ -93,4 +94,13 @@ public interface IMesProductionCustomContextStepService { @ApiOperation(value = "保存设备计数") void dispatchShortCounter(StationRequestBean reqBean, Integer shortCounter); + @ApiOperation(value = "保存打包数据") + Boolean dispatchPackageDataContext(StationRequestBean reqBean, Map packageDataContextMap); + + @ApiOperation(value = "获取打包数据") + Map getPackageDataContext(StationRequestBean reqBean); + + @ApiOperation(value = "删除打包数据") + void removePackageDataContext(StationRequestBean reqBean); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java index 51ca58e..5440ff1 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java @@ -155,4 +155,13 @@ public interface IMesProductionProcessContextStepService { @ApiOperation(value = "获取生产线下的工位集合") Map dispatchWorkCellMap(StationRequestBean reqBean); + @ApiOperation(value = "获取包装规则信息") + Map getPackageRuleContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存包装规则信息") + Boolean dispatchPackageRuleContext(StationRequestBean reqBean, Map packageRuleContextMap); + + @ApiOperation(value = "删除包装规则信息") + void removePackageRuleContext(StationRequestBean reqBean); + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackingRuleService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackingRuleService.java new file mode 100644 index 0000000..81ec448 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackingRuleService.java @@ -0,0 +1,59 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPackingRuleService; +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.bean.MesPackingRule; +import cn.estsh.i3plus.pojo.mes.bean.MesPackingRuleDetail; +import cn.estsh.i3plus.pojo.mes.repository.MesPackingDefineRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesPackingRuleDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesPackingRuleRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; + +/** + * @Description : 成品包装规则 + * @Reference : + * @Author : wangjie + * @CreateDate 2024/6/13 15:18 + * @Modify: + **/ +@Service +public class MesPackingRuleService implements IMesPackingRuleService { + + @Autowired + private MesPackingRuleDetailRepository packingRuleDetailRepository; + + @Autowired + private MesPackingRuleRepository packingRuleRepository; + + @Autowired + private MesPackingDefineRepository packingDefineRepository; + + @Override + public MesPackingRuleDetail getPackingRuleDetail(String organizeCode, String partNo, String partType) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(partNo) || StringUtils.isEmpty(partType)) return null; + return packingRuleDetailRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PART_NO, MesPcnExtConstWords.PART_TYPE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), partNo, partType}); + } + + @Override + public MesPackingRule getPackingRule(String organizeCode, String packageCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(packageCode)) return null; + return packingRuleRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PACKAGE_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), packageCode}); + } + + @Override + public MesPackingDefine getPackingDefine(String organizeCode, String packCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(packCode)) return null; + 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/MesPackageExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPackageExtService.java new file mode 100644 index 0000000..fc24bf7 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesPackageExtService.java @@ -0,0 +1,30 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPackageExtService; +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.MesPackage; +import cn.estsh.i3plus.pojo.mes.repository.MesPackageRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Description : 包装信息 + * @Reference : + * @Author : wangjie + * @CreateDate 2024/6/13 15:18 + * @Modify: + **/ +@Service +public class MesPackageExtService implements IMesPackageExtService { + + @Autowired + private MesPackageRepository packageRepository; + + @Override + public MesPackage getMesPackage(String organizeCode, Long id) { + return packageRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.ID}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), id}); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/WuhuPackageNumberRuleStrategyService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/WuhuPackageNumberRuleStrategyService.java new file mode 100644 index 0000000..5d6e53a --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/WuhuPackageNumberRuleStrategyService.java @@ -0,0 +1,61 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.numberrule; + +import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageRuleContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.INumberRulePackAttributeStrategyService; +import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.StringJoiner; + +/** + * @Description : MES-包装条码(芜湖打包) + * @Reference : + * @Author : junsheng.li + * @CreateDate 2024/10/28 16:47 + * @Modify: + **/ +@Component +public class WuhuPackageNumberRuleStrategyService implements INumberRulePackAttributeStrategyService { + + @Override + public GenSerialNoModel execute(GenSerialNoModel genSerialNoModel) { + Map dataMap = genSerialNoModel.getDataMap(); + MesPackageRuleContext packageRuleContext = !CollectionUtils.isEmpty(dataMap) ? (MesPackageRuleContext) dataMap.get(MesPackageRuleContext.class.getSimpleName()) : null; + if (null == packageRuleContext) MesPcnException.throwBusiException("生成包装条码缺少必要参数[规则对象]"); + genSerialNoModel.setDynamicRule( + new StringJoiner(MesPcnExtConstWords.COMMA) + .add(((new SimpleDateFormat(MesPcnExtConstWords.DATE_FORMAT_SHORT)).format(new Date()))) + .add(String.format("%.1f", packageRuleContext.getPackSpecQty())) + .add(packageRuleContext.getUnit()) + .toString() + ); + return genSerialNoModel; + } + +} + +// YFWHU|YFNSC901C241223042722|C901|401007574AAABN|9.0|EA|C901|20241223| +//YFWHU|YFNS {Prefix} +//C901 {ORG} +//C {SPILTRULE} +//241223 {DYNAMICRULE} 2位年月日 +//042722 {SERIALNO} 6位 +//| {SPILTRULE} +//C901 {ORG} +//| {SPILTRULE} +//401007574AAABN {PARTNO} +//| {SPILTRULE} +//9.0 {DYNAMICRULE} 标包 一位小数 +//| {SPILTRULE} +//EA {DYNAMICRULE} 单位 +//| {SPILTRULE} +//C901 {ORG} +//| {SPILTRULE} +//20241223 {YEAR}{MONTH}{DAY} +//| {SPILTRULE} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/WuhuPackageNoPrintStrategy.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/WuhuPackageNoPrintStrategy.java new file mode 100644 index 0000000..4818c7e --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/WuhuPackageNoPrintStrategy.java @@ -0,0 +1,101 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.strategy; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesCustomerPartService; +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.MesProduceSnPrintModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.mes.bean.MesCustomerPart; +import cn.estsh.i3plus.pojo.mes.bean.MesNumberRule; +import cn.estsh.i3plus.pojo.mes.bean.MesPackage; +import cn.estsh.i3plus.pojo.mes.bean.MesPrintedSnLog; +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 com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +/** + * @Description : 芜湖包装条码打印 + * @Reference : + * @Author : wangjie + * @CreateDate : 2024/9/29 16:43 + * @Modify: + **/ +@Component +@Slf4j +public class WuhuPackageNoPrintStrategy implements IPrintTemplateStrategyService { + + @Autowired + private IMesCustomerPartService mesCustomerPartService; + + @Override + public MesProduceSnPrintModel execute(GenSerialNoModel genSerialNoModel, MesProduceSnPrintModel model, + MesNumberRule numberRule, StepResult stepResult, StationRequestBean reqBean, + Boolean isStep) { + + MesCustomerPart customerPart = (!Objects.isNull(genSerialNoModel) && + !CollectionUtils.isEmpty(genSerialNoModel.getDataMap()) && genSerialNoModel.getDataMap().containsKey(MesCustomerPart.class.getSimpleName())) + ? (MesCustomerPart) genSerialNoModel.getDataMap().get(MesCustomerPart.class.getSimpleName()) + : mesCustomerPartService.getMesCustomerPart(model.getOrganizeCode(), model.getPartNo()); + if (null == customerPart) MesPcnException.throwBusiException("零件号[%s]未维护客户物料信息", model.getPartNo()); + + // 返回的结果集合 + List> printDataMapList = new ArrayList<>(); + if (!isStep) { + //TODO 包装条码补打 + } else { + model.getPackageList().forEach(o -> printDataMapList.add(getPrintMap(model, o, customerPart))); + List> resultMapList = new ArrayList<>(); + resultMapList.add(packResultMap(model, printDataMapList)); + model.setPrintContextList(resultMapList); + } + + return model; + } + + private Map packResultMap(MesProduceSnPrintModel printModel, List> printTemplateDateList) { + Map resultMap = new HashMap<>(); + resultMap.put(MesPcnExtConstWords.LABEL_TEMPLATE, printModel.getMesLabelTemplate()); + resultMap.put(MesPcnExtConstWords.TEMPLATE_DATA, printTemplateDateList); + resultMap.put(MesPcnExtConstWords.TEMPLATE_CODE, printModel.getMesLabelTemplate().getTemplateCode()); + resultMap.put(MesPcnExtConstWords.PRINTER, printModel.getPrinter()); + return resultMap; + } + + private MesPrintedSnLog getMesPrintedSnLog(MesPackage packageDb, String userName, String printData) { + MesPrintedSnLog snLog = new MesPrintedSnLog(); + snLog.setBarcode(packageDb.getPackageNo()); + snLog.setPartNo(packageDb.getPartNo()); + snLog.setPartName(packageDb.getPartName()); + snLog.setPrintData(printData); + snLog.setOrganizeCode(packageDb.getOrganizeCode()); + ConvertBean.serviceModelInitialize(snLog, userName); + return snLog; + } + + private Map getPrintMap(MesProduceSnPrintModel model, MesPackage packageDb, MesCustomerPart customerPart) { + Map resultMap = new HashMap<>(); + resultMap.put(MesPcnExtConstWords.PART_NO, packageDb.getPartNo()); + resultMap.put(MesPcnExtConstWords.PART_NAME, packageDb.getPartNo()); + resultMap.put(MesPcnExtConstWords.CUST_PART_NO, customerPart.getCustPartNo()); + resultMap.put(MesPcnExtConstWords.QR_CODE, packageDb.getPackageNo()); + resultMap.put(MesPcnExtConstWords.QTY, packageDb.getQty().intValue()); + resultMap.put(MesPcnExtConstWords.UNIT, packageDb.getUnit()); + resultMap.put(MesPcnExtConstWords.PACK_SPEC_QTY, packageDb.getPackSpecQty().intValue()); + resultMap.put(MesPcnExtConstWords.LOT_NO, packageDb.getLotNo().replaceAll(MesPcnExtConstWords.SEPARATOR, MesPcnExtConstWords.SLANT_R)); + // YFWHU|YFNSC901C241223042722|C901|401007574AAABN|9.0|EA|C901|20241223| + // YFNSC901C241223042722 截取原始条码的 第7位到27位 + resultMap.put(MesPcnExtConstWords.BAR_CODE, packageDb.getPackageNo().length() >= 27 ? packageDb.getPackageNo().substring(6, 27) : packageDb.getPackageNo()); + resultMap.put(MesPcnExtConstWords.MODIFY_DATE_TIME, packageDb.getModifyDatetime().replaceAll(MesPcnExtConstWords.SEPARATOR, MesPcnExtConstWords.SLANT_R)); + model.getMesPrintedSnLogList().add(getMesPrintedSnLog(packageDb, model.getUserName(), JSONObject.toJSONString(resultMap))); + return resultMap; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesPackageNoGenerateStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesPackageNoGenerateStepService.java new file mode 100644 index 0000000..daf3eb2 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesPackageNoGenerateStepService.java @@ -0,0 +1,485 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPackingRuleService; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPackageExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; +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.apiservice.serviceimpl.print.IPrintTemplateStrategyService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageDataContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageRuleContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; +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.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.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.i3plus.pojo.mes.repository.IMesPrintedSnLogRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesPackageDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesPackageRepository; +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.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.persistence.EntityManager; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description : 打包工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesPackageNoGenerateStepService") +public class MesPackageNoGenerateStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired + private IMesPackingRuleService packingRuleService; + + @Autowired + private IMesPackageExtService packageExtService; + + @Autowired + private IMesTemplateService templateService; + + @Autowired + private ISyncFuncService syncFuncService; + + @Autowired + private IFsmRouteDataService fsmRouteDataService; + + @Autowired + private MesPackageRepository packageRepository; + + @Autowired + private IMesPrintedSnLogRepository printedSnLogRepository; + + @Autowired + private MesPackageDetailRepository packageDetailRepository; + + @Autowired + private EntityManager entityManager; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //从上下文中取出生产线对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + + //排序线 直接跳过 + if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return stepResult; + + //获取上下文产出条码数据信息集合 + List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); + + if (CollectionUtils.isEmpty(productionPsOutContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!"); + + //产出条码根据零件号分组 + Map> productSnMap2Part = productionPsOutContextList.stream().filter(o -> null != o) + .collect(Collectors.groupingBy(MesProductionPsOutContext::getPartNo, Collectors.mapping(MesProductionPsOutContext::getProductSn, Collectors.toList()))); + + //获取包装规则信息 + Map packageRuleContextMap = productionProcessContextStepService.getPackageRuleContext(reqBean); + Integer initQty = CollectionUtils.isEmpty(packageRuleContextMap) ? MesPcnExtConstWords.ZERO : packageRuleContextMap.size(); + + //获取打包数据 + Map packageDataContextMap = productionCustomContextStepService.getPackageDataContext(reqBean); + + //不同的零件号分别打包处理 + for (Map.Entry> entry : productSnMap2Part.entrySet()) { + + if (null == entry) continue; + + //解析当前零件已经存在的包装明细 + List packageDataContextList = (CollectionUtils.isEmpty(packageDataContextMap) || + !packageDataContextMap.containsKey(entry.getKey())) ? null : JSONObject.parseArray(packageDataContextMap.get(entry.getKey()), MesPackageDataContext.class); + + //获取生产过程打包规则 + MesPackageRuleContext packageRuleContext; + if (!CollectionUtils.isEmpty(packageDataContextList) || (!CollectionUtils.isEmpty(packageRuleContextMap) && packageRuleContextMap.containsKey(entry.getKey()))) { + //从缓存中获取, 如果存在包装信息, 则使用上次获取的包装信息 + packageRuleContext = !CollectionUtils.isEmpty(packageDataContextList) ? packageDataContextList.get(0) : packageRuleContextMap.get(entry.getKey()); + } else { + //获取包装规则信息 + packageRuleContext = getPackageRuleContext(reqBean, entry.getKey()); + } + + //无生产过程打包规则时, 忽略当前零件 + if (null == packageRuleContext) continue; + + //更新包装规则信息 + if (null == packageRuleContextMap) packageRuleContextMap = new HashMap<>(); + if (!packageRuleContextMap.containsKey(entry.getKey())) packageRuleContextMap.put(entry.getKey(), packageRuleContext); + + MesLabelTemplate labelTemplate = null; + IPrintTemplateStrategyService strategyService = null; + + if (CollectionUtils.isEmpty(packageDataContextList)) { + //查询模版信息 + labelTemplate = templateService.getLabelTemplate(packageRuleContext.getPackageTemplate(), reqBean.getOrganizeCode()); + strategyService = (null != labelTemplate && !StringUtils.isEmpty(labelTemplate.getMethodCode())) ? (IPrintTemplateStrategyService) SpringContextsUtil.getBean(labelTemplate.getMethodCode()) : null; + if (null == strategyService) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]未配置有效的包装条码模版[%s]信息!", + packageRuleContext.getPartNo(), packageRuleContext.getPackageTemplate()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + continue; + } + } + + //生成包装及明细, 根据标包数量判断是否执行打印 [递归] + stepResult.setDataCollection(new ArrayList()); + packageDataContextList = doHandlePackagePrint(reqBean, stepResult, packageRuleContext, packageDataContextList, entry.getValue()); + + //更新实时的打包数据 + if (CollectionUtils.isEmpty(packageDataContextList)) packageDataContextMap.remove(entry.getKey()); + else packageDataContextMap.put(entry.getKey(), JSONObject.toJSONString(packageDataContextList)); + + //判断存在包装信息则进行打印 + if (!CollectionUtils.isEmpty(stepResult.getDataCollection())) { + execPrint(reqBean, resultBean, stepResult, packageRuleContext, labelTemplate, strategyService, (List) stepResult.getDataCollection()); + } + + } + + //保存包装规则信息 + if (initQty != packageRuleContextMap.size()) productionProcessContextStepService.dispatchPackageRuleContext(reqBean, packageRuleContextMap); + // 保存打包数据 + productionCustomContextStepService.dispatchPackageDataContext(reqBean, packageDataContextMap); + + return stepResult; + + } + + //获取包装规则信息 + private MesPackageRuleContext getPackageRuleContext(StationRequestBean reqBean, String partNo) { + + //根据 物料代码,零件类型=包装物 查询成品包装明细规则 + MesPackingRuleDetail packingRuleDetail = packingRuleService.getPackingRuleDetail(reqBean.getOrganizeCode(), partNo, MesExtEnumUtil.PACKING_RULE_DETAIL_PART_TYPE.P.getValue()); + if (null == packingRuleDetail) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]未配置包装物类型的成品包装明细规则信息!", + partNo), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return null; + } + + if (StringUtils.isEmpty(packingRuleDetail.getPackageCode()) || + StringUtils.isEmpty(packingRuleDetail.getPackSpecQty()) || MathOperation.compareTo(packingRuleDetail.getPackSpecQty(), new Double(0)) == 0) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]配置包装物类型的成品包装明细规则信息中必要信息无效:包装代码[%s]包装规格数量[%s]!", + partNo, packingRuleDetail.getPackageCode(), packingRuleDetail.getPackSpecQty()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return null; + } + + //根据包装代码查询成品包装规则 + MesPackingRule packingRule = packingRuleService.getPackingRule(reqBean.getOrganizeCode(), packingRuleDetail.getPackageCode()); + if (null == packingRule) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]未配置成品包装规则信息!", + partNo, packingRuleDetail.getPackageCode()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return null; + } + + String generateTypeName = MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.valueOfDescription(packingRule.getGenerateType()); + String packageBarcodeRule = packingRule.getPackageBarcodeRule(); + String packageTemplate = packingRule.getPackageTemplate(); + String printer = packingRule.getPrinter(); + + //如果 packageBarcodeRule || packageTemplate || printer 有一个为空, 则需要根据 箱类别代号查询包装定义 + if (StringUtils.isEmpty(generateTypeName) || (StringUtils.isEmpty(packingRule.getPackCode()) && + (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate) || StringUtils.isEmpty(printer)))) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置的成品包装规则信息中必要信息无效:统计方式[%s]箱类别代号[%s]!", + partNo, packingRuleDetail.getPackageCode(), StringUtils.isEmpty(generateTypeName) ? MesPcnExtConstWords.EMPTY : generateTypeName, packingRule.getPackCode()), + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return null; + } + + //判断是否需要查询包装定义 + if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate) || StringUtils.isEmpty(printer)) { + //根据箱类别代号查询包装定义 + MesPackingDefine packingDefine = packingRuleService.getPackingDefine(reqBean.getOrganizeCode(), packingRule.getPackCode()); + if (null == packingDefine) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置成品包装规则信息中的箱类别代号[%s]未维护包装定义信息!", + partNo, packingRuleDetail.getPackageCode(), packingRule.getPackCode()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return null; + } + + //如果为空, 则取包装定义中维护的信息 + if (StringUtils.isEmpty(packageBarcodeRule)) packageBarcodeRule = packingDefine.getPackageBarcodeRule(); + if (StringUtils.isEmpty(packageTemplate)) packageTemplate = packingDefine.getPackageTemplate(); + if (StringUtils.isEmpty(printer)) printer = packingDefine.getPrinter(); + + //此时 packageBarcodeRule || packageTemplate || printer 仍有一个为空则 记录日志 忽略当前零件的打包 + if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate) || StringUtils.isEmpty(printer)) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置的成品包装规则信息中必要信息无效:编码规则[%s]模版[%s]打印机[%s]!", + partNo, packingRuleDetail.getPackageCode(), packageBarcodeRule, packageTemplate, printer), + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + return null; + } + } + + //封装包装规则信息 + MesPackageRuleContext packageRuleContext = new MesPackageDataContext(); + BeanUtils.copyProperties(packingRuleDetail, packageRuleContext); + BeanUtils.copyProperties(packingRule, packageRuleContext); + packageRuleContext.setPackageBarcodeRule(packageBarcodeRule); + packageRuleContext.setPackageTemplate(packageTemplate); + packageRuleContext.setPrinter(printer); + return packageRuleContext; + } + + //生成包装及明细, 根据标包数量判断是否执行打印 [递归] + private List doHandlePackagePrint(StationRequestBean reqBean, StepResult stepResult, + MesPackageRuleContext packageRuleContext, List packageDataContextList, List productSnList) { + + //缓存的包装条码明细数量 + Integer cachedQty = CollectionUtils.isEmpty(packageDataContextList) ? MesPcnExtConstWords.ZERO : packageDataContextList.size(); + //当前满足标包的差额数量 + Integer needQty = packageRuleContext.getPackSpecQty().intValue() - cachedQty; + + //当前满足标包的差额条码 + List productSnList2Cur; + //除去当前满足标包的差额条码后的剩余条码 + List productSnList2Remain = null; + + //当前零件剩余未打包条码 如果小于等于 当前满足标包的差额数量, 则直接将 未打包条码赋给当前满足标包的差额条码, 否则 截取条码 + if (productSnList.size() <= needQty) { + productSnList2Cur = productSnList; + } else { + productSnList2Cur = productSnList.subList(0, needQty); + productSnList2Remain = productSnList.subList(needQty, productSnList.size()); + } + + MesPackage packageDb = null; + //判断是否存在缓存的包装条码明细信息,如果进行递归则已无包装条码, 则重新生成信息的包装条码 + if (!CollectionUtils.isEmpty(packageDataContextList)) packageDb = packageExtService.getMesPackage(reqBean.getOrganizeCode(), packageDataContextList.get(0).getPackageId()); + //缓存中的包装条码也可能在DB中已被删除, 所以这里直接判断 包装条码信息是否为空则生成包装条码信息 + if (null == packageDb) packageDb = insertMesPackage(reqBean, packageRuleContext); + + //如果包装条码未空, 说明上面生成包装条码的时候 根据编码规则生成出现问题, 则直接退出, 记录日志, 忽略当前零件的打包 + if (null == packageDb) return null; + + //当前的实际打包数量 = 缓存的包装条码明细数量 + 当前满足标包的差额条码的个数 + Integer curQty = cachedQty + productSnList2Cur.size(); + //判断当前是否满包 + Boolean isSealed = curQty >= packageRuleContext.getPackSpecQty().intValue(); + //判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态 + packageDb = savePackageDb(reqBean, packageDb, curQty, isSealed); + + //判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据 + List resultList = insertPackageDetailAndBackUnSealedResultList(reqBean, packageRuleContext, packageDb, productSnList2Cur, isSealed); + + //如果当前的实际打包数量不满足标包, 则将此前已经缓存的条码合并到 当前未满包的包装条码明细数据resultList中 + if (!CollectionUtils.isEmpty(resultList) && !CollectionUtils.isEmpty(packageDataContextList)) resultList.addAll(packageDataContextList); + + //判断满包 存储打包信息 + if (isSealed) stepResult.getDataCollection().add(packageDb); + + //如果已无剩余条码, 则返回当前未满包的包装条码明细数据resultList + if (CollectionUtils.isEmpty(productSnList2Remain)) return resultList; + + //传递剩余条码进行递归处理: 此时packageDataContextList直接为null + return doHandlePackagePrint(reqBean, stepResult, packageRuleContext, null, productSnList2Remain); + + } + + //生成包装条码信息 + private MesPackage insertMesPackage(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext) { + //根据编码规则生成包装条码 + String packageNo = doGereratePackageNo(reqBean, packageRuleContext); + if (StringUtils.isEmpty(packageNo)) return null; + MesPackage packageDb = new MesPackage(); + packageDb.setPackageNo(packageNo); + packageDb.setPartNo(packageRuleContext.getPartNo()); + packageDb.setPartName(packageRuleContext.getPartName()); + packageDb.setQty(new Double(1)); + packageDb.setPackSpecQty(packageRuleContext.getPackSpecQty()); + packageDb.setUnit(packageDb.getUnit()); + packageDb.setLotNo(TimeTool.getToday()); + packageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + packageDb.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.UNPRINT.getValue()); + packageDb.setWorkCenterCode(reqBean.getWorkCenterCode()); + packageDb.setWorkCellCode(reqBean.getWorkCellCode()); + packageDb.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); + packageDb.setPackageSn(packageRuleContext.getPackCode()); + packageDb.setPackageLabelTemplate(packageRuleContext.getPackageTemplate()); + packageDb.setFid(UUID.randomUUID().toString()); + packageDb.setOrganizeCode(reqBean.getOrganizeCode()); + ConvertBean.serviceModelInitialize(packageDb, reqBean.getUserInfo()); + return packageDb; + } + + //判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态 + private MesPackage savePackageDb(StationRequestBean reqBean, MesPackage packageDb, Integer curQty, Boolean isSealed) { + + if (!StringUtils.isEmpty(packageDb.getId())) { + //下面直接根据ID进行修改, 所以此处置为游离态 + entityManager.detach(packageDb); + ConvertBean.serviceModelUpdate(packageDb, reqBean.getUserInfo()); + } + + packageDb.setQty(new Double(curQty)); + if (isSealed) { + packageDb.setLotNo(TimeTool.getToday()); + packageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + packageDb.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue()); + } + + if (StringUtils.isEmpty(packageDb.getId())) return packageRepository.insert(packageDb); + + packageRepository.updateByPropertiesNoSync( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.ID}, + new Object[]{reqBean.getOrganizeCode(), packageDb.getId()}, + new String[]{MesPcnExtConstWords.QTY, MesPcnExtConstWords.IS_SEALED, MesPcnExtConstWords.PRINT_STATUS, MesPcnExtConstWords.LOT_NO, + MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, + new Object[]{packageDb.getQty(), packageDb.getIsSealed(), packageDb.getPrintStatus(), packageDb.getLotNo(), + packageDb.getModifyUser(), packageDb.getModifyDatetime(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}); + + return packageDb; + } + + //判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据 + private List insertPackageDetailAndBackUnSealedResultList(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext, + MesPackage packageDb, List productSnList2Cur, Boolean isSealed) { + //当前未满包的包装条码明细数据 + List resultList = null; + //包装条码明细ID + Long detailId = null; + //遍历当前满足标包的差额条码 + for (String productSn : productSnList2Cur) { + if (StringUtils.isEmpty(productSn)) continue; + //判断统计方式,是否生成包装明细信息 + if (packageRuleContext.getGenerateType().compareTo(MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.PACKAGE_DETAIL.getValue()) == 0) { + detailId = insertMesPackageDetail(reqBean, packageDb, productSn); + } + //判断不满包则 赋值给 当前未满包的包装条码明细数据resultList + if (!isSealed) { + if (CollectionUtils.isEmpty(resultList)) resultList = new ArrayList<>(); + MesPackageDataContext packageDataContext = new MesPackageDataContext(); + BeanUtils.copyProperties(packageRuleContext, packageDataContext); + packageDataContext.setPackageId(packageDb.getId()); + packageDataContext.setDetailId(detailId); + packageDataContext.setPackageNo(packageDb.getPackageNo()); + packageDataContext.setQty(new Double(1)); + packageDataContext.setSerialNumber(productSn); + packageDataContext.setCreateDatetime(packageDb.getCreateDatetime()); + packageDataContext.setModifyDatetime(TimeTool.getNowTime(true)); + resultList.add(packageDataContext); + } + } + return resultList; + } + + //生成包装明细信息 + private Long insertMesPackageDetail(StationRequestBean reqBean, MesPackage packageDb, String productSn) { + MesPackageDetail packageDetailDb = new MesPackageDetail(); + packageDetailDb.setPackageNo(packageDb.getPackageNo()); + packageDetailDb.setPartNo(packageDb.getPartNo()); + packageDetailDb.setPartName(packageDb.getPartName()); + packageDetailDb.setSerialNumber(productSn); + packageDetailDb.setProductSn(productSn); + packageDetailDb.setQty(new Double(1)); + packageDetailDb.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()); + packageDetailDb.setFid(UUID.randomUUID().toString()); + packageDetailDb.setOrganizeCode(reqBean.getOrganizeCode()); + ConvertBean.serviceModelInitialize(packageDetailDb, reqBean.getUserInfo()); + return packageDetailRepository.insert(packageDetailDb).getId(); + } + + //根据编码规则生成包装条码 + private String doGereratePackageNo(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext) { + GenSerialNoModel serialNoModel = new GenSerialNoModel(packageRuleContext.getPackageBarcodeRule()) + .putDataMap(MesPackageRuleContext.class.getSimpleName(), packageRuleContext) + .partNo(packageRuleContext.getPartNo()).basicInfo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + try { + return syncFuncService.syncSerialNo(serialNoModel, reqBean.getUserInfo(), reqBean.getOrganizeCode(), 1).getResultList().get(0).toString(); + } catch (ImppBusiException e) { + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), e.getErrorDetail(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + } catch (Exception e) { + String webMsg = String.format("零件编码[%s]编码规则代码[%s]生成包装条码%s", serialNoModel.getPartNo(), serialNoModel.getRuleCode(), fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode())); + this.sendMessage(reqBean, new StationResultBean().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); + } + return null; + } + + private void execPrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, + MesPackageRuleContext packageRuleContext, MesLabelTemplate labelTemplate, IPrintTemplateStrategyService strategyService, List packageList) { + if (null == strategyService) { + //查询模版信息 + labelTemplate = templateService.getLabelTemplate(packageRuleContext.getPackageTemplate(), reqBean.getOrganizeCode()); + strategyService = (null != labelTemplate && !StringUtils.isEmpty(labelTemplate.getMethodCode())) ? (IPrintTemplateStrategyService) SpringContextsUtil.getBean(labelTemplate.getMethodCode()) : null; + } + if (null == strategyService) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("零件编码[%s]未配置有效的包装条码模版[%s]信息!", packageRuleContext.getPartNo(), packageRuleContext.getPackageTemplate())); + + MesProduceSnPrintModel mesProduceSnPrintModel = new MesProduceSnPrintModel(); + mesProduceSnPrintModel.setOrganizeCode(reqBean.getOrganizeCode()); + mesProduceSnPrintModel.setUserName(reqBean.getUserInfo()); + mesProduceSnPrintModel.setMesLabelTemplate(labelTemplate); + mesProduceSnPrintModel.setPrinter(packageRuleContext.getPrinter()); + mesProduceSnPrintModel.setPartNo(packageRuleContext.getPartNo()); + mesProduceSnPrintModel.setPartName(packageRuleContext.getPartName()); + mesProduceSnPrintModel.getPackageList().addAll(packageList); + + MesProduceSnPrintModel printModel = null; + try { + printModel = strategyService.execute(null, mesProduceSnPrintModel, null, stepResult, reqBean, true); + } catch (ImppBusiException e) { + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), e.getErrorDetail()); + } catch (Exception e) { + String webMsg = String.format("零件编码[%s]包装条码模版[%s]打印包装条码%s", packageRuleContext.getPartNo(), packageRuleContext.getPackageTemplate(), 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(); + } + + if (CollectionUtils.isEmpty(printModel.getPrintContextList())) return; + + //发送打印信息 + resultBean.setBusiType(MesPcnEnumUtil.STATION_BUSI_TYPE.CUSTOM_COMPONENT.getValue()); + resultBean.setDataType(MesPcnEnumUtil.STATION_DATA_TYPE.FILE.getValue()); + resultBean.setCustomPageName(MesPcnExtConstWords.SORT_WORK_CENTER_PRINT); + resultBean.setResultObj(printModel.getPrintContextList()); + this.sendMessage(reqBean, resultBean); + + //保存打印记录日志 + printedSnLogRepository.saveAll(printModel.getMesPrintedSnLogList()); + } + +} 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 4023d86..1759174 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 @@ -21,6 +21,7 @@ import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.StringJoiner; import java.util.concurrent.atomic.AtomicReference; @@ -267,4 +268,29 @@ public class MesProductionCustomContextStepService extends BaseStepService imple dispatchFsmBusiData(reqBean.getOrganizeCode(), getShortCounterContextKey(reqBean), shortCounter.toString()); } + //打包数据KEY + private String getPackageDataContextKey(StationRequestBean reqBean) { + return new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).add(reqBean.getWorkCellCode()).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PACKAGE_DATA_CONTEXT).toString(); + } + + //保存打包数据 [JSON]List + @Override + public Boolean dispatchPackageDataContext(StationRequestBean reqBean, Map packageDataContextMap) { + if (CollectionUtils.isEmpty(packageDataContextMap)) return false; + return dispatchFsmBusiData(reqBean.getOrganizeCode(), getPackageDataContextKey(reqBean), JSONObject.toJSONString(packageDataContextMap)); + } + + //获取打包数据 [JSON]List + @Override + public Map getPackageDataContext(StationRequestBean reqBean) { + String contextStr = getFsmBusiData(reqBean.getOrganizeCode(), getPackageDataContextKey(reqBean)); + return !StringUtils.isEmpty(contextStr) ? JSONObject.parseObject(contextStr, Map.class) : null; + } + + //删除上下文班次班组信息 + @Override + public void removePackageDataContext(StationRequestBean reqBean) { + removeFsmBusiData(reqBean.getOrganizeCode(), getPackageDataContextKey(reqBean)); + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java index 506a828..eeb5810 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java @@ -551,4 +551,24 @@ public class MesProductionProcessContextStepService extends BaseStepService impl if (!CollectionUtils.isEmpty(workCellList)) dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.WORK_CELL_MAP_CONTEXT, JSONObject.toJSONString(workCellMap)); return workCellMap; } + + //获取包装规则信息 + @Override + public Map getPackageRuleContext(StationRequestBean reqBean) { + String packageRuleContextJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PACKAGE_RULE_CONTEXT); + return !StringUtils.isEmpty(packageRuleContextJson) ? JSONObject.parseObject(packageRuleContextJson, new TypeReference>() {}): null; + } + + //保存包装规则信息 + @Override + public Boolean dispatchPackageRuleContext(StationRequestBean reqBean, Map packageRuleContextMap) { + return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PACKAGE_RULE_CONTEXT, JSONObject.toJSONString(packageRuleContextMap)); + } + + //删除包装规则信息 + @Override + public void removePackageRuleContext(StationRequestBean reqBean) { + removeFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PACKAGE_RULE_CONTEXT); + } + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPackageDataContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPackageDataContext.java new file mode 100644 index 0000000..d553eb3 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPackageDataContext.java @@ -0,0 +1,37 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.context; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +import java.io.Serializable; + +/** + * 生产过程打包数据 + */ +@Data +public class MesPackageDataContext extends MesPackageRuleContext implements Serializable { + + private static final long serialVersionUID = 8644214903859925217L; + + @ApiParam("包装信息ID") + private Long packageId; + + @ApiParam("明细ID") + private Long detailId; + + @ApiParam("包装编号") + private String packageNo; + + @ApiParam("数量") + private Double qty; + + @ApiParam("产品条码") + private String serialNumber; + + @ApiParam("打包开始时间") + private String createDatetime; + + @ApiParam("打包结束时间") + private String modifyDatetime; + +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPackageRuleContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPackageRuleContext.java new file mode 100644 index 0000000..0ea6f8d --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesPackageRuleContext.java @@ -0,0 +1,61 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.context; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +import java.io.Serializable; + +/** + * 生产过程打包规则上下文 + */ +@Data +public class MesPackageRuleContext implements Serializable { + + private static final long serialVersionUID = 1369218116212836881L; + + @ApiParam(name = "包装代码") + private String packageCode; + + @ApiParam(name = "行号") + private String lineNo; + + @ApiParam(name = "零件号") + private String partNo; + + @ApiParam(name = "零件名称") + private String partName; + + @ApiParam(name = "零件类型") + private String partType; + + @ApiParam("包装规格数量") + private Double packSpecQty; + + @ApiParam("最小数量") + private Double minQty; + + @ApiParam("取整数量") + private Double roundnessQty; + + @ApiParam(name = "计量单位") + private String unit; + + @ApiParam(name = "是否默认包装") + private Integer defaultFlag; + + @ApiParam(name = "统计方式") + private Integer generateType; + + @ApiParam(name = "箱类别代号") + private String packCode; + + @ApiParam(name = "包装条码编码规则") + private String packageBarcodeRule; + + @ApiParam(name = "包装条码模板") + private String packageTemplate; + + @ApiParam(name = "打印机") + private String printer; + +} 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 0d7d7af..6dd7a26 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 @@ -1,9 +1,6 @@ package cn.estsh.i3plus.ext.mes.pcn.pojo.model; -import cn.estsh.i3plus.pojo.mes.bean.MesLabelTemplate; -import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine; -import cn.estsh.i3plus.pojo.mes.bean.MesPrintedSnLog; -import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.*; import io.swagger.annotations.ApiParam; import lombok.Data; @@ -33,6 +30,9 @@ public class MesProduceSnPrintModel { @ApiParam("条码") private String productSn; + @ApiParam("包装条码") + private String packageNo; + @ApiParam("打印数量") private Integer printQty; @@ -69,13 +69,18 @@ public class MesProduceSnPrintModel { @ApiParam(name = "打印模板信息") private MesLabelTemplate mesLabelTemplate; - @ApiParam(name = "产品条码信息") - private List mesProduceSnPrintDataModelList = new ArrayList<>(); - + @ApiParam(name = "产出条码") private List mesProduceSnList = new ArrayList<>(); + @ApiParam(name = "产出包装") + private List packageList = new ArrayList<>(); + + @ApiParam(name = "打印日志信息") private List mesPrintedSnLogList = new ArrayList<>(); + @ApiParam(name = "产品条码打印信息") + private List mesProduceSnPrintDataModelList = new ArrayList<>(); + @ApiParam(name = "源数据 使用功能:1-裁片") private Object sourceData; 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 1d20161..e9d756c 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 @@ -313,6 +313,16 @@ public class MesPcnExtConstWords { public static final String REWORK_TASK_ID = "reworkTaskId"; //nc状态 public static final String NC_STATUS = "nc_status"; + //零件类型 + public static final String PART_TYPE = "partType"; + //包装代码 + public static final String PACKAGE_CODE = "packageCode"; + //是否封箱 + public static final String IS_SEALED = "isSealed"; + //单位 + public static final String UNIT = "unit"; + //包装规格数量 + public static final String PACK_SPEC_QTY = "packSpecQty"; //BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties) @@ -334,6 +344,13 @@ public class MesPcnExtConstWords { // 扩展字段 public static final String EXTEND = "extend"; + // 用户缓存 + public static final String USER_INFO_CONTEXT = "USER_INFO_CONTEXT"; + // 装箱防错 + public static final String BOXING_ERROR_PROOFING = "BOXING_ERROR_PROOFING"; + // 是否记忆 + public static final String IS_MEMORY = "IS_MEMORY"; + // 时间格式 public static final String DATE_FORMAT_SSS = "yyyy-MM-dd HH:mm:ss.SSS"; public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; @@ -552,12 +569,10 @@ public class MesPcnExtConstWords { public static final String REPEAT_ASSEMBLY_SN_CONTEXT = "REPEAT_ASSEMBLY_SN_CONTEXT"; // 设备计数上下文 public static final String SHORT_COUNTER_CONTEXT = "SHORT_COUNTER_CONTEXT"; - // 用户缓存 - public static final String USER_INFO_CONTEXT = "USER_INFO_CONTEXT"; - // 装箱防错 - public static final String BOXING_ERROR_PROOFING = "BOXING_ERROR_PROOFING"; - // 是否记忆 - public static final String IS_MEMORY = "IS_MEMORY"; + // 打包数据上下文 + public static final String PACKAGE_DATA_CONTEXT = "PACKAGE_DATA_CONTEXT"; + // 打包规则上下文 + public static final String PACKAGE_RULE_CONTEXT = "PACKAGE_RULE_CONTEXT"; // 上下文: 展示组件数据 public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT"; @@ -621,7 +636,6 @@ public class MesPcnExtConstWords { //打印客户条码 public static final String SORT_WORK_CENTER_PRINT = "SORT_WORK_CENTER_PRINT"; - //强过 跳过 public static final String SHIP_PASS = "跳过"; public static final String STRONGER_PASS = "强过";