From c583e5683bac5d11750be01b8a3c4147e8f16026 Mon Sep 17 00:00:00 2001 From: zhoushihao <zsh19950802@163.com> Date: 星期三, 06 十一月 2024 23:21:53 +0800 Subject: [PATCH] 1、opc订阅服务为阻塞模式,配置需要开启多线程 2、新增订阅回调函数,用于执行任务,完成任务时调用 3、目前测试效果来看,一个定时任务只能有一个订阅任务,可订阅多个节点,当某个节点发生变化时,回调任务仅获取变化节点的信息 --- hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java | 339 ++------------------------------------------------------ 1 files changed, 12 insertions(+), 327 deletions(-) diff --git a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java index 0211d1e..57be771 100644 --- a/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java +++ b/hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassTask.java @@ -1,32 +1,14 @@ package com.mes.job; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.lang.Assert; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.kangaroohy.milo.runner.subscription.SubscriptionCallback; import com.kangaroohy.milo.service.MiloService; -import com.mes.common.config.Const; -import com.mes.edgstoragecage.entity.EdgStorageCage; -import com.mes.edgstoragecage.entity.EdgStorageCageDetails; -import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; -import com.mes.edgstoragecage.service.EdgStorageCageService; -import com.mes.glassinfo.entity.GlassInfo; -import com.mes.glassinfo.service.GlassInfoService; -import com.mes.opctask.entity.EdgStorageDeviceTask; -import com.mes.opctask.entity.EdgStorageDeviceTaskHistory; -import com.mes.opctask.service.EdgStorageDeviceTaskHistoryService; -import com.mes.opctask.service.EdgStorageDeviceTaskService; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang.StringUtils; -import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; -import java.util.List; +import java.util.Arrays; /** * @Author : zhoush @@ -39,319 +21,22 @@ @Autowired(required = false) MiloService miloService; - @Resource - EdgStorageDeviceTaskService edgStorageDeviceTaskService; - @Resource - GlassInfoService glassInfoService; - @Resource - EdgStorageCageDetailsService edgStorageCageDetailsService; - @Resource - EdgStorageCageService edgStorageCageService; - @Resource - EdgStorageDeviceTaskHistoryService edgStorageDeviceTaskHistoryService; - @Value("${mes.glassGap}") - private int glassGap; - @Value("${mes.cellLength}") - private int cellLength; + @Resource(name = "cacheGlassStartCallback") + SubscriptionCallback cacheGlassStartCallback; - @Value("${mes.threshold}") - private int threshold; -// @Autowired -// MPJBaseService edgStorageDeviceTaskService; -// -// @Autowired -// SubscriptionCallback cacheGlassSubscriptionCallback; -// -// @Scheduled(fixedDelay = Long.MAX_VALUE) -// public void startOpcTask() throws Exception { -// miloService.subscriptionFromOpcUa(Arrays.asList("my.device.x1", "my.device.x2"), cacheGlassSubscriptionCallback); -// } + @Resource(name = "cacheGlassFinishCallback") + SubscriptionCallback cacheGlassFinishCallback; - @Scheduled(fixedDelay = 1000) + @Scheduled(fixedDelay = Long.MAX_VALUE) public void startOpcTask() throws Exception { - int request = 1; -// 鑾峰彇绗煎唴鐜荤拑淇℃伅 - taskByDevice(); + miloService.subscriptionFromOpcUa(Arrays.asList("my.device01.x1", "my.device02.x1"), cacheGlassStartCallback); + log.info("--------------------s---------------------------"); } - @Scheduled(fixedDelay = 1000) + @Scheduled(fixedDelay = Long.MAX_VALUE) public void finishOpcTask() throws Exception { - EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage("edg_storage_device_one_task"); - if (task == null) { - log.info("浠诲姟琛ㄥ熀纭�鏁版嵁褰曞叆澶辫触锛岃妫�鏌ユ暟鎹槸鍚﹀綍鍏ユ垚鍔�"); - return; - } - if (task.getTaskState() <= 3) { - log.info("涓嶅瓨鍦ㄦ湭瀹屾垚鐨勪换鍔�"); - return; - } - Integer cell = task.getStartCell(); - Integer state = task.getTaskState(); - task.setTaskRunning(Const.GLASS_CACHE_TYPE_EMPTY); - task.setTaskState(Const.GLASS_CACHE_TYPE_EMPTY); - task.setStartCell(-1); - edgStorageDeviceTaskService.updateTaskMessage("edg_storage_device_one_task", task); - edgStorageDeviceTaskHistoryService.update(new LambdaUpdateWrapper<EdgStorageDeviceTaskHistory>() - .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_NEW) - .set(EdgStorageDeviceTaskHistory::getTaskState, - Const.GLASS_CACHE_TYPE_RUNNING.equals(state) ? Const.RAW_GLASS_TASK_SUCCESS : Const.RAW_GLASS_TASK_FAILURE) - ); - updateCellRemainWidth(cell); + miloService.subscriptionFromOpcUa(Arrays.asList("my.device01.x2", "my.device02.x2"), cacheGlassFinishCallback); + log.info("--------------------s---------------------------"); } - - private void taskByDevice() throws Exception { - EdgStorageDeviceTask task = edgStorageDeviceTaskService.queryTaskMessage("edg_storage_device_one_task"); - if (task == null) { - log.info("浠诲姟琛ㄥ熀纭�鏁版嵁褰曞叆澶辫触锛岃妫�鏌ユ暟鎹槸鍚﹀綍鍏ユ垚鍔�"); - return; - } - int request = task.getTaskState(); - if (request == 0) { - log.info("鏈敹鍒颁换鍔¤姹傦紝缁撴潫鏈浠诲姟"); - } else if (request == 1) { - //杩涚墖浠诲姟 - intoTask(task); - } else if (request == 2) { - //鍑虹墖浠诲姟 - outTask(task); - } else if (request == 3) { - //todo:鐩撮�氫换鍔� - - } else { - log.info("寮傚父鏁版嵁锛岀粨鏉熸湰娆′换鍔�"); - } - } - - private boolean intoTask(EdgStorageDeviceTask task) { - //鑾峰彇鐜荤拑鐨勫熀鏈俊鎭� - GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, task.getGlassIdIn())); - if (null == glassInfo) { - log.info("杩涚墖鐜荤拑淇℃伅涓嶅瓨鍦紝鐜荤拑id:{}", task.getGlassIdIn()); - return Boolean.FALSE; - } - //鑾峰彇褰撳墠杩涚墖鐜荤拑id鍜岃繘鐗囨牸瀛� 鐩稿悓灏哄鍙互鏀句笅鐨勬牸瀛� -// select * from edg_storage_cage t left join edg_storage_cage_details t1 on t.slot = t1.slot -// where t.device_id =1 and t1.state = 100 and t.remain_width >= 827 and t1.width = 827 and t1.height = 1124 order by abs(t.slot - 10) - EdgStorageCage edgStorageCage = edgStorageCageService.getEdgStorageCageBySize(1, glassInfo.getWidth(), glassInfo.getHeight(), task.getCurrentCell()); - if (edgStorageCage == null) { - log.info("鐩稿悓灏哄鍙互鏀句笅鐨勬牸瀛愭湭鎵惧埌锛屾牸瀛恑d:{}", task.getCurrentCell()); -// SELECT * from edg_storage_cage where device_id = 1 and remain_width > 1000 order by abs(slot - 10) - List<EdgStorageCage> storageCageList = edgStorageCageService.list(new LambdaQueryWrapper<EdgStorageCage>().eq(EdgStorageCage::getDeviceId, 1) - .eq(EdgStorageCage::getEnableState, Const.SLOT_ON) - .ge(EdgStorageCage::getRemainWidth, glassInfo.getWidth()).last("order by abs(slot - " + task.getCurrentCell() + ")")); -// //鐩撮�氫换鍔� -// if (flag && CollectionUtil.isNotEmpty(emptyList)) { -// return emptyList.get(0); -// } - if (CollectionUtil.isEmpty(storageCageList) || storageCageList.size() == 1) { - log.info("娌℃湁澶氫綑鐨勭┖鏍煎瓙"); - return Boolean.FALSE; - } - edgStorageCage = storageCageList.get(0); - } - log.info("4銆佸皢鐜荤拑淇℃伅鎻掑叆鍗у紡鐞嗙墖绗�,褰撳墠鐜荤拑淇℃伅:{}", glassInfo); - EdgStorageCageDetails details = new EdgStorageCageDetails(); - BeanUtils.copyProperties(glassInfo, details); - details.setState(Const.GLASS_STATE_IN); - details.setSlot(edgStorageCage.getSlot()); - details.setDeviceId(edgStorageCage.getDeviceId()); - edgStorageCageDetailsService.save(details); - - //鏇存柊浠诲姟淇℃伅 - task.setStartCell(edgStorageCage.getSlot()); - task.setTaskRunning(task.getTaskState()); - edgStorageDeviceTaskService.updateTaskMessage("edg_storage_device_one_task", task); - saveHistoryTask(task); - return Boolean.TRUE; - } - - private boolean outTask(EdgStorageDeviceTask task) { - EdgStorageCageDetails edgStorageCageDetails = null; - //绗煎唴鏄増鍥剧浉宸槸鍚﹁秴杩囬槇鍊� - boolean flag = queryMaxMinDiff(threshold); - if (flag) { - EdgStorageCageDetails minEdgDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() - .inSql(EdgStorageCageDetails::getSlot, "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON) - .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN) - .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId) - .orderBy(Boolean.TRUE, Boolean.TRUE, EdgStorageCageDetails::getTemperingFeedSequence) - .last("limit 1")); -// select * from edg_storage_cage_details where width = 551 and height = 1151 and id in (select min(id ) from edg_storage_cage_details where state = 100 group by slot ) - edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() - .eq(EdgStorageCageDetails::getWidth, minEdgDetails.getWidth()) - .eq(EdgStorageCageDetails::getHeight, minEdgDetails.getHeight()) - .inSql(EdgStorageCageDetails::getId, "select min(id ) from edg_storage_cage_details where state = 100 group by slot ") - .last("order by abs(t.slot - " + task.getCurrentCell() + ") asc limit 1") - ); - if (null == edgStorageCageDetails) { - edgStorageCageDetails = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() - .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN) - .eq(EdgStorageCageDetails::getSlot, minEdgDetails.getSlot()) - .orderByAsc(EdgStorageCageDetails::getId) - .last("limit 1") - ); - } - } - if (null == edgStorageCageDetails) { - // 鑾峰彇涓婃浠诲姟 -// 鑾峰彇鍘嗗彶琛ㄤ腑涓婃浠诲姟鏈�鍚庝竴鐗囧昂瀵� - EdgStorageDeviceTaskHistory edgeData = edgStorageDeviceTaskHistoryService.getOne(new LambdaQueryWrapper<EdgStorageDeviceTaskHistory>() - .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.RAW_GLASS_TASK_SUCCESS). - orderByDesc(EdgStorageDeviceTaskHistory::getId).last("limit 1")); - GlassInfo one = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, edgeData.getGlassIdOut())); - //绗煎唴鐨勭幓鐠冪殑灏哄鏄惁鍜屼笂涓�娆′换鍔′竴鑷� - edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(one.getWidth(), one.getHeight()); - } - if (null == edgStorageCageDetails) { - edgStorageCageDetails = edgStorageCageDetailsService.queryEdgStorageDetailsBySize(0, 0); - } - if (edgStorageCageDetails == null) { - //鍜屼笂娆′换鍔′笉瀛樺湪鐩稿悓灏哄 - log.info("绗煎唴娌℃湁鐜荤拑浜�"); - return Boolean.FALSE; - } - //鐜荤拑淇℃伅鏇挎崲 - String glassIdChange = queryAndChangeGlass(edgStorageCageDetails.getGlassId()); - //澶勭悊鍦ㄥ崸鐞嗗唴鐨勭幓鐠冧俊鎭細绗煎唴鐨勬暟鎹鐞� - queryEdgAndChangeGlass(edgStorageCageDetails.getGlassId(), glassIdChange); - //鐢熸垚鍑虹墖浠诲姟 - task.setGlassIdOut(edgStorageCageDetails.getGlassId()); - task.setCurrentCell(edgStorageCageDetails.getSlot()); - task.setTaskRunning(Const.GLASS_CACHE_TYPE_OUT); - edgStorageDeviceTaskService.updateTaskMessage("edg_storage_device_one_task", task); - saveHistoryTask(task); - //鏇存柊璇︽儏琛ㄤ换鍔″嚭鐗囦腑 - edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() - .set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT) - .eq(EdgStorageCageDetails::getGlassId, edgStorageCageDetails.getGlassId())); - return Boolean.TRUE; - } - - private boolean updateCellRemainWidth(int slot) { - List<EdgStorageCageDetails> list = edgStorageCageDetailsService.list(new LambdaQueryWrapper<EdgStorageCageDetails>().eq(EdgStorageCageDetails::getSlot, slot) - .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); - if (CollectionUtil.isEmpty(list)) { - log.info("鏍煎瓙{}鍐呮棤鐜荤拑锛屾棤娉曟洿鏂�", slot); - return Boolean.FALSE; - } - int widthTotal = (int) list.stream().map(e -> e.getWidth() + glassGap).mapToDouble(Double::intValue).sum(); - int remainWidth = cellLength - widthTotal >= 0 ? cellLength - widthTotal : 0; - edgStorageCageService.update(new LambdaUpdateWrapper<EdgStorageCage>(). - set(EdgStorageCage::getRemainWidth, remainWidth).eq(EdgStorageCage::getSlot, slot)); - return Boolean.FALSE; - } - - - /** - * 鏌ヨ鐜荤拑骞惰繘琛屼氦鎹� - * - * @param glassId - * @return - */ - public String queryAndChangeGlass(String glassId) { - GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId)); -// .inSql(GlassInfo::getEngineerId, "select engineer_id from engineering where state = 1")); - Assert.isFalse(null == glassInfo, "鐜荤拑淇℃伅涓嶅瓨鍦�"); //鎸夌収鐜荤拑灏哄 - LambdaQueryWrapper<GlassInfo> queryWrapper = new LambdaQueryWrapper<GlassInfo>() - .eq(GlassInfo::getWidth, glassInfo.getWidth()) - .eq(GlassInfo::getHeight, glassInfo.getHeight()) - .eq(GlassInfo::getThickness, glassInfo.getThickness()) - .eq(GlassInfo::getFilmsid, glassInfo.getFilmsid()) - .eq(GlassInfo::getFlowCardId, glassInfo.getFlowCardId()) - .eq(GlassInfo::getTotalLayer, glassInfo.getTotalLayer()) - .eq(GlassInfo::getLayer, glassInfo.getLayer()) - .eq(GlassInfo::getEngineerId, glassInfo.getEngineerId()) - .notInSql(GlassInfo::getGlassId, "select distinct glass_id from edg_storage_cage_details " + - "where engineer_id = '" + glassInfo.getEngineerId() + "' and width = " + glassInfo.getWidth() + " and height = " + glassInfo.getHeight() - + " and state != 100") - .orderByAsc(GlassInfo::getTemperingLayoutId) - .orderBy(Boolean.TRUE, Boolean.TRUE, GlassInfo::getTemperingFeedSequence) - .last("Limit 1"); - GlassInfo swapGlassInfo = glassInfoService.getOne(queryWrapper); - if (swapGlassInfo != null && !glassInfo.getGlassId().equals(swapGlassInfo.getGlassId())) { - String swapGlassId = swapGlassInfo.getGlassId(); - log.info("灏嗙幓鐠儃}鍜岀幓鐠儃}锛屼俊鎭簰鎹�,杩涚幓鐠� {}", glassInfo, swapGlassInfo, swapGlassInfo); - swapGlassInfo.setGlassId(glassId); - glassInfo.setGlassId(swapGlassId); - glassInfoService.updateById(swapGlassInfo); - glassInfoService.updateById(glassInfo); - return swapGlassId; - } - return ""; - } - - - /** - * 鏌ヨ鍗у紡鐞嗙墖鐜荤拑骞惰繘琛屼氦鎹� - * - * @param glassId - * @return - */ - public void queryEdgAndChangeGlass(String glassId, String swapGlassId) { - if (StringUtils.isBlank(swapGlassId)) { - log.info("褰撳墠鍑虹鐜荤拑涓嶅瓨鍦ㄩ渶瑕佹浛鎹㈢殑鐜荤拑"); - return; - } - //鑾峰彇寰呭嚭绗肩殑鐜荤拑 - EdgStorageCageDetails glassInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() - .eq(EdgStorageCageDetails::getGlassId, glassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); -// 鑾峰彇寰呭嚭绗肩殑鐜荤拑闇�瑕佹浛鎹㈢殑鐜荤拑淇℃伅 - EdgStorageCageDetails swapGlassDetailInfo = edgStorageCageDetailsService.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() - .eq(EdgStorageCageDetails::getGlassId, swapGlassId).eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); - -// 鐜荤拑灏忕墖琛ㄤ腑鐜荤拑宸茬粡鏇挎崲锛屾洿鏂板崸鐞嗙鍐呯幇鏈夌殑鍑嗗鍑虹鐨勭幓鐠冧俊鎭紝 - if (null == swapGlassDetailInfo) { - GlassInfo glassInfoBase = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>() - .eq(GlassInfo::getGlassId, glassId)); - //闇�瑕佹浛鎹㈢殑鐜荤拑涓哄瓨杩涘崸鐞嗭紝浠呴渶鏇存柊褰撳墠闇�瑕佸嚭绗肩殑鐜荤拑淇℃伅鍗冲彲 - edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() - .eq(EdgStorageCageDetails::getGlassId, glassId) - .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfoBase.getTemperingLayoutId()) - .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfoBase.getTemperingFeedSequence())); - } else { - //闇�瑕佹浛鎹㈢殑鐜荤拑閮藉湪鍗х悊鍐咃紝鎸夌収鐜荤拑id瀵硅皟鐜荤拑淇℃伅锛氬璋冪幓鐠僫d鍗冲彲 - edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() - .eq(EdgStorageCageDetails::getId, glassInfo.getId()) - .set(EdgStorageCageDetails::getTemperingLayoutId, swapGlassDetailInfo.getTemperingLayoutId()) - .set(EdgStorageCageDetails::getTemperingFeedSequence, swapGlassDetailInfo.getTemperingFeedSequence()) - ); - edgStorageCageDetailsService.update(new LambdaUpdateWrapper<EdgStorageCageDetails>() - .eq(EdgStorageCageDetails::getId, swapGlassDetailInfo.getId()) - .set(EdgStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId()) - .set(EdgStorageCageDetails::getTemperingFeedSequence, glassInfo.getTemperingFeedSequence()) - ); - } - } - - /** - * 鑾峰彇璇︽儏琛ㄥ唴鏈�澶ф渶灏忕増鍥緄d鐨勫樊鍊硷紝鍒ゆ柇鏄惁鍑烘渶灏忕増鍥剧幓鐠� - * - * @return - */ - public boolean queryMaxMinDiff(int threshold) { - //鑾峰彇绗煎瓙鍐呮渶澶х増鍥緄d鍜屾渶灏忕増鍥緄d鎻掑�硷紝鍒ゆ柇鏄惁澶т簬闃堝�硷紝澶т簬闃堝�肩洿鎺ュ嚭鏈�灏忕増鍥剧幓鐠� - QueryWrapper<EdgStorageCageDetails> queryWrapper = new QueryWrapper<>(); - queryWrapper.select("max(tempering_layout_id)-min(tempering_layout_id) as diff") - .eq("state", Const.GLASS_STATE_IN) - .inSql("slot", "select slot from edg_storage_cage where enable_state = " + Const.SLOT_ON); - List<Object> list = edgStorageCageDetailsService.listObjs(queryWrapper); - //鑾峰彇绗煎唴鐜荤拑鐗堝浘宸�兼槸鍚﹀ぇ浜庨槇鍊� - if (CollectionUtil.isNotEmpty(list)) { - Long diff = (Long) list.get(0); - return diff > threshold; - } else { - return Boolean.FALSE; - } - } - - public boolean saveHistoryTask(EdgStorageDeviceTask task) { - EdgStorageDeviceTaskHistory taskHistory = new EdgStorageDeviceTaskHistory(); - BeanUtils.copyProperties(task, taskHistory); - task.setTaskType(task.getTaskRunning()); - task.setTaskState(Const.RAW_GLASS_TASK_NEW); - edgStorageDeviceTaskHistoryService.save(taskHistory); - return Boolean.TRUE; - } - } -- Gitblit v1.8.0