diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEnumExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEnumExtService.java index ffd4f29..02d081d 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEnumExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEnumExtService.java @@ -9,4 +9,7 @@ public interface IMesEnumExtService { @ApiOperation("根据枚举名获取枚举") Map doGetMesEnumByEnumName(String organizeCode, String enumName); + @ApiOperation("通过class获取枚举") + Map getEnumByClazzEnum(String enumName, Class clazz); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java index 5c2f008..bbd39d2 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IMesEquipmentExtService.java @@ -48,9 +48,18 @@ public interface IMesEquipmentExtService { @ApiOperation(value = "根据设备代码查询加工不可用规则信息") List getProdRuleIgnoreCfgListByEquip(String organizeCode, String equipmentCode); + @ApiOperation(value = "根据设备代码集合查询加工不可用规则信息") + List getProdRuleIgnoreCfgListByWcEquips(String organizeCode, List wcEquipmentList); + + @ApiOperation(value = "根据设备代码集合查询加工不可用规则信息") + List getProdRuleIgnoreCfgListByEquips(String organizeCode, List equipmentCodeList); + @ApiOperation(value = "根据生产线代码查询加工不可用规则信息") List getProdRuleIgnoreCfgListByCenter(String organizeCode, String workCenterCode); + @ApiOperation(value = "根据工位代码查询加工不可用规则信息") + List getProdRuleIgnoreCfgListByCell(String organizeCode, String workCenterCode, String workCellCode); + @ApiOperation(value = "根据设备代码, 来源信息查询加工不可用规则信息") List getProdRuleIgnoreCfgList(String organizeCode, String equipmentCode, Integer dataSource, Long sourceId); diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java index 1209cf9..f358e9c 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesAssemblyExtService.java @@ -46,7 +46,7 @@ public interface IMesAssemblyExtService { List getProductionAssemblyNosortContextList(String organizeCode, String equipmentCode, Map> prodRuleIgnoreCfgMap); @ApiOperation(value = "获取不可用规则") - String getProdRuleIgnoreCfg(Map> prodRuleIgnoreCfgMap, Long id, String dataSorce); + String getProdRuleIgnoreCfg(Map> prodRuleIgnoreCfgMap, Long id, String equipmentCode, String dataSorce); @ApiOperation(value = "【排序线】获取生产工单装配件清单") List getWorkOrderAssemblyList(String organizeCode, String workOrderNo, String productSn, String craftCode); diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java index 220d388..e20c35d 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionCustomContextStepService.java @@ -103,4 +103,13 @@ public interface IMesProductionCustomContextStepService { @ApiOperation(value = "删除打包数据") void removePackageDataContext(StationRequestBean reqBean); + @ApiOperation(value = "获取排序线工单队列推送锁数据") + List getSortQueuePushLockContext(String orgainzeCode, String workCenterCode); + + @ApiOperation(value = "保存排序线工单队列推送锁数据") + Boolean dispatchSortQueuePushLockContext(String organizeCode, String workCenterCode, String queuePushId); + + @ApiOperation(value = "删除排序线工单队列推送锁数据") + void removeSortQueuePushLockContext(String orgainzeCode, String workCenterCode, String queuePushId); + } 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 4642a9e..df51b07 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,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; @@ -243,4 +244,10 @@ public interface IMesProductionDispatchContextStepService { @ApiOperation(value = "保存上下文发运队列信息") Boolean dispatchShippingQueueContext(StationRequestBean reqBean, MesShippingQueue shippingQueue); + @ApiOperation(value = "获取上下文推单队列信息") + List getSortQueuePushContext(StationRequestBean reqBean); + + @ApiOperation(value = "保存上下文推单队列信息") + Boolean dispatchSortQueuePushContext(StationRequestBean reqBean, List queueOrderPushList); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java index ea35a52..fc5dc9f 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java @@ -188,4 +188,7 @@ public interface IMesProductionProcessContextStepService { @ApiOperation(value = "获取加工不可用规则, key = 数据来源&来源ID") Map> getProdRuleIgnoreCfgContextMap(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + @ApiOperation(value = "处理排序线推单配置上下文, 返回推送工位类型对应的配置信息") + List dispatchQueueOrderPushCellCfgContext(StationRequestBean reqBean, Integer pushType); + } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesQueueOrderPushService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesQueueOrderPushService.java new file mode 100644 index 0000000..c8d9c16 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesQueueOrderPushService.java @@ -0,0 +1,40 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; +import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; +import io.swagger.annotations.ApiOperation; + +import java.util.List; +import java.util.Map; + +public interface IMesQueueOrderPushService { + + @ApiOperation(value = "根据生产线代码,工位代码查询生产队列推送工位配置信息") + List getQueueOrderPushCellCfgList(String organizeCode, String workCenterCode, String workCellCode); + + @ApiOperation(value = "根据生产线代码查询生产队列推送工位配置信息") + List getQueueOrderPushCellCfgList(String organizeCode, String workCenterCode); + + //递增步长10,取整10位; 例如:查询=10 >> 返回=20 ; 查询=29 >> 返回=30 + @ApiOperation(value = "获取当前工单对应的工位推单队列中最大的顺序号") + Integer getQueueOrderPushMaxSeq(String organizeCode, String workOrderNo); + + @ApiOperation(value = "写入工位工单推送信息") + void insertQueueOrderPush(String organizeCode, String userInfo, List queueOrderPushCellCfgList, + MesProductionPsOutContext productionPsOutContext, MesProductionPartContext productionPartContext); + + @ApiOperation(value = "根据配置查询创建状态的生产队列工位推送信息") + List getQueueOrderPushList(String organizeCode, List queueOrderPushCellCfgList); + + @ApiOperation(value = "根据配置查询生产队列工位推送信息") + List getQueueOrderPushListByStatus(String organizeCode, List queueOrderPushCellCfgList, Integer cdtAscOrDesc, Integer... queueStatusArr); + + @ApiOperation(value = "根据分页条件查询生产队列工位推送信息") + ListPager queryQueueOrderPushListPager(Map paramMap, List pushSourceCodeList, Pager pager); + +} 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 05c4a05..2b4dd9e 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 @@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi; import cn.estsh.i3plus.pojo.base.bean.BaseBean; import cn.estsh.i3plus.pojo.mes.bean.MesProduceSn; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import io.swagger.annotations.ApiOperation; @@ -44,12 +45,18 @@ public interface IMesWorkOrderExtService { @ApiOperation(value = "根据生产工单ID查询生产工单信息") List getWorkOrderListByShiftCode(String organizeCode, String workCenterCode, String shiftCode); + @ApiOperation(value = "根据条码集合 查询生产工单/产品条码(排序)") + Map> getWorkOrderMapSort(String organizeCode, List snList); + @ApiOperation(value = "根据条码集合 查询生产工单/产品条码/队列数据(排序)") - Map> getWorkOrderMapSort(String organizeCode, String workCenterCode, String workCellCode, List snList); + Map> getWorkOrderMapSort(String organizeCode, List snList, MesWorkCell workCell); @ApiOperation(value = "根据工单或者客户条码 查询生产工单/产品条码(排序)") Map getWorkOrderMapSort(String organizeCode, String sn); + @ApiOperation(value = "根据工单或者客户条码 查询生产工单/产品条码/队列数据(排序)") + Map getWorkOrderMapSort(String organizeCode, String sn, MesWorkCell workCell); + @ApiOperation(value = "根据工单或者客户条码 查询生产工单信息(排序)") BaseBean getWorkOrderSort(String organizeCode, String sn, Boolean isBackOrder); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/MesEnumExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/MesEnumExtService.java deleted file mode 100644 index 39812a6..0000000 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/MesEnumExtService.java +++ /dev/null @@ -1,45 +0,0 @@ -package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.base; - - -import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEnumExtService; -import cn.estsh.i3plus.mes.pcn.util.EnumUtil; -import cn.estsh.i3plus.pojo.base.enumutil.MesEnumUtil; -import cn.estsh.i3plus.pojo.mes.dbinterface.MesInterfaceEnumUtil; -import cn.estsh.i3plus.pojo.mes.repository.MesEnumDetailRepository; -import cn.estsh.i3plus.pojo.mes.repository.MesEnumRepository; -import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; -import io.swagger.annotations.ApiOperation; -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.Map; - -/** - * @Author: Wynne.Lu - * @CreateDate: 2019/8/30 1:39 PM - * @Description: - **/ -@Slf4j -@Service -@ApiOperation(value = "获取MesEnumUtil") -public class MesEnumExtService implements IMesEnumExtService { - - @Override - public Map doGetMesEnumByEnumName(String organizeCode, String enumName) { - Map enumMap; - enumMap = getEnumByClazzEnum(enumName, MesExtEnumUtil.class); - if (CollectionUtils.isEmpty(enumMap)) enumMap = getEnumByClazzEnum(enumName, MesEnumUtil.class); - if (CollectionUtils.isEmpty(enumMap)) enumMap = getEnumByClazzEnum(enumName, MesInterfaceEnumUtil.class); - return enumMap; - } - - public Map getEnumByClazzEnum(String enumName, Class clz) { - return EnumUtil.getEnumByName(clz, enumName); - } - - - - -} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/ButtonDynamicExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/ButtonDynamicExtService.java index ccc1ae6..635fe45 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/ButtonDynamicExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/ButtonDynamicExtService.java @@ -47,14 +47,14 @@ public class ButtonDynamicExtService extends ButtonDynamicService { private IConfigService configService; @Override - public List filterButtonDynamicModelList(String organizeCode, String workCenterCode, String workCellCode, String windowNo, List buttonDynamicModelList) { - if (CollectionUtils.isEmpty(buttonDynamicModelList)) { + public List filterButtonDynamicModelList(String organizeCode, String workCenterCode, String workCellCode, String windowNo, List buttonDynamicModelList, Integer moduleType) { + if (CollectionUtils.isEmpty(buttonDynamicModelList) && !StringUtils.isEmpty(moduleType) && moduleType.compareTo(MesEnumUtil.WORK_MODULE_TYPE.BUTTON_MODULE.getValue()) == 0) { MesWorkCell workCell = prodOrgExtService.getWorkCellDb(organizeCode, workCenterCode, workCellCode); if (null != workCell && !StringUtils.isEmpty(workCell.getGrade()) && workCell.getGrade().compareTo(MesExtEnumUtil.WORK_CELL_GRADE.SCAN.getValue()) == 0) { if (doAutoInitWorkCellModuleData(organizeCode, workCenterCode, workCellCode, workCell.getId())) buttonDynamicModelList = findWorkModuleList(organizeCode, windowNo); } } - return super.filterButtonDynamicModelList(organizeCode, workCenterCode, workCellCode, windowNo, buttonDynamicModelList); + return super.filterButtonDynamicModelList(organizeCode, workCenterCode, workCellCode, windowNo, buttonDynamicModelList, moduleType); } private List findWorkModuleList(String organizeCode, String windowNo) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEnumExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEnumExtService.java new file mode 100644 index 0000000..d49abe9 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEnumExtService.java @@ -0,0 +1,88 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEnumExtService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.util.EnumUtil; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.MesEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesEnum; +import cn.estsh.i3plus.pojo.mes.bean.MesEnumDetail; +import cn.estsh.i3plus.pojo.mes.dbinterface.MesInterfaceEnumUtil; +import cn.estsh.i3plus.pojo.mes.repository.MesEnumDetailRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesEnumRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import io.swagger.annotations.ApiOperation; +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.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Author: Wynne.Lu + * @CreateDate: 2019/8/30 1:39 PM + * @Description: + **/ +@Slf4j +@Service +@ApiOperation(value = "获取MesEnumUtil") +public class MesEnumExtService implements IMesEnumExtService { + + @Autowired + private MesEnumRepository enumRepository; + + @Autowired + private MesEnumDetailRepository enumDetailRepository; + + @Override + public Map doGetMesEnumByEnumName(String organizeCode, String enumName) { + Map enumMap = getEnumMap(organizeCode, enumName); + if (CollectionUtils.isEmpty(enumMap)) enumMap = getEnumByClazzEnum(enumName, MesExtEnumUtil.class); + if (CollectionUtils.isEmpty(enumMap)) enumMap = getEnumByClazzEnum(enumName, MesEnumUtil.class); + if (CollectionUtils.isEmpty(enumMap)) enumMap = getEnumByClazzEnum(enumName, MesInterfaceEnumUtil.class); + return enumMap; + } + + @Override + public Map getEnumByClazzEnum(String enumName, Class clz) { + return EnumUtil.getEnumByName(clz, enumName); + } + + private Map getEnumMap(String organizeCode, String enumName) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(enumName, MesPcnExtConstWords.ENUM_CODE, packBean); + MesEnum enumDb = enumRepository.getByProperty(packBean); + if (null == enumDb) return null; + List enumDetailList = enumDetailRepository.findByHqlWhere(packBean); + if (CollectionUtils.isEmpty(enumDetailList)) return null; + return getEnumMap(enumDetailList, enumName); + } + + private Map getEnumMap(List enumDetailList, String enumName) { + Map enumMap = new HashMap<>(); + List> values = new ArrayList<>(); + enumDetailList.forEach(e -> { + Map value = new HashMap<>(); + value.put("value", e.getDetailValue()); + if (!StringUtils.isEmpty(e.getEnumCode())) { + value.put("code", e.getDetailCode()); + } + value.put("description", e.getDetailName()); + values.add(value); + }); + enumMap.put("enumName", enumName); + enumMap.put("valuesList", values); + return enumMap; + } + + + + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java index b610355..a6e6488 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/MesEquipmentExtService.java @@ -215,6 +215,26 @@ public class MesEquipmentExtService implements IMesEquipmentExtService { new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), equipmentCode}); } + //根据设备代码集合查询加工不可用规则信息 + @Override + public List getProdRuleIgnoreCfgListByWcEquips(String organizeCode, List wcEquipmentList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(wcEquipmentList)) return null; + List equipmentCodeList = CollectionUtils.isEmpty(wcEquipmentList) ? null : + wcEquipmentList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getEquipmentCode()))).map(MesWcEquipment::getEquipmentCode).collect(Collectors.toList()); + return getProdRuleIgnoreCfgListByEquips(organizeCode, equipmentCodeList); + } + + //根据设备代码集合查询加工不可用规则信息 + @Override + public List getProdRuleIgnoreCfgListByEquips(String organizeCode, List equipmentCodeList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(equipmentCodeList)) return null; + equipmentCodeList = equipmentCodeList.stream().filter(o -> StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + if (equipmentCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(equipmentCodeList.get(0), MesPcnExtConstWords.EQUIPMENT_CODE, packBean); + else DdlPreparedPack.getInPackList(equipmentCodeList, MesPcnExtConstWords.EQUIPMENT_CODE, packBean); + return prodRuleIgnoreCfgRepository.findByHqlWhere(packBean); + } + //根据生产线代码查询加工不可用规则信息 @Override public List getProdRuleIgnoreCfgListByCenter(String organizeCode, String workCenterCode) { @@ -222,13 +242,17 @@ public class MesEquipmentExtService implements IMesEquipmentExtService { List wcEquipmentList = wcEquipmentRepository.findByProperty( new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE}, new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode}); - List equipmentCodeList = CollectionUtils.isEmpty(wcEquipmentList) ? null : - (wcEquipmentList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getEquipmentCode()))).map(MesWcEquipment::getEquipmentCode).collect(Collectors.toList())).stream().filter(o -> null != o).distinct().collect(Collectors.toList()); - if (CollectionUtils.isEmpty(equipmentCodeList)) return null; - DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); - if (equipmentCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(equipmentCodeList.get(0), MesPcnExtConstWords.EQUIPMENT_CODE, packBean); - else DdlPreparedPack.getInPackList(equipmentCodeList, MesPcnExtConstWords.EQUIPMENT_CODE, packBean); - return prodRuleIgnoreCfgRepository.findByHqlWhere(packBean); + return getProdRuleIgnoreCfgListByWcEquips(organizeCode, wcEquipmentList); + } + + //根据工位代码查询加工不可用规则信息 + @Override + public List getProdRuleIgnoreCfgListByCell(String organizeCode, String workCenterCode, String workCellCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null; + List wcEquipmentList = wcEquipmentRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode, workCellCode}); + return getProdRuleIgnoreCfgListByWcEquips(organizeCode, wcEquipmentList); } //根据设备代码, 来源信息查询加工不可用规则信息 diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java index 6cac190..f51df87 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesAssemblyExtService.java @@ -82,7 +82,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { workOrderAssemblyList.forEach(o -> productionAssemblySortContextList.add( new MesProductionAssemblySortContext().copy(o).fileUrl(fileMap).foreignKey(prodRuleContext.getForeignKey()) - .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getPid(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE10.getValueStr())) + .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getPid(), o.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE10.getValueStr())) ) ); @@ -116,7 +116,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { new MesProductionAssemblySortContext() .copy(o, getProductionAssembly(productionAssemblyMap, o.getId()), getIsCheckBindSeq(getWorkCell(workCellMap, o.getWorkCellCode()))) .foreignKey(prodRuleContext.getForeignKey()) - .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getPid(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE10.getValueStr())) + .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getPid(), o.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE10.getValueStr())) ) ); @@ -204,7 +204,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { assemblyNosortCfgList.forEach(o -> { MesProductionAssemblyNosortContext productionAssemblyNosortContext = new MesProductionAssemblyNosortContext().copy(prodRuleContext, o).fileUrl(fileMap).foreignKey(prodRuleContext.getForeignKey()); productionAssemblyNosortContext.overrideAssemblyStatus(productionCustomContextStepService.getRepeatAssemblySn(prodRuleContext.getOrganizeCode(), prodRuleContext.getWorkCenterCode(), prodRuleContext.getWorkCellCode(), productionAssemblyNosortContext)) - .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE30.getValueStr())); + .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), o.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE30.getValueStr())); productionAssemblyNosortContextList.add(productionAssemblyNosortContext); }); @@ -213,9 +213,9 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { //获取不可用规则 @Override - public String getProdRuleIgnoreCfg(Map> prodRuleIgnoreCfgMap, Long id, String dataSorce) { + public String getProdRuleIgnoreCfg(Map> prodRuleIgnoreCfgMap, Long id, String equipmentCode, String dataSorce) { if (CollectionUtils.isEmpty(prodRuleIgnoreCfgMap) || StringUtils.isEmpty(id) || StringUtils.isEmpty(dataSorce)) return null; - String key = new StringJoiner(MesPcnExtConstWords.AND).add(dataSorce).add(id.toString()).toString(); + String key = new StringJoiner(MesPcnExtConstWords.AND).add(dataSorce).add(equipmentCode).add(id.toString()).toString(); return prodRuleIgnoreCfgMap.containsKey(key) ? JSONObject.toJSONString(prodRuleIgnoreCfgMap.get(key)) : null; } @@ -250,7 +250,7 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { assemblyNosortCfgList.forEach(o -> productionAssemblyNosortContextList.add( new MesProductionAssemblyNosortContext().copy(o) - .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE30.getValueStr())) + .prodRuleIgnoreCfg(getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), o.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE30.getValueStr())) ) ); @@ -269,13 +269,15 @@ public class MesAssemblyExtService implements IMesAssemblyExtService { //【排序线】获取生产工单装配件清单 @Override public List getWorkOrderAssemblyList(String organizeCode, String workCenterCode, String workCellCode, String workOrderNo, List productSnList) { - if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode) || StringUtils.isEmpty(workOrderNo) || CollectionUtils.isEmpty(productSnList)) return null; + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode) || (StringUtils.isEmpty(workOrderNo) && CollectionUtils.isEmpty(productSnList))) return null; DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); DdlPreparedPack.getStringEqualPack(workCenterCode, MesPcnExtConstWords.WORK_CENTER_CODE, packBean); DdlPreparedPack.getStringEqualPack(workCellCode, MesPcnExtConstWords.WORK_CELL_CODE, packBean); DdlPreparedPack.getStringEqualPack(workOrderNo, MesPcnExtConstWords.WORK_ORDER_NO, packBean); - if (productSnList.size() == 1) DdlPreparedPack.getStringEqualPack(productSnList.get(0), MesPcnExtConstWords.PRODUCT_SN, packBean); - else DdlPreparedPack.getInPackList(productSnList, MesPcnExtConstWords.PRODUCT_SN, packBean); + if (!CollectionUtils.isEmpty(productSnList)) { + if (productSnList.size() == 1) DdlPreparedPack.getStringEqualPack(productSnList.get(0), MesPcnExtConstWords.PRODUCT_SN, packBean); + else DdlPreparedPack.getInPackList(productSnList, MesPcnExtConstWords.PRODUCT_SN, packBean); + } return workOrderAssemblyRepository.findByHqlWhere(packBean); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdRuleCfgExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdRuleCfgExtService.java index edf2c96..f0a74e5 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdRuleCfgExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesProdRuleCfgExtService.java @@ -85,7 +85,7 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService { @Override public List getProdRuleNosortCfgList(List prodRuleNosortCfgList, Map> prodRuleIgnoreCfgMap) { if (CollectionUtils.isEmpty(prodRuleNosortCfgList) || CollectionUtils.isEmpty(prodRuleIgnoreCfgMap)) return prodRuleNosortCfgList; - prodRuleNosortCfgList.stream().forEach(o -> o.setProdRuleIgnoreCfg(assemblyExtService.getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE20.getValueStr()))); + prodRuleNosortCfgList.stream().forEach(o -> o.setProdRuleIgnoreCfg(assemblyExtService.getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, o.getId(), o.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE20.getValueStr()))); return null; } @@ -127,7 +127,7 @@ public class MesProdRuleCfgExtService implements IMesProdRuleCfgExtService { @Override public MesProdRuleContext getProdRuleNosortContextByPid(MesProdRuleContext prodRuleContext, Map> prodRuleIgnoreCfgMap) { if (null == prodRuleContext || CollectionUtils.isEmpty(prodRuleIgnoreCfgMap)) return prodRuleContext; - prodRuleContext.setProdRuleIgnoreCfg(assemblyExtService.getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, prodRuleContext.getPid(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE20.getValueStr())); + prodRuleContext.setProdRuleIgnoreCfg(assemblyExtService.getProdRuleIgnoreCfg(prodRuleIgnoreCfgMap, prodRuleContext.getPid(), prodRuleContext.getEquipmentCode(), MesExtEnumUtil.PROD_RULE_IGNORE_DATA_SOURCE.DATA_SOURCE20.getValueStr())); return prodRuleContext; } 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 0e1dee5..76bd313 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 @@ -201,11 +201,10 @@ public class MesProduceSnExtService implements IMesProduceSnExtService { //根据零件条码,生产线,工位查询工位队列信息 @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/MesQueueOrderPushService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesQueueOrderPushService.java new file mode 100644 index 0000000..0b5586f --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/MesQueueOrderPushService.java @@ -0,0 +1,168 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPartContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsOutContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.base.common.PagerHelper; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesPart; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; +import cn.estsh.i3plus.pojo.mes.repository.MesQueueOrderPushCellCfgRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesQueueOrderPushRepository; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class MesQueueOrderPushService implements IMesQueueOrderPushService { + + @Autowired + private MesQueueOrderPushCellCfgRepository queueOrderPushCellCfgRepository; + + @Autowired + private MesQueueOrderPushRepository queueOrderPushRepository; + + @Override + public List getQueueOrderPushCellCfgList(String organizeCode, String workCenterCode, String workCellCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null; + return queueOrderPushCellCfgRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode, workCellCode}); + } + + @Override + public List getQueueOrderPushCellCfgList(String organizeCode, String workCenterCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode)) return null; + return queueOrderPushCellCfgRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode}); + } + + //获取当前工单对应的工位推单队列中最大的顺序号; 递增步长10,取整10位; 例如:查询=10 >> 返回=20 ; 查询=29 >> 返回=30 + @Override + public Integer getQueueOrderPushMaxSeq(String organizeCode, String workOrderNo) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workOrderNo)) return MesPcnExtConstWords.TEN; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workOrderNo, MesPcnExtConstWords.WORK_ORDER_NO, packBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.PROCESS_SEQ}, packBean); + MesQueueOrderPush queueOrderPushDb2MaxSeq = queueOrderPushRepository.getByProperty(packBean); + return ((null == queueOrderPushDb2MaxSeq || queueOrderPushDb2MaxSeq.getProcessSeq().compareTo(MesPcnExtConstWords.ZERO) == 0) + ? MesPcnExtConstWords.ONE : (queueOrderPushDb2MaxSeq.getProcessSeq() / MesPcnExtConstWords.TEN + 1) + ) * MesPcnExtConstWords.TEN; + } + + //写入工位工单推送信息 + @Override + public void insertQueueOrderPush(String organizeCode, String userInfo, List queueOrderPushCellCfgList, + MesProductionPsOutContext productionPsOutContext, MesProductionPartContext productionPartContext) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(userInfo) || null == productionPsOutContext || CollectionUtils.isEmpty(queueOrderPushCellCfgList)) return; + Integer processSeq = getQueueOrderPushMaxSeq(organizeCode, productionPsOutContext.getWorkOrderNo()); + for (MesQueueOrderPushCellCfg queueOrderPushCellCfg : queueOrderPushCellCfgList) { + if (null == queueOrderPushCellCfg) continue; + MesQueueOrderPush queueOrderPush = new MesQueueOrderPush(); + queueOrderPush.setPushSourceCode(queueOrderPushCellCfg.getPushSourceCode()); + queueOrderPush.setWorkOrderNo(productionPsOutContext.getWorkOrderNo()); + queueOrderPush.setProductSn(productionPsOutContext.getProductSn()); + queueOrderPush.setCustSn(productionPsOutContext.getCustSn()); + queueOrderPush.setPartNo(productionPsOutContext.getPartNo()); + queueOrderPush.setPartName(productionPsOutContext.getPartName()); + queueOrderPush.setProcessSeq(processSeq); + queueOrderPush.setQueueStatus(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()); + queueOrderPush.setProductSeq(productionPartContext.getProductSeq()); + queueOrderPush.setWorkOrderSeq(productionPartContext.getWorkOrderSeq()); + queueOrderPush.setCarModelCode(productionPartContext.getCarModelCode()); + queueOrderPush.setCustOrderNo(productionPartContext.getCustOrderNo()); + queueOrderPush.setPartProdGroupCode(productionPartContext.getPartProdGroupCode()); + queueOrderPush.setAreaCode(queueOrderPushCellCfg.getAreaCode()); + queueOrderPush.setWorkCenterCode(queueOrderPushCellCfg.getWorkCenterCode()); + queueOrderPush.setSourceWorkCellCode(queueOrderPushCellCfg.getWorkCellCode()); + queueOrderPush.setOrganizeCode(organizeCode); + ConvertBean.serviceModelInitialize(queueOrderPush, userInfo); + queueOrderPushRepository.insert(queueOrderPush); + } + } + + //根据配置查询创建状态的生产队列工位推送信息 + @Override + public List getQueueOrderPushList(String organizeCode, List queueOrderPushCellCfgList) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(queueOrderPushCellCfgList)) return null; + //搜集推送来源代码 去重; 根据生产线代码,推送来源代码集合查询创建状态的生产队列工位推送信息【创建时间正序】 + List queueOrderPushList = getQueueOrderPushListByStatus(organizeCode, queueOrderPushCellCfgList, CommonEnumUtil.ASC_OR_DESC.ASC.getValue(), MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()); + //条码去重 + return CollectionUtils.isEmpty(queueOrderPushList) ? null : + queueOrderPushList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getProductSn()))).distinct() + .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(MesQueueOrderPush::getProductSn))), ArrayList::new)); + + } + + //根据配置查询生产队列工位推送信息 + @Override + public List getQueueOrderPushListByStatus(String organizeCode, List queueOrderPushCellCfgList, Integer cdtAscOrDesc, Integer... queueStatusArr) { + + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(queueOrderPushCellCfgList)) return null; + + //搜集推送来源代码 去重 + List pushSourceCodeList = (queueOrderPushCellCfgList.stream() + .filter(o -> (null != o && !StringUtils.isEmpty(o.getPushSourceCode()))).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList()) + ).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(pushSourceCodeList)) return null; + + //根据生产线代码,推送来源代码集合查询入参状态的生产队列工位推送信息【创建时间正序】 + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(queueOrderPushCellCfgList.get(0).getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean); + + if (null != queueStatusArr && queueStatusArr.length == 1) + DdlPreparedPack.getNumEqualPack(queueStatusArr[0], MesPcnExtConstWords.QUEUE_STATUS, packBean); + else if (null != queueStatusArr) DdlPreparedPack.getInPackArray(queueStatusArr, MesPcnExtConstWords.QUEUE_STATUS, packBean); + + if (pushSourceCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(pushSourceCodeList.get(0), MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean); + else DdlPreparedPack.getInPackList(pushSourceCodeList, MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean); + + if (!StringUtils.isEmpty(cdtAscOrDesc)) DdlPreparedPack.getOrderByPack(new Object[]{cdtAscOrDesc}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean); + + return queueOrderPushRepository.findByHqlWhere(packBean); + } + + //根据分页条件查询生产队列工位推送信息 + @Override + public ListPager queryQueueOrderPushListPager(Map paramMap, List pushSourceCodeList, Pager pager) { + + DdlPackBean packBean = DdlPackBean.getDdlPackBean(paramMap.get(MesPcnExtConstWords.ORGANIZE_CODE)); + + DdlPreparedPack.getStringEqualPack(paramMap.get(MesPcnExtConstWords.WORK_CENTER_CODE), MesPcnExtConstWords.WORK_CENTER_CODE, packBean); + DdlPreparedPack.getStringEqualPack(paramMap.get(MesPcnExtConstWords.PART_NO), MesPcnExtConstWords.PART_NO, packBean); + DdlPreparedPack.getStringEqualPack(paramMap.get(MesPcnExtConstWords.PART_PROD_GROUP_CODE), MesPcnExtConstWords.PART_PROD_GROUP_CODE, packBean); + + DdlPreparedPack.getStringLikerPack(paramMap.get(MesPcnExtConstWords.WORK_ORDER_NO), MesPcnExtConstWords.WORK_ORDER_NO, packBean); + DdlPreparedPack.getStringLikerPack(paramMap.get(MesPcnExtConstWords.CUST_SN), MesPcnExtConstWords.CUST_SN, packBean); + + if (pushSourceCodeList.size() == 1) DdlPreparedPack.getStringEqualPack(pushSourceCodeList.get(0), MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean); + else DdlPreparedPack.getInPackList(pushSourceCodeList, MesPcnExtConstWords.PUSH_SOURCE_CODE, packBean); + + if (paramMap.containsKey(MesPcnExtConstWords.QUEUE_STATUS)) { + List queueStatusList = Arrays.stream(paramMap.get(MesPcnExtConstWords.QUEUE_STATUS).split(MesPcnExtConstWords.COMMA)).map(Integer::parseInt).collect(Collectors.toList()); + if (queueStatusList.size() == 1) DdlPreparedPack.getNumEqualPack(queueStatusList.get(0), MesPcnExtConstWords.QUEUE_STATUS, packBean); + else DdlPreparedPack.getInPackList(queueStatusList, MesPcnExtConstWords.QUEUE_STATUS, packBean); + } + + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.CREATE_DATE_TIME}, packBean); + + pager = PagerHelper.getPager(pager, queueOrderPushRepository.findByHqlWhereCount(packBean)); + List list = queueOrderPushRepository.findByHqlWherePage(packBean, pager); + + return new ListPager<>(list, pager); + } + +} 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 94ebe0e..15d0e4e 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 @@ -12,6 +12,7 @@ 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.bean.MesWorkCell; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import cn.estsh.i3plus.pojo.mes.repository.MesWorkOrderRepository; import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; @@ -161,57 +162,20 @@ public class MesWorkOrderExtService implements IMesWorkOrderExtService { } @Override - public Map> getWorkOrderMapSort(String organizeCode, String workCenterCode, String workCellCode, List snList) { + public Map> getWorkOrderMapSort(String organizeCode, List snList) { + return getWorkOrderMapSort(organizeCode, snList, null); + } - if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode) || CollectionUtils.isEmpty(snList)) return null; + @Override + public Map> getWorkOrderMapSort(String organizeCode, List snList, MesWorkCell workCell) { + if (StringUtils.isEmpty(organizeCode) || CollectionUtils.isEmpty(snList)) return null; snList = snList.size() == 1 ? snList : snList.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); Map> workOrderMap = new HashMap<>(); - for (String sn : snList) { - if (StringUtils.isEmpty(sn)) continue; - - Map itemMap = new HashMap<>(); - - if (sn.length() == MesPcnExtConstWords.CUSTOMER_SN_LENGTH_GM) { - MesProduceSn produceSn = produceSnExtService.getProduceSnByCustSn(organizeCode, customerSnTransformService.transformBarCodeGm(sn)); - if (null == produceSn || StringUtils.isEmpty(produceSn.getWorkOrderNo())) { - itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单及客户条码信息,客户条码[%s]信息无效!", sn)); - continue; - } else itemMap.put(MesProduceSn.class.getSimpleName(), produceSn); - - MesWorkOrder workOrder = getWorkOrder(organizeCode, produceSn.getWorkOrderNo()); - if (null == workOrder) { - itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单信息,客户条码[%s]对应的加工单[%s]信息不存在!", sn, produceSn.getWorkOrderNo())); - continue; - } else itemMap.put(MesWorkOrder.class.getSimpleName(), workOrder); - - MesQueueOrder queueOrder = produceSnExtService.getQueueOrder(organizeCode, workCenterCode, workCellCode, produceSn.getProductSn()); - if (null == queueOrder) itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工位队列信息,客户条码[%s]工位队列信息不存在!", sn)); - else itemMap.put(MesQueueOrder.class.getSimpleName(), queueOrder); - } else { - MesProduceSn produceSn = produceSnExtService.getProduceSn(organizeCode, sn, sn); - if (null == produceSn) produceSn = produceSnExtService.getProduceSnByCustSn(organizeCode, sn); - if (null == produceSn || StringUtils.isEmpty(produceSn.getWorkOrderNo())) { - itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单及产品条码信息,加工单[%s]不存在产品条码信息!", sn)); - continue; - } else itemMap.put(MesProduceSn.class.getSimpleName(), produceSn); - - MesWorkOrder workOrder = getWorkOrder(organizeCode, produceSn.getWorkOrderNo()); - if (null == workOrder) { - itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单信息,加工单[%s]信息无效!", produceSn.getWorkOrderNo())); - continue; - } else itemMap.put(MesWorkOrder.class.getSimpleName(), workOrder); - - MesQueueOrder queueOrder = produceSnExtService.getQueueOrder(organizeCode, workCenterCode, workCellCode, produceSn.getProductSn()); - if (null == queueOrder) itemMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工位队列信息,加工单[%s]工位队列信息不存在!", produceSn.getWorkOrderNo())); - else itemMap.put(MesQueueOrder.class.getSimpleName(), queueOrder); - } - - workOrderMap.put(sn, itemMap); - + workOrderMap.put(sn, getWorkOrderMapSort(organizeCode, sn, workCell)); } return workOrderMap; @@ -219,30 +183,40 @@ public class MesWorkOrderExtService implements IMesWorkOrderExtService { @Override public Map getWorkOrderMapSort(String organizeCode, String sn) { + return getWorkOrderMapSort(organizeCode, sn, null); + } + + @Override + public Map getWorkOrderMapSort(String organizeCode, String sn, MesWorkCell workCell) { if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(sn)) return null; Map resultMap = new HashMap<>(); + MesProduceSn produceSn; if (sn.length() == MesPcnExtConstWords.CUSTOMER_SN_LENGTH_GM) { - MesProduceSn produceSn = produceSnExtService.getProduceSnByCustSn(organizeCode, customerSnTransformService.transformBarCodeGm(sn)); + produceSn = produceSnExtService.getProduceSnByCustSn(organizeCode, customerSnTransformService.transformBarCodeGm(sn)); if (null == produceSn || StringUtils.isEmpty(produceSn.getWorkOrderNo())) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单及客户条码信息,客户条码[%s]信息无效!", sn)); else resultMap.put(MesProduceSn.class.getSimpleName(), produceSn); - - MesWorkOrder workOrder = getWorkOrder(organizeCode, produceSn.getWorkOrderNo()); - if (null == workOrder) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单信息,客户条码[%s]对应的加工单[%s]信息不存在!", sn, produceSn.getWorkOrderNo())); - else resultMap.put(MesWorkOrder.class.getSimpleName(), workOrder); } else { - MesProduceSn produceSn = produceSnExtService.getProduceSn(organizeCode, sn, sn); + produceSn = produceSnExtService.getProduceSn(organizeCode, sn, sn); if (null == produceSn) produceSn = produceSnExtService.getProduceSnByCustSn(organizeCode, sn); if (null == produceSn || StringUtils.isEmpty(produceSn.getWorkOrderNo())) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单及产品条码信息,加工单[%s]不存在产品条码信息!", sn)); else resultMap.put(MesProduceSn.class.getSimpleName(), produceSn); + } + if (null != produceSn) { MesWorkOrder workOrder = getWorkOrder(organizeCode, produceSn.getWorkOrderNo()); - if (null == workOrder) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单信息,加工单[%s]信息无效!", produceSn.getWorkOrderNo())); + if (null == workOrder) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工单信息,客户条码[%s]对应的加工单[%s]信息不存在!", produceSn.getCustSn(), produceSn.getWorkOrderNo())); else resultMap.put(MesWorkOrder.class.getSimpleName(), workOrder); } + if (null != produceSn && null != workCell) { + MesQueueOrder queueOrder = produceSnExtService.getQueueOrder(organizeCode, workCell.getWorkCenterCode(), workCell.getWorkCellCode(), produceSn.getProductSn()); + if (null == queueOrder) resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("请检查工位队列信息,客户条码[%s]加工单[%s]工位队列信息不存在!", produceSn.getCustSn(), produceSn.getWorkOrderNo())); + else resultMap.put(MesQueueOrder.class.getSimpleName(), queueOrder); + } + return resultMap; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/printqueue/strategy/WorkOrderAssemblyPrintQueueStrategyService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/printqueue/strategy/WorkOrderAssemblyPrintQueueStrategyService.java index 03eb78e..aa264fe 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/printqueue/strategy/WorkOrderAssemblyPrintQueueStrategyService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/printqueue/strategy/WorkOrderAssemblyPrintQueueStrategyService.java @@ -77,8 +77,7 @@ public class WorkOrderAssemblyPrintQueueStrategyService implements IPrintQueueSt List workOrderList = getMesWorkOrders(model, workOrderNoList); // 根据工单号对工单分组 Map> workOrderMap = CollectionUtils.isEmpty(workOrderList) ? null : workOrderList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrder::getWorkOrderNo)); - if (CollectionUtils.isEmpty(workOrderMap)) log.info("打印队列查询 --- {} --- 工单信息不存在 --- {} ---", MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfDescription(model.getPrintQueueType()), - CollectionUtils.isEmpty(workOrderList) ? "[]" : workOrderList.toString()); + if (CollectionUtils.isEmpty(workOrderMap)) log.info("打印队列查询 --- {} --- 工单信息不存在 --- {} ---", MesExtEnumUtil.PRINT_QUEUE_TYPE.valueOfDescription(model.getPrintQueueType()), workOrderNoList.toString()); // 产线代码集合 List workCenterCodeList = CollectionUtils.isEmpty(workOrderMap) ? null : diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/MesProductionSortModuleService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/MesProductionSortModuleService.java index 8085874..d217ba7 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/MesProductionSortModuleService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/MesProductionSortModuleService.java @@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdShiftRecordService; 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.IMesQueueOrderPushService; 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; @@ -18,7 +19,9 @@ import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; import cn.estsh.i3plus.pojo.mes.bean.MesStateMachineStatus; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.model.AttrBean; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; @@ -34,6 +37,7 @@ 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.Map; import java.util.stream.Collectors; @@ -59,6 +63,9 @@ public class MesProductionSortModuleService extends BaseModuleService { @Autowired private MesQueueOrderRepository queueOrderRepository; + @Autowired + private IMesQueueOrderPushService queueOrderPushService; + @Override public void init(StationRequestBean reqBean) { @@ -97,13 +104,18 @@ public class MesProductionSortModuleService extends BaseModuleService { // 发送班次班组和工单 StationResultBean resultBean = getStationResultBean(reqBean, moduleContentContext, prodShiftDataContext); - // 获取产成零件信息 - List productionPartContext = productionDispatchContextStepService.getProductionPartContext(reqBean); - // 排除掉空腔的产成零件 - productionPartContext = CollectionUtils.isEmpty(productionPartContext) ? null : productionPartContext.stream().filter(o -> !StringUtils.isEmpty(o.getForeignKey())).collect(Collectors.toList()); + //生产线是否推单 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + Boolean isPushQueue = (StringUtils.isEmpty(workCenter.getIsPushQueue()) || workCenter.getIsPushQueue().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) ? false : true; + + //获取队列信息 + //非推单【获取当前工位最新修改的完成状态的队列单据数据 并根据其零件生产组代码按生产序号倒序前50条】 + List queueOrderModelList = !isPushQueue + ? queryQueueOrderTopFiftyProductSeq(reqBean, getNewPartProdGroupCode(reqBean, moduleContentContext)) + : queryQueueOrderPush(reqBean); - //封装工位展示的客制化信息 (获取当前工位最新修改的完成状态的队列单据数据 并根据其零件生产组代码按生产序号倒序前50条) - StationResultBean resultBeanCustom = getStationResultBean(queryQueueOrderTopFiftyProductSeq(reqBean, getNewPartProdGroupCode(reqBean, productionPartContext))); + //封装工位展示的客制化信息 + StationResultBean resultBeanCustom = getStationResultBean(queueOrderModelList); if (null == resultBeanCustom) this.sendMessage(reqBean, resultBean); else this.sendMessage(reqBean, new StationResultBean().busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.BUSI_LIST.getValue()).addStationResultBeans(resultBean).addStationResultBeans(resultBeanCustom)); @@ -114,6 +126,8 @@ public class MesProductionSortModuleService extends BaseModuleService { } + + private StationResultBean getStationResultBean(List mesQueueOrderModelList) { if (CollectionUtils.isEmpty(mesQueueOrderModelList)) return null; return new StationResultBean().busiType(MesPcnEnumUtil.STATION_BUSI_TYPE.MODULE_CUSTOM_CONTENT.getValue()) @@ -131,6 +145,7 @@ public class MesProductionSortModuleService extends BaseModuleService { return attrBeanList; } + //获取当前工位最新修改的完成状态的队列单据数据 并根据其零件生产组代码按生产序号倒序前50条 private List queryQueueOrderTopFiftyProductSeq(StationRequestBean reqBean, List partProdGroupCodeList) { if (CollectionUtils.isEmpty(partProdGroupCodeList)) return null; @@ -138,27 +153,29 @@ public class MesProductionSortModuleService extends BaseModuleService { List queueOrderModelList = null; for (String partProdGroupCode : partProdGroupCodeList) { Pager pager = new Pager(); - pager.setStartRow(1); - pager.setCurrentPage(1); - pager.setPageSize(50); + pager.setStartRow(MesPcnExtConstWords.ONE); + pager.setCurrentPage(MesPcnExtConstWords.ONE); + pager.setPageSize(MesPcnExtConstWords.FIFTY); DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); DdlPreparedPack.getStringEqualPack(reqBean.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean); DdlPreparedPack.getStringEqualPack(reqBean.getWorkCellCode(), MesPcnExtConstWords.WORK_CELL_CODE, packBean); DdlPreparedPack.getStringEqualPack(partProdGroupCode, MesPcnExtConstWords.PART_PROD_GROUP_CODE, packBean); - packBean.setOrderByStr(" order by productSeq desc "); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.PRODUCT_SEQ}, packBean); List queueOrderList = queueOrderRepository.findByHqlWherePage(packBean, pager); if (!CollectionUtils.isEmpty(queueOrderList)) { - Boolean isComplete = false; Integer index = MesPcnExtConstWords.ONE; for (MesQueueOrder mesQueueOrder : queueOrderList) { MesQueueOrderModel queueOrderModel = new MesQueueOrderModel(); BeanUtils.copyProperties(mesQueueOrder, queueOrderModel); + + //默认绿色【完成状态或关闭状态】 String color = MesExtEnumUtil.COLOR.GREEN.getValue(); - if (queueOrderModel.getStatus() == MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue()) isComplete = true; - else if (!isComplete) color = MesExtEnumUtil.COLOR.WHITE.getValue(); + //创建状态标白色 + if (queueOrderModel.getStatus() == MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) color = MesExtEnumUtil.COLOR.WHITE.getValue(); //跳号标黄色 if (index < queueOrderList.size() && checkJumpNumber(queueOrderList.get(index).getWorkOrderSeq(), mesQueueOrder.getWorkOrderSeq())) color = MesExtEnumUtil.COLOR.YELLOW.getValue(); + queueOrderModel.setColor(color); if (CollectionUtils.isEmpty(queueOrderModelList)) queueOrderModelList = new ArrayList<>(); @@ -171,28 +188,109 @@ public class MesProductionSortModuleService extends BaseModuleService { return queueOrderModelList; } - private List getNewPartProdGroupCode(StationRequestBean reqBean, List productionPartContext) { + //获取零件生产组代码 + private List getNewPartProdGroupCode(StationRequestBean reqBean, List> moduleContentContext) { - // 获取工单信息 + // 获取产成零件信息 + List productionPartContext = productionDispatchContextStepService.getProductionPartContext(reqBean); + // 排除掉空腔的产成零件 + productionPartContext = CollectionUtils.isEmpty(productionPartContext) ? null : productionPartContext.stream().filter(o -> !StringUtils.isEmpty(o.getForeignKey())).collect(Collectors.toList()); + + // 扫描验证完加工单才能拿到产成零件信息 if (!CollectionUtils.isEmpty(productionPartContext)) { - return productionPartContext.stream().map(MesProductionPartContext::getPartProdGroupCode).distinct().collect(Collectors.toList()); + return (productionPartContext.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPartProdGroupCode()))) + .map(MesProductionPartContext::getPartProdGroupCode).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + } + + //工序开始前可能会拿到页面顶部展示单加工单信息 + if (!CollectionUtils.isEmpty(moduleContentContext)) { + return (moduleContentContext.stream() + .filter(o -> (null != o && o.stream().filter(i -> i.getKey().equals(MesPcnExtConstWords.PART_PROD_GROUP_CODE)).findFirst().isPresent())) + .map(o -> o.stream().filter(i -> i.getKey().equals(MesPcnExtConstWords.PART_PROD_GROUP_CODE)).findFirst().get().getValue()).collect(Collectors.toList()) + ).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); } MesQueueOrder queueOrder = getNewQueueOrder(reqBean); return queueOrder == null ? null : Stream.of(queueOrder.getPartProdGroupCode()).collect(Collectors.toList()); } - private boolean checkJumpNumber(String nextWorkOrderSeq, String currentWorkOrderSeq) { + //查询推单队列 + private List queryQueueOrderPush(StationRequestBean reqBean) { + //处理排序线推单上下文, 返回推送工位类型对应的配置信息 【来源工位】; + //再根据配置查询生产队列工位推送信息 : 根据生产线代码,推送来源代码集合查询创建状态的生产队列工位推送信息【创建时间正序】 + List queueOrderPushList = queueOrderPushService.getQueueOrderPushList(reqBean.getOrganizeCode(), + productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getValue())); + + //列表做多展示50条队列; 超过49条,进行截取 + if (!CollectionUtils.isEmpty(queueOrderPushList) && queueOrderPushList.size() > MesPcnExtConstWords.FORTY_NINE) queueOrderPushList = queueOrderPushList.subList(MesPcnExtConstWords.ZERO, MesPcnExtConstWords.FORTY_NINE); + + //查询最多50条当前工位修改时间最新的队列记录 + DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(reqBean.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean); + DdlPreparedPack.getStringEqualPack(reqBean.getWorkCellCode(), MesPcnExtConstWords.WORK_CELL_CODE, packBean); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.MODIFY_DATE_TIME}, packBean); + Integer topNum = CollectionUtils.isEmpty(queueOrderPushList) ? MesPcnExtConstWords.FIFTY : (MesPcnExtConstWords.FIFTY - queueOrderPushList.size()); + List queueOrderList = queueOrderRepository.findByHqlTopWhere(packBean, topNum); + + if (CollectionUtils.isEmpty(queueOrderPushList) && CollectionUtils.isEmpty(queueOrderList)) return null; + + //推送队列根据创建时间倒序 + if (!CollectionUtils.isEmpty(queueOrderPushList)) queueOrderPushList = queueOrderPushList.stream().filter(o -> null != o).sorted(Comparator.comparing(MesQueueOrderPush::getCreateDatetime).reversed()).collect(Collectors.toList()); + + List queueOrderModelList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(queueOrderPushList)) { + for (MesQueueOrderPush queueOrderPush : queueOrderPushList) { + if (null == queueOrderPush) continue; + MesQueueOrderModel queueOrderModel = new MesQueueOrderModel(); + BeanUtils.copyProperties(queueOrderPush, queueOrderModel); + queueOrderModel.setWorkCellCode(reqBean.getWorkCellCode()); + queueOrderModel.setStatus(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()); + queueOrderModelList.add(queueOrderModel); + } + } + if (!CollectionUtils.isEmpty(queueOrderList)) { + for (MesQueueOrder queueOrder : queueOrderList) { + if (null == queueOrder) continue; + MesQueueOrderModel queueOrderModel = new MesQueueOrderModel(); + BeanUtils.copyProperties(queueOrder, queueOrderModel); + queueOrderModelList.add(queueOrderModel); + } + } + + Integer index = MesPcnExtConstWords.ONE; + for (MesQueueOrderModel queueOrderModel : queueOrderModelList) { + if (null == queueOrderModel) continue; + //默认绿色【完成状态】 + String color = MesExtEnumUtil.COLOR.GREEN.getValue(); + if (queueOrderModel.getStatus() == MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) color = MesExtEnumUtil.COLOR.WHITE.getValue(); + //跳号标黄色 + if (index < queueOrderList.size() && checkSamePartProdGroupCode(queueOrderModelList.get(index).getPartProdGroupCode(), queueOrderModel.getPartProdGroupCode()) && checkJumpNumber(queueOrderModelList.get(index).getWorkOrderSeq(), queueOrderModel.getWorkOrderSeq())) color = MesExtEnumUtil.COLOR.YELLOW.getValue(); + queueOrderModel.setColor(color); + index ++; + } + + return queueOrderModelList; + } + + //验证生成 + private Boolean checkSamePartProdGroupCode(String nextPartProdGroupCode, String partProdGroupCode) { + if (StringUtils.isEmpty(nextPartProdGroupCode) || StringUtils.isEmpty(partProdGroupCode)) return false; + return nextPartProdGroupCode.equals(partProdGroupCode); + } + + //标黄是跳号的工单, 不是跳过的工单 + private Boolean checkJumpNumber(String nextWorkOrderSeq, String currentWorkOrderSeq) { if (StringUtils.isEmpty(nextWorkOrderSeq) || StringUtils.isEmpty(currentWorkOrderSeq) || !CheckTool.isNumber(nextWorkOrderSeq) || !CheckTool.isNumber(currentWorkOrderSeq)) return false; return Integer.parseInt(currentWorkOrderSeq) != Integer.parseInt(nextWorkOrderSeq) + MesPcnExtConstWords.ONE; } + //查询当前工位完成状态最新的一笔队列记录 private MesQueueOrder getNewQueueOrder(StationRequestBean reqBean) { DdlPackBean packBean = DdlPackBean.getDdlPackBean(reqBean.getOrganizeCode()); DdlPreparedPack.getStringEqualPack(reqBean.getWorkCenterCode(), MesPcnExtConstWords.WORK_CENTER_CODE, packBean); DdlPreparedPack.getStringEqualPack(reqBean.getWorkCellCode(), MesPcnExtConstWords.WORK_CELL_CODE, packBean); DdlPreparedPack.getNumEqualPack(MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue(), MesPcnExtConstWords.STATUS, packBean); - packBean.setOrderByStr(" order by modifyDatetime desc "); + DdlPreparedPack.getOrderByPack(new Object[]{CommonEnumUtil.ASC_OR_DESC.DESC.getValue()}, new String[]{MesPcnExtConstWords.MODIFY_DATE_TIME}, packBean); return queueOrderRepository.getByProperty(packBean); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionQueueOrderPushService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionQueueOrderPushService.java new file mode 100644 index 0000000..c4ab80b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/station/function/MesFunctionQueueOrderPushService.java @@ -0,0 +1,164 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.station.function; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEnumExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService; +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.function.IFsmModuleFunctionService; +import cn.estsh.i3plus.pojo.base.bean.ListPager; +import cn.estsh.i3plus.pojo.base.common.Pager; +import cn.estsh.i3plus.pojo.base.common.PagerHelper; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; +import cn.estsh.i3plus.pojo.mes.model.ButtonDynamicModel; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.model.StationResultBean; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import com.alibaba.fastjson.JSONObject; +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.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Description : 工位参数按钮事件接口实现【队列推送】 + **/ +@Service +public class MesFunctionQueueOrderPushService extends BaseSwsService implements IFsmModuleFunctionService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesQueueOrderPushService queueOrderPushService; + + @Autowired + private IMesEnumExtService enumExtService; + + @Override + public Object doCustomApiDispatch(StationRequestBean reqBean, StationResultBean resultBean, ButtonDynamicModel buttonDynamicModel) { + + //页面渲染数据集 + Map resultMap = new HashMap<>(); + + //验证参数 + Map paramMap = null; + try { + paramMap = StringUtils.isEmpty(buttonDynamicModel.getFunctionValue()) ? null : JSONObject.parseObject(buttonDynamicModel.getFunctionValue(), Map.class); + } catch (Exception e) { + } + if (CollectionUtils.isEmpty(paramMap) || StringUtils.isEmpty(BUSI_TYPE.valueOfDescription(paramMap.get(MesPcnExtConstWords.BUSI_TYPE)))) { + resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue()); + return packResultMap(reqBean, resultBean, resultMap, String.format("[%s]参数异常!", buttonDynamicModel.getButtonName())); + } + + //查询 + if (BUSI_TYPE.ONE.value.equals(paramMap.get(MesPcnExtConstWords.BUSI_TYPE))) return queryQueueOrderPush(reqBean, resultMap, paramMap); + + this.sendMessage(reqBean, new StationResultBean().writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()), + String.format("[%s]%s: %s", buttonDynamicModel.getButtonName(), BUSI_TYPE.valueOfDescription(paramMap.get(MesPcnExtConstWords.BUSI_TYPE)), JSONObject.toJSONString(paramMap)), + MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + + resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PICK.getValue()); + resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT.getValue()); + + if (BUSI_TYPE.TWO.value.equals(paramMap.get(MesPcnExtConstWords.BUSI_TYPE))) queryQueueOrderPush(reqBean, resultMap, paramMap); + else if (BUSI_TYPE.THREE.value.equals(paramMap.get(MesPcnExtConstWords.BUSI_TYPE))) queryQueueOrderPush(reqBean, resultMap, paramMap); + else queryQueueOrderPush(reqBean, resultMap, paramMap); + + if (!resultMap.containsKey(MesPcnExtConstWords.MESSAGE)) { + resultMap.put(MesPcnExtConstWords.DATA_TYPE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT.getValue()); + resultMap.put(MesPcnExtConstWords.MESSAGE, String.format("[%s]%s成功!", buttonDynamicModel.getButtonName(), BUSI_TYPE.valueOfDescription(paramMap.get(MesPcnExtConstWords.BUSI_TYPE)))); + } + + return resultMap; + + } + + private Object queryQueueOrderPush(StationRequestBean reqBean, Map resultMap, Map paramMap) { + + Pager pager = new Pager(); + pager.setCurrentPage(paramMap.containsKey(MesPcnExtConstWords.CURRENT_PAGE) ? Integer.valueOf(paramMap.get(MesPcnExtConstWords.CURRENT_PAGE)) : MesPcnExtConstWords.ONE); + pager.setPageSize(paramMap.containsKey(MesPcnExtConstWords.PAGE_SIZE) ? Integer.valueOf(paramMap.get(MesPcnExtConstWords.PAGE_SIZE)) : MesPcnExtConstWords.FIFTY); + + resultMap.put(MesPcnExtConstWords.QUEUE_STATUS, enumExtService.doGetMesEnumByEnumName(reqBean.getOrganizeCode(), MesExtEnumUtil.QUEUE_ORDER_STATUS.class.getSimpleName())); + + //处理排序线推单上下文, 返回推送工位类型对应的配置信息 【来源工位】 + List queueOrderPushCellCfgList = productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getValue()); + List pushSourceCodeList = (queueOrderPushCellCfgList.stream() + .filter(o -> (null != o && !StringUtils.isEmpty(o.getPushSourceCode()))).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList()) + ).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + + if (!CollectionUtils.isEmpty(pushSourceCodeList)) resultMap.put(MesPcnExtConstWords.PUSH_SOURCE_CODE, pushSourceCodeList); + else { + pager = PagerHelper.getPager(pager, MesPcnExtConstWords.ZERO); + resultMap.put(MesPcnExtConstWords.DATA, new ListPager<>(new ArrayList<>(), pager)); + return resultMap; + } + + paramMap.put(MesPcnExtConstWords.ORGANIZE_CODE, reqBean.getOrganizeCode()); + //根据配置查询生产队列工位推送信息 + resultMap.put(MesPcnExtConstWords.DATA, queueOrderPushService.queryQueueOrderPushListPager(paramMap, pushSourceCodeList, pager)); + return resultMap; + + } + + //返回提示信息 + private Object packResultMap(StationRequestBean reqBean, StationResultBean resultBean, Map resultMap, String message) { + this.sendMessage(reqBean, resultBean, message, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + resultMap.put(MesPcnExtConstWords.MESSAGE, message); + return resultMap; + } + + //业务操作 + enum BUSI_TYPE { + + ONE("1", "查询"), + + TWO("2", "新增"), + + THREE("3", "修改"), + + FOUR("4", "取消"); + + private String value; + + private String description; + + BUSI_TYPE(String value, String description) { + + this.value = value; + + this.description = description; + + } + + public String getValue() { + return value; + } + + public String getDescription() { + return description; + } + + public static String valueOfDescription(String val) { + if (StringUtils.isEmpty(val)) return null; + String tmp = null; + for (int i = 0; i < values().length; i++) { + if (val.equals(values()[i].value)) { + tmp = values()[i].description; + } + } + return tmp; + } + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowNosortStepService.java index 7a16fb5..6aedb9b 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 @@ -91,6 +91,10 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { //获取上下文进料零件条码信息集合 List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + //没有【产出零件数据】【进料零件条码信息】,不支持当前工步 + if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(productionPsInContextList)) + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]当前已不存在产成零件或进料条码数据信息,请重置工序!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + //根据现有数据【产出零件数据】【进料零件条码信息】比对上下文中已经存在的加工规则数据信息集合, 没有加工规则的数据进行查询 if (CollectionUtils.isEmpty(prodRuleContextList)) prodRuleContextList = new ArrayList<>(); Integer initSize = prodRuleContextList.size(); @@ -122,8 +126,6 @@ public class MesAssemblyShowNosortStepService extends BaseStepService { //封装非排序加工规则 private StepResult doHandleProdRuleData(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesWorkCenter workCenter, MesProductionProcessContext productionProcessContext, MesCellEquipContext cellEquipContext, List prodRuleContextList, List productionPartContextList, List productionPsInContextList) { - //没有【产出零件数据】【进料零件条码信息】,则直接跳过 【当前是生成零件号场景】 - if (CollectionUtils.isEmpty(productionPartContextList) && CollectionUtils.isEmpty(productionPsInContextList)) return stepResult; //获取加工不可用规则 Map> prodRuleIgnoreCfgMap = productionProcessContextStepService.getProdRuleIgnoreCfgContextMap(reqBean, productionProcessContext); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java index ece4670..f0105b6 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesAssemblyShowSortStepService.java @@ -79,6 +79,10 @@ public class MesAssemblyShowSortStepService extends BaseStepService { //获取上下文进料零件条码信息集合 List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); + //上下文中不存在进料主条码数据信息 + if (CollectionUtils.isEmpty(productionPsInContextList) || CollectionUtils.isEmpty(productionPartContextList)) + stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]当前已不存在加工单或条码数据信息,请重置工序!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + //获取上下文产出零件条码信息集合 List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); @@ -157,10 +161,6 @@ public class MesAssemblyShowSortStepService extends BaseStepService { //获取加工不可用规则 Map> prodRuleIgnoreCfgMap = productionProcessContextStepService.getProdRuleIgnoreCfgContextMap(reqBean, productionProcessContext); - //上下文中不存在进料主条码数据信息 - if (CollectionUtils.isEmpty(productionPsInContextList) || CollectionUtils.isEmpty(productionPartContextList)) - stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), String.format("生产线[%s]工位[%s]当前已不存在加工单或条码数据信息,请重置工序!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); - //拿到当前最大的foreignKey Optional maxForeignKeyOptional = productionPsInContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getForeignKey()))).max(Comparator.comparing(MesProductionPsInContext::getForeignKey)); Integer foreignKey = (null != maxForeignKeyOptional && maxForeignKeyOptional.isPresent()) ? maxForeignKeyOptional.get().getForeignKey() : MesPcnExtConstWords.ZERO; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckNosortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckNosortStepService.java index 58478b0..3a8988c 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckNosortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckNosortStepService.java @@ -90,10 +90,10 @@ public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepS private void doHandleProductSeqCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productionPartContextList) { //非排序顺序防错级别配置[工位参数] - String cavityNosortCfg = getCheckProductSeqCfg(reqBean); + String checkProductSeqCfg = getCheckProductSeqCfg(reqBean); //当是零件级别的配置的时候 搜集工单号 去重 - List filterWorkOrderNoList = StringUtils.isEmpty(cavityNosortCfg) ? null : + List filterWorkOrderNoList = StringUtils.isEmpty(checkProductSeqCfg) ? null : (productionPartContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)) .map(MesProductionPartContext::getWorkOrderNo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); @@ -106,7 +106,7 @@ public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepS if (productionPartContext.getCheckSeqResult().compareTo(MesPcnExtConstWords.ZERO) != 0) continue; //顺序防错验证 - Boolean result = doProductSeqCheckNosort(reqBean, stepResult, productionProcessContext, productionPartContext, cavityNosortCfg, filterWorkOrderNoList); + Boolean result = doProductSeqCheckNosort(reqBean, stepResult, productionProcessContext, productionPartContext, checkProductSeqCfg, filterWorkOrderNoList); productionPartContext.checkSeqResult(!result ? CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() : CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); @@ -130,13 +130,13 @@ public class MesProductSeqCheckNosortStepService extends MesProductSeqCheckStepS //前道工艺防错验证 【非排序】 private Boolean doProductSeqCheckNosort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, - MesProductionPartContext productionPartContext, String cavityNosortCfg, List workOrderNoList) { + MesProductionPartContext productionPartContext, String checkProductSeqCfg, List workOrderNoList) { String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; //根据生产工单顺序号,生产线代码查询上一个生产工单信息 MesWorkOrder workOrder; - if (StringUtils.isEmpty(cavityNosortCfg)) { + if (StringUtils.isEmpty(checkProductSeqCfg)) { workOrder = workOrderExtService.getWorkOrder(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), productionPartContext.getProductSeq()); } else if (workOrderNoList.size() == 1) { //增加零件号条件 diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckSortStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckSortStepService.java index 53cddfe..11fc960 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckSortStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductSeqCheckSortStepService.java @@ -6,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrderAssembly; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; @@ -75,6 +76,10 @@ public class MesProductSeqCheckSortStepService extends MesProductSeqCheckStepSer //顺序防错验证处理 private void doHandleProductSeqCheck(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List productionPartContextList) { + //排序线是否推单 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + Boolean isPushQueue = (StringUtils.isEmpty(workCenter.getIsPushQueue()) || workCenter.getIsPushQueue().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) ? false : true; + List workOrderNoList = new ArrayList<>(); for (MesProductionPartContext productionPartContext : productionPartContextList) { @@ -84,7 +89,7 @@ public class MesProductSeqCheckSortStepService extends MesProductSeqCheckStepSer if (productionPartContext.getCheckSeqResult().compareTo(MesPcnExtConstWords.ZERO) != 0) continue; //顺序防错验证 - Boolean result = doProductSeqCheckSort(reqBean, stepResult, productionProcessContext, productionPartContext); + Boolean result = doProductSeqCheckSort(reqBean, stepResult, productionProcessContext, productionPartContext, isPushQueue); productionPartContext.checkSeqResult(!result ? CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue() : CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()); @@ -101,7 +106,7 @@ public class MesProductSeqCheckSortStepService extends MesProductSeqCheckStepSer } //前道工艺防错验证 【排序】 - private Boolean doProductSeqCheckSort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPartContext productionPartContext) { + private Boolean doProductSeqCheckSort(StationRequestBean reqBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesProductionPartContext productionPartContext, Boolean isPushQueue) { String message = StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg() + MesPcnExtConstWords.SEMICOLON; @@ -116,13 +121,20 @@ public class MesProductSeqCheckSortStepService extends MesProductSeqCheckStepSer if (workOrder.getWorkOrderStatus().compareTo(MesExtEnumUtil.ORDER_STATUS.CLOSE.getValue()) >= 0) return true; + //----以下是加工中状态下的验证----- + //根据生产工单,生产线,工位查询工位队列信息 List queueOrderList = produceSnExtService.getQueueOrderList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrder.getWorkOrderNo()); + + //排序线推单: 是在保存加工结果的时候insertDb队列信息, 存在队列则代表工单已经过当前工位 + if (isPushQueue && !CollectionUtils.isEmpty(queueOrderList)) return true; + + //排序线非推单: 没有队列或者没有创建状态的队列则代表顺序防错通过 Optional optional = CollectionUtils.isEmpty(queueOrderList) ? null : queueOrderList.stream().filter(o -> (null != o && o.getStatus().compareTo(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) == 0)).findFirst(); - if (null == optional || !optional.isPresent()) return true; + if (!isPushQueue && (null == optional || !optional.isPresent())) return true; //根据未完成零件条码获取生产工单装配件清单 - List productSnList = queueOrderList.stream().filter(o -> (null != o && o.getStatus().compareTo(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) == 0)).map(MesQueueOrder::getProductSn).collect(Collectors.toList()); + List productSnList = CollectionUtils.isEmpty(queueOrderList) ? null : queueOrderList.stream().filter(o -> (null != o && o.getStatus().compareTo(MesExtEnumUtil.QUEUE_ORDER_STATUS.CREATE.getValue()) == 0)).map(MesQueueOrder::getProductSn).collect(Collectors.toList()); List workOrderAssemblyList = assemblyExtService.getWorkOrderAssemblyList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrder.getWorkOrderNo(), productSnList); Map> productSnMap = CollectionUtils.isEmpty(workOrderAssemblyList) ? null : workOrderAssemblyList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesWorkOrderAssembly::getProductSn)); if (CollectionUtils.isEmpty(productSnMap)) return true; diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java index 40c84d0..29563e8 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesSendEquipParamsCmdStepService.java @@ -244,9 +244,6 @@ public class MesSendEquipParamsCmdStepService extends BaseStepService { return null != productionPartContext ? productionPartContext.getWorkOrderSeq() : null; case "%CUSTBARCODE%": return null != productionPsOutContext ? productionPsOutContext.getCustSn() : null; - case "%RFIDSN%": - MesShippingQueue shippingQueue = productionDispatchContextStepService.getShippingQueueContext(reqBean); - return null != shippingQueue ? shippingQueue.getRfidSn() : null; default: return matchRule; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java index 86ba506..ffc7fe1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingQueueFindStepService.java @@ -120,7 +120,7 @@ public class MesShippingQueueFindStepService extends BaseStepService { if (null == shippingQueue) { return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, - false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("当前零件发运组[%s]未匹配到有效的发运队列,持续监听中...", scanInfo), + false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, String.format("当前零件发运组[%s]未匹配到有效的发运队列,持续监听中...", scanInfo), getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidMatchStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidMatchStepService.java index cd3d005..b9387bc 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidMatchStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidMatchStepService.java @@ -1,11 +1,8 @@ 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.IMesShippingQueueService; -import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionPsInContext; -import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; -import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; @@ -18,7 +15,6 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.List; -import java.util.stream.Collectors; /** * @Description : 发运队列RFID匹配工步 @@ -31,9 +27,6 @@ public class MesShippingRfidMatchStepService extends BaseStepService { @Autowired private IMesProductionDispatchContextStepService productionDispatchContextStepService; - @Autowired - private IMesShippingQueueService shippingQueueService; - @Override public StepResult execute(StationRequestBean reqBean) { @@ -43,38 +36,20 @@ public class MesShippingRfidMatchStepService extends BaseStepService { //获取上下文发运队列信息 MesShippingQueue shippingQueue = productionDispatchContextStepService.getShippingQueueContext(reqBean); - if ((null == shippingQueue || StringUtils.isEmpty(shippingQueue.getRfidSn()))) { - return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, - false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, "当前未获取到缓存中有效的发运队列,即将重新获取!", - getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); - } + if ((null == shippingQueue || StringUtils.isEmpty(shippingQueue.getRfidSn()))) + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前未获取到缓存中有效的发运队列!"); - //获取上下文进料零件条码信息集合 - List productionPsInContextList = productionDispatchContextStepService.getProductionPsInContext(reqBean); - //过滤有效的进料零件条码 - String productSn = filterProductionPsInContextList(productionPsInContextList); - if (StringUtils.isEmpty(productSn)) { - return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult.nextTriggerEvent(MesPcnExtConstWords.NEXT_TRIGGER_EVENT_PRODUCT_SN), - false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, "当前未获取到缓存中有效的进料条码,即将重新获取!", - getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); - } + //获取上下文扫/读信息:主条码 + List equipVariableCollectContextList = productionDispatchContextStepService.getScanProductSnContext(reqBean); + //设备写的条码 + String productSn = CollectionUtils.isEmpty(equipVariableCollectContextList) ? null : equipVariableCollectContextList.get(0).getEquipVariableValue(); + if (StringUtils.isEmpty(productSn)) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "当前未获取到设备写入的主条码信息!"); - if (!shippingQueue.getRfidSn().equals(productSn)) { - return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, - false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, String.format("RFID匹配失败!读条码[%s]与RFID条码[%s]不一致!", productSn, shippingQueue.getRfidSn()), - getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); - } + if (!shippingQueue.getRfidSn().equals(productSn)) + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, String.format("RFID匹配失败!读条码[%s]与RFID条码[%s]不一致!", productSn, shippingQueue.getRfidSn())); - return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "RFID匹配成功!"); + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, "RFID匹配成功!", MesPcnEnumUtil.PROMPT_SOUND.SUCCESS.getValue()); } - //过滤有效的进料零件条码 - private String filterProductionPsInContextList(List productionPsInContextList) { - productionPsInContextList = CollectionUtils.isEmpty(productionPsInContextList) ? null : - productionPsInContextList.stream().filter(o -> (null != o && o.getIsFinishCode().compareTo(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) == 0)).collect(Collectors.toList()); - return CollectionUtils.isEmpty(productionPsInContextList) ? null : productionPsInContextList.get(0).getProductSn(); - } - - } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidSeresFindStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidSeresFindStepService.java index f4ee1d8..65ab8e1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidSeresFindStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesShippingRfidSeresFindStepService.java @@ -2,8 +2,10 @@ 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.IMesShippingQueueService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; 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.serviceimpl.fsm.IStepService; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesProdRouteOptParam; import cn.estsh.i3plus.pojo.mes.bean.seres.MesCimSeresJisRfid; @@ -11,11 +13,15 @@ import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; 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.StringUtils; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -69,6 +75,21 @@ public class MesShippingRfidSeresFindStepService extends BaseStepService { stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); } + List equipVariableCollectContextList = new ArrayList<>(); + equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), rfidSn, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue())); + //保存上下文扫/读信息:主条码 + productionDispatchContextStepService.dispatchScanProductSnContext(reqBean, equipVariableCollectContextList); + + //主条码验证工步 【非排序】 + stepResult = ((IStepService) SpringContextsUtil.getBean("mesProductSnCheckStepService")).executeInState(reqBean); + + if (!stepResult.isCompleted()) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT, + String.format("当前零件发运组[%s]匹配的发运队列单号[%s]VIN[%s]查询到的赛力斯RFID[%s]验证错误,请人工处理! 持续监听中...", shippingQueue.getShippingGroupCode(), shippingQueue.getShippingCode(), shippingQueue.getVin(), cimSeresJisRfid.getRfid()), + stepParamMap, MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + //保存上下文发运队列信息 shippingQueue.setPidStr(cimSeresJisRfid.getId().toString()); shippingQueue.setRfidSn(rfidSn); 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 3f8afd4..c270c9b 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 @@ -60,9 +60,6 @@ public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepSer //清除本次已获取得到的加工单信息 productionDispatchContextStepService.removeScanWorkOrderNoContext(reqBean); - //从上下文中取出生产线对象 - MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - //获取上下文产出零件信息 List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); @@ -99,7 +96,7 @@ public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepSer try { //验证工单的有效性 - if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter, equipVariableCollectContextList, productionPartContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, equipVariableCollectContextList, productionPartContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); //扫描场景下合并历史产出零件信息 if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) productionPartContextList.addAll(cachedProductionPartContextList); @@ -173,9 +170,12 @@ public class MesWorkOrderCheckNosortStepService extends MesWorkOrderCheckStepSer } //验证工单的有效性 - private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, + private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, List productionPartContextList) { + //从上下文中取出生产线对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + //搜集生产工单号 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()); 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 a0ff84d..24f21c2 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 @@ -6,10 +6,7 @@ import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; 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.MesProduceSn; -import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; @@ -55,9 +52,6 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi //清除本次已获取得到的加工单信息 productionDispatchContextStepService.removeScanWorkOrderNoContext(reqBean); - //从上下文中取出生产线对象 - MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - //获取上下文产出零件信息 List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); List cachedProductionPsInContextList = null; @@ -103,8 +97,10 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi List productionPartContextList = new ArrayList<>(); List productionPsInContextList = new ArrayList<>(); List productionPsOutContextList = new ArrayList<>(); - if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter, - equipVariableCollectContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, + equipVariableCollectContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList).isCompleted()) { + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + } //扫描场景下合并历史产出零件信息/产品条码信息 if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) { @@ -173,16 +169,22 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi } //验证工单的有效性 - private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, - MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, + private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, List productionPartContextList, List productionPsInContextList, List productionPsOutContextList) { + //从上下文中取出生产线与工位对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + MesWorkCell workCell = productionProcessContext.getWorkCell(); + //搜集生产工单号 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.getWorkOrderMapSort(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrderNoList); + Map> workOrderMap; + if (StringUtils.isEmpty(workCenter.getIsPushQueue()) || workCenter.getIsPushQueue().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) != 0) + workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), workOrderNoList, workCell); + else workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), workOrderNoList); for (String workOrderNo : workOrderNoList) { @@ -209,7 +211,7 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi return stepResult.isCompleted(false).msg(String.format("请检查工单产品条码信息,产品条码[%s]条码状态[%s]", produceSn.getProductSn(), MesExtEnumUtil.PRODUCE_SN_STATUS.valueOfDescription(produceSn.getSnStatus()))); MesQueueOrder queueOrder = (MesQueueOrder) itemMap.get(MesQueueOrder.class.getSimpleName()); - if (MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue() == queueOrder.getStatus()) + if (null != queueOrder && MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue() == queueOrder.getStatus()) return stepResult.isCompleted(false).msg(String.format("请检查工单工位队列信息,加工单[%s]工位队列状态[%s]", workOrderNo, MesExtEnumUtil.QUEUE_ORDER_STATUS.valueOfDescription(queueOrder.getStatus()))); //封装产成零件 @@ -218,7 +220,10 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi productionPartContextList.add(productionPartContext); //封装产品条码 - productionPsInContextList.add(new MesProductionPsInContext(produceSn).isCheck(productionProcessContext.getWorkCell()).messageSource(equipVariableCollectContextList.get(0).getMessageSource()).relateId(queueOrder.getId())); + productionPsInContextList.add(new MesProductionPsInContext(produceSn) + .isCheck(productionProcessContext.getWorkCell()).messageSource(equipVariableCollectContextList.get(0).getMessageSource()) + .relateId(null != queueOrder ? queueOrder.getId() : null) + ); //封装产出条码 MesProductionPsOutContext productionPsOutContext = new MesProductionPsOutContext().copy(produceSn); @@ -251,6 +256,7 @@ public class MesWorkOrderCheckSortStepService extends MesWorkOrderCheckStepServi 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.CAR_MODEL_CODE, "车型配置", o.getCarModelCode()), new StationKvBean(MesPcnExtConstWords.CUST_ORDER_NO, "客户订单号", o.getCustOrderNo()), + new StationKvBean(MesPcnExtConstWords.PART_PROD_GROUP_CODE, "零件生产组代码", o.getPartProdGroupCode()).isDisplay(CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()), productionPartContextList.size() == 1 ? null : new StationKvBean(MesPcnExtConstWords.CAVITY, "腔数", new StringJoiner(MesPcnExtConstWords.SLANT_R).add(String.valueOf(index.updateAndGet(v -> v + 1))).add(String.valueOf(productionPartContextList.size())).toString()))); } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepServiceBak.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepServiceBak.java index df835e8..a3874cc 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepServiceBak.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderCheckSortStepServiceBak.java @@ -6,10 +6,7 @@ import cn.estsh.i3plus.mes.pcn.util.StationKvBeanUtil; 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.MesProduceSn; -import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrder; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkOrder; +import cn.estsh.i3plus.pojo.mes.bean.*; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; @@ -55,9 +52,6 @@ public class MesWorkOrderCheckSortStepServiceBak extends MesWorkOrderCheckStepSe //清除本次已获取得到的加工单信息 productionDispatchContextStepService.removeScanWorkOrderNoContext(reqBean); - //从上下文中取出生产线对象 - MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); - //获取上下文产出零件信息 List cachedProductionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); List cachedProductionPsInContextList = null; @@ -103,8 +97,10 @@ public class MesWorkOrderCheckSortStepServiceBak extends MesWorkOrderCheckStepSe List productionPartContextList = new ArrayList<>(); List productionPsInContextList = new ArrayList<>(); List productionPsOutContextList = new ArrayList<>(); - if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, workCenter, - equipVariableCollectContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList).isCompleted()) return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + if (!checkWorkOrderValid(reqBean, resultBean, stepResult, productionProcessContext, + equipVariableCollectContextList, productionPartContextList, productionPsInContextList, productionPsOutContextList).isCompleted()) { + return stepNonCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(), stepResult, stepResult.getMsg()); + } //扫描场景下合并历史产出零件信息/产品条码信息 if (MesExtEnumUtil.CELL_MESSAGE_SOURCE.SCAN.getValue() == equipVariableCollectContextList.get(0).getMessageSource() && !CollectionUtils.isEmpty(cachedProductionPartContextList)) { @@ -173,16 +169,19 @@ public class MesWorkOrderCheckSortStepServiceBak extends MesWorkOrderCheckStepSe } //验证工单的有效性 - private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, - MesProductionProcessContext productionProcessContext, MesWorkCenter workCenter, + private StepResult checkWorkOrderValid(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, List equipVariableCollectContextList, List productionPartContextList, List productionPsInContextList, List productionPsOutContextList) { + //从上下文中取出生产线与工位对象 + MesWorkCenter workCenter = productionProcessContext.getWorkCenter(); + MesWorkCell workCell = productionProcessContext.getWorkCell(); + //搜集生产工单号 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.getWorkOrderMapSort(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), workOrderNoList); + Map> workOrderMap = workOrderExtService.getWorkOrderMapSort(reqBean.getOrganizeCode(), workOrderNoList, workCell); for (String workOrderNo : workOrderNoList) { diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java new file mode 100644 index 0000000..744621b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueAcceptStepService.java @@ -0,0 +1,229 @@ +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.api.busi.IMesQueueOrderPushService; +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; +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.StringUtil; +import cn.estsh.i3plus.platform.common.tool.TimeTool; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; +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 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.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; + +/** + * @Description : 工位工单接收工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesWorkOrderQueueAcceptStepService") +public class MesWorkOrderQueueAcceptStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesProductionCustomContextStepService productionCustomContextStepService; + + @Autowired + private IMesQueueOrderPushService queueOrderPushService; + + @Autowired + private IFsmCommonService fsmCommonService; + + private static Map lockTimeMap = new HashMap<>(); + private static Map lockMap = new ConcurrentHashMap<>(); + + @Override + public StepResult init(StationRequestBean reqBean) { + + StepResult stepResult = StepResult.getSuccessComplete(); + + String endlessLoopReadTimes = fsmCommonService.handleFsmWcpcMapDataForDoScan(reqBean).get(MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES); + if (StringUtils.isEmpty(endlessLoopReadTimes)) endlessLoopReadTimes = MesPcnExtConstWords.ENDLESS_LOOP_READ_TIMES_DEFAULT; + if (productionDispatchContextStepService.dispatchOverEndlessLoopReadTimes(reqBean, endlessLoopReadTimes)) { + stepThreadSleepAndSendTaskCompleteAndThrowEx(reqBean, new StationResultBean().isWs(false), + stepResult.isCompleted(false).msg(String.format("当前未获取到工位工单队列超过[%s]次!", endlessLoopReadTimes)), + MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + //发送工步内容 + productionCustomContextStepService.sendStepContextMessage(reqBean); + + return stepResult; + + } + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //处理排序线推单上下文, 返回推送工位类型对应的配置信息 【来源工位】 + List queueOrderPushCellCfgList = productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getValue()); + if (CollectionUtils.isEmpty(queueOrderPushCellCfgList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), + String.format("生产线[%s]工位[%s]未配置[%s]类型的生产队列推送工位配置信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getDescription())); + + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); + + //推送来源代码集合查询创建状态的生产队列工位推送信息 + List queueOrderPushList = queueOrderPushService.getQueueOrderPushList(reqBean.getOrganizeCode(), queueOrderPushCellCfgList); + if (CollectionUtils.isEmpty(queueOrderPushList) || queueOrderPushList.size() < cellEquipContext.getCavity()) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, + CollectionUtils.isEmpty(queueOrderPushList) ? "当前未接收到工位工单队列,持续监听中..." : String.format("当前接收到到工位工单队列个数[%s]不满足腔数[%s],持续监听中...", queueOrderPushList.size(), cellEquipContext.getCavity()), + getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + //搜集需要考虑加锁的推送来源代码 + List pushSourceCodeList = queueOrderPushCellCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getIsNeedLock()))).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList()); + + //当前即将执行的接收队列 + List curPushList = null; + + try { + //验证是否执行加锁 + for (MesQueueOrderPush queueOrderPush : queueOrderPushList) { + if (null == queueOrderPush || StringUtils.isEmpty(queueOrderPush.getWorkOrderNo())) continue; + //当前遍历中的代码不考虑加锁 + if (CollectionUtils.isEmpty(pushSourceCodeList) || !pushSourceCodeList.contains(queueOrderPush.getPushSourceCode())) { + if (CollectionUtils.isEmpty(curPushList)) curPushList = new ArrayList<>(); + curPushList.add(queueOrderPush); + //满足腔数的情况下退出循环 + if (curPushList.size() >= cellEquipContext.getCavity()) break; + } else { + //当前遍历中的代码考虑加锁; 获取不到锁的情况下退出循环 + if (!tryLock(reqBean.getWorkCenterCode(), queueOrderPush.getPushSourceCode())) break; + List queuePushIdList = productionCustomContextStepService.getSortQueuePushLockContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()); + if (!CollectionUtils.isEmpty(queuePushIdList) && queuePushIdList.contains(queueOrderPush.getId().toString())) continue; + } + + } + + //验证是否满足腔数 + if (CollectionUtils.isEmpty(curPushList) || curPushList.size() < cellEquipContext.getCavity()) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog().checkRepeat(), stepResult, + false, MesPcnEnumUtil.STATION_BUSI_TYPE.GUIDE, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, + CollectionUtils.isEmpty(curPushList) ? "当前未接收到工位工单队列,持续监听中..." : String.format("当前接收到到工位工单队列个数[%s]不满足腔数[%s],持续监听中...", curPushList.size(), cellEquipContext.getCavity()), + getStepParams(reqBean), MesPcnExtConstWords.READ_FAILURE_SLEEP, MesPcnExtConstWords.READ_FAILURE_SLEEP_DEFAULT_TIME); + } + + //搜集工单号 + List workOrderNoList = curPushList.stream().filter(o -> null != o).map(MesQueueOrderPush::getWorkOrderNo).collect(Collectors.toList()); + + //发送工步内容 + productionCustomContextStepService.sendStepContextMessage(reqBean, workOrderNoList.toString(), MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ); + + List equipVariableCollectContextList = new ArrayList<>(); + workOrderNoList.stream().filter(o -> !StringUtils.isEmpty(o)).forEach(o -> + equipVariableCollectContextList.add(new MesEquipVariableCollectContext(reqBean.getOrganizeCode(), o, MesExtEnumUtil.CELL_MESSAGE_SOURCE.READ.getValue()))); + //保存上下文扫/读信息:加工单 + productionDispatchContextStepService.dispatchScanWorkOrderNoContext(reqBean, equipVariableCollectContextList); + + this.sendMessage(reqBean, new StationResultBean().writeDbLog(), String.format("获取到工位工单推送队列%s!", workOrderNoList.toString()), MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT); + + log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- QUEUE_ORDER_PUSH:{}", + reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), JSONObject.toJSONString(curPushList)); + + //加工单验证工步 【排序】 + stepResult = ((IStepService) SpringContextsUtil.getBean("mesWorkOrderCheckSortStepService")).executeInState(reqBean); + + //保存上下文推单信息 + if (stepResult.isCompleted()) productionDispatchContextStepService.dispatchSortQueuePushContext(reqBean, curPushList); + + return stepResult; + + } finally { + + //验证是否执行解锁 + if (!CollectionUtils.isEmpty(curPushList)) { + for (MesQueueOrderPush queueOrderPush : curPushList) { + if (null == queueOrderPush) continue; + if (CollectionUtils.isEmpty(pushSourceCodeList) || !pushSourceCodeList.contains(queueOrderPush.getPushSourceCode())) continue; + //当需要考虑加锁且满足腔数的情况下, 保存排序线工单队列推送锁数据 + if (curPushList.size() >= cellEquipContext.getCavity()) productionCustomContextStepService.dispatchSortQueuePushLockContext(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), queueOrderPush.getId().toString()); + //解锁 + unLock(reqBean.getWorkCenterCode(), queueOrderPush.getPushSourceCode()); + } + } + + } + + } + + //加锁 + private Boolean tryLock(String workCenterCode, String pushSourceCode) { + try { + String key = new StringJoiner(MesPcnExtConstWords.AND).add(workCenterCode).add(pushSourceCode).toString(); + ReentrantLock lock = lockMap.computeIfAbsent(key, item -> new ReentrantLock(true)); + //500ms内拿不到锁的情况下监控锁是否已经超时 + if (!lock.tryLock(MesPcnExtConstWords.FIVE_HUNDRED, TimeUnit.MILLISECONDS) && checkTimeOut(key, lock)) return false; + lockTimeMap.put(key, TimeTool.getNowTime(true)); + return true; + } catch (InterruptedException e) { + return false; + } + } + + //监控超过10秒的情况下进行自动解锁 + private Boolean checkTimeOut(String key, ReentrantLock lock) { + try { + String lockTime = lockTimeMap.get(key); + if ((StringUtils.isEmpty(lockTime) || TimeTool.getSecoundsBetweenTime(1, lockTime, TimeTool.getNowTime(true)) >= MesPcnExtConstWords.TEN) && lock.isLocked()) lock.unlock(); + } catch (Exception e) { + if (lock.isLocked()) lock.unlock(); + } + return true; + } + + //解锁 + private void unLock(String workCenterCode, String pushSourceCode) { + try { + String key = new StringJoiner(MesPcnExtConstWords.AND).add(workCenterCode).add(pushSourceCode).toString(); + lockMap.computeIfPresent(key, (k, v) -> { + if (!v.isHeldByCurrentThread() || !v.isLocked()) return v; + v.unlock(); + return v; + }); + } catch (Exception e) { + } + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueuePushStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueuePushStepService.java new file mode 100644 index 0000000..629cb24 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueuePushStepService.java @@ -0,0 +1,88 @@ +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.IMesQueueOrderPushService; +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.MesProductionPsOutContext; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.mes.pcn.util.StringUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPushCellCfg; +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.List; +import java.util.stream.Collectors; + +/** + * @Description : 工位工单推送工步 + * @Author : wangjie + **/ +@Slf4j +@Service("mesWorkOrderQueuePushStepService") +public class MesWorkOrderQueuePushStepService extends BaseStepService { + + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + + @Autowired + private IMesProductionDispatchContextStepService productionDispatchContextStepService; + + @Autowired + private IMesQueueOrderPushService queueOrderPushService; + + @Override + public StepResult execute(StationRequestBean reqBean) { + + StationResultBean resultBean = new StationResultBean(); + + StepResult stepResult = StepResult.getSuccessComplete(); + + //获取上下文信息 + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.dispatchCurCellEquipment(reqBean); + + //配置错误 抛出异常 + if (!productionProcessContext.getSuccess()) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), productionProcessContext.getMessage()); + + //存储生产过程上下文对象 + productionProcessContextStepService.dispatchProductionProcessContext(reqBean, productionProcessContext); + + //处理排序线推单配置上下文, 返回推送工位类型对应的配置信息 【来源工位】 + List queueOrderPushCellCfgList = productionProcessContextStepService.dispatchQueueOrderPushCellCfgContext(reqBean, MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.SOURCE.getValue()); + if (CollectionUtils.isEmpty(queueOrderPushCellCfgList)) { + return stepDynamicsCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), + stepResult, true, MesPcnEnumUtil.STATION_BUSI_TYPE.RUNNING_INFO, MesPcnEnumUtil.STATION_DATA_TYPE.TEXT, + String.format("生产线[%s]工位[%s]未配置[%s]类型的生产队列推送工位配置信息,当前跳过工位工单推送!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.SOURCE.getDescription())); + } + + //获取上下文产出条码信息 + List productionPsOutContextList = productionDispatchContextStepService.getProductionPsOutContext(reqBean); + //获取上下文产出零件信息 + List productionPartContextList = productionDispatchContextStepService.getProductionPartContext(reqBean); + if (CollectionUtils.isEmpty(productionPsOutContextList) || CollectionUtils.isEmpty(productionPartContextList)) stepExpSendMsgAndThrowEx(reqBean, resultBean.writeDbLog(), "当前不存在产出零件条码信息,请重置工序解决!"); + + //写入工位工单推送信息 + productionPsOutContextList.stream().forEach(o -> + queueOrderPushService.insertQueueOrderPush(reqBean.getOrganizeCode(), reqBean.getUserInfo(), queueOrderPushCellCfgList, o, + productionPartContextList.stream().filter(i -> (null != o && !StringUtils.isEmpty(i.getForeignKey()) && i.getForeignKey().compareTo(o.getForeignKey()) == 0)).findFirst().get()) + ); + + log.info("工厂{}生产线{}工位{}:FSM STATE DISPATCHER --- DO STEP --- {} EXEC --- ORDER:{} --- PUSH_SOURCE_CODE:{}", + reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), StringUtil.toLowerCaseFirst(this.getClass().getSimpleName()), + productionPsOutContextList.stream().filter(o -> null != o).map(MesProductionPsOutContext::getWorkOrderNo).collect(Collectors.toList()).toString(), + queueOrderPushCellCfgList.stream().filter(o -> null != o).map(MesQueueOrderPushCellCfg::getPushSourceCode).collect(Collectors.toList()).toString()); + + return stepSuccessCompleteAndSendMsgReturn(reqBean, resultBean.writeDbLog(MesPcnEnumUtil.WORK_CELL_SCAN_MONITOR_LOG_TYPE.PROCESS.getValue()), stepResult, "工位工单推送成功!"); + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSaveStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSaveStepService.java index 31c49e1..bcb6a9c 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSaveStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkOrderQueueSaveStepService.java @@ -67,12 +67,12 @@ public class MesWorkOrderQueueSaveStepService extends BaseStepService { } private void saveWorkOrderQueue(StationRequestBean reqBean, MesProductionPsInContext productionPsInContext) { -// if (!StringUtils.isEmpty(productionPsInContext.getProcessCode()) && productionPsInContext.getProcessCode().equals(reqBean.getProcessCode())) return; - queueOrderRepository.updateByProperties( + if (StringUtils.isEmpty(productionPsInContext.getRelateId())) return; + queueOrderRepository.updateByPropertiesNoSync( new String[]{MesPcnExtConstWords.ID, MesPcnExtConstWords.ORGANIZE_CODE}, new Object[]{productionPsInContext.getRelateId(), reqBean.getOrganizeCode()}, - new String[]{MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.STATUS}, - new Object[]{reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue()}); + new String[]{MesPcnExtConstWords.STATUS, MesPcnExtConstWords.MODIFY_USER, MesPcnExtConstWords.MODIFY_DATE_TIME, MesPcnExtConstWords.SYSTEM_SYNC_STATUS, MesPcnExtConstWords.SYSTEM_SYNC_DATE_TIME}, + new Object[]{MesExtEnumUtil.QUEUE_ORDER_STATUS.FINISH.getValue(), reqBean.getUserInfo(), TimeTool.getNowTime(true), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), MesPcnExtConstWords.EMPTY}); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java index b9ec758..9c48eee 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/context/MesProductionCustomContextStepService.java @@ -290,10 +290,32 @@ public class MesProductionCustomContextStepService extends BaseStepService imple return !StringUtils.isEmpty(contextStr) ? JSONObject.parseObject(contextStr, Map.class) : null; } - //删除上下文班次班组信息 + //删除打包数据 @Override public void removePackageDataContext(StationRequestBean reqBean) { removeFsmBusiData(reqBean.getOrganizeCode(), getPackageDataContextKey(reqBean)); } + //排序线工单队列推送锁数据KEY 【PS:生产线级别】 + private String getSortQueuePushLockContextKey(String orgainzeCode, String workCenterCode) { return new StringJoiner(MesPcnExtConstWords.COLON).add(orgainzeCode).add(MesPcnExtConstWords.QUEUE_PUSH_LOCK_CONTEXT).add(workCenterCode).toString(); } + + //获取排序线工单队列推送锁数据 + @Override + public List getSortQueuePushLockContext(String orgainzeCode, String workCenterCode) { + return getFsmBusiList(orgainzeCode, getSortQueuePushLockContextKey(orgainzeCode, workCenterCode)); + } + + //保存排序线工单队列推送锁数据 + @Override + public Boolean dispatchSortQueuePushLockContext(String organizeCode, String workCenterCode, String queuePushId) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(queuePushId)) return false; + return dispatchFsmBusiList(organizeCode, getSortQueuePushLockContextKey(organizeCode, workCenterCode), queuePushId); + } + + //删除排序线工单队列推送锁数据 + @Override + public void removeSortQueuePushLockContext(String orgainzeCode, String workCenterCode, String queuePushId) { + removeFsmBusiList(orgainzeCode, getSortQueuePushLockContextKey(orgainzeCode, workCenterCode), queuePushId); + } + } 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 96123d1..79c3b3a 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,6 +6,7 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.model.MesWorkOrderCutDetailModel; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesQueueOrderPush; import cn.estsh.i3plus.pojo.mes.bean.MesRawPartCharging; import cn.estsh.i3plus.pojo.mes.bean.shipping.MesShippingQueue; import cn.estsh.i3plus.pojo.mes.model.StationKvBean; @@ -550,4 +551,18 @@ public class MesProductionDispatchContextStepService extends BaseStepService imp return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.SHIPPING_QUEUE_CONTEXT, JSONObject.toJSONString(shippingQueue)); } + //获取上下文推单队列信息 + @Override + public List getSortQueuePushContext(StationRequestBean reqBean) { + String sortQueuePushJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CONTEXT); + return !StringUtils.isEmpty(sortQueuePushJson) ? JSONObject.parseArray(sortQueuePushJson, MesQueueOrderPush.class) : null; + } + + //保存上下文推单队列信息 + @Override + public Boolean dispatchSortQueuePushContext(StationRequestBean reqBean, List queueOrderPushList) { + if (CollectionUtils.isEmpty(queueOrderPushList)) return false; + return dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CONTEXT, JSONObject.toJSONString(queueOrderPushList)); + } + } 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 f920055..c2e0b0a 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 @@ -3,6 +3,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step.context; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesEquipmentExtService; import cn.estsh.i3plus.ext.mes.pcn.api.base.IMesProdOrgExtService; import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesQueueOrderPushService; import cn.estsh.i3plus.ext.mes.pcn.pojo.context.*; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; @@ -49,6 +50,9 @@ public class MesProductionProcessContextStepService extends BaseStepService impl private IConfigService configService; @Autowired + private IMesQueueOrderPushService queueOrderPushService; + + @Autowired private SnowflakeIdMaker snowflakeIdMaker; private String getContextKey(StationRequestBean reqBean) { @@ -617,14 +621,24 @@ public class MesProductionProcessContextStepService extends BaseStepService impl MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); if (null == cellEquipmentContext) cellEquipmentContext = dispatchCurCellEquipment(reqBean, productionProcessContext).getCurCellEquip(); if (!productionProcessContext.getSuccess() || !StringUtils.isEmpty(productionProcessContext.getProdRuleIgnoreCfg())) return productionProcessContext; - //根据设备代码查询加工不可用规则信息, 如果是排序线末道工位,需要查询生产线所有设备的不可用规则, 因为末道工位可能会补装配前道 - List prodRuleIgnoreCfgList = (getCenterType(reqBean).compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.SORT.getValue()) == 0 && - (!StringUtils.isEmpty(productionProcessContext.getWorkCell().getIsEndWorkCell()) && productionProcessContext.getWorkCell().getIsEndWorkCell().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0)) - ? equipmentExtService.getProdRuleIgnoreCfgListByCenter(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()) - : equipmentExtService.getProdRuleIgnoreCfgListByEquip(reqBean.getOrganizeCode(), cellEquipmentContext.getEquipmentCode()); + + List prodRuleIgnoreCfgList; + if (getCenterType(reqBean).compareTo(MesExtEnumUtil.WORK_CENTER_TYPE.NOSORT.getValue()) == 0) { + //如果是非排序线, 则根据工位当前设备代码查询加工不可用规则信息 + prodRuleIgnoreCfgList = equipmentExtService.getProdRuleIgnoreCfgListByEquip(reqBean.getOrganizeCode(), cellEquipmentContext.getEquipmentCode()); + } else if (!StringUtils.isEmpty(productionProcessContext.getWorkCell().getIsEndWorkCell()) && productionProcessContext.getWorkCell().getIsEndWorkCell().compareTo(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()) == 0) { + //如果是排序线末道工位,需要查询生产线所有设备的不可用规则, 因为末道工位可能会补装配前道 + prodRuleIgnoreCfgList = equipmentExtService.getProdRuleIgnoreCfgListByCenter(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()); + } else { + //如果是排序线,需要查询当前工位下所有设备的不可用规则, 排序线一个工位对应多个设备, 例如不同扭距枪的装配件对应不同的设备 + prodRuleIgnoreCfgList = equipmentExtService.getProdRuleIgnoreCfgListByCell(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + } + + //存储不可用规则到上下文 if (!CollectionUtils.isEmpty(prodRuleIgnoreCfgList)) { dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.PROD_RULE_IGNORE_CFG_CONTEXT, JSONObject.toJSONString(prodRuleIgnoreCfgList)); } + productionProcessContext.prodRuleIgnoreCfg(!CollectionUtils.isEmpty(prodRuleIgnoreCfgList) ? CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr() : CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValueStr()).isNeedCache(); return productionProcessContext; } @@ -645,7 +659,43 @@ public class MesProductionProcessContextStepService extends BaseStepService impl List prodRuleIgnoreCfgList = getProdRuleIgnoreCfgContext(reqBean, productionProcessContext); return CollectionUtils.isEmpty(prodRuleIgnoreCfgList) ? null : prodRuleIgnoreCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getDataSource()) && !StringUtils.isEmpty(o.getSourceId()))) - .collect(Collectors.groupingBy(o -> new StringJoiner(MesPcnExtConstWords.AND).add(o.getDataSource().toString()).add(o.getSourceId().toString()).toString())); + .collect(Collectors.groupingBy(o -> new StringJoiner(MesPcnExtConstWords.AND).add(o.getDataSource().toString()).add(o.getEquipmentCode()).add(o.getSourceId().toString()).toString())); + } + + //处理排序线推单配置上下文, 返回推送工位类型对应的配置信息 + @Override + public List dispatchQueueOrderPushCellCfgContext(StationRequestBean reqBean, Integer pushType) { + List queueOrderPushCellCfgList = dispatchQueueOrderPushCellCfgContext(reqBean); + return CollectionUtils.isEmpty(queueOrderPushCellCfgList) ? null : + queueOrderPushCellCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPushType()) && o.getPushType().compareTo(pushType) == 0)).collect(Collectors.toList()); + } + + //处理排序线推单配置上下文 + private List dispatchQueueOrderPushCellCfgContext(StationRequestBean reqBean) { + String queuePushCfgJson = getFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CFG_CONTEXT); + if (!StringUtils.isEmpty(queuePushCfgJson)) return JSONObject.parseArray(queuePushCfgJson, MesQueueOrderPushCellCfg.class); + //根据生产线代码查询生产队列推送工位配置信息 + List queueOrderPushCellCfgList = queueOrderPushService.getQueueOrderPushCellCfgList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode()); + //搜集该工位对应的配置信息 + List filterList = CollectionUtils.isEmpty(queueOrderPushCellCfgList) ? null : + queueOrderPushCellCfgList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPushSourceCode()) && + !StringUtils.isEmpty(o.getPushType()) && !StringUtils.isEmpty(o.getWorkCellCode()) && o.getWorkCellCode().equals(reqBean.getWorkCellCode()))).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(filterList)) return null; + + //验证是否存在查询队列需要考虑竞争的代码, 赋值是否需要锁定 + for (MesQueueOrderPushCellCfg queueOrderPushCellCfg : filterList) { + if (null == queueOrderPushCellCfg || queueOrderPushCellCfg.getPushType().compareTo(MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.SOURCE.getValue()) == 0) continue; + Optional optional = queueOrderPushCellCfgList.stream().filter(o -> (null != o + && !StringUtils.isEmpty(o.getWorkCellCode()) && !o.getWorkCellCode().equals(reqBean.getWorkCellCode()) + && !StringUtils.isEmpty(o.getPushType()) && o.getPushType().compareTo(MesExtEnumUtil.QUEUE_ORDER_CELL_PUSH_TYPE.TARGET.getValue()) == 0) + && !StringUtils.isEmpty(o.getPushSourceCode()) && o.getPushSourceCode().equals(queueOrderPushCellCfg.getPushSourceCode())).findFirst(); + if (null != optional && optional.isPresent()) queueOrderPushCellCfg.setIsNeedLock(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()); + } + + //保存排序线推单配置上下文 + if (!CollectionUtils.isEmpty(queueOrderPushCellCfgList)) dispatchFsmBusiData(reqBean.getOrganizeCode(), getContextKey(reqBean), MesPcnExtConstWords.QUEUE_PUSH_CFG_CONTEXT, JSONObject.toJSONString(filterList)); + return filterList; } } 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 6060f9f..fde017f 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 @@ -127,7 +127,7 @@ public class MesProductionPsInContext implements Serializable { } public MesProductionPsInContext relateId(Long relateId) { - this.relateId = relateId; + if (!StringUtils.isEmpty(relateId)) this.relateId = relateId; return this; } 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 9b08087..fe575c0 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 @@ -359,6 +359,18 @@ public class MesPcnExtConstWords { public static final String SHIPPING_GROUP_NAME = "shippingGroupName"; //队列状态 public static final String QUEUE_STATUS = "queueStatus"; + //工艺顺序号 + public static final String PROCESS_SEQ = "processSeq"; + //推送来源代码 + public static final String PUSH_SOURCE_CODE = "pushSourceCode"; + //业务类型 + public static final String BUSI_TYPE = "busiType"; + //当前页数 + public static final String CURRENT_PAGE = "currentPage"; + //页面数量 + public static final String PAGE_SIZE = "pageSize"; + //枚举代码 + public static final String ENUM_CODE = "enumCode"; //BaseBean字段不包含工厂, 用于对象复制剔除属性BeanUtils.copyProperties(Object source, Object target, String... ignoreProperties) @@ -522,8 +534,14 @@ public class MesPcnExtConstWords { public static final Integer FOUR = 4; //7 public static final Integer SEVEN = 7; + //10 + public static final Integer TEN = 10; //14 public static final Integer FOURTEEN = 14; + //49 + public static final Integer FORTY_NINE = 49; + //50 + public static final Integer FIFTY = 50; //60 public static final Integer SIXTY = 60; //100 @@ -628,6 +646,12 @@ public class MesPcnExtConstWords { public static final String EQUIP_SPOT_CHECK_CONTEXT = "EQUIP_SPOT_CHECK_CONTEXT"; // 加工不可用规则上下文 public static final String PROD_RULE_IGNORE_CFG_CONTEXT = "PROD_RULE_IGNORE_CFG_CONTEXT"; + // 推送队列配置上下文 + public static final String QUEUE_PUSH_CFG_CONTEXT = "QUEUE_PUSH_CFG_CONTEXT"; + // 推送队列锁上下文 + public static final String QUEUE_PUSH_LOCK_CONTEXT = "QUEUE_PUSH_LOCK_CONTEXT"; + // 推送队列上下文 + public static final String QUEUE_PUSH_CONTEXT = "QUEUE_PUSH_CONTEXT"; // 上下文: 展示组件数据 public static final String MODULE_CONTENT_CONTEXT = "MODULE_CONTENT_CONTEXT";