From 35039ac5d35ddd0b6d5688564c6759ef9788d94f Mon Sep 17 00:00:00 2001 From: "USER-20220102CG\\noblelift" <546428999@qq.com> Date: Sun, 13 Nov 2022 14:07:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nl/acs/agv/server/NDCAgvService.java | 60 +- .../agv/server/impl/NDCAgvServiceImpl.java | 575 +++++++----------- .../agv/server/impl/ZheDaAgvServiceImpl.java | 29 +- .../run/TwoNDCSocketConnectionAutoRun.java | 47 +- .../src/main/java/org/nl/acs/device.xls | Bin 217088 -> 217088 bytes .../device/device_driver/DriverTypeEnum.java | 5 +- .../java/org/nl/acs/device/wql/task_inst.xls | Bin 188928 -> 194048 bytes .../agv/ndctwo/AgvNdcTwoDeviceDriver.java | 282 ++------- .../HongXiangConveyorDefination.java} | 14 +- .../HongXiangConveyorDeviceDriver.java} | 46 +- .../ItemProtocol.java | 35 +- .../org/nl/acs/ext/wms/data/BaseRequest.java | 47 ++ .../org/nl/acs/ext/wms/data/BaseResponse.java | 47 ++ .../acs/ext/wms/data/CreateTaskRequest.java | 18 + .../acs/ext/wms/data/CreateTaskResponse.java | 6 + .../java/org/nl/acs/ext/wms/data/JsonUtl.java | 127 ++++ .../acs/ext/wms/rest/WmsToAcsController.java | 10 + .../acs/ext/wms/service/WmsToAcsService.java | 3 + .../wms/service/impl/WmsToAcsServiceImpl.java | 23 +- .../service/InstructionService.java | 7 - .../service/dto/InstructionDto.java | 61 +- .../service/impl/InstructionServiceImpl.java | 194 +----- .../src/views/acs/device/config.vue | 6 +- ...auto_conveyor.vue => hongxiang_device.vue} | 31 +- .../device/driver/standard_ordinary_site.vue | 5 + 25 files changed, 696 insertions(+), 982 deletions(-) rename acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/{haokai_auto_conveyor/HaoKaiAutoConveyorDefination.java => hongxiang_device/HongXiangConveyorDefination.java} (73%) rename acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/{haokai_auto_conveyor/HaoKaiAutoConveyorDeviceDriver.java => hongxiang_device/HongXiangConveyorDeviceDriver.java} (82%) rename acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/{haokai_auto_conveyor => hongxiang_device}/ItemProtocol.java (56%) create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseRequest.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseResponse.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskRequest.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskResponse.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/JsonUtl.java rename acs/nladmin-ui/src/views/acs/device/driver/{haokai_auto_conveyor.vue => hongxiang_device.vue} (92%) diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/NDCAgvService.java b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/NDCAgvService.java index 464df2bfe..26deb1dc2 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/NDCAgvService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/NDCAgvService.java @@ -13,14 +13,6 @@ import java.util.Map; public interface NDCAgvService { Map findAllAgvFromCache(); - /** - * 查询自动门状态 - * - * @param device - * @return - */ - public String queryDoorStatus(String device); - /** * 删除NDC任务 * @@ -29,61 +21,15 @@ public interface NDCAgvService { */ public void deleteAgvInstToNDC(Instruction inst) throws Exception; - /** - * 下发NDC agv1楼动作指令,反馈信号,如能否进、能否出。 - * 告诉AGV能否进,能否出 - * - * @param phase - * @param index - * @param result1 - * @param result2 - */ - public byte[] sendAgvOneModeInst(int phase, int index, int result1, int result2); - - /** - * 下发NDC agv2楼动作指令,反馈信号,如能否进、能否出。 - * 告诉AGV能否进,能否出 - * - * @param phase - * @param index - * @param result1 - * @param result2 - */ - public byte[] sendAgvTwoModeInst(int phase, int index); - - /** - * @param inst - * @param inst2 - */ - void sendAgvTwoInstToNDC(Instruction inst, Instruction inst2); - /** * 下发任务 * * @param inst * @throws Exception */ - public void sendAgvInstToNDC(Instruction inst) throws Exception; + public void sendAgvInstToNDC(String type,Instruction inst) throws Exception; - void sendAgvOneInstToNDC(Instruction inst); - - public void sendAgvInstToNDC(String code) throws Exception; - - /** - * 下发agv单工动作指令 - * - * @param phase - * @param index - */ - public byte[] sendAgvOneModeInst(int phase, int index); - - /** - * 反馈agv单工动作指令 - * AGV调用ACS,告诉AGV是否允许进,允许出等操作. - * - * @param phase - * @param index - */ - public byte[] sendAgvOneModeInst(int phase, int index, int result); + public byte[] sendAgvOneModeInst(int phase, int index,int result); + public byte[] sendAgvTwoModeInst(int phase, int index,int result); } 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 700829437..ab5561618 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 @@ -9,6 +9,8 @@ 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.TwoNDCSocketConnectionAutoRun; import org.nl.acs.device.service.DeviceService; import org.nl.acs.device.service.impl.DeviceServiceImpl; import org.nl.acs.ext.wms.service.AcsToWmsService; @@ -75,176 +77,239 @@ public class NDCAgvServiceImpl implements NDCAgvService { } + @LokiLog(type = LokiLogType.AGV) @Override - public byte[] sendAgvOneModeInst(int phase, int index, int result1, int result2) { + public void sendAgvInstToNDC(String agv_type, Instruction inst) { + if (StrUtil.equals(paramService.findByCode(AcsConfig.FORKAGV).getValue(), "1")) { + if (StrUtil.equals(agv_type, "1")) { + String instcode = inst.getInstruction_code(); + int type = Integer.parseInt(inst.getAgv_inst_type()); + int priority = Integer.parseInt(inst.getPriority()) + 128; + DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); + DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); + int startAddress = deviceService.queryAddressBydeviceCode(inst.getStart_point_code()); + int nextAddress = deviceService.queryAddressBydeviceCode(inst.getNext_point_code()); + int startAddress2 = deviceService.queryAddressBydeviceCode(inst.getStart_point_code2()); + int nextAddress2 = deviceService.queryAddressBydeviceCode(inst.getNext_point_code2()); + byte ikeyhigh = (byte) IntToHexHigh(Integer.parseInt(instcode)); + byte ikeylow = (byte) IntToHexLow(Integer.parseInt(instcode)); + byte typehigh = (byte) IntToHexHigh(type); + byte typelow = (byte) IntToHexLow(type); + byte qhdhigh = (byte) IntToHexHigh(startAddress); + byte qhdlow = (byte) IntToHexLow(startAddress); + byte qhdhigh2 = (byte) IntToHexHigh(startAddress2); + byte qhdlow2 = (byte) IntToHexLow(startAddress2); + byte fhdhigh = (byte) IntToHexHigh(nextAddress); + byte fhdlow = (byte) IntToHexLow(nextAddress); + byte fhdhigh2 = (byte) IntToHexHigh(nextAddress2); + byte fhdlow2 = (byte) IntToHexLow(nextAddress2); + byte prioritylow = (byte) IntToHexLow(priority); + + String str = "十进制下发:"; + String str1 = "十六进制下发:"; + str += "ikey:" + (Integer.parseInt(instcode)); + str1 += "ikey:" + hexToString(ikeyhigh & 0xFF) + hexToString(ikeylow & 0xFF); + + str += "/type:" + (type); + str1 += "/type:" + hexToString(typehigh & 0xFF) + hexToString(typelow & 0xFF); + + str += "/qhd:" + (startAddress); + str1 += "/qhd:" + hexToString(qhdhigh & 0xFF) + hexToString(qhdlow & 0xFF); + str += "/fhd:" + (nextAddress); + str1 += "/fhd:" + hexToString(fhdhigh & 0xFF) + hexToString(fhdlow & 0xFF); + + str += "/qhd2:" + (startAddress2); + str1 += "/qhd2:" + hexToString(qhdhigh2 & 0xFF) + hexToString(qhdlow2 & 0xFF); + str += "/fhd2:" + (nextAddress2); + str1 += "/fhd2:" + hexToString(fhdhigh2 & 0xFF) + hexToString(fhdlow2 & 0xFF); + + str += "/priority:" + (priority); + str1 += "/priority:" + hexToString(prioritylow & 0xFF); + + System.out.println(str); + System.out.println(str1); + byte[] b = new byte[]{}; + if (type == 1) { + b = new byte[]{(byte) 0X87, (byte) 0XCD, + (byte) 0X00, (byte) 0X08, + (byte) 0X00, (byte) 0X1A, + (byte) 0X00, (byte) 0X01, + (byte) 0X00, (byte) 0X71, + (byte) 0X00, (byte) 0X16, + (byte) 0X01, prioritylow, + (byte) 0X00, (byte) 0X01, + (byte) ikeyhigh, (byte) ikeylow, + (byte) ikeyhigh, (byte) ikeylow, + (byte) typehigh, (byte) typelow, + (byte) qhdhigh, (byte) qhdlow, + (byte) qhdhigh2, (byte) qhdlow2, + (byte) fhdhigh, (byte) fhdlow, + (byte) fhdhigh2, (byte) fhdlow2, + (byte) 0X00, (byte) 0X00, + (byte) 0X00, (byte) 0X00 + }; + } else if (type == 2) { + b = new byte[]{(byte) 0X87, (byte) 0XCD, + (byte) 0X00, (byte) 0X08, + (byte) 0X00, (byte) 0X1A, + (byte) 0X00, (byte) 0X01, + (byte) 0X00, (byte) 0X71, + (byte) 0X00, (byte) 0X16, + (byte) 0X01, prioritylow, + (byte) 0X00, (byte) 0X01, + (byte) ikeyhigh, (byte) ikeylow, + (byte) ikeyhigh, (byte) ikeylow, + (byte) typehigh, (byte) typelow, + (byte) qhdhigh, (byte) qhdlow, + (byte) 0X00, (byte) 0X00, + (byte) fhdhigh, (byte) fhdlow, + (byte) 0X00, (byte) 0X00, + (byte) 0X00, (byte) 0X00, + (byte) 0X00, (byte) 0X00 + }; + } else if (type == 3) { + b = new byte[]{(byte) 0X87, (byte) 0XCD, + (byte) 0X00, (byte) 0X08, + (byte) 0X00, (byte) 0X1A, + (byte) 0X00, (byte) 0X01, + (byte) 0X00, (byte) 0X71, + (byte) 0X00, (byte) 0X16, + (byte) 0X01, prioritylow, + (byte) 0X00, (byte) 0X01, + (byte) ikeyhigh, (byte) ikeylow, + (byte) ikeyhigh, (byte) ikeylow, + (byte) typehigh, (byte) typelow, + (byte) qhdhigh, (byte) qhdlow, + (byte) 0X00, (byte) 0X00, + (byte) fhdhigh, (byte) fhdlow, + (byte) 0X00, (byte) 0X00, + (byte) qhdhigh2, (byte) qhdlow2, + (byte) fhdhigh2, (byte) fhdlow2 + }; + } + log.info("下发AGV作业指令--{}", str1); + OneNDCSocketConnectionAutoRun.write(b); + System.out.println("下发agv指令数据:" + Bytes2HexString(b)); + } else { + + String instcode = inst.getInstruction_code(); + int type = Integer.parseInt(inst.getInstruction_type()); + int priority = Integer.parseInt(inst.getPriority()) + 128; + DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); + DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); + int startAddress = deviceService.queryAddressBydeviceCode(inst.getStart_point_code()); + int nextAddress = deviceService.queryAddressBydeviceCode(inst.getNext_point_code()); + + byte ikeyhigh = (byte) IntToHexHigh(Integer.parseInt(instcode)); + byte ikeylow = (byte) IntToHexLow(Integer.parseInt(instcode)); + byte typehigh = (byte) IntToHexHigh(type); + byte typelow = (byte) IntToHexLow(type); + byte qhdhigh = (byte) IntToHexHigh(startAddress); + byte qhdlow = (byte) IntToHexLow(startAddress); + byte fhdhigh = (byte) IntToHexHigh(nextAddress); + byte fhdlow = (byte) IntToHexLow(nextAddress); + byte prioritylow = (byte) IntToHexLow(priority); + + String str = "十进制下发:"; + String str1 = "十六进制下发:"; + str += "ikey:" + (Integer.parseInt(instcode)); + str1 += "ikey:" + hexToString(ikeyhigh & 0xFF) + hexToString(ikeylow & 0xFF); + + str += "/type:" + (type); + str1 += "/type:" + hexToString(typehigh & 0xFF) + hexToString(typelow & 0xFF); + + str += "/qhd:" + (startAddress); + str1 += "/qhd:" + hexToString(qhdhigh & 0xFF) + hexToString(qhdlow & 0xFF); + str += "/fhd:" + (nextAddress); + str1 += "/fhd:" + hexToString(fhdhigh & 0xFF) + hexToString(fhdlow & 0xFF); + + str += "/priority:" + (priority); + str1 += "/priority:" + hexToString(prioritylow & 0xFF); + + System.out.println(str); + System.out.println(str1); + + byte[] b = new byte[]{(byte) 0X87, (byte) 0XCD, + (byte) 0X00, (byte) 0X08, + (byte) 0X00, (byte) 0X12, + (byte) 0X00, (byte) 0X01, + (byte) 0X00, (byte) 0X71, + (byte) 0X00, (byte) 0X0E, + (byte) 0X01, prioritylow, + (byte) 0X00, (byte) 0X01, + (byte) ikeyhigh, (byte) ikeylow, + (byte) ikeyhigh, (byte) ikeylow, + (byte) typehigh, (byte) typelow, + (byte) qhdhigh, (byte) qhdlow, + (byte) fhdhigh, (byte) fhdlow + }; + log.info("下发AGV作业指令--{}", str1); + TwoNDCSocketConnectionAutoRun.write(b); + System.out.println("下发agv指令数据:" + Bytes2HexString(b)); + } + + + } + } + + @Override + public byte[] sendAgvOneModeInst(int phase, int index, int result) { if (phase < 0 || index < 0) return null; byte indexhigh = (byte) IntToHexHigh(index); byte indexlow = (byte) IntToHexLow(index); byte phasehigh = (byte) IntToHexHigh(phase); byte phaselow = (byte) IntToHexLow(phase); - byte resulthigh1 = (byte) IntToHexHigh(result1); - byte resultlow1 = (byte) IntToHexLow(result1); - byte resulthigh2 = (byte) IntToHexHigh(result2); - byte resultlow2 = (byte) IntToHexLow(result2); byte[] b = new byte[]{(byte) 0X87, (byte) 0XCD, (byte) 0X00, (byte) 0X08, - (byte) 0X00, (byte) 0X0D, + (byte) 0X00, (byte) 0X0A, (byte) 0X00, (byte) 0X01, (byte) 0X00, (byte) 0X6D, - (byte) 0X00, (byte) 0X08, + (byte) 0X00, (byte) 0X06, (byte) indexhigh, (byte) indexlow, (byte) 0X01, (byte) 0X12, - (byte) phasehigh, (byte) phaselow, - (byte) resulthigh1, (byte) resultlow1, - (byte) resulthigh2, (byte) resultlow2 + (byte) phasehigh, (byte) phaselow }; + log.info("反馈agv动作数据--index:" + hexToString(indexhigh & 0xFF) + hexToString(indexlow & 0xFF) + ",phase:" + hexToString(phasehigh & 0xFF) + hexToString(phaselow & 0xFF)); - //87CD 0008 000C 0001 006D 0008 0000 0114 000E 0000 - //87CD 0008 000C 0001 006D 0008 0003 0114 008F 0000 + System.out.println("反馈agv动作数据:" + Bytes2HexString(b)); return b; - } - @LokiLog(type = LokiLogType.AGV) @Override - public void sendAgvOneInstToNDC(Instruction inst) { - if (StrUtil.equals(paramService.findByCode(AcsConfig.ONEFORKAGV).getValue(), "1")) { - String instcode = inst.getLink_num(); - int type = Integer.parseInt(inst.getAgv_inst_type()); - int priority = Integer.parseInt(inst.getPriority()) + 128; - DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); - DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); - int startAddress = deviceService.queryAddressBydeviceCode(inst.getStart_point_code()); - int nextAddress = deviceService.queryAddressBydeviceCode(inst.getNext_point_code()); + public byte[] sendAgvTwoModeInst(int phase, int index, int result) { - byte ikeyhigh = (byte) IntToHexHigh(Integer.parseInt(instcode)); - byte ikeylow = (byte) IntToHexLow(Integer.parseInt(instcode)); - byte typehigh = (byte) IntToHexHigh(type); - byte typelow = (byte) IntToHexLow(type); - byte qhdhigh = (byte) IntToHexHigh(startAddress); - byte qhdlow = (byte) IntToHexLow(startAddress); - byte fhdhigh = (byte) IntToHexHigh(nextAddress); - byte fhdlow = (byte) IntToHexLow(nextAddress); - byte prioritylow = (byte) IntToHexLow(priority); + if (phase < 0 || index < 0) + return null; + byte indexhigh = (byte) IntToHexHigh(index); + byte indexlow = (byte) IntToHexLow(index); + byte phasehigh = (byte) IntToHexHigh(phase); + byte phaselow = (byte) IntToHexLow(phase); - String str = "十进制下发:"; - String str1 = "十六进制下发:"; - str += "ikey:" + (Integer.parseInt(instcode)); - str1 += "ikey:" + hexToString(ikeyhigh & 0xFF) + hexToString(ikeylow & 0xFF); + byte[] b = new byte[]{(byte) 0X87, (byte) 0XCD, + (byte) 0X00, (byte) 0X08, + (byte) 0X00, (byte) 0X0A, + (byte) 0X00, (byte) 0X01, + (byte) 0X00, (byte) 0X6D, + (byte) 0X00, (byte) 0X06, + (byte) indexhigh, (byte) indexlow, + (byte) 0X01, (byte) 0X10, + (byte) phasehigh, (byte) phaselow + }; - str += "/type:" + (type); - str1 += "/type:" + hexToString(typehigh & 0xFF) + hexToString(typelow & 0xFF); - str += "/qhd:" + (startAddress); - str1 += "/qhd:" + hexToString(qhdhigh & 0xFF) + hexToString(qhdlow & 0xFF); - str += "/fhd:" + (nextAddress); - str1 += "/fhd:" + hexToString(fhdhigh & 0xFF) + hexToString(fhdlow & 0xFF); + log.info("反馈agv动作数据--index:" + hexToString(indexhigh & 0xFF) + hexToString(indexlow & 0xFF) + ",phase:" + hexToString(phasehigh & 0xFF) + hexToString(phaselow & 0xFF)); - str += "/priority:" + (priority); - str1 += "/priority:" + hexToString(prioritylow & 0xFF); - - System.out.println(str); - System.out.println(str1); - - byte[] b = new byte[]{(byte) 0X87, (byte) 0XCD, - (byte) 0X00, (byte) 0X08, - (byte) 0X00, (byte) 0X12, - (byte) 0X00, (byte) 0X01, - (byte) 0X00, (byte) 0X71, - (byte) 0X00, (byte) 0X0E, - (byte) 0X01, prioritylow, - (byte) 0X00, (byte) 0X01, - (byte) ikeyhigh, (byte) ikeylow, - (byte) ikeyhigh, (byte) ikeylow, - (byte) typehigh, (byte) typelow, - (byte) qhdhigh, (byte) qhdlow, - (byte) fhdhigh, (byte) fhdlow - }; - log.info("下发AGV作业指令--{}", str1); - -// OneNDCSocketConnectionAutoRun.write(b); - System.out.println("下发agv指令数据:" + Bytes2HexString(b)); - } + System.out.println("反馈agv动作数据:" + Bytes2HexString(b)); + return b; } - @LokiLog(type = LokiLogType.AGV) - @Override - public void sendAgvInstToNDC(Instruction inst) { - if (StrUtil.equals(paramService.findByCode(AcsConfig.FORKAGV).getValue(), "1")) { - String instcode = inst.getInstruction_code(); - int type = Integer.parseInt(inst.getInstruction_type()); - int priority = Integer.parseInt(inst.getPriority()) + 128; - DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); - DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); - int startAddress = deviceService.queryAddressBydeviceCode(inst.getStart_point_code()); - int nextAddress = deviceService.queryAddressBydeviceCode(inst.getNext_point_code()); - - byte ikeyhigh = (byte) IntToHexHigh(Integer.parseInt(instcode)); - byte ikeylow = (byte) IntToHexLow(Integer.parseInt(instcode)); - byte typehigh = (byte) IntToHexHigh(type); - byte typelow = (byte) IntToHexLow(type); - byte qhdhigh = (byte) IntToHexHigh(startAddress); - byte qhdlow = (byte) IntToHexLow(startAddress); - byte fhdhigh = (byte) IntToHexHigh(nextAddress); - byte fhdlow = (byte) IntToHexLow(nextAddress); - byte prioritylow = (byte) IntToHexLow(priority); - - String str = "十进制下发:"; - String str1 = "十六进制下发:"; - str += "ikey:" + (Integer.parseInt(instcode)); - str1 += "ikey:" + hexToString(ikeyhigh & 0xFF) + hexToString(ikeylow & 0xFF); - - str += "/type:" + (type); - str1 += "/type:" + hexToString(typehigh & 0xFF) + hexToString(typelow & 0xFF); - - str += "/qhd:" + (startAddress); - str1 += "/qhd:" + hexToString(qhdhigh & 0xFF) + hexToString(qhdlow & 0xFF); - str += "/fhd:" + (nextAddress); - str1 += "/fhd:" + hexToString(fhdhigh & 0xFF) + hexToString(fhdlow & 0xFF); - - str += "/priority:" + (priority); - str1 += "/priority:" + hexToString(prioritylow & 0xFF); - - System.out.println(str); - System.out.println(str1); - - byte[] b = new byte[]{(byte) 0X87, (byte) 0XCD, - (byte) 0X00, (byte) 0X08, - (byte) 0X00, (byte) 0X12, - (byte) 0X00, (byte) 0X01, - (byte) 0X00, (byte) 0X71, - (byte) 0X00, (byte) 0X0E, - (byte) 0X01, prioritylow, - (byte) 0X00, (byte) 0X01, - (byte) ikeyhigh, (byte) ikeylow, - (byte) ikeyhigh, (byte) ikeylow, - (byte) typehigh, (byte) typelow, - (byte) qhdhigh, (byte) qhdlow, - (byte) fhdhigh, (byte) fhdlow - }; - log.info("下发AGV作业指令--{}", str1); - -// NDCSocketConnectionAutoRun.write(b); - System.out.println("下发agv指令数据:" + Bytes2HexString(b)); - } - } - - @LokiLog(type = LokiLogType.AGV) - @Override - public void sendAgvInstToNDC(String instcode) throws Exception { - InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); - Instruction inst = instructionService.findByCodeFromCache(instcode); - sendAgvInstToNDC(inst); - } - - String hexToString(int i) { return (i < 16 ? "0" + Integer.toHexString(i) : Integer.toHexString(i)).toUpperCase(); } @@ -273,240 +338,6 @@ public class NDCAgvServiceImpl implements NDCAgvService { return ret; } - @LokiLog(type = LokiLogType.AGV) - @Override - public byte[] sendAgvOneModeInst(int phase, int index) { - return new byte[0]; - } - - @LokiLog(type = LokiLogType.AGV) - @Override - public byte[] sendAgvTwoModeInst(int phase, int index) { - return new byte[0]; - } - - @LokiLog(type = LokiLogType.AGV) - @Override - public byte[] sendAgvOneModeInst(int phase, int index, int result) { - if (phase < 0 || index < 0) - return null; - byte indexhigh = (byte) IntToHexHigh(index); - byte indexlow = (byte) IntToHexLow(index); - byte phasehigh = (byte) IntToHexHigh(phase); - byte phaselow = (byte) IntToHexLow(phase); - byte resulthigh = (byte) IntToHexHigh(result); - byte resultlow = (byte) IntToHexLow(result); - - int type = Integer.parseInt(paramService.findByCode(AcsConfig.BUSINESSTYPE).getValue()); - byte[] b = new byte[]{}; - switch (type) { - case 0: - b = new byte[]{(byte) 0X87, (byte) 0XCD, - (byte) 0X00, (byte) 0X08, - (byte) 0X00, (byte) 0X0A, - (byte) 0X00, (byte) 0X01, - (byte) 0X00, (byte) 0X6D, - (byte) 0X00, (byte) 0X06, - (byte) indexhigh, (byte) indexlow, - (byte) 0X01, (byte) 0X12, - (byte) phasehigh, (byte) phaselow - }; - break; - case 1: - b = new byte[]{(byte) 0X87, (byte) 0XCD, - (byte) 0X00, (byte) 0X08, - (byte) 0X00, (byte) 0X0D, - (byte) 0X00, (byte) 0X01, - (byte) 0X00, (byte) 0X6D, - (byte) 0X00, (byte) 0X08, - (byte) indexhigh, (byte) indexlow, - (byte) 0X01, (byte) 0X12, - (byte) phasehigh, (byte) phaselow, - (byte) resulthigh, (byte) resultlow - }; - break; - case 2: - b = new byte[]{(byte) 0X87, (byte) 0XCD, - (byte) 0X00, (byte) 0X08, - (byte) 0X00, (byte) 0X0A, - (byte) 0X00, (byte) 0X01, - (byte) 0X00, (byte) 0X6D, - (byte) 0X00, (byte) 0X06, - (byte) indexhigh, (byte) indexlow, - (byte) 0X01, (byte) 0X12, - (byte) phasehigh, (byte) phaselow - }; - break; - case 5: - b = new byte[]{(byte) 0X87, (byte) 0XCD, - (byte) 0X00, (byte) 0X08, - (byte) 0X00, (byte) 0X0A, - (byte) 0X00, (byte) 0X01, - (byte) 0X00, (byte) 0X6D, - (byte) 0X00, (byte) 0X06, - (byte) indexhigh, (byte) indexlow, - (byte) 0X01, (byte) 0X12, - (byte) phasehigh, (byte) phaselow - }; - break; - case 7: - b = new byte[]{(byte) 0X87, (byte) 0XCD, - (byte) 0X00, (byte) 0X08, - (byte) 0X00, (byte) 0X0A, - (byte) 0X00, (byte) 0X01, - (byte) 0X00, (byte) 0X6D, - (byte) 0X00, (byte) 0X06, - (byte) indexhigh, (byte) indexlow, - (byte) 0X01, (byte) 0X12, - (byte) phasehigh, (byte) phaselow - }; - break; - } - log.info("反馈agv动作数据--index:" + hexToString(indexhigh & 0xFF) + hexToString(indexlow & 0xFF) + ",phase:" + hexToString(phasehigh & 0xFF) + hexToString(phaselow & 0xFF)); - - System.out.println("反馈agv动作数据:" + Bytes2HexString(b)); - return b; - - } - - @LokiLog(type = LokiLogType.AGV) - @Override - public String queryDoorStatus(String device) { - log.info("AGV查询自动门状态,参数:{}", device); - int type = Integer.parseInt(paramService.findByCode(AcsConfig.BUSINESSTYPE).getValue()); - switch (type) { - case 4: - if (StrUtil.equals(paramService.findByCode(AcsConfig.HASOTHERSYSTEM).getValue(), "1")) { - String result = acsToWmsService.queryDoorsStatus().body(); - JSONArray ja = JSONArray.parseArray(result); - log.info("AGV查询自动门状态,反馈:{}", ja.toString()); - return ja.toString(); - } - return null; - default: - if (StrUtil.equals("doors", device)) { - List list = deviceAppService.findDevice(DeviceType.autodoor); - JSONArray ja = new JSONArray(); - for (int i = 0; i < list.size(); i++) { - Device doordevice = deviceAppService.findDeviceByCode(list.get(i).getDevice_code()); - if (ObjectUtil.isEmpty(doordevice)) { - throw new BadRequestException("未找到对应设备"); - } - String mes = null; - - JSONObject jo = JSONObject.parseObject(mes); - ja.add(jo); - } - log.info("AGV查询自动门状态,反馈:{}", ja.toString()); - return ja.toString(); - - } else { - Device doordevice = deviceAppService.findDeviceByCode(device); - if (ObjectUtil.isEmpty(doordevice)) { - throw new BadRequestException("未找到对应设备"); - } - String mes = null; - JSONObject jo = JSONObject.parseObject(mes); - log.info("AGV查询自动门状态,反馈:{}", jo.toString()); - return jo.toString(); - } - } - - } - - /** - * 双工位诺宝车任务 - * - * @param inst - */ - @LokiLog(type = LokiLogType.AGV) - @Override - public void sendAgvTwoInstToNDC(Instruction inst, Instruction inst2) { - String instcode = inst.getLink_num(); - int type = Integer.parseInt(inst.getAgv_inst_type()); - int priority = Integer.parseInt(inst.getPriority()) + 128; - DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); - int startAddress1 = deviceService.queryAddressBydeviceCode(inst.getStart_point_code()); - int putAddress1 = deviceService.queryAddressBydeviceCode(inst.getPut_point_code()); - int nextAddress1 = deviceService.queryAddressBydeviceCode(inst.getNext_point_code()); - int startAddress2 = 0; - int putAddress2 = 0; - int nextAddress2 = 0; - if (ObjectUtil.isNotEmpty(inst2)) { - startAddress2 = deviceService.queryAddressBydeviceCode(inst2.getStart_point_code()); - putAddress2 = deviceService.queryAddressBydeviceCode(inst2.getPut_point_code()); - nextAddress2 = deviceService.queryAddressBydeviceCode(inst2.getNext_point_code()); - } - - - byte ikeyhigh = (byte) IntToHexHigh(Integer.parseInt(instcode)); - byte ikeylow = (byte) IntToHexLow(Integer.parseInt(instcode)); - byte typehigh = (byte) IntToHexHigh(type); - byte typelow = (byte) IntToHexLow(type); - - byte qhd1high = (byte) IntToHexHigh(startAddress1); - byte qhd1low = (byte) IntToHexLow(startAddress1); - - byte qhd2high = (byte) IntToHexHigh(startAddress2); - byte qhd2low = (byte) IntToHexLow(startAddress2); - - byte dld1high = (byte) IntToHexHigh(putAddress1); - byte dld1low = (byte) IntToHexLow(putAddress1); - - byte dld2high = (byte) IntToHexHigh(putAddress2); - byte dld2low = (byte) IntToHexLow(putAddress2); - - byte fhd1high = (byte) IntToHexHigh(nextAddress1); - byte fhd1low = (byte) IntToHexLow(nextAddress1); - - byte fhd2high = (byte) IntToHexHigh(nextAddress2); - byte fhd2low = (byte) IntToHexLow(nextAddress2); - - byte prioritylow = (byte) IntToHexLow(priority); - - String str = "十进制下发:"; - String str1 = "十六进制下发:"; - str1 += "ikey:" + hexToString(ikeyhigh & 0xFF) + hexToString(ikeylow & 0xFF); - - str += "/type:" + (type); - str1 += "/type:" + hexToString(typehigh & 0xFF) + hexToString(typelow & 0xFF); - - str1 += "/qhd1:" + hexToString(qhd1high & 0xFF) + hexToString(qhd1low & 0xFF); - str1 += "/qhd2:" + hexToString(qhd2high & 0xFF) + hexToString(qhd2low & 0xFF); - str1 += "/dld1:" + hexToString(dld1high & 0xFF) + hexToString(dld1low & 0xFF); - - str1 += "/dld2:" + hexToString(dld2high & 0xFF) + hexToString(dld2low & 0xFF); - str1 += "/fhd1:" + hexToString(fhd1high & 0xFF) + hexToString(fhd1low & 0xFF); - str1 += "/fhd2:" + hexToString(fhd2high & 0xFF) + hexToString(fhd2low & 0xFF); - - System.out.println(str); - System.out.println(str1); - - byte[] b = new byte[]{(byte) 0X87, (byte) 0XCD, - (byte) 0X00, (byte) 0X08, - (byte) 0X00, (byte) 0X1A, - (byte) 0X00, (byte) 0X01, - (byte) 0X00, (byte) 0X71, - (byte) 0X00, (byte) 0X16, - (byte) 0X01, (byte) 0X80, - (byte) 0X00, (byte) 0X01, - (byte) ikeyhigh, (byte) ikeylow, - (byte) ikeyhigh, (byte) ikeylow, - (byte) typehigh, (byte) typelow, - - (byte) qhd1high, (byte) qhd1low, - (byte) qhd2high, (byte) qhd2low, - (byte) dld1high, (byte) dld1low, - (byte) dld2high, (byte) dld2low, - (byte) fhd1high, (byte) fhd1low, - (byte) fhd2high, (byte) fhd2low - }; - log.info("下发AGV作业指令--{}", str1); - -// NDCSocketConnectionAutoRun.write(b); - System.out.println("下发agv指令数据:" + Bytes2HexString(b)); - } - @LokiLog(type = LokiLogType.AGV) @Override diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/ZheDaAgvServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/ZheDaAgvServiceImpl.java index 0885e942a..a144cbfc0 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/ZheDaAgvServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/agv/server/impl/ZheDaAgvServiceImpl.java @@ -3,7 +3,6 @@ package org.nl.acs.agv.server.impl; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; @@ -14,7 +13,7 @@ import org.nl.acs.agv.server.ZheDaAgvService; import org.nl.acs.device_driver.basedriver.cargo_lift_conveyor.CargoLiftConveyorDeviceDriver; import org.nl.acs.device_driver.basedriver.empty_vehicle_stacking_position.EmptyVehicleStackingPositionDeviceDriver; import org.nl.acs.device_driver.basedriver.hailiang_smart_plc_test.HailiangSmartplcTestDeviceDriver; -import org.nl.acs.device_driver.basedriver.haokai_auto_conveyor.HaoKaiAutoConveyorDeviceDriver; +import org.nl.acs.device_driver.basedriver.hongxiang_device.HongXiangConveyorDeviceDriver; import org.nl.acs.device_driver.basedriver.paint_conveyor.PaintConveyorDeviceDriver; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.instruction.service.InstructionService; @@ -149,7 +148,7 @@ public class ZheDaAgvServiceImpl implements ZheDaAgvService { CargoLiftConveyorDeviceDriver cargoLiftConveyorDeviceDriver; EmptyVehicleStackingPositionDeviceDriver emptyVehicleStackingPositionDeviceDriver; HailiangSmartplcTestDeviceDriver hailiangSmartplcTestDeviceDriver; - HaoKaiAutoConveyorDeviceDriver haoKaiAutoConveyorDeviceDriver; + HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; PaintConveyorDeviceDriver paintConveyorDeviceDriver; //取货的进入前等待和离开等待 @@ -183,9 +182,9 @@ public class ZheDaAgvServiceImpl implements ZheDaAgvService { } } //豪凯自动线对接位 - if (addressdevice.getDeviceDriver() instanceof HaoKaiAutoConveyorDeviceDriver) { - haoKaiAutoConveyorDeviceDriver = (HaoKaiAutoConveyorDeviceDriver) addressdevice.getDeviceDriver(); - if ((haoKaiAutoConveyorDeviceDriver.getAction() == 1 || haoKaiAutoConveyorDeviceDriver.getAction() == 3) && haoKaiAutoConveyorDeviceDriver.getMove() == 1) { + if (addressdevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { + hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) addressdevice.getDeviceDriver(); + if ((hongXiangConveyorDeviceDriver.getAction() == 1 || hongXiangConveyorDeviceDriver.getAction() == 3) && hongXiangConveyorDeviceDriver.getMove() == 1) { inst.setExecute_status("1"); is_feedback = true; } @@ -221,10 +220,10 @@ public class ZheDaAgvServiceImpl implements ZheDaAgvService { is_feedback = true; } - if (addressdevice.getDeviceDriver() instanceof HaoKaiAutoConveyorDeviceDriver) { - haoKaiAutoConveyorDeviceDriver = (HaoKaiAutoConveyorDeviceDriver) addressdevice.getDeviceDriver(); + if (addressdevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { + hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) addressdevice.getDeviceDriver(); inst.setExecute_status("2"); - haoKaiAutoConveyorDeviceDriver.writing(2); + hongXiangConveyorDeviceDriver.writing(2); is_feedback = true; } @@ -334,9 +333,9 @@ public class ZheDaAgvServiceImpl implements ZheDaAgvService { } } - if (addressdevice.getDeviceDriver() instanceof HaoKaiAutoConveyorDeviceDriver) { - haoKaiAutoConveyorDeviceDriver = (HaoKaiAutoConveyorDeviceDriver) addressdevice.getDeviceDriver(); - if ((haoKaiAutoConveyorDeviceDriver.getAction() == 2 || haoKaiAutoConveyorDeviceDriver.getAction() == 3) && haoKaiAutoConveyorDeviceDriver.getMove() == 0) { + if (addressdevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { + hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) addressdevice.getDeviceDriver(); + if ((hongXiangConveyorDeviceDriver.getAction() == 2 || hongXiangConveyorDeviceDriver.getAction() == 3) && hongXiangConveyorDeviceDriver.getMove() == 0) { inst.setExecute_status("3"); is_feedback = true; } @@ -372,10 +371,10 @@ public class ZheDaAgvServiceImpl implements ZheDaAgvService { is_feedback = true; } - if (addressdevice.getDeviceDriver() instanceof HaoKaiAutoConveyorDeviceDriver) { - haoKaiAutoConveyorDeviceDriver = (HaoKaiAutoConveyorDeviceDriver) addressdevice.getDeviceDriver(); + if (addressdevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { + hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) addressdevice.getDeviceDriver(); inst.setExecute_status("4"); - haoKaiAutoConveyorDeviceDriver.writing(3); + hongXiangConveyorDeviceDriver.writing(3); is_feedback = true; } 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 0749acf2e..a866aa08c 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 @@ -6,6 +6,7 @@ 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.ndcone.AgvNdcOneDeviceDriver; +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; @@ -85,6 +86,7 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); System.out.println("TwoAgv链接成功"); + log.info("TwoAgv链接成功"); while (bConnected) { int count = dis.read(b); @@ -119,66 +121,55 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { int agvaddr = arr[18] * 256 + arr[19]; //车号 int carno = arr[20]; - Instruction link_inst = null; - List insts = null; - boolean link_flag = false; + Instruction inst = null; Device agv_device = null; if (carno != 0) { agv_device = deviceAppService.findDeviceByCode(String.valueOf(carno)); } if (ikey != 0) { - insts = instructionService.findByLinkNum(String.valueOf(ikey)); - } - if (!ObjectUtil.isEmpty(link_inst)) { - link_flag = true; + inst = instructionService.findByCode(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; - // - AgvNdcOneDeviceDriver agvNdcOneDeviceDriver; + AgvNdcTwoDeviceDriver agvNdcTwoDeviceDriver; //开始任务/上报订单号 if (phase == 0x01) { - for (Instruction inst : insts) { inst.setInstruction_status("1"); inst.setAgv_jobno(String.valueOf(index)); inst.setSend_status("1"); instructionService.update(inst); - } - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); } else if (phase == 0x0A) { - for (Instruction inst : insts) { - if (!ObjectUtil.isEmpty(inst)) { - instructionService.finish(inst.getInstruction_id()); - } + if (!ObjectUtil.isEmpty(inst)) { + instructionService.finish(inst.getInstruction_id()); } - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); } else if (phase == 0x30) { - data = NDCAgvService.sendAgvOneModeInst(143, index, 0); + data = NDCAgvService.sendAgvTwoModeInst(143, index, 0); } else if (phase == 0xFF) { - for (Instruction inst : insts) { - if (!ObjectUtil.isEmpty(inst)) { - instructionService.cancelNOSendAgv(inst.getInstruction_id()); - } + if (!ObjectUtil.isEmpty(inst)) { + instructionService.cancelNOSendAgv(inst.getInstruction_id()); } - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); } else if (phase == 0x50) {//离开区域 - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); } else if (phase == 0x51) {//离开区域 - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); } else { @@ -188,8 +179,8 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { device = deviceAppService.findDeviceByCode(Integer.toString(arr[20])); } if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) { - agvNdcOneDeviceDriver = (AgvNdcOneDeviceDriver) device.getDeviceDriver(); - agvNdcOneDeviceDriver.processSocket(arr); + agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) device.getDeviceDriver(); + agvNdcTwoDeviceDriver.processSocket(arr); } } if (!ObjectUtil.isEmpty(data)) { @@ -202,7 +193,7 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } } catch (Exception e) { - System.out.println("OneAgv链接异常"); + System.out.println("TwoAgv链接异常"); if (ObjectUtil.isNotEmpty(s)) { s.close(); } 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 8aea8d07310792f7b2d421b4825c66ddcb13c2de..1c3db516e0eeb180f94b3fb3d8125c1b63eb9290 100644 GIT binary patch delta 55 zcmZozz}v8ZcS8;fTY#J^lk@A%MJ(GGc{mvu^74~%QgbrXN+uh!r8LiAYoEc!2*ga= KXRtA6cme?WLJ_?H delta 56 zcmZozz}v8ZcS8;f+XU?mLRJqp7qM((wM*&aXHku7|30GmMb47TYt6 Lw0#B}bA~4X9CQ*D diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java b/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java index 5a2b620a0..039714dbc 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device/device_driver/DriverTypeEnum.java @@ -23,7 +23,10 @@ public enum DriverTypeEnum { AGV_NDC_ONE(7, "agv_ndc_one", "NDC1楼AGV", "agv"), - AGV_NDC_TWO(8, "agv_ndc_two", "NDC2楼AGV", "agv"); + AGV_NDC_TWO(8, "agv_ndc_two", "NDC2楼AGV", "agv"), + + HONGXIANG_DEVICE(8, "hongxiang_device", "烘箱设备点位", "conveyor"); + //驱动索引 private int index; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device/wql/task_inst.xls b/acs/nladmin-system/src/main/java/org/nl/acs/device/wql/task_inst.xls index 7fe09b48d1bcc5b1a9f5c1b08d3e119786935652..a0dc3dbebeabce08a07ffa584c1a9341fb302b21 100644 GIT binary patch delta 50154 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

=hBtpaea^F`#m)HyK;s^| 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 YT#~El{6f}yD)Vwp*f!Heu37c}0J8_sHUIzs diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndctwo/AgvNdcTwoDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndctwo/AgvNdcTwoDeviceDriver.java index e91fc574c..e470e266e 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndctwo/AgvNdcTwoDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndctwo/AgvNdcTwoDeviceDriver.java @@ -75,31 +75,42 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic agvaddr = arr[18] * 256 + arr[19]; //车号 int carno = arr[20]; - Instruction link_inst = null; - List insts = null; - boolean link_flag = false; + Instruction inst = null; Device agv_device = null; if (carno != 0) { agv_device = deviceAppService.findDeviceByCode(String.valueOf(carno)); } if (ikey != 0) { - insts = instructionService.findByLinkNum(String.valueOf(ikey)); - } - if (!ObjectUtil.isEmpty(link_inst)) { - link_flag = true; + inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); } + Device device = null; String old_device_code = null; String emptyNum = null; String device_code = 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); + if (phase == 0x67) { //故障信息 if (arr[18] * 256 + arr[19] == 0) { } - data = NDCAgvService.sendAgvTwoModeInst(phase, index); + data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); } //普通站点 @@ -109,273 +120,60 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic //开始任务/上报订单号 if (phase == 0x02) { - for (Instruction inst : insts) { - inst.setCarno(String.valueOf(carno)); - instructionService.update(inst); - } + inst.setCarno(String.valueOf(carno)); + instructionService.update(inst); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data); //请求取货 } else if (phase == 0x03) { - if (agvaddr == 0) { - agvaddr = agvaddr_copy; - } - if (agvaddr < 1) { - logServer.deviceExecuteLog(this.device_code, "", "", "agv地址参数有误,phase:" + phase); - return; - } - device_code = deviceService.queryDeviceCodeByAddress(agvaddr); - 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; + //判断普通站点驱动是否开启等待 + if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { + standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); + if (standardOrdinarySiteDeviceDriver.getHasGoods() != 0) { + } } - device = deviceAppService.findDeviceByCode(device_code); - if (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - logServer.deviceExecuteLog(this.device_code, "", "", agvaddr + "对应设备号为空"); - return; - } - for (Instruction inst : insts) { - //校验agv上报站点编号与指令起始点相同 - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到关联编号{}对应的指令", ikey); - logServer.deviceExecuteLog(this.device_code, "", "", "未找到关联编号对应的指令" + ikey); - break; - } - - if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - standardOrdinarySiteDeviceDriver.setAgvphase(phase); - standardOrdinarySiteDeviceDriver.setIndex(index); - standardOrdinarySiteDeviceDriver.setInst(inst); - } - - if (device.getDeviceDriver() instanceof StandardStorageDeviceDriver) { - data = NDCAgvService.sendAgvTwoModeInst(phase, index); - } - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - } } else if (phase == 0x65) {//param,重量待定 //1、得到重量信息 int weight = (arr[18] * 256 + arr[19]) * 10; - for (Instruction inst : insts) { - //校验agv上报站点编号与指令起始点相同 - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到关联编号{}对应的指令", ikey); - break; - } - // 4010 待处理 - if (StrUtil.equals(inst.getStart_device_code(), device_code)) { - inst.setWeight(String.valueOf(weight)); - } - } - data = NDCAgvService.sendAgvTwoModeInst(phase, index); + + data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); //取货完毕/取满框完毕1/点对点取货完毕 } else if (phase == 0x64) {//param,agv货位id待定 - //1、根据货位id找到对应三工位设备,赋给agv属性地址对应的满料位设备 - agvaddr = arr[18] * 256 + arr[19]; - agvaddr_copy = agvaddr; - data = NDCAgvService.sendAgvTwoModeInst(phase, index); - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); //取货完毕 } else if (phase == 0x05) { - if (agvaddr == 0) { - agvaddr = agvaddr_copy; - } - if (agvaddr < 1) { - logServer.deviceExecuteLog(this.device_code, "", "", "agv地址参数有误,phase:" + phase); - return; - } - 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); - if (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - logServer.deviceExecuteLog(this.device_code, "", "", "对应设备号为空" + device_code); - return; - } - for (Instruction inst : insts) { - //校验agv上报站点编号与指令起始点相同 - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到关联编号{}对应的指令", ikey); - logServer.deviceExecuteLog(this.device_code, "", "", "未找到关联编号对应的指令" + ikey); - break; - } - if (StrUtil.equals(inst.getStart_device_code(), device_code)) { - - if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - standardOrdinarySiteDeviceDriver.setAgvphase(phase); - standardOrdinarySiteDeviceDriver.setIndex(index); - standardOrdinarySiteDeviceDriver.setInst(inst); - } - - if (device.getDeviceDriver() instanceof StandardStorageDeviceDriver) { - standardStorageDeviceDriver = (StandardStorageDeviceDriver) device.getDeviceDriver(); - data = NDCAgvService.sendAgvTwoModeInst(phase, index); - } - } - } - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - - //请求放货 } else if (phase == 0x07) { - if (agvaddr == 0) { - agvaddr = agvaddr_copy; - } - if (agvaddr < 1) { - logServer.deviceExecuteLog(this.device_code, "", "", "agv地址参数有误,phase:" + phase); - return; - } - 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); - if (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - for (Instruction inst : insts) { - //校验agv上报站点编号与指令起始点相同 - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到关联编号{}对应的指令", ikey); - break; - } - if (StrUtil.equals(inst.getNext_device_code(), device_code)) { - if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - standardOrdinarySiteDeviceDriver.setAgvphase(phase); - standardOrdinarySiteDeviceDriver.setIndex(index); - standardOrdinarySiteDeviceDriver.setInst(inst); - } - if (device.getDeviceDriver() instanceof StandardStorageDeviceDriver) { - standardStorageDeviceDriver = (StandardStorageDeviceDriver) device.getDeviceDriver(); - data = NDCAgvService.sendAgvTwoModeInst(phase, index); - } - } - } - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - - //放货完成 } else if (phase == 0x09) { - if (agvaddr == 0) { - agvaddr = agvaddr_copy; - } - if (agvaddr < 1) { - logServer.deviceExecuteLog(this.device_code, "", "", "agv地址参数有误,phase:" + phase); - return; - } - 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); - if (ObjectUtil.isEmpty(device_code)) { - log.info(agvaddr + "对应设备号为空!"); - return; - } - for (Instruction inst : insts) { - //校验agv上报站点编号与指令起始点相同 - if (ObjectUtil.isEmpty(inst)) { - log.info("未找到关联编号{}对应的指令", ikey); - break; - } - if (StrUtil.equals(inst.getNext_device_code(), device_code)) { - - if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - standardOrdinarySiteDeviceDriver.setAgvphase(phase); - standardOrdinarySiteDeviceDriver.setIndex(index); - standardOrdinarySiteDeviceDriver.setInst(inst); - } - if (device.getDeviceDriver() instanceof StandardStorageDeviceDriver) { - standardStorageDeviceDriver = (StandardStorageDeviceDriver) device.getDeviceDriver(); - data = NDCAgvService.sendAgvTwoModeInst(phase, index); - } - } - } - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } else if (phase == 0x71) { - x = ikey; - if (x != last_x) { - logServer.deviceExecuteLog(this.device_code, "", "x", String.valueOf(x)); - } + + } else if (phase == 0x72) { - y = ikey; - if (y != last_y) { - logServer.deviceExecuteLog(this.device_code, "", "y", String.valueOf(y)); - } + + } else if (phase == 0x73) { - angle = last_angle; - if (angle != last_angle) { - logServer.deviceExecuteLog(this.device_code, "", "angle", String.valueOf(angle)); - } + + } else if (phase == 0x74) { - electric_qty = ikey; - if (electric_qty != last_electric_qty) { - logServer.deviceExecuteLog(this.device_code, "", "electric_qty", String.valueOf(electric_qty)); - } + + } else if (phase == 0x75) { - status = ikey; - if (status != last_status) { - logServer.deviceExecuteLog(this.device_code, "", "status", String.valueOf(status)); - } + + } else if (phase == 0x76) { - error = ikey; - if (error != last_error) { - logServer.deviceExecuteLog(this.device_code, "", "error", String.valueOf(error)); - } + + } if (!ObjectUtil.isEmpty(data)) { logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/haokai_auto_conveyor/HaoKaiAutoConveyorDefination.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/HongXiangConveyorDefination.java similarity index 73% rename from acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/haokai_auto_conveyor/HaoKaiAutoConveyorDefination.java rename to acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/HongXiangConveyorDefination.java index b9e1141f0..146426552 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/haokai_auto_conveyor/HaoKaiAutoConveyorDefination.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/HongXiangConveyorDefination.java @@ -1,4 +1,4 @@ -package org.nl.acs.device_driver.basedriver.haokai_auto_conveyor; +package org.nl.acs.device_driver.basedriver.hongxiang_device; import org.nl.acs.device.device_driver.standard_inspect.ItemDto; import org.nl.acs.device_driver.DeviceDriver; @@ -14,30 +14,30 @@ import java.util.List; * 豪凯自动对接线 */ @Service -public class HaoKaiAutoConveyorDefination implements OpcDeviceDriverDefination { +public class HongXiangConveyorDefination implements OpcDeviceDriverDefination { @Override public String getDriverCode() { - return "haokai_auto_conveyor"; + return "hongxiang_device"; } @Override public String getDriverName() { - return "豪凯自动线对接位"; + return "烘箱设备对接位"; } @Override public String getDriverDescription() { - return "豪凯自动线对接位"; + return "烘箱设备对接位"; } @Override public DeviceDriver getDriverInstance(Device device) { - return (new HaoKaiAutoConveyorDeviceDriver()).setDevice(device).setDriverDefination(this); + return (new HongXiangConveyorDeviceDriver()).setDevice(device).setDriverDefination(this); } @Override public Class getDeviceDriverType() { - return HaoKaiAutoConveyorDeviceDriver.class; + return HongXiangConveyorDeviceDriver.class; } @Override diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/haokai_auto_conveyor/HaoKaiAutoConveyorDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/HongXiangConveyorDeviceDriver.java similarity index 82% rename from acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/haokai_auto_conveyor/HaoKaiAutoConveyorDeviceDriver.java rename to acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/HongXiangConveyorDeviceDriver.java index 08d53f334..e8cda45db 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/haokai_auto_conveyor/HaoKaiAutoConveyorDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/HongXiangConveyorDeviceDriver.java @@ -1,4 +1,4 @@ -package org.nl.acs.device_driver.basedriver.haokai_auto_conveyor; +package org.nl.acs.device_driver.basedriver.hongxiang_device; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; @@ -34,12 +34,12 @@ import java.util.List; import java.util.Map; /** - * 豪凯自动对接线 + * 烘箱对接位 */ @Slf4j @Data @RequiredArgsConstructor -public class HaoKaiAutoConveyorDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver , DeviceStageMonitor { +public class HongXiangConveyorDeviceDriver extends AbstractOpcDeviceDriver implements DeviceDriver, ExecutableDeviceDriver, RouteableDeviceDriver , DeviceStageMonitor { protected ItemProtocol itemProtocol = new ItemProtocol(this); @Autowired DeviceAppService deviceAppservice = SpringContextHolder.getBean(DeviceAppService.class); @@ -134,48 +134,8 @@ public class HaoKaiAutoConveyorDeviceDriver extends AbstractOpcDeviceDriver impl message = "有报警"; //无报警 } else { - this.setIsonline(true); - this.setIserror(false); - message = ""; - Instruction instruction = null; - List toInstructions; - switch (mode) { - case 1: - log.debug("设备运转模式:等待工作"); - break; - case 2: - //申请任务 - if (move > 0 && !requireSucess) { - message = "申请任务中..."; - JSONObject apply = new JSONObject(); - apply.put("type","8"); - apply.put("point_code",device_code); - String str = acsToWmsService.applyTaskToWms(apply); - JSONObject jo = JSON.parseObject(str); - if (ObjectUtil.isEmpty(jo)) { - message = "接口不通"; - } else { - if (jo.getInteger("status") == 200) { - requireSucess = true; - } else { - requireSucess = false; - message = jo.get("message").toString(); - } - } - } - } - switch (flag) { - //取货完成 - case 1: - writing(2); - break; - //放货完成 - case 2: - writing(3); - break; - } } last_mode = mode; diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/haokai_auto_conveyor/ItemProtocol.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/ItemProtocol.java similarity index 56% rename from acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/haokai_auto_conveyor/ItemProtocol.java rename to acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/ItemProtocol.java index 8478d0d9c..ef8e4cae7 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/haokai_auto_conveyor/ItemProtocol.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/hongxiang_device/ItemProtocol.java @@ -1,4 +1,4 @@ -package org.nl.acs.device_driver.basedriver.haokai_auto_conveyor; +package org.nl.acs.device_driver.basedriver.hongxiang_device; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -16,17 +16,30 @@ public class ItemProtocol { public static String item_move = "move"; public static String item_action = "action"; public static String item_error = "error"; + public static String item_door = "door"; + public static String item_temperature = "temperature"; + //恒温倒计时 + public static String item_countdown = "countdown"; + public static String item_finish = "finish"; public static String item_task = "task"; + public static String item_error1 = "error1"; + public static String item_material = "material"; + public static String item_consumption = "consumption"; + public static String item_voltage = "voltage"; + public static String item_current = "current"; public static String item_to_command = "to_command"; - public static String item_to_target = "to_target"; + public static String item_to_door = "to_door"; + public static String item_to_temperature = "to_temperature"; + public static String item_to_material = "to_material"; + public static String item_to_time = "to_time"; public static String item_to_task = "to_task"; - private HaoKaiAutoConveyorDeviceDriver driver; + private HongXiangConveyorDeviceDriver driver; - public ItemProtocol(HaoKaiAutoConveyorDeviceDriver driver) { + public ItemProtocol(HongXiangConveyorDeviceDriver driver) { this.driver = driver; } @@ -75,7 +88,14 @@ public class ItemProtocol { list.add(new ItemDto(item_move, "光电信号", "VW4")); list.add(new ItemDto(item_action, "取放信号", "VW6")); list.add(new ItemDto(item_error, "故障", "VW8")); - list.add(new ItemDto(item_task, "任务号", "VD10")); + list.add(new ItemDto(item_error1, "故障1", "VW8")); + list.add(new ItemDto(item_door, "门状态", "VW8")); + list.add(new ItemDto(item_temperature, "工位温度", "VW8")); + list.add(new ItemDto(item_countdown, "恒温倒计时", "VW8")); + list.add(new ItemDto(item_finish, "烘干完成", "VW8")); + list.add(new ItemDto(item_consumption, "电能耗", "VD10")); + list.add(new ItemDto(item_voltage, "电压", "VD10")); + list.add(new ItemDto(item_current, "电流", "VD10")); return list; } @@ -83,7 +103,10 @@ public class ItemProtocol { public static List getWriteableItemDtos() { ArrayList list = new ArrayList(); list.add(new ItemDto(item_to_command, "下发命令", "VW102")); - list.add(new ItemDto(item_to_target, "下发目标站", "VW104")); + list.add(new ItemDto(item_to_door, "开关门", "VD108")); + list.add(new ItemDto(item_to_temperature, "生产温度", "VD108")); + list.add(new ItemDto(item_to_material, "生产物料", "VD108")); + list.add(new ItemDto(item_to_time, "生产时间", "VD108")); list.add(new ItemDto(item_to_task, "任务号", "VD108")); return list; } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseRequest.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseRequest.java new file mode 100644 index 000000000..c8b7a318a --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseRequest.java @@ -0,0 +1,47 @@ +package org.nl.acs.ext.wms.data; + +import java.util.HashMap; +import java.util.Map; + + +public class BaseRequest { + private Map parameters = new HashMap(); + private String systemCode; + private String houseCode; + + public String getSystemCode() { + return this.systemCode; + } + + public void setSystemCode(String systemCode) { + this.systemCode = systemCode; + } + + public String getHouseCode() { + return this.houseCode; + } + + public void setHouseCode(String houseCode) { + this.houseCode = houseCode; + } + + public BaseRequest() { + } + + public Map getParameters() { + return this.parameters; + } + + public void setParameters(Map parameters) { + this.parameters = parameters; + } + + public Object getParameter(String key) { + return this.parameters.get(key); + } + + public void putParameter(String key, String object) { + this.parameters.put(key, object); + } +} + diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseResponse.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseResponse.java new file mode 100644 index 000000000..73b65cf19 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/BaseResponse.java @@ -0,0 +1,47 @@ +package org.nl.acs.ext.wms.data; + +import java.util.HashMap; +import java.util.Map; + +public class BaseResponse { + + private Integer status = 0; + private String message; + private Map parameters = new HashMap(); + + public BaseResponse() { + } + + public Integer getstatus() { + return this.status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getMessage() { + return this.message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Map getParameters() { + return this.parameters; + } + + public void setParameters(Map parameters) { + this.parameters = parameters; + } + + public Object getParameter(String key) { + return this.parameters.get(key); + } + + public void putParameter(String key, String object) { + this.parameters.put(key, object); + } + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskRequest.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskRequest.java new file mode 100644 index 000000000..8d4de1521 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskRequest.java @@ -0,0 +1,18 @@ +package org.nl.acs.ext.wms.data; + +import lombok.Data; + +@Data +public class CreateTaskRequest extends BaseRequest { + + /** + * 设备号 + */ + private String deviceCode; + + /** + * 容器码 + */ + private String containerCode; + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskResponse.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskResponse.java new file mode 100644 index 000000000..40a391887 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/CreateTaskResponse.java @@ -0,0 +1,6 @@ +package org.nl.acs.ext.wms.data; + +public class CreateTaskResponse extends BaseResponse { + + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/JsonUtl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/JsonUtl.java new file mode 100644 index 000000000..2e1875af8 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/JsonUtl.java @@ -0,0 +1,127 @@ +package org.nl.acs.ext.wms.data; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.type.TypeFactory; + +import java.io.IOException; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class JsonUtl { + private static ObjectMapper objectMapper = null; + private static ObjectMapper objectMapperLog = null; + + private JsonUtl() { + } + + private static ObjectMapper init() { + ObjectMapper objectMapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule(); +// simpleModule.addSerializer(Enum.class, new EnumSerializer()); +// simpleModule.addSerializer(Date.class, new DateSerializer()); +// simpleModule.addDeserializer(Enum.class, new EnumDeserializer()); +// simpleModule.addDeserializer(Date.class, new DateDeserializers.DateDeserializer()); + objectMapper.registerModule(simpleModule); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + return objectMapper; + } + + public static ObjectMapper getInstance() { + if (objectMapper == null) { + Class var0 = JsonUtl.class; + synchronized(JsonUtl.class) { + if (objectMapper == null) { + objectMapper = init(); + } + } + } + + return objectMapper; + } + + public static ObjectMapper getInstanceLog() { + if (objectMapperLog == null) { + Class var0 = JsonUtl.class; + synchronized(JsonUtl.class) { + if (objectMapperLog == null) { + objectMapperLog = init(); + objectMapperLog.setSerializationInclusion(JsonInclude.Include.NON_NULL); + } + } + } + + return objectMapperLog; + } + + public static ObjectMapper getObjectMapper() { + return getInstance(); + } + + public static String parse(Object object) throws RuntimeException { + try { + return getObjectMapper().writeValueAsString(object); + } catch (JsonProcessingException var2) { + throw new RuntimeException(var2); + } + } + + public static String parseWithoutException(Object object) { + try { + return parse(object); + } catch (Exception var2) { + return null; + } + } + + public static String parseLog(Object object) { + try { + return getInstanceLog().writeValueAsString(object); + } catch (Exception var2) { + return null; + } + } + + public static T format(String json, Class clazz) throws RuntimeException { + try { + return getObjectMapper().readValue(json, clazz); + } catch (IOException var3) { + throw new RuntimeException(var3); + } + } + + public static List formatList(String json, Class clazz) throws RuntimeException { + try { + JavaType type = getObjectMapper().getTypeFactory().constructParametricType(List.class, new Class[]{clazz}); + return (List)getObjectMapper().readValue(json, type); + } catch (IOException var3) { + throw new RuntimeException(var3); + } + } + + public static Map formatMap(String json, Class clazzKey, Class clazzValue) throws RuntimeException { + try { + JavaType type = getObjectMapper().getTypeFactory().constructParametricType(Map.class, new Class[]{clazzKey, clazzValue}); + return (Map)getObjectMapper().readValue(json, type); + } catch (IOException var4) { + throw new RuntimeException(var4); + } + } + + public static List> formatListTwo(String json, Class clazz) throws RuntimeException { + try { + TypeFactory typeFactory = getObjectMapper().getTypeFactory(); + JavaType type = typeFactory.constructParametrizedType(List.class, List.class, new Class[]{clazz}); + type = typeFactory.constructParametrizedType(List.class, List.class, new JavaType[]{type}); + return (List)getObjectMapper().readValue(json, type); + } catch (IOException var4) { + throw new RuntimeException(var4); + } + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java index 769893ef7..b9680bd19 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/WmsToAcsController.java @@ -8,6 +8,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.nl.acs.ext.wms.data.CreateTaskResponse; import org.nl.acs.ext.wms.service.WmsToAcsService; import org.nl.modules.logging.annotation.Log; import org.springframework.http.HttpStatus; @@ -79,4 +80,13 @@ public class WmsToAcsController { return new ResponseEntity<>(wmstoacsService.queryDeviceDBValue(whereJson), HttpStatus.OK); } + @SaIgnore + @PostMapping("/createtask") + @Log("11") + @ApiOperation("11") + public ResponseEntity task(@RequestBody String whereJson){ + return new ResponseEntity<>(wmstoacsService.crateTask(whereJson), HttpStatus.OK); + } + + } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java index f9e634758..0ef28e704 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java @@ -3,6 +3,7 @@ package org.nl.acs.ext.wms.service; import com.alibaba.fastjson.JSONObject; +import org.nl.acs.ext.wms.data.CreateTaskResponse; import java.util.Map; @@ -62,4 +63,6 @@ public interface WmsToAcsService { */ Map queryDeviceDBValue(String whereJson); + CreateTaskResponse crateTask(String whereJson); + } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java index 3c6856bbc..ee0aa31da 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java @@ -12,6 +12,9 @@ import org.nl.acs.device.service.DeviceService; import org.nl.acs.device_driver.basedriver.cargo_lift_conveyor.CargoLiftConveyorDeviceDriver; import org.nl.acs.device_driver.basedriver.empty_vehicle_stacking_position.EmptyVehicleStackingPositionDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_scanner.StandardCoveyorControlWithScannerDeviceDriver; +import org.nl.acs.ext.wms.data.CreateTaskRequest; +import org.nl.acs.ext.wms.data.CreateTaskResponse; +import org.nl.acs.ext.wms.data.JsonUtl; import org.nl.acs.ext.wms.service.WmsToAcsService; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.dto.Instruction; @@ -59,8 +62,9 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { String task_code = task.getString("task_code"); String start_point_code = task.getString("start_device_code"); String next_point_code = task.getString("next_device_code"); - String is_send = task.getString("is_send"); - String link_num = task.getString("link_num"); + String start_point_code2 = task.getString("start_device_code2"); + String next_point_code2 = task.getString("next_device_code2"); + String put_point_code = task.getString("put_device_code"); String start_device_code = ""; String next_device_code = ""; if (StrUtil.isEmpty(task_code)) { @@ -131,8 +135,6 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { jo.put("start_device_code", start_device_code); jo.put("next_device_code", next_device_code); jo.put("priority", priority); - jo.put("is_send", is_send); - jo.put("link_num", link_num); jo.put("vehicle_code", vehicle_code); jo.put("vehicle_type", vehicle_type); jo.put("remark", remark); @@ -372,4 +374,17 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { return resultJson; } + @Override + public CreateTaskResponse crateTask(String json) { + JSONArray datas = JSONArray.parseArray(json); + + CreateTaskResponse response = new CreateTaskResponse(); + CreateTaskRequest request = JsonUtl.format(json, CreateTaskRequest.class); + String containerCode = request.getContainerCode(); + response.setStatus(200); + response.setMessage("success"); + return response; + } + + } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java index fa8a5fd08..b3fc00495 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/InstructionService.java @@ -101,13 +101,6 @@ public interface InstructionService { */ void create(Instruction dto) throws Exception; - /** - * 创建双工任务 - * - * @param dto / - */ - void createTwoInst(Instruction dto, Instruction dto2) throws Exception; - /** * 再次创建 * diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/InstructionDto.java b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/InstructionDto.java index 2cfaedf5e..5a6f57416 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/InstructionDto.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/service/dto/InstructionDto.java @@ -113,6 +113,26 @@ public class InstructionDto implements Serializable { */ private String next_device_code; + /** + * 起始点位编码2 + */ + private String start_point_code2; + + /** + * 起始设备编码2 + */ + private String start_device_code2; + + /** + * 目标点位编码2 + */ + private String next_point_code2; + + /** + * 目标设备编码2 + */ + private String next_device_code2; + /** * 放货点位编码 */ @@ -138,6 +158,21 @@ public class InstructionDto implements Serializable { */ private String from_z; + /** + * 排2 + */ + private String from_x2; + + /** + * 列2 + */ + private String from_y2; + + /** + * 层2 + */ + private String from_z2; + /** * 排 */ @@ -169,6 +204,22 @@ public class InstructionDto implements Serializable { */ private String to_z; + /** + * 排2 + */ + private String to_x2; + + /** + * 列2 + */ + private String to_y2; + + /** + * 层2 + */ + private String to_z2; + + /** * 最后一条指令标识 */ @@ -271,6 +322,12 @@ public class InstructionDto implements Serializable { */ private String agv_jobno; + + /** + * agv指令类型(NDC系统使用) + */ + private String agv_inst_type; + /** * 下发agv状态 0未下发 1成功 2失败 */ @@ -291,8 +348,4 @@ public class InstructionDto implements Serializable { */ private String agv_system_type; - /** - * AGV指令类型 - */ - private String agv_inst_type; } 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 3ec7feed6..081d3f8b2 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 @@ -18,7 +18,7 @@ import org.nl.acs.auto.initial.ApplicationAutoInitial; import org.nl.acs.device.service.DeviceService; import org.nl.acs.device.service.impl.DeviceServiceImpl; import org.nl.acs.device_driver.basedriver.cargo_lift_conveyor.CargoLiftConveyorDeviceDriver; -import org.nl.acs.device_driver.basedriver.haokai_auto_conveyor.HaoKaiAutoConveyorDeviceDriver; +import org.nl.acs.device_driver.basedriver.hongxiang_device.HongXiangConveyorDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_conveyor_control_with_scanner.StandardCoveyorControlWithScannerDeviceDriver; import org.nl.acs.device_driver.basedriver.standard_inspect_site.StandardInspectSiteDeviceDriver; import org.nl.acs.instruction.service.InstructionService; @@ -38,7 +38,6 @@ import org.nl.modules.system.service.ParamService; import org.nl.modules.system.util.CodeUtil; import org.nl.modules.wql.WQL; import org.nl.modules.wql.core.bean.WQLObject; -import org.nl.modules.wql.exception.WDKException; import org.nl.modules.wql.util.SpringContextHolder; import org.nl.modules.wql.util.WqlUtil; import org.springframework.beans.factory.annotation.Autowired; @@ -67,7 +66,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu DeviceAppService deviceAppService; @Autowired NDCAgvService ndcAgvService; - @Autowired + @Autowired ParamService paramService; @Autowired RouteLineService routeLineService; @@ -290,7 +289,7 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu dto.setStart_parent_code(task.getStart_parent_code()); dto.setNext_parent_code(task.getNext_parent_code()); - if(ObjectUtil.isNotEmpty(task.getTask_type())){ + if (ObjectUtil.isNotEmpty(task.getTask_type())) { dto.setInstruction_type(task.getTask_type()); } @@ -299,26 +298,26 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu Device nextdevice = appService.findDeviceByCode(dto.getNext_device_code()); CargoLiftConveyorDeviceDriver cargoLiftConveyorDeviceDriver; - HaoKaiAutoConveyorDeviceDriver haoKaiAutoConveyorDeviceDriver; + HongXiangConveyorDeviceDriver hongXiangConveyorDeviceDriver; StandardCoveyorControlWithScannerDeviceDriver standardCoveyorControlWithScannerDeviceDriver; //输送线相关需要给任务字段进行赋值,通过任务来判断输送线当前执行到哪一步 if (startdevice.getDeviceDriver() instanceof CargoLiftConveyorDeviceDriver) { cargoLiftConveyorDeviceDriver = (CargoLiftConveyorDeviceDriver) startdevice.getDeviceDriver(); cargoLiftConveyorDeviceDriver.writing(3, Integer.valueOf(dto.getInstruction_code())); - if (nextdevice.getDeviceDriver() instanceof StandardCoveyorControlWithScannerDeviceDriver){ + if (nextdevice.getDeviceDriver() instanceof StandardCoveyorControlWithScannerDeviceDriver) { standardCoveyorControlWithScannerDeviceDriver = (StandardCoveyorControlWithScannerDeviceDriver) nextdevice.getDeviceDriver(); - standardCoveyorControlWithScannerDeviceDriver.writing(1,1); + standardCoveyorControlWithScannerDeviceDriver.writing(1, 1); String address = standardCoveyorControlWithScannerDeviceDriver.getExtraValue().get("address").toString(); - if (StrUtil.isEmpty(address)){ - throw new BadRequestException("设备:"+nextdevice.getDevice_code()+"未设置电气调度号!"); + if (StrUtil.isEmpty(address)) { + throw new BadRequestException("设备:" + nextdevice.getDevice_code() + "未设置电气调度号!"); } String door = standardCoveyorControlWithScannerDeviceDriver.getExtraValue().get("door").toString(); - if (StrUtil.isEmpty(door)){ - throw new BadRequestException("设备:"+nextdevice.getDevice_code()+"未设置门!"); + if (StrUtil.isEmpty(door)) { + throw new BadRequestException("设备:" + nextdevice.getDevice_code() + "未设置门!"); } String floor = standardCoveyorControlWithScannerDeviceDriver.getExtraValue().get("floor").toString(); - if (StrUtil.isEmpty(floor)){ - throw new BadRequestException("设备:"+nextdevice.getDevice_code()+"未设置楼层!"); + if (StrUtil.isEmpty(floor)) { + throw new BadRequestException("设备:" + nextdevice.getDevice_code() + "未设置楼层!"); } standardCoveyorControlWithScannerDeviceDriver.writing(2, Integer.parseInt(address)); standardCoveyorControlWithScannerDeviceDriver.writing(3, Integer.parseInt(task_code)); @@ -329,20 +328,20 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu if (startdevice.getDeviceDriver() instanceof StandardCoveyorControlWithScannerDeviceDriver) { standardCoveyorControlWithScannerDeviceDriver = (StandardCoveyorControlWithScannerDeviceDriver) startdevice.getDeviceDriver(); standardCoveyorControlWithScannerDeviceDriver.writing(3, Integer.valueOf(dto.getInstruction_code())); - if (nextdevice.getDeviceDriver() instanceof CargoLiftConveyorDeviceDriver){ + if (nextdevice.getDeviceDriver() instanceof CargoLiftConveyorDeviceDriver) { cargoLiftConveyorDeviceDriver = (CargoLiftConveyorDeviceDriver) nextdevice.getDeviceDriver(); - cargoLiftConveyorDeviceDriver.writing(1,1); + cargoLiftConveyorDeviceDriver.writing(1, 1); String address = cargoLiftConveyorDeviceDriver.getExtraValue().get("address").toString(); - if (StrUtil.isEmpty(address)){ - throw new BadRequestException("设备:"+nextdevice.getDevice_code()+"未设置电气调度号!"); + if (StrUtil.isEmpty(address)) { + throw new BadRequestException("设备:" + nextdevice.getDevice_code() + "未设置电气调度号!"); } String door = cargoLiftConveyorDeviceDriver.getExtraValue().get("door").toString(); - if (StrUtil.isEmpty(door)){ - throw new BadRequestException("设备:"+nextdevice.getDevice_code()+"未设置门!"); + if (StrUtil.isEmpty(door)) { + throw new BadRequestException("设备:" + nextdevice.getDevice_code() + "未设置门!"); } String floor = cargoLiftConveyorDeviceDriver.getExtraValue().get("floor").toString(); - if (StrUtil.isEmpty(floor)){ - throw new BadRequestException("设备:"+nextdevice.getDevice_code()+"未设置楼层!"); + if (StrUtil.isEmpty(floor)) { + throw new BadRequestException("设备:" + nextdevice.getDevice_code() + "未设置楼层!"); } cargoLiftConveyorDeviceDriver.writing(2, Integer.parseInt(address)); cargoLiftConveyorDeviceDriver.writing(3, Integer.parseInt(task_code)); @@ -350,9 +349,9 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu cargoLiftConveyorDeviceDriver.writing(5, Integer.parseInt(floor)); } } - if (startdevice.getDeviceDriver() instanceof HaoKaiAutoConveyorDeviceDriver) { - haoKaiAutoConveyorDeviceDriver = (HaoKaiAutoConveyorDeviceDriver) startdevice.getDeviceDriver(); - haoKaiAutoConveyorDeviceDriver.writing(3, Integer.valueOf(dto.getInstruction_code())); + if (startdevice.getDeviceDriver() instanceof HongXiangConveyorDeviceDriver) { + hongXiangConveyorDeviceDriver = (HongXiangConveyorDeviceDriver) startdevice.getDeviceDriver(); + hongXiangConveyorDeviceDriver.writing(3, Integer.valueOf(dto.getInstruction_code())); } try { @@ -365,12 +364,12 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu RouteLineDto routeLineDto = shortPathsList.get(i); String route_device = routeLineDto.getDevice_code(); String route_next_device = routeLineDto.getNext_device_code(); - if (route_device.equals(dto.getStart_device_code()) && route_next_device.equals(dto.getNext_device_code())){ + if (route_device.equals(dto.getStart_device_code()) && route_next_device.equals(dto.getNext_device_code())) { route = routeLineDto; break; } } - if (ObjectUtil.isEmpty(route)){ + if (ObjectUtil.isEmpty(route)) { throw new BadRequestException("未查询到相关路由!"); } if (StrUtil.equals(route.getType(), "1")) { @@ -395,149 +394,6 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu instructions.add(dto); } - @Override - public void createTwoInst(Instruction dto, Instruction dto2) throws Exception { - WQLObject instwo = WQLObject.getWQLObject("acs_instruction"); - if (ObjectUtils.isNotEmpty(dto)) { - dto = foramte(dto); - String task_code = dto.getTask_code(); - TaskDto task = taskService.findByCodeFromCache(task_code); - String excutetype = null; - String currentUsername = SecurityUtils.getCurrentUsername(); - String now = DateUtil.now(); - if (StrUtil.isEmpty(dto.getRoute_plan_code())) { - dto.setRoute_plan_code(task.getRoute_plan_code()); - } - if (StrUtil.isEmpty(dto.getPriority())) { - dto.setPriority(task.getPriority()); - } - if (StrUtil.isEmpty(dto.getInstruction_code())) { - dto.setInstruction_code(CodeUtil.getNewCode("INSTRUCT_NO")); - } - if (StrUtil.isEmpty(dto.getInstruction_id())) { - dto.setInstruction_id(IdUtil.simpleUUID()); - } - JSONObject instcheckjson = instwo.query(" instruction_status <2 and next_point_code= '" + dto.getNext_point_code() + "'" + " and start_point_code = '" + dto.getStart_point_code() + "'" + " and task_id = '" + dto.getTask_id() + "'").uniqueResult(0); - if (instcheckjson != null) { - throw new Exception(dto.getTask_code() + ":该任务已存在待完成指令!"); - } - if (!StrUtil.isEmpty(dto.getVehicle_code())) { - Instruction inst_dto = this.findByContainer(dto.getVehicle_code()); - if (ObjectUtils.isNotEmpty(inst_dto) && !StrUtil.equals(inst_dto.getTask_id(), dto.getTask_id())) { - throw new WDKException("已存在该载具号的指令!"); - } - } - //起点设备与终点设备相同则为初始指令 - if (StrUtil.equals(task.getStart_device_code(), dto.getStart_device_code())) { - if (!StrUtil.equals(dto.getCompound_inst(), "0") && StrUtil.equals(task.getCompound_task(), "1")) { - dto.setCompound_inst("1"); - dto.setCompound_inst_data(task.getCompound_task_data()); - } - } - - dto.setCreate_by(currentUsername); - dto.setUpdate_by(currentUsername); - dto.setUpdate_time(now); - dto.setCreate_time(now); - dto.setStart_parent_code(task.getStart_parent_code()); - dto.setNext_parent_code(task.getNext_parent_code()); - } - - if (ObjectUtils.isNotEmpty(dto2)) { - dto2 = foramte(dto2); - String task_code2 = dto2.getTask_code(); - TaskDto task2 = taskService.findByCodeFromCache(task_code2); - String excutetype2 = null; - WQLObject instwo2 = WQLObject.getWQLObject("acs_instruction"); - String currentUsername2 = SecurityUtils.getCurrentUsername(); - String now2 = DateUtil.now(); - if (StrUtil.isEmpty(dto2.getRoute_plan_code())) { - dto2.setRoute_plan_code(task2.getRoute_plan_code()); - } - if (StrUtil.isEmpty(dto2.getPriority())) { - dto2.setPriority(task2.getPriority()); - } - if (StrUtil.isEmpty(dto2.getInstruction_code())) { - dto2.setInstruction_code(CodeUtil.getNewCode("INSTRUCT_NO")); - } - if (StrUtil.isEmpty(dto2.getInstruction_id())) { - dto2.setInstruction_id(IdUtil.simpleUUID()); - } - JSONObject instcheckjson2 = instwo.query(" instruction_status <2 and next_point_code= '" + dto.getNext_point_code() + "'" + " and start_point_code = '" + dto.getStart_point_code() + "'" + " and task_id = '" + dto.getTask_id() + "'").uniqueResult(0); - if (instcheckjson2 != null) { - throw new Exception(dto.getTask_code() + ":该任务已存在待完成指令!"); - } - if (!StrUtil.isEmpty(dto2.getVehicle_code())) { - Instruction inst_dto2 = this.findByContainer(dto2.getVehicle_code()); - if (ObjectUtils.isNotEmpty(inst_dto2) && !StrUtil.equals(inst_dto2.getTask_id(), dto2.getTask_id())) { - throw new WDKException("已存在该载具号的指令!"); - } - } - //起点设备与终点设备相同则为初始指令 - if (StrUtil.equals(task2.getStart_device_code(), dto2.getStart_device_code())) { - if (!StrUtil.equals(dto2.getCompound_inst(), "0") && StrUtil.equals(task2.getCompound_task(), "1")) { - dto2.setCompound_inst("1"); - dto2.setCompound_inst_data(task2.getCompound_task_data()); - } - } - - dto2.setCreate_by(currentUsername2); - dto2.setUpdate_by(currentUsername2); - dto2.setUpdate_time(now2); - dto2.setCreate_time(now2); - dto2.setStart_parent_code(task2.getStart_parent_code()); - dto2.setNext_parent_code(task2.getNext_parent_code()); - } - - - try { - // != 0 为agv任务 - if (StrUtil.equals(paramService.findByCode(AcsConfig.AGVTYPE).getValue(), "2")) { - - if (StrUtil.equals("1", dto.getInstruction_type())) { - ndcAgvService.sendAgvTwoInstToNDC(dto, dto2); - dto.setSend_status("1"); - dto2.setSend_status("1"); - } else if (StrUtil.equals("2", dto.getInstruction_type())) { - dto.setSend_status("1"); - ndcAgvService.sendAgvTwoInstToNDC(dto, null); - } else if (StrUtil.equals("3", dto.getInstruction_type())) { - - } else if (StrUtil.equals("4", dto.getInstruction_type())) { - - } else if (StrUtil.equals("5", dto.getInstruction_type())) { - - } else if (StrUtil.equals("6", dto.getInstruction_type())) { - dto.setSend_status("1"); - ndcAgvService.sendAgvOneInstToNDC(dto); - } else if (StrUtil.equals("7", dto.getInstruction_type())) { - ndcAgvService.sendAgvOneInstToNDC(dto); - dto.setSend_status("1"); - } else if (StrUtil.equals("8", dto.getInstruction_type())) { - dto.setSend_status("1"); - ndcAgvService.sendAgvOneInstToNDC(dto); - } - - } - } catch (Exception e) { - if (ObjectUtil.isNotEmpty(dto)) { - dto.setSend_status("2"); - } - if (ObjectUtil.isNotEmpty(dto2)) { - dto2.setSend_status("2"); - } - e.printStackTrace(); - } - - WQLObject wo = WQLObject.getWQLObject("acs_instruction"); - JSONObject json = (JSONObject) JSONObject.toJSON(dto); - JSONObject json2 = (JSONObject) JSONObject.toJSON(dto2); - wo.insert(json); - wo.insert(json2); - instructions.add(dto); - instructions.add(dto2); - } - @Override @Transactional(rollbackFor = Exception.class) diff --git a/acs/nladmin-ui/src/views/acs/device/config.vue b/acs/nladmin-ui/src/views/acs/device/config.vue index 4c4908c50..9f716add4 100644 --- a/acs/nladmin-ui/src/views/acs/device/config.vue +++ b/acs/nladmin-ui/src/views/acs/device/config.vue @@ -82,11 +82,11 @@ import standard_conveyor_control from '@/views/acs/device/driver/standard_convey import standard_conveyor_monitor from '@/views/acs/device/driver/standard_conveyor_monitor' import hailiang_smart_plc_test from '@/views/acs/device/driver/hailiang_smart_plc_test' import paint_conveyor from '@/views/acs/device/driver/paint_conveyor' -import haokai_auto_conveyor from '@/views/acs/device/driver/haokai_auto_conveyor' import cargo_lift_conveyor from '@/views/acs/device/driver/cargo_lift_conveyor' import empty_vehicle_stacking_position from '@/views/acs/device/driver/empty_vehicle_stacking_position' import agv_ndc_one from '@/views/acs/device/driver/agv/agv_ndc_one' import agv_ndc_two from '@/views/acs/device/driver/agv/agv_ndc_two' +import hongxiang_device from '@/views/acs/device/driver/hongxiang_device' export default { name: 'DeviceConfig', @@ -100,11 +100,11 @@ export default { standard_conveyor_monitor, hailiang_smart_plc_test, paint_conveyor, - haokai_auto_conveyor, cargo_lift_conveyor, empty_vehicle_stacking_position, agv_ndc_two, - agv_ndc_one + agv_ndc_one, + hongxiang_device }, dicts: ['device_type'], mixins: [crud], diff --git a/acs/nladmin-ui/src/views/acs/device/driver/haokai_auto_conveyor.vue b/acs/nladmin-ui/src/views/acs/device/driver/hongxiang_device.vue similarity index 92% rename from acs/nladmin-ui/src/views/acs/device/driver/haokai_auto_conveyor.vue rename to acs/nladmin-ui/src/views/acs/device/driver/hongxiang_device.vue index 78fca7129..efcaa092d 100644 --- a/acs/nladmin-ui/src/views/acs/device/driver/haokai_auto_conveyor.vue +++ b/acs/nladmin-ui/src/views/acs/device/driver/hongxiang_device.vue @@ -1,5 +1,5 @@