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 index 5cb6d17..0528cb4 100644 --- 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 @@ -5,6 +5,8 @@ import cn.estsh.i3plus.pojo.mes.bean.MesPackingRule; import cn.estsh.i3plus.pojo.mes.bean.MesPackingRuleDetail; import io.swagger.annotations.ApiOperation; +import java.util.List; + /** * @Description : 成品包装规则 * @Reference : @@ -15,10 +17,10 @@ import io.swagger.annotations.ApiOperation; public interface IMesPackingRuleService { @ApiOperation(value = "根据物料代码,零件类型查询成品包装明细规则") - MesPackingRuleDetail getPackingRuleDetail(String organizeCode, String partNo, String partType); + List getPackingRuleDetailList(String organizeCode, String partNo, String partType); @ApiOperation(value = "根据包装代码查询成品包装规则") - MesPackingRule getPackingRule(String organizeCode, String packageCode); + List getPackingRuleList(String organizeCode, List packageCodeList); @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 index eeeca27..b09d312 100644 --- 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 @@ -1,6 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.pojo.mes.bean.MesPackage; +import cn.estsh.i3plus.pojo.mes.bean.MesPackageDetail; import io.swagger.annotations.ApiOperation; /** @@ -15,4 +16,16 @@ public interface IMesPackageExtService { @ApiOperation(value = "根据ID查询包装信息") MesPackage getMesPackage(String organizeCode, Long id); + @ApiOperation(value = "根据包装条码查询包装信息") + MesPackage getPackageDb(String organizeCode, String packageNo); + + @ApiOperation(value = "根据包装条码查询一条包装明细信息") + MesPackageDetail getPackageDetailByPackageNo(String organizeCode, String packageNo); + + @ApiOperation(value = "根据零件条码查询一条包装明细信息") + MesPackageDetail getPackageDetailByProductSn(String organizeCode, String productSn); + + @ApiOperation(value = "根据零件条码及字段名称查询一条包装明细信息") + MesPackageDetail getPackageDetailByProductSnWithProperty(String organizeCode, String productSn, String propertyName); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnPrintService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnPrintService.java index 8368a66..afc471c 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnPrintService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnPrintService.java @@ -28,4 +28,7 @@ public interface IMesProduceSnPrintService { @ApiOperation(value = "打印队列查询") List findMesPrintQueueList(MesPrintQueue printQueue); + + @ApiOperation(value = "根据包装条码补打印包装条码标签") + MesProduceSnPrintModel doRePrintPackByPackageNo(MesProduceSnPrintModel mesProduceSnPrintModel); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesProduceSnPrintController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesProduceSnPrintController.java index 60e3d4a..e73214a 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesProduceSnPrintController.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/busi/MesProduceSnPrintController.java @@ -20,10 +20,7 @@ import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Objects; @@ -175,4 +172,20 @@ public class MesProduceSnPrintController { } } + @PostMapping("/by-packageno/reprint-pack") + @ApiOperation(value = "根据包装条码补打印包装条码标签") + public ResultBean doRePrintPackByPackageNo(@RequestBody MesProduceSnPrintModel mesProduceSnPrintModel) { + try { + ValidatorBean.checkNotNull(mesProduceSnPrintModel.getPackageNo(), "包装条码不能为空"); + ValidatorBean.checkNotNull(mesProduceSnPrintModel.getOrganizeCode(), "工厂代码不能为空"); + ValidatorBean.checkNotNull(mesProduceSnPrintModel.getUserName(), "操作人不能为空"); + return ResultBean.success("查询成功").setResultObject(mesProduceSnPrintService.doRePrintPackByPackageNo(mesProduceSnPrintModel)); + } catch (ImppBusiException imppException) { + return ResultBean.fail(imppException); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackingRuleService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesPackingRuleService.java index 81ec448..7b94cbe 100644 --- 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 @@ -2,7 +2,9 @@ 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.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.mes.bean.MesPackingDefine; import cn.estsh.i3plus.pojo.mes.bean.MesPackingRule; import cn.estsh.i3plus.pojo.mes.bean.MesPackingRuleDetail; @@ -11,8 +13,12 @@ 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.CollectionUtils; import org.springframework.util.StringUtils; +import java.util.List; +import java.util.stream.Collectors; + /** * @Description : 成品包装规则 * @Reference : @@ -33,19 +39,21 @@ public class MesPackingRuleService implements IMesPackingRuleService { private MesPackingDefineRepository packingDefineRepository; @Override - public MesPackingRuleDetail getPackingRuleDetail(String organizeCode, String partNo, String partType) { + public List getPackingRuleDetailList(String organizeCode, String partNo, String partType) { if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(partNo) || StringUtils.isEmpty(partType)) return null; - return packingRuleDetailRepository.getByProperty( + return packingRuleDetailRepository.findByProperty( 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}); + public List getPackingRuleList(String organizeCode, List packageCodeList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(packageCodeList)) return null; + packageCodeList = packageCodeList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + if (packageCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(packageCodeList.get(0), MesPcnExtConstWords.PACKAGE_CODE, packBean); + else DdlPreparedPack.getInPackList(packageCodeList, MesPcnExtConstWords.PACKAGE_CODE, packBean); + return packingRuleRepository.findByHqlWhere(packBean); } @Override 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 index fc24bf7..3856d32 100644 --- 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 @@ -2,11 +2,16 @@ 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.bean.DdlPackBean; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.mes.bean.MesPackage; +import cn.estsh.i3plus.pojo.mes.bean.MesPackageDetail; +import cn.estsh.i3plus.pojo.mes.repository.MesPackageDetailRepository; import cn.estsh.i3plus.pojo.mes.repository.MesPackageRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; /** * @Description : 包装信息 @@ -21,10 +26,48 @@ public class MesPackageExtService implements IMesPackageExtService { @Autowired private MesPackageRepository packageRepository; + @Autowired + private MesPackageDetailRepository packageDetailRepository; + @Override public MesPackage getMesPackage(String organizeCode, Long id) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(id)) return null; 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}); } + + @Override + public MesPackage getPackageDb(String organizeCode, String packageNo) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(packageNo)) return null; + return packageRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.PACKAGE_NO}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), packageNo}); + } + + @Override + public MesPackageDetail getPackageDetailByPackageNo(String organizeCode, String packageNo) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(packageNo)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(packageNo, MesPcnExtConstWords.PACKAGE_NO, packBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean); + return packageDetailRepository.getByProperty(packBean); + } + + @Override + public MesPackageDetail getPackageDetailByProductSn(String organizeCode, String productSn) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(productSn)) return null; + MesPackageDetail packageDetail = getPackageDetailByProductSnWithProperty(organizeCode, productSn, MesPcnExtConstWords.SERIAL_NUMBER); + if (null == packageDetail) packageDetail = getPackageDetailByProductSnWithProperty(organizeCode, productSn, MesPcnExtConstWords.PRODUCT_SN); + if (null == packageDetail || StringUtils.isEmpty(packageDetail.getPackageNo())) return null; + return packageDetail; + } + + @Override + public MesPackageDetail getPackageDetailByProductSnWithProperty(String organizeCode, String productSn, String propertyName) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(productSn, propertyName, packBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean); + return packageDetailRepository.getByProperty(packBean); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnPrintService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnPrintService.java index e85f344..667ad04 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnPrintService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnPrintService.java @@ -2,10 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesPartService; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesTemplateService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesPrintedSnLogService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnPrintService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderCutService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.printqueue.IPrintQueueStrategyService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; @@ -111,6 +108,9 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService { @Autowired private IMesWorkOrderService mesWorkOrderService; + @Autowired + private IMesPackageExtService packageExtService; + // 仅查询 public static final Integer CUT_QUERY_MODE_BY_QUERY = 1; // 打印 @@ -501,4 +501,36 @@ public class MesProduceSnPrintService implements IMesProduceSnPrintService { snLog.setOrganizeCode(workOrder.getOrganizeCode()); return snLog; } + + @Override + public MesProduceSnPrintModel doRePrintPackByPackageNo(MesProduceSnPrintModel mesProduceSnPrintModel) { + //根据包装条码查询包装信息 + MesPackage packageDb = packageExtService.getPackageDb(mesProduceSnPrintModel.getOrganizeCode(), mesProduceSnPrintModel.getPackageNo()); + if (null == packageDb) MesPcnException.throwBusiException("包装条码[%s]信息不存在!", mesProduceSnPrintModel.getPackageNo()); + if (StringUtils.isEmpty(packageDb.getPackageLabelTemplate())) MesPcnException.throwBusiException("包装条码[%s]信息未关联包装条码模版代码!", mesProduceSnPrintModel.getPackageNo()); + if (StringUtils.isEmpty(packageDb.getIsSealed()) || packageDb.getIsSealed().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) + MesPcnException.throwBusiException("包装条码[%s]当前状态[未封装],不支持补打印!", mesProduceSnPrintModel.getPackageNo()); + + //查询模版信息 + MesLabelTemplate labelTemplate = mesTemplateService.getMesLabelTemplate(packageDb.getPackageLabelTemplate(), mesProduceSnPrintModel.getOrganizeCode()); + if (StringUtils.isEmpty(labelTemplate.getMethodCode())) + MesPcnException.throwBusiException("包装条码[%s]关联的包装条码模版代码[%s]未维护方法策略!", mesProduceSnPrintModel.getPackageNo(), packageDb.getPackageLabelTemplate()); + + IPrintTemplateStrategyService strategyService = (IPrintTemplateStrategyService) SpringContextsUtil.getBean(labelTemplate.getMethodCode()); + if (null == strategyService) MesPcnException.throwBusiException("包装条码[%s]关联的包装条码模版代码[%s]未维护有效的方法策略!", mesProduceSnPrintModel.getPackageNo(), packageDb.getPackageLabelTemplate()); + + mesProduceSnPrintModel.setMesLabelTemplate(labelTemplate); + mesProduceSnPrintModel.setPartNo(packageDb.getPartNo()); + mesProduceSnPrintModel.setPartName(packageDb.getPartName()); + mesProduceSnPrintModel.getPackageList().addAll(Stream.of(packageDb).collect(Collectors.toList())); + + mesProduceSnPrintModel = strategyService.execute(null, mesProduceSnPrintModel, null, null, null, false); + + //保存打印记录日志 + printedSnLogRepository.saveAll(mesProduceSnPrintModel.getMesPrintedSnLogList()); + + return mesProduceSnPrintModel; + + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/MesNoSortCustSnNumberRuleStrategyService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/MesNoSortCustSnNumberRuleStrategyService.java index fd0c4ce..5cb280f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/MesNoSortCustSnNumberRuleStrategyService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/MesNoSortCustSnNumberRuleStrategyService.java @@ -54,7 +54,7 @@ public class MesNoSortCustSnNumberRuleStrategyService implements INumberRulePack } @Override - public String transform(String serialNo) { + public String transform(GenSerialNoModel genSerialNoModel, String serialNo) { if (StringUtils.isEmpty(serialNo)) return serialNo; return customerSnTransformService.transformBarCodeGm(serialNo); } 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 deleted file mode 100644 index 5d6e53a..0000000 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/WuhuPackageNumberRuleStrategyService.java +++ /dev/null @@ -1,61 +0,0 @@ -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/numberrule/YfaiPackageNumberRuleStrategyService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/YfaiPackageNumberRuleStrategyService.java new file mode 100644 index 0000000..ca660e1 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/numberrule/YfaiPackageNumberRuleStrategyService.java @@ -0,0 +1,84 @@ +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 org.springframework.util.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; +import java.util.StringJoiner; + +/** + * @Description : MES-包装条码 + * @Reference : + * @Author : wangjie + * @CreateDate 2024/10/28 16:47 + * @Modify: + **/ +@Component +public class YfaiPackageNumberRuleStrategyService implements INumberRulePackAttributeStrategyService { + +// 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} + + @Override + public GenSerialNoModel execute(GenSerialNoModel genSerialNoModel) { + Map dataMap = genSerialNoModel.getDataMap(); + MesPackageRuleContext packageRuleContext = !CollectionUtils.isEmpty(dataMap) ? (MesPackageRuleContext) dataMap.get(MesPackageRuleContext.class.getSimpleName()) : null; + Double qty = (!CollectionUtils.isEmpty(dataMap) && dataMap.containsKey(MesPcnExtConstWords.QTY)) ? (Double) dataMap.get(MesPcnExtConstWords.QTY) : null; + if (StringUtils.isEmpty(qty)) qty = null != packageRuleContext ? packageRuleContext.getPackSpecQty() : null; + if (StringUtils.isEmpty(qty)) MesPcnException.throwBusiException("生成包装条码缺少必要参数[包装数量]"); + String unit = (!CollectionUtils.isEmpty(dataMap) && dataMap.containsKey(MesPcnExtConstWords.UNIT)) ? (String) dataMap.get(MesPcnExtConstWords.UNIT) : null; + if (StringUtils.isEmpty(unit)) unit = null != packageRuleContext ? packageRuleContext.getUnit() : null; + if (StringUtils.isEmpty(unit)) MesPcnException.throwBusiException("生成包装条码缺少必要参数[单位]"); + genSerialNoModel.setDynamicRule( + new StringJoiner(MesPcnExtConstWords.COMMA) + .add(((new SimpleDateFormat(MesPcnExtConstWords.DATE_FORMAT_SHORT)).format(new Date()))) + .add(String.format("%.1f", qty)) + .add(unit) + .toString() + ); + return genSerialNoModel; + } + + // 生成一维码,存到dataMap中 + // YFWHU|YFNSC901C241223042722|C901|401007574AAABN|9.0|EA|C901|20241223| + // YFNSC901C241223042722 截取原始条码的 第7位到27位 + @Override + public String transform(GenSerialNoModel genSerialNoModel, String serialNo) { + String packageOneCode; +// packageOneCode = serialNo.length() >= 27 ? serialNo.substring(6, 27) : serialNo; + try { + //截取前2个 "|" 之间的字符串 + Integer indexVerticalBar = serialNo.indexOf(MesPcnExtConstWords.VERTICAL_BAR) + 1; + packageOneCode = serialNo.substring(indexVerticalBar, serialNo.indexOf(MesPcnExtConstWords.VERTICAL_BAR, indexVerticalBar)); + } catch (Exception e) { + packageOneCode = serialNo; + } + genSerialNoModel.putDataMap(serialNo, packageOneCode); + return serialNo; + } +} \ No newline at end of file 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/YfaiPackageNoPrintStrategy.java similarity index 89% rename from modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/WuhuPackageNoPrintStrategy.java rename to modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/print/strategy/YfaiPackageNoPrintStrategy.java index 63318e3..6088585 100644 --- 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/YfaiPackageNoPrintStrategy.java @@ -22,7 +22,7 @@ import org.springframework.util.CollectionUtils; import java.util.*; /** - * @Description : 芜湖包装条码打印 + * @Description : 包装条码打印 * @Reference : * @Author : wangjie * @CreateDate : 2024/9/29 16:43 @@ -30,7 +30,7 @@ import java.util.*; **/ @Component @Slf4j -public class WuhuPackageNoPrintStrategy implements IPrintTemplateStrategyService { +public class YfaiPackageNoPrintStrategy implements IPrintTemplateStrategyService { @Autowired private IMesCustomerPartService mesCustomerPartService; @@ -49,12 +49,11 @@ public class WuhuPackageNoPrintStrategy implements IPrintTemplateStrategyService // 返回的结果集合 List> printDataMapList = new ArrayList<>(); if (!isStep) { - //TODO 包装条码补打 + model.getPackageList().forEach(o -> printDataMapList.add(getPrintMap(model, o, customerPart))); + model.setPrintContextList(printDataMapList); } else { model.getPackageList().forEach(o -> printDataMapList.add(getPrintMap(model, o, customerPart))); - List> resultMapList = new ArrayList<>(); - resultMapList.add(packResultMap(model, printDataMapList)); - model.setPrintContextList(resultMapList); + model.getPrintContextList().add(packResultMap(model, printDataMapList)); } return model; @@ -90,9 +89,7 @@ public class WuhuPackageNoPrintStrategy implements IPrintTemplateStrategyService 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.BAR_CODE, packageDb.getPackageOneCode()); 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/station/function/MesFunctionDialogElectronicInspectionService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogElectronicInspectionService.java index 81d826c..a4bf8d2 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogElectronicInspectionService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionDialogElectronicInspectionService.java @@ -2,16 +2,24 @@ 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.pojo.context.MesProductionPsOutContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; 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.model.ButtonDynamicModel; import cn.estsh.i3plus.pojo.mes.model.StationCustomDialogBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; 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.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -23,9 +31,51 @@ import java.util.stream.Collectors; public class MesFunctionDialogElectronicInspectionService extends BaseSwsService implements IFsmModuleFunctionService { @Autowired + private IShippingDispatchService shippingDispatchService; + + @Autowired private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Override + public Boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { + + this.sendMessage(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(buttonDynamicModel.getFunctionValue()), + String.format("生产线[%s]工位[%s]电子化检验弹框提交信息成功!提交信息[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getFunctionValue()), + MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + //functionValue=电子化检验的判断结果 + List inspectionList = StringUtils.isEmpty(buttonDynamicModel.getFunctionValue()) ? null : Arrays.asList(buttonDynamicModel.getFunctionValue().split(MesPcnExtConstWords.COMMA)); + + Boolean isSaveFlag = false; + //获取上下文产出条码数据信息集合 + if (!CollectionUtils.isEmpty(inspectionList)) { + List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); + if (!CollectionUtils.isEmpty(productionPsOutContextList)) { + for (MesProductionPsOutContext productionPsOutContext : productionPsOutContextList) { + if (null == productionPsOutContext) continue; + if (productionPsOutContext.getQcStatus().compareTo(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()) != 0 + || !inspectionList.contains(productionPsOutContext.getProductSn())) continue; + //电子化检验弹框判可疑 + productionPsOutContext.setQcStatus(MesExtEnumUtil.PRODUCE_QC_STATUS.SUSPICIOUS.getValue()); + isSaveFlag = true; + } + //保存上下文产出条码数据信息集合 + if (isSaveFlag) productionDispatchContextStepService.dispatchProductionPsOutContext(reqBean, productionPsOutContextList); + } + } + + reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); + reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); + reqBean.setBusiType(MesPcnEnumUtil.ACTOR_RECEIVE_STRATEGY.WS_CMD_DO_SCAN.getCode()); + reqBean.setButtonCode(buttonDynamicModel.getButtonCode()); + reqBean.setStepDialogStatus(true); + shippingDispatchService.sendScanQueueNextExec(reqBean); + + return true; + + } + + @Override public StationCustomDialogBean stepDialogDispatch(StationRequestBean reqBean, StationCustomDialogBean dialogBean) { //获取上下文产出条码数据信息集合 @@ -36,7 +86,7 @@ public class MesFunctionDialogElectronicInspectionService extends BaseSwsService List snList = productionPsOutContext.stream().filter(o -> !StringUtils.isEmpty(o.getProductSn())).map(MesProductionPsOutContext::getProductSn).distinct().collect(Collectors.toList()); // 条码列表为空则表示不需要弹框 if (CollectionUtils.isEmpty(snList)) return dialogBean.unDialog(); - else return dialogBean.asyn().obj(snList); + else return dialogBean.obj(snList); } else return dialogBean.unDialog(); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionPackagePartService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionPackagePartService.java new file mode 100644 index 0000000..08ded7c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionPackagePartService.java @@ -0,0 +1,248 @@ +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.apiservice.serviceimpl.step.method.IMesPackageNoGenerateStepService; +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.MesProdRuleContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; +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.serviceimpl.fsm.BaseSwsService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService; +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.MesPackage; +import cn.estsh.i3plus.pojo.mes.model.*; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; +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.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description : 工位参数按钮事件接口实现【零件打包】 + **/ +@Slf4j +@Service +public class MesFunctionPackagePartService extends BaseSwsService implements IFsmModuleFunctionService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesPackageNoGenerateStepService packageNoGenerateStepService; + + @Autowired + private IFsmRouteDataService fsmRouteDataService; + + @Override + @Transactional(propagation = Propagation.NOT_SUPPORTED) + public Object doCustomApiDispatch(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { + + //页面渲染数据集 + Map resultMap = new HashMap<>(); + + //工步结果,用于信息传递的对象 + StepResult stepResult; + + //前端传递的参数 + MesPackageDataContext packageDataContext = StringUtils.isEmpty(buttonDynamicModel.getFunctionValue()) ? null : JSONObject.parseObject(buttonDynamicModel.getFunctionValue(), MesPackageDataContext.class); + + //初始化界面 + if (null == packageDataContext || StringUtils.isEmpty(packageDataContext.getBusiType())) { + + //获取上下文产出零件信息 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + //验证是否存在加工单 + Boolean isExistOrder = checkIsExistOrder(productionPartContextList); + + //列名称 + List attrBeanList = dataAttrList(isExistOrder); + + resultMap.put(MesPcnExtConstWords.ATTR_BEAN_LIST, attrBeanList); + + //获取上下文产品加工规则数据信息 + List prodRuleContextList = null; + if (CollectionUtils.isEmpty(productionPartContextList)) prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); + + //当前没有产成零件时,设置 IS_SELECT_PART=1 则支持开窗选零件 + if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(prodRuleContextList)) resultMap.put(MesPcnExtConstWords.IS_SELECT_PART, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + + if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(prodRuleContextList) && (null == packageDataContext || StringUtils.isEmpty(packageDataContext.getPartNo()))) { + resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT.getValue()); + return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]零件打包:请选择打包零件编码!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + } + + //获取包装规则信息 + Map packageRuleContextMap = productionProcessContextStepService.getPackageRuleContext(reqBean); + if (CollectionUtils.isEmpty(packageRuleContextMap)) packageRuleContextMap = new HashMap<>(); + Integer initQty = packageRuleContextMap.size(); + + //列表数据 + List resultList = new ArrayList<>(); + + stepResult = StepResult.getSuccessComplete(); + + //根据上下文产出零件信息封装列表数据 + if (!CollectionUtils.isEmpty(productionPartContextList)) packResultList2Ppc(reqBean, stepResult, productionPartContextList, isExistOrder, packageRuleContextMap, resultList); + //根据上下文产品加工规则数据信息封装列表数据 + else if (!CollectionUtils.isEmpty(prodRuleContextList)) packResultList2Prc(reqBean, stepResult, prodRuleContextList, packageRuleContextMap, resultList); + //根据用户选择的零件信息封装列表数据 + else packResultList2PartNo(reqBean, stepResult, packageDataContext.getPartNo(), packageRuleContextMap, resultList); + + //保存包装规则信息 + if (initQty != packageRuleContextMap.size()) productionProcessContextStepService.dispatchPackageRuleContext(reqBean, packageRuleContextMap); + + if (!StringUtils.isEmpty(stepResult.getMsg())) { + resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue()); + packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]零件打包:%s!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), stepResult.getMsg())); + } + + resultMap.put(MesPcnExtConstWords.DATA, resultList); + return resultMap; + } + + resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(String.format("零件号[%s]数量[%s]包装规格数量[%s]", packageDataContext.getPartNo(), packageDataContext.getQty(), packageDataContext.getPackSpecQty())); + + resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue()); + if (StringUtils.isEmpty(packageDataContext.getPartNo()) || StringUtils.isEmpty(packageDataContext.getQty()) || StringUtils.isEmpty(packageDataContext.getPackageCode())) { + return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]零件打包:零件编码[%s]缺少必要主数据!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPartNo())); + } + + stepResult = StepResult.getSuccessComplete(); + //零件打包不写包装明细数据, 默认赋值[仅统计包装], 生成虚拟条码 + packageDataContext.setGenerateType(MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.PACKAGE.getValue()); + try { + //零件打包业务处理 + stepResult.setDataCollection(new ArrayList()); + packageNoGenerateStepService.doHandlePackagePart(reqBean, resultBean, stepResult, packageDataContext); + } catch (ImppBusiException e) { + stepResult.msg(e.getErrorDetail()); + } catch (Exception e) { + String error = String.format("生产线[%s]工位[%s]零件打包%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode())); + this.cacheException(reqBean, StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), error, e, false); + stepResult.msg(error); + } + //判断零件打包的执行结果 + if (!StringUtils.isEmpty(stepResult.getMsg())) { + return packResultMap(reqBean, resultBean, resultMap, + String.format("生产线[%s]工位[%s]零件打包失败,%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), stepResult.getMsg())); + } + + resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT.getValue()); + return packResultMap(reqBean, resultBean, resultMap, String.format("零件号[%s]零件打包成功!包装条码%s打印成功!", + packageDataContext.getPartNo(), ((List) stepResult.getDataCollection()).stream().filter(o -> null != o).map(MesPackage::getPackageNo).collect(Collectors.toList()).toString())); + + } + + //返回提示信息 + private Object packResultMap(StationRequestBean reqBean, StationResultBean resultBean, Map resultMap, String message) { + this.sendMessage(reqBean, resultBean, message, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + resultMap.put(MesPcnExtConstWords.MESSAGE, message); + return resultMap; + } + + //验证是否存在加工单 + private Boolean checkIsExistOrder(List productionPartContextList) { + Optional optional = CollectionUtils.isEmpty(productionPartContextList) ? null : + productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getWorkOrderNo()))).findFirst(); + return (null != optional && optional.isPresent()) ? true : false; + } + + //列名称 + public List dataAttrList(Boolean isExistOrder) { + List attrBeanList = new ArrayList<>(); + if (isExistOrder) PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.WORK_ORDER_NO, "加工单号"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PART_NO, "零件编码"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PART_NAME, "零件名称"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.QTY, "装箱个数"); + PojoAttrUtil.loadPojoAttrs(attrBeanList, MesPcnExtConstWords.PACK_SPEC_QTY, "包装规格数量"); + return attrBeanList; + } + + //根据上下文产出零件信息封装列表数据 + private void packResultList2Ppc(StationRequestBean reqBean, StepResult stepResult, List productionPartContextList, Boolean isExistOrder, + Map packageRuleContextMap, List resultList) { + List filterList; + if (isExistOrder) { + filterList = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)) + .distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesProductionPartContext::getWorkOrderNo))), ArrayList::new)); + } else { + filterList = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)) + .distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesProductionPartContext::getPartNo))), ArrayList::new)); + } + + for (MesProductionPartContext productionPartContext : filterList) { + if (null == productionPartContext) continue; + MesPackageDataContext packageDataContext = new MesPackageDataContext(); + + MesPackageRuleContext packageRuleContext = packageRuleContextMap.get(productionPartContext.getPartNo()); + if (null == packageRuleContext) { + packageRuleContext = packageNoGenerateStepService.getPackageRuleContext(reqBean, stepResult, productionPartContext.getPartNo(), true); + if (null != packageRuleContext) packageRuleContextMap.put(productionPartContext.getPartNo(), packageRuleContext); + } + if (null != packageRuleContext) BeanUtils.copyProperties(packageRuleContext, packageDataContext); + + packageDataContext.setWorkOrderNo(productionPartContext.getWorkOrderNo()); + packageDataContext.setQty(isExistOrder ? productionPartContext.getQty() : packageDataContext.getPackSpecQty()); + resultList.add(packageDataContext); + } + } + + //根据上下文产品加工规则数据信息封装列表数据 + private void packResultList2Prc(StationRequestBean reqBean, StepResult stepResult, List prodRuleContextList, + Map packageRuleContextMap, List resultList) { + List filterList = prodRuleContextList.stream().filter(o -> null != o) + .distinct().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesProdRuleContext::getOutPartNo))), ArrayList::new)); + + for (MesProdRuleContext prodRuleContext : filterList) { + if (null == prodRuleContext) continue; + MesPackageDataContext packageDataContext = new MesPackageDataContext(); + + MesPackageRuleContext packageRuleContext = packageRuleContextMap.get(prodRuleContext.getOutPartNo()); + if (null == packageRuleContext) { + packageRuleContext = packageNoGenerateStepService.getPackageRuleContext(reqBean, stepResult, prodRuleContext.getOutPartNo(), true); + if (null != packageRuleContext) packageRuleContextMap.put(prodRuleContext.getOutPartNo(), packageRuleContext); + } + if (null != packageRuleContext) BeanUtils.copyProperties(packageRuleContext, packageDataContext); + + packageDataContext.setQty(packageDataContext.getPackSpecQty()); + resultList.add(packageDataContext); + } + } + + //根据用户选择的零件信息封装列表数据 + private void packResultList2PartNo(StationRequestBean reqBean, StepResult stepResult, String partNo, + Map packageRuleContextMap, List resultList) { + MesPackageDataContext packageDataContext = new MesPackageDataContext(); + + MesPackageRuleContext packageRuleContext = packageRuleContextMap.get(partNo); + if (null == packageRuleContext) { + packageRuleContext = packageNoGenerateStepService.getPackageRuleContext(reqBean, stepResult, partNo, true); + if (null != packageRuleContext) packageRuleContextMap.put(partNo, packageRuleContext); + } + if (null != packageRuleContext) BeanUtils.copyProperties(packageRuleContext, packageDataContext); + + packageDataContext.setQty(packageDataContext.getPackSpecQty()); + resultList.add(packageDataContext); + } + +} + diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionPackageProgressService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionPackageProgressService.java index 8075b39..951ec27 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionPackageProgressService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionPackageProgressService.java @@ -7,15 +7,21 @@ 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.serviceimpl.fsm.BaseSwsService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService; +import cn.estsh.i3plus.mes.pcn.util.StringUtil; +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.MesPackage; 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 cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; 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.transaction.annotation.Propagation; @@ -46,6 +52,7 @@ public class MesFunctionPackageProgressService extends BaseSwsService implements @Transactional(propagation = Propagation.NOT_SUPPORTED) public Object doCustomApiDispatch(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { + //页面渲染数据集 Map resultMap = new HashMap<>(); //获取打包数据 @@ -60,6 +67,7 @@ public class MesFunctionPackageProgressService extends BaseSwsService implements //封装返回列表 List resultList = new ArrayList<>(); + //封装页面数据 for (String partNo : packageDataContextMap.keySet()) { if (StringUtils.isEmpty(partNo)) continue; @@ -69,81 +77,170 @@ public class MesFunctionPackageProgressService extends BaseSwsService implements //列表展示: 包装条码, 装箱个数, 包装规格数量, 装箱开始时间, 装箱结束时间 resultList.add(new MesPackageDataContext( packageDataContextList.get(0).getPartNo(), packageDataContextList.get(0).getPartName(), - packageDataContextList.get(0).getPackageNo(), new Double(packageDataContextList.size()), - packageDataContextList.get(0).getPackSpecQty(), packageDataContextList.get(0).getCreateDatetime(), packageDataContextList.get(0).getModifyDatetime()) + packageDataContextList.get(0).getPackageNo(), new Double(packageDataContextList.size()), packageDataContextList.get(0).getPackSpecQty(), + packageDataContextList.get(0).getCreateDatetime(), packageDataContextList.get(0).getModifyDatetime(), packageDataContextList.get(0).getGenerateType()) ); } + //页面数据更新时间倒序 resultList = resultList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesPackageDataContext::getModifyDatetime).reversed()).collect(Collectors.toList()); resultMap.put(MesPcnExtConstWords.DATA, resultList); + //打包进度页面业务操作[查询] if (StringUtils.isEmpty(buttonDynamicModel.getFunctionValue())) return resultMap; resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue()); + //打包进度页面业务操作的当前数据 MesPackageDataContext packageDataContext = JSONObject.parseObject(buttonDynamicModel.getFunctionValue(), MesPackageDataContext.class); resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()).scanInfo(packageDataContext.getPackageNo()); - if (null == packageDataContext) { + if (null == packageDataContext || StringUtils.isEmpty(packageDataContext.getBusiType())) { return packResultMap(reqBean, resultBean, resultMap, - String.format("生产线[%s]工位[%s]强制打包失败,参数异常!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + String.format("生产线[%s]工位[%s]打包进度操作按钮执行失败,参数异常!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); } if (CollectionUtils.isEmpty(packageDataContextMap) || !packageDataContextMap.containsKey(packageDataContext.getPartNo())) { - return packResultMap(reqBean, resultBean, resultMap, - String.format("生产线[%s]工位[%s]强制打包失败,当前已无零件号[%s]未封箱状态的包装信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPartNo())); + return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]打包进度[%s]失败,当前已无零件号[%s]未封箱状态的包装信息!", + reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), BUSI_TYPE.valueOfDescription(packageDataContext.getBusiType()), packageDataContext.getPartNo())); } + //打包进度页面业务操作的当前数据对应的实际包装数据 List packageDataContextList = JSONObject.parseArray(packageDataContextMap.get(packageDataContext.getPartNo()), MesPackageDataContext.class); if (CollectionUtils.isEmpty(packageDataContextList) || !packageDataContextList.get(0).getPackageNo().equals(packageDataContext.getPackageNo())) { - return packResultMap(reqBean, resultBean, resultMap, - String.format("生产线[%s]工位[%s]强制打包失败,打包进度列表中已经不存在包装条码[%s],请刷新重试!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPackageNo())); + return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]打包进度[%s]失败,打包进度列表中已经不存在包装条码[%s],请刷新重试!", + reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), BUSI_TYPE.valueOfDescription(packageDataContext.getBusiType()), packageDataContext.getPackageNo())); } + //根据包装ID查询包装信息 MesPackage packageDb = packageNoGenerateStepService.getMesPackage(reqBean.getOrganizeCode(), packageDataContextList.get(0).getPackageId()); if (null == packageDb) { - return packResultMap(reqBean, resultBean, resultMap, - String.format("生产线[%s]工位[%s]强制打包失败,包装条码[%s]信息已经不存在,请刷新重试!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPackageNo())); + return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]打包进度[%s]失败,包装条码[%s]信息已经不存在,请刷新重试!", + reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), BUSI_TYPE.valueOfDescription(packageDataContext.getBusiType()), packageDataContext.getPackageNo())); } - - StepResult stepResult = StepResult.getSuccessComplete(); - try { - packageNoGenerateStepService.doForcePrint(reqBean, resultBean, stepResult, packageDataContextList, packageDb); - } catch (ImppBusiException e) { - stepResult.msg(e.getErrorDetail()); - } catch (Exception e) { - String error = String.format("生产线[%s]工位[%s]强制打包%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode())); - this.cacheException(reqBean, reqBean.getStepName(), error, e, false); - stepResult.msg(error); + if (packageDb.getIsSealed().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) { + return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]打包进度[%s]失败,包装条码[%s]信息当前状态[已封箱],请刷新重试!", + reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), BUSI_TYPE.valueOfDescription(packageDataContext.getBusiType()), packageDataContext.getPackageNo())); } - if (!StringUtils.isEmpty(stepResult.getMsg())) { - return packResultMap(reqBean, resultBean, resultMap, - String.format("生产线[%s]工位[%s]强制打包失败,%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), stepResult.getMsg())); + //修改数量 + if (BUSI_TYPE.THREE.getValue().equals(packageDataContext.getBusiType())) { + //仅统计包装才支持修改数量 + if (packageDataContextList.get(0).getGenerateType().compareTo(MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.PACKAGE.getValue()) != 0) { + return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]包装条码[%s]不支持修改数量,请刷新重试!", + reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPackageNo())); + } + if (packageDataContextList.size() == packageDataContext.getQty()) { + return packResultMap(reqBean, resultBean, resultMap, String.format("生产线[%s]工位[%s]包装条码[%s]修改数量操作无效,请刷新重试!", + reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), packageDataContext.getPackageNo())); + } + //修改包装信息的数量 + packageNoGenerateStepService.savePackageData(reqBean, packageDb, packageDataContext.getQty()); + //打包数据更新数量(判断是增加还是减少数量) + if (MathOperation.compareTo(packageDataContext.getQty(), new Double(packageDataContextList.size())) < 0) { + packageDataContextList = packageDataContextList.subList(0, packageDataContext.getQty().intValue()); + } else { + for (int i = 0; i < (packageDataContext.getQty().intValue() - packageDataContextList.size()); i ++) { + MesPackageDataContext addPackageDataContext = new MesPackageDataContext(); + BeanUtils.copyProperties(packageDataContextList.get(0), addPackageDataContext); + addPackageDataContext.setModifyDatetime(TimeTool.getNowTime(true)); + packageDataContextList.add(addPackageDataContext); + } + } + //打包数据更新数量 + packageDataContextMap.put(packageDataContext.getPartNo(), JSONObject.toJSONString(packageDataContextList)); + //页面数据更新数量 + resultList.stream().filter(o -> (null != o && o.getPackageNo().equals(packageDataContext.getPackageNo()))).findFirst().get().qty(packageDataContext.getQty(), TimeTool.getNowTime(true)); + } else { + //强制打包 + if (BUSI_TYPE.ONE.getValue().equals(packageDataContext.getBusiType())) { + StepResult stepResult = StepResult.getSuccessComplete(); + try { + //强制打包业务处理 + packageNoGenerateStepService.doForcePrint(reqBean, resultBean, stepResult, packageDataContextList, packageDb); + } catch (ImppBusiException e) { + stepResult.msg(e.getErrorDetail()); + } catch (Exception e) { + String error = String.format("生产线[%s]工位[%s]强制打包%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), fsmRouteDataService.handleFsmCfgOrDefault(reqBean, MesPcnEnumUtil.FSM_CFG.FSM_EXCEPTION_MSG.getCode())); + this.cacheException(reqBean, StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), error, e, false); + stepResult.msg(error); + } + //判断强制打包的执行结果 + if (!StringUtils.isEmpty(stepResult.getMsg())) { + return packResultMap(reqBean, resultBean, resultMap, + String.format("生产线[%s]工位[%s]强制打包失败,%s", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), stepResult.getMsg())); + } + } else { + //删除包装信息 + packageNoGenerateStepService.deletePackageData(reqBean, packageDb, packageDataContextList.get(0).getGenerateType()); + } + + //打包数据移除当前零件的包装信息 + packageDataContextMap.remove(packageDataContext.getPartNo()); + + //页面数据移除当前零件的包装信息 + resultList = resultList.stream().filter(o -> (null != o && !o.getPackageNo().equals(packageDataContext.getPackageNo()))).collect(Collectors.toList()); } - packageDataContextMap.remove(packageDataContext.getPartNo()); + //保存打包数据 productionCustomContextStepService.dispatchPackageDataContext(reqBean, packageDataContextMap); - resultList = resultList.stream().filter(o -> (null != o && !o.getPackageNo().equals(packageDataContext.getPackageNo()))).collect(Collectors.toList()); + //重载页面数据 if (CollectionUtils.isEmpty(resultList)) resultMap.remove(MesPcnExtConstWords.DATA); else resultMap.put(MesPcnExtConstWords.DATA, resultList); + resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT.getValue()); - return packResultMap(reqBean, resultBean, resultMap, String.format("零件号[%s]强制封箱成功!", packageDataContext.getPartNo())); + return packResultMap(reqBean, resultBean, resultMap, String.format("零件号[%s]%s成功!", packageDataContext.getPartNo(), BUSI_TYPE.valueOfDescription(packageDataContext.getBusiType()))); } + //返回提示信息 private Object packResultMap(StationRequestBean reqBean, StationResultBean resultBean, Map resultMap, String message) { this.sendMessage(reqBean, resultBean, message, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); resultMap.put(MesPcnExtConstWords.MESSAGE, message); return resultMap; } - private void doForcePrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, - List packageDataContextList, MesPackage packageDb, Map packageDataContextMap) { + //打包进度页面业务操作 + enum BUSI_TYPE { - } + ONE("1", "强制打包"), + + TWO("2", "删除包装"), + + THREE("3", "修改数量"); + + private String value; + + private String description; + + BUSI_TYPE(String value, String description) { + this.value = value; + + this.description = description; + + } + + public String getValue() { + return value; + } + + public String getDescription() { + return description; + } + + public static String valueOfDescription(String val) { + String tmp = null; + for (int i = 0; i < values().length; i++) { + if (val.equals(values()[i].value)) { + tmp = values()[i].description; + } + } + return tmp; + } + + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortRetrodictStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortRetrodictStepService.java index ac4d690..cf11c6f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortRetrodictStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyMatchNosortRetrodictStepService.java @@ -122,14 +122,11 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService //搜集装配件条码 String assemblySn = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString(); - //未知腔数配置【工位参数】, 不验证装配件条码的个数 - String cavityUnknownCfg = getCavityUnknownCfg(reqBean); - //根据设备代码获取可复用条码的个数 Integer repeatAssemblySnCount = productionCustomContextStepService.getRepeatAssemblySnCount(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), cellEquipContext.getEquipmentCode()); - Integer repeatAssemblySnAmount = repeatAssemblySnCount * (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : 1); - //非未知腔数,验证装配件条码个数是否匹配 腔数或者未匹配的主条码个数*每腔个数 - if (StringUtils.isEmpty(cavityUnknownCfg) && (equipVariableCollectContextList.size() + repeatAssemblySnAmount) != (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity()) * cellEquipContext.getBindQty()) { + Integer repeatAssemblySnAmount = repeatAssemblySnCount * (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity()); + //验证装配件条码个数是否匹配 腔数或者未匹配的主条码个数*每腔个数 + if ((equipVariableCollectContextList.size() + repeatAssemblySnAmount) != (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity()) * cellEquipContext.getBindQty()) { String suffix = repeatAssemblySnAmount == 0 ? MesPcnExtConstWords.EMPTY : String.format(",可复用个数[%s]", repeatAssemblySnAmount); if (!CollectionUtils.isEmpty(curProductionPsInContextList)) { productionDispatchContextStepService.dispatchProductionPsInContext(reqBean, productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).collect(Collectors.toList())); @@ -141,13 +138,16 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService } } + //当前反向匹配最外层的遍历次数 + Integer loopTimes = !CollectionUtils.isEmpty(productionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity(); + //获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组 Map> assemblyNosortCfgMap = doHandleAssemblyNosortCfg(reqBean, resultBean, stepResult, cellEquipContext); //无主条码则无加工规则, 有主条码可能无加工规则 prodRuleContextList = CollectionUtils.isEmpty(prodRuleContextList) ? new ArrayList<>() : prodRuleContextList; //生成零件号业务处理 - prodRuleContextList = doHandleAssemblyGeneratePartNo(reqBean, resultBean, stepResult, cellEquipContext, cavityUnknownCfg, productionProcessContext, productionPsInContextList, prodRuleContextList, assemblyNosortCfgMap, equipVariableCollectContextList); + prodRuleContextList = doHandleAssemblyGeneratePartNo(reqBean, resultBean, stepResult, cellEquipContext, loopTimes, productionProcessContext, productionPsInContextList, prodRuleContextList, assemblyNosortCfgMap, equipVariableCollectContextList); String suffix = !CollectionUtils.isEmpty(curProductionPsInContextList) ? String.format("当前主条码%s", curProductionPsInContextList.stream().filter(o -> null != o).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList()).toString()) : MesPcnExtConstWords.EMPTY; @@ -193,12 +193,6 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService } - //未知腔数配置【工位参数】 - private String getCavityUnknownCfg(StationRequestBean reqBean) { - String cavityUnknownCfg = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_UNKNOWN_CFG); - return (!StringUtils.isEmpty(cavityUnknownCfg) && cavityUnknownCfg.equals(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) ? cavityUnknownCfg : null; - } - //获取设备下所有的装配件规则清单, 根据非排序加工规则ID分组 private Map> doHandleAssemblyNosortCfg(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext) { @@ -224,7 +218,7 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService } //生成零件号业务处理 - private List doHandleAssemblyGeneratePartNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext, String cavityUnknownCfg, + private List doHandleAssemblyGeneratePartNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesCellEquipContext cellEquipContext, Integer loopTimes, MesProductionProcessContext productionProcessContext, List productionPsInContextList, List prodRuleContextList, Map> assemblyNosortCfgMap, List equipVariableCollectContextList) { @@ -235,154 +229,158 @@ public class MesAssemblyMatchNosortRetrodictStepService extends BaseStepService Optional maxForeignKeyOptional = CollectionUtils.isEmpty(prodRuleContextList) ? null : prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProdRuleContext::getForeignKey)); Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO; - //遍历非排序加工规则ID - for (Map.Entry> entry : assemblyNosortCfgMap.entrySet()) { + for (int i = 0; i < loopTimes; i ++) { - if (null == entry) continue; + //遍历非排序加工规则ID + for (Map.Entry> entry : assemblyNosortCfgMap.entrySet()) { - //判断是否存在未消费的装配件条码 - List unConsumeList = equipVariableCollectContextList.stream().filter(o -> (null != o && o.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(unConsumeList)) break; + if (null == entry) continue; - //剔除不扫描/不显示且不扫描/仅目视的数据 - List productionAssemblyNosortContextList = entry.getValue().stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getMatchType()) && MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNeedScan(o.getMatchType()))).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(productionAssemblyNosortContextList)) continue; + //判断是否存在未消费的装配件条码 + List unConsumeList = equipVariableCollectContextList.stream().filter(o -> (null != o && o.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(unConsumeList)) break; - //没有未知腔数配置, 剔除装配件规则个数不等于每腔个数的数据 - if (StringUtils.isEmpty(cavityUnknownCfg) && cellEquipContext.getBindQty().compareTo(productionAssemblyNosortContextList.size()) != 0) continue; + //剔除不扫描/不显示且不扫描/仅目视的数据 + List productionAssemblyNosortContextList = entry.getValue().stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getMatchType()) && MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkIsNeedScan(o.getMatchType()))).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(productionAssemblyNosortContextList)) continue; - //收集未消费的临时数据 - List equipVariableCollectContextListTemp = DeepCloneUtil.deepCloneList(unConsumeList); - if (CollectionUtils.isEmpty(equipVariableCollectContextListTemp)) break; + //剔除装配件规则个数不等于每腔个数的数据 + if (cellEquipContext.getBindQty().compareTo(productionAssemblyNosortContextList.size()) != 0) continue; - //遍历非排序加工规则ID对应的装配件规则清单 - for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) { + //收集未消费的临时数据 + List equipVariableCollectContextListTemp = DeepCloneUtil.deepCloneList(unConsumeList); + if (CollectionUtils.isEmpty(equipVariableCollectContextListTemp)) break; - if (null == productionAssemblyNosortContext) continue; + //遍历非排序加工规则ID对应的装配件规则清单 + for (MesProductionAssemblyNosortContext productionAssemblyNosortContext : productionAssemblyNosortContextList) { - for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextListTemp) { + if (null == productionAssemblyNosortContext) continue; - //已被消费 - if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue; + for (MesEquipVariableCollectContext equipVariableCollectContext : equipVariableCollectContextListTemp) { - //匹配规则 - Map result = numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext); + //已被消费 + if (null == equipVariableCollectContext || equipVariableCollectContext.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue; - //匹配失败 - if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) { - String msg = (String) result.get(MesPcnExtConstWords.MESSAGE); - stepResult.obj(String.format("%s%s", StringUtils.isEmpty(stepResult.getObj()) ? MesPcnExtConstWords.EMPTY : stepResult.getObj(), StringUtils.isEmpty(msg) ? MesPcnExtConstWords.EMPTY : msg)); - continue; - } - - MesProductionAssemblyNosortContext filter = (MesProductionAssemblyNosortContext) result.get(MesPcnExtConstWords.DATA); + //匹配规则 + Map result = numberRuleMatchDispatchService.matchNumberRule(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext); - //前道防错 - if (!StringUtils.isEmpty(filter.getProductSnId()) && !StringUtils.isEmpty(productionAssemblyNosortContext.getPreCraftCode())) { - if (CollectionUtils.isEmpty(productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getAssemblyPartNo(), productionAssemblyNosortContext.getPreCraftCode()))) { - stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), - String.format("零件条码[%s]前道防错零件号[%s]工艺[%s]验证失败,未查询到加工记录信息!", equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getAssemblyPartNo(), productionAssemblyNosortContext.getPreCraftCode()))); + //匹配失败 + if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) { + String msg = (String) result.get(MesPcnExtConstWords.MESSAGE); + stepResult.obj(String.format("%s%s", StringUtils.isEmpty(stepResult.getObj()) ? MesPcnExtConstWords.EMPTY : stepResult.getObj(), StringUtils.isEmpty(msg) ? MesPcnExtConstWords.EMPTY : msg)); continue; } - } - //时效性验证 - if (!StringUtils.isEmpty(filter.getProductSnId())) { - result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), filter.getSourceId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE30.getValue()); - if (!(Boolean)result.get(MesPcnExtConstWords.RESULT)) { - stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), result.get(MesPcnExtConstWords.MESSAGE))); - continue; + MesProductionAssemblyNosortContext filter = (MesProductionAssemblyNosortContext) result.get(MesPcnExtConstWords.DATA); + + //前道防错 + if (!StringUtils.isEmpty(filter.getProductSnId()) && !StringUtils.isEmpty(productionAssemblyNosortContext.getPreCraftCode())) { + if (CollectionUtils.isEmpty(productionRecordService.findProductionRecordList(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getAssemblyPartNo(), productionAssemblyNosortContext.getPreCraftCode()))) { + stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), + String.format("零件条码[%s]前道防错零件号[%s]工艺[%s]验证失败,未查询到加工记录信息!", equipVariableCollectContext.getEquipVariableValue(), productionAssemblyNosortContext.getAssemblyPartNo(), productionAssemblyNosortContext.getPreCraftCode()))); + continue; + } } - } - //验证返回result里面是否存在assemblySn,存在特殊的规则会转换成新的条码 - String assemblySn = !result.containsKey(MesPcnExtConstWords.ASSEMBLY_SN) ? equipVariableCollectContext.getEquipVariableValue() : (String) result.get(MesPcnExtConstWords.ASSEMBLY_SN); + //时效性验证 + if (!StringUtils.isEmpty(filter.getProductSnId())) { + result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), equipVariableCollectContext.getEquipVariableValue(), filter.getSourceId(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE30.getValue()); + if (!(Boolean)result.get(MesPcnExtConstWords.RESULT)) { + stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), result.get(MesPcnExtConstWords.MESSAGE))); + continue; + } + } - //验证规则且唯一/自制件 在当前开模内是否存在重复 - if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkUniqueRuleInMould(productionAssemblyNosortContext.getMatchType()) && !numberRuleMatchDispatchService.checkAssemblySnUniqueInMould(workCenter, prodRuleContextList, productionAssemblyNosortContextList, assemblySn)) { - stepResult.msg(String.format("%s[%s]不能重复装配!", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), assemblySn)); - continue; - } + //验证返回result里面是否存在assemblySn,存在特殊的规则会转换成新的条码 + String assemblySn = !result.containsKey(MesPcnExtConstWords.ASSEMBLY_SN) ? equipVariableCollectContext.getEquipVariableValue() : (String) result.get(MesPcnExtConstWords.ASSEMBLY_SN); - //装配件清单该数据标记已装配 (如果是自制件赋值productSnId) - productionAssemblyNosortContext.assemblyStatus(assemblySn).productSnId(filter.getProductSnId()); + //验证规则且唯一/自制件 在当前开模内是否存在重复 + if (MesExtEnumUtil.ASSEMBLY_MATCH_TYPE.checkUniqueRuleInMould(productionAssemblyNosortContext.getMatchType()) && !numberRuleMatchDispatchService.checkAssemblySnUniqueInMould(workCenter, prodRuleContextList, productionAssemblyNosortContextList, assemblySn)) { + stepResult.msg(String.format("%s[%s]不能重复装配!", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), assemblySn)); + continue; + } - //临时数据标记已消费 - equipVariableCollectContext.isConsume(); + //装配件清单该数据标记已装配 (如果是自制件赋值productSnId) + productionAssemblyNosortContext.assemblyStatus(assemblySn).productSnId(filter.getProductSnId()); - break; + //临时数据标记已消费 + equipVariableCollectContext.isConsume(); - } + break; - String getRepeatAssemblySn = productionCustomContextStepService.getRepeatAssemblySn(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), productionAssemblyNosortContext); - if (!StringUtils.isEmpty(getRepeatAssemblySn)) productionAssemblyNosortContext.assemblyStatus(getRepeatAssemblySn); + } - //判断当前装配件规则是否被成功匹配条码 - if (productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0) break; + String getRepeatAssemblySn = productionCustomContextStepService.getRepeatAssemblySn(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), productionAssemblyNosortContext); + if (!StringUtils.isEmpty(getRepeatAssemblySn)) productionAssemblyNosortContext.assemblyStatus(getRepeatAssemblySn); - } + //判断当前装配件规则是否被成功匹配条码 + if (productionAssemblyNosortContext.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0) break; - //判断当前装配件规则清单是否完全匹配剩余未消费的条码 - Optional optionalRule = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst(); - if (null != optionalRule && optionalRule.isPresent()) continue; + } - //验证加工规则是否有效 - MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContextByPid(new MesProdRuleContext( - reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).pid(productionAssemblyNosortContextList.get(0).getPid())); + //判断当前装配件规则清单是否完全匹配剩余未消费的条码 + Optional optionalRule = productionAssemblyNosortContextList.stream().filter(o -> (null != o && o.getAssemblyStatus().compareTo(MesExtEnumUtil.ASSEMBLY_STATUS.ASSEMBLY_STATUS_30.getValue()) == 0)).findFirst(); + if (null != optionalRule && optionalRule.isPresent()) continue; - //根据PID获取非排序加工规则 数据无效 - if (null == prodRuleContext) continue; + //验证加工规则是否有效 + MesProdRuleContext prodRuleContext = prodRuleCfgExtService.getProdRuleNosortContextByPid(new MesProdRuleContext( + reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode(), productionProcessContext.getCraftCode()).pid(productionAssemblyNosortContextList.get(0).getPid())); - Boolean productSnIsMatchFlag = false; - String errMsg = MesPcnExtConstWords.EMPTY; - if (!CollectionUtils.isEmpty(productionPsInContextList)) { + //根据PID获取非排序加工规则 数据无效 + if (null == prodRuleContext) continue; - for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { + Boolean productSnIsMatchFlag = false; + String errMsg = MesPcnExtConstWords.EMPTY; + if (!CollectionUtils.isEmpty(productionPsInContextList)) { - if (null == productionPsInContext || !StringUtils.isEmpty(productionPsInContext.getForeignKey()) || productionPsInContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue; + for (MesProductionPsInContext productionPsInContext : productionPsInContextList) { - //验证主条码是否满足当前匹配成功的产品加工规则 - Map result = checkPsInIsMatchProdRule(reqBean.getOrganizeCode(), productionPsInContext, prodRuleContext); - if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) { - errMsg = (String) result.get(MesPcnExtConstWords.MESSAGE); - continue; - } + if (null == productionPsInContext || !StringUtils.isEmpty(productionPsInContext.getForeignKey()) || productionPsInContext.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) continue; - //时效性验证 - if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) { - result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), prodRuleContext.getPid(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE20.getValue()); + //验证主条码是否满足当前匹配成功的产品加工规则 + Map result = checkPsInIsMatchProdRule(reqBean.getOrganizeCode(), productionPsInContext, prodRuleContext); if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) { errMsg = (String) result.get(MesPcnExtConstWords.MESSAGE); continue; } - } - productSnIsMatchFlag = true; - errMsg = MesPcnExtConstWords.EMPTY; + //时效性验证 + if (!StringUtils.isEmpty(productionPsInContext.getPartNo())) { + result = timeEfficientCfgMatchService.checkSnTimeliness(reqBean.getOrganizeCode(), productionPsInContext.getProductSn(), prodRuleContext.getPid(), MesExtEnumUtil.TIME_DATA_SOURCE.DATA_SOURCE20.getValue()); + if (!(Boolean) result.get(MesPcnExtConstWords.RESULT)) { + errMsg = (String) result.get(MesPcnExtConstWords.MESSAGE); + continue; + } + } + + productSnIsMatchFlag = true; + errMsg = MesPcnExtConstWords.EMPTY; + + //主条码赋值数据关联键 + productionPsInContext.foreignKey(foreignKey += 1); + break; - //主条码赋值数据关联键 - productionPsInContext.foreignKey(foreignKey += 1); - break; + } } - } + if (!productSnIsMatchFlag && !CollectionUtils.isEmpty(productionPsInContextList)) { + stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), errMsg)); + continue; + } - if (!productSnIsMatchFlag && !CollectionUtils.isEmpty(productionPsInContextList)) { - stepResult.msg(String.format("%s%s", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg(), errMsg)); - continue; - } + //装配件条码标记被消费状态 + productionAssemblyNosortContextList.forEach(o -> { + Optional evccOp = equipVariableCollectContextList.stream().filter(v -> (null != v && v.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && v.getEquipVariableValue().equals(o.getAssemblySn()))).findFirst(); + if (null != evccOp && evccOp.isPresent()) evccOp.get().isConsume(); + }); - //装配件条码标记被消费状态 - productionAssemblyNosortContextList.forEach(o -> { - Optional evccOp = equipVariableCollectContextList.stream().filter(v -> (null != v && v.getIsConsume().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 && v.getEquipVariableValue().equals(o.getAssemblySn()))).findFirst(); - if (null != evccOp && evccOp.isPresent()) evccOp.get().isConsume(); - }); + //加工规则赋值装配件数据 + prodRuleContext.assemblyDataJson(productionAssemblyNosortContextList).foreignKey(!productSnIsMatchFlag ? foreignKey += 1 : foreignKey); - //加工规则赋值装配件数据 - prodRuleContext.assemblyDataJson(productionAssemblyNosortContextList).foreignKey(!productSnIsMatchFlag ? foreignKey += 1 : foreignKey); + prodRuleContextList.add(prodRuleContext); - prodRuleContextList.add(prodRuleContext); + } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyScanStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyScanStepService.java index f4da625..f06168f 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyScanStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyScanStepService.java @@ -133,7 +133,7 @@ public class MesAssemblyScanStepService extends BaseStepService { if (!CollectionUtils.isEmpty(cachedEquipVariableCollectContextList)) productionDispatchContextStepService.removeScanAssemblySnContext(reqBean); //当前已扫描的装配件条码数量 + 可复用数量 * 当前未匹配的主条码数量 - repeatAssemblySnAmount = repeatAssemblySnCount * (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : 1); + repeatAssemblySnAmount = repeatAssemblySnCount * (!CollectionUtils.isEmpty(curProductionPsInContextList) ? curProductionPsInContextList.size() : cellEquipContext.getCavity()); Integer scanedQty = (!CollectionUtils.isEmpty(cachedEquipVariableCollectContextList) ? cachedEquipVariableCollectContextList.size() : MesPcnExtConstWords.ZERO) + repeatAssemblySnAmount; //判断当前已存在数量是否超过需要数量 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 index 745824e..8460540 100644 --- 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 @@ -9,15 +9,13 @@ import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepServ import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.print.IPrintTemplateStrategyService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method.IMesPackageNoGenerateStepService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; -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.context.*; 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.mes.pcn.util.StringUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; import cn.estsh.i3plus.platform.common.tool.MathOperation; import cn.estsh.i3plus.platform.common.tool.TimeTool; @@ -39,8 +37,6 @@ 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.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -117,10 +113,17 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements //获取上下文产出条码数据信息集合 List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); - if (CollectionUtils.isEmpty(productionPsOutContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!"); + //获取上下文产品加工规则数据信息集合 + List prodRuleContextList = productionDispatchContextStepService.getProdRuleDataContext(reqBean); - //产出条码根据零件号分组 - Map> productSnMap2Part = productionPsOutContextList.stream().filter(o -> null != o) + if (CollectionUtils.isEmpty(productionPsOutContextList) || CollectionUtils.isEmpty(prodRuleContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!"); + + //在加工规则中搜集可以打包的数据的数据关联键集合 + List foreignKeyList = prodRuleContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsPackage()) && o.getIsPackage().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).map(MesProdRuleContext::getForeignKey).collect(Collectors.toList()); + + //搜集数据关联键集合对应的[合格状态]的产出条码,根据零件号分组 + Map> productSnMap2Part = productionPsOutContextList.stream() + .filter(o -> (null != o && o.getQcStatus().compareTo(MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue()) == 0 && foreignKeyList.contains(o.getForeignKey()))) .collect(Collectors.groupingBy(MesProductionPsOutContext::getPartNo, Collectors.mapping(MesProductionPsOutContext::getProductSn, Collectors.toList()))); //获取包装规则信息 @@ -146,7 +149,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements packageRuleContext = !CollectionUtils.isEmpty(packageDataContextList) ? packageDataContextList.get(0) : packageRuleContextMap.get(entry.getKey()); } else { //获取包装规则信息 - packageRuleContext = getPackageRuleContext(reqBean, entry.getKey()); + packageRuleContext = getPackageRuleContext(reqBean, stepResult, entry.getKey(), false); } //无生产过程打包规则时, 忽略当前零件 @@ -172,7 +175,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements //生成包装及明细, 根据标包数量判断是否执行打印 [递归] stepResult.setDataCollection(new ArrayList()); - packageDataContextList = doHandlePackagePrint(reqBean, stepResult, packageRuleContext, packageDataContextList, entry.getValue()); + packageDataContextList = doHandlePackagePrint(reqBean, stepResult, packageRuleContext, packageDataContextList, entry.getValue(), false); //更新实时的打包数据 if (CollectionUtils.isEmpty(packageDataContextMap)) packageDataContextMap = new HashMap<>(); @@ -184,6 +187,12 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements doPrintPackageNo(reqBean, resultBean, stepResult, packageRuleContext, labelTemplate, strategyService, (List) stepResult.getDataCollection(), false); } + log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- PART:{} --- CACHED:{} --- PACKAGE:{}", + reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), + StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), entry.getKey(), + CollectionUtils.isEmpty(packageDataContextList) ? MesPcnExtConstWords.SQUARE_BRACKETS : JSONObject.toJSONString(packageDataContextList), + CollectionUtils.isEmpty(stepResult.getDataCollection()) ? MesPcnExtConstWords.SQUARE_BRACKETS : JSONObject.toJSONString(stepResult.getDataCollection())); + } //保存包装规则信息 @@ -196,28 +205,40 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements } //获取包装规则信息 - private MesPackageRuleContext getPackageRuleContext(StationRequestBean reqBean, String partNo) { + @Override + public MesPackageRuleContext getPackageRuleContext(StationRequestBean reqBean, StepResult stepResult, String partNo, Boolean isAsyn) { + + String message; //根据 物料代码,零件类型=包装物 查询成品包装明细规则 - 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); + List packingRuleDetailList = packingRuleService.getPackingRuleDetailList(reqBean.getOrganizeCode(), partNo, MesExtEnumUtil.PACKING_RULE_DETAIL_PART_TYPE.P.getValue()); + if (CollectionUtils.isEmpty(packingRuleDetailList)) { + message = String.format("零件编码[%s]未配置包装物类型的成品包装明细规则信息!", partNo); + if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + else stepResult.msg(message); 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); + //根据包装代码查询成品包装规则 + List packingRuleList = packingRuleService.getPackingRuleList(reqBean.getOrganizeCode(), + packingRuleDetailList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPackageCode()))).map(MesPackingRuleDetail::getPackageCode).collect(Collectors.toList())); + + //过滤成品包装规则, 取默认包装对应的数据 + MesPackingRule packingRule = filterPackingRule(packingRuleList); + if (null == packingRule) { + message = String.format("零件编码[%s]未配置成品包装规则信息!", partNo); + if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + else stepResult.msg(message); 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); + //根据默认包装获取成品包装明细规则 + MesPackingRuleDetail packingRuleDetail = filterPackingRuleDetail(packingRuleDetailList, packingRule); + if (StringUtils.isEmpty(packingRuleDetail.getPackageCode()) || + StringUtils.isEmpty(packingRuleDetail.getPackSpecQty()) || MathOperation.compareTo(packingRuleDetail.getPackSpecQty(), new Double(0)) == 0) { + message = String.format("零件编码[%s]配置包装物类型的成品包装明细规则信息中必要信息无效:包装代码[%s]包装规格数量[%s]!", partNo, packingRuleDetail.getPackageCode(), packingRuleDetail.getPackSpecQty()); + if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + else stepResult.msg(message); return null; } @@ -228,20 +249,22 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements //如果 packageBarcodeRule || packageTemplate || printer 有一个为空, 则需要根据 箱类别代号查询包装定义, 但是 printer 不进行强验证,可能是否的是默认打印机 if (StringUtils.isEmpty(generateTypeName) || (StringUtils.isEmpty(packingRule.getPackCode()) && (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate)))) { - 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); + message = String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置的成品包装规则信息中必要信息无效:统计方式[%s]箱类别代号[%s]!", + partNo, packingRuleDetail.getPackageCode(), StringUtils.isEmpty(generateTypeName) ? MesPcnExtConstWords.EMPTY : generateTypeName, packingRule.getPackCode()); + if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + else stepResult.msg(message); return null; } + //根据箱类别代号查询包装定义 + MesPackingDefine packingDefine = StringUtils.isEmpty(packingRule.getPackCode()) ? null : packingRuleService.getPackingDefine(reqBean.getOrganizeCode(), packingRule.getPackCode()); + //判断是否需要查询包装定义 if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate) || StringUtils.isEmpty(printer)) { - //根据箱类别代号查询包装定义 - MesPackingDefine packingDefine = StringUtils.isEmpty(packingRule.getPackCode()) ? null : - packingRuleService.getPackingDefine(reqBean.getOrganizeCode(), packingRule.getPackCode()); if (null == packingDefine && (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate))) { - 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); + message = String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置成品包装规则信息中的箱类别代号[%s]未维护包装定义信息!", partNo, packingRuleDetail.getPackageCode(), packingRule.getPackCode()); + if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + else stepResult.msg(message); return null; } @@ -252,9 +275,9 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements //此时 packageBarcodeRule || packageTemplate 仍有一个为空则 记录日志 忽略当前零件的打包 if (StringUtils.isEmpty(packageBarcodeRule) || StringUtils.isEmpty(packageTemplate)) { - 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); + message = String.format("零件编码[%s]包装物类型对应的包装代码[%s]配置的成品包装规则信息中必要信息无效:编码规则[%s]模版[%s]打印机[%s]!", partNo, packingRuleDetail.getPackageCode(), packageBarcodeRule, packageTemplate, printer); + if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), message, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + else stepResult.msg(message); return null; } } @@ -266,12 +289,14 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements packageRuleContext.setPackageBarcodeRule(packageBarcodeRule); packageRuleContext.setPackageTemplate(packageTemplate); packageRuleContext.setPrinter(printer); + if (null == packingDefine || StringUtils.isEmpty(packingDefine.getIsSendAries()) || + packingDefine.getIsSendAries().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) packageRuleContext.setSystemSyncStatusWms(MesPcnExtConstWords.ZERO); return packageRuleContext; } //生成包装及明细, 根据标包数量判断是否执行打印 [递归] - private List doHandlePackagePrint(StationRequestBean reqBean, StepResult stepResult, - MesPackageRuleContext packageRuleContext, List packageDataContextList, List productSnList) { + private List doHandlePackagePrint(StationRequestBean reqBean, StepResult stepResult, MesPackageRuleContext packageRuleContext, + List packageDataContextList, List productSnList, Boolean isAsyn) { //缓存的包装条码明细数量 Integer cachedQty = CollectionUtils.isEmpty(packageDataContextList) ? MesPcnExtConstWords.ZERO : packageDataContextList.size(); @@ -291,21 +316,22 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements productSnList2Remain = productSnList.subList(needQty, productSnList.size()); } + //当前的实际打包数量 = 缓存的包装条码明细数量 + 当前满足标包的差额条码的个数 + Integer curQty = cachedQty + productSnList2Cur.size(); + MesPackage packageDb = null; //判断是否存在缓存的包装条码明细信息,如果进行递归则已无包装条码, 则重新生成信息的包装条码 if (!CollectionUtils.isEmpty(packageDataContextList)) packageDb = getMesPackage(reqBean.getOrganizeCode(), packageDataContextList.get(0).getPackageId()); //缓存中的包装条码也可能在DB中已被删除, 所以这里直接判断 包装条码信息是否为空则生成包装条码信息 - if (null == packageDb) packageDb = insertMesPackage(reqBean, packageRuleContext); + if (null == packageDb) packageDb = insertMesPackage(reqBean, packageRuleContext, curQty, isAsyn); //如果包装条码未空, 说明上面生成包装条码的时候 根据编码规则生成出现问题, 则直接退出, 记录日志, 忽略当前零件的打包 if (null == packageDb) return null; - //当前的实际打包数量 = 缓存的包装条码明细数量 + 当前满足标包的差额条码的个数 - Integer curQty = cachedQty + productSnList2Cur.size(); - //判断当前是否满包 - Boolean isSealed = curQty >= packageRuleContext.getPackSpecQty().intValue(); + //判断当前是否满包, isAsyn=false代表是工位按钮零件打包触发,零头也直接封箱 + Boolean isSealed = !isAsyn ? curQty >= packageRuleContext.getPackSpecQty().intValue() : true; //判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态 - packageDb = savePackageDb(reqBean, packageDb, curQty, isSealed, true); + packageDb = savePackageDb(reqBean, packageDb, curQty, isSealed, isAsyn); //判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据 List resultList = insertPackageDetailAndBackUnSealedResultList(reqBean, packageRuleContext, packageDb, productSnList2Cur, isSealed); @@ -320,7 +346,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements if (CollectionUtils.isEmpty(productSnList2Remain)) return resultList; //传递剩余条码进行递归处理: 此时packageDataContextList直接为null - return doHandlePackagePrint(reqBean, stepResult, packageRuleContext, null, productSnList2Remain); + return doHandlePackagePrint(reqBean, stepResult, packageRuleContext, null, productSnList2Remain, isAsyn); } @@ -329,9 +355,18 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements public MesPackage getMesPackage(String organizeCode, Long packageId) { return packageExtService.getMesPackage(organizeCode, packageId); } //生成包装条码信息 - private MesPackage insertMesPackage(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext) { + private MesPackage insertMesPackage(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext, Integer curQty, Boolean isAsyn) { + + //封装流水号入参对象 + GenSerialNoModel serialNoModel = new GenSerialNoModel(packageRuleContext.getPackageBarcodeRule()) + .putDataMap(MesPackageRuleContext.class.getSimpleName(), packageRuleContext) + .partNo(packageRuleContext.getPartNo()).basicInfo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + //后面的savePackageDb那边只判断了跨天封箱情况下才会重新生成包装条码, 所以这里如果是正常工步创建则使用标包数量,如是是零件打包创建则使用实际数量生成包装条码,因为可能存在零头数量 + if (isAsyn) serialNoModel.putDataMap(MesPcnExtConstWords.QTY, new Double(curQty)); + //根据编码规则生成包装条码 - String packageNo = doGereratePackageNo(reqBean, packageRuleContext); + String packageNo = doGereratePackageNo(reqBean, serialNoModel, isAsyn); if (StringUtils.isEmpty(packageNo)) return null; MesPackage packageDb = new MesPackage(); packageDb.setPackageNo(packageNo); @@ -339,6 +374,7 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements packageDb.setPartName(packageRuleContext.getPartName()); packageDb.setQty(new Double(1)); packageDb.setPackSpecQty(packageRuleContext.getPackSpecQty()); + packageDb.setGenerateType(packageRuleContext.getGenerateType()); packageDb.setUnit(packageRuleContext.getUnit()); packageDb.setLotNo(TimeTool.getToday()); packageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); @@ -350,12 +386,17 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements packageDb.setPackageLabelTemplate(packageRuleContext.getPackageTemplate()); packageDb.setFid(UUID.randomUUID().toString()); packageDb.setOrganizeCode(reqBean.getOrganizeCode()); + packageDb.setSystemSyncStatusWms(packageRuleContext.getSystemSyncStatusWms()); ConvertBean.serviceModelInitialize(packageDb, reqBean.getUserInfo()); + //一维码是在编码规则的策略中调用transform方法生成的, 暂存到dataMap中,key=包装条码 + if (!CollectionUtils.isEmpty(serialNoModel.getDataMap()) && serialNoModel.getDataMap().containsKey(packageNo)) { + packageDb.setPackageOneCode(serialNoModel.getDataMap().get(packageNo).toString()); + } return packageDb; } //判断包装条码是否存在ID进行新增或者更新操作, 如果满足标包则标记满包状态跟打印状态 - private MesPackage savePackageDb(StationRequestBean reqBean, MesPackage packageDb, Integer curQty, Boolean isSealed, Boolean isSave) { + private MesPackage savePackageDb(StationRequestBean reqBean, MesPackage packageDb, Integer curQty, Boolean isSealed, Boolean isAsyn) { if (!StringUtils.isEmpty(packageDb.getId())) { //下面直接根据ID进行修改, 所以此处置为游离态 @@ -370,25 +411,37 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements packageDb.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue()); } - if (!isSave) return packageDb; - if (StringUtils.isEmpty(packageDb.getId())) return packageRepository.insert(packageDb); + Boolean unChangePackageNo = !isSealed ? true : TimeTool.getToday().equals(packageDb.getLotNo()); + if (!unChangePackageNo) { + //包装条码中因为含有批次号, 隔天封箱需要重新生成包装条码 + //封装流水号入参对象 + GenSerialNoModel serialNoModel = new GenSerialNoModel(packageDb.getPackageLabelTemplate()) + .putDataMap(MesPcnExtConstWords.QTY, packageDb.getQty()) + .putDataMap(MesPcnExtConstWords.UNIT, packageDb.getUnit()) + .partNo(packageDb.getPartNo()).basicInfo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + //根据编码规则生成包装条码 + String packageNo = doGereratePackageNo(reqBean, serialNoModel, isAsyn); + if (!StringUtils.isEmpty(packageNo)) { + String sourcePackageNo = packageDb.getPackageNo(); + packageDb.setPackageNo(packageNo); + if (!CollectionUtils.isEmpty(serialNoModel.getDataMap()) && serialNoModel.getDataMap().containsKey(packageNo)) { + packageDb.setPackageOneCode(serialNoModel.getDataMap().get(packageNo).toString()); + } + packageDb.setRemark(String.format("封箱跨天,原包装条码:%s", sourcePackageNo)); + //替换包装明细数据的包装条码 + savePackageDetailDbByPackageNo(reqBean, packageDb, sourcePackageNo); + } + } + + //更新操作 savePackageDbById(reqBean, packageDb); return packageDb; } - private void savePackageDbById(StationRequestBean reqBean, MesPackage 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}); - } - //判断统计方式,是否生成包装明细信息, 返回当前未满包的包装条码明细数据 private List insertPackageDetailAndBackUnSealedResultList(StationRequestBean reqBean, MesPackageRuleContext packageRuleContext, MesPackage packageDb, List productSnList2Cur, Boolean isSealed) { @@ -438,22 +491,26 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements } //根据编码规则生成包装条码 - 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()); + private String doGereratePackageNo(StationRequestBean reqBean, GenSerialNoModel serialNoModel, Boolean isAsyn) { 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); + if (!isAsyn) this.sendMessage(reqBean, new StationResultBean().writeDbLog(), e.getErrorDetail(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + else MesPcnException.throwBusiException(e.getErrorDetail()); } 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); + if (!isAsyn) { + 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); + } else { + this.cacheException(reqBean, reqBean.getStepName(), webMsg, e, false); + MesPcnException.throwBusiException(webMsg); + } } return null; } + //进行打印 private void doPrintPackageNo(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageRuleContext packageRuleContext, MesLabelTemplate labelTemplate, IPrintTemplateStrategyService strategyService, List packageList, Boolean isAsyn) { if (null == strategyService) { @@ -508,14 +565,126 @@ public class MesPackageNoGenerateStepService extends BaseStepService implements printedSnLogRepository.saveAll(printModel.getMesPrintedSnLogList()); } + //强制打包业务处理 @Override - @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {ImppBusiException.class, Exception.class}) public void doForcePrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List packageDataContextList, MesPackage packageDb) { - savePackageDb(reqBean, packageDb, packageDataContextList.size(), true, false); + //包装条码中因为含有包装数量, 故强制打包需要重新生成包装条码 + //封装流水号入参对象 + GenSerialNoModel serialNoModel = new GenSerialNoModel(packageDataContextList.get(0).getPackageBarcodeRule()) + .putDataMap(MesPcnExtConstWords.QTY, new Double(packageDataContextList.size())) + .putDataMap(MesPcnExtConstWords.UNIT, packageDb.getUnit()) + .partNo(packageDb.getPartNo()).basicInfo(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + + //根据编码规则生成包装条码 + String packageNo = doGereratePackageNo(reqBean, serialNoModel, true); + if (StringUtils.isEmpty(packageNo)) MesPcnException.throwBusiException("根据编码规则[%s]生成包装条码失败!", serialNoModel.getRuleCode()); + + //下面直接根据ID进行修改, 所以此处置为游离态 + entityManager.detach(packageDb); + ConvertBean.serviceModelUpdate(packageDb, reqBean.getUserInfo()); + packageDb.setQty(new Double(packageDataContextList.size())); + packageDb.setLotNo(TimeTool.getToday()); + packageDb.setIsSealed(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); + packageDb.setPrintStatus(MesExtEnumUtil.PRINT_STATUS.PRINTED.getValue()); + packageDb.setPackageNo(packageNo); + if (!CollectionUtils.isEmpty(serialNoModel.getDataMap()) && serialNoModel.getDataMap().containsKey(packageNo)) { + packageDb.setPackageOneCode(serialNoModel.getDataMap().get(packageNo).toString()); + } + packageDb.setRemark(String.format("强制封箱,原包装条码:%s", packageDataContextList.get(0).getPackageNo())); + List packageList = new ArrayList<>(); packageList.add(packageDb); + //进行打印 doPrintPackageNo(reqBean, resultBean, stepResult, packageDataContextList.get(0), null, null, packageList, true); + //更新操作 savePackageDbById(reqBean, packageDb); + + //替换包装明细数据的包装条码 + savePackageDetailDbByPackageNo(reqBean, packageDb, packageDataContextList.get(0).getPackageNo()); + } + + //替换包装明细数据的包装条码 + private void savePackageDetailDbByPackageNo(StationRequestBean reqBean, MesPackage packageDb, String sourcePackageNo) { + packageDetailRepository.updateByPropertiesNoSync( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.PACKAGE_NO}, + new Object[]{reqBean.getOrganizeCode(), sourcePackageNo}, + new String[]{MesPcnExtConstWords.PACKAGE_NO, MesPcnExtConstWords.REMARK, + MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, + new Object[]{packageDb.getPackageNo(), packageDb.getRemark(), + packageDb.getModifyUser(), packageDb.getModifyDatetime(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}); + } + + //更新操作 + private void savePackageDbById(StationRequestBean reqBean, MesPackage packageDb) { + packageRepository.updateByPropertiesNoSync( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.ID}, + new Object[]{reqBean.getOrganizeCode(), packageDb.getId()}, + new String[]{MesPcnExtConstWords.PACKAGE_NO, MesPcnExtConstWords.PACKAGE_ONE_CODE, MesPcnExtConstWords.QTY, + MesPcnExtConstWords.IS_SEALED, MesPcnExtConstWords.PRINT_STATUS, MesPcnExtConstWords.LOT_NO, MesPcnExtConstWords.REMARK, + MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, + new Object[]{packageDb.getPackageNo(), packageDb.getPackageOneCode(), packageDb.getQty(), + packageDb.getIsSealed(), packageDb.getPrintStatus(), packageDb.getLotNo(), packageDb.getRemark(), + packageDb.getModifyUser(), packageDb.getModifyDatetime(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}); + } + + //删除包装信息 + @Override + public void deletePackageData(StationRequestBean reqBean, MesPackage packageDb, Integer generateType) { + int count = packageRepository.updateByPropertiesNoSync( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.ID, MesPcnExtConstWords.IS_SEALED}, + new Object[]{reqBean.getOrganizeCode(), packageDb.getId(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()}, + new String[]{MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, + new Object[]{CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}); + if (count == 0 || generateType.compareTo(MesExtEnumUtil.PACKING_RULE_GENERATE_TYPE.PACKAGE.getValue()) == 0) return; + packageDetailRepository.updateByPropertiesNoSync( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.PACKAGE_NO}, + new Object[]{reqBean.getOrganizeCode(), packageDb.getPackageNo()}, + new String[]{MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, + new Object[]{CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(), reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}); + } + + //修改包装信息的数量 + @Override + public void savePackageData(StationRequestBean reqBean, MesPackage packageDb, Double qty) { + packageRepository.updateByPropertiesNoSync( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.ID, MesPcnExtConstWords.IS_SEALED}, + new Object[]{reqBean.getOrganizeCode(), packageDb.getId(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()}, + new String[]{MesPcnExtConstWords.QTY, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, + new Object[]{qty, reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}); + } + + //过滤成品包装规则, 取默认包装对应的数据 + private MesPackingRule filterPackingRule(List packingRuleList) { + if (CollectionUtils.isEmpty(packingRuleList)) return null; + if (packingRuleList.size() == 1) return packingRuleList.get(0); + Optional optional = packingRuleList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getDefaultFlag()) && o.getDefaultFlag().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).findFirst(); + return (null != optional && optional.isPresent()) ? optional.get() : null; + } + + //根据默认包装获取成品包装明细规则 + private MesPackingRuleDetail filterPackingRuleDetail(List packingRuleDetailList, MesPackingRule packingRule) { + if (CollectionUtils.isEmpty(packingRuleDetailList)) return null; + if (packingRuleDetailList.size() == 1) return packingRuleDetailList.get(0); + Optional optional = packingRuleDetailList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPackageCode()) && o.getPackageCode().equals(packingRule.getPackageCode()))).findFirst(); + return (null != optional && optional.isPresent()) ? optional.get() : null; + } + + //零件打包业务处理 + @Override + public void doHandlePackagePart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageDataContext packageDataContext) { + //生成包装及明细, 根据标包数量判断是否执行打印 [递归] + doHandlePackagePrint(reqBean, stepResult, packageDataContext, null, generateVirtualPs(packageDataContext.getQty()), true); + //进行打印 + doPrintPackageNo(reqBean, resultBean, stepResult, packageDataContext, null, null, (List) stepResult.getDataCollection(), true); + } + + //生成虚拟条码,零件打包不写包装明细数据, 只是为了适配工步中的方法去递归生成包装条码 + private List generateVirtualPs(Double qty) { + List virtualPsList = new ArrayList<>(); + for (int i = 0; i < qty.intValue(); i ++) { + virtualPsList.add(String.valueOf(i)); + } + return virtualPsList; } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/IMesPackageNoGenerateStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/IMesPackageNoGenerateStepService.java index 1e9b2d6..ced96d8 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/IMesPackageNoGenerateStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/method/IMesPackageNoGenerateStepService.java @@ -1,11 +1,13 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.method; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageDataContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesPackageRuleContext; import cn.estsh.i3plus.pojo.mes.bean.MesPackage; 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 io.swagger.annotations.ApiOperation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -13,8 +15,26 @@ import java.util.List; public interface IMesPackageNoGenerateStepService { + @ApiOperation(value = "根据包装ID查询包装信息") MesPackage getMesPackage(String organizeCode, Long packageId); - + @ApiOperation(value = "强制打包业务处理") + @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {ImppBusiException.class, Exception.class}) void doForcePrint(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List packageDataContextList, MesPackage packageDb); + + @ApiOperation(value = "删除包装信息") + @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {ImppBusiException.class, Exception.class}) + void deletePackageData(StationRequestBean reqBean, MesPackage packageDb, Integer generateType); + + @ApiOperation(value = "修改包装信息的数量") + @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {ImppBusiException.class, Exception.class}) + void savePackageData(StationRequestBean reqBean, MesPackage packageDb, Double qty); + + @ApiOperation(value = "获取包装规则信息") + MesPackageRuleContext getPackageRuleContext(StationRequestBean reqBean, StepResult stepResult, String partNo, Boolean isAsyn); + + @ApiOperation(value = "零件打包业务处理") + @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {ImppBusiException.class, Exception.class}) + void doHandlePackagePart(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesPackageDataContext packageDataContext); + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/resources/application-wuhan-prod2.properties b/modules/i3plus-ext-mes-pcn-apiservice/src/main/resources/application-wuhan-prod2.properties new file mode 100644 index 0000000..896e07e --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/resources/application-wuhan-prod2.properties @@ -0,0 +1,292 @@ +#\u9879\u76EE\u7AEF\u53E3 +server.port=8350 +#\u672C\u673Aip +impp.server.ip=localhost +#impp.server.ip=192.168.0.105 +#andon ip +impp.andon.url=http://10.195.88.71:8750 +#ptl-pcn ip +impp.ptl-pcn.url=http://10.195.88.71:8750 +#pcn plc\u5168\u5C40\u4E1A\u52A1\u5F00\u5173 1.yfai-hnc +mes.plc.callback.open=123 +#console\u63A7\u5236\u53F0\u670D\u52A1\uFF08zipkin\u8FFD\u8E2A\u5168\u8DEF\u5F84\uFF09 +impp.console.ip=http://10.195.88.71:8010 +################ \u529F\u80FD\u914D\u7F6E1 ################ +#\u5DE5\u4F5C\u533AID,\u4E0D\u540C\u670D\u52A1\u5668\u4E0D\u540CID 0 - 31 +impp.snowflake.work.id=22 +#\u6570\u636E\u4ED3\u533AID 0 - 31 \u6709\u9ED8\u8BA4\u56FA\u5B9AID +impp.snowflake.database.id=22 +#\u82E5\u65E0\u6CD5\u8FDE\u63A5\u6CE8\u518C\u4E2D\u5FC3\uFF0C\u662F\u5426\u9700\u8981\u4E00\u76F4\u68C0\u6D4B\u52A0\u5165 +impp.cluster.fetch=false +#\u670D\u52A1\u6CE8\u518C\u4E2D\u5FC3 +impp.cluster.regist.center=http://10.195.88.71:8000/eureka/ +#\u65E5\u5FD7\u9ED8\u8BA4\u4F7F\u7528log4j2 +logging.config=classpath:log4j2-spring.xml +mes.ws=ws://10.197.190.121:8300/ws/pcn-regist/ +#mes-pcn.ws.path=ws://10.197.176.77:8350 +mes-pcn.ws.path=ws://localhost:8350 +pcn.code=PCN-U7 +########\u5E73\u53F0\u76F8\u5173\u53C2\u6570########## +#\u662F\u5426\u5F00\u5x42Fredis\u7F13\u5B58 +impp.config.redis=true +#\u662F\u5426\u5F00\u542FrabbitMQ +impp.config.rabbitmq=false +#\u662F\u5426\u5F00\u542Fswagger +impp.config.swagger=true +#\u662F\u5426\u5F00\u542Fwebsocket +impp.config.websocket=true +#\u662F\u5426\u5F00\u542F\u6587\u4EF6\u670D\u52A1 +impp.config.fileserver=false +#\u662F\u5426\u5BF9\u53D1\u5E03\u670D\u52A1\u8FDB\u884C\u8BE6\u7EC6\u65E5\u5FD7\u5206\u6790 +impp.log.detail.controller=true +#\u662F\u5426\u5BF9\u8C03\u7528\u670D\u52A1\u8FDB\u884C\u8BE6\u7EC6\u65E5\u5FD7\u5206\u6790 +impp.log.detail.service=true +################ \u961F\u5217\u5904\u7406 ################ +#\u7AD9\u5185\u4FE1 +impp.mq.queue.letter=true +#\u90AE\u4EF6 +impp.mq.queue.mail=true +#\u5B9A\u65F6\u4EFB\u52A1 +impp.mq.queue.schedule=true +#SWEB\u901A\u77E5\u5904\u7406\u961F\u5217 +impp.mq.queue.sweb.notice=true +################################ \u5176\u4ED6\u529F\u80FD\u8BBE\u7F6E ################################ +#redisIP +redis.hostName=10.195.88.71 +#\u7AEF\u53E3\u53F7 +redis.port=6379 +#\u5982\u679C\u6709\u5BC6\u7801 +redis.password=Admin123! +##\u5176\u4ED6redis\u914D\u7F6E\u9700\u8981\u8C03\u6574\u7684\u52A0\u5728\u6B64\u5904 +################## rabbitMQ\u914D\u7F6E #################### +spring.rabbitmq.vhost=/ +spring.rabbitmq.host=10.195.88.71 +spring.rabbitmq.port=5672 +spring.rabbitmq.username=estsh +spring.rabbitmq.password=estsh123 +##\u5176\u4ED6rabbitMq\u914D\u7F6E\u9700\u8981\u8C03\u6574\u7684\u52A0\u5728\u6B64\u5904 +################ \u529F\u80FD\u914D\u7F6E2 ################ +#\u662F\u5426\u5F00\u542Fredis +mes.pcn.redis.open=true +#\u662F\u5426\u5141\u8BB8\u524D\u7AEF\u8DE8\u57DF\u63D0\u4EA4 +impp.web.cross=true +################ \u6388\u6743\u8FC7\u6EE4\u914D\u7F6E ################ +#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84 +filter.shiro.user.filteruri=/mes-pcn/operate/* +#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84 +filter.shiro.admin.filteruri=/mes-pcn/adoperate/* +#\u7528\u6237\u6388\u6743\u8FC7\u6EE4\u8DEF\u5F84 +filter.shiro.saadmin.filteruri=/mes-pcn/saoperate/* +################ \u4E91\u914D\u7F6E \uFF08\u4EE5projectName\u4F5C\u4E3A\u5E94\u7528\u540D\uFF09 ################ +#\u662F\u5426\u5F00\u542F\u5FAE\u670D +eureka.client.enabled=false +#\uFF08\u53C2\u6570\u914D\u7F6E\uFF09\u6CE8\u518C\u4E2D\u5FC3\u5730\u5740 -\u300B i3plus-ics\uFF0C\u591A\u4E2A\u7528\u9017\u53F7\u5206\u9694 +eureka.client.service-url.defaultZone=${impp.cluster.regist.center} +#\u533A\u57DF\uFF08\u6E90\u7801\u4E2D\u5305\u542BdefaultZone\uFF0C\u6241\u4EE5\u9ED8\u8BA4\u4F7F\u7528defaultZone\uFF09 +#eureka.client.region=estsh +#eureka.client.service-url.estsh:http://192.168.1.20:8000/eureka/,http://192.168.1.20:8001/eureka/ +################ \u672C\u673A\u5FAE\u670D\u914D\u7F6E ################ +#\u672C\u670D\u52A1\u4E3B\u673Aip\uFF08\u82E5\u591A\u4E2A\u7F51\u5361\uFF0C\u5219\u9700\u8981\u8BBE\u7F6E\u672C\u670D\u52A1ip\uFF09 +eureka.instance.ip-address=${impp.server.ip} +#\u672C\u670D\u52A1\u5B9E\u4F8BID +eureka.instance.instance-id=${impp.server.ip}:${server.port} +#\u672C\u670D\u52A1\u4E3B\u673A\u540D +eureka.instance.hostname=${impp.server.ip} +#\u672C\u670D\u52A1\u72B6\u6001\u9875\u9762 +eureka.instance.status-page-url=http://${impp.server.ip}:${server.port}/swagger-ui.html +#\u5C06\u81EA\u5DF1\u7684IP\u6CE8\u518C\u5230Eureka Server\u3002\u82E5\u4E0D\u914D\u7F6E\u6216\u8BBE\u7F6E\u4E3Afalse\uFF0C\u8868\u793A\u6CE8\u518C\u5FAE\u670D\u52A1\u6241\u5728\u64CD\u4F5C\u7CFB\u7EDF\u7684hostname\u5230Eureka Server +eureka.instance.prefer-ip-address=false +#\u662F\u5426\u8FDB\u884C\u5065\u5EB7\u68C0\u67E5 +eureka.client.healthcheck.enabled=true +################ \u68C0\u6D4B\u673A\u5236 ################ +#\u5FC3\u8DF3\u95F4\u9694\u5468\u671F\uFF0C\u5B95\u673A\u9650\u5236\uFF08\u79D2\uFF09\uFF0C30\u79D2\u6CA1\u53CD\u5E94\u89C6\u4E3A\u5B95\u673A +eureka.instance.lease-expiration-duration-in-seconds=30 +#\u5FC3\u8DF3\u5468\u671F +eureka.instance.lease-renewal-interval-in-seconds=20 +#client\u8FDE\u63A5Eureka\u670D\u52A1\u7AEF\u540E\u7684\u7A7A\u95F2\u7B49\u5F85\u65F6\u95F4\uFF0C\u9ED8\u8BA4\u4E3A30 \u79D2 +eureka.client.eureka-connection-idle-timeout-seconds=1 +#\u6700\u521D\u590D\u5236\u5B9E\u4F8B\u4FE1\u606F\u5230eureka\u670D\u52A1\u5668\u6241\u9700\u7684\u65F6\u95F4\uFF08s\uFF09\uFF0C\u9ED8\u8BA4\u4E3A40\u79D2 +eureka.client.initial-instance-info-replication-interval-seconds=1 +#\u95F4\u9694\u591A\u957F\u65F6\u95F4\u518D\u6B21\u590D\u5236\u5B9E\u4F8B\u4FE1\u606F\u5230eureka\u670D\u52A1\u5668\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2 +eureka.client.instance-info-replication-interval-seconds=1 +#\u4ECEeureka\u670D\u52A1\u5668\u6CE8\u518C\u8868\u4E2D\u83B7\u53D6\u6CE8\u518C\u4FE1\u606F\u7684\u65F6\u95F4\u95F4\u9694\uFF08s\uFF09\uFF0C\u9ED8\u8BA4\u4E3A30\u79D2 +eureka.client.registry-fetch-interval-seconds=1 +################ \u6253\u5F00feign\u7684\u7194\u65AD ################ +feign.hystrix.enabled=true +#\u8BFB\u53D6\u6570\u636E\u65F6\u957F +ribbon.ReadTimeout=10000 +#\u8FDE\u63A5\u65F6\u957F +ribbon.ConnectTimeout=10000 +#\u91CD\u8BD5 +ribbon.maxAutoRetries=2 +#\u54CD\u5E94\u8D85\u8FC7\u65F6\u957F\uFF0C\u8FDB\u884C\u7194\u65AD\uFF08\u7194\u65AD\u8D85\u65F6\u9700\u8981\u5927\u4E8E\u8BFB\u53D6\u65F6\u957F\u53CA\u8FDE\u63A5\u65F6\u957F\uFF09 +hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=15000 +#\u96C6\u7FA4\u540D +eureka.instance.metadata-map.cluster=impp_cluster +################ \u94FE\u8DEF\u8FFD\u8E2A ################ +#\u4F7F\u7528web\u65B9\u5F0F\u4F20\u8F93\u4FE1\u606F +spring.zipkin.sender.type=web +#\u94FE\u8DEF\u8FFD\u8E2A\u670D\u52A1\u7684\u5730\u5740 +spring.zipkin.base-url=${impp.console.ip} +#\u8FFD\u8E2A\u6DF1\u5EA6\uFF0C\u767E\u5206\u6BD4\uFF0C1\u662F\u5168\u90E8 +spring.sleuth.sampler.probability=1.0 + +# mysql +#impp.write.datasource.type=com.zaxxer.hikari.HikariDataSource +#impp.write.datasource.driver-class-name=com.mysql.jdbc.Driver +#impp.write.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8 +#impp.write.datasource.username=root +#impp.write.datasource.password=estsh123 +#impp.read.datasource.type=com.zaxxer.hikari.HikariDataSource +#impp.read.datasource.driver-class-name=com.mysql.jdbc.Driver +#impp.read.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8 +#impp.read.datasource.username=root +#impp.read.datasource.password=estsh123 +# + +###########################\u8BFB\u5199\u5206\u79BB####################################### + +spring.shardingsphere.datasource.names=master,slave +##\u5199\u5E93 +spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource +spring.shardingsphere.datasource.master.driver-class-name= com.mysql.jdbc.Driver +spring.shardingsphere.datasource.master.JdbcUrl=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8 +spring.shardingsphere.datasource.master.username=root +spring.shardingsphere.datasource.master.password=estsh123 + +spring.shardingsphere.datasource.master.maximum-pool-size=400 +spring.shardingsphere.datasource.master.minimum-idle=200 +spring.shardingsphere.datasource.master.idle-timeout=500000 +spring.shardingsphere.datasource.master.connection-timeout=600000 +spring.shardingsphere.datasource.master.max-lifetime=7000000 +spring.shardingsphere.datasource.master.connection-test-query=select 1 +spring.shardingsphere.datasource.master.keep-alive-time=3500000 + +##\u8BFB\u5E93 +spring.shardingsphere.datasource.slave.type=com.zaxxer.hikari.HikariDataSource +spring.shardingsphere.datasource.slave.driver-class-name= com.mysql.jdbc.Driver +spring.shardingsphere.datasource.slave.JdbcUrl=jdbc:mysql://10.195.88.71:3316/impp_i3_mes?autoReconnect=true&useSSL=false&characterEncoding=utf-8 +spring.shardingsphere.datasource.slave.username=root +spring.shardingsphere.datasource.slave.password=estsh123 + +spring.shardingsphere.datasource.slave.maximum-pool-size=200 +spring.shardingsphere.datasource.slave.minimum-idle=200 +spring.shardingsphere.datasource.slave.idle-timeout=500000 +spring.shardingsphere.datasource.slave.connection-timeout=600000 +spring.shardingsphere.datasource.slave.max-lifetime=7000000 +spring.shardingsphere.datasource.slave.connection-test-query=select 1 +spring.shardingsphere.datasource.slave.keep-alive-time=3500000 + +##\u8BFB\u5199\u5206\u79BB\u914D\u7F6E +spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name=master +spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names=slave + +#\u9ED8\u8BA4datasource \u9ED8\u8BA4\u6570\u636E\u6E90\uFF0C\u672A\u5206\u7247\u7684\u8868\u9ED8\u8BA4\u6267\u884C\u5E93 +#spring.shardingsphere.sharding.default-data-source-name=ds0 +#\u7CFB\u7EDF\u5C5E\u6027\uFF0C\u663E\u793A\u6B63\u5E38\u7684sql\u8BED\u53E5 +spring.shardingsphere.props.sql.show=false + +#spring.shardingsphere.sharding.tables.mes_equipment_log.actual-data-nodes=ds0.mes_equipment_log_$->{[152,156,300]} +spring.shardingsphere.sharding.tables.mes_equipment_log.actual-data-nodes=ds0.mes_equipment_log_$->{1..300} + +spring.shardingsphere.sharding.tables.mes_equipment_log.table-strategy.inline.sharding-column=equip_id +spring.shardingsphere.sharding.tables.mes_equipment_log.table-strategy.inline.algorithm-expression=mes_equipment_log_$->{equip_id} + +#spring.shardingsphere.sharding.tables.mes_equipment_log_detail.actual-data-nodes=ds0.mes_equipment_log_detail_$->{[152,156,300]} +spring.shardingsphere.sharding.tables.mes_equipment_log_detail.actual-data-nodes=ds0.mes_equipment_log_detail_$->{1..500} +spring.shardingsphere.sharding.tables.mes_equipment_log_detail.table-strategy.inline.sharding-column=equip_id +spring.shardingsphere.sharding.tables.mes_equipment_log_detail.table-strategy.inline.algorithm-expression=mes_equipment_log_detail_$->{equip_id} + +#\u7ED1\u5B9A\u8868 +spring.shardingsphere.sharding.binding-tables[0]=mes_equipment_log,mes_equipment_log_detail + +#\u4E2D\u822A\u6570\u636E\u6E90 +##############\u5B9A\u65F6\u4EFB\u52A1\u6301\u4E45\u5316############## +impp.schedule.open=true +impp.schedule.datasource.driver-class-name=com.mysql.jdbc.Driver +impp.schedule.datasource.jdbc-url=jdbc:mysql://10.195.88.71:3306/impp_i3_schedule?autoReconnect=true&useSSL=false&characterEncoding=utf-8 +impp.schedule.datasource.username=root +impp.schedule.datasource.password=estsh123 +impp.schedule.datasource.max-connections=20 +#\u5B9A\u65F6\u4EFB\u52A1\u5728\u670D\u52A1\u542F\u52A8\u540E\u591A\u5C11\u79D2\u6267\u884C +impp.schedule.start.after-second=20 +#\u662F\u5426\u96C6\u7FA4\u90E8\u7F72 +impp.schedule.datasource.is-clustered=true +#\u6267\u884C\u68C0\u6D4B\uFF08\u6BEB\u79D2\uFF09\uFF0C\u82E5\u5B95\u673A\u7531\u5176\u4ED6\u5B9A\u65F6\u5668\u6267\u884C +impp.schedule.datasource.cluster-checkin-interval=30000 +#\u7EBF\u7A0B\u6570 +impp.schedule.thread-count=10 +#\u7EBF\u7A0B\u4F18\u5148\u7EA7\uFF081-10\uFF09\u9ED8\u8BA4\u4E3A5 +impp.schedule.thread-priority=5 +################ \u6570\u636E\u6C60\u8BBE\u7F6E ################ +## \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF0C\u9ED8\u8BA4\u662F10 +spring.datasource.maximum-pool-size=100 +## \u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5\u6570\u91CF +spring.datasource.min-idle=10 +################ JPA\u8BBE\u7F6E\u8BBE\u7F6E ################ +# mysql +spring.jpa.database=MYSQL +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect +##Sql-server## +#spring.jpa.database=sql_server +#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServerDialect +##oracle## +#spring.jpa.database=oracle +#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect +# mysql +#spring.datasource.validationQuery=SELECT 1 +##Sql-server## +spring.datasource.validationQuery=SELECT 1 +##oracle## +# spring.datasource.validationQuery=SELECT 1 FROM DUAL +#ImprovedNamingStrategy / physical_naming_strategy java\u5C5E\u6027\u6620\u5C04\u5230\u6570\u636E\u5E93\u5B57\u6BB5\u65F6\u547D\u540D\u89C4\u5219 +# spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy/org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl +#\u8868\u5173\u7CFBcreate,create-drop,update,validate +spring.jpa.properties.hibernate.hbm2ddl.auto=update +#spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy +#spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl +#\u662F\u5426\u663E\u793Asql +spring.jpa.show-sql=true +################ \u6388\u6743\u914D\u7F6E ################ +slm.api.password=4C9479EBEFA6FA6E232EF25EFA49C4D2 +slm.app.id=20190513 +# \u811A\u672C\u5728\u7EBF\u8C03\u8BD5\u751F\u6210\u7684\u65E5\u5FD7\u6587\u4EF6\u76F8\u5BF9\u8DEF\u5F84\uFF0Cclasspath:xx +pcn.script.logger.path=pluginlogs +pcn.schedule.job=false + +server.tomcat.max-threads=300 +server.tomcat.max-connections=300 +plugin.mainPackage=cn.estsh.i3plus + +impp.xxlJob.admin.enable=true +impp.schedule.scheduleType=xxljob +xxl.job.admin.addresses=http://10.195.88.71:10010/xxl-job-admin +### xxl-job, access token +xxl.job.accessToken= +### xxl-job executor appname +#xxl.job.executor.appname=${project.name} +xxl.job.executor.appname=i3mes-pcn +### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null +xxl.job.executor.address= +### xxl-job executor server-info +xxl.job.executor.ip=10.195.88.71 +#xxl.job.executor.ip= +xxl.job.executor.port=12345 +### xxl-job executor log-path +xxl.job.executor.logpath= +### xxl-job executor log-retention-days +xxl.job.executor.logretentiondays=10 +xxl.job.basePackage=cn.estsh.i3plus.lac.scheduler.schedulejob + + +mqtt.host=tcp://10.195.88.71:1883 +mqtt.userName=estsh +mqtt.passWord=estsh123 +mqtt.qos=1 +mqtt.clientId=pcn +mqtt.timeout=10 +mqtt.keepalive=30 +mqtt.clearSession=true +pcn.mqtt.flag = true +mqtt.topic.list=ABC,ABD,ADE +xxl.job.execute.methodName=executeImppJob,execute 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 index 5b5b281..71c6088 100644 --- 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 @@ -34,9 +34,15 @@ public class MesPackageDataContext extends MesPackageRuleContext implements Seri @ApiParam("打包结束时间") private String modifyDatetime; + @ApiParam("业务操作类型") + private String busiType; + + @ApiParam("加工单号") + private String workOrderNo; + public MesPackageDataContext() {} - public MesPackageDataContext(String partNo, String partName, String packageNo, Double qty, Double packSpecQty, String createDatetime, String modifyDatetime) { + public MesPackageDataContext(String partNo, String partName, String packageNo, Double qty, Double packSpecQty, String createDatetime, String modifyDatetime, Integer generateType) { this.partNo = partNo; this.partName = partName; this.packageNo = packageNo; @@ -44,5 +50,12 @@ public class MesPackageDataContext extends MesPackageRuleContext implements Seri this.packSpecQty = packSpecQty; this.createDatetime = createDatetime; this.modifyDatetime = modifyDatetime; + this.generateType = generateType; + } + + public MesPackageDataContext qty(Double qty, String modifyDatetime) { + this.qty = qty; + this.modifyDatetime = modifyDatetime; + return this; } } 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 index fd0f933..980dcdd 100644 --- 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 @@ -58,4 +58,7 @@ public class MesPackageRuleContext implements Serializable { @ApiParam(name = "打印机") public String printer; + @ApiParam(name = "同步状态WMS") + public Integer systemSyncStatusWms = 2; + } 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 e9d756c..04a9ada 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 @@ -246,6 +246,8 @@ public class MesPcnExtConstWords { public static final String CUST_ORDER_NO = "custOrderNo"; //包装条码 public static final String PACKAGE_NO = "packageNo"; + //包装一维码 + public static final String PACKAGE_ONE_CODE = "packageOneCode"; //包条码 public static final String PACKAGE_SN = "packageSn"; //包类型 @@ -323,6 +325,10 @@ public class MesPcnExtConstWords { public static final String UNIT = "unit"; //包装规格数量 public static final String PACK_SPEC_QTY = "packSpecQty"; + //动态列名 + public static final String ATTR_BEAN_LIST = "ATTR_BEAN_LIST"; + //支持允许前端开窗选零件 + public static final String IS_SELECT_PART = "IS_SELECT_PART"; //BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties)