diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/AppRun.java b/nladmin-system/nlsso-server/src/main/java/org/nl/AppRun.java index 4a05fd0..0ba72c3 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/AppRun.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/AppRun.java @@ -4,6 +4,9 @@ import cn.dev33.satoken.annotation.SaIgnore; import com.alicp.jetcache.anno.config.EnableCreateCacheAnnotation; import com.alicp.jetcache.anno.config.EnableMethodCache; import org.mybatis.spring.annotation.MapperScan; +import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device.service.DeviceAppService; +import org.nl.acs.device.driver.conveyor.appearance_inspection_scannner_conveyor.AppearanceInspectionScannerConveyorDeviceDriver; import org.nl.acs.ext.socket.HeartServer; import org.nl.config.SpringContextHolder; import org.springframework.boot.SpringApplication; @@ -14,6 +17,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.net.InetSocketAddress; @@ -40,7 +44,11 @@ public class AppRun { public static void main(String[] args) { SpringApplication.run(AppRun.class, args); - new HeartServer(new InetSocketAddress("192.168.18.218", 20889)); +// try { +// new HeartServer(new InetSocketAddress("192.168.18.218", 20889)); +// }catch (Exception e){ +// System.out.println("心跳连接失败"); +// } System.out.println("项目启动成功"); } @@ -59,5 +67,30 @@ public class AppRun { public String index() { return "Backend service started successfully"; } + + + @GetMapping("/{device_code}") + @SaIgnore + public String withStationRequireSuccess(@PathVariable String device_code) { + DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); + Device device = deviceAppService.findDeviceByCode(device_code); + if (device != null && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { + AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); + appearanceInspectionScannerConveyorDeviceDriver.setWithStationRequireSuccess(false); + } + return device_code + "关联站点请求标记复位成功!"; + } + + @GetMapping("/get/{device_code}") + @SaIgnore + public String getWithStationRequireSuccess(@PathVariable String device_code) { + DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); + Device device = deviceAppService.findDeviceByCode(device_code); + if (device != null && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { + AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); + return appearanceInspectionScannerConveyorDeviceDriver.isWithStationRequireSuccess() + ""; + } + return "设备号有误"; + } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java index 323311d..fde75bd 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/AcsConfig.java @@ -64,4 +64,25 @@ public interface AcsConfig { * 是否有海柔AGV系统 */ String HAS_HR = "has_hr"; + + /** + * 海康AGV URL + */ + String HK_URL = "hk_url"; + + /** + * 是否有海康AGV系统 + */ + String HAS_HK = "has_hk"; + + + /** + * 电梯IP + */ + String ELEVATOR_IP = "elevator_ip"; + + /** + * 电梯端口号 + */ + String ELEVATOR_PORT = "elevator_port"; } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/ElevatorSocketConnectionAutoRun.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/ElevatorSocketConnectionAutoRun.java new file mode 100644 index 0000000..939b66d --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/auto/run/ElevatorSocketConnectionAutoRun.java @@ -0,0 +1,158 @@ +package org.nl.acs.auto.run; + +import cn.hutool.core.util.ObjectUtil; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.AcsConfig; +import org.nl.system.service.param.ISysParamService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.*; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.util.Arrays; +import java.util.Date; + +@Slf4j +@Component +@Data +public class ElevatorSocketConnectionAutoRun extends AbstractAutoRunnable { + + + private int recordTimeOut = 10000; + private Date recordTime; + private static Socket socket; + private static DataOutputStream dos; + private static BufferedReader dis; + private boolean bConnected = true; + private String ip; + private int port; + + + @Autowired + private ISysParamService paramService; + + + public ElevatorSocketConnectionAutoRun() { + this.recordTime = new Date((new Date()).getTime() - (long) this.recordTimeOut); + } + + @Override + public String getCode() { + return ElevatorSocketConnectionAutoRun.class.getSimpleName(); + } + + @Override + public String getName() { + return "电梯在线Socket连接"; + } + + @Override + public void autoRun() throws IOException, InterruptedException { + System.out.println("电梯链接开始"); + ip = paramService.findByCode(AcsConfig.ELEVATOR_IP).getValue(); + port = Integer.parseInt(paramService.findByCode(AcsConfig.ELEVATOR_PORT).getValue()); + InetSocketAddress socketAddress = new InetSocketAddress(ip, port); + socket = new Socket(); + socket.connect(socketAddress, 2 * 1000); + socket.setKeepAlive(true); + dos = new DataOutputStream(socket.getOutputStream()); + dis = new BufferedReader(new InputStreamReader(socket.getInputStream())); + while (bConnected) { + String heartbeat = "00060000000601039C430001"; + int[] heartRec = write("心跳", heartbeat); + if (heartRec.length < 8) { + log.error("电梯PLC端开连接......"); + throw new IllegalArgumentException("电梯PLC端开连接!"); + } + Thread.sleep(5000); + } + } + + + @Override + public void stop() { + super.after(); + try { + socket.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + public static synchronized int[] write(String name, String hexMessage) { + String message = null; + try { + log.info("下发{}报文:{}", name, hexMessage); + dos = new DataOutputStream(socket.getOutputStream()); + dis = new BufferedReader(new InputStreamReader(socket.getInputStream())); + socket.setSoTimeout(5000); + byte[] messageBytes = hexStringToByteArray(hexMessage); + dos.write(messageBytes); + dos.flush(); + InputStream inputStream = socket.getInputStream(); + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + byte[] data = new byte[1024]; + int nRead; + while ((nRead = inputStream.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + if (nRead < 1024) { + break; + } + } + buffer.flush(); + message = byteArrayToHexString(buffer.toByteArray()); + log.info("读取{}报文:{}", name, message); + if (ObjectUtil.isEmpty(message)) { + return new int[]{-1}; + } + return binary(message); + } catch (IOException e) { + log.error("失败原因:{}", e.getMessage()); + log.error("堆栈信息:{}", Arrays.toString(e.getStackTrace())); + e.printStackTrace(); + if (ObjectUtil.isNotEmpty(socket)) { + try { + dis.close(); + dos.close(); + socket.close(); + log.error("连接出现异常,已关闭连接"); + } catch (IOException ex) { + ex.printStackTrace(); + } + } + } + return new int[]{-1}; + } + + private static byte[] hexStringToByteArray(String s) { + int length = s.length(); + byte[] data = new byte[length / 2]; + for (int i = 0; i < length; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i + 1), 16)); + } + return data; + } + + private static String byteArrayToHexString(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02X", b)); + } + return sb.toString(); + } + + + public static int[] binary(String hexString) { + hexString = hexString.replaceAll(" ", ""); + int[] intArray = new int[hexString.length() / 2]; + for (int i = 0; i < hexString.length(); i += 2) { + String byteString = hexString.substring(i, i + 2); + intArray[i / 2] = Integer.parseInt(byteString, 16); + } + return intArray; + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/conveyor/appearance_inspection_scannner_conveyor/AppearanceInspectionScannerConveyorDeviceDriver.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/conveyor/appearance_inspection_scannner_conveyor/AppearanceInspectionScannerConveyorDeviceDriver.java index 6f1248f..d34d0e7 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/conveyor/appearance_inspection_scannner_conveyor/AppearanceInspectionScannerConveyorDeviceDriver.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/conveyor/appearance_inspection_scannner_conveyor/AppearanceInspectionScannerConveyorDeviceDriver.java @@ -18,7 +18,11 @@ import org.nl.acs.device.device.service.dto.DeviceAssignedDto; import org.nl.acs.device.driver.*; import org.nl.acs.device.driver.conveyor.appearance_inspection_scannner_conveyor.enums.*; import org.nl.acs.device.driver.conveyor.strip_conveyor.StripConveyorDeviceDriver; +import org.nl.acs.device.driver.storage.standard_storage.StandardStorageDeviceDriver; import org.nl.acs.ext.UnifiedResponse; +import org.nl.acs.ext.hk.service.AcsToHkService; +import org.nl.acs.ext.hk.service.data.BaseReq; +import org.nl.acs.ext.hk.service.data.BoxApplyPassReq; import org.nl.acs.ext.socket.Online; import org.nl.acs.ext.wms.data.req.CommonRequest; import org.nl.acs.ext.wms.service.AcsToWmsService; @@ -29,6 +33,7 @@ import org.nl.acs.monitor.DeviceStageMonitor; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.route.service.dto.RouteLineDto; import org.nl.acs.task.enums.TaskStatusEnum; +import org.nl.acs.task.enums.TaskTypeEnum; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; import org.nl.common.utils.CodeUtil; @@ -63,6 +68,7 @@ public class AppearanceInspectionScannerConveyorDeviceDriver extends AbstractOpc private final RouteLineService routeLineService = SpringContextHolder.getBean(RouteLineService.class); private final DeviceAppService deviceAppService = SpringContextHolder.getBean(DeviceAppService.class); private final DeviceAssignedService deviceAssignedService = SpringContextHolder.getBean(DeviceAssignedService.class); + private final AcsToHkService acsToHkService = SpringContextHolder.getBean(AcsToHkService.class); private static final Lock LOCK = new ReentrantLock(); @@ -203,6 +209,19 @@ public class AppearanceInspectionScannerConveyorDeviceDriver extends AbstractOpc private String createTaskCode = null; + /** + * CTU请求取货标记和任务号 + */ + private volatile String reqTakeInstCode = null; + private volatile Boolean reqTakeRequireSuccess = false; + + /** + * CTU请求放货标记和任务号 + */ + private volatile String reqPutInstCode = null; + private volatile Boolean reqPutRequireSuccess = false; + + @Override public Device getDevice() { return this.device; @@ -234,6 +253,10 @@ public class AppearanceInspectionScannerConveyorDeviceDriver extends AbstractOpc if (this.mode != this.lastMode) { this.requireSuccess = false; } + if (!StrUtil.equals(this.barcode,this.lastBarcode) && this.isWithStationRequireSuccess()){ + this.requireSuccess = false; + this.withStationRequireSuccess = false; + } if (!StrUtil.equals(this.barcode, this.lastBarcode) && this.move == 1) { this.requireInTaskTime = System.currentTimeMillis(); } @@ -271,6 +294,45 @@ public class AppearanceInspectionScannerConveyorDeviceDriver extends AbstractOpc this.createTaskCode = null; } } + + //CTU取货申请满足条件 + if (this.mode == 2 && this.status == 1 && this.move == 1 && this.action == 1 && this.reqTakeRequireSuccess && ObjectUtil.isNotEmpty(this.reqTakeInstCode) ){ + Instruction instruction = instructionService.findByCodeFromCache(this.reqTakeInstCode); + if (ObjectUtil.isNotEmpty(instruction) && StrUtil.equals(instruction.getStart_device_code(),this.currentDeviceCode)){ + //调用CTU的取货申请通过接口 + BoxApplyPassReq bapReq = BoxApplyPassReq.builder() + .taskCode(this.reqTakeInstCode) + .type("1") + .build(); +// BaseReq req = BaseReq.builder() +// .data(bapReq) +// .build(); + UnifiedResponse unifiedResponse = acsToHkService.boxApplyPass(bapReq, String.class); + if (unifiedResponse.isSuccess()){ + this.reqTakeRequireSuccess = false; + this.reqTakeInstCode = null; + } + } + } + //CTU放货申请满足条件 + if (this.mode == 2 && this.status == 1 && this.move == 0 && this.action == 1 && this.reqPutRequireSuccess && ObjectUtil.isNotEmpty(this.reqPutInstCode) ){ + Instruction instruction = instructionService.findByCodeFromCache(this.reqPutInstCode); + if (ObjectUtil.isNotEmpty(instruction) && StrUtil.equals(instruction.getNext_device_code(),this.currentDeviceCode)){ + //调用CTU的放货申请通过接口 + BoxApplyPassReq bapReq = BoxApplyPassReq.builder() + .taskCode(this.reqPutInstCode) + .type("2") + .build(); +// BaseReq req = BaseReq.builder() +// .data(bapReq) +// .build(); + UnifiedResponse unifiedResponse = acsToHkService.boxApplyPass(bapReq, String.class); + if (unifiedResponse.isSuccess()){ + this.reqPutRequireSuccess = false; + this.reqPutInstCode = null; + } + } + } } @Override @@ -407,7 +469,7 @@ public class AppearanceInspectionScannerConveyorDeviceDriver extends AbstractOpc CommonRequest request = CommonRequest.builder() .service("InStorage") - .type("groupInStorage") + .type("secondFloorInStorage") .data(param) .build(); UnifiedResponse response = acsToWmsService.apply(request); @@ -436,7 +498,7 @@ public class AppearanceInspectionScannerConveyorDeviceDriver extends AbstractOpc CommonRequest request = CommonRequest.builder() .service("InStorage") - .type("groupInStorage") + .type("secondFloorInStorage") .data(param) .build(); return acsToWmsService.apply(request); @@ -465,6 +527,10 @@ public class AppearanceInspectionScannerConveyorDeviceDriver extends AbstractOpc this.unExecutedMessage = "任务起点与当前设备号不一致,查找入库任务结束"; return; } + if (StrUtil.equals(taskDto.getTask_type(), TaskTypeEnum.AGV_TASK.getCode()) || StrUtil.equals(taskDto.getTask_type(), TaskTypeEnum.CTU_TASK.getCode())){ + this.unExecutedMessage = "查询到当前任务类型是AGV任务或CTU任务,查找入库任务结束"; + return; + } instDto = new Instruction(); List shortPathsList = null; String start_device_code = null; @@ -499,11 +565,20 @@ public class AppearanceInspectionScannerConveyorDeviceDriver extends AbstractOpc if (ObjectUtil.isEmpty(inst)) { assignedDto = deviceAssignedDto; break; + } else { + Device start_device = deviceAppService.findDeviceByCode(inst.getStart_device_code()); + if (start_device != null && start_device.getDeviceDriver() instanceof StandardStorageDeviceDriver){ + assignedDto = deviceAssignedDto; + break; + } } } } else { assignedDto = assignedDtos.get(0); } + if (ObjectUtil.isEmpty(assignedDto)){ + this.unExecutedMessage = "未查询到可用平均分配, 查找入库任务结束"; + } start_device_code = assignedDto.getDevice_code(); next_device_code = assignedDto.getInst_nextDevice_code(); } @@ -621,6 +696,10 @@ public class AppearanceInspectionScannerConveyorDeviceDriver extends AbstractOpc TaskDto taskDto = taskService.findReadyTaskByNextDeviceCode(deviceCode, checkoutStartDeviceCode); Instruction instDto = instructionService.findReadyInstByEnd(deviceCode); if (ObjectUtil.isNotEmpty(taskDto) && ObjectUtil.isEmpty(instDto)) { + if (StrUtil.equals(taskDto.getTask_type(), TaskTypeEnum.AGV_TASK.getCode()) || StrUtil.equals(taskDto.getTask_type(), TaskTypeEnum.CTU_TASK.getCode())){ + this.unExecutedMessage = "查询到当前任务类型是AGV任务或CTU任务,查找出库任务结束"; + return; + } instDto = new Instruction(); List assignedDtos = deviceAssignedService.queryAssignedByDevice(taskDto.getStart_device_code(), taskDto.getNext_device_code()); if (CollectionUtil.isEmpty(assignedDtos)) { diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/screen/led_screen/LedScreenDeviceDriver.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/screen/led_screen/LedScreenDeviceDriver.java index 5cb7fcd..1362d6f 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/screen/led_screen/LedScreenDeviceDriver.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/screen/led_screen/LedScreenDeviceDriver.java @@ -8,6 +8,7 @@ import lombok.Data; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import onbon.bx06.Bx6GEnv; +import onbon.bx06.Bx6GException; import onbon.bx06.Bx6GScreenClient; import onbon.bx06.area.DynamicBxArea; import onbon.bx06.area.TextCaptionBxArea; @@ -64,173 +65,428 @@ public class LedScreenDeviceDriver extends AbstractDeviceDriver implements Devic private String errorMsgInfo = ""; private String taskMsgInfo = ""; +// @Override +// public void execute() throws Exception { +// try { +// if (isInitialized.compareAndSet(false, true)) { +// Bx6GEnv.initial(30000); +// } +// //建立连接 +// if (this.screen == null || !this.screen.isConnected()) { +// String ip = Optional.ofNullable(this.getDevice().getExtraValue().get("ip_address")).map(Object::toString).orElse(null); +// int port = Optional.ofNullable(this.getDevice().getExtraValue().get("ip_port")).map(Object::toString).map(Integer::parseInt).orElse(0); +// if (ip == null || port == 0) { +// return; +// } +// this.screen = new Bx6GScreenClient(this.getDevice().getDevice_code(), new Bx6E()); +// this.screen.connect(ip, port); +// } +// //设置节目 +// DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyle[0]); +// ProgramBxFile pf = new ProgramBxFile(0, this.screen.getProfile()); +// TextCaptionBxArea area = new TextCaptionBxArea(0, 0, 192, 16, this.screen.getProfile()); +// StringBuilder sb = new StringBuilder(); +// //判断是否关联出入库模式 +// boolean inOutFlag = Optional.ofNullable(this.getDevice().getExtraValue().get("inOut")).map(Object::toString).map(Boolean::parseBoolean).orElse(false); +// if (!inOutFlag) { +// String inOutMode = Optional.ofNullable(this.getDevice().getExtraValue().get("inOutMode")).map(Object::toString).orElse(""); +// sb.append(inOutMode); +// } else { +// String linkSSX = Optional.ofNullable(this.getDevice().getExtraValue().get("linkSSX")).map(Object::toString).orElse(null); +// Device device = deviceAppService.findDeviceByCode(linkSSX); +// if (device != null && device.getDeviceDriver() instanceof StripConveyorDeviceDriver) { +// StripConveyorDeviceDriver stripConveyorDeviceDriver = (StripConveyorDeviceDriver) device.getDeviceDriver(); +// if (stripConveyorDeviceDriver.getInOutMode() == 0) { +// sb.append("入库模式"); +// } else { +// sb.append("出库模式"); +// } +// } +// } +// if (!StrUtil.equals(this.modeMsgInfo, sb.toString())) { +// TextBxPage page = new TextBxPage(sb.toString()); +// page.setForeground(Color.green); +// area.addPage(page); +// pf.addArea(area); +// this.screen.writeProgram(pf); +// this.modeMsgInfo = sb.toString(); +// } +// //设置动态区1报警信息 +// List errorDevices = this.getExtraDeviceCodes("errorDevices"); +// StringBuilder sbMsg = new StringBuilder(); +// if (CollectionUtil.isNotEmpty(errorDevices)) { +// sbMsg.append("报警信息: "); +// String errorMsg = ""; +// for (int i = 0; i < errorDevices.size(); i++) { +// String deviceCode = errorDevices.get(i); +// Device device = deviceAppService.findDeviceByCode(deviceCode); +// if (device != null && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { +// AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); +// if (appearanceInspectionScannerConveyorDeviceDriver.getError() > 0) { +// String label = ErrorEnum.getLabel(appearanceInspectionScannerConveyorDeviceDriver.getError()); +// errorMsg = "设备" + deviceCode + " " + label + ","; +// } +// } else if (device != null && device.getDeviceDriver() instanceof StandardStackerDeviceDriver) { +// StandardStackerDeviceDriver standardStackerDeviceDriver = (StandardStackerDeviceDriver) device.getDeviceDriver(); +// if (standardStackerDeviceDriver.getFront_Zerror() > 0 || standardStackerDeviceDriver.getBack_Zerror() > 0) { +// errorMsg = deviceCode + " "; +// if (standardStackerDeviceDriver.getFront_Zerror() > 0) { +// errorMsg = "设备" + deviceCode + " 前叉报警 " + org.nl.acs.device.driver.stacker.double_stacker.enums.ErrorEnum.getDesc(standardStackerDeviceDriver.getFront_Zerror()) + ","; +// } +// if (standardStackerDeviceDriver.getBack_Zerror() > 0) { +// errorMsg = "设备" + deviceCode + " 后叉报警 " + org.nl.acs.device.driver.stacker.double_stacker.enums.ErrorEnum.getDesc(standardStackerDeviceDriver.getBack_Zerror()) + ","; +// } +// } +// } +// } +// if (StrUtil.isEmpty(errorMsg)) { +// sbMsg.append("无报警!"); +// } else { +// sbMsg.append(errorMsg); +// if (sbMsg.length() > 0 && sbMsg.charAt(sbMsg.length() - 1) == ',') { +// sbMsg.deleteCharAt(sbMsg.length() - 1); +// } +// } +// } +// if (!StrUtil.equals(this.errorMsgInfo, sbMsg.toString())) { +// DynamicBxAreaRule rule_2 = new DynamicBxAreaRule(); +// rule_2.setId(0); +// rule_2.setRunMode((byte) 0); +// rule_2.setRelativeAllPrograms(false); +// rule_2.addRelativeProgram(0); +// DynamicBxArea area_2 = new DynamicBxArea(0, 22, 192, 22, screen.getProfile()); +// TextBxPage page_2 = new TextBxPage(sbMsg.toString()); +// boolean flag = getStringWidth(sbMsg.toString()); +// if (flag) { +// page_2.setDisplayStyle(styles[1]); +// } else { +// page_2.setDisplayStyle(styles[4]); +// } +// page_2.setFont(new Font("Microsoft YaHei", Font.PLAIN, 12)); +// page_2.setForeground(Color.green); +// page_2.setLineHeight(12); +// area_2.addPage(page_2); +// this.screen.writeDynamic(rule_2, area_2); +// this.errorMsgInfo = sbMsg.toString(); +// } +// //设置动态区2任务信息 +// StringBuilder sb2 = new StringBuilder(); +// sb2.append("任务信息: "); +// List startDevices = this.getExtraDeviceCodes("startDevices"); +// if (CollectionUtil.isNotEmpty(startDevices)) { +// for (int i = 0; i < startDevices.size(); i++) { +// String start_device_code = startDevices.get(i); +// List taskDtos = taskService.findTasksByStartCode(start_device_code); +// if (ObjectUtil.isNotEmpty(taskDtos)) { +// for (TaskDto taskDto : taskDtos) { +// sb2.append("载具" + taskDto.getVehicle_code() + "由" + taskDto.getStart_point_code() + "->" + taskDto.getNext_point_code() + ","); +// } +// } +// } +// } +// List nextDevices = this.getExtraDeviceCodes("nextDevices"); +// if (CollectionUtil.isNotEmpty(nextDevices)) { +// for (int i = 0; i < nextDevices.size(); i++) { +// String next_device_code = nextDevices.get(i); +// List taskDtos = taskService.findTasksByNextCode(next_device_code); +// if (ObjectUtil.isNotEmpty(taskDtos)) { +// for (TaskDto taskDto : taskDtos) { +// sb2.append("载具" + taskDto.getVehicle_code() + "由" + taskDto.getStart_point_code() + "->" + taskDto.getNext_point_code() + ","); +// } +// } +// } +// } +// if (sb2.length() > 0 && sb2.charAt(sb2.length() - 1) == ',') { +// sb2.deleteCharAt(sb2.length() - 1); +// } else { +// sb2.append("无任务!"); +// } +// if (!StrUtil.equals(this.taskMsgInfo, sb2.toString())) { +// DynamicBxAreaRule rule = new DynamicBxAreaRule(); +// rule.setId(1); +// rule.setRunMode((byte) 0); +// rule.setRelativeAllPrograms(false); +// rule.addRelativeProgram(0); +// DynamicBxArea dArea = new DynamicBxArea(0, 37, 192, 37, screen.getProfile()); +// TextBxPage dPage = new TextBxPage(sb2.toString()); +// boolean flag = getStringWidth(sb2.toString()); +// if (flag) { +// dPage.setDisplayStyle(styles[1]); +// } else { +// dPage.setDisplayStyle(styles[4]); +// } +// dPage.setFont(new Font("Microsoft YaHei", Font.PLAIN, 12)); +// dPage.setForeground(Color.green); +// dPage.setLineHeight(12); +// dArea.addPage(dPage); +// screen.writeDynamic(rule, dArea); +// this.taskMsgInfo = sb2.toString(); +// } +// +// } catch (Exception e) { +// if (this.screen != null) { +// this.screen.disconnect(); +// System.out.println(this.getDevice().getDevice_code() + "关闭Screen连接!"); +// } +// Thread.sleep(60000); +// } +// Integer upTime = Optional.ofNullable(this.getDevice().getExtraValue().get("upTime")).map(Object::toString).map(Integer::parseInt).orElse(60); +// Thread.sleep(upTime * 1000); +// Runtime.getRuntime().addShutdownHook(new Thread(() -> { +// synchronized (this) { +// if (this.screen != null && this.screen.isConnected()) { +// this.screen.disconnect(); +// System.out.println(this.getDevice().getDevice_code() + "关闭Screen连接!"); +// } +// } +// })); +// } + + @Override public void execute() throws Exception { try { - if (isInitialized.compareAndSet(false, true)) { - Bx6GEnv.initial(30000); + // 仅当信息变化时才进行连接和断开连接操作 + boolean isInfoChanged = false; + // 设置信息的更新标志 + String newModeMsg = getModeMessage(); + if (!StrUtil.equals(this.modeMsgInfo, newModeMsg)) { + isInfoChanged = true; + this.modeMsgInfo = newModeMsg; } - //建立连接 - if (this.screen == null || !this.screen.isConnected()) { - String ip = Optional.ofNullable(this.getDevice().getExtraValue().get("ip_address")).map(Object::toString).orElse(null); - int port = Optional.ofNullable(this.getDevice().getExtraValue().get("ip_port")).map(Object::toString).map(Integer::parseInt).orElse(0); - if (ip == null || port == 0) { - return; - } - this.screen = new Bx6GScreenClient(this.getDevice().getDevice_code(), new Bx6E()); - this.screen.connect(ip, port); + String newErrorMsg = getErrorMsg(); + if (!StrUtil.equals(this.errorMsgInfo, newErrorMsg)) { + isInfoChanged = true; + this.errorMsgInfo = newErrorMsg; } - //设置节目 - DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyle[0]); - ProgramBxFile pf = new ProgramBxFile(0, this.screen.getProfile()); - TextCaptionBxArea area = new TextCaptionBxArea(0, 0, 192, 16, this.screen.getProfile()); - StringBuilder sb = new StringBuilder(); - //判断是否关联出入库模式 - boolean inOutFlag = Optional.ofNullable(this.getDevice().getExtraValue().get("inOut")).map(Object::toString).map(Boolean::parseBoolean).orElse(false); - if (!inOutFlag) { - String inOutMode = Optional.ofNullable(this.getDevice().getExtraValue().get("inOutMode")).map(Object::toString).orElse(""); - sb.append(inOutMode); - } else { - String linkSSX = Optional.ofNullable(this.getDevice().getExtraValue().get("linkSSX")).map(Object::toString).orElse(null); - Device device = deviceAppService.findDeviceByCode(linkSSX); - if (device != null && device.getDeviceDriver() instanceof StripConveyorDeviceDriver) { - StripConveyorDeviceDriver stripConveyorDeviceDriver = (StripConveyorDeviceDriver) device.getDeviceDriver(); - if (stripConveyorDeviceDriver.getInOutMode() == 0) { - sb.append("入库模式"); - } else { - sb.append("出库模式"); - } - } - } - if (!StrUtil.equals(this.modeMsgInfo, sb.toString())) { - TextBxPage page = new TextBxPage(sb.toString()); - page.setForeground(Color.green); - area.addPage(page); - pf.addArea(area); - this.screen.writeProgram(pf); - this.modeMsgInfo = sb.toString(); - } - //设置动态区1报警信息 - List errorDevices = this.getExtraDeviceCodes("errorDevices"); - StringBuilder sbMsg = new StringBuilder(); - if (CollectionUtil.isNotEmpty(errorDevices)) { - sbMsg.append("报警信息: "); - String errorMsg = ""; - for (int i = 0; i < errorDevices.size(); i++) { - String deviceCode = errorDevices.get(i); - Device device = deviceAppService.findDeviceByCode(deviceCode); - if (device != null && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { - AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); - if (appearanceInspectionScannerConveyorDeviceDriver.getError() > 0) { - String label = ErrorEnum.getLabel(appearanceInspectionScannerConveyorDeviceDriver.getError()); - errorMsg = "设备" + deviceCode + " " + label + ","; - } - } else if (device != null && device.getDeviceDriver() instanceof StandardStackerDeviceDriver) { - StandardStackerDeviceDriver standardStackerDeviceDriver = (StandardStackerDeviceDriver) device.getDeviceDriver(); - if (standardStackerDeviceDriver.getFront_Zerror() > 0 || standardStackerDeviceDriver.getBack_Zerror() > 0) { - errorMsg = deviceCode + " "; - if (standardStackerDeviceDriver.getFront_Zerror() > 0) { - errorMsg = "设备" + deviceCode + " 前叉报警 " + org.nl.acs.device.driver.stacker.double_stacker.enums.ErrorEnum.getDesc(standardStackerDeviceDriver.getFront_Zerror()) + ","; - } - if (standardStackerDeviceDriver.getBack_Zerror() > 0) { - errorMsg = "设备" + deviceCode + " 后叉报警 " + org.nl.acs.device.driver.stacker.double_stacker.enums.ErrorEnum.getDesc(standardStackerDeviceDriver.getBack_Zerror()) + ","; - } - } - } - } - if (StrUtil.isEmpty(errorMsg)) { - sbMsg.append("无报警!"); - } else { - sbMsg.append(errorMsg); - if (sbMsg.length() > 0 && sbMsg.charAt(sbMsg.length() - 1) == ',') { - sbMsg.deleteCharAt(sbMsg.length() - 1); - } - } - } - if (!StrUtil.equals(this.errorMsgInfo, sbMsg.toString())) { - DynamicBxAreaRule rule_2 = new DynamicBxAreaRule(); - rule_2.setId(0); - rule_2.setRunMode((byte) 0); - rule_2.setRelativeAllPrograms(false); - rule_2.addRelativeProgram(0); - DynamicBxArea area_2 = new DynamicBxArea(0, 22, 192, 22, screen.getProfile()); - TextBxPage page_2 = new TextBxPage(sbMsg.toString()); - boolean flag = getStringWidth(sbMsg.toString()); - if (flag) { - page_2.setDisplayStyle(styles[1]); - } else { - page_2.setDisplayStyle(styles[4]); - } - page_2.setFont(new Font("Microsoft YaHei", Font.PLAIN, 12)); - page_2.setForeground(Color.green); - page_2.setLineHeight(12); - area_2.addPage(page_2); - this.screen.writeDynamic(rule_2, area_2); - this.errorMsgInfo = sbMsg.toString(); - } - //设置动态区2任务信息 - StringBuilder sb2 = new StringBuilder(); - sb2.append("任务信息: "); - List startDevices = this.getExtraDeviceCodes("startDevices"); - if (CollectionUtil.isNotEmpty(startDevices)) { - for (int i = 0; i < startDevices.size(); i++) { - String start_device_code = startDevices.get(i); - List taskDtos = taskService.findTasksByStartCode(start_device_code); - if (ObjectUtil.isNotEmpty(taskDtos)) { - for (TaskDto taskDto : taskDtos) { - sb2.append("载具" + taskDto.getVehicle_code() + "由" + taskDto.getStart_point_code() + "->" + taskDto.getNext_point_code() + ","); - } - } - } - } - List nextDevices = this.getExtraDeviceCodes("nextDevices"); - if (CollectionUtil.isNotEmpty(nextDevices)) { - for (int i = 0; i < nextDevices.size(); i++) { - String next_device_code = nextDevices.get(i); - List taskDtos = taskService.findTasksByNextCode(next_device_code); - if (ObjectUtil.isNotEmpty(taskDtos)) { - for (TaskDto taskDto : taskDtos) { - sb2.append("载具" + taskDto.getVehicle_code() + "由" + taskDto.getStart_point_code() + "->" + taskDto.getNext_point_code() + ","); - } - } - } - } - if (sb2.length() > 0 && sb2.charAt(sb2.length() - 1) == ',') { - sb2.deleteCharAt(sb2.length() - 1); - } else { - sb2.append("无任务!"); - } - if (!StrUtil.equals(this.taskMsgInfo, sb2.toString())) { - DynamicBxAreaRule rule = new DynamicBxAreaRule(); - rule.setId(1); - rule.setRunMode((byte) 0); - rule.setRelativeAllPrograms(false); - rule.addRelativeProgram(0); - DynamicBxArea dArea = new DynamicBxArea(0, 37, 192, 37, screen.getProfile()); - TextBxPage dPage = new TextBxPage(sb2.toString()); - boolean flag = getStringWidth(sb2.toString()); - if (flag) { - dPage.setDisplayStyle(styles[1]); - } else { - dPage.setDisplayStyle(styles[4]); - } - dPage.setFont(new Font("Microsoft YaHei", Font.PLAIN, 12)); - dPage.setForeground(Color.green); - dPage.setLineHeight(12); - dArea.addPage(dPage); - screen.writeDynamic(rule, dArea); - this.taskMsgInfo = sb2.toString(); + String newTaskMsg = getTaskMsg(); + if (!StrUtil.equals(this.taskMsgInfo, newTaskMsg)) { + isInfoChanged = true; + this.taskMsgInfo = newTaskMsg; } + // 只有信息发生变化时,才进行连接并发送信息 + if (isInfoChanged) { + // 建立连接 + connect(); + // 设置节目和信息 + sendInformation(newModeMsg, newErrorMsg, newTaskMsg); + // 断开连接 + disconnect(); + } + + // 等待时间 + Integer upTime = Optional.ofNullable(this.getDevice().getExtraValue().get("upTime")) + .map(Object::toString) + .map(Integer::parseInt) + .orElse(60); + Thread.sleep(upTime * 1000); + } catch (Exception e) { - if (this.screen != null) { - this.screen.disconnect(); - System.out.println(this.getDevice().getDevice_code() + "关闭Screen连接!"); - Thread.sleep(60000); + handleException(); + Thread.sleep(60000); + } + + // 确保在应用关闭时断开连接 +// addShutdownHook(); + } + + private String getModeMessage() { + StringBuilder sb = new StringBuilder(); + boolean inOutFlag = Optional.ofNullable(this.getDevice().getExtraValue().get("inOut")) + .map(Object::toString) + .map(Boolean::parseBoolean) + .orElse(false); + + if (!inOutFlag) { + String inOutMode = Optional.ofNullable(this.getDevice().getExtraValue().get("inOutMode")) + .map(Object::toString) + .orElse(""); + sb.append(inOutMode); + } else { + String linkSSX = Optional.ofNullable(this.getDevice().getExtraValue().get("linkSSX")) + .map(Object::toString) + .orElse(null); + Device device = deviceAppService.findDeviceByCode(linkSSX); + if (device != null && device.getDeviceDriver() instanceof StripConveyorDeviceDriver) { + StripConveyorDeviceDriver stripConveyorDeviceDriver = (StripConveyorDeviceDriver) device.getDeviceDriver(); + if (stripConveyorDeviceDriver.getInOutMode() == 0) { + sb.append("入库模式"); + } else { + sb.append("出库模式"); + } } } - Integer upTime = Optional.ofNullable(this.getDevice().getExtraValue().get("upTime")).map(Object::toString).map(Integer::parseInt).orElse(60); - Thread.sleep(upTime * 1000); + return sb.toString(); + } + + private String getErrorMsg() { + StringBuilder sbMsg = new StringBuilder(); + List errorDevices = this.getExtraDeviceCodes("errorDevices"); + if (CollectionUtil.isNotEmpty(errorDevices)) { + sbMsg.append("报警信息: "); + String errorMsg = ""; + for (int i = 0; i < errorDevices.size(); i++) { + String deviceCode = errorDevices.get(i); + Device device = deviceAppService.findDeviceByCode(deviceCode); + if (device != null && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { + AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); + if (appearanceInspectionScannerConveyorDeviceDriver.getError() > 0) { + String label = ErrorEnum.getLabel(appearanceInspectionScannerConveyorDeviceDriver.getError()); + errorMsg = "设备" + deviceCode + " " + label + ","; + } + } else if (device != null && device.getDeviceDriver() instanceof StandardStackerDeviceDriver) { + StandardStackerDeviceDriver standardStackerDeviceDriver = (StandardStackerDeviceDriver) device.getDeviceDriver(); + if (standardStackerDeviceDriver.getFront_Zerror() > 0 || standardStackerDeviceDriver.getBack_Zerror() > 0) { + errorMsg = deviceCode + " "; + if (standardStackerDeviceDriver.getFront_Zerror() > 0) { + errorMsg = "设备" + deviceCode + " 前叉报警 " + org.nl.acs.device.driver.stacker.double_stacker.enums.ErrorEnum.getDesc(standardStackerDeviceDriver.getFront_Zerror()) + ","; + } + if (standardStackerDeviceDriver.getBack_Zerror() > 0) { + errorMsg = "设备" + deviceCode + " 后叉报警 " + org.nl.acs.device.driver.stacker.double_stacker.enums.ErrorEnum.getDesc(standardStackerDeviceDriver.getBack_Zerror()) + ","; + } + } + } + } + if (StrUtil.isEmpty(errorMsg)) { + sbMsg.append("无报警!"); + } else { + sbMsg.append(errorMsg); + if (sbMsg.length() > 0 && sbMsg.charAt(sbMsg.length() - 1) == ',') { + sbMsg.deleteCharAt(sbMsg.length() - 1); + } + } + } + return sbMsg.toString(); + } + + private String getTaskMsg() { + StringBuilder sb2 = new StringBuilder(); + sb2.append("任务信息: "); + List startDevices = this.getExtraDeviceCodes("startDevices"); + if (CollectionUtil.isNotEmpty(startDevices)) { + for (int i = 0; i < startDevices.size(); i++) { + String start_device_code = startDevices.get(i); + List taskDtos = taskService.findTasksByStartCode(start_device_code); + if (ObjectUtil.isNotEmpty(taskDtos)) { + for (TaskDto taskDto : taskDtos) { + sb2.append("载具" + taskDto.getVehicle_code() + "由" + taskDto.getStart_point_code() + "->" + taskDto.getNext_point_code() + ","); + } + } + } + } + List nextDevices = this.getExtraDeviceCodes("nextDevices"); + if (CollectionUtil.isNotEmpty(nextDevices)) { + for (int i = 0; i < nextDevices.size(); i++) { + String next_device_code = nextDevices.get(i); + List taskDtos = taskService.findTasksByNextCode(next_device_code); + if (ObjectUtil.isNotEmpty(taskDtos)) { + for (TaskDto taskDto : taskDtos) { + sb2.append("载具" + taskDto.getVehicle_code() + "由" + taskDto.getStart_point_code() + "->" + taskDto.getNext_point_code() + ","); + } + } + } + } + if (sb2.length() > 0 && sb2.charAt(sb2.length() - 1) == ',') { + sb2.deleteCharAt(sb2.length() - 1); + } else { + sb2.append("无任务!"); + } + return sb2.toString(); + } + + private void connect() throws Exception { + if (isInitialized.compareAndSet(false, true)) { + Bx6GEnv.initial(30000); + } + // 建立连接的逻辑 + if (this.screen == null || !this.screen.isConnected()) { + String ip = Optional.ofNullable(this.getDevice().getExtraValue().get("ip_address")).map(Object::toString).orElse(null); + int port = Optional.ofNullable(this.getDevice().getExtraValue().get("ip_port")).map(Object::toString).map(Integer::parseInt).orElse(0); + if (ip == null || port == 0) { + return; + } + this.screen = new Bx6GScreenClient(this.getDevice().getDevice_code(), new Bx6E()); + this.screen.connect(ip, port); + } + } + + private void sendInformation(String modeMsg, String errorMsg, String taskMsg) throws Bx6GException { + DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyle[0]); + writeModeMsg(modeMsg,styles); + writeErrorMsg(errorMsg,styles); + writeTaskMsg(taskMsg,styles); + } + + private void writeModeMsg(String modeMsg, DisplayStyle[] styles) throws Bx6GException { + ProgramBxFile pf = new ProgramBxFile(0, this.screen.getProfile()); + TextCaptionBxArea area = new TextCaptionBxArea(0, 0, 192, 16, this.screen.getProfile()); + // 设置并发送信息 + TextBxPage page = new TextBxPage(modeMsg); + page.setForeground(Color.green); + area.addPage(page); + pf.addArea(area); + this.screen.writeProgram(pf); + } + + private void writeErrorMsg(String errorMsg, DisplayStyle[] styles){ + DynamicBxAreaRule rule_2 = new DynamicBxAreaRule(); + rule_2.setId(0); + rule_2.setRunMode((byte) 0); + rule_2.setRelativeAllPrograms(false); + rule_2.addRelativeProgram(0); + DynamicBxArea area_2 = new DynamicBxArea(0, 22, 192, 22, screen.getProfile()); + TextBxPage page_2 = new TextBxPage(errorMsg); + boolean flagError = getStringWidth(errorMsg); + if (flagError) { + page_2.setDisplayStyle(styles[1]); + } else { + page_2.setDisplayStyle(styles[4]); + } + page_2.setFont(new Font("Microsoft YaHei", Font.PLAIN, 12)); + page_2.setForeground(Color.green); + page_2.setLineHeight(12); + area_2.addPage(page_2); + this.screen.writeDynamic(rule_2, area_2); + } + + private void writeTaskMsg(String taskMsg, DisplayStyle[] styles){ + DynamicBxAreaRule rule = new DynamicBxAreaRule(); + rule.setId(1); + rule.setRunMode((byte) 0); + rule.setRelativeAllPrograms(false); + rule.addRelativeProgram(0); + DynamicBxArea dArea = new DynamicBxArea(0, 37, 192, 37, screen.getProfile()); + TextBxPage dPage = new TextBxPage(taskMsg); + boolean flagTask = getStringWidth(taskMsg); + if (flagTask) { + dPage.setDisplayStyle(styles[1]); + } else { + dPage.setDisplayStyle(styles[4]); + } + dPage.setFont(new Font("Microsoft YaHei", Font.PLAIN, 12)); + dPage.setForeground(Color.green); + dPage.setLineHeight(12); + dArea.addPage(dPage); + screen.writeDynamic(rule, dArea); + } + + private void disconnect() { + // 断开连接的逻辑 + if (this.screen != null && this.screen.isConnected()) { + this.screen.disconnect(); + System.out.println(this.getDevice().getDevice_code() + "关闭Screen连接!"); + } + } + + private void handleException() { + if (this.screen != null) { + this.screen.disconnect(); + System.out.println(this.getDevice().getDevice_code() + "关闭Screen连接!"); + } + } + + private void addShutdownHook() { Runtime.getRuntime().addShutdownHook(new Thread(() -> { synchronized (this) { if (this.screen != null && this.screen.isConnected()) { @@ -241,6 +497,7 @@ public class LedScreenDeviceDriver extends AbstractDeviceDriver implements Devic })); } + @Override public JSONObject getDeviceStatusName() throws Exception { return null; @@ -251,7 +508,6 @@ public class LedScreenDeviceDriver extends AbstractDeviceDriver implements Devic } - private boolean getStringWidth(String msg) { Font font = new Font("Microsoft YaHei", Font.PLAIN, 12); BufferedImage image = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/stacker/Test1.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/stacker/Test1.java new file mode 100644 index 0000000..a4399c6 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/stacker/Test1.java @@ -0,0 +1,47 @@ +package org.nl.acs.device.driver.stacker; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import org.nl.acs.instruction.domain.Instruction; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/9/4 + */ +public class Test1 { + public static void main(String[] args) { + Instruction frontInst = new Instruction(); + frontInst.setStart_device_code("L01"); + frontInst.setFrom_x("1"); + frontInst.setFrom_y("01"); + frontInst.setFrom_z("02"); + Instruction backInst = new Instruction(); + backInst.setStart_device_code("L01"); + backInst.setFrom_x("1"); + backInst.setFrom_y("03"); + backInst.setFrom_z("02"); + + System.out.println("+++++++++++"); + System.out.println(isBindGet1(frontInst, backInst)); + } + + private static boolean isBindGet1(Instruction frontInst, Instruction backInst) { + if (ObjectUtil.isNotEmpty(frontInst) && ObjectUtil.isNotEmpty(backInst)) { + String front_from_x = frontInst.getFrom_x(); + String front_from_y = frontInst.getFrom_y(); + String front_from_z = frontInst.getFrom_z(); + + String back_from_x = backInst.getFrom_x(); + String back_from_y = backInst.getFrom_y(); + String back_from_z = backInst.getFrom_z(); + boolean flagX = StrUtil.equals(front_from_x, back_from_x); + boolean flagY = ((Integer.parseInt(front_from_y) - 1) / 4 == (Integer.parseInt(back_from_y) - 1) / 4) && (((Integer.parseInt(front_from_y) % 4) + (Integer.parseInt(back_from_y) % 4) == 2) || (Integer.parseInt(front_from_y) % 4) + (Integer.parseInt(back_from_y) % 4) == 4); + boolean flagZ = StrUtil.equals(front_from_z, back_from_z); + if (flagX && flagY && flagZ) { + return true; + } + } + return false; + } +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/stacker/double_stacker/StandardStackerDeviceDriver.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/stacker/double_stacker/StandardStackerDeviceDriver.java index 56cda8b..f5592c1 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/stacker/double_stacker/StandardStackerDeviceDriver.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/stacker/double_stacker/StandardStackerDeviceDriver.java @@ -560,13 +560,7 @@ public class StandardStackerDeviceDriver extends AbstractOpcDeviceDriver impleme } else if (this.front_Zerror == ErrorEnum.ZD.getCode()) { if (!this.againRequireSuccess) { if (NO_HAS_GOODS.contains(this.front_forkCargo)) { - this.getzD(this.front_task); - Instruction back_inst = instructionService.findByCodeFromCache(String.valueOf(this.back_task)); - if (ObjectUtil.isNotEmpty(back_inst) && NO_HAS_GOODS.contains(this.back_forkCargo)) { - this.backWrite(back_inst); - } else if (ObjectUtil.isNotEmpty(back_inst) && HAS_GOODS.contains(this.back_forkCargo)) { - this.sendPutInfoToPlc(null, back_inst); - } + this.getzD(this.front_task, ForkTypeEnum.FRONT.getCode()); } else if (HAS_GOODS.contains(this.front_forkCargo)) { this.putzD(this.front_task, ForkTypeEnum.FRONT.getCode()); } @@ -574,13 +568,7 @@ public class StandardStackerDeviceDriver extends AbstractOpcDeviceDriver impleme } else if (this.back_Zerror == ErrorEnum.ZD.getCode()) { if (!this.againRequireSuccess) { if (NO_HAS_GOODS.contains(this.back_forkCargo)) { - this.getzD(this.back_task); - Instruction front_inst = instructionService.findByCodeFromCache(String.valueOf(this.front_task)); - if (ObjectUtil.isNotEmpty(front_inst) && NO_HAS_GOODS.contains(this.front_forkCargo)) { - this.frontWrite(front_inst); - } else if (ObjectUtil.isNotEmpty(front_inst) && HAS_GOODS.contains(this.front_forkCargo)) { - this.sendPutInfoToPlc(front_inst, null); - } + this.getzD(this.back_task, ForkTypeEnum.BACK.getCode()); } else if (HAS_GOODS.contains(this.back_forkCargo)) { this.putzD(this.back_task, ForkTypeEnum.BACK.getCode()); } @@ -667,9 +655,45 @@ public class StandardStackerDeviceDriver extends AbstractOpcDeviceDriver impleme if (ObjectUtil.isEmpty(frontInst)) { frontInst = instructionService.findReadyInstByLinkDeviceCodeAndNextDeviceCode(getLinkDeviceCode, frontNoY, getFrontDeviceCodeList); if (ObjectUtil.isNotEmpty(frontInst)) { - this.frontWrite(frontInst); + String qPoint = getZdPoint(frontInst.getStart_point_code()); + TaskDto taskDto = taskService.findByStartPointCode(qPoint); + if (ObjectUtil.isNotEmpty(taskDto)) { + String task_start_device_code = taskDto.getStart_device_code(); + String task_next_device_code = taskDto.getNext_device_code(); + Device task_start_device = deviceAppService.findDeviceByCode(task_start_device_code); + Device task_next_devcice = deviceAppService.findDeviceByCode(task_next_device_code); + if (task_start_device != null && task_next_devcice != null && instanceStorage(task_start_device) && instanceStorage(task_next_devcice)) { + Instruction instruction = instructionService.findByTaskCodeFromCache(taskDto.getTask_code()); + if (ObjectUtil.isEmpty(instruction)) { + frontInst = new Instruction(); + setInstruction(frontInst, taskDto); + try { + instructionService.create(frontInst); + taskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskService.update(taskDto); + } catch (Exception e) { + this.unExecutedMessage = "后叉出库任务,取货完成后,创建前叉移库指令时出现异常,原因:" + e.getMessage(); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "后叉出库任务,取货完成后,创建前叉移库指令时出现异常,原因:" + e.getMessage())); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "创建指令失败, 原因:" + e.getMessage())); + this.sendPutInfoToPlc(null, backInst); + return; + } + this.frontWrite(frontInst); + } else { + if (StrUtil.equals(instruction.getInstruction_status(), InstructionStatusEnum.READY.getIndex())) { + this.frontWrite(instruction); + } else { + this.sendPutInfoToPlc(null, backInst); + } + } + } else { + this.sendPutInfoToPlc(null, backInst); + } + } else { + this.frontWrite(frontInst); + } } else { - this.sendPutInfoToPlc(frontInst, backInst); + this.sendPutInfoToPlc(null, backInst); } } this.requireSuccess = true; @@ -705,9 +729,45 @@ public class StandardStackerDeviceDriver extends AbstractOpcDeviceDriver impleme if (ObjectUtil.isEmpty(backInst)) { backInst = instructionService.findReadyInstByLinkDeviceCodeAndNextDeviceCode(getLinkDeviceCode, backNoY, getBackDeviceCodeList); if (ObjectUtil.isNotEmpty(backInst)) { - this.backWrite(backInst); + String qPoint = getZdPoint(backInst.getStart_point_code()); + TaskDto taskDto = taskService.findByStartPointCode(qPoint); + if (ObjectUtil.isNotEmpty(taskDto)) { + String task_start_device_code = taskDto.getStart_device_code(); + String task_next_device_code = taskDto.getNext_device_code(); + Device task_start_device = deviceAppService.findDeviceByCode(task_start_device_code); + Device task_next_devcice = deviceAppService.findDeviceByCode(task_next_device_code); + if (task_start_device != null && task_next_devcice != null && instanceStorage(task_start_device) && instanceStorage(task_next_devcice)) { + Instruction instruction = instructionService.findByTaskCodeFromCache(taskDto.getTask_code()); + if (ObjectUtil.isEmpty(instruction)) { + backInst = new Instruction(); + setInstruction(backInst, taskDto); + try { + instructionService.create(backInst); + taskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskService.update(taskDto); + } catch (Exception e) { + this.unExecutedMessage = "前叉出库任务,取货完成后,创建后叉移库指令时出现异常,原因:" + e.getMessage(); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "前叉出库任务,取货完成后,创建后叉移库指令时出现异常,原因:" + e.getMessage())); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "创建指令失败, 原因:" + e.getMessage())); + this.sendPutInfoToPlc(frontInst, null); + return; + } + this.backWrite(backInst); + } else { + if (StrUtil.equals(instruction.getInstruction_status(), InstructionStatusEnum.READY.getIndex())) { + this.backWrite(instruction); + } else { + this.sendPutInfoToPlc(frontInst, null); + } + } + } else { + this.sendPutInfoToPlc(frontInst, null); + } + } else { + this.backWrite(backInst); + } } else { - this.sendPutInfoToPlc(frontInst, backInst); + this.sendPutInfoToPlc(frontInst, null); } } this.requireSuccess = true; @@ -777,7 +837,37 @@ public class StandardStackerDeviceDriver extends AbstractOpcDeviceDriver impleme String qPoint = getZdPoint(backInst.getStart_point_code()); TaskDto taskDto = taskService.findByStartPointCode(qPoint); if (ObjectUtil.isNotEmpty(taskDto)) { - this.sendPutInfoToPlc(frontInst, backInst); + String task_start_device_code = taskDto.getStart_device_code(); + String task_next_device_code = taskDto.getNext_device_code(); + Device task_start_device = deviceAppService.findDeviceByCode(task_start_device_code); + Device task_next_devcice = deviceAppService.findDeviceByCode(task_next_device_code); + if (task_start_device != null && task_next_devcice != null && instanceStorage(task_start_device) && instanceStorage(task_next_devcice)) { + Instruction instruction = instructionService.findByTaskCodeFromCache(taskDto.getTask_code()); + if (ObjectUtil.isEmpty(instruction)) { + backInst = new Instruction(); + setInstruction(backInst, taskDto); + try { + instructionService.create(backInst); + taskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskService.update(taskDto); + } catch (Exception e) { + this.unExecutedMessage = "前叉出库任务,取货完成后,创建后叉移库指令时出现异常,原因:" + e.getMessage(); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "前叉出库任务,取货完成后,创建后叉移库指令时出现异常,原因:" + e.getMessage())); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "创建指令失败, 原因:" + e.getMessage())); + this.sendPutInfoToPlc(frontInst, null); + return; + } + this.backWrite(backInst); + } else { + if (StrUtil.equals(instruction.getInstruction_status(), InstructionStatusEnum.READY.getIndex())) { + this.backWrite(instruction); + } else { + this.sendPutInfoToPlc(frontInst, null); + } + } + } else { + this.sendPutInfoToPlc(frontInst, null); + } } else { this.backWrite(backInst); } @@ -843,10 +933,43 @@ public class StandardStackerDeviceDriver extends AbstractOpcDeviceDriver impleme String qPoint = getZdPoint(frontInst.getStart_point_code()); TaskDto taskDto = taskService.findByStartPointCode(qPoint); if (ObjectUtil.isNotEmpty(taskDto)) { - this.sendPutInfoToPlc(frontInst, backInst); + String task_start_device_code = taskDto.getStart_device_code(); + String task_next_device_code = taskDto.getNext_device_code(); + Device task_start_device = deviceAppService.findDeviceByCode(task_start_device_code); + Device task_next_devcice = deviceAppService.findDeviceByCode(task_next_device_code); + if (task_start_device != null && task_next_devcice != null && instanceStorage(task_start_device) && instanceStorage(task_next_devcice)) { + Instruction instruction = instructionService.findByTaskCodeFromCache(taskDto.getTask_code()); + if (ObjectUtil.isEmpty(instruction)) { + frontInst = new Instruction(); + setInstruction(frontInst, taskDto); + try { + instructionService.create(frontInst); + taskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskService.update(taskDto); + } catch (Exception e) { + this.unExecutedMessage = "后叉出库任务,取货完成后,创建前叉移库指令时出现异常,原因:" + e.getMessage(); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "后叉出库任务,取货完成后,创建前叉移库指令时出现异常,原因:" + e.getMessage())); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "创建指令失败, 原因:" + e.getMessage())); + this.sendPutInfoToPlc(null, backInst); + return; + } + this.frontWrite(frontInst); + } else { + if (StrUtil.equals(instruction.getInstruction_status(), InstructionStatusEnum.READY.getIndex())) { + this.frontWrite(instruction); + } else { + this.sendPutInfoToPlc(null, backInst); + } + } + } else { + this.sendPutInfoToPlc(null, backInst); + } } else { this.frontWrite(frontInst); } + } else { + //下发前叉放货信息 + this.sendPutInfoToPlc(frontInst, backInst); } } } else { @@ -976,114 +1099,130 @@ public class StandardStackerDeviceDriver extends AbstractOpcDeviceDriver impleme List xDeviceCodeList = this.getExtraDeviceCodes("xDeviceCodeList"); String frontNoY = this.handExtraStringValue(this.getDevice(), "frontNoY"); String backNoY = this.handExtraStringValue(this.getDevice(), "backNoY"); - List frontTaskDtos = taskService.findReadyTaskByXDeviceCode(xDeviceCodeList, frontNoY); - TaskDto frontTaskDto = null; - TaskDto backTaskDto = null; - if (CollectionUtil.isNotEmpty(frontTaskDtos)) { - if (this.stackerNum == 2) { - for (TaskDto frontTask : frontTaskDtos) { - //查找一起取放的移库任务 - TaskDto backTask = taskService.findAllBindTask(frontTask, backNoY); - if (ObjectUtil.isEmpty(backTask)) { - //查找一起取的移库任务 - backTask = taskService.findFrontBindTask(frontTask, backNoY); + List readyFrontInstByXDeviceCode = instructionService.findReadyInstByXDeviceCode(xDeviceCodeList, frontNoY); + if (CollectionUtil.isEmpty(readyFrontInstByXDeviceCode)) { + List readyBackInstByXDeviceCode = instructionService.findReadyInstByXDeviceCode(xDeviceCodeList, backNoY); + if (CollectionUtil.isEmpty(readyBackInstByXDeviceCode)) { + List frontTaskDtos = taskService.findReadyTaskByXDeviceCode(xDeviceCodeList, frontNoY); + TaskDto frontTaskDto = null; + TaskDto backTaskDto = null; + if (CollectionUtil.isNotEmpty(frontTaskDtos)) { + if (this.stackerNum == 2) { + for (TaskDto frontTask : frontTaskDtos) { + //查找一起取放的移库任务 + TaskDto backTask = taskService.findAllBindTask(frontTask, backNoY); + if (ObjectUtil.isEmpty(backTask)) { + //查找一起取的移库任务 + backTask = taskService.findFrontBindTask(frontTask, backNoY); + } + if (ObjectUtil.isNotEmpty(backTask)) { + frontTaskDto = frontTask; + backTaskDto = backTask; + break; + } + } } - if (ObjectUtil.isNotEmpty(backTask)) { - frontTaskDto = frontTask; - backTaskDto = backTask; - break; + if (ObjectUtil.isEmpty(frontTaskDto) && ObjectUtil.isEmpty(backTaskDto)) { + frontTaskDto = frontTaskDtos.get(0); + } + } else { + if (this.stackerNum == 2) { + List backTaskDtos = taskService.findReadyTaskByXDeviceCode(xDeviceCodeList, backNoY); + if (CollectionUtil.isNotEmpty(backTaskDtos)) { + backTaskDto = backTaskDtos.get(0); + } } } - } - if (ObjectUtil.isEmpty(frontTaskDto) && ObjectUtil.isEmpty(backTaskDto)) { - frontTaskDto = frontTaskDtos.get(0); + if (ObjectUtil.isNotEmpty(frontTaskDto) && ObjectUtil.isNotEmpty(backTaskDto)) { + if ((!frontTaskDto.getTask_code().endsWith("-") || !backTaskDto.getTask_code().endsWith("-")) && !Online.isOnline) { + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "WMS离线,不生成指令, 在线状态: " + Online.isOnline)); + this.unExecutedMessage = "WMS离线,不生成移库指令, 在线状态: " + Online.isOnline; + } + Instruction frontInst = new Instruction(); + setInstruction(frontInst, frontTaskDto); + Instruction backInst = new Instruction(); + setInstruction(backInst, backTaskDto); + try { + instructionService.create(frontInst); + instructionService.create(backInst); + frontTaskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); + backTaskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskService.update(frontTaskDto); + taskService.update(backTaskDto); + } catch (Exception e) { + this.unExecutedMessage = "创建移库指令时出现异常,原因:" + e.getMessage(); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "创建指令失败, 原因:" + e.getMessage())); + return; + } + this.FBWrite(frontInst, backInst); + this.unExecutedMessage = null; + this.requireSuccess = true; + } else if (ObjectUtil.isNotEmpty(frontTaskDto)) { + if (!frontTaskDto.getTask_code().endsWith("-") && !Online.isOnline) { + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "WMS离线,不生成指令, 在线状态: " + Online.isOnline)); + this.unExecutedMessage = "WMS离线,不生成移库指令, 在线状态: " + Online.isOnline; + } + Instruction frontInst = new Instruction(); + setInstruction(frontInst, frontTaskDto); + try { + instructionService.create(frontInst); + frontTaskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskService.update(frontTaskDto); + } catch (Exception e) { + this.unExecutedMessage = "创建移库指令时出现异常,原因:" + e.getMessage(); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "创建指令失败, 原因:" + e.getMessage())); + return; + } + this.frontWrite(frontInst); + this.unExecutedMessage = null; + this.requireSuccess = true; + } else if (ObjectUtil.isNotEmpty(backTaskDto)) { + if (!backTaskDto.getTask_code().endsWith("-") && !Online.isOnline) { + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "WMS离线,不生成指令, 在线状态: " + Online.isOnline)); + this.unExecutedMessage = "WMS离线,不生成移库指令, 在线状态: " + Online.isOnline; + } + Instruction backInst = new Instruction(); + setInstruction(backInst, backTaskDto); + try { + instructionService.create(backInst); + backTaskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskService.update(backTaskDto); + } catch (Exception e) { + this.unExecutedMessage = "创建移库指令时出现异常,原因:" + e.getMessage(); + logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "创建指令失败, 原因:" + e.getMessage())); + return; + } + this.backWrite(backInst); + this.unExecutedMessage = null; + this.requireSuccess = true; + } else { + String strategyValue = Optional.ofNullable(this.getExtraValue().get("strategyValue")).map(Object::toString).orElse(""); + switch (strategyValue) { + case "2": + this.applyOutTask(); + break; + case "3": + this.applyTaskByTime(); + break; + case "4": + this.applyTaskOneInOneOut(); + break; + default: + this.applyInTask(); + break; + } + } + } else { + Instruction backInst = readyBackInstByXDeviceCode.get(0); + this.backWrite(backInst); + this.unExecutedMessage = null; + this.requireSuccess = true; } } else { - if (this.stackerNum == 2) { - List backTaskDtos = taskService.findReadyTaskByXDeviceCode(xDeviceCodeList, backNoY); - if (CollectionUtil.isNotEmpty(backTaskDtos)) { - backTaskDto = backTaskDtos.get(0); - } - } - } - if (ObjectUtil.isNotEmpty(frontTaskDto) && ObjectUtil.isNotEmpty(backTaskDto)) { - if ((!frontTaskDto.getTask_code().endsWith("-") || !backTaskDto.getTask_code().endsWith("-")) && !Online.isOnline) { - logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "WMS离线,不生成指令, 在线状态: " + Online.isOnline)); - this.unExecutedMessage = "WMS离线,不生成移库指令, 在线状态: " + Online.isOnline; - } - Instruction frontInst = new Instruction(); - setInstruction(frontInst, frontTaskDto); - Instruction backInst = new Instruction(); - setInstruction(backInst, backTaskDto); - try { - instructionService.create(frontInst); - instructionService.create(backInst); - frontTaskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); - backTaskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); - taskService.update(frontTaskDto); - taskService.update(backTaskDto); - } catch (Exception e) { - this.unExecutedMessage = "创建移库指令时出现异常,原因:" + e.getMessage(); - logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "创建指令失败, 原因:" + e.getMessage())); - return; - } - this.FBWrite(frontInst, backInst); - this.unExecutedMessage = null; - this.requireSuccess = true; - } else if (ObjectUtil.isNotEmpty(frontTaskDto)) { - if (!frontTaskDto.getTask_code().endsWith("-") && !Online.isOnline) { - logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "WMS离线,不生成指令, 在线状态: " + Online.isOnline)); - this.unExecutedMessage = "WMS离线,不生成移库指令, 在线状态: " + Online.isOnline; - } - Instruction frontInst = new Instruction(); - setInstruction(frontInst, frontTaskDto); - try { - instructionService.create(frontInst); - frontTaskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); - taskService.update(frontTaskDto); - } catch (Exception e) { - this.unExecutedMessage = "创建移库指令时出现异常,原因:" + e.getMessage(); - logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "创建指令失败, 原因:" + e.getMessage())); - return; - } + Instruction frontInst = readyFrontInstByXDeviceCode.get(0); this.frontWrite(frontInst); this.unExecutedMessage = null; this.requireSuccess = true; - } else if (ObjectUtil.isNotEmpty(backTaskDto)) { - if (!backTaskDto.getTask_code().endsWith("-") && !Online.isOnline) { - logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "WMS离线,不生成指令, 在线状态: " + Online.isOnline)); - this.unExecutedMessage = "WMS离线,不生成移库指令, 在线状态: " + Online.isOnline; - } - Instruction backInst = new Instruction(); - setInstruction(backInst, backTaskDto); - try { - instructionService.create(backInst); - backTaskDto.setTask_status(TaskStatusEnum.BUSY.getIndex()); - taskService.update(backTaskDto); - } catch (Exception e) { - this.unExecutedMessage = "创建移库指令时出现异常,原因:" + e.getMessage(); - logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "创建指令失败, 原因:" + e.getMessage())); - return; - } - this.backWrite(backInst); - this.unExecutedMessage = null; - this.requireSuccess = true; - } else { - String strategyValue = Optional.ofNullable(this.getExtraValue().get("strategyValue")).map(Object::toString).orElse(""); - switch (strategyValue) { - case "2": - this.applyOutTask(); - break; - case "3": - this.applyTaskByTime(); - break; - case "4": - this.applyTaskOneInOneOut(); - break; - default: - this.applyInTask(); - break; - } } } @@ -1551,7 +1690,7 @@ public class StandardStackerDeviceDriver extends AbstractOpcDeviceDriver impleme if (ObjectUtil.isNotEmpty(inst)) { return; } - }else { + } else { logService.deviceExecuteLog(new LuceneLogDto(this.currentDeviceCode, "第四次查询到前叉指令号:" + frontInst.getInstruction_code())); if (frontInst.getTo_y() != null && (1 == Integer.parseInt(frontInst.getTo_y()) || 2 == Integer.parseInt(frontInst.getTo_y()))) { frontInst = null; @@ -2161,7 +2300,7 @@ public class StandardStackerDeviceDriver extends AbstractOpcDeviceDriver impleme } /** - * 取货阻挡 + * 双叉取货阻挡 */ private void getzD(Integer task) { long currentTimeMillis = System.currentTimeMillis(); @@ -2201,6 +2340,62 @@ public class StandardStackerDeviceDriver extends AbstractOpcDeviceDriver impleme } } + /** + * 前或后取货阻挡 + */ + private void getzD(Integer task, String type) { + long currentTimeMillis = System.currentTimeMillis(); + if (!isTimeValid(currentTimeMillis)) { + log.trace("触发时间因为小于{}毫秒,而被无视", this.requireTimeOut); + } else { + this.requireTime = currentTimeMillis; + Instruction inst = instructionService.findByCodeFromCache(String.valueOf(task)); + if (inst != null) { + JSONObject param = new JSONObject(); + param.put("task_code", inst.getTask_code()); + param.put("struct_code", getZdPoint(inst.getStart_point_code())); + //通知WMS取货阻挡 + CommonRequest request = + CommonRequest.builder() + .service("ErrorTask") + .type("czd") + .data(param) + .build(); + UnifiedResponse response = acsToWmsService.apply(request, JSONObject.class); + if (response.isSuccess()) { + //取消ACS指令和任务 + TaskDto taskDto = taskService.findByCodeFromCache(inst.getTask_code()); + String next_device_code = taskDto.getNext_device_code(); + instructionService.cancelInstAndTaskNoSendWms(inst.getInstruction_id()); + Device next_device = deviceAppService.findDeviceByCode(next_device_code); + if (next_device != null && next_device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { + AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) next_device.getDeviceDriver(); + if (appearanceInspectionScannerConveyorDeviceDriver.isRequireSuccess()) { + appearanceInspectionScannerConveyorDeviceDriver.setRequireSuccess(false); + } + } + this.writing(ItemProtocol.TO_COMMAND.getKey(), SendSignalEnum.COMMAND_FIVE.getSignalNum()); + if (StrUtil.equals(ForkTypeEnum.FRONT.getCode(), type)) { + Instruction back_inst = instructionService.findByCodeFromCache(String.valueOf(this.back_task)); + if (ObjectUtil.isNotEmpty(back_inst) && NO_HAS_GOODS.contains(this.back_forkCargo)) { + this.backWrite(back_inst); + } else if (ObjectUtil.isNotEmpty(back_inst) && HAS_GOODS.contains(this.back_forkCargo)) { + this.sendPutInfoToPlc(null, back_inst); + } + } else if (StrUtil.equals(ForkTypeEnum.BACK.getCode(), type)) { + Instruction front_inst = instructionService.findByCodeFromCache(String.valueOf(this.front_task)); + if (ObjectUtil.isNotEmpty(front_inst) && NO_HAS_GOODS.contains(this.front_forkCargo)) { + this.frontWrite(front_inst); + } else if (ObjectUtil.isNotEmpty(front_inst) && HAS_GOODS.contains(this.front_forkCargo)) { + this.sendPutInfoToPlc(front_inst, null); + } + } + this.againRequireSuccess = true; + } + } + } + } + /** * 放货阻挡 */ diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/station/with_station/WithStationDeviceDriver.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/station/with_station/WithStationDeviceDriver.java index 007abf9..4372c04 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/station/with_station/WithStationDeviceDriver.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/device/driver/station/with_station/WithStationDeviceDriver.java @@ -80,7 +80,7 @@ public class WithStationDeviceDriver extends AbstractOpcDeviceDriver implements AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver; if (ObjectUtil.isNotEmpty(device) && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); - if (appearanceInspectionScannerConveyorDeviceDriver.getMove() == 0 && this.requireSuccess) { + if (!appearanceInspectionScannerConveyorDeviceDriver.isWithStationRequireSuccess() && this.requireSuccess) { this.requireSuccess = false; logServer.deviceExecuteLog(new LuceneLogDto(this.device_code, "标记复位:" + this.requireSuccess)); continue; @@ -98,7 +98,7 @@ public class WithStationDeviceDriver extends AbstractOpcDeviceDriver implements AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver; if (ObjectUtil.isNotEmpty(device) && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); - if (appearanceInspectionScannerConveyorDeviceDriver.getMove() == 0 && this.requireSuccess) { + if (!appearanceInspectionScannerConveyorDeviceDriver.isWithStationRequireSuccess() && this.requireSuccess) { this.requireSuccess = false; logServer.deviceExecuteLog(new LuceneLogDto(this.device_code, "标记复位:" + this.requireSuccess)); continue; diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/UnifiedResponse.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/UnifiedResponse.java index d920da5..ac40169 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/UnifiedResponse.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/UnifiedResponse.java @@ -4,6 +4,7 @@ package org.nl.acs.ext; public class UnifiedResponse { private boolean success; private String message; + private String reqCode; private T data; public UnifiedResponse(boolean success, String message, T data) { @@ -12,12 +13,25 @@ public class UnifiedResponse { this.data = data; } + public UnifiedResponse(boolean success, String message, String reqCode, T data) { + this.success = success; + this.message = message; + this.reqCode = reqCode; + this.data = data; + } + public UnifiedResponse(boolean success, String message) { this.success = success; this.message = message; } + public UnifiedResponse(boolean success, String message, String reqCode) { + this.success = success; + this.message = message; + this.reqCode = reqCode; + } + public boolean isSuccess() { return this.success; } @@ -26,6 +40,10 @@ public class UnifiedResponse { return this.message; } + public String getReqCode() { + return this.reqCode; + } + public T getData() { return this.data; } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/HkHttpUtil.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/HkHttpUtil.java new file mode 100644 index 0000000..70e2149 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/HkHttpUtil.java @@ -0,0 +1,134 @@ +package org.nl.acs.ext.hk; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpRequest; +import com.alibaba.fastjson.JSON; +import org.nl.acs.AcsConfig; +import org.nl.acs.common.base.CommonFinalParam; +import org.nl.acs.ext.RequestAdapter; +import org.nl.acs.ext.ResponseAdapter; +import org.nl.acs.ext.UnifiedResponse; +import org.nl.acs.ext.log.ToOthersInterfaceLog; +import org.nl.system.service.param.ISysParamService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/4/22 + */ +@Component +public class HkHttpUtil { + + private static final RequestAdapter REQUEST_ADAPTER = new HkRequestAdapter(); + private static final ResponseAdapter RESPONSE_ADAPTER = new HkResponseAdapter(); + + @Autowired + private ISysParamService paramService; + + @ToOthersInterfaceLog("ACS->HK") + public UnifiedResponse sendPostRequest(String path, W requestParam, Class type) { + if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_HK).getValue(), CommonFinalParam.ONE)) { + return new UnifiedResponse<>(false, "未开启连接该系统!"); + } + try { + String body = HttpRequest + .post(REQUEST_ADAPTER.getUrl() + path) + .setConnectionTimeout(5000) + .body(JSON.toJSONString(requestParam)) + .execute() + .body(); + return RESPONSE_ADAPTER.adapt(body, type); + } catch (Exception e) { + return new UnifiedResponse<>(false, e.getMessage()); + } + } + + @ToOthersInterfaceLog("ACS->HK") + public UnifiedResponse sendPostRequest(String path, W requestParam) { + if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_HK).getValue(), CommonFinalParam.ONE)) { + return new UnifiedResponse<>(false, "未开启连接该系统!"); + } + try { + String body = HttpRequest + .post(REQUEST_ADAPTER.getUrl() + path) + .setConnectionTimeout(5000) + .body(JSON.toJSONString(requestParam)) + .execute() + .body(); + return RESPONSE_ADAPTER.adapt(body, null); + } catch (Exception e) { + return new UnifiedResponse<>(false, e.getMessage()); + } + } + + @ToOthersInterfaceLog("ACS->HK") + public UnifiedResponse sendPostRequest(String path, Class type) { + if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_HK).getValue(), CommonFinalParam.ONE)) { + return new UnifiedResponse<>(false, "未开启连接该系统!"); + } + try { + String body = HttpRequest + .post(REQUEST_ADAPTER.getUrl() + path) + .setConnectionTimeout(5000) + .execute() + .body(); + return RESPONSE_ADAPTER.adapt(body, type); + } catch (Exception e) { + return new UnifiedResponse<>(false, e.getMessage()); + } + } + + @ToOthersInterfaceLog("ACS->HK") + public UnifiedResponse sendPostRequest(String path) { + if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_HK).getValue(), CommonFinalParam.ONE)) { + return new UnifiedResponse<>(false, "未开启连接该系统!"); + } + try { + String body = HttpRequest + .post(REQUEST_ADAPTER.getUrl() + path) + .setConnectionTimeout(5000) + .execute() + .body(); + return RESPONSE_ADAPTER.adapt(body, null); + } catch (Exception e) { + return new UnifiedResponse<>(false, e.getMessage()); + } + } + + @ToOthersInterfaceLog("ACS->HK") + public UnifiedResponse sendGetRequest(String path, Class type) { + if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_HK).getValue(), CommonFinalParam.ONE)) { + return new UnifiedResponse<>(false, "未开启连接该系统!"); + } + try { + String body = HttpRequest + .get(REQUEST_ADAPTER.getUrl() + path) + .setConnectionTimeout(5000) + .execute() + .body(); + return RESPONSE_ADAPTER.adapt(body, type); + } catch (Exception e) { + return new UnifiedResponse<>(false, e.getMessage()); + } + } + + @ToOthersInterfaceLog("ACS->HK") + public UnifiedResponse sendGetRequest(String path) { + if (!StrUtil.equals(paramService.findByCode(AcsConfig.HAS_HK).getValue(), CommonFinalParam.ONE)) { + return new UnifiedResponse<>(false, "未开启连接该系统!"); + } + try { + String body = HttpRequest + .get(REQUEST_ADAPTER.getUrl() + path) + .setConnectionTimeout(5000) + .execute() + .body(); + return RESPONSE_ADAPTER.adapt(body, null); + } catch (Exception e) { + return new UnifiedResponse<>(false, e.getMessage()); + } + } + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/HkRequestAdapter.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/HkRequestAdapter.java new file mode 100644 index 0000000..4729c1d --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/HkRequestAdapter.java @@ -0,0 +1,21 @@ +package org.nl.acs.ext.hk; + +import org.nl.acs.AcsConfig; +import org.nl.acs.ext.RequestAdapter; +import org.nl.config.SpringContextHolder; +import org.nl.system.service.param.ISysParamService; + + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/4/22 + */ +public class HkRequestAdapter implements RequestAdapter { + @Override + public String getUrl() { + ISysParamService paramService = SpringContextHolder.getBean(ISysParamService.class); + return paramService.findByCode(AcsConfig.HK_URL).getValue(); + } + +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/HkResponseAdapter.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/HkResponseAdapter.java new file mode 100644 index 0000000..7ad8e93 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/HkResponseAdapter.java @@ -0,0 +1,41 @@ +package org.nl.acs.ext.hk; + + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.ext.ResponseAdapter; +import org.nl.acs.ext.UnifiedResponse; + +import java.util.Collection; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/4/22 + */ +public class HkResponseAdapter implements ResponseAdapter { + + @Override + public UnifiedResponse adapt(String responseBody, Class type) { + JSONObject resp = JSON.parseObject(responseBody); + boolean isSuccess = resp.getInteger("code") == 0; + String message = resp.getString("message"); + String reqCode = resp.getString("reqCode"); + if (type != null) { + Object dataObject = resp.get("data"); + T data; + if (type == String.class) { + data = type.cast(dataObject.toString()); + } else if (type == Object.class) { + data = type.cast(dataObject); + } else if (type.isArray() || Collection.class.isAssignableFrom(type)) { + data = JSON.parseObject(dataObject.toString(), type); + } else { + data = JSON.parseObject(resp.getString("data"), type); + } + return new UnifiedResponse<>(isSuccess, message, reqCode, data); + } + return new UnifiedResponse<>(isSuccess, message, reqCode); + } + +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/rest/AcsToHkController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/rest/AcsToHkController.java new file mode 100644 index 0000000..8c235b6 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/rest/AcsToHkController.java @@ -0,0 +1,66 @@ +package org.nl.acs.ext.hk.rest; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.ext.hk.service.AcsToHkService; +import org.nl.acs.ext.hk.service.data.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author ludj + * @date 2021-07-21 + **/ +@RestController +@RequiredArgsConstructor +@RequestMapping("/acsToHk") +@Slf4j +public class AcsToHkController { + + @Autowired + private AcsToHkService acsToHkService; + + @SaIgnore + @PostMapping("/queryTaskStatus") + public ResponseEntity agvCallback(@RequestBody JSONObject requestParam) { + QueryTaskStatusReq queryTaskStatusReq = JSONObject.toJavaObject(requestParam, QueryTaskStatusReq.class); +// BaseReq req = BaseReq.builder().data(queryTaskStatusReq).build(); + QueryTaskStatusReq req = QueryTaskStatusReq.builder().taskCodes(requestParam.getJSONArray("taskCodes").toJavaList(String.class)).build(); + return new ResponseEntity<>(acsToHkService.queryTaskStatus(queryTaskStatusReq, List.class), HttpStatus.OK); + } + + @SaIgnore + @PostMapping("/stopRobot") + public ResponseEntity stopRobot(@RequestBody JSONObject requestParam) { +// StopRobotReq stopRobotReq = JSONObject.toJavaObject(requestParam, StopRobotReq.class); + StopRobotReq req = StopRobotReq.builder().robotCount(requestParam.getString("robotCount")).robots(requestParam.getJSONArray("robots").toJavaList(String.class)).build(); + return new ResponseEntity<>(acsToHkService.stopRobot(req), HttpStatus.OK); + } + + @SaIgnore + @PostMapping("/resumeRobot") + public ResponseEntity resumeRobot(@RequestBody JSONObject requestParam) { +// ResumeRobotReq resumeRobotReq = JSONObject.toJavaObject(requestParam, ResumeRobotReq.class); + ResumeRobotReq req = ResumeRobotReq.builder().robotCount(requestParam.getString("robotCount")).robots(requestParam.getJSONArray("robots").toJavaList(String.class)).build(); + return new ResponseEntity<>(acsToHkService.resumeRobot(req), HttpStatus.OK); + } + + @SaIgnore + @PostMapping("/bindPodAndBerth") + public ResponseEntity bindPodAndBerth(@RequestBody JSONObject requestParam) { +// BindPodAndBerthReq bindPodAndBerthReq = JSONObject.toJavaObject(requestParam, BindPodAndBerthReq.class); + BindPodAndBerthReq req = BindPodAndBerthReq.builder().podCode(requestParam.getString("podCode")).positionCode(requestParam.getString("positionCode")).indBind(requestParam.getString("indBind")).build(); + + return new ResponseEntity<>(acsToHkService.bindPodAndBerth(req), HttpStatus.OK); + } + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/rest/HkToACSController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/rest/HkToACSController.java new file mode 100644 index 0000000..5c93137 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/rest/HkToACSController.java @@ -0,0 +1,41 @@ +package org.nl.acs.ext.hk.rest; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.ext.hk.service.HkToAcsService; +import org.nl.acs.ext.log.OthersToInterfaceLog; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author wangs + * @date 2021-07-21 + **/ +@RestController +@RequiredArgsConstructor +@RequestMapping("/hkToAcs") +@Slf4j +public class HkToACSController { + + private final HkToAcsService hkToAcsService; + + @SaIgnore + @PostMapping("/agv/agvCallbackService/agvCallback") + @OthersToInterfaceLog("HK->ACS") + public ResponseEntity agvCallback(@RequestBody JSONObject requestParam) { + return new ResponseEntity<>(hkToAcsService.agvCallback(requestParam), HttpStatus.OK); + } + + @SaIgnore + @PostMapping("/agvCallbackService/warnCallback") + @OthersToInterfaceLog("HK->ACS") + public ResponseEntity warnCallback(@RequestBody JSONObject requestParam) { + return new ResponseEntity<>(hkToAcsService.warnCallback(requestParam), HttpStatus.OK); + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/AcsToHkService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/AcsToHkService.java new file mode 100644 index 0000000..1c36f40 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/AcsToHkService.java @@ -0,0 +1,110 @@ +package org.nl.acs.ext.hk.service; + +import org.nl.acs.ext.UnifiedResponse; +import org.nl.acs.ext.hk.service.data.*; + +/** + * @author onepiece + */ +public interface AcsToHkService { + + /** + * 生成任务单 + * + * @param type 响应类型 + * @param requestParam + * @return + */ + public UnifiedResponse genAgvSchedulingTask(BaseReq requestParam, Class type); + + /** + * 继续执行任务 + * + * @param requestParam + * @return + */ + public UnifiedResponse continueTask(BaseReq requestParam); + + /** + * 取消任务 + * + * @param requestParam + * @return + */ + public UnifiedResponse cancelTask(BaseReq requestParam); + + /** + * 查询任务状态 + * + * @param type 响应类型 + * @param requestParam + * @return + */ + public UnifiedResponse queryTaskStatus(BaseReq requestParam, Class type); + + + /** + * 查询AGV状态 + * + * @param type 响应类型 + * @param requestParam + * @return + */ + public UnifiedResponse queryAgvStatus(BaseReq requestParam, Class type); + + + /** + * 停止AGV + * + * @param requestParam + * @return + */ + public UnifiedResponse stopRobot(BaseReq requestParam); + + /** + * 恢复AGV + * + * @param requestParam + * @return + */ + public UnifiedResponse resumeRobot(BaseReq requestParam); + + + /** + * 区域清空或释放 + * + * @param requestParam + * @return + */ + public UnifiedResponse blockArea(BaseReq requestParam); + + + /** + * 预调度对外接口 + * + * @param type 响应类型 + * @param requestParam + * @return + */ + public UnifiedResponse genPreScheduleTask(BaseReq requestParam, Class type); + + /** + * 料箱取放回调 + * + * @param type 响应类型 + * @param requestParam + * @return + */ + public UnifiedResponse boxApplyPass(BaseReq requestParam, Class type); + + + /** + * 货架与位置绑定、解绑 + * + * @param requestParam + * @return + */ + public UnifiedResponse bindPodAndBerth(BaseReq requestParam); + +} + diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/HkToAcsService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/HkToAcsService.java new file mode 100644 index 0000000..98a27d6 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/HkToAcsService.java @@ -0,0 +1,27 @@ +package org.nl.acs.ext.hk.service; + +import com.alibaba.fastjson.JSONObject; + + +/** + * @author onepiece + */ +public interface HkToAcsService { + + /** + * CTU回调接口处理逻辑 + * + * @param requestParam + * @return + */ + JSONObject agvCallback(JSONObject requestParam); + + + /** + * CTU报警接口处理逻辑 + * + * @param requestParam + * @return + */ + JSONObject warnCallback(JSONObject requestParam); +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BaseReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BaseReq.java new file mode 100644 index 0000000..a034a25 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BaseReq.java @@ -0,0 +1,27 @@ +package org.nl.acs.ext.hk.service.data; + +import cn.hutool.core.date.DateUtil; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import org.nl.config.IdUtil; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@SuperBuilder +@AllArgsConstructor +@NoArgsConstructor +public class BaseReq { + @Builder.Default + private String reqCode = IdUtil.getStringId(); + @Builder.Default + private String reqTime = DateUtil.now(); + private String clientCode; + private String tokenCode; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BaseResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BaseResp.java new file mode 100644 index 0000000..69bb329 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BaseResp.java @@ -0,0 +1,15 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class BaseResp { + private String reqCode; + private String code; + private String message; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BindPodAndBerthReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BindPodAndBerthReq.java new file mode 100644 index 0000000..3e080b1 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BindPodAndBerthReq.java @@ -0,0 +1,25 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class BindPodAndBerthReq extends BaseReq { + private String podCode; + private String positionCode; + private String podDir; + private String characterValue; + private String indBind; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BindPodAndBerthResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BindPodAndBerthResp.java new file mode 100644 index 0000000..97d1412 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BindPodAndBerthResp.java @@ -0,0 +1,13 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class BindPodAndBerthResp extends BaseResp { + +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BlockAreaReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BlockAreaReq.java new file mode 100644 index 0000000..fd4d28f --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BlockAreaReq.java @@ -0,0 +1,31 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Builder; +import lombok.Data; +import lombok.experimental.SuperBuilder; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@SuperBuilder +public class BlockAreaReq extends BaseReq { + /** + * 被封锁或解封的区域编号 + */ + private String matterArea; + + /** + * "1":封锁, + * "0":解封 + */ + private String indBind; + + + private String pause; + private String controlMod; + private String targetArea; + private String noticeThird; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BlockAreaResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BlockAreaResp.java new file mode 100644 index 0000000..9670a29 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BlockAreaResp.java @@ -0,0 +1,13 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class BlockAreaResp extends BaseResp { + +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BoxApplyPassReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BoxApplyPassReq.java new file mode 100644 index 0000000..5a239e8 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BoxApplyPassReq.java @@ -0,0 +1,25 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Builder; +import lombok.Data; +import lombok.experimental.SuperBuilder; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@SuperBuilder +public class BoxApplyPassReq extends BaseReq { + /** + * 指令号 + */ + private String taskCode; + /** + * 1-取申请通过 + *

+ * 2-放申请通过 + */ + private String type; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BoxApplyPassResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BoxApplyPassResp.java new file mode 100644 index 0000000..1569aa8 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/BoxApplyPassResp.java @@ -0,0 +1,13 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class BoxApplyPassResp extends BaseResp { + private String data; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/CancelTaskReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/CancelTaskReq.java new file mode 100644 index 0000000..6466028 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/CancelTaskReq.java @@ -0,0 +1,19 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Builder; +import lombok.Data; +import lombok.experimental.SuperBuilder; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@SuperBuilder +public class CancelTaskReq extends BaseReq{ + private String forceCancel; + private String matterArea; + private String agvCode; + private String taskCode; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/CanncelTaskResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/CanncelTaskResp.java new file mode 100644 index 0000000..5813219 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/CanncelTaskResp.java @@ -0,0 +1,12 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class CanncelTaskResp extends BaseResp { +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ContinueTaskReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ContinueTaskReq.java new file mode 100644 index 0000000..4b34812 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ContinueTaskReq.java @@ -0,0 +1,21 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Builder; +import lombok.Data; +import lombok.experimental.SuperBuilder; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@SuperBuilder +public class ContinueTaskReq extends BaseReq{ + private String wbCode; + private String podCode; + private String agvCode; + private String taskCode; + private String taskSeq; + private Object nextPositionCode; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ContinueTaskResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ContinueTaskResp.java new file mode 100644 index 0000000..e79b891 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ContinueTaskResp.java @@ -0,0 +1,12 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class ContinueTaskResp extends BaseResp { +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenAgvSchedulingTaskReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenAgvSchedulingTaskReq.java new file mode 100644 index 0000000..1a7c852 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenAgvSchedulingTaskReq.java @@ -0,0 +1,38 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Builder; +import lombok.Data; +import lombok.experimental.SuperBuilder; +import org.apache.poi.ss.formula.functions.T; + +import java.util.List; +import java.util.Map; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@SuperBuilder +public class GenAgvSchedulingTaskReq extends BaseReq{ + private String taskTyp; + private String ctnrTyp; + private String ctnrCode; + private String ctnrNum; + private String taskMode; + private String wbCode; + private List> positionCodePath; + private String podCode; + private String podDir; + private String podTyp; + private String materialLot; + private String materialType; + private String priority; + private String taskCode; + private String agvCode; + private String groupId; + private String agvTyp; + private String positionSelStrategy; + private String data; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenAgvSchedulingTaskResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenAgvSchedulingTaskResp.java new file mode 100644 index 0000000..569ba2d --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenAgvSchedulingTaskResp.java @@ -0,0 +1,13 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class GenAgvSchedulingTaskResp extends BaseResp { + private String data; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenPreScheduleTaskReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenPreScheduleTaskReq.java new file mode 100644 index 0000000..5a80f86 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenPreScheduleTaskReq.java @@ -0,0 +1,48 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Builder; +import lombok.Data; +import lombok.experimental.SuperBuilder; + +import java.math.BigDecimal; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@SuperBuilder +public class GenPreScheduleTaskReq extends BaseReq { + /** + * 任务点位呼叫号 + */ + private String positionCode; + /** + * 预调度时间(s) + * 表示真实任务预计多久后生成,传-1 + * 清空点位全部的预调度任务 + */ + private String nextTask; + /** + * AGV 类型,预调度需要指定车型 + */ + private String agvTyp; + /** + * 优先级 + */ + private String priority; + /** + * 需求空仓位数 + */ + private String useableLayers; + /** + * 缓存料箱数 + */ + private String cacheCount; + /** + * 是否更新,默认为 0 + */ + private BigDecimal update; + +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenPreScheduleTaskResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenPreScheduleTaskResp.java new file mode 100644 index 0000000..46c5d3f --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/GenPreScheduleTaskResp.java @@ -0,0 +1,13 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class GenPreScheduleTaskResp extends BaseResp { + private String data; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryAgvStatusReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryAgvStatusReq.java new file mode 100644 index 0000000..56f5839 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryAgvStatusReq.java @@ -0,0 +1,19 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Builder; +import lombok.Data; +import lombok.experimental.SuperBuilder; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@SuperBuilder +public class QueryAgvStatusReq extends BaseReq { + /** + * 地图编号 + */ + private String mapCode; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryAgvStatusResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryAgvStatusResp.java new file mode 100644 index 0000000..760d923 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryAgvStatusResp.java @@ -0,0 +1,16 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; +import org.nl.acs.ext.hk.service.data.dto.QueryAgvStatusDto; + +import java.util.List; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class QueryAgvStatusResp extends BaseResp { + private List data; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryTaskStatusReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryTaskStatusReq.java new file mode 100644 index 0000000..ea1d1db --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryTaskStatusReq.java @@ -0,0 +1,23 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class QueryTaskStatusReq extends BaseReq{ + private List taskCodes; + private String agvCode; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryTaskStatusResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryTaskStatusResp.java new file mode 100644 index 0000000..ab8934b --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/QueryTaskStatusResp.java @@ -0,0 +1,16 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; +import org.nl.acs.ext.hk.service.data.dto.QueryTaskStatusDto; + +import java.util.List; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class QueryTaskStatusResp extends BaseResp { + private List data; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ResumeRobotReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ResumeRobotReq.java new file mode 100644 index 0000000..90166c8 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ResumeRobotReq.java @@ -0,0 +1,24 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class ResumeRobotReq extends BaseReq { + private String robotCount; + private String mapShortName; + private List robots; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ResumeRobotResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ResumeRobotResp.java new file mode 100644 index 0000000..7963b4e --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/ResumeRobotResp.java @@ -0,0 +1,13 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class ResumeRobotResp extends BaseResp { + +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/StopRobotReq.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/StopRobotReq.java new file mode 100644 index 0000000..921526f --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/StopRobotReq.java @@ -0,0 +1,24 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +public class StopRobotReq extends BaseReq { + private String robotCount; + private String mapShortName; + private List robots; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/StopRobotResp.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/StopRobotResp.java new file mode 100644 index 0000000..d5a55bd --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/StopRobotResp.java @@ -0,0 +1,13 @@ +package org.nl.acs.ext.hk.service.data; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Data +public class StopRobotResp extends BaseResp { + +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/dto/QueryAgvStatusDto.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/dto/QueryAgvStatusDto.java new file mode 100644 index 0000000..25aa93d --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/dto/QueryAgvStatusDto.java @@ -0,0 +1,28 @@ +package org.nl.acs.ext.hk.service.data.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/1/3 + */ +@Data +public class QueryAgvStatusDto { + private String robotCode; + private String robotDir; + private String robotIp; + private String battery; + private String posX; + private String posY; + private String mapCode; + private String speed; + private String status; + private String exclType; + private String stop; + private String podCode; + private String podDir; + private List path; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/dto/QueryTaskStatusDto.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/dto/QueryTaskStatusDto.java new file mode 100644 index 0000000..aa9c6af --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/data/dto/QueryTaskStatusDto.java @@ -0,0 +1,16 @@ +package org.nl.acs.ext.hk.service.data.dto; + +import lombok.Data; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/1/3 + */ +@Data +public class QueryTaskStatusDto { + private String taskCode; + private String taskTyp; + private String taskStatus; + private String agvCode; +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/impl/AcsToHkServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/impl/AcsToHkServiceImpl.java new file mode 100644 index 0000000..d74de80 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/impl/AcsToHkServiceImpl.java @@ -0,0 +1,94 @@ +package org.nl.acs.ext.hk.service.impl; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.address.service.AddressService; +import org.nl.acs.address.service.dto.AddressDto; +import org.nl.acs.ext.UnifiedResponse; +import org.nl.acs.ext.hk.HkHttpUtil; +import org.nl.acs.ext.hk.service.AcsToHkService; +import org.nl.acs.ext.hk.service.data.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + + +/** + * @author onepiece + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class AcsToHkServiceImpl implements AcsToHkService { + + @Autowired + private AddressService addressService; + @Autowired + private HkHttpUtil hkHttpUtil; + + @Override + public UnifiedResponse genAgvSchedulingTask(BaseReq requestParam, Class type) { + AddressDto addressDto = addressService.findByCode("genAgvSchedulingTask"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam, type); + } + + @Override + public UnifiedResponse continueTask(BaseReq requestParam) { + AddressDto addressDto = addressService.findByCode("continueTask"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam); + } + + @Override + public UnifiedResponse cancelTask(BaseReq requestParam) { + AddressDto addressDto = addressService.findByCode("cancelTask"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam); + } + + @Override + public UnifiedResponse queryTaskStatus(BaseReq requestParam, Class type) { + AddressDto addressDto = addressService.findByCode("queryTaskStatus"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam, type); + } + + @Override + public UnifiedResponse queryAgvStatus(BaseReq requestParam, Class type) { + AddressDto addressDto = addressService.findByCode("queryAgvStatus"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam, type); + } + + @Override + public UnifiedResponse stopRobot(BaseReq requestParam) { + AddressDto addressDto = addressService.findByCode("stopRobot"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam); + } + + @Override + public UnifiedResponse resumeRobot(BaseReq requestParam) { + AddressDto addressDto = addressService.findByCode("resumeRobot"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam); + } + + @Override + public UnifiedResponse blockArea(BaseReq requestParam) { + AddressDto addressDto = addressService.findByCode("blockArea"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam); + } + + @Override + public UnifiedResponse genPreScheduleTask(BaseReq requestParam, Class type) { + AddressDto addressDto = addressService.findByCode("genPreScheduleTask"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam, type); + } + + @Override + public UnifiedResponse boxApplyPass(BaseReq requestParam, Class type) { + AddressDto addressDto = addressService.findByCode("boxApplyPass"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam, type); + } + + @Override + public UnifiedResponse bindPodAndBerth(BaseReq requestParam) { + AddressDto addressDto = addressService.findByCode("bindPodAndBerth"); + return hkHttpUtil.sendPostRequest(addressDto.getMethods_url(), requestParam); + } + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/impl/HkToAcsServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/impl/HkToAcsServiceImpl.java new file mode 100644 index 0000000..a485f56 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/hk/service/impl/HkToAcsServiceImpl.java @@ -0,0 +1,174 @@ +package org.nl.acs.ext.hk.service.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device.service.DeviceAppService; +import org.nl.acs.device.driver.conveyor.appearance_inspection_scannner_conveyor.AppearanceInspectionScannerConveyorDeviceDriver; +import org.nl.acs.device.driver.conveyor.appearance_inspection_scannner_conveyor.ItemProtocol; +import org.nl.acs.device.driver.conveyor.appearance_inspection_scannner_conveyor.enums.CommandEnum; +import org.nl.acs.ext.hk.service.AcsToHkService; +import org.nl.acs.ext.hk.service.HkToAcsService; +import org.nl.acs.ext.hk.service.data.GenPreScheduleTaskReq; +import org.nl.acs.instruction.domain.Instruction; +import org.nl.acs.instruction.enums.InstructionStatusEnum; +import org.nl.acs.instruction.service.InstructionService; +import org.nl.system.service.param.ISysParamService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + + +/** + * 海康AGV接口 + * + * @author: gengby + * @createDate: 2024/12/28 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class HkToAcsServiceImpl implements HkToAcsService { + + + @Autowired + private InstructionService instructionService; + @Autowired + private DeviceAppService deviceAppService; + @Autowired + private AcsToHkService acsToHkService; + @Autowired + private ISysParamService sysParamService; + + @Override + public JSONObject agvCallback(JSONObject requestParam) { + JSONObject resp = new JSONObject(); + String reqCode = requestParam.getString("reqCode"); +// String reqTime = requestParam.getString("reqTime"); + String currentPositionCode = requestParam.getString("currentPositionCode"); + String robotCode = requestParam.getString("robotCode"); + String taskCode = requestParam.getString("taskCode"); + String method = requestParam.getString("method"); + Instruction instruction = instructionService.findByCodeFromCache(taskCode); + if (ObjectUtil.isEmpty(instruction)) { + resp.put("code", "1"); + resp.put("message", "请求失败,任务信息不存在!"); + resp.put("reqCode", reqCode); + return resp; + } + String now = DateUtil.now(); + //method 回调1、任务开始start + if (StrUtil.equals(method, "start")) { + //修改指令状态执行中并修改CTU车号 + instruction.setCarno(robotCode); + instruction.setInstruction_status(InstructionStatusEnum.BUSY.getIndex()); + instruction.setExecute_device_code(currentPositionCode); + instruction.setUpdate_time(now); + instructionService.update(instruction); + } + //method 回调2、任务完成/结束end + else if (StrUtil.equals(method, "end")) { + Device device = deviceAppService.findDeviceByCode(instruction.getNext_device_code()); + AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver; + if (StrUtil.equals(instruction.getNext_device_code(), currentPositionCode) && device != null && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { + appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); + appearanceInspectionScannerConveyorDeviceDriver.writing(ItemProtocol.TO_COMMAND.getKey(), CommandEnum.COMMAND_5.getValue()); + } + //修改指令状态完成 + instruction.setInstruction_status(InstructionStatusEnum.FINISHED.getIndex()); + instruction.setExecute_device_code(currentPositionCode); + instruction.setUpdate_time(now); + instructionService.finish(instruction); + } + //method 回调3、任务取消cancel + else if (StrUtil.equals(method, "cancel")) { + //修改指令状态取消 + instruction.setInstruction_status(InstructionStatusEnum.CANCEL.getIndex()); + instruction.setUpdate_time(now); + instructionService.update(instruction); + } + //method 回调4、CTU取料箱申请inApply + else if (StrUtil.equals(method, "inApply")) { + Device device = deviceAppService.findDeviceByCode(currentPositionCode); + if (ObjectUtil.isEmpty(device)) { + resp.put("code", "1"); + resp.put("message", "请求失败,请求位置编号不存在!"); + resp.put("reqCode", reqCode); + return resp; + } + AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver; + //CTU取放货申请 + //如果请求位置编号与指令起点一致并且是输送线则是取货申请 + if (StrUtil.equals(instruction.getStart_device_code(), currentPositionCode) && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { + String ctuWaitTime = Optional.ofNullable(sysParamService.findByCode("ctuWaitTime").getValue()).map(Object::toString).orElse("60"); + GenPreScheduleTaskReq gpsReq = GenPreScheduleTaskReq.builder() + .positionCode(instruction.getStart_device_code()) + .nextTask(ctuWaitTime) + .agvTyp("10") + .build(); + acsToHkService.genPreScheduleTask(gpsReq, null); + appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); + appearanceInspectionScannerConveyorDeviceDriver.setReqTakeRequireSuccess(true); + appearanceInspectionScannerConveyorDeviceDriver.setReqTakeInstCode(taskCode); + } + } + //method 回调5、CTU放料箱申请outApply + else if (StrUtil.equals(method, "outApply")) { + Device device = deviceAppService.findDeviceByCode(currentPositionCode); + if (ObjectUtil.isEmpty(device)) { + resp.put("code", "1"); + resp.put("message", "请求失败,请求位置编号不存在!"); + resp.put("reqCode", reqCode); + return resp; + } + AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver; + //如果请求位置编号与指令终点一致并且是输送线则是放货申请 + if (StrUtil.equals(instruction.getNext_device_code(), currentPositionCode) && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { + appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); + if (!appearanceInspectionScannerConveyorDeviceDriver.getReqPutRequireSuccess() && appearanceInspectionScannerConveyorDeviceDriver.getReqPutInstCode() == null) { + appearanceInspectionScannerConveyorDeviceDriver.setReqPutRequireSuccess(true); + appearanceInspectionScannerConveyorDeviceDriver.setReqPutInstCode(taskCode); + } + } + } + //method 回调6、CTU取货完成通知 + else if (StrUtil.equals(method, "inApplyOK")) { + Device device = deviceAppService.findDeviceByCode(currentPositionCode); + if (ObjectUtil.isEmpty(device)) { + resp.put("code", "1"); + resp.put("message", "请求失败,请求位置编号不存在!"); + resp.put("reqCode", reqCode); + return resp; + } + AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver; + if (StrUtil.equals(instruction.getStart_device_code(), currentPositionCode) && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { + appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); + appearanceInspectionScannerConveyorDeviceDriver.writing(ItemProtocol.TO_COMMAND.getKey(), CommandEnum.COMMAND_3.getValue()); + } + } + resp.put("code", "0"); + resp.put("message", "成功"); + resp.put("reqCode", reqCode); + return resp; + } + + @Override + public JSONObject warnCallback(JSONObject requestParam) { + String reqCode = requestParam.getString("reqCode"); + String reqTime = requestParam.getString("reqTime"); + JSONArray data = requestParam.getJSONArray("data"); + JSONObject resp = new JSONObject(); + resp.put("code", "0"); + resp.put("message", "成功"); + resp.put("reqCode", reqCode); + return resp; + } +} + + diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/socket/Online.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/socket/Online.java index 058e713..cd2a6c0 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/socket/Online.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/socket/Online.java @@ -6,5 +6,5 @@ package org.nl.acs.ext.socket; * @Date 2024/7/9 */ public class Online { - public static boolean isOnline = false; + public static boolean isOnline = true; } \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/utils/TypeCastingUtil.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/utils/TypeCastingUtil.java new file mode 100644 index 0000000..a1f8fda --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/utils/TypeCastingUtil.java @@ -0,0 +1,26 @@ +package org.nl.acs.ext.utils; + +import com.alibaba.fastjson.JSONObject; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @Description TODO + * @Author Gengby + * @Date 2025/1/3 + */ +public class TypeCastingUtil { + + + public static List convertToList(List rawList, Class clazz) { + return rawList.stream() + .filter(item -> item instanceof JSONObject) + .map(item -> { + JSONObject jsonObject = (JSONObject) item; + return clazz.cast(jsonObject.toJavaObject(clazz)); + }) + .collect(Collectors.toList()); + } + +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/GateWayService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/GateWayService.java index 75d02a5..954eeab 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/GateWayService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/GateWayService.java @@ -28,6 +28,8 @@ public class GateWayService { return wmsToAcsService.toCommand(request.handleObject()); } else if ("getWeight".equals(request.getType())){ return wmsToAcsService.getWeight(request.handleObject()); + } else if ("bindPodAndBerth".equals(request.getType())){ + return wmsToAcsService.bindPodAndBerth(request.handleObject()); } resp.put("code", "400"); resp.put("msg", "type有误"); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java index eb025ac..c0d6b81 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/WmsToAcsService.java @@ -47,4 +47,13 @@ public interface WmsToAcsService { * @return */ JSONObject getWeight(JSONObject req); + + + /** + * 位置与货架绑定 + * + * @param handleObject + * @return + */ + JSONObject bindPodAndBerth(JSONObject handleObject); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java index b286fb4..d3c01ba 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/wms/service/impl/WmsToAcsServiceImpl.java @@ -7,13 +7,17 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.nl.acs.device.device.domain.Device; import org.nl.acs.device.driver.conveyor.appearance_inspection_scannner_conveyor.AppearanceInspectionScannerConveyorDeviceDriver; -import org.nl.acs.device.driver.conveyor.strip_conveyor.StripConveyorDeviceDriver; +import org.nl.acs.device.driver.conveyor.strip_conveyor.StripConveyorDeviceDriver; +import org.nl.acs.ext.UnifiedResponse; +import org.nl.acs.ext.hk.service.AcsToHkService; +import org.nl.acs.ext.hk.service.data.BindPodAndBerthReq; import org.nl.acs.ext.wms.service.WmsToAcsService; import org.nl.acs.device.device.service.DeviceAppService; @@ -22,10 +26,11 @@ import org.nl.acs.storage_cell.service.mapper.StorageCellMapper; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; import org.nl.common.exception.BadRequestException; +import org.nl.config.MapOf; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Optional; +import java.util.*; @Service @RequiredArgsConstructor @@ -39,6 +44,10 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { private DeviceAppService deviceAppService; @Autowired private TaskService taskService; + @Autowired + private AcsToHkService acsToHkService; + + private static final Map POD_MAP = MapOf.of("H01", "800001", "H02", "800002", "H03", "800003", "H04", "800004", "H05", "800005", "H06", "800006", "H07", "800007", "H08", "800008", "H09", "800009", "H10", "800010", "H11", "800011", "H12", "800012"); @Override @@ -46,8 +55,35 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { log.info("crateTask--------------:输入参数:" + JSON.toJSONString(req)); try { JSONArray errArr = new JSONArray(); - for (int i = 0; i < req.size(); i++) { - JSONObject task = req.getJSONObject(i); + List list = req.toJavaList(JSONObject.class); + Collections.sort(list, new Comparator() { + @Override + public int compare(JSONObject o1, JSONObject o2) { + boolean o1ContainsDash = containsDash(o1); + boolean o2ContainsDash = containsDash(o2); + if (o1ContainsDash && !o2ContainsDash) { + return -1; + } + else if (!o1ContainsDash && o2ContainsDash) { + return 1; + } + else { + return 0; + } + } + + // 辅助方法:检查 point_code1 和 point_code2 是否都包含 "-" + private boolean containsDash(JSONObject obj) { + String pointCode1 = obj.getString("point_code1"); + String pointCode2 = obj.getString("point_code2"); + return pointCode1.contains("-") && pointCode2.contains("-"); + } + }); + JSONArray sortedReq = new JSONArray(); + sortedReq.addAll(list); + + for (int i = 0; i < sortedReq.size(); i++) { + JSONObject task = sortedReq.getJSONObject(i); String ext_task_id = task.getString("id"); String task_code = task.getString("task_code"); String start_device_code = task.getString("point_code1"); @@ -57,7 +93,7 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { String vehicle_code = task.getString("vehicle_code"); String vehicle_type = task.getString("vehicle_type"); String route_plan_code = task.getString("route_plan_code"); - String task_type = task.getString("task_type"); + String task_type = task.getString("acs_type"); String remark = task.getString("remark"); String storage_task_type = task.getString("storage_task_type"); String agv_system_type = task.getString("agv_system_type"); @@ -89,6 +125,15 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { errArr.add(json); continue; } + if (StrUtil.isEmpty(vehicle_type)) { + if (StrUtil.isNotEmpty(vehicle_code) && vehicle_code.startsWith("D")) { + vehicle_type = "3"; + } else if (StrUtil.isNotEmpty(vehicle_code) && vehicle_code.startsWith("Z")) { + vehicle_type = "2"; + } else { + vehicle_type = "1"; + } + } StorageCell start_storageCell = new LambdaQueryChainWrapper<>(storageCellMapper) .eq(StorageCell::getStorage_code, start_device_code) @@ -366,17 +411,60 @@ public class WmsToAcsServiceImpl implements WmsToAcsService { Device device = deviceAppService.findDeviceByCode(device_code); JSONObject resp = new JSONObject(); JSONObject data = new JSONObject(); - if (device != null && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver){ + if (device != null && device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { AppearanceInspectionScannerConveyorDeviceDriver appearanceInspectionScannerConveyorDeviceDriver = (AppearanceInspectionScannerConveyorDeviceDriver) device.getDeviceDriver(); - data.put("weight",appearanceInspectionScannerConveyorDeviceDriver.getWeight() * 1000); + data.put("weight", appearanceInspectionScannerConveyorDeviceDriver.getWeight() * 1000); } else { throw new BadRequestException("设备不存在"); } - resp.put("code","200"); + resp.put("code", "200"); resp.put("msg", "获取成功"); - resp.put("data",data); + resp.put("data", data); log.info("getWeight--------------:输出参数:" + JSON.toJSONString(resp)); return resp; } + @Override + public JSONObject bindPodAndBerth(JSONObject req) { + log.info("bindPodAndBerth--------------:输入参数:" + JSON.toJSONString(req)); + Assert.notNull(req); + String podCode = req.getString("podCode"); + Assert.notBlank(podCode); + String positionCode = req.getString("positionCode"); + Assert.notBlank(positionCode); + Device device = deviceAppService.findDeviceByCode(positionCode); + if (device == null) { + throw new BadRequestException("点位:" + positionCode + "不存在"); + } + String indBind = req.getString("indBind"); + Assert.notBlank(indBind); + String acsPodCode = POD_MAP.get(podCode); + if (ObjectUtil.isEmpty(acsPodCode)) { + throw new BadRequestException("ACS未配置与CTU货架编号对应关系!"); + } + StorageCell positionStorageCell = storageCellMapper.selectOne(new LambdaQueryWrapper().eq(StorageCell::getStorage_code, positionCode)); + if (ObjectUtil.isEmpty(positionStorageCell)) { + throw new BadRequestException("货位表中不存在该位置编号!"); + } + BindPodAndBerthReq bindPodAndBerthReq = BindPodAndBerthReq.builder() + .podCode(acsPodCode) + .positionCode(positionStorageCell.getParent_storage_code()) + .podDir("1") + .indBind(indBind) + .build(); +// BaseReq baseReq = BaseReq.builder().data(bindPodAndBerthReq).build(); + UnifiedResponse unifiedResponse = acsToHkService.bindPodAndBerth(bindPodAndBerthReq); + JSONObject resp = new JSONObject(); + if (!unifiedResponse.isSuccess()) { + resp.put("code", "400"); + resp.put("msg", "下发失败," + unifiedResponse.getMessage()); + log.info("bindPodAndBerth--------------:输出参数:" + JSON.toJSONString(resp)); + return resp; + } + resp.put("code", "200"); + resp.put("msg", "下发成功"); + log.info("bindPodAndBerth--------------:输出参数:" + JSON.toJSONString(resp)); + return resp; + } + } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/xg/rest/XgToAcsController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/xg/rest/XgToAcsController.java new file mode 100644 index 0000000..4cafc01 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/xg/rest/XgToAcsController.java @@ -0,0 +1,62 @@ +package org.nl.acs.ext.xg.rest; + +import cn.dev33.satoken.annotation.SaIgnore; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.ext.log.OthersToInterfaceLog; +import org.nl.acs.ext.xg.service.XgToAcsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/xg/api/") +@Slf4j +@SaIgnore +public class XgToAcsController { + + @Autowired + private XgToAcsService xgToAcsService; + + @PostMapping("/inBlockGroup") + @OthersToInterfaceLog("AGV->ACS") + public ResponseEntity inBlockGroup(@RequestBody JSONObject requestParam) throws Exception { + return new ResponseEntity<>(xgToAcsService.inBlockGroup(requestParam), HttpStatus.OK); + } + + + @PostMapping("/outBlockGroup") + @OthersToInterfaceLog("AGV->ACS") + public ResponseEntity outBlockGroup(@RequestBody JSONObject requestParam) throws Exception { + return new ResponseEntity<>(xgToAcsService.outBlockGroup(requestParam), HttpStatus.OK); + } + + @PostMapping("/call") + @OthersToInterfaceLog("AGV->ACS") + public ResponseEntity call(@RequestBody JSONObject param) { + return new ResponseEntity<>(xgToAcsService.call(param), HttpStatus.OK); + } + + @PostMapping("/status") + @OthersToInterfaceLog("AGV->ACS") + public ResponseEntity status(@RequestBody JSONObject param) { + return new ResponseEntity<>(xgToAcsService.status(param), HttpStatus.OK); + } + + @PostMapping("/setDoor") + @OthersToInterfaceLog("AGV->ACS") + public ResponseEntity setDoor(@RequestBody JSONObject param) { + return new ResponseEntity<>(xgToAcsService.setDoor(param), HttpStatus.OK); + } +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/xg/service/XgToAcsService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/xg/service/XgToAcsService.java new file mode 100644 index 0000000..0e85f91 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/xg/service/XgToAcsService.java @@ -0,0 +1,55 @@ +package org.nl.acs.ext.xg.service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +public interface XgToAcsService { + + /** + * 仙工AGV请求进入互斥组 + * + * @param requestParam + * @return + */ + JSONObject inBlockGroup(JSONObject requestParam); + + + /** + * 仙工AGV请求离开互斥组 + * + * @param requestParam + * @return + */ + JSONObject outBlockGroup(JSONObject requestParam); + + + /** + * 呼叫楼层 + * + * @param param + * @return + */ + JSONObject call(JSONObject param); + + /** + * 查看电梯状态 + * + * @param param + * @return + */ + JSONArray status(JSONObject param); + + + /** + * 开关门 + * + * @param param + * @return + */ + JSONObject setDoor(JSONObject param); +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/xg/service/impl/XgToAcsServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/xg/service/impl/XgToAcsServiceImpl.java new file mode 100644 index 0000000..89559ac --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/ext/xg/service/impl/XgToAcsServiceImpl.java @@ -0,0 +1,388 @@ +package org.nl.acs.ext.xg.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.nl.acs.auto.run.ElevatorSocketConnectionAutoRun; +import org.nl.acs.ext.UnifiedResponse; +import org.nl.acs.ext.hk.service.AcsToHkService; +import org.nl.acs.ext.hk.service.data.BaseReq; +import org.nl.acs.ext.hk.service.data.BlockAreaReq; +import org.nl.acs.ext.hk.service.data.QueryAgvStatusReq; +import org.nl.acs.ext.hk.service.data.dto.QueryAgvStatusDto; +import org.nl.acs.ext.utils.TypeCastingUtil; +import org.nl.acs.ext.xg.service.XgToAcsService; +import org.nl.common.exception.BadRequestException; +import org.nl.config.MapOf; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Description TODO + * @Author Gengby + * @Date 2024/12/28 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class XgToAcsServiceImpl implements XgToAcsService { + + private final static Map> BLOCK_POS_XY = new HashMap<>(); + + @Autowired + private AcsToHkService acsToHkService; + + //TODO 需要现场确定区域对应坐标 + static { + BLOCK_POS_XY.put("Block1", MapOf.of("X1","213000","Y1","205457","X3","215000","Y3","205457")); + BLOCK_POS_XY.put("Block2", MapOf.of("X1","210000","Y1","205457","X3","212000","Y3","205457")); + BLOCK_POS_XY.put("Block3", MapOf.of("X1","207000","Y1","205457","X3","209000","Y3","205457")); + BLOCK_POS_XY.put("Block4", MapOf.of("X1","204000","Y1","205457","X3","206000","Y3","205457")); + BLOCK_POS_XY.put("Block5", MapOf.of("X1","201000","Y1","205457","X3","203000","Y3","205457")); + } + + @Override + public JSONObject inBlockGroup(JSONObject requestParam) { + JSONObject resp = new JSONObject(); + //AGV名称 + String robot_name = requestParam.getString("robot_name"); + //进入区域 + String block_group_id = requestParam.getString("block_group_id"); + if (robot_name == null || block_group_id == null) { + resp.put("code", 400); + resp.put("message", "请求参数不完整: robot_name 或 block_group_id缺失"); + return resp; + } + //去查询海康查询AGV状态接口 + QueryAgvStatusReq qasReq = QueryAgvStatusReq.builder() + .mapCode("AA") + .build(); +// BaseReq statusReq = BaseReq.builder() +// .data(qasReq) +// .build(); + UnifiedResponse unifiedResponse = acsToHkService.queryAgvStatus(qasReq, List.class); + List data = TypeCastingUtil.convertToList(unifiedResponse.getData(), QueryAgvStatusDto.class); + if (CollectionUtils.isNotEmpty(data)) { + for (QueryAgvStatusDto queryAgvStatusDto : data) { + //获取所有AGV的路径 + String posX = queryAgvStatusDto.getPosX(); + String posY = queryAgvStatusDto.getPosY(); + //根据映射关系根据路径获取区域 + Map mapBlock = BLOCK_POS_XY.get(block_group_id); + boolean inControlArea = isCarInControlArea(Double.parseDouble(posX), Double.parseDouble(posY), Double.parseDouble(mapBlock.get("X1")), Double.parseDouble(mapBlock.get("Y1")), Double.parseDouble(mapBlock.get("X3")), Double.parseDouble(mapBlock.get("Y3"))); + //判断海康CTU是否在诺力AGV请求进入区域内 + //若在,则不允许诺力AGV进入 + if (inControlArea) { + resp.put("code", 400); + resp.put("message", "CTU正在该区域活动,不允许进入该区域!"); + return resp; + } + } + //若不在,下发海康AGV禁用该区域,并且返回成功允许诺力AGV进入 + BlockAreaReq baReq = BlockAreaReq.builder() + .matterArea(block_group_id) + .controlMod("0") + .indBind("1") + .build(); +// BaseReq blockReq = BaseReq.builder() +// .data(baReq) +// .build(); + UnifiedResponse blockUnifiedResponse = acsToHkService.blockArea(baReq); + if (blockUnifiedResponse.isSuccess()) { + resp.put("code", 200); + resp.put("message", "ok"); + return resp; + } else { + resp.put("code", 400); + resp.put("message", "CTU活动区域未封禁,不允许进入该区域!"); + return resp; + } + } + resp.put("code", 200); + resp.put("message", "ok"); + return resp; + } + + public static boolean isCarInControlArea(double carX, double carY, double X1, double Y1, double X3, double Y3) { + // 判断小车是否在管控区域内 + return carX >= X1 && carX <= X3 && carY >= Y1 && carY >= Y3; + } + + + @Override + public JSONObject outBlockGroup(JSONObject requestParam) { + JSONObject resp = new JSONObject(); + String robot_name = requestParam.getString("robot_name"); + String block_group_id = requestParam.getString("block_group_id"); + if (robot_name == null || block_group_id == null) { + resp.put("code", 400); + resp.put("message", "请求参数不完整: robot_name 或 block_group_id缺失"); + return resp; + } + //并且下发海康AGV启用该区域 + BlockAreaReq baReq = BlockAreaReq.builder() + .matterArea(block_group_id) + .indBind("0") + .controlMod("0") + .build(); +// BaseReq blockReq = BaseReq.builder() +// .data(baReq) +// .build(); + acsToHkService.blockArea(baReq); + resp.put("code", 200); + resp.put("message", "ok"); + return resp; + } + + + @Override + public JSONObject call(JSONObject param) { + //电梯编号 + String elevatorCode = param.getString("elevatorCode"); + if (StrUtil.isEmpty(elevatorCode)) { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "电梯编号不能为空!"); + return resp; + } + //目标楼层 + Integer floor = param.getInteger("floor"); + if (floor == null) { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "目标楼层不能为空!"); + return resp; + } + String doorStatusMsg = "00110000000601039CAC0001"; + int[] doorStatusRec = ElevatorSocketConnectionAutoRun.write("查询电梯门状态", doorStatusMsg); + boolean doorStatus = determineDoorStatus(doorStatusRec); + if (doorStatus) { + String currentFloorHexMsg = "00050000000601039C410001"; + int[] currentFloorRec = ElevatorSocketConnectionAutoRun.write("读取楼层信息", currentFloorHexMsg); + int currentFloor = determineFloor(currentFloorRec); + if (currentFloor == floor) { + String openDoorHexMsg = "002B0000000601069C7A0001"; + ElevatorSocketConnectionAutoRun.write("开门", openDoorHexMsg); + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "电梯已开门,已继续下发开门信号"); + return resp; + } else { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "电梯门已打开,无法呼叫楼层!"); + return resp; + } + } + //下发目标楼层 + String callFloorHexMsg = ""; + if (floor == 1) { + callFloorHexMsg = "001A0000000601069C580001"; + } else if (floor == 2) { + callFloorHexMsg = "00170000000601069C580002"; + } else if (floor == 3) { + callFloorHexMsg = "00200000000601069C580004"; + } else { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "呼叫楼层号错误!"); + return resp; + } + int[] callFloorRec = ElevatorSocketConnectionAutoRun.write("呼叫楼层", callFloorHexMsg); + int callFloorRecInt = determineCallFloorRec(callFloorRec); + if (callFloorRecInt != floor) { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "呼叫楼层响应报文信息楼层与下发楼层信息不一致!"); + return resp; + } + String currentFloorHexMsg = "00050000000601039C410001"; + int[] currentFloorRec = ElevatorSocketConnectionAutoRun.write("读取楼层信息", currentFloorHexMsg); + int currentFloor = determineFloor(currentFloorRec); + if (currentFloor != floor) { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "当前电梯所在楼层与呼叫楼层不一致!"); + return resp; + } + // String doorStatusMsg = "00110000000601039CAC0001"; + doorStatusRec = ElevatorSocketConnectionAutoRun.write("查询电梯门状态", doorStatusMsg); + doorStatus = determineDoorStatus(doorStatusRec); + if (!doorStatus) { + String openDoorHexMsg = "002B0000000601069C7A0001"; + ElevatorSocketConnectionAutoRun.write("开门", openDoorHexMsg); + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "当前电梯门状态为关门中状态!"); + return resp; + } + String openDoorHexMsg = "002B0000000601069C7A0001"; + ElevatorSocketConnectionAutoRun.write("开门", openDoorHexMsg); + JSONObject resp = new JSONObject(); + resp.put("code", 200); + resp.put("message", "ok"); + return resp; + } + + @Override + public JSONArray status(JSONObject param) { + JSONArray array = new JSONArray(); + String elevatorCode = param.getString("elevatorCode"); + if (StrUtil.isEmpty(elevatorCode)) { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "电梯编号不能为空"); + array.add(resp); + return array; + } + if (!StrUtil.isEmpty(elevatorCode)) { + String doorStatusMsg = "00110000000601039CAC0001"; + int[] doorStatusRec = ElevatorSocketConnectionAutoRun.write("查询电梯门状态", doorStatusMsg); + boolean doorStatus = determineDoorStatus(doorStatusRec); + String currentFloorHexMsg = "00050000000601039C410001"; + int[] currentFloorRec = ElevatorSocketConnectionAutoRun.write("读取楼层信息", currentFloorHexMsg); + int currentFloor = determineFloor(currentFloorRec); + JSONObject resp = new JSONObject(); + resp.put("elevatorCode", elevatorCode); + resp.put("floor", currentFloor); + resp.put("status", doorStatus ? 1 : 0); + resp.put("move", doorStatus ? 1 : 0); + array.add(resp); + return array; + } + return array; + } + + @Override + public JSONObject setDoor(JSONObject param) { + //电梯编号 + String elevatorCode = param.getString("elevatorCode"); + if (StrUtil.isEmpty(elevatorCode)) { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "电梯编号不能为空!"); + return resp; + } + Integer status = param.getInteger("status"); + if (status == null) { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "开关门状态不能为空!"); + return resp; + } + if (status == 1) { + //开门 + String openDoorHexMsg = "002B0000000601069C7A0001"; + int[] openDoor = ElevatorSocketConnectionAutoRun.write("开门", openDoorHexMsg); + boolean flag = parseOpenResponse(openDoor); + if (!flag) { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "下发开门状态响应报文有误!"); + return resp; + } + } else if (status == 0) { + //关门 + String closeDoorHexMsg = "002D0000000601069C7A0008"; + int[] closeDoor = ElevatorSocketConnectionAutoRun.write("关门", closeDoorHexMsg); + boolean flag = parseCloseResponse(closeDoor); + if (!flag) { + JSONObject resp = new JSONObject(); + resp.put("code", 400); + resp.put("message", "下发关门状态响应报文有误!"); + return resp; + } + } + JSONObject resp = new JSONObject(); + resp.put("code", 200); + resp.put("message", "ok"); + return resp; + } + + public static boolean parseOpenResponse(int[] binaryArray) { + int keyByte = binaryArray[1]; + if (keyByte == 0x2B) { + return true; + } + return false; + } + + public static boolean parseCloseResponse(int[] binaryArray) { + int keyByte = binaryArray[1]; + if (keyByte == 0x2D) { + return true; + } + return false; + } + + + /** + * 解析当前楼层 + * + * @param binaryArray + * @return + */ + public static int determineFloor(int[] binaryArray) { + if (binaryArray.length < 8) { + throw new BadRequestException("结果有误!"); + } + int floorByte = binaryArray[9]; + if (floorByte == 0x31) { + return 1; + } else if (floorByte == 0x32) { + return 2; + } else if (floorByte == 0x33) { + return 3; + } + return -1; + } + + /** + * 解析开门关门状态 + * + * @param binaryArray + * @return + */ + public static boolean determineDoorStatus(int[] binaryArray) { + if (binaryArray.length < 8) { + throw new IllegalArgumentException("结果有误!"); + } + int lastByte = binaryArray[binaryArray.length - 1]; + if (lastByte == 0x10) { + return true; + } else if (lastByte == 0x00) { + return false; + } + return false; + } + + + /** + * 解析呼叫楼层 + * + * @param binaryArray + * @return + */ + public static int determineCallFloorRec(int[] binaryArray) { + if (binaryArray.length < 8) { + throw new IllegalArgumentException("结果有误!"); + } + int floorByte = binaryArray[1]; + if (floorByte == 0x1A) { + return 1; + } else if (floorByte == 0x17) { + return 2; + } else if (floorByte == 0x20) { + return 3; + } + return -1; + } +} \ No newline at end of file diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/InstructionService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/InstructionService.java index 6dc962d..b73c0e1 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/InstructionService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/InstructionService.java @@ -151,6 +151,8 @@ public interface InstructionService extends CommonService { */ Instruction findByCode(String code); + List findByAgvSystemType(String agv_system_type); + /** * 根据任务code查询 * @@ -241,7 +243,7 @@ public interface InstructionService extends CommonService { * @param dto * @throws Exception */ - void finish(Instruction dto) throws Exception; + void finish(Instruction dto); /** @@ -584,4 +586,5 @@ public interface InstructionService extends CommonService { void cancelInstAndTaskNoSendWms(String instruction_id); + List findReadyInstByXDeviceCode(List xDeviceCodeList, String noY); } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java index bbbcd5e..214d8ac 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/instruction/service/impl/InstructionServiceImpl.java @@ -7,7 +7,6 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -18,7 +17,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; -import org.nl.acs.AcsConfig; import org.nl.acs.agv.server.MagicAgvService; import org.nl.acs.agv.server.NDCAgvService; import org.nl.acs.agv.server.XianGongAgvService; @@ -32,6 +30,10 @@ import org.nl.acs.device.driver.DeviceDriverDefination; import org.nl.acs.device.driver.conveyor.standard_conveyor_control_with_scanner.StandardCoveyorControlWithScannerDeviceDriver; import org.nl.acs.device.driver.conveyor.standard_inspect_site.StandardInspectSiteDeviceDriver; import org.nl.acs.ext.UnifiedResponse; +import org.nl.acs.ext.hk.service.AcsToHkService; +import org.nl.acs.ext.hk.service.data.BaseReq; +import org.nl.acs.ext.hk.service.data.CancelTaskReq; +import org.nl.acs.ext.hk.service.data.GenAgvSchedulingTaskReq; import org.nl.acs.instruction.domain.InstructionMybatis; import org.nl.acs.instruction.enums.InstructionStatusEnum; import org.nl.acs.instruction.service.dto.InstructionDto; @@ -43,8 +45,12 @@ import org.nl.acs.device.device.service.impl.DeviceAppServiceImpl; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.route.service.dto.RouteLineDto; import org.nl.acs.route.service.impl.RouteLineServiceImpl; -import org.nl.acs.task.TaskInstructionLock; +import org.nl.acs.storage_cell.domain.StorageCell; +import org.nl.acs.storage_cell.service.StorageCellService; import org.nl.acs.task.domain.Task; +import org.nl.acs.task.enums.AgvSystemTypeEnum; +import org.nl.acs.task.enums.InstTypeEnum; +import org.nl.acs.task.enums.TaskStatusEnum; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; import org.nl.acs.common.base.PageInfo; @@ -60,6 +66,7 @@ import org.nl.acs.instruction.domain.Instruction; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.service.mapper.InstructionMapper; import org.nl.common.utils.SecurityUtils; +import org.nl.config.MapOf; import org.nl.config.language.LangProcess; import org.nl.system.service.param.ISysParamService; import org.nl.common.utils.CodeUtil; @@ -108,6 +115,10 @@ public class InstructionServiceImpl extends CommonServiceImpl instructions = new CopyOnWriteArrayList(); @@ -312,6 +323,15 @@ public class InstructionServiceImpl extends CommonServiceImpl findByAgvSystemType(String agv_system_type) { + return Optional.ofNullable(this.instructions) + .orElse(new CopyOnWriteArrayList<>()) + .stream() + .filter(instruction -> instruction.getAgv_system_type().equals(AgvSystemTypeEnum.XG_SYSTEM_TYPE.getCode())) + .collect(Collectors.toList()); + } + @Override public Instruction findByTaskCodeFromCache(String task_code) { return Optional.ofNullable(this.instructions) @@ -406,22 +426,11 @@ public class InstructionServiceImpl extends CommonServiceImpl shortPathsList = @@ -464,33 +465,17 @@ public class InstructionServiceImpl extends CommonServiceImpl resp = xiangGongAgvService.addOrderSequences(dto); if (!resp.isSuccess()) { + dto.setRemark(resp.getMessage()); dto.setSend_status("2"); } else { dto.setSend_status("1"); @@ -498,14 +483,76 @@ public class InstructionServiceImpl extends CommonServiceImpl resp = xiangGongAgvService.sendOrderSequencesToXZ(dto); if (!resp.isSuccess()) { + dto.setRemark(resp.getMessage()); dto.setSend_status("2"); } else { dto.setSend_status("1"); } } } + //判断是否是浙大调度系统 + else if (StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE) && StrUtil.equals(dto.getAgv_system_type(), AgvSystemTypeEnum.ZD_SYSTEM_TYPE.getCode())) { + + } + //判断是否是MagicAGV调度系统 + else if (StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE) && StrUtil.equals(dto.getAgv_system_type(), AgvSystemTypeEnum.MAGIC_SYSTEM_TYPE.getCode())) { + + } + //判断是否是海柔AGV调度系统 + else if (StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE) && StrUtil.equals(dto.getAgv_system_type(), AgvSystemTypeEnum.HR_SYSTEM_TYPE.getCode())) { + + } + //判断是否是海康AGV调度系统 + else if (StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE) && StrUtil.equals(dto.getAgv_system_type(), AgvSystemTypeEnum.HK_SYSTEM_TYPE.getCode())) { + String wbCode = null; + List> positionCodePath = new ArrayList<>(); + if (StrUtil.equals(InstTypeEnum.CTU_IN_TASK.getCode(), dto.getInstruction_type())) { + StorageCell storageCell = storageCellService.getOne(new LambdaQueryWrapper().eq(StorageCell::getStorage_code, dto.getNext_point_code())); + if (ObjectUtil.isEmpty(storageCell)) { + throw new BadRequestException("货位表不存在该点位信息:" + dto.getNext_point_code()); + } + wbCode = dto.getStart_device_code(); + positionCodePath = Arrays.asList(MapOf.of("positionCode", dto.getStart_point_code(), "type", "05"), MapOf.of("positionCode", storageCell.getParent_storage_code(), "type", "05")); + } else if (StrUtil.equals(InstTypeEnum.CTU_OUT_TASK.getCode(), dto.getInstruction_type())) { + StorageCell storageCell = storageCellService.getOne(new LambdaQueryWrapper().eq(StorageCell::getStorage_code, dto.getStart_point_code())); + if (ObjectUtil.isEmpty(storageCell)) { + throw new BadRequestException("货位表不存在该点位信息:" + dto.getStart_point_code()); + } + wbCode = dto.getNext_device_code(); + positionCodePath = Arrays.asList(MapOf.of("positionCode", storageCell.getParent_storage_code(), "type", "05"), MapOf.of("positionCode", dto.getNext_point_code(), "type", "05")); + } else if (StrUtil.equals(InstTypeEnum.CTU_MOVE_TASK.getCode(), dto.getInstruction_type())) { + StorageCell startStorageCell = storageCellService.getOne(new LambdaQueryWrapper().eq(StorageCell::getStorage_code, dto.getStart_point_code())); + if (ObjectUtil.isEmpty(startStorageCell)) { + throw new BadRequestException("货位表不存在该点位信息:" + dto.getStart_point_code()); + } + StorageCell nextStorageCell = storageCellService.getOne(new LambdaQueryWrapper().eq(StorageCell::getStorage_code, dto.getNext_point_code())); + if (ObjectUtil.isEmpty(nextStorageCell)) { + throw new BadRequestException("货位表不存在该点位信息:" + dto.getNext_point_code()); + } + positionCodePath = Arrays.asList(MapOf.of("positionCode", startStorageCell.getParent_storage_code(), "type", "05"), MapOf.of("positionCode", nextStorageCell.getParent_storage_code(), "type", "05")); + } + GenAgvSchedulingTaskReq gasReq = GenAgvSchedulingTaskReq + .builder() + .taskTyp(dto.getInstruction_type()) +// .wbCode(wbCode) +// .ctnrCode(dto.getVehicle_code()) + .ctnrTyp(dto.getVehicle_type()) + .positionCodePath(positionCodePath) + .priority(dto.getPriority()) + .taskCode(dto.getInstruction_code()) + .build(); +// BaseReq req = BaseReq.builder()..data(gasReq).build(); + UnifiedResponse resp = acsToHkService.genAgvSchedulingTask(gasReq, String.class); + if (!resp.isSuccess()) { + dto.setRemark(resp.getMessage()); + dto.setSend_status("2"); + } else { + dto.setSend_status("1"); + } + } } catch (Exception e) { dto.setSend_status("2"); + dto.setRemark("指令下发失败:" + e.getMessage()); e.printStackTrace(); log.error("创建指令出错, {}", e.getMessage()); } @@ -1068,30 +1115,49 @@ public class InstructionServiceImpl extends CommonServiceImpl req = BaseReq.builder() +// .data(ctReq) +// .build(); + acsToHkService.cancelTask(req); + flag = true; } else { flag = true; } if (flag) { - String currentUsername = SecurityUtils.getCurrentNickName(); String now = DateUtil.now(); entity.setUpdate_time(now); @@ -1833,10 +1899,19 @@ public class InstructionServiceImpl extends CommonServiceImpl next_device_code_list.contains(inst.getNext_device_code())) .filter(inst -> ObjectUtil.isNotEmpty(inst.getFrom_y()) && !currentNoY.contains(String.valueOf(Integer.parseInt(inst.getFrom_y())))) .filter(inst -> Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4 == 1 || Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4 == 0) - .sorted(Comparator.comparingInt((Instruction inst) -> Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4).reversed() +// .sorted(Comparator.comparingInt((Instruction inst) -> Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4).reversed() + .sorted(Comparator.comparingInt((Instruction inst) -> { + int startCode = Integer.parseInt(getNumericPart(inst.getStart_device_code())); + if (startCode == 1 || startCode == 4) { + return 0; + } else { + return 1; + } + }) + .thenComparing(inst -> Integer.parseInt(inst.getNext_device_code())) .thenComparing(inst -> Integer.parseInt(ObjectUtil.isEmpty(inst.getFrom_z()) ? "0" : inst.getFrom_z())) .thenComparing(inst -> Integer.parseInt(ObjectUtil.isEmpty(inst.getFrom_y()) ? "0" : inst.getFrom_y())) - .thenComparing(Comparator.comparing(Instruction::getPriority)).reversed() + .thenComparing(Comparator.comparing(Instruction::getPriority)) .thenComparing(inst -> LocalDateTime.parse(inst.getCreate_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))) .collect(Collectors.toList()); } @@ -1851,7 +1926,16 @@ public class InstructionServiceImpl extends CommonServiceImpl next_device_code_list.contains(inst.getNext_device_code())) .filter(inst -> ObjectUtil.isNotEmpty(inst.getFrom_y()) && !currentNoY.contains(String.valueOf(Integer.parseInt(inst.getFrom_y())))) .filter(inst -> Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4 == 2 || Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 3 == 0) - .sorted(Comparator.comparingInt((Instruction inst) -> Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4).reversed() +// .sorted(Comparator.comparingInt((Instruction inst) -> Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4).reversed() + .sorted(Comparator.comparingInt((Instruction inst) -> { + int startCode = Integer.parseInt(getNumericPart(inst.getStart_device_code())); + if (startCode == 2 || startCode == 3) { + return 0; + } else { + return 1; + } + }) + .thenComparing(inst -> inst.getNext_device_code()) .thenComparing(inst -> Integer.parseInt(ObjectUtil.isEmpty(inst.getFrom_z()) ? "0" : inst.getFrom_z())) .thenComparing(inst -> Integer.parseInt(ObjectUtil.isEmpty(inst.getFrom_y()) ? "0" : inst.getFrom_y())) .thenComparing(Comparator.comparing(Instruction::getPriority)) @@ -2076,6 +2160,7 @@ public class InstructionServiceImpl extends CommonServiceImpl Integer.parseInt(inst.getFrom_y()) < Integer.parseInt(frontInst.getFrom_y())) .filter(inst -> Integer.parseInt(inst.getFrom_z()) == Integer.parseInt(frontInst.getFrom_z())) .filter(inst -> Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4 == 0 || Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4 == 1) .sorted(Comparator.comparing(Instruction::getPriority).reversed() @@ -2106,6 +2191,7 @@ public class InstructionServiceImpl extends CommonServiceImpl Integer.parseInt(inst.getFrom_y()) < Integer.parseInt(frontInst.getFrom_y())) .filter(inst -> Integer.parseInt(inst.getFrom_z()) == Integer.parseInt(frontInst.getFrom_z())) .filter(inst -> Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4 == 2 || Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4 == 3) .sorted(Comparator.comparing(Instruction::getPriority).reversed() @@ -2229,4 +2315,24 @@ public class InstructionServiceImpl extends CommonServiceImpl findReadyInstByXDeviceCode(List xDeviceCodeList, String noY) { + Set currentNoY = noY == null ? Collections.emptySet() : new HashSet<>(Arrays.asList(noY.split(","))); + return Optional.ofNullable(this.instructions) + .orElse(new CopyOnWriteArrayList<>()) + .stream() + .filter(inst -> inst.getInstruction_status().equals(TaskStatusEnum.READY.getIndex())) + .filter(inst -> xDeviceCodeList.contains(inst.getStart_device_code())) + .filter(inst -> xDeviceCodeList.contains(inst.getNext_device_code())) + .filter(inst -> StrUtil.isNotBlank(inst.getFrom_y()) && StrUtil.isNotBlank(inst.getTo_y()) && !currentNoY.contains(String.valueOf(Integer.parseInt(inst.getFrom_y()))) && !currentNoY.contains(String.valueOf(Integer.parseInt(inst.getTo_y())))) + .sorted(Comparator.comparingInt((Instruction inst) -> Integer.parseInt(getNumericPart(inst.getStart_device_code())) % 4).reversed() + .thenComparing(inst -> Integer.parseInt(getNumericPart(inst.getNext_device_code())) % 4) + .thenComparing(inst -> Integer.parseInt(ObjectUtil.isEmpty(inst.getFrom_z()) ? "0" : inst.getFrom_z())) + .thenComparing(inst -> Integer.parseInt(ObjectUtil.isEmpty(inst.getFrom_y()) ? "0" : inst.getFrom_y())) + .thenComparing((Instruction inst) -> !inst.getVehicle_code().contains("YCZJ")) + .thenComparing(Instruction::getPriority) + .thenComparing(inst -> LocalDateTime.parse(inst.getCreate_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))) + .collect(Collectors.toList()); + } + } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/AgvSystemTypeEnum.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/AgvSystemTypeEnum.java index 6acfbbe..f9a7e8c 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/AgvSystemTypeEnum.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/AgvSystemTypeEnum.java @@ -11,17 +11,35 @@ import lombok.Getter; @AllArgsConstructor public enum AgvSystemTypeEnum { /** - * 一期1楼叉车NDC系统 + * NDC系统 */ - One_NDC_System_Type("1", "1", "一期1楼叉车NDC系统"), - /** - * 一期2楼NDC系统 - */ - Two_NDC_System_Type("2", "2", "一期2楼NDC系统"), + NDC_SYSTEM_TYPE("1", "1", "NDC调度系统"), + /** * 仙工AGV系统 */ - XG_System_Type("3", "3", "仙工AGV系统"); + XG_SYSTEM_TYPE("2", "2", "仙工调度系统"), + + /** + * 浙大AGV系统 + */ + ZD_SYSTEM_TYPE("3", "3", "浙大调度系统"), + + /** + * MAGIC AGV系统 + */ + MAGIC_SYSTEM_TYPE("4", "4", "MAGIC调度系统"), + + /** + * 海柔AGV系统 + */ + HR_SYSTEM_TYPE("5", "5", "海柔CTU调度系统"), + + /** + * 海康AGV系统 + */ + HK_SYSTEM_TYPE("6", "6", "海康CTU调度系统"); + /** * 索引 @@ -66,7 +84,7 @@ public enum AgvSystemTypeEnum { public static String getName(String code) { for (AgvSystemTypeEnum c : AgvSystemTypeEnum.values()) { - if (c.code == code) { + if (c.code.equals(code) ) { return c.name; } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/InstTypeEnum.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/InstTypeEnum.java new file mode 100644 index 0000000..285b612 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/InstTypeEnum.java @@ -0,0 +1,75 @@ +package org.nl.acs.task.enums; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 20220102CG\noblelift + */ +@Getter +@AllArgsConstructor +public enum InstTypeEnum { + /** + * 任务类型 + */ + STACKER_TASK("1", "1", "堆垛机任务"), + AGV_TASK("2", "2", "AGV任务"), + CTU_IN_TASK("3", "A011", "CTU入库任务"), + CTU_OUT_TASK("4", "A012", "CTU出库任务"), + CTU_MOVE_TASK("5", "A013", "CTU移库任务"), + OTHER_TASK("6", "other", "其它任务类型"); + + + /** + * 索引 + */ + private String index; + /** + * 编码 + */ + private String code; + /** + * 名字 + */ + private String name; + /** + * 描述 + */ + private String desc; + + /** + * 构造方法 + * + * @param index + * @param code + * @param name + */ + InstTypeEnum(String index, String code, String name) { + this.index = index; + this.code = code; + this.name = name; + } + + public static JSONArray getList() { + JSONArray arr = new JSONArray(); + JSONObject json = new JSONObject(); + for (InstTypeEnum em : InstTypeEnum.values()) { + json.put("code", em.getCode()); + json.put("name", em.getName()); + arr.add(json); + } + return arr; + } + + public static String getName(String code) { + for (InstTypeEnum c : InstTypeEnum.values()) { + if (c.code.equals(code)) { + return c.name; + } + } + return null; + } + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/TaskTypeEnum.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/TaskTypeEnum.java index fc3fc1a..8516893 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/TaskTypeEnum.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/enums/TaskTypeEnum.java @@ -15,7 +15,8 @@ public enum TaskTypeEnum { * 任务类型 */ Stacker_Task("1", "1", "堆垛机任务"), - AGV_TASK("2", "2", "AGV任务"); + AGV_TASK("2", "2", "AGV任务"), + CTU_TASK("3", "3", "CTU任务"); /** @@ -62,7 +63,7 @@ public enum TaskTypeEnum { public static String getName(String code) { for (TaskTypeEnum c : TaskTypeEnum.values()) { - if (c.code == code) { + if (c.code.equals(code)) { return c.name; } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java index 7d23dd3..e8211c4 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/TaskService.java @@ -134,7 +134,6 @@ public interface TaskService extends CommonService { List queryAll(Map whereJson); - /** * 根据编码查询 * @@ -258,6 +257,15 @@ public interface TaskService extends CommonService { TaskDto findByCodeFromCache(String task_code); + /** + * 根据任务类型查询任务信息 + * + * @param task_type + * @return + */ + List findReadyByTaskType(String task_type); + + /** * 根据目的地设备编号查询当前是否有设备 * @@ -265,6 +273,12 @@ public interface TaskService extends CommonService { * @return */ TaskDto findByNextCode(String device_code); + + + /** + * @param device_code + * @return + */ TaskDto findByNextPointCode(String device_code); @@ -369,9 +383,9 @@ public interface TaskService extends CommonService { */ TaskDto findByTaskCode(String task_code); - TaskDto findReadyTaskByNextDeviceCode(String next_device_code,List checkoutStartDeviceCode); + TaskDto findReadyTaskByNextDeviceCode(String next_device_code, List checkoutStartDeviceCode); - List findReadyTasksByNextDeviceCode(String next_device_code,List checkoutStartDeviceCode); + List findReadyTasksByNextDeviceCode(String next_device_code, List checkoutStartDeviceCode); List findReadyTaskByXDeviceCode(List xDeviceCodeList, String noY); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/dto/TaskDto.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/dto/TaskDto.java index 34855a6..ee153f2 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/dto/TaskDto.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/dto/TaskDto.java @@ -338,7 +338,7 @@ public class TaskDto implements Serializable { /** * 扩展属性 */ - String params2; + private String params2; /** * 是否拔轴 0/1 diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java index 2300ab7..4d0bad3 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/acs/task/service/impl/TaskServiceImpl.java @@ -41,6 +41,7 @@ import org.nl.acs.route.domain.RoutePlan; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.route.service.dto.RouteLineDto; import org.nl.acs.route.service.mapper.RoutePlanMapper; +import org.nl.acs.task.enums.InstTypeEnum; import org.nl.acs.task.enums.TaskStatusEnum; import org.nl.acs.task.enums.TaskTypeEnum; import org.nl.acs.task.service.TaskFeedbackService; @@ -697,8 +698,24 @@ public class TaskServiceImpl extends CommonServiceImpl impleme next_point_code = next_device_code; } + String instruction_type = task_type; + + if (StrUtil.equals(TaskTypeEnum.CTU_TASK.getCode(), task_type)) { + Device start_device = deviceAppService.findDeviceByCode(start_device_code); + Device next_device = deviceAppService.findDeviceByCode(next_device_code); + if (start_device != null && start_device.getDevice_type().equals("conveyor") && next_device != null && next_device.getDevice_type().equals("storage")) { + instruction_type = InstTypeEnum.CTU_IN_TASK.getCode(); + } else if (start_device != null && start_device.getDevice_type().equals("storage") && next_device != null && next_device.getDevice_type().equals("conveyor")) { + instruction_type = InstTypeEnum.CTU_OUT_TASK.getCode(); + } else if (start_device != null && next_device != null && start_device.getDevice_type().equals("storage") && next_device.getDevice_type().equals("storage")) { + instruction_type = InstTypeEnum.CTU_MOVE_TASK.getCode(); + } else { + throw new BadRequestException("CTU任务类型与起点终点不匹配"); + } + } + Instruction instdto = new Instruction(); - instdto.setInstruction_type(task_type); + instdto.setInstruction_type(instruction_type); instdto.setInstruction_id(IdUtil.simpleUUID()); instdto.setRoute_plan_code(route_plan_code); instdto.setRemark(acsTask.getRemark()); @@ -716,7 +733,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme instdto.setNext_point_code(next_point_code); instdto.setPriority(priority); instdto.setInstruction_status(InstructionStatusEnum.READY.getIndex()); - instdto.setExecute_device_code(start_point_code); + instdto.setExecute_device_code(start_device_code); instdto.setVehicle_type(vehicleType); instdto.setStart_point_code2(start_point_code2); instdto.setStart_device_code2(start_point_code2); @@ -725,28 +742,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme instdto.setAgv_system_type(agv_system_type); instdto.setAgv_inst_type(CommonFinalParam.ONE); - 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 if (StrUtil.equals(task_type, "8")) { - instdto.setAgv_inst_type("2"); - } - } else { - instdto.setAgv_inst_type("4"); - } - instructionservice.create2(instdto); + instructionservice.create(instdto); acsTask.setTask_status(CommonFinalParam.ONE); this.update(acsTask); @@ -834,6 +830,16 @@ public class TaskServiceImpl extends CommonServiceImpl impleme return optionalTask.orElse(null); } + @Override + public List findReadyByTaskType(String task_type) { + return Optional.ofNullable(this.tasks) + .orElse(new CopyOnWriteArrayList<>()) + .stream() + .filter(taskDto -> taskDto.getTask_type().equals(task_type)) + .filter(taskDto -> taskDto.getTask_status().equals(TaskStatusEnum.READY.getIndex())) + .collect(Collectors.toList()); + } + @Override public TaskDto findByNextCode(String device_code) { Optional optionalTask = tasks.stream() @@ -879,7 +885,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme .orElse(new CopyOnWriteArrayList<>()) .stream() .filter(task -> StrUtil.equals(task.getStart_device_code(), device_code)) - .filter(task -> StrUtil.equals(task.getTask_status(),TaskStatusEnum.BUSY.getIndex())) + .filter(task -> StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex())) .collect(Collectors.toList()); } @@ -890,7 +896,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme .orElse(new CopyOnWriteArrayList<>()) .stream() .filter(task -> StrUtil.equals(task.getNext_device_code(), device_code)) - .filter(task -> StrUtil.equals(task.getTask_status(),TaskStatusEnum.BUSY.getIndex())) + .filter(task -> StrUtil.equals(task.getTask_status(), TaskStatusEnum.BUSY.getIndex())) .collect(Collectors.toList()); } @@ -1432,6 +1438,8 @@ public class TaskServiceImpl extends CommonServiceImpl impleme .filter(taskDto -> StrUtil.isNotBlank(taskDto.getFrom_y()) && StrUtil.isNotBlank(taskDto.getTo_y()) && !currentBackNoY.contains(String.valueOf(Integer.parseInt(taskDto.getFrom_y()))) && !currentBackNoY.contains(String.valueOf(Integer.parseInt(taskDto.getTo_y())))) // .filter(taskDto -> ((Integer.parseInt(front_to_y) - 1) / 4 == (Integer.parseInt(taskDto.getTo_y()) - 1) / 4) && (((Integer.parseInt(front_to_y) % 4) + (Integer.parseInt(taskDto.getTo_y()) % 4) == 2) || (Integer.parseInt(front_to_y) % 4) + (Integer.parseInt(taskDto.getTo_y()) % 4) == 4)) //.filter(taskDto -> ((Integer.parseInt(front_from_y) - 1) / 4 == (Integer.parseInt(taskDto.getFrom_y()) - 1) / 4) && (((Integer.parseInt(front_from_y) % 4) + (Integer.parseInt(taskDto.getFrom_y()) % 4) == 2) || (Integer.parseInt(front_from_y) % 4) + (Integer.parseInt(taskDto.getFrom_y()) % 4) == 4)) + .filter(taskDto -> Integer.parseInt(taskDto.getFrom_y()) < Integer.parseInt(front_from_y)) + .filter(taskDto -> Integer.parseInt(taskDto.getTo_y()) < Integer.parseInt(front_to_y)) .filter(taskDto -> { int frontToY = Integer.parseInt(front_to_y); int taskDtoToY = Integer.parseInt(taskDto.getTo_y()); @@ -1480,6 +1488,7 @@ public class TaskServiceImpl extends CommonServiceImpl impleme .filter(taskDto -> taskDto.getFrom_x().equals(front_from_x) && taskDto.getFrom_z().equals(front_from_z)) .filter(taskDto -> StrUtil.isNotBlank(taskDto.getFrom_y()) && StrUtil.isNotBlank(taskDto.getTo_y()) && !currentBackNoY.contains(String.valueOf(Integer.parseInt(taskDto.getFrom_y()))) && !currentBackNoY.contains(String.valueOf(Integer.parseInt(taskDto.getTo_y())))) //.filter(taskDto -> ((Integer.parseInt(front_from_y) - 1) / 4 == (Integer.parseInt(taskDto.getFrom_y()) - 1) / 4) && (((Integer.parseInt(front_from_y) % 4) + (Integer.parseInt(taskDto.getFrom_y()) % 4) == 2) || (Integer.parseInt(front_from_y) % 4) + (Integer.parseInt(taskDto.getFrom_y()) % 4) == 4)) + .filter(taskDto -> Integer.parseInt(taskDto.getFrom_y()) < Integer.parseInt(front_from_y)) .filter(taskDto -> { int frontFromY = Integer.parseInt(front_from_y); int taskDtoFromY = Integer.parseInt(taskDto.getFrom_y()); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/CodeUtil.java b/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/CodeUtil.java index 8f5e2d0..7074c49 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/CodeUtil.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/common/utils/CodeUtil.java @@ -9,11 +9,13 @@ import java.util.*; public class CodeUtil { public static String getNewCode(String ruleCode){ - String flag = CommonFinalParam.ONE; - HashMap map = new HashMap<>(); - map.put("flag",flag); - map.put("code",ruleCode); - return SpringContextHolder.getBean(ISysCodeRuleService.class).codeDemo(map); + synchronized (ruleCode) { + String flag = CommonFinalParam.ONE; + HashMap map = new HashMap<>(); + map.put("flag",flag); + map.put("code",ruleCode); + return SpringContextHolder.getBean(ISysCodeRuleService.class).codeDemo(map); + } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/config/mqtt2/MqttService.java b/nladmin-system/nlsso-server/src/main/java/org/nl/config/mqtt2/MqttService.java index 85d0539..9a33c36 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/config/mqtt2/MqttService.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/config/mqtt2/MqttService.java @@ -349,11 +349,11 @@ public class MqttService { log.info("[关闭MQTT Client]"); } }); - mqttDisconnectFuture.thenRun(() -> { + mqttDisconnectFuture.thenRunAsync(() -> { this.unloadTags(); log.info("[加载Tags到Redis]"); System.out.println("[加载Tags到Redis]"); - }).thenRun(() -> { + }).thenRunAsync(() -> { threadPool.shutdown(); log.info("[关闭线程池]"); System.out.println("[关闭线程池]"); diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/dao/mapper/SysCodeRuleDetailMapper.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/dao/mapper/SysCodeRuleDetailMapper.java index a76ceae..94fa600 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/dao/mapper/SysCodeRuleDetailMapper.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/dao/mapper/SysCodeRuleDetailMapper.java @@ -1,8 +1,11 @@ package org.nl.system.service.coderule.dao.mapper; +import org.apache.ibatis.annotations.Select; import org.nl.system.service.coderule.dao.SysCodeRuleDetail; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + /** *

* 编码规则明细表 Mapper 接口 @@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface SysCodeRuleDetailMapper extends BaseMapper { + @Select("SELECT * FROM sys_code_rule_detail WHERE code_rule_id = #{codeRuleId} FOR UPDATE") + List selectRuleDetailForUpdate(String codeRuleId); + } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java index 88e862e..c796795 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/coderule/impl/SysCodeRuleServiceImpl.java @@ -58,13 +58,14 @@ public class SysCodeRuleServiceImpl extends ServiceImpl().eq(SysCodeRule::getCode, code)).getId(); // 如果flag = 1就执行更新数据库的操作 String flag = (String) form.get("flag"); - List ruleDetails = codeRuleDetailMapper.selectList(new LambdaQueryWrapper().eq(SysCodeRuleDetail::getCode_rule_id, id)); +// List ruleDetails = codeRuleDetailMapper.selectList(new LambdaQueryWrapper().eq(SysCodeRuleDetail::getCode_rule_id, id)); + List ruleDetails = codeRuleDetailMapper.selectRuleDetailForUpdate(id); String demo = ""; boolean isSame = true; for(SysCodeRuleDetail detail : ruleDetails) { diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateHkInst.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateHkInst.java new file mode 100644 index 0000000..b801e7d --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateHkInst.java @@ -0,0 +1,431 @@ +package org.nl.system.service.quartz.task; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.nl.acs.common.base.CommonFinalParam; +import org.nl.acs.device.device.domain.Device; +import org.nl.acs.device.device.service.DeviceAppService; +import org.nl.acs.device.driver.conveyor.appearance_inspection_scannner_conveyor.AppearanceInspectionScannerConveyorDeviceDriver; +import org.nl.acs.device.driver.storage.standard_storage.StandardStorageDeviceDriver; +import org.nl.acs.ext.hk.service.AcsToHkService; +import org.nl.acs.ext.hk.service.data.BaseReq; +import org.nl.acs.ext.hk.service.data.GenPreScheduleTaskReq; +import org.nl.acs.instruction.domain.Instruction; +import org.nl.acs.instruction.enums.InstructionStatusEnum; +import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.route.service.RouteLineService; +import org.nl.acs.route.service.dto.RouteLineDto; +import org.nl.acs.task.enums.InstTypeEnum; +import org.nl.acs.task.enums.TaskStatusEnum; +import org.nl.acs.task.enums.TaskTypeEnum; +import org.nl.acs.task.service.TaskService; +import org.nl.acs.task.service.dto.TaskDto; +import org.nl.common.utils.SecurityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 自动创建海康CTU指令 + * A011入库 + * A012出库 + * A013移库 + */ +@Slf4j +@Component +public class AutoCreateHkInst { + + @Autowired + private TaskService taskService; + @Autowired + private InstructionService instructionService; + @Autowired + private RouteLineService routeLineService; + @Autowired + private DeviceAppService deviceAppService; + @Autowired + private AcsToHkService acsToHkService; + + /** + * 根据任务状态创建指令、生成下一条指令 + * 创建指令前需要判断是否条件具备:起始位置是否有货、目标位置是否有货 + */ + public void run() { + List ctus = taskService.findReadyByTaskType(TaskTypeEnum.CTU_TASK.getCode()); + Map> groupTasks = ctus.stream().collect(Collectors.groupingBy(ctu -> { + Device start_device = deviceAppService.findDeviceByCode(ctu.getStart_device_code()); + Device next_device = deviceAppService.findDeviceByCode(ctu.getNext_device_code()); + if (start_device != null && start_device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { + return InstTypeEnum.CTU_IN_TASK.getCode(); + } else if (next_device != null && next_device.getDeviceDriver() instanceof AppearanceInspectionScannerConveyorDeviceDriver) { + return InstTypeEnum.CTU_OUT_TASK.getCode(); + } else if (start_device != null && next_device != null && start_device.getDeviceDriver() instanceof StandardStorageDeviceDriver && next_device.getDeviceDriver() instanceof StandardStorageDeviceDriver) { + return InstTypeEnum.CTU_MOVE_TASK.getCode(); + } + return InstTypeEnum.OTHER_TASK.getCode(); + })); + List inTaskDtos = groupTasks.get(InstTypeEnum.CTU_IN_TASK.getCode()); + if (CollectionUtils.isNotEmpty(inTaskDtos)) { + Map> groupedByStartDeviceCode = inTaskDtos.stream() + .collect(Collectors.groupingBy(TaskDto::getStart_device_code)); + groupedByStartDeviceCode.forEach((startPoint, tasks) -> { + tasks.forEach(acsTask -> { + String taskid = acsTask.getTask_id(); + String taskcode = acsTask.getTask_code(); + String task_type = acsTask.getTask_type(); + String vehiclecode = acsTask.getVehicle_code(); + String storage_task_type = acsTask.getStorage_task_type(); + String priority = acsTask.getPriority(); + String is_send = acsTask.getIs_send(); + + String start_device_code = acsTask.getStart_device_code(); + String start_point_code = acsTask.getStart_point_code(); + + 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(); + + 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(); + + String start_height = acsTask.getStart_height(); + String next_height = acsTask.getNext_height(); + + + if (StrUtil.equals(is_send, "0")) { + return; + } + + //校验路由关系 + List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); + if (ObjectUtils.isEmpty(shortPathsList)) { + acsTask.setRemark("路由不通无法生成指令"); + taskService.updateByCodeFromCache(acsTask); + return; + } + + if (!StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE) && !StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.TWO)) { + return; + } + + RouteLineDto routeLineDto = shortPathsList.get(0); + String path = routeLineDto.getPath(); + String type = routeLineDto.getType(); + String[] str = path.split("->"); + List pathlist = Arrays.asList(str); + int index = 0; + for (int m = 0; m < pathlist.size(); m++) { + if (pathlist.get(m).equals(start_device_code)) { + index = m + 1; + break; + } + } + next_device_code = pathlist.get(index); + + if (StrUtil.equals(deviceAppService.findDeviceTypeByCode(next_device_code), "storage")) { + next_point_code = next_device_code + "-" + acsTask.getTo_y() + "-" + acsTask.getTo_z(); + } else { + next_point_code = next_device_code; + } + + Instruction instdto = new Instruction(); + instdto.setInstruction_type(InstTypeEnum.CTU_IN_TASK.getCode()); + instdto.setInstruction_id(IdUtil.simpleUUID()); + instdto.setRoute_plan_code(route_plan_code); + instdto.setRemark(acsTask.getRemark()); + instdto.setMaterial(acsTask.getMaterial()); + instdto.setQuantity(acsTask.getQuantity()); + instdto.setTask_id(taskid); + instdto.setTask_code(taskcode); + instdto.setVehicle_code(vehiclecode); + String now = DateUtil.now(); + instdto.setCreate_time(now); + instdto.setCreate_by(SecurityUtils.getCurrentNickName()); + + 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(InstructionStatusEnum.READY.getIndex()); + instdto.setExecute_device_code(start_point_code); + instdto.setVehicle_type(vehicleType); + instdto.setAgv_system_type(agv_system_type); + + try { + instructionService.create(instdto); + } catch (Exception e) { + acsTask.setRemark("指令创建失败:" + e.getMessage()); + taskService.updateByCodeFromCache(acsTask); + return; + } + //创建成功后 + acsTask.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskService.update(acsTask); + }); + //创建一个预调度任务下发CTU +// GenPreScheduleTaskReq gpsReq = GenPreScheduleTaskReq.builder() +// .positionCode(startPoint) +// .nextTask("90") +// .agvTyp("10") +// .build(); +// BaseReq req = BaseReq.builder().data(gpsReq).build(); +// acsToHkService.genPreScheduleTask(gpsReq, null); + }); + } + List outTaskDtos = groupTasks.get(InstTypeEnum.CTU_OUT_TASK.getCode()); + if (CollectionUtils.isNotEmpty(outTaskDtos)) { + outTaskDtos.forEach(acsTask -> { + String taskid = acsTask.getTask_id(); + String taskcode = acsTask.getTask_code(); + String task_type = acsTask.getTask_type(); + String vehiclecode = acsTask.getVehicle_code(); + String storage_task_type = acsTask.getStorage_task_type(); + String priority = acsTask.getPriority(); + String is_send = acsTask.getIs_send(); + + String start_device_code = acsTask.getStart_device_code(); + String start_point_code = acsTask.getStart_point_code(); + + 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(); + + 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(); + + String start_height = acsTask.getStart_height(); + String next_height = acsTask.getNext_height(); + + + if (StrUtil.equals(is_send, "0")) { + return; + } + + //校验路由关系 + List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); + if (ObjectUtils.isEmpty(shortPathsList)) { + acsTask.setRemark("路由不通无法生成指令"); + taskService.updateByCodeFromCache(acsTask); + return; + } + + if (!StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE) && !StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.TWO)) { + return; + } + + RouteLineDto routeLineDto = shortPathsList.get(0); + String path = routeLineDto.getPath(); + String type = routeLineDto.getType(); + String[] str = path.split("->"); + List pathlist = Arrays.asList(str); + int index = 0; + for (int m = 0; m < pathlist.size(); m++) { + if (pathlist.get(m).equals(start_device_code)) { + index = m + 1; + break; + } + } + next_device_code = pathlist.get(index); + + if (StrUtil.equals(deviceAppService.findDeviceTypeByCode(next_device_code), "storage")) { + next_point_code = next_device_code + "-" + acsTask.getTo_y() + "-" + acsTask.getTo_z(); + } else { + next_point_code = next_device_code; + } + + Instruction instdto = new Instruction(); + instdto.setInstruction_type(InstTypeEnum.CTU_OUT_TASK.getCode()); + instdto.setInstruction_id(IdUtil.simpleUUID()); + instdto.setRoute_plan_code(route_plan_code); + instdto.setRemark(acsTask.getRemark()); + instdto.setMaterial(acsTask.getMaterial()); + instdto.setQuantity(acsTask.getQuantity()); + instdto.setTask_id(taskid); + instdto.setTask_code(taskcode); + instdto.setVehicle_code(vehiclecode); + String now = DateUtil.now(); + instdto.setCreate_time(now); + instdto.setCreate_by(SecurityUtils.getCurrentNickName()); + + 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(InstructionStatusEnum.READY.getIndex()); + instdto.setExecute_device_code(start_point_code); + instdto.setVehicle_type(vehicleType); + instdto.setAgv_system_type(agv_system_type); + + try { + instructionService.create(instdto); + } catch (Exception e) { + acsTask.setRemark("指令创建失败:" + e.getMessage()); + taskService.updateByCodeFromCache(acsTask); + return; + } + //创建成功后 + acsTask.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskService.update(acsTask); + }); + } + List moveTaskDtos = groupTasks.get(InstTypeEnum.CTU_MOVE_TASK.getCode()); + if (CollectionUtils.isNotEmpty(moveTaskDtos)) { + moveTaskDtos.forEach(acsTask -> { + String taskid = acsTask.getTask_id(); + String taskcode = acsTask.getTask_code(); + String task_type = acsTask.getTask_type(); + String vehiclecode = acsTask.getVehicle_code(); + String storage_task_type = acsTask.getStorage_task_type(); + String priority = acsTask.getPriority(); + String is_send = acsTask.getIs_send(); + + String start_device_code = acsTask.getStart_device_code(); + String start_point_code = acsTask.getStart_point_code(); + + 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(); + + 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(); + + String start_height = acsTask.getStart_height(); + String next_height = acsTask.getNext_height(); + + + if (StrUtil.equals(is_send, "0")) { + return; + } + + //校验路由关系 + List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); + if (ObjectUtils.isEmpty(shortPathsList)) { + acsTask.setRemark("路由不通无法生成指令"); + taskService.updateByCodeFromCache(acsTask); + return; + } + + if (!StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.ONE) && !StrUtil.equals(shortPathsList.get(0).getType(), CommonFinalParam.TWO)) { + return; + } + + RouteLineDto routeLineDto = shortPathsList.get(0); + String path = routeLineDto.getPath(); + String type = routeLineDto.getType(); + String[] str = path.split("->"); + List pathlist = Arrays.asList(str); + int index = 0; + for (int m = 0; m < pathlist.size(); m++) { + if (pathlist.get(m).equals(start_device_code)) { + index = m + 1; + break; + } + } + next_device_code = pathlist.get(index); + + if (StrUtil.equals(deviceAppService.findDeviceTypeByCode(next_device_code), "storage")) { + next_point_code = next_device_code + "-" + acsTask.getTo_y() + "-" + acsTask.getTo_z(); + } else { + next_point_code = next_device_code; + } + + Instruction instdto = new Instruction(); + instdto.setInstruction_type(InstTypeEnum.CTU_MOVE_TASK.getCode()); + instdto.setInstruction_id(IdUtil.simpleUUID()); + instdto.setRoute_plan_code(route_plan_code); + instdto.setRemark(acsTask.getRemark()); + instdto.setMaterial(acsTask.getMaterial()); + instdto.setQuantity(acsTask.getQuantity()); + instdto.setTask_id(taskid); + instdto.setTask_code(taskcode); + instdto.setVehicle_code(vehiclecode); + String now = DateUtil.now(); + instdto.setCreate_time(now); + instdto.setCreate_by(SecurityUtils.getCurrentNickName()); + + 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(InstructionStatusEnum.READY.getIndex()); + instdto.setExecute_device_code(start_point_code); + instdto.setVehicle_type(vehicleType); + instdto.setAgv_system_type(agv_system_type); + + try { + instructionService.create(instdto); + } catch (Exception e) { + acsTask.setRemark("指令创建失败:" + e.getMessage()); + taskService.updateByCodeFromCache(acsTask); + return; + } + //创建成功后 + acsTask.setTask_status(TaskStatusEnum.BUSY.getIndex()); + taskService.update(acsTask); + }); + } + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java index 7b469a4..b107bad 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/AutoCreateInst.java @@ -9,19 +9,14 @@ import org.nl.acs.common.base.CommonFinalParam; import org.nl.acs.instruction.enums.InstructionStatusEnum; import org.nl.acs.instruction.service.InstructionService; import org.nl.acs.instruction.domain.Instruction; -import org.nl.acs.limit_regional.server.LimitRegionalService; import org.nl.acs.device.device.service.DeviceAppService; -import org.nl.acs.device.device.service.impl.DeviceAppServiceImpl; import org.nl.acs.route.service.RouteLineService; import org.nl.acs.route.service.dto.RouteLineDto; import org.nl.acs.task.enums.TaskStatusEnum; +import org.nl.acs.task.enums.TaskTypeEnum; import org.nl.acs.task.service.TaskService; import org.nl.acs.task.service.dto.TaskDto; import org.nl.common.utils.SecurityUtils; -import org.nl.config.SpringContextHolder; -import org.nl.config.lucene.service.LuceneExecuteLogService; -import org.nl.config.lucene.service.dto.LuceneLogDto; -import org.nl.config.lucene.service.impl.LuceneExecuteLogServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -29,7 +24,7 @@ import java.util.Arrays; import java.util.List; /** - * 自动创建指令 + * 自动创建AGV指令 */ @Slf4j @Component @@ -43,26 +38,15 @@ public class AutoCreateInst { private RouteLineService routeLineService; @Autowired private DeviceAppService deviceAppService; - @Autowired - private LuceneExecuteLogService logService; /** * 根据任务状态创建指令、生成下一条指令 * 创建指令前需要判断是否条件具备:起始位置是否有货、目标位置是否有货 */ public void run() throws Exception { - TaskService taskserver = SpringContextHolder.getBean(TaskService.class); - InstructionService instructionService = SpringContextHolder.getBean(InstructionService.class); - RouteLineService routeLineService = SpringContextHolder.getBean(RouteLineService.class); - DeviceAppService appService = SpringContextHolder.getBean(DeviceAppServiceImpl.class); - LimitRegionalService limitRegionalService = SpringContextHolder.getBean(LimitRegionalService.class); - LuceneExecuteLogService luceneExecuteLogService = SpringContextHolder.getBean(LuceneExecuteLogServiceImpl.class); - List list = taskserver.queryAllByStatus("0"); + List list = taskService.findReadyByTaskType(TaskTypeEnum.AGV_TASK.getCode()); for (int i = 0; i < list.size(); i++) { TaskDto acsTask = list.get(i); -// if (StrUtil.equals(acsTask.getTask_type(), TaskTypeEnum.AGV_Task.getIndex()) && !StrUtil.startWith(acsTask.getTask_code(), "-")) { -// continue; -// } String taskid = acsTask.getTask_id(); String taskcode = acsTask.getTask_code(); String task_type = acsTask.getTask_type(); @@ -102,7 +86,7 @@ public class AutoCreateInst { List shortPathsList = routeLineService.getShortPathLines(start_device_code, next_device_code, route_plan_code); if (ObjectUtils.isEmpty(shortPathsList)) { acsTask.setRemark("路由不通无法生成指令"); - taskserver.updateByCodeFromCache(acsTask); + taskService.updateByCodeFromCache(acsTask); continue; } @@ -124,13 +108,12 @@ public class AutoCreateInst { } next_device_code = pathlist.get(index); - if (StrUtil.equals(appService.findDeviceTypeByCode(next_device_code), "storage")) { + if (StrUtil.equals(deviceAppService.findDeviceTypeByCode(next_device_code), "storage")) { next_point_code = next_device_code + "-" + acsTask.getTo_y() + "-" + acsTask.getTo_z(); } else { next_point_code = next_device_code; } - Instruction instdto = new Instruction(); instdto.setInstruction_type(task_type); instdto.setInstruction_id(IdUtil.simpleUUID()); @@ -164,50 +147,16 @@ public class AutoCreateInst { instdto.setAgv_system_type(agv_system_type); instdto.setStart_height(start_height); instdto.setNext_height(next_height); - //判断agv系统 - //1、1楼叉车系统 - //2、2楼1区域AGV系统 - //3、2楼2区域AGV系统 -已废弃 - if (!StrUtil.equals(agv_system_type, CommonFinalParam.ONE)) { - // task_type - //1、生箔; Itype=1:取空,取满,放空,放满; - //2、分切 Itype=3取满、取空、放满、放空; - //3、普通任务 Itype=2:取货、放货; - //4、叉车任务 - //5、输送任务 - //6、行架 - //7、立库 - if (StrUtil.equals(task_type, CommonFinalParam.ONE)) { - instdto.setAgv_inst_type(CommonFinalParam.ONE); - } 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 if (StrUtil.equals(task_type, "8")) { - instdto.setAgv_inst_type("2"); - } else { - log.info("未找到对应的AGV指令类型,任务号:" + acsTask.getTask_code() + ",task_type:" + acsTask.getTask_type()); - continue; - } - } else { - instdto.setAgv_inst_type("4"); - } + try { instructionService.create(instdto); } catch (Exception e) { - acsTask.setRemark(e.getMessage()); - taskserver.updateByCodeFromCache(acsTask); - LuceneLogDto logDto = LuceneLogDto.builder() - .device_code("定时创建指令失败") - .content(e.getMessage()) - .build(); - luceneExecuteLogService.deviceExecuteLog(logDto); - continue; + acsTask.setRemark("指令创建失败:" + e.getMessage()); + taskService.updateByCodeFromCache(acsTask); } //创建指令后修改任务状态 acsTask.setTask_status(TaskStatusEnum.BUSY.getIndex()); - taskserver.update(acsTask); - + taskService.update(acsTask); } } } diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/ElevatorAutoReconnection.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/ElevatorAutoReconnection.java new file mode 100644 index 0000000..a6190b2 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/ElevatorAutoReconnection.java @@ -0,0 +1,26 @@ +package org.nl.system.service.quartz.task; + +import lombok.extern.slf4j.Slf4j; +import org.nl.acs.auto.run.service.AutoRunService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 电梯自动重连 + */ +@Slf4j +@Component +public class ElevatorAutoReconnection { + + @Autowired + private AutoRunService autoRunService; + + public void run(String threadCode) throws Exception { + String[] threadCodes = threadCode.split(","); + for (String code : threadCodes) { + if (!autoRunService.getThreadByCode(code).isAlive()) { + autoRunService.startThread(code); + } + } + } +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/QueryAGVStatus.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/QueryAGVStatus.java index 4d9d0a7..f5f53b8 100644 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/QueryAGVStatus.java +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/service/quartz/task/QueryAGVStatus.java @@ -5,13 +5,17 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.nl.acs.agv.server.XianGongAgvService; import org.nl.acs.ext.UnifiedResponse; import org.nl.acs.instruction.domain.Instruction; import org.nl.acs.instruction.service.InstructionService; +import org.nl.acs.task.enums.AgvSystemTypeEnum; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; + /** * 定时查询AGV状态 @@ -27,6 +31,11 @@ public class QueryAGVStatus { public void run() { try { + //去查询仙工AGV指令,如果存在就去查询指令状态 +// List instructionList = instructionService.findByAgvSystemType(AgvSystemTypeEnum.XG_SYSTEM_TYPE.getCode()); +// if (CollectionUtils.isEmpty(instructionList)) { +// return; +// } UnifiedResponse resp = agvService.queryXZAgvInstStatus(JSONObject.class); if (resp.isSuccess()) { JSONObject data = resp.getData(); @@ -72,11 +81,16 @@ public class QueryAGVStatus { inst.setInstruction_status("2"); instructionService.finish(inst); } - } else if ("STOPPED".equals(state) || "FAILED".equals(state) || "Error".equals(state)) { + } else if ("FAILED".equals(state) || "Error".equals(state)) { if (inst != null) { inst.setInstruction_status("1"); instructionService.update(inst); } + } else if ("STOPPED".equals(state)){ + if (inst != null) { + inst.setInstruction_status("3"); + instructionService.update(inst); + } } } } diff --git a/nladmin-system/nlsso-server/src/main/resources/config/application-dev2.yml b/nladmin-system/nlsso-server/src/main/resources/config/application-dev2.yml index 83f6420..ff01f00 100644 --- a/nladmin-system/nlsso-server/src/main/resources/config/application-dev2.yml +++ b/nladmin-system/nlsso-server/src/main/resources/config/application-dev2.yml @@ -79,7 +79,7 @@ spring: active: true username: root password: 123456 - cleanSession: true + cleanSession: false url: 10.211.55.3 clientId: hs_mqtt21 topics: diff --git a/nladmin-ui/src/views/acs/instruction/index.vue b/nladmin-ui/src/views/acs/instruction/index.vue index ffa3088..ccc49b0 100644 --- a/nladmin-ui/src/views/acs/instruction/index.vue +++ b/nladmin-ui/src/views/acs/instruction/index.vue @@ -143,7 +143,7 @@ @@ -260,7 +260,7 @@ const defaultForm = { update_time: null } export default { - dicts: ['task_status', 'task_type'], + dicts: ['task_status', 'task_type', 'instruction_type'], name: 'Instruction', components: { crudOperation, pagination, rrOperation }, mixins: [presenter(), header(), form(defaultForm), crud()], diff --git a/nladmin-ui/src/views/monitor/interface/search.vue b/nladmin-ui/src/views/monitor/interface/search.vue index 0bb68bb..78c1f01 100644 --- a/nladmin-ui/src/views/monitor/interface/search.vue +++ b/nladmin-ui/src/views/monitor/interface/search.vue @@ -111,7 +111,9 @@ export default { 'ACS->HR', 'HR->ACS', 'ACS->AGV', - 'AGV->ACS' + 'AGV->ACS', + 'ACS->HK', + 'HK->ACS' ] } },