From e550bdba8ae64ac6c429aa7cab65b301ea19ee38 Mon Sep 17 00:00:00 2001
From: psh <psh>
Date: Wed, 23 Aug 2023 09:34:24 +0800
Subject: [PATCH] =?UTF-8?q?=E5=90=8C=E6=AD=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ApplicationAutoInitialExecuter.java       |   5 +-
 .../nl/acs/auto/run/AutoRunServiceImpl.java   |  16 +-
 .../service/impl/DeviceExtraServiceImpl.java  |   2 +-
 .../service/impl/DeviceServiceImpl.java       |   3 +
 .../device/service/mapper/DeviceMapper.java   |   8 +-
 .../service/impl/InstructionServiceImpl.java  |   3 +
 .../org/nl/acs/opc/DeviceAppServiceImpl.java  |   6 +-
 .../nl/acs/opc/DeviceManageServiceImpl.java   |   3 +
 .../org/nl/acs/opc/OpcServerServiceImpl.java  | 212 +++++++++--------
 .../org/nl/acs/plc/rest/OpcPlcController.java | 158 +++++++------
 .../org/nl/acs/plc/service/OpcPlcService.java |  15 ++
 .../plc/service/impl/OpcPlcServiceImpl.java   |  38 +++
 .../service/impl/RouteLineServiceImpl.java    |   4 +
 .../task/service/impl/TaskServiceImpl.java    |   4 +
 .../nl/acs/udw/rest/UdwManagerController.java |  42 ++++
 .../src/main/java/org/nl/start/Init.java      |  21 --
 .../notice/impl/SysNoticeServiceImpl.java     |   8 +-
 .../src/main/resources/application.yml        | 120 ----------
 .../src/api/acs/history/acsDeviceErrorLog.js  |  27 +++
 acs/nladmin-ui/src/api/acs/history/udwData.js |  28 +++
 acs/nladmin-ui/src/api/system/dict.js         |  34 +++
 acs/nladmin-ui/src/api/system/param.js        |  35 +++
 acs/nladmin-ui/src/assets/icons/svg/clear.svg |   2 +
 .../src/assets/icons/svg/downAlign.svg        |   2 +
 .../src/assets/icons/svg/horizontalAlign.svg  |   2 +
 .../icons/svg/horizontalDistribution.svg      |   2 +
 .../src/assets/icons/svg/leftAlign.svg        |   2 +
 .../src/assets/icons/svg/rightAlign.svg       |   2 +
 acs/nladmin-ui/src/assets/icons/svg/save.svg  |   2 +
 .../src/assets/icons/svg/upAlign.svg          |   2 +
 .../src/assets/icons/svg/verticalAlign.svg    |   2 +
 .../assets/icons/svg/verticalDistribution.svg |   2 +
 .../src/views/acs/history/udwData/index.vue   | 181 ++++++++++++++
 .../src/views/monitor/lucene/api/lucene.js    |  18 ++
 .../src/views/monitor/lucene/index.vue        | 109 +++++++++
 .../src/views/monitor/lucene/search.vue       | 150 ++++++++++++
 .../src/views/monitor/lucene/time.vue         |  64 +++++
 .../logicflow/editor/components/Diagram.vue   |  34 +--
 .../editor/components/PropertyPanel.vue       | 111 ++++++---
 .../system/monitor/device/XJDeviceMonitor.vue | 223 ------------------
 .../src/views/system/monitor/device/index.vue |  23 +-
 .../src/views/tools/codeGen/codeDetail.vue    |   8 +-
 42 files changed, 1104 insertions(+), 629 deletions(-)
 create mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/udw/rest/UdwManagerController.java
 delete mode 100644 acs/nladmin-system/nlsso-server/src/main/java/org/nl/start/Init.java
 delete mode 100644 acs/nladmin-system/nlsso-server/src/main/resources/application.yml
 create mode 100644 acs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js
 create mode 100644 acs/nladmin-ui/src/api/acs/history/udwData.js
 create mode 100644 acs/nladmin-ui/src/api/system/dict.js
 create mode 100644 acs/nladmin-ui/src/api/system/param.js
 create mode 100644 acs/nladmin-ui/src/assets/icons/svg/clear.svg
 create mode 100644 acs/nladmin-ui/src/assets/icons/svg/downAlign.svg
 create mode 100644 acs/nladmin-ui/src/assets/icons/svg/horizontalAlign.svg
 create mode 100644 acs/nladmin-ui/src/assets/icons/svg/horizontalDistribution.svg
 create mode 100644 acs/nladmin-ui/src/assets/icons/svg/leftAlign.svg
 create mode 100644 acs/nladmin-ui/src/assets/icons/svg/rightAlign.svg
 create mode 100644 acs/nladmin-ui/src/assets/icons/svg/save.svg
 create mode 100644 acs/nladmin-ui/src/assets/icons/svg/upAlign.svg
 create mode 100644 acs/nladmin-ui/src/assets/icons/svg/verticalAlign.svg
 create mode 100644 acs/nladmin-ui/src/assets/icons/svg/verticalDistribution.svg
 create mode 100644 acs/nladmin-ui/src/views/acs/history/udwData/index.vue
 create mode 100644 acs/nladmin-ui/src/views/monitor/lucene/api/lucene.js
 create mode 100644 acs/nladmin-ui/src/views/monitor/lucene/index.vue
 create mode 100644 acs/nladmin-ui/src/views/monitor/lucene/search.vue
 create mode 100644 acs/nladmin-ui/src/views/monitor/lucene/time.vue
 delete mode 100644 acs/nladmin-ui/src/views/system/monitor/device/XJDeviceMonitor.vue

diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/initial/ApplicationAutoInitialExecuter.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/initial/ApplicationAutoInitialExecuter.java
index 61011f4..f596e49 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/initial/ApplicationAutoInitialExecuter.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/initial/ApplicationAutoInitialExecuter.java
@@ -10,6 +10,9 @@ import java.util.List;
 
 @Component
 public class ApplicationAutoInitialExecuter {
+    /**
+     * 获取所有实现ApplicationAutoInitial接口的bean对象
+     */
     @Autowired(required = false)
     List<ApplicationAutoInitial> applicationAutoInitial;
     //是否启动
@@ -25,7 +28,7 @@ public class ApplicationAutoInitialExecuter {
 
         while (it.hasNext()) {
             ApplicationAutoInitial service = (ApplicationAutoInitial) it.next();
-            service.autoInitial();
+            service.autoInitial(); // 执行实现的autoInitial方法
         }
 
 
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/AutoRunServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/AutoRunServiceImpl.java
index 9ef5d6c..27cae1f 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/AutoRunServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/AutoRunServiceImpl.java
@@ -13,15 +13,18 @@ import org.springframework.stereotype.Service;
 
 import java.util.*;
 
+/**
+ * 初始化启动线程
+ */
 @Service
 @Slf4j
 public class AutoRunServiceImpl implements AutoRunService, ApplicationAutoInitial {
     @Autowired(required = false)
     private List<AbstractAutoRunnable> abstractAutoRunnableList;
-    private List<String> autoRun_code_index = new ArrayList();
-    private List<Thread> threads = new ArrayList();
-    private List<AbstractAutoRunnable> thread_autoRun = new ArrayList();
-    private List<String> thread_code_index = new ArrayList();
+    private List<AbstractAutoRunnable> thread_autoRun = new ArrayList(); // 线程类
+    private List<String> autoRun_code_index = new ArrayList(); // key
+    private List<Thread> threads = new ArrayList(); // 运行线程
+    private List<String> thread_code_index = new ArrayList(); // key
 
     @Override
     public synchronized void startThread(String threadCode) {
@@ -172,8 +175,13 @@ public class AutoRunServiceImpl implements AutoRunService, ApplicationAutoInitia
                 : new LinkedList();
     }
 
+    /**
+     * 自动初始化线程
+     * @throws Exception
+     */
     @Override
     public void autoInitial() throws Exception {
+        // 获取所有的类型为AbstractAutoRunnable的bean
         List<AbstractAutoRunnable> list = this.getAllAutoThread();
         Iterator it = list.iterator();
 
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/impl/DeviceExtraServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/impl/DeviceExtraServiceImpl.java
index 996b88a..3cffe2f 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/impl/DeviceExtraServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/impl/DeviceExtraServiceImpl.java
@@ -237,7 +237,7 @@ public class DeviceExtraServiceImpl extends CommonServiceImpl<DeviceExtraMapper,
             dto.setDevice_code(json.getString("device_code"));
             dto.setDevice_id(device_id);
             dto.setExtra_name((String) key);
-            dto.setExtra_value(json.get(key).toString());
+            dto.setExtra_value(String.valueOf(json.get(key)));
             dto.setFiled_type("01");
             dto.setOrder_seq(new BigDecimal(0));
             this.create(dto);
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java
index 26cbfaf..8c77122 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/impl/DeviceServiceImpl.java
@@ -1776,6 +1776,9 @@ public class DeviceServiceImpl extends CommonServiceImpl<DeviceMapper, Device> i
         this.reload();
     }
 
+    /**
+     * 加载货位信息
+     */
     @Override
     public void reload() {
         this.storageCells = queryAllStorageCell();
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/mapper/DeviceMapper.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/mapper/DeviceMapper.java
index da34182..afa4464 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/mapper/DeviceMapper.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/service/mapper/DeviceMapper.java
@@ -17,10 +17,10 @@ public interface DeviceMapper extends CommonMapper<Device> {
     String queryDeviceSql = "SELECT d.*, dict.label AS device_type_name, dict2.label AS region_name " +
             "FROM " +
             "ACS_DEVICE d " +
-            "LEFT JOIN sys_dict_detail dict ON dict.value = d.device_type " +
-            "AND dict.`name` = 'device_type' " +
-            "LEFT JOIN sys_dict_detail dict2 ON dict2.value = d.region " +
-            "AND dict2.`name` = 'region_type' ";
+            "LEFT JOIN sys_dict dict ON dict.value = d.device_type " +
+            "AND dict.`code` = 'device_type' " +
+            "LEFT JOIN sys_dict dict2 ON dict2.value = d.region " +
+            "AND dict2.`code` = 'region_type' ";
     String wrapperDeviceSql =  queryDeviceSql + " ${ew.customSqlSegment}";
 
     /**
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java
index 2198412..450fb52 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java
@@ -159,6 +159,9 @@ public class InstructionServiceImpl extends CommonServiceImpl<InstructionMapper,
         }
     }*/
 
+    /**
+     * 加载指令数据
+     */
     @Override
     public void autoInitial() {
         this.reload();
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceAppServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceAppServiceImpl.java
index b64a2c6..28519b9 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceAppServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceAppServiceImpl.java
@@ -20,8 +20,8 @@ import java.util.*;
 @Slf4j
 @Service
 public class DeviceAppServiceImpl implements DeviceAppService, ApplicationAutoInitial {
-    private List<Device> devices = new ArrayList();
-    private List<String> code_indexs = new ArrayList();
+    private List<Device> devices = new ArrayList(); // 所有设备链表
+    private List<String> code_indexs = new ArrayList(); // 设备对应的下表
     @Autowired
     private DeviceManageService deviceManageService;
     @Autowired
@@ -315,7 +315,7 @@ public class DeviceAppServiceImpl implements DeviceAppService, ApplicationAutoIn
     }
 
     public synchronized void reload() {
-        List<DeviceManageDto> deviceManageDtos = this.deviceManageService.queryAllWithExtra();
+        List<DeviceManageDto> deviceManageDtos = deviceManageService.queryAllWithExtra();
         this.devices = new ArrayList();
         Collections.synchronizedList(this.devices);
         this.code_indexs = new ArrayList();
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceManageServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceManageServiceImpl.java
index 3d40ba7..4505b3d 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceManageServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/DeviceManageServiceImpl.java
@@ -42,13 +42,16 @@ public class DeviceManageServiceImpl implements DeviceManageService {
     @Override
     public List<DeviceManageDto> queryAllWithExtra() {
 //        JSONArray arr = WQLObject.getWQLObject("acs_device").query().getResultJSONArray(0);
+        // 获取所有的设备
         List<Device> deviceList= new LambdaQueryChainWrapper<>(deviceMapper).list();
         JSONArray arr = JSONArray.parseArray(JSON.toJSONString(deviceList));
 
+        // 获取列表扩展
 //        JSONArray extArr = WQLObject.getWQLObject("acs_device_extra").query().getResultJSONArray(0);
         List<DeviceExtra> deviceExtraList= new LambdaQueryChainWrapper<>(deviceExtraMapper).list();
         JSONArray extArr = JSONArray.parseArray(JSON.toJSONString(deviceExtraList));
 
+        // 设备+扩展DTO
         List<DeviceExtraManageDto> extras = extArr.toJavaList(DeviceExtraManageDto.class);
 
 //        WQLObject runpointTab = WQLObject.getWQLObject("acs_device_runpoint");
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java
index f9875aa..8695fbe 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/opc/OpcServerServiceImpl.java
@@ -30,127 +30,131 @@ import java.util.Map;
 @Service
 public class OpcServerServiceImpl implements OpcServerService, ApplicationAutoInitial {
 
-  private static final Logger log = LoggerFactory.getLogger(OpcServerServiceImpl.class);
-  @Autowired OpcServerManageService opcServerManageService;
-  Map<String, OpcServerManageDto> opcServerManageDtos = new HashMap();
-  Map<String, Server> servers = Collections.synchronizedMap(new HashMap());
-  Map<String, Group> groups = Collections.synchronizedMap(new HashMap());
-
-  public OpcServerServiceImpl() {}
-
-  public void autoInitial() throws Exception {
-    this.reload();
-    if (OpcConfig.auto_start_opc) {
-      Thread t =
-          new Thread() {
-            public void run() {
-              Iterator var1 = OpcServerServiceImpl.this.opcServerManageDtos.values().iterator();
-
-              while (var1.hasNext()) {
-                OpcServerManageDto dto = (OpcServerManageDto) var1.next();
-
-                try {
-                  OpcServerServiceImpl.this.getServer(dto.getOpc_code());
-                  OpcServerServiceImpl.log.info("加载opc server {}", dto.getOpc_code());
-                } catch (Exception var4) {
-                  OpcServerServiceImpl.log.warn("启动无法载入servers", var4);
-                }
-              }
-            }
-          };
-      t.start();
+    private static final Logger log = LoggerFactory.getLogger(OpcServerServiceImpl.class);
+    @Autowired
+    OpcServerManageService opcServerManageService;
+    Map<String, OpcServerManageDto> opcServerManageDtos = new HashMap();
+    Map<String, Server> servers = Collections.synchronizedMap(new HashMap());
+    Map<String, Group> groups = Collections.synchronizedMap(new HashMap());
+
+    public OpcServerServiceImpl() {
     }
-  }
-
-  public synchronized void reload() {
-    this.opcServerManageDtos = this.opcServerManageService.queryAllServerMap();
-    this.opcServerManageDtos = Collections.synchronizedMap(this.opcServerManageDtos);
-  }
-
-  public synchronized Group getServer(String code) {
-    Group group = null;
-    group = (Group) this.groups.get(code);
-    if (group != null) {
-      try {
-        if (group.isActive()) {
-          return group;
+
+    /**
+     * 加载opc服务,启动opc线程
+     * @throws Exception
+     */
+    public void autoInitial() throws Exception {
+        this.reload(); // 加载opc服务
+        if (OpcConfig.auto_start_opc) {
+            Thread t =
+                    new Thread(() -> {
+                        Iterator var1 = OpcServerServiceImpl.this.opcServerManageDtos.values().iterator();
+
+                        while (var1.hasNext()) {
+                            OpcServerManageDto dto = (OpcServerManageDto) var1.next();
+
+                            try {
+                                OpcServerServiceImpl.this.getServer(dto.getOpc_code());
+                                OpcServerServiceImpl.log.info("加载opc server {}", dto.getOpc_code());
+                            } catch (Exception var4) {
+                                OpcServerServiceImpl.log.warn("启动无法载入servers", var4);
+                            }
+                        }
+                    });
+            t.start();
         }
-      } catch (JIException var9) {
-        var9.printStackTrace();
-      }
     }
 
-    Server server = (Server) this.servers.get(code);
-    boolean needcreate = false;
-    if (server == null) {
-      needcreate = true;
-    } else {
-      try {
-        group = server.findGroup(OpcConfig.opc_server_default_group);
-      } catch (UnknownHostException
-          | JIException
-          | UnknownGroupException
-          | NotConnectedException
-          | IllegalArgumentException var8) {
-        var8.printStackTrace();
-        needcreate = true;
-      }
+    public synchronized void reload() {
+        this.opcServerManageDtos = this.opcServerManageService.queryAllServerMap();
+        this.opcServerManageDtos = Collections.synchronizedMap(this.opcServerManageDtos);
     }
 
-    if (needcreate) {
-      OpcServerManageDto dto = (OpcServerManageDto) this.opcServerManageDtos.get(code);
-      if (dto == null) {
-        throw new BadRequestException("code 不存在");
-      }
+    public synchronized Group getServer(String code) {
+        Group group = null;
+        group = (Group) this.groups.get(code);
+        if (group != null) {
+            try {
+                if (group.isActive()) {
+                    return group;
+                }
+            } catch (JIException var9) {
+                var9.printStackTrace();
+            }
+        }
 
-      server = OpcServerUtl.getServerWithOutException(
-              dto.getOpc_host(),
-              dto.getCls_id(),
-              dto.getUser(),
-              dto.getPassword(),
-              dto.getDomain());
+        Server server = (Server) this.servers.get(code);
+        boolean needcreate = false;
+        if (server == null) {
+            needcreate = true;
+        } else {
+            try {
+                group = server.findGroup(OpcConfig.opc_server_default_group);
+            } catch (UnknownHostException
+                     | JIException
+                     | UnknownGroupException
+                     | NotConnectedException
+                     | IllegalArgumentException var8) {
+                var8.printStackTrace();
+                needcreate = true;
+            }
+        }
+
+        if (needcreate) {
+            OpcServerManageDto dto = (OpcServerManageDto) this.opcServerManageDtos.get(code);
+            if (dto == null) {
+                throw new BadRequestException("code 不存在");
+            }
+
+            server = OpcServerUtl.getServerWithOutException(
+                    dto.getOpc_host(),
+                    dto.getCls_id(),
+                    dto.getUser(),
+                    dto.getPassword(),
+                    dto.getDomain());
 
 //      server = OpcServerUtl.getServerWithOutException(this.OpcServer.getOpc_host(), this.OpcServer.getCls_id(), this.OpcServer.getUser(), this.OpcServer.getPassword(), this.OpcServer.getDomain());
 
 
-      try {
-        group = server.addGroup(OpcConfig.opc_server_default_group);
-      } catch (Exception var7) {
-        throw new BadRequestException(var7.toString());
-      }
+            try {
+                group = server.addGroup(OpcConfig.opc_server_default_group);
+            } catch (Exception var7) {
+                throw new BadRequestException(var7.toString());
+            }
+
+            this.servers.put(code, server);
+            this.groups.put(code, group);
+        }
 
-      this.servers.put(code, server);
-      this.groups.put(code, group);
+        return group;
     }
 
-    return group;
-  }
+    public synchronized void clearServer(String code) {
+        try {
+            Server server = (Server) this.servers.get(code);
+            if (server != null) {
+                server.disconnect();
+            }
 
-  public synchronized void clearServer(String code) {
-    try {
-      Server server = (Server) this.servers.get(code);
-      if (server!=null){
-        server.disconnect();
-      }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("清理server异常,", e.getMessage());
+        }
 
-    } catch (Exception e) {
-      e.printStackTrace();
-      log.error("清理server异常,",e.getMessage());
+        this.servers.remove(code);
+        this.groups.remove(code);
     }
 
-    this.servers.remove(code);
-    this.groups.remove(code);
-  }
-
-  public void writeInteger(String code, ItemValue... values) {
-    try {
-      Group group = this.getServer(code);
-      OpcUtl.writeValue(group, values);
-    } catch (Exception var4) {
-      this.clearServer(code);
-      log.warn("写入出错opc server {} 重新加载", code, var4);
-      ThreadUtl.sleep(5000L);
-      throw var4;
+    public void writeInteger(String code, ItemValue... values) {
+        try {
+            Group group = this.getServer(code);
+            OpcUtl.writeValue(group, values);
+        } catch (Exception var4) {
+            this.clearServer(code);
+            log.warn("写入出错opc server {} 重新加载", code, var4);
+            ThreadUtl.sleep(5000L);
+            throw var4;
+        }
     }
-  }
 }
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/rest/OpcPlcController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/rest/OpcPlcController.java
index 224a18f..638a1d5 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/rest/OpcPlcController.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/rest/OpcPlcController.java
@@ -1,71 +1,87 @@
-//package org.nl.acs.plc.rest;
-//
-//import org.nl.common.logging.annotation.Log;
-//import org.nl.acs.plc.service.OpcPlcService;
-//import org.nl.acs.opc.service.dto.OpcPlcDto;
-//import org.nl.acs.opc.service.dto.OpcPlcQueryParam;
-//import org.springframework.data.domain.Pageable;
-//import lombok.RequiredArgsConstructor;
-//import org.springframework.http.HttpStatus;
-//import org.springframework.http.ResponseEntity;
-//import org.springframework.validation.annotation.Validated;
-//import org.springframework.web.bind.annotation.*;
-//import io.swagger.annotations.*;
-//import java.util.Set;
-//
-///**
-//* @author jiaolm
-//* @date 2023-05-09
-//**/
-//@RestController
-//@RequiredArgsConstructor
-//@Api(tags = "plc服务管理")
-//@RequestMapping("/api/opcPlc")
-//public class OpcPlcController {
-//
-//    private final OpcPlcService opcPlcService;
-//
-//    @GetMapping
-//    @Log("查询plc服务")
-//    @ApiOperation("查询plc服务")
-//    //@PreAuthorize("@el.check('opcPlc:list')")
-//    public ResponseEntity query(OpcPlcQueryParam query, Pageable pageable){
-//        return new ResponseEntity<>(opcPlcService.queryAll(query,pageable),HttpStatus.OK);
-//    }
-//
-//    @PostMapping
-//    @Log("新增plc服务")
-//    @ApiOperation("新增plc服务")
-//    //@PreAuthorize("@el.check('opcPlc:add')")
-//    public ResponseEntity create(@Validated @RequestBody OpcPlcDto resources){
-//        return new ResponseEntity<>(opcPlcService.insert(resources),HttpStatus.CREATED);
-//    }
-//
-//    @PutMapping
-//    @Log("修改plc服务")
-//    @ApiOperation("修改plc服务")
-//    //@PreAuthorize("@el.check('opcPlc:edit')")
-//    public ResponseEntity update(@Validated @RequestBody OpcPlcDto resources){
-//        opcPlcService.updateById(resources);
-//        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
-//    }
-//
-//    @DeleteMapping
-//    @Log("删除plc服务")
-//    @ApiOperation("删除plc服务")
-//    //@PreAuthorize("@el.check('opcPlc:del')")
-//    public ResponseEntity delete(@RequestBody Set<String> ids) {
-//        opcPlcService.removeByIds(ids);
-//        return new ResponseEntity<>(HttpStatus.OK);
-//    }
-//
-//    /*
-//    @Log("导出plc服务")
-//    @ApiOperation("导出plc服务")
-//    @GetMapping(value = "/download")
-//    //@PreAuthorize("@el.check('opcPlc:list')")
-//    public void download(HttpServletResponse response, OpcPlcQueryParam query) throws IOException {
-//        opcPlcService.download(opcPlcService.queryAll(query), response);
-//    }*/
-//
-//}
+package org.nl.acs.plc.rest;
+
+import org.nl.common.logging.annotation.Log;
+import org.nl.acs.plc.service.OpcPlcService;
+import org.nl.acs.opc.service.dto.OpcPlcDto;
+import org.nl.acs.opc.service.dto.OpcPlcQueryParam;
+import org.springframework.data.domain.Pageable;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.*;
+import java.util.Set;
+
+/**
+* @author jiaolm
+* @date 2023-05-09
+**/
+@RestController
+@RequiredArgsConstructor
+@Api(tags = "plc服务管理")
+@RequestMapping("/api/opcPlc")
+public class OpcPlcController {
+
+    private final OpcPlcService opcPlcService;
+
+    @GetMapping
+    @Log("查询plc服务")
+    @ApiOperation("查询plc服务")
+    //@PreAuthorize("@el.check('opcPlc:list')")
+    public ResponseEntity query(OpcPlcQueryParam query, Pageable pageable){
+        return new ResponseEntity<>(opcPlcService.queryAll(query,pageable),HttpStatus.OK);
+    }
+
+    @PostMapping
+    @Log("新增plc服务")
+    @ApiOperation("新增plc服务")
+    //@PreAuthorize("@el.check('opcPlc:add')")
+    public ResponseEntity create(@Validated @RequestBody OpcPlcDto resources){
+        return new ResponseEntity<>(opcPlcService.insert(resources),HttpStatus.CREATED);
+    }
+
+    @PutMapping
+    @Log("修改plc服务")
+    @ApiOperation("修改plc服务")
+    //@PreAuthorize("@el.check('opcPlc:edit')")
+    public ResponseEntity update(@Validated @RequestBody OpcPlcDto resources){
+        opcPlcService.updateById(resources);
+        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
+    }
+
+    @DeleteMapping
+    @Log("删除plc服务")
+    @ApiOperation("删除plc服务")
+    //@PreAuthorize("@el.check('opcPlc:del')")
+    public ResponseEntity delete(@RequestBody Set<String> ids) {
+        opcPlcService.removeByIds(ids);
+        return new ResponseEntity<>(HttpStatus.OK);
+    }
+
+    @GetMapping("/selectList")
+    @Log("下拉选PLC")
+    @ApiOperation("下拉选PLC")
+    //@PreAuthorize("@el.check('routePlan:list')")
+    public ResponseEntity<Object> selectList() {
+        return new ResponseEntity<>(opcPlcService.selectList(), HttpStatus.OK);
+    }
+
+    @GetMapping("/selectList/{opc_uuid}")
+    @Log("下拉选PLC")
+    @ApiOperation("下拉选PLC")
+    //@PreAuthorize("@el.check('routePlan:list')")
+    public ResponseEntity<Object> selectListByOpcID(@PathVariable String opc_uuid) {
+        return new ResponseEntity<>(opcPlcService.selectListByOpcID(opc_uuid), HttpStatus.OK);
+    }
+
+    /*
+    @Log("导出plc服务")
+    @ApiOperation("导出plc服务")
+    @GetMapping(value = "/download")
+    //@PreAuthorize("@el.check('opcPlc:list')")
+    public void download(HttpServletResponse response, OpcPlcQueryParam query) throws IOException {
+        opcPlcService.download(opcPlcService.queryAll(query), response);
+    }*/
+
+}
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/service/OpcPlcService.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/service/OpcPlcService.java
index 7771e69..049a6b3 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/service/OpcPlcService.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/service/OpcPlcService.java
@@ -1,5 +1,6 @@
 package org.nl.acs.plc.service;
 
+import com.alibaba.fastjson.JSONArray;
 import org.nl.acs.common.base.PageInfo;
 import org.nl.acs.common.base.CommonService;
 import org.nl.acs.opc.domain.OpcPlc;
@@ -50,4 +51,18 @@ public interface OpcPlcService extends CommonService<OpcPlc>  {
     * @throws IOException /
     */
     // void download(List<OpcPlcDto> all, HttpServletResponse response) throws IOException;
+
+    /**
+     * 前端PLC下拉选列表
+     *
+     * @return
+     */
+    List<OpcPlc> selectList();
+
+    /**
+     * 根据OPC标识得到前端PLC下拉选列表
+     *
+     * @return
+     */
+    List<OpcPlc>  selectListByOpcID(String opc_uuid);
 }
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/service/impl/OpcPlcServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/service/impl/OpcPlcServiceImpl.java
index 25b2270..71b1854 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/service/impl/OpcPlcServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/plc/service/impl/OpcPlcServiceImpl.java
@@ -1,5 +1,8 @@
 package org.nl.acs.plc.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import lombok.AllArgsConstructor;
 import org.nl.acs.common.base.PageInfo;
@@ -12,6 +15,7 @@ import org.nl.acs.plc.service.OpcPlcService;
 import org.nl.acs.opc.service.dto.OpcPlcDto;
 import org.nl.acs.opc.service.dto.OpcPlcQueryParam;
 import org.nl.acs.opc.service.mapper.OpcPlcMapper;
+import org.nl.system.service.logicflow.dao.StageImage;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -89,6 +93,40 @@ public class OpcPlcServiceImpl extends CommonServiceImpl<OpcPlcMapper, OpcPlc> i
         return this.removeByIds(set);
     }
 
+    @Override
+    public List<OpcPlc> selectList() {
+        List<OpcPlc> lists = opcPlcMapper.selectList(new LambdaQueryWrapper<OpcPlc>()
+                .eq(OpcPlc::getIs_delete, "0")
+                .eq(OpcPlc::getIs_active, "1")
+                .orderByDesc(OpcPlc::getUpdate_time));
+        return lists;
+    }
+
+    @Override
+    public List<OpcPlc> selectListByOpcID(String opc_uuid) {
+        //OPC_PLC表【acs_opc_plc】
+//        JSONArray arr = WQLObject.getWQLObject("acs_opc_plc").query("is_delete= '0' AND is_active= '1' and opc_server_id = '" + opc_uuid + "'").getResultJSONArray(0);
+//        JSONArray result = new JSONArray();
+//        for (int i = 0; i < arr.size(); i++) {
+//            JSONObject obj = arr.getJSONObject(i);
+//            JSONObject json = new JSONObject();
+//            json.put("plc_id", obj.getString("plc_id"));
+//            json.put("plc_code", obj.getString("plc_code"));
+//            json.put("plc_name", obj.getString("plc_name"));
+//            result.add(json);
+//        }
+//        return result;
+
+        List<OpcPlc> lists = opcPlcMapper.selectList(new LambdaQueryWrapper<OpcPlc>()
+                .eq(OpcPlc::getIs_delete, "0")
+                .eq(OpcPlc::getIs_active, "1")
+                .eq(OpcPlc::getOpc_server_id, opc_uuid)
+                .orderByDesc(OpcPlc::getUpdate_time));
+        return lists;
+
+    }
+
+
     /*
     private void delCaches(String id) {
         redisUtils.delByKey(CACHE_KEY + "::id:", id);
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/route/service/impl/RouteLineServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/route/service/impl/RouteLineServiceImpl.java
index 7a9b601..5ae3c19 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/route/service/impl/RouteLineServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/route/service/impl/RouteLineServiceImpl.java
@@ -514,6 +514,10 @@ public class RouteLineServiceImpl extends CommonServiceImpl<RouteLineMapper, Rou
         return false;
     }
 
+    /**
+     * 加载路由路线
+     * @throws SQLException
+     */
     @Override
     public void reload() throws SQLException {
         Object[] param = new Object[0];
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java
index 0976806..b304e06 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java
@@ -246,6 +246,10 @@ public class TaskServiceImpl extends CommonServiceImpl<TaskMapper, Task> impleme
       FileUtil.downloadExcel(list, response);
     }*/
 
+    /**
+     * 获取未完成任务
+     * @throws Exception
+     */
     @Override
     public void autoInitial() throws Exception {
         Class var1 = TaskInstructionLock.class;
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/udw/rest/UdwManagerController.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/udw/rest/UdwManagerController.java
new file mode 100644
index 0000000..6f8517c
--- /dev/null
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/acs/udw/rest/UdwManagerController.java
@@ -0,0 +1,42 @@
+
+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.*;
+
+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<Object> query(@RequestParam JSONObject whereJson) {
+//        return new ResponseEntity<>(udwManageService.queryByConditions(whereJson), HttpStatus.OK);
+//    }
+
+    @GetMapping
+    @ApiOperation("查询内存点位")
+    @SaIgnore
+    //@PreAuthorize("@el.check('device:list')")
+    public ResponseEntity<Object> query(@RequestParam Map whereJson, Pageable page) {
+        return new ResponseEntity<>(udwManageService.queryAll(whereJson, page), HttpStatus.OK);
+    }
+}
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/start/Init.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/start/Init.java
deleted file mode 100644
index c98e6cc..0000000
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/start/Init.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.nl.start;
-
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.stereotype.Component;
-
-/**
- * 随项目启动模块
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class Init implements ApplicationRunner {
-
-    @Override
-    public void run(ApplicationArguments args) throws Exception {
-        System.out.println("项目启动成功!");
-    }
-}
diff --git a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java
index f41f485..5e851a7 100644
--- a/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java
+++ b/acs/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/notice/impl/SysNoticeServiceImpl.java
@@ -157,10 +157,12 @@ public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice
     public void createNotice(String msg, String title, String type) {
         log.info("创建消息通知-信息:{}, 标题:{}, 类型:{}", msg, title, type);
         // 获取标题相同的信息
-        List<SysNotice> sysNotices = sysNoticeMapper.selectList(new LambdaQueryWrapper<SysNotice>().eq(SysNotice::getNotice_title, title));
+        List<SysNotice> sysNotices = sysNoticeMapper.selectList(new LambdaQueryWrapper<SysNotice>()
+                .eq(SysNotice::getNotice_title, title)
+                .eq(SysNotice::getHave_read, NoticeEnum.HAVE_READ_OFF.getValue()));
         if (ObjectUtil.isNotEmpty(sysNotices)) return;
         SysNotice noticeDto = SysNotice.builder()
-                .notice_id(IdUtil.getSnowflake(1,1).nextIdStr())
+                .notice_id(IdUtil.getSnowflake(1, 1).nextIdStr())
                 .notice_type(type)
                 .notice_title(title)
                 .notice_content(msg)
@@ -180,4 +182,6 @@ public class SysNoticeServiceImpl extends ServiceImpl<SysNoticeMapper, SysNotice
         }
     }
 
+
+
 }
diff --git a/acs/nladmin-system/nlsso-server/src/main/resources/application.yml b/acs/nladmin-system/nlsso-server/src/main/resources/application.yml
deleted file mode 100644
index df46a2c..0000000
--- a/acs/nladmin-system/nlsso-server/src/main/resources/application.yml
+++ /dev/null
@@ -1,120 +0,0 @@
-# 端口
-server:
-    port: 9000
-
-# Sa-Token 配置
-sa-token:
-    # ------- SSO-模式一相关配置  (非模式一不需要配置)
-
-#          配置 Cookie 作用域
-
-#     ------- SSO-模式二相关配置
-    sso:
-        # Ticket有效期 (单位: 秒),默认五分钟
-        ticket-timeout: 300
-        # 所有允许的授权回调地址比较重要
-        allow-url: "*"
-        # 是否打开单点注销功能
-        is-slo: true
-        # ------- SSO-模式三相关配置 (下面的配置在SSO模式三并且 is-slo=true 时打开)
-#        # 是否打开模式三
-        isHttp: true
-#        # 接口调用秘钥(用于SSO模式三的单点注销功能)
-        secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
-    token-name: EL-ADMIN-TOEKN
-#        # ---- 除了以上配置项,你还需要为 Sa-Token 配置http请求处理器(文档有步骤说明)
-#
-spring:
-    #配置 Jpa
-    jpa:
-        hibernate:
-            ddl-auto: none
-        open-in-view: true
-        properties:
-            hibernate:
-                dialect: org.hibernate.dialect.MySQL5InnoDBDialect
-                enable_lazy_load_no_trans: true
-        # 数据源
-    datasource:
-        druid:
-            db-type: com.alibaba.druid.pool.DruidDataSource
-            driverClassName: com.mysql.cj.jdbc.Driver
-            #      url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:whxr_test}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
-            url: jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:whxr}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
-            username: ${DB_USER:root}
-            password: ${DB_PWD:P@ssw0rd}
-            #      username: ${DB_USER:root}
-            #      password: ${DB_PWD:root}
-            # 初始连接数
-            initial-size: 5
-            # 最小连接数
-            min-idle: 15
-            # 最大连接数
-            max-active: 30
-            # 是否自动回收超时连接
-            remove-abandoned: true
-            # 超时时间(以秒数为单位)
-            remove-abandoned-timeout: 180
-            # 获取连接超时时间
-            max-wait: 300
-            # 连接有效性检测时间
-            time-between-eviction-runs-millis: 60000
-            # 连接在池中最小生存的时间
-            min-evictable-idle-time-millis: 300000
-            # 连接在池中最大生存的时间
-            max-evictable-idle-time-millis: 900000
-            # 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除
-            test-while-idle: true
-            # 指明是否在从池中取出连接前进行检验,如果检验失败, 则从池中去除连接并尝试取出另一个
-            test-on-borrow: true
-            # 是否在归还到池中前进行检验
-            test-on-return: false
-            # 检测连接是否有效
-            validation-query: select 1
-            # 配置监控统计
-#            webStatFilter:
-#                enabled: true
-#            stat-view-servlet:
-#                enabled: true
-#                url-pattern: /druid/*
-#                reset-enable: false
-#            filter:
-#                stat:
-#                    enabled: true
-#                    # 记录慢SQL
-#                    log-slow-sql: true
-#                    slow-sql-millis: 1000
-#                    merge-sql: true
-#                wall:
-#                    config:
-#                        multi-statement-allow: true
-
-    # Redis配置 (SSO模式一和模式二使用Redis来同步会话)
-    redis:
-        # Redis数据库索引(默认为0)
-        database: 1
-        # Redis服务器地址
-        host: 47.96.133.178
-        # Redis服务器连接端口
-        port: 6479
-        # Redis服务器连接密码(默认为空)
-        password: 942464Yy
-        # 连接超时时间
-        timeout: 10s
-        lettuce:
-            pool:
-                # 连接池最大连接数
-                max-active: 200
-                # 连接池最大阻塞等待时间(使用负值表示没有限制)
-                max-wait: -1ms
-                # 连接池中的最大空闲连接
-                max-idle: 10
-                # 连接池中的最小空闲连接
-                min-idle: 0
-
-forest:
-    # 关闭 forest 请求日志打印
-    log-enabled: false
-
-
-
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/api/system/dict.js b/acs/nladmin-ui/src/api/system/dict.js
new file mode 100644
index 0000000..99170f7
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/dict.js
@@ -0,0 +1,34 @@
+import request from '@/utils/request'
+
+export function getDicts() {
+  return request({
+    url: 'api/dict/all',
+    method: 'get'
+  })
+}
+
+export function add(data) {
+  return request({
+    url: 'api/dict',
+    method: 'post',
+    data
+  })
+}
+
+export function del(ids) {
+  return request({
+    url: 'api/dict/',
+    method: 'delete',
+    data: ids
+  })
+}
+
+export function edit(data) {
+  return request({
+    url: 'api/dict',
+    method: 'put',
+    data
+  })
+}
+
+export default { add, edit, del }
diff --git a/acs/nladmin-ui/src/api/system/param.js b/acs/nladmin-ui/src/api/system/param.js
new file mode 100644
index 0000000..c2ded22
--- /dev/null
+++ b/acs/nladmin-ui/src/api/system/param.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+export function add(data) {
+  return request({
+    url: 'api/param',
+    method: 'post',
+    data
+  })
+}
+
+export function del(ids) {
+  return request({
+    url: 'api/param/',
+    method: 'delete',
+    data: ids
+  })
+}
+
+export function edit(data) {
+  return request({
+    url: 'api/param',
+    method: 'put',
+    data
+  })
+}
+
+export function getValueByCode(code) {
+  return request({
+    url: 'api/param/getValueByCode',
+    method: 'post',
+    data: code
+  })
+}
+
+export default { add, edit, del, getValueByCode }
diff --git a/acs/nladmin-ui/src/assets/icons/svg/clear.svg b/acs/nladmin-ui/src/assets/icons/svg/clear.svg
new file mode 100644
index 0000000..add284f
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/clear.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1660786702479" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9117" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M736 128l-32-64H320l-32 64H128v128h768V128H736zM192 896a64 64 0 0 0 64 64h512a64 64 0 0 0 64-64V320H192z" p-id="9118" fill="#000000"></path></svg>
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/downAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/downAlign.svg
new file mode 100644
index 0000000..d02dce2
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/downAlign.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1660785745738" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4619" width="200" height="200" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M64 896h896v64H64z" fill="#000000" p-id="4620"></path><path d="M192 832V64h256v768z" fill="#000000" p-id="4621"></path><path d="M576 832V320h256v512z" fill="#000000" p-id="4622"></path></svg>
diff --git a/acs/nladmin-ui/src/assets/icons/svg/horizontalAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/horizontalAlign.svg
new file mode 100644
index 0000000..ed79e1a
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/horizontalAlign.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1660787363495" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11210" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M64 480h896v64H64z" fill="#000000" p-id="11211"></path><path d="M832 256v512H576V256z" fill="#000000" p-id="11212"></path><path d="M448 128v768H192V128z" fill="#000000" p-id="11213"></path></svg>
\ No newline at end of file
diff --git a/acs/nladmin-ui/src/assets/icons/svg/horizontalDistribution.svg b/acs/nladmin-ui/src/assets/icons/svg/horizontalDistribution.svg
new file mode 100644
index 0000000..b4af40e
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/horizontalDistribution.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1660786338362" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6924" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M768 938.666667V85.333333h59.733333v853.333334zM196.266667 938.666667V85.333333H256v853.333334z m251.733333-128A64 64 0 0 1 384 746.666667v-469.333334A64 64 0 0 1 448 213.333333h128A64 64 0 0 1 640 277.333333v469.333334a64 64 0 0 1-64 64z" p-id="6925" fill="#000000"></path></svg>
diff --git a/acs/nladmin-ui/src/assets/icons/svg/leftAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/leftAlign.svg
new file mode 100644
index 0000000..b373ac3
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/leftAlign.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1660785822800" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5157" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M64 64h64v896H64z" fill="#000000" p-id="5158"></path><path d="M192 192h515v256H192z" fill="#000000" p-id="5159"></path><path d="M192 576h768v256H192z" fill="#000000" p-id="5160"></path></svg>
diff --git a/acs/nladmin-ui/src/assets/icons/svg/rightAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/rightAlign.svg
new file mode 100644
index 0000000..b0670ba
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/rightAlign.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1660785927475" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5880" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M896 64h64v896h-64z" fill="#000000" p-id="5881"></path><path d="M320 192h512v256H320z" fill="#000000" p-id="5882"></path><path d="M64 576h768v256H64z" fill="#000000" p-id="5883"></path></svg>
diff --git a/acs/nladmin-ui/src/assets/icons/svg/save.svg b/acs/nladmin-ui/src/assets/icons/svg/save.svg
new file mode 100644
index 0000000..e9e05e3
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/save.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1660786920066" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10198" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M643.85952427 262.90530987c-18.01693867 0-32.75707733 14.614528-32.75707734 32.48401066v81.20456534c0 17.86948267 14.74013867 32.489472 32.75707734 32.489472s32.75707733-14.61998933 32.75707733-32.489472v-81.20456534c0-17.86948267-14.74013867-32.48401067-32.75707733-32.48401066z" fill="#2c2c2c" p-id="10199"></path><path d="M910.47417173 313.84644267l-145.784832-207.89111467c-13.09627733-17.86948267-34.39547733-29.23451733-58.966016-30.86199467H175.01825707c-36.03933867 0-65.519616 29.23451733-65.519616 64.96802134v745.49930666c0 35.733504 29.48027733 63.34600533 65.519616 63.34600534h689.586176c36.03933867 0 63.88667733-29.23997867 63.88667733-63.34600534v-526.23223466c1.6384-17.86948267-6.54813867-34.111488-18.01693867-45.481984zM205.0555904 171.87908267h517.59786667v220.889088c0 30.85653333-26.2144 58.46903467-58.966016 58.46903466H264.0216064c-32.76253867 0-58.966016-25.985024-58.966016-58.46903466V171.87908267z m544.25572693 665.059328h-462.60770133c-24.6382592 0-44.61253973-20.29431467-44.61253973-45.32906667s19.97318827-45.32906667 44.61253973-45.32906667h462.60770133c24.6382592 0 44.61253973 20.29431467 44.61253974 45.32906667s-19.97428053 45.32906667-44.61253974 45.32906667z m0.00109227-167.10587734H286.70252373c-24.6382592 0-44.61253973-20.29431467-44.61253973-45.32906666s19.97318827-45.32906667 44.61253973-45.32906667h462.61097814c24.6382592 0 44.61253973 20.29431467 44.61253973 45.32906667s-19.97428053 45.32906667-44.613632 45.32906666z" fill="#000000" p-id="10200"></path></svg>
diff --git a/acs/nladmin-ui/src/assets/icons/svg/upAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/upAlign.svg
new file mode 100644
index 0000000..29645dd
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/upAlign.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1660785897716" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5639" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M64 64h896v64H64z" fill="#000000" p-id="5640"></path><path d="M192 960V192h256v768z" fill="#000000" p-id="5641"></path><path d="M576 704V192h256v512z" fill="#000000" p-id="5642"></path></svg>
diff --git a/acs/nladmin-ui/src/assets/icons/svg/verticalAlign.svg b/acs/nladmin-ui/src/assets/icons/svg/verticalAlign.svg
new file mode 100644
index 0000000..a3646a0
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/verticalAlign.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1660785982322" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6318" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M480 64h64v896h-64z" fill="#000000" p-id="6319"></path><path d="M256 192h512v256H256z" fill="#000000" p-id="6320"></path><path d="M128 576h768v256H128z" fill="#000000" p-id="6321"></path></svg>
diff --git a/acs/nladmin-ui/src/assets/icons/svg/verticalDistribution.svg b/acs/nladmin-ui/src/assets/icons/svg/verticalDistribution.svg
new file mode 100644
index 0000000..e628a9e
--- /dev/null
+++ b/acs/nladmin-ui/src/assets/icons/svg/verticalDistribution.svg
@@ -0,0 +1,2 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1660786309837" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6643" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css">@font-face { font-family: feedback-iconfont; src: url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff2?t=1630033759944") format("woff2"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.woff?t=1630033759944") format("woff"), url("//at.alicdn.com/t/font_1031158_u69w8yhxdu.ttf?t=1630033759944") format("truetype"); }
+</style></defs><path d="M85.333333 827.733333V768h853.333334v59.733333zM277.333333 640A64 64 0 0 1 213.333333 576v-128A64 64 0 0 1 277.333333 384h469.333334a64 64 0 0 1 64 64v128a64 64 0 0 1-64 64zM85.333333 256V196.266667h853.333334V256z" p-id="6644" fill="#000000"></path></svg>
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..aa6668d
--- /dev/null
+++ b/acs/nladmin-ui/src/views/acs/history/udwData/index.vue
@@ -0,0 +1,181 @@
+<template>
+  <div class="app-container">
+    <!--工具栏-->
+    <div class="head-container">
+      <div v-if="crud.props.searchToggle">
+        <!-- 搜索 -->
+        <el-select
+          v-model="form.unified_key"
+          placeholder="unified_key"
+          class="filter-item"
+          clearable
+          filterable
+          size="small"
+          @change="crud.toQuery"
+        >
+          <el-option v-for="(item,index) in unified_key" :key="index" :label="item.label" :value="item.value" />
+        </el-select>
+        <el-input
+          v-model="query.code"
+          size="small"
+          clearable
+          placeholder="编号"
+          style="width: 200px;"
+          class="filter-item"
+          @keyup.enter.native="crud.toQuery"
+        />
+      </div>
+      <!--如果想在工具栏加入更多按钮,可以使用插槽方式, slot = 'left' or 'right'-->
+      <crudOperation :permission="permission" />
+      <!--表单组件-->
+      <el-dialog
+        :close-on-click-modal="false"
+        :before-close="crud.cancelCU"
+        :visible.sync="crud.status.cu > 0"
+        :title="crud.status.title"
+        width="500px"
+      >
+        <el-form ref="form" :model="form" :rules="rules" size="small" label-width="80px">
+          <el-form-item label="unified_key">
+            <el-input v-model="form.unified_key" style="width: 370px;" />
+          </el-form-item>
+          <el-form-item label="编号">
+            <el-input v-model="form.key" style="width: 370px;" />
+          </el-form-item>
+          <el-form-item label="值">
+            <el-input v-model="form.value" style="width: 370px;" />
+          </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer">
+          <el-button type="text" @click="crud.cancelCU">取消</el-button>
+          <el-button :loading="crud.cu === 2" type="primary" @click="crud.submitCU">确认</el-button>
+        </div>
+      </el-dialog>
+      <!--表格渲染-->
+      <el-table
+        ref="table"
+        v-loading="crud.loading"
+        :data="crud.data"
+        size="small"
+        style="width: 100%;"
+        @selection-change="crud.selectionChangeHandler"
+      >
+        <el-table-column prop="unified_key" label="unified_key" />
+        <el-table-column prop="key" label="编号" />
+        <el-table-column prop="value" label="值" />
+        <el-table-column
+          v-permission="['admin','instruction:edit','instruction:del']"
+          fixed="left"
+          label="操作"
+          width="150px"
+          align="center"
+        >
+          <template slot-scope="scope">
+            <el-button slot="right" size="mini" style="margin-left: -1px;margin-right: 2px" type="text" @click="dialogFormVisible = true">
+              查询历史
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <!--分页组件-->
+      <pagination />
+      <!--弹窗设置设备与图标绑定与角度-->
+      <el-dialog title="历史" :visible.sync="dialogFormVisible" width="35%">
+        <el-form :model="form" size="small">
+          <el-form-item label="unified_key" prop="unified_key" label-width="100px">
+            <el-input v-model="form.unified_key" :disabled="true" />
+          </el-form-item>
+
+          <el-form-item label="code" prop="key" label-width="100px">
+            <el-input v-model="form.key" :disabled="true" />
+          </el-form-item>
+
+        </el-form>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script>
+import pagination from '@crud/Pagination'
+import crudUdwData from '@/api/acs/history/udwData'
+import CRUD, { crud, form, header, presenter } from '@crud/crud'
+import crudOperation from '@crud/CRUD.operation'
+import { getDicts } from '@/api/system/dict'
+
+const defaultForm = {
+  unified_key: '',
+  key: null,
+  value: null,
+  last_modify_date: null
+}
+export default {
+  dicts: [],
+  name: 'UdwData',
+  components: { pagination, crudOperation },
+  mixins: [presenter(), header(), form(defaultForm), crud()],
+  cruds() {
+    return CRUD({
+      title: '数据源',
+      url: 'api/udw/',
+      idField: 'key',
+      sort: 'key',
+      query: {},
+      crudMethod: { ...crudUdwData },
+      optShow: {
+      }
+    })
+  },
+  data() {
+    return {
+      unified_key: [
+        {
+          value: '1',
+          label: 'opc_value'
+        },
+        {
+          value: '2',
+          label: 'cached'
+        },
+        {
+          value: '3',
+          label: 'socket'
+        }
+      ],
+      permission: {
+      },
+      dialogFormVisible: false,
+      rules: {
+      },
+      form: {
+        unified_key: 'opc_value',
+        key: null,
+        value: null,
+        last_modify_date: null
+      }
+    }
+  },
+  created() {
+    getDicts().then(data => {
+      this.dicts = data
+    })
+  },
+  methods: {
+    // 钩子:在获取表格数据之前执行,false 则代表不获取数据
+    [CRUD.HOOK.beforeRefresh]() {
+      return true
+    }
+  }
+}
+</script>
+
+<style scoped>
+.el-dropdown-link {
+  cursor: pointer;
+  color: #409EFF;
+}
+
+.el-icon-arrow-down {
+  font-size: 12px;
+}
+</style>
diff --git a/acs/nladmin-ui/src/views/monitor/lucene/api/lucene.js b/acs/nladmin-ui/src/views/monitor/lucene/api/lucene.js
new file mode 100644
index 0000000..674bb2c
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/lucene/api/lucene.js
@@ -0,0 +1,18 @@
+import request from '@/utils/request'
+
+export function getLogData(param) {
+  return request({
+    url: 'api/lucene/getAll',
+    method: 'get',
+    data: param
+  })
+}
+
+export function labelsValues() {
+  return request({
+    url: 'api/loki/labels/values',
+    method: 'get'
+  })
+}
+
+export default { getLogData, labelsValues }
diff --git a/acs/nladmin-ui/src/views/monitor/lucene/index.vue b/acs/nladmin-ui/src/views/monitor/lucene/index.vue
new file mode 100644
index 0000000..36be01e
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/lucene/index.vue
@@ -0,0 +1,109 @@
+<template>
+  <div class="app-container">
+    <div class="head-container">
+      <Search />
+      <crudOperation />
+    </div>
+    <!--表格渲染-->
+    <el-table
+      ref="table"
+      v-loading="crud.loading"
+      :data="crud.data"
+      style="width: 100%;"
+      @selection-change="crud.selectionChangeHandler"
+    >
+      <!--      <el-table-column type="selection" width="55"/>-->
+      <!--      <el-table-column v-if="false" prop="id" label="id"/>-->
+      <el-table-column prop="operate" width="50" label="操作" />
+      <el-table-column prop="device_code" label="设备号" min-width="130" show-overflow-tooltip />
+      <el-table-column prop="task_code" label="任务编号" />
+      <el-table-column prop="instruct_code" label="指令编号" />
+      <el-table-column prop="method" label="方法" />
+      <el-table-column prop="status_code" label="状态码" />
+      <el-table-column prop="requestparam" label="请求参数" />
+      <el-table-column prop="responseparam" label="返回参数" />
+      <el-table-column prop="logTime" width="170" label="记录时间" />
+      <el-table-column prop="content" width="500" label="内容详情" />
+
+    </el-table>
+    <!--分页组件-->
+    <pagination />
+  </div>
+</template>
+
+<script>
+import Search from './search'
+import CRUD, { crud, header, presenter } from '@crud/crud'
+import crudOperation from '@crud/CRUD.operation'
+import pagination from '@crud/Pagination'
+import { delAll } from '@/api/acs/lucene/log'
+
+export default {
+  name: 'LuceneLog',
+  components: { Search, pagination, crudOperation },
+  mixins: [presenter(), header(), crud()],
+  cruds: function() {
+    return CRUD({
+      title: '系统参数', url: 'api/lucene/getAll', idField: 'id', sort: 'id,desc',
+      queryOnPresenterCreated: true,
+      optShow: {
+        add: false,
+        edit: false,
+        del: false,
+        download: false
+      },
+      page: {
+        size: 40,
+        total: 0,
+        page: 0
+      },
+      query: {
+        createTime: [new Date(new Date().setTime(new Date().getTime() - 3600 * 1000)), new Date(new Date().setTime(new Date().getTime() + 3600 * 1000))]
+      }
+    })
+  },
+  data() {
+    return {
+      query: { blurry: '123' },
+      permission: {
+        add: ['admin', 'param:add'],
+        edit: ['admin', 'param:edit'],
+        del: ['admin', 'param:del']
+      },
+
+      rules: {}
+    }
+  },
+  created() {
+  },
+  methods: {
+    // 钩子:在获取表格数据之前执行,false 则代表不获取数据
+    [CRUD.HOOK.beforeRefresh]() {
+      return true
+    },
+    confirmDelAll() {
+      this.$confirm(`确认清空所有操作日志吗?`, '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        this.crud.delAllLoading = true
+        delAll('device_execute').then(res => {
+          this.crud.delAllLoading = false
+          this.crud.dleChangePage(1)
+          this.crud.delSuccessNotify()
+          this.crud.toQuery()
+        }).catch(err => {
+          this.crud.delAllLoading = false
+          console.log(err.response.data.message)
+        })
+      }).catch(() => {
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>
diff --git a/acs/nladmin-ui/src/views/monitor/lucene/search.vue b/acs/nladmin-ui/src/views/monitor/lucene/search.vue
new file mode 100644
index 0000000..4418988
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/lucene/search.vue
@@ -0,0 +1,150 @@
+<template>
+  <div v-if="crud.props.searchToggle">
+
+    <!-- <el-input
+      v-model="query.device_code"
+      clearable
+      size="small"
+      placeholder="请输入你要搜索的设备号"
+      style="width: 200px;"
+      class="filter-item"
+    /> -->
+    <!-- <el-select
+          v-model="query.device_code"
+          clearable
+          filterable
+          size="small"
+          placeholder="请输入你要搜索的设备号"
+          class="filter-item"
+          style="width: 190px"
+          @change="crud.toQuery"
+        >
+        <el-option v-for="item in device_codes" :key="item.id" :label="item.label" :value="item.value" />
+        </el-select> -->
+    <el-select
+      ref="test"
+      v-model="query.device_code"
+      filterable
+      clearable
+      reserve-keyword
+      placeholder="设备号"
+      style="width: 190px;"
+      @change="crud.toQuery"
+    >
+      <el-option
+        v-for="item in deviceList"
+        :key="item.device_code"
+        :label="item.device_code"
+        :value="item.device_code"
+      />
+    </el-select>
+
+    <el-input
+      v-model="query.method"
+      clearable
+      size="small"
+      placeholder="请输入你要搜索的方法名"
+      style="width: 200px;"
+      class="filter-item"
+    />
+    <el-input
+      v-model="query.status_code"
+      clearable
+      size="small"
+      placeholder="请输入你要搜索的状态码"
+      style="width: 200px;"
+      class="filter-item"
+    />
+    <el-input
+      v-model="query.requestparam"
+      clearable
+      size="small"
+      placeholder="请输入你要搜索的请求参数"
+      style="width: 200px;"
+      class="filter-item"
+    />
+    <el-input
+      v-model="query.responseparam"
+      clearable
+      size="small"
+      placeholder="请输入你要搜索的返回参数"
+      style="width: 200px;"
+      class="filter-item"
+    />
+    <el-input
+      v-model="query.blurry"
+      clearable
+      size="small"
+      placeholder="请输入你要搜索的内容详情"
+      style="width: 200px;"
+      class="filter-item"
+    />
+    <!--
+        <date-range-picker v-model="query.createTime" class="date-item" />
+    -->
+
+    <el-date-picker
+      v-model="query.createTime"
+      type="datetimerange"
+      :picker-options="pickerOptions"
+      format="yyyy-MM-dd HH:mm:ss"
+      range-separator="至"
+      start-placeholder="开始日期"
+      end-placeholder="结束日期"
+      align="right"
+    />
+    <rrOperation />
+  </div>
+</template>
+
+<script>
+import { header } from '@crud/crud'
+import rrOperation from '@crud/RR.operation'
+import deviceCrud from '@/api/acs/device/device'
+
+export default {
+  components: { rrOperation },
+  mixins: [header()],
+
+  data() {
+    return {
+      pickerOptions: {
+        shortcuts: [{
+          text: '最近一周',
+          onClick(picker) {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
+            picker.$emit('pick', [start, end])
+          }
+        }, {
+          text: '最近一个月',
+          onClick(picker) {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
+            picker.$emit('pick', [start, end])
+          }
+        }, {
+          text: '最近三个月',
+          onClick(picker) {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
+            picker.$emit('pick', [start, end])
+          }
+        }]
+      },
+      value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],
+      value2: '',
+      deviceList: [],
+      device_code: ''
+    }
+  },
+  created() {
+    deviceCrud.selectDeviceList().then(data => {
+      this.deviceList = data
+    })
+  }
+}
+</script>
diff --git a/acs/nladmin-ui/src/views/monitor/lucene/time.vue b/acs/nladmin-ui/src/views/monitor/lucene/time.vue
new file mode 100644
index 0000000..36d504a
--- /dev/null
+++ b/acs/nladmin-ui/src/views/monitor/lucene/time.vue
@@ -0,0 +1,64 @@
+<template>
+  <div v-if="crud.props.searchToggle">
+    <!--
+        <date-range-picker v-model="query.createTime" class="date-item" />
+    -->
+
+    <el-date-picker
+      v-model="query.createTime"
+      type="datetimerange"
+      :picker-options="pickerOptions"
+      range-separator="至"
+      start-placeholder="开始日期"
+      end-placeholder="结束日期"
+      align="right"
+    />
+    <rrOperation />
+  </div>
+</template>
+
+<script>
+import { header } from '@crud/crud'
+import rrOperation from '@crud/RR.operation'
+
+export default {
+  components: { rrOperation },
+  mixins: [header()],
+
+  data() {
+    return {
+      pickerOptions: {
+        shortcuts: [{
+          text: '最近一周',
+          onClick(picker) {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
+            picker.$emit('pick', [start, end])
+          }
+        }, {
+          text: '最近一个月',
+          onClick(picker) {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
+            picker.$emit('pick', [start, end])
+          }
+        }, {
+          text: '最近三个月',
+          onClick(picker) {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
+            picker.$emit('pick', [start, end])
+          }
+        }]
+      },
+      value1: [new Date(2000, 10, 10, 10, 10), new Date(2000, 10, 11, 10, 10)],
+      value2: ''
+    }
+  },
+  created() {
+  }
+}
+</script>
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/Diagram.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/Diagram.vue
index 81a0a02..5dd9d57 100644
--- a/acs/nladmin-ui/src/views/system/logicflow/editor/components/Diagram.vue
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/Diagram.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="diagram">
     <diagram-toolbar
+      style="z-index: 1"
       v-if="lf"
       class="diagram-toolbar"
       :lf="lf"
@@ -37,6 +38,7 @@
       :only-edge="activeNodes.length === 0"
       :elements-style="properties"
       :show-choice="showChoice"
+      :node="nodeObj"
       @setStyle="$_setStyle"
       @setZIndex="$_setZIndex"
     />
@@ -92,7 +94,8 @@ export default {
       nodeSize: {
         width: '',
         heigh: ''
-      }
+      },
+      nodeObj: {} // 给子组件传递信息 -- 下拉框实时更新信息
     }
   },
   mounted() {
@@ -144,29 +147,6 @@ export default {
       registerCustomElement(lf)
       lf.setDefaultEdgeType('pro-polyline')
 
-      // 为菜单追加选项(必须在 lf.render() 之前设置)
-      lf.extension.menu.addMenuConfig({
-        nodeMenu: [
-          {
-            text: '绑定设备号',
-            callback(node) {
-              console.log(lf.graphModel.getNodeModelById(node.id))
-              lf.graphModel.getNodeModelById(node.id).draggable = false
-            }
-          },
-          {
-            text: '属性',
-            callback(node) {
-              alert(`
-                节点ID:${node.id}
-                节点类型:${node.type}
-                节点坐标:(x: ${node.x}, y: ${node.y})`
-              )
-            }
-          }
-        ],
-        edgeMenu: []
-      })
       lf.render(data)
       this.lf = lf
       this.lf.on('selection:selected,node:click,blank:click,edge:click', () => { // 选择/点击事件
@@ -187,12 +167,15 @@ export default {
       console.log('选中的节点', nodes)
       // const graphModel = this.lf.graphModel
       // console.log(graphModel)
+      // 只传第一个,以第一个为显示是否绑定设备等信息,其余显示正常不用处理
+      this.nodeObj = nodes[0]
       nodes.forEach(node => {
         if (node.type === 'html-node') {
           this.showChoice = true
         } else {
           this.showChoice = false
         }
+        // debugger
         properties = { ...properties, ...node.properties }
       })
       edges.forEach(edge => {
@@ -202,6 +185,7 @@ export default {
       return properties
     },
     $_dragInNode(type) {
+      // debugger
       this.lf.dnd.startDrag({ // 拖拽创建结点
         type
       })
@@ -238,6 +222,8 @@ export default {
       lf.render(data)
     },
     $_saveGraph() { // 保存数据
+      // debugger
+      // console.log(this.defaultForm)
       if (this.defaultForm.stage_code === null) {
         this.$message.error('请选择舞台!')
       } else {
diff --git a/acs/nladmin-ui/src/views/system/logicflow/editor/components/PropertyPanel.vue b/acs/nladmin-ui/src/views/system/logicflow/editor/components/PropertyPanel.vue
index b59e078..d97dc0d 100644
--- a/acs/nladmin-ui/src/views/system/logicflow/editor/components/PropertyPanel.vue
+++ b/acs/nladmin-ui/src/views/system/logicflow/editor/components/PropertyPanel.vue
@@ -34,6 +34,56 @@
           <div slot="reference" class="border-color" :style="{'backgroundColor': style.gradientColor}" />
         </el-popover>
       </div>
+      <div class="setting-item">
+        <span>设备绑定</span>
+        <el-select
+          filterable
+          clearable
+          v-model="style.device"
+          size="mini"
+          @change="$_changeDevice"
+        >
+          <el-option
+            v-for="item in deviceCodeOptions"
+            :key="item.device_id"
+            :value="item.device_code"
+            :label="item.device_code"
+          >
+            <span style="float: left">{{ item.device_code }}</span>
+            <span style="float: right; color: #8492a6; font-size: 13px">{{ item.device_name }}</span>
+          </el-option>
+        </el-select>
+      </div>
+      <div class="setting-item">
+        <span>旋转角度</span>
+        <el-input-number
+          v-model="style.transform"
+          controls-position="right"
+          size="mini"
+          :min="0"
+          :max="360"
+          :step="90"
+          @change="$_changeTransform"
+        />
+        <span>度</span>
+      </div>
+      <div v-if="showChoice" class="setting-item">
+        <span>设备选择</span>
+        <el-select
+          filterable
+          clearable
+          v-model="style.imageUrl"
+          size="mini"
+          @change="$_changeImageUrl"
+        >
+          <el-option
+            v-for="item in imageUrlOptions"
+            :key="item.image_uuid"
+            :value="item.image_code"
+            :label="item.image_name"
+          />
+        </el-select>
+      </div>
       <div class="setting-item">
         <span>线条样式</span>
         <el-select v-model="style.borderStyle" size="small" @change="$_selectBorder">
@@ -133,37 +183,6 @@
         <el-button size="small" @click="$emit('setZIndex', 'top')">置为顶部</el-button>
         <el-button size="small" @click="$emit('setZIndex', 'bottom')">置为底部</el-button>
       </div>
-      <div class="setting-item">
-        <span>设备绑定</span>
-        <el-input v-model="style.device" placeholder="输入设备号" size="small" @change="$_changeDevice" />
-      </div>
-      <div class="setting-item">
-        <span>旋转角度</span>
-        <el-input-number
-          v-model="style.transform"
-          controls-position="right"
-          size="mini"
-          :min="0"
-          :max="360"
-          @change="$_changeTransform"
-        />
-        <span>度</span>
-      </div>
-      <div v-if="showChoice" class="setting-item">
-        <span>设备选择</span>
-        <el-select
-          v-model="style.imageUrl"
-          size="mini"
-          @change="$_changeImageUrl"
-        >
-          <el-option
-            v-for="item in imageUrlOptions"
-            :key="item.image_uuid"
-            :value="item.image_code"
-            :label="item.image_name"
-          />
-        </el-select>
-      </div>
     </div>
   </div>
 </template>
@@ -172,6 +191,7 @@
 import { Sketch } from 'vue-color'
 import { shortStyles, borderStyles, fontFamilies } from '../constant'
 import crudStageImage from '@/api/logicflow/stageImage'
+import crudDevice from '@/api/acs/device/device'
 
 export default {
   components: {
@@ -180,7 +200,8 @@ export default {
   props: {
     elementsStyle: Object,
     onlyEdge: Boolean, // 是否是只设置边的属性,当只设置边的属性时,隐藏快捷样式和背景色设置
-    showChoice: Boolean
+    showChoice: Boolean,
+    node: Object // 父组件传来的对象
   },
   data() {
     return {
@@ -209,7 +230,8 @@ export default {
       fontWeight: '', // 文本加粗
       lineHeightOptions: Array(5).fill(1).map((_, i) => _ + i * 0.5),
       // imageUrl: '',
-      imageUrlOptions: []
+      imageUrlOptions: [],
+      deviceCodeOptions: []
     }
   },
   watch: {
@@ -218,10 +240,16 @@ export default {
         this.style = { ...this.style, ...val }
       },
       immediate: true
+    },
+    node(newVal, oldVal) {
+      // newVal是新值,oldVal是旧值
+      this.node = newVal
+      this.cleanParam()
     }
   },
   created() {
     this.initStageIconList()
+    this.initDevicesList()
   },
   methods: {
     initStageIconList() { // 初始化图标数据
@@ -232,6 +260,12 @@ export default {
         this.imageUrlOptions = data
       })
     },
+    initDevicesList() {
+      crudDevice.selectDeviceList().then(res => {
+        console.log('devices:', res)
+        this.deviceCodeOptions = res
+      })
+    },
     setStyle(item) {
       this.$emit('setStyle', item)
     },
@@ -319,6 +353,17 @@ export default {
       this.$emit('setStyle', {
         device: val
       })
+    },
+    cleanParam() { // 判断来清空下拉框
+      if (this.node.properties.device === undefined) {
+        this.style.device = ''
+      }
+      if (this.node.properties.imageUrl === undefined) {
+        this.style.imageUrl = ''
+      }
+      if (this.node.properties.transform === undefined) {
+        this.style.transform = 0
+      }
     }
   }
 }
diff --git a/acs/nladmin-ui/src/views/system/monitor/device/XJDeviceMonitor.vue b/acs/nladmin-ui/src/views/system/monitor/device/XJDeviceMonitor.vue
deleted file mode 100644
index f6a8a16..0000000
--- a/acs/nladmin-ui/src/views/system/monitor/device/XJDeviceMonitor.vue
+++ /dev/null
@@ -1,223 +0,0 @@
-<template>
-  <el-dialog
-    title="监控详情"
-    append-to-body
-    :visible.sync="dialogVisible"
-    fullscreen
-    @open="open"
-    @close="close"
-  >
-    <el-row :gutter="20">
-      <el-col :span="18" style="border: 1px solid white">
-        <span />
-      </el-col>
-      <el-col :span="6" style="margin-bottom: 20px">
-        <!--        <span style="float: right">
-           <el-button icon="el-icon-close" size="mini" type="info" @click="dialogVisible = false">返 回</el-button>
-        </span>-->
-      </el-col>
-    </el-row>
-    <el-card class="box-card" shadow="never">
-      <el-form ref="form" disabled :inline="true" :model="form" :rules="rules" size="mini" label-width="80px">
-        <el-form-item label="设备编码">
-          <el-input v-model="device_code" placeholder="自动生产" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="设备名称" prop="dtl_count">
-          <el-input v-model="device_name" style="width: 200px;" />
-        </el-form-item>
-      </el-form>
-    </el-card>
-    <div class="crud-opts2" style="margin-top: 30px;margin-bottom: 15px">
-      <el-form ref="form" disabled :inline="true" :model="form" :rules="rules" size="mini" label-width="200px">
-        <el-form-item label="心跳">
-          <el-input v-model="form.heartbeat" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="工作模式">
-          <el-input v-model="form.mode" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="故障">
-          <el-input v-model="form.error" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="故障次数">
-          <el-input v-model="form.error_num" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="待机时间(调试)">
-          <el-input v-model="form.ready_time" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="生产时间">
-          <el-input v-model="form.running_time" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="故障时间">
-          <el-input v-model="form.error_time" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="温度">
-          <el-input v-model="form.temperature" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="当前生产产品编号">
-          <el-input v-model="form.material" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="缺料信号">
-          <el-input v-model="form.lack_material" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="上料数量">
-          <el-input v-model="form.feeding_qty" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="下料数量">
-          <el-input v-model="form.blanking_qty" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="当前生产合格品数量">
-          <el-input v-model="form.qualified_qty" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="当前生产不合格品数量">
-          <el-input v-model="form.unqualified_qty" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="生产完成">
-          <el-input v-model="form.finish" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="任务号">
-          <el-input v-model="form.task" style="width: 200px;" />
-        </el-form-item>
-        <el-form-item label="设备暂停">
-          <el-input v-model="form.pause" style="width: 200px;" />
-        </el-form-item>
-      </el-form>
-    </div>
-  </el-dialog>
-</template>
-
-<script>
-import { crud } from '@crud/crud'
-
-export default {
-  name: 'XJDeviceMonitor',
-  components: {},
-  mixins: [crud()],
-  props: {
-    dialogShow: {
-      type: Boolean,
-      default: false
-    },
-    openParam: {
-      type: Object
-    }
-  },
-  dicts: [],
-  data() {
-    return {
-      dialogVisible: false,
-      form: {
-        heartbeat: '',
-        mode: '',
-        error: '',
-        error_num: '',
-        ready_time: '',
-        running_time: '',
-        error_time: '',
-        temperature: '',
-        material: '',
-        lack_material: '',
-        feeding_qty: '',
-        blanking_qty: '',
-        qualified_qty: '',
-        unqualified_qty: '',
-        finish: '',
-        task: '',
-        pause: ''
-      },
-      device_code: '',
-      device_name: '',
-      rules: {
-      }
-    }
-  },
-  watch: {
-    dialogShow: {
-      handler(newValue) {
-        this.dialogVisible = newValue
-      }
-    }
-  },
-  methods: {
-    open() {
-      this.webSocket()
-    },
-    close() {
-      this.$emit('AddChanged')
-    },
-    setForm(data) {
-      this.dialogVisible = true
-      this.form = data.data
-      this.device_code = data.device_code
-      this.device_name = data.device_name
-      // this.form = row
-    },
-    webSocket() {
-      const that = this
-      if (typeof (WebSocket) === 'undefined') {
-        this.$notify({
-          title: '提示',
-          message: '当前浏览器无法接收实时报警信息,请使用谷歌浏览器!',
-          type: 'warning',
-          duration: 0
-        })
-      } else {
-        const id = 'xj_device_monitor'
-        // 获取token保存到vuex中的用户信息,此处仅适用于本项目,注意删除或修改
-        // 实例化socket,这里我把用户名传给了后台,使后台能判断要把消息发给哪个用户,其实也可以后台直接获取用户IP来判断并推送
-
-        // const wsUri = process.env.VUE_APP_WS_API + '/webSocket/' + id
-        const wsUri = window.g.prod.VUE_APP_BASE_API.replace('http', 'ws') + '/webSocket/' + id
-        this.socket = new WebSocket(wsUri)
-        // 监听socket打开
-        this.socket.onopen = function() {
-          console.log('浏览器WebSocket已打开')
-          // that.socket.send('测试客户端发送消息')
-        }
-
-        // 监听socket消息接收
-        this.socket.onmessage = function(msg) {
-          const list = JSON.parse(msg.data).msg.detail
-          // console.log(list)
-
-          for (const item of list) {
-            const obj = JSON.parse(JSON.stringify(item))
-            if (obj.device_code === that.device_code) {
-              that.form = obj.data
-            }
-          }
-        }
-
-        // 监听socket错误
-        this.socket.onerror = function() {
-          that.$notify({
-            title: '错误',
-            message: '服务器错误,无法接收实时报警信息',
-            type: 'error',
-            duration: 0
-          })
-        }
-        // 监听socket关闭
-        this.socket.onclose = function() {
-          console.log('WebSocket已关闭')
-        }
-      }
-    }
-  }
-}
-</script>
-
-<style>
-.crud-opts2 {
-  padding: 0 0;
-  display: -webkit-flex;
-  display: flex;
-  align-items: center;
-}
-.crud-opts2 .crud-opts-right2 {
-  margin-left: auto;
-  padding: 4px 4px;
-}
-.input-with-select  {
-  background-color: #fff;
-}
-</style>
diff --git a/acs/nladmin-ui/src/views/system/monitor/device/index.vue b/acs/nladmin-ui/src/views/system/monitor/device/index.vue
index d74a426..484f28b 100644
--- a/acs/nladmin-ui/src/views/system/monitor/device/index.vue
+++ b/acs/nladmin-ui/src/views/system/monitor/device/index.vue
@@ -197,11 +197,10 @@ export default {
   name: 'MonitorDevice',
   data() {
     return {
-      stageParam: 'stage_code', // 舞台参数
+      stageParam: 'age', // 舞台参数
       dialogDeviceMsgVisible: false, // 显示设备信息的dialog
       device_code: null,
       tops: '20vh', // 初始top
-      stage_code: '',
       stageSelectList: [],
       arr: [], // 显示数组
       dialogFormVisible: false,
@@ -304,21 +303,11 @@ export default {
       this.initStageData()
     },
     initStageData() {
-      // 获取舞台编码
-      paramCrud.getValueByCode(this.stageParam).then(res => {
-        // console.log(res)
-        if (res.value) {
-          crudStage.getNewStageDataByCode(res.value).then(res => { // 通过舞台编码获取舞台数据并且赋值到lf对象
-            data = JSON.parse(res.stage_data)
-            lf.render(data)
-            this.initStatus() // 初始化状态
-          })
-        } else {
-          this.$notify.error({
-            title: '错误',
-            message: '请设置参数!'
-          })
-        }
+      // 获取舞台数据
+      crudStage.getNewStageDataByCode(this.stageParam).then(res => { // 通过舞台编码获取舞台数据并且赋值到lf对象
+        data = JSON.parse(res.stage_data)
+        lf.render(data)
+        this.initStatus() // 初始化状态
       })
       this.timer = setInterval(() => { // 定时刷新设备的状态信息
         console.log('定时器启动')
diff --git a/acs/nladmin-ui/src/views/tools/codeGen/codeDetail.vue b/acs/nladmin-ui/src/views/tools/codeGen/codeDetail.vue
index 14ad525..7d91755 100644
--- a/acs/nladmin-ui/src/views/tools/codeGen/codeDetail.vue
+++ b/acs/nladmin-ui/src/views/tools/codeGen/codeDetail.vue
@@ -154,7 +154,7 @@ export default {
     presenter(),
     header(),
     form(function() {
-      return Object.assign({ dict: { id: this.dictId }}, defaultForm)
+      return Object.assign({ code_rule_id: this.dictId }, defaultForm)
     })],
   data() {
     return {
@@ -183,6 +183,12 @@ export default {
         format: [
           { required: true, message: '请输入日期格式', trigger: 'blur' }
         ],
+        step: [
+          { required: true, message: '请输入步长', trigger: 'blur' }
+        ],
+        fillchar: [
+          { required: true, message: '请输入填充值', trigger: 'blur' }
+        ],
         max_value: [
           { required: true, message: '请输入最大值', trigger: 'blur' }
         ]