diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java index fe39d7a..482a492 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import lombok.Data; import lombok.RequiredArgsConstructor; +import lombok.Synchronized; import lombok.extern.slf4j.Slf4j; import org.nl.acs.device.service.DeviceService; import org.nl.acs.device_driver.DeviceDriver; @@ -15,6 +16,7 @@ import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; +import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.monitor.DeviceStageMonitor; import org.nl.acs.opc.Device; import org.nl.acs.opc.WcsConfig; @@ -32,6 +34,7 @@ import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; /** * 检测站点驱动 @@ -49,6 +52,8 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp RouteLineService routelineserver = SpringContextHolder.getBean("routeLineServiceImpl"); @Autowired TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); + @Autowired + DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); AcsToWmsService acsToWmsService = SpringContextHolder.getBean("acsToWmsServiceImpl"); String container; @@ -87,7 +92,7 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp private Date instruction_finished_time = new Date(); private int instruction_require_time_out = 3000; - boolean requireSucess = false; + volatile boolean requireSucess = false; private int instruction_finished_time_out; @@ -143,13 +148,13 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp } if (move != last_move) { this.requireSucess = false; - log.info(this.devicecode + ",检测到货位信号值由" + last_move + "->" + move); + logServer.deviceExecuteLog(this.devicecode, "", "", "二楼检测到货位信号的值由" + last_move + "->" + move); } if (mode != last_mode) { - log.info(this.devicecode + ",检测到工作模式的值由" + last_mode + "->" + mode); + logServer.deviceExecuteLog(this.devicecode, "", "", "检测到工作模式的值由" + last_mode + "->" + mode); } } catch (Exception var17) { - log.error(this.devicecode +"mode:"+last_mode + "->" + mode + "move:"+last_move + "->" + move+"执行点位同步出现异常"); + log.error(this.devicecode + "mode:" + last_mode + "->" + mode + "move:" + last_move + "->" + move + "执行点位同步出现异常"); return; } if (!this.itemProtocol.getIsonline()) { @@ -174,17 +179,16 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp Instruction instruction = null; List toInstructions; switch (mode) { - // case 1: - // log.debug("设备运转模式:等待工作"); - // return; case 2: - if (!requireSucess) { + if (move != last_move) { JSONObject param = new JSONObject(); param.put("device_code", this.devicecode); param.put("is_have", this.move); - log.info(this.devicecode + ",检测到货位信号的值由" + last_move + "->" + move+",开始反馈WMS..."); + logServer.deviceExecuteLog(this.devicecode, "", "", this.devicecode + ",二楼检测到货位信号的值由" + last_move + "->" + move); this.shipDeviceUpdate(param); } + default: + break; } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java index 3e86c9c..735eed5 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java @@ -1,6 +1,7 @@ package org.nl.acs.ext.wms.service.impl; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; @@ -548,7 +549,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { log.info("shipDeviceUpdate - 返回参数 {}", result.body()); return JSONObject.parseObject(result.body()); } - } catch (Throwable ignored) { + } catch (IORuntimeException ignored) { + ignored.printStackTrace(); } finally { MDC.remove(log_file_type); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java b/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java index f29c0cc..9600def 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java @@ -1,235 +1,558 @@ - package org.nl.acs.opc; +package org.nl.acs.opc; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; +import org.nl.acs.AcsConfig; import org.nl.acs.udw.UnifiedDataAccessor; import org.nl.acs.udw.UnifiedDataAccessorFactory; +import org.nl.acs.udw.UnifiedDataAppService; import org.nl.modules.wql.util.SpringContextHolder; -import org.openscada.opc.lib.da.Group; -import org.openscada.opc.lib.da.Item; -import org.openscada.opc.lib.da.ItemState; -import org.openscada.opc.lib.da.Server; +import org.openscada.opc.lib.da.*; import java.util.*; @Slf4j -public class DeviceOpcProtocolRunable implements Runnable { - OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerServiceImpl.class); +public class DeviceOpcProtocolRunable implements Runnable, DataCallback, ServerConnectionStateListener { + OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerServiceImpl.class); - List protocols; - OpcServerManageDto OpcServer; - int error_num; - String message; + List protocols; + OpcServerManageDto OpcServer; + int error_num; + String message; - Group group; + Group group; + private Server server; + private int all_null; - public DeviceOpcProtocolRunable() { - this.error_num = 0; - this.message = null; - } + public DeviceOpcProtocolRunable() { + this.error_num = 0; + this.message = null; + } - public List getProtocols() { - return this.protocols; - } + public List getProtocols() { + return this.protocols; + } - public void setProtocols(List protocols) { - this.protocols = protocols; - } + public void setProtocols(List protocols) { + this.protocols = protocols; + } - public OpcServerManageDto getOpcServer() { - return this.OpcServer; - } + public OpcServerManageDto getOpcServer() { + return this.OpcServer; + } - public void setOpcServer(OpcServerManageDto opcServer) { - this.OpcServer = opcServer; - } + public void setOpcServer(OpcServerManageDto opcServer) { + this.OpcServer = opcServer; + } - OpcItemDto getItem(String item) { - Iterator var2 = this.protocols.iterator(); + OpcItemDto getItem(String item) { + Iterator var2 = this.protocols.iterator(); - OpcItemDto dto; - do { - if (!var2.hasNext()) { - return null; - } + OpcItemDto dto; + do { + if (!var2.hasNext()) { + return null; + } - dto = (OpcItemDto) var2.next(); - } while (!StrUtil.equals(item, dto.getItem_code())); + dto = (OpcItemDto) var2.next(); + } while (!StrUtil.equals(item, dto.getItem_code())); - return dto; - } + return dto; + } - @Override - public void run() { - while (true) { - try { - group= opcServerService.getServer(this.OpcServer.getOpc_code()); + /*@Override + public void run() { + while (true) { + try { + group = opcServerService.getServer(this.OpcServer.getOpc_code()); - List itemsString = new ArrayList(); - Iterator it = this.protocols.iterator(); + List itemsString = new ArrayList(); + Iterator it = this.protocols.iterator(); + + while (it.hasNext()) { + OpcItemDto protocol = (OpcItemDto) it.next(); + String item = protocol.getItem_code(); + itemsString.add(item); + } + + Map itemsMap = new LinkedHashMap(); + boolean is_error = false; + StringBuilder err_message = new StringBuilder(); + Iterator var7 = itemsString.iterator(); + + while (var7.hasNext()) { + String string = (String) var7.next(); + + try { + itemsMap.put(string, group.addItem(string)); + log.trace("添加成功 {}", string); + } catch (Exception var29) { + err_message.append(string + ":" + var29.getMessage()); + if (!is_error) { + is_error = true; + } + } + } + + if (is_error) { + log.info("设备OPC数据同步配置异常," + err_message); + } + + if (!OpcStartTag.is_run) { + OpcStartTag.is_run = true; + } + + // 线程名 + String tag = Thread.currentThread().getName(); + if (this.OpcServer != null) { + tag = tag + this.OpcServer.getOpc_code(); + } + UnifiedDataAccessor accessor_value = + UnifiedDataAccessorFactory.getAccessor(OpcConfig.udw_opc_value_key); + + boolean time_out = false; + + label97: + while (true) { + // System.out.println("label97"); + long begin = System.currentTimeMillis(); + Map itemStatus = null; + + try { + itemStatus = group.read(true, (Item[]) itemsMap.values().toArray(new Item[0])); + } catch (Exception e) { + try { + itemStatus = group.read(true, (Item[]) itemsMap.values().toArray(new Item[0])); + } catch (Exception e2) { + itemStatus = group.read(true, (Item[]) itemsMap.values().toArray(new Item[0])); + } + } + + + //TODO 读完释放server可行否? + + long end = System.currentTimeMillis(); + log.trace("{} 开始记时{}", tag, DateUtil.now()); + long duration = end - begin; + log.trace("{} 读取耗时:{}", tag, duration); + if (duration > 1000L) { + if (!time_out) { + log.warn(" {} 读取超时 : {} ", tag, duration); + } + + time_out = true; + } else { + time_out = false; + } + + // A1_HK_04.A1_HK_04.A1_HK_04_3.door 列表 + Set items = itemStatus.keySet(); + Iterator var18 = items.iterator(); + + while (true) { + Item item; + // A1_HK_04.A1_HK_04.A1_HK_04_3.door + // 当前值 + Object value; + // 旧的值 + Object his; + do { + if (!var18.hasNext()) { + end = System.currentTimeMillis(); + log.trace("{}", itemsString); + log.trace("{} 计算完成耗时{}", tag, end - begin); + Thread.sleep((long) OpcConfig.synchronized_millisecond); + if (this.error_num != 0) { + this.error_num = 0; + this.message = null; + } + // 所有信号读完并且没有变化的值 + continue label97; + } + + item = (Item) var18.next(); + ItemState itemState = itemStatus.get(item); + value = OpcUtl.getValue(item, itemState); + his = accessor_value.getValue(item.getId()); + if (!ObjectUtil.equal(itemState.getQuality(), QualityTypeValue.OPC_QUALITY_GOOD) + && his != null) { + log.warn("opc 值不健康 item: {}, 状态: {}", item.getId(), itemState.getQuality()); + } + } while (ObjectUtil.equal(value, his)); // 如果两次的值相等,不走下面的代码 + + OpcItemDto itemDto = this.getItem(item.getId()); + if (itemDto.getNeed_log() != null && itemDto.getNeed_log()) { + StringBuilder sb = new StringBuilder(); + // 设备的ITEM项 + List relate_items = itemDto.getRelate_items(); + Iterator var26 = relate_items.iterator(); + + while (var26.hasNext()) { + String relate = (String) var26.next(); + Object obj = accessor_value.getValue(relate); + sb.append("key:" + relate + "value:" + obj + ";"); + } + + log.info("信号{}变更从{}->{};信号快照:{}", new Object[]{item.getId(), his, value, sb}); + } + // 设置值 + //accessor_value.setValue(item.getId(), value); + if (!ObjectUtil.isEmpty(value) || !"".equals(value)) { + accessor_value.setValue(item.getId(), value); + } + if (ObjectUtil.isEmpty(value) && "".equals(value)) { + accessor_value.removeValue(item.getId()); + } + } + } + } catch (Exception var30) { + + if (group != null) { + try { + group.getServer().dispose(); + group.clear(); + group.remove(); + } catch (Exception var6) { + } + this.group = null; + } - while (it.hasNext()) { - OpcItemDto protocol = (OpcItemDto) it.next(); - String item = protocol.getItem_code(); - itemsString.add(item); - } - Map itemsMap = new LinkedHashMap(); - boolean is_error = false; - StringBuilder err_message = new StringBuilder(); - Iterator var7 = itemsString.iterator(); - - while (var7.hasNext()) { - String string = (String) var7.next(); - - try { - itemsMap.put(string, group.addItem(string)); - log.trace("添加成功 {}", string); - } catch (Exception var29) { - err_message.append(string + ":" + var29.getMessage()); - if (!is_error) { - is_error = true; + String error_message = "设备信息同步异常"; + if (!StrUtil.equals(this.message, error_message)) { + log.warn("", var30); + } + + try { + Thread.sleep((long) (OpcConfig.synchronized_exception_wait_second * 1000)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + ++this.error_num; + if (this.error_num > 3 && !StrUtil.equals(this.message, error_message)) { + log.info("设备同步通信异常"); + this.message = error_message; + } } - } } - - if (is_error) { - log.info("设备OPC数据同步配置异常," + err_message); + }*/ + + @Override + public void run() { + if (OpcConfig.opc_item_read_using_callback) { + this.runNew(); + } else { + this.runOld(); } + } - if (!OpcStartTag.is_run) { - OpcStartTag.is_run = true; - } - // 线程名 - String tag = Thread.currentThread().getName(); - if (this.OpcServer != null) { - tag = tag + this.OpcServer.getOpc_code(); + private void runOld() { + OpcServerService opcServerService = SpringContextHolder.getBean(OpcServerService .class); + while (true) { + start: + try { + if (this.group != null) { + group.clear(); + group.remove(); + log.trace("清理group..."); + } + if (this.server != null) { + server.disconnect(); + log.trace("清理server..."); + } + this.server = OpcServerUtl.getServerWithOutException(this.OpcServer.getOpc_host(), this.OpcServer.getCls_id(), this.OpcServer.getUser(), this.OpcServer.getPassword(), this.OpcServer.getDomain()); + this.server.addStateListener(this); + group = this.server.addGroup(); + List itemsString = new ArrayList(); + Iterator var3 = this.protocols.iterator(); + + while (var3.hasNext()) { + OpcItemDto protocol = (OpcItemDto) var3.next(); + String item = protocol.getItem_code(); + itemsString.add(item); + } + + Map itemsMap = new LinkedHashMap(); + boolean is_error = false; + StringBuilder err_message = new StringBuilder(); + Iterator var6 = itemsString.iterator(); + + while (var6.hasNext()) { + String string = (String) var6.next(); + + try { + Item item = group.addItem(string); + itemsMap.put(string, item); + log.trace("添加成功 {}", string); + } catch (Exception var26) { + err_message.append(string + ":" + var26.getMessage()); + if (!is_error) { + is_error = true; + } + } + } + + String tag; + if (is_error) { + tag = err_message.toString(); + log.warn("{}:{}", OpcConfig.resource_code, tag); + } + + if (!OpcStartTag.is_run) { + OpcStartTag.is_run = true; + } + + tag = ""; + if (log.isWarnEnabled()) { + tag = Thread.currentThread().getName(); + if (this.OpcServer != null) { + tag = tag + "," + this.getOpcGroupID(); + } + } + + UnifiedDataAccessor accessor_value = UnifiedDataAccessorFactory.getAccessor(OpcConfig.udw_opc_value_key); + boolean time_out = false; + + while (DeviceOpcSynchronizeAutoRun.isRun) { + long begin = System.currentTimeMillis(); + if (log.isTraceEnabled()) { + log.trace("{} 开始记时{}", tag, DateUtil.now()); + } + + Map itemStatus = group.read(true, (Item[]) itemsMap.values().toArray(new Item[0])); + long end = System.currentTimeMillis(); + long duration = end - begin; + if (log.isTraceEnabled()) { + log.trace("{} 读取耗时:{}", tag, duration); + } + + if (duration > 1000L) { + if (!time_out) { + log.warn("{} 读取超时 : {}", tag, duration); + } + + time_out = true; + } else { + time_out = false; + } + + boolean valueAllNotNull = false; + Set items = itemStatus.keySet(); + Iterator var18 = items.iterator(); + + while (var18.hasNext()) { + Item item = (Item) var18.next(); + ItemState itemState = (ItemState) itemStatus.get(item); + Object value = OpcUtl.getValue(item, itemState); + if (value != null) { + valueAllNotNull = true; + } else { + log.info("item:{},velue为空,value:{}", item.getId(), value); + } + + String itemId = item.getId(); + Object his = accessor_value.getValue(itemId); + if (ObjectUtil.notEqual(itemState.getQuality(), QualityTypeValue.OPC_QUALITY_GOOD) && his != null) { + log.warn("opc 值不健康 item: {}, 状态: {}", itemId, itemState.getQuality()); + valueAllNotNull = false; + } + + if (!UnifiedDataAppService.isEquals(value, his)) { + OpcItemDto itemDto = this.getItem(itemId); + if (true) { +// this.logItemChanged(itemId, accessor_value, value, itemDto); + } + if(!ObjectUtil.isEmpty(value) || "".equals(value)){ + accessor_value.setValue(itemId, value); + } + if(ObjectUtil.isEmpty(value) && !"".equals(value)){ + accessor_value.removeValue(itemId); + } + } + } + + end = System.currentTimeMillis(); + if (log.isTraceEnabled()) { + log.trace("{}", itemsString); + log.trace("{} 计算完成耗时{}", tag, end - begin); + } + + ThreadUtl.sleep((long) OpcConfig.synchronized_millisecond); + if (this.error_num != 0) { + this.error_num = 0; + this.message = null; + } + + if (!valueAllNotNull) { + if (this.all_null < 3) { + if (log.isWarnEnabled()) { + log.warn("OPC数据源: {} 所有内容都为空,检查网络, all_null:{} ,暂定{}s", tag, all_null,3); + } + ThreadUtl.sleep( 3000); + break start; + } else if (this.all_null < 6) { + if (log.isWarnEnabled()) { + log.warn(tag + "重新创建server"); + log.warn("{} 所有内容都为空, all_null:{} ,暂定{}s", tag, all_null,3); + } + ThreadUtl.sleep(3000); + break start; + } else if (this.all_null < 12) { + if (log.isWarnEnabled()) { + log.warn(tag + "重新创建server"); + log.warn("{} 所有内容都为空, all_null:{} ,暂定{}s", tag, all_null,3); + } + ThreadUtl.sleep(3000); + break start; + } else { + if (log.isWarnEnabled()) { + log.warn("{} 所有内容都为空, all_null:{} ,暂定{}ms", tag, all_null, 5000); + } + ThreadUtl.sleep((long) (5000)); + break start; + } + +// ++this.all_null; + } else { + this.all_null = 0; + } +// break start; + + } + + log.warn("opc线程停止。。。"); + return; + } catch (Exception var27) { + if (this.server != null) { + try { + this.server.disconnect(); + } catch (Exception var25) { + } + } + + this.server = null; + if (!DeviceOpcSynchronizeAutoRun.isRun) { + log.warn("opc线程停止2。。。"); + return; + } + + String error_message = "设备信息同步异常"; + if (!StrUtil.equals(this.message, error_message)) { + log.warn(error_message, var27); + } + + ThreadUtl.sleep((long) (OpcConfig.synchronized_exception_wait_second * 1000)); + ++this.error_num; + if (this.error_num > 3 && !StrUtil.equals(this.message, error_message)) { + this.message = error_message; + } + } } - UnifiedDataAccessor accessor_value = - UnifiedDataAccessorFactory.getAccessor(OpcConfig.udw_opc_value_key); + } - boolean time_out = false; - label97: + private void runNew() { + Async20Access accessor = null; + while (true) { - // System.out.println("label97"); - long begin = System.currentTimeMillis(); - Map itemStatus =null; - - try{ - itemStatus=group.read(true, (Item[]) itemsMap.values().toArray(new Item[0])); - }catch (Exception e){ - try{ - itemStatus=group.read(true, (Item[]) itemsMap.values().toArray(new Item[0])); - }catch (Exception e2){ - itemStatus=group.read(true, (Item[]) itemsMap.values().toArray(new Item[0])); - } - } - - - //TODO 读完释放server可行否? - - long end = System.currentTimeMillis(); - log.trace("{} 开始记时{}", tag, DateUtil.now()); - long duration = end - begin; - log.trace("{} 读取耗时:{}", tag, duration); - if (duration > 1000L) { - if (!time_out) { - log.warn(" {} 读取超时 : {} ", tag, duration); - } + String opcGroupId = this.getOpcGroupID(); + + try { + if (this.server == null) { + this.server = OpcServerUtl.getServerWithOutException(this.OpcServer.getOpc_host(), this.OpcServer.getCls_id(), this.OpcServer.getUser(), this.OpcServer.getPassword(), this.OpcServer.getDomain()); + this.server.addStateListener((ServerConnectionStateListener) this); + accessor = new Async20Access(this.server, OpcConfig.synchronized_millisecond, true); + Iterator var9 = this.protocols.iterator(); + + while (var9.hasNext()) { + OpcItemDto protocol = (OpcItemDto) var9.next(); + String itemId = protocol.getItem_code(); + accessor.addItem(itemId, (DataCallback) this); + } + + accessor.bind(); + log.info("Async20Access bind {}", opcGroupId); + } + + Thread.sleep((long) (OpcConfig.synchronized_exception_wait_second * 1000)); + } catch (Exception var8) { + if (accessor != null) { + try { + log.warn("Async20Access unbind {}", opcGroupId); + accessor.unbind(); + } catch (Exception var7) { + var7.printStackTrace(); + } + + accessor = null; + } + + if (this.server != null) { + try { + this.server.disconnect(); + } catch (Exception var6) { + } + + this.server = null; + } + + if (var8 instanceof InterruptedException) { + log.warn("OPC 同步线程(%s)被中断", opcGroupId); + return; + } + + log.warn("设备信息同步异常", var8); + ThreadUtl.sleep((long) (OpcConfig.synchronized_exception_wait_second * 1000)); + String error_message = var8.getMessage(); + if (error_message == null) { + error_message = var8.toString(); + } - time_out = true; - } else { - time_out = false; - } - - // A1_HK_04.A1_HK_04.A1_HK_04_3.door 列表 - Set items = itemStatus.keySet(); - Iterator var18 = items.iterator(); - - while (true) { - Item item; - // A1_HK_04.A1_HK_04.A1_HK_04_3.door - // 当前值 - Object value; - // 旧的值 - Object his; - do { - if (!var18.hasNext()) { - end = System.currentTimeMillis(); - log.trace("{}", itemsString); - log.trace("{} 计算完成耗时{}", tag, end - begin); - Thread.sleep((long) OpcConfig.synchronized_millisecond); - if (this.error_num != 0) { - this.error_num = 0; - this.message = null; - } - // 所有信号读完并且没有变化的值 - continue label97; - } - - item = (Item) var18.next(); - ItemState itemState = itemStatus.get(item); - value = OpcUtl.getValue(item, itemState); - his = accessor_value.getValue(item.getId()); - if (!ObjectUtil.equal(itemState.getQuality(), QualityTypeValue.OPC_QUALITY_GOOD) - && his != null) { - log.warn("opc 值不健康 item: {}, 状态: {}", item.getId(), itemState.getQuality()); - } - } while (ObjectUtil.equal(value, his)); // 如果两次的值相等,不走下面的代码 - - OpcItemDto itemDto = this.getItem(item.getId()); - if (itemDto.getNeed_log() != null && itemDto.getNeed_log()) { - StringBuilder sb = new StringBuilder(); - // 设备的ITEM项 - List relate_items = itemDto.getRelate_items(); - Iterator var26 = relate_items.iterator(); - - while (var26.hasNext()) { - String relate = (String) var26.next(); - Object obj = accessor_value.getValue(relate); - sb.append("key:" + relate + "value:" + obj + ";"); - } - - log.info("信号{}变更从{}->{};信号快照:{}", new Object[] {item.getId(), his, value, sb}); + ++this.error_num; + if (this.error_num > 3 && !StrUtil.equals(this.message, error_message)) { + this.message = error_message; + } } - // 设置值 - accessor_value.setValue(item.getId(), value); - } - } - } catch (Exception var30) { - - if (group != null) { - try { - group.getServer().dispose(); - group.clear(); - group.remove(); - } catch (Exception var6) { - } - this.group = null; } + } - String error_message = "设备信息同步异常"; - if (!StrUtil.equals(this.message, error_message)) { - log.warn("", var30); - } + private String getOpcGroupID() { + String var10000 = this.OpcServer.getOpc_code(); + return var10000 + "(" + this.protocols.size() + " items)"; + } + @Override + public void changed(Item item, ItemState itemState) { + String itemId = item.getId(); try { - Thread.sleep((long) (OpcConfig.synchronized_exception_wait_second * 1000)); - } catch (InterruptedException e) { - e.printStackTrace(); + Object value = OpcUtl.getValue(item, itemState); + UnifiedDataAccessor accessor_value = UnifiedDataAccessorFactory.getAccessor(OpcConfig.udw_opc_value_key); + accessor_value.setValue(itemId, value); + log.trace("Item {} new value: {}, Timestamp: {}", new Object[]{itemId, itemState.getValue(), itemState.getTimestamp().getTime()}); + OpcItemDto itemDto = this.getItem(itemId); + this.logItemChanged(itemId, accessor_value, value, itemDto); + + } catch (Exception var7) { + log.error(itemId, var7); } - ++this.error_num; - if (this.error_num > 3 && !StrUtil.equals(this.message, error_message)) { - log.info("设备同步通信异常"); - this.message = error_message; + } + + @Override + public void connectionStateChanged(boolean connected) { + if (!connected) { + this.server = null; } - } + log.warn("opc server {} {}", this.getOpcGroupID(), connected ? "connected" : "disconnected"); } - } + + private void logItemChanged(String itemId, UnifiedDataAccessor accessor_value, Object value, OpcItemDto itemDto) { + + } + } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/udw/UnifiedDataAccessor.java b/acs/nladmin-system/src/main/java/org/nl/acs/udw/UnifiedDataAccessor.java index 559373f..e4fde25 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/udw/UnifiedDataAccessor.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/udw/UnifiedDataAccessor.java @@ -9,6 +9,12 @@ public interface UnifiedDataAccessor { void setValue(String key, Object value); + /** + * 删除值 + * @param key + */ + void removeValue(String key); + UnifiedData getUnifiedData(String key); List getHistoryUnifiedData(String key); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/udw/rest/UdwManagerController.java b/acs/nladmin-system/src/main/java/org/nl/acs/udw/rest/UdwManagerController.java new file mode 100644 index 0000000..cf0ba12 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/udw/rest/UdwManagerController.java @@ -0,0 +1,45 @@ + +package org.nl.acs.udw.rest; + + +import cn.dev33.satoken.annotation.SaIgnore; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.udw.service.UdwManageService; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +@RequiredArgsConstructor +@Api(tags = "内存点位管理") +@RequestMapping("/api/udw") +@Slf4j +public class UdwManagerController { + + private final UdwManageService udwManageService; + +// @GetMapping +// @Log("查询内存点位") +// @ApiOperation("查询内存点位") +// @SaIgnore +// public ResponseEntity query(@RequestParam JSONObject whereJson) { +// return new ResponseEntity<>(udwManageService.queryByConditions(whereJson), HttpStatus.OK); +// } + + @GetMapping + @ApiOperation("查询内存点位") + @SaIgnore + //@PreAuthorize("@el.check('device:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(udwManageService.queryAll(whereJson, page), HttpStatus.OK); + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/UdwManageService.java b/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/UdwManageService.java index 034bd3f..8992417 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/UdwManageService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/UdwManageService.java @@ -2,8 +2,10 @@ package org.nl.acs.udw.service; import com.alibaba.fastjson.JSONObject; import org.nl.acs.udw.dto.UdwDto; +import org.springframework.data.domain.Pageable; import java.util.List; +import java.util.Map; public interface UdwManageService { /** @@ -13,4 +15,14 @@ public interface UdwManageService { * @return */ List queryByConditions(JSONObject where); + + + /** + * 查询数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/impl/UdwManagerServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/impl/UdwManagerServiceImpl.java index b5f377c..8abccd9 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/impl/UdwManagerServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/impl/UdwManagerServiceImpl.java @@ -1,11 +1,19 @@ package org.nl.acs.udw.service.impl; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import org.nl.acs.udw.UnifiedData; +import org.nl.acs.udw.UnifiedDataAccessorFactory; import org.nl.acs.udw.dto.UdwDto; import org.nl.acs.udw.service.UdwManageService; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Service public class UdwManagerServiceImpl implements UdwManageService { @@ -13,4 +21,87 @@ public class UdwManagerServiceImpl implements UdwManageService { public List queryByConditions(JSONObject where) { return null; } + + @Override + public Map queryAll(Map whereJson, Pageable page) { + + String unified_key = (String) whereJson.get("unified_key"); + String keys = (String) whereJson.get("code"); + if(StrUtil.isEmpty(unified_key)) + { + unified_key = "opc_value"; + } +// String unified_key = (String) whereJson.get("unified_key"); +// String code = (String) whereJson.get("code"); + +// unified_key = whereJson.get("key").toString(); +// keys = whereJson.get("value").toString(); + + + //[[{"column":"unified_key","value":"cached","compareType":"equals","columnType":"object"}]] + UnifiedDataUnit unifiedDataUnit = UnifiedDataAccessorFactory.getUnifiedDataAppService().getUnifiedDataUnit(unified_key); + if (unifiedDataUnit == null) { + return null; + } else { + String key; + UdwDto udwDto; + Map storage; + ArrayList udwDtos; + Iterator var14; + if (keys != null) { + storage = unifiedDataUnit.getStorage(); + udwDtos = new ArrayList(); + var14 = storage.keySet().iterator(); + + while(var14.hasNext()) { + key = (String)var14.next(); + if (key.indexOf(keys) != -1) { + udwDto = new UdwDto(); + udwDto.setUnified_key(unified_key); + udwDto.setKey(key); + udwDto.setValue(((UnifiedData)storage.get(key)).getValue()); + udwDtos.add(udwDto); + } + } + + Integer currentPageNumber = page.getPageNumber() + 1; + Integer pageMaxSize = page.getPageSize(); + + List orderbyDtoList = (List) udwDtos.stream().skip((currentPageNumber - 1) * pageMaxSize) + .limit(pageMaxSize) + .collect(Collectors.toList()); + + JSONObject jo = new JSONObject(); + jo.put("content", orderbyDtoList); + jo.put("totalElements", udwDtos.size()); + + return jo; + } else { + storage = unifiedDataUnit.getStorage(); + udwDtos = new ArrayList(); + var14 = storage.keySet().iterator(); + + while(var14.hasNext()) { + key = (String)var14.next(); + udwDto = new UdwDto(); + udwDto.setUnified_key(unified_key); + udwDto.setKey(key); + udwDto.setValue(((UnifiedData)storage.get(key)).getValue()); + udwDtos.add(udwDto); + } + Integer currentPageNumber = page.getPageNumber() + 1; + Integer pageMaxSize = page.getPageSize(); + + List orderbyDtoList = (List) udwDtos.stream().skip((currentPageNumber - 1) * pageMaxSize) + .limit(pageMaxSize) + .collect(Collectors.toList()); + + JSONObject jo = new JSONObject(); + jo.put("content", orderbyDtoList); + jo.put("totalElements", udwDtos.size()); + + return jo; + } + } + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/impl/UnifiedDataAccessorImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/impl/UnifiedDataAccessorImpl.java index 995ab9a..085a3a5 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/impl/UnifiedDataAccessorImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/udw/service/impl/UnifiedDataAccessorImpl.java @@ -33,6 +33,11 @@ public class UnifiedDataAccessorImpl implements UnifiedDataAccessor { this.unifiedDataAppService.setValue(this.unified_key, key, value); } + @Override + public void removeValue( String key) { + this.unifiedDataAppService.removeValue(this.unified_key, key); + } + public void setValueWithPersistence(String key, Object value) { this.unifiedDataAppService.setValueWithPersistence(this.unified_key, key, value); } diff --git a/acs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js b/acs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js new file mode 100644 index 0000000..12f1337 --- /dev/null +++ b/acs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/deviceErrorLog', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/deviceErrorLog/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/deviceErrorLog', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/acs/nladmin-ui/src/api/acs/history/udwData.js b/acs/nladmin-ui/src/api/acs/history/udwData.js new file mode 100644 index 0000000..f3d3c5d --- /dev/null +++ b/acs/nladmin-ui/src/api/acs/history/udwData.js @@ -0,0 +1,28 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/task', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/task/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/task', + method: 'put', + data + }) +} + +export default { edit, del } + diff --git a/acs/nladmin-ui/src/views/acs/history/udwData/index.vue b/acs/nladmin-ui/src/views/acs/history/udwData/index.vue new file mode 100644 index 0000000..e90b8e8 --- /dev/null +++ b/acs/nladmin-ui/src/views/acs/history/udwData/index.vue @@ -0,0 +1,181 @@ + + + + +