From 37dc4606bc3c1ce8d9071ffe2238bc42dc925bdc Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Sat, 26 Nov 2022 18:14:13 +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 --- .../src/main/java/org/nl/acs/AcsConfig.java | 10 +- .../org/nl/acs/agv/server/NDCAgvService.java | 2 +- .../agv/server/impl/NDCAgvServiceImpl.java | 15 +- .../run/OneNDCSocketConnectionAutoRun.java | 4 +- ...va => TwoNDC2SocketConnectionAutoRun.java} | 28 +- .../run/TwoNDCSocketConnectionAutoRun.java | 133 +++++----- .../java/org/nl/acs/device/wql/task_inst.xls | Bin 194048 -> 194560 bytes .../agv/ndctwo/AgvNdcTwoDeviceDriver.java | 251 ++++++++++++++++-- .../data/ApplyLabelingAndBindingRequest.java | 10 + .../data/ApplyLabelingAndBindingResponse.java | 9 + .../acs/ext/wms/data/CreateTaskRequest.java | 16 ++ .../ext/wms/data/LiKuApplyTakResponse.java | 9 + .../ext/wms/data/LiKuApplyTaskRequest.java | 9 + .../acs/ext/wms/rest/AcsToWmsController.java | 16 ++ .../acs/ext/wms/service/AcsToWmsService.java | 14 + .../acs/ext/wms/service/WmsToAcsService.java | 6 + .../wms/service/impl/AcsToWmsServiceImpl.java | 56 ++++ .../wms/service/impl/WmsToAcsServiceImpl.java | 7 + .../service/impl/InstructionServiceImpl.java | 12 +- .../org/nl/acs/task/service/dto/TaskDto.java | 80 +++--- .../task/service/impl/TaskServiceImpl.java | 37 ++- .../modules/quartz/task/AutoCreateInst.java | 62 ++++- .../quartz/task/NdcAutoReconnection.java | 34 +++ .../src/views/acs/instruction/index.vue | 6 +- acs/nladmin-ui/src/views/acs/task/index.vue | 63 ++++- 25 files changed, 721 insertions(+), 168 deletions(-) rename acs/nladmin-system/src/main/java/org/nl/acs/auto/run/{NDCSocketConnectionAutoRun.java => TwoNDC2SocketConnectionAutoRun.java} (92%) create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingRequest.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingResponse.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTakResponse.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTaskRequest.java create mode 100644 acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/NdcAutoReconnection.java diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/AcsConfig.java b/acs/nladmin-system/src/main/java/org/nl/acs/AcsConfig.java index 6b05bc564..8d3d47fac 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/AcsConfig.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/AcsConfig.java @@ -14,14 +14,18 @@ public interface AcsConfig { String CREATETASKCHECK = "createTaskCheck"; //撤销任务检查 String CANCELTASKCHECK = "cancelTaskCheck"; - //二楼agv系统接口地址 - String AGVURL2 = "agvurl2"; //一楼agv系统接口地址 String AGVURL = "agvurl"; //AGV系统端口 String AGVPORT = "agvport"; - //二楼AGV系统端口 + //二楼1区agv系统接口地址 + String AGVURL2 = "agvurl2"; + //二楼1区AGV系统端口 String AGVPORT2 = "agvport2"; + //二楼2区agv系统接口地址 + String AGVURL22 = "agvurl22"; + //二楼2区AGV系统端口 + String AGVPORT22 = "agvport22"; //指定AGV系统 String AGVTYPE = "agvType"; //WMS系统接口地址 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 26deb1dc2..42960b7ff 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 @@ -27,7 +27,7 @@ public interface NDCAgvService { * @param inst * @throws Exception */ - public void sendAgvInstToNDC(String type,Instruction inst) throws Exception; + public void sendAgvInstToNDC(String agv_system_type,Instruction inst) throws Exception; public byte[] sendAgvOneModeInst(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 e642fa914..566b9d962 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 @@ -10,6 +10,7 @@ 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; @@ -80,9 +81,9 @@ public class NDCAgvServiceImpl implements NDCAgvService { @LokiLog(type = LokiLogType.AGV) @Override - public void sendAgvInstToNDC(String agv_type, Instruction inst) { + public void sendAgvInstToNDC(String agv_system_type, Instruction inst) { if (StrUtil.equals(paramService.findByCode(AcsConfig.FORKAGV).getValue(), "1")) { - if (StrUtil.equals(agv_type, "1")) { + if (!StrUtil.equals(agv_system_type, "1")) { String instcode = inst.getInstruction_code(); int type = Integer.parseInt(inst.getAgv_inst_type()); int priority = Integer.parseInt(inst.getPriority()) + 128; @@ -183,7 +184,11 @@ public class NDCAgvServiceImpl implements NDCAgvService { }; } log.info("下发AGV作业指令--{}", str1); - OneNDCSocketConnectionAutoRun.write(b); + if (StrUtil.equals(agv_system_type,"2")){ + TwoNDCSocketConnectionAutoRun.write(b); + } else if (StrUtil.equals(agv_system_type,"3")){ + TwoNDC2SocketConnectionAutoRun.write(b); + } System.out.println("下发agv指令数据:" + Bytes2HexString(b)); } else { @@ -239,11 +244,9 @@ public class NDCAgvServiceImpl implements NDCAgvService { (byte) fhdhigh, (byte) fhdlow }; log.info("下发AGV作业指令--{}", str1); - TwoNDCSocketConnectionAutoRun.write(b); + OneNDCSocketConnectionAutoRun.write(b); System.out.println("下发agv指令数据:" + Bytes2HexString(b)); } - - } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java index f84f92106..6e176c00a 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java @@ -67,7 +67,7 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } public void autoRun() throws IOException { - System.out.println("OneAgv链接开始"); + System.out.println("1楼NDCAgv链接开始"); ParamService ParamService = SpringContextHolder.getBean(ParamServiceImpl.class); InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); @@ -83,7 +83,7 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { s = new Socket(ip, port); dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); - System.out.println("OneAgv链接成功"); + System.out.println("1楼NDCAgv链接成功"); while (bConnected) { int count = dis.read(b); diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/NDCSocketConnectionAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java similarity index 92% rename from acs/nladmin-system/src/main/java/org/nl/acs/auto/run/NDCSocketConnectionAutoRun.java rename to acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java index c2ca0223a..2b57b3488 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/NDCSocketConnectionAutoRun.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/TwoNDC2SocketConnectionAutoRun.java @@ -2,14 +2,10 @@ package org.nl.acs.auto.run; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; 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.ndcone.AgvNdcOneDeviceDriver; -import org.nl.acs.device_driver.basedriver.agv.ndctwo.AgvNdcTwoDefination; 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; @@ -32,12 +28,13 @@ import java.util.Date; import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString; + @Slf4j @Component -public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { +public class TwoNDC2SocketConnectionAutoRun extends AbstractAutoRunnable { Socket s; - String ip = "127.0.0.1"; + String ip = "192.168.46.225"; int port = 1234; static DataOutputStream dos; static DataInputStream dis; @@ -51,38 +48,39 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { boolean isReConnect = false; - + @Autowired + ParamService paramService; @Autowired AutoRunService autoRunService; - public NDCSocketConnectionAutoRun() { + public TwoNDC2SocketConnectionAutoRun() { this.recordTime = new Date((new Date()).getTime() - (long) this.recordTimeOut); } public String getCode() { - return NDCSocketConnectionAutoRun.class.getSimpleName(); + return TwoNDC2SocketConnectionAutoRun.class.getSimpleName(); } public String getName() { - return "NDC在线连接"; + return "2楼2区域AGV系统"; } public void autoRun() { try { - System.out.println("OneAgv链接开始"); + 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.AGVURL).getValue(); - port = Integer.parseInt(paramService.findByCode(AcsConfig.AGVPORT).getValue()); + 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("Agv链接成功"); + System.out.println("2楼2区域AGV链接成功"); dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); @@ -157,7 +155,7 @@ public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { } flag = true; } - //任务完毕 + //任务完毕 //(无车id及状态) else if (phase == 0x14) { if (ObjectUtil.isEmpty(inst)) { 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 a866aa08c..f63dcc685 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 @@ -1,6 +1,7 @@ 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; @@ -64,29 +65,27 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } public String getName() { - return "2楼NDC在线连接"; + return "2楼1区域AGV系统"; } - public void autoRun() throws IOException { - System.out.println("OneAgv链接开始"); - 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.AGVURL2).getValue(); - port = Integer.parseInt(paramService.findByCode(AcsConfig.AGVPORT2).getValue()); - + public void autoRun() { try { - - byte[] b = new byte[1024]; + System.out.println("2楼1区域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.AGVURL2).getValue(); + port = Integer.parseInt(paramService.findByCode(AcsConfig.AGVPORT2).getValue()); + byte[] b = new byte[1028]; s = new Socket(ip, port); + System.out.println("2楼1区域Agv链接成功"); dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); - System.out.println("TwoAgv链接成功"); - log.info("TwoAgv链接成功"); + while (bConnected) { int count = dis.read(b); @@ -106,7 +105,7 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { bs.append(temp < 16 ? bs1.append(Integer.toHexString(temp)) : Integer.toHexString(temp)); } - //System.out.println("收到请求参数:" + bs); + System.out.println("收到请求参数:" + bs); boolean flag = false; if (arr[8] * 256 + arr[9] == 0x73) { byte[] data = null; @@ -122,63 +121,80 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { //车号 int carno = arr[20]; Instruction inst = null; - Device agv_device = null; - if (carno != 0) { - agv_device = deviceAppService.findDeviceByCode(String.valueOf(carno)); - } if (ikey != 0) { - inst = instructionService.findByCode(String.valueOf(ikey)); + 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); - - - } else if (phase == 0x0A) { - - if (!ObjectUtil.isEmpty(inst)) { - instructionService.finish(inst.getInstruction_id()); + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); } - data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); - - } else if (phase == 0x30) { - data = NDCAgvService.sendAgvTwoModeInst(143, index, 0); - - } else if (phase == 0xFF) { - - if (!ObjectUtil.isEmpty(inst)) { - instructionService.cancelNOSendAgv(inst.getInstruction_id()); + flag = true; + } + //任务完毕 + //(无车id及状态) + else if (phase == 0x14) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + break; } - data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); - - } else if (phase == 0x50) {//离开区域 - data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); - - } else if (phase == 0x51) {//离开区域 - - data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); - + 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.cancel(inst.getInstruction_id()); + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); } else { - - if (phase == 0x67) { + //上报异常信息 + //(不需要WCS反馈) + if(phase == 0x67){ device = deviceAppService.findDeviceByCode(Integer.toString(arr[27])); } else { device = deviceAppService.findDeviceByCode(Integer.toString(arr[20])); } - if (device.getDeviceDriver() instanceof AgvNdcOneDeviceDriver) { + if (device.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) device.getDeviceDriver(); agvNdcTwoDeviceDriver.processSocket(arr); } @@ -188,17 +204,12 @@ public class TwoNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } } else { -// System.out.println("agv上报不是0073类型动作,不处理"); + System.out.println("agv上报不是0073类型动作,不处理"); } } } catch (Exception e) { - System.out.println("TwoAgv链接异常"); - if (ObjectUtil.isNotEmpty(s)) { - s.close(); - } - System.out.println(e.getMessage()); - e.printStackTrace(); + } finally { 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 a0dc3dbebeabce08a07ffa584c1a9341fb302b21..17313e14e8c9a1c82b6edb192e6365786aa202d3 100644 GIT binary patch delta 9462 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

FHa& z`_hu^P)jvmwWX0)Q~6<5CnL|uGw|eLxxALxo;=>KGh%q>bn8W*iDGzvWbUfy$?M58 z*KRz~^PD^8GY73IVv(LaW8aCL4lH&5+g)=ghbIfW>F&)PY-wNCKGNOW#XE-g*QK}J zz4_kC7@p9ZRev;ooXA_zv-K`1g7;L_jmPmW@sfHCfeWf&vf!?K2uR2+slGTbTm3)* zbV$yPl!9Zvr}bY5o|G`MnSx2y3nNO`b+^V2f}-r=ytp#68H~k_cP3D)qHLuM@mp9T zvGrO)zN4xr$J4K<30$5Yr~fotg`KkS=CkK*=g)!;kLBzljtlB$s)fhOZB!Pq%-Lkc z-61M*KstN?RZSWxs=o`Qc(vvC=iokK-sc=H7k4uO!{an5rLo4b`dl*)H`HkmONscD zs1GF)bf-#*myqx2LU}$(teuOCTN`RXZ%V}V0TOL8=NSvR`o5IE3Cxg(ix?Dw9>iWy z09{5~fYU9bA54}?rE;lKaa|e?LM~SeBFc?;f>f$hO$nAqfHYVdtnHPNjz3=H87G=D zQo;GjP$ADC9KAfkT$mG_3uUy7_GcIcd*|=b4Bqu;ZqE;tUWel>WCP%~%92h*ygH#QoWvU1% zolNCa?xY7Aa!Rx3l~zC!5FZd&DHxQRU@R>%^_>oGgs*{A+~lmWmO>GjKw;$)PL?!Y z87bH4VrAhvsXBp3HQaDDaKoi?l@!!kWxO;lPDxx+ap6o(PtCB++)G7S)>vKMYXFTO zZoyP?g-#KNyCSVBJ{-3Jv^+do78g5D6%CQv1gTQ3(ovDKRl`jBQd0(~Bh}HW3{44? z#N%clW1taovkNoQaJh#JU3sp)P#rN-YR#q85&H7H*?9u*J`EBpG)3sd3*bU~j~NkE z);zyK7S~PWgjO+BpP!=3GnhGsp$)ctFVHpA8Di@d@NSjWZTA4VGEx>bJ8^u?`|oFDl^TuajH>Eb+t3DGf-XKWEk|u_OVKOa;>uENF70hBj8V~%(>#^fc^=VE z*zFe;uhU8)PALnIi&RRf@T^>2xJ9j&%OE^jrBErA+LE|9h0Lno>&KB7gE6O2UueiT zH!YM8kJDvz4sDi+{n~+hEcoi0!T}n>c98^f0oLE2T%TxXY{s}& z9Zh?z;h=zZE#hqH;d^5F4YB;H_#;-dh;t&Y9sRSzTGb7)>Z+LKEn>^nX7QcUYho9= z*Uk|utE94i;JK4n-_pam(wSe&!2KXseu~?(NA)=T8WP^?%fMidjiIsl*-SsEYgFWo zz_pQA10$!nM_Sy$()kuZmlc!U@AG5bv!~v4D4X2Qk|%sw3%`Y5E&fl}jxGGs?#d@( zENxbcyGnCLafgxTCOVl1&co@YWkzY)Kwr|f;ol)B&KN-jHetOWal3G1y@sCs@ zJ3+GZVFsnT+&^|_|2opfntP*z+jIQJlZfrfj@tufM)iIu^e=Ke$7kM|HhN)Zfo5sm z7e|J;k3IMt9}!lepj$MWX(dPIXLMbC=sBL%ZRoYWLyrzg+ID`W^89M@{_}#Zq5J9= z<=AwN--gcE*(2QlIc}VK=4wFY^}(}4OdHm9-Cp+`k21Kgn>g8Zz$VwE`TMwQ(rvfD zr+kD{NICGyVw=Yv(%m=(4w%Bu2=Z>wXZ&Drm$axxnc@fBG zI@QHE8qQHeDema<>n^szKU1_#^)ux~h2O9Z{F!<}z&83PD!`Hd3;xN6I#y~cJWpN2 z5ZgvxpypHJ7TeVeR0P#yjLp9ZS0#mwX`(_n#&Vghu8De^8Ui-|W-0=m^lzrRac2LO zYAb7|Mx(vsbThS@B6A%Tm#Ax;FtWs-#)I#wAXP7w5LSC@LdW*91{tp=Ljt2k$ delta 9261 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 Cmw+$; 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 ec0265186..2756307c3 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 @@ -6,7 +6,8 @@ import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.acs.agv.server.NDCAgvService; -import org.nl.acs.auto.run.NDCSocketConnectionAutoRun; +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_driver.DeviceDriver; import org.nl.acs.device_driver.basedriver.standard_ordinary_site.StandardOrdinarySiteDeviceDriver; @@ -109,6 +110,34 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic //到达取货点 //(Itype=1/2/3,需要WCS反馈Phase) 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; + } + } + + device = deviceAppService.findDeviceByCode(device_code); + if (ObjectUtil.isEmpty(device_code)) { + log.info(agvaddr + "对应设备号为空!"); + logServer.deviceExecuteLog(this.device_code, "", "", agvaddr + "对应设备号为空"); + return; + } if (ObjectUtil.isEmpty(inst)) { log.info("未找到指令号{}对应的指令", ikey); return; @@ -119,6 +148,33 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic // 取货完毕 //(Itype=1/2/3,需要WCS反馈Phase) 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; + } if (ObjectUtil.isEmpty(inst)) { log.info("未找到指令号{}对应的指令", ikey); return; @@ -128,12 +184,37 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic } //到达取货点(Itype=1、3,需要WCS反馈) else if (phase == 0x08) { + 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; + } if (ObjectUtil.isEmpty(inst)) { log.info("未找到指令号{}对应的指令", ikey); return; } - String instruction_type = inst.getInstruction_type(); - if (StrUtil.equals(instruction_type, "1") || StrUtil.equals(instruction_type, "3")) { + String agv_inst_type = inst.getAgv_inst_type(); + if (StrUtil.equals(agv_inst_type, "1") || StrUtil.equals(agv_inst_type, "3")) { data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } @@ -141,12 +222,38 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic // 取货完毕 //(Itype=1、3,需要WCS反馈) else if (phase == 0x0A) { + 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; + } if (ObjectUtil.isEmpty(inst)) { log.info("未找到指令号{}对应的指令", ikey); return; } - String instruction_type = inst.getInstruction_type(); - if (StrUtil.equals(instruction_type, "1") || StrUtil.equals(instruction_type, "3")) { + String agv_inst_type = inst.getAgv_inst_type(); + if (StrUtil.equals(agv_inst_type, "1") || StrUtil.equals(agv_inst_type, "3")) { data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } @@ -161,9 +268,9 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic String instruction_type = inst.getInstruction_type(); //上传称重数据 if (StrUtil.equals(instruction_type, "1")) { - weight = arr[18] * 256 + arr[19]; - inst.setWeight(String.valueOf(weight)); - instructionService.update(inst); + weight = agvaddr; +// inst.setWeight(String.valueOf(weight)); +// instructionService.update(inst); data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } @@ -171,6 +278,32 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic // 到达放货点 //(Itype=1/2/3,需要WCS反馈) else if (phase == 0x0C) { + 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; + } if (ObjectUtil.isEmpty(inst)) { log.info("未找到指令号{}对应的指令", ikey); return; @@ -181,6 +314,32 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic //放货完成 //(Itype=1/2/3,需要WCS反馈) else if (phase == 0x0E) { + 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; + } if (ObjectUtil.isEmpty(inst)) { log.info("未找到指令号{}对应的指令", ikey); return; @@ -191,12 +350,38 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic //到达放货点 //(Itype=1、3,需要WCS反馈) else if (phase == 0x10) { + 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; + } if (ObjectUtil.isEmpty(inst)) { log.info("未找到指令号{}对应的指令", ikey); return; } - String instruction_type = inst.getInstruction_type(); - if (StrUtil.equals(instruction_type, "1") || StrUtil.equals(instruction_type, "3")) { + String agv_inst_type = inst.getAgv_inst_type(); + if (StrUtil.equals(agv_inst_type, "1") || StrUtil.equals(agv_inst_type, "3")) { data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } @@ -204,17 +389,43 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic //放货完成 //(Itype=1、3,需要WCS反馈) else if (phase == 0x12) { + 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; + } if (ObjectUtil.isEmpty(inst)) { log.info("未找到指令号{}对应的指令", ikey); return; } - String instruction_type = inst.getInstruction_type(); - if (StrUtil.equals(instruction_type, "1") || StrUtil.equals(instruction_type, "3")) { + String agv_inst_type = inst.getAgv_inst_type(); + if (StrUtil.equals(agv_inst_type, "1") || StrUtil.equals(agv_inst_type, "3")) { data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } } - //上传AGV电量 + //上传AGV电量 else if (phase == 0x73) { if (ObjectUtil.isEmpty(inst)) { log.info("未找到指令号{}对应的指令", ikey); @@ -230,7 +441,7 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic log.info("未找到指令号{}对应的指令", ikey); return; } - region = arr[18] * 256 + arr[19]; + region = agvaddr; data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); @@ -241,23 +452,27 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic log.info("未找到指令号{}对应的指令", ikey); return; } - region = arr[18] * 256 + arr[19]; + region = agvaddr; data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } //上报异常信息 //(不需要WCS反馈) - else if (phase == 0x67) { + else if (phase == 0x67) { //故障信息 - if (arr[18] * 256 + arr[19] == 0) { + if (agvaddr == 0) { } logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } if (!ObjectUtil.isEmpty(data)) { logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - NDCSocketConnectionAutoRun.write(data); + if (StrUtil.equals(inst.getAgv_system_type(), "2")) { + TwoNDCSocketConnectionAutoRun.write(data); + } else if (StrUtil.equals(inst.getAgv_system_type(), "3")) { + TwoNDC2SocketConnectionAutoRun.write(data); + } } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingRequest.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingRequest.java new file mode 100644 index 000000000..922ede6ea --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingRequest.java @@ -0,0 +1,10 @@ +package org.nl.acs.ext.wms.data; + +import lombok.Data; + +@Data +public class ApplyLabelingAndBindingRequest extends BaseRequest { + private String ext_task_id; + private String device_code; + private String type; +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingResponse.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingResponse.java new file mode 100644 index 000000000..e60e5cd1e --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/ApplyLabelingAndBindingResponse.java @@ -0,0 +1,9 @@ +package org.nl.acs.ext.wms.data; + +import lombok.Data; + +@Data +public class ApplyLabelingAndBindingResponse extends BaseResponse { + + +} 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 index 6539d55ac..63558eedb 100644 --- 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 @@ -64,15 +64,31 @@ public class CreateTaskRequest extends BaseRequest { String route_plan_code; /** + * 1、生箔; + * 2、分切 + * 3、普通任务 + * 4、叉车任务 + * 5、输送任务 + * 6、行架 + * 7、立库 * 任务类型 */ String task_type; + /** + * Agv系统类型 + * 1:1楼叉车系统 + * 2:2楼1区域AGV系统 + * 3:2楼2区域AGV系统 + */ + String agv_system_type; + /** * 备注 */ String remark; + /** * 扩展属性 */ diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTakResponse.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTakResponse.java new file mode 100644 index 000000000..738554887 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTakResponse.java @@ -0,0 +1,9 @@ +package org.nl.acs.ext.wms.data; + +import lombok.Data; + +@Data +public class LiKuApplyTakResponse extends BaseResponse { + + +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTaskRequest.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTaskRequest.java new file mode 100644 index 000000000..5eca19538 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/data/LiKuApplyTaskRequest.java @@ -0,0 +1,9 @@ +package org.nl.acs.ext.wms.data; + +import lombok.Data; + +@Data +public class LiKuApplyTaskRequest extends BaseRequest { + private String vehicle_code; + private String device_code; +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java index 84a7905e5..252ec2c48 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/rest/AcsToWmsController.java @@ -8,6 +8,8 @@ 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.ApplyLabelingAndBindingRequest; +import org.nl.acs.ext.wms.data.LiKuApplyTaskRequest; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.modules.logging.annotation.Log; import org.springframework.http.HttpStatus; @@ -95,4 +97,18 @@ public class AcsToWmsController { public ResponseEntity applyOutCacheLineTask(@RequestBody JSONObject param) { return new ResponseEntity<>(acstowmsService.applyOutCacheLineTask(param), HttpStatus.OK); } + + @PostMapping("/applyLabelingAndBindingRequest") + @Log("ACS系统申请贴标、捆扎") + @ApiOperation("ACS系统申请贴标、捆扎") + public ResponseEntity applyLabelingAndBindingRequest(@RequestBody ApplyLabelingAndBindingRequest param) { + return new ResponseEntity<>(acstowmsService.applyLabelingAndBindingRequest(param), HttpStatus.OK); + } + + @PostMapping("/liKuApplyTaskRequest") + @Log("立库申请任务") + @ApiOperation("立库申请任务") + public ResponseEntity liKuApplyTaskRequest(@RequestBody LiKuApplyTaskRequest param) { + return new ResponseEntity<>(acstowmsService.liKuApplyTaskRequest(param), HttpStatus.OK); + } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java index 6c2487f44..62be37d4c 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/AcsToWmsService.java @@ -3,6 +3,10 @@ package org.nl.acs.ext.wms.service; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingRequest; +import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingResponse; +import org.nl.acs.ext.wms.data.LiKuApplyTakResponse; +import org.nl.acs.ext.wms.data.LiKuApplyTaskRequest; import java.util.Map; @@ -122,4 +126,14 @@ public interface AcsToWmsService { * @return */ HttpResponse applyOutCacheLineTask(JSONObject param); + + /** + * ACS系统申请出库任务 + * + * @param param + * @return + */ + ApplyLabelingAndBindingResponse applyLabelingAndBindingRequest(ApplyLabelingAndBindingRequest param); + + LiKuApplyTakResponse liKuApplyTaskRequest(LiKuApplyTaskRequest liKuApplyTaskRequest); } 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 bffafd9b7..ddc576d6d 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 @@ -66,6 +66,12 @@ public interface WmsToAcsService { + /** + * ACS系统在获取空的托盘号 + * @param whereJson + * @return + */ + Map querydevice(String whereJson); } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java index a69b67356..18b695bf1 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/ext/wms/service/impl/AcsToWmsServiceImpl.java @@ -12,6 +12,10 @@ import org.nl.acs.AcsConfig; import org.nl.acs.device.address.service.AddressService; import org.nl.acs.device.address.service.dto.AddressDto; import org.nl.acs.device.service.DeviceService; +import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingRequest; +import org.nl.acs.ext.wms.data.ApplyLabelingAndBindingResponse; +import org.nl.acs.ext.wms.data.LiKuApplyTakResponse; +import org.nl.acs.ext.wms.data.LiKuApplyTaskRequest; import org.nl.acs.ext.wms.service.AcsToWmsService; import org.nl.acs.log.service.DeviceExecuteLogService; import org.nl.acs.task.service.TaskService; @@ -521,4 +525,56 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { return null; } + @Override + public ApplyLabelingAndBindingResponse applyLabelingAndBindingRequest(ApplyLabelingAndBindingRequest param) { + ApplyLabelingAndBindingResponse applyLabelingAndBindingResponse = new ApplyLabelingAndBindingResponse(); + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + AddressDto addressDto = addressService.findByCode("applyLabelingAndBinding"); + String methods_url = addressDto.getMethods_url(); + String url = wmsUrl + methods_url; + log.info("ApplyLabelingAndBindingRequest----请求参数{}", param); + try { + String result = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + JSONObject jsonObject = JSONObject.parseObject(result); + log.info("ApplyLabelingAndBindingResponse----返回参数{}", result); + applyLabelingAndBindingResponse = JSONObject.toJavaObject(jsonObject, ApplyLabelingAndBindingResponse.class); + } catch (Exception e) { + JSONObject map = new JSONObject(); + map.put("status", 400); + map.put("message", e.getMessage()); + return JSONObject.toJavaObject(map, ApplyLabelingAndBindingResponse.class); + } + } + return applyLabelingAndBindingResponse; + } + + @Override + public LiKuApplyTakResponse liKuApplyTaskRequest(LiKuApplyTaskRequest param) { + LiKuApplyTakResponse liKuApplyTakResponse = new LiKuApplyTakResponse(); + if (StrUtil.equals(paramService.findByCode(AcsConfig.HASWMS).getValue(), "1")) { + String wmsUrl = paramService.findByCode(AcsConfig.WMSURL).getValue(); + AddressDto addressDto = addressService.findByCode("liKuApplyTask"); + String methods_url = addressDto.getMethods_url(); + String url = wmsUrl + methods_url; + log.info("LiKuApplyTaskRequest----请求参数{}", param); + try { + String result = HttpRequest.post(url) + .body(String.valueOf(param)) + .execute().body(); + JSONObject jsonObject = JSONObject.parseObject(result); + log.info("LiKuApplyTakResponse----返回参数{}", result); + liKuApplyTakResponse = JSONObject.toJavaObject(jsonObject, LiKuApplyTakResponse.class); + } catch (Exception e) { + JSONObject map = new JSONObject(); + map.put("status", 400); + map.put("message", e.getMessage()); + return JSONObject.toJavaObject(map, LiKuApplyTakResponse.class); + } + } + return liKuApplyTakResponse; + } + } 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 e5efa1774..d26f95fa6 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 @@ -247,6 +247,11 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { return resultJson; } + @Override + public Map querydevice(String whereJson) { + return null; + } + @Override public CreateTaskResponse crateTask(String param) { JSONArray datas = JSONArray.parseArray(param); @@ -267,6 +272,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { String vehicle_type = request.getVehicle_type(); String route_plan_code = request.getRoute_plan_code(); String task_type = request.getTask_type(); + String agv_system_type = request.getAgv_system_type(); String remark = request.getRemark(); Map params = request.getParams(); @@ -374,6 +380,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { jo.put("priority", priority); jo.put("vehicle_code", vehicle_code); jo.put("vehicle_type", vehicle_type); + jo.put("agv_system_type", agv_system_type); jo.put("remark", remark); jo.put("params", params); jo.put("task_type", StrUtil.isEmpty(task_type) ? 1 : Integer.parseInt(task_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 e035ab86f..c80d93248 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 @@ -383,14 +383,10 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu if (ObjectUtil.isEmpty(route)) { throw new BadRequestException("未查询到相关路由!"); } - if (StrUtil.equals(route.getType(), "1")) { - ZheDaAgvService zheDaAgvService = SpringContextHolder.getBean(ZheDaAgvService.class); - HttpResponse result = zheDaAgvService.sendAgvInstToAgv(dto); - if (ObjectUtils.isEmpty(result) || result.getStatus() != 200) { - dto.setSend_status("2"); - } else { - dto.setSend_status("1"); - } + String agvType = paramService.findByCode("agvType").getValue(); + if (StrUtil.equals(agvType, "2")) { + NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); + ndcAgvService.sendAgvInstToNDC(task.getAgv_system_type(),dto); } } catch (Exception e) { 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 0ad35a8db..e99b38691 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 @@ -48,22 +48,37 @@ public class TaskDto implements Serializable { private String task_status; /** - * 任务优先级 + * 复合任务 */ - private String priority; + private String compound_task; + /** + * 复合任务数据 + */ + private String compound_task_data; + /** + * 再次请求 + */ + private String request_again; + private String request_again_success; /** * 关联编号 */ private String link_num; - /** * 是否立刻下发 */ private String is_send; + private String material; + private String quantity; + /** + * 任务优先级 + */ + private String priority; + /** * 创建类型 */ @@ -84,6 +99,7 @@ public class TaskDto implements Serializable { */ private String execute_message; + /** * 起始点位编码 */ @@ -94,6 +110,26 @@ public class TaskDto implements Serializable { */ private String start_device_code; + /** + * 放货点位编码 + */ + private String put_point_code; + + /** + * 放货设备编码 + */ + private String put_device_code; + + /** + * 起始点位编码 + */ + private String start_point_code2; + + /** + * 起始设备编码 + */ + private String start_device_code2; + /** * 目标点位编码 */ @@ -105,14 +141,15 @@ public class TaskDto implements Serializable { private String next_device_code; /** - * 放货点位编码 + * 目标点位编码 */ - private String put_point_code; + private String next_point_code2; /** - * 放货设备编码 + * 目标设备编码 */ - private String put_device_code; + private String next_device_code2; + /** * 排 @@ -210,15 +247,6 @@ public class TaskDto implements Serializable { */ private String update_time; - /** - * 物料类型 - */ - private String material; - - /** - * 物料数量 - */ - private String quantity = "0"; /** * 物料重量 @@ -226,26 +254,6 @@ public class TaskDto implements Serializable { private String weight; - /** - * 是否复合任务 - */ - private String compound_task; - - /** - * 复合任务数据 - */ - private String compound_task_data; - - /** - * 是否再次请求 - */ - private String request_again = "0"; - - /** - * 再次请求成功 - */ - private String request_again_success; - /** * 空盘数量 =1 则从最上方取 */ 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 8bf5c9a5f..cde2bd67c 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 @@ -335,6 +335,8 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { dto.setTask_code(task_code); dto.setRoute_plan_code(route_plan_code); dto.setTask_status("0"); + dto.setStart_device_code2(dto.getStart_point_code2()); + dto.setNext_device_code2(dto.getNext_point_code2()); if (StrUtil.isEmpty(dto.getPriority())) { dto.setPriority("1"); @@ -845,7 +847,10 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { String compound_task = acsTask.getCompound_task(); String next_point_code = acsTask.getNext_point_code(); String next_device_code = acsTask.getNext_device_code(); - + String start_point_code2 = acsTask.getStart_point_code2(); + String next_point_code2 = acsTask.getNext_point_code2(); + String agv_system_type = acsTask.getAgv_system_type(); + String task_type = acsTask.getTask_type(); /** * 开始平均分解校验 */ @@ -876,7 +881,7 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { } Instruction instdto = new Instruction(); - instdto.setInstruction_type(acsTask.getTask_type()); + instdto.setInstruction_type(task_type); instdto.setInstruction_id(IdUtil.simpleUUID()); instdto.setRoute_plan_code(route_plan_code); instdto.setRemark(acsTask.getRemark()); @@ -896,6 +901,34 @@ public class TaskServiceImpl implements TaskService, ApplicationAutoInitial { instdto.setInstruction_status("0"); instdto.setExecute_device_code(start_point_code); instdto.setVehicle_type(vehicleType); + instdto.setStart_point_code2(start_point_code2); + instdto.setStart_device_code2(start_point_code2); + instdto.setNext_device_code2(next_point_code2); + instdto.setNext_point_code2(next_point_code2); + instdto.setAgv_system_type(agv_system_type); + //判断agv系统 + //1、1楼叉车系统 + //2、2楼1区域AGV系统 + //3、2楼2区域AGV系统 + if (!StrUtil.equals(agv_system_type, "1")) { + // task_type + //1、生箔; Itype=1:取空,取满,放空,放满; + //2、分切 Itype=3取满、取空、放满、放空; + //3、普通任务 Itype=2:取货、放货; + //4、叉车任务 + //5、输送任务 + //6、行架 + //7、立库 + if (StrUtil.equals(task_type, "1")) { + instdto.setAgv_inst_type("1"); + } else if (StrUtil.equals(task_type, "3")) { + instdto.setAgv_inst_type("2"); + } else if (StrUtil.equals(task_type, "2")) { + instdto.setAgv_inst_type("3"); + } + } else { + instdto.setAgv_inst_type("4"); + } instructionservice.create(instdto); } diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java index be68a1756..7a098bfb3 100644 --- a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java +++ b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/AutoCreateInst.java @@ -41,24 +41,36 @@ public class AutoCreateInst { TaskDto acsTask = list.get(i); String taskid = acsTask.getTask_id(); String taskcode = acsTask.getTask_code(); + String task_type = acsTask.getTask_type(); String vehiclecode = acsTask.getVehicle_code(); String priority = acsTask.getPriority(); String is_send = acsTask.getIs_send(); + String start_device_code = acsTask.getStart_device_code(); - String next_device_code = acsTask.getNext_device_code(); - String start_point_code = acsTask.getStart_point_code(); - String put_point_code = acsTask.getPut_point_code(); - String put_device_code = acsTask.getPut_device_code(); - String route_plan_code = acsTask.getRoute_plan_code(); - String vehicleType = acsTask.getVehicle_type(); + String put_device_code = acsTask.getPut_device_code(); + String put_point_code = acsTask.getPut_point_code(); + + String next_device_code = acsTask.getNext_device_code(); String next_point_code = acsTask.getNext_point_code(); - if(StrUtil.equals(is_send,"0")){ + String start_point_code2 = acsTask.getStart_point_code2(); + String start_device_code2 = acsTask.getStart_device_code2(); + + String next_point_code2 = acsTask.getNext_point_code2(); + String next_device_code2 = acsTask.getNext_device_code2(); + + + String route_plan_code = acsTask.getRoute_plan_code(); + String vehicleType = acsTask.getVehicle_type(); + String agv_system_type = acsTask.getAgv_system_type(); + + + if (StrUtil.equals(is_send, "0")) { continue; } - if(StrUtil.equals(acsTask.getTask_type(),"1") || StrUtil.equals(acsTask.getTask_type(),"2")){ + if (StrUtil.equals(task_type, "1") || StrUtil.equals(task_type, "2")) { //校验路由关系 List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); if (ObjectUtils.isEmpty(shortPathsList)) { @@ -93,7 +105,7 @@ public class AutoCreateInst { } Instruction instdto = new Instruction(); - instdto.setInstruction_type(acsTask.getTask_type()); + instdto.setInstruction_type(task_type); instdto.setInstruction_id(IdUtil.simpleUUID()); instdto.setRoute_plan_code(route_plan_code); instdto.setRemark(acsTask.getRemark()); @@ -105,16 +117,48 @@ public class AutoCreateInst { String now = DateUtil.now(); instdto.setCreate_time(now); instdto.setCreate_by("auto"); + instdto.setStart_device_code(start_device_code); instdto.setStart_point_code(start_point_code); instdto.setPut_device_code(put_device_code); instdto.setPut_point_code(put_point_code); instdto.setNext_device_code(next_device_code); instdto.setNext_point_code(next_point_code); + + instdto.setStart_point_code2(start_point_code2); + instdto.setStart_device_code2(start_device_code2); + instdto.setNext_point_code2(next_point_code2); + instdto.setNext_device_code2(next_device_code2); + instdto.setPriority(priority); instdto.setInstruction_status("0"); instdto.setExecute_device_code(start_point_code); instdto.setVehicle_type(vehicleType); + instdto.setAgv_system_type(agv_system_type); + //判断agv系统 + //1、1楼叉车系统 + //2、2楼1区域AGV系统 + //3、2楼2区域AGV系统 + if (!StrUtil.equals(agv_system_type, "1")) { + // task_type + //1、生箔; Itype=1:取空,取满,放空,放满; + //2、分切 Itype=3取满、取空、放满、放空; + //3、普通任务 Itype=2:取货、放货; + //4、叉车任务 + //5、输送任务 + //6、行架 + //7、立库 + if (StrUtil.equals(task_type, "1")) { + instdto.setAgv_inst_type("1"); + } else if (StrUtil.equals(task_type, "3")) { + instdto.setAgv_inst_type("2"); + } else if (StrUtil.equals(task_type, "2")) { + instdto.setAgv_inst_type("3"); + } + } else { + instdto.setAgv_inst_type("4"); + } + try { instructionService.create(instdto); } catch (Exception e) { diff --git a/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/NdcAutoReconnection.java b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/NdcAutoReconnection.java new file mode 100644 index 000000000..9acab50f7 --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/modules/quartz/task/NdcAutoReconnection.java @@ -0,0 +1,34 @@ +package org.nl.modules.quartz.task; + +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.AcsConfig; +import org.nl.acs.auto.run.AutoRunService; +import org.nl.modules.system.service.ParamService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * NDC自动重连 + */ +@Slf4j +@Component +public class NdcAutoReconnection { + + @Autowired + ParamService paramService; + + @Autowired + AutoRunService autoRunService; + + public void run(String threadCode) throws Exception { + if (StrUtil.equals(paramService.findByCode(AcsConfig.NDC_RECONNECTION).getValue().toString(), "1")) { + String[] threadCodes = threadCode.split(","); + for (String code : threadCodes) { + if (!autoRunService.getThreadByCode(code).isAlive()) { + autoRunService.startThread(code); + } + } + } + } +} diff --git a/acs/nladmin-ui/src/views/acs/instruction/index.vue b/acs/nladmin-ui/src/views/acs/instruction/index.vue index 8d57de0ef..c32b007f9 100644 --- a/acs/nladmin-ui/src/views/acs/instruction/index.vue +++ b/acs/nladmin-ui/src/views/acs/instruction/index.vue @@ -127,9 +127,11 @@ 失败 - + - + + + --> - - + + - + + +