diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/ISxThirdPartyPlcCollectDataJobService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/ISxThirdPartyPlcCollectDataJobService.java index 03f9eb1..b32ba25 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/ISxThirdPartyPlcCollectDataJobService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/ISxThirdPartyPlcCollectDataJobService.java @@ -16,6 +16,6 @@ public interface ISxThirdPartyPlcCollectDataJobService { * @param paramMap 参数 */ @ApiOperation(value = "第三方PLC数据采集定时任务", notes = "第三方PLC数据采集定时任务") - void doThirdPartyPlcCollectData(Map paramMap); + void doThirdPartyPlcCollectData(Map paramMap); } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxPlcExtService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxPlcExtService.java index 933cadd..0ef37ca 100644 --- a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxPlcExtService.java +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxPlcExtService.java @@ -1,8 +1,11 @@ package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx; +import cn.estsh.i3plus.pojo.mes.bean.MesObjectCfg; import cn.estsh.i3plus.pojo.mes.bean.MesPlc; import io.swagger.annotations.ApiOperation; +import java.util.List; + /** * @Author: wangjie * @CreateDate: 2021/01/18 11:22 上午 @@ -20,6 +23,16 @@ public interface IJxPlcExtService { MesPlc getPlcDb(String organizeCode, String plcCode); /** + * 获取PLC信息 + * @param organizeCode 组织代码 + * @param workCenterCode 生产线代码 + * @param workCellCode 工位代码 + * @return PLC信息 + */ + @ApiOperation(value = "获取PLC信息", notes = "获取PLC信息") + List getPlcDbList(String organizeCode, String workCenterCode, String workCellCode); + + /** * 读取PLC数据 * @param plc PLC信息 * @return PLC数据 @@ -39,12 +52,40 @@ public interface IJxPlcExtService { /** * 获取PLC信息 * @param organizeCode 组织代码 - * @param plcCode PLC代码 * @param key key + * @param plcCode PLC代码 * @return PLC信息 */ @ApiOperation(value = "获取PLC信息", notes = "获取PLC信息") - MesPlc getPlcData(String organizeCode, String plcCode, String key); + MesPlc getPlcData(String organizeCode, String key, String plcCode); + + /** + * 获取信息 + * @param key key + * @param item item + * @return 信息 + */ + @ApiOperation(value = "获取信息", notes = "获取信息") + String getCachedData(String key, String item); + + /** + * 缓存信息 + * @param organizeCode 组织代码 + * @param key key + * @param item item + * @param data 数据 + */ + @ApiOperation(value = "缓存信息", notes = "缓存信息") + void doCacheData(String organizeCode, String key, String item, String data); + + /** + * 获取对象结构信息 + * @param organizeCode 工厂代码 + * @param plcCodeList PLC代码集合 + * @return 对象结构信息 + */ + @ApiOperation(value = "获取对象结构信息", notes = "获取对象结构信息") + List getObjectCfgDbList(String organizeCode, List plcCodeList); } diff --git a/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProductDataService.java b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProductDataService.java new file mode 100644 index 0000000..9a99d8c --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-api/src/main/java/cn/estsh/i3plus/ext/mes/pcn/api/busi/jx/IJxProductDataService.java @@ -0,0 +1,26 @@ +package cn.estsh.i3plus.ext.mes.pcn.api.busi.jx; + +import cn.estsh.i3plus.pojo.mes.bean.MesProductData; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; +import io.swagger.annotations.ApiOperation; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:22 上午 + * @Description: + **/ +public interface IJxProductDataService { + + /** + * 插入生产数据信息(新事务,不回滚) + * @param productDataList 生产数据 + */ + @ApiOperation(value = "插入生产数据信息(新事务,不回滚)", notes = "插入生产数据信息(新事务,不回滚)") + @Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {ImppBusiException.class, Exception.class}) + void insertProductDataNoRollback(List productDataList); + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/SxThirdPartyPlcCollectDataJob.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/SxThirdPartyPlcCollectDataJob.java index 2387fb4..bdcb606 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/SxThirdPartyPlcCollectDataJob.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/schedulejob/SxThirdPartyPlcCollectDataJob.java @@ -32,14 +32,14 @@ public class SxThirdPartyPlcCollectDataJob implements Job { log.info("第三方PLC数据采集 --- JOB --- PARAM:{}", param.toString()); - Map paramMap = JSONObject.parseObject(param.toString(), Map.class); + Map paramMap = JSONObject.parseObject(param.toString(), Map.class); if (!paramMap.containsKey(MesPcnExtConstWords.ORGANIZE_CODE) || !paramMap.containsKey(MesPcnExtConstWords.STRATEGY_CLASS)) return; log.info("工厂{}第三方PLC数据采集 --- JOB START --- PARAM:{}", paramMap.get(MesPcnExtConstWords.ORGANIZE_CODE), param.toString()); long startTime = System.currentTimeMillis(); - ((ISxThirdPartyPlcCollectDataJobService) SpringContextsUtil.getBean(paramMap.get(MesPcnExtConstWords.STRATEGY_CLASS))).doThirdPartyPlcCollectData(paramMap); + ((ISxThirdPartyPlcCollectDataJobService) SpringContextsUtil.getBean(MesPcnExtConstWords.SX_TPPC_SUFFIX + paramMap.get(MesPcnExtConstWords.STRATEGY_CLASS) + MesPcnExtConstWords.SERVICE_SUFFIX)).doThirdPartyPlcCollectData(paramMap); long endTime = System.currentTimeMillis(); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectMonitorCellTaktHandler.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktHandler.java similarity index 66% rename from modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectMonitorCellTaktHandler.java rename to modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktHandler.java index ec93fc8..b6b33fd 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectMonitorCellTaktHandler.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktHandler.java @@ -2,6 +2,7 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import com.alibaba.fastjson.JSONObject; import org.springframework.util.StringUtils; import java.util.Map; @@ -10,34 +11,34 @@ import java.util.StringJoiner; /** * 第三方PLC数据采集-监控处理器-工位节拍 */ -public class SxThirdPartyPlcCollectMonitorCellTaktHandler extends SxThirdPartyPlcCollectMonitorHandler { +public class SxThirdPartyPlcCollectCellTaktHandler extends SxThirdPartyPlcCollectMonitorHandler { private volatile String plcCode2Flag; private volatile String plcCode2Data; - public SxThirdPartyPlcCollectMonitorCellTaktHandler(String org, String key) { - super(org, key); - initStepResult(); - } + private volatile String limit; - private void initStepResult() { - ((Map) stepResult.getData()).put(MesPcnExtConstWords.BUSI_CODE, MesPcnExtConstWords.CELL_TAKT); - ((Map) stepResult.getData()).put(MesPcnExtConstWords.WORK_CENTER_CODE, key.split(MesPcnExtConstWords.COLON)[2]); - ((Map) stepResult.getData()).put(MesPcnExtConstWords.WORK_CELL_CODE, key.split(MesPcnExtConstWords.COLON)[3]); + public SxThirdPartyPlcCollectCellTaktHandler(String org, String key) { + super(org, key); + super.doSubmit(); } @Override - public SxThirdPartyPlcCollectMonitorCellTaktHandler doRetry(Object obj) { + public SxThirdPartyPlcCollectCellTaktHandler doRetry(Object obj) { super.doRetry(obj); if (isRetry) return this; - String[] plcCodeArr = obj.toString().split(MesPcnExtConstWords.COMMA); + Map paramMap = JSONObject.parseObject(obj.toString(), Map.class); + String[] plcCodeArr = paramMap.get(MesPcnExtConstWords.PLC_CODE_UC).split(MesPcnExtConstWords.COMMA); + String limit = paramMap.get(MesPcnExtConstWords.LIMIT); if (StringUtils.isEmpty(plcCode2Flag) || !plcCode2Flag.equals(plcCodeArr[0])) plcCode2Flag = null; if (StringUtils.isEmpty(plcCode2Data) || !plcCode2Data.equals(plcCodeArr[1])) plcCode2Data = null; - if (!StringUtils.isEmpty(plcCode2Flag) && !StringUtils.isEmpty(plcCode2Data)) return this; + if (null == this.limit || !this.limit.equals(limit)) this.limit = null; + if (!StringUtils.isEmpty(plcCode2Flag) && !StringUtils.isEmpty(plcCode2Data) && null != this.limit) return this; isRetry = true; - this.plcCode2Flag = plcCodeArr[0]; - this.plcCode2Data = plcCodeArr[1]; + plcCode2Flag = plcCodeArr[0]; + plcCode2Data = plcCodeArr[1]; + this.limit = limit; return this; } @@ -46,7 +47,7 @@ public class SxThirdPartyPlcCollectMonitorCellTaktHandler extends SxThirdPartyPl while (isOpen) { - if (StringUtils.isEmpty(plcCode2Flag) || StringUtils.isEmpty(plcCode2Data)) continue; + if (StringUtils.isEmpty(plcCode2Flag) || StringUtils.isEmpty(plcCode2Data) || null == limit) continue; if (isRetry || null == filterChain) instanceFilterChain(); @@ -61,7 +62,7 @@ public class SxThirdPartyPlcCollectMonitorCellTaktHandler extends SxThirdPartyPl .add(new SxThirdPartyPlcCollectReadPlcStepService(plcCode2Flag).targetValue(new StringJoiner(MesPcnExtConstWords.COMMA).add(CommonEnumUtil.TRUE_OR_FALSE.TRUE.name().toLowerCase()).add(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()).toString())) .add(new SxThirdPartyPlcCollectReadPlcStepService(plcCode2Data)) .add(new SxThirdPartyPlcCollectWritePlcStepService(plcCode2Flag).targetValue(MesPcnExtConstWords.ZERO_STR)) - .add(new SxThirdPartyPlcCollectCellTaktStepService().targetField(plcCode2Data)); + .add(new SxThirdPartyPlcCollectCellTaktStepService().targetField(plcCode2Data).limit(limit)); isRetry = false; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktService.java index 3362d39..9ca85a1 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktService.java @@ -18,22 +18,24 @@ import java.util.stream.Collectors; * 第三方PLC数据采集定时任务-采集工位节拍实现 */ @Slf4j -@Service +@Service(value = "SxThirdPartyPlcCollectCellTaktService") public class SxThirdPartyPlcCollectCellTaktService implements ISxThirdPartyPlcCollectDataJobService { @Autowired private SxWorkCellTaktCollectPlcCfgRepository workCellTaktCollectPlcCfgRepository; @Override - public void doThirdPartyPlcCollectData(Map paramMap) { + public void doThirdPartyPlcCollectData(Map paramMap) { - String organizeCode = paramMap.get(MesPcnExtConstWords.ORGANIZE_CODE); + String organizeCode = (String) paramMap.get(MesPcnExtConstWords.ORGANIZE_CODE); log.info("工厂{}第三方PLC数据采集 --- STRATEGY {} EXEC SERVICE START --- PARAM:{}", organizeCode, MesPcnExtConstWords.CELL_TAKT, paramMap.toString()); - if (checkOrgIsStopMonitor(organizeCode, paramMap.get(MesPcnExtConstWords.STATUS))) return; + if (checkOrgIsStopMonitor(organizeCode, (String) paramMap.get(MesPcnExtConstWords.STATUS))) return; - Map cfgMap = getWorkCellTaktCollectPlcCfgList(organizeCode); + String limitCfg = paramMap.containsKey(MesPcnExtConstWords.LIMIT) ? (String) paramMap.get(MesPcnExtConstWords.LIMIT) : MesPcnExtConstWords.EMPTY; + + Map cfgMap = getWorkCellTaktCollectPlcCfgList(organizeCode, limitCfg); log.info("工厂{}第三方PLC数据采集 --- STRATEGY {} EXEC SERVICE --- CFGMAP:{}", organizeCode, MesPcnExtConstWords.CELL_TAKT, cfgMap.toString()); @@ -52,7 +54,8 @@ public class SxThirdPartyPlcCollectCellTaktService implements ISxThirdPartyPlcCo return true; } - private Map getWorkCellTaktCollectPlcCfgList(String organizeCode) { + private Map getWorkCellTaktCollectPlcCfgList(String organizeCode, String limitCfg) { + String value = "{\"PLC_CODE\":\"%s\", \"LIMIT\":\"%s\"}"; List workCellTaktCollectPlcCfgList = workCellTaktCollectPlcCfgRepository.findByProperty( new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.STATUS}, new Object[]{organizeCode, CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue()}); @@ -64,7 +67,7 @@ public class SxThirdPartyPlcCollectCellTaktService implements ISxThirdPartyPlcCo Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(SxWorkCellTaktCollectPlcCfg::getPlcCode))), ArrayList::new)); return CollectionUtils.isEmpty(workCellTaktCollectPlcCfgList) ? new HashMap<>() : workCellTaktCollectPlcCfgList.stream().filter(o -> null != o).collect(Collectors.toMap(o -> - new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.CELL_TAKT).add(organizeCode).add(o.getWorkCenterCode()).add(o.getWorkCellCode()).toString(), SxWorkCellTaktCollectPlcCfg::getPlcCode)); + new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.CELL_TAKT).add(organizeCode).add(o.getWorkCenterCode()).add(o.getWorkCellCode()).toString(), o -> String.format(value, o.getPlcCode(), limitCfg))); } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktStepService.java index dc85d8c..aab09c3 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectCellTaktStepService.java @@ -6,9 +6,11 @@ import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.SxWorkCellTaktCollectRecord; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.tool.MathOperation; import cn.estsh.i3plus.pojo.mes.model.StepResult; import cn.estsh.impp.framework.boot.util.SpringContextsUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; import java.util.Map; @@ -22,6 +24,8 @@ public class SxThirdPartyPlcCollectCellTaktStepService implements ISxThirdPartyP protected String targetField; + protected String limit; + public SxThirdPartyPlcCollectCellTaktStepService() { this.workCellTaktCollectRecordService = (IJxWorkCellTaktCollectRecordService) SpringContextsUtil.getBean("jxWorkCellTaktCollectRecordService"); } @@ -31,18 +35,25 @@ public class SxThirdPartyPlcCollectCellTaktStepService implements ISxThirdPartyP return this; } + public SxThirdPartyPlcCollectCellTaktStepService limit(String limit) { + this.limit = limit; + return this; + } + @Override public StepResult exec(StepResult stepResult) { String organizeCode = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.ORGANIZE_CODE); String workCenterCode = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.WORK_CENTER_CODE); String workCellCode = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.WORK_CELL_CODE); - Object targetValue = ((Map) stepResult.getData()).get(targetField); + String targetValue = (String) ((Map) stepResult.getData()).get(targetField); + + if (!StringUtils.isEmpty(limit) && filter2Limit(targetValue)) return stepResult.isCompleted(false).msg(String.format("读取plcCode:%s 值:%s 不匹配LIMIT区间[%s]!", targetField, targetValue, limit)); SxWorkCellTaktCollectRecord workCellTaktCollectRecord = new SxWorkCellTaktCollectRecord(); workCellTaktCollectRecord.setWorkCenterCode(workCenterCode); workCellTaktCollectRecord.setWorkCellCode(workCellCode); - workCellTaktCollectRecord.setWorkTakt(targetValue.toString()); + workCellTaktCollectRecord.setWorkTakt(targetValue); workCellTaktCollectRecord.setOrganizeCode(organizeCode); workCellTaktCollectRecord.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); ConvertBean.serviceModelInitialize(workCellTaktCollectRecord, MesPcnExtConstWords.JOB); @@ -51,4 +62,17 @@ public class SxThirdPartyPlcCollectCellTaktStepService implements ISxThirdPartyP return stepResult; } + private Boolean filter2Limit(String targetValue) { + if (!limit.contains(MesPcnExtConstWords.COMMA)) return false; + String[] limitArr = limit.split(MesPcnExtConstWords.COMMA); + if (limitArr.length != 2) return false; + try { + if (!StringUtils.isEmpty(limitArr[0]) && MathOperation.compareTo(Double.parseDouble(targetValue), Double.parseDouble(limitArr[0])) < 0) return true; + if (!StringUtils.isEmpty(limitArr[1]) && MathOperation.compareTo(Double.parseDouble(targetValue), Double.parseDouble(limitArr[1])) > 0) return true; + } catch (NumberFormatException e) { + return true; + } + return false; + } + } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectDispatchSingleton.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectDispatchSingleton.java index a696b2b..ff3da07 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectDispatchSingleton.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectDispatchSingleton.java @@ -80,7 +80,7 @@ public class SxThirdPartyPlcCollectDispatchSingleton { try { Class clazz = Class.forName(new StringJoiner(MesPcnExtConstWords.DECIMAL_POINT_UNESCAPE) - .add(SxThirdPartyPlcCollectDispatchSingleton.class.getPackage().getName()).add(MesPcnExtConstWords.SX_TPPCM_SUFFIX + busiCode + MesPcnExtConstWords.HANDLER_SUFFIX).toString()); + .add(SxThirdPartyPlcCollectDispatchSingleton.class.getPackage().getName()).add(MesPcnExtConstWords.SX_TPPC_SUFFIX + busiCode + MesPcnExtConstWords.HANDLER_SUFFIX).toString()); Constructor constructor = clazz.getConstructor(String.class, String.class); diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectMonitorHandler.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectMonitorHandler.java index a4be34c..ece9cab 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectMonitorHandler.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectMonitorHandler.java @@ -16,7 +16,7 @@ import java.util.concurrent.ExecutorService; */ public class SxThirdPartyPlcCollectMonitorHandler { - public volatile Boolean isOpen = true; + public volatile Boolean isOpen = false; public volatile Boolean isRetry = false; @@ -35,25 +35,30 @@ public class SxThirdPartyPlcCollectMonitorHandler { public SxThirdPartyPlcCollectStepFilterChain filterChain; public SxThirdPartyPlcCollectMonitorHandler(String org, String key) { - this.org = org; this.key = key; - - Map dataMap = new HashMap<>(); - dataMap.put(MesPcnExtConstWords.ORGANIZE_CODE, org); - dataMap.put(MesPcnExtConstWords.KEY, key); - stepResult = StepResult.getSuccessComplete().data(dataMap); - + initStepResult(); executorService = SpringContextsUtil.getBean(ExecutorService.class); + } + + public void doSubmit() { + isOpen = true; ListeningExecutorService listenExecutor = MoreExecutors.listeningDecorator(executorService); listenFuture = listenExecutor.submit(() -> { execMonitor(); return null; }); - } - public void execMonitor() {} + public void initStepResult() { + Map dataMap = new HashMap<>(); + dataMap.put(MesPcnExtConstWords.ORGANIZE_CODE, org); + dataMap.put(MesPcnExtConstWords.KEY, key); + dataMap.put(MesPcnExtConstWords.BUSI_CODE, key.split(MesPcnExtConstWords.COLON)[0]); + dataMap.put(MesPcnExtConstWords.WORK_CENTER_CODE, key.split(MesPcnExtConstWords.COLON)[2]); + dataMap.put(MesPcnExtConstWords.WORK_CELL_CODE, key.split(MesPcnExtConstWords.COLON)[3]); + stepResult = StepResult.getSuccessComplete().data(dataMap); + } public SxThirdPartyPlcCollectMonitorHandler doRetry(Object obj) { if (version == 0) version ++; @@ -61,9 +66,11 @@ public class SxThirdPartyPlcCollectMonitorHandler { return this; } + public void execMonitor() {} + public void cancel() { isOpen = false; - if (null != listenFuture) listenFuture.cancel(true); + if (null != listenFuture && !listenFuture.isCancelled()) listenFuture.cancel(true); } public Boolean version() { return version == 1 ? true : false; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectMonitorProductDataHandler.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectMonitorProductDataHandler.java deleted file mode 100644 index 6431fc3..0000000 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectMonitorProductDataHandler.java +++ /dev/null @@ -1,32 +0,0 @@ -package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect; - -/** - * 第三方PLC数据采集-监控处理器-生产数据 - */ -public class SxThirdPartyPlcCollectMonitorProductDataHandler extends SxThirdPartyPlcCollectMonitorHandler { - - private volatile String plcCode2Flag; - - private volatile String plcCode2Data; - - public SxThirdPartyPlcCollectMonitorProductDataHandler(String org, String key) { - super(org, key); - initStepResult(); - } - - private void initStepResult() { - } - - @Override - public SxThirdPartyPlcCollectMonitorProductDataHandler doRetry(Object obj) { - return doRetry(obj); - } - - @Override - public void execMonitor() { - - } - - - -} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectProductDataHandler.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectProductDataHandler.java new file mode 100644 index 0000000..c57d9bb --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectProductDataHandler.java @@ -0,0 +1,162 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect; + +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.SxThirdPartyPlcCollectDataModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.mes.pcn.api.iservice.busi.IShippingDispatchService; +import cn.estsh.i3plus.platform.common.util.MesPcnConstWords; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; + +/** + * 第三方PLC数据采集-监控处理器-生产数据 + */ +public class SxThirdPartyPlcCollectProductDataHandler extends SxThirdPartyPlcCollectMonitorHandler { + + private Long startTime; + + private Long endTime; + + private StationRequestBean reqBean; + + private volatile SxThirdPartyPlcCollectDataModel plcCollectData; + + private IShippingDispatchService shippingDispatchService; + + public SxThirdPartyPlcCollectProductDataHandler(String org, String key) { + super(org, key); + shippingDispatchService = (IShippingDispatchService) SpringContextsUtil.getBean("shippingDispatchService"); + } + + @Override + public SxThirdPartyPlcCollectProductDataHandler doRetry(Object obj) { + + super.doRetry(obj); + + if (isOpen) super.cancel(); + + SxThirdPartyPlcCollectDataModel plcCollectData = (SxThirdPartyPlcCollectDataModel) obj; + + if (null == this.plcCollectData) this.plcCollectData = plcCollectData; + else if (compareToRetry(plcCollectData)) isRetry = true; + + if (isRetry || null == filterChain) instanceFilterChain(); + + restoreStepResultData(); + + super.doSubmit(); + + return this; + } + + @Override + public void execMonitor() { + + startTime = System.currentTimeMillis(); + + while (isOpen) { + + endTime = System.currentTimeMillis(); + + if (checkTimeOut()) return; + + if (null == filterChain) continue; + + stepResult = filterChain.exec(stepResult); + + if (!stepResult.isCompleted()) continue; + + doSendScanQueueNextExec(); + + return; + + } + + } + + private Boolean compareToRetry(SxThirdPartyPlcCollectDataModel plcCollectData) { + if (this.plcCollectData.getPlcCode2PlcFlag().equals(plcCollectData.getPlcCode2PlcFlag()) + && this.plcCollectData.getPlcCode2PcnFlag().equals(plcCollectData.getPlcCode2PcnFlag()) + && this.plcCollectData.getPlcCode2DataList().containsAll(plcCollectData.getPlcCode2DataList()) + && plcCollectData.getPlcCode2DataList().containsAll(this.plcCollectData.getPlcCode2DataList())) return false; + this.plcCollectData = plcCollectData; + return true; + } + + private void instanceFilterChain() { + filterChain = new SxThirdPartyPlcCollectStepFilterChain(org, key, MesPcnExtConstWords.PRODUCT_DATA) + .clearField(getClearField()).sleepTime2UnComplete(500L) + .add(new SxThirdPartyPlcCollectReadPlcStepService(plcCollectData.getPlcCode2PlcFlag()).targetValue( + new StringJoiner(MesPcnExtConstWords.COMMA).add(CommonEnumUtil.TRUE_OR_FALSE.TRUE.name().toLowerCase()).add(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr()).toString())) + .add(new SxThirdPartyPlcCollectReadPlcStepService(plcCollectData.getPlcCode2PcnFlag()).targetValue( + new StringJoiner(MesPcnExtConstWords.COMMA).add(CommonEnumUtil.TRUE_OR_FALSE.FALSE.name().toLowerCase()).add(MesPcnExtConstWords.ZERO_STR).toString())); + plcCollectData.getPlcCode2DataList().forEach(o -> filterChain.add(new SxThirdPartyPlcCollectReadPlcStepService(o))); + filterChain.add(new SxThirdPartyPlcCollectWritePlcStepService(plcCollectData.getPlcCode2PcnFlag()).targetValue(CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValueStr())) + .add(new SxThirdPartyPlcCollectProductDataStepService().targetField(plcCollectData.getPlcCode2DataList())); + isRetry = false; + } + + private void restoreStepResultData() { + ((Map) stepResult.getData()).remove(MesPcnExtConstWords.USER_INFO); + ((Map) stepResult.getData()).remove(MesPcnExtConstWords.SERIAL_NUMBER); + ((Map) stepResult.getData()).remove(MesPcnExtConstWords.PRODUCT_SN); + ((Map) stepResult.getData()).remove(MesPcnExtConstWords.MANAGE_CODE); + ((Map) stepResult.getData()).remove(MesPcnExtConstWords.WORK_ORDER_NO); + ((Map) stepResult.getData()).remove(MesPcnExtConstWords.PART_NO); + ((Map) stepResult.getData()).remove(MesPcnExtConstWords.PART_NAME_RDD); + ((Map) stepResult.getData()).put(MesPcnExtConstWords.USER_INFO, plcCollectData.getUserInfo()); + ((Map) stepResult.getData()).put(MesPcnExtConstWords.SERIAL_NUMBER, plcCollectData.getSerialNumber()); + ((Map) stepResult.getData()).put(MesPcnExtConstWords.PRODUCT_SN, plcCollectData.getProductSn()); + ((Map) stepResult.getData()).put(MesPcnExtConstWords.MANAGE_CODE, plcCollectData.getManageCode()); + ((Map) stepResult.getData()).put(MesPcnExtConstWords.WORK_ORDER_NO, plcCollectData.getWorkOrderNo()); + ((Map) stepResult.getData()).put(MesPcnExtConstWords.PART_NO, plcCollectData.getPartNo()); + ((Map) stepResult.getData()).put(MesPcnExtConstWords.PART_NAME_RDD, plcCollectData.getPartNameRdd()); + } + + private String[] getClearField() { + List clearFieldList = new ArrayList<>(plcCollectData.getPlcCode2DataList()); + clearFieldList.add(0, plcCollectData.getPlcCode2PlcFlag()); + clearFieldList.add(0, plcCollectData.getPlcCode2PcnFlag()); + return clearFieldList.toArray(new String[clearFieldList.size()]); + } + + private Boolean checkTimeOut() { + + if (endTime - startTime < this.plcCollectData.getTimeOut()) return false; + + stepResult.msg(String.format("%s当前采集已超时!", StringUtils.isEmpty(stepResult.getMsg()) ? MesPcnExtConstWords.EMPTY : stepResult.getMsg())); + + doSendScanQueueNextExec(); + + return true; + + } + + private void doSendScanQueueNextExec() { + initStationRequestBean(); + reqBean.getDataMap().put(MesPcnExtConstWords.RESULT, stepResult.isCompleted()); + if (!StringUtils.isEmpty(stepResult.getMsg())) reqBean.getDataMap().put(MesPcnExtConstWords.INFO, stepResult.getMsg()); + shippingDispatchService.doSendScanQueueNextExec(reqBean); + } + + private void initStationRequestBean() { + if (null == reqBean) { + reqBean = new StationRequestBean(plcCollectData.getOrganizeCode(), plcCollectData.getWorkCenterCode(), plcCollectData.getWorkCellCode()); + reqBean.setClientInfo(shippingDispatchService.getActorClientInfo(reqBean)); + reqBean.setTriggerAutoFsm(true); + reqBean.setInterfaceType(MesPcnConstWords.SHIPPING); + reqBean.setBusiType(MesPcnConstWords.WS_CMD_DO_SCAN); + } else { + reqBean.getDataMap().remove(MesPcnExtConstWords.RESULT); + reqBean.getDataMap().remove(MesPcnExtConstWords.INFO); + } + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectProductDataService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectProductDataService.java new file mode 100644 index 0000000..244ad42 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectProductDataService.java @@ -0,0 +1,34 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxThirdPartyPlcCollectDataJobService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Map; + +/** + * 第三方PLC数据采集-采集生产数据实现 + */ +@Slf4j +@Service(value = "SxThirdPartyPlcCollectProductDataService") +public class SxThirdPartyPlcCollectProductDataService implements ISxThirdPartyPlcCollectDataJobService { + + @Override + public void doThirdPartyPlcCollectData(Map paramMap) { + + String[] keyArr = new ArrayList<>(paramMap.keySet()).get(0).split(MesPcnExtConstWords.COLON); + + log.info("工厂{}第三方PLC数据采集 --- STRATEGY {} EXEC SERVICE START --- PARAM:{}", keyArr[1], keyArr[0], JSONObject.toJSONString(paramMap)); + + if (!SxThirdPartyPlcCollectDispatchSingleton.getIsInit()) SxThirdPartyPlcCollectDispatchSingleton.getInstance(); + + SxThirdPartyPlcCollectDispatchSingleton.execMonitor(keyArr[1], keyArr[0], paramMap, false); + + log.info("工厂{}第三方PLC数据采集 --- STRATEGY {} EXEC SERVICE END ---", keyArr[1], keyArr[0]); + + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectProductDataStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectProductDataStepService.java new file mode 100644 index 0000000..f5d18b4 --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectProductDataStepService.java @@ -0,0 +1,108 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.collect; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxThirdPartyPlcCollectDataStepService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxPlcExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProductDataService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtConstWords; +import cn.estsh.i3plus.ext.mes.pcn.pojo.util.MesPcnExtEnumUtil; +import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.pojo.mes.bean.MesObjectCfg; +import cn.estsh.i3plus.pojo.mes.bean.MesProductData; +import cn.estsh.i3plus.pojo.mes.model.ProductDataModel; +import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 第三方PLC数据采集定时任务---步骤执行---写节拍 + */ +@Slf4j +public class SxThirdPartyPlcCollectProductDataStepService implements ISxThirdPartyPlcCollectDataStepService { + + private IJxPlcExtService plcExtService; + + private IJxProductDataService productDataService; + + protected List targetFieldList; + + public SxThirdPartyPlcCollectProductDataStepService() { + this.plcExtService = (IJxPlcExtService) SpringContextsUtil.getBean("jxPlcExtService"); + this.productDataService = (IJxProductDataService) SpringContextsUtil.getBean("jxProductDataService"); + } + + public SxThirdPartyPlcCollectProductDataStepService targetField(List targetFieldList) { + this.targetFieldList = targetFieldList; + return this; + } + + @Override + public StepResult exec(StepResult stepResult) { + + String organizeCode = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.ORGANIZE_CODE); + String userInfo = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.USER_INFO); + String workCenterCode = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.WORK_CENTER_CODE); + String workCellCode = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.WORK_CELL_CODE); + String serialNumber = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.SERIAL_NUMBER); + String productSn = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.PRODUCT_SN); + String manageCode = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.MANAGE_CODE); + String workOrderNo = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.WORK_ORDER_NO); + String partNo = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.PART_NO); + String partNameRdd = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.PART_NAME_RDD); + String key = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.KEY); + + String objectCfgStr = plcExtService.getCachedData(key, MesPcnExtConstWords.OBJECT_CODE_UC); + if (StringUtils.isEmpty(objectCfgStr)) return stepResult.isCompleted(false).msg(String.format("生产线[%s]工位[%s]缓存信息缺失对象结构信息!", workCenterCode, workCellCode)); + List objectCfgList = JSONObject.parseArray(objectCfgStr, MesObjectCfg.class); + if (CollectionUtils.isEmpty(objectCfgList)) return stepResult.isCompleted(false).msg(String.format("生产线[%s]工位[%s]缓存信息缺失有效的对象结构信息!", workCenterCode, workCellCode)); + + Map> objectCodeMap = objectCfgList.stream().filter(o -> null != o).collect(Collectors.groupingBy(MesObjectCfg::getObjectCode)); + + List productDataList = new ArrayList<>(); + for (String objectCode : objectCodeMap.keySet()) { + if (StringUtils.isEmpty(objectCode)) continue; + + MesProductData productData = new MesProductData(); + productData.setOrganizeCode(organizeCode); + productData.setWorkCenterCode(workCenterCode); + productData.setWorkCellCode(workCellCode); + productData.setSerialNumber(serialNumber); + productData.setProductSn(productSn); + productData.setGroupNo(manageCode); + productData.setPartNo(partNo); + productData.setPartDesc(partNameRdd); + productData.setOrderNo(workOrderNo); + productData.setObjectCode(objectCode); + productData.setLineData(JSON.toJSONString(getLineDataList(stepResult, objectCodeMap.get(objectCode)))); + productData.setSystemSyncStatus(MesPcnExtEnumUtil.IF_SYNC_STATUS.NO_SYNC.getValue()); + ConvertBean.serviceModelInitialize(productData, userInfo); + productDataList.add(productData); + } + + productDataService.insertProductDataNoRollback(productDataList); + + return stepResult; + } + + private List getLineDataList(StepResult stepResult, List objectCfgList) { + List lineDataList = new ArrayList<>(); + for (MesObjectCfg objectCfg : objectCfgList) { + if (null == objectCfg) continue; + ProductDataModel productDataModel = new ProductDataModel(); + productDataModel.setFieldCode(objectCfg.getFieldCode()); + productDataModel.setFieldName(objectCfg.getFieldName()); + productDataModel.setFieldValue((String) ((Map) stepResult.getData()).get(objectCfg.getPlcCode())); + lineDataList.add(productDataModel); + } + return lineDataList; + } + +} diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectReadPlcStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectReadPlcStepService.java index 86320af..c91e6d6 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectReadPlcStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectReadPlcStepService.java @@ -41,15 +41,15 @@ public class SxThirdPartyPlcCollectReadPlcStepService implements ISxThirdPartyPl String key = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.KEY); - MesPlc plc = plcExtService.getPlcData(organizeCode, plcCode, key); + MesPlc plc = plcExtService.getPlcData(organizeCode, key, plcCode); - if (null == plc || (StringUtils.isEmpty(plc.getChannel()) || StringUtils.isEmpty(plc.getDevice()) || StringUtils.isEmpty(plc.getTagAddress()))) return stepResult.isCompleted(false).msg(String.format("读取plcCode:%s 配置无效", plcCode)); + if (null == plc || (StringUtils.isEmpty(plc.getChannel()) || StringUtils.isEmpty(plc.getDevice()) || StringUtils.isEmpty(plc.getTagAddress()))) return stepResult.isCompleted(false).msg(String.format("读取plcCode:%s 配置无效!", plcCode)); Object value = plcExtService.doReadOpcParamValue(plc); ((Map) stepResult.getData()).put(plcCode, value); - if (StringUtils.isEmpty(value) || (!StringUtils.isEmpty(targetValue) && !Arrays.asList(targetValue.split(MesPcnExtConstWords.COMMA)).contains(value.toString()))) return stepResult.isCompleted(false).msg(String.format("读取plcCode:%s 值无效", plcCode)); + if (StringUtils.isEmpty(value) || (!StringUtils.isEmpty(targetValue) && !Arrays.asList(targetValue.split(MesPcnExtConstWords.COMMA)).contains(value.toString()))) return stepResult.isCompleted(false).msg(String.format("读取plcCode:%s 值无效!", plcCode)); return stepResult; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectStepFilterChain.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectStepFilterChain.java index 55aa020..b0a8864 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectStepFilterChain.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectStepFilterChain.java @@ -56,6 +56,8 @@ public class SxThirdPartyPlcCollectStepFilterChain implements ISxThirdPartyPlcCo @Override public StepResult exec(StepResult stepResult) { + rollBackStepResult(stepResult); + LOGGER.info(String.format("工厂%s第三方PLC数据采集 --- STRATEGY %s STEP EXEC --- key: %s START --- stepResult:%s ---", org, busiCode, key, JSONObject.toJSONString(stepResult))); try { @@ -74,17 +76,18 @@ public class SxThirdPartyPlcCollectStepFilterChain implements ISxThirdPartyPlcCo LOGGER.info(String.format("工厂%s第三方PLC数据采集 --- STRATEGY %s STEP EXEC --- key: %s END --- stepResult:%s ---", org, busiCode, key, JSONObject.toJSONString(stepResult))); - return rollBackStepResult(stepResult); + return stepResult; } private StepResult rollBackStepResult(StepResult stepResult) { + stepResult.isCompleted(true).msg(null); if (null == clearField) return stepResult; for (String field : clearField) { if (StringUtils.isEmpty(field)) continue; ((Map) stepResult.getData()).remove(field); } - return stepResult.isCompleted(true).msg(null); + return stepResult; } } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectWritePlcStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectWritePlcStepService.java index 87dfb9a..d02f73a 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectWritePlcStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/collect/SxThirdPartyPlcCollectWritePlcStepService.java @@ -36,21 +36,21 @@ public class SxThirdPartyPlcCollectWritePlcStepService implements ISxThirdPartyP @Override public StepResult exec(StepResult stepResult) { - if (StringUtils.isEmpty(targetValue)) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 参数缺失目标值", plcCode)); + if (StringUtils.isEmpty(targetValue)) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 参数缺失目标值!", plcCode)); String organizeCode = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.ORGANIZE_CODE); String key = (String) ((Map) stepResult.getData()).get(MesPcnExtConstWords.KEY); - MesPlc plc = plcExtService.getPlcData(organizeCode, plcCode, key); + MesPlc plc = plcExtService.getPlcData(organizeCode, key, plcCode); - if (null == plc || (StringUtils.isEmpty(plc.getChannel()) || StringUtils.isEmpty(plc.getDevice()) || StringUtils.isEmpty(plc.getTagAddress()))) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 配置无效", plcCode)); + if (null == plc || (StringUtils.isEmpty(plc.getChannel()) || StringUtils.isEmpty(plc.getDevice()) || StringUtils.isEmpty(plc.getTagAddress()))) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 配置无效!", plcCode)); Boolean value = plcExtService.doWriteOpcParamValue(plc, targetValue); ((Map) stepResult.getData()).put(plcCode, value); - if (StringUtils.isEmpty(value) || !value) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 失败", plcCode)); + if (StringUtils.isEmpty(value) || !value) return stepResult.isCompleted(false).msg(String.format("写入plcCode:%s 失败!", plcCode)); return stepResult; } diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxPlcExtService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxPlcExtService.java index be81250..2c33f82 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxPlcExtService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxPlcExtService.java @@ -8,15 +8,20 @@ import cn.estsh.i3plus.platform.plugin.opc.service.OpcUAService; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.MesPcnEnumUtil; import cn.estsh.i3plus.pojo.hardswitch.bean.OpcUAParam; +import cn.estsh.i3plus.pojo.mes.bean.MesObjectCfg; import cn.estsh.i3plus.pojo.mes.bean.MesPlc; +import cn.estsh.i3plus.pojo.mes.repository.MesObjectCfgRepository; import cn.estsh.i3plus.pojo.mes.repository.MesPlcRepository; 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.text.MessageFormat; +import java.util.List; +import java.util.stream.Collectors; /** * @Author: wangjie @@ -30,6 +35,9 @@ public class JxPlcExtService implements IJxPlcExtService { @Autowired private MesPlcRepository plcRepository; + @Autowired + private MesObjectCfgRepository objectCfgRepository; + @Override public MesPlc getPlcDb(String organizeCode, String plcCode) { if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(plcCode)) return null; @@ -39,6 +47,14 @@ public class JxPlcExtService implements IJxPlcExtService { } @Override + public List getPlcDbList(String organizeCode, String workCenterCode, String workCellCode) { + if (StringUtils.isEmpty(organizeCode) || StringUtils.isEmpty(workCenterCode) || StringUtils.isEmpty(workCellCode)) return null; + return plcRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.IS_DELETED, MesPcnExtConstWords.WORK_CENTER_CODE, MesPcnExtConstWords.WORK_CELL_CODE}, + new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue(), workCenterCode, workCellCode}); + } + + @Override public Object doReadOpcParamValue(MesPlc plc) { IOpcUAService opcService = new OpcUAService(); String tagAddress = MessageFormat.format("{0}.{1}.{2}", plc.getChannel(), plc.getDevice(), plc.getTagAddress()); @@ -66,12 +82,33 @@ public class JxPlcExtService implements IJxPlcExtService { } @Override - public MesPlc getPlcData(String organizeCode, String plcCode, String key) { - WorkCellDataCacheDispatch dispatch = new WorkCellDataCacheDispatch.builder().key(key).item(plcCode).build().get(); - if (!StringUtils.isEmpty(dispatch.getValue())) return JSONObject.parseObject(dispatch.getValue(), MesPlc.class); + public MesPlc getPlcData(String organizeCode, String key, String plcCode) { + String value = getCachedData(key, plcCode); + if (!StringUtils.isEmpty(value)) return JSONObject.parseObject(value, MesPlc.class); MesPlc plc = getPlcDb(organizeCode, plcCode); if (null == plc) plc = new MesPlc(); - new WorkCellDataCacheDispatch.builder().key(key).item(plcCode).value(JSONObject.toJSONString(plc)).timeSecond(MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue()).org(organizeCode).build().save(); + doCacheData(organizeCode, key, plcCode, JSONObject.toJSONString(plc)); return plc; } + + @Override + public String getCachedData(String key, String item) { + return new WorkCellDataCacheDispatch.builder().key(key).item(item).build().get().getValue(); + } + + @Override + public void doCacheData(String organizeCode, String key, String item, String data) { + new WorkCellDataCacheDispatch.builder().key(key).item(item).value(data).timeSecond(MesPcnEnumUtil.EXPIRE_TIME.NEVER.getValue()).org(organizeCode).build().save(); + } + + @Override + public List getObjectCfgDbList(String organizeCode, List plcCodeList) { + if (StringUtils.isEmpty(organizeCode)) return null; + List objectCfgDbList = objectCfgRepository.findByProperty( + new String[]{MesPcnExtConstWords.ORGANIZE_CODE, MesPcnExtConstWords.IS_VALID, MesPcnExtConstWords.IS_DELETED}, + new Object[]{organizeCode, CommonEnumUtil.IS_VAILD.VAILD.getValue(), CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()}); + objectCfgDbList = CollectionUtils.isEmpty(objectCfgDbList) ? null : + objectCfgDbList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getPlcCode()) && plcCodeList.contains(o.getPlcCode()))).collect(Collectors.toList()); + return objectCfgDbList; + } } \ No newline at end of file diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProductDataService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProductDataService.java new file mode 100644 index 0000000..16dd2de --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/jx/JxProductDataService.java @@ -0,0 +1,28 @@ +package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.jx; + +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxProductDataService; +import cn.estsh.i3plus.pojo.mes.bean.MesProductData; +import cn.estsh.i3plus.pojo.mes.repository.MesProductDataRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Author: wangjie + * @CreateDate: 2021/01/18 11:41 上午 + * @Description: + **/ +@Slf4j +@Service +public class JxProductDataService implements IJxProductDataService { + + @Autowired + private MesProductDataRepository productDataRepository; + + @Override + public void insertProductDataNoRollback(List productDataList) { + productDataList.forEach(o -> productDataRepository.insert(o)); + } +} \ No newline at end of file diff --git a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCollectProductDataStepService.java b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCollectProductDataStepService.java index 8176d2f..a385526 100644 --- a/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCollectProductDataStepService.java +++ b/modules/i3plus-ext-mes-pcn-apiservice/src/main/java/cn/estsh/i3plus/ext/mes/pcn/apiservice/serviceimpl/busi/step/jx/JxSnProcessingCollectProductDataStepService.java @@ -1,13 +1,35 @@ package cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.step.jx; +import cn.estsh.i3plus.ext.mes.pcn.api.base.ISxWorkOrderExtService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.ISxThirdPartyPlcCollectDataJobService; +import cn.estsh.i3plus.ext.mes.pcn.api.busi.jx.IJxPlcExtService; +import cn.estsh.i3plus.ext.mes.pcn.apiservice.serviceimpl.busi.station.jx.JxSnProcessingModuleService; +import cn.estsh.i3plus.ext.mes.pcn.pojo.bean.MesWorkOrderExt; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.SxThirdPartyPlcCollectDataModel; +import cn.estsh.i3plus.ext.mes.pcn.pojo.model.WorkOrderExtModel; +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.base.BaseStepService; +import cn.estsh.i3plus.pojo.mes.bean.MesObjectCfg; +import cn.estsh.i3plus.pojo.mes.bean.MesPlc; import cn.estsh.i3plus.pojo.mes.model.StationRequestBean; import cn.estsh.i3plus.pojo.mes.model.StationResultBean; import cn.estsh.i3plus.pojo.mes.model.StepResult; +import cn.estsh.impp.framework.boot.util.SpringContextsUtil; +import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; +import java.util.stream.Collectors; + /** * @Description : 嘉兴条码加工采集生产数据工步 * @Reference : @@ -19,21 +41,153 @@ import org.springframework.util.StringUtils; @Service("jxSnProcessingCollectProductDataStepService") public class JxSnProcessingCollectProductDataStepService extends BaseStepService { + @Autowired + private ISxWorkOrderExtService workOrderExtService; + + @Autowired + private JxSnProcessingModuleService snProcessingModuleService; + + @Autowired + private IJxPlcExtService plcExtService; + + @Autowired + private IFsmCommonService fsmCommonService; + @Override public StepResult execute(StationRequestBean reqBean) { log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnProcessingCollectProductDataStepService --- START --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); - StepResult stepResult = StepResult.getSuccessComplete(); - StationResultBean resultBean = new StationResultBean(); - if (StringUtils.isEmpty(reqBean.getSerialNumber()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, stepResult, "入参缺少过程条码或产品条码!"); + if (StringUtils.isEmpty(reqBean.getSerialNumber()) && StringUtils.isEmpty(reqBean.getProductSn())) return execNonCompleteAndSendMsgReturn(reqBean, resultBean, "入参缺少过程条码或产品条码!"); + + String suffixSn = StringUtils.isEmpty(reqBean.getProductSn()) ? getManageCode(reqBean.getTray(), 1) : reqBean.getProductSn(); + String suffix = String.format("当前产品:%s[%s]", StringUtils.isEmpty(reqBean.getProductSn()) ? "管理编码" : "产品条码", suffixSn); + Boolean result = (Boolean) reqBean.getDataMap().get(MesPcnExtConstWords.RESULT); + + if (null == result) execCollectProductData(reqBean, resultBean, suffix); + + String msg = (String) reqBean.getDataMap().get(MesPcnExtConstWords.INFO); + + reqBean.getDataMap().remove(MesPcnExtConstWords.RESULT); + reqBean.getDataMap().remove(MesPcnExtConstWords.INFO); log.info("工厂{}生产线{}工位{}: --- STEP EXECUTE --- JxSnProcessingCollectProductDataStepService --- SUCCESS --- ", reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); - return stepResult; + if (result) return execSuccessCompleteAndSendMsgReturn(reqBean, resultBean, String.format("%s检测数据采集完成!", suffix)); + else return execNonCompleteAndSendMsgReturn(reqBean, resultBean, String.format("%s检测数据采集失败!%s", suffix, msg)); + + } + + private void execCollectProductData(StationRequestBean reqBean, StationResultBean resultBean, String suffix) { + + fsmCommonService.checkWcpcMapForDoScan(reqBean); + + String plcCodes = fsmCommonService.getAndCheckWcpcMapIsContainsKey(reqBean, reqBean.getWcpcMap(), MesPcnExtConstWords.PLC_CODE_UC); + if (StringUtils.isEmpty(plcCodes)) foundExThrowNoShowMsg(); + + String key = new StringJoiner(MesPcnExtConstWords.COLON).add(MesPcnExtConstWords.PRODUCT_DATA).add(reqBean.getOrganizeCode()).add(reqBean.getWorkCenterCode()).add(reqBean.getWorkCellCode()).toString(); + + String[] plcCodeArr = checkPlcCodeIsValid(reqBean, resultBean, plcCodes, key); + + List plcCodeList = doHandlePlcCodeList(reqBean, resultBean, key); + + checkObjectCfgIsValid(reqBean, resultBean, plcCodeList, key); + + String curExecWorkOrderNo = getCurExecWorkOrderNo(reqBean, resultBean); + + WorkOrderExtModel orderModel = getWorkOrderExtModel(reqBean, resultBean, curExecWorkOrderNo); + + Map paramMap = new HashMap<>(); + paramMap.put(key, new SxThirdPartyPlcCollectDataModel().userInfo(reqBean.getUserInfo()) + .location(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()) + .order(orderModel.getOrderNo(), orderModel.getPartNo(), orderModel.getPartNameRdd()) + .sn(reqBean.getSerialNumber(), reqBean.getProductSn()).manageCode(reqBean.getTray()) + .plcCode2Flag(plcCodeArr[0], plcCodeArr[1]).plcCode2DataList(plcCodeList) + .timeOut(reqBean.getWcpcMap().get(MesPcnExtConstWords.TIME_OUT_CFG))); + + ((ISxThirdPartyPlcCollectDataJobService) SpringContextsUtil.getBean(MesPcnExtConstWords.SX_TPPC_SUFFIX + MesPcnExtConstWords.PRODUCT_DATA + MesPcnExtConstWords.SERVICE_SUFFIX)).doThirdPartyPlcCollectData(paramMap); + + execSendMsgAndThrowEx(reqBean, resultBean, String.format("%s检测数据正在采集中...", suffix)); + } + private String[] checkPlcCodeIsValid(StationRequestBean reqBean, StationResultBean resultBean, String plcCodes, String key) { + String[] plcCodeArr = plcCodes.split(MesPcnExtConstWords.COMMA); + if (plcCodeArr.length != 2) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]工位参数[%s]维护的PLC代码[%s]无效!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesPcnExtConstWords.PLC_CODE_UC, plcCodes)); + + for (String plcCode : plcCodeArr) { + MesPlc plc = plcExtService.getPlcData(reqBean.getOrganizeCode(), key, plcCode); + if (null == plc || (StringUtils.isEmpty(plc.getChannel()) || StringUtils.isEmpty(plc.getDevice()) || StringUtils.isEmpty(plc.getTagAddress()))) + execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]工位参数[%s]维护的PLC代码[%s]其中[%s]未配置有效的PLC信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode(), MesPcnExtConstWords.PLC_CODE_UC, plcCodes, plcCode)); + } + + return plcCodeArr; + } + + private List doHandlePlcCodeList(StationRequestBean reqBean, StationResultBean resultBean, String key) { + String value = plcExtService.getCachedData(key, MesPcnExtConstWords.PLC_CODE_UC); + if (!StringUtils.isEmpty(value)) return JSONObject.parseArray(value, String.class); + + List plcList = plcExtService.getPlcDbList(reqBean.getOrganizeCode(), reqBean.getWorkCenterCode(), reqBean.getWorkCellCode()); + plcList = CollectionUtils.isEmpty(plcList) ? null : plcList.stream().filter(o -> (null != o && !StringUtils.isEmpty(o.getObjectCode()) && !StringUtils.isEmpty(o.getChannel()) && !StringUtils.isEmpty(o.getDevice()) && !StringUtils.isEmpty(o.getTagAddress()))).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(plcList)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]未配置有效的数据位PLC信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + + plcList.forEach(o -> plcExtService.doCacheData(reqBean.getOrganizeCode(), key, o.getPlcCode(), JSONObject.toJSONString(o))); + + List plcCodeList = plcList.stream().filter(o -> null != o).map(MesPlc::getPlcCode).collect(Collectors.toList()); + plcExtService.doCacheData(reqBean.getOrganizeCode(), key, MesPcnExtConstWords.PLC_CODE_UC, JSONObject.toJSONString(plcCodeList)); + + return plcCodeList; + } + + private void checkObjectCfgIsValid(StationRequestBean reqBean, StationResultBean resultBean, List plcCodeList, String key) { + String value = plcExtService.getCachedData(key, MesPcnExtConstWords.OBJECT_CODE_UC); + List objectCfgList = !StringUtils.isEmpty(value) ? JSONObject.parseArray(value, MesObjectCfg.class) : getObjectCfgDbList(reqBean, resultBean, plcCodeList); + + List plcCodeList2ObjectCfg = CollectionUtils.isEmpty(objectCfgList) ? null : objectCfgList.stream().filter(o -> null != o).map(MesObjectCfg::getPlcCode).collect(Collectors.toList()); + plcCodeList2ObjectCfg = CollectionUtils.isEmpty(plcCodeList2ObjectCfg) ? null : plcCodeList2ObjectCfg.stream().filter(o -> !StringUtils.isEmpty(o)).distinct().collect(Collectors.toList()); + + if (CollectionUtils.isEmpty(plcCodeList2ObjectCfg)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]配置的数据位PLC信息未关联有效的对象结构信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + if (plcCodeList2ObjectCfg.size() != plcCodeList.size()) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]配置的部分数据位PLC信息未关联有效的对象结构信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + + if (StringUtils.isEmpty(value)) plcExtService.doCacheData(reqBean.getOrganizeCode(), key, MesPcnExtConstWords.OBJECT_CODE_UC, JSONObject.toJSONString(objectCfgList)); + } + + private List getObjectCfgDbList(StationRequestBean reqBean, StationResultBean resultBean, List plcCodeList) { + List objectCfgList = plcExtService.getObjectCfgDbList(reqBean.getOrganizeCode(), plcCodeList); + if (CollectionUtils.isEmpty(objectCfgList)) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("生产线[%s]工位[%s]配置的数据位PLC信息未维护有效的对象结构信息!", reqBean.getWorkCenterCode(), reqBean.getWorkCellCode())); + return objectCfgList; + } + + private String getCurExecWorkOrderNo(StationRequestBean reqBean, StationResultBean resultBean) { + String curExecWorkOrderNo = (String) snProcessingModuleService.doHandleCurExecWorkOrder(reqBean, 1, null); + if (StringUtils.isEmpty(curExecWorkOrderNo)) execExpSendMsgAndThrowEx(reqBean, resultBean, "此前操作的工单号已丢失,请选择启动状态的生产工单!"); + return curExecWorkOrderNo; + } + + private WorkOrderExtModel getWorkOrderExtModel(StationRequestBean reqBean, StationResultBean resultBean, String curExecWorkOrderNo) { + WorkOrderExtModel orderModel = !reqBean.getDataMap().containsKey(MesPcnExtConstWords.WORK_ORDER) ? null : + JSONObject.parseObject(JSONObject.toJSONString(reqBean.getDataMap().get(MesPcnExtConstWords.WORK_ORDER)), WorkOrderExtModel.class); + if (null == orderModel) { + MesWorkOrderExt workOrderExt = workOrderExtService.getWorkOrderExtByOrderNo(reqBean.getOrganizeCode(), curExecWorkOrderNo); + if (null != workOrderExt) { + orderModel = new WorkOrderExtModel(); + BeanUtils.copyProperties(workOrderExt, orderModel, MesPcnExtConstWords.ID); + } + } + if (null == orderModel) execExpSendMsgAndThrowEx(reqBean, resultBean, String.format("此前操作的工单号[%s]对应的信息不存在!", curExecWorkOrderNo)); + return orderModel; + } + + private String getManageCode(String manageCode, Integer length) { + if (StringUtils.isEmpty(manageCode)) return null; + String[] manageCodeArr = manageCode.split(MesPcnExtConstWords.AND); + if (manageCodeArr.length >= length) return manageCodeArr[length - 1]; + else return null; + } + + } \ No newline at end of file diff --git a/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/SxThirdPartyPlcCollectDataModel.java b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/SxThirdPartyPlcCollectDataModel.java new file mode 100644 index 0000000..9605d3e --- /dev/null +++ b/modules/i3plus-ext-mes-pcn-pojo/src/main/java/cn/estsh/i3plus/ext/mes/pcn/pojo/model/SxThirdPartyPlcCollectDataModel.java @@ -0,0 +1,102 @@ +package cn.estsh.i3plus.ext.mes.pcn.pojo.model; + +import io.swagger.annotations.ApiParam; +import lombok.Data; +import org.springframework.util.StringUtils; + +import java.io.Serializable; +import java.util.List; + +@Data +public class SxThirdPartyPlcCollectDataModel implements Serializable { + + private static final long serialVersionUID = -1649994009292535386L; + + @ApiParam("工厂代码") + public String organizeCode; + + @ApiParam("操作人") + public String userInfo; + + @ApiParam("生产线代码") + private String workCenterCode; + + @ApiParam("工位代码") + private String workCellCode; + + @ApiParam("过程条码") + private String serialNumber; + + @ApiParam("产品条码") + private String productSn; + + @ApiParam("管理码") + private String manageCode; + + @ApiParam("生产工单") + private String workOrderNo; + + @ApiParam("物料号") + private String partNo; + + @ApiParam("物料名称") + private String partNameRdd; + + @ApiParam("超时时间") + private Long timeOut = 60000L; + + @ApiParam("PLC标志位代码") + private String plcCode2PlcFlag; + + @ApiParam("PCN标志位代码") + private String plcCode2PcnFlag; + + @ApiParam("数据位PLC代码集合") + private List plcCode2DataList; + + public SxThirdPartyPlcCollectDataModel location(String organizeCode, String workCenterCode, String workCellCode) { + this.organizeCode = organizeCode; + this.workCenterCode = workCenterCode; + this.workCellCode = workCellCode; + return this; + } + + public SxThirdPartyPlcCollectDataModel userInfo(String userInfo) { + this.userInfo = userInfo; + return this; + } + + public SxThirdPartyPlcCollectDataModel order(String workOrderNo, String partNo, String partNameRdd) { + this.workOrderNo = workOrderNo; + this.partNo = partNo; + this.partNameRdd = partNameRdd; + return this; + } + + public SxThirdPartyPlcCollectDataModel sn(String serialNumber, String productSn) { + this.serialNumber = serialNumber; + this.productSn = productSn; + return this; + } + + public SxThirdPartyPlcCollectDataModel manageCode(String manageCode) { + this.manageCode = manageCode; + return this; + } + + public SxThirdPartyPlcCollectDataModel timeOut(Object timeOut) { + if (!StringUtils.isEmpty(timeOut)) this.timeOut = Long.valueOf(timeOut.toString()); + return this; + } + + public SxThirdPartyPlcCollectDataModel plcCode2Flag(String plcCode2PlcFlag, String plcCode2PcnFlag) { + this.plcCode2PlcFlag = plcCode2PlcFlag; + this.plcCode2PcnFlag = plcCode2PcnFlag; + return this; + } + + public SxThirdPartyPlcCollectDataModel plcCode2DataList(List plcCode2DataList) { + this.plcCode2DataList = plcCode2DataList; + 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 889c415..e6b54a7 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 @@ -271,6 +271,8 @@ public class MesPcnExtConstWords { public static final String PLC_CODE = "plcCode"; //对象代码 public static final String OBJECT_CODE = "objectCode"; + //对象代码 + public static final String OBJECT_CODE_UC = "OBJECT_CODE"; //字段代码 public static final String FIELD_CODE = "fieldCode"; //检查类型 @@ -1030,12 +1032,16 @@ public class MesPcnExtConstWords { //生产数据 public final static String PRODUCT_DATA = "ProductData"; - public final static String SX_TPPCM_SUFFIX = "SxThirdPartyPlcCollectMonitor"; + public final static String SX_TPPC_SUFFIX = "SxThirdPartyPlcCollect"; public final static String HANDLER_SUFFIX = "Handler"; + public final static String SERVICE_SUFFIX = "Service"; //业务代码 public static final String BUSI_CODE = "BUSI_CODE"; + //超时时间配置 + public static final String TIME_OUT_CFG = "TIME_OUT_CFG"; + //工序合并工位参数配置 public static final String PROCESS_MERGE_FLAG = "PROCESS_MERGE_FLAG";