From f7ea420462e959a1c899d04cba8ca24c4915e601 Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Fri, 24 Mar 2023 11:14:31 +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 --- .../HailiangAutoCacheLineDeviceDriver.java | 13 ++ .../HailiangCleaningFeedingLineDriver.java | 18 ++- .../HailiangCleaningMachineDeviceDriver.java | 18 ++- ...ningMachineStorageStationDeviceDriver.java | 13 ++ .../HailiangElevatorWiringDeviceDriver.java | 14 ++ .../HailiangEngravingCacheDeviceDriver.java | 4 + .../HailiangEngravingMachineDeviceDriver.java | 14 ++ .../HailiangFoldingDiscSmartDeviceDriver.java | 13 ++ .../HailiangPackerStationDeviceDriver.java | 13 ++ .../HailiangPaintLineDeviceDriver.java | 13 ++ .../HailiangSpecialDeviceDriver.java | 14 ++ ...iliangSpecialEmptyStationDeviceDriver.java | 13 ++ ...ailiangSpecialFullStationDeviceDriver.java | 13 ++ ...ailiangSpecialPickStationDeviceDriver.java | 13 ++ ...ailiangSpecialPourStationDeviceDriver.java | 13 ++ .../HailiangStackingStationDriver.java | 13 ++ ...HailiangThreestationSmartDeviceDriver.java | 14 ++ ...HailiangHailiangxjplcTestDeviceDriver.java | 143 +++++++++-------- .../HailiangSmartplcTestDeviceDriver.java | 13 ++ .../LampThreecolorDeviceDriver.java | 4 + ...otoelectricInspectionSiteDeviceDriver.java | 5 + .../StandardAutodoorDeviceDriver.java | 5 + .../StandardCoveyorControlDeviceDriver.java | 5 + ...eyorControlWithPlcScannerDeviceDriver.java | 15 +- ...CoveyorControlWithScannerDeviceDriver.java | 5 + .../StandardInspectSiteDeviceDriver.java | 4 + .../StandardOrdinarySiteDeviceDriver.java | 4 + .../StandardScannerDeviceDriver.java | 6 + .../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 | 7 + .../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 ++++ .../src/views/acs/device/config.vue | 34 ++-- .../acs/history/deviceErrorInfo/index.vue | 145 ++++++++++++++++++ 40 files changed, 943 insertions(+), 93 deletions(-) create mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java create mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java create mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java create mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java create mode 100644 wcs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java create mode 100644 wcs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js create mode 100644 wcs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_auto_cache_line/HailiangAutoCacheLineDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_auto_cache_line/HailiangAutoCacheLineDeviceDriver.java index 42bb224f..20337f25 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_auto_cache_line/HailiangAutoCacheLineDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_auto_cache_line/HailiangAutoCacheLineDeviceDriver.java @@ -12,6 +12,10 @@ 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.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.log.service.DeviceExecuteLogService; import org.nl.acs.opc.Device; @@ -53,6 +57,8 @@ public class HailiangAutoCacheLineDeviceDriver extends AbstractOpcDeviceDriver i ParamService acsConfigService = SpringContextHolder.getBean(ParamServiceImpl.class); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); int mode = 0; int error = 0; @@ -255,6 +261,13 @@ public class HailiangAutoCacheLineDeviceDriver extends AbstractOpcDeviceDriver i logServer.deviceExecuteLog(this.device_code,"","","信号move:" + last_move + "->" + move); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_feeding_line/HailiangCleaningFeedingLineDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_feeding_line/HailiangCleaningFeedingLineDriver.java index 0cc162d6..e75e6589 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_feeding_line/HailiangCleaningFeedingLineDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_feeding_line/HailiangCleaningFeedingLineDriver.java @@ -11,11 +11,16 @@ 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.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.log.service.DeviceExecuteLogService; import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; +import org.nl.acs.order.service.ProduceshiftorderService; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.task.service.TaskService; import org.nl.modules.system.service.ParamService; @@ -52,8 +57,10 @@ public class HailiangCleaningFeedingLineDriver extends AbstractOpcDeviceDriver i ParamService acsConfigService = SpringContextHolder.getBean(ParamServiceImpl.class); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); -// @Autowired -// ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); + @Autowired + ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -185,6 +192,13 @@ public class HailiangCleaningFeedingLineDriver extends AbstractOpcDeviceDriver i logServer.deviceExecuteLog(this.device_code,"","","信号in_pcsn:" + last_in_pcsn + "->" + in_pcsn); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine/HailiangCleaningMachineDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine/HailiangCleaningMachineDeviceDriver.java index 921720d4..7dac2b70 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine/HailiangCleaningMachineDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine/HailiangCleaningMachineDeviceDriver.java @@ -11,11 +11,16 @@ 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.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.log.service.DeviceExecuteLogService; import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; +import org.nl.acs.order.service.ProduceshiftorderService; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.task.service.TaskService; import org.nl.modules.system.service.ParamService; @@ -52,8 +57,10 @@ public class HailiangCleaningMachineDeviceDriver extends AbstractOpcDeviceDriver ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); -// @Autowired -// ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(.class); + @Autowired + ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -204,6 +211,13 @@ public class HailiangCleaningMachineDeviceDriver extends AbstractOpcDeviceDriver logServer.deviceExecuteLog(this.device_code,"","","信号pause:" + last_pause + "->" + pause); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine_storage_station/HailiangCleaningMachineStorageStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine_storage_station/HailiangCleaningMachineStorageStationDeviceDriver.java index 3be56959..22567272 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine_storage_station/HailiangCleaningMachineStorageStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_cleaning_machine_storage_station/HailiangCleaningMachineStorageStationDeviceDriver.java @@ -20,6 +20,10 @@ 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.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.log.service.DeviceExecuteLogService; @@ -71,6 +75,8 @@ public class HailiangCleaningMachineStorageStationDeviceDriver extends AbstractO ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -173,6 +179,13 @@ public class HailiangCleaningMachineStorageStationDeviceDriver extends AbstractO full_number = this.itemProtocol.getItem_full_number(); silo_material_no = this.itemProtocol.getItem_silo_material_no(); if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_elevator_wiring/HailiangElevatorWiringDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_elevator_wiring/HailiangElevatorWiringDeviceDriver.java index 85f5e01d..32a9aec4 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_elevator_wiring/HailiangElevatorWiringDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_elevator_wiring/HailiangElevatorWiringDeviceDriver.java @@ -9,6 +9,10 @@ import org.nl.acs.device_driver.DeviceDriver; 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.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.log.service.DeviceExecuteLogService; @@ -42,6 +46,9 @@ public class HailiangElevatorWiringDeviceDriver extends AbstractOpcDeviceDriver TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; String container_type_desc; String last_container_type_desc; @@ -136,6 +143,13 @@ public class HailiangElevatorWiringDeviceDriver extends AbstractOpcDeviceDriver logServer.deviceExecuteLog(this.device_code,"","","信号move:" + last_move + "->" + move); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java index 5d936a40..547e84ba 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_cache/HailiangEngravingCacheDeviceDriver.java @@ -22,6 +22,8 @@ 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.service.DeviceErrorLogService; +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.log.service.DeviceExecuteLogService; @@ -76,6 +78,8 @@ public class HailiangEngravingCacheDeviceDriver extends AbstractOpcDeviceDriver ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_machine/HailiangEngravingMachineDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_machine/HailiangEngravingMachineDeviceDriver.java index 76788b41..669bf721 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_machine/HailiangEngravingMachineDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_engraving_machine/HailiangEngravingMachineDeviceDriver.java @@ -20,6 +20,10 @@ 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.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.log.service.DeviceExecuteLogService; @@ -76,6 +80,9 @@ public class HailiangEngravingMachineDeviceDriver extends AbstractOpcDeviceDrive ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); @Autowired NDCAgvServiceImpl agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; int status = 0;//线体状态 @@ -273,6 +280,13 @@ public class HailiangEngravingMachineDeviceDriver extends AbstractOpcDeviceDrive logServer.deviceExecuteLog(this.device_code,"","","信号line_ready:" + last_line_ready + "->" + line_ready); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java index 825178de..7fffa7bb 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_foldingDisc_smart/HailiangFoldingDiscSmartDeviceDriver.java @@ -9,6 +9,10 @@ import org.nl.acs.device_driver.DeviceDriver; 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.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.log.service.DeviceExecuteLogService; @@ -42,6 +46,8 @@ public class HailiangFoldingDiscSmartDeviceDriver extends AbstractOpcDeviceDrive TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); //放货准备锁 String putReadyLock = null; @@ -136,6 +142,13 @@ public class HailiangFoldingDiscSmartDeviceDriver extends AbstractOpcDeviceDrive logServer.deviceExecuteLog(this.device_code,"","","信号move:" + last_move + "->" + move); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_packer_station/HailiangPackerStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_packer_station/HailiangPackerStationDeviceDriver.java index 817219ff..00a400ef 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_packer_station/HailiangPackerStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_packer_station/HailiangPackerStationDeviceDriver.java @@ -21,6 +21,10 @@ 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.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.log.service.DeviceExecuteLogService; @@ -77,6 +81,8 @@ public class HailiangPackerStationDeviceDriver extends AbstractOpcDeviceDriver i ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; @@ -232,6 +238,13 @@ public class HailiangPackerStationDeviceDriver extends AbstractOpcDeviceDriver i } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code, "error", String.valueOf(error)); logServer.deviceExecuteLog(this.device_code, "", "", "信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java index e178f203..743cb54f 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_paint_line/HailiangPaintLineDeviceDriver.java @@ -9,6 +9,10 @@ import org.nl.acs.device_driver.DeviceDriver; 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.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.log.service.DeviceExecuteLogService; @@ -42,6 +46,8 @@ public class HailiangPaintLineDeviceDriver extends AbstractOpcDeviceDriver imple TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); //放货准备锁 String putReadyLock = null; @@ -136,6 +142,13 @@ public class HailiangPaintLineDeviceDriver extends AbstractOpcDeviceDriver imple logServer.deviceExecuteLog(this.device_code,"","","信号move:" + last_move + "->" + move); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_device/HailiangSpecialDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_device/HailiangSpecialDeviceDriver.java index dc031788..5047ac0b 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_device/HailiangSpecialDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_device/HailiangSpecialDeviceDriver.java @@ -15,6 +15,10 @@ 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.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.log.service.DeviceExecuteLogService; @@ -68,6 +72,9 @@ public class HailiangSpecialDeviceDriver extends AbstractOpcDeviceDriver impleme DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); @Autowired ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; String container_type_desc; String last_container_type_desc; @@ -274,6 +281,13 @@ public class HailiangSpecialDeviceDriver extends AbstractOpcDeviceDriver impleme logServer.deviceExecuteLog(this.device_code,"","","信号device_online:" + last_device_online + "->" + device_online); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_empty_station/HailiangSpecialEmptyStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_empty_station/HailiangSpecialEmptyStationDeviceDriver.java index 265676fb..a59141ff 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_empty_station/HailiangSpecialEmptyStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_empty_station/HailiangSpecialEmptyStationDeviceDriver.java @@ -20,6 +20,10 @@ 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.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.log.service.DeviceExecuteLogService; @@ -71,6 +75,8 @@ public class HailiangSpecialEmptyStationDeviceDriver extends AbstractOpcDeviceDr DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; @@ -213,6 +219,13 @@ public class HailiangSpecialEmptyStationDeviceDriver extends AbstractOpcDeviceDr } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_full_station/HailiangSpecialFullStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_full_station/HailiangSpecialFullStationDeviceDriver.java index 22c14992..13fe7cce 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_full_station/HailiangSpecialFullStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_full_station/HailiangSpecialFullStationDeviceDriver.java @@ -24,6 +24,10 @@ 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.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.log.service.DeviceExecuteLogService; @@ -76,6 +80,8 @@ public class HailiangSpecialFullStationDeviceDriver extends AbstractOpcDeviceDri ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -223,6 +229,13 @@ public class HailiangSpecialFullStationDeviceDriver extends AbstractOpcDeviceDri logServer.deviceExecuteLog(this.device_code, "", "", "信号order:" + last_order + "->" + order); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code, "error", String.valueOf(error)); logServer.deviceExecuteLog(this.device_code, "", "", "信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pick_station/HailiangSpecialPickStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pick_station/HailiangSpecialPickStationDeviceDriver.java index 455ab532..7d39a3a6 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pick_station/HailiangSpecialPickStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pick_station/HailiangSpecialPickStationDeviceDriver.java @@ -15,6 +15,10 @@ 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.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.log.service.DeviceExecuteLogService; @@ -64,6 +68,8 @@ public class HailiangSpecialPickStationDeviceDriver extends AbstractOpcDeviceDri ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -191,6 +197,13 @@ public class HailiangSpecialPickStationDeviceDriver extends AbstractOpcDeviceDri logServer.deviceExecuteLog(this.device_code,"","","信号order:" + last_order + "->" + order); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pour_station/HailiangSpecialPourStationDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pour_station/HailiangSpecialPourStationDeviceDriver.java index 23ca505d..5eddfdff 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pour_station/HailiangSpecialPourStationDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_special_pour_station/HailiangSpecialPourStationDeviceDriver.java @@ -21,6 +21,10 @@ 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.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.log.service.DeviceExecuteLogService; @@ -72,6 +76,8 @@ public class HailiangSpecialPourStationDeviceDriver extends AbstractOpcDeviceDri DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvServiceImpl.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; @@ -197,6 +203,13 @@ public class HailiangSpecialPourStationDeviceDriver extends AbstractOpcDeviceDri logServer.deviceExecuteLog(this.device_code,"","","信号order:" + last_order + "->" + order); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_stacking_station/HailiangStackingStationDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_stacking_station/HailiangStackingStationDriver.java index bb416fb9..b14a1f7e 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_stacking_station/HailiangStackingStationDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_stacking_station/HailiangStackingStationDriver.java @@ -13,6 +13,10 @@ 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.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.log.service.DeviceExecuteLogService; @@ -58,6 +62,8 @@ public class HailiangStackingStationDriver extends AbstractOpcDeviceDriver imple DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); @Autowired ProduceshiftorderService produceshiftorderService = SpringContextHolder.getBean(ProduceshiftorderService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -235,6 +241,13 @@ public class HailiangStackingStationDriver extends AbstractOpcDeviceDriver imple logServer.deviceExecuteLog(this.device_code,"","","信号all_ready:" + last_all_ready + "->" + all_ready); } if (line_error != last_line_error) { + if (line_error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(line_error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(line_error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"line_error" ,String.valueOf(line_error)); logServer.deviceExecuteLog(this.device_code,"","","信号line_error:" + last_line_error + "->" + line_error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java index dfcd4154..9ec11a6b 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_threeStation_smart/HailiangThreestationSmartDeviceDriver.java @@ -9,6 +9,10 @@ import org.nl.acs.device_driver.DeviceDriver; 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.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.log.service.DeviceExecuteLogService; @@ -42,6 +46,9 @@ public class HailiangThreestationSmartDeviceDriver extends AbstractOpcDeviceDriv TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container_type_desc; String last_container_type_desc; //放货准备锁 @@ -140,6 +147,13 @@ public class HailiangThreestationSmartDeviceDriver extends AbstractOpcDeviceDriv logServer.deviceExecuteLog(this.device_code,"","","信号move:" + last_move + "->" + move); } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_xj_plc_test/HailiangHailiangxjplcTestDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_xj_plc_test/HailiangHailiangxjplcTestDeviceDriver.java index 1b8347d3..ca0a7498 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_xj_plc_test/HailiangHailiangxjplcTestDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_one/hailiang_xj_plc_test/HailiangHailiangxjplcTestDeviceDriver.java @@ -12,6 +12,10 @@ 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.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.log.service.DeviceExecuteLogService; @@ -53,8 +57,10 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); - @Autowired + @Autowired AgvService agvService = SpringContextHolder.getBean(AgvService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; @@ -66,64 +72,64 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv protected boolean has_goods_tag = false; int heartbeat = 0; - int mode =0; - int error =0; - int error_num =0; - int open_time =0; - int close_time =0; - int ready_time =0; - int running_time =0; - int error_time =0; - int voltage =0; - int temperature =0; - int current =0; - int material =0; - int lack_material =0; - int full_material =0; - int storage_qty =0; - int feeding_qty =0; - int blanking_qty =0; - int qualified_qty =0; - int unqualified_qty =0; - int finish =0; - int task =0; - int noload_electricity_consumption =0; - int prod_electricity_consumption =0; - int gas_consumption =0; - int water_consumption =0; - int oil_level =0; - int monthly_electricity_consumption =0; - int pause =0; + int mode = 0; + int error = 0; + int error_num = 0; + int open_time = 0; + int close_time = 0; + int ready_time = 0; + int running_time = 0; + int error_time = 0; + int voltage = 0; + int temperature = 0; + int current = 0; + int material = 0; + int lack_material = 0; + int full_material = 0; + int storage_qty = 0; + int feeding_qty = 0; + int blanking_qty = 0; + int qualified_qty = 0; + int unqualified_qty = 0; + int finish = 0; + int task = 0; + int noload_electricity_consumption = 0; + int prod_electricity_consumption = 0; + int gas_consumption = 0; + int water_consumption = 0; + int oil_level = 0; + int monthly_electricity_consumption = 0; + int pause = 0; - int last_mode =0; - int last_error =0; - int last_error_num =0; - int last_open_time =0; - int last_close_time =0; - int last_ready_time =0; - int last_running_time =0; - int last_error_time =0; - int last_voltage =0; - int last_temperature =0; - int last_current =0; - int last_material =0; - int last_lack_material =0; - int last_full_material =0; - int last_storage_qty =0; - int last_feeding_qty =0; - int last_blanking_qty =0; - int last_qualified_qty =0; - int last_unqualified_qty =0; - int last_finish =0; - int last_task =0; - int last_noload_electricity_consumption =0; - int last_prod_electricity_consumption =0; - int last_gas_consumption =0; - int last_water_consumption =0; - int last_oil_level =0; - int last_monthly_electricity_consumption =0; - int last_pause =0; + int last_mode = 0; + int last_error = 0; + int last_error_num = 0; + int last_open_time = 0; + int last_close_time = 0; + int last_ready_time = 0; + int last_running_time = 0; + int last_error_time = 0; + int last_voltage = 0; + int last_temperature = 0; + int last_current = 0; + int last_material = 0; + int last_lack_material = 0; + int last_full_material = 0; + int last_storage_qty = 0; + int last_feeding_qty = 0; + int last_blanking_qty = 0; + int last_qualified_qty = 0; + int last_unqualified_qty = 0; + int last_finish = 0; + int last_task = 0; + int last_noload_electricity_consumption = 0; + int last_prod_electricity_consumption = 0; + int last_gas_consumption = 0; + int last_water_consumption = 0; + int last_oil_level = 0; + int last_monthly_electricity_consumption = 0; + int last_pause = 0; Boolean isonline = true; @@ -167,8 +173,8 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv int flag = 0; - int agvphase=0; - int index =0; + int agvphase = 0; + int index = 0; String device_code; @@ -179,7 +185,7 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv @Override - public void execute(){ + public void execute() { device_code = this.getDeviceCode(); heartbeat = this.itemProtocol.getItem_heartbeat(); mode = this.itemProtocol.getItem_mode(); @@ -213,12 +219,19 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv if (mode != last_mode) { this.setRequireSucess(false); - logServer.deviceItemValue(this.device_code,"mode" ,String.valueOf(mode)); - logServer.deviceExecuteLog(this.device_code,"","","信号mode:" + last_mode + "->" + mode); + logServer.deviceItemValue(this.device_code, "mode", String.valueOf(mode)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号mode:" + last_mode + "->" + mode); } if (error != last_error) { - logServer.deviceItemValue(this.device_code,"error" ,String.valueOf(error)); - logServer.deviceExecuteLog(this.device_code,"","","信号error:" + last_error + "->" + error); + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } + logServer.deviceItemValue(this.device_code, "error", String.valueOf(error)); + logServer.deviceExecuteLog(this.device_code, "", "", "信号error:" + last_error + "->" + error); } } @@ -233,7 +246,7 @@ public class HailiangHailiangxjplcTestDeviceDriver extends AbstractOpcDeviceDriv protected void thingToNothing() { log.debug("从有货到无货 清理数据"); - logServer.deviceExecuteLog(this.device_code,"","","光电信号切换,刷新请求标记:"+this.requireSucess); + logServer.deviceExecuteLog(this.device_code, "", "", "光电信号切换,刷新请求标记:" + this.requireSucess); this.setRequireSucess(false); this.setApplySucess(false); diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java index 5aab9b89..fbfad906 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hailiang_smart_plc_test/HailiangSmartplcTestDeviceDriver.java @@ -13,6 +13,10 @@ 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.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.log.service.DeviceExecuteLogService; import org.nl.acs.monitor.DeviceStageMonitor; @@ -55,6 +59,8 @@ public class HailiangSmartplcTestDeviceDriver extends AbstractOpcDeviceDriver im DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); @Autowired AgvService agvService = SpringContextHolder.getBean(AgvService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); private Date instruction_require_time = new Date(); private Date instruction_finished_time = new Date(); @@ -115,6 +121,13 @@ public class HailiangSmartplcTestDeviceDriver extends AbstractOpcDeviceDriver im } } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } } diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/lamp_three_color/LampThreecolorDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/lamp_three_color/LampThreecolorDeviceDriver.java index 269e127b..6c3b391c 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/lamp_three_color/LampThreecolorDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/lamp_three_color/LampThreecolorDeviceDriver.java @@ -8,6 +8,8 @@ import org.nl.acs.device.service.DeviceService; import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.opc.Device; @@ -30,6 +32,8 @@ public class LampThreecolorDeviceDriver extends AbstractOpcDeviceDriver implemen @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; String container_type_desc; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/photoelectric_inspection_site/PhotoelectricInspectionSiteDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/photoelectric_inspection_site/PhotoelectricInspectionSiteDeviceDriver.java index 62ca5b91..32e6aa44 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/photoelectric_inspection_site/PhotoelectricInspectionSiteDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/photoelectric_inspection_site/PhotoelectricInspectionSiteDeviceDriver.java @@ -12,6 +12,8 @@ import org.nl.acs.device_driver.DeviceDriver; 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.history.service.DeviceErrorLogService; +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.log.service.DeviceExecuteLogService; @@ -53,6 +55,9 @@ public class PhotoelectricInspectionSiteDeviceDriver extends AbstractOpcDeviceDr TaskService taskserver = SpringContextHolder.getBean("taskServiceImpl"); @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; String container_type_desc; String last_container_type_desc; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutodoorDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutodoorDeviceDriver.java index d314b68e..857b8c32 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutodoorDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_autodoor/StandardAutodoorDeviceDriver.java @@ -7,10 +7,13 @@ import lombok.extern.slf4j.Slf4j; import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.driver.AbstractOpcDeviceDriver; import org.nl.acs.device_driver.driver.ExecutableDeviceDriver; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.monitor.DeviceStageMonitor; import org.nl.acs.opc.Device; import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.beans.factory.annotation.Autowired; import java.util.HashMap; import java.util.Map; @@ -25,6 +28,8 @@ import java.util.Map; public class StandardAutodoorDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, DeviceStageMonitor { protected ItemProtocol itemProtocol = new ItemProtocol(this); DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); int open = 0; int close = 0; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control/StandardCoveyorControlDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control/StandardCoveyorControlDeviceDriver.java index 49934623..7e535e4f 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control/StandardCoveyorControlDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control/StandardCoveyorControlDeviceDriver.java @@ -15,6 +15,8 @@ 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.service.DeviceErrorLogService; +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.monitor.DeviceStageMonitor; @@ -61,6 +63,9 @@ public class StandardCoveyorControlDeviceDriver extends AbstractOpcDeviceDriver AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); @Autowired ParamService paramService = SpringContextHolder.getBean(ParamService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; String container_type_desc; String last_container_type_desc; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_plcscanner/StandardCoveyorControlWithPlcScannerDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_plcscanner/StandardCoveyorControlWithPlcScannerDeviceDriver.java index e459f504..b3013a63 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_plcscanner/StandardCoveyorControlWithPlcScannerDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_plcscanner/StandardCoveyorControlWithPlcScannerDeviceDriver.java @@ -18,6 +18,10 @@ 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.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.monitor.DeviceStageMonitor; @@ -61,7 +65,9 @@ public class StandardCoveyorControlWithPlcScannerDeviceDriver extends AbstractOp ParamService paramService = SpringContextHolder.getBean(ParamService.class); @Autowired AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsService.class); - ; + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String barcode = null; String formatcode = null; @@ -171,6 +177,13 @@ public class StandardCoveyorControlWithPlcScannerDeviceDriver extends AbstractOp } } if (error != last_error) { + if (error != 0) { + DeviceErrorLogDto dto = new DeviceErrorLogDto(); + dto.setDevice_code(device_code); + dto.setError_code(String.valueOf(error)); + dto.setError_info(ErrorUtil.getDictDetail("error_type", String.valueOf(error))); + deviceErrorLogService.create(dto); + } } if (mode == 2 && move != 0 && task > 0) { //inst_message diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java index 6076a7e0..362e4f76 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java @@ -19,6 +19,8 @@ import org.nl.acs.device_driver.ScannerDeviceDriver; 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.service.DeviceErrorLogService; +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.log.service.DeviceExecuteLogService; @@ -67,6 +69,9 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe @Autowired DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String container; protected String barcode = null; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java index 77356545..09397d79 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_inspect_site/StandardInspectSiteDeviceDriver.java @@ -13,6 +13,8 @@ import org.nl.acs.device_driver.DeviceDriver; 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.history.service.DeviceErrorLogService; +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.log.service.DeviceExecuteLogService; @@ -46,6 +48,8 @@ public class StandardInspectSiteDeviceDriver extends AbstractOpcDeviceDriver imp protected ItemProtocol itemProtocol = new ItemProtocol(this); DeviceExecuteLogService logServer = SpringContextHolder.getBean("deviceExecuteLogServiceImpl"); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String container; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java index e2ec8b0d..83086ad9 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_ordinary_site/StandardOrdinarySiteDeviceDriver.java @@ -15,6 +15,8 @@ import org.nl.acs.device_driver.driver.AbstractDeviceDriver; 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.service.DeviceErrorLogService; +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.log.service.DeviceExecuteLogService; @@ -53,6 +55,8 @@ public class StandardOrdinarySiteDeviceDriver extends AbstractDeviceDriver imple DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); @Autowired NDCAgvService agvService = SpringContextHolder.getBean(NDCAgvService.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); Integer hasGoods = 0; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_scanner/StandardScannerDeviceDriver.java b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_scanner/StandardScannerDeviceDriver.java index a3e5708b..4ca38215 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_scanner/StandardScannerDeviceDriver.java +++ b/wcs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_scanner/StandardScannerDeviceDriver.java @@ -7,16 +7,22 @@ import lombok.extern.slf4j.Slf4j; import org.nl.acs.device_driver.DeviceDriver; import org.nl.acs.device_driver.ScannerDeviceDriver; import org.nl.acs.device_driver.driver.AbstractDeviceDriver; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.impl.DeviceErrorLogServiceImpl; import org.nl.acs.monitor.DeviceStageMonitor; import org.nl.acs.socket.SocketConfig; import org.nl.acs.udw.UnifiedDataAccessor; import org.nl.acs.udw.UnifiedDataAccessorFactory; +import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.beans.factory.annotation.Autowired; /** 标准版扫码器 */ @Slf4j @Data public class StandardScannerDeviceDriver extends AbstractDeviceDriver implements ScannerDeviceDriver, DeviceDriver, DeviceStageMonitor { + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); UnifiedDataAccessor accessor_value; diff --git a/wcs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java b/wcs/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java new file mode 100644 index 00000000..5b12aec7 --- /dev/null +++ b/wcs/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/wcs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java b/wcs/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java new file mode 100644 index 00000000..694440fe --- /dev/null +++ b/wcs/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/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java b/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java new file mode 100644 index 00000000..e4bcc6c8 --- /dev/null +++ b/wcs/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/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java b/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java new file mode 100644 index 00000000..eb08cae4 --- /dev/null +++ b/wcs/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/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java new file mode 100644 index 00000000..19120c08 --- /dev/null +++ b/wcs/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/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java index 76a0011b..0b9aaffd 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java +++ b/wcs/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/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java index e60fa8e1..008158df 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java +++ b/wcs/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; @@ -64,6 +65,8 @@ 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 @@ -75,6 +78,8 @@ 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 @@ -90,6 +95,8 @@ 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){ diff --git a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java b/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java index 4b938b44..aabd3600 100644 --- a/wcs/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java +++ b/wcs/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/wcs/nladmin-system/src/main/java/org/nl/modules/system/wql/sys.xls b/wcs/nladmin-system/src/main/java/org/nl/modules/system/wql/sys.xls index 82566ab6461a4d0e92adeacbb1883cf1ca00f877..9d388cbb30a6b4b25ea70a3fd6a5076fad164e87 100644 GIT binary patch delta 54500 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 LyV@8vQ-}W#?@$!- diff --git a/wcs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js b/wcs/nladmin-ui/src/api/acs/history/acsDeviceErrorLog.js new file mode 100644 index 00000000..12f1337d --- /dev/null +++ b/wcs/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/wcs/nladmin-ui/src/views/acs/device/config.vue b/wcs/nladmin-ui/src/views/acs/device/config.vue index 70077a81..6e92eb1c 100644 --- a/wcs/nladmin-ui/src/views/acs/device/config.vue +++ b/wcs/nladmin-ui/src/views/acs/device/config.vue @@ -75,25 +75,13 @@ import { get, selectDriverCodeList } from '@/api/acs/device/driverConfig' import { getDicts } from '@/api/system/dict' import standard_inspect_site from './driver/standard_inspect_site' import standard_ordinary_site from './driver/standard_ordinary_site' -import weighing_site from './driver/weighing_site' -import machines_site from './driver/machines_site' import lamp_three_color from './driver/lamp_three_color' import standard_autodoor from './driver/standard_autodoor' -import standard_emptypallet_site from './driver/standard_emptypallet_site' -import standard_manipulator_inspect_site from './driver/standard_manipulator_inspect_site' -import standard_special_inspect_site from './driver/standard_special_inspect_site' -import special_ordinary_site from './driver/special_ordinary_site' import standard_storage from '@/views/acs/device/driver/standard_storage' import standard_scanner from '@/views/acs/device/driver/standard_scanner' import standard_conveyor_control_with_scanner from '@/views/acs/device/driver/standard_conveyor_control_with_scanner' -import standard_conveyor_control_with_plcscanner from '@/views/acs/device/driver/standard_conveyor_control_with_plcscanner' import standard_conveyor_control from '@/views/acs/device/driver/standard_conveyor_control' import standard_conveyor_monitor from '@/views/acs/device/driver/standard_conveyor_monitor' -import non_line_manipulator_inspect_site from '@/views/acs/device/driver/non_line_manipulator_inspect_site' -import non_line_inspect_site from '@/views/acs/device/driver/non_line_inspect_site' -import manipulator_inspect_site_NDC from '@/views/acs/device/driver/manipulator_inspect_site_NDC' -import standard_manipulator_stacking_site from '@/views/acs/device/driver/standard_manipulator_stacking_site' -import standard_photoelectric_inspect_site from '@/views/acs/device/driver/standard_photoelectric_inspect_site' import hailiang_special_pick_station from '@/views/acs/device/driver/hailiang_one/hailiang_special_pick_station' import hailiang_special_empty_station from '@/views/acs/device/driver/hailiang_one/hailiang_special_empty_station' @@ -122,18 +110,20 @@ export default { components: { standard_ordinary_site, standard_inspect_site, - standard_autodoor, + standard_storage, + standard_scanner, + standard_conveyor_control_with_scanner, + standard_conveyor_control, + standard_conveyor_monitor, + hailiang_smart_plc_test, + agv_ndc_two, + agv_ndc_one, + lamp_three_color, standard_emptypallet_site, standard_manipulator_inspect_site, standard_special_inspect_site, - lamp_three_color, - standard_storage, special_ordinary_site, - standard_scanner, - standard_conveyor_control_with_scanner, standard_conveyor_control_with_plcscanner, - standard_conveyor_control, - standard_conveyor_monitor, weighing_site, machines_site, non_line_manipulator_inspect_site, @@ -141,8 +131,6 @@ export default { manipulator_inspect_site_NDC, standard_manipulator_stacking_site, standard_photoelectric_inspect_site, - agv_ndc_two, - agv_ndc_one, hailiang_packer_station, hailiang_engraving_cache, hailiang_special_pick_station, @@ -156,12 +144,12 @@ export default { hailiang_cleaning_machine, hailiang_cleaning_machine_storage_station, hailiang_xj_plc_test, - hailiang_smart_plc_test, hailiang_threestation_smart, hailiang_foldingDisc_smart, hailiang_elevator_wiring, hailiang_paint_line, - hailiang_stacking_station + hailiang_stacking_station, + standard_autodoor }, dicts: ['device_type'], mixins: [crud], diff --git a/wcs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue b/wcs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue new file mode 100644 index 00000000..7a3611a3 --- /dev/null +++ b/wcs/nladmin-ui/src/views/acs/history/deviceErrorInfo/index.vue @@ -0,0 +1,145 @@ + + + + +