From bd2d06c497611bbc0d4ec220432f834decd8ccf8 Mon Sep 17 00:00:00 2001 From: gengby <858962040@qq.com> Date: Fri, 25 Nov 2022 17:51:57 +0800 Subject: [PATCH] NDC --- .../auto/run/NDCSocketConnectionAutoRun.java | 245 ++++++++++++++++++ .../run/OneNDCSocketConnectionAutoRun.java | 32 +-- .../agv/ndcone/AgvNdcOneDeviceDriver.java | 86 ++---- .../agv/ndctwo/AgvNdcTwoDeviceDriver.java | 232 +++++++++++------ .../rest/InstructionController.java | 8 + .../service/InstructionService.java | 7 + .../service/impl/InstructionServiceImpl.java | 54 ++++ .../src/api/acs/instruction/instruction.js | 10 +- .../src/views/acs/instruction/index.vue | 12 + 9 files changed, 527 insertions(+), 159 deletions(-) create mode 100644 acs/nladmin-system/src/main/java/org/nl/acs/auto/run/NDCSocketConnectionAutoRun.java 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/NDCSocketConnectionAutoRun.java new file mode 100644 index 000000000..c2ca0223a --- /dev/null +++ b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/NDCSocketConnectionAutoRun.java @@ -0,0 +1,245 @@ +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; +import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.instruction.service.dto.Instruction; +import org.nl.acs.instruction.service.impl.InstructionServiceImpl; +import org.nl.acs.opc.Device; +import org.nl.acs.opc.DeviceAppService; +import org.nl.modules.system.service.ParamService; +import org.nl.modules.system.service.impl.ParamServiceImpl; +import org.nl.modules.wql.util.SpringContextHolder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.util.Date; + +import static org.nl.acs.agv.server.impl.NDCAgvServiceImpl.Bytes2HexString; + +@Slf4j +@Component +public class NDCSocketConnectionAutoRun extends AbstractAutoRunnable { + + Socket s; + String ip = "127.0.0.1"; + int port = 1234; + static DataOutputStream dos; + static DataInputStream dis; + private int recordTimeOut = 10000; + private Date recordTime; + String[] ERROR = new String[]{ + "货叉尖部传感器触发", "S300传感器触发", "载货状态改变", "急停按钮触发", "触边开关出发", "需要复位", + "停在充电位", "取货失败", "放货失败", "轮子打滑", "没有动作码不能进入站点", "取货时有货", "丢失定位", + "抬叉停止"}; + boolean bConnected = true; + + boolean isReConnect = false; + + + @Autowired + AutoRunService autoRunService; + + + public NDCSocketConnectionAutoRun() { + this.recordTime = new Date((new Date()).getTime() - (long) this.recordTimeOut); + } + + public String getCode() { + return NDCSocketConnectionAutoRun.class.getSimpleName(); + } + + public String getName() { + return "NDC在线连接"; + } + + public void autoRun() { + + try { + 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.AGVURL).getValue(); + port = Integer.parseInt(paramService.findByCode(AcsConfig.AGVPORT).getValue()); + byte[] b = new byte[1028]; + s = new Socket(ip, port); + System.out.println("Agv链接成功"); + dos = new DataOutputStream(s.getOutputStream()); + dis = new DataInputStream(s.getInputStream()); + + while (bConnected) { + int count = dis.read(b); + + if (count == -1) { + break; + } + + int[] arr = new int[count]; + StringBuffer bs = new StringBuffer(); + + for (int i = 0; i < count; i++) { + int temp = b[i]; + if (temp < 0) + temp += 256; + arr[i] = temp; + StringBuffer bs1 = new StringBuffer("0"); + bs.append(temp < 16 ? bs1.append(Integer.toHexString(temp)) : Integer.toHexString(temp)); + } + + System.out.println("收到请求参数:" + bs); + boolean flag = false; + if (arr[8] * 256 + arr[9] == 0x73) { + byte[] data = null; + System.out.println("接收agv上报信息:" + bs); + //执行阶段 + int phase = arr[16] * 256 + arr[17]; + // agv任务号 + int index = arr[12] * 256 + arr[13]; + //任务号 + int ikey = arr[26] * 256 + arr[27]; + //站点号 + int agvaddr = arr[18] * 256 + arr[19]; + //车号 + int carno = arr[20]; + Instruction inst = null; + if (ikey != 0) { + inst = instructionService.findByCodeFromCache(String.valueOf(ikey)); + } + log.info("接收agv上报信息:" + bs); + log.info("接收agv上报信息:" + "phase--" + phase + " index--" + index + " ikey--" + ikey + " agvaddr--" + agvaddr + " Car--" + carno); + Device device = null; + String device_code = null; + String old_device_code = null; + String emptyNum = null; + if (agvaddr != 0) { + old_device_code = deviceService.queryDeviceCodeByAddress(agvaddr); + if (StrUtil.contains(old_device_code, "-")) { + String[] point = old_device_code.split("-"); + device_code = point[0]; + } else if (StrUtil.contains(old_device_code, ".")) { + String[] point = old_device_code.split("\\."); + device_code = point[0]; + emptyNum = point[1]; + } else { + device_code = old_device_code; + } + device = deviceAppService.findDeviceByCode(device_code); + } + + AgvNdcTwoDeviceDriver agvNdcTwoDeviceDriver; + //开始任务 + if (phase == 0x01) { + if (!ObjectUtil.isEmpty(inst)) { + inst.setInstruction_status("1"); + inst.setAgv_jobno(String.valueOf(index)); + inst.setSend_status("1"); + instructionService.update(inst); + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + } + flag = true; + } + //任务完毕 + //(无车id及状态) + else if (phase == 0x14) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + break; + } + 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 { + //上报异常信息 + //(不需要WCS反馈) + if(phase == 0x67){ + device = deviceAppService.findDeviceByCode(Integer.toString(arr[27])); + } else { + device = deviceAppService.findDeviceByCode(Integer.toString(arr[20])); + } + if (device.getDeviceDriver() instanceof AgvNdcTwoDeviceDriver) { + agvNdcTwoDeviceDriver = (AgvNdcTwoDeviceDriver) device.getDeviceDriver(); + agvNdcTwoDeviceDriver.processSocket(arr); + } + } + if (!ObjectUtil.isEmpty(data)) { + write(data); + } + + } else { + System.out.println("agv上报不是0073类型动作,不处理"); + } + } + + } catch (Exception e) { + + + } finally { + + + } + + } + + + @Override + public void stop() { + super.after(); + try { + s.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + public static void write(byte[] b) { + try { + log.info("下发agv数据:" + Bytes2HexString(b)); + System.out.println("下发agv数据:" + Bytes2HexString(b)); + dos.write(b); + dos.flush(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } +} diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java b/acs/nladmin-system/src/main/java/org/nl/acs/auto/run/OneNDCSocketConnectionAutoRun.java index 3d1d66282..f84f92106 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 @@ -79,7 +79,6 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { try { - byte[] b = new byte[1024]; s = new Socket(ip, port); dos = new DataOutputStream(s.getOutputStream()); @@ -150,9 +149,10 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { instructionService.update(inst); } data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - - - } else if (phase == 0x0A) { + } + //任务完毕 + //(无车id及状态) + else if (phase == 0x0A) { for (Instruction inst : insts) { if (!ObjectUtil.isEmpty(inst)) { @@ -161,10 +161,16 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - } else if(phase == 0x30){ - data = NDCAgvService.sendAgvOneModeInst(143, index, 0); + } + //请求删除任务 + //(需要WCS反馈) + else if(phase == 0x30){ + data = NDCAgvService.sendAgvOneModeInst(0x8F, index, 0); - } else if(phase == 0xFF) { + } + //任务删除确认 + //(需要WCS反馈) + else if(phase == 0xFF) { for (Instruction inst : insts) { if (!ObjectUtil.isEmpty(inst)) { @@ -173,15 +179,9 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - }else if(phase == 0x50){//离开区域 - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - - }else if(phase == 0x51){//离开区域 - - data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); - } else { - + //上报异常信息 + //(不需要WCS反馈) if(phase == 0x67){ device = deviceAppService.findDeviceByCode(Integer.toString(arr[27])); } else { @@ -197,7 +197,7 @@ public class OneNDCSocketConnectionAutoRun extends AbstractAutoRunnable { } } else { -// System.out.println("agv上报不是0073类型动作,不处理"); + System.out.println("agv上报不是0073类型动作,不处理"); } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java index b7a2bc4a5..f472e1403 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndcone/AgvNdcOneDeviceDriver.java @@ -25,7 +25,6 @@ import org.nl.acs.opc.DeviceAppService; import org.nl.modules.system.service.ParamService; import org.nl.modules.system.service.impl.ParamServiceImpl; import org.nl.modules.wql.util.SpringContextHolder; -import org.springframework.beans.factory.annotation.Autowired; import java.util.List; @@ -109,7 +108,8 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic //货架 StandardStorageDeviceDriver standardStorageDeviceDriver; - //开始任务/上报订单号 + //分配 车id + //(不需要WCS反馈) if (phase == 0x02) { for (Instruction inst : insts) { inst.setCarno(String.valueOf(carno)); @@ -117,7 +117,8 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic } logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data); - //请求取货 + //到达取货点 + //(需要WCS反馈) } else if (phase == 0x03) { if (agvaddr == 0) { agvaddr = agvaddr_copy; @@ -167,34 +168,8 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic } 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.sendAgvOneModeInst(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.sendAgvOneModeInst(phase, index, 0); - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - //取货完毕 + //(需要WCS反馈) } else if (phase == 0x05) { if (agvaddr == 0) { agvaddr = agvaddr_copy; @@ -248,7 +223,8 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic } logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - //请求放货 + //到达放货点 + //(需要WCS反馈) } else if (phase == 0x07) { if (agvaddr == 0) { agvaddr = agvaddr_copy; @@ -298,7 +274,8 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic } logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - //放货完成 + //放货完毕 + //(需要WCS反馈) } else if (phase == 0x09) { if (agvaddr == 0) { agvaddr = agvaddr_copy; @@ -348,36 +325,21 @@ public class AgvNdcOneDeviceDriver extends AbstractDeviceDriver implements Devic } 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)); - } + } + //到达位置点 + //(需要WCS反馈) + else if (phase == 0x64) {//param,agv货位id待定 + //1、根据货位id找到对应三工位设备,赋给agv属性地址对应的满料位设备 + agvaddr = arr[18] * 256 + arr[19]; + agvaddr_copy = agvaddr; + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + }else if(phase == 0x50){//进入交通灯区域 + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + }else if(phase == 0x51){//离开交通灯区域 + data = NDCAgvService.sendAgvOneModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } 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/agv/ndctwo/AgvNdcTwoDeviceDriver.java b/acs/nladmin-system/src/main/java/org/nl/acs/device_driver/basedriver/agv/ndctwo/AgvNdcTwoDeviceDriver.java index 9624ce030..ec0265186 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,7 @@ import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.acs.agv.server.NDCAgvService; -import org.nl.acs.auto.run.TwoNDCSocketConnectionAutoRun; +import org.nl.acs.auto.run.NDCSocketConnectionAutoRun; 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; @@ -25,10 +25,9 @@ import org.nl.acs.opc.DeviceAppService; import org.nl.modules.system.service.ParamService; import org.nl.modules.wql.util.SpringContextHolder; -import java.util.List; /** - * NDC单工位AGV + * NDC双工位AGV */ @Slf4j @Data @@ -38,29 +37,17 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic ParamService ParamService = SpringContextHolder.getBean(ParamService.class); InstructionService instructionService = SpringContextHolder.getBean(InstructionServiceImpl.class); AcsToWmsService acsToWmsService = SpringContextHolder.getBean(AcsToWmsServiceImpl.class); - NDCAgvService NDCAgvService = SpringContextHolder.getBean(NDCAgvService.class); + NDCAgvService ndcAgvService = SpringContextHolder.getBean(NDCAgvService.class); DeviceExecuteLogService logServer = SpringContextHolder.getBean(DeviceExecuteLogService.class); DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); DeviceService deviceService = SpringContextHolder.getBean(DeviceService.class); int agvaddr = 0; int agvaddr_copy = 0; int weight = 0; + int agv_power = 0; String device_code = ""; int phase = 0; - - int x = 0; //x坐标 - int y = 0; //y坐标 - int angle = 0; //角度 - int electric_qty = 0; //电量 - int status = 0; //三色灯状态 - int error = 0; //车辆故障 - - int last_x = 0; - int last_y = 0; - int last_angle = 0; - int last_electric_qty = 0; - int last_status = 0; - int last_error = 0; + int region = 0; @LokiLog(type = LokiLogType.ACA_TO_LMS) public synchronized void processSocket(int[] arr) throws Exception { @@ -105,87 +92,172 @@ public class AgvNdcTwoDeviceDriver extends AbstractDeviceDriver implements Devic } device = deviceAppService.findDeviceByCode(device_code); - if (phase == 0x67) { - //故障信息 - if (arr[18] * 256 + arr[19] == 0) { - - } - data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); - } - //普通站点 StandardOrdinarySiteDeviceDriver standardOrdinarySiteDeviceDriver; //货架 StandardStorageDeviceDriver standardStorageDeviceDriver; - //开始任务/上报订单号 if (phase == 0x02) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + return; + } inst.setCarno(String.valueOf(carno)); instructionService.update(inst); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + "反馈:" + data); - - //请求取货 - } else if (phase == 0x03) { - //判断普通站点驱动是否开启等待 - if (device.getDeviceDriver() instanceof StandardOrdinarySiteDeviceDriver) { - standardOrdinarySiteDeviceDriver = (StandardOrdinarySiteDeviceDriver) device.getDeviceDriver(); - if(StrUtil.equals("true",this.getDevice().getExtraValue().get("max_emptypalletnum").toString())){ - if(standardOrdinarySiteDeviceDriver.getStatus() == 1){ - data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - } else { - logServer.deviceExecuteLog(this.device_code, "", "", "上位系统未允许取货"); - } - } else { - data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); - logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - } + } + //到达取货点 + //(Itype=1/2/3,需要WCS反馈Phase) + else if (phase == 0x03) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + return; + } + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } + // 取货完毕 + //(Itype=1/2/3,需要WCS反馈Phase) + else if (phase == 0x05) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + return; + } + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } + //到达取货点(Itype=1、3,需要WCS反馈) + else if (phase == 0x08) { + 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")) { + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } + } + // 取货完毕 + //(Itype=1、3,需要WCS反馈) + else if (phase == 0x0A) { + 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")) { + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } - - } else if (phase == 0x65) {//param,重量待定 - //1、得到重量信息 - int weight = (arr[18] * 256 + arr[19]) * 10; - - data = NDCAgvService.sendAgvTwoModeInst(phase, index, 0); - + } + //(Itype=1,上传称重数据) + else if (phase == 0x64) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + return; + } + 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); + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } + } + // 到达放货点 + //(Itype=1/2/3,需要WCS反馈) + else if (phase == 0x0C) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + return; + } + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } + //放货完成 + //(Itype=1/2/3,需要WCS反馈) + else if (phase == 0x0E) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + return; + } + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } + //到达放货点 + //(Itype=1、3,需要WCS反馈) + else if (phase == 0x10) { + 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")) { + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } + } + //放货完成 + //(Itype=1、3,需要WCS反馈) + else if (phase == 0x12) { + 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")) { + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } + } + //上传AGV电量 + else if (phase == 0x73) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + return; + } + agv_power = ikey; + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } //进入区域(phase值) + else if (phase == 0x50) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + return; + } + region = arr[18] * 256 + arr[19]; + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - } else if (phase == 0x64) {//param,agv货位id待定 - - //取货完毕 - } else if (phase == 0x05) { - - - } else if (phase == 0x07) { - - - } else if (phase == 0x09) { - - - } else if (phase == 0x71) { - - - } else if (phase == 0x72) { - - - } else if (phase == 0x73) { - - - } else if (phase == 0x74) { - - - } else if (phase == 0x75) { - - - } else if (phase == 0x76) { + } + //离开区域(phase值) + else if (phase == 0x51) { + if (ObjectUtil.isEmpty(inst)) { + log.info("未找到指令号{}对应的指令", ikey); + return; + } + region = arr[18] * 256 + arr[19]; + data = ndcAgvService.sendAgvTwoModeInst(phase, index, 0); + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); + } + //上报异常信息 + //(不需要WCS反馈) + else if (phase == 0x67) { + //故障信息 + if (arr[18] * 256 + arr[19] == 0) { + } + logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); } if (!ObjectUtil.isEmpty(data)) { logServer.deviceExecuteLog(this.device_code, "", "", "agvphase:" + phase + "反馈:" + data); - TwoNDCSocketConnectionAutoRun.write(data); + NDCSocketConnectionAutoRun.write(data); } } diff --git a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/rest/InstructionController.java b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/rest/InstructionController.java index 644f97175..841741cf1 100644 --- a/acs/nladmin-system/src/main/java/org/nl/acs/instruction/rest/InstructionController.java +++ b/acs/nladmin-system/src/main/java/org/nl/acs/instruction/rest/InstructionController.java @@ -108,6 +108,14 @@ public class InstructionController { return new ResponseEntity<>(HttpStatus.OK); } + @Log("强制取消指令") + @ApiOperation("强制取消指令") + @PostMapping(value = "/forceCancel/{id}") + public ResponseEntity forceCancel(@RequestBody String id) throws Exception { + instructionService.forceCancel(id); + return new ResponseEntity<>(HttpStatus.OK); + } + @Log("导出指令") @ApiOperation("导出指令") @GetMapping(value = "/download") 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 feeb0221a..bda5d43c5 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 @@ -164,6 +164,13 @@ public interface InstructionService { */ void cancel(String id) throws Exception; + /** + * 取消指令 + * + * @param id + */ + void forceCancel(String id) throws Exception; + /** * 取消指令不下发agv * 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 cc96d9210..e035ab86f 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 @@ -833,6 +833,60 @@ public class InstructionServiceImpl implements InstructionService, ApplicationAu } } + @Override + public void forceCancel(String id) throws Exception { + //flag= true时取消指令 + boolean flag = false; + Instruction entity = this.findById(id); + if (entity == null) { + throw new BadRequestException("被删除或无权限,操作失败!"); + } + TaskDto task = taskService.findByCodeFromCache(entity.getTask_code()); + if (StrUtil.isEmpty(entity.getRoute_plan_code())) { + entity.setRoute_plan_code(task.getRoute_plan_code()); + } + String currentUsername = SecurityUtils.getCurrentUsername(); + String now = DateUtil.now(); + entity.setUpdate_time(now); + entity.setUpdate_by(currentUsername); + entity.setInstruction_status("3"); + WQLObject wo = WQLObject.getWQLObject("acs_instruction"); + JSONObject json = (JSONObject) JSONObject.toJSON(entity); + wo.update(json); + DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); + DeviceService deviceService = SpringContextHolder.getBean(DeviceServiceImpl.class); + // 如果是无光电的设备 指令完成变更起点、终点状态 + JSONObject jo = new JSONObject(); + jo.put("device_code", entity.getStart_device_code()); + if (StrUtil.equals(entity.getMaterial(), "1")) { + jo.put("hasGoodStatus", "1"); + } else if (!StrUtil.equals(entity.getMaterial(), "1") && !StrUtil.isEmpty(entity.getMaterial())) { + jo.put("hasGoodStatus", "2"); + } else { + jo.put("hasGoodStatus", "0"); + } + jo.put("material_type", entity.getMaterial()); + jo.put("batch", entity.getBatch()); + jo.put("islock", "false"); + deviceService.changeDeviceStatus(jo); + + JSONObject jo1 = new JSONObject(); + jo1.put("device_code", entity.getNext_device_code()); + jo.put("hasGoodStatus", "0"); + jo.put("material_type", ""); + jo.put("batch", ""); + jo1.put("islock", "false"); + deviceService.changeDeviceStatus(jo1); + + String instnextdevice = entity.getNext_device_code(); + Device device = appService.findDeviceByCode(instnextdevice); + if (device == null) { + log.debug("地址对应设备未找到"); + return; + } + removeByCodeFromCache(entity.getInstruction_code()); + } + @Override public void cancelNOSendAgv(String id) throws Exception { diff --git a/acs/nladmin-ui/src/api/acs/instruction/instruction.js b/acs/nladmin-ui/src/api/acs/instruction/instruction.js index 12aea742d..5d8bec045 100644 --- a/acs/nladmin-ui/src/api/acs/instruction/instruction.js +++ b/acs/nladmin-ui/src/api/acs/instruction/instruction.js @@ -40,6 +40,14 @@ export function cancel(instruction_id) { }) } +export function forceCancel(instruction_id) { + return request({ + url: 'api/instruction/forceCancel/' + instruction_id, + method: 'post', + data: instruction_id + }) +} + export function queryUnFinish() { return request({ url: 'api/instruction/unfinish/', @@ -62,4 +70,4 @@ export function reload() { }) } -export default { add, edit, del, finish, cancel, queryUnFinish, queryByTaskId, reload } +export default { add, edit, del, finish, cancel, forceCancel, queryUnFinish, queryByTaskId, reload } diff --git a/acs/nladmin-ui/src/views/acs/instruction/index.vue b/acs/nladmin-ui/src/views/acs/instruction/index.vue index 7e82e25db..8d57de0ef 100644 --- a/acs/nladmin-ui/src/views/acs/instruction/index.vue +++ b/acs/nladmin-ui/src/views/acs/instruction/index.vue @@ -160,6 +160,7 @@ 完成 取消 + 强制取消 @@ -290,6 +291,14 @@ export default { console.log(err.response.data.message) }) }, + forceCancel(index, row) { + crudInstruction.forceCancel(row.instruction_id).then(res => { + this.crud.toQuery() + this.crud.notify('强制取消成功', CRUD.NOTIFICATION_TYPE.SUCCESS) + }).catch(err => { + console.log(err.response.data.message) + }) + }, reload() { crudInstruction.reload().then(res => { this.crud.toQuery() @@ -313,6 +322,9 @@ export default { case 'b':// 取消 this.cancel(command.index, command.row) break + case 'c':// 强制取消 + this.forceCancel(command.index, command.row) + break } }