From 7f049d32a8a28d031795c078f9dfda73974dbac8 Mon Sep 17 00:00:00 2001 From: "USER-20220102CG\\noblelift" <546428999@qq.com> Date: Tue, 16 May 2023 17:31:58 +0800 Subject: [PATCH] add lucene \ udw --- acs/nladmin-system/pom.xml | 36 +++ .../src/main/java/org/nl/acs/agv/agv说明 | 1 - .../run/OneNDCSocketConnectionAutoRun.java | 40 ++- .../agv/ndcone/AgvNdcOneDeviceDriver.java | 301 +++++++++++------- .../basedriver/agv/utils/AgvSystemEnum.java | 84 +++++ .../service/impl/AcsToWmsZDServiceImpl.java | 2 +- .../java/org/nl/acs/history/ErrorUtil.java | 123 +++++++ .../rest/DeviceErrorLogController.java | 77 +++++ .../service/DeviceErrorLogService.java | 74 +++++ .../service/dto/DeviceErrorLogDto.java | 29 ++ .../impl/DeviceErrorLogServiceImpl.java | 137 ++++++++ .../service/impl/InstructionServiceImpl.java | 55 +++- .../nl/acs/udw/rest/UdwManagerController.java | 47 +++ .../nl/acs/udw/service/UdwManageService.java | 12 + .../service/impl/UdwManagerServiceImpl.java | 143 ++++++++- .../org/nl/modules/logging/DeviceCodeDir.java | 23 ++ .../org/nl/modules/lucene/common/Indexer.java | 178 +++++++++++ .../lucene/common/LuceneIndexWriter.java | 66 ++++ .../nl/modules/lucene/common/Searcher.java | 140 ++++++++ .../modules/lucene/config/StaticConfig.java | 21 ++ .../nl/modules/lucene/config/UrlConfig.java | 13 + .../nl/modules/lucene/enums/LogTypeEnum.java | 15 + .../modules/lucene/rest/LuceneController.java | 43 +++ .../service/LuceneExecuteLogService.java | 41 +++ .../modules/lucene/service/LuceneService.java | 24 ++ .../lucene/service/dto/LuceneLogDto.java | 95 ++++++ .../impl/LuceneExecuteLogServiceImpl.java | 101 ++++++ .../service/impl/LuceneServiceImpl.java | 85 +++++ .../modules/system/service/DictService.java | 8 +- .../system/service/impl/DictServiceImpl.java | 12 +- .../java/org/nl/modules/system/wql/sys.xls | Bin 228864 -> 230912 bytes .../main/resources/config/application-dev.yml | 21 +- .../resources/config/application-prod.yml | 57 ++-- .../src/main/resources/config/application.yml | 4 +- .../src/main/resources/initsql.txt | 3 +- .../src/main/resources/log/Lucene.xml | 34 ++ .../src/main/resources/logback-spring.xml | 75 ++--- .../src/api/acs/history/acsDeviceErrorLog.js | 27 ++ acs/nladmin-ui/src/api/acs/history/udwData.js | 28 ++ .../acs/history/deviceErrorInfo/index.vue | 145 +++++++++ .../src/views/acs/history/udwData/index.vue | 181 +++++++++++ .../src/views/monitor/lucene/api/lucene.js | 18 ++ .../src/views/monitor/lucene/index.vue | 42 ++- .../src/views/monitor/lucene/search.vue | 45 ++- 44 files changed, 2436 insertions(+), 270 deletions(-) delete mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/agv/agv说明 create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/utils/AgvSystemEnum.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/udw/rest/UdwManagerController.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/logging/DeviceCodeDir.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Indexer.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/LuceneIndexWriter.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Searcher.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/StaticConfig.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/UrlConfig.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/enums/LogTypeEnum.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/rest/LuceneController.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/LuceneExecuteLogService.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/LuceneService.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/dto/LuceneLogDto.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneExecuteLogServiceImpl.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneServiceImpl.java create mode 100644 acs/nladmin-system/src/main/resources/log/Lucene.xml 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/views/acs/history/deviceErrorInfo/index.vue 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 diff --git a/acs/nladmin-system/pom.xml b/acs/nladmin-system/pom.xml index e02d8fb..efab3f5 100644 --- a/acs/nladmin-system/pom.xml +++ b/acs/nladmin-system/pom.xml @@ -30,6 +30,7 @@ 5.9.0 1.9 + 8.2.0 @@ -406,6 +407,41 @@ UserAgentUtils 1.21 + + + + org.apache.lucene + lucene-core + ${lucene.version} + + + org.apache.lucene + lucene-highlighter + ${lucene.version} + + + org.apache.lucene + lucene-analyzers-common + ${lucene.version} + + + com.github.magese + ik-analyzer + ${lucene.version} + + + + + org.apache.lucene + lucene-analyzers-smartcn + ${lucene.version} + + + + org.apache.lucene + lucene-queryparser + ${lucene.version} + diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/agv/agv说明 b/acs/nladmin-system/src/main/java/org/nl/acs/agv/agv说明 deleted file mode 100644 index 5e92bca..0000000 --- a/acs/nladmin-system/src/main/java/org/nl/acs/agv/agv说明 +++ /dev/null @@ -1 +0,0 @@ -1=magic 2=NDC 3=XZ 4=ZHEDA \ No newline at end of file diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java index e1fa800..e8672f2 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java @@ -64,11 +64,11 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } public String getName() { - return "NDC在线连接"; + return "1楼NDC在线连接"; } public void autoRun() throws IOException { - System.out.println("NDCAgv链接开始"); + System.out.println("1楼NDCAgv链接开始"); ParamService ParamService = SpringContextHolder.getBean(ParamServiceImpl.class); InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); @@ -85,8 +85,8 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { s = new Socket(ip, port); dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); - System.out.println("NDCAgv链接成功"); - log.info("NDCAgv链接成功"); + System.out.println("1楼NDCAgv链接成功"); + log.info("1楼NDCAgv链接成功"); while (bConnected) { int count = dis.read(b); @@ -131,9 +131,9 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } if (ikey != 0) { inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); - if (ObjectUtil.isEmpty(inst)) { - inst = instructionService.findByCode(String.valueOf(ikey)); - } +// if (ObjectUtil.isEmpty(inst)){ +// inst = instructionService.findByCode(String.valueOf(ikey)); +// } } if (!ObjectUtil.isEmpty(link_inst)) { link_flag = true; @@ -160,18 +160,28 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { //任务完毕 //(无车id及状态) else if (phase == 0x0A) { + if (!ObjectUtil.isEmpty(inst)) { - instructionService.finish(inst.getInstruction_id()); - } else { - log.warn("指令号:{},未反馈wms任务完成,因为agv上报指令号查询指令为空!"); + if (!ObjectUtil.isEmpty(inst)) { + String agvcar = inst.getCarno(); + Device agvDevice = deviceAppService.findDeviceByCode(agvcar); + if (agvDevice != null) { + if (agvDevice.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) { + agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) agvDevice.getDeviceDriver(); + agvNdcOneDeviceDriver.setInstruction(null); + } + } + instructionService.finish(inst.getInstruction_id()); + } } data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - log.info("指令号:{},已反馈agv任务完成!"); + } //请求删除任务 //(需要WCS反馈) else if (phase == 0x30) { data = NDCAgvService.sendAgvOneModeInst(0x8F, index, 0); + } //任务删除确认 //(需要WCS反馈) @@ -187,8 +197,8 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } else { //上报异常信息 //(不需要WCS反馈) - if (phase == 0x67) { - device = deviceAppService.findDeviceByCode(Integer.toString(arr[27])); + if (phase == 0x67 || phase == 0x70 || phase == 0x71 || phase == 0x72 || phase == 0x73 || phase == 0x74 ) { + device = deviceAppService.findDeviceByCode(Integer.toString(arr[18] * 256 + arr[19])); } else { device = deviceAppService.findDeviceByCode(Integer.toString(arr[20])); } @@ -210,8 +220,8 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } } catch (Exception e) { - System.out.println("Agv链接异常"); - log.info("Agv链接异常"); + System.out.println("OneAgv链接异常"); + log.info("OneAgv链接异常"); log.error("agv连接出现异常:{}", e); logServer.deviceExecuteLog("1", "", "", "agv异常" + e.getMessage()); logServer.deviceExecuteLog("1", "", "", "agv异常" + e); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java index f7249b7..de35825 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java @@ -2,8 +2,6 @@ package org.nl.acs.device_driver.basedriver.agv.ndcone; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpResponse; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.Data; import lombok.RequiredArgsConstructor; @@ -18,16 +16,17 @@ import org.nl.acs.device_driver.basedriver.standard_storage.StandardStorageDevic import org.nl.acs.device_driver.driver.AbstractDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; +import org.nl.acs.history.ErrorUtil; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.instruction.service.impl.InstructionServiceImpl; -import org.nl.acs.log.LokiLog; -import org.nl.acs.log.LokiLogType; import org.nl.acs.log.service.DeviceExecuteLogService; +import org.nl.acs.monitor.DeviceStageMonitor; import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; -import org.nl.acs.task.service.TaskService; -import org.nl.acs.task.service.impl.TaskServiceImpl; import org.nl.modules.system.service.ParamService; import org.nl.modules.system.service.impl.ParamServiceImpl; import org.nl.modules.wql.util.SpringContextHolder; @@ -43,37 +42,44 @@ import java.util.Map; @Slf4j @Data @RequiredArgsConstructor -public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements DeviceDriver { +public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements DeviceDriver, DeviceStageMonitor { ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); - TaskService taskService = SpringContextHolder.getBean(TaskServiceImpl.class); NDCAgvService NDCAgvService = SpringContextHolder.getBean(NDCAgvService.class); DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); DeviceService deviceService = SpringContextHolder.getBean(DeviceService.class); + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + int agvaddr = 0; int agvaddr_copy = 0; int weight = 0; String device_code = ""; int phase = 0; - + String error_type = "agv_error_type"; + String error_code = "0"; int x = 0; //x坐标 int y = 0; //y坐标 int angle = 0; //角度 int electric_qty = 0; //电量 int status = 0; //三色灯状态 - int error = 0; //车辆故障 - - int last_x = 0; - int last_y = 0; - int last_angle = 0; - int last_electric_qty = 0; - int last_status = 0; + int error = 0; int last_error = 0; + String error_message = ""; + + private synchronized void setErrorInfo(int error, String error_code, String error_message) { + this.error = error; + this.error_code = error_code; + this.error_message = error_message; + } - @LokiLog(type = LokiLogType.ACS_TO_LMS) + private Instruction instruction; + + int mode = 2; + + // @LokiLog(type = LokiLogType.AGV) public synchronized void processSocket(int[] arr) throws Exception { device_code = this.getDeviceCode(); byte[] data = null; @@ -86,6 +92,7 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic agvaddr = arr[18] * 256 + arr[19]; //车号 int carno = arr[20]; + logServer.deviceExecuteLog(this.device_code, "", "", "接收agv上报信息:" + "phase--" + phase + " index--" + index + " 指令号--" + ikey + " 站点号--" + agvaddr + " 车号--" + carno); Instruction link_inst = null; List insts = null; Instruction inst = null; @@ -95,10 +102,13 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic agv_device = deviceAppService.findDeviceByCode(String.valueOf(carno)); } if (ikey != 0) { - inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); - if (ObjectUtil.isEmpty(inst)) { - inst = instructionService.findByCode(String.valueOf(ikey)); + if (phase != 0x67 && phase != 0x71 && phase != 0x72 && phase != 0x73 && phase != 0x74 && phase != 0x75) { + inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); + this.instruction = inst; } +// if (ObjectUtil.isEmpty(inst)){ +// inst = instructionService.findByCode(String.valueOf(ikey)); +// } } if (!ObjectUtil.isEmpty(link_inst)) { link_flag = true; @@ -109,13 +119,13 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic String emptyNum = null; String device_code = null; - if (phase == 0x67) { - //故障信息 - if (arr[18] * 256 + arr[19] == 0) { - - } - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - } +// if (phase == 0x67) { +// //故障信息 +// if (arr[18] * 256 + arr[19] == 0) { +// +// } +// data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); +// } //普通站点 StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; @@ -124,12 +134,13 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic // SiemensConveyorDeviceDriver siemensConveyorDeviceDriver; + //分配 车id //(不需要WCS反馈) if (phase == 0x02) { inst.setCarno(String.valueOf(carno)); instructionService.update(inst); - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈车号:" + carno + ",指令号:" + ikey); //到达取货点 //(需要WCS反馈) @@ -169,28 +180,31 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic return; } - Object reqWms = device.getExtraValue().get("reqWms"); - if (ObjectUtil.isNotEmpty(reqWms) && reqWms.toString().equals("true")) { - JSONArray req = new JSONArray(); - JSONObject map = new JSONObject(); - map.put("vehicle_code", inst.getVehicle_code()); - map.put("status", "1"); - map.put("device_code", inst.getStart_point_code()); - map.put("task_code", inst.getTask_code()); - req.add(map); - HttpResponse httpResponse = acsToWmsService.feedAgvTaskStatus(req); - if (ObjectUtil.isNotEmpty(httpResponse) && httpResponse.getStatus() == 200) { - JSONObject resp = JSONObject.parseObject(httpResponse.body()); - if (resp.getInteger("status") == 200) { - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - log.info("指令号:{},acs请求wms取货申请成功,wms允许agv申请取货,已反馈agv允许取货", inst.getInstruction_code()); - } else { - log.warn("指令号:{},acs请求wms取货申请成功,wms不允许agv申请取货,未反馈agv允许取货", inst.getInstruction_code()); - } + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + standardOrdinarySiteDeviceDriver.setAgvphase(phase); + standardOrdinarySiteDeviceDriver.setIndex(index); + standardOrdinarySiteDeviceDriver.setInst(inst); + } + + if (device.getDeviceDriver() instanceof SiemensConveyorDeviceDriver) { + siemensConveyorDeviceDriver = (SiemensConveyorDeviceDriver) device.getDeviceDriver(); + if (siemensConveyorDeviceDriver.getMove() == 1) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); } else { - log.warn("指令号:{},acs请求wms取货申请失败,连接被拒绝,未反馈agv允许取货", inst.getInstruction_code()); + log.info("请求取货条件不满足待机有货"); } - } else { + } + + if (device.getDeviceDriver() instanceof SiemensConveyorDeviceDriver) { + siemensConveyorDeviceDriver = (SiemensConveyorDeviceDriver) device.getDeviceDriver(); + if (siemensConveyorDeviceDriver.getMove() == 1) { + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + } else { + log.info("请求取货条件不满足待机有货"); + } + } + if (device.getDeviceDriver() instanceof StandardStorageDeviceDriver) { data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); } //取货完毕 @@ -230,29 +244,41 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic return; } - Object reqWms = device.getExtraValue().get("reqWms"); - if (ObjectUtil.isNotEmpty(reqWms) && reqWms.toString().equals("true")) { - JSONArray req = new JSONArray(); - JSONObject map = new JSONObject(); - map.put("vehicle_code", inst.getVehicle_code()); - map.put("status", "2"); - map.put("device_code", inst.getStart_point_code()); - map.put("task_code", inst.getTask_code()); - req.add(map); - HttpResponse httpResponse = acsToWmsService.feedAgvTaskStatus(req); - if (ObjectUtil.isNotEmpty(httpResponse) && httpResponse.getStatus() == 200) { - JSONObject resp = JSONObject.parseObject(httpResponse.body()); - if (resp.getInteger("status") == 200) { + if (StrUtil.equals(inst.getStart_device_code(), device_code)) { + + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + standardOrdinarySiteDeviceDriver.setAgvphase(phase); + standardOrdinarySiteDeviceDriver.setIndex(index); + standardOrdinarySiteDeviceDriver.setInst(inst); + } + + if (device.getDeviceDriver() instanceof SiemensConveyorDeviceDriver) { + siemensConveyorDeviceDriver = (SiemensConveyorDeviceDriver) device.getDeviceDriver(); + if (siemensConveyorDeviceDriver.getTo_command() == 2) { + log.info("取货完成请求离开,当前输送to_command:" + siemensConveyorDeviceDriver.getTo_command()); data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - log.info("指令号:{},acs反馈wms取货完成成功,wms允许agv取货完成,已反馈agv取货完成", inst.getInstruction_code()); } else { - log.warn("指令号:{},acs反馈wms取货完成成功,wms不允许agv取货完成,未反馈agv取货完成", inst.getInstruction_code()); + log.info("取货完成请求离开下发输送信号,当前输送to_command:" + siemensConveyorDeviceDriver.getTo_command()); + List list = new ArrayList(); + Map map = new HashMap(); + map.put("code", "to_command"); + map.put("value", "2"); + list.add(map); + siemensConveyorDeviceDriver.writing(list); + siemensConveyorDeviceDriver.writing(list); } - } else { - log.warn("指令号:{},acs反馈wms取货完成失败,连接被拒绝,未反馈agv取货完成", inst.getInstruction_code()); } - } else { - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + + + if (device.getDeviceDriver() instanceof StandardStorageDeviceDriver) { + standardStorageDeviceDriver = (StandardStorageDeviceDriver) device.getDeviceDriver(); + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + } + + } + if (ObjectUtil.isNotEmpty(data)) { + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + Bytes2HexString(data)); } //到达放货点 //(需要WCS反馈) @@ -287,29 +313,18 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic log.info("未找到关联编号{}对应的指令", ikey); return; } - Object reqWms = device.getExtraValue().get("reqWms"); - if (ObjectUtil.isNotEmpty(reqWms) && reqWms.toString().equals("true")) { - JSONArray req = new JSONArray(); - JSONObject map = new JSONObject(); - map.put("vehicle_code", inst.getVehicle_code()); - map.put("status", "3"); - map.put("device_code", inst.getNext_point_code()); - map.put("task_code", inst.getTask_code()); - req.add(map); - HttpResponse httpResponse = acsToWmsService.feedAgvTaskStatus(req); - if (ObjectUtil.isNotEmpty(httpResponse) && httpResponse.getStatus() == 200) { - JSONObject resp = JSONObject.parseObject(httpResponse.body()); - if (resp.getInteger("status") == 200) { - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - log.info("指令号:{},acs请求wms放货申请成功,wms允许agv申请放货,已反馈agv允许放货", inst.getInstruction_code()); - } else { - log.warn("指令号:{},acs请求wms放货申请成功,wms不允许agv申请放货,未反馈agv允许放货", inst.getInstruction_code()); - } - } else { - log.warn("指令号:{},acs请求wms放货申请失败,连接被拒绝,未反馈agv允许放货", inst.getInstruction_code()); + if (StrUtil.equals(inst.getNext_device_code(), device_code)) { + + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); } - } else { - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + + if (device.getDeviceDriver() instanceof StandardStorageDeviceDriver) { + standardStorageDeviceDriver = (StandardStorageDeviceDriver) device.getDeviceDriver(); + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + } + } //放货完毕 //(需要WCS反馈) @@ -345,24 +360,18 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic log.info("未找到编号{}对应的指令", ikey); return; } - Object reqWms = device.getExtraValue().get("reqWms"); - if (ObjectUtil.isNotEmpty(reqWms) && reqWms.toString().equals("true")) { - JSONArray req = new JSONArray(); - JSONObject map = new JSONObject(); - map.put("vehicle_code", inst.getVehicle_code()); - map.put("status", "4"); - map.put("device_code", inst.getNext_point_code()); - map.put("task_code", inst.getTask_code()); - req.add(map); - HttpResponse httpResponse = acsToWmsService.feedAgvTaskStatus(req); - if (ObjectUtil.isNotEmpty(httpResponse) && httpResponse.getStatus() == 200) { + if (StrUtil.equals(inst.getNext_device_code(), device_code)) { + + if (device.getDeviceDriver() instanceof StandardStorageDeviceDriver) { + standardStorageDeviceDriver = (StandardStorageDeviceDriver) device.getDeviceDriver(); data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - log.info("指令号:{},acs请求wms放货申请成功,wms允许agv申请放货,已反馈agv允许放货", inst.getInstruction_code()); - } else { - log.warn("指令号:{},acs请求wms放货申请失败,连接被拒绝,未反馈agv允许放货", inst.getInstruction_code()); } - } else { - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + } + } } //到达位置点 @@ -372,18 +381,92 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic agvaddr = arr[18] * 256 + arr[19]; agvaddr_copy = agvaddr; data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } else if (phase == 0x50) {//进入交通灯区域 data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } else if (phase == 0x51) {//离开交通灯区域 data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } else if (phase == 0x67) {//agv异常 + if (ikey == 0) { + this.setErrorInfo(ikey, "0", "正常"); + } else { + Map error = ErrorUtil.getAgvErrorMsg(ikey); + String code = error.get("code"); + String info = error.get("info"); + this.setErrorInfo(ikey, code, info); + } + if (error != last_error) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(this.getDevice().getDevice_code()); + dto.setError_code(String.valueOf(error_code)); + dto.setError_info(error_message); + deviceErrorLogService.create(dto); + } + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + last_error = error; + } else if (phase == 0x70) { + //x坐标 + x = ikey; + } else if (phase == 0x71) { + //y坐标 + y = ikey; + } else if (phase == 0x72) { + //车辆角度 + angle = ikey; + } else if (phase == 0x73) { + //agv电量 + electric_qty = ikey; + } else if (phase == 0x74) { + //三色灯状态 + status = ikey; } if (!ObjectUtil.isEmpty(data)) { - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + Bytes2HexString(data)); OneNDCSocketConnectionAutoRun.write(data); } + + } + + public static String Bytes2HexString(byte[] b) { + String ret = ""; + for (int i = 0; i < b.length; i++) { + String hex = Integer.toHexString(b[i] & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + ret += hex.toUpperCase(); + } + return ret; + } + + + @Override + public JSONObject getDeviceStatusName() { + JSONObject jo = new JSONObject(); + //agv编码 + jo.put("car_no", this.getDevice().getDevice_code()); + //agv名称 + jo.put("device_name", this.getDevice().getDevice_name()); + //x坐标 + jo.put("x", this.getX()); + //y坐标 + jo.put("y", this.getY()); + //角度 + jo.put("angle", this.getAngle()); + //电量 + jo.put("electricity", this.getElectric_qty()); + String status_name = this.status == 1 ? "关机" : this.status == 2 ? "工作中" : this.status == 3 ? "交通管制" : this.status == 4 ? "任务等待" : this.status == 5 ? "充电中" : this.status == 6 ? "故障中" : this.status == 7 ? "电量低" : "正常"; + //agv状态 + jo.put("status_name", status_name); + //任务号 + jo.put("task_code", ObjectUtil.isEmpty(instruction) ? "0" : instruction.getTask_code()); + //异常 + jo.put("fault", this.getError_message()); + return jo; + } + + @Override + public void setDeviceStatus(JSONObject data) { + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/utils/AgvSystemEnum.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/utils/AgvSystemEnum.java new file mode 100644 index 0000000..e063a9f --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/utils/AgvSystemEnum.java @@ -0,0 +1,84 @@ +package org.nl.acs.device_driver.basedriver.agv.utils; + + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * AGV系统类型 1:Magvic 2:NDC 3:先知 4:浙大 + */ +public enum AgvSystemEnum { + Maigic(1, "Maigic", "Maigic系统"), + NDC(2, "NDC", "NDC系统"), + XianGong(3, "XianGong", "仙工系统"), + ZheDa(4, "ZheDa", "浙大系统"); + + //索引 + private int index; + //编码 + private String code; + //名字 + private String name; + //描述 + private String desc; + + // 构造方法 + AgvSystemEnum(int index, String code, String name) { + this.index = index; + this.code = code; + this.name = name; + + } + + public static JSONArray getList() { + JSONArray arr = new JSONArray(); + JSONObject json = new JSONObject(); + for (AgvSystemEnum em : AgvSystemEnum.values()) { + json.put("code", em.getCode()); + json.put("name", em.getName()); + arr.add(json); + } + return arr; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public static String getName(String code) { + for (AgvSystemEnum c : AgvSystemEnum.values()) { + if (c.code == code) { + return c.name; + } + } + return null; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsZDServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsZDServiceImpl.java index 274333c..5808be8 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsZDServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsZDServiceImpl.java @@ -44,7 +44,7 @@ public class AcsToWmsZDServiceImpl implements AcsToWmsZDService { @Autowired LogService logServer; - @Value("${acsTowms.token}") + //@Value("${acsTowms.token}") public String token; @Override diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java b/acs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java new file mode 100644 index 0000000..d596fc1 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java @@ -0,0 +1,123 @@ +package org.nl.acs.history; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import org.nl.modules.system.domain.Dict; +import org.nl.modules.system.service.DictDetailService; +import org.nl.modules.system.service.DictService; +import org.nl.modules.system.service.dto.DictDetailDto; +import org.nl.modules.system.service.impl.DictDetailServiceImpl; +import org.nl.modules.system.service.impl.DictServiceImpl; +import org.nl.modules.wql.util.SpringContextHolder; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author: geng by + * @createDate: 2023/3/15 + */ +public class ErrorUtil { + + public static ConcurrentHashMap> dictMap = new ConcurrentHashMap<>(); + + + public static String getDictDetail(String type, String error_code) { + getDict(); + List dictDetailDtos = dictMap.get(type); + String detail = null; + if (ObjectUtil.isNotEmpty(dictDetailDtos)) { + for (int i = 0; i < dictDetailDtos.size(); i++) { + DictDetailDto dictDetailDto = dictDetailDtos.get(i); + String value = dictDetailDto.getValue(); + String label = dictDetailDto.getLabel(); + if (StrUtil.equals(value, error_code)) { + detail = label; + break; + } + } + } + return detail == null ? "字典表未配置对应的报警信息" : detail; + } + + public static Map getDictDetailByName(String type) { + getDict(); + List dictDetailDtos = dictMap.get(type); + Map map = new HashMap<>(); + if (ObjectUtil.isNotEmpty(dictDetailDtos)) { + List dtos = dictDetailDtos + .stream() + .filter(dictDetailDto -> !dictDetailDto.getValue().equals("0")) + .filter(dictDetailDto -> !dictDetailDto.getValue().equals("-1")) + .collect(Collectors.toList()); + dtos.forEach(dictDetailDto -> map.put(Integer.parseInt(dictDetailDto.getValue()), dictDetailDto.getLabel())); + } + return map; + } + + + public static void getDict() { + if (ObjectUtil.isEmpty(dictMap)) { + DictDetailService dictDetailService = SpringContextHolder.getBean(DictDetailServiceImpl.class); + DictService dictService = SpringContextHolder.getBean(DictServiceImpl.class); + List dictDtos = dictService.queryAll(); + for (int i = 0; i < dictDtos.size(); i++) { + Dict dictDto = dictDtos.get(i); + dictMap.put(dictDto.getName(), getDict(dictDto.getName(), t -> { + return dictDetailService.getDictByName(t); + })); + } + } + } + + public static List getDict(String name, Function> f) { + return f.apply(name); + } + + public static Map getAgvErrorMsg(Integer ageErrorNum) { + Map agvMap = getDictDetailByName("agv_error_type"); + Integer[] keys = agvMap.keySet().toArray(new Integer[0]); + String message = ""; + String code = ""; + out: + for (int i = 1; i < 1 << keys.length; i++) { + int sum = 0; + StringBuffer sb = new StringBuffer(); + StringBuffer sbCode = new StringBuffer(); + inner: + for (int j = 0; j < keys.length; j++) { + if ((i & 1 << j) != 0) { + sum += keys[j]; + sb.append(agvMap.get(keys[j])).append(","); + sbCode.append(keys[j]).append(","); + } + } + if (sum == ageErrorNum) { + code = sbCode.toString(); + message = sb.toString(); + break out; + } + } + Map map = new HashMap<>(); + String info = replace(message); + code = replace(code); + map.put("code", StrUtil.isEmpty(code) ? "-1" : code); + map.put("info", StrUtil.isEmpty(info) ? "AGV上报报警代码有误" : info); + return map; + } + + public static String replace(String message) { + if (StrUtil.isEmpty(message)) { + return null; + } + if (message.endsWith(",")) { + return message.substring(0, message.length() - 1); + } + return message; + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java b/acs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java new file mode 100644 index 0000000..694440f --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java @@ -0,0 +1,77 @@ + +package org.nl.acs.history.rest; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.modules.logging.annotation.Log; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Map; + +/** +* @author gengby +* @date 2023-03-15 +**/ +@RestController +@RequiredArgsConstructor +@Api(tags = "设备报警记录管理") +@RequestMapping("/api/deviceErrorLog") +@Slf4j +public class DeviceErrorLogController { + + private final DeviceErrorLogService acsDeviceErrorLogService; + + @GetMapping + @Log("查询设备报警记录") + @ApiOperation("查询设备报警记录") + //@PreAuthorize("@el.check('acsDeviceErrorLog:list')") + public ResponseEntity query(@RequestParam Map whereJson, Pageable page){ + return new ResponseEntity<>(acsDeviceErrorLogService.queryAll(whereJson,page),HttpStatus.OK); + } + + @PostMapping + @Log("新增设备报警记录") + @ApiOperation("新增设备报警记录") + //@PreAuthorize("@el.check('acsDeviceErrorLog:add')") + public ResponseEntity create(@Validated @RequestBody DeviceErrorLogDto dto){ + acsDeviceErrorLogService.create(dto); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @PutMapping + @Log("修改设备报警记录") + @ApiOperation("修改设备报警记录") + //@PreAuthorize("@el.check('acsDeviceErrorLog:edit')") + public ResponseEntity update(@Validated @RequestBody DeviceErrorLogDto dto){ + acsDeviceErrorLogService.update(dto); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除设备报警记录") + @ApiOperation("删除设备报警记录") + //@PreAuthorize("@el.check('acsDeviceErrorLog:del')") + @DeleteMapping + public ResponseEntity delete(@RequestBody String[] ids) { + acsDeviceErrorLogService.deleteAll(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + @Log("导出设备报警记录") + @ApiOperation("导出设备报警记录") + @GetMapping(value = "/download") + //@PreAuthorize("@el.check('acsDeviceErrorLog:list')") + public void download(HttpServletResponse response, @RequestParam Map whereJson) throws IOException { + acsDeviceErrorLogService.download(acsDeviceErrorLogService.queryAll(whereJson), response); + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java b/acs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java new file mode 100644 index 0000000..e4bcc6c --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java @@ -0,0 +1,74 @@ + +package org.nl.acs.history.service; + +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.springframework.data.domain.Pageable; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** +* @description 服务接口 +* @author gengby +* @date 2023-03-15 +**/ +public interface DeviceErrorLogService { + + /** + * 查询数据分页 + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map queryAll(Map whereJson, Pageable page); + + /** + * 查询所有数据不分页 + * @param whereJson 条件参数 + * @return List + */ + List queryAll(Map whereJson); + + /** + * 根据ID查询 + * @param error_log_uuid ID + * @return AcsDeviceErrorLog + */ + DeviceErrorLogDto findById(String error_log_uuid); + + /** + * 根据编码查询 + * @param code code + * @return AcsDeviceErrorLog + */ + DeviceErrorLogDto findByCode(String code); + + + /** + * 创建 + * @param dto / + */ + void create(DeviceErrorLogDto dto); + + /** + * 编辑 + * @param dto / + */ + void update(DeviceErrorLogDto dto); + + /** + * 多选删除 + * @param ids / + */ + void deleteAll(String[] ids); + + /** + * 导出数据 + * @param dtos 待导出的数据 + * @param response / + * @throws IOException / + */ + void download(List dtos, HttpServletResponse response) throws IOException; +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java b/acs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java new file mode 100644 index 0000000..eb08cae --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java @@ -0,0 +1,29 @@ +package org.nl.acs.history.service.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** +* @description / +* @author gengby +* @date 2023-03-15 +**/ +@Data +public class DeviceErrorLogDto implements Serializable { + + /** 报警日志标识 */ + private String error_log_uuid; + + /** 设备编码 */ + private String device_code; + + /** 报警编码 */ + private String error_code; + + /** 报警信息 */ + private String error_info; + + /** 报警时间 */ + private String error_time; +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java new file mode 100644 index 0000000..19120c0 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java @@ -0,0 +1,137 @@ + +package org.nl.acs.history.service.impl; + + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.FileUtil; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.wql.core.bean.ResultBean; +import org.nl.modules.wql.core.bean.WQLObject; +import org.nl.modules.wql.util.WqlUtil; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * @author gengby + * @description 服务实现 + * @date 2023-03-15 + **/ +@Service +@RequiredArgsConstructor +@Slf4j +public class DeviceErrorLogServiceImpl implements DeviceErrorLogService { + + @Override + public Map queryAll(Map whereJson, Pageable page) { + String device_code = MapUtil.getStr(whereJson, "device_code"); + String error_code = MapUtil.getStr(whereJson, "error_code"); + String error_info = MapUtil.getStr(whereJson, "error_info"); + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + String where = "1 = 1 "; + if (StrUtil.isNotEmpty(device_code)) { + where += "and device_code like '%" + device_code + "%'"; + } + if (StrUtil.isNotEmpty(error_code)) { + where += "and error_code like '%" + error_code + "%'"; + } + if (StrUtil.isNotEmpty(error_info)) { + where += "and error_info like '%" + error_info + "%'"; + } + ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), where, "error_time desc"); + final JSONObject json = rb.pageResult(); + return json; + } + + @Override + public List queryAll(Map whereJson) { + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(DeviceErrorLogDto.class); + return list; + } + + @Override + public DeviceErrorLogDto findById(String error_log_uuid) { + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + JSONObject json = wo.query("error_log_uuid ='" + error_log_uuid + "'").uniqueResult(0); + final DeviceErrorLogDto obj = (DeviceErrorLogDto) JSONObject.toJavaObject(json, DeviceErrorLogDto.class); + return obj; + } + + @Override + public DeviceErrorLogDto findByCode(String code) { + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0); + final DeviceErrorLogDto obj = (DeviceErrorLogDto) JSONObject.toJavaObject(json, DeviceErrorLogDto.class); + return obj; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void create(DeviceErrorLogDto dto) { + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + + dto.setError_log_uuid(IdUtil.simpleUUID()); + dto.setDevice_code(dto.getDevice_code()); + dto.setError_code(dto.getError_code()); + dto.setError_info(dto.getError_info()); + dto.setError_time(now); + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + JSONObject json = (JSONObject) JSONObject.toJSON(dto); + wo.insert(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void update(DeviceErrorLogDto dto) { + DeviceErrorLogDto entity = this.findById(dto.getError_log_uuid()); + if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!"); + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + JSONObject json = (JSONObject) JSONObject.toJSON(dto); + wo.update(json); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteAll(String[] ids) { + WQLObject wo = WQLObject.getWQLObject("acs_device_error_log"); + for (String error_log_uuid : ids) { + wo.delete("error_log_uuid = '" + error_log_uuid + "'"); + } + } + + @Override + public void download(List all, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (DeviceErrorLogDto acsDeviceErrorLog : all) { + Map map = new LinkedHashMap<>(); + map.put("设备编码", acsDeviceErrorLog.getDevice_code()); + map.put("报警编码", acsDeviceErrorLog.getError_code()); + map.put("报警信息", acsDeviceErrorLog.getError_info()); + map.put("报警时间", acsDeviceErrorLog.getError_time()); + list.add(map); + } + FileUtil.downloadExcel(list, response); + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index 97bd083..b875da4 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; @@ -14,10 +15,12 @@ import org.nl.acs.AcsConfig; import org.nl.acs.agv.server.MagicAgvService; import org.nl.acs.agv.server.NDCAgvService; import org.nl.acs.agv.server.XianGongAgvService; +import org.nl.acs.agv.server.ZheDaAgvService; import org.nl.acs.auto.initial.ApplicationAutoInitial; import org.nl.acs.device.service.DeviceService; import org.nl.acs.device.service.impl.DeviceServiceImpl; import org.nl.acs.device_driver.DeviceDriver; +import org.nl.acs.device_driver.basedriver.agv.utils.AgvSystemEnum; import org.nl.acs.device_driver.basedriver.hongxiang_device.HongXiangConveyorDeviceDriver; import org.nl.acs.device_driver.basedriver.siemens_conveyor.SiemensConveyorDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_scanner.StandardCoveyorControlWithScannerDeviceDriver; @@ -45,6 +48,7 @@ import org.nl.modules.wql.core.bean.WQLObject; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.modules.wql.util.WqlUtil; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -81,6 +85,15 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu TaskService taskService; @Autowired AcsToLiKuService acsToLiKuService; + @Lazy + @Autowired + MagicAgvService magicAgvService; + @Lazy + @Autowired + XianGongAgvService xianGongAgvService; + @Lazy + @Autowired + ZheDaAgvService zheDaAgvService; @Override public void autoInitial() { @@ -362,19 +375,51 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu if (ObjectUtil.isEmpty(route)) { throw new BadRequestException("未查询到相关路由!"); } - if (StrUtil.equals(shortPathsList.get(0).getType(), "1")) { - NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); - ndcAgvService.sendAgvInstToNDC(task.getAgv_system_type(), dto); + + try { + if (StrUtil.equals(shortPathsList.get(0).getType(), "1")) { + if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).toString(), AgvSystemEnum.Maigic.getCode())) { + HttpResponse result = magicAgvService.sendAgvInstToMagic(dto); + if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { + dto.setSend_status("2"); + } else { + dto.setSend_status("1"); + } + } else if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).toString(), AgvSystemEnum.NDC.getCode())) { + ndcAgvService.sendAgvInstToNDC("1",dto); + dto.setSend_status("1"); + + } else if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).toString(), AgvSystemEnum.XianGong.getCode())) { + if (StrUtil.equals(task.getRequest_again_success(), "1")) { + //追加订单 + HttpResponse result = xianGongAgvService.sendOrderSequencesToXZ(dto); + if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { + dto.setSend_status("2"); + } else { + dto.setSend_status("1"); + } + } else { + //创建订单序列 + HttpResponse result = xianGongAgvService.sendOrderSequencesToXZ(dto); + if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { + dto.setSend_status("2"); + } else { + dto.setSend_status("1"); + } + } + } + } + } catch (Exception e) { + dto.setSend_status("2"); + e.printStackTrace(); } } catch (Exception e) { dto.setSend_status("2"); e.printStackTrace(); log.error(""); } - WQLObject wo = WQLObject.getWQLObject("acs_instruction"); JSONObject json = (JSONObject) JSONObject.toJSON(dto); - wo.insert(json); instructions.add(dto); } 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..f3f2c09 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/udw/rest/UdwManagerController.java @@ -0,0 +1,47 @@ + +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.nl.modules.logging.annotation.Log; +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 + @Log("查询内存点位") + @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..6d3ef62 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..e03e26f 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,16 +1,157 @@ package org.nl.acs.udw.service.impl; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; +import org.nl.acs.task.service.dto.TaskDto; +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 { + + public UdwManagerServiceImpl() { + } + @Override public List queryByConditions(JSONObject where) { - return null; + String unified_key = null; + String keys = null; + + 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); + } + } + + return udwDtos; + } 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); + } + + return udwDtos; + } + } + } + + @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/modules/logging/DeviceCodeDir.java b/acs/nladmin-system/src/main/java/org/nl/modules/logging/DeviceCodeDir.java new file mode 100644 index 0000000..d862214 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/logging/DeviceCodeDir.java @@ -0,0 +1,23 @@ +package org.nl.modules.logging; + +import ch.qos.logback.core.PropertyDefinerBase; +import org.springframework.stereotype.Component; + +// 通过实现logback的PropertyDefinerBase方法,动态定义logback配置中的变量 +@Component +public class DeviceCodeDir extends PropertyDefinerBase { + + String deviceCodeDir = ""; + public void setPropertyValue(String deviceCode) { + deviceCodeDir = deviceCode ; + } + + @Override + public String getPropertyValue() { + if (deviceCodeDir == ""){ + deviceCodeDir = "默认"; + } + return "默认"; + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Indexer.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Indexer.java new file mode 100644 index 0000000..a9c677c --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Indexer.java @@ -0,0 +1,178 @@ +package org.nl.modules.lucene.common; + +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.io.FileUtils; +import org.apache.lucene.analysis.Analyzer; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.TextField; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; +import org.springframework.beans.factory.annotation.Value; +import org.wltea.analyzer.lucene.IKAnalyzer; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Set; + +/** + * lucene索引器 + */ +public class Indexer { + /** + * 写索引实例 + */ + private IndexWriter writer; + + public IndexWriter getWriter() { + return writer; + } + + /** + * 构造方法,实例化IndexWriter + * @param indexDir + * @throws Exception + */ + public Indexer(String indexDir) throws Exception { + Directory dir = FSDirectory.open(Paths.get(indexDir)); + //标准分词器,会自动去掉空格啊,is a the等单词 +// Analyzer analyzer = new StandardAnalyzer(); + Analyzer analyzer = new IKAnalyzer(); + //将标准分词器配到写索引的配置中 + IndexWriterConfig config = new IndexWriterConfig(analyzer); + //实例化写索引对象 + writer = new IndexWriter(dir, config); + } + + /** + * 索引指定目录下的所有文件 + * @param dataDir + * @return + * @throws Exception + */ + public int indexAll(String dataDir) throws Exception { + // 获取该路径下的所有文件 + File[] files = new File(dataDir).listFiles(); + if (null != files) { + for (File file : files) { + //调用下面的indexFile方法,对每个文件进行索引 + indexFile(file); + } + } + //返回索引的文件数 +// return writer.numDocs(); + return writer.numRamDocs(); + } + + /** + * 索引指定的文件 + * @param file + * @throws Exception + */ + private void indexFile(File file) throws Exception { + System.out.println("索引文件的路径:" + file.getCanonicalPath()); + //调用下面的getDocument方法,获取该文件的document + Document doc = getDocument(file); + //添加索引文档 + //Document doc = json2Doc(jsonDoc); +// Document doc = new Document(); +// doc.add(new TextField("content", jsonDoc, Field.Store.YES)); + Field fieldContent=new TextField("fieldContent", FileUtils.readFileToString(null,"UTF-8"), Field.Store.YES); + + //将doc添加到索引中 + writer.addDocument(doc); + } + + /** + * 获取文档,文档里再设置每个字段,就类似于数据库中的一行记录 + * @param file + * @return + * @throws Exception + */ + private Document getDocument(File file) throws Exception { + Document doc = new Document(); + //开始添加字段 + //添加内容 + doc.add(new TextField("contents", new FileReader(file))); + //添加文件名,并把这个字段存到索引文件里 + doc.add(new TextField("fileName", file.getName(), Field.Store.YES)); + //添加文件路径 + doc.add(new TextField("fullPath", file.getCanonicalPath(), Field.Store.YES)); + return doc; + } + public Document json2Doc(String strDoc) { + Document doc = new Document(); + JSONObject jsonDoc = JSONObject.parseObject(strDoc); + Set keys = jsonDoc.keySet(); + for (String key : keys) { + doc.add(new TextField(key, jsonDoc.getString(key), Field.Store.YES)); + } + return doc; + } + + public void addLogIndex(String msg) throws IOException { + //步骤一:创建Directory对象,用于指定索引库的位置 RAMDirectory内存 + Directory directory = FSDirectory.open(new File("D:\\lucene\\index").toPath()); + //步骤二:创建一个IndexWriter对象,用于写索引 +// Analyzer analyzer = new StandardAnalyzer(); + IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(new IKAnalyzer(false))); +// indexWriter.deleteAll();//清理所有索引库 +// IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(new StandardAnalyzer())); + //记录索引开始时间 + long startTime = System.currentTimeMillis(); + //步骤三:读取磁盘中文件,对应每一个文件创建一个文档对象 + Document document = new Document(); +// document.add(new TextField("fieldContent", device_id, Field.Store.YES)); + document.add(new TextField("fieldContent", msg, Field.Store.YES)); + indexWriter.addDocument(document); + //记录索引结束时间 + long endTime = System.currentTimeMillis(); + System.out.println("建立索引"+ "共耗时" + (endTime-startTime) + "毫秒"); + indexWriter.commit(); + //步骤八:关闭资源 + indexWriter.close(); + System.out.println("建立索引成功-----关闭资源"); + } + //系统的日志文件路径 + @Value("${logging.file.path}") + private String logUrl; + + public static void main(String[] args)throws IOException { + //步骤一:创建Directory对象,用于指定索引库的位置 RAMDirectory内存 + Directory directory = FSDirectory.open(new File("D:\\lucene\\index").toPath()); + //步骤二:创建一个IndexWriter对象,用于写索引 +// Analyzer analyzer = new StandardAnalyzer(); + IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(new IKAnalyzer(false))); + + indexWriter.deleteAll();//清理所有索引库 +// IndexWriter indexWriter=new IndexWriter(directory,new IndexWriterConfig(new StandardAnalyzer())); + //记录索引开始时间 + long startTime = System.currentTimeMillis(); + //步骤三:读取磁盘中文件,对应每一个文件创建一个文档对象 + File file=new File("D:\\testlog"); + //步骤四:获取文件列表 + File[] files = file.listFiles(); + for (File item:files) { + BufferedReader bufferedReader = new BufferedReader(new FileReader(item)); + String strLine = null; + while(null != (strLine = bufferedReader.readLine())){ + Document document = new Document(); +// document.add(new Field()); + document.add(new TextField("fieldContent", strLine, Field.Store.YES)); + indexWriter.addDocument(document); + } + } + //记录索引结束时间 + long endTime = System.currentTimeMillis(); + System.out.println("建立索引"+ "共耗时" + (endTime-startTime) + "毫秒"); + indexWriter.commit(); + //步骤八:关闭资源 + indexWriter.close(); + System.out.println("建立索引成功-----关闭资源"); + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/LuceneIndexWriter.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/LuceneIndexWriter.java new file mode 100644 index 0000000..df7c4eb --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/LuceneIndexWriter.java @@ -0,0 +1,66 @@ +package org.nl.modules.lucene.common; + +import cn.hutool.core.date.DateUtil; +import org.apache.lucene.index.CorruptIndexException; +import org.apache.lucene.index.IndexWriter; +import org.apache.lucene.index.IndexWriterConfig; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; +import org.nl.modules.lucene.config.UrlConfig; +import org.wltea.analyzer.lucene.IKAnalyzer; + +import java.io.File; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class LuceneIndexWriter { + private static IndexWriter indexWriter; + + static { + try { + Directory directory = FSDirectory.open(new File(UrlConfig.luceneUrl).toPath()); + IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer()); + indexWriter = new IndexWriter(directory, config); + } catch (Exception e) { + e.printStackTrace(); + } + /**当当前线程结束时,自动关闭IndexWriter,使用Runtime对象*/ + Runtime.getRuntime().addShutdownHook(new Thread(){ + @Override + public void run() { + try { + closeIndexWriter(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + } + /**在线程结束时,自动关闭IndexWriter*/ + public static IndexWriter getIndexWriter() { + return indexWriter; + } + /**关闭IndexWriter + * @throws IOException + * @throws CorruptIndexException */ + public static void closeIndexWriter() throws Exception { + if(indexWriter != null) { + indexWriter.close(); + } + } + + public static void main(String[] args) throws IOException { + indexWriter.deleteAll(); + } + + public static String getDate(String timeString) throws ParseException { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");//时间格式 + Date date = sdf.parse(timeString); + timeString = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss.SSS");//格式化后的时间 + return timeString; + } + + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Searcher.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Searcher.java new file mode 100644 index 0000000..140c96e --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/common/Searcher.java @@ -0,0 +1,140 @@ +package org.nl.modules.lucene.common; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.lucene.document.Document; +import org.apache.lucene.index.DirectoryReader; +import org.apache.lucene.index.IndexReader; +import org.apache.lucene.index.Term; +import org.apache.lucene.search.*; +import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; +import org.apache.lucene.util.BytesRef; + +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +/** + * lucene查询器 + */ +@Slf4j +public class Searcher { + + public static Map search(String indexDir, String ext,Map whereJson) throws Exception { + //获取要查询的路径,也就是索引所在的位置 + Directory dir = FSDirectory.open(Paths.get(indexDir)); + IndexReader reader = DirectoryReader.open(dir); + //构建IndexSearcher + IndexSearcher searcher = new IndexSearcher(reader); + //标准分词器,会自动去掉空格啊,is a the等单词 +// Analyzer analyzer = new StandardAnalyzer(); +// Analyzer analyzer = new IKAnalyzer(false); + //查询解析器 +// QueryParser queryParser = new QueryParser("fieldContent", analyzer); + + //记录索引开始时间 + long startTime = System.currentTimeMillis(); + // 实际上Lucene本身不支持分页。因此我们需要自己进行逻辑分页。我们要准备分页参数: + int pageSize = Integer.parseInt(whereJson.get("size").toString());// 每页条数 + int pageNum = Integer.parseInt(whereJson.get("page").toString());// 当前页码 + int start = pageNum * pageSize;// 当前页的起始条数 + int end = start + pageSize;// 当前页的结束条数(不能包含) + // 创建排序对象,需要排序字段SortField,参数:字段的名称、字段的类型、是否反转如果是false,升序。true降序 + Sort sort = new Sort(new SortField("logTime", SortField.Type.DOC,true)); + + TopDocs docs = null; + BooleanQuery.Builder booleanQueryBuilder = new BooleanQuery.Builder(); + //时间范围查询 + String startDate = (String) whereJson.get("begin_time"); + String endDate = (String) whereJson.get("end_time"); + Calendar calendar=Calendar.getInstance(); + calendar.set(1970, 0, 1); + if (startDate == null){ + startDate = DateUtil.format(calendar.getTime(),"yyyy-MM-dd HH:mm:ss.SSS"); + }else{ + startDate = LuceneIndexWriter.getDate(startDate); + } + if (endDate == null){ + endDate = DateUtil.format(new DateTime(),"yyyy-MM-dd HH:mm:ss.SSS"); + } else { + endDate = LuceneIndexWriter.getDate(endDate); + } + TermRangeQuery termRangeQuery = new TermRangeQuery("logTime", new BytesRef(startDate), new BytesRef(endDate), true, true); + booleanQueryBuilder.add(termRangeQuery,BooleanClause.Occur.MUST); + if (whereJson.get("device_code") != null){ + Query termQuery = new TermQuery(new Term("device_code", (String) whereJson.get("device_code"))); + booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST); + } + if (whereJson.get("method") != null){ + Query termQuery = new TermQuery(new Term("method", (String) whereJson.get("method"))); + booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST); + } + if (whereJson.get("status_code") != null){ + Query termQuery = new TermQuery(new Term("status_code", (String) whereJson.get("status_code"))); + booleanQueryBuilder.add(termQuery,BooleanClause.Occur.MUST); + } + if (whereJson.get("requestparam") != null){ + WildcardQuery query = new WildcardQuery(new Term("requestparam", "*"+(String) whereJson.get("requestparam")+"*")); + booleanQueryBuilder.add(query,BooleanClause.Occur.MUST); + } + if (whereJson.get("responseparam") != null){ + WildcardQuery query = new WildcardQuery(new Term("responseparam", "*"+(String) whereJson.get("responseparam")+"*")); + booleanQueryBuilder.add(query,BooleanClause.Occur.MUST); + } + if (whereJson.get("blurry") != null) { + WildcardQuery query = new WildcardQuery(new Term("fieldContent", "*"+(String) whereJson.get("blurry")+"*")); + booleanQueryBuilder.add(query, BooleanClause.Occur.MUST); + } + docs = searcher.search(booleanQueryBuilder.build(), end,sort); + //记录索引时间 + long endTime = System.currentTimeMillis(); + log.info("匹配{}共耗时{}毫秒",booleanQueryBuilder.build(),(endTime-startTime)); + log.info("查询到{}条日志文件", docs.totalHits.value); + List list = new ArrayList<>(); + ScoreDoc[] scoreDocs = docs.scoreDocs; + if (end > docs.totalHits.value) end = (int) docs.totalHits.value; + JSONArray array = new JSONArray(); + + for (int i = start; i < end; i++) { + ScoreDoc scoreDoc = scoreDocs[i]; + Document doc = reader.document(scoreDoc.doc); + JSONObject object = new JSONObject(); + object.put("content",doc.get("fieldContent")); + object.put("device_code",doc.get("device_code")); + object.put("logTime",doc.get("logTime")); + object.put("method",doc.get("method")); + object.put("status_code",doc.get("status_code")); + object.put("requestparam",doc.get("requestparam")); + object.put("responseparam",doc.get("responseparam")); + if(doc.get("fieldContent") != null) { + array.add(object); + } + } + for(Object logDto:array){ + log.info(logDto.toString()); + } + reader.close(); + JSONObject jo = new JSONObject(); + jo.put("content", array); + jo.put("totalElements", docs.totalHits.value); + return jo; + } + + public static void main(String[] args) { + String indexDir = "D:\\lucene\\index"; + //查询这个字符串 + String q = "07.832"; + Map whereJson = null; + try { + search(indexDir, q,whereJson); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/StaticConfig.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/StaticConfig.java new file mode 100644 index 0000000..d053859 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/StaticConfig.java @@ -0,0 +1,21 @@ +package org.nl.modules.lucene.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @deprecated 设置静态参数初始化 + */ +@Configuration +public class StaticConfig { + //日志索引目录 + @Value("${lucene.index.path}") + private String luceneDir; + + @Bean + public int initStatic() { + UrlConfig.setLuceneUrl(luceneDir); + return 0; + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/UrlConfig.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/UrlConfig.java new file mode 100644 index 0000000..d48ca3c --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/config/UrlConfig.java @@ -0,0 +1,13 @@ +package org.nl.modules.lucene.config; + +public class UrlConfig { + public static String luceneUrl; + + public static String getLuceneUrl() { + return luceneUrl; + } + + public static void setLuceneUrl(String luceneUrl) { + UrlConfig.luceneUrl = luceneUrl; + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/enums/LogTypeEnum.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/enums/LogTypeEnum.java new file mode 100644 index 0000000..96b2d23 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/enums/LogTypeEnum.java @@ -0,0 +1,15 @@ +package org.nl.modules.lucene.enums; + +public enum LogTypeEnum { + DEVICE_LOG("设备日志"), + INTERFACE_LOG("接口日志"); + + private String desc; + + LogTypeEnum(String desc) { + this.desc = desc; + } + public String getDesc() { + return desc; + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/rest/LuceneController.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/rest/LuceneController.java new file mode 100644 index 0000000..6d351c3 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/rest/LuceneController.java @@ -0,0 +1,43 @@ +package org.nl.modules.lucene.rest; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.logging.annotation.Log; +import org.nl.modules.lucene.service.LuceneService; +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/lucene") +@Slf4j +public class LuceneController { + + private final LuceneService luceneService; + + @GetMapping("/labels/values") + @ApiOperation("获取标签") + public ResponseEntity labelsValues() { + return new ResponseEntity<>(luceneService.getLabelsValues(), HttpStatus.OK); + } + + + @GetMapping("/getAll") + @Log("日志检索") + @ApiOperation("日志检索") + //@PreAuthorize("@el.check('task:list')") + public ResponseEntity get(@RequestParam Map whereJson, Pageable page) { + return new ResponseEntity<>(luceneService.getAll(whereJson, page), HttpStatus.OK); + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/LuceneExecuteLogService.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/LuceneExecuteLogService.java new file mode 100644 index 0000000..861dc72 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/LuceneExecuteLogService.java @@ -0,0 +1,41 @@ +package org.nl.modules.lucene.service; + + +import org.nl.modules.lucene.service.dto.LuceneLogDto; + +import java.io.IOException; + +public interface LuceneExecuteLogService { + /** + * 设备光电变化实时光电信号 + * + * @param device_code 设备编号 + * @param key plc信号 + * @param value plc信号值 + */ + void deviceItemValue(String device_code, String key, String value); + + /** + * 设备执行日志,会保留历史记录 + * + * @param luceneLogDto 日志结果对象 + */ + void deviceExecuteLog(LuceneLogDto luceneLogDto); + + /** + * 接口日志,会保留历史记录 + * + * @param luceneLogDto 日志结果对象 + */ + void interfaceExecuteLog(LuceneLogDto luceneLogDto) throws IOException; + + /** + * 设备执行日志,会保留历史记录 + * + * @param name 日志名称 + * @param message 日志信息 + */ + void extLog(String name, String message); + + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/LuceneService.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/LuceneService.java new file mode 100644 index 0000000..18156d3 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/LuceneService.java @@ -0,0 +1,24 @@ +package org.nl.modules.lucene.service; + +import com.alibaba.fastjson.JSONArray; +import org.springframework.data.domain.Pageable; + +import java.util.Map; + + +public interface LuceneService { + /** + * 获取labels和values树 + * @return + */ + JSONArray getLabelsValues(); + + /** + * 获取数据分页 + * + * @param whereJson 条件 + * @param page 分页参数 + * @return Map + */ + Map getAll(Map whereJson, Pageable page); +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/dto/LuceneLogDto.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/dto/LuceneLogDto.java new file mode 100644 index 0000000..bdd6e6c --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/dto/LuceneLogDto.java @@ -0,0 +1,95 @@ +package org.nl.modules.lucene.service.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class LuceneLogDto { + + /* 日志标识 */ + private String log_uuid; + /*日志类型*/ + private String logType; + /*设备编号*/ + private String device_code; + /*内容详情*/ + private String content; + + /* 任务编码 */ + private String task_code; + + /* 指令编码 */ + private String instruct_code; + + /* 任务标识 */ + private String task_id; + + /* 载具号 */ + private String vehicle_code; + + /* 备注 */ + private String remark; + + /* 日志类型 */ + private String log_type; + + /* 方法 */ + private String method; + + /* 请求参数 */ + private String requestparam; + + /* 响应参数 */ + private String responseparam; + + /* 请求地址 */ + private String requesturl; + + /* 状态码 */ + private String status_code; + + /* 是否删除 1:是;0:否 */ + private String is_delete; + + /* 创建者 */ + private String create_by; + + /* 创建时间 YYYY-MM-DD hh:mm:ss */ + private String create_time; + + /* 修改者 */ + private String update_by; + + /* 修改时间 */ + private String update_time; + + + public LuceneLogDto(final String opc_server_code, final String opc_plc_code, + final String device_code, final String to_home, final String last_home, + final String home) { + super(); + this.device_code = device_code; + this.content = "信号 [" + + opc_server_code + "." + + opc_plc_code + "." + + device_code + "." + + to_home + "] 发生变更 " + + last_home + " -> " + + home; + } + + public LuceneLogDto(final String device_code, final String remark) { + super(); + this.device_code = device_code; + this.content = "设备 [" + + device_code + + "] : " + + remark; + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneExecuteLogServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneExecuteLogServiceImpl.java new file mode 100644 index 0000000..f350977 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneExecuteLogServiceImpl.java @@ -0,0 +1,101 @@ +package org.nl.modules.lucene.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.lucene.document.Document; +import org.apache.lucene.document.Field; +import org.apache.lucene.document.StringField; +import org.apache.lucene.index.IndexWriter; +import org.nl.modules.lucene.common.LuceneIndexWriter; +import org.nl.modules.lucene.enums.LogTypeEnum; +import org.nl.modules.lucene.service.LuceneExecuteLogService; +import org.nl.modules.lucene.service.dto.LuceneLogDto; +import org.slf4j.MDC; +import org.springframework.stereotype.Service; + +import java.io.IOException; + +/** + * @author jlm + * @description 服务实现 + * @date 2023-04-11 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class LuceneExecuteLogServiceImpl implements LuceneExecuteLogService { + + @Override + public void deviceItemValue(String device_code, String key, String value) { + String now = DateUtil.now(); + } + + @SneakyThrows + @Override + public void deviceExecuteLog(LuceneLogDto luceneLogDto) { + luceneLogDto.setLogType(LogTypeEnum.DEVICE_LOG.getDesc()); + addIndex(luceneLogDto); + } + + @Override + public void interfaceExecuteLog(LuceneLogDto luceneLogDto) throws IOException { + luceneLogDto.setLogType(LogTypeEnum.INTERFACE_LOG.getDesc()); + addIndex(luceneLogDto); + } + + private void addIndex(LuceneLogDto luceneLogDto) throws IOException { + IndexWriter indexWriter = LuceneIndexWriter.getIndexWriter(); + //创建一个Document对象 + Document document = new Document(); + try { + //记录索引开始时间 + long startTime = System.currentTimeMillis(); + //向document对象中添加域。 + if (ObjectUtil.isNotEmpty(luceneLogDto.getDevice_code())) { + document.add(new StringField("device_code", luceneLogDto.getDevice_code(), Field.Store.YES)); +// document.add(new TextField("device_code", luceneLogDto.getDevice_code(), Field.Store.YES)); + } + if (ObjectUtil.isNotEmpty(luceneLogDto.getContent())) { + document.add(new StringField("fieldContent", luceneLogDto.getContent(), Field.Store.YES)); + } + if (ObjectUtil.isNotEmpty(luceneLogDto.getMethod())) { + document.add(new StringField("method", luceneLogDto.getMethod(), Field.Store.YES)); + } + if (ObjectUtil.isNotEmpty(luceneLogDto.getStatus_code())) { + document.add(new StringField("status_code", luceneLogDto.getStatus_code(), Field.Store.YES)); + } + if (ObjectUtil.isNotEmpty(luceneLogDto.getRequestparam())) { + document.add(new StringField("requestparam", luceneLogDto.getRequestparam(), Field.Store.YES)); + } + if (ObjectUtil.isNotEmpty(luceneLogDto.getResponseparam())) { + document.add(new StringField("responseparam", luceneLogDto.getResponseparam(), Field.Store.YES)); + } + document.add(new StringField("logType", luceneLogDto.getLogType(), Field.Store.YES)); + document.add(new StringField("logTime", DateUtil.format(new DateTime(), "yyyy-MM-dd HH:mm:ss.SSS"), Field.Store.YES)); + indexWriter.addDocument(document); + //记录索引结束时间 + long endTime = System.currentTimeMillis(); + log.info("建立索引共耗时{}毫秒", endTime - startTime); + indexWriter.commit(); + MDC.put("DEVICECODE", luceneLogDto.getDevice_code()); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + + @Override + public void extLog(String name, String message) { + try { + MDC.put(name, name); + log.info("{}", message); + } catch (Exception e) { + e.printStackTrace(); + } finally { + MDC.remove(name); + } + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneServiceImpl.java new file mode 100644 index 0000000..cfce669 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/lucene/service/impl/LuceneServiceImpl.java @@ -0,0 +1,85 @@ +package org.nl.modules.lucene.service.impl; + +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.modules.lucene.common.Searcher; +import org.nl.modules.lucene.service.LuceneService; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + +import java.util.Map; + + +@Service +@RequiredArgsConstructor +@Slf4j +public class LuceneServiceImpl implements LuceneService { + + @Value("${loki.url}") + private String lokiUrl; + + @Value("${loki.systemName}") + private String systemName; + + //日志索引目录 + @Value("${lucene.index.path}") + private String luceneUrl; + + /** + * 获取labels和values树 + * + * @return + */ + @Override + public JSONArray getLabelsValues() { + JSONArray result = new JSONArray(); + // 获取所有标签 + String labelString = HttpUtil.get(lokiUrl + "/labels", CharsetUtil.CHARSET_UTF_8); + JSONObject parse = (JSONObject) JSONObject.parse(labelString); + JSONArray labels = parse.getJSONArray("data"); + for (int i=0; i getAll(Map whereJson, Pageable page) { + JSONObject jo = new JSONObject(); + try { + JSONObject jsonObject = (JSONObject) Searcher.search(luceneUrl, "", whereJson); + JSONArray array = jsonObject.getJSONArray("content"); + int totalElements = Integer.parseInt(jsonObject.get("totalElements").toString()); + jo.put("content", array); + jo.put("totalElements", totalElements); + } catch (Exception e) { + log.error("索引查询为空", e); + throw new NullPointerException("索引查询为空"); + } + + return jo; + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java b/acs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java index 76a0011..dc2879a 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java @@ -27,9 +27,9 @@ import java.util.Map; import java.util.Set; /** -* @author Zheng Jie -* @date 2019-04-10 -*/ + * @author Zheng Jie + * @date 2019-04-10 + */ public interface DictService { /** @@ -47,6 +47,8 @@ public interface DictService { */ List queryAll(DictQueryCriteria dict); + List queryAll(); + /** * 创建 * @param resources / diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java index 4b938b4..e50c547 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java @@ -36,9 +36,9 @@ import java.io.IOException; import java.util.*; /** -* @author Zheng Jie -* @date 2019-04-10 -*/ + * @author Zheng Jie + * @date 2019-04-10 + */ @Service @RequiredArgsConstructor @CacheConfig(cacheNames = "dict") @@ -60,6 +60,12 @@ public class DictServiceImpl implements DictService { return dictMapper.toDto(list); } + @Override + public List queryAll() { + List list = dictRepository.findAll(); + return list; + } + @Override @Transactional(rollbackFor = Exception.class) public void create(Dict resources) { diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/system/wql/sys.xls b/acs/nladmin-system/src/main/java/org/nl/modules/system/wql/sys.xls index 82566ab6461a4d0e92adeacbb1883cf1ca00f877..965ded2998aa168b2d2bf32c28ee2be2542e0f4c 100644 GIT binary patch delta 13290 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 delta 11014 zcmbta30M?I)9#+x3)o$5b^*B-M6TsnV1bCrEhykkNP?mu0*ZhNUMLF~jm8tlIA2s0 zP2!ORJWw|pgBXqGPrUD#c*FxmqrrHfM&+xXT~^lMXP)QZv8TGLtLp8l?yl(>tXLqe zcrIBoRB#_5RF2tVcgkUF@dCV*;$cw(pPGgFYcN74%tHE{wEwwB8(Uk>2fV8{r*3^PW(`ERdQtWJ+dW zhBmXr6th_hts$Mbi+ zf^1MEQ`lv1fWCKim%UE<-lJXic3AFOH<;7y#rWIE?0dmLj7O!j+>0TW|Jm!I*Ii^I z!@ZdGHXCqny^rObr(NEei?)dng)aO4|9oblOwLHGt(XDU0vyFO%K9=Xwk8(KEG=0x z)(r9NxFN?d&T<)!Wg0DIIF7r=Gh^g^aRO5>m)ZC22m@&Cb=m9Ep_Ry7k_UjJQv0rg zVX6;C?=E|dLe((GK8%Nxm_{d=eG-6Sq(EpYRLGBN;tcg;?iqUR|IwSoI6KS0g4($+ z+{>Li>{xaoS#RhClyDtL2TBri3GDP|9yTEp6VvU{g~A*GVA`J zhLI~mB7;72rMrv?@DW=(0H&p7lxvhL5}0sf2YrQ;wbMWN{TP2&Vz(abCNU#i$=G`< z2u7o;jFBiTnR`A$;N5%GVw~LM2B}mxGRl`QHckWT9hPLwMNUpPZmELE5z7RH+=&h+ z&D1D}JwN~(#J?n_8KgVv5CPzT6=t|Qkpuh8LiedSsX^cJTHcbR=ZE*Msw+>_|t z?hU=V2{rAax3D{B+)KvPbSFVxZIJHD*30f>SpJ@5puN4weT1is3GE?=+9FSxeKL&V zcZw_xHKjk;ZlhaI0+qw>JhcmwaT_gSZhGt$${qzb!Afrfo$- zzW*v`?8sOQ^u^t{yAyYJ=I$=s-Icp5nENTdlsjhbC(4`%5pP}Y&s0DP?81sPw=5dNA6+~16C>0@24V42Y z*lO-JfM1BhI3tUljV#cWJ*3UUALV4{J)AEcLwNY0j#r#hm|Zqw{=0;ienH2(mWrpk zjU_xOy4Oy4G|ro=m}#3yI1y&>00z$AGcK3s%_W@RL>=ed52g+Rjs{GH4kauew$tFL z2jwS-O#PE|X|kp_^?wuEiJG*M{iWD@1a%Ld3c{U^~V?*A+{c0l7}zz4>E0 z(jdT4$Q+?oFFsU}pj8AE&!A8(wAM7N&28r~pBFf|d@LkFRYJWGO@uHS2~9XmATu`T zYi!-nT5yY!1R&h%$0KHitsaaU&o+&VAW_u+;*%B7_XKQEyweMk*A^x}9P#b3;Vom? zW0~#fG_l~dLl+;!916365Q({$gT<99n%uXpb;M3Hc>Z~Wt!OouIQE9Ycs(nqhc zoVHCfcJm)O>6iLUVc}P_T3LzVrmoku6VFf0}%-t%R~)dh5WCqocA%XK0q7RaVq@R2C z@!8K;?aDaXCKg7n9C@?p=w0`3PIt*FHXYaeS$7Sp0}D*1eakI(DXR?SX@S8`xe)dY#yKI#F!9yx-7- zFH)P?%)_}ZeKMatzovPl^+~VeFZ^N0k?Rj4ORdIdN7)a=2P*Sx`Bz#FRpwWy>gzt) zn*RQGYbuscxKMGo0w><9vC8Kk%Q)Re&1$lVI+>f0v-9Uwd&>CzTryS$uT)QZ& z^yCM_#`vGzR^9EwSG}AMOk7hHv-z~}PDS1%&;Oem=Xh3I{Z7b7XZMXr()bLh2uRyJ zeade)cOLhB^uF*xu*`7@8ryELlt+r)d{ZUs{pd>?EZ01(5*IHjbq`!}C_ zcKdi+Y@o}{!`&iJc}Cr^Y+cxta8Glh{Zj6Zxh{10;yUNW@#?b3W7ouiV$Z734d#8O zE}eO*?9XTSAI#j4G5&se%INw@VbW`Dzg12z@0sq~(o*B_x6(du&FvfIrLtz5*lMSu zy}#Wt|G8{`#oy%L*jjV%VS&1`5AH2p(yyWhWp7QpF`=Nh?AYI%r=R_L#&NcED0K#TOP90@ zALq1$GPfqh@UKHA`J*AAMCM8zv|~?V9&mrT$zZ%2P&5h^Lvn{Tt|2pwq#0dfSv_fC_!l6420aI2wBZU=u4pU zfx1H`ZUed)sFMbv9pG;jPzN}Y+y^=j=%5OOT7cdHS^~o7NKh& zB2;DvShEq*Op_t>d=5g(;Iy>=BZNMHGuisN2=#`8!Mu4e07rysK1L|C8}R1?9}dQw z79bSujL@z{2n9ogzFUk?7^Lm#OAvYp)V3N1NFgL#iclqF?}tDON#q!WG9Yq~mLXIG z5qtUx(x6EYvVJT=2Owms{~+`=gi7)$j1)pt2J{io;uQ$phDcE`A2T2_!Wu9P5xEC6 z4<|qrxc#+D1U+&DXs_{!oCv)@rU>Ez&pz_-BQ^wJ1O6FZIvdkTrtR7H<&~rw_Z!`ii{D*lk!r6d$K_79N48;14HXx3jYzXyZWnMH+vc`IK zE96L`L4M4vz47o4!u^!y$$Xia%A!9N_?_ESFIcF=*6 zk<0*lw$vi)*@(Qkcjw<2at#(z{w}#Cne{j@CUe}uX56ZS@Z$ZH)sKIGOe`H*V6ZbAz(|5$zf26KrT8bkBrz?;uU*>ZX7~m+6+r_0*aV~LrtINScoo^6 zY1%2EOZAdqNaBX^cLsVjek%-#-7tP@+;Q2k<(9Y%+p^Cr@epjsrdr_vKvrAfSRhw* z#M7E zi@aH1-FT+!wSg0P_IcazchA^zsn|VvDwGiv$A~y0%>?0+6 zoQRvjM*-B%+6$=^ID42%$%Oqf86)$>7}YG%!j!7IdpqO1!2TDrsr9`L&r_}cTs%?; zTCg-YE$Lg_(=Nst=7LpAF-l)$a4$`3R*U_yw+j~kOZN=mp0sxH7dVA4_;W8t4QGfK zRSNCsBX|J?(X#ya=9D~b!fAYv24CFuT9UW;5_%rHhy@qVVf6bSuY6%g9Kiy1@C__m z-i*7Yyo78Cdk69#9OZ+H2 z+mvp&k1v`DB!6P`_v6>Xpsjid8yzNM$G^j7VO}q?k?&#Yj=!iXf$+r>jC?7II}+;> zc7cf6jWw?LPA7w|Fw{3)Qo~ci4ZFa~);*3ea>H=i*0(5V?KZS%XpzUYPLc<$Zw)Oz zwD!Q8jlNR=O*rxCTS90x8d@S~?KQMapw(n(nL=xyp=AcG?+q<6wDucX5@?aLhHfxY zXdQr-rkpZ`vnfIfh(c>0(n-Nub;n1bt!q)xI%;Uq$ODs;gRYMU3rh=qm=b^e`JkiI7Jvjf?C9QZgvcKUbOH_3gOWoiaaP1(YIq#zNj)f!13jfT&NG1W zj6mT9UOyNfyaK%f<$G&F4VR=t21gP`(i;-vG)t0_DFE zl)S4EPi;6*@~-BC$yZwvEizrc_#D>g=1yP$6>y;E^@9-rs4lz$BT&H`LCK3BnNm3i zO5V48@Gp8$AqRRvZ(B$(HQd|@IZ#Nu+(Hr>K!rx2!Z(7FPsPO3ZXBqH1N~JGD&jzY z)7usq92IexnvR7eGJuMVKt*o^g)ab{r>-2R34prei+WHK0QH1isdLB#Ky^FAgaf^7 z;PW+xj?N3o1VFpqGVqy!^HjlslJl?+zM=;uTh|x=t~XBhlWxbDa-bcKlJ%yWQnCs( zuU4<=8$BhDeKMyW9H<$92H~rEP%{7x!q@bmW&o<h}cYIwBD(1p_Lk}u8gjZ|?Dh5zp*u_Sm;!e@k7-uB%wnsem z;y}q$+Z{LSK_wjMO+Bc@04m`?I~K3R04gy8m2?8_gsFivNM0q0r#>7gc}BY9TY69_ z2il?sl^Q^$MxasysMH8l+BGO(lGjw?sK$>2H3v{n+*1!~&Vk<6gPH@VCpUNI0P2ZD zL6zita{%q&cPw5VUufWqpcV;s$P1l0GJ)2sON!1R50|x6XcEsiLFy27Ok5oJ7#|cErwjq-0+lf#fuS(YxVY%R*dTBxOs$$(78qI)8W!ExG<#Q-sKq34MK(|8K1m#O8UqSgAN*$DXD4U_IgF?=M+n_W+*$!nV zlwDBBapW5)yW#zvGx#ku_CWcL#h7ldF1FYyqMxgIBxF1L&?P)Rc^^#EPK%{yajPbd zZs+S(O+WZx2g_n-D!om}mbg=P)x`pH44Z?TLC8~Bh(xTLGiA-T4x^>Z)94?)5~4%H zqQjzLsi+eYVwE8(6d10IiH#3eqM-O-RZw(DxCIG0+nPr2(p2-K3NO!tHG%2}#{oWi2XMM0|8w3zse13jvO z>SVRjc~M9fU#Uc>X+O3}z*ms@x=&4zwdGYb^|ZZW$&kF9fjK3?eW6ynC}&u0P)Spc z!$u9Qs;9dRyK0)a4h1PzJ#pROJYRt;DZec7HAbP}nfk6n_UlAL^YSO5cZ(*D%PJ}w zx3MphyV65zrTI}Mig&9@$Dyn%s0ihaLk{=&s%QKntKdmdd&XPUUmj<*c1xCPM9p~D z2v>^@G!WD-88#~L@FR)pu0+)$QE5_uwo9`7?;L&Ts6KO7qHd9>;odH}Dk=GE;vI>J z>pP>;qh|%l`y#7-xT0qcnmB&_)*xj56Hj%T7vMK85kA)_->GwUxA1x|3X*qDif35p zUFXnYEzY4c%|kWj@TCDgLETrEnLidpnNKL!hD`ZgdJex31hos=-33b|nzTdhf{DH% zFC-yPB_TC01R>BNXcgq`cq*VQEHHzggtL|J(bHkMXkWZXPv8$C86XrkDcR3t=PF^V zCcqWT?P-{C_#Z$dKg2@bAhjT%!LZNCrVas4M{b#k+=1(l0$H3z+iTBf(ns;2X5@o1 zP+v$LF<>$jjKInOMUpV$p-u7vNkb$xk%SQroFEhdwP3gs09-eK1dxjbP6T^@BrRj5 zS+v-!0Og=Un5@aDh;7NFz1id}dj0=i*n!!!za$j&RDed3TL?QYo9<`UiN!W$)5%5* z*=Rb-h>`U=qi!^vU?lPKb;f|4*KDkKopB?Fj$}=8X?b(5&s8g}ROYVtgQ zlz>*{HJ1fNewwmE^z`>-7Z-lh!S8vsevQfS%;fFVy`vG;xAHppSO4T4xmNUf>PIu1 zJW_<$*$)0Jwg23^?{AD+%ET}O9^N?D!7rOL$UV|CZ&2Tb-_95{dT`q9j*bCSiqo7b zH7RoorC=UC1>(izcDNxN5^UpjHOd49zEy}6E<}`?aHdh zgN2g?v~Q{&^^c>3fS)^&>urPaU$)*$(K%~{b4_`U+Adz%tZP#3eVF{E2ZzyDd92U5fKTo z@d@fURp+9Rn8po^>7|H^kBfz585|NH9U2`Nt=1Lj?Hk)m5gZg8tO^ZLtKi9|QpZGS zcTJ-YVJ46#(pHqwPcUAloi>yHl`=u?W4JKTOf}z~t*D@*_~a2)!2VD{_s9KN%Ss>; bc6cSdjdiV}9VrRYMpn^0N*nkgeH{N6$Plb? diff --git a/acs/nladmin-system/src/main/resources/config/application-dev.yml b/acs/nladmin-system/src/main/resources/config/application-dev.yml index d4bbec2..dccfc03 100644 --- a/acs/nladmin-system/src/main/resources/config/application-dev.yml +++ b/acs/nladmin-system/src/main/resources/config/application-dev.yml @@ -1,24 +1,14 @@ server: port: 8010 - tomcat: - accept-count: 1000 - max-connections: 10000 - max-threads: 800 - min-spare-threads: 100 #配置数据源 spring: datasource: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - # url: jdbc:log4jdbc:mysql://${DB_HOST:10.1.3.91}:${DB_PORT:3306}/${DB_NAME:acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - # url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:lzhl_one_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:lzhl_one_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:zdlb_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} - # password: ${DB_PWD:P@ssw0rd} - # password: ${DB_PWD:Root.123456} - password: ${DB_PWD:123456} - + password: ${DB_PWD:Root.123456} # 初始连接数 initial-size: 5 # 最小连接数 @@ -136,8 +126,11 @@ file: avatarMaxSize: 5 logging: file: - path: D:\acs_log + path: D:\log\ACS config: classpath:logback-spring.xml +lucene: + index: + path: D:\lucene\index # Sa-Token配置 sa-token: @@ -160,5 +153,5 @@ sa-token: token-prefix: Bearer loki: - url: http://127.0.0.1:3100/loki/api/v1 + url: http://localhost:3100/loki/api/v1 systemName: acs diff --git a/acs/nladmin-system/src/main/resources/config/application-prod.yml b/acs/nladmin-system/src/main/resources/config/application-prod.yml index e22d641..fdcbec5 100644 --- a/acs/nladmin-system/src/main/resources/config/application-prod.yml +++ b/acs/nladmin-system/src/main/resources/config/application-prod.yml @@ -1,17 +1,12 @@ server: port: 8010 - tomcat: - accept-count: 1000 - max-connections: 10000 - max-threads: 800 - min-spare-threads: 100 #配置数据源 spring: datasource: druid: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy - url: jdbc:log4jdbc:mysql://${DB_HOST:10.1.3.91}:${DB_PORT:3306}/${DB_NAME:acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true + url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.4.210}:${DB_PORT:3306}/${DB_NAME:acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true username: ${DB_USER:root} password: ${DB_PWD:123456} # 初始连接数 @@ -19,9 +14,11 @@ spring: # 最小连接数 min-idle: 15 # 最大连接数 - max-active: 60 + max-active: 30 + # 超时时间(以秒数为单位) + remove-abandoned-timeout: 180 # 获取连接超时时间 - max-wait: 5000 + max-wait: 3000 # 连接有效性检测时间 time-between-eviction-runs-millis: 60000 # 连接在池中最小生存的时间 @@ -41,11 +38,8 @@ spring: enabled: true stat-view-servlet: enabled: true - # 控制台管理用户名和密码 url-pattern: /druid/* reset-enable: false - login-username: admin - login-password: 123456 filter: stat: enabled: true @@ -58,12 +52,11 @@ spring: multi-statement-allow: true redis: #数据库索引 - database: ${REDIS_DB:9} + database: ${REDIS_DB:2} host: ${REDIS_HOST:127.0.0.1} port: ${REDIS_PORT:6379} password: ${REDIS_PWD:} - #连接超时时间 - timeout: 5000 + # 登录相关配置 login: # 登录缓存 @@ -82,7 +75,7 @@ login: heigth: 36 # 内容长度 length: 2 - # 字体名称,为空则使用默认字体,如遇到线上乱码,设置其他字体即可 + # 字体名称,为空则使用默认字体 font-name: # 字体大小 font-size: 25 @@ -94,35 +87,28 @@ jwt: token-start-with: Bearer # 必须使用最少88位的Base64对该令牌进行编码 base64-secret: ZmQ0ZGI5NjQ0MDQwY2I4MjMxY2Y3ZmI3MjdhN2ZmMjNhODViOTg1ZGE0NTBjMGM4NDA5NzYxMjdjOWMwYWRmZTBlZjlhNGY3ZTg4Y2U3YTE1ODVkZDU5Y2Y3OGYwZWE1NzUzNWQ2YjFjZDc0NGMxZWU2MmQ3MjY1NzJmNTE0MzI= - # 令牌过期时间 此处单位/毫秒 ,默认2小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html - token-validity-in-seconds: 7200000 + # 令牌过期时间 此处单位/毫秒 ,默认4小时,可在此网站生成 https://www.convertworld.com/zh-hans/time/milliseconds.html + token-validity-in-seconds: 14400000 # 在线用户key online-key: online-token- # 验证码 code-key: code-key- - # token 续期检查时间范围(默认30分钟,单位默认毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期 + # token 续期检查时间范围(默认30分钟,单位毫秒),在token即将过期的一段时间内用户操作了,则给用户的token续期 detect: 1800000 - # 续期时间范围,默认 1小时,这里单位毫秒 + # 续期时间范围,默认1小时,单位毫秒 renew: 3600000 -# IP 本地解析 -ip: - local-parsing: true - #是否允许生成代码,生产环境设置为false generator: - enabled: false - -#如果生产环境要开启swagger,需要配置请求地址 -#springfox: -# documentation: -# swagger: -# v2: -# host: # 接口域名或外网ip + enabled: true #是否开启 swagger-ui swagger: - enabled: false + enabled: true + +# IP 本地解析 +ip: + local-parsing: true # 文件存储路径 file: @@ -140,8 +126,11 @@ file: avatarMaxSize: 5 logging: file: - path: D:\acs_log + path: D:\log\acs config: classpath:logback-spring.xml +lucene: + index: + path: D:\lucene\index # Sa-Token配置 sa-token: @@ -164,5 +153,5 @@ sa-token: token-prefix: Bearer loki: - url: http://localhost:3100/loki/api/v1 + url: http://192.168.4.210:3100/loki/api/v1 systemName: acs diff --git a/acs/nladmin-system/src/main/resources/config/application.yml b/acs/nladmin-system/src/main/resources/config/application.yml index 482d9bf..7e3fbea 100644 --- a/acs/nladmin-system/src/main/resources/config/application.yml +++ b/acs/nladmin-system/src/main/resources/config/application.yml @@ -44,7 +44,7 @@ rsa: private_key: MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEA0vfvyTdGJkdbHkB8mp0f3FE0GYP3AYPaJF7jUd1M0XxFSE2ceK3k2kw20YvQ09NJKk+OMjWQl9WitG9pB6tSCQIDAQABAkA2SimBrWC2/wvauBuYqjCFwLvYiRYqZKThUS3MZlebXJiLB+Ue/gUifAAKIg1avttUZsHBHrop4qfJCwAI0+YRAiEA+W3NK/RaXtnRqmoUUkb59zsZUBLpvZgQPfj1MhyHDz0CIQDYhsAhPJ3mgS64NbUZmGWuuNKp5coY2GIj/zYDMJp6vQIgUueLFXv/eZ1ekgz2Oi67MNCk5jeTF2BurZqNLR3MSmUCIFT3Q6uHMtsB9Eha4u7hS31tj1UWE+D+ADzp59MGnoftAiBeHT7gDMuqeJHPL4b+kC+gzV4FGTfhR9q3tTbklZkD2A== logging: file: - path: D:\acs_log + path: C:\log\wms config: classpath:logback-spring.xml # sa-token白名单配置 security: @@ -78,5 +78,3 @@ security: - /api/localStorage/pictures # 参数 - /api/param/getValueByCode -acsTowms: - token: Bearer eyJhbGciOiJIUzUxMiJ9.eyJqdGkiOiJiZTVmOGZiZDcyMWU0NGFiODRlOGI4NTE4ODE5OWM0ZiIsImF1dGgiOiJ1c2VyOmxpc3QsbW9uaXRvcjpsaXN0Iiwic3ViIjoiYWNzIn0.JGga-TcIHTt76KT_m_7bt-fxdBUdwdRfRjXzwLyPLVLLPoOSXbVPbf2q6vcV-fh33r2wyrBEleWYVPOEvjrZMw diff --git a/acs/nladmin-system/src/main/resources/initsql.txt b/acs/nladmin-system/src/main/resources/initsql.txt index dc704cb..3429f18 100644 --- a/acs/nladmin-system/src/main/resources/initsql.txt +++ b/acs/nladmin-system/src/main/resources/initsql.txt @@ -13,4 +13,5 @@ delete from acs_task_feedback; delete from sys_quartz_log; delete from acs_storage_cell; update acs_stage_actor set device_code='',image_name ='1'; -update sys_code_rule_detail set current_value=0; \ No newline at end of file +update sys_code_rule_detail set current_value=0; +update stage set stage_data = null; \ No newline at end of file diff --git a/acs/nladmin-system/src/main/resources/log/Lucene.xml b/acs/nladmin-system/src/main/resources/log/Lucene.xml new file mode 100644 index 0000000..b53961d --- /dev/null +++ b/acs/nladmin-system/src/main/resources/log/Lucene.xml @@ -0,0 +1,34 @@ + + + + + + + + + + ${LOG_HOME}/lucene/${DEVICECODE}/%d{yyyy-MM-dd}.%i.log + + 15 + + 200MB + + 2GB + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + ${log.charset} + + + + + + + + + + + diff --git a/acs/nladmin-system/src/main/resources/logback-spring.xml b/acs/nladmin-system/src/main/resources/logback-spring.xml index 15d2500..19e65fd 100644 --- a/acs/nladmin-system/src/main/resources/logback-spring.xml +++ b/acs/nladmin-system/src/main/resources/logback-spring.xml @@ -21,27 +21,13 @@ https://juejin.cn/post/6844903775631572999 - - - - - - - + + + - - ${log.pattern} @@ -49,7 +35,6 @@ https://juejin.cn/post/6844903775631572999 - @@ -92,37 +77,16 @@ https://juejin.cn/post/6844903775631572999 - - - error - - - - ${LOG_HOME}/ERROR/%d{yyyy-MM-dd}.%i.log - - 15 - - 200MB - - 20GB - - - ${log.pattern} - ${log.charset} - - - - + - @@ -163,49 +127,52 @@ https://juejin.cn/post/6844903775631572999 - + - - + - + - + - + - - - + + - + + - + + - + + - + + - + + 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/deviceErrorInfo/index.vue b/acs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue new file mode 100644 index 0000000..7a3611a --- /dev/null +++ b/acs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue @@ -0,0 +1,145 @@ + + + + + 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..17f53a1 --- /dev/null +++ b/acs/nladmin-ui/src/views/acs/history/udwData/index.vue @@ -0,0 +1,181 @@ + + + + + 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 index 49b7e27..75fa5fe 100644 --- a/acs/nladmin-ui/src/views/monitor/lucene/index.vue +++ b/acs/nladmin-ui/src/views/monitor/lucene/index.vue @@ -1,20 +1,8 @@ @@ -43,14 +38,13 @@ import crudOperation from '@crud/CRUD.operation' import pagination from '@crud/Pagination' import { delAll } from '@/api/acs/lucene/log' -const start = new Date() export default { name: 'LuceneLog', components: { Search, pagination, crudOperation }, mixins: [presenter(), header(), crud()], - cruds() { + cruds: function() { return CRUD({ - title: '系统参数', url: 'api/lucene', idField: 'id', sort: 'id,desc', + title: '系统参数', url: 'api/lucene/getAll', idField: 'id', sort: 'id,desc', queryOnPresenterCreated: true, optShow: { add: false, @@ -64,7 +58,7 @@ export default { page: 0 }, query: { - createTime: [start.setTime(start.getTime() - 3600 * 1000 * 0.5), new Date()] + createTime: [new Date(new Date().setTime(new Date().getTime() - 3600 * 1000)), new Date(new Date().setTime(new Date().getTime() + 3600 * 1000))] } }) }, diff --git a/acs/nladmin-ui/src/views/monitor/lucene/search.vue b/acs/nladmin-ui/src/views/monitor/lucene/search.vue index bfb9c19..a3657aa 100644 --- a/acs/nladmin-ui/src/views/monitor/lucene/search.vue +++ b/acs/nladmin-ui/src/views/monitor/lucene/search.vue @@ -1,10 +1,50 @@