From 5f0b3c40e9f017f907e84250ca5dba1f76c2e290 Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Mon, 27 Mar 2023 10:57:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...BoxPalletizingManipulatorDeviceDriver.java | 6 +- .../HongXiangStationDeviceDriver.java | 3 +- .../HongXiangConveyorDeviceDriver.java | 3 +- .../OvenGantryManipulatorDeviceDriver.java | 33 ++-- .../SiemensConveyorDeviceDriver.java | 3 +- .../SiemensConveyorCkkDeviceDriver.java | 3 +- .../SiemensConveyorLabelingDeviceDriver.java | 3 +- ...iemensOneFloorAGVConveyorDeviceDriver.java | 3 +- .../SlitTwoManipulatorDeviceDriver.java | 3 +- ...CoveyorControlWithScannerDeviceDriver.java | 3 +- .../java/org/nl/acs/history/ErrorUtil.java | 63 ++++++++ .../rest/DeviceErrorLogController.java | 77 ++++++++++ .../service/DeviceErrorLogService.java | 74 +++++++++ .../service/dto/DeviceErrorLogDto.java | 29 ++++ .../impl/DeviceErrorLogServiceImpl.java | 137 +++++++++++++++++ .../modules/system/service/DictService.java | 2 + .../service/impl/DictDetailServiceImpl.java | 21 ++- .../system/service/impl/DictServiceImpl.java | 6 + .../java/org/nl/modules/system/wql/sys.xls | Bin 228864 -> 270848 bytes .../src/api/acs/history/acsDeviceErrorLog.js | 27 ++++ .../acs/history/deviceErrorInfo/index.vue | 145 ++++++++++++++++++ .../views/acs/history/instRecord/index.vue | 2 +- 22 files changed, 611 insertions(+), 35 deletions(-) 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-ui/src/api/acs/history/acsDeviceErrorLog.js create mode 100644 acs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/BoxPalletizingManipulatorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/BoxPalletizingManipulatorDeviceDriver.java index 88363cbfe..7bce24421 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/BoxPalletizingManipulatorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/box_palletizing_manipulator/BoxPalletizingManipulatorDeviceDriver.java @@ -12,6 +12,7 @@ import org.nl.acs.device_driver.RouteableDeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.ErrorUtil; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -171,7 +172,6 @@ public class BoxPalletizingManipulatorDeviceDriver extends AbstractOpcDeviceDriv } - public boolean exe_error() { if (this.error == 0) { return true; @@ -219,7 +219,7 @@ public class BoxPalletizingManipulatorDeviceDriver extends AbstractOpcDeviceDriv //将扩展表中的字符串数据转换成集合 public List getExtraDeviceCodes(String extraName) { String extraValue = (String) this.getDevice().getExtraValue().get(extraName); - if (StrUtil.isEmpty(extraValue)){ + if (StrUtil.isEmpty(extraValue)) { return new ArrayList<>(); } String devicesString = extraValue.substring(1, extraValue.length() - 1); @@ -273,7 +273,7 @@ public class BoxPalletizingManipulatorDeviceDriver extends AbstractOpcDeviceDriv jo.put("task", task); jo.put("walk_y", walk_y); jo.put("isOnline", this.getIsonline()); - jo.put("error", this.getError()); + jo.put("error", ErrorUtil.getDictDetail("mdhj_error_type", String.valueOf(this.getError()))); jo.put("isError", this.getIserror()); jo.put("message", this.getMessage()); return jo; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_conveyor/HongXiangStationDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_conveyor/HongXiangStationDeviceDriver.java index 886c2d855..adc44da8d 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_conveyor/HongXiangStationDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_conveyor/HongXiangStationDeviceDriver.java @@ -14,6 +14,7 @@ import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; 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.instruction.service.InstructionService; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.monitor.DeviceStageMonitor; @@ -216,7 +217,7 @@ public class HongXiangStationDeviceDriver extends AbstractOpcDeviceDriver implem jo.put("mode", "联机"); jo.put("action", action); jo.put("isOnline", true); - jo.put("error", this.getError()); + jo.put("error", ErrorUtil.getDictDetail("hxdj_error_type", String.valueOf(this.getError()))); jo.put("isError", this.getIserror()); jo.put("task", this.getTask()); return jo; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/HongXiangConveyorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/HongXiangConveyorDeviceDriver.java index 286cdce16..2bb9fe73c 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/HongXiangConveyorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/HongXiangConveyorDeviceDriver.java @@ -18,6 +18,7 @@ import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingRequest; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingResponse; 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.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -321,7 +322,7 @@ public class HongXiangConveyorDeviceDriver extends AbstractOpcDeviceDriver imple jo.put("temperature", temperature); jo.put("finish", finish); jo.put("isOnline", this.getIsonline()); - jo.put("error", this.getError()); + jo.put("error", ErrorUtil.getDictDetail("hx_error_type", String.valueOf(this.getError()))); jo.put("isError", this.getIserror()); jo.put("countdown_house", countdown_house); jo.put("countdown_min", countdown_min); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/oven_manipulator/OvenGantryManipulatorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/oven_manipulator/OvenGantryManipulatorDeviceDriver.java index 0e6139385..81274c8cc 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/oven_manipulator/OvenGantryManipulatorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/oven_manipulator/OvenGantryManipulatorDeviceDriver.java @@ -21,6 +21,7 @@ import org.nl.acs.device_driver.basedriver.standard_inspect_site.StandardInspect import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.ErrorUtil; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -401,17 +402,17 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) nextDevice.getDeviceDriver(); // hongXiangConveyorDeviceDriver.writing("to_close_door", "1"); - if(!StrUtil.startWith(taskDto.getTask_code(), "-")){ - if(ObjectUtil.isNotEmpty(nextDevice.getExtraValue().get("link_three_lamp"))){ + if (!StrUtil.startWith(taskDto.getTask_code(), "-")) { + if (ObjectUtil.isNotEmpty(nextDevice.getExtraValue().get("link_three_lamp"))) { String lamp = nextDevice.getExtraValue().get("link_three_lamp").toString(); Device lampDevice = deviceAppService.findDeviceByCode(lamp); - if(ObjectUtil.isEmpty(lampDevice)){ + if (ObjectUtil.isEmpty(lampDevice)) { return; } if (lampDevice.getDeviceDriver() instanceof LampThreecolorDeviceDriver) { lampThreecolorDeviceDriver = (LampThreecolorDeviceDriver) lampDevice.getDeviceDriver(); - logServer.deviceExecuteLog(lampDevice.getDeviceDriver().getDeviceCode(), "", "", "下发报警灯"+ lamp +"报警信号"); - lampThreecolorDeviceDriver.writing("to_command","1"); + logServer.deviceExecuteLog(lampDevice.getDeviceDriver().getDeviceCode(), "", "", "下发报警灯" + lamp + "报警信号"); + lampThreecolorDeviceDriver.writing("to_command", "1"); } } } @@ -452,7 +453,7 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i } catch (Exception var17) { var17.printStackTrace(); feedMessage = var17.getMessage(); - logServer.deviceExecuteLog(this.device_code, "", "", "读取信号值时出现异常:" + var17.getMessage()+ ",this.itemProtocol is null:" + ObjectUtil.isEmpty(this.itemProtocol) ); + logServer.deviceExecuteLog(this.device_code, "", "", "读取信号值时出现异常:" + var17.getMessage() + ",this.itemProtocol is null:" + ObjectUtil.isEmpty(this.itemProtocol)); } @@ -480,7 +481,7 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i //行架机械手申请任务 if (mode == 2 && move == 0 && task == 0 && !requireSucess) { boolean res = applyTask(); - if (res){ + if (res) { notCreateInstMessage = ""; notCreateTaskMessage = ""; feedMessage = ""; @@ -513,7 +514,7 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i last_walk_y = walk_y; last_error = error; last_task = task; - last_heartbeat = heartbeat; + last_heartbeat = heartbeat; } @@ -562,21 +563,21 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i if (startdevice.getDeviceDriver() instanceof PhotoelectricInspectionSiteDeviceDriver) { photoelectricInspectionSiteDeviceDriver = (PhotoelectricInspectionSiteDeviceDriver) startdevice.getDeviceDriver(); if (photoelectricInspectionSiteDeviceDriver.getMove() != 1) { - notCreateInstMessage = "手动创建指令未下发电气信号原因->取货位-烘箱对接位:" + photoelectricInspectionSiteDeviceDriver.getDevice_code() + "无货,无法下发指令!指令号:"+instruction.getInstruction_code(); + notCreateInstMessage = "手动创建指令未下发电气信号原因->取货位-烘箱对接位:" + photoelectricInspectionSiteDeviceDriver.getDevice_code() + "无货,无法下发指令!指令号:" + instruction.getInstruction_code(); return false; } } if (startdevice.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) startdevice.getDeviceDriver(); if (standardInspectSiteDeviceDriver.getMove() != 1) { - notCreateInstMessage = "手动创建指令未下发电气信号原因->取货位-烘箱对接位:" + standardInspectSiteDeviceDriver.getDevice_code() + "无货,无法下发指令!指令号:"+instruction.getInstruction_code(); + notCreateInstMessage = "手动创建指令未下发电气信号原因->取货位-烘箱对接位:" + standardInspectSiteDeviceDriver.getDevice_code() + "无货,无法下发指令!指令号:" + instruction.getInstruction_code(); return false; } } if (startdevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) startdevice.getDeviceDriver(); if (hongXiangConveyorDeviceDriver.getMode() == 0 || hongXiangConveyorDeviceDriver.getMove() == 0) { - notCreateInstMessage = "手动创建指令未下发电气信号原因->取货位-烘箱:" + hongXiangConveyorDeviceDriver.getDevice_code() + "未联机或无货,无法下发指令!指令号:"+instruction.getInstruction_code(); + notCreateInstMessage = "手动创建指令未下发电气信号原因->取货位-烘箱:" + hongXiangConveyorDeviceDriver.getDevice_code() + "未联机或无货,无法下发指令!指令号:" + instruction.getInstruction_code(); return false; } } @@ -584,14 +585,14 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i if (nextdevice.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) nextdevice.getDeviceDriver(); if (standardInspectSiteDeviceDriver.getMove() != 0) { - notCreateInstMessage = "手动创建指令未下发电气信号原因->放货位-烘箱对接位:" + standardInspectSiteDeviceDriver.getDevice_code() + "有货,无法下发指令!指令号:"+instruction.getInstruction_code(); + notCreateInstMessage = "手动创建指令未下发电气信号原因->放货位-烘箱对接位:" + standardInspectSiteDeviceDriver.getDevice_code() + "有货,无法下发指令!指令号:" + instruction.getInstruction_code(); return false; } } if (nextdevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) nextdevice.getDeviceDriver(); if (hongXiangConveyorDeviceDriver.getMode() == 0 || hongXiangConveyorDeviceDriver.getMove() == 1) { - notCreateInstMessage = "手动创建指令未下发电气信号原因->放货位-烘箱:" + hongXiangConveyorDeviceDriver.getDevice_code() + "未联机或者有货,无法下发指令!指令号:"+instruction.getInstruction_code(); + notCreateInstMessage = "手动创建指令未下发电气信号原因->放货位-烘箱:" + hongXiangConveyorDeviceDriver.getDevice_code() + "未联机或者有货,无法下发指令!指令号:" + instruction.getInstruction_code(); return false; } } @@ -620,11 +621,11 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i this.writing("to_command", "1"); if (startdevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) startdevice.getDeviceDriver(); - hongXiangConveyorDeviceDriver.writing("to_open_door","1"); + hongXiangConveyorDeviceDriver.writing("to_open_door", "1"); } if (nextdevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) nextdevice.getDeviceDriver(); - hongXiangConveyorDeviceDriver.writing("to_open_door","1"); + hongXiangConveyorDeviceDriver.writing("to_open_door", "1"); } this.setNow_steps_type(2); this.setRequireSucess(true); @@ -954,7 +955,7 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i jo.put("task", task); jo.put("walk_y", walk_y); jo.put("isOnline", this.getIsonline()); - jo.put("error", this.getError()); + jo.put("error", ErrorUtil.getDictDetail("hxhj_error_type", String.valueOf(this.getError()))); jo.put("isError", this.getIserror()); jo.put("message", this.getMessage()); jo.put("notCreateTaskMessage", notCreateTaskMessage); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java index e2eb3f95e..4147b638f 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java @@ -26,6 +26,7 @@ import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingRequest; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingResponse; import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.ErrorUtil; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -469,7 +470,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme jo.put("inst_message", this.inst_message); jo.put("last_inst_message", this.last_inst_message); jo.put("isOnline", this.getIsonline()); - jo.put("error", this.getError()); + jo.put("error", ErrorUtil.getDictDetail("ssx_error_type", String.valueOf(this.getError()))); jo.put("isError", this.getIserror()); jo.put("message", this.getMessage()); jo.put("is_click", true); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_ckk/SiemensConveyorCkkDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_ckk/SiemensConveyorCkkDeviceDriver.java index e147b749b..35fa867f6 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_ckk/SiemensConveyorCkkDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_ckk/SiemensConveyorCkkDeviceDriver.java @@ -22,6 +22,7 @@ import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingRequest; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingResponse; import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.ErrorUtil; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -429,7 +430,7 @@ public class SiemensConveyorCkkDeviceDriver extends AbstractOpcDeviceDriver impl jo.put("inst_message", this.inst_message); jo.put("last_inst_message", this.last_inst_message); jo.put("isOnline", this.getIsonline()); - jo.put("error", this.getError()); + jo.put("error", ErrorUtil.getDictDetail("ssx_error_type", String.valueOf(this.getError()))); jo.put("isError", this.getIserror()); jo.put("message", this.getMessage()); jo.put("is_click", true); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_labeling/SiemensConveyorLabelingDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_labeling/SiemensConveyorLabelingDeviceDriver.java index 705a8abdc..a30b3e0d1 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_labeling/SiemensConveyorLabelingDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_labeling/SiemensConveyorLabelingDeviceDriver.java @@ -21,6 +21,7 @@ import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingRequest; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingResponse; import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.ErrorUtil; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -445,7 +446,7 @@ public class SiemensConveyorLabelingDeviceDriver extends AbstractOpcDeviceDriver jo.put("carrier_direction", carrier_direction); jo.put("task", task); jo.put("isOnline", this.getIsonline()); - jo.put("error", this.getError()); + jo.put("error", ErrorUtil.getDictDetail("ssx_error_type", String.valueOf(this.getError()))); jo.put("isError", this.getIserror()); jo.put("message", this.getMessage()); jo.put("is_click", true); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_onefloor_agv_conveyor/SiemensOneFloorAGVConveyorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_onefloor_agv_conveyor/SiemensOneFloorAGVConveyorDeviceDriver.java index 91b62d7d6..d2412c4aa 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_onefloor_agv_conveyor/SiemensOneFloorAGVConveyorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_onefloor_agv_conveyor/SiemensOneFloorAGVConveyorDeviceDriver.java @@ -22,6 +22,7 @@ import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingRequest; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingResponse; import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.ErrorUtil; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -304,7 +305,7 @@ public class SiemensOneFloorAGVConveyorDeviceDriver extends AbstractOpcDeviceDri jo.put("inst_message", this.inst_message); jo.put("last_inst_message", this.last_inst_message); jo.put("isOnline", this.getIsonline()); - jo.put("error", this.getError()); + jo.put("error", ErrorUtil.getDictDetail("ssx_error_type", String.valueOf(this.getError()))); jo.put("isError", this.getIserror()); jo.put("message", this.getMessage()); jo.put("is_click", true); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/slit_two_manipulator/SlitTwoManipulatorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/slit_two_manipulator/SlitTwoManipulatorDeviceDriver.java index a36d2574c..101d64b15 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/slit_two_manipulator/SlitTwoManipulatorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/slit_two_manipulator/SlitTwoManipulatorDeviceDriver.java @@ -18,6 +18,7 @@ import org.nl.acs.device_driver.basedriver.siemens_conveyor.SiemensConveyorDevic import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.ErrorUtil; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -1418,7 +1419,7 @@ public class SlitTwoManipulatorDeviceDriver extends AbstractOpcDeviceDriver impl jo.put("action_1", action1); jo.put("action_2", action2); jo.put("walk_y", walk_y); - jo.put("error", this.getError()); + jo.put("error", ErrorUtil.getDictDetail("fqhj_error_type", String.valueOf(this.getError()))); jo.put("task1", this.getTask1()); jo.put("task2", this.getTask2()); jo.put("isOnline", this.getIsonline()); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java index 4830d09ce..649f7c11f 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java @@ -21,6 +21,7 @@ import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingRequest; import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingResponse; import org.nl.acs.ext.wms.service.AcsToWmsService; +import org.nl.acs.history.ErrorUtil; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.service.DeviceExecuteLogService; @@ -943,7 +944,7 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe jo.put("action", action); jo.put("is_click", true); jo.put("isOnline", this.getIsonline()); - jo.put("error", this.getError()); + jo.put("error", ErrorUtil.getDictDetail("ssx_error_type", String.valueOf(this.getError()))); jo.put("isError", this.getIserror()); jo.put("message", this.getMessage()); jo.put("inst_message", this.inst_message); 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 000000000..5b12aec70 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java @@ -0,0 +1,63 @@ +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.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; + +/** + * @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 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); + } + +} 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 000000000..694440fea --- /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 000000000..e4bcc6c82 --- /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 000000000..eb08cae42 --- /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 000000000..19120c08a --- /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/modules/system/service/DictService.java b/acs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java index 76a0011b4..0b9aaffdc 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 @@ -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/DictDetailServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java index e60fa8e13..ecf78c92b 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java @@ -16,6 +16,7 @@ package org.nl.modules.system.service.impl; import lombok.RequiredArgsConstructor; +import org.nl.acs.history.ErrorUtil; import org.nl.modules.common.utils.PageUtil; import org.nl.modules.common.utils.QueryHelp; import org.nl.modules.common.utils.RedisUtils; @@ -39,9 +40,9 @@ import java.util.List; import java.util.Map; /** -* @author Zheng Jie -* @date 2019-04-10 -*/ + * @author Zheng Jie + * @date 2019-04-10 + */ @Service @RequiredArgsConstructor @CacheConfig(cacheNames = "dict") @@ -53,8 +54,8 @@ public class DictDetailServiceImpl implements DictDetailService { private final RedisUtils redisUtils; @Override - public Map queryAll(DictDetailQueryCriteria criteria, Pageable pageable) { - Page page = dictDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),pageable); + public Map queryAll(DictDetailQueryCriteria criteria, Pageable pageable) { + Page page = dictDetailRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable); return PageUtil.toPage(page.map(dictDetailMapper::toDto)); } @@ -64,17 +65,21 @@ public class DictDetailServiceImpl implements DictDetailService { dictDetailRepository.save(resources); // 清理缓存 delCaches(resources); + Dict dict = dictRepository.findById(resources.getDict().getId()).get(); + ErrorUtil.dictMap.put(dict.getName(), this.getDictByName(dict.getName())); } @Override @Transactional(rollbackFor = Exception.class) public void update(DictDetail resources) { DictDetail dictDetail = dictDetailRepository.findById(resources.getId()).orElseGet(DictDetail::new); - ValidationUtil.isNull( dictDetail.getId(),"DictDetail","id",resources.getId()); + ValidationUtil.isNull(dictDetail.getId(), "DictDetail", "id", resources.getId()); resources.setId(dictDetail.getId()); dictDetailRepository.save(resources); // 清理缓存 delCaches(resources); + Dict dict = dictRepository.findById(resources.getDict().getId()).get(); + ErrorUtil.dictMap.put(dict.getName(), this.getDictByName(dict.getName())); } @Override @@ -90,9 +95,11 @@ public class DictDetailServiceImpl implements DictDetailService { // 清理缓存 delCaches(dictDetail); dictDetailRepository.deleteById(id); + Dict dict = dictRepository.findById(id).get(); + ErrorUtil.dictMap.put(dict.getName(), this.getDictByName(dict.getName())); } - public void delCaches(DictDetail dictDetail){ + public void delCaches(DictDetail dictDetail) { Dict dict = dictRepository.findById(dictDetail.getDict().getId()).orElseGet(Dict::new); redisUtils.del("dict::name:" + dict.getName()); } 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 4b938b44f..aabd36003 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 @@ -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..00b251538bb09e7aefe835c9f2941c99f180e3b4 100644 GIT binary patch delta 53150 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[b_xZ% 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

FVq%k6N(Fqi%W9yGl%31%^6Z?_bHKKMdbw} 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 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 000000000..12f1337d5 --- /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/views/acs/history/deviceErrorInfo/index.vue b/acs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue new file mode 100644 index 000000000..7a3611a3d --- /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/instRecord/index.vue b/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue index 5c24d60bc..982e32e8e 100644 --- a/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue +++ b/acs/nladmin-ui/src/views/acs/history/instRecord/index.vue @@ -113,7 +113,7 @@ - +