From 991ab57dfd8557fb8d30655978434571304d40a8 Mon Sep 17 00:00:00 2001 From: "jhforever.wang@estsh.com" Date: Wed, 22 May 2024 16:37:37 +0800 Subject: [PATCH] =?UTF-8?q?pcn=20=E5=B7=A5=E6=AD=A5=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=8A=A0=E5=B7=A5=E7=BB=93=E6=9E=9C=E5=B7=A5=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ext/mes/pcn/api/base/IEquipmentExtService.java | 21 ++ .../mes/pcn/api/base/IEquipmentLogExtService.java | 20 ++ .../ext/mes/pcn/api/base/IProdOrgExtService.java | 20 ++ .../mes/pcn/api/base/ISxOrganizeExtService.java | 24 -- .../IMesProductionProcessContextStepService.java | 62 ++++ ...xtController.java => ProdOrgExtController.java} | 12 +- .../controller/base/TestBaseController.java | 4 - .../serviceimpl/base/EquipmentExtService.java | 87 ++++++ .../serviceimpl/base/EquipmentLogExtService.java | 49 +++ .../serviceimpl/base/ProdOrgExtService.java | 55 ++++ .../serviceimpl/base/SxOrganizeExtService.java | 36 --- .../MesProductionProcessContextStepService.java | 340 +++++++++++++++++++++ .../step/MesWorkResultReadStepService.java | 79 ++++- .../mes/pcn/pojo/context/MesCellEquipContext.java | 45 +++ .../context/MesEquipVariableCollectContext.java | 83 +++++ .../pojo/context/MesProductionProcessContext.java | 210 +++++++++++++ .../i3plus/ext/mes/pcn/pojo/model/TestModel.java | 4 - .../ext/mes/pcn/pojo/util/MesPcnExtConstWords.java | 28 ++ 18 files changed, 1094 insertions(+), 85 deletions(-) create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IEquipmentExtService.java create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IEquipmentLogExtService.java create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IProdOrgExtService.java delete mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/ISxOrganizeExtService.java create mode 100644 modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java rename modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/{SxOrganizeExtController.java => ProdOrgExtController.java} (84%) delete mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/TestBaseController.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/EquipmentExtService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/EquipmentLogExtService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/ProdOrgExtService.java delete mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/SxOrganizeExtService.java create mode 100644 modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionProcessContextStepService.java create mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java create mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesEquipVariableCollectContext.java create mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java delete mode 100644 modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/TestModel.java diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IEquipmentExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IEquipmentExtService.java new file mode 100644 index 0000000..69de402 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IEquipmentExtService.java @@ -0,0 +1,21 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.base; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +public interface IEquipmentExtService { + + @ApiOperation(value = "根据生产线代码,工位代码查询工位设备集合") + List getCellEquipmentList(String organizeCode, String workCenterCode, String workCellCode); + + @ApiOperation(value = "根据设备代码,变量类型,二级变量查询设备数据变量集合") + List getEquipmentVariableList(MesCellEquipContext cellEquipmentContext, Integer variableType, List categoryLevelTwoList); + + @ApiOperation(value = "根据设备变量配置类型,二级变量查询设备数据变量集合") + List getEquipmentVariableCfgList(MesCellEquipContext cellEquipmentContext, List categoryLevelTwoList); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IEquipmentLogExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IEquipmentLogExtService.java new file mode 100644 index 0000000..555516c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IEquipmentLogExtService.java @@ -0,0 +1,20 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.base; + +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentLog; +import io.swagger.annotations.ApiOperation; + +import java.util.ArrayList; +import java.util.List; + +public interface IEquipmentLogExtService { + + @ApiOperation(value = "根据设备ID 查询设备ID分表所有采集数据") + List getEquipmentLogList(String organizeCode, Integer equipId); + + @ApiOperation(value = "根据设备ID,是否常变值状态,OPC注册ID集合 查询设备ID分表采集数据") + List getEquipmentLogList(String organizeCode, Integer equipId, Integer needNewValue, List clientHandleList); + + @ApiOperation(value = "根据设备ID,OPC注册ID集合 修改设备ID分表采集数据的状态") + void updateEquipmentLogList(String organizeCode, Integer equipId, List clientHandleList); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IProdOrgExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IProdOrgExtService.java new file mode 100644 index 0000000..9a85d0a --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/IProdOrgExtService.java @@ -0,0 +1,20 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.base; + +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +public interface IProdOrgExtService { + + @ApiOperation(value = "根据生产线代码查询工位集合") + List findWorkCell(String organizeCode, String workCenterCode); + + @ApiOperation(value = "根据生产线代码查询生产线信息") + MesWorkCenter getWorkCenterDb(String organizeCode, String workCenterCode); + + @ApiOperation(value = "根据生产线代码,工位代码查询工位信息") + MesWorkCell getWorkCellDb(String organizeCode, String workCenterCode, String workCellCode); + +} diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/ISxOrganizeExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/ISxOrganizeExtService.java deleted file mode 100644 index b59b804..0000000 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/base/ISxOrganizeExtService.java +++ /dev/null @@ -1,24 +0,0 @@ -package cn.estsh.i3plus.ext.mes.pcn.api.base; - -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; -import io.swagger.annotations.ApiOperation; - -import java.util.List; - -/** - * @author yumingxing - * @version 1.0 - * @date 2021/1/29 13:24 - **/ -public interface ISxOrganizeExtService { - - /** - * 根据生产线代码查询工位集合 - * @param organizeCode 组织代码 - * @param workCenterCode 生产线代码 - * @return 工位集合 - */ - @ApiOperation(value = "根据生产线代码查询工位集合", notes = "根据生产线代码查询工位集合") - List findWorkCell(String organizeCode, String workCenterCode); - -} 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 new file mode 100644 index 0000000..8f71673 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/IMesProductionProcessContextStepService.java @@ -0,0 +1,62 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import io.swagger.annotations.ApiOperation; + +import java.util.List; +import java.util.Map; + +public interface IMesProductionProcessContextStepService { + + @ApiOperation(value = "获取生产过程上下文对象") + MesProductionProcessContext getProductionProcessContext(StationRequestBean reqBean); + + @ApiOperation(value = "获取工序工艺信息") + MesProductionProcessContext processContext(StationRequestBean reqBean); + + @ApiOperation(value = "获取工序工艺信息") + MesProductionProcessContext processContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + + @ApiOperation(value = "验证组织模型有效性") + MesProductionProcessContext checkBaseData(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + + @ApiOperation(value = "获取工位设备集合信息") + MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean); + + @ApiOperation(value = "获取工位设备集合信息") + MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + + @ApiOperation(value = "获取工位当前设备信息") + MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean); + + @ApiOperation(value = "获取工位当前设备信息") + MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + + @ApiOperation(value = "获取设备数据变量信息") + MesProductionProcessContext getEquipmentVariable(StationRequestBean reqBean, Integer variableType, String... categoryLevelTwo); + + @ApiOperation(value = "获取设备数据变量信息") + MesProductionProcessContext getEquipmentVariable(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, Integer variableType, String... categoryLevelTwo); + + @ApiOperation(value = "获取设备数据变量接口逻辑信息") + MesProductionProcessContext getEquipmentVariableCfg(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + + @ApiOperation(value = "对设备数据变量信息进行必要性验证") + MesProductionProcessContext checkNecessaryEquipmentVariable(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, Integer variableType, String... categoryLevelTwo); + + @ApiOperation(value = "对设备数据变量接口逻辑信息进行必要性验证") + MesProductionProcessContext checkNecessaryEquipmentVariableCfg(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + + @ApiOperation(value = "获取设备分表采集数据") + MesProductionProcessContext doHandleEquipmentLogListByIds(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + + @ApiOperation(value = "设备数据变量接口逻辑信息数据分组") + Map> getEquipmentVariableCfgMap(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext); + + @ApiOperation(value = "根据设备数据变量接口逻辑信息匹配结果") + MesEquipmentVariableCfg execMatchEquipmentVariableCfgValue(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, + MesEquipVariableCollectContext collectContext, Map> equipmentVariableCfgMap, Boolean isNeedVariableCfgValue); +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/SxOrganizeExtController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/ProdOrgExtController.java similarity index 84% rename from modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/SxOrganizeExtController.java rename to modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/ProdOrgExtController.java index 6b3c217..12936bc 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/SxOrganizeExtController.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/ProdOrgExtController.java @@ -1,6 +1,6 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.base; -import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxOrganizeExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IProdOrgExtService; import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; @@ -24,14 +24,14 @@ import java.util.List; * @Description: **/ @RestController -@RequestMapping(CommonConstWords.BASE_URL_MES_PCN + "/ext") -@Api(tags = "SX_组织") -public class SxOrganizeExtController extends MesPcnBaseController { +@RequestMapping(CommonConstWords.BASE_URL_MES_PCN) +@Api(tags = "组织") +public class ProdOrgExtController extends MesPcnBaseController { @Autowired - private ISxOrganizeExtService organizeService; + private IProdOrgExtService organizeService; - @GetMapping({"/query-work-cell-by-center"}) + @GetMapping({"/ext/query-work-cell-by-center"}) @ApiOperation( value = "查询工作单元", notes = "查询工作单元" diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/TestBaseController.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/TestBaseController.java deleted file mode 100644 index 1480398..0000000 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/controller/base/TestBaseController.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.estsh.i3plus.ext.mes.pcn.apiservice.controller.base; - -public class TestBaseController { -} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/EquipmentExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/EquipmentExtService.java new file mode 100644 index 0000000..b1b3d6d --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/EquipmentExtService.java @@ -0,0 +1,87 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IEquipmentExtService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipment; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; +import cn.estsh.i3plus.pojo.mes.bean.MesWcEquipment; +import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableCfgRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentVariableRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesWcEquipmentRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Service +public class EquipmentExtService implements IEquipmentExtService { + + @Autowired + private MesWcEquipmentRepository wcEquipmentRepository; + + @Autowired + private MesEquipmentRepository equipmentRepository; + + @Autowired + private MesEquipmentVariableRepository equipmentVariableRepository; + + @Autowired + private MesEquipmentVariableCfgRepository equipmentVariableCfgRepository; + + @Override + public List getCellEquipmentList(String organizeCode, String workCenterCode, String workCellCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null; + List wcEquipmentDbList = wcEquipmentRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CENTER_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode, workCellCode}); + if (CollectionUtils.isEmpty(wcEquipmentDbList)) return null; + List cellEquipmentContextList = null; + for (MesWcEquipment wcEquipmentDb : wcEquipmentDbList) { + if (null == wcEquipmentDb) continue; + MesEquipment equipmentDb = equipmentRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.EQUIPMENT_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), wcEquipmentDb.getEquipmentCode()}); + if (null == equipmentDb) continue; + if (CollectionUtils.isEmpty(cellEquipmentContextList)) cellEquipmentContextList = new ArrayList<>(); + MesCellEquipContext cellEquipmentContext = new MesCellEquipContext(); + BeanUtils.copyProperties(wcEquipmentDb, cellEquipmentContext); + BeanUtils.copyProperties(equipmentDb, cellEquipmentContext); + cellEquipmentContextList.add(cellEquipmentContext); + } + return cellEquipmentContextList; + } + + @Override + public List getEquipmentVariableList(MesCellEquipContext cellEquipmentContext, Integer variableType, List categoryLevelTwoList) { + if (StringUtils.isEmpty(variableType) || null == cellEquipmentContext) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(cellEquipmentContext.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(cellEquipmentContext.getEquipmentCode(), MesPcnExtConstWords.EQUIPMENT_CODE, packBean); + DdlPreparedPack.getNumEqualPack(variableType, MesPcnExtConstWords.VARIABLE_TYPE, packBean); + if (!CollectionUtils.isEmpty(categoryLevelTwoList) && categoryLevelTwoList.size() == 1) DdlPreparedPack.getStringEqualPack(categoryLevelTwoList.get(0), MesPcnExtConstWords.VARIABLE_TYPE, packBean); + else DdlPreparedPack.getInPackList(categoryLevelTwoList, MesPcnExtConstWords.VARIABLE_TYPE, packBean); + return equipmentVariableRepository.findByHqlWhere(packBean); + } + + @Override + public List getEquipmentVariableCfgList(MesCellEquipContext cellEquipmentContext, List categoryLevelTwoList) { + if (null == cellEquipmentContext || StringUtils.isEmpty(cellEquipmentContext.getVariableCfgType()) || CollectionUtils.isEmpty(categoryLevelTwoList)) return null; + DdlPackBean packBean = DdlPackBean.getDdlPackBean(cellEquipmentContext.getOrganizeCode()); + DdlPreparedPack.getStringEqualPack(cellEquipmentContext.getVariableCfgType(), MesPcnExtConstWords.VARIABLE_CFG_TYPE, packBean); + if (!CollectionUtils.isEmpty(categoryLevelTwoList) && categoryLevelTwoList.size() == 1) DdlPreparedPack.getStringEqualPack(categoryLevelTwoList.get(0), MesPcnExtConstWords.VARIABLE_TYPE, packBean); + else DdlPreparedPack.getInPackList(categoryLevelTwoList, MesPcnExtConstWords.VARIABLE_TYPE, packBean); + return equipmentVariableCfgRepository.findByHqlWhere(packBean); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/EquipmentLogExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/EquipmentLogExtService.java new file mode 100644 index 0000000..94cb293 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/EquipmentLogExtService.java @@ -0,0 +1,49 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IEquipmentLogExtService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentLog; +import cn.estsh.i3plus.pojo.mes.repository.MesEquipmentLogRepository; +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 java.util.List; + +@Slf4j +@Service +public class EquipmentLogExtService implements IEquipmentLogExtService { + + @Autowired + private MesEquipmentLogRepository equipmentLogRepository; + + @Override + public List getEquipmentLogList(String organizeCode, Integer equipId) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(equipId, MesPcnExtConstWords.EQUIP_ID, packBean); + return equipmentLogRepository.findByHqlWhere(packBean); + } + + @Override + public List getEquipmentLogList(String organizeCode, Integer equipId, Integer needNewValue, List clientHandleList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(equipId, MesPcnExtConstWords.EQUIP_ID, packBean); + if (!CollectionUtils.isEmpty(clientHandleList) && clientHandleList.size() == 1) DdlPreparedPack.getNumEqualPack(clientHandleList.get(0), MesPcnExtConstWords.ID, packBean); + else DdlPreparedPack.getInPackList(clientHandleList, MesPcnExtConstWords.ID, packBean); + if (MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.TRUE.getValue() == needNewValue) DdlPreparedPack.getNumEqualPack(MesPcnExtConstWords.ZERO, MesPcnExtConstWords.EQUIP_VARIABLE_STATUS, packBean); + return equipmentLogRepository.findByHqlWhere(packBean); + } + + @Override + public void updateEquipmentLogList(String organizeCode, Integer equipId, List clientHandleList) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getNumEqualPack(equipId, MesPcnExtConstWords.EQUIP_ID, packBean); + if (!CollectionUtils.isEmpty(clientHandleList) && clientHandleList.size() == 1) DdlPreparedPack.getNumEqualPack(clientHandleList.get(0), MesPcnExtConstWords.ID, packBean); + else DdlPreparedPack.getInPackList(clientHandleList, MesPcnExtConstWords.ID, packBean); + equipmentLogRepository.updateByProperties(new String[]{MesPcnExtConstWords.EQUIP_VARIABLE_STATUS}, new Object[]{MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.TRUE.getValue()}, packBean); + } +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/ProdOrgExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/ProdOrgExtService.java new file mode 100644 index 0000000..6eea734 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/ProdOrgExtService.java @@ -0,0 +1,55 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IProdOrgExtService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; +import cn.estsh.i3plus.pojo.mes.repository.MesWorkCellRepository; +import cn.estsh.i3plus.pojo.mes.repository.MesWorkCenterRepository; +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.List; + +@Slf4j +@Service +public class ProdOrgExtService implements IProdOrgExtService { + + @Autowired + private MesWorkCenterRepository workCenterRepository; + + @Autowired + private MesWorkCellRepository workCellRepository; + + @Override + public List findWorkCell(String organizeCode, String workCenterCode) { + DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); + DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", packBean); + DdlPreparedPack.getNumNOEqualPack(MesPcnEnumUtil.MES_WORK_CELL_TYPE.REWORK.getValue(), "workCellType", packBean); + DdlPreparedPack.getOrderByPack(new Object[]{1}, new String[]{"seq"}, packBean); + return this.workCellRepository.findByHqlWhere(packBean); + } + + @Override + public MesWorkCenter getWorkCenterDb(String organizeCode, String workCenterCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode)) return null; + return workCenterRepository.getByProperty( + 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}); + } + + @Override + public MesWorkCell getWorkCellDb(String organizeCode, String workCenterCode, String workCellCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null; + return workCellRepository.getByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CENTER_CODE}, + new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), workCenterCode, workCellCode}); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/SxOrganizeExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/SxOrganizeExtService.java deleted file mode 100644 index 98e31ae..0000000 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/base/SxOrganizeExtService.java +++ /dev/null @@ -1,36 +0,0 @@ -package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.base; - -import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxOrganizeExtService; -import cn.estsh.i3plus.pojo.base.bean.DdlPackBean; -import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; -import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; -import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; -import cn.estsh.i3plus.pojo.mes.repository.MesWorkCellRepository; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * @author wangjie - * @version 1.0 - * @date 2021/1/13 9:28 - **/ -@Slf4j -@Service -public class SxOrganizeExtService implements ISxOrganizeExtService { - - @Autowired - private MesWorkCellRepository workCellRepository; - - @Override - public List findWorkCell(String organizeCode, String workCenterCode) { - DdlPackBean packBean = DdlPackBean.getDdlPackBean(organizeCode); - DdlPreparedPack.getStringEqualPack(workCenterCode, "workCenterCode", packBean); - DdlPreparedPack.getNumNOEqualPack(MesPcnEnumUtil.MES_WORK_CELL_TYPE.REWORK.getValue(), "workCellType", packBean); - DdlPreparedPack.getOrderByPack(new Object[]{1}, new String[]{"seq"}, packBean); - return this.workCellRepository.findByHqlWhere(packBean); - } - -} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionProcessContextStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionProcessContextStepService.java new file mode 100644 index 0000000..3872e7b --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesProductionProcessContextStepService.java @@ -0,0 +1,340 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; + +import cn.estsh.i3plus.ext.mes.pcn.api.base.IEquipmentExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IEquipmentLogExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.base.IProdOrgExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.actor.shipping.dispatch.IFsmRouteDataService; +import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.pojo.mes.bean.*; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.i3plus.pojo.mes.util.MesExtEnumUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @Description : 获取生产过程上下文对象接口实现 + * @Author : wangjie + **/ +@Slf4j +@Service("mesProductionProcessContextStepService") +public class MesProductionProcessContextStepService extends BaseStepService implements IMesProductionProcessContextStepService { + + @Autowired + private IProdOrgExtService prodOrgExtService; + + @Autowired + private IEquipmentExtService equipmentExtService; + + @Autowired + private IFsmRouteDataService fsmRouteDataService; + + @Autowired + private IEquipmentLogExtService equipmentLogExtService; + + @Override + public MesProductionProcessContext getProductionProcessContext(StationRequestBean reqBean) { + + //获取缓存的生产过程上下文对象 + MesProductionProcessContext productionProcessContext = (MesProductionProcessContext) getFsmBusiData(reqBean.getOrganizeCode(), getFsmBusikey(reqBean, MesProductionProcessContext.class.getSimpleName()), MesProductionProcessContext.class); + + if (null == productionProcessContext) productionProcessContext = new MesProductionProcessContext(reqBean.getOrganizeCode()); + + //生产过程上下文对象结果初始化 + productionProcessContext.success(); + + //生产过程上下文对象赋值生产线信息 + if (StringUtils.isEmpty(productionProcessContext.getWorkCenterJson())) productionProcessContext.workCenterJson(prodOrgExtService.getWorkCenterDb(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode())); + + //生产过程上下文对象赋值工位信息 + if (StringUtils.isEmpty(productionProcessContext.getWorkCenterJson())) productionProcessContext.workCellJson(prodOrgExtService.getWorkCellDb(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + + //生产过程上下文对象赋值工序工艺信息 + if (StringUtils.isEmpty(productionProcessContext.getProcessCode()) || !productionProcessContext.getProcessCode().equals(reqBean.getProcessCode())) processContext(reqBean, productionProcessContext); + + //验证组织模型有效性 + return checkBaseData(reqBean, productionProcessContext); + + } + + @Override + public MesProductionProcessContext processContext(StationRequestBean reqBean) { + return processContext(reqBean, getProductionProcessContext(reqBean)); + } + + @Override + public MesProductionProcessContext processContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + + if (!productionProcessContext.getSuccess()) return productionProcessContext; + + if (!StringUtils.isEmpty(productionProcessContext.getProcessCode()) && productionProcessContext.getProcessCode().equals(reqBean.getProcessCode())) return productionProcessContext; + + MesProcess process = fsmRouteDataService.doCachedFsmProcessData(reqBean, reqBean.getProcessCode()); + + MesProcessCraftCfg processCraftCfg = fsmRouteDataService.getProcessCraftCfg(reqBean.getOrganizeCode(), reqBean.getProcessCode()); + + //生产过程上下文对象赋值当前工艺工序,未配置默认赋值工序代码,不强验证 + productionProcessContext.processCode(reqBean.getProcessCode(), null != process ? process.getProcessName() : reqBean.getProcessCode()); + + return productionProcessContext.craftCode(null != processCraftCfg ? processCraftCfg.getCraftCode() : reqBean.getProcessCode(), (null != processCraftCfg) ? productionProcessContext.getProcessCode() : productionProcessContext.getProcessName()); + + } + + @Override + public MesProductionProcessContext checkBaseData(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + + if (StringUtils.isEmpty(productionProcessContext.getWorkCenterJson())) return productionProcessContext.message(String.format("请检查组织模型生产线[%s]信息的有效性!", reqBean.getWorkCenterCode())); + + if (StringUtils.isEmpty(productionProcessContext.getWorkCellJson())) return productionProcessContext.message(String.format("请检查组织模型生产线[%s]工位[%s]信息的有效性!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + + if (StringUtils.isEmpty(productionProcessContext.getProcessCode())) return productionProcessContext.message(String.format("请检查工序信息,生产线[%s]工位[%s]对应工序代码[%s]的有效性!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), reqBean.getProcessCode())); + + return productionProcessContext; + + } + + @Override + public MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean) { + return getCellEquipmentList(reqBean, getProductionProcessContext(reqBean)); + } + + @Override + public MesProductionProcessContext getCellEquipmentList(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + + if (!productionProcessContext.getSuccess()) return productionProcessContext; + + //生产过程上下文对象赋值设备信息 + if (StringUtils.isEmpty(productionProcessContext.getCellEquipListJson())) productionProcessContext.cellEquipListJson(equipmentExtService.getCellEquipmentList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + + return productionProcessContext; + + } + + @Override + public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean) { + return getCurCellEquipment(reqBean, getCellEquipmentList(reqBean)); + } + + @Override + public MesProductionProcessContext getCurCellEquipment(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + + if (!productionProcessContext.getSuccess()) return productionProcessContext; + + //获取当前工步的参数集合 + Optional> stepParamMap = getStepParams(reqBean); + + //获取当前工步的设备参数 + String equipmentCode = (null != stepParamMap && stepParamMap.isPresent() && stepParamMap.get().containsKey(MesPcnExtConstWords.EQUIPMENT_CODE_UC)) ? stepParamMap.get().get(MesPcnExtConstWords.EQUIPMENT_CODE_UC).getParamValue() : null; + + //判断生产过程上下文对象是否存在当前设备信息 + if (!StringUtils.isEmpty(productionProcessContext.getCurCellEquipJson()) && (StringUtils.isEmpty(equipmentCode) || equipmentCode.equals(productionProcessContext.getCurCellEquip().getEquipmentCode()))) return productionProcessContext; + + //从工位设备集合信息中获取当前设备信息 + MesCellEquipContext cellEquipmentContext = productionProcessContext.filterCurCellEquip(equipmentCode); + + //生产过程上下文对象赋值当前设备代码 + if (null != cellEquipmentContext) return productionProcessContext.curCellEquipJson(cellEquipmentContext); + + return StringUtils.isEmpty(equipmentCode) ? productionProcessContext.message(String.format("请检查组织模型,生产线[%s]工位[%s]未维护设备信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())) : + productionProcessContext.message(String.format("请检查组织模型,生产线[%s]工位[%s]未维护工步参数[%s]配置的设备[%s]!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesPcnExtConstWords.EQUIPMENT_CODE_UC, equipmentCode)); + + } + + @Override + public MesProductionProcessContext getEquipmentVariable(StationRequestBean reqBean, Integer variableType, String... categoryLevelTwo) { + return getEquipmentVariable(reqBean, getCurCellEquipment(reqBean), variableType, categoryLevelTwo); + } + + @Override + public MesProductionProcessContext getEquipmentVariable(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, Integer variableType, String... categoryLevelTwo) { + + if (!productionProcessContext.getSuccess()) return productionProcessContext; + + MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); + + //判断生产过程上下文对象是否存在数据变量信息 + List equipmentVariableList = productionProcessContext.getEquipVariableList(); + List categoryLevelTwoList = null != categoryLevelTwo ? Arrays.asList(categoryLevelTwo) : null; + if (!CollectionUtils.isEmpty(equipmentVariableList) && !CollectionUtils.isEmpty(equipmentVariableList.stream().filter(o -> + (null != o && o.getEquipmentCode().equals(cellEquipmentContext.getEquipmentCode()) && o.getVariableType().compareTo(variableType) == 0 && + ((CollectionUtils.isEmpty(categoryLevelTwoList) && StringUtils.isEmpty(o.getCategoryLevelTwo())) || + (!CollectionUtils.isEmpty(categoryLevelTwoList) && !StringUtils.isEmpty(o.getCategoryLevelTwo()) && categoryLevelTwoList.contains(o.getCategoryLevelTwo()))))).collect(Collectors.toList()) + )) return productionProcessContext; + + List equipmentVariableDbList = equipmentExtService.getEquipmentVariableList(cellEquipmentContext, variableType, categoryLevelTwoList); + + //生产过程上下文对象赋值设备数据变量信息 + if (null != equipmentVariableDbList) return productionProcessContext.equipVariableJson(equipmentVariableDbList); + + return productionProcessContext.message(String.format("请检查设备[%s]的数据变量信息,变量类型[%s:%s],二级变量%s!", + cellEquipmentContext.getEquipmentCode(), variableType, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.valueOfDescription(variableType), !CollectionUtils.isEmpty(equipmentVariableList) ? equipmentVariableList.toString() : MesPcnExtConstWords.SQUARE_BRACKETS)); + + } + + @Override + public MesProductionProcessContext getEquipmentVariableCfg(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + + if (!productionProcessContext.getSuccess()) return productionProcessContext; + + //判断生产过程上下文对象是否存在数据变量接口逻辑信息 + List equipmentVariableList = productionProcessContext.getEquipVariableList(); + MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); + List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgList(); + List categoryLevelTwoList = (equipmentVariableList.stream().filter(o -> null != o).map(MesEquipmentVariable::getCategoryLevelTwo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(equipmentVariableCfgList) && !CollectionUtils.isEmpty(equipmentVariableCfgList.stream().filter(o -> + (null != o && o.getVariableCfgType().equals(cellEquipmentContext.getVariableCfgType()) && CollectionUtils.isEmpty(categoryLevelTwoList) && !StringUtils.isEmpty(o.getCategoryLevelTwo()) && categoryLevelTwoList.contains(o.getCategoryLevelTwo()))).collect(Collectors.toList()) + )) return productionProcessContext; + + List equipmentVariableCfgDbList = equipmentExtService.getEquipmentVariableCfgList(cellEquipmentContext, categoryLevelTwoList); + + //生产过程上下文对象赋值设备数据变量接口逻辑信息 + if (null != equipmentVariableCfgDbList) return productionProcessContext.equipVariableCfgJson(equipmentVariableCfgDbList); + return productionProcessContext.message(String.format("请检查设备[%s]的数据变量接口逻辑信息,设备变量配置类型[%s],二级变量%s!", + cellEquipmentContext.getEquipmentCode(), cellEquipmentContext.getVariableCfgType(), !CollectionUtils.isEmpty(equipmentVariableList) ? equipmentVariableList.toString() : MesPcnExtConstWords.SQUARE_BRACKETS)); + + } + + @Override + public MesProductionProcessContext checkNecessaryEquipmentVariable(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, Integer variableType, String... categoryLevelTwo) { + List equipmentVariableList = productionProcessContext.getEquipVariableList(); + if (null == categoryLevelTwo) return productionProcessContext; + + for (String item : categoryLevelTwo) { + + if (StringUtils.isEmpty(item)) continue; + + Optional optional = CollectionUtils.isEmpty(equipmentVariableList) ? null : equipmentVariableList.stream().filter(o -> (null != o && o.getVariableType().compareTo(variableType) == 0 && o.getCategoryLevelTwo().equals(item))).findFirst(); + + if (null != optional && optional.isPresent()) continue; + + return productionProcessContext.message(String.format("请检查设备[%s]必要的数据变量信息,变量类型[%s:%s],二级变量[%s]!", productionProcessContext.getCurCellEquip().getEquipmentCode(), variableType, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.valueOfDescription(variableType), item)); + + } + + return productionProcessContext; + } + + @Override + public MesProductionProcessContext checkNecessaryEquipmentVariableCfg(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + + List equipmentVariableList = productionProcessContext.getEquipVariableList(); + + Map> cfgMap = getEquipmentVariableCfgMap(reqBean, productionProcessContext); + + List filterList = (CollectionUtils.isEmpty(equipmentVariableList) || CollectionUtils.isEmpty(cfgMap)) ? equipmentVariableList : + equipmentVariableList.stream().filter(o -> (null != o && !cfgMap.containsKey(new StringJoiner(MesPcnExtConstWords.AND).add(o.getCategoryLevelTwo()).add(o.getVariableCfgType()).toString()))).collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(filterList)) return productionProcessContext; + + MesCellEquipContext cellEquipmentContext = productionProcessContext.getCurCellEquip(); + + return productionProcessContext.message(String.format("请检查设备[%s]必要的数据变量接口逻辑信息,设备变量配置类型[%s],二级变量%s!", + cellEquipmentContext.getEquipmentCode(), cellEquipmentContext.getVariableCfgType(), + (filterList.stream().filter(o -> null != o).map(MesEquipmentVariable::getCategoryLevelTwo).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).toString())); + } + + @Override + public MesProductionProcessContext doHandleEquipmentLogListByIds(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + + if (!productionProcessContext.getSuccess()) return productionProcessContext; + + //获取缓存的生产过程上下文对象中的历史变量接口逻辑采集信息并重置采集数据 + List equipVariableCollectContextList = productionProcessContext.getEquipVariableCfgCollectList(); + if (!CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList.forEach(o -> o.clear()); + else equipVariableCollectContextList = getEquipVariableCollectContext(reqBean, productionProcessContext);//封装设备数据变量平铺接口逻辑与采集信息 + + if (!productionProcessContext.getSuccess() || CollectionUtils.isEmpty(equipVariableCollectContextList)) return productionProcessContext; + + //根据常变值分别获取设备ID分表的采集数据 + Map needNewValue2Collect = getEquipmentLog(reqBean, equipVariableCollectContextList, MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.TRUE.getValue()); + Map unNeedNewValue2Collect = getEquipmentLog(reqBean, equipVariableCollectContextList, MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.FALSE.getValue()); + + //修改常变值配置对应的设备ID分表的采集数据的状态为1 + if (!CollectionUtils.isEmpty(needNewValue2Collect)) equipmentLogExtService.updateEquipmentLogList(reqBean.getOrganizeCode(), productionProcessContext.getCurCellEquip().getEquipId(), new ArrayList<>(needNewValue2Collect.keySet())); + + //采集数据的值赋予生产过程上下文对象中的变量接口逻辑采集信息 + equipVariableCollectContextList.forEach(o -> copyValue(o, needNewValue2Collect, unNeedNewValue2Collect)); + + //生产过程上下文对象赋值设备分表采集信息 + return productionProcessContext.equipVariableCfgCollectJson(equipVariableCollectContextList); + + } + + private void copyValue(MesEquipVariableCollectContext collectContext, Map needNewValue2Collect, Map unNeedNewValue2Collect) { + if (!CollectionUtils.isEmpty(needNewValue2Collect) && needNewValue2Collect.containsKey(collectContext.getClientHandle())) BeanUtils.copyProperties(collectContext, needNewValue2Collect.get(collectContext.getClientHandle())); + if (!CollectionUtils.isEmpty(unNeedNewValue2Collect) && unNeedNewValue2Collect.containsKey(collectContext.getClientHandle())) BeanUtils.copyProperties(collectContext, unNeedNewValue2Collect.get(collectContext.getClientHandle())); + } + + private Map getEquipmentLog(StationRequestBean reqBean, List equipVariableCollectContextList, Integer needNewValue) { + List filterList = equipVariableCollectContextList.stream().filter(o -> (null != o && o.getNeedNewValue().compareTo(needNewValue) == 0)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(filterList)) return null; + List equipmentLogList = equipmentLogExtService.getEquipmentLogList(reqBean.getOrganizeCode(), + filterList.get(0).getEquipId(), needNewValue, filterList.stream().filter(o -> (null != o)).map(MesEquipVariableCollectContext::getClientHandle).collect(Collectors.toList())); + return CollectionUtils.isEmpty(equipmentLogList) ? null : equipmentLogList.stream().filter(o -> null != o).collect(Collectors.toMap(o -> Integer.valueOf(o.getId().toString()), o -> o)); + } + + private List getEquipVariableCollectContext(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + + List equipmentVariableList = productionProcessContext.getEquipVariableList(); + + Map> cfgMap = getEquipmentVariableCfgMap(reqBean, productionProcessContext); + + List equipVariableCollectContextList = null; + for (MesEquipmentVariable equipmentVariable : equipmentVariableList) { + if (null == equipmentVariable) continue; + + //一个数据变量如果匹配多个接口逻辑信息,验证接口逻辑信息配置的常变值是否统一 + List filterList = getEquipmentVariableCfgListByMap(cfgMap, equipmentVariable.getCategoryLevelTwo(), equipmentVariable.getVariableCfgType()); + if (!CollectionUtils.isEmpty(filterList) && filterList.size() > 1 && (filterList.stream().filter(o -> null != o).map(MesEquipmentVariableCfg::getNeedNewValue).collect(Collectors.toList())).stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()).size() > 1) + return productionProcessContext.message(String.format("请检查设备[%s]的数据变量接口逻辑信息,设备变量配置类型[%s],二级变量[%s]关联的多个变量类别对应的常变值未配置统一!", + equipmentVariable.getEquipmentCode(), equipmentVariable.getVariableCfgType(), equipmentVariable.getCategoryLevelTwo())).getEquipVariableCfgCollectList(); + + MesEquipVariableCollectContext collectContext = new MesEquipVariableCollectContext(equipmentVariable.getId()); + BeanUtils.copyProperties(equipmentVariable, collectContext); + collectContext.needNewValue(!CollectionUtils.isEmpty(filterList) ? filterList.get(0).getNeedNewValue() : MesExtEnumUtil.EQUIP_VARIABLE_NEED_NEW_VALUE.FALSE.getValue()); + + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) equipVariableCollectContextList = new ArrayList<>(); + equipVariableCollectContextList.add(collectContext); + } + + //生产过程上下文对象赋值 设备数据变量平铺接口逻辑与采集信息 + productionProcessContext.equipVariableCfgCollectJson(equipVariableCollectContextList); + + return equipVariableCollectContextList; + } + + @Override + public Map> getEquipmentVariableCfgMap(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext) { + List equipmentVariableCfgList = productionProcessContext.getEquipVariableCfgList(); + return CollectionUtils.isEmpty(equipmentVariableCfgList) ? null : + equipmentVariableCfgList.stream().filter(o -> null != o).collect(Collectors.groupingBy(o -> new StringJoiner(MesPcnExtConstWords.AND).add(o.getCategoryLevelTwo()).add(o.getVariableCfgType()).toString())); + } + + @Override + public MesEquipmentVariableCfg execMatchEquipmentVariableCfgValue(StationRequestBean reqBean, MesProductionProcessContext productionProcessContext, + MesEquipVariableCollectContext collectContext, Map> equipmentVariableCfgMap, Boolean isNeedVariableCfgValue) { + List equipmentVariableCfgList = getEquipmentVariableCfgListByMap(equipmentVariableCfgMap, collectContext.getCategoryLevelTwo(), collectContext.getVariableCfgType()); + if (isNeedVariableCfgValue && CollectionUtils.isEmpty(CollectionUtils.isEmpty(equipmentVariableCfgList) ? null : equipmentVariableCfgList.stream().filter(o -> (null != o && StringUtils.isEmpty(o.getValue()))).collect(Collectors.toList()))) { + productionProcessContext.message(String.format("请检查设备数据变量接口逻辑信息,设备变量配置类型[%s],二级变量[%s]对应的信息未配置参考值", collectContext.getVariableCfgType(), collectContext.getCategoryLevelTwo())); + return null; + } + Optional optional = equipmentVariableCfgList.stream().filter(o -> (null != o && o.getValue().equals(collectContext.getEquipVariableValue()))).findFirst(); + return null != optional && optional.isPresent() ? optional.get() : null; + } + + private List getEquipmentVariableCfgListByMap(Map> equipmentVariableCfgMap, String categoryLevelTwo, String variableCfgType) { + return CollectionUtils.isEmpty(equipmentVariableCfgMap) ? null : equipmentVariableCfgMap.get(new StringJoiner(MesPcnExtConstWords.AND).add(categoryLevelTwo).add(variableCfgType).toString()); + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkResultReadStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkResultReadStepService.java index 6109ba1..2fe1f88 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkResultReadStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/step/MesWorkResultReadStepService.java @@ -1,13 +1,27 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.step; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.IMesProductionProcessContextStepService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesCellEquipContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesEquipVariableCollectContext; +import cn.estsh.i3plus.ext.mes.pcn.pojo.context.MesProductionProcessContext; import cn.estsh.i3plus.mes.pcn.serviceimpl.fsm.BaseStepService; +import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; 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.Map; +import java.util.Optional; +import java.util.stream.Collectors; + /** * @Description : 读取加工结果工步 * @Author : wangjie @@ -16,34 +30,77 @@ import org.springframework.util.StringUtils; @Service("mesWorkResultReadStepService") public class MesWorkResultReadStepService extends BaseStepService { + @Autowired + private IMesProductionProcessContextStepService productionProcessContextStepService; + @Override - public StepResult init(StationRequestBean reqBean) { + public StepResult execute(StationRequestBean reqBean) { + StationResultBean resultBean = new StationResultBean(); + StepResult stepResult = StepResult.getSuccessComplete(); - StationResultBean resultBean = new StationResultBean(); + MesProductionProcessContext productionProcessContext = productionProcessContextStepService.getEquipmentVariable(reqBean, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), + MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.SV_OPERATION_MODE.getValue(), MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.PART_OK.getValue(), + MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.PART_NOK.getValue(), MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.PART_SCRAP.getValue(), MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.PART_SUSPICIOUS.getValue()); - if (StringUtils.isEmpty(reqBean.getScanInfo())) execSendGuideAndThrowEx(reqBean, resultBean, "请扫描产品条码!"); + if (!productionProcessContextStepService.getEquipmentVariableCfg(reqBean, productionProcessContext).getSuccess()) + return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, productionProcessContext.getMessage()); + if (!productionProcessContextStepService.checkNecessaryEquipmentVariable(reqBean, productionProcessContext, MesExtEnumUtil.EQUIP_VARIABLE_TYPE.PRODUCTION.getValue(), MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.PART_OK.getValue()).getSuccess()) + return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, productionProcessContext.getMessage()); - StepResult stepResult = StepResult.getSuccessComplete(); + if (!productionProcessContextStepService.checkNecessaryEquipmentVariableCfg(reqBean, productionProcessContext).getSuccess()) + return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, productionProcessContext.getMessage()); + if (!productionProcessContextStepService.doHandleEquipmentLogListByIds(reqBean, productionProcessContext).getSuccess()) + return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, productionProcessContext.getMessage()); - return stepResult; - } + MesCellEquipContext cellEquipContext = productionProcessContext.getCurCellEquip(); - @Override - public StepResult execute(StationRequestBean reqBean) { + Map> equipmentVariableCfgMap = productionProcessContextStepService.getEquipmentVariableCfgMap(reqBean, productionProcessContext); - StationResultBean resultBean = new StationResultBean(); + List equipVariableCollectContextList = productionProcessContext.getEquipVariableCfgCollectList(); - if (StringUtils.isEmpty(reqBean.getScanInfo())) execSendGuideAndThrowEx(reqBean, resultBean, "请扫描产品条码!"); + //验证加工模式 + Optional optional2Mode = isExistTypeVariableType(equipVariableCollectContextList, MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.SV_OPERATION_MODE.getValue()); + if (null != optional2Mode && optional2Mode.isPresent() && !checkVariableType2Mode(reqBean, resultBean, stepResult, productionProcessContext, cellEquipContext, equipmentVariableCfgMap, optional2Mode.get()).isCompleted()) + return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, stepResult.getMsg()); + equipVariableCollectContextList = equipVariableCollectContextList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getEquipVariableValue()) && !o.getCategoryLevelTwo().equals(MesExtEnumUtil.EQUIP_CATEGORY_LEVEL_TWO.SV_OPERATION_MODE.getValue()))).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(equipVariableCollectContextList)) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("正在持续监听设备[%s]的加工结果...", cellEquipContext.getEquipmentCode())); - StepResult stepResult = StepResult.getSuccessComplete(); + //验证加工结果 + MesEquipmentVariableCfg equipmentVariableCfg = null; + for (MesEquipVariableCollectContext collectContext : equipVariableCollectContextList) { + if (null == cellEquipContext) continue; + equipmentVariableCfg = productionProcessContextStepService.execMatchEquipmentVariableCfgValue(reqBean, productionProcessContext, collectContext, equipmentVariableCfgMap, true); + if (!productionProcessContext.getSuccess()) this.sendMessage(reqBean, resultBean, productionProcessContext.getMessage(), MesPcnEnumUtil.STATION_BUSI_TYPE.MESSAGE, MesPcnEnumUtil.STATION_DATA_TYPE.EXP_TEXT); + productionProcessContext.success(); + if (null != equipmentVariableCfg) break; + } + + if (null == equipmentVariableCfg) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, String.format("获取到设备[%s]数据变量的加工结果值与数据变量接口逻辑信息匹配失败!持续监听中...", cellEquipContext.getEquipmentCode())); + //TODO 根据二级变量+变量类别 判断结果 + //失败: return false + //成功: 成功 return true/ 零件报废 return custom + //可疑/报废: return custom + return StepResult.getSuccessComplete(); + } + + private StepResult checkVariableType2Mode(StationRequestBean reqBean, StationResultBean resultBean, StepResult stepResult, MesProductionProcessContext productionProcessContext, + MesCellEquipContext cellEquipContext, Map> equipmentVariableCfgMap, MesEquipVariableCollectContext collectContext) { + if (StringUtils.isEmpty(collectContext.getEquipVariableValue())) return stepResult.isCompleted(false).msg(String.format("未获取到设备[%s]加工模式数据变量[%s]的结果值,持续监听中...", cellEquipContext.getEquipmentCode(), collectContext.getTagName())); + MesEquipmentVariableCfg equipmentVariableCfg = productionProcessContextStepService.execMatchEquipmentVariableCfgValue(reqBean, productionProcessContext, collectContext, equipmentVariableCfgMap, true); + if (!productionProcessContext.getSuccess()) return stepResult.isCompleted(false).msg(productionProcessContext.getMessage()); + if (null == equipmentVariableCfg) return stepResult.isCompleted(false).msg(String.format("获取到设备[%s]加工模式数据变量[%s]的结果值[%s]与数据变量接口逻辑信息匹配失败!持续监听中...", cellEquipContext.getEquipmentCode(), collectContext.getTagName(), collectContext.getEquipVariableValue())); return stepResult; } + private Optional isExistTypeVariableType(List equipVariableCollectContextList, String categoryLevelTwo) { + return equipVariableCollectContextList.stream().filter(o -> (null != o && o.getCategoryLevelTwo().equals(categoryLevelTwo))).findFirst(); + } + } diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java new file mode 100644 index 0000000..79c62f5 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesCellEquipContext.java @@ -0,0 +1,45 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.context; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +/** + * 生产过程上下文对象-工位设备信息 + */ +@Data +public class MesCellEquipContext { + + @ApiParam("组织代码") + private String organizeCode; + + @ApiParam("腔数") + private Integer cavity; + + @ApiParam("每腔装配件个数") + private Integer bindQty; + + @ApiParam("顺序") + private Integer seq; + + @ApiParam("设备ID") + private Integer equipId; + + @ApiParam("设备代码") + private String equipmentCode; + + @ApiParam("设备名称") + private String equipmentName; + + @ApiParam("变量配置类型") + private String variableCfgType; + + @ApiParam("是否控制byPass") + private Integer ctrlByPass; + + @ApiParam("是否监控停机") + private Integer monitorDown; + + @ApiParam("是否监控停机") + private String monitorDownTime; + +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesEquipVariableCollectContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesEquipVariableCollectContext.java new file mode 100644 index 0000000..040b466 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesEquipVariableCollectContext.java @@ -0,0 +1,83 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.context; + +import io.swagger.annotations.ApiParam; +import lombok.Data; + +/** + * 生产过程上下文对象-设备数据变量平铺接口逻辑与采集信息 + */ +@Data +public class MesEquipVariableCollectContext { + + @ApiParam("组织代码") + private String organizeCode; + + @ApiParam("设备变量ID") + private Long equipVariableId; + + @ApiParam("设备ID") + private Integer equipId; + + @ApiParam("OPC注册ID") + private Integer clientHandle; + + @ApiParam("设备代码") + private String equipmentCode; + + @ApiParam("通道") + private String channel; + + @ApiParam("通道") + private String device; + + @ApiParam("tag名称") + private String tagName; + + @ApiParam("变量配置类型") + private String variableCfgType; + + @ApiParam("变量类型") + private Integer variableType; + + @ApiParam("二级变量") + private String categoryLevelTwo; + + @ApiParam("是否常变值") + private Integer needNewValue; + + @ApiParam("设备变量名称") + private String equipVariableName; + + @ApiParam("设备变量描述") + private String equipVariableDesc; + + @ApiParam("读写标记") + private Integer readWriteFlag; + + @ApiParam("数据类型") + private String dataType; + + @ApiParam("变量当前值") + private String equipVariableValue; + + @ApiParam("设备质量") + private Integer quality; + + public MesEquipVariableCollectContext(Long equipVariableId) { + this.equipVariableId = equipVariableId; + } + + public MesEquipVariableCollectContext needNewValue(Integer needNewValue) { + this.needNewValue = needNewValue; + return this; + } + + public void clear() { + this.equipVariableName = null; + this.equipVariableDesc = null; + this.readWriteFlag = null; + this.dataType = null; + this.equipVariableValue = null; + this.quality = null; + } +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java new file mode 100644 index 0000000..573c486 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/context/MesProductionProcessContext.java @@ -0,0 +1,210 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.context; + +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariable; +import cn.estsh.i3plus.pojo.mes.bean.MesEquipmentVariableCfg; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCell; +import cn.estsh.i3plus.pojo.mes.bean.MesWorkCenter; +import com.alibaba.fastjson.JSONObject; +import io.swagger.annotations.ApiParam; +import lombok.Data; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 生产过程上下文对象 + */ +@Data +public class MesProductionProcessContext { + + @ApiParam("结果") + private Boolean success; + + @ApiParam("信息") + private String message; + + @ApiParam("组织代码") + private String organizeCode; + + @ApiParam("生产线信息") + private String workCenterJson; + + @ApiParam("工位信息") + private String workCellJson; + + @ApiParam("工位设备集合信息") + private String cellEquipListJson; + + @ApiParam("工序代码") + private String processCode; + + @ApiParam("工序名称") + private String processName; + + @ApiParam("工艺代码") + private String craftCode; + + @ApiParam("工艺代码") + private String craftName; + + @ApiParam("当前工位设备信息") + private String curCellEquipJson; + + @ApiParam("设备变量信息") + private String equipVariableJson; + + @ApiParam("变量接口逻辑信息") + private String equipVariableCfgJson; + + @ApiParam("变量接口逻辑采集信息") + private String equipVariableCfgCollectJson; + + @ApiParam("头道模具号") + private String firstMouldNo; + + @ApiParam("模具号") + private String mouldNo; + + @ApiParam("一模多腔信息") + private String mouldCavityJson; + + @ApiParam("腔组明细信息") + private String cavityGroupDetailJson; + + @ApiParam("设备加工参数信息") + private String equipProdParamJson; + + @ApiParam("非排序加工规则信息") + private String unSortRuleJson; + + @ApiParam("装配件信息(非排序/排序线排产装配目视项)") + private String assemblyJson; + + @ApiParam("时效性信息") + private String timeEfficientJson; + + @ApiParam("零件条码信息") + private String produceSnJson; + + + + public MesProductionProcessContext() {} + + public MesProductionProcessContext(String organizeCode) { + this.organizeCode = organizeCode; + } + + public MesProductionProcessContext success() { + this.success = true; + this.message = null; + return this; + } + + public MesProductionProcessContext message(String message) { + this.success = false; + this.message = message; + return this; + } + + public MesWorkCenter getWorkCenter() { + return StringUtils.isEmpty(this.workCenterJson) ? null : JSONObject.parseObject(this.workCenterJson, MesWorkCenter.class); + } + + public MesProductionProcessContext workCenterJson(MesWorkCenter workCenter) { + this.workCenterJson = null != workCenter ? JSONObject.toJSONString(workCenter) : null; + return this; + } + + public MesWorkCell getWorkCell() { + return StringUtils.isEmpty(this.workCellJson) ? null : JSONObject.parseObject(this.workCellJson, MesWorkCell.class); + } + + public MesProductionProcessContext workCellJson(MesWorkCell workCell) { + this.workCellJson = null != workCell ? JSONObject.toJSONString(workCell) : null; + return this; + } + + private List getCellEquipList() { + return StringUtils.isEmpty(this.cellEquipListJson) ? null : JSONObject.parseArray(this.cellEquipListJson, MesCellEquipContext.class); + } + + public MesProductionProcessContext cellEquipListJson(List cellEquipList) { + this.cellEquipListJson = !CollectionUtils.isEmpty(cellEquipList) ? JSONObject.toJSONString(cellEquipList) : null; + return this; + } + + public MesCellEquipContext filterCurCellEquip() { + List cellEquipList = getCellEquipList(); + if (CollectionUtils.isEmpty(cellEquipList) || cellEquipList.size() == 1) return filterCurCellEquip(cellEquipList); + return filterCurCellEquip(cellEquipList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getSeq()))).sorted(Comparator.comparing(MesCellEquipContext::getSeq)).collect(Collectors.toList())); + } + + public MesCellEquipContext filterCurCellEquip(String equipmentCode) { + if (StringUtils.isEmpty(equipmentCode)) return filterCurCellEquip(); + List cellEquipList = getCellEquipList(); + return filterCurCellEquip(CollectionUtils.isEmpty(cellEquipList) ? null : cellEquipList.stream().filter(o -> (null != o && o.getEquipmentCode().equals(equipmentCode))).collect(Collectors.toList())); + } + + private MesCellEquipContext filterCurCellEquip(List cellEquipContextList) { + return CollectionUtils.isEmpty(cellEquipContextList) ? null : cellEquipContextList.get(0); + } + + public MesCellEquipContext getCurCellEquip() { + return StringUtils.isEmpty(this.curCellEquipJson) ? null : JSONObject.parseObject(this.curCellEquipJson, MesCellEquipContext.class); + } + + public MesProductionProcessContext curCellEquipJson(MesCellEquipContext curEquip) { + this.curCellEquipJson = null != curEquip ? JSONObject.toJSONString(curEquip) : null; + return this; + } + + public MesProductionProcessContext processCode(String processCode, String processName) { + this.processCode = processCode; + this.processName = processName; + return this; + } + + public MesProductionProcessContext craftCode(String craftCode, String craftName) { + this.craftCode = craftCode; + this.craftName = craftName; + return this; + } + + public List getEquipVariableList() { + return StringUtils.isEmpty(this.equipVariableJson) ? null : JSONObject.parseArray(this.equipVariableJson, MesEquipmentVariable.class); + } + + public MesProductionProcessContext equipVariableJson(List equipmentVariableList) { + if (CollectionUtils.isEmpty(equipmentVariableList)) return this; + if (!StringUtils.isEmpty(this.equipVariableJson)) equipmentVariableList.addAll(getEquipVariableList()); + this.equipVariableJson = JSONObject.toJSONString(equipmentVariableList); + return this; + } + + public List getEquipVariableCfgList() { + return StringUtils.isEmpty(this.equipVariableCfgJson) ? null : JSONObject.parseArray(this.equipVariableCfgJson, MesEquipmentVariableCfg.class); + } + + public MesProductionProcessContext equipVariableCfgJson(List equipmentVariableCfgList) { + if (CollectionUtils.isEmpty(equipmentVariableCfgList)) return this; + if (!StringUtils.isEmpty(this.equipVariableCfgJson)) equipmentVariableCfgList.addAll(getEquipVariableCfgList()); + this.equipVariableCfgJson = JSONObject.toJSONString(equipmentVariableCfgList); + return this; + } + + public List getEquipVariableCfgCollectList() { + if (StringUtils.isEmpty(this.equipVariableCfgCollectJson)) return null; + List equipVariableCollectContextList = JSONObject.parseArray(this.equipVariableCfgCollectJson, MesEquipVariableCollectContext.class); + return equipVariableCollectContextList; + } + + public MesProductionProcessContext equipVariableCfgCollectJson(List equipVariableCollectContextList) { + this.equipVariableCfgCollectJson = !CollectionUtils.isEmpty(equipVariableCollectContextList) ? JSONObject.toJSONString(equipVariableCollectContextList) : null; + return this; + } + + +} diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/TestModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/TestModel.java deleted file mode 100644 index e48bc1f..0000000 --- a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/TestModel.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.estsh.i3plus.ext.mes.pcn.pojo.model; - -public class TestModel { -} 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 d9839de..e9d984e 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 @@ -48,5 +48,33 @@ public class MesPcnExtConstWords { public static final String MODIFY_USER = "modifyUser"; // 修改人 public static final String USER_INFO = "userInfo"; + // 设备代码 + public static final String EQUIPMENT_CODE = "equipmentCode"; + // 设备ID + public static final String EQUIP_ID = "equipId"; + // 设备代码[工步参数] + public static final String EQUIPMENT_CODE_UC = "EQUIPMENT_CODE"; + // 变量类型 + public static final String VARIABLE_TYPE = "variableType"; + // 二级变量 + public static final String CATEGORY_LEVEL_TWO = "categoryLevelTwo"; + // 变量配置类型 + public static final String VARIABLE_CFG_TYPE = "variableCfgType"; + // 变量状态 + public static final String EQUIP_VARIABLE_STATUS = "equipVariableStatus"; + + + + + + + + + // 0 + public static final Integer ZERO = 0; + // 中括号 + public static final String SQUARE_BRACKETS = "[]"; + // & + public static final String AND = "&"; }