From 3b8564432e524a1f44ce75523573c12f55d14a35 Mon Sep 17 00:00:00 2001 From: "USER-20220102CG\\noblelift" <546428999@qq.com> Date: Mon, 12 Jun 2023 20:51:14 +0800 Subject: [PATCH 1/5] =?UTF-8?q?fix=20=E6=8C=87=E4=BB=A4=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OvenGantryManipulatorDeviceDriver.java | 548 +++++------ .../SiemensConveyorDeviceDriver.java | 76 +- .../SiemensConveyorCkkDeviceDriver.java | 131 ++- .../SiemensConveyorLabelingDeviceDriver.java | 74 +- .../SlitTwoManipulatorDeviceDriver.java | 907 +++++++++--------- .../service/impl/LiKuToAcsServiceImpl.java | 81 +- .../instruction/service/dto/Instruction.java | 9 + .../org/nl/acs/task/service/dto/TaskDto.java | 9 + 8 files changed, 989 insertions(+), 846 deletions(-) diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/oven_manipulator/OvenGantryManipulatorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/oven_manipulator/OvenGantryManipulatorDeviceDriver.java index 40008724b..ef881798a 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/oven_manipulator/OvenGantryManipulatorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/oven_manipulator/OvenGantryManipulatorDeviceDriver.java @@ -104,7 +104,8 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i int hasGoods = 0; String message = null; Boolean iserror = false; - + private Date instruction_update_time = new Date(); + private int instruction_update_time_out = 1000; Integer heartbeat_tag; private Date instruction_require_time = new Date(); @@ -213,274 +214,9 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i logServer.deviceExecuteLog(this.device_code, "", "", "信号task:" + last_task + "->" + task); } - //更改任务状态 - if (task > 0) { - //inst_message - Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task)); - if (inst1 != null) { - if (StrUtil.equals(inst1.getInstruction_status(), "0")) { - inst1.setInstruction_status("1"); - inst1.setExecute_device_code(this.device_code); - instructionService.update(inst1); - } - } - } + update_instruction_status(); - //申请取货 - if (mode == 3 && action == 1 && move == 0 && task > 0) { - Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task)); - if (ObjectUtil.isNotEmpty(inst2)) { - String start_device_code = inst2.getStart_device_code(); - Device device = deviceAppService.findDeviceByCode(start_device_code); - HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; - if (device.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { - hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) device.getDeviceDriver(); - //hongXiangConveyorDeviceDriver.writing("to_open_door", "1"); - int mode = hongXiangConveyorDeviceDriver.getMode(); - int door = hongXiangConveyorDeviceDriver.getDoor(); - int action = hongXiangConveyorDeviceDriver.getAction(); - int error1 = hongXiangConveyorDeviceDriver.getError1(); - int move = hongXiangConveyorDeviceDriver.getMove(); - if (mode == 1 && door == 1 && action == 1 && error1 == 0 && move == 1) { - if (this.getNow_steps_type() == 2) { - this.writing("to_command", "2"); - this.setNow_steps_type(3); - } else { - //logServer.deviceExecuteLog(this.device_code, "", "", "未反馈电气信号原因:当前步骤不为下发电气信号(now_steps_type!=2)"); - } - } else { - if (this.getNow_steps_type() == 2) { - feedMessage = "烘箱:" + hongXiangConveyorDeviceDriver.getDevice_code(); - if (mode != 1) { - feedMessage = feedMessage + "工作模式(mode)信号未联机,"; - } - if (door != 1) { - feedMessage = feedMessage + "门状态(door)信号未开门,"; - } - if (action != 1) { - feedMessage = feedMessage + "允许取放(action)信号未允许取放,"; - } - if (move != 1) { - feedMessage = feedMessage + "取货位光电信号(move)不应该为无货状态,"; - } - if (error1 != 0) { - feedMessage = feedMessage + "故障(error1)信号出现故障,故障值:" + error1 + "。"; - } - } - } - } else { - if (this.getNow_steps_type() == 2) { - this.writing("to_command", "2"); - this.setNow_steps_type(3); - } else { - //logServer.deviceExecuteLog(this.device_code, "", "", "未反馈电气信号原因:当前步骤不为下发电气信号(now_steps_type!=2)\")"); - } - } - } - } else { - if (this.getNow_steps_type() == 2) { - feedMessage = "行架机械手:"; - if (mode != 3) { - feedMessage = feedMessage + "工作模式(mode)不为运行中状态,"; - } - if (action != 1) { - feedMessage = feedMessage + "动作信号(action)不为取货中状态,"; - } - if (move != 0) { - feedMessage = feedMessage + "光电信号(move)不为无货状态,"; - } - if (task == 0) { - feedMessage = feedMessage + "当前上报任务号(task)不应该为0。"; - } - } - } - //取货完成关闭烘箱门 - if (mode == 3 && action == 2 && move == 1 && task > 0) { - Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task)); - if (ObjectUtil.isNotEmpty(inst2)) { - String start_device_code = inst2.getStart_device_code(); - Device device = deviceAppService.findDeviceByCode(start_device_code); - HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; - if (device.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { - hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) device.getDeviceDriver(); - hongXiangConveyorDeviceDriver.writing("to_close_door", "1"); - } - if (this.getNow_steps_type() == 3) { - this.writing("to_command", "3"); - this.setNow_steps_type(4); - } else { - //logServer.deviceExecuteLog(this.device_code, "", "", "未反馈电气信号原因:当前步骤不为允许取货(now_steps_type!=3)"); - } - } - } else { - if (this.getNow_steps_type() == 3) { - feedMessage = "行架机械手:"; - if (mode != 3) { - feedMessage = feedMessage + "工作模式(mode)不为运行中状态,"; - } - if (action != 2) { - feedMessage = feedMessage + "动作信号(action)不为取货完成状态,"; - } - if (move != 1) { - feedMessage = feedMessage + "光电信号(move)不为有货状态,"; - } - if (task == 0) { - feedMessage = feedMessage + "当前上报任务号(task)不应该为0。"; - } - } - } - - //申请放货 - if (mode == 3 && action == 3 && move == 1 && task > 0) { - Instruction instructionDto = instructionService.findByCodeFromCache(String.valueOf(task)); - String next_device_code = instructionDto.getNext_device_code(); - Device nextDevice = deviceAppService.findDeviceByCode(next_device_code); - HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; - PhotoelectricInspectionSiteDeviceDriver photoelectricInspectionSiteDeviceDriver; - if (nextDevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { - hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) nextDevice.getDeviceDriver(); - //hongXiangConveyorDeviceDriver.writing("to_open_door", "1"); - int mode = hongXiangConveyorDeviceDriver.getMode(); - int door = hongXiangConveyorDeviceDriver.getDoor(); - int action = hongXiangConveyorDeviceDriver.getAction(); - int error1 = hongXiangConveyorDeviceDriver.getError1(); - int move = hongXiangConveyorDeviceDriver.getMove(); - if (mode == 1 && door == 1 && action == 1 && error1 == 0 && move == 0) { - if (this.getNow_steps_type() == 4) { - this.writing("to_command", "4"); - this.setNow_steps_type(5); - } else { - feedMessage = "未反馈电气信号原因:当前步骤不为允许放货(now_steps_type!=4)"; - //logServer.deviceExecuteLog(this.device_code, "", "", "未反馈电气信号原因:当前步骤不为允许放货(now_steps_type!=4)"); - } - } else { - if (this.getNow_steps_type() == 4) { - feedMessage = "烘箱:" + hongXiangConveyorDeviceDriver.getDevice_code(); - if (mode != 1) { - feedMessage = feedMessage + "工作模式(mode)信号未联机,"; - } - if (door != 1) { - feedMessage = feedMessage + "门状态(door)信号未开门,"; - } - if (action != 1) { - feedMessage = feedMessage + "允许取放(action)信号未允许取放,"; - } - if (move != 0) { - feedMessage = feedMessage + "放货位光电信号不应该为有货状态"; - } - if (error1 != 0) { - feedMessage = feedMessage + "故障(error1)信号出现故障。"; - } - } - } - } else { - if (this.getNow_steps_type() == 4) { - this.writing("to_command", "4"); - this.setNow_steps_type(5); - } else { - //logServer.deviceExecuteLog(this.device_code, "", "", "未反馈电气信号原因:当前步骤不为允许放货(now_steps_type!=4)"); - } - - } - } else { - if (this.getNow_steps_type() == 4) { - feedMessage = "行架机械手:"; - if (mode != 3) { - feedMessage = feedMessage + "工作模式(mode)不为运行中状态,"; - } - if (action != 3) { - feedMessage = feedMessage + "动作信号(action)不为放货中状态,"; - } - if (move != 1) { - feedMessage = feedMessage + "光电信号(move)不为有货状态,"; - } - if (task == 0) { - feedMessage = feedMessage + "当前上报任务号(task)不应该为0。"; - } - } - } - - //放货完成 - if (mode == 3 && action == 4 && move == 0 && task > 0) { - Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task)); - if (inst2 != null) { - if (StrUtil.equals(inst2.getInstruction_status(), "1")) { - - TaskDto taskDto = taskserver.findByCode(inst2.getTask_code()); - - String next_device_code = inst2.getNext_device_code(); - //String start_device_code = taskDto.getStart_device_code(); - //Device startDevice = deviceAppService.findDeviceByCode(start_device_code); - Device nextDevice = deviceAppService.findDeviceByCode(next_device_code); - HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; - StandardInspectSiteDeviceDriver standardInspectSiteDeviceDriver; - LampThreecolorDeviceDriver lampThreecolorDeviceDriver; -// if (startDevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { -// hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) startDevice.getDeviceDriver(); -// hongXiangConveyorDeviceDriver.writing("to_close_door", "1"); -// } - if (nextDevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { - hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) nextDevice.getDeviceDriver(); - hongXiangConveyorDeviceDriver.writing("to_close_door", "1"); - if (StrUtil.isNotEmpty(taskDto.getOven_time())) { - //下发烘箱时间 - int time = Integer.parseInt(taskDto.getOven_time()); - int hours = (time % (60 * 60 * 24)) / (60 * 60); - int minutes = (time % (60 * 60)) / 60; - hongXiangConveyorDeviceDriver.writing("to_time_house", String.valueOf(hours)); - hongXiangConveyorDeviceDriver.writing("to_time_min", String.valueOf(minutes)); - } - } - - if (nextDevice.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { - standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) nextDevice.getDeviceDriver(); -// hongXiangConveyorDeviceDriver.writing("to_close_door", "1"); - - if (!StrUtil.startWith(taskDto.getTask_code(), "-")) { - if (ObjectUtil.isNotEmpty(nextDevice.getExtraValue().get("link_three_lamp"))) { - String lamp = nextDevice.getExtraValue().get("link_three_lamp").toString(); - Device lampDevice = deviceAppService.findDeviceByCode(lamp); - if (ObjectUtil.isEmpty(lampDevice)) { - return; - } - if (lampDevice.getDeviceDriver() instanceof LampThreecolorDeviceDriver) { - lampThreecolorDeviceDriver = (LampThreecolorDeviceDriver) lampDevice.getDeviceDriver(); - logServer.deviceExecuteLog(lampDevice.getDeviceDriver().getDeviceCode(), "", "", "下发报警灯" + lamp + "报警信号"); - lampThreecolorDeviceDriver.writing("to_command", "1"); - } - } - } - - } - this.writing("to_command", "5"); - this.setNow_steps_type(6); - this.setNow_steps_type(0); - try { - finish_instruction(inst2); - } catch (Exception e) { - e.printStackTrace(); - } - feedMessage = ""; - } - } - } else { - if (this.getNow_steps_type() == 5) { - feedMessage = "行架机械手:"; - if (mode != 3) { - feedMessage = feedMessage + "工作模式(mode)不为运行中状态,"; - } - if (action != 4) { - feedMessage = feedMessage + "动作信号(action)不为放货完成状态,"; - } - if (move != 0) { - feedMessage = feedMessage + "光电信号(move)不为无货状态,"; - } - if (task == 0) { - feedMessage = feedMessage + "当前上报任务号(task)不应该为0。"; - } - } - } } catch (Exception var17) { var17.printStackTrace(); @@ -1036,4 +772,282 @@ public class OvenGantryManipulatorDeviceDriver extends AbstractOpcDeviceDriver i // // } + public synchronized void update_instruction_status() throws Exception { + Date date = new Date(); + if (date.getTime() - this.instruction_update_time.getTime() < (long) this.instruction_update_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_update_time_out); + + } else { + this.instruction_update_time = date; + //更改任务状态 + if (task > 0) { + //inst_message + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task)); + if (inst1 != null) { + if (StrUtil.equals(inst1.getInstruction_status(), "0")) { + inst1.setInstruction_status("1"); + inst1.setExecute_device_code(this.device_code); + instructionService.update(inst1); + } + } + } + + //申请取货 + if (mode == 3 && action == 1 && move == 0 && task > 0) { + Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task)); + if (ObjectUtil.isNotEmpty(inst2)) { + String start_device_code = inst2.getStart_device_code(); + Device device = deviceAppService.findDeviceByCode(start_device_code); + HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; + if (device.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { + hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) device.getDeviceDriver(); + //hongXiangConveyorDeviceDriver.writing("to_open_door", "1"); + int mode = hongXiangConveyorDeviceDriver.getMode(); + int door = hongXiangConveyorDeviceDriver.getDoor(); + int action = hongXiangConveyorDeviceDriver.getAction(); + int error1 = hongXiangConveyorDeviceDriver.getError1(); + int move = hongXiangConveyorDeviceDriver.getMove(); + if (mode == 1 && door == 1 && action == 1 && error1 == 0 && move == 1) { + if (this.getNow_steps_type() == 2) { + this.writing("to_command", "2"); + this.setNow_steps_type(3); + } else { + //logServer.deviceExecuteLog(this.device_code, "", "", "未反馈电气信号原因:当前步骤不为下发电气信号(now_steps_type!=2)"); + } + } else { + if (this.getNow_steps_type() == 2) { + feedMessage = "烘箱:" + hongXiangConveyorDeviceDriver.getDevice_code(); + if (mode != 1) { + feedMessage = feedMessage + "工作模式(mode)信号未联机,"; + } + if (door != 1) { + feedMessage = feedMessage + "门状态(door)信号未开门,"; + } + if (action != 1) { + feedMessage = feedMessage + "允许取放(action)信号未允许取放,"; + } + if (move != 1) { + feedMessage = feedMessage + "取货位光电信号(move)不应该为无货状态,"; + } + if (error1 != 0) { + feedMessage = feedMessage + "故障(error1)信号出现故障,故障值:" + error1 + "。"; + } + } + } + } else { + if (this.getNow_steps_type() == 2) { + this.writing("to_command", "2"); + this.setNow_steps_type(3); + } else { + //logServer.deviceExecuteLog(this.device_code, "", "", "未反馈电气信号原因:当前步骤不为下发电气信号(now_steps_type!=2)\")"); + } + } + } + } else { + if (this.getNow_steps_type() == 2) { + feedMessage = "行架机械手:"; + if (mode != 3) { + feedMessage = feedMessage + "工作模式(mode)不为运行中状态,"; + } + if (action != 1) { + feedMessage = feedMessage + "动作信号(action)不为取货中状态,"; + } + if (move != 0) { + feedMessage = feedMessage + "光电信号(move)不为无货状态,"; + } + if (task == 0) { + feedMessage = feedMessage + "当前上报任务号(task)不应该为0。"; + } + } + } + + //取货完成关闭烘箱门 + if (mode == 3 && action == 2 && move == 1 && task > 0) { + Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task)); + if (ObjectUtil.isNotEmpty(inst2)) { + String start_device_code = inst2.getStart_device_code(); + Device device = deviceAppService.findDeviceByCode(start_device_code); + HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; + if (device.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { + hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) device.getDeviceDriver(); + hongXiangConveyorDeviceDriver.writing("to_close_door", "1"); + } + if (this.getNow_steps_type() == 3) { + this.writing("to_command", "3"); + this.setNow_steps_type(4); + } else { + //logServer.deviceExecuteLog(this.device_code, "", "", "未反馈电气信号原因:当前步骤不为允许取货(now_steps_type!=3)"); + } + } + } else { + if (this.getNow_steps_type() == 3) { + feedMessage = "行架机械手:"; + if (mode != 3) { + feedMessage = feedMessage + "工作模式(mode)不为运行中状态,"; + } + if (action != 2) { + feedMessage = feedMessage + "动作信号(action)不为取货完成状态,"; + } + if (move != 1) { + feedMessage = feedMessage + "光电信号(move)不为有货状态,"; + } + if (task == 0) { + feedMessage = feedMessage + "当前上报任务号(task)不应该为0。"; + } + } + } + + //申请放货 + if (mode == 3 && action == 3 && move == 1 && task > 0) { + Instruction instructionDto = instructionService.findByCodeFromCache(String.valueOf(task)); + String next_device_code = instructionDto.getNext_device_code(); + Device nextDevice = deviceAppService.findDeviceByCode(next_device_code); + HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; + PhotoelectricInspectionSiteDeviceDriver photoelectricInspectionSiteDeviceDriver; + if (nextDevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { + hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) nextDevice.getDeviceDriver(); + //hongXiangConveyorDeviceDriver.writing("to_open_door", "1"); + int mode = hongXiangConveyorDeviceDriver.getMode(); + int door = hongXiangConveyorDeviceDriver.getDoor(); + int action = hongXiangConveyorDeviceDriver.getAction(); + int error1 = hongXiangConveyorDeviceDriver.getError1(); + int move = hongXiangConveyorDeviceDriver.getMove(); + if (mode == 1 && door == 1 && action == 1 && error1 == 0 && move == 0) { + if (this.getNow_steps_type() == 4) { + this.writing("to_command", "4"); + this.setNow_steps_type(5); + } else { + feedMessage = "未反馈电气信号原因:当前步骤不为允许放货(now_steps_type!=4)"; + //logServer.deviceExecuteLog(this.device_code, "", "", "未反馈电气信号原因:当前步骤不为允许放货(now_steps_type!=4)"); + } + } else { + if (this.getNow_steps_type() == 4) { + feedMessage = "烘箱:" + hongXiangConveyorDeviceDriver.getDevice_code(); + if (mode != 1) { + feedMessage = feedMessage + "工作模式(mode)信号未联机,"; + } + if (door != 1) { + feedMessage = feedMessage + "门状态(door)信号未开门,"; + } + if (action != 1) { + feedMessage = feedMessage + "允许取放(action)信号未允许取放,"; + } + if (move != 0) { + feedMessage = feedMessage + "放货位光电信号不应该为有货状态"; + } + if (error1 != 0) { + feedMessage = feedMessage + "故障(error1)信号出现故障。"; + } + } + } + } else { + if (this.getNow_steps_type() == 4) { + this.writing("to_command", "4"); + this.setNow_steps_type(5); + } else { + //logServer.deviceExecuteLog(this.device_code, "", "", "未反馈电气信号原因:当前步骤不为允许放货(now_steps_type!=4)"); + } + + } + } else { + if (this.getNow_steps_type() == 4) { + feedMessage = "行架机械手:"; + if (mode != 3) { + feedMessage = feedMessage + "工作模式(mode)不为运行中状态,"; + } + if (action != 3) { + feedMessage = feedMessage + "动作信号(action)不为放货中状态,"; + } + if (move != 1) { + feedMessage = feedMessage + "光电信号(move)不为有货状态,"; + } + if (task == 0) { + feedMessage = feedMessage + "当前上报任务号(task)不应该为0。"; + } + } + } + + //放货完成 + if (mode == 3 && action == 4 && move == 0 && task > 0) { + Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task)); + if (inst2 != null) { + if (StrUtil.equals(inst2.getInstruction_status(), "1")) { + + TaskDto taskDto = taskserver.findByCode(inst2.getTask_code()); + + String next_device_code = inst2.getNext_device_code(); + //String start_device_code = taskDto.getStart_device_code(); + //Device startDevice = deviceAppService.findDeviceByCode(start_device_code); + Device nextDevice = deviceAppService.findDeviceByCode(next_device_code); + HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; + StandardInspectSiteDeviceDriver standardInspectSiteDeviceDriver; + LampThreecolorDeviceDriver lampThreecolorDeviceDriver; +// if (startDevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { +// hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) startDevice.getDeviceDriver(); +// hongXiangConveyorDeviceDriver.writing("to_close_door", "1"); +// } + if (nextDevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { + hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) nextDevice.getDeviceDriver(); + hongXiangConveyorDeviceDriver.writing("to_close_door", "1"); + if (StrUtil.isNotEmpty(taskDto.getOven_time())) { + //下发烘箱时间 + int time = Integer.parseInt(taskDto.getOven_time()); + int hours = (time % (60 * 60 * 24)) / (60 * 60); + int minutes = (time % (60 * 60)) / 60; + hongXiangConveyorDeviceDriver.writing("to_time_house", String.valueOf(hours)); + hongXiangConveyorDeviceDriver.writing("to_time_min", String.valueOf(minutes)); + } + } + + if (nextDevice.getDeviceDriver() instanceof StandardInspectSiteDeviceDriver) { + standardInspectSiteDeviceDriver = (StandardInspectSiteDeviceDriver) nextDevice.getDeviceDriver(); +// hongXiangConveyorDeviceDriver.writing("to_close_door", "1"); + + if (!StrUtil.startWith(taskDto.getTask_code(), "-")) { + if (ObjectUtil.isNotEmpty(nextDevice.getExtraValue().get("link_three_lamp"))) { + String lamp = nextDevice.getExtraValue().get("link_three_lamp").toString(); + Device lampDevice = deviceAppService.findDeviceByCode(lamp); + if (ObjectUtil.isEmpty(lampDevice)) { + return; + } + if (lampDevice.getDeviceDriver() instanceof LampThreecolorDeviceDriver) { + lampThreecolorDeviceDriver = (LampThreecolorDeviceDriver) lampDevice.getDeviceDriver(); + logServer.deviceExecuteLog(lampDevice.getDeviceDriver().getDeviceCode(), "", "", "下发报警灯" + lamp + "报警信号"); + lampThreecolorDeviceDriver.writing("to_command", "1"); + } + } + } + + } + this.writing("to_command", "5"); + this.setNow_steps_type(6); + this.setNow_steps_type(0); + try { + finish_instruction(inst2); + } catch (Exception e) { + e.printStackTrace(); + } + feedMessage = ""; + } + } + } else { + if (this.getNow_steps_type() == 5) { + feedMessage = "行架机械手:"; + if (mode != 3) { + feedMessage = feedMessage + "工作模式(mode)不为运行中状态,"; + } + if (action != 4) { + feedMessage = feedMessage + "动作信号(action)不为放货完成状态,"; + } + if (move != 0) { + feedMessage = feedMessage + "光电信号(move)不为无货状态,"; + } + if (task == 0) { + feedMessage = feedMessage + "当前上报任务号(task)不应该为0。"; + } + } + } + } + } + } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java index c7d71642b..decaec13d 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java @@ -131,6 +131,9 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme String hand_barcode = null; Integer heartbeat_tag; + private Date instruction_update_time = new Date(); + private int instruction_update_time_out = 500; + private Date instruction_require_time = new Date(); private Date require_apply_labeling_time = new Date(); private Date require_apply_strangulation_time = new Date(); @@ -268,33 +271,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme if (move != 0 && task > 0) { // logServer.deviceExecuteLog(device_code, "", "", "输送线任务开始反馈任务状态,指令号:" + task); //inst_message - inst = instructionService.findByCodeFromCache(String.valueOf(task)); - if (inst != null) { - inst_message = "当前指令号:" + inst.getInstruction_code() + " " + inst.getStart_point_code() + "->" + inst.getNext_point_code() + " 载具号:" + inst.getVehicle_code(); - vehicle_code = inst.getVehicle_code(); - task_code = inst.getTask_code(); - if (StrUtil.equals(inst.getInstruction_status(), "0") && StrUtil.equals(this.getDeviceCode(), inst.getStart_device_code())) { - inst.setInstruction_status("1"); - inst.setExecute_device_code(this.device_code); - instructionService.update(inst); - logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈执行中状态,反馈成功,指令号:" + task + ",载具号:"+ inst.getVehicle_code()); - } - if (StrUtil.equals(inst.getInstruction_status(), "1")) { - if (StrUtil.equals(this.getDeviceCode(), inst.getNext_device_code())) { - vehicle_code = inst.getVehicle_code(); - inst.setExecute_device_code(this.device_code); - finish_instruction(); - logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈完成状态,反馈成功,指令号:" + task + ",载具号:"+ inst.getVehicle_code()); - } else { - - - } - - } - } else { -// message = "输送线任务反馈状态,查询不到指令号:" + task +"指令已完成"; - inst_message = null; - } + update_instruction_status(); } } catch (Exception var17) { @@ -648,7 +625,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme map3.put("value", "1"); list.add(map3); this.writing(list); - + requireSucess = true; while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() , inst.getInstruction_code())) { this.writing(list); @@ -659,6 +636,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme e.printStackTrace(); } if(ObjectUtil.isEmpty(instructionService.findByTaskcodeAndStatus(taskdto.getTask_code()))){ + requireSucess = false; return false; } } @@ -770,6 +748,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme map3.put("value", "1"); list.add(map3); this.writing(list); + requireSucess = true; while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() , instdto.getInstruction_code())) { this.writing(list); @@ -780,6 +759,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme e.printStackTrace(); } if(ObjectUtil.isEmpty(taskserver.findByCode(taskdto.getTask_code()))){ + requireSucess = false; return false; } } @@ -818,6 +798,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme map3.put("value", "1"); list.add(map3); this.writing(list); + requireSucess = true; while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() , inst.getInstruction_code())) { this.writing(list); @@ -828,6 +809,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme e.printStackTrace(); } if(ObjectUtil.isEmpty(instructionService.findByDeviceCodeFromCache(this.device_code))){ + requireSucess = false; return false; } } @@ -1110,4 +1092,42 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme } } + /** + * 更新指令状态 + */ + public synchronized void update_instruction_status() throws Exception { + Date date = new Date(); + if (date.getTime() - this.instruction_update_time.getTime() < (long) this.instruction_update_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_update_time_out); + + } else { + this.instruction_update_time = date; + inst = instructionService.findByCodeFromCache(String.valueOf(task)); + if (inst != null) { + inst_message = "当前指令号:" + inst.getInstruction_code() + " " + inst.getStart_point_code() + "->" + inst.getNext_point_code() + " 载具号:" + inst.getVehicle_code(); + vehicle_code = inst.getVehicle_code(); + task_code = inst.getTask_code(); + if (StrUtil.equals(inst.getInstruction_status(), "0") && StrUtil.equals(this.getDeviceCode(), inst.getStart_device_code())) { + inst.setInstruction_status("1"); + inst.setExecute_device_code(this.device_code); + instructionService.update(inst); + logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈执行中状态,反馈成功,指令号:" + task + ",载具号:"+ inst.getVehicle_code()); + } + if (StrUtil.equals(inst.getInstruction_status(), "1")) { + if (StrUtil.equals(this.getDeviceCode(), inst.getNext_device_code())) { + vehicle_code = inst.getVehicle_code(); + inst.setExecute_device_code(this.device_code); + finish_instruction(); + logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈完成状态,反馈成功,指令号:" + task + ",载具号:"+ inst.getVehicle_code()); + } else { + + } + } + } else { +// message = "输送线任务反馈状态,查询不到指令号:" + task +"指令已完成"; + inst_message = null; + } + + } + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_ckk/SiemensConveyorCkkDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_ckk/SiemensConveyorCkkDeviceDriver.java index a86490157..fd8675851 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_ckk/SiemensConveyorCkkDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_ckk/SiemensConveyorCkkDeviceDriver.java @@ -106,6 +106,9 @@ public class SiemensConveyorCkkDeviceDriver extends AbstractOpcDeviceDriver impl String hand_barcode = null; String barcode = null; + private Date instruction_update_time = new Date(); + private int instruction_update_time_out = 500; + Integer heartbeat_tag; private Date instruction_require_time = new Date(); private Date require_apply_labeling_time = new Date(); @@ -222,30 +225,10 @@ public class SiemensConveyorCkkDeviceDriver extends AbstractOpcDeviceDriver impl if (move != 0 && task > 0) { - inst = instructionService.findByCodeFromCache(String.valueOf(task)); - if (inst != null) { - inst_message = "当前指令号:" + inst.getInstruction_code() + " " + inst.getStart_point_code() + "->" + inst.getNext_point_code() + " 载具号:" + inst.getVehicle_code(); - vehicle_code = inst.getVehicle_code(); - task_code = inst.getTask_code(); - if (StrUtil.equals(inst.getInstruction_status(), "0") && StrUtil.equals(this.getDeviceCode(), inst.getStart_device_code())) { - inst.setInstruction_status("1"); - inst.setExecute_device_code(this.device_code); - instructionService.update(inst); - logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈执行中状态,反馈成功,指令号:" + task + ",载具号:"+ inst.getVehicle_code()); - } - if (StrUtil.equals(inst.getInstruction_status(), "1")) { - if (!StrUtil.equals(inst.getExecute_code(), this.device_code)) { - inst.setExecute_device_code(this.device_code); - instructionService.update(inst); - } - } - } else { -// logServer.deviceExecuteLog(device_code, "", "", "输送线任务开始反馈任务状态,反馈失败,查询不到指令号:" + task); -// message = "输送线任务反馈状态,查询不到指令号:" + task +"指令已完成"; - inst_message = null; - } + update_instruction_status(); } + } catch (Exception var17) { var17.printStackTrace(); inst_message = var17.getMessage(); @@ -522,6 +505,39 @@ public class SiemensConveyorCkkDeviceDriver extends AbstractOpcDeviceDriver impl } + /** + * 更新指令状态 + */ + public synchronized void update_instruction_status() throws Exception { + Date date = new Date(); + if (date.getTime() - this.instruction_update_time.getTime() < (long) this.instruction_update_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_update_time_out); + + } else { + this.instruction_update_time = date; + inst = instructionService.findByCodeFromCache(String.valueOf(task)); + if (inst != null) { + inst_message = "当前指令号:" + inst.getInstruction_code() + " " + inst.getStart_point_code() + "->" + inst.getNext_point_code() + " 载具号:" + inst.getVehicle_code(); + vehicle_code = inst.getVehicle_code(); + task_code = inst.getTask_code(); + if (StrUtil.equals(inst.getInstruction_status(), "0") && StrUtil.equals(this.getDeviceCode(), inst.getStart_device_code())) { + inst.setInstruction_status("1"); + inst.setExecute_device_code(this.device_code); + instructionService.update(inst); + logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈执行中状态,反馈成功,指令号:" + task); + } + if (StrUtil.equals(inst.getInstruction_status(), "1")) { + if (!StrUtil.equals(inst.getExecute_code(), this.device_code)) { + inst.setExecute_device_code(this.device_code); + instructionService.update(inst); + } + } + } else { + inst_message = null; + } + } + } + /** * 请求指令 @@ -585,16 +601,6 @@ public class SiemensConveyorCkkDeviceDriver extends AbstractOpcDeviceDriver impl map3.put("value", "1"); list.add(map3); this.writing(list); - while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() - , inst.getInstruction_code())) { - this.writing(list); - logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发信号"); - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } return true; } try { @@ -621,7 +627,7 @@ public class SiemensConveyorCkkDeviceDriver extends AbstractOpcDeviceDriver impl } catch (Exception e) { e.printStackTrace(); } - logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈完成状态,反馈成功,指令号:" + task + ",载具号:"+ inst.getVehicle_code()); + logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈完成状态,反馈成功,指令号:" + task); } } } else { @@ -658,34 +664,18 @@ public class SiemensConveyorCkkDeviceDriver extends AbstractOpcDeviceDriver impl list.add(map); Map map2 = new HashMap(); map2.put("code", "to_task"); - map2.put("value", "0"); + map2.put("value", inst.getInstruction_code()); list.add(map2); Map map3 = new HashMap(); map3.put("code", "to_command"); map3.put("value", "1"); list.add(map3); - Map map4 = new HashMap(); - map2.put("code", "to_task"); - map2.put("value", inst.getInstruction_code()); - list.add(map4); this.writing(list); -// if (task != Integer.parseInt(inst.getInstruction_code())) { -// this.writing(list); -// message = "重新下发电气信号"; -// logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发电气信号"); -// } - - while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() - , inst.getInstruction_code())) { + if (task != Integer.parseInt(inst.getInstruction_code())) { this.writing(list); - logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发信号"); - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } + message = "重新下发电气信号"; + logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发电气信号"); } - message = "下发电气任务号成功"; requireSucess = true; return true; @@ -781,31 +771,17 @@ public class SiemensConveyorCkkDeviceDriver extends AbstractOpcDeviceDriver impl list.add(map); Map map2 = new HashMap(); map2.put("code", "to_task"); - map2.put("value", "0"); + map2.put("value", instdto.getInstruction_code()); list.add(map2); Map map3 = new HashMap(); map3.put("code", "to_command"); map3.put("value", "1"); list.add(map3); - Map map4 = new HashMap(); - map2.put("code", "to_task"); - map2.put("value", inst.getInstruction_code()); - list.add(map4); this.writing(list); -// if (task != Integer.parseInt(inst.getInstruction_code())) { -// this.writing(list); -// message = "重新下发电气信号"; -// logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发电气信号"); -// } - while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() - , inst.getInstruction_code())) { + if (task != Integer.parseInt(inst.getInstruction_code())) { this.writing(list); - logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发信号"); - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } + message = "重新下发电气信号"; + logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发电气信号"); } } else { //如果不存在则直接找对应指令 @@ -831,10 +807,8 @@ public class SiemensConveyorCkkDeviceDriver extends AbstractOpcDeviceDriver impl map3.put("value", "1"); list.add(map3); this.writing(list); -// if (task != Integer.parseInt(inst.getInstruction_code())) { -// this.writing(list); -// logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发电气信号"); -// } + // while true + requireSucess = true; while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() , inst.getInstruction_code())) { this.writing(list); @@ -844,8 +818,15 @@ public class SiemensConveyorCkkDeviceDriver extends AbstractOpcDeviceDriver impl } catch (InterruptedException e) { e.printStackTrace(); } + if(ObjectUtil.isEmpty(inst.getInstruction_code())){ + requireSucess = false; + return false; + } } + + message = "下发电气任务号成功"; requireSucess = true; + } return true; } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_labeling/SiemensConveyorLabelingDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_labeling/SiemensConveyorLabelingDeviceDriver.java index 2b9e5897f..400413818 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_labeling/SiemensConveyorLabelingDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor_labeling/SiemensConveyorLabelingDeviceDriver.java @@ -110,7 +110,8 @@ public class SiemensConveyorLabelingDeviceDriver extends AbstractOpcDeviceDriver int hasGoods = 0; String message = null; Boolean iserror = false; - + private Date instruction_update_time = new Date(); + private int instruction_update_time_out = 500; Integer heartbeat_tag; private Date instruction_require_time = new Date(); private Date require_apply_labeling_time = new Date(); @@ -129,6 +130,7 @@ public class SiemensConveyorLabelingDeviceDriver extends AbstractOpcDeviceDriver private String error_type = "ssx_error_type"; int branchProtocol = 0; String inst_message; + String task_code = null; // 当前指令 @@ -205,36 +207,7 @@ public class SiemensConveyorLabelingDeviceDriver extends AbstractOpcDeviceDriver } if (mode == 2 && move != 0 && task > 0) { - logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈任务状态,指令号:" + task); - // inst_message - inst = instructionService.findByCodeFromCache(String.valueOf(task)); - if (inst != null) { - inst_message = - "指令号:" - + inst.getInstruction_code() - + " " - + inst.getStart_point_code() - + "->" - + inst.getNext_point_code() - + " 载具号:" - + inst.getVehicle_code(); - if (StrUtil.equals(inst.getInstruction_status(), "1") - && StrUtil.equals(this.getDeviceCode(), inst.getNext_device_code())) { - vehicle_code = inst.getVehicle_code(); - finish_instruction(); - logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈完成状态,反馈成功,指令号:" + task); - } else if (StrUtil.equals(inst.getInstruction_status(), "0") - && StrUtil.equals(this.getDeviceCode(), inst.getStart_device_code())) { - inst.setInstruction_status("1"); - instructionService.update(inst); - logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈执行中状态,反馈成功,指令号:" + task); - } else { - logServer.deviceExecuteLog( - device_code, "", "", "入库输送线任务开始反馈执行中状态,反馈失败任务状态不为就绪或者执行中状态,指令号:" + task); - } - } else { -// logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈任务状态,反馈失败,查询不到指令号:" + task); - } + update_instruction_status(); } } catch (Exception var17) { @@ -965,4 +938,43 @@ public class SiemensConveyorLabelingDeviceDriver extends AbstractOpcDeviceDriver } } } + + /** + * 更新指令状态 + */ + public synchronized void update_instruction_status() throws Exception { + Date date = new Date(); + if (date.getTime() - this.instruction_update_time.getTime() < (long) this.instruction_update_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_update_time_out); + + } else { + this.instruction_update_time = date; + inst = instructionService.findByCodeFromCache(String.valueOf(task)); + if (inst != null) { + inst_message = "当前指令号:" + inst.getInstruction_code() + " " + inst.getStart_point_code() + "->" + inst.getNext_point_code() + " 载具号:" + inst.getVehicle_code(); + vehicle_code = inst.getVehicle_code(); + task_code = inst.getTask_code(); + if (StrUtil.equals(inst.getInstruction_status(), "0") && StrUtil.equals(this.getDeviceCode(), inst.getStart_device_code())) { + inst.setInstruction_status("1"); + inst.setExecute_device_code(this.device_code); + instructionService.update(inst); + logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈执行中状态,反馈成功,指令号:" + task + ",载具号:"+ inst.getVehicle_code()); + } + if (StrUtil.equals(inst.getInstruction_status(), "1")) { + if (StrUtil.equals(this.getDeviceCode(), inst.getNext_device_code())) { + vehicle_code = inst.getVehicle_code(); + inst.setExecute_device_code(this.device_code); + finish_instruction(); + logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈完成状态,反馈成功,指令号:" + task + ",载具号:"+ inst.getVehicle_code()); + } else { + + } + } + } else { +// message = "输送线任务反馈状态,查询不到指令号:" + task +"指令已完成"; + inst_message = null; + } + + } + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/slit_two_manipulator/SlitTwoManipulatorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/slit_two_manipulator/SlitTwoManipulatorDeviceDriver.java index 4bfaf5f26..32fd2cdf5 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/slit_two_manipulator/SlitTwoManipulatorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/slit_two_manipulator/SlitTwoManipulatorDeviceDriver.java @@ -69,7 +69,8 @@ public class SlitTwoManipulatorDeviceDriver extends AbstractOpcDeviceDriver impl private String error_type = "fqhj_error_type"; Instruction cache_inst = null; String inst_type = null; - + private Date instruction_update_time = new Date(); + private int instruction_update_time_out = 500; //工作模式 int mode = 0; int last_mode = 0; @@ -159,6 +160,9 @@ public class SlitTwoManipulatorDeviceDriver extends AbstractOpcDeviceDriver impl private Date instruction_write_time = new Date(); + private int apply_task_time_out = 1000; + private Date apply_task_time = new Date(); + String notCreateTaskMessage = ""; String notCreateInstMessage = ""; @@ -287,416 +291,7 @@ public class SlitTwoManipulatorDeviceDriver extends AbstractOpcDeviceDriver impl logServer.deviceExecuteLog(this.device_code, "", "", "信号task2:" + last_task2 + "->" + task2); } - //单任务 前工位任务更新指令状态 - if (task1 > 0 && type == 1) { - Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); - if (inst1 != null) { - if (StrUtil.equals(inst1.getInstruction_status(), "0")) { - //当前执行步骤为更新任务状态 - inst1.setInstruction_status("1"); - inst1.setExecute_device_code(this.getDevice_code()); - instructionService.update(inst1); - } - } - } - - //单任务 后工位任务更新指令状态 - if (task2 > 0 && type == 2) { - //inst_message - Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); - if (inst2 != null) { - if (StrUtil.equals(inst2.getInstruction_status(), "0")) { - //当前指令更新状态 - now_steps_type2 = 1; - inst2.setInstruction_status("1"); - inst2.setExecute_device_code(this.device_code); - instructionService.update(inst2); - } - } - } - - //双任务更新指令状态 - if (task2 > 0 && task1 > 0 && type == 3) { - //inst_message - Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task1)); - if (inst2 != null) { - if (StrUtil.equals(inst2.getInstruction_status(), "0")) { - //当前指令更新状态 - inst2.setInstruction_status("1"); - inst2.setExecute_device_code(this.device_code); - instructionService.update(inst2); - } - } - } - - //双任务/单任务 后工位取空时判断动作信号,并反馈 - if (mode == 3 && action2 == 1 && move2 == 0 && task2 > 0) { - Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task2)); - String start_device_code = inst1.getStart_device_code(); - Device startDevice = deviceAppservice.findDeviceByCode(start_device_code); - if (ObjectUtil.isEmpty(startDevice)) { - feedMessage = "后工位取货位:" + start_device_code + "为空!"; - logServer.deviceExecuteLog(this.getDeviceCode(), "", "", "后工位取货位:" + start_device_code + "为空!"); - throw new BadRequestException("后工位取货位:" + start_device_code + "为空!"); - } - SiemensConveyorDeviceDriver siemensConveyorDeviceDriver; - if (startDevice.getDeviceDriver() instanceof SiemensConveyorDeviceDriver) { - siemensConveyorDeviceDriver = (SiemensConveyorDeviceDriver) startDevice.getDeviceDriver(); - int move = siemensConveyorDeviceDriver.getMove(); - int mode = siemensConveyorDeviceDriver.getMode(); - if (mode == 2 && move == 1) { - if (to_command2 != 2) { - this.writing("to_command2", "2"); - } - if (type == 2) { - this.setNow_steps_type2(3); - } else if (type == 3) { - this.setNow_steps_type3(3); - } - } else { - log.warn("后工位取货位无货,取货位:{},mode:{},move:{}", start_device_code, mode, move); - if (this.getNow_steps_type2() == 2 || this.getNow_steps_type3() == 2) { - feedMessage = "后工位未取货原因-->取货位:" + siemensConveyorDeviceDriver.getDevice_code(); - if (mode != 2) { - feedMessage += "工作模式不为待机(mode != 2),"; - } - if (move != 1) { - feedMessage += "光电信号不应该为无货状态(move != 1)"; - } - } - } - } - } else { - if (this.getNow_steps_type2() == 2 || this.getNow_steps_type3() == 2) { - feedMessage = "后工位未取货原因-->"; - if (mode != 3) { - feedMessage += "行架工作模式不为运行中(mode != 3),"; - } - if (action2 != 1) { - feedMessage += "后工位动作信号不为取货中(action2 != 1),"; - } - if (move2 != 0) { - feedMessage += "后工位光电信号应该为0(move2 != 0),"; - } - if (task2 == 0) { - feedMessage += "后工位没有任务号(task2 == 0)"; - } - } - } - - //单任务/或双任务 后工位收到取货完成信号并反馈 - if (mode == 3 && action2 == 2 && move2 == 1 && task2 > 0) { - if (to_command2 != 3) { - this.writing("to_command2", "3"); - } - if (type == 2) { - this.setNow_steps_type2(4); - } - if (type == 3) { - this.setNow_steps_type3(4); - } - } else { - if (this.getNow_steps_type2() == 3 || this.getNow_steps_type3() == 3) { - feedMessage = "后工位取货完成后未反馈原因-->"; - if (mode != 3) { - feedMessage += "行架工作模式不为运行中(mode != 3),"; - } - if (action2 != 2) { - feedMessage += "后工位动作信号未取货完成(action2 != 2),"; - } - if (move2 == 0) { - feedMessage += "后工位光电信号不应该为0(move2 == 0),"; - } - if (task2 == 0) { - feedMessage += "后工位没有任务号(task2 == 0)"; - } - } - } - - //单任务/双任务 前工位取货时判断动作信号并反馈 - if (mode == 3 && action1 == 1 && move1 == 0 && task1 > 0) { - if (to_command1 != 2) { - this.writing("to_command1", "2"); - } - if (type == 1) { - this.setNow_steps_type1(3); - } else if (type == 3) { - this.setNow_steps_type3(5); - } - } else { - if (this.getNow_steps_type1() == 2 || this.getNow_steps_type3() == 4) { - feedMessage = "前工位未取货原因:"; - if (mode != 3) { - feedMessage += "行架工作模式不为运行中(mode != 3),"; - } - if (action1 != 1) { - feedMessage += "前工位动作信号不为取货中(action2 != 1),"; - } - if (move1 != 0) { - feedMessage += "前工位光电信号应该为0(move2 != 0),"; - } - if (task1 == 0) { - feedMessage += "前工位没有任务号(task2 == 0)"; - } - } - } - - //单任务/双任务 前工位取货完成并反馈 - if (mode == 3 && action1 == 2 && move1 == 1 && task1 > 0) { - if (to_command1 != 3) { - this.writing("to_command1", "3"); - } - if (type == 1) { - this.setNow_steps_type1(4); - } - if (type == 3) { - this.setNow_steps_type3(6); - } - } else { - if (this.getNow_steps_type1() == 3 || this.getNow_steps_type3() == 5) { - feedMessage = "前工位取货完成后未反馈原因"; - if (mode != 3) { - feedMessage += "行架工作模式不为运行中(mode != 3),"; - } - if (action1 != 2) { - feedMessage += "前工位动作信号未取货完成(action2 != 2),"; - } - if (move1 == 0) { - feedMessage += "前工位光电信号不应该为无货状态(move2 == 0),"; - } - if (task1 == 0) { - feedMessage += "前工位没有任务号(task2 == 0)"; - } - } - } - - - //单任务/双任务 后工位放货时判断信号并反馈 - if (mode == 3 && action2 == 3 && move2 == 1 && task2 > 0) { - if (to_command2 != 4) { - this.writing("to_command2", "4"); - } - if (type == 2) { - this.setNow_steps_type2(5); - } else if (type == 3) { - this.setNow_steps_type3(7); - } - } else { - if (this.getNow_steps_type2() == 4 || this.getNow_steps_type3() == 6) { - feedMessage = "后工位未放货原因-->"; - if (mode != 3) { - feedMessage += "行架工作模式不为运行中(mode != 3),"; - } - if (action2 != 3) { - feedMessage += "后工位动作信号不为放货中(action2 != 3),"; - } - if (move2 == 0) { - feedMessage += "后工位光电信号为不应该为0(move2 == 0),"; - } - if (task2 == 0) { - feedMessage += "后工位没有任务号(task2 == 0)"; - } - } - } - - //单任务 后工位放货完成 任务完成 - if (mode == 3 && action2 == 4 && move2 == 0 && task2 > 0 && type == 2) { - //inst_message - Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); - if (inst2 != null) { - if (StrUtil.equals(inst2.getInstruction_status(), "1")) { - if (to_command2 != 5) { - this.writing("to_command2", "5"); - } - this.setNow_steps_type2(6); - this.setNow_steps_type2(0); - finish_instruction(inst2); - } - } - } else { - if (this.getNow_steps_type2() == 5) { - feedMessage = "单任务后工位放货完成后未反馈原因-->"; - if (mode != 3) { - feedMessage += "行架工作模式不为运行中(mode != 3),"; - } - if (action2 != 4) { - feedMessage += "后工位动作信号未放货完成(action2 != 4),"; - } - if (move2 != 0) { - feedMessage += "后工位光电信号应该为无货状态(move2 != 0),"; - } - if (task2 == 0) { - feedMessage += "后工位没有任务号(task2 == 0),"; - } - if (type != 2) { - feedMessage += "不是后工位单任务(type != 2)"; - } - } - } - - //双任务 后工位反馈任务完成 并反馈 - if (mode == 3 && action2 == 4 && move2 == 0 && task1 > 0 && task2 > 0 && type == 3) { - if (to_command2 != 5) { - this.writing("to_command2", "5"); - } - this.setNow_steps_type3(8); - } else { - if (this.getNow_steps_type3() == 7) { - feedMessage = "双任务后工位放货完成后未反馈原因-->"; - if (mode != 3) { - feedMessage += "行架工作模式不为运行中(mode != 3),"; - } - if (action2 != 4) { - feedMessage += "后工位动作信号未放货完成(action2 != 4),"; - } - if (move2 != 0) { - feedMessage += "后工位光电信号不应该为有货状态(move2 != 0),"; - } - if (task1 == 0) { - feedMessage += "前工位没有任务号(task1 == 0),"; - } - if (task2 == 0) { - feedMessage += "后工位没有任务号(task2 == 0),"; - } - if (type != 3) { - feedMessage += "不是双任务(type != 3)"; - } - } - } - - //单任务/双任务 前工位放货时判断放货位光电信号 - if (mode == 3 && action1 == 3 && move1 == 1 && task1 > 0) { - Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); - String next_device_code = ""; - if (type == 1) { - next_device_code = inst1.getNext_device_code(); - } else if (type == 3) { - next_device_code = inst1.getNext_device_code2(); - } - Device nextDevice = deviceAppservice.findDeviceByCode(next_device_code); - if (ObjectUtil.isEmpty(nextDevice)) { - feedMessage = "前工位放货位:" + next_device_code + "为空!"; - throw new BadRequestException("前工位放货位:" + next_device_code + "为空!"); - } - SiemensConveyorDeviceDriver siemensConveyorDeviceDriver; - if (nextDevice.getDeviceDriver() instanceof SiemensConveyorDeviceDriver) { - siemensConveyorDeviceDriver = (SiemensConveyorDeviceDriver) nextDevice.getDeviceDriver(); - int move = siemensConveyorDeviceDriver.getMove(); - int mode = siemensConveyorDeviceDriver.getMode(); - if (move == 1 && mode == 2) { - if (to_command1 != 4) { - this.writing("to_command1", "4"); - } - if (type == 1) { - this.setNow_steps_type1(5); - } else if (type == 3) { - this.setNow_steps_type3(9); - } - } else { -// log.warn("后工位放货位有货,放货位:{},mode:{},move:{}", next_device_code, mode, move); - if (this.getNow_steps_type1() == 4 || this.getNow_steps_type3() == 8) { - feedMessage = "前工位未放货原因-->"; - if (mode != 2) { - feedMessage += "前工位放货位工作模式不为待机状态(mode != 2),"; - } - if (move == 0) { - feedMessage += "前工位放货位不应该为无货状态(move == 0)"; - } - } - } - } - } else { - if (this.getNow_steps_type1() == 4 || this.getNow_steps_type3() == 8) { - feedMessage = "前工位未放货原因-->"; - if (mode != 3) { - feedMessage += "行架工作模式不为运行中(mode != 3),"; - } - if (action1 != 3) { - feedMessage += "前工位动作信号不为放货中(action1 != 3),"; - } - if (move1 == 0) { - feedMessage += "前工位光电信号不应为无货状态(move1 == 0),"; - } - if (task1 == 0) { - feedMessage += "前工位没有任务号(task1 == 0),"; - } - } - } - - - //单任务前工位放货完成 任务完成 - if (mode == 3 && action1 == 4 && move1 == 0 && task1 > 0 && type == 1) { - //inst_message - Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); - if (inst1 != null) { - if (StrUtil.equals(inst1.getInstruction_status(), "1")) { - if (to_command1 != 5) { - this.writing("to_command1", "5"); - } - this.setNow_steps_type1(6); - this.setNow_steps_type1(0); - this.finish_instruction(inst1); - } - } - } else { - if (this.getNow_steps_type1() == 5) { - feedMessage = "单任务前工位放货完成后未反馈原因-->"; - if (mode != 3) { - feedMessage += "行架工作模式不为运行中(mode != 3),"; - } - if (action1 != 4) { - feedMessage += "前工位动作信号未放货完成(action1 != 4),"; - } - if (move1 != 0) { - feedMessage += "前工位光电信号为不应为有货状态(move1 != 0),"; - } - if (task1 == 0) { - feedMessage += "前工位没有任务号(task1 == 0),"; - } - if (type != 1) { - feedMessage += "不为前工位单任务(type != 1)"; - } - } - } - - - //双工位 任务完成 前工位反馈4 - if (mode == 3 && action1 == 4 && move1 == 0 && task1 > 0 && task2 > 0 && type == 3) { - //inst_message - Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); - if (inst1 != null) { - if (StrUtil.equals(inst1.getInstruction_status(), "1")) { - if (to_command1 != 5) { - this.writing("to_command1", "5"); - } - this.setNow_steps_type3(10); - this.setNow_steps_type3(0); - this.finish_instruction(inst1); - } - } - } else { - if (this.getNow_steps_type3() == 9) { - feedMessage = "双任务前工位放货完成后未反馈原因-->"; - if (mode != 3) { - feedMessage += "行架工作模式不为运行中(mode != 3),"; - } - if (action1 != 4) { - feedMessage += "前工位动作信号未放货完成(action1 != 4),"; - } - if (move1 != 0) { - feedMessage += "前工位光电信号为不应为有货状态(move1 != 0),"; - } - if (task1 == 0) { - feedMessage += "前工位没有任务(task1 == 0),"; - } - if (task2 == 0) { - feedMessage += "后工位没有任务号(task2 == 0),"; - } - if (type != 3) { - feedMessage += "不是双任务(type != 3)"; - } - } - } + update_instruction_status(); task_check(); @@ -724,33 +319,8 @@ public class SlitTwoManipulatorDeviceDriver extends AbstractOpcDeviceDriver impl case 2: //申请任务 if (mode == 2 && move1 == 0 && move2 == 0 && action1 == 0 && action2 == 0 && task1 == 0 && task2 == 0 && !requireSucess) { - //获取关联设备驱动信息 判断关联设备是否禁用 - String link_device_code = String.valueOf(this.getDevice().getExtraValue().get("link_device_code")); - Device device = deviceAppservice.findDeviceByCode(link_device_code); - SlitTwoManipulatorDeviceDriver slitTwoManipulatorDeviceDriver; - if (device.getDeviceDriver() instanceof SlitTwoManipulatorDeviceDriver) { - slitTwoManipulatorDeviceDriver = (SlitTwoManipulatorDeviceDriver) device.getDeviceDriver(); - //如果禁用 - if (slitTwoManipulatorDeviceDriver.getIs_disable() == 1) { - boolean flag = false; - try { - //就去走关联设备异常取放货工位的任务 任务生成成功返回true 就不会走下面正常生成任务的逻辑 - flag = instruction_require2(); - } catch (Exception e) { - flag = false; - } - if (flag) { - break; - } - } - } - //没有生成异常取放货工位的任务 就生成正常关联取放货工位的任务 - boolean res = instruction_require(); - if (res) { - feedMessage = ""; - notCreateInstMessage = ""; - notCreateTaskMessage = ""; - } + apply_task(); + } else { if (!requireSucess) { @@ -836,6 +406,44 @@ public class SlitTwoManipulatorDeviceDriver extends AbstractOpcDeviceDriver impl return true; } + public synchronized boolean apply_task() { + Date date = new Date(); + if (date.getTime() - this.apply_task_time.getTime() < (long) this.apply_task_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.apply_task_time); + return false; + } else { + this.apply_task_time = date; + //获取关联设备驱动信息 判断关联设备是否禁用 + String link_device_code = String.valueOf(this.getDevice().getExtraValue().get("link_device_code")); + Device device = deviceAppservice.findDeviceByCode(link_device_code); + SlitTwoManipulatorDeviceDriver slitTwoManipulatorDeviceDriver; + if (device.getDeviceDriver() instanceof SlitTwoManipulatorDeviceDriver) { + slitTwoManipulatorDeviceDriver = (SlitTwoManipulatorDeviceDriver) device.getDeviceDriver(); + //如果禁用 + if (slitTwoManipulatorDeviceDriver.getIs_disable() == 1) { + boolean flag = false; + try { + //就去走关联设备异常取放货工位的任务 任务生成成功返回true 就不会走下面正常生成任务的逻辑 + flag = instruction_require2(); + } catch (Exception e) { + flag = false; + } + if (flag) { + return false; + } + } + } + //没有生成异常取放货工位的任务 就生成正常关联取放货工位的任务 + boolean res = instruction_require(); + if (res) { + feedMessage = ""; + notCreateInstMessage = ""; + notCreateTaskMessage = ""; + } + return true; + } + } + //关联设备异常申请任务 public synchronized boolean instruction_require2() { @@ -1601,4 +1209,427 @@ public class SlitTwoManipulatorDeviceDriver extends AbstractOpcDeviceDriver impl jo.put("fault_type", error_type); return jo; } + + /** + * 更新指令状态 + */ + public synchronized void update_instruction_status() throws Exception { + Date date = new Date(); + if (date.getTime() - this.instruction_update_time.getTime() < (long) this.instruction_update_time_out) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.instruction_update_time_out); + + } else { + this.instruction_update_time = date; + //单任务 前工位任务更新指令状态 + if (task1 > 0 && type == 1) { + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + if (inst1 != null) { + if (StrUtil.equals(inst1.getInstruction_status(), "0")) { + //当前执行步骤为更新任务状态 + inst1.setInstruction_status("1"); + inst1.setExecute_device_code(this.getDevice_code()); + instructionService.update(inst1); + } + } + } + + //单任务 后工位任务更新指令状态 + if (task2 > 0 && type == 2) { + //inst_message + Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); + if (inst2 != null) { + if (StrUtil.equals(inst2.getInstruction_status(), "0")) { + //当前指令更新状态 + now_steps_type2 = 1; + inst2.setInstruction_status("1"); + inst2.setExecute_device_code(this.device_code); + instructionService.update(inst2); + } + } + } + + //双任务更新指令状态 + if (task2 > 0 && task1 > 0 && type == 3) { + //inst_message + Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task1)); + if (inst2 != null) { + if (StrUtil.equals(inst2.getInstruction_status(), "0")) { + //当前指令更新状态 + inst2.setInstruction_status("1"); + inst2.setExecute_device_code(this.device_code); + instructionService.update(inst2); + } + } + } + + //双任务/单任务 后工位取空时判断动作信号,并反馈 + if (mode == 3 && action2 == 1 && move2 == 0 && task2 > 0) { + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task2)); + String start_device_code = inst1.getStart_device_code(); + Device startDevice = deviceAppservice.findDeviceByCode(start_device_code); + if (ObjectUtil.isEmpty(startDevice)) { + feedMessage = "后工位取货位:" + start_device_code + "为空!"; + logServer.deviceExecuteLog(this.getDeviceCode(), "", "", "后工位取货位:" + start_device_code + "为空!"); + throw new BadRequestException("后工位取货位:" + start_device_code + "为空!"); + } + SiemensConveyorDeviceDriver siemensConveyorDeviceDriver; + if (startDevice.getDeviceDriver() instanceof SiemensConveyorDeviceDriver) { + siemensConveyorDeviceDriver = (SiemensConveyorDeviceDriver) startDevice.getDeviceDriver(); + int move = siemensConveyorDeviceDriver.getMove(); + int mode = siemensConveyorDeviceDriver.getMode(); + if (mode == 2 && move == 1) { + if (to_command2 != 2) { + this.writing("to_command2", "2"); + } + if (type == 2) { + this.setNow_steps_type2(3); + } else if (type == 3) { + this.setNow_steps_type3(3); + } + } else { + log.warn("后工位取货位无货,取货位:{},mode:{},move:{}", start_device_code, mode, move); + if (this.getNow_steps_type2() == 2 || this.getNow_steps_type3() == 2) { + feedMessage = "后工位未取货原因-->取货位:" + siemensConveyorDeviceDriver.getDevice_code(); + if (mode != 2) { + feedMessage += "工作模式不为待机(mode != 2),"; + } + if (move != 1) { + feedMessage += "光电信号不应该为无货状态(move != 1)"; + } + } + } + } + } else { + if (this.getNow_steps_type2() == 2 || this.getNow_steps_type3() == 2) { + feedMessage = "后工位未取货原因-->"; + if (mode != 3) { + feedMessage += "行架工作模式不为运行中(mode != 3),"; + } + if (action2 != 1) { + feedMessage += "后工位动作信号不为取货中(action2 != 1),"; + } + if (move2 != 0) { + feedMessage += "后工位光电信号应该为0(move2 != 0),"; + } + if (task2 == 0) { + feedMessage += "后工位没有任务号(task2 == 0)"; + } + } + } + + //单任务/或双任务 后工位收到取货完成信号并反馈 + if (mode == 3 && action2 == 2 && move2 == 1 && task2 > 0) { + if (to_command2 != 3) { + this.writing("to_command2", "3"); + } + if (type == 2) { + this.setNow_steps_type2(4); + } + if (type == 3) { + this.setNow_steps_type3(4); + } + } else { + if (this.getNow_steps_type2() == 3 || this.getNow_steps_type3() == 3) { + feedMessage = "后工位取货完成后未反馈原因-->"; + if (mode != 3) { + feedMessage += "行架工作模式不为运行中(mode != 3),"; + } + if (action2 != 2) { + feedMessage += "后工位动作信号未取货完成(action2 != 2),"; + } + if (move2 == 0) { + feedMessage += "后工位光电信号不应该为0(move2 == 0),"; + } + if (task2 == 0) { + feedMessage += "后工位没有任务号(task2 == 0)"; + } + } + } + + //单任务/双任务 前工位取货时判断动作信号并反馈 + if (mode == 3 && action1 == 1 && move1 == 0 && task1 > 0) { + if (to_command1 != 2) { + this.writing("to_command1", "2"); + } + if (type == 1) { + this.setNow_steps_type1(3); + } else if (type == 3) { + this.setNow_steps_type3(5); + } + } else { + if (this.getNow_steps_type1() == 2 || this.getNow_steps_type3() == 4) { + feedMessage = "前工位未取货原因:"; + if (mode != 3) { + feedMessage += "行架工作模式不为运行中(mode != 3),"; + } + if (action1 != 1) { + feedMessage += "前工位动作信号不为取货中(action2 != 1),"; + } + if (move1 != 0) { + feedMessage += "前工位光电信号应该为0(move2 != 0),"; + } + if (task1 == 0) { + feedMessage += "前工位没有任务号(task2 == 0)"; + } + } + } + + //单任务/双任务 前工位取货完成并反馈 + if (mode == 3 && action1 == 2 && move1 == 1 && task1 > 0) { + if (to_command1 != 3) { + this.writing("to_command1", "3"); + } + if (type == 1) { + this.setNow_steps_type1(4); + } + if (type == 3) { + this.setNow_steps_type3(6); + } + } else { + if (this.getNow_steps_type1() == 3 || this.getNow_steps_type3() == 5) { + feedMessage = "前工位取货完成后未反馈原因"; + if (mode != 3) { + feedMessage += "行架工作模式不为运行中(mode != 3),"; + } + if (action1 != 2) { + feedMessage += "前工位动作信号未取货完成(action2 != 2),"; + } + if (move1 == 0) { + feedMessage += "前工位光电信号不应该为无货状态(move2 == 0),"; + } + if (task1 == 0) { + feedMessage += "前工位没有任务号(task2 == 0)"; + } + } + } + + + //单任务/双任务 后工位放货时判断信号并反馈 + if (mode == 3 && action2 == 3 && move2 == 1 && task2 > 0) { + if (to_command2 != 4) { + this.writing("to_command2", "4"); + } + if (type == 2) { + this.setNow_steps_type2(5); + } else if (type == 3) { + this.setNow_steps_type3(7); + } + } else { + if (this.getNow_steps_type2() == 4 || this.getNow_steps_type3() == 6) { + feedMessage = "后工位未放货原因-->"; + if (mode != 3) { + feedMessage += "行架工作模式不为运行中(mode != 3),"; + } + if (action2 != 3) { + feedMessage += "后工位动作信号不为放货中(action2 != 3),"; + } + if (move2 == 0) { + feedMessage += "后工位光电信号为不应该为0(move2 == 0),"; + } + if (task2 == 0) { + feedMessage += "后工位没有任务号(task2 == 0)"; + } + } + } + + //单任务 后工位放货完成 任务完成 + if (mode == 3 && action2 == 4 && move2 == 0 && task2 > 0 && type == 2) { + //inst_message + Instruction inst2 = instructionService.findByCodeFromCache(String.valueOf(task2)); + if (inst2 != null) { + if (StrUtil.equals(inst2.getInstruction_status(), "1")) { + if (to_command2 != 5) { + this.writing("to_command2", "5"); + } + this.setNow_steps_type2(6); + this.setNow_steps_type2(0); + finish_instruction(inst2); + } + } + } else { + if (this.getNow_steps_type2() == 5) { + feedMessage = "单任务后工位放货完成后未反馈原因-->"; + if (mode != 3) { + feedMessage += "行架工作模式不为运行中(mode != 3),"; + } + if (action2 != 4) { + feedMessage += "后工位动作信号未放货完成(action2 != 4),"; + } + if (move2 != 0) { + feedMessage += "后工位光电信号应该为无货状态(move2 != 0),"; + } + if (task2 == 0) { + feedMessage += "后工位没有任务号(task2 == 0),"; + } + if (type != 2) { + feedMessage += "不是后工位单任务(type != 2)"; + } + } + } + + //双任务 后工位反馈任务完成 并反馈 + if (mode == 3 && action2 == 4 && move2 == 0 && task1 > 0 && task2 > 0 && type == 3) { + if (to_command2 != 5) { + this.writing("to_command2", "5"); + } + this.setNow_steps_type3(8); + } else { + if (this.getNow_steps_type3() == 7) { + feedMessage = "双任务后工位放货完成后未反馈原因-->"; + if (mode != 3) { + feedMessage += "行架工作模式不为运行中(mode != 3),"; + } + if (action2 != 4) { + feedMessage += "后工位动作信号未放货完成(action2 != 4),"; + } + if (move2 != 0) { + feedMessage += "后工位光电信号不应该为有货状态(move2 != 0),"; + } + if (task1 == 0) { + feedMessage += "前工位没有任务号(task1 == 0),"; + } + if (task2 == 0) { + feedMessage += "后工位没有任务号(task2 == 0),"; + } + if (type != 3) { + feedMessage += "不是双任务(type != 3)"; + } + } + } + + //单任务/双任务 前工位放货时判断放货位光电信号 + if (mode == 3 && action1 == 3 && move1 == 1 && task1 > 0) { + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + String next_device_code = ""; + if (type == 1) { + next_device_code = inst1.getNext_device_code(); + } else if (type == 3) { + next_device_code = inst1.getNext_device_code2(); + } + Device nextDevice = deviceAppservice.findDeviceByCode(next_device_code); + if (ObjectUtil.isEmpty(nextDevice)) { + feedMessage = "前工位放货位:" + next_device_code + "为空!"; + throw new BadRequestException("前工位放货位:" + next_device_code + "为空!"); + } + SiemensConveyorDeviceDriver siemensConveyorDeviceDriver; + if (nextDevice.getDeviceDriver() instanceof SiemensConveyorDeviceDriver) { + siemensConveyorDeviceDriver = (SiemensConveyorDeviceDriver) nextDevice.getDeviceDriver(); + int move = siemensConveyorDeviceDriver.getMove(); + int mode = siemensConveyorDeviceDriver.getMode(); + if (move == 1 && mode == 2) { + if (to_command1 != 4) { + this.writing("to_command1", "4"); + } + if (type == 1) { + this.setNow_steps_type1(5); + } else if (type == 3) { + this.setNow_steps_type3(9); + } + } else { +// log.warn("后工位放货位有货,放货位:{},mode:{},move:{}", next_device_code, mode, move); + if (this.getNow_steps_type1() == 4 || this.getNow_steps_type3() == 8) { + feedMessage = "前工位未放货原因-->"; + if (mode != 2) { + feedMessage += "前工位放货位工作模式不为待机状态(mode != 2),"; + } + if (move == 0) { + feedMessage += "前工位放货位不应该为无货状态(move == 0)"; + } + } + } + } + } else { + if (this.getNow_steps_type1() == 4 || this.getNow_steps_type3() == 8) { + feedMessage = "前工位未放货原因-->"; + if (mode != 3) { + feedMessage += "行架工作模式不为运行中(mode != 3),"; + } + if (action1 != 3) { + feedMessage += "前工位动作信号不为放货中(action1 != 3),"; + } + if (move1 == 0) { + feedMessage += "前工位光电信号不应为无货状态(move1 == 0),"; + } + if (task1 == 0) { + feedMessage += "前工位没有任务号(task1 == 0),"; + } + } + } + + + //单任务前工位放货完成 任务完成 + if (mode == 3 && action1 == 4 && move1 == 0 && task1 > 0 && type == 1) { + //inst_message + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + if (inst1 != null) { + if (StrUtil.equals(inst1.getInstruction_status(), "1")) { + if (to_command1 != 5) { + this.writing("to_command1", "5"); + } + this.setNow_steps_type1(6); + this.setNow_steps_type1(0); + this.finish_instruction(inst1); + } + } + } else { + if (this.getNow_steps_type1() == 5) { + feedMessage = "单任务前工位放货完成后未反馈原因-->"; + if (mode != 3) { + feedMessage += "行架工作模式不为运行中(mode != 3),"; + } + if (action1 != 4) { + feedMessage += "前工位动作信号未放货完成(action1 != 4),"; + } + if (move1 != 0) { + feedMessage += "前工位光电信号为不应为有货状态(move1 != 0),"; + } + if (task1 == 0) { + feedMessage += "前工位没有任务号(task1 == 0),"; + } + if (type != 1) { + feedMessage += "不为前工位单任务(type != 1)"; + } + } + } + + + //双工位 任务完成 前工位反馈4 + if (mode == 3 && action1 == 4 && move1 == 0 && task1 > 0 && task2 > 0 && type == 3) { + //inst_message + Instruction inst1 = instructionService.findByCodeFromCache(String.valueOf(task1)); + if (inst1 != null) { + if (StrUtil.equals(inst1.getInstruction_status(), "1")) { + if (to_command1 != 5) { + this.writing("to_command1", "5"); + } + this.setNow_steps_type3(10); + this.setNow_steps_type3(0); + this.finish_instruction(inst1); + } + } + } else { + if (this.getNow_steps_type3() == 9) { + feedMessage = "双任务前工位放货完成后未反馈原因-->"; + if (mode != 3) { + feedMessage += "行架工作模式不为运行中(mode != 3),"; + } + if (action1 != 4) { + feedMessage += "前工位动作信号未放货完成(action1 != 4),"; + } + if (move1 != 0) { + feedMessage += "前工位光电信号为不应为有货状态(move1 != 0),"; + } + if (task1 == 0) { + feedMessage += "前工位没有任务(task1 == 0),"; + } + if (task2 == 0) { + feedMessage += "后工位没有任务号(task2 == 0),"; + } + if (type != 3) { + feedMessage += "不是双任务(type != 3)"; + } + } + } + } + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/LiKuToAcsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/LiKuToAcsServiceImpl.java index 79701f989..c851ddd68 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/LiKuToAcsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/LiKuToAcsServiceImpl.java @@ -65,7 +65,7 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { String inst_code = requestParam.getOrderId(); String status = requestParam.getState(); String carNo = requestParam.getRobotId(); - Instruction inst = instructionService.findByCodeFromCache(inst_code); + Instruction inst = instructionService.findByCode(inst_code); if (ObjectUtil.isEmpty(inst)) { InStoreReportResponse inStoreReportResponse = new InStoreReportResponse(); inStoreReportResponse.setOrderId(inst_code); @@ -77,7 +77,18 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { log.info("入库任务状态反馈-----输出参数{}", result); return RespUtil.getResp(result.toString(), new InStoreReportResponse()); } - TaskDto task = taskService.findByCodeFromCache(inst.getTask_code()); + if (!StrUtil.equals(inst.getInstruction_status(),"0") && !StrUtil.equals(inst.getInstruction_status(),"1")) { + InStoreReportResponse inStoreReportResponse = new InStoreReportResponse(); + inStoreReportResponse.setOrderId(inst_code); + JSONObject result = new JSONObject(); + result.put("result", "false"); + result.put("code", "0"); + result.put("comment", "未找到未完成的对应指令"); + result.put("data", inStoreReportResponse ); + log.info("入库任务状态反馈-----输出参数{}", result); + return RespUtil.getResp(result.toString(), new InStoreReportResponse()); + } + TaskDto task = taskService.findByCode(inst.getTask_code()); if (ObjectUtil.isEmpty(task)) { InStoreReportResponse inStoreReportResponse = new InStoreReportResponse(); inStoreReportResponse.setOrderId(inst_code); @@ -89,6 +100,17 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { log.info("入库任务状态反馈-----输出参数{}", result); return RespUtil.getResp(result.toString(), new InStoreReportResponse()); } + if (!StrUtil.equals(task.getTask_status(),"0") && !StrUtil.equals(task.getTask_status(),"1")) { + InStoreReportResponse inStoreReportResponse = new InStoreReportResponse(); + inStoreReportResponse.setOrderId(inst_code); + JSONObject result = new JSONObject(); + result.put("result", "false"); + result.put("code", "0"); + result.put("comment", "未找到未完成的对应任务"); + result.put("data", inStoreReportResponse ); + log.info("入库任务状态反馈-----输出参数{}", result); + return RespUtil.getResp(result.toString(), new InStoreReportResponse()); + } // 1 已接收 2 开始执行 3执行完成 4 5 取消 if(StrUtil.equals(status,"1") || StrUtil.equals(status,"2") ){ task.setTask_status("1"); @@ -127,7 +149,7 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { String inst_code = requestParam.getOrderId(); String status = requestParam.getState(); String carNo = requestParam.getRobotId(); - Instruction inst = instructionService.findByCodeFromCache(inst_code); + Instruction inst = instructionService.findByCode(inst_code); if (ObjectUtil.isEmpty(inst)) { OutStoreReportResponse outStoreReportResponse = new OutStoreReportResponse(); outStoreReportResponse.setOrderId(inst_code); @@ -139,7 +161,18 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { log.info("出库任务状态反馈-----输出参数{}", result); return RespUtil.getResp(result.toString(), new OutStoreReportResponse()); } - TaskDto task = taskService.findByCodeFromCache(inst.getTask_code()); + if (!StrUtil.equals(inst.getInstruction_status(),"0") && !StrUtil.equals(inst.getInstruction_status(),"1")) { + OutStoreReportResponse outStoreReportResponse = new OutStoreReportResponse(); + outStoreReportResponse.setOrderId(inst_code); + JSONObject result = new JSONObject(); + result.put("result", "false"); + result.put("code", "0"); + result.put("comment", "未找到对应未完成的指令"); + result.put("data", outStoreReportResponse ); + log.info("出库任务状态反馈-----输出参数{}", result); + return RespUtil.getResp(result.toString(), new OutStoreReportResponse()); + } + TaskDto task = taskService.findByCode(inst.getTask_code()); if (ObjectUtil.isEmpty(task)) { OutStoreReportResponse outStoreReportResponse = new OutStoreReportResponse(); outStoreReportResponse.setOrderId(inst_code); @@ -151,6 +184,17 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { log.info("出库任务状态反馈-----输出参数{}", result); return RespUtil.getResp(result.toString(), new OutStoreReportResponse()); } + if (!StrUtil.equals(task.getTask_status(),"0") && !StrUtil.equals(task.getTask_status(),"1")) { + OutStoreReportResponse outStoreReportResponse = new OutStoreReportResponse(); + outStoreReportResponse.setOrderId(inst_code); + JSONObject result = new JSONObject(); + result.put("result", "false"); + result.put("code", "0"); + result.put("comment", "未找到未完成的对应任务"); + result.put("data", outStoreReportResponse ); + log.info("出库任务状态反馈-----输出参数{}", result); + return RespUtil.getResp(result.toString(), new OutStoreReportResponse()); + } // 1 已接收 2 开始执行 3执行完成 4 阻挡 5 空洞 if(StrUtil.equals(status,"1") || StrUtil.equals(status,"2") ){ task.setTask_status("1"); @@ -210,7 +254,7 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { String inst_code = requestParam.getOrderId(); String status = requestParam.getState(); String carNo = requestParam.getRobotId(); - Instruction inst = instructionService.findByCodeFromCache(inst_code); + Instruction inst = instructionService.findByCode(inst_code); if (ObjectUtil.isEmpty(inst)) { MoveStoreReportResponse moveStoreReportResponse = new MoveStoreReportResponse(); moveStoreReportResponse.setOrderId(inst_code); @@ -222,7 +266,18 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { log.info("移库任务状态反馈-----输出参数{}", result); return RespUtil.getResp(result.toString(), new MoveStoreReportResponse()); } - TaskDto task = taskService.findByCodeFromCache(inst.getTask_code()); + if (!StrUtil.equals(inst.getInstruction_status(),"0") && !StrUtil.equals(inst.getInstruction_status(),"1")) { + MoveStoreReportResponse moveStoreReportResponse = new MoveStoreReportResponse(); + moveStoreReportResponse.setOrderId(inst_code); + JSONObject result = new JSONObject(); + result.put("result", "false"); + result.put("code", "0"); + result.put("comment", "未找到未完成的对应指令"); + result.put("data", moveStoreReportResponse ); + log.info("移库任务状态反馈-----输出参数{}", result); + return RespUtil.getResp(result.toString(), new MoveStoreReportResponse()); + } + TaskDto task = taskService.findByCode(inst.getTask_code()); if (ObjectUtil.isEmpty(task)) { MoveStoreReportResponse moveStoreReportResponse = new MoveStoreReportResponse(); moveStoreReportResponse.setOrderId(inst_code); @@ -233,7 +288,19 @@ public class LiKuToAcsServiceImpl implements LiKuToAcsService { result.put("data", moveStoreReportResponse ); log.info("移库任务状态反馈-----输出参数{}", result); return RespUtil.getResp(result.toString(), new MoveStoreReportResponse()); - } // 1 已接收 2 开始执行 3执行完成 4 阻挡 5 空洞 + } + if (!StrUtil.equals(task.getTask_status(),"0") && !StrUtil.equals(task.getTask_status(),"1")) { + MoveStoreReportResponse moveStoreReportResponse = new MoveStoreReportResponse(); + moveStoreReportResponse.setOrderId(inst_code); + JSONObject result = new JSONObject(); + result.put("result", "false"); + result.put("code", "0"); + result.put("comment", "未找到未完成的对应任务"); + result.put("data", moveStoreReportResponse ); + log.info("移库任务状态反馈-----输出参数{}", result); + return RespUtil.getResp(result.toString(), new MoveStoreReportResponse()); + } + // 1 已接收 2 开始执行 3执行完成 4 阻挡 5 空洞 if(StrUtil.equals(status,"1") || StrUtil.equals(status,"2") ){ task.setTask_status("1"); taskService.update(task); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/Instruction.java b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/Instruction.java index 3efb4757f..4b00b062a 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/Instruction.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/Instruction.java @@ -10,5 +10,14 @@ public class Instruction extends InstructionDto { public Instruction() { } + @Override + public String toString(){ + return "task_code:" + this.getTask_code() + + ",inst_code:" + this.getInstruction_code() + + ",inst_type" + this.getInstruction_type() + + ",start_device_code:" + this.getStart_device_code() + + ",next_device_code:" +this.getNext_device_code() + + ",status:"+ this.getInstruction_status(); + } } \ No newline at end of file diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/dto/TaskDto.java b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/dto/TaskDto.java index af3bd6d92..7c5875db1 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/dto/TaskDto.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/dto/TaskDto.java @@ -307,4 +307,13 @@ public class TaskDto implements Serializable { */ private String next_height = "0"; + + @Override + public String toString(){ + return "task_code:" + this.getTask_code() + + ",task_type" + this.getTask_type() + + ",start_device_code:" + this.getStart_device_code() + + ",next_device_code:" +this.getNext_device_code() + + ",status:"+ this.getTask_status(); + } } From 0e43cbaa71717fe17f3be8f1d85c3629a0102d2b Mon Sep 17 00:00:00 2001 From: liuxy Date: Tue, 13 Jun 2023 08:58:27 +0800 Subject: [PATCH 2/5] =?UTF-8?q?add=EF=BC=9A=E6=96=B0=E5=A2=9E=E8=BF=90?= =?UTF-8?q?=E8=BD=AC=E8=B4=B9=E3=80=81=E5=8D=B8=E8=BD=A6=E8=B4=B9=E3=80=81?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E8=B4=B9=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/nl/wms/basedata/st/wql/stivt.xls | Bin 307712 -> 308224 bytes .../service/impl/OutChargeServiceImpl.java | 9 +++++++-- .../st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql | 2 +- .../st/instor/task/HandMoveStorAcsTask.java | 1 + .../service/impl/CheckOutBillServiceImpl.java | 13 ++++++++++++- .../impl/InAndOutRetrunServiceImpl.java | 6 ++++++ .../src/views/wms/st/incharge/index.vue | 1 + .../src/views/wms/st/outbill/MoneyDialog.vue | 18 ++++++++++++++++++ .../src/views/wms/st/outcharge/index.vue | 1 + 9 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls b/lms/nladmin-system/src/main/java/org/nl/wms/basedata/st/wql/stivt.xls index 7c97e93ff68111eff45ed538904b02a2cc1fabd1..643fb06f87e73729e2e6da119cecb428bbfe0666 100644 GIT binary patch delta 33699 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 G;$KibS}eQUw$d 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 map = new HashMap<>(); map.put("flag", "15"); map.put("bill_status", MapUtil.getStr(whereJson, "bill_status")); + map.put("bill_type", MapUtil.getStr(whereJson, "bill_type")); map.put("stor_id", MapUtil.getStr(whereJson, "stor_id")); if (ObjectUtil.isNotEmpty(bill_code)) map.put("bill_code", bill_code + "%"); if (ObjectUtil.isNotEmpty(vehicle_code)) map.put("vehicle_code", vehicle_code + "%"); @@ -171,11 +173,14 @@ public class OutChargeServiceImpl implements OutChargeService { //插入分配表 dis_wql.insert(dis_row); - //将包装关系中对应的记录状态改为包装 HashMap map = new HashMap<>(); map.put("status", "1"); - WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis_row.getString("box_no") + "' AND status = '3'"); + if (StrUtil.equals(mst_jo.getString("bill_type"), "1001")) { + WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis_row.getString("box_no") + "' AND status = '3'"); + } else { + WQLObject.getWQLObject("PDM_BI_SubPackageRelation").update(map, "package_box_SN = '" + dis_row.getString("box_no") + "'"); + } } } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql index f0b1aaaab..4f02dbfb1 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/inbill/wql/QST_IVT_RAWASSISTISTOR.wql @@ -623,7 +623,7 @@ AND ios.bill_status = '99' AND - ios.bill_type = '1001' + ios.bill_type in ('1001','1009') AND ios.stor_id in 输入.in_stor_id diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java index 688a762ac..74df2cc45 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/instor/task/HandMoveStorAcsTask.java @@ -57,6 +57,7 @@ public class HandMoveStorAcsTask extends AbstractAcsTask { .next_device_code(json.getString("point_code2")) .vehicle_code(json.getString("vehicle_code")) .priority(json.getString("priority")) + .class_type(json.getString("task_type")) .dtl_type(String.valueOf(dtl_type)) .remark(json.getString("remark")) .build(); diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java index 159fb6d2d..b30807b5d 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java @@ -5025,7 +5025,13 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { mapFL.put("material_spec", material_spec); // mapFL.put("qty_unit_name", "KG"); mapFL.put("box_no", sub_box_no); - mapFL.put("qty", NumberUtil.round(json.getString("qty"), 2).doubleValue()); + mapFL.put("qty", NumberUtil.round(json.getString("qty"), 2).doubleValue()); // 净重 + if (ObjectUtil.isNotEmpty(jsonSub.getString("real_weight"))) { + mapFL.put("real_weight", NumberUtil.round(jsonSub.getString("real_weight"), 2).doubleValue()); // 毛重 + } else { + mapFL.put("real_weight", NumberUtil.round(jsonSub.getString("box_weight"), 2).doubleValue()); // 毛重 + } + flData.add(mapFL); all_qty = NumberUtil.add(String.valueOf(all_qty), json.getString("qty")).doubleValue(); } @@ -5079,6 +5085,11 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { // mapFL.put("qty_unit_name", "KG"); mapFL.put("box_no", sub_box_no); mapFL.put("qty", NumberUtil.round(json.getString("qty"), 2).doubleValue()); + if (ObjectUtil.isNotEmpty(jsonSub.getString("real_weight"))) { + mapFL.put("real_weight", NumberUtil.round(jsonSub.getString("real_weight"), 2).doubleValue()); // 毛重 + } else { + mapFL.put("real_weight", NumberUtil.round(jsonSub.getString("box_weight"), 2).doubleValue()); // 毛重 + } flData.add(mapFL); // 计算合计重量 diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/service/impl/InAndOutRetrunServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/service/impl/InAndOutRetrunServiceImpl.java index 92baef6fa..9ed35917b 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/service/impl/InAndOutRetrunServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/returns/service/impl/InAndOutRetrunServiceImpl.java @@ -462,6 +462,9 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { paramSapMst.put("ZACTION", "P"); paramSapMst.put("BUDAT", jo_mst.getString("biz_date")); paramSapMst.put("ZZYGYF", jo_mst.getString("estimated_freight")); + paramSapMst.put("ZZYZFY", jo_mst.getString("run_freight")); + paramSapMst.put("ZZXCFY", jo_mst.getString("unload_freight")); + paramSapMst.put("ZZQTFY", jo_mst.getString("other_freight")); paramSapMst.put("ZZYFGY", jo_mst.getString("trans_code")); JSONArray paramDtlArr = new JSONArray(); @@ -1045,6 +1048,9 @@ public class InAndOutRetrunServiceImpl implements InAndOutReturnService { paramSapMst.put("ZACTION", "P"); paramSapMst.put("BUDAT", jo_mst.getString("biz_date")); paramSapMst.put("ZZYGYF", jo_mst.getString("estimated_freight")); + paramSapMst.put("ZZYZFY", jo_mst.getString("run_freight")); + paramSapMst.put("ZZXCFY", jo_mst.getString("unload_freight")); + paramSapMst.put("ZZQTFY", jo_mst.getString("other_freight")); paramSapMst.put("ZZYFGY", jo_mst.getString("trans_code")); JSONArray paramDtlArr = new JSONArray(); diff --git a/lms/nladmin-ui/src/views/wms/st/incharge/index.vue b/lms/nladmin-ui/src/views/wms/st/incharge/index.vue index 332710212..6c4575a24 100644 --- a/lms/nladmin-ui/src/views/wms/st/incharge/index.vue +++ b/lms/nladmin-ui/src/views/wms/st/incharge/index.vue @@ -79,6 +79,7 @@ > + + + + + + + + + + + + + + + + + + diff --git a/lms/nladmin-ui/src/views/wms/st/outcharge/index.vue b/lms/nladmin-ui/src/views/wms/st/outcharge/index.vue index 645318a3d..a148bdf45 100644 --- a/lms/nladmin-ui/src/views/wms/st/outcharge/index.vue +++ b/lms/nladmin-ui/src/views/wms/st/outcharge/index.vue @@ -78,6 +78,7 @@ > Date: Tue, 13 Jun 2023 11:08:31 +0800 Subject: [PATCH 3/5] fix --- .../org/nl/modules/quartz/task/QueryLKDeviceStatus.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryLKDeviceStatus.java b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryLKDeviceStatus.java index 30d5003d1..a5f716e49 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryLKDeviceStatus.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/QueryLKDeviceStatus.java @@ -78,10 +78,10 @@ public class QueryLKDeviceStatus { deviceStatusDeviceDriver.setAlarm(deviceStatusData.getAlarm()); deviceStatusDeviceDriver.setTask_id(deviceStatusData.getTaskId()); deviceStatusDeviceDriver.setIsonline(true); - if(!"0".equals(deviceStatusData.getAlarm())) { - deviceStatusDeviceDriver.setIserror(true); - }else{ + if("0".equals(deviceStatusData.getAlarm())||ObjectUtil.isEmpty(deviceStatusData.getAlarm())) { deviceStatusDeviceDriver.setIserror(false); + }else{ + deviceStatusDeviceDriver.setIserror(true); } if(!"0".equals(deviceStatusData.getLoad())) { deviceStatusDeviceDriver.setHasGoods(true); From 68497454e8a209ab381ea1c4d3673ffe91c3d44e Mon Sep 17 00:00:00 2001 From: "USER-20220102CG\\noblelift" <546428999@qq.com> Date: Thu, 15 Jun 2023 09:07:17 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix=20=E4=BB=BB=E5=8A=A1=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SiemensConveyorDeviceDriver.java | 2 +- ...CoveyorControlWithScannerDeviceDriver.java | 61 +++++++++++++++++++ .../service/impl/InstructionServiceImpl.java | 53 +++++++++++++--- .../nl/acs/opc/DeviceOpcProtocolRunable.java | 6 +- .../task/service/impl/TaskServiceImpl.java | 38 ++++++++++-- 5 files changed, 142 insertions(+), 18 deletions(-) diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java index decaec13d..00cf54db9 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/siemens_conveyor/SiemensConveyorDeviceDriver.java @@ -1113,7 +1113,7 @@ public class SiemensConveyorDeviceDriver extends AbstractOpcDeviceDriver impleme instructionService.update(inst); logServer.deviceExecuteLog(device_code, "", "", "入库输送线任务开始反馈执行中状态,反馈成功,指令号:" + task + ",载具号:"+ inst.getVehicle_code()); } - if (StrUtil.equals(inst.getInstruction_status(), "1")) { + if (StrUtil.equals(inst.getInstruction_status(), "1") || StrUtil.equals(inst.getInstruction_status(), "0") ) { if (StrUtil.equals(this.getDeviceCode(), inst.getNext_device_code())) { vehicle_code = inst.getVehicle_code(); inst.setExecute_device_code(this.device_code); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java index 62f636378..e80392e3c 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/standard_conveyor_control_with_scanner/StandardCoveyorControlWithScannerDeviceDriver.java @@ -530,6 +530,22 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe message = "下发电气任务号成功"; requireSucess = true; applySucess = true; + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() + , instdto.getInstruction_code())) { + this.writing(list); + logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instdto.getInstruction_code())){ + requireSucess = false; + applySucess = false; + return false; + } + } + } else { message = "任务号:" + task.getTask_code() + "未找到指令"; } @@ -602,6 +618,21 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe + "已存在对应任务,下发电气信号"); requireSucess = true; applySucess = true; + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() + , instdto.getInstruction_code())) { + this.writing(list); + logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instdto.getInstruction_code())){ + requireSucess = false; + applySucess = false; + return false; + } + } } else { message = "任务号:" + taskdto.getTask_code() + "未找到指令"; } @@ -647,6 +678,21 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe message = "下发电气任务号成功"; requireSucess = true; applySucess = true; + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() + , instdto.getInstruction_code())) { + this.writing(list); + logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instdto.getInstruction_code())){ + requireSucess = false; + applySucess = false; + return false; + } + } return true; } else { logServer.deviceExecuteLog(this.device_code, "", "", "申请任务时该载具号" + container_code @@ -776,6 +822,21 @@ public class StandardCoveyorControlWithScannerDeviceDriver extends AbstractOpcDe // } requireSucess = true; applySucess = true; + while (!StrUtil.equals(this.getOpcValueAccessor().getValue(this.getOpcServer() + "." + this.getOpcPlc() + "." + this.getDevice_code() + ".task").toString() + , instdto.getInstruction_code())) { + this.writing(list); + logServer.deviceExecuteLog(device_code, "", "", inst.getInstruction_code() + "再次下发信号"); + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if(ObjectUtil.isEmpty(instdto.getInstruction_code())){ + requireSucess = false; + applySucess = false; + return false; + } + } } else { if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { message = "申请任务中..."; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index eecf4d54f..3b7ce544c 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -414,9 +414,14 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu WQLObject wo = WQLObject.getWQLObject("acs_instruction"); JSONObject json = (JSONObject) JSONObject.toJSON(dto); - wo.insert(json); - instructions.add(dto); + + try{ + instructions.add(dto); + log.warn("指令添加到指令列表:"+dto.toString()); + } catch (Exception e){ + log.warn("指令添加到指令列表异常:" + dto.toString() +e.getMessage()); + } } @Override @@ -530,7 +535,12 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu JSONObject json = (JSONObject) JSONObject.toJSON(dto); wo.insert(json); - instructions.add(dto); + try{ + instructions.add(dto); + log.warn("指令添加到指令列表:"+dto.toString()); + } catch (Exception e){ + log.warn("指令添加到指令列表异常:"+e.getMessage()); + } } @@ -645,7 +655,12 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu JSONObject json = (JSONObject) JSONObject.toJSON(dto); wo.insert(json); - instructions.add(dto); + try{ + instructions.add(dto); + log.warn("指令添加到指令列表:"+dto.toString()); + } catch (Exception e){ + log.warn("指令添加到指令列表异常:" + dto.toString() +e.getMessage()); + } } @@ -732,7 +747,12 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu // agvService.addOrderSequences(dto); // } // } - instructions.add(dto); + try{ + instructions.add(dto); + log.warn("指令添加到指令列表:"+dto.toString()); + } catch (Exception e){ + log.warn("指令添加到指令列表异常:" + dto.toString() +e.getMessage()); + } } @Override @@ -747,7 +767,13 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu wo.update(json); removeByCodeFromCache(dto.getInstruction_code()); - instructions.add(dto); + try{ + instructions.add(dto); + log.warn("指令添加到指令列表:"+dto.toString()); + } catch (Exception e){ + log.warn("指令添加到指令列表异常:" + dto.toString() +e.getMessage()); + } + // this.reload(); } @@ -1580,9 +1606,18 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu @Override public boolean removeByCodeFromCache(String code) { CopyOnWriteArrayList instructions = (CopyOnWriteArrayList) this.instructions; - instructions.removeIf((inst) -> { - return inst.getInstruction_code().equals(code); - }); + + try{ + instructions.removeIf((inst) -> { + if(StrUtil.equals(inst.getInstruction_code(),code)){ + log.warn("指令移除指令列表:"+inst.toString()); + } + return inst.getInstruction_code().equals(code); + }); + } catch (Exception e){ + log.warn("指令移除指令列表列表异常:" + e.getMessage()); + } + // while (iterator.hasNext()) { // Instruction instruction = iterator.next(); // if (instruction.getInstruction_code().equals(code)) { diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java b/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java index d0b770e86..b1ad40336 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java @@ -1,6 +1,7 @@ package org.nl.acs.opc; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import lombok.extern.slf4j.Slf4j; import org.nl.acs.udw.UnifiedDataAccessor; @@ -191,8 +192,9 @@ public class DeviceOpcProtocolRunable implements Runnable, DataCallback, ServerC if (true) { this.logItemChanged(itemId, accessor_value, value, itemDto); } - - accessor_value.setValue(itemId, value); + if(!ObjectUtil.isEmpty(value)){ + accessor_value.setValue(itemId, value); + } } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java index 63921aec5..ab4cabfed 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java @@ -520,8 +520,15 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { JSONObject json = (JSONObject) JSONObject.toJSON(dto); wo.insert(json); - synchronized (TaskServiceImpl.class) { +// synchronized (TaskServiceImpl.class) { +// tasks.add(dto); +// } + + try{ tasks.add(dto); + log.warn("任务添加到任务列表:"+dto.toString()); + } catch (Exception e){ + log.warn("任务添加到任务列表异常:"+ dto.toString() +e.getMessage()); } } @@ -673,7 +680,12 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { removeByCodeFromCache(entity.getTask_code()); if (StrUtil.equals(dto.getTask_status(), "0") || StrUtil.equals(dto.getTask_status(), "1")) { - tasks.add(dto); + try{ + tasks.add(dto); + log.warn("任务添加到任务列表:"+dto.toString()); + } catch (Exception e){ + log.warn("任务添加到任务列表异常:"+ dto.toString() +e.getMessage()); + } } // 判断是否为WMS下发的任务,如果是反馈任务状态给WMS String hasWms = paramService.findByCode(AcsConfig.HASWMS).getValue(); @@ -1296,9 +1308,18 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { @Override public boolean removeByCodeFromCache(String code) { CopyOnWriteArrayList taskDtos = (CopyOnWriteArrayList) this.tasks; - taskDtos.removeIf((task) -> { - return task.getTask_code().equals(code); - }); + try{ + + taskDtos.removeIf((task) -> { + if(StrUtil.equals(task.getTask_code(),code)){ + log.warn("任务移除任务列表成功:"+task.toString()); + } + return task.getTask_code().equals(code); + }); + } catch (Exception e){ + log.warn("指令移除任务列表异常:"+e.getMessage()); + } + return true; } @@ -1525,7 +1546,12 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { @Override public void updateByCodeFromCache(TaskDto dto) { removeByCodeFromCache(dto.getTask_code()); - tasks.add(dto); + try{ + tasks.add(dto); + log.warn("任务添加到任务列表:"+dto.toString()); + } catch (Exception e){ + log.warn("任务添加到任务列表异常:"+ dto.toString() +e.getMessage()); + } } @Override From c49c62583adc8b8e7777f1c0af9aee31dc66d844 Mon Sep 17 00:00:00 2001 From: "USER-20220102CG\\noblelift" <546428999@qq.com> Date: Thu, 15 Jun 2023 16:52:38 +0800 Subject: [PATCH 5/5] =?UTF-8?q?add=20=E5=BF=83=E8=B7=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agv/server/impl/NDCAgvServiceImpl.java | 16 -- .../run/HeartbeatOfflineCheckerAutoRun.java | 55 ++++ .../run/TwoNDC2SocketConnectionAutoRun.java | 251 ------------------ .../run/TwoNDCSocketConnectionAutoRun.java | 52 ++-- .../src/main/java/org/nl/acs/device.xls | Bin 217088 -> 220160 bytes .../agv/ndctwo/AgvNdcTwoDeviceDriver.java | 4 - .../acs/heartbeat/dto/HeartbeatManageDto.java | 7 +- .../service/HeartbeatUnifiedService.java | 1 + .../impl}/HeartbeatManageServiceimpl.java | 14 +- .../impl}/HeartbeatUnifiedServiceimpl.java | 9 +- .../nl/acs/opc/DeviceOpcProtocolRunable.java | 4 +- .../main/resources/config/application-dev.yml | 4 +- 12 files changed, 109 insertions(+), 308 deletions(-) create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/auto/run/HeartbeatOfflineCheckerAutoRun.java delete mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java rename acs/nladmin-system/src/main/java/org/nl/acs/heartbeat/{service_impl => service/impl}/HeartbeatManageServiceimpl.java (72%) rename acs/nladmin-system/src/main/java/org/nl/acs/heartbeat/{service_impl => service/impl}/HeartbeatUnifiedServiceimpl.java (96%) diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java index 3b2c9030b..d50af98ea 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/NDCAgvServiceImpl.java @@ -1,30 +1,22 @@ package org.nl.acs.agv.server.impl; -import cn.hutool.core.util.ObjectUtil; 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.AcsConfig; import org.nl.acs.agv.server.NDCAgvService; import org.nl.acs.agv.server.dto.AgvDto; import org.nl.acs.auto.run.OneNDCSocketConnectionAutoRun; -import org.nl.acs.auto.run.TwoNDC2SocketConnectionAutoRun; import org.nl.acs.auto.run.TwoNDCSocketConnectionAutoRun; import org.nl.acs.device.service.DeviceService; import org.nl.acs.device.service.impl.DeviceServiceImpl; import org.nl.acs.ext.wms.service.AcsToWmsService; -import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; import org.nl.acs.log.LokiLog; import org.nl.acs.log.LokiLogType; import org.nl.acs.log.service.DeviceExecuteLogService; -import org.nl.acs.opc.Device; import org.nl.acs.opc.DeviceAppService; import org.nl.acs.opc.DeviceAppServiceImpl; -import org.nl.acs.opc.DeviceType; -import org.nl.modules.common.exception.BadRequestException; import org.nl.modules.system.service.ParamService; import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.util.SpringContextHolder; @@ -32,7 +24,6 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import java.util.HashMap; -import java.util.List; import java.util.Map; @Slf4j @@ -80,10 +71,7 @@ public class NDCAgvServiceImpl implements NDCAgvService { OneNDCSocketConnectionAutoRun.write(b); } else if (StrUtil.equals(inst.getAgv_system_type(), "2")) { TwoNDCSocketConnectionAutoRun.write(b); - } else if (StrUtil.equals(inst.getAgv_system_type(), "3")) { - TwoNDC2SocketConnectionAutoRun.write(b); } - System.out.println("下发删除agv指令数据:" + Bytes2HexString(b)); } @@ -198,8 +186,6 @@ public class NDCAgvServiceImpl implements NDCAgvService { if (StrUtil.equals(agv_system_type, "2")) { TwoNDCSocketConnectionAutoRun.write(b); - } else if (StrUtil.equals(agv_system_type, "3")) { - TwoNDC2SocketConnectionAutoRun.write(b); } } else { @@ -394,8 +380,6 @@ public class NDCAgvServiceImpl implements NDCAgvService { OneNDCSocketConnectionAutoRun.write(b); } else if (StrUtil.equals(agv_system, "2")) { TwoNDCSocketConnectionAutoRun.write(b); - } else if (StrUtil.equals(agv_system, "3")) { - TwoNDC2SocketConnectionAutoRun.write(b); } } catch (Exception e) { e.getMessage(); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/HeartbeatOfflineCheckerAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/HeartbeatOfflineCheckerAutoRun.java new file mode 100644 index 000000000..1002f9862 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/HeartbeatOfflineCheckerAutoRun.java @@ -0,0 +1,55 @@ +package org.nl.acs.auto.run; + +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.heartbeat.service.HeartbeatUnifiedService; +import org.nl.acs.heartbeat.service.impl.HeartbeatUnifiedServiceimpl; +import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.instruction.service.impl.InstructionServiceImpl; +import org.nl.acs.opc.ThreadUtl; +import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Slf4j +@Component +public class HeartbeatOfflineCheckerAutoRun extends AbstractAutoRunnable { + @Autowired + AutoRunService autoRunService; + + private int recordTimeOut = 10000; + private Date recordTime; + int offline_loop_time_millions = 1000; + boolean heartbeat_no_use =false; + public HeartbeatOfflineCheckerAutoRun() { + this.recordTime = new Date((new Date()).getTime() - (long)this.recordTimeOut); + } + + public String getCode() { + return HeartbeatOfflineCheckerAutoRun.class.getSimpleName(); + } + + public String getName() { + return "在线监听器"; + } + + public void autoRun() { + InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); + HeartbeatUnifiedService heartbeatUnifiedService = SpringContextHolder.getBean(HeartbeatUnifiedServiceimpl.class); + + for(; !heartbeat_no_use; ThreadUtl.sleep((long)offline_loop_time_millions)) { + try { + heartbeatUnifiedService.offlineChecker(); + } catch (Exception var3) { + Date date = new Date(); + if (date.getTime() - this.recordTime.getTime() < (long)this.recordTimeOut) { + return; + } + + this.recordTime = date; + } + } + + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java deleted file mode 100644 index 762948e80..000000000 --- a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java +++ /dev/null @@ -1,251 +0,0 @@ -package org.nl.acs.auto.run; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import lombok.extern.slf4j.Slf4j; -import org.nl.acs.AcsConfig; -import org.nl.acs.agv.server.NDCAgvService; -import org.nl.acs.device.service.DeviceService; -import org.nl.acs.device_driver.basedriver.agv.ndctwo.AgvNdcTwoDeviceDriver; -import org.nl.acs.ext.wms.service.AcsToWmsService; -import org.nl.acs.ext.wms.service.impl.AcsToWmsServiceImpl; -import org.nl.acs.instruction.service.InstructionService; -import org.nl.acs.instruction.service.dto.Instruction; -import org.nl.acs.instruction.service.impl.InstructionServiceImpl; -import org.nl.acs.opc.Device; -import org.nl.acs.opc.DeviceAppService; -import org.nl.modules.system.service.ParamService; -import org.nl.modules.system.service.impl.ParamServiceImpl; -import org.nl.modules.wql.util.SpringContextHolder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.IOException; -import java.net.Socket; -import java.util.Date; - -import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString; - - -@Slf4j -@Component -public class TwoNDC2SocketConnectionAutoRun extends AbstractAutoRunnable { - - Socket s; - String ip = "192.168.46.225"; - int port = 1234; - static DataOutputStream dos; - static DataInputStream dis; - private int recordTimeOut = 10000; - private Date recordTime; - String[] ERROR = new String[]{ - "货叉尖部传感器触发", "S300传感器触发", "载货状态改变", "急停按钮触发", "触边开关出发", "需要复位", - "停在充电位", "取货失败", "放货失败", "轮子打滑", "没有动作码不能进入站点", "取货时有货", "丢失定位", - "抬叉停止"}; - boolean bConnected = true; - - boolean isReConnect = false; - - @Autowired - ParamService paramService; - @Autowired - AutoRunService autoRunService; - - - public TwoNDC2SocketConnectionAutoRun() { - this.recordTime = new Date((new Date()).getTime() - (long) this.recordTimeOut); - } - - public String getCode() { - return TwoNDC2SocketConnectionAutoRun.class.getSimpleName(); - } - - public String getName() { - return "2楼2区域AGV系统"; - } - - public void autoRun() { - - try { - System.out.println("2楼2区域AGV系统链接开始"); - ParamService paramService = SpringContextHolder.getBean(ParamServiceImpl.class); - InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); - AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); - NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); - DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); - DeviceService deviceService = SpringContextHolder.getBean(DeviceService.class); - ip = paramService.findByCode(AcsConfig.AGVURL22).getValue(); - port = Integer.parseInt(paramService.findByCode(AcsConfig.AGVPORT22).getValue()); - byte[] b = new byte[1028]; - s = new Socket(ip, port); - System.out.println("2楼2区域AGV链接成功"); - dos = new DataOutputStream(s.getOutputStream()); - dis = new DataInputStream(s.getInputStream()); - - while (bConnected) { - int count = dis.read(b); - - if (count == -1) { - break; - } - - int[] arr = new int[count]; - StringBuffer bs = new StringBuffer(); - - for (int i = 0; i < count; i++) { - int temp = b[i]; - if (temp < 0) - temp += 256; - arr[i] = temp; - StringBuffer bs1 = new StringBuffer("0"); - bs.append(temp < 16 ? bs1.append(Integer.toHexString(temp)) : Integer.toHexString(temp)); - } - - System.out.println("收到请求参数:" + bs); - boolean flag = false; - if (arr[8] * 256 + arr[9] == 0x73) { - byte[] data = null; - System.out.println("接收agv上报信息:" + bs); - //执行阶段 - int phase = arr[16] * 256 + arr[17]; - // agv任务号 - int index = arr[12] * 256 + arr[13]; - //任务号 - int ikey = arr[26] * 256 + arr[27]; - //站点号 - int agvaddr = arr[18] * 256 + arr[19]; - //车号 - int carno = arr[20]; - Instruction inst = null; - if (ikey != 0) { - inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); - } - log.info("接收agv上报信息:" + bs); - log.info("接收agv上报信息:" + "phase--" + phase + " index--" + index + " ikey--" + ikey + " agvaddr--" + agvaddr + " Car--" + carno); - Device device = null; - String device_code = null; - String old_device_code = null; - String emptyNum = null; - if (agvaddr != 0) { - old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); - if (StrUtil.contains(old_device_code, "-")) { - String[] point = old_device_code.split("-"); - device_code = point[0]; - } else if (StrUtil.contains(old_device_code, ".")) { - String[] point = old_device_code.split("\\."); - device_code = point[0]; - emptyNum = point[1]; - } else { - device_code = old_device_code; - } - device = deviceAppService.findDeviceByCode(device_code); - } - - AgvNdcTwoDeviceDriver agvNdcTwoDeviceDriver; - //开始任务 - if (phase == 0x01) { - if (!ObjectUtil.isEmpty(inst)) { - inst.setInstruction_status("1"); - inst.setAgv_jobno(String.valueOf(index)); - inst.setSend_status("1"); - instructionService.update(inst); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } - flag = true; - } - //任务完毕 - //(无车id及状态) - else if (phase == 0x14) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - break; - } - String agvcar = inst.getCarno(); - Device agvDevice = deviceAppService.findDeviceByCode(agvcar); - if (agvDevice != null) { - if (agvDevice.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { - agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) agvDevice.getDeviceDriver(); - agvNdcTwoDeviceDriver.setInstruction(null); - } - } - inst.setInstruction_status("2"); - instructionService.finish(inst); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } - //请求删除任务 - //(需要WCS反馈) - else if (phase == 0x30) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - break; - } - data = ndcAgvService.sendAgvTwoModeInst(0x8F, index, 0); - } - //任务删除确认 - //(需要WCS反馈) - else if (phase == 0xFF) { - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到指令号{}对应的指令", ikey); - break; - } - instructionService.cancelNOSendAgv(inst.getInstruction_id()); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - } else { - //上报异常信息 - //(不需要WCS反馈) - if (phase == 0x67 || phase == 0x71 || phase == 0x72 || phase == 0x73 || phase == 0x74 || phase == 0x75) { - device = deviceAppService.findDeviceByCode(Integer.toString(arr[18] * 256 + arr[19])); - } else { - device = deviceAppService.findDeviceByCode(Integer.toString(arr[20])); - } - if (device.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { - agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) device.getDeviceDriver(); - agvNdcTwoDeviceDriver.processSocket(arr); - } - } - if (!ObjectUtil.isEmpty(data)) { - write(data); - } - - } else { - System.out.println("agv上报不是0073类型动作,不处理"); - } - } - - } catch (Exception e) { - - - } finally { - - - } - - } - - - @Override - public void stop() { - super.after(); - try { - s.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - public static void write(byte[] b) { - try { - log.info("下发agv数据:" + Bytes2HexString(b)); - System.out.println("下发agv数据:" + Bytes2HexString(b)); - dos.write(b); - dos.flush(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } -} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java index 804100ff7..d0cdafe04 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDCSocketConnectionAutoRun.java @@ -206,20 +206,23 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { log.info(agvaddr + "对应设备号为空!"); return; } - if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { - standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); - - try { - standardAutodoorDeviceDriver.writing("to_open", "1"); - standardAutodoorDeviceDriver.writing("to_close", "0"); - } catch (Exception e) { - log.info("下发电气信号失败:" + e.getMessage()); - e.printStackTrace(); - } - if (standardAutodoorDeviceDriver.getOpen() == 1) { - log.info("下发开门信号值为:{},下发关门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getToClose()); - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + if(ObjectUtil.isNotEmpty(device)) { + if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { + standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); + try { + standardAutodoorDeviceDriver.writing("to_open", "1"); + standardAutodoorDeviceDriver.writing("to_close", "0"); + } catch (Exception e) { + log.info("下发电气信号失败:" + e.getMessage()); + e.printStackTrace(); + } + if (standardAutodoorDeviceDriver.getOpen() == 1) { + log.info("下发开门信号值为:{},下发关门信号值为:{}", standardAutodoorDeviceDriver.getToOpen(), standardAutodoorDeviceDriver.getToClose()); + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + } } + } else { + log.info(agvaddr + "对应设备号为空!"); } } else if (phase == 0x51) { @@ -227,17 +230,20 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { log.info(agvaddr + "对应设备号为空!"); return; } - if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { - standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); - try { - standardAutodoorDeviceDriver.writing("to_close", "1"); - standardAutodoorDeviceDriver.writing("to_open", "0"); - } catch (Exception e) { - log.info("下发电气信号失败:" + e.getMessage()); - e.printStackTrace(); + if(ObjectUtil.isNotEmpty(device)){ + if (device.getDeviceDriver() instanceof StandardAutodoorDeviceDriver) { + standardAutodoorDeviceDriver = (StandardAutodoorDeviceDriver) device.getDeviceDriver(); + try { + standardAutodoorDeviceDriver.writing("to_close", "1"); + standardAutodoorDeviceDriver.writing("to_open", "0"); + } catch (Exception e) { + log.info("下发电气信号失败:" + e.getMessage()); + e.printStackTrace(); + } + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); } - data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); - + } else { + log.info(device_code + "对应设备号为空!"); } } else { diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device.xls b/acs/nladmin-system/src/main/java/org/nl/acs/device.xls index 1c3db516e0eeb180f94b3fb3d8125c1b63eb9290..dedf580eade620203577e4efc768ffc098782775 100644 GIT binary patch delta 9663 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 BXr2H7 delta 7744 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 queryAllHeartbeat(PageQuery pageQuery) { // return this.heartbeatRespository.queryPagedByColumn(pageQuery, HeartbeatManageDto.class); @@ -40,7 +43,10 @@ public class HeartbeatManageServiceimpl implements HeartbeatManageService { } public List queryAllActive() { - return null; + WQLObject wo = WQLObject.getWQLObject("acs_heartbeat"); + JSONArray arr = wo.query().getResultJSONArray(0); + List list = arr.toJavaList(HeartbeatManageDto.class); + return list; } public HeartbeatManageDto queryById(UUID id) { diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/heartbeat/service_impl/HeartbeatUnifiedServiceimpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/heartbeat/service/impl/HeartbeatUnifiedServiceimpl.java similarity index 96% rename from acs/nladmin-system/src/main/java/org/nl/acs/heartbeat/service_impl/HeartbeatUnifiedServiceimpl.java rename to acs/nladmin-system/src/main/java/org/nl/acs/heartbeat/service/impl/HeartbeatUnifiedServiceimpl.java index 42ec13dd8..1d683cdcb 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/heartbeat/service_impl/HeartbeatUnifiedServiceimpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/heartbeat/service/impl/HeartbeatUnifiedServiceimpl.java @@ -1,4 +1,4 @@ -package org.nl.acs.heartbeat.service_impl; +package org.nl.acs.heartbeat.service.impl; import cn.hutool.core.util.ObjectUtil; @@ -12,23 +12,22 @@ import org.nl.acs.heartbeat.service.HeartbeatManageService; import org.nl.acs.heartbeat.service.HeartbeatUnifiedService; import org.nl.modules.wql.util.SpringContextHolder; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import java.util.*; +@Service public class HeartbeatUnifiedServiceimpl implements HeartbeatUnifiedService, ApplicationAutoInitial { private List heartbeats = new ArrayList(); + @Autowired private HeartbeatManageService heartbeatManageService; - public HeartbeatUnifiedServiceimpl() { - } @Override public void autoInitial() throws Exception { - heartbeatManageService = SpringContextHolder.getBean("heartbeatManageServiceImpl"); - this.reload(); Iterator iterator = this.heartbeats.iterator(); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java b/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java index b1ad40336..08625ef06 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/opc/DeviceOpcProtocolRunable.java @@ -192,9 +192,9 @@ public class DeviceOpcProtocolRunable implements Runnable, DataCallback, ServerC if (true) { this.logItemChanged(itemId, accessor_value, value, itemDto); } - if(!ObjectUtil.isEmpty(value)){ +// if(!ObjectUtil.isEmpty(value)){ accessor_value.setValue(itemId, value); - } +// } } } diff --git a/acs/nladmin-system/src/main/resources/config/application-dev.yml b/acs/nladmin-system/src/main/resources/config/application-dev.yml index f57637425..7a0351aed 100644 --- a/acs/nladmin-system/src/main/resources/config/application-dev.yml +++ b/acs/nladmin-system/src/main/resources/config/application-dev.yml @@ -13,11 +13,11 @@ spring: driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy # url: jdbc:log4jdbc:mysql://${DB_HOST:10.1.3.91}:${DB_PORT:3306}/${DB_NAME:acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true # url: jdbc:log4jdbc:mysql://${DB_HOST:192.168.81.252}:${DB_PORT:3306}/${DB_NAME:lzhl_one_acs}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true - url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:lzhl_one_wcs}?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:lzhl_a1_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:password} + password: ${DB_PWD:123456} # 初始连接数 initial-size: 5