From f40a917974188ceac856373534ac1404431828bc Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Thu, 16 Mar 2023 13:59:11 +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 --- .../HaiLiangCoatingDeviceDriver.java | 14 ++ .../HaiLiangFeedingDeviceDriver.java | 14 +- .../HaiLiangFeedingTrunkDeviceDriver.java | 13 ++ .../HaiLiangLabelingDeviceDriver.java | 187 ++++++++++-------- .../HaiLiangLetteringDeviceDriver.java | 13 ++ .../HaiLiangRiskingDeviceDriver.java | 14 +- .../HaiLiangStrappingDeviceDriver.java | 14 +- .../java/org/nl/acs/history/ErrorUtil.java | 72 +++++++ .../rest/DeviceErrorLogController.java | 75 +++++++ .../service/DeviceErrorLogService.java | 73 +++++++ .../service/dto/DeviceErrorLogDto.java | 28 +++ .../impl/DeviceErrorLogServiceImpl.java | 140 +++++++++++++ .../src/main/java/org/nl/acs/log/wql/log.xls | Bin 140800 -> 182784 bytes .../java/org/nl/hand/rest/HandController.java | 13 +- .../java/org/nl/hand/service/HandService.java | 5 + .../nl/hand/service/impl/HandServiceImpl.java | 34 +++- .../modules/system/service/DictService.java | 2 + .../service/impl/DictDetailServiceImpl.java | 24 ++- .../system/service/impl/DictServiceImpl.java | 7 + .../main/resources/config/application-dev.yml | 6 +- qd/src/api/acs/history/acsDeviceErrorLog.js | 27 +++ .../acs/history/deviceErrorInfo/index.vue | 145 ++++++++++++++ 22 files changed, 817 insertions(+), 103 deletions(-) create mode 100644 nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java create mode 100644 nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java create mode 100644 nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java create mode 100644 nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java create mode 100644 nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java create mode 100644 qd/src/api/acs/history/acsDeviceErrorLog.js create mode 100644 qd/src/views/acs/history/deviceErrorInfo/index.vue diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_coating/HaiLiangCoatingDeviceDriver.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_coating/HaiLiangCoatingDeviceDriver.java index e00ecc0..fe253aa 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_coating/HaiLiangCoatingDeviceDriver.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_coating/HaiLiangCoatingDeviceDriver.java @@ -8,6 +8,10 @@ import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; 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.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.log.service.LogServer; import org.nl.acs.opc.Device; import org.nl.acs.order.service.ProduceshiftorderService; @@ -45,6 +49,9 @@ public class HaiLiangCoatingDeviceDriver extends AbstractOpcDeviceDriver impleme @Autowired LogServer logServer = SpringContextHolder.getBean(LogServer.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + String device_code; int mode = 0; int last_mode = 0; @@ -92,6 +99,13 @@ public class HaiLiangCoatingDeviceDriver extends AbstractOpcDeviceDriver impleme logServer.deviceLogToacs(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.deviceLog(this.device_code,"error" ,String.valueOf(error)); logServer.deviceLogToacs(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDeviceDriver.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDeviceDriver.java index 6d66e89..2ad710b 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDeviceDriver.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding/HaiLiangFeedingDeviceDriver.java @@ -10,6 +10,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.log.service.LogServer; import org.nl.acs.opc.Device; import org.nl.acs.order.service.ProduceshiftorderService; @@ -43,7 +47,8 @@ public class HaiLiangFeedingDeviceDriver extends AbstractOpcDeviceDriver impleme @Autowired ProduceshiftorderdetailService produceshiftorderdetailService = SpringContextHolder.getBean(ProduceshiftorderdetailService.class); - + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); @Autowired LogServer logServer = SpringContextHolder.getBean(LogServer.class); @@ -95,6 +100,13 @@ public class HaiLiangFeedingDeviceDriver extends AbstractOpcDeviceDriver impleme this.setRequireSucess(false); } 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.deviceLog(this.device_code,"error" ,String.valueOf(error)); logServer.deviceLogToacs(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDeviceDriver.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDeviceDriver.java index 4949d22..94d0f67 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDeviceDriver.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_feeding_trunk/HaiLiangFeedingTrunkDeviceDriver.java @@ -9,6 +9,10 @@ import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; 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.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.log.service.LogServer; import org.nl.acs.opc.Device; import org.nl.acs.order.service.ProduceshiftorderService; @@ -41,6 +45,8 @@ public class HaiLiangFeedingTrunkDeviceDriver extends AbstractOpcDeviceDriver im @Autowired LogServer logServer = SpringContextHolder.getBean(LogServer.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); @Override public Device getDevice() { @@ -211,6 +217,13 @@ public class HaiLiangFeedingTrunkDeviceDriver 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); + } logServer.deviceLog(this.device_code,"error" ,String.valueOf(error)); logServer.deviceLogToacs(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_labeling/HaiLiangLabelingDeviceDriver.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_labeling/HaiLiangLabelingDeviceDriver.java index b5f8d9c..ff8ab61 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_labeling/HaiLiangLabelingDeviceDriver.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_labeling/HaiLiangLabelingDeviceDriver.java @@ -11,6 +11,10 @@ import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; 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.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.log.service.LogServer; import org.nl.acs.opc.Device; import org.nl.acs.order.service.ProduceshiftorderService; @@ -50,6 +54,9 @@ public class HaiLiangLabelingDeviceDriver extends AbstractOpcDeviceDriver implem @Autowired LogServer logServer = SpringContextHolder.getBean(LogServer.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); + // @Autowired // LabelingTemplateService labelingTemplateService = SpringContextHolder.getBean(LabelingTemplateService.class); @@ -80,7 +87,6 @@ public class HaiLiangLabelingDeviceDriver extends AbstractOpcDeviceDriver implem private int detail_time_out = 3000; - @Override public void execute() { String message = null; @@ -95,38 +101,45 @@ public class HaiLiangLabelingDeviceDriver extends AbstractOpcDeviceDriver implem one_qty = this.itemProtocol.getOne_qty(); if (mode != last_mode) { - logServer.deviceLog(this.device_code,"mode" ,String.valueOf(mode)); - logServer.deviceLogToacs(this.device_code,"","","信号mode:" + last_mode + "->" + mode); - logServer.deviceLogToacs(this.device_code,"","","工作模式切换,刷新请求标记:"+this.requireSucess); + logServer.deviceLog(this.device_code, "mode", String.valueOf(mode)); + logServer.deviceLogToacs(this.device_code, "", "", "信号mode:" + last_mode + "->" + mode); + logServer.deviceLogToacs(this.device_code, "", "", "工作模式切换,刷新请求标记:" + this.requireSucess); this.setRequireSucess(false); } if (move != last_move) { - logServer.deviceLog(this.device_code,"move" ,String.valueOf(move)); - logServer.deviceLogToacs(this.device_code,"","","信号move:" + last_move + "->" + move); + logServer.deviceLog(this.device_code, "move", String.valueOf(move)); + logServer.deviceLogToacs(this.device_code, "", "", "信号move:" + last_move + "->" + move); } if (error != last_error) { - logServer.deviceLog(this.device_code,"error" ,String.valueOf(error)); - logServer.deviceLogToacs(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.deviceLog(this.device_code, "error", String.valueOf(error)); + logServer.deviceLogToacs(this.device_code, "", "", "信号error:" + last_error + "->" + error); } if (order != last_order) { - logServer.deviceLog(this.device_code,"order" ,String.valueOf(order)); - logServer.deviceLogToacs(this.device_code,"","","信号order:" + last_order + "->" + order); + logServer.deviceLog(this.device_code, "order", String.valueOf(order)); + logServer.deviceLogToacs(this.device_code, "", "", "信号order:" + last_order + "->" + order); } if (order_detail != last_order_detail) { - logServer.deviceLog(this.device_code,"order_detail" ,String.valueOf(order_detail)); - logServer.deviceLogToacs(this.device_code,"","","信号order_detail:" + last_order_detail + "->" + order_detail); + logServer.deviceLog(this.device_code, "order_detail", String.valueOf(order_detail)); + logServer.deviceLogToacs(this.device_code, "", "", "信号order_detail:" + last_order_detail + "->" + order_detail); } if (detail_qty != last_detail_qty) { - logServer.deviceLog(this.device_code,"detail_qty" ,String.valueOf(detail_qty)); - logServer.deviceLogToacs(this.device_code,"","","信号detail_qty:" + last_detail_qty + "->" + detail_qty); + logServer.deviceLog(this.device_code, "detail_qty", String.valueOf(detail_qty)); + logServer.deviceLogToacs(this.device_code, "", "", "信号detail_qty:" + last_detail_qty + "->" + detail_qty); } if (detail_qualified_qty != last_detail_qualified_qty) { - logServer.deviceLog(this.device_code,"detail_qualified_qty" ,String.valueOf(detail_qualified_qty)); - logServer.deviceLogToacs(this.device_code,"","","detail_qualified_qty:" + last_detail_qualified_qty + "->" + detail_qualified_qty); + logServer.deviceLog(this.device_code, "detail_qualified_qty", String.valueOf(detail_qualified_qty)); + logServer.deviceLogToacs(this.device_code, "", "", "detail_qualified_qty:" + last_detail_qualified_qty + "->" + detail_qualified_qty); } if (one_qty != last_one_qty) { - logServer.deviceLog(this.device_code,"finish_status" ,String.valueOf(one_qty)); - logServer.deviceLogToacs(this.device_code,"","","信号one_qty:" + last_one_qty + "->" + one_qty); + logServer.deviceLog(this.device_code, "finish_status", String.valueOf(one_qty)); + logServer.deviceLogToacs(this.device_code, "", "", "信号one_qty:" + last_one_qty + "->" + one_qty); } } catch (Exception var17) { @@ -153,71 +166,71 @@ public class HaiLiangLabelingDeviceDriver extends AbstractOpcDeviceDriver implem break; case 4: //申请贴标 - if(!requireSucess){ - if(order > 0 && order_detail > 0 && detail_qty>0 ){ - logServer.deviceLogToacs(this.device_code,"","",device_code+":申请贴标,mode:"+mode+",requireSucess:" + requireSucess + ",order:" + order +",order_detail:" - +order_detail+",detail_qty:"+detail_qty); - logServer.deviceLogToacs(this.device_code,"","","申请贴标"); - apply_labeling_message(String.valueOf(order),String.valueOf(order_detail),String.valueOf(detail_qty)); + if (!requireSucess) { + if (order > 0 && order_detail > 0 && detail_qty > 0) { + logServer.deviceLogToacs(this.device_code, "", "", device_code + ":申请贴标,mode:" + mode + ",requireSucess:" + requireSucess + ",order:" + order + ",order_detail:" + + order_detail + ",detail_qty:" + detail_qty); + logServer.deviceLogToacs(this.device_code, "", "", "申请贴标"); + apply_labeling_message(String.valueOf(order), String.valueOf(order_detail), String.valueOf(detail_qty)); } else { - logServer.deviceLogToacs(this.device_code,"","",device_code+":申请贴标失败,mode:"+mode+",requireSucess:" + requireSucess + ",order:" + order +",order_detail:" - +order_detail+",detail_qty:"+detail_qty); + logServer.deviceLogToacs(this.device_code, "", "", device_code + ":申请贴标失败,mode:" + mode + ",requireSucess:" + requireSucess + ",order:" + order + ",order_detail:" + + order_detail + ",detail_qty:" + detail_qty); } } break; case 5: //贴标完成 - if(!requireSucess){ - if(order > 0 && order_detail > 0 && detail_qty>0 ){ - logServer.deviceLogToacs(this.device_code,"","",device_code+":申请贴标完成,mode:"+mode+",requireSucess:" + requireSucess + ",order:" + order +",order_detail:" - +order_detail+",detail_qty:"+detail_qty); - update_detail(String.valueOf(order),String.valueOf(order_detail),"01"); + if (!requireSucess) { + if (order > 0 && order_detail > 0 && detail_qty > 0) { + logServer.deviceLogToacs(this.device_code, "", "", device_code + ":申请贴标完成,mode:" + mode + ",requireSucess:" + requireSucess + ",order:" + order + ",order_detail:" + + order_detail + ",detail_qty:" + detail_qty); + update_detail(String.valueOf(order), String.valueOf(order_detail), "01"); } else { - logServer.deviceLogToacs(this.device_code,"","",device_code+":申请贴标完成失败,mode:"+mode+",requireSucess:" + requireSucess + ",order:" + order +",order_detail:" - +order_detail+",detail_qty:"+detail_qty); + logServer.deviceLogToacs(this.device_code, "", "", device_code + ":申请贴标完成失败,mode:" + mode + ",requireSucess:" + requireSucess + ",order:" + order + ",order_detail:" + + order_detail + ",detail_qty:" + detail_qty); } } break; case 6: //强制贴标完成 - if(!requireSucess){ - if( order > 0 && order_detail > 0 && detail_qty>0) { - logServer.deviceLogToacs(this.device_code,"","",device_code+":申请强制贴标完成,mode:"+mode+",requireSucess:" + requireSucess + ",order:" + order +",order_detail:" - +order_detail+",detail_qty:"+detail_qty); - update_detail(String.valueOf(order),String.valueOf(order_detail),"02"); + if (!requireSucess) { + if (order > 0 && order_detail > 0 && detail_qty > 0) { + logServer.deviceLogToacs(this.device_code, "", "", device_code + ":申请强制贴标完成,mode:" + mode + ",requireSucess:" + requireSucess + ",order:" + order + ",order_detail:" + + order_detail + ",detail_qty:" + detail_qty); + update_detail(String.valueOf(order), String.valueOf(order_detail), "02"); } else { - logServer.deviceLogToacs(this.device_code,"","",device_code+":申请强制贴标完成失败,mode:"+mode+",requireSucess:" + requireSucess + ",order:" + order +",order_detail:" - +order_detail+",detail_qty:"+detail_qty); + logServer.deviceLogToacs(this.device_code, "", "", device_code + ":申请强制贴标完成失败,mode:" + mode + ",requireSucess:" + requireSucess + ",order:" + order + ",order_detail:" + + order_detail + ",detail_qty:" + detail_qty); } } break; - //工单完成 + //工单完成 case 7: - if(!requireSucess){ - if(order > 0 && order_detail > 0 ) { - logServer.deviceLogToacs(this.device_code,"","",device_code+":申请工单完成,mode:"+mode+",requireSucess:" + requireSucess + ",order:" + order +",order_detail:" - +order_detail); - finish_order(String.valueOf(order),String.valueOf(order_detail),"01"); + if (!requireSucess) { + if (order > 0 && order_detail > 0) { + logServer.deviceLogToacs(this.device_code, "", "", device_code + ":申请工单完成,mode:" + mode + ",requireSucess:" + requireSucess + ",order:" + order + ",order_detail:" + + order_detail); + finish_order(String.valueOf(order), String.valueOf(order_detail), "01"); } else { - logServer.deviceLogToacs(this.device_code,"","",device_code+":申请工单完成失败,mode:"+mode+",requireSucess:" + requireSucess + ",order:" + order +",order_detail:" - +order_detail); + logServer.deviceLogToacs(this.device_code, "", "", device_code + ":申请工单完成失败,mode:" + mode + ",requireSucess:" + requireSucess + ",order:" + order + ",order_detail:" + + order_detail); } } break; - //工单强制完成 + //工单强制完成 case 8: - if(!requireSucess) { - if(order > 0 && order_detail > 0 ) { - logServer.deviceLogToacs(this.device_code,"","",device_code+":申请工单强制完成,mode:"+mode+",requireSucess:" + requireSucess + ",order:" + order +",order_detail:" - +order_detail); - finish_order(String.valueOf(order),String.valueOf(order_detail),"02"); + if (!requireSucess) { + if (order > 0 && order_detail > 0) { + logServer.deviceLogToacs(this.device_code, "", "", device_code + ":申请工单强制完成,mode:" + mode + ",requireSucess:" + requireSucess + ",order:" + order + ",order_detail:" + + order_detail); + finish_order(String.valueOf(order), String.valueOf(order_detail), "02"); } else { - logServer.deviceLogToacs(this.device_code,"","",device_code+":申请工单强制完成失败,mode:"+mode+",requireSucess:" + requireSucess + ",order:" + order +",order_detail:" - +order_detail); + logServer.deviceLogToacs(this.device_code, "", "", device_code + ":申请工单强制完成失败,mode:" + mode + ",requireSucess:" + requireSucess + ",order:" + order + ",order_detail:" + + order_detail); } } break; @@ -236,7 +249,7 @@ public class HaiLiangLabelingDeviceDriver extends AbstractOpcDeviceDriver implem } - public synchronized boolean update_detail(String order, String order_detail,String status) { + public synchronized boolean update_detail(String order, String order_detail, String status) { Date date = new Date(); if (date.getTime() - this.detail_time_out < (long) this.detail_time_out) { log.trace("触发时间因为小于{}毫秒,而被无视", this.detail_time_out); @@ -253,37 +266,37 @@ public class HaiLiangLabelingDeviceDriver extends AbstractOpcDeviceDriver implem dto.setLabeling_finish_time(now); dto.setOrder_detail_status("08"); produceshiftorderdetailService.update(dto); - writing(itemProtocol.item_to_command,String.valueOf(mode)); + writing(itemProtocol.item_to_command, String.valueOf(mode)); requireSucess = true; return true; } } - public synchronized boolean finish_order(String order, String order_detail,String status) { + public synchronized boolean finish_order(String order, String order_detail, String status) { Date date = new Date(); if (date.getTime() - this.detail_time_out < (long) this.detail_time_out) { log.trace("触发时间因为小于{}毫秒,而被无视", this.detail_time_out); return false; } else { ProduceshiftorderDto dto = produceshiftorderService.findOrderByOrderCodeFromCache(String.valueOf(order)); - if(ObjectUtil.isEmpty(dto)){ + if (ObjectUtil.isEmpty(dto)) { return false; } - if(!StrUtil.equals(dto.getOrder_status(),status)){ - if(StrUtil.equals(status,"1")){ + if (!StrUtil.equals(dto.getOrder_status(), status)) { + if (StrUtil.equals(status, "1")) { dto.setOrder_status("07"); } else { dto.setOrder_status("08"); } produceshiftorderService.autoupdate(dto); } - writing(itemProtocol.item_to_command,String.valueOf(mode)); + writing(itemProtocol.item_to_command, String.valueOf(mode)); requireSucess = true; return true; } } - public synchronized boolean apply_labeling_message(String order, String order_detail,String qty) { + public synchronized boolean apply_labeling_message(String order, String order_detail, String qty) { Date date = new Date(); if (date.getTime() - this.detail_time_out < (long) this.detail_time_out) { log.trace("触发时间因为小于{}毫秒,而被无视", this.detail_time_out); @@ -292,7 +305,7 @@ public class HaiLiangLabelingDeviceDriver extends AbstractOpcDeviceDriver implem this.detail_time = date; ProduceshiftorderDto dto = produceshiftorderService.findOrderByOrderCodeFromCache(String.valueOf(order)); ProduceshiftorderdetailDto detaildto = produceshiftorderdetailService.findOrderDetailFromCache(String.valueOf(order), String.valueOf(order_detail)); - if(ObjectUtil.isEmpty(dto)){ + if (ObjectUtil.isEmpty(dto)) { throw new BadRequestException("未找到可下发工单明细!"); } Boolean flag = false; @@ -301,34 +314,34 @@ public class HaiLiangLabelingDeviceDriver extends AbstractOpcDeviceDriver implem //labelingTemplateService.printMessage(dto,qty); String path = jsonStor.getString("path"); - String pathName = "E:\\work\\"+jsonStor.getString("name")+ jsonStor.getString("storage_id") + ".xlsx"; + String pathName = "E:\\work\\" + jsonStor.getString("name") + jsonStor.getString("storage_id") + ".xlsx"; JSONObject jo = new JSONObject(); - jo.put("order_id",dto.getOrder_id()); - jo.put("template_id",detaildto.getTemplate_id()); - jo.put("path",path); - jo.put("url",pathName); - jo.put("alloy",dto.getAlloy()); - jo.put("temper",dto.getTemper()); - jo.put("material_spec",dto.getMaterial_spec()); - jo.put("number",String.valueOf(one_qty)); - jo.put("outer_diameter",dto.getOuter_diameter()); - jo.put("standard",detaildto.getStandard()); - jo.put("batch",detaildto.getBatch()); - jo.put("prod_date",detaildto.getProd_date()); - jo.put("present_strap_pack_number",String.valueOf(labeling_index)); - jo.put("inspector",detaildto.getInspector()); - jo.put("mg_weight",detaildto.getMg_weight()); + jo.put("order_id", dto.getOrder_id()); + jo.put("template_id", detaildto.getTemplate_id()); + jo.put("path", path); + jo.put("url", pathName); + jo.put("alloy", dto.getAlloy()); + jo.put("temper", dto.getTemper()); + jo.put("material_spec", dto.getMaterial_spec()); + jo.put("number", String.valueOf(one_qty)); + jo.put("outer_diameter", dto.getOuter_diameter()); + jo.put("standard", detaildto.getStandard()); + jo.put("batch", detaildto.getBatch()); + jo.put("prod_date", detaildto.getProd_date()); + jo.put("present_strap_pack_number", String.valueOf(labeling_index)); + jo.put("inspector", detaildto.getInspector()); + jo.put("mg_weight", detaildto.getMg_weight()); //打印纸张大小 - jo.put("page_length","600"); - jo.put("page_height","400"); - logServer.deviceLogToacs(this.device_code,"","","申请贴标接口信息:"+jo.toString()); + jo.put("page_length", "600"); + jo.put("page_height", "400"); + logServer.deviceLogToacs(this.device_code, "", "", "申请贴标接口信息:" + jo.toString()); flag = produceshiftorderService.print(jo); - if(flag){ - logServer.deviceLogToacs(this.device_code,"","","下发贴标信息成功"); - writing(itemProtocol.item_to_command,String.valueOf(mode)); + if (flag) { + logServer.deviceLogToacs(this.device_code, "", "", "下发贴标信息成功"); + writing(itemProtocol.item_to_command, String.valueOf(mode)); requireSucess = true; return true; } else { diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_lettering/HaiLiangLetteringDeviceDriver.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_lettering/HaiLiangLetteringDeviceDriver.java index 31fa65c..e0bdb42 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_lettering/HaiLiangLetteringDeviceDriver.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_lettering/HaiLiangLetteringDeviceDriver.java @@ -8,6 +8,10 @@ import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; 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.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.log.service.LogServer; import org.nl.acs.opc.Device; import org.nl.acs.order.service.ProduceshiftorderService; @@ -38,6 +42,8 @@ public class HaiLiangLetteringDeviceDriver extends AbstractOpcDeviceDriver imple @Autowired LogServer logServer = SpringContextHolder.getBean(LogServer.class); + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String device_code; int mode = 0; @@ -91,6 +97,13 @@ public class HaiLiangLetteringDeviceDriver extends AbstractOpcDeviceDriver imple logServer.deviceLogToacs(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.deviceLog(this.device_code,"error" ,String.valueOf(error)); logServer.deviceLogToacs(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_risking/HaiLiangRiskingDeviceDriver.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_risking/HaiLiangRiskingDeviceDriver.java index a6f576e..b7b9e1c 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_risking/HaiLiangRiskingDeviceDriver.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_risking/HaiLiangRiskingDeviceDriver.java @@ -8,6 +8,10 @@ import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; 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.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.log.service.LogServer; import org.nl.acs.opc.Device; import org.nl.acs.order.service.ProduceshiftorderService; @@ -39,7 +43,8 @@ public class HaiLiangRiskingDeviceDriver extends AbstractOpcDeviceDriver impleme @Autowired LogServer logServer = SpringContextHolder.getBean(LogServer.class); - + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String device_code; int mode = 0; int last_mode = 0; @@ -92,6 +97,13 @@ public class HaiLiangRiskingDeviceDriver extends AbstractOpcDeviceDriver impleme logServer.deviceLogToacs(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.deviceLog(this.device_code,"error" ,String.valueOf(error)); logServer.deviceLogToacs(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_strapping/HaiLiangStrappingDeviceDriver.java b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_strapping/HaiLiangStrappingDeviceDriver.java index 0d5509f..5a33f6c 100644 --- a/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_strapping/HaiLiangStrappingDeviceDriver.java +++ b/nladmin-system/src/main/java/org/nl/acs/device_driver/hailiang/hailiang_strapping/HaiLiangStrappingDeviceDriver.java @@ -8,6 +8,10 @@ import org.nl.acs.device.device_driver.standard_inspect.ReadUtil; 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.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.log.service.LogServer; import org.nl.acs.opc.Device; import org.nl.acs.order.service.ProduceshiftorderService; @@ -43,7 +47,8 @@ public class HaiLiangStrappingDeviceDriver extends AbstractOpcDeviceDriver imple @Autowired LogServer logServer = SpringContextHolder.getBean(LogServer.class); - + @Autowired + DeviceErrorLogService deviceErrorLogService = SpringContextHolder.getBean(DeviceErrorLogServiceImpl.class); String device_code; int mode = 0; int last_mode = 0; @@ -101,6 +106,13 @@ public class HaiLiangStrappingDeviceDriver extends AbstractOpcDeviceDriver imple logServer.deviceLogToacs(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.deviceLog(this.device_code,"error" ,String.valueOf(error)); logServer.deviceLogToacs(this.device_code,"","","信号error:" + last_error + "->" + error); } diff --git a/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java b/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java new file mode 100644 index 0000000..d9acd57 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/acs/history/ErrorUtil.java @@ -0,0 +1,72 @@ +package org.nl.acs.history; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import net.dreamlu.mica.core.result.R; +import org.apache.poi.ss.formula.functions.T; +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.dto.DictDto; +import org.nl.modules.system.service.dto.DictQueryCriteria; +import org.nl.modules.system.service.impl.DictDetailServiceImpl; +import org.nl.modules.system.service.impl.DictServiceImpl; +import org.nl.utils.SpringContextHolder; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Supplier; + +/** + * @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/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java b/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java new file mode 100644 index 0000000..7ba38cf --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/acs/history/rest/DeviceErrorLogController.java @@ -0,0 +1,75 @@ + +package org.nl.acs.history.rest; + + +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.springframework.data.domain.Pageable; +import lombok.RequiredArgsConstructor; +import org.nl.annotation.Log; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import io.swagger.annotations.*; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; +import lombok.extern.slf4j.Slf4j; + +/** +* @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/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java b/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java new file mode 100644 index 0000000..8694348 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/acs/history/service/DeviceErrorLogService.java @@ -0,0 +1,73 @@ + +package org.nl.acs.history.service; + +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.springframework.data.domain.Pageable; +import java.util.Map; +import java.util.List; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; + +/** +* @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/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java b/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java new file mode 100644 index 0000000..843e625 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/acs/history/service/dto/DeviceErrorLogDto.java @@ -0,0 +1,28 @@ +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/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java b/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java new file mode 100644 index 0000000..7a44610 --- /dev/null +++ b/nladmin-system/src/main/java/org/nl/acs/history/service/impl/DeviceErrorLogServiceImpl.java @@ -0,0 +1,140 @@ + +package org.nl.acs.history.service.impl; + + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import org.nl.acs.device.service.dto.AcsDeviceErpmappingDto; +import org.nl.acs.history.service.DeviceErrorLogService; +import org.nl.acs.history.service.dto.DeviceErrorLogDto; +import org.nl.exception.BadRequestException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import org.springframework.data.domain.Pageable; + +import java.util.List; +import java.util.Map; +import java.io.IOException; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.LinkedHashMap; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.nl.utils.SecurityUtils; +import org.nl.wql.core.bean.ResultBean; +import org.nl.wql.core.bean.WQLObject; +import org.nl.wql.util.WqlUtil; +import org.nl.utils.FileUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * @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/nladmin-system/src/main/java/org/nl/acs/log/wql/log.xls b/nladmin-system/src/main/java/org/nl/acs/log/wql/log.xls index 37aae49860a7d5bb16dd39534f59f7babd7fec35..c5bc10d4b7ba2349c978cdcc3d673f7a37b536ed 100644 GIT binary patch literal 182784 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 W{$wDW4W6RIKOWUz(>y~}`TqhqngnP7 diff --git a/nladmin-system/src/main/java/org/nl/hand/rest/HandController.java b/nladmin-system/src/main/java/org/nl/hand/rest/HandController.java index 062c2b0..3bf7c97 100644 --- a/nladmin-system/src/main/java/org/nl/hand/rest/HandController.java +++ b/nladmin-system/src/main/java/org/nl/hand/rest/HandController.java @@ -9,11 +9,11 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.annotation.Log; import org.nl.hand.service.HandService; +import org.nl.wql.core.content.HttpContext; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.io.IOException; import java.util.Map; @Slf4j @@ -39,6 +39,7 @@ public class HandController { return new ResponseEntity<>(handService.handlogin(param), HttpStatus.OK); } + /** * 查询工单及明细 * @@ -129,4 +130,14 @@ public class HandController { public ResponseEntity queryDeviceInfo() { return new ResponseEntity<>(handService.queryDeviceInfo(), HttpStatus.OK); } + + @PostMapping("/queryDeviceErrorInfo") + @Log("查询设备报警记录") + @ApiOperation("查询设备报警记录") + public ResponseEntity queryDeviceErrorInfo(@RequestBody JSONObject whereJson) { + HttpContext ctx = new HttpContext("11"); + ctx.setPage((String) (whereJson.get("page"))); + ctx.setRows((String) (whereJson.get("size"))); + return new ResponseEntity<>(handService.queryDeviceErrorInfo(whereJson,ctx), HttpStatus.OK); + } } diff --git a/nladmin-system/src/main/java/org/nl/hand/service/HandService.java b/nladmin-system/src/main/java/org/nl/hand/service/HandService.java index a2352a1..6933bb3 100644 --- a/nladmin-system/src/main/java/org/nl/hand/service/HandService.java +++ b/nladmin-system/src/main/java/org/nl/hand/service/HandService.java @@ -1,7 +1,9 @@ package org.nl.hand.service; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import org.nl.wql.core.content.HttpContext; import java.io.IOException; import java.util.Map; @@ -17,6 +19,9 @@ public interface HandService { */ JSONObject handlogin(Map param); + JSONObject queryDeviceErrorInfo(JSONObject whereJson, HttpContext ctx); + + /** * 查询工单及明细 * diff --git a/nladmin-system/src/main/java/org/nl/hand/service/impl/HandServiceImpl.java b/nladmin-system/src/main/java/org/nl/hand/service/impl/HandServiceImpl.java index 70a1174..bf142ab 100644 --- a/nladmin-system/src/main/java/org/nl/hand/service/impl/HandServiceImpl.java +++ b/nladmin-system/src/main/java/org/nl/hand/service/impl/HandServiceImpl.java @@ -1,6 +1,7 @@ package org.nl.hand.service.impl; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; @@ -21,6 +22,10 @@ import org.nl.modules.system.service.UserService; import org.nl.modules.system.service.dto.UserDto; import org.nl.utils.RsaUtils; import org.nl.wql.WQL; +import org.nl.wql.core.bean.ResultBean; +import org.nl.wql.core.bean.WQLObject; +import org.nl.wql.core.content.HttpContext; +import org.nl.wql.util.WqlUtil; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @@ -99,6 +104,31 @@ public class HandServiceImpl implements HandService { return resultJSON; } + @Override + public JSONObject queryDeviceErrorInfo(JSONObject whereJson, HttpContext ctx) { + 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 + "%'"; + } + JSONArray jsonArray = wo.pagequery(ctx, where, "error_time desc").getResultJSONArray(0); + // 返回 + JSONObject resultJSON = new JSONObject(); + resultJSON.put("code", "1"); + resultJSON.put("desc", "查询成功"); + resultJSON.put("result", jsonArray); + return resultJSON; + } + @Override public JSONObject order() { // 查询工单 @@ -522,8 +552,8 @@ public class HandServiceImpl implements HandService { int wrap_control = hailiangFlatDeviceDriver.getWrap_control(); int strapping_finish = hailiangFlatDeviceDriver.getStrapping_finish(); int error_clear = hailiangFlatDeviceDriver.getError_clear(); - float motor_frequency_setting= hailiangFlatDeviceDriver.getMotor_frequency_setting(); - float nip_setting= hailiangFlatDeviceDriver.getNip_setting(); + float motor_frequency_setting = hailiangFlatDeviceDriver.getMotor_frequency_setting(); + float nip_setting = hailiangFlatDeviceDriver.getNip_setting(); int cowl_pass_jacking_need_num = hailiangFlatDeviceDriver.getCowl_pass_jacking_need_num(); int cowl_pass_jacking_has_num = hailiangFlatDeviceDriver.getCowl_pass_jacking_has_num(); resp.put("code", "1"); diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java b/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java index cbdad98..79dbade 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/DictService.java @@ -48,6 +48,8 @@ public interface DictService { */ List queryAll(DictQueryCriteria dict); + List queryAll(); + /** * 根据字典名查询字典详情 * @param name diff --git a/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java b/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java index 44a42c9..5a366c0 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictDetailServiceImpl.java @@ -15,7 +15,10 @@ */ package org.nl.modules.system.service.impl; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; import lombok.RequiredArgsConstructor; +import org.nl.acs.history.ErrorUtil; import org.nl.modules.system.domain.Dict; import org.nl.modules.system.domain.DictDetail; import org.nl.modules.system.repository.DictDetailRepository; @@ -37,11 +40,12 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; +import java.util.Optional; /** -* @author Zheng Jie -* @date 2019-04-10 -*/ + * @author Zheng Jie + * @date 2019-04-10 + */ @Service @RequiredArgsConstructor @CacheConfig(cacheNames = "dict") @@ -53,8 +57,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 +68,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 +98,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/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java b/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java index c21e17d..7fcfbd4 100644 --- a/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java +++ b/nladmin-system/src/main/java/org/nl/modules/system/service/impl/DictServiceImpl.java @@ -16,6 +16,7 @@ package org.nl.modules.system.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; @@ -63,6 +64,12 @@ public class DictServiceImpl implements DictService { return dictMapper.toDto(list); } + @Override + public List queryAll() { + List list = dictRepository.findAll(); + return list; + } + @Override public JSONArray queryDetailByName(String name) { JSONObject resultJson = new JSONObject(); diff --git a/nladmin-system/src/main/resources/config/application-dev.yml b/nladmin-system/src/main/resources/config/application-dev.yml index c81cebc..0cb3be2 100644 --- a/nladmin-system/src/main/resources/config/application-dev.yml +++ b/nladmin-system/src/main/resources/config/application-dev.yml @@ -9,11 +9,11 @@ spring: db-type: com.alibaba.druid.pool.DruidDataSource driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy #url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:hl_zgbz_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.1.90}:${DB_PORT:3306}/${DB_NAME:hl_zgbz_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true + url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:hl_zgbz_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true&allowPublicKeyRetrieval=true username: ${DB_USER:root} #password: ${DB_PWD:P@ssw0rd} - #password: ${DB_PWD:Root.123456} - password: ${DB_PWD:123456} + password: ${DB_PWD:password} + #password: ${DB_PWD:123456} # 初始连接数 initial-size: 5 # 最小连接数 diff --git a/qd/src/api/acs/history/acsDeviceErrorLog.js b/qd/src/api/acs/history/acsDeviceErrorLog.js new file mode 100644 index 0000000..12f1337 --- /dev/null +++ b/qd/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/qd/src/views/acs/history/deviceErrorInfo/index.vue b/qd/src/views/acs/history/deviceErrorInfo/index.vue new file mode 100644 index 0000000..7a3611a --- /dev/null +++ b/qd/src/views/acs/history/deviceErrorInfo/index.vue @@ -0,0 +1,145 @@ + + + + +