From 7f6b9e8ece15852568c08149a8586a0ca7ca9e92 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Fri, 14 Jun 2024 12:36:07 +0800 Subject: [PATCH] step --- .../mes/pcn/api/busi/IMesProduceSnExtService.java | 12 + .../IMesProductionCustomContextStepService.java | 52 ++++ .../IMesProductionDispatchContextStepService.java | 66 ------ .../mes/pcn/api/busi/IMesWorkOrderExtService.java | 4 - .../serviceimpl/busi/MesProduceSnExtService.java | 53 ++++- .../serviceimpl/busi/MesWorkOrderExtService.java | 10 - .../MesFunctionChooseCavityOrderService.java | 6 +- .../function/MesFunctionProductionLockService.java | 9 +- .../MesFunctionProductionUnlockService.java | 8 +- .../step/MesAssemblyReadStepService.java | 14 +- .../step/MesAssemblyScanStepService.java | 8 +- .../step/MesAssemblyShowNosortStepService.java | 21 +- .../step/MesCountDownShowStepService.java | 17 +- .../serviceimpl/step/MesEndStepService.java | 28 +-- .../step/MesFirstMouldNoReadStepService.java | 41 ++-- .../step/MesMouldNoReadStepService.java | 21 +- .../step/MesProductResultReadStepService.java | 14 +- .../step/MesProductSnCheckNosortStepService.java | 146 ++++++++++++ .../step/MesProductSnCheckSortStepService.java | 175 ++++++++++++++ .../step/MesProductSnCheckStepService.java | 126 +--------- .../step/MesProductSnReadStepService.java | 56 +++-- .../step/MesProductSnScanNosortStepService.java | 261 +++++++++++++++++++++ .../step/MesProductSnScanSortStepService.java | 153 ++++++++++++ .../step/MesProductSnScanStepService.java | 178 ++------------ .../step/MesProductionPartNoReadStepService.java | 14 +- .../step/MesReadySignalReadStepService.java | 14 +- .../step/MesWorkOrderCheckNosortStepService.java | 118 +++------- .../step/MesWorkOrderCheckSortStepService.java | 139 ++--------- .../step/MesWorkOrderCheckStepService.java | 120 +++++++++- .../step/MesWorkOrderReadStepService.java | 16 +- .../step/MesWorkOrderScanStepService.java | 17 +- .../MesProductionCustomContextStepService.java | 143 +++++++++++ .../MesProductionDispatchContextStepService.java | 137 +---------- .../MesProductionProcessContextStepService.java | 9 +- .../mes/pcn/pojo/context/MesCellEquipContext.java | 2 +- .../pcn/pojo/context/MesProductionPartContext.java | 17 +- .../pcn/pojo/context/MesProductionPsInContext.java | 45 +++- .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 22 +- 38 files changed, 1409 insertions(+), 883 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckNosortStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckSortStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java index 10b9c96..a66bab0 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProduceSnExtService.java @@ -1,17 +1,29 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import io.swagger.annotations.ApiOperation; import java.util.List; +import java.util.Map; public interface IMesProduceSnExtService { @ApiOperation(value = "根据零件条码查询零件条码信息") List getProduceSnList(String organizeCode, List productSnList); + @ApiOperation(value = "根据零件条码查询零件条码信息") + Map> getProduceSnMap(String organizeCode, List productSnList); + + @ApiOperation(value = "根据零件条码,生产线,工位查询工位队列信息") + List getQueueOrderList(String organizeCode, String workCenterCode, String workCellCode, List productSnList); + + @ApiOperation(value = "根据零件条码,生产线,工位查询工位队列信息") + Map> getQueueOrderMap(String organizeCode, String workCenterCode, String workCellCode, List productSnList); + @ApiOperation(value = "根据零件条码ID修改条码状态,工位") void saveProduceSnList(StationRequestBean reqBean, Integer snStatus, List idList); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java new file mode 100644 index 0000000..623857c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java @@ -0,0 +1,52 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.pojo.mes.model.StationKvBean; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +/** + * 获取生产过程上下文对象接口【BUSI】 + */ +public interface IMesProductionCustomContextStepService { + + @ApiOperation(value = "验证上下文工位加工锁是否存在") + Boolean checkProductionLockIsExistContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存上下文加工锁") + Boolean saveProductionLockContext(StationRequestBean reqBean, String value); + + @ApiOperation(value = "删除上下文加工锁") + void deleteProductionLockContext(StationRequestBean reqBean); + + @ApiOperation(value = "发送设备质量信息") + void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext); + + @ApiOperation(value = "存储上个扫描/读取信息") + Boolean saveLastScanContext(StationRequestBean reqBean, List dataList); + + @ApiOperation(value = "获取上个扫描/读取信息") + List getLastScanContext(StationRequestBean reqBean); + + @ApiOperation(value = "发送工步内容") + void doSendStepContextMessage(StationRequestBean reqBean); + + @ApiOperation(value = "发送工步内容") + void doSendStepContextMessage(StationRequestBean reqBean, String scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE source); + + @ApiOperation(value = "发送工步内容") + void sendStepContextMessage(StationRequestBean reqBean, List resultList); + + @ApiOperation(value = "获取手动选择的腔数及工单信息上下文") + List getFunctionChooseCavityOrderContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存手动选择的腔数及工单信息上下文", notes = "[StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=1)]") + Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List resultList); + + @ApiOperation(value = "删除手动选择的腔数及工单信息上下文") + void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java index 0729b95..8f7a377 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionDispatchContextStepService.java @@ -2,11 +2,9 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.pojo.mes.bean.MesPart; -import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; -import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import io.swagger.annotations.ApiOperation; import java.util.List; @@ -17,39 +15,12 @@ import java.util.Map; */ public interface IMesProductionDispatchContextStepService { - @ApiOperation(value = "验证上下文工位加工锁是否存在") - Boolean checkProductionLockIsExistContext(StationRequestBean reqBean); - - @ApiOperation(value = "保存上下文加工锁") - Boolean saveProductionLockContext(StationRequestBean reqBean, String value); - - @ApiOperation(value = "删除上下文加工锁") - void deleteProductionLockContext(StationRequestBean reqBean); - - @ApiOperation(value = "发送设备质量信息") - void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext); - @ApiOperation(value = "存储展示组件MODULE_CONTENT内容") Boolean saveModuleContentContext(StationRequestBean reqBean, List> dataList); @ApiOperation(value = "获取展示组件MODULE_CONTENT内容") List> getModuleContentContext(StationRequestBean reqBean); - @ApiOperation(value = "存储上个扫描/读取信息") - Boolean saveLastScanContext(StationRequestBean reqBean, List dataList); - - @ApiOperation(value = "获取上个扫描/读取信息") - List getLastScanContext(StationRequestBean reqBean); - - @ApiOperation(value = "发送工步内容") - void doSendStepContextMessage(StationRequestBean reqBean); - - @ApiOperation(value = "发送工步内容") - void doSendStepContextMessage(StationRequestBean reqBean, String scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE source); - - @ApiOperation(value = "发送工步内容") - void sendStepContextMessage(StationRequestBean reqBean, List resultList); - @ApiOperation(value = "获取上下文加工结果") String getProductResultContext(StationRequestBean reqBean); @@ -233,15 +204,6 @@ public interface IMesProductionDispatchContextStepService { @ApiOperation(value = "删除上下文工位加工数统计信息") void deleteProductionStatisticsContext(StationRequestBean reqBean); - @ApiOperation(value = "获取手动选择的腔数及工单信息上下文") - List getFunctionChooseCavityOrderContext(StationRequestBean reqBean); - - @ApiOperation(value = "保存手动选择的腔数及工单信息上下文", notes = "[StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=1)]") - Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List resultList); - - @ApiOperation(value = "删除手动选择的腔数及工单信息上下文") - void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean); - @ApiOperation(value = "获取料桶原材料数据集合") List getMesRawPartChargingDataContext(StationRequestBean reqBean); @@ -251,32 +213,4 @@ public interface IMesProductionDispatchContextStepService { @ApiOperation(value = "删除料桶原材料数据集合") void deleteMesRawPartChargingDataContext(StationRequestBean reqBean); - - - - - - - - - - - - @Deprecated - @ApiOperation(value = "获取上下文产出条码数据信息集合") - List getOutProduceSnDataContext(StationRequestBean reqBean); - - @Deprecated - @ApiOperation(value = "验证上下文产出条码数据信息集合是否存在") - Boolean checkOutProduceSnDataIsExistContext(StationRequestBean reqBean); - - @Deprecated - @ApiOperation(value = "保存上下文产出条码数据信息集合", notes = "[JSON]List") - Boolean saveOutProduceSnDataContext(StationRequestBean reqBean, List outProduceSnDataList); - - @Deprecated - @ApiOperation(value = "删除上下文产出条码数据信息集合") - void deleteOutProduceSnDataContext(StationRequestBean reqBean); - - } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java index 3040c08..83adedf 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesWorkOrderExtService.java @@ -4,14 +4,10 @@ import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import io.swagger.annotations.ApiOperation; import java.util.List; -import java.util.Map; public interface IMesWorkOrderExtService { @ApiOperation(value = "根据生产工单号集合 查询生产工单数据") List getWorkOrderList(String organizeCode, List workOrderNoList); - @ApiOperation(value = "根据生产工单号集合 查询生产工单数据") - Map getWorkOrderMap(String organizeCode, List workOrderNoList); - } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java index 4d3dcbd..cdaf2e1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProduceSnExtService.java @@ -7,18 +7,17 @@ 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.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesQueueOrderRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.TreeSet; +import java.util.*; import java.util.stream.Collectors; @Slf4j @@ -28,13 +27,16 @@ public class MesProduceSnExtService implements IMesProduceSnExtService { @Autowired private MesProduceSnRepository produceSnRepository; + @Autowired + private MesQueueOrderRepository queueOrderRepository; + //根据零件条码查询零件条码信息 @Override public List getProduceSnList(String organizeCode, List productSnList) { if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(productSnList)) return null; - productSnList = productSnList.size() == 1 ? productSnList : productSnList.stream().filter(o -> StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + productSnList = productSnList.size() == 1 ? productSnList : productSnList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); if (productSnList.size() == 1) DdlPreparedPack.getStringEqualPack(productSnList.get(0), MesPcnExtConstWords.PRODUCT_SN, packBean); @@ -42,8 +44,45 @@ public class MesProduceSnExtService implements IMesProduceSnExtService { //根据创建时间倒叙查询零件条码 DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean); - //相同零件条码可能会存在多条数据, 所以去重 - return distinctProduceSnList(produceSnRepository.findByHqlWhere(packBean)); + return produceSnRepository.findByHqlWhere(packBean); + } + + //根据零件条码查询零件条码信息 + @Override + public Map> getProduceSnMap(String organizeCode, List productSnList) { + + List produceSnList = getProduceSnList(organizeCode, productSnList); + //先排序再分组 + return CollectionUtils.isEmpty(produceSnList) ? null : + produceSnList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesProduceSn::getCreateDatetime).reversed()).collect(Collectors.groupingBy(MesProduceSn::getProductSn)); + + } + + //根据零件条码,生产线,工位查询工位队列信息 + @Override + public List getQueueOrderList(String organizeCode, String workCenterCode, String workCellCode, List productSnList) { + + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(productSnList)) return null; + + productSnList = productSnList.size() == 1 ? productSnList : productSnList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode, MesPcnExtConstWords.WORK_CENTER_CODE, packBean); + DdlPreparedPack.getStringEqualPack(workCellCode, MesPcnExtConstWords.WORK_CELL_CODE, packBean); + if (productSnList.size() == 1) DdlPreparedPack.getStringEqualPack(productSnList.get(0), MesPcnExtConstWords.PRODUCT_SN, packBean); + else DdlPreparedPack.getInPackList(productSnList, MesPcnExtConstWords.PRODUCT_SN, packBean); + + return queueOrderRepository.findByHqlWhere(packBean); + } + + //根据零件条码,生产线,工位查询工位队列信息 + @Override + public Map> getQueueOrderMap(String organizeCode, String workCenterCode, String workCellCode, List productSnList) { + + List queueOrderList = getQueueOrderList(organizeCode, workCenterCode, workCellCode, productSnList); + //先排序再分组 + return CollectionUtils.isEmpty(queueOrderList) ? null : queueOrderList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesQueueOrder::getProductSn)); + } private List distinctProduceSnList(List produceSnDataList) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java index db278f3..2a6b8df 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesWorkOrderExtService.java @@ -13,7 +13,6 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; @Slf4j @@ -39,13 +38,4 @@ public class MesWorkOrderExtService implements IMesWorkOrderExtService { } - //根据生产工单号集合 查询生产工单数据 - @Override - public Map getWorkOrderMap(String organizeCode, List workOrderNoList) { - - List workOrderList = getWorkOrderList(organizeCode, workOrderNoList); - - return CollectionUtils.isEmpty(workOrderList) ? null : workOrderList.stream().filter(o -> null != o).collect(Collectors.toMap(MesWorkOrder::getWorkOrderNo, o -> o)); - - } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseCavityOrderService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseCavityOrderService.java index 7e44d5a..bb658d1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseCavityOrderService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionChooseCavityOrderService.java @@ -1,6 +1,6 @@ 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.IMesProductionCustomContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; @@ -36,7 +36,7 @@ public class MesFunctionChooseCavityOrderService extends BaseSwsService implemen private IMesProductionProcessContextStepService productionProcessContextStepService; @Autowired - private IMesProductionDispatchContextStepService productionDispatchContextStepService; + private IMesProductionCustomContextStepService productionCustomContextStepService; @Autowired private IShippingDispatchService shippingDispatchService; @@ -65,7 +65,7 @@ public class MesFunctionChooseCavityOrderService extends BaseSwsService implemen } //保存手动选择的腔数及工单信息上下文 - productionDispatchContextStepService.saveFunctionChooseCavityOrderContext(reqBean, resultList); + productionCustomContextStepService.saveFunctionChooseCavityOrderContext(reqBean, resultList); this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s成功,请等待验证! 提交信息[%s]", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName(), buttonDynamicModel.getFunctionValue()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionProductionLockService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionProductionLockService.java index ba430ae..ec0d9a4 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionProductionLockService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionProductionLockService.java @@ -1,10 +1,9 @@ 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.IMesProductionCustomContextStepService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.MesCountDownShowStepService; 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.IStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.function.IFsmModuleFunctionService; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; @@ -23,17 +22,17 @@ import org.springframework.util.StringUtils; public class MesFunctionProductionLockService extends BaseSwsService implements IFsmModuleFunctionService { @Autowired - private IMesProductionDispatchContextStepService productionDispatchContextStepService; + private IMesProductionCustomContextStepService productionCustomContextStepService; @Override public boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { //保存上下文加工锁 - productionDispatchContextStepService.saveProductionLockContext(reqBean, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()); + productionCustomContextStepService.saveProductionLockContext(reqBean, CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()); if (StringUtils.isEmpty(buttonDynamicModel.getParamCode()) || !buttonDynamicModel.getParamCode().equals(MesPcnExtConstWords.ATUO_PRODUCTION_LOCK)) { - ((MesCountDownShowStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).checkCellProductionLockIsExist(reqBean, resultBean, false, false, true); + ((MesCountDownShowStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).checkCellProductionLockIsExist(reqBean, resultBean, false, true); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionProductionUnlockService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionProductionUnlockService.java index 97562e6..0c346bf 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionProductionUnlockService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionProductionUnlockService.java @@ -1,6 +1,6 @@ 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.IMesProductionCustomContextStepService; import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.MesCountDownShowStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseSwsService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IShippingDispatchService; @@ -21,7 +21,7 @@ import org.springframework.stereotype.Service; public class MesFunctionProductionUnlockService extends BaseSwsService implements IFsmModuleFunctionService { @Autowired - private IMesProductionDispatchContextStepService productionDispatchContextStepService; + private IMesProductionCustomContextStepService productionCustomContextStepService; @Autowired private IShippingDispatchService shippingDispatchService; @@ -30,9 +30,9 @@ public class MesFunctionProductionUnlockService extends BaseSwsService implement public boolean doFunction(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { //删除上下文加工锁 - productionDispatchContextStepService.deleteProductionLockContext(reqBean); + productionCustomContextStepService.deleteProductionLockContext(reqBean); - ((MesCountDownShowStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).checkCellProductionLockIsExist(reqBean, resultBean, false, false, false); + ((MesCountDownShowStepService) SpringContextsUtil.getBean("mesCountDownShowStepService")).checkCellProductionLockIsExist(reqBean, resultBean, false, false); this.sendMessage(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]%s成功!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), buttonDynamicModel.getButtonName()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyReadStepService.java index f862e29..4148caa 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyReadStepService.java @@ -1,10 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesMouldMultiCavityService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; -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.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipLogDispatchContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; @@ -45,6 +42,9 @@ public class MesAssemblyReadStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired private IMesEquipmentLogExtService equipmentLogExtService; @Autowired @@ -57,7 +57,7 @@ public class MesAssemblyReadStepService extends BaseStepService { public StepResult init(StationRequestBean reqBean) { //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + productionCustomContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -113,7 +113,7 @@ public class MesAssemblyReadStepService extends BaseStepService { this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); //验证设备通信质量 - productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); + productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); @@ -144,7 +144,7 @@ public class MesAssemblyReadStepService extends BaseStepService { //发送工步内容 String scanInfo = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)); - productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + productionCustomContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前已读取到设备[%s]装配件条码信息[%s]!", cellEquipContext.getEquipmentCode(), scanInfo)); 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 12a79ba..89fdf14 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 @@ -1,5 +1,6 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; @@ -32,10 +33,13 @@ public class MesAssemblyScanStepService extends BaseStepService { @Autowired private IMesProductionDispatchContextStepService productionDispatchContextStepService; + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + @Override public StepResult guide(StationRequestBean reqBean) { - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + productionCustomContextStepService.doSendStepContextMessage(reqBean); return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描装配件条码!"); @@ -66,7 +70,7 @@ public class MesAssemblyScanStepService extends BaseStepService { productionDispatchContextStepService.saveScanAssemblySnContext(reqBean, getAssemblySnJson(reqBean, scanInfo)); //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN); + productionCustomContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN); return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息装配件条码[%s]!", scanInfo)); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java index 2091e52..ccbfdba 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java @@ -84,16 +84,13 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { doHandleProdRuleData(reqBean, resultBean, stepResult, workCenter, cellEquipContext, prodRuleContextList, productionPartContextList, productionPsInContextList); - //保存上下文产品加工规则信息集合 if (prodRuleContextList.size() != initSize) { + //保存上下文产品加工规则信息集合 productionDispatchContextStepService.saveProdRuleDataContext(reqBean, prodRuleContextList); - if (!CollectionUtils.isEmpty(productionPartContextList)) { - productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList); - } - - if (!CollectionUtils.isEmpty(productionPsInContextList)) { - productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); - } + //保存上下文产出零件信息 + if (!CollectionUtils.isEmpty(productionPartContextList)) productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList); + //保存进料主条码数据 + if (!CollectionUtils.isEmpty(productionPsInContextList)) productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); } //显示装配件信息 @@ -222,7 +219,9 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { //获取匹配产出零件的所有加工规则 List outPartNoProdRuleList = !CollectionUtils.isEmpty(prodRuleNosortCfgMap) ? prodRuleNosortCfgMap.get(productionPartContext.getPartNo()) : null; + MesProdRuleNosortCfg filter = null; + Optional optional = productionPsInContextList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getForeignKey()))).findFirst(); if (null == optional || !optional.isPresent()) break; @@ -276,7 +275,6 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { Map productionPartMap = productionPartContextList.stream().filter(o -> null != o && o.getForeignKey() != null).collect(Collectors.toMap(MesProductionPartContext::getForeignKey, o -> o)); - for (MesProdRuleContext prodRuleContext : prodRuleContextList) { if (null == prodRuleContext || StringUtils.isEmpty(prodRuleContext.getAssemblyDataJson())) continue; @@ -312,11 +310,10 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { private List getAssemblyShowContextList(MesCellEquipContext cellEquipContext, List productionAssemblyContextList, MesProdRuleContext prodRuleContext, String workOrderNo) { if (CollectionUtils.isEmpty(productionAssemblyContextList)) return null; List assemblyShowContextList = new ArrayList<>(); - int index = 0; + Integer index = 0; for (MesProductionAssemblyContext item : productionAssemblyContextList) { if (null == item) continue; - index ++ ; - assemblyShowContextList.add(assemblyShowContext(item, prodRuleContext, workOrderNo).index(index)); + assemblyShowContextList.add(assemblyShowContext(item, prodRuleContext, workOrderNo).index(index += 1)); } assemblyShowContextList = assemblyShowContextList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesAssemblyShowContext::getRouteSeq)).collect(Collectors.toList()); return assemblyShowContextList; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesCountDownShowStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesCountDownShowStepService.java index 388658e..856b979 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesCountDownShowStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesCountDownShowStepService.java @@ -1,6 +1,6 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; @@ -36,7 +36,7 @@ public class MesCountDownShowStepService extends BaseStepService { private IMesProductionProcessContextStepService productionProcessContextStepService; @Autowired - private IMesProductionDispatchContextStepService productionDispatchContextStepService; + private IMesProductionCustomContextStepService productionCustomContextStepService; @Autowired private IFsmCommonService fsmCommonService; @@ -48,6 +48,10 @@ public class MesCountDownShowStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); + //展示组件会调用, 执行到 判断isInit结束, + Boolean isInit = reqBean.getDataMap().containsKey(MesPcnConstWords.WS_CMD_INIT_MODULE) ? true : false; + if (reqBean.getDataMap().containsKey(MesPcnConstWords.WS_CMD_INIT_MODULE)) reqBean.getDataMap().remove(MesPcnConstWords.WS_CMD_INIT_MODULE); + //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getProductionProcessContext(reqBean); @@ -63,12 +67,9 @@ public class MesCountDownShowStepService extends BaseStepService { //不用显示倒计时, 客户端默认显示绿色无数字 if (StringUtils.isEmpty(workCell.getIsShowTime()) || CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() == workCell.getIsShowTime()) return stepResult; - Boolean isInit = reqBean.getDataMap().containsKey(MesPcnConstWords.WS_CMD_INIT_MODULE) ? true : false; - reqBean.getDataMap().remove(MesPcnConstWords.WS_CMD_INIT_MODULE); - //工位开启时间锁, 验证当前是否存在加工锁定状态 Boolean isOpenTimeLock = (!StringUtils.isEmpty(workCell.getIsOpenTimeLock()) && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == workCell.getIsOpenTimeLock()) ? true : false; - if (isOpenTimeLock && checkCellProductionLockIsExist(reqBean, resultBean, isInit, true, true)) + if (isOpenTimeLock && checkCellProductionLockIsExist(reqBean, resultBean, true, true)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]已被锁定!请扫描解除锁定验证码!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); if (isInit) return stepResult; @@ -81,9 +82,9 @@ public class MesCountDownShowStepService extends BaseStepService { } //验证当前是否存在加工锁定状态 - public Boolean checkCellProductionLockIsExist(StationRequestBean reqBean, StationResultBean resultBean, Boolean isInit, Boolean isNeedCheck, Boolean isLock) { + public Boolean checkCellProductionLockIsExist(StationRequestBean reqBean, StationResultBean resultBean, Boolean isNeedCheck, Boolean isLock) { - if (isNeedCheck && !productionDispatchContextStepService.checkProductionLockIsExistContext(reqBean)) return false; + if (isNeedCheck && !productionCustomContextStepService.checkProductionLockIsExistContext(reqBean)) return false; List resultList = StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), new StationKvBean(MesExtEnumUtil.COLOR.RED.getValue(), "已经超时", MesPcnExtConstWords.ZERO_STR)); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEndStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEndStepService.java index ccd1d05..0fc40f1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEndStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesEndStepService.java @@ -1,37 +1,14 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.apiservice.util.MesPcnException; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; -import cn.estsh.i3plus.mes.pcn.api.iservice.busi.ISyncFuncService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; -import cn.estsh.i3plus.platform.common.convert.ConvertBean; -import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; -import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker; -import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.MesPart; -import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; -import cn.estsh.i3plus.pojo.mes.model.GenSerialNoModel; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StepResult; -import cn.estsh.i3plus.pojo.mes.repository.MesPartRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesProduceSnRepository; -import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; -import cn.hutool.core.date.DateUtil; -import com.google.common.base.Objects; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.stream.Collectors; /** * @Description : 完成工步 @@ -64,7 +41,6 @@ public class MesEndStepService extends BaseStepService { mesProductionDispatchContextStepService.deleteMesRawPartChargingDataContext(reqBean); mesProductionDispatchContextStepService.deletePartDataContext(reqBean); mesProductionDispatchContextStepService.deleteProdRuleDataContext(reqBean); - mesProductionDispatchContextStepService.deleteProductionLockContext(reqBean); mesProductionDispatchContextStepService.deleteProductionPartContext(reqBean); mesProductionDispatchContextStepService.deleteProductionPartNoContext(reqBean); mesProductionDispatchContextStepService.deleteProductionPsInContext(reqBean); @@ -73,8 +49,8 @@ public class MesEndStepService extends BaseStepService { mesProductionDispatchContextStepService.deleteSendProcessCmdContext(reqBean); mesProductionDispatchContextStepService.deleteScanWorkOrderNoContext(reqBean); mesProductionDispatchContextStepService.deleteScanProductSnContext(reqBean); - mesProductionDispatchContextStepService.deleteFunctionChooseCavityOrderContext(reqBean); + this.sendMessage(reqBean, new StationResultBean().busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CUSTOM_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.TABLES.getValue())); return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "完成工步执行成功"); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesFirstMouldNoReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesFirstMouldNoReadStepService.java index 11df913..0d4335e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesFirstMouldNoReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesFirstMouldNoReadStepService.java @@ -1,10 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesMouldMultiCavityService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; -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.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.api.iservice.base.IPartService; @@ -48,6 +45,9 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired private IMesEquipmentLogExtService equipmentLogExtService; @Autowired @@ -63,7 +63,7 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { public StepResult init(StationRequestBean reqBean) { //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + productionCustomContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -119,7 +119,7 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); //验证设备通信质量 - productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); + productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); @@ -149,18 +149,17 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { String firstMouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue(); //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean, firstMouldNo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + productionCustomContextStepService.doSendStepContextMessage(reqBean, firstMouldNo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); //验证一模多腔信息 List productionPartContextList = getProductionPartList(reqBean, resultBean, productionProcessContext, cellEquipContext.getEquipmentCode(), firstMouldNo, true); - //获取零件信息 - Map partDataMap = getPartDataMap(reqBean, resultBean, productionProcessContext, productionPartContextList); + //保存零件数据信息 + savePartDataMap(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, false); - //保存设备当前一轮工序的头道模具号,产出零件(一模多腔)信息,零件信息 + //保存设备当前一轮工序的头道模具号,产出零件(一模多腔)信息 productionDispatchContextStepService.saveFirstMouldNoContext(reqBean, equipVariableCollectContextList.get(0)); productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList); - productionDispatchContextStepService.savePartDataContext(reqBean, partDataMap); //更新展示组件MODULE_CONTENT内容 doCacheMoudleContext(reqBean, productionPartContextList, true); @@ -188,16 +187,18 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { return (!CollectionUtils.isEmpty(productionPartContextList) && productionPartContextList.get(0).getEquipmentCode().equals(equipmentCode) && productionPartContextList.get(0).getMouldNo().equals(firstMouldNo)) ? true : false; } - public Map getPartDataMap(StationRequestBean reqBean, StationResultBean resultBean, MesProductionProcessContext productionProcessContext, List productionPartContextList) { + public StepResult savePartDataMap(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productionPartContextList, Boolean isBackError) { //从上下文中取出零件信息集合 Map partDataMap = productionDispatchContextStepService.getPartDataContext(reqBean); //从一模多腔信息中搜集零件编码并去重 - List partNoList = (productionPartContextList.stream().filter(o -> (null != o)).map(MesProductionPartContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + List partNoList = (productionPartContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartNo()))).map(MesProductionPartContext::getPartNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(partNoList)) return stepResult; //验证上下文中取出零件信息集合是否匹配一模多腔信息中搜集零件编码 - if (!CollectionUtils.isEmpty(partDataMap) && partDataMap.keySet().containsAll(partNoList) && partNoList.containsAll(partDataMap.keySet())) return partDataMap; + if (!CollectionUtils.isEmpty(partDataMap) && !CollectionUtils.isEmpty(partNoList) && partDataMap.keySet().containsAll(partNoList) && partNoList.containsAll(partDataMap.keySet())) return stepResult; //根据物料编码集合查询物料信息 Map finalPartDataMap = partService.getPartMap(reqBean.getOrganizeCode(), partNoList); @@ -205,10 +206,16 @@ public class MesFirstMouldNoReadStepService extends BaseStepService { //零件信息缺失 抛出异常 List filterList = CollectionUtils.isEmpty(finalPartDataMap) ? null : partNoList.stream().filter(o -> (null != o && !finalPartDataMap.containsKey(o))).collect(Collectors.toList()); - //验证错误 抛出异常 - if (CollectionUtils.isEmpty(finalPartDataMap) || !CollectionUtils.isEmpty(filterList)) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("请检查零件信息,零件编码%s信息不存在!", CollectionUtils.isEmpty(finalPartDataMap) ? partNoList.toString() : filterList.toString())); + //保存上下文零件数据信息 + if (!CollectionUtils.isEmpty(finalPartDataMap) && CollectionUtils.isEmpty(filterList)) + return stepResult.isCompleted(productionDispatchContextStepService.savePartDataContext(reqBean, partDataMap)).msg(!stepResult.isCompleted() ? "零件数据信息保存上下文操作执行失败,请重试!" : null); + + //验证错误 根据isBackError判断是否抛出异常 + stepResult.isCompleted(false).msg(String.format("请检查零件信息,零件编码%s信息不存在!", CollectionUtils.isEmpty(finalPartDataMap) ? partNoList.toString() : filterList.toString())); + + if (!isBackError) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.getMsg()); - return finalPartDataMap; + return stepResult; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldNoReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldNoReadStepService.java index 37421aa..04fadd1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldNoReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesMouldNoReadStepService.java @@ -1,10 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesMouldMultiCavityService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; -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.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; @@ -43,6 +40,9 @@ public class MesMouldNoReadStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired private IMesEquipmentLogExtService equipmentLogExtService; @Autowired @@ -58,7 +58,7 @@ public class MesMouldNoReadStepService extends BaseStepService { public StepResult init(StationRequestBean reqBean) { //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + productionCustomContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -114,7 +114,7 @@ public class MesMouldNoReadStepService extends BaseStepService { this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); //验证设备通信质量 - productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); + productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); @@ -155,7 +155,7 @@ public class MesMouldNoReadStepService extends BaseStepService { String mouldNo = equipVariableCollectContextList.get(0).getEquipVariableValue(); //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean, mouldNo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + productionCustomContextStepService.doSendStepContextMessage(reqBean, mouldNo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); //将模具信息放到工步结果对象的中, 工步主方法体会从里面取出 stepResult.obj(equipVariableCollectContextList.get(0)); @@ -171,12 +171,11 @@ public class MesMouldNoReadStepService extends BaseStepService { //磨具号当头道模具号的使用 List productionPartContextList = firstMouldNoReadStepService.getProductionPartList(reqBean, resultBean, productionProcessContext, cellEquipContext.getEquipmentCode(), mouldNo, false); - //获取零件信息 - Map partDataMap = firstMouldNoReadStepService.getPartDataMap(reqBean, resultBean, productionProcessContext, productionPartContextList); + //保存零件数据信息 + firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, false); - //保存设备当前一轮工序的产出零件(一模多腔)信息,零件信息 + //保存设备当前一轮工序的产出零件(一模多腔)信息 productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList); - productionDispatchContextStepService.savePartDataContext(reqBean, partDataMap); //更新展示组件MODULE_CONTENT内容 firstMouldNoReadStepService.doCacheMoudleContext(reqBean, productionPartContextList, false); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultReadStepService.java index 00d8147..feaad16 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductResultReadStepService.java @@ -1,9 +1,6 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; -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.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipLogDispatchContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCfgCollectContext; @@ -44,6 +41,9 @@ public class MesProductResultReadStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired private IMesEquipmentLogExtService equipmentLogExtService; @Autowired @@ -53,7 +53,7 @@ public class MesProductResultReadStepService extends BaseStepService { public StepResult init(StationRequestBean reqBean) { //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + productionCustomContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -111,7 +111,7 @@ public class MesProductResultReadStepService extends BaseStepService { this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); //验证设备通信质量 - productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); + productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); @@ -153,7 +153,7 @@ public class MesProductResultReadStepService extends BaseStepService { if (!(Boolean) equipVariableCfgRuleMatchService.matchEquipVariableCfgCollectContext(reqBean, productionProcessContext, entry.getKey(), entry.getValue())) continue; //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.valueOfDescription(entry.getKey()), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + productionCustomContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.valueOfDescription(entry.getKey()), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); //设备加工失败 if (MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.PRODUCT_NOK.getValue().equals(entry.getKey())) diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckNosortStepService.java new file mode 100644 index 0000000..b1bc9cb --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckNosortStepService.java @@ -0,0 +1,146 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; +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 lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description : 主条码验证工步 【非排序】 + * @Author : wangjie + **/ +@Slf4j +@Service("mesProductSnCheckNosortStepService") +public class MesProductSnCheckNosortStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProduceSnExtService produceSnExtService; + + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); + + //获取上下文扫/读信息:主条码 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); + + //没有待验证的主条码, 并且存在已验证过的主条码,默认放行 + if (CollectionUtils.isEmpty(equipVariableCollectContextList) && productionDispatchContextStepService.checkProductionPsInIsExistContext(reqBean)) + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中没有需要验证的主条码,且存在已验证主条码信息,当前工步默认放行!"); + + //没有待验证的主条码 + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中没有需要验证的主条码!"); + + //清除本次已获取得到的主条码信息 + productionDispatchContextStepService.deleteScanProductSnContext(reqBean); + + //搜集主条码值 + List productSnList = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + + //验证上下文中主条码的有效性 + List produceSnList = checkProduceSnValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList); + + if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("验证失败!原因:%s!", stepResult.getMsg())); + + //获取上下文的工位 + MesWorkCell workCell = productionProcessContext.getWorkCell(); + + Map produceSnMap = CollectionUtils.isEmpty(produceSnList) ? null : produceSnList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProduceSn::getProductSn, o -> o)); + + //封装 读/扫主条件信息到进料主条码数据信息中 + List productionPsInContextList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(productSnList)) productSnList.stream().filter(o -> null != o).forEach(o -> createProductionPsInContext(workCell, produceSnMap, o, productionPsInContextList)); + + //获取进料主条码数据信息 + List productionPsInContext = productionDispatchContextStepService.getProductionPsInContext(reqBean); + if (!CollectionUtils.isEmpty(productionPsInContext)) productionPsInContextList.addAll(productionPsInContext); + + //保存进料主条码数据 + productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); + + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("上下文中的主条码%s验证条码状态成功!", productSnList.toString())); + + } + + private List filterEquipVariableCollectContextList(MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList) { + return equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + } + + //获取进料主条码数据信息 + private List checkProduceSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productSnList) { + + //根据零件条码查询零件条码信息 + List produceSnList = produceSnExtService.getProduceSnList(reqBean.getOrganizeCode(), productSnList); + + if (CollectionUtils.isEmpty(produceSnList)) return null; + + //循环获取进料主条码数据信息 + produceSnList.stream().filter(o -> null != o).forEach(o -> checkProduceSnValid(reqBean, stepResult, productionProcessContext, o)); + + return !stepResult.isCompleted() ? null : produceSnList; + + } + + //获取进料主条码数据信息 + private StepResult checkProduceSnValid(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProduceSn produceSn) { + + String suffixMsg = !StringUtils.isEmpty(stepResult.getMsg()) ? stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON : MesPcnExtConstWords.EMPTY; + + if (MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != produceSn.getQcStatus()) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]质量状态[%s]", suffixMsg, produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus()))); + + if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() < produceSn.getSnStatus() || + (MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue() == produceSn.getSnStatus() && (!produceSn.getWorkCenterCode().equals(reqBean.getWorkCenterCode()) || !produceSn.getWorkCellCode().equals(reqBean.getWorkCellCode())))) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]条码状态[%s]", suffixMsg, produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus()))); + + return stepResult; + + } + + //封装 读/扫主条件信息到进料主条码数据信息中 + private void createProductionPsInContext(MesWorkCell workCell, Map produceSnMap, String productSn, List productionPsInContextList) { + MesProductionPsInContext productionPsInContext = new MesProductionPsInContext(workCell, + (!CollectionUtils.isEmpty(produceSnMap) && !StringUtils.isEmpty(productSn) && produceSnMap.containsKey(productSn)) ? produceSnMap.get(productSn) : null, productSn); + + productionPsInContextList.add(productionPsInContext); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckSortStepService.java new file mode 100644 index 0000000..86c20e7 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckSortStepService.java @@ -0,0 +1,175 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; +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 lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description : 主条码验证工步 【排序】 + * @Author : wangjie + **/ +@Slf4j +@Service("mesProductSnCheckSortStepService") +public class MesProductSnCheckSortStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProduceSnExtService produceSnExtService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); + + //获取上下文扫/读信息:主条码 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); + + //没有待验证的主条码, 并且存在已验证过的主条码,默认放行 + if (CollectionUtils.isEmpty(equipVariableCollectContextList) && productionDispatchContextStepService.checkProductionPsInIsExistContext(reqBean)) + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中没有需要验证的主条码,且存在已验证主条码信息,当前工步默认放行!"); + + //没有待验证的主条码 + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中没有需要验证的主条码!"); + + //清除本次已获取得到的主条码信息 + productionDispatchContextStepService.deleteScanProductSnContext(reqBean); + + //搜集主条码值 + List productSnList = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + + //验证上下文中主条码的有效性 + Map> produceSnMap = checkProduceSnValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList); + + if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("验证失败!原因:%s!", stepResult.getMsg())); + + //验证上下文中主条码的工位队列的有效性 + Map> queueOrderMap = checkQueueOrderValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList); + + if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("验证失败!原因:%s!", stepResult.getMsg())); + + //获取上下文的工位 + MesWorkCell workCell = productionProcessContext.getWorkCell(); + + //封装 读/扫主条件信息到进料主条码数据信息中 + List productionPsInContextList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(productSnList)) productSnList.stream().filter(o -> null != o).forEach(o -> productionPsInContextList.add(new MesProductionPsInContext(workCell, produceSnMap.get(o).get(0), queueOrderMap.get(o).get(0).getId()))); + + //获取进料主条码数据信息 + List productionPsInContext = productionDispatchContextStepService.getProductionPsInContext(reqBean); + if (!CollectionUtils.isEmpty(productionPsInContext)) productionPsInContextList.addAll(productionPsInContext); + + //保存进料主条码数据 + productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); + + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("上下文中的主条码%s验证条码状态成功!", productSnList.toString())); + + } + + private List filterEquipVariableCollectContextList(MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList) { + return equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + } + + //验证上下文中主条码的有效性 + private Map> checkProduceSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productSnList) { + + //根据零件条码查询零件条码信息 + Map> produceSnMap = produceSnExtService.getProduceSnMap(reqBean.getOrganizeCode(), productSnList); + + //循环获取进料主条码数据信息 + productSnList.stream().filter(o -> null != o).forEach(o -> checkProduceSnValid(reqBean, stepResult, productionProcessContext, produceSnMap, o)); + + return !stepResult.isCompleted() ? null : produceSnMap; + + } + + //验证上下文中主条码的有效性 + private Map> checkQueueOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productSnList) { + + //根据零件条码查询工位队列信息 + Map> queueOrderMap = produceSnExtService.getQueueOrderMap(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), productSnList); + + //循环获取进料主条码数据信息 + productSnList.stream().filter(o -> null != o).forEach(o -> checkQueueOrderValid(reqBean, stepResult, productionProcessContext, queueOrderMap, o)); + + return !stepResult.isCompleted() ? null : queueOrderMap; + + } + + //验证上下文中主条码的有效性 + private StepResult checkProduceSnValid(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, Map> produceSnMap, String productSn) { + + String suffixMsg = !StringUtils.isEmpty(stepResult.getMsg()) ? stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON : MesPcnExtConstWords.EMPTY; + + if (CollectionUtils.isEmpty(produceSnMap) || !produceSnMap.containsKey(productSn)) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]信息不存在", suffixMsg, productSn)); + + if (produceSnMap.get(productSn).size() != 1) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]信息存在重复", suffixMsg, productSn)); + + if (MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != produceSnMap.get(productSn).get(0).getQcStatus()) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]质量状态[%s]", suffixMsg, productSn, MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSnMap.get(productSn).get(0).getQcStatus()))); + + if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() <= produceSnMap.get(productSn).get(0).getSnStatus() || MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue() == produceSnMap.get(productSn).get(0).getSnStatus()) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]条码状态[%s]", suffixMsg, productSn, MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSnMap.get(productSn).get(0).getSnStatus()))); + + return stepResult; + + } + + //验证工位队列有效性 + private StepResult checkQueueOrderValid(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, Map> queueOrderMap, String productSn) { + + String suffixMsg = !StringUtils.isEmpty(stepResult.getMsg()) ? stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON : MesPcnExtConstWords.EMPTY; + + if (CollectionUtils.isEmpty(queueOrderMap) || !queueOrderMap.containsKey(productSn)) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]工位队列信息不存在", suffixMsg, productSn)); + + if (queueOrderMap.get(productSn).size() != 1) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]工位队列信息存在重复", suffixMsg, productSn)); + + if (MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue() == queueOrderMap.get(productSn).get(0).getStatus()) + return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]工位队列状态[%s]", suffixMsg, productSn, MesExtEnumUtil.QUEUE_ORDER_STATUS.valueOfDescription(queueOrderMap.get(productSn).get(0).getStatus()))); + + return stepResult; + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckStepService.java index 9b03b9a..5617953 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnCheckStepService.java @@ -1,30 +1,18 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProduceSnExtService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; -import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; -import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; -import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; 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.util.SpringContextsUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** * @Description : 主条码验证工步 @@ -37,14 +25,6 @@ public class MesProductSnCheckStepService extends BaseStepService { @Autowired private IMesProductionProcessContextStepService productionProcessContextStepService; - @Autowired - private IMesProductionDispatchContextStepService productionDispatchContextStepService; - - @Autowired - private IMesProduceSnExtService produceSnExtService; - - //TODO 装配件工步 判断空腔条码 - @Override public StepResult execute(StationRequestBean reqBean) { @@ -55,105 +35,21 @@ public class MesProductSnCheckStepService extends BaseStepService { //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); - //获取生产过程上下文对象有异常信息 抛出异常 - if (!productionProcessContext.getSuccess()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, productionProcessContext.getMessage()); + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); //存储生产过程上下文对象 productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); - //获取上下文扫/读信息:主条码 - List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); - - //清除本次已获取得到的主条码信息 - productionDispatchContextStepService.deleteScanProductSnContext(reqBean); - - if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execDynamicsCompleteAndSendMsgReturn( - reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "当前上下文中没有需要验证的主条码!"); - - //搜集主条码值 - List productSnList = filterEquipVariableCollectContextList(productionProcessContext, equipVariableCollectContextList, true); - //搜集空腔条码 - List finishCodeList = filterEquipVariableCollectContextList(productionProcessContext, equipVariableCollectContextList, false); - - //验证上下文中主条码的有效性 - List produceSnList = checkProduceSnValid(reqBean, resultBean, stepResult, productionProcessContext, productSnList); - - if (!stepResult.isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("验证失败!原因:%s!", stepResult.getMsg())); - - //获取上下文的工位 - MesWorkCell workCell = productionProcessContext.getWorkCell(); - - Map produceSnMap = CollectionUtils.isEmpty(produceSnList) ? null : produceSnList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProduceSn::getProductSn, o -> o)); - - //封装 读/扫主条件信息到进料主条码数据信息中 - List productionPsInContextList = new ArrayList<>(); - if (!CollectionUtils.isEmpty(productSnList)) productSnList.stream().filter(o -> null != o).forEach(o -> createProductionPsInContext(reqBean, resultBean, stepResult, workCell, produceSnMap, o, productionPsInContextList)); - if (!CollectionUtils.isEmpty(finishCodeList)) finishCodeList.stream().filter(o -> null != o).forEach(o -> createProductionPsInContext(reqBean, resultBean, stepResult, workCell, produceSnMap, null, productionPsInContextList)); - - //获取进料主条码数据信息 - List productionPsInContext = productionDispatchContextStepService.getProductionPsInContext(reqBean); - if (!CollectionUtils.isEmpty(productionPsInContext)) productionPsInContextList.addAll(productionPsInContext); - - //保存进料主条码数据 - productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); - - //变更主条码状态为未知 - saveProduceSnList(reqBean, resultBean, produceSnList); - - return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的主条码%s验证条码状态成功!", equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString())); + //从上下文中取出生产线对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - } - - private List filterEquipVariableCollectContextList(MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, Boolean flag) { - return flag ? equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()) : - equipVariableCollectContextList.stream().filter(o -> (null != o && o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); - } - - //获取进料主条码数据信息 - private List checkProduceSnValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productSnList) { - - //根据零件条码查询零件条码信息 - List produceSnList = produceSnExtService.getProduceSnList(reqBean.getOrganizeCode(), productSnList); - - if (CollectionUtils.isEmpty(produceSnList)) return null; - - //循环获取进料主条码数据信息 - produceSnList.stream().filter(o -> null != o).forEach(o -> checkProduceSnValid(reqBean, stepResult, productionProcessContext, o)); - - return !stepResult.isCompleted() ? null : produceSnList; - - } - - //获取进料主条码数据信息 - private StepResult checkProduceSnValid(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProduceSn produceSn) { - - String suffixMsg = !StringUtils.isEmpty(stepResult.getMsg()) ? stepResult.getMsg() + "; " : MesPcnExtConstWords.EMPTY; - - if (MesExtEnumUtil.PRODUCE_QC_STATUS.QUALIFIED.getValue() != produceSn.getQcStatus()) - return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]质量状态[%s]", suffixMsg, produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_QC_STATUS.valueOfDescription(produceSn.getQcStatus()))); - - if (MesExtEnumUtil.PRODUCE_SN_STATUS.OFFLINE.getValue() != produceSn.getSnStatus() || - (MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue() == produceSn.getSnStatus() && !produceSn.getWorkCenterCode().equals(reqBean.getWorkCenterCode()) && !produceSn.getWorkCellCode().equals(reqBean.getWorkCellCode()))) - return stepResult.isCompleted(false).msg(String.format("%s主条码[%s]条码状态[%s]", suffixMsg, produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus()))); + //排序线 主条码验证工步 + if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return ((IStepService) SpringContextsUtil.getBean("mesProductSnCheckSortStepService")).execute(reqBean); - return stepResult; - - } - - //封装 读/扫主条件信息到进料主条码数据信息中 - private void createProductionPsInContext(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCell workCell, Map produceSnMap, String productSn, List productionPsInContextList) { - MesProductionPsInContext productionPsInContext = new MesProductionPsInContext( - (!CollectionUtils.isEmpty(produceSnMap) && !StringUtils.isEmpty(productSn) && produceSnMap.containsKey(productSn)) ? produceSnMap.get(productSn) : null, productSn); - if (!StringUtils.isEmpty(productionPsInContext.getId())) productionPsInContext.isCheckSeq(workCell.getIsCheckSeq()).isCheckCraft(workCell.getIsCheckCraft()); - productionPsInContextList.add(productionPsInContext); - } + //非排序线 主条码验证工步 + return ((IStepService) SpringContextsUtil.getBean("mesProductSnCheckNosortStepService")).execute(reqBean); - //变更主条码状态为未知 - private void saveProduceSnList(StationRequestBean reqBean, StationResultBean resultBean, List produceSnList) { - if (CollectionUtils.isEmpty(produceSnList)) return; - Map psMap = produceSnList.stream().filter(o -> null != o).collect(Collectors.toMap(MesProduceSn::getProductSn, MesProduceSn::getId)); - produceSnExtService.saveProduceSnList(reqBean, MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getValue(), new ArrayList<>(psMap.values())); - this.sendMessage(reqBean, resultBean, String.format("主条码%s信息已变更[%s]状态", psMap.keySet().toString(), MesExtEnumUtil.PRODUCE_SN_STATUS.UNKNOW.getDescription()), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java index 38fc77f..03c0e1d 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnReadStepService.java @@ -1,10 +1,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesMouldMultiCavityService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; -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.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; @@ -22,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -42,6 +40,9 @@ public class MesProductSnReadStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired private IMesEquipmentLogExtService equipmentLogExtService; @Autowired @@ -54,7 +55,7 @@ public class MesProductSnReadStepService extends BaseStepService { public StepResult init(StationRequestBean reqBean) { //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + productionCustomContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -76,6 +77,8 @@ public class MesProductSnReadStepService extends BaseStepService { //当前工序已存在读取待验证的主条码信息 if (productionDispatchContextStepService.checkScanProductSnIsExistContext(reqBean)) return stepResult; + //TODO 后面增加工艺跳过码 通过按钮触发 判断是否存在已验证主条码 且 存在工艺验证错误的数据 进行标记后放行 + //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); @@ -110,7 +113,7 @@ public class MesProductSnReadStepService extends BaseStepService { this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); //验证设备通信质量 - productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); + productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); @@ -139,14 +142,9 @@ public class MesProductSnReadStepService extends BaseStepService { //读取主条码前置验证 checkReadProductSnValid(reqBean, resultBean, stepParamMap, stepResult, productionProcessContext, cellEquipContext, equipVariableCollectContextList); - //保存设备当前一轮工序的待验证的主条码信息 - productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList); - //重新读到信息需要删除历史验证数据, 删除设备当前一轮工序的进料零件条码信息, 不管实际是否已经存在 - productionDispatchContextStepService.deleteScanProductSnContext(reqBean); - //发送工步内容 String scanInfo = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)); - productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + productionCustomContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前已读取到设备[%s]主条码信息[%s]!", cellEquipContext.getEquipmentCode(), scanInfo)); @@ -155,14 +153,21 @@ public class MesProductSnReadStepService extends BaseStepService { //读取主条码前置验证 private void checkReadProductSnValid(StationRequestBean reqBean, StationResultBean resultBean, Optional> stepParamMap, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List equipVariableCollectContextList) { - //剔除finishCode信息 - List filterList = equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).collect(Collectors.toList()); + //搜集主条码值 + List productSnList = filterEquipVariableCollectContextList(productionProcessContext, equipVariableCollectContextList, true); + //搜集空腔条码 + List finishCodeList = filterEquipVariableCollectContextList(productionProcessContext, equipVariableCollectContextList, false); + + //全部匹配为空腔 + if (CollectionUtils.isEmpty(productSnList)) + execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前读取到设备[%s]主条码全部为空腔,持续监听中...", cellEquipContext.getEquipmentCode())), + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); //根据读取条码分组数据 - Map> produceSnCollectMap = CollectionUtils.isEmpty(filterList) ? null : filterList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesEquipVariableCollectContext::getEquipVariableValue)); + Map> produceSnCollectMap = productSnList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesEquipVariableCollectContext::getEquipVariableValue)); //验证是否存在重复条码 - if (!CollectionUtils.isEmpty(filterList) && filterList.size() != produceSnCollectMap.size()) + if (!CollectionUtils.isEmpty(productSnList) && productSnList.size() != produceSnCollectMap.size()) execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前读取到设备[%s]主条码存在重复条码,持续监听中...", cellEquipContext.getEquipmentCode())), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); @@ -176,6 +181,25 @@ public class MesProductSnReadStepService extends BaseStepService { execThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, resultBean.writeDbLog(), stepResult.isCompleted(false).msg(String.format("当前读取到设备[%s]主条码数量[%s]与工位设备维护的腔数[%s]不一致,持续监听中...", cellEquipContext.getEquipmentCode(), equipVariableCollectContextList.size(), cellEquipContext.getCavity())), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + //保存设备当前一轮工序的待验证的主条码信息 + productionDispatchContextStepService.saveScanProductSnContext(reqBean, productSnList); + + //保存空腔数据, 没有空腔默认清除历史主条码 + if (CollectionUtils.isEmpty(finishCodeList)) productionDispatchContextStepService.deleteProductionPsInContext(reqBean); + else productionDispatchContextStepService.saveProductionPsInContext(reqBean, getProductionPsInContextList(finishCodeList)); + + } + + //封装无需验证的finishCode空腔数据 + private List getProductionPsInContextList(List finishCodeList) { + List productionPsInContextList = new ArrayList<>(); + finishCodeList.stream().filter(o -> null != o).forEach(o -> productionPsInContextList.add(new MesProductionPsInContext().isFinishCode())); + return productionPsInContextList; + } + + private List filterEquipVariableCollectContextList(MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, Boolean flag) { + return flag ? equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).collect(Collectors.toList()) : + equipVariableCollectContextList.stream().filter(o -> (null != o && o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).collect(Collectors.toList()); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java new file mode 100644 index 0000000..520278d --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanNosortStepService.java @@ -0,0 +1,261 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +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.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 com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @Description : 扫描主条码工步 【非排序】 + * @Author : wangjie + **/ +@Slf4j +@Service("mesProductSnScanNosortStepService") +public class MesProductSnScanNosortStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired + private IFsmCommonService fsmCommonService; + + @Override + public StepResult guide(StationRequestBean reqBean) { + + //发送工步内容 + productionCustomContextStepService.doSendStepContextMessage(reqBean); + + return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描主条码!"); + + } + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //扫描信息置空 + String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo()); + + //发送工步内容 + if (!StringUtils.isEmpty(scanInfo)) productionCustomContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); + + //当前工位使用的设备 + MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); + + //获取上下文产出零件信息 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + //获取上下文扫/读信息:主条码 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); + + //获取进料主条码数据信息 + List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + + //验证扫描信息是否属于工艺跳过码 + Boolean isCraftJumpCode = checkScanInfoMatchCraftJumpCode(reqBean, scanInfo); + + //不属于工艺跳过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据 + if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo) && !CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = updateProductionPsInContextList(reqBean, productionPsInContextList); + + //先判断前期扫描数量 + Integer scanedQty = calcScanedQty(equipVariableCollectContextList, productionPsInContextList); + + //根据产出零件或者腔数拿到需要的扫描数量, 优先使用产出零件数量 + Integer needQty = !CollectionUtils.isEmpty(productionPartContextList) ? productionPartContextList.size() : cellEquipmentContext.getCavity(); + + //验证前期扫描数量是否已超过匹配腔数 + checkIsAboveNeedQty(reqBean, resultBean, stepResult, scanedQty, needQty, equipVariableCollectContextList, productionPsInContextList, productionPartContextList, cellEquipmentContext); + + //验证是否支持跳过 + Boolean isAllowJump = checkIsAllowJump(productionPsInContextList); + + //当前不允许跳过 + if (isCraftJumpCode && !isAllowJump) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s],上下文中目前没有可以跳过的主条码信息!", scanInfo)); + + //允许跳过,先更新数据 + if (isCraftJumpCode && isAllowJump) updateProductionPsInContextList(reqBean, productionPsInContextList, scanInfo); + if (isCraftJumpCode && isAllowJump) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s]!", scanInfo)); + + //扫描信息为空 并且 判断当前是否必须要扫描 + if (StringUtils.isEmpty(scanInfo) && (scanedQty.compareTo(needQty) < 0 || isAllowJump)) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描主条码!"); + + //封装待验证的主条码信息 + if (!scanInfo.equals(productionProcessContext.getFinishCode())) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean, scanInfo, equipVariableCollectContextList); + + //验证是否存在重复主条码 + if (checkIsExistRepeatScan(productionProcessContext, equipVariableCollectContextList, productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s],上下文中存在重复扫描的主条码!", scanInfo)); + + //保存上下文扫/读信息:主条码 或者 添加了finishCode后的主条码数据 + if (!scanInfo.equals(productionProcessContext.getFinishCode())) productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList); + else productionPsInContextList = saveProductionPsInContextList(reqBean, productionPsInContextList); + + //前期扫描数量已等于腔数 + scanedQty = calcScanedQty(equipVariableCollectContextList, productionPsInContextList); + + //是否支持混腔扫描[工位参数] + String cavityNosortCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_NOSORT_CFG); + + String scanInfoName = !scanInfo.equals(productionProcessContext.getFinishCode()) ? "主条码" : "空腔码"; + + if (scanedQty.compareTo(needQty) < 0 && !StringUtils.isEmpty(cavityNosortCfg)) + return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, + MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息%s[%s],已知腔数[%s],还需要再连续扫描[%s]次主条码!", scanInfoName, scanInfo, needQty, needQty - equipVariableCollectContextList.size())); + + //扫描场景 验证是否全部为空腔 + if (!checkIsAllFinishCode(equipVariableCollectContextList, productionPartContextList)) + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息%s[%s]%s!", scanInfoName, scanInfo, scanedQty.compareTo(needQty) == 0 ? String.format(",上下文中的主条码个数[%s]已满足腔数", scanedQty) : MesPcnExtConstWords.EMPTY)); + + //删除上下文扫/读信息:主条码 + productionDispatchContextStepService.deleteScanProductSnContext(reqBean); + //删除进料主条码数据 + productionDispatchContextStepService.deleteProductionPsInContext(reqBean); + + return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前扫描的主条码信息全部为空腔,已清除当前的空腔数据!"); + + } + + private Integer calcScanedQty(List equipVariableCollectContextList, List productionPsInContextList) { + return (CollectionUtils.isEmpty(equipVariableCollectContextList) ? MesPcnExtConstWords.ZERO : equipVariableCollectContextList.size()) + (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size()); + } + + //不属于工艺跳过码,并且存在扫描信息,剔除此前已标记工艺防错结果错误的数据 + private List updateProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList) { + Integer sourceSize = productionPsInContextList.size(); + productionPsInContextList = productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 && o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(productionPsInContextList) && productionPsInContextList.size() == sourceSize) return productionPsInContextList; + //保存进料主条码数据 + productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); + return productionPsInContextList; + } + + //封装无需验证的finishCode空腔数据 + private List saveProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList) { + if (CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = new ArrayList<>(); + productionPsInContextList.add(new MesProductionPsInContext().isFinishCode()); + //保存进料主条码数据 + productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); + return productionPsInContextList; + } + + //验证是否支持跳过 + private Boolean checkIsAllowJump(List productionPsInContextList) { + Optional optional = CollectionUtils.isEmpty(productionPsInContextList) ? null : + productionPsInContextList.stream().filter(o -> (null != o && (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0))).findFirst(); + return (null != optional && optional.isPresent()) ? true : false; + } + + //验证扫描信息属于工艺跳过码 并且支持跳过,进行数据变更 + private List updateProductionPsInContextList(StationRequestBean reqBean, List productionPsInContextList, String craftJumpCode) { + productionPsInContextList.forEach(o -> { + if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) { + o.setCraftJumpCode(craftJumpCode); + } + }); + //保存进料主条码数据 + productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); + return productionPsInContextList; + } + + //验证扫描信息是否属于工艺跳过码 + private Boolean checkScanInfoMatchCraftJumpCode(StationRequestBean reqBean, String scanInfo) { + if (StringUtils.isEmpty(scanInfo)) return false; + String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE); + if (StringUtils.isEmpty(craftJumpCode)) craftJumpCode = MesPcnExtConstWords.CRAFT_JUMP_CODE; + return scanInfo.equals(craftJumpCode) ? true : false; + } + + //验证前期扫描数量是否已超过匹配腔数 + private void checkIsAboveNeedQty(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, Integer scanedQty, Integer needQty, + List equipVariableCollectContextList, List productionPsInContextList, List productionPartContextList, MesCellEquipContext cellEquipmentContext) { + if (scanedQty.compareTo(needQty) <= 0) return; + String message = String.format("请检查相关数据,上下文中的主条码个数[%s]已满足腔数[%s],可重置工序解决!", scanedQty, needQty); + this.sendMessage(reqBean, resultBean, message + + " --- List --- [" + getJsonMessage(equipVariableCollectContextList) + "]" + + " --- List --- [" + getJsonMessage(productionPsInContextList) + "]" + + " --- List --- [" + getJsonMessage(productionPartContextList) + "]" + + " --- MesCellEquipContext --- [" + JSONObject.toJSONString(cellEquipmentContext) + "] ---", MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), message); + } + + //集合判空转JSON + private String getJsonMessage(List list) { + return CollectionUtils.isEmpty(list) ? MesPcnExtConstWords.EMPTY : JSONObject.toJSONString(list); + } + + //封装扫/读信息:主条码信息 + private List doHandleScanProductSnContext(StationRequestBean reqBean, String scanInfo, List equipVariableCollectContextList) { + + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList = new ArrayList<>(); + + equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue())); + + return equipVariableCollectContextList; + + } + + //验证是否存在重复主条码 + private Boolean checkIsExistRepeatScan(MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, List productionPsInContextList) { + + //扫描条码 + List filterList1 = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + //已验证条码 剔除finishCode信息 + List filterList2 = CollectionUtils.isEmpty(productionPsInContextList) ? null : + productionPsInContextList.stream().filter(o -> (null != o && !o.getProductSn().equals(productionProcessContext.getFinishCode()))).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList()); + + List filterList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(filterList1)) filterList.addAll(filterList1); + if (!CollectionUtils.isEmpty(filterList2)) filterList.addAll(filterList2); + + //验证是否存在重复条码 + if (!CollectionUtils.isEmpty(filterList) && filterList.size() != filterList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).size()) return true; + + return false; + + } + + //验证是否全部为空腔 + private Boolean checkIsAllFinishCode(List equipVariableCollectContextList, List productionPartContextList) { + Optional optional = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); + return ((null != optional && optional.isPresent()) || !CollectionUtils.isEmpty(equipVariableCollectContextList)) ? false : true; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java new file mode 100644 index 0000000..b5231c0 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanSortStepService.java @@ -0,0 +1,153 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; +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.MesProdRouteOptParam; +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.util.SpringContextsUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +/** + * @Description : 扫描主条码工步 【排序】 + * @Author : wangjie + **/ +@Slf4j +@Service("mesProductSnScanSortStepService") +public class MesProductSnScanSortStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired + private IFsmCommonService fsmCommonService; + + @Override + public StepResult guide(StationRequestBean reqBean) { + + //发送工步内容 + productionCustomContextStepService.doSendStepContextMessage(reqBean); + + return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描主条码!"); + + } + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); + + //获取生产过程上下文对象有异常信息 抛出异常 + if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); + + //获取上下文产出零件信息 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + + if (CollectionUtils.isEmpty(productionPartContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "上下文中没有产出零件信息!"); + + //排序是否需要扫描主条码配置【工步参数】 默认不用配置, 目前排序 工单与条码一对一, 当一对多的时候需要配置 + Optional> stepParamMap = getStepParams(reqBean); + Boolean sortNeedScanPs = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.SORT_NEED_SCAN_PS)) ? true : false; + + //需要扫描主条码配置存在 直接复用 非排序线 扫描主条码工步 + if (sortNeedScanPs) return ((IStepService) SpringContextsUtil.getBean("mesProductSnScanNosortStepService")).execute(reqBean); + + //获取进料主条码数据信息 + List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + + //保存保存上下文扫/读信息:主条码 数据来源【产出零件 即生产工单】 + if (CollectionUtils.isEmpty(productionPsInContextList)) return saveScanProductSnContextSort(reqBean, resultBean, stepResult, productionPartContextList); + + //获取上下文扫/读信息:主条码 【工艺跳过码场景】 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); + + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "上下文中没有待验证的主条码信息!"); + + //删除上下文扫/读信息:主条码 + if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) productionDispatchContextStepService.deleteScanProductSnContext(reqBean); + + //验证是否匹配工艺跳过码 + if (equipVariableCollectContextList.size() != 1 || checkScanInfoMatchCraftJumpCode(reqBean, equipVariableCollectContextList.get(0).getEquipVariableValue())) + return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前上下文中待验证的主条码%s无效!", + equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString())); + + //验证是否支持跳过 + if (!checkIsAllowJump(productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前不支持通过工艺跳过码[%s]执行跳过!", equipVariableCollectContextList.get(0).getEquipVariableValue())); + + return updateProductionPsInContextList(reqBean, resultBean, stepResult, productionPsInContextList, equipVariableCollectContextList.get(0).getEquipVariableValue()); + + } + + //保存保存上下文扫/读信息:主条码 数据来源【产出零件 即生产工单】 + private StepResult saveScanProductSnContextSort(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List productionPartContextList) { + List equipVariableCollectContextList = new ArrayList<>(); + productionPartContextList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o -> equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), o.getWorkOrderNo(), TimeTool.getNowTime(true), o.getMessageSource()))); + productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList); + return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "根据加工单生成待验证主条码信息执行成功!"); + } + + //验证扫描信息是否属于工艺跳过码 + private Boolean checkScanInfoMatchCraftJumpCode(StationRequestBean reqBean, String scanInfo) { + if (StringUtils.isEmpty(scanInfo)) return false; + String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE); + if (StringUtils.isEmpty(craftJumpCode)) craftJumpCode = MesPcnExtConstWords.CRAFT_JUMP_CODE; + return scanInfo.equals(craftJumpCode) ? true : false; + } + + //验证是否支持跳过 + private Boolean checkIsAllowJump(List productionPsInContextList) { + Optional optional = CollectionUtils.isEmpty(productionPsInContextList) ? null : + productionPsInContextList.stream().filter(o -> (null != o && (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0))).findFirst(); + return (null != optional && optional.isPresent()) ? true : false; + } + + //验证扫描信息属于工艺跳过码 并且支持跳过,进行数据变更 + private StepResult updateProductionPsInContextList(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, List productionPsInContextList, String craftJumpCode) { + productionPsInContextList.forEach(o -> { + if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) { + o.setCraftJumpCode(craftJumpCode); + } + }); + //保存进料主条码数据 + productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); + return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, "已标记当前上下文中工艺防错验证失败的主条码信息!"); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanStepService.java index f4a86a4..b0af69e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSnScanStepService.java @@ -1,32 +1,23 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; -import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; -import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; -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.mes.pcn.serviceimpl.fsm.IStepService; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; 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 com.alibaba.fastjson.JSONObject; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; /** - * @Description : 扫描主条码工步 + * @Description : 扫描主条码工步 【非排序】 * @Author : wangjie **/ @Slf4j @@ -40,12 +31,13 @@ public class MesProductSnScanStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired - private IFsmCommonService fsmCommonService; + private IMesProductionCustomContextStepService productionCustomContextStepService; @Override public StepResult guide(StationRequestBean reqBean) { - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + //发送工步内容 + productionCustomContextStepService.doSendStepContextMessage(reqBean); return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描主条码!"); @@ -58,161 +50,23 @@ public class MesProductSnScanStepService extends BaseStepService { StepResult stepResult = StepResult.getSuccessComplete(); - //扫描信息置空 - String scanInfo = reqBean.resetScanInfo(reqBean.getScanInfo()); - //获取上下文信息 MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getCurCellEquipment(reqBean); - //获取生产过程上下文对象有异常信息 抛出异常 + //配置错误 抛出异常 if (!productionProcessContext.getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); //存储生产过程上下文对象 productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); - //当前工位使用的设备 - MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); - - //获取上下文产出零件信息 - List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); - - //获取上下文扫/读信息:主条码 - List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); - - //获取进料主条码数据信息 - List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); - - //验证扫描信息是否属于工艺跳过码 - Boolean isCraftJumpCode = checkScanInfoMatchCraftJumpCode(reqBean, scanInfo); - - //不属于工艺跳过码时,剔除此前已标记工艺防错结果错误的数据,如有数据变更则标记 stepResult.obj 为true - if (!isCraftJumpCode && !CollectionUtils.isEmpty(productionPsInContextList)) productionPsInContextList = removeCraftCheckFailureData(stepResult, productionPsInContextList); - - //验证扫描信息属于工艺跳过码的情况下是否支持跳过 - Boolean isAllowJump = checkIsAllowJump(reqBean, productionPsInContextList, isCraftJumpCode, scanInfo); - - //封装待验证的主条码信息 - if (!isCraftJumpCode && !StringUtils.isEmpty(scanInfo)) equipVariableCollectContextList = doHandleScanProductSnContext(reqBean.getOrganizeCode(), scanInfo, equipVariableCollectContextList); - - //先判断前期扫描数量 - Integer scanedQty = (CollectionUtils.isEmpty(equipVariableCollectContextList) ? MesPcnExtConstWords.ZERO : equipVariableCollectContextList.size()) + (CollectionUtils.isEmpty(productionPsInContextList) ? MesPcnExtConstWords.ZERO : productionPsInContextList.size()); - - //根据产出零件或者腔数拿到需要的扫描数量, 优先使用产出零件数量 - Integer needQty = !CollectionUtils.isEmpty(productionPartContextList) ? productionPartContextList.size() : cellEquipmentContext.getCavity(); - - //扫描信息为空 - if (scanedQty.compareTo(needQty) < 0 && StringUtils.isEmpty(scanInfo)) execSendGuideAndThrowEx(reqBean, resultBean.writeDbLog(), "请扫描主条码!"); - - //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN); - - //验证前期扫描数量是否已超过匹配腔数 - checkIsAboveNeedQty(reqBean, resultBean, stepResult, scanedQty, needQty, equipVariableCollectContextList, productionPsInContextList, productionPartContextList, cellEquipmentContext); - - //扫描信息匹配跳过码, 判断是否允许跳过 - if (isCraftJumpCode && !isAllowJump) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s],上下文中目前没有可以跳过的主条码信息!", scanInfo)); - - //验证是否存在重复主条码 - if (checkIsExistRepeatScan(productionProcessContext, equipVariableCollectContextList, productionPsInContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s],上下文中存在重复扫描的主条码!", scanInfo)); - - //允许跳过码 或者 存在 stepResult.obj 则保存进料主条码数据到上下文中 - if (isAllowJump || null != stepResult.getObj()) productionDispatchContextStepService.saveProductionPsInContext(reqBean, productionPsInContextList); - //不属于工艺跳过码时, 则保存上下文扫/读信息:主条码 - if (!isCraftJumpCode) productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList); - - //属于工艺跳过码时并且允许跳过时,直接返回成功 - if (isCraftJumpCode && isAllowJump) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s]!", scanInfo)); - - //前期扫描数量已等于腔数 - if (scanedQty.compareTo(needQty) == 0) - return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s],上下文中的主条码个数[%s]已满足腔数!", scanInfo, scanedQty)); - - //是否支持混腔扫描[工位参数] - String cavityNosortCfg = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CAVITY_NOSORT_CFG); - if (StringUtils.isEmpty(cavityNosortCfg)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息主条码[%s]!", scanInfo)); - - return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, - MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息主条码[%s],已知腔数[%s],还需要再连续扫描[%s]次主条码!", scanInfo, needQty, needQty - equipVariableCollectContextList.size())); - - } - - //剔除此前已标记工艺防错结果错误的数据,如有数据变更则标记 stepResult.obj - private List removeCraftCheckFailureData(StepResult stepResult, List productionPsInContextList) { - Integer sourceSize = productionPsInContextList.size(); - productionPsInContextList = productionPsInContextList.stream().filter(o -> (null != o && o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0 && o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(productionPsInContextList) || productionPsInContextList.size() < sourceSize) stepResult.obj(true); - return productionPsInContextList; - } - - //验证扫描信息属于工艺跳过码的情况下是否支持跳过 - private Boolean checkIsAllowJump(StationRequestBean reqBean, List productionPsInContextList, Boolean isCraftJumpCode, String scanInfo) { - AtomicReference isAllowJump = new AtomicReference<>(false); - if (CollectionUtils.isEmpty(productionPsInContextList)) return isAllowJump.get(); - //修改此前已标记工艺防错结果错误的数据, 标记跳过码 - productionPsInContextList.forEach(o -> { - if (o.getCheckCraftResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0 || o.getCheckSeqResult().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0) { - o.setCraftJumpCode(scanInfo); - isAllowJump.set(true); - } - }); - //不存在错误的数据则返回false - return isAllowJump.get(); - } - - //验证扫描信息是否属于工艺跳过码 - private Boolean checkScanInfoMatchCraftJumpCode(StationRequestBean reqBean, String scanInfo) { - if (StringUtils.isEmpty(scanInfo)) return false; - String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE); - if (StringUtils.isEmpty(craftJumpCode)) craftJumpCode = MesPcnExtConstWords.CRAFT_JUMP_CODE; - return scanInfo.equals(craftJumpCode) ? true : false; - } - - //验证前期扫描数量是否已超过匹配腔数 - private void checkIsAboveNeedQty(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, Integer scanedQty, Integer needQty, - List equipVariableCollectContextList, List productionPsInContextList, List productionPartContextList, MesCellEquipContext cellEquipmentContext) { - if (scanedQty.compareTo(needQty) <= 0) return; - String message = String.format("请检查相关数据,上下文中的主条码个数[%s]已满足腔数[%s],可重置工位解决!", scanedQty, needQty); - this.sendMessage(reqBean, resultBean, message + - " --- List --- [" + getJsonMessage(equipVariableCollectContextList) + "]" + - " --- List --- [" + getJsonMessage(productionPsInContextList) + "]" + - " --- List --- [" + getJsonMessage(productionPartContextList) + "]" + - " --- MesCellEquipContext --- [" + JSONObject.toJSONString(cellEquipmentContext) + "] ---", MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); - execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), message); - } - - //集合判空转JSON - private String getJsonMessage(List list) { - return CollectionUtils.isEmpty(list) ? MesPcnExtConstWords.EMPTY : JSONObject.toJSONString(list); - } - - //封装扫/读信息:主条码信息 - private List doHandleScanProductSnContext(String organizeCode, String scanInfo, List equipVariableCollectContextList) { - - if (CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList = new ArrayList<>(); - - equipVariableCollectContextList.add(new MesEquipVariableCollectContext(organizeCode, scanInfo, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue())); - - return equipVariableCollectContextList; - - } - - //验证是否存在重复主条码 - private Boolean checkIsExistRepeatScan(MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, List productionPsInContextList) { - - //扫描条码 剔除finishCode信息 - List filterList1 = equipVariableCollectContextList.stream().filter(o -> (null != o && !o.getEquipVariableValue().equals(productionProcessContext.getFinishCode()))).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); - //已验证条码 剔除finishCode信息 - List filterList2 = CollectionUtils.isEmpty(productionPsInContextList) ? null : - productionPsInContextList.stream().filter(o -> (null != o && !o.getProductSn().equals(productionProcessContext.getFinishCode()))).map(MesProductionPsInContext::getProductSn).collect(Collectors.toList()); - - List filterList = new ArrayList<>(); - if (!CollectionUtils.isEmpty(filterList1)) filterList.addAll(filterList1); - if (!CollectionUtils.isEmpty(filterList2)) filterList.addAll(filterList2); + //从上下文中取出生产线对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - //验证是否存在重复条码 - if (!CollectionUtils.isEmpty(filterList) && filterList.size() != filterList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).size()) return true; + //排序线 扫描主条码工步 + if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return ((IStepService) SpringContextsUtil.getBean("mesProductSnScanSortStepService")).execute(reqBean); - return false; + //非排序线 扫描主条码工步 + return ((IStepService) SpringContextsUtil.getBean("mesProductSnScanNosortStepService")).execute(reqBean); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionPartNoReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionPartNoReadStepService.java index 3615eb1..be09d3e 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionPartNoReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionPartNoReadStepService.java @@ -1,9 +1,6 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; -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.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.api.iservice.base.IPartService; @@ -47,6 +44,9 @@ public class MesProductionPartNoReadStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired private IMesEquipmentLogExtService equipmentLogExtService; @Autowired @@ -59,7 +59,7 @@ public class MesProductionPartNoReadStepService extends BaseStepService { public StepResult init(StationRequestBean reqBean) { //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + productionCustomContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -115,7 +115,7 @@ public class MesProductionPartNoReadStepService extends BaseStepService { this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); //验证设备通信质量 - productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); + productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); @@ -143,7 +143,7 @@ public class MesProductionPartNoReadStepService extends BaseStepService { //发送工步内容 String scanInfo = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)); - productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + productionCustomContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); //获取产出零件信息 获取零件信息 List productionPartContextList = getProductionPartContext(reqBean, resultBean, productionProcessContext, equipVariableCollectContextList); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesReadySignalReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesReadySignalReadStepService.java index acde20c..917f50c 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesReadySignalReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesReadySignalReadStepService.java @@ -1,9 +1,6 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; -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.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipLogDispatchContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; @@ -42,6 +39,9 @@ public class MesReadySignalReadStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired private IMesEquipmentLogExtService equipmentLogExtService; @Autowired @@ -51,7 +51,7 @@ public class MesReadySignalReadStepService extends BaseStepService { public StepResult init(StationRequestBean reqBean) { //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + productionCustomContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -107,7 +107,7 @@ public class MesReadySignalReadStepService extends BaseStepService { this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); //验证设备通信质量 - productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); + productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); @@ -131,7 +131,7 @@ public class MesReadySignalReadStepService extends BaseStepService { MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); //匹配成功发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getDescription(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + productionCustomContextStepService.doSendStepContextMessage(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_CFG_CATEGORY.READY_SIGNAL.getDescription(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); //保存设备当前一轮工序的就绪信号, 写1 productionDispatchContextStepService.saveReadySignalContext(reqBean); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckNosortStepService.java index 9d47e78..4aa7733 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckNosortStepService.java @@ -8,12 +8,9 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; -import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; -import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; -import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; -import cn.estsh.i3plus.pojo.mes.model.StationKvBean; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StepResult; @@ -22,21 +19,18 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.Optional; import java.util.stream.Collectors; /** - * @Description : 加工单验证工步【非排序】 + * @Description : 加工单验证工步 【非排序】 * @Author : wangjie **/ @Slf4j @Service("mesWorkOrderCheckNosortStepService") -public class MesWorkOrderCheckNosortStepService extends BaseStepService { +public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepService { @Autowired private IMesProductionProcessContextStepService productionProcessContextStepService; @@ -47,6 +41,12 @@ public class MesWorkOrderCheckNosortStepService extends BaseStepService { @Autowired private IMesWorkOrderExtService workOrderExtService; + @Autowired + private IFsmCommonService fsmCommonService; + + @Autowired + private MesFirstMouldNoReadStepService firstMouldNoReadStepService; + @Override public StepResult execute(StationRequestBean reqBean) { @@ -65,28 +65,29 @@ public class MesWorkOrderCheckNosortStepService extends BaseStepService { //获取上下文生产扫/读信息:加工单 List equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean); - if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "上下文中缺失待验证的加工单信息!"); - //获取上下文产出零件信息 - List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); - //清除本次已获取得到的加工单信息 productionDispatchContextStepService.deleteScanWorkOrderNoContext(reqBean); + //从上下文中取出生产线对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + + //获取上下文产出零件信息 + List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + //非扫描场景 清除历史产出零件信息 - if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionDispatchContextStepService.deleteProductionPartContext(reqBean); + if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) deleteBusiData(reqBean); //验证工单的有效性 List productionPartContextList = new ArrayList<>(); - if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, equipVariableCollectContextList, productionPartContextList).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter, equipVariableCollectContextList, productionPartContextList).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); //扫描场景下合并历史产出零件信息 if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionPartContextList.addAll(cachedProductionPartContextList); - //非扫描场景 验证是否全部为空腔 - if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && checkIsAllFinishCode(productionPartContextList)) - return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前%s信息全部为空腔!", MesExtEnumUtil.CELL_MESSAGE_SOURCE.valueOfDescription(equipVariableCollectContextList.get(0).getMessageSource()))); + //保存零件数据信息 + if (!firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, true).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); //保存上下文产出零件信息 productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList); @@ -94,92 +95,27 @@ public class MesWorkOrderCheckNosortStepService extends BaseStepService { //更新展示组件MODULE_CONTENT内容 doCacheMoudleContext(reqBean, productionPartContextList); - if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的加工单%s验证工单状态成功!", stepResult.getObj().toString())); - //当前工位使用的设备 MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); - - if (cellEquipmentContext.getCavity().compareTo(productionPartContextList.size()) > 0) + if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && cellEquipmentContext.getCavity().compareTo(productionPartContextList.size()) > 0) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息加工单[%s]验证工单状态成功,已知腔数[%s],还需要再连续扫描[%s]次加工单!", equipVariableCollectContextList.get(0).getEquipVariableValue(), cellEquipmentContext.getCavity(), cellEquipmentContext.getCavity() - productionPartContextList.size())); - //扫描场景 验证是否全部为空腔 + //验证是否全部为空腔 if (!checkIsAllFinishCode(productionPartContextList)) - return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息加工单[%s]验证工单状态成功,上下文中的加工单个数[%s]已满足腔数!", equipVariableCollectContextList.get(0).getEquipVariableValue(), productionPartContextList.size())); + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前%s加工单%s验证工单状态成功%s!", + MesExtEnumUtil.CELL_MESSAGE_SOURCE.valueOfDescription(equipVariableCollectContextList.get(0).getMessageSource()), + equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString(), + MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() ? String.format(",上下文中的加工单个数[%s]已满足腔数", productionPartContextList.size()) : MesPcnExtConstWords.EMPTY)); //删除上下文产出零件信息 productionDispatchContextStepService.deleteProductionPartContext(reqBean); - return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前扫描信息全部为空腔!"); - - } - - private Boolean checkIsAllFinishCode(List productionPartContextList) { - Optional optional = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); - return (null != optional && optional.isPresent()) ? false : true; - } - - //验证工单的有效性 - private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, - MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, List productionPartContextList) { - - //搜集生产工单号 - List filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); - List workOrderNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList()); - - //获取生产工单信息 - Map workOrderMap = workOrderExtService.getWorkOrderMap(reqBean.getOrganizeCode(), workOrderNoList); - - if (!CollectionUtils.isEmpty(workOrderNoList)) { - - for (String workOrderNo : workOrderNoList) { - - if (StringUtils.isEmpty(workOrderNo)) continue; - - MesWorkOrder workOrderDb = (CollectionUtils.isEmpty(workOrderMap) || !workOrderMap.containsKey(workOrderNo)) ? null : workOrderMap.get(workOrderNo); - if (null == workOrderDb) - return stepResult.isCompleted(false).msg(String.format("加工单号[%s]无效!", workOrderNo)); - - if (!MesExtEnumUtil.ORDER_STATUS.checkNosortAllowStatus(workOrderDb.getWorkOrderStatus())) - return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息工单状态[%s]!", workOrderNo, MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrderDb.getWorkOrderStatus()))); - - if (!workOrderDb.getWorkCenterCode().equals(reqBean.getWorkCenterCode())) - return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", workOrderNo, workOrderDb.getWorkCenterCode(), reqBean.getWorkCenterCode())); - - } - } - - //封装产出零件信息 - equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add( - new MesProductionPartContext().copyPartNo((!CollectionUtils.isEmpty(workOrderMap) && workOrderMap.containsKey(o.getEquipVariableValue())) ? workOrderMap.get(o.getEquipVariableValue()) : null))); - - return stepResult.obj(filterList); + return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中的加工单信息全部为空腔,已清除当前的空腔数据!"); } - private void doCacheMoudleContext(StationRequestBean reqBean, List productionPartContextList) { - //存储展示组件MODULE_CONTENT内容 - productionDispatchContextStepService.saveModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList)); - } - - //封装展示组件MODULE_CONTENT内容 - private List> getModuleContextData(StationRequestBean reqBean, List productionPartContextList) { - List> dataList = new ArrayList<>(); - List orderList = filterProductionPartContext(productionPartContextList, true); - List finishCodeList = filterProductionPartContext(productionPartContextList, false); - if (!CollectionUtils.isEmpty(orderList)) - orderList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), - new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "工单号", o.getWorkOrderNo()), new StationKvBean(MesPcnExtConstWords.PART_NO, "零件编码", o.getPartNo()), new StationKvBean(MesPcnExtConstWords.QTY, "工单数", String.valueOf(o.getQty().intValue())))); - if (!CollectionUtils.isEmpty(finishCodeList)) - StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.CAVITY_FINISH_CODE, "空腔数", String.valueOf(finishCodeList.size()))); - return dataList; - } - //根据是否空腔搜集数据 - private List filterProductionPartContext(List productionPartContextList, Boolean flag) { - return flag ? productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()) : - productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).collect(Collectors.toList()); - } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepService.java index 35871d7..aac432d 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepService.java @@ -9,12 +9,8 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; -import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; -import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; -import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; -import cn.estsh.i3plus.pojo.mes.model.StationKvBean; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StepResult; @@ -23,21 +19,18 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; -import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.Optional; import java.util.stream.Collectors; /** - * @Description : 加工单验证工步【排序】 + * @Description : 加工单验证工步 【排序】 * @Author : wangjie **/ @Slf4j @Service("mesWorkOrderCheckSortStepService") -public class MesWorkOrderCheckSortStepService extends BaseStepService { +public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepService { @Autowired private IMesProductionProcessContextStepService productionProcessContextStepService; @@ -51,6 +44,9 @@ public class MesWorkOrderCheckSortStepService extends BaseStepService { @Autowired private IFsmCommonService fsmCommonService; + @Autowired + private MesFirstMouldNoReadStepService firstMouldNoReadStepService; + @Override public StepResult execute(StationRequestBean reqBean) { @@ -69,32 +65,34 @@ public class MesWorkOrderCheckSortStepService extends BaseStepService { //获取上下文生产扫/读信息:加工单 List equipVariableCollectContextList = productionDispatchContextStepService.getScanWorkOrderNoContext(reqBean); - if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "上下文中缺失待验证的加工单信息!"); - //获取上下文产出零件信息 - List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); - //清除本次已获取得到的加工单信息 productionDispatchContextStepService.deleteScanWorkOrderNoContext(reqBean); - //扫描场景下验证是否匹配工艺跳过码, 验证通过则 保存到上下文扫/读信息:主条码, 传送到下个工步 主条码验证工步, 避免后续排序工单的数量不是1的情况下, 扫描工艺跳过码只能在扫描主条码工步中使用 - if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && matchCraftJumpCode(reqBean, equipVariableCollectContextList)) + //从上下文中取出生产线对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + + //排序线: 存在已验证的主条码信息时, 验证扫描信息是否属于工艺跳过码, 保存到读/扫主条码上下文中 + if (productionDispatchContextStepService.checkProductionPsInIsExistContext(reqBean) && doMatchCraftJumpCode(reqBean, equipVariableCollectContextList)) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息工艺跳过码[%s]!", equipVariableCollectContextList.get(0).getEquipVariableValue())); + //获取上下文产出零件信息 + List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + //非扫描场景 清除历史产出零件信息 - if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionDispatchContextStepService.deleteProductionPartContext(reqBean); + if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) cachedProductionPartContextList = deleteBusiData(reqBean); //验证工单的有效性 List productionPartContextList = new ArrayList<>(); - if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, equipVariableCollectContextList, productionPartContextList).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter, equipVariableCollectContextList, productionPartContextList).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); //扫描场景下合并历史产出零件信息 + if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && productionDispatchContextStepService.checkProductionPsInIsExistContext(reqBean)) cachedProductionPartContextList = deleteBusiData(reqBean); if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionPartContextList.addAll(cachedProductionPartContextList); - //非扫描场景 验证是否全部为空腔 - if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource() && checkIsAllFinishCode(productionPartContextList)) - return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前%s信息全部为空腔!", MesExtEnumUtil.CELL_MESSAGE_SOURCE.valueOfDescription(equipVariableCollectContextList.get(0).getMessageSource()))); + //保存零件数据信息 + if (!firstMouldNoReadStepService.savePartDataMap(reqBean, resultBean, stepResult, productionProcessContext, productionPartContextList, true).isCompleted()) return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); //保存上下文产出零件信息 productionDispatchContextStepService.saveProductionPartContext(reqBean, productionPartContextList); @@ -102,110 +100,25 @@ public class MesWorkOrderCheckSortStepService extends BaseStepService { //更新展示组件MODULE_CONTENT内容 doCacheMoudleContext(reqBean, productionPartContextList); - if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource()) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("上下文中的加工单%s验证工单状态成功!", stepResult.getObj().toString())); - //当前工位使用的设备 MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); - - if (cellEquipmentContext.getCavity().compareTo(productionPartContextList.size()) > 0) + if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && cellEquipmentContext.getCavity().compareTo(productionPartContextList.size()) > 0) return execDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前扫描信息加工单[%s]验证工单状态成功,已知腔数[%s],还需要再连续扫描[%s]次加工单!", equipVariableCollectContextList.get(0).getEquipVariableValue(), cellEquipmentContext.getCavity(), cellEquipmentContext.getCavity() - productionPartContextList.size())); - //扫描场景 验证是否全部为空腔 + //验证是否全部为空腔 if (!checkIsAllFinishCode(productionPartContextList)) - return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前扫描信息加工单[%s]验证工单状态成功,上下文中的加工单个数[%s]已满足腔数!", equipVariableCollectContextList.get(0).getEquipVariableValue(), productionPartContextList.size())); + return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前%s加工单%s验证工单状态成功%s!", + MesExtEnumUtil.CELL_MESSAGE_SOURCE.valueOfDescription(equipVariableCollectContextList.get(0).getMessageSource()), + equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()).toString(), + MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() ? String.format(",上下文中的加工单个数[%s]已满足腔数", productionPartContextList.size()) : MesPcnExtConstWords.EMPTY)); //删除上下文产出零件信息 productionDispatchContextStepService.deleteProductionPartContext(reqBean); - return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前扫描信息全部为空腔!"); - - } - - //验证是否匹配工艺跳过码 - private Boolean matchCraftJumpCode(StationRequestBean reqBean, List equipVariableCollectContextList) { - - if (!equipVariableCollectContextList.get(0).getEquipVariableValue().equals(getCraftJumpCode(reqBean))) return false; - - //保存上下文扫/读信息:主条码, 传送到下个工步 主条码验证工步, 避免后续排序工单的数量不是1的情况下, 扫描工艺跳过码只能在扫描主条码工步中使用 - productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList); - - return true; - - } - - private Boolean checkIsAllFinishCode(List productionPartContextList) { - Optional optional = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); - return (null != optional && optional.isPresent()) ? false : true; - } - - //验证工单的有效性 - private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, - MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, List productionPartContextList) { - - //搜集生产工单号 - List filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); - List workOrderNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList()); - - //获取生产工单信息 - Map workOrderMap = workOrderExtService.getWorkOrderMap(reqBean.getOrganizeCode(), workOrderNoList); - - if (!CollectionUtils.isEmpty(workOrderNoList)) { - - for (String workOrderNo : workOrderNoList) { - - if (StringUtils.isEmpty(workOrderNo)) continue; - - MesWorkOrder workOrderDb = (CollectionUtils.isEmpty(workOrderMap) || !workOrderMap.containsKey(workOrderNo)) ? null : workOrderMap.get(workOrderNo); - if (null == workOrderDb) - return stepResult.isCompleted(false).msg(String.format("加工单号[%s]无效!", workOrderNo)); - - if (!MesExtEnumUtil.ORDER_STATUS.checkSortAllowStatus(workOrderDb.getWorkOrderStatus())) - return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息工单状态[%s]!", workOrderNo, MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrderDb.getWorkOrderStatus()))); - - if (!workOrderDb.getWorkCenterCode().equals(reqBean.getWorkCenterCode())) - return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", workOrderNo, workOrderDb.getWorkCenterCode(), reqBean.getWorkCenterCode())); - - } - } - - //封装产出零件信息 - equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add( - new MesProductionPartContext().copyPartNo((!CollectionUtils.isEmpty(workOrderMap) && workOrderMap.containsKey(o.getEquipVariableValue())) ? workOrderMap.get(o.getEquipVariableValue()) : null))); - - return stepResult.obj(filterList); - - } - - //工艺跳过码 - private String getCraftJumpCode(StationRequestBean reqBean) { - Map wcpcMap = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean); - return wcpcMap.containsKey(MesPcnExtConstWords.CRAFT_JUMP_CODE) ? wcpcMap.get(MesPcnExtConstWords.CRAFT_JUMP_CODE) : MesPcnExtConstWords.CRAFT_JUMP_CODE; - } - - private void doCacheMoudleContext(StationRequestBean reqBean, List productionPartContextList) { - //存储展示组件MODULE_CONTENT内容 - productionDispatchContextStepService.saveModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList)); - } - - //封装展示组件MODULE_CONTENT内容 - private List> getModuleContextData(StationRequestBean reqBean, List productionPartContextList) { - List> dataList = new ArrayList<>(); - List orderList = filterProductionPartContext(productionPartContextList, true); - List finishCodeList = filterProductionPartContext(productionPartContextList, false); - if (!CollectionUtils.isEmpty(orderList)) - orderList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), - new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "工单号", o.getWorkOrderNo()), new StationKvBean(MesPcnExtConstWords.PART_NO, "零件编码", o.getPartNo()), new StationKvBean(MesPcnExtConstWords.QTY, "工单数", String.valueOf(o.getQty().intValue())))); - if (!CollectionUtils.isEmpty(finishCodeList)) - StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.CAVITY_FINISH_CODE, "空腔数", String.valueOf(finishCodeList.size()))); - return dataList; - } + return execNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前上下文中的加工单信息全部为空腔,已清除当前的空腔数据!"); - //根据是否空腔搜集数据 - private List filterProductionPartContext(List productionPartContextList, Boolean flag) { - return flag ? productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) != 0)).collect(Collectors.toList()) : - productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckStepService.java index 2efbbcc..8d4c977 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckStepService.java @@ -2,10 +2,19 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesWorkOrderExtService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmCommonService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.IStepService; +import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StepResult; @@ -14,6 +23,14 @@ import cn.estsh.impp.framework.boot.util.SpringContextsUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; /** * @Description : 加工单验证工步 @@ -29,6 +46,15 @@ public class MesWorkOrderCheckStepService extends BaseStepService { @Autowired private IMesProductionDispatchContextStepService productionDispatchContextStepService; + @Autowired + private IMesWorkOrderExtService workOrderExtService; + + @Autowired + private IFsmCommonService fsmCommonService; + + @Autowired + private MesFirstMouldNoReadStepService firstMouldNoReadStepService; + @Override public StepResult execute(StationRequestBean reqBean) { @@ -49,11 +75,101 @@ public class MesWorkOrderCheckStepService extends BaseStepService { MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); //排序线 加工单验证工步 - if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckSortStepService")).execute(reqBean); + if (MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue() == workCenter.getCenterType()) return ((IStepService) SpringContextsUtil.getBean("mesProductSnCheckSortStepService")).execute(reqBean); //非排序线 加工单验证工步 - return ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckNosortStepService")).execute(reqBean); + return ((IStepService) SpringContextsUtil.getBean("mesProductSnCheckNosortStepService")).execute(reqBean); + + } + + public List deleteBusiData(StationRequestBean reqBean) { + productionDispatchContextStepService.deleteProductionPartContext(reqBean); + productionDispatchContextStepService.deleteProductionPsInContext(reqBean); + productionDispatchContextStepService.deleteProductionPsOutContext(reqBean); + productionDispatchContextStepService.deleteProdRuleDataContext(reqBean); + return null; + } + + //验证扫描信息是否属于工艺跳过码 + public Boolean doMatchCraftJumpCode(StationRequestBean reqBean, List equipVariableCollectContextList) { + if (equipVariableCollectContextList.size() != 1 || MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() != equipVariableCollectContextList.get(0).getMessageSource()) return false; + String craftJumpCode = fsmCommonService.doHandleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.CRAFT_JUMP_CODE); + if (StringUtils.isEmpty(craftJumpCode)) craftJumpCode = MesPcnExtConstWords.CRAFT_JUMP_CODE; + if (!equipVariableCollectContextList.get(0).getEquipVariableValue().equals(craftJumpCode)) return false; + productionDispatchContextStepService.saveScanProductSnContext(reqBean, equipVariableCollectContextList); + return true; + } + + //验证是否全部为空腔 + public Boolean checkIsAllFinishCode(List productionPartContextList) { + Optional optional = productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).findFirst(); + return (null != optional && optional.isPresent()) ? false : true; + } + + //验证工单的有效性 + public StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, + List equipVariableCollectContextList, List productionPartContextList) { + + //搜集生产工单号 + List filterList = equipVariableCollectContextList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.toList()); + List workOrderNoList = filterList.stream().filter(o -> (!StringUtils.isEmpty(o) && !o.equals(productionProcessContext.getFinishCode()))).distinct().collect(Collectors.toList()); + + //获取生产工单信息 + List workOrderList = workOrderExtService.getWorkOrderList(reqBean.getOrganizeCode(), workOrderNoList); + Map> workOrderMap = CollectionUtils.isEmpty(workOrderList) ? null : workOrderList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrder::getWorkOrderNo)); + + if (!CollectionUtils.isEmpty(workOrderNoList)) { + + for (String workOrderNo : workOrderNoList) { + + if (StringUtils.isEmpty(workOrderNo)) continue; + + List workOrderDbList = CollectionUtils.isEmpty(workOrderMap) ? null : workOrderMap.get(workOrderNo); + if (CollectionUtils.isEmpty(workOrderDbList)) + return stepResult.isCompleted(false).msg(String.format("加工单号[%s]无效!", workOrderNo)); + + if (workOrderDbList.size() != 1) + return stepResult.isCompleted(false).msg(String.format("请检查生产工单信息,加工单号[%s]存在重复!", workOrderNo)); + + if (!MesExtEnumUtil.ORDER_STATUS.checkAllowStatus(workCenter.getCenterType(), workOrderDbList.get(0).getWorkOrderStatus())) + return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息工单状态[%s]!", workOrderNo, MesExtEnumUtil.ORDER_STATUS.valueOfDescription(workOrderDbList.get(0).getWorkOrderStatus()))); + + if (!workOrderDbList.get(0).getWorkCenterCode().equals(reqBean.getWorkCenterCode())) + return stepResult.isCompleted(false).msg(String.format("加工单[%s]信息所属生产线[%s]与当前生产线[%s]不一致!", workOrderNo, workOrderDbList.get(0).getWorkCenterCode(), reqBean.getWorkCenterCode())); + + } + } + + //封装产出零件信息 + equipVariableCollectContextList.stream().filter(o -> null != o).forEach(o -> productionPartContextList.add( + new MesProductionPartContext().copyPartNo((!CollectionUtils.isEmpty(workOrderMap) && workOrderMap.containsKey(o.getEquipVariableValue())) ? workOrderMap.get(o.getEquipVariableValue()).get(0) : null, o.getMessageSource()))); + + return stepResult.obj(filterList); + + } + + public void doCacheMoudleContext(StationRequestBean reqBean, List productionPartContextList) { + //存储展示组件MODULE_CONTENT内容 + productionDispatchContextStepService.saveModuleContentContext(reqBean, getModuleContextData(reqBean, productionPartContextList)); + } + + //封装展示组件MODULE_CONTENT内容 + public List> getModuleContextData(StationRequestBean reqBean, List productionPartContextList) { + List> dataList = new ArrayList<>(); + List orderList = filterProductionPartContext(productionPartContextList, true); + List finishCodeList = filterProductionPartContext(productionPartContextList, false); + if (!CollectionUtils.isEmpty(orderList)) + orderList.forEach(o -> StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), + new StationKvBean(MesPcnExtConstWords.WORK_ORDER_NO, "工单号", o.getWorkOrderNo()), new StationKvBean(MesPcnExtConstWords.PART_NO, "零件编码", o.getPartNo()), new StationKvBean(MesPcnExtConstWords.QTY, "工单数", String.valueOf(o.getQty().intValue())))); + if (!CollectionUtils.isEmpty(finishCodeList)) + StationKvBeanUtil.addStationKvBeanList(dataList, new ArrayList<>(), new StationKvBean(MesPcnExtConstWords.CAVITY_FINISH_CODE, "空腔数", String.valueOf(finishCodeList.size()))); + return dataList; + } + //根据是否空腔搜集数据 + public List filterProductionPartContext(List productionPartContextList, Boolean flag) { + return flag ? productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()) : + productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)).collect(Collectors.toList()); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderReadStepService.java index 3e88058..e2d2c0b 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderReadStepService.java @@ -1,9 +1,6 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipVariableCfgRuleMatchDispatchService; -import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesEquipmentLogExtService; -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.api.busi.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipLogDispatchContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; @@ -44,6 +41,9 @@ public class MesWorkOrderReadStepService extends BaseStepService { private IMesProductionDispatchContextStepService productionDispatchContextStepService; @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired private IMesEquipmentLogExtService equipmentLogExtService; @Autowired @@ -53,7 +53,7 @@ public class MesWorkOrderReadStepService extends BaseStepService { public StepResult init(StationRequestBean reqBean) { //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + productionCustomContextStepService.doSendStepContextMessage(reqBean); return super.init(reqBean); @@ -75,6 +75,8 @@ public class MesWorkOrderReadStepService extends BaseStepService { //当前工序已存在读取待验证的加工单信息 if (productionDispatchContextStepService.checkScanWorkOrderNoIsExistContext(reqBean)) return stepResult; + //TODO 后面增加工艺跳过码 通过按钮触发 写入 ScanWorkOrderNoContext 数据类型:扫描信息 直接放行 + //获取生产过程上下文对象有异常信息 抛出异常 if (!productionProcessContextStepService.getEquipmentVariableCfgList(productionProcessContext).getSuccess()) execExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); @@ -109,7 +111,7 @@ public class MesWorkOrderReadStepService extends BaseStepService { this.sendMessage(reqBean, resultBean, JSONObject.toJSONString(equipLogDispatchContext), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); //验证设备通信质量 - productionDispatchContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); + productionCustomContextStepService.sendEquipQualityMessage(reqBean, cellEquipContext); if (!equipmentLogExtService.checkEquipQuality(cellEquipContext.getQuality())) execDynamicsCompleteAndSendMsg(reqBean, resultBean.writeDbLog(), stepResult, false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("请检查设备的质量状态,读取到设备[%s]的数据变量质量值为[%s]!", cellEquipContext.getEquipmentCode(), cellEquipContext.getQuality())); @@ -140,7 +142,7 @@ public class MesWorkOrderReadStepService extends BaseStepService { //发送工步内容 String scanInfo = equipVariableCollectContextList.stream().filter(o -> null != o).map(MesEquipVariableCollectContext::getEquipVariableValue).collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)); - productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + productionCustomContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("当前已读取到设备[%s]加工单信息[%s]!", cellEquipContext.getEquipmentCode(), scanInfo)); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderScanStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderScanStepService.java index c793a2b..6cdf732 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderScanStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderScanStepService.java @@ -1,8 +1,8 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionDispatchContextStepService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; @@ -38,10 +38,13 @@ public class MesWorkOrderScanStepService extends BaseStepService { @Autowired private IMesProductionDispatchContextStepService productionDispatchContextStepService; + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + @Override public StepResult guide(StationRequestBean reqBean) { - productionDispatchContextStepService.doSendStepContextMessage(reqBean); + productionCustomContextStepService.doSendStepContextMessage(reqBean); return execSuccessCompleteAndSendGuideReturn(reqBean, new StationResultBean().writeDbLog(), "请扫描加工单!"); @@ -66,9 +69,6 @@ public class MesWorkOrderScanStepService extends BaseStepService { //存储生产过程上下文对象 productionProcessContextStepService.saveProductionProcessContext(reqBean, productionProcessContext); - //当前工位使用的设备 - MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); - //如果没有扫描信息, 取手选工单信息, 封装扫/读信息:加工单信息 List equipVariableCollectContextList; if (!StringUtils.isEmpty(scanInfo)) equipVariableCollectContextList = doHandleScanWorkOrderNoContext(reqBean, stepResult, scanInfo); @@ -93,7 +93,7 @@ public class MesWorkOrderScanStepService extends BaseStepService { equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), scanInfo, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue())); //发送工步内容 - productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN); + productionCustomContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN); stepResult.msg(String.format("当前扫描信息加工单[%s]!", scanInfo)); @@ -104,19 +104,18 @@ public class MesWorkOrderScanStepService extends BaseStepService { //封装扫/读信息:加工单信息 (选择) private List doHandleScanWorkOrderNoContext(StationRequestBean reqBean, StepResult stepResult) { - List chooseCavityOrder = productionDispatchContextStepService.getFunctionChooseCavityOrderContext(reqBean); + List chooseCavityOrder = productionCustomContextStepService.getFunctionChooseCavityOrderContext(reqBean); if (CollectionUtils.isEmpty(chooseCavityOrder)) return null; List pickList = new ArrayList<>(Arrays.asList(chooseCavityOrder.stream().filter(o -> (null != o && o.getKey().equals(MesPcnExtConstWords.WORK_ORDER_NO))).findFirst().get().getValue().split(MesPcnExtConstWords.SEMICOLON))); List equipVariableCollectContextList = new ArrayList<>(); - pickList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o -> equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), o, TimeTool.getNowTime(true), MesExtEnumUtil.CELL_MESSAGE_SOURCE.PICK.getValue()))); //发送工步内容 String scanInfo = chooseCavityOrder.stream().filter(o -> null != o).map(o -> o.getName() + "[" + o.getValue() + "]").collect(Collectors.joining(MesPcnExtConstWords.SEMICOLON)); - productionDispatchContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.PICK); + productionCustomContextStepService.doSendStepContextMessage(reqBean, scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE.PICK); stepResult.msg(String.format("当前选择信息%s!", scanInfo)); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java new file mode 100644 index 0000000..88f4c26 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java @@ -0,0 +1,143 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.context; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionCustomContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.model.StationKvBean; +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 com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.StringJoiner; + +/** + * @Description : 获取生产过程上下文对象接口实现【BUSI】 + * @Author : wangjie + **/ +@Slf4j +@Service("mesProductionDispatchContextStepService") +public class MesProductionCustomContextStepService extends BaseStepService implements IMesProductionCustomContextStepService { + + //发送设备质量信息 + @Override + public void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext) { + StationResultBean resultBean = new StationResultBean() + .busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.QUALITY_MODULE.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.COLOR.getValue()).resultObj(MesExtEnumUtil.EQUIP_LOG_QUALITY.valueOfColor(cellEquipContext.getQuality())); + this.sendMessage(reqBean, resultBean); + } + + //工位加工锁KEY + private String getProductionLockContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PRODUCTION_LOCK_CONTEXT).toString()); } + + //验证上下文工位加工锁是否存在 + @Override + public Boolean checkProductionLockIsExistContext(StationRequestBean reqBean) { + String value = getFsmBusiData(reqBean.getOrganizeCode(), getProductionLockContextKey(reqBean)); + return !StringUtils.isEmpty(value) ? true : false; + } + + //保存上下文加工锁 + @Override + public Boolean saveProductionLockContext(StationRequestBean reqBean, String value) { + return saveFsmBusiData(reqBean.getOrganizeCode(), getProductionLockContextKey(reqBean), value); + } + + //删除上下文加工锁 + @Override + public void deleteProductionLockContext(StationRequestBean reqBean) { + deleteFsmBusiData(reqBean.getOrganizeCode(), getProductionLockContextKey(reqBean)); + } + + //上个扫描/读取信息KEY + private String getLastScanContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.LAST_SCAN_INFO_CONTEXT).toString()); } + + //存储上个扫描/读取信息 + @Override + public Boolean saveLastScanContext(StationRequestBean reqBean, List dataList) { + return saveFsmBusiData(reqBean.getOrganizeCode(), getLastScanContextKey(reqBean), JSONObject.toJSONString(dataList)); + } + + //获取上个扫描/读取信息 + @Override + public List getLastScanContext(StationRequestBean reqBean) { + String lastScanContent = getFsmBusiData(reqBean.getOrganizeCode(), getLastScanContextKey(reqBean)); + return StringUtils.isEmpty(lastScanContent) ? new ArrayList<>() : JSONObject.parseArray(lastScanContent, StationKvBean.class); + } + + //发送工步内容 + @Override + public void doSendStepContextMessage(StationRequestBean reqBean) { + sendStepContextMessage(reqBean, getLastScanContext(reqBean)); + } + + //发送工步内容 + @Override + public void doSendStepContextMessage(StationRequestBean reqBean, String scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE source) { + + List lastScanContext = getLastScanContext(reqBean); + + lastScanContext = StationKvBeanUtil.addStationKvBeanLimix100ThenHalf(lastScanContext, new StationKvBean().name(source.getDescription()).value(scanInfo)); + + saveLastScanContext(reqBean, lastScanContext); + + sendStepContextMessage(reqBean, lastScanContext); + + } + + //发送工步内容 + @Override + public void sendStepContextMessage(StationRequestBean reqBean, List lastScanContext) { + StationResultBean resultBean = new StationResultBean() + .busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.KEY_VALUE.getValue()) + .resultList(StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), + lastScanContext.size() > 1 ? lastScanContext.get(1).name("上次" + lastScanContext.get(1).getName()).key(MesPcnExtConstWords.LAST_SCAN_INFO) : null, + lastScanContext.size() > 0 ? lastScanContext.get(0).name("当前" + lastScanContext.get(0).getName()).key(MesPcnExtConstWords.SCAN_INFO) : null)); + this.sendMessage(reqBean, resultBean); + } + + + //手选腔数及工单信息KEY + private String getChooseCavityOrderContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER).toString()); } + + //获取手动选择的腔数及工单信息上下文 + @Override + public List getFunctionChooseCavityOrderContext(StationRequestBean reqBean) { + String chooseCavityOrderJson = getFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean)); + return !StringUtils.isEmpty(chooseCavityOrderJson) ? JSONObject.parseArray(chooseCavityOrderJson, StationKvBean.class) : null; + } + + //保存手动选择的腔数及工单信息上下文 腔数=工单个数 数据格式: [StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=1)] + @Override + public Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List resultList) { + if (CollectionUtils.isEmpty(resultList)) return false; + return saveFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean), JSONObject.toJSONString(resultList)); + } + + //删除手动选择的腔数及工单信息上下文 + @Override + public void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean) { + deleteFsmBusiData(reqBean.getOrganizeCode(), getChooseCavityOrderContextKey(reqBean)); + } + + //开班信息KEY 【PS:生产线级别】 + private String getProdShiftContextKey(StationRequestBean reqBean) { return new StringJoiner(MesPcnExtConstWords.COLON).add(reqBean.getOrganizeCode()).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.PROD_SHIFT_DATA_CONTEXT).add(reqBean.getWorkCenterCode()).toString(); } + + + + + + + + + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java index 3ff199b..89e48cd 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionDispatchContextStepService.java @@ -6,18 +6,14 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; -import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesPart; -import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; 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 com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.google.common.base.Objects; -import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -36,37 +32,10 @@ import java.util.StringJoiner; @Service("mesProductionDispatchContextStepService") public class MesProductionDispatchContextStepService extends BaseStepService implements IMesProductionDispatchContextStepService { - private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT); } + private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.BUSI_DATA_CONTEXT).toString()); } private String getContextKey(String organizeCode, String busiCode) { return new StringJoiner(":").add(organizeCode).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(busiCode).toString(); } - //验证上下文工位加工锁是否存在 - @Override - public Boolean checkProductionLockIsExistContext(StationRequestBean reqBean) { - String value = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_LOCK_CONTEXT); - return !StringUtils.isEmpty(value) ? true : false; - } - - //保存上下文加工锁 - @Override - public Boolean saveProductionLockContext(StationRequestBean reqBean, String value) { - return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_LOCK_CONTEXT, value); - } - - //删除上下文加工锁 - @Override - public void deleteProductionLockContext(StationRequestBean reqBean) { - deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_LOCK_CONTEXT); - } - - //发送设备质量信息 - @Override - public void sendEquipQualityMessage(StationRequestBean reqBean, MesCellEquipContext cellEquipContext) { - StationResultBean resultBean = new StationResultBean() - .busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.QUALITY_MODULE.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.COLOR.getValue()).resultObj(MesExtEnumUtil.EQUIP_LOG_QUALITY.valueOfColor(cellEquipContext.getQuality())); - this.sendMessage(reqBean, resultBean); - } - //存储展示组件MODULE_CONTENT内容 @Override public Boolean saveModuleContentContext(StationRequestBean reqBean, List> dataList) { @@ -79,50 +48,6 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp return StringUtils.isEmpty(moduleContent) ? null : JSONObject.parseObject(moduleContent, new TypeReference>>() {}); } - //存储上个扫描/读取信息 - @Override - public Boolean saveLastScanContext(StationRequestBean reqBean, List dataList) { - return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.LAST_SCAN_INFO_CONTEXT, JSONObject.toJSONString(dataList)); - } - - //获取上个扫描/读取信息 - @Override - public List getLastScanContext(StationRequestBean reqBean) { - String lastScanContent = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.LAST_SCAN_INFO_CONTEXT); - return StringUtils.isEmpty(lastScanContent) ? new ArrayList<>() : JSONObject.parseArray(lastScanContent, StationKvBean.class); - } - - //发送工步内容 - @Override - public void doSendStepContextMessage(StationRequestBean reqBean) { - sendStepContextMessage(reqBean, getLastScanContext(reqBean)); - } - - //发送工步内容 - @Override - public void doSendStepContextMessage(StationRequestBean reqBean, String scanInfo, MesExtEnumUtil.CELL_MESSAGE_SOURCE source) { - - List lastScanContext = getLastScanContext(reqBean); - - lastScanContext = StationKvBeanUtil.addStationKvBeanLimix100ThenHalf(lastScanContext, new StationKvBean().name(source.getDescription()).value(scanInfo)); - - saveLastScanContext(reqBean, lastScanContext); - - sendStepContextMessage(reqBean, lastScanContext); - - } - - //发送工步内容 - @Override - public void sendStepContextMessage(StationRequestBean reqBean, List lastScanContext) { - StationResultBean resultBean = new StationResultBean() - .busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.STEP_CONTENT.getValue()).dataType(MesPcnEnumUtil.STATION_DATA_TYPE.KEY_VALUE.getValue()) - .resultList(StationKvBeanUtil.addStationKvBeanList(new ArrayList<>(), - lastScanContext.size() > 1 ? lastScanContext.get(1).name("上次" + lastScanContext.get(1).getName()).key(MesPcnExtConstWords.LAST_SCAN_INFO) : null, - lastScanContext.size() > 0 ? lastScanContext.get(0).name("当前" + lastScanContext.get(0).getName()).key(MesPcnExtConstWords.SCAN_INFO) : null)); - this.sendMessage(reqBean, resultBean); - } - //获取上下文加工结果 @Override public String getProductResultContext(StationRequestBean reqBean) { @@ -556,26 +481,6 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PRODUCTION_STATISTICS_CONTEXT); } - //获取手动选择的腔数及工单信息上下文 - @Override - public List getFunctionChooseCavityOrderContext(StationRequestBean reqBean) { - String chooseCavityOrderJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER); - return !StringUtils.isEmpty(chooseCavityOrderJson) ? JSONObject.parseArray(chooseCavityOrderJson, StationKvBean.class) : null; - } - - //保存手动选择的腔数及工单信息上下文 腔数=工单个数 数据格式: [StationKvBean(key=cavity, name=腔数, value=3, seq=0), StationKvBean(key=workOrderNo, name=加工单, value=工单1;工单2;工单3, seq=1)] - @Override - public Boolean saveFunctionChooseCavityOrderContext(StationRequestBean reqBean, List resultList) { - if (CollectionUtils.isEmpty(resultList)) return false; - return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER, JSONObject.toJSONString(resultList)); - } - - //删除手动选择的腔数及工单信息上下文 - @Override - public void deleteFunctionChooseCavityOrderContext(StationRequestBean reqBean) { - deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.FUNCTION_CHOOSE_CAVITY_ORDER); - } - @Override public List getMesRawPartChargingDataContext(StationRequestBean reqBean) { String mesRawPartChargingDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT"); @@ -593,44 +498,4 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "RAW_PART_CHARGING_DATA_CONTEXT"); } - - - - - - - - - @Deprecated - //获取上下文产出条码数据信息集合 - @Override - public List getOutProduceSnDataContext(StationRequestBean reqBean) { - String outProduceSnDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "OUT_PRODUCE_SN_DATA_CONTEXT"); - return !StringUtils.isEmpty(outProduceSnDataJson) ? JSONObject.parseArray(outProduceSnDataJson, MesProduceSn.class) : null; - } - - @Deprecated - //验证上下文产出条码数据信息集合是否存在 - @Override - public Boolean checkOutProduceSnDataIsExistContext(StationRequestBean reqBean) { - String outProduceSnDataJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "OUT_PRODUCE_SN_DATA_CONTEXT"); - return !StringUtils.isEmpty(outProduceSnDataJson) ? true : false; - } - - @Deprecated - //保存上下文产出条码数据信息集合 [JSON]List - @Override - public Boolean saveOutProduceSnDataContext(StationRequestBean reqBean, List outProduceSnDataList) { - if (CollectionUtils.isEmpty(outProduceSnDataList)) return false; - return saveFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "OUT_PRODUCE_SN_DATA_CONTEXT", JSONObject.toJSONString(outProduceSnDataList)); - } - - @Deprecated - //删除上下文产出条码数据信息集合 - @Override - public void deleteOutProduceSnDataContext(StationRequestBean reqBean) { - deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), "OUT_PRODUCE_SN_DATA_CONTEXT"); - } - - } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java index bbddfab..0602333 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionProcessContextStepService.java @@ -19,10 +19,7 @@ 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.Map; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; /** @@ -45,7 +42,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl @Autowired private IConfigService configService; - private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT); } + private String getContextKey(StationRequestBean reqBean) { return getFsmBusikey(reqBean, new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCTION_PROCESS_CONTEXT).add(MesPcnExtConstWords.BASE_DATA_CONTEXT).toString()); } //存储生产过程上下文对象【工步根据业务实际情况执行,配置错误等情况无需执行】 @Override @@ -55,7 +52,7 @@ public class MesProductionProcessContextStepService extends BaseStepService impl } @Override - public void deleteProductionProcessContext(StationRequestBean reqBean) { deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.BASE_DATA_CONTEXT); } + public void deleteProductionProcessContext(StationRequestBean reqBean) { deleteFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean)); } //获取生产过程上下文对象 @Override diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java index e5de13e..9550092 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java @@ -48,7 +48,7 @@ public class MesCellEquipContext implements Serializable { private Integer ctrlByPass; @ApiParam("设备质量") - private Integer quality = MesExtEnumUtil.EQUIP_LOG_QUALITY.QUALITY.getValue(); + private Integer quality = MesExtEnumUtil.EQUIP_LOG_QUALITY.QUALITY.getValueInt(); @ApiParam("kepware标识 Map") private String kepwareFlagJson; diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java index 456f92c..1a05d89 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPartContext.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesMouldMultiCavity; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; import io.swagger.annotations.ApiParam; import lombok.Data; import org.springframework.beans.BeanUtils; @@ -52,10 +53,13 @@ public class MesProductionPartContext implements Serializable { @ApiParam("是否空腔") private Integer isFinishCode = CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(); + @ApiParam("信息来源") + private Integer messageSource; + //根据一模多腔赋值 public MesProductionPartContext copyMouldMultiCavity(MesMouldMultiCavity mouldMultiCavity) { BeanUtils.copyProperties(mouldMultiCavity, this, MesPcnExtConstWords.ID); - return this; + return messageSource(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()); } //根据零件信息赋值 @@ -63,14 +67,14 @@ public class MesProductionPartContext implements Serializable { this.organizeCode = organizeCode; this.partNo = partNo; this.partName = partName; - return this; + return messageSource(MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()); } //根据工单信息赋值 - public MesProductionPartContext copyPartNo(MesWorkOrder workOrder) { + public MesProductionPartContext copyPartNo(MesWorkOrder workOrder, Integer messageSource) { if (null != workOrder) BeanUtils.copyProperties(workOrder, this); else this.isFinishCode = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(); - return this; + return messageSource(messageSource); } public MesProductionPartContext foreignKey(Integer foreignKey) { @@ -78,4 +82,9 @@ public class MesProductionPartContext implements Serializable { return this; } + public MesProductionPartContext messageSource(Integer messageSource) { + this.messageSource = messageSource; + return this; + } + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java index 2e0d54a..af21806 100644 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionPsInContext.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.pojo.context; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; import io.swagger.annotations.ApiParam; import lombok.Data; import org.springframework.beans.BeanUtils; @@ -27,6 +28,9 @@ public class MesProductionPsInContext implements Serializable { @ApiParam("零件条码ID") private Long id; + @ApiParam("队列ID") + private Long queueId; + @ApiParam("非排序进料零件条码/排序工单号") private String productSn; @@ -42,6 +46,15 @@ public class MesProductionPsInContext implements Serializable { @ApiParam("零件名称") private String partName; + @ApiParam("流程代码") + private String routeCode; + + @ApiParam("工序代码") + private String processCode; + + @ApiParam(value ="工艺代码") + private String craftCode; + @ApiParam("工艺跳过码") private String craftJumpCode; @@ -65,18 +78,16 @@ public class MesProductionPsInContext implements Serializable { @ApiParam(name = "前道工艺防错结果") private Integer checkCraftResult = MesPcnExtConstWords.ZERO; + public MesProductionPsInContext() {} + public MesProductionPsInContext foreignKey(Integer foreignKey) { this.foreignKey = foreignKey; return this; } - public MesProductionPsInContext isCheckSeq(Integer isCheckSeq) { - this.isCheckSeq = isCheckSeq; - return this; - } - - public MesProductionPsInContext isCheckCraft(Integer isCheckCraft) { - this.isCheckCraft = isCheckCraft; + public MesProductionPsInContext isCheck(MesWorkCell workCell) { + this.isCheckSeq = workCell.getIsCheckSeq(); + this.isCheckCraft = workCell.getIsCheckCraft(); return this; } @@ -90,11 +101,21 @@ public class MesProductionPsInContext implements Serializable { return this; } - public MesProductionPsInContext(MesProduceSn produceSn, String productSn) { + public MesProductionPsInContext isFinishCode() { + this.isFinishCode = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(); + return this; + } + + public MesProductionPsInContext(MesWorkCell workCell, MesProduceSn produceSn, String productSn) { if (null != produceSn) BeanUtils.copyProperties(produceSn, this); - else { - if (!StringUtils.isEmpty(productSn)) this.productSn = productSn; - else this.isFinishCode = CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue(); - } + else this.productSn = productSn; + if (!StringUtils.isEmpty(this.getId())) this.isCheck(workCell); } + + public MesProductionPsInContext(MesWorkCell workCell, MesProduceSn produceSn, Long queueId) { + if (null != produceSn) BeanUtils.copyProperties(produceSn, this); + if (!StringUtils.isEmpty(queueId)) this.queueId = queueId; + if (!StringUtils.isEmpty(this.getId())) this.isCheck(workCell); + } + } 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 7494f8c..0b738ef 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 @@ -150,6 +150,8 @@ public class MesPcnExtConstWords { public static final String MAX_RETRY_TIMES = "MAX_RETRY_TIMES"; // 最大重试次数[工步参数] public static final Integer MAX_RETRY_TIMES_DEFAULT = 10; + // 排序需要扫描主条码配置[工步参数] + public static final String SORT_NEED_SCAN_PS = "SORT_NEED_SCAN_PS"; // 工艺跳过码(前后防错/顺序防错)[工位参数] public static final String CRAFT_JUMP_CODE = "CRAFT_JUMP_CODE"; @@ -206,6 +208,8 @@ public class MesPcnExtConstWords { public static final String SEMICOLON = ";"; // , public static final String COMMA = ","; + // : + public static final String COLON = ":"; // 定制页面名称(默认) public static final String CUSTOM_PAGE_NAME_DEFAULT = "CUSTOM_PAGE_NAME_DEFAULT"; @@ -222,16 +226,24 @@ public class MesPcnExtConstWords { // 生产过程控制上下文目录名 public static final String PRODUCTION_PROCESS_CONTEXT = "PRODUCTION_PROCESS_CONTEXT"; + // 上下文: 基础数据 + public static final String BASE_DATA_CONTEXT = "BASE_DATA_CONTEXT"; + // 上下文: 业务数据 + public static final String BUSI_DATA_CONTEXT = "BUSI_DATA_CONTEXT"; + // 上下文: 定制数据 + public static final String CUSTOM_DATA_CONTEXT = "CUSTOM_DATA_CONTEXT"; + // 生产过程控制工位加工锁 public static final String PRODUCTION_LOCK_CONTEXT = "PRODUCTION_LOCK_CONTEXT"; + // 历史扫描信息 + public static final String LAST_SCAN_INFO_CONTEXT = "LAST_SCAN_INFO_CONTEXT"; // 上下文: 班次班组信息 public static final String PROD_SHIFT_DATA_CONTEXT = "PROD_SHIFT_DATA_CONTEXT"; - // 上下文: 基础数据 - public static final String BASE_DATA_CONTEXT = "BASE_DATA_CONTEXT"; + // 上下文: 加工统计信息 + public static final String PRODUCTION_STATISTICS_CONTEXT = "PRODUCTION_STATISTICS_CONTEXT"; + // 上下文: 展示组件数据 public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT"; - // 历史扫描信息 - public static final String LAST_SCAN_INFO_CONTEXT = "LAST_SCAN_INFO_CONTEXT"; // 上下文: 加工结果 public static final String PRODUCT_RESULT_CONTEXT = "PRODUCT_RESULT_CONTEXT"; // 上下文: 就绪信号 @@ -258,8 +270,6 @@ public class MesPcnExtConstWords { public static final String PRODUCTION_PS_IN_CONTEXT = "PRODUCTION_PS_IN_CONTEXT"; // 上下文: 产出条码数据信息 public static final String PRODUCTION_PS_OUT_CONTEXT = "PRODUCTION_PS_OUT_CONTEXT"; - // 上下文: 加工统计信息 - public static final String PRODUCTION_STATISTICS_CONTEXT = "PRODUCTION_STATISTICS_CONTEXT"; //OPC_API_PARAM