From 1aa2356340328d4da6caf35bfdfd1a456cd5f1df Mon Sep 17 00:00:00 2001 From: miguannan <53815784+javami888@users.noreply.github.com> Date: Wed, 6 May 2026 10:45:09 +0800 Subject: [PATCH] =?UTF-8?q?agv=E7=8A=B6=E6=80=81=E5=9B=9E=E4=BC=A0?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E7=AD=96=E7=95=A5=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../agvKit/controller/KitToAcsController.java | 2 +- .../service/handler/KitMessageHandler.java | 26 ++ .../agvKit/service/handler/KitResponse.java | 43 ++++ .../handler/impl/AgvErrorReportHandler.java | 37 +++ .../handler/impl/AgvIdReportHandler.java | 57 +++++ .../handler/impl/AgvPowerReportHandler.java | 37 +++ .../handler/impl/AgvStateReportHandler.java | 54 ++++ .../handler/impl/TaskIndexReportHandler.java | 55 ++++ .../handler/impl/TaskRunReportHandler.java | 37 +++ .../handler/impl/TaskStateReportHandler.java | 179 +++++++++++++ .../service/impl/KitToAcsServiceImpl.java | 237 ++++-------------- 11 files changed, 568 insertions(+), 196 deletions(-) create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/KitMessageHandler.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/KitResponse.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvErrorReportHandler.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvIdReportHandler.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvPowerReportHandler.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvStateReportHandler.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskIndexReportHandler.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskRunReportHandler.java create mode 100644 acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskStateReportHandler.java diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/controller/KitToAcsController.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/controller/KitToAcsController.java index cdcd118..e219b80 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/controller/KitToAcsController.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/controller/KitToAcsController.java @@ -44,7 +44,7 @@ public class KitToAcsController { param = JSONObject.parseObject(o); } log.info("---kit上报请求---"+param.toString()); - System.out.println("---kit上报请求---"+param.toString()); + System.out.println("---kit上报请求---"+ param); return new ResponseEntity<>(kitToAcsService.agvCallback(param), HttpStatus.OK); } } diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/KitMessageHandler.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/KitMessageHandler.java new file mode 100644 index 0000000..65bd3ed --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/KitMessageHandler.java @@ -0,0 +1,26 @@ +package org.nl.extInterface.agvKit.service.handler; + +import com.alibaba.fastjson.JSONObject; + +/** + * KIT消息处理器接口,定义消息类型支持与处理策略。 + * + * @author guannan + * @date 2026-05-06 + */ +public interface KitMessageHandler { + /** + * 返回当前策略所处理的KIT消息类型。 + * + * @return MsgTypeEnum定义的类型值 + */ + Integer supportType(); + + /** + * 处理KIT消息负载并生成协议响应。 + * + * @param params KIT回调请求中的params节点 + * @return KIT协议响应体 + */ + JSONObject handle(JSONObject params) throws Exception; +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/KitResponse.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/KitResponse.java new file mode 100644 index 0000000..8bc2a06 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/KitResponse.java @@ -0,0 +1,43 @@ +package org.nl.extInterface.agvKit.service.handler; + +import com.alibaba.fastjson.JSONObject; + +/** + * KIT响应构建工具类,提供成功和失败响应的静态构建方法。 + * + * @author guannan + * @date 2026-05-06 + */ +public final class KitResponse { + /** + * 防止实例化响应工具类。 + */ + private KitResponse() { + } + + /** + * 构建成功的KIT响应。 + * + * @param message 响应消息 + * @return 状态码200的响应体 + */ + public static JSONObject success(String message) { + JSONObject response = new JSONObject(); + response.put("code", "200"); + response.put("message", message); + return response; + } + + /** + * 构建失败的KIT响应。 + * + * @param message 失败原因 + * @return 状态码400的响应体 + */ + public static JSONObject fail(String message) { + JSONObject response = new JSONObject(); + response.put("code", "400"); + response.put("message", message); + return response; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvErrorReportHandler.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvErrorReportHandler.java new file mode 100644 index 0000000..644aed6 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvErrorReportHandler.java @@ -0,0 +1,37 @@ +package org.nl.extInterface.agvKit.service.handler.impl; + +import com.alibaba.fastjson.JSONObject; +import org.nl.extInterface.agvKit.service.enums.MsgTypeEnum; +import org.nl.extInterface.agvKit.service.handler.KitMessageHandler; +import org.nl.extInterface.agvKit.service.handler.KitResponse; +import org.springframework.stereotype.Component; + +/** + * AGV故障上报处理器,确认收到KIT上报的AGV故障信息。 + * + * @author guannan + * @date 2026-05-06 + */ +@Component +public class AgvErrorReportHandler implements KitMessageHandler { + /** + * 返回AGV故障上报消息类型。 + * + * @return AGV_ERROR_RPT类型值 + */ + @Override + public Integer supportType() { + return MsgTypeEnum.AGV_ERROR_RPT.getValue(); + } + + /** + * 确认AGV故障上报。当前集成不持久化故障详情。 + * + * @param params KIT回调请求中的params节点 + * @return KIT协议响应体 + */ + @Override + public JSONObject handle(JSONObject params) { + return KitResponse.success("更新指令执行中成功"); + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvIdReportHandler.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvIdReportHandler.java new file mode 100644 index 0000000..c953e1d --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvIdReportHandler.java @@ -0,0 +1,57 @@ +package org.nl.extInterface.agvKit.service.handler.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.task.instruction.domain.Instruction; +import org.nl.acs.task.instruction.enums.InstructionStatusEnum; +import org.nl.acs.task.instruction.service.InstructionService; +import org.nl.extInterface.agvKit.service.enums.MsgTypeEnum; +import org.nl.extInterface.agvKit.service.handler.KitMessageHandler; +import org.nl.extInterface.agvKit.service.handler.KitResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * AGV车号上报处理器,持久化KIT上报的AGV车号并将指令标记为忙碌。 + * + * @author guannan + * @date 2026-05-06 + */ +@Component +public class AgvIdReportHandler implements KitMessageHandler { + @Autowired + private InstructionService instructionService; + + /** + * 返回AGV分配上报消息类型。 + * + * @return AGV_ID_RPT类型值 + */ + @Override + public Integer supportType() { + return MsgTypeEnum.AGV_ID_RPT.getValue(); + } + + /** + * 持久化KIT上报的AGV车号,并将指令标记为忙碌。 + * + * @param params KIT回调请求中的params节点 + * @return KIT协议响应体 + */ + @Override + public JSONObject handle(JSONObject params) { + String taskId = params.getString("taskId"); + String agvId = params.getString("agvId"); + Instruction instruction = instructionService.findByCodeFromCache(taskId); + if (ObjectUtil.isEmpty(instruction)) { + return KitResponse.fail("请求失败,任务信息不存在,指令号:" + taskId); + } + + instruction.setCarno(agvId); + instruction.setInstruction_status(InstructionStatusEnum.BUSY.getCode()); + instruction.setUpdate_time(DateUtil.now()); + instructionService.update(instruction); + return KitResponse.success("更新车号成功"); + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvPowerReportHandler.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvPowerReportHandler.java new file mode 100644 index 0000000..5ef9ee2 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvPowerReportHandler.java @@ -0,0 +1,37 @@ +package org.nl.extInterface.agvKit.service.handler.impl; + +import com.alibaba.fastjson.JSONObject; +import org.nl.extInterface.agvKit.service.enums.MsgTypeEnum; +import org.nl.extInterface.agvKit.service.handler.KitMessageHandler; +import org.nl.extInterface.agvKit.service.handler.KitResponse; +import org.springframework.stereotype.Component; + +/** + * AGV电量上报处理器,确认收到KIT上报的AGV电量信息。 + * + * @author guannan + * @date 2026-05-06 + */ +@Component +public class AgvPowerReportHandler implements KitMessageHandler { + /** + * 返回AGV电量上报消息类型。 + * + * @return AGV_POWER_RPT类型值 + */ + @Override + public Integer supportType() { + return MsgTypeEnum.AGV_POWER_RPT.getValue(); + } + + /** + * 确认AGV电量上报。当前集成不持久化电量详情。 + * + * @param params KIT回调请求中的params节点 + * @return KIT协议响应体 + */ + @Override + public JSONObject handle(JSONObject params) { + return KitResponse.success("更新指令执行中成功"); + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvStateReportHandler.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvStateReportHandler.java new file mode 100644 index 0000000..fc00c09 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/AgvStateReportHandler.java @@ -0,0 +1,54 @@ +package org.nl.extInterface.agvKit.service.handler.impl; + +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.extInterface.agvKit.service.enums.MsgTypeEnum; +import org.nl.extInterface.agvKit.service.handler.KitMessageHandler; +import org.nl.extInterface.agvKit.service.handler.KitResponse; +import org.nl.extInterface.wms.service.AcsToWmsService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * AGV状态上报处理器,将KIT上报的AGV状态转发至WMS作为设备状态更新。 + * + * @author guannan + * @date 2026-05-06 + */ +@Component +public class AgvStateReportHandler implements KitMessageHandler { + @Autowired + private AcsToWmsService acsToWmsService; + + /** + * 返回AGV状态上报消息类型。 + * + * @return AGV_STATE_RPT类型值 + */ + @Override + public Integer supportType() { + return MsgTypeEnum.AGV_STATE_RPT.getValue(); + } + + /** + * 将KIT上报的AGV状态转发至WMS作为设备状态更新。 + * + * @param params KIT回调请求中的params节点 + * @return KIT协议响应体 + */ + @Override + public JSONObject handle(JSONObject params) { + String deviceCode = StrUtil.blankToDefault(params.getString("deviceCode"), params.getString("agvId")); + Integer status = params.getInteger("status"); + String statusDescription = params.getString("statusDescription"); + if (StrUtil.isEmpty(deviceCode) || status == null) { + return KitResponse.fail("AGV状态上报参数异常"); + } + + boolean success = acsToWmsService.deviceStatusUpdate(deviceCode, status, statusDescription); + if (!success) { + return KitResponse.fail("回馈WMS设备状态失败"); + } + return KitResponse.success("更新指令执行中成功"); + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskIndexReportHandler.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskIndexReportHandler.java new file mode 100644 index 0000000..4ef4cfb --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskIndexReportHandler.java @@ -0,0 +1,55 @@ +package org.nl.extInterface.agvKit.service.handler.impl; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.task.instruction.domain.Instruction; +import org.nl.acs.task.instruction.enums.InstructionStatusEnum; +import org.nl.acs.task.instruction.service.InstructionService; +import org.nl.extInterface.agvKit.service.enums.MsgTypeEnum; +import org.nl.extInterface.agvKit.service.handler.KitMessageHandler; +import org.nl.extInterface.agvKit.service.handler.KitResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 车辆任务生成上报处理器,KIT上报车辆任务生成后将ACS指令标记为忙碌。 + * + * @author guannan + * @date 2026-05-06 + */ +@Component +public class TaskIndexReportHandler implements KitMessageHandler { + @Autowired + private InstructionService instructionService; + + /** + * 返回车辆任务生成上报消息类型。 + * + * @return TASK_INDEX_RPT类型值 + */ + @Override + public Integer supportType() { + return MsgTypeEnum.TASK_INDEX_RPT.getValue(); + } + + /** + * KIT上报车辆任务生成后,将ACS指令标记为忙碌。 + * + * @param params KIT回调请求中的params节点 + * @return KIT协议响应体 + */ + @Override + public JSONObject handle(JSONObject params) { + String taskId = params.getString("taskId"); + Instruction instruction = instructionService.findByCodeFromCache(taskId); + if (ObjectUtil.isEmpty(instruction)) { + return KitResponse.fail("请求失败,任务信息不存在,指令号:" + taskId); + } + + instruction.setInstruction_status(InstructionStatusEnum.BUSY.getCode()); + instruction.setUpdate_time(DateUtil.now()); + instructionService.update(instruction); + return KitResponse.success("更新指令执行中成功"); + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskRunReportHandler.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskRunReportHandler.java new file mode 100644 index 0000000..e4aaeeb --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskRunReportHandler.java @@ -0,0 +1,37 @@ +package org.nl.extInterface.agvKit.service.handler.impl; + +import com.alibaba.fastjson.JSONObject; +import org.nl.extInterface.agvKit.service.enums.MsgTypeEnum; +import org.nl.extInterface.agvKit.service.handler.KitMessageHandler; +import org.nl.extInterface.agvKit.service.handler.KitResponse; +import org.springframework.stereotype.Component; + +/** + * 任务运行上报处理器,确认收到KIT上报的任务运行状态。 + * + * @author guannan + * @date 2026-05-06 + */ +@Component +public class TaskRunReportHandler implements KitMessageHandler { + /** + * 返回任务运行上报消息类型。 + * + * @return TASK_RUN_RPT类型值 + */ + @Override + public Integer supportType() { + return MsgTypeEnum.TASK_RUN_RPT.getValue(); + } + + /** + * 确认任务运行上报。当前集成无额外状态更新。 + * + * @param params KIT回调请求中的params节点 + * @return KIT协议响应体 + */ + @Override + public JSONObject handle(JSONObject params) { + return KitResponse.success("更新车号成功"); + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskStateReportHandler.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskStateReportHandler.java new file mode 100644 index 0000000..14d1097 --- /dev/null +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/handler/impl/TaskStateReportHandler.java @@ -0,0 +1,179 @@ +package org.nl.extInterface.agvKit.service.handler.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import org.nl.acs.device.device.service.DeviceAppService; +import org.nl.acs.device.device.service.entity.Device; +import org.nl.acs.device.deviceDriver.service.driver.DeviceDriver; +import org.nl.acs.device.storageMgt.service.StorageCellService; +import org.nl.acs.device.storageMgt.service.entity.StorageCell; +import org.nl.acs.task.instruction.domain.Instruction; +import org.nl.acs.task.instruction.service.InstructionService; +import org.nl.config.MapOf; +import org.nl.extInterface.agvKit.service.enums.MsgTypeEnum; +import org.nl.extInterface.agvKit.service.enums.TaskPhaseEnum; +import org.nl.extInterface.agvKit.service.enums.TaskStateEnum; +import org.nl.extInterface.agvKit.service.handler.KitMessageHandler; +import org.nl.extInterface.agvKit.service.handler.KitResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 任务状态上报处理器,根据KIT任务状态上报推进ACS指令阶段,并通知相关设备驱动。 + * + * @author guannan + * @date 2026-05-06 + */ +@Component +public class TaskStateReportHandler implements KitMessageHandler { + @Autowired + private InstructionService instructionService; + @Autowired + private StorageCellService storageCellService; + @Autowired + private DeviceAppService deviceAppService; + + /** + * 返回任务状态上报消息类型。 + * + * @return TASK_STATE_RPT类型值 + */ + @Override + public Integer supportType() { + return MsgTypeEnum.TASK_STATE_RPT.getValue(); + } + + /** + * 根据KIT任务状态上报推进ACS指令阶段,并通知相关设备驱动。 + * + * @param params KIT回调请求中的params节点 + * @return KIT协议响应体 + */ + @Override + public JSONObject handle(JSONObject params) throws Exception { + String instTaskId = params.getString("taskId"); + String taskPhase = params.getString("taskPhase"); + String taskState = params.getString("taskState"); + String taskPoint = params.getString("taskPoint"); + if (StrUtil.isEmpty(taskPhase)) { + return KitResponse.fail("taskPhase参数异常"); + } + + Instruction instruction = findInstruction(instTaskId); + if (ObjectUtil.isEmpty(instruction)) { + return KitResponse.fail("请求失败,任务信息不存在,指令号:" + instTaskId); + } + + if (TaskStateEnum.CANCELED.getValue().equals(taskState)) { + instructionService.cancel(instruction.getInstruction_id()); + return KitResponse.success("取消任务成功"); + } + + TaskPhaseEnum taskPhaseEnum = TaskPhaseEnum.fromPhase(taskPhase); + switch (taskPhaseEnum) { + case ENTER_REQUEST_OR_ALLOWED: + case LEAVE_NOTICE_OR_ALLOWED: + return handleSitePhase(instTaskId, taskPhase, taskPoint, taskPhaseEnum); + case PICKUP_REQUEST_OR_RESPONSE: + case PICKUP_COMPLETE: + case RELEASE_REQUEST_OR_RESPONSE: + case RELEASE_COMPLETE: + return handleCargoPhase(instruction, instTaskId, taskPhase, taskState, taskPhaseEnum); + default: + return KitResponse.fail("taskPhase值不存在"); + } + } + + /** + * 先从缓存查找指令,缓存未命中则查数据库,数据库命中后重载缓存。 + * + * @param instTaskId ACS指令编码 + * @return 查找到的指令,未找到则返回null + */ + private Instruction findInstruction(String instTaskId) { + Instruction instruction = instructionService.findByCodeFromCache(instTaskId); + if (ObjectUtil.isNotEmpty(instruction)) { + return instruction; + } + + instruction = instructionService.findByCode(instTaskId); + if (ObjectUtil.isNotEmpty(instruction)) { + instructionService.reload(); + } + return instruction; + } + + /** + * 处理进入/离开站点阶段,将AGV阶段数据推入站点设备驱动。 + * + * @param instTaskId ACS指令编码 + * @param taskPhase KIT上报的任务阶段 + * @param taskPoint KIT上报的站点地址 + * @param taskPhaseEnum 解析后的任务阶段枚举 + * @return KIT协议响应体 + */ + private JSONObject handleSitePhase(String instTaskId, String taskPhase, String taskPoint, + TaskPhaseEnum taskPhaseEnum) { + StorageCell storageCellDto = storageCellService.findByAddress(taskPoint); + if (ObjectUtil.isEmpty(storageCellDto)) { + return KitResponse.fail("请求失败,点位信息不存在,点位站点号:" + taskPoint); + } + + Device device = deviceAppService.findDeviceByCode(storageCellDto.getStorage_code()); + if (ObjectUtil.isEmpty(device)) { + return KitResponse.fail("请求失败,请求位置编码不存在"); + } + + DeviceDriver deviceDriver = device.getDeviceDriver(); + deviceDriver.setDeviceInnerParam(MapOf.of("taskId", instTaskId, "agvphase", taskPhase)); + return KitResponse.success(taskPhaseEnum.getDescription() + "处理完毕"); + } + + /** + * 处理取货/放货阶段,更新站点驱动并持久化指令执行阶段。 + * + * @param instruction 当前ACS指令 + * @param instTaskId ACS指令编码 + * @param taskPhase KIT上报的任务阶段 + * @param taskState KIT上报的任务状态 + * @param taskPhaseEnum 解析后的任务阶段枚举 + * @return KIT协议响应体 + */ + private JSONObject handleCargoPhase(Instruction instruction, String instTaskId, String taskPhase, + String taskState, TaskPhaseEnum taskPhaseEnum) { + Device device = findCargoPhaseDevice(instruction, taskPhase); + if (device == null) { + return KitResponse.fail("点位驱动不存在"); + } + + device.getDeviceDriver().setDeviceInnerParam(MapOf.of("taskId", instTaskId, "agvphase", taskPhase)); + if (!taskPhase.equals(instruction.getExecute_status())) { + instruction.setExecute_status(taskPhase); + instructionService.update(instruction); + } + if (TaskStateEnum.COMPLETED.getValue().equals(taskState)) { + return KitResponse.success("完成任务成功"); + } + return KitResponse.success(taskPhaseEnum.getDescription() + "处理完毕"); + } + + /** + * 根据取货或放货阶段解析对应的设备。 + * + * @param instruction 当前ACS指令 + * @param taskPhase KIT上报的任务阶段 + * @return 匹配的起点或终点设备,阶段不支持时返回null + */ + private Device findCargoPhaseDevice(Instruction instruction, String taskPhase) { + if (TaskPhaseEnum.PICKUP_REQUEST_OR_RESPONSE.getValue().equals(taskPhase) + || TaskPhaseEnum.PICKUP_COMPLETE.getValue().equals(taskPhase)) { + return deviceAppService.findDeviceByCode(instruction.getStart_point_code()); + } + if (TaskPhaseEnum.RELEASE_REQUEST_OR_RESPONSE.getValue().equals(taskPhase) + || TaskPhaseEnum.RELEASE_COMPLETE.getValue().equals(taskPhase)) { + return deviceAppService.findDeviceByCode(instruction.getNext_point_code()); + } + return null; + } +} diff --git a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/impl/KitToAcsServiceImpl.java b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/impl/KitToAcsServiceImpl.java index 5294468..79f2032 100644 --- a/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/impl/KitToAcsServiceImpl.java +++ b/acs2/nladmin-system/nlsso-server/src/main/java/org/nl/extInterface/agvKit/service/impl/KitToAcsServiceImpl.java @@ -1,213 +1,60 @@ package org.nl.extInterface.agvKit.service.impl; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.nl.acs.device.device.service.DeviceAppService; -import org.nl.acs.device.device.service.entity.Device; -import org.nl.acs.device.deviceDriver.service.driver.DeviceDriver; -import org.nl.acs.device.storageMgt.service.StorageCellService; -import org.nl.acs.device.storageMgt.service.entity.StorageCell; -import org.nl.acs.task.instruction.domain.Instruction; -import org.nl.acs.task.instruction.enums.InstructionStatusEnum; -import org.nl.acs.task.instruction.service.InstructionService; -import org.nl.config.MapOf; import org.nl.extInterface.agvKit.service.KitToAcsService; -import org.nl.extInterface.agvKit.service.enums.MsgTypeEnum; -import org.nl.extInterface.agvKit.service.enums.TaskPhaseEnum; -import org.nl.extInterface.agvKit.service.enums.TaskStateEnum; -import org.nl.extInterface.wms.service.AcsToWmsService; +import org.nl.extInterface.agvKit.service.handler.KitMessageHandler; +import org.nl.extInterface.agvKit.service.handler.KitResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * KIT回调服务实现,构建类型-处理器注册表并路由回调请求。 + * + * @author guannan + * @date 2026-05-06 + */ @Service -@RequiredArgsConstructor @Slf4j public class KitToAcsServiceImpl implements KitToAcsService { - @Autowired - private InstructionService instructionService; - @Autowired - private StorageCellService storageCellService; - @Autowired - private DeviceAppService deviceAppService; - @Autowired - private AcsToWmsService acsToWmsService; + private final Map handlerMap; + /** + * 根据Spring管理的KIT处理器构建类型-处理器注册表。 + * + * @param handlers Spring发现的所有KIT消息处理器 + */ + @Autowired + public KitToAcsServiceImpl(List handlers) { + this.handlerMap = new HashMap<>(); + for (KitMessageHandler handler : handlers) { + this.handlerMap.put(handler.supportType(), handler); + } + } + + /** + * 将KIT回调请求路由至支持其消息类型的处理器。 + * + * @param requestParam KIT回调原始JSON,包含type和params + * @return KIT协议响应体 + */ @Override - public JSONObject agvCallback(JSONObject requestParam) throws Exception{ - // AGV 回调只负责推进 ACS 内部状态,后续是否继续执行由站点驱动结合 WMS 许可决定。 - JSONObject resp = new JSONObject(); + public JSONObject agvCallback(JSONObject requestParam) throws Exception { Integer type = requestParam.getInteger("type"); JSONObject params = requestParam.getJSONObject("params"); - if (MsgTypeEnum.TASK_STATE_RPT.getValue().equals(type)) { - String instTaskId = params.getString("taskId"); - String taskPhase = params.getString("taskPhase"); - String taskState = params.getString("taskState"); - String taskPoint = params.getString("taskPoint"); - if (StrUtil.isEmpty(taskPhase)){ - resp.put("code", "400"); - resp.put("message", "taskPhase参数异常"); - log.info("---kit响应请求---{}", resp); - return resp; - } - Instruction instruction = instructionService.findByCodeFromCache(instTaskId); - if (ObjectUtil.isEmpty(instruction)) { - instruction = instructionService.findByCode(instTaskId); - if (ObjectUtil.isEmpty(instruction)){ - resp.put("code", "400"); - resp.put("message", "请求失败,任务信息不存在,指令号:" + instTaskId); - log.info("---kit响应请求---{}", resp); - return resp; - } - instructionService.reload(); - } - - if (TaskStateEnum.CANCELED.getValue().equals(taskState)){ - instructionService.cancel(instruction.getInstruction_id()); - resp.put("code", "200"); - resp.put("message", "取消任务成功"); - log.info("---kit响应请求---{}", resp); - return resp; - } - - Device device = null; - TaskPhaseEnum taskPhaseEnum = TaskPhaseEnum.fromPhase(taskPhase); - switch (taskPhaseEnum){ - case ENTER_REQUEST_OR_ALLOWED: - case LEAVE_NOTICE_OR_ALLOWED: - StorageCell storageCellDto = storageCellService.findByAddress(taskPoint); - if (ObjectUtil.isEmpty(storageCellDto)) { - resp.put("code", "400"); - resp.put("message", "请求失败,点位信息不存在,点位站点号:" + taskPoint); - log.info("---kit响应请求---{}", resp); - return resp; - } - device = deviceAppService.findDeviceByCode(storageCellDto.getStorage_code()); - if (ObjectUtil.isEmpty(device)) { - resp.put("code", "400"); - resp.put("message", "请求失败,请求位置编码不存在"); - log.info("---kit响应请求---{}", resp); - return resp; - } - DeviceDriver deviceDriver = device.getDeviceDriver(); - deviceDriver.setDeviceInnerParam(MapOf.of("taskId",instTaskId,"agvphase",taskPhase)); - break; - case PICKUP_REQUEST_OR_RESPONSE: - case PICKUP_COMPLETE: - case RELEASE_REQUEST_OR_RESPONSE: - case RELEASE_COMPLETE: - if (TaskPhaseEnum.PICKUP_REQUEST_OR_RESPONSE.getValue().equals(taskPhase) - || TaskPhaseEnum.PICKUP_COMPLETE.getValue().equals(taskPhase)){ - device = deviceAppService.findDeviceByCode(instruction.getStart_point_code()); - } - if (TaskPhaseEnum.RELEASE_REQUEST_OR_RESPONSE.getValue().equals(taskPhase) - || TaskPhaseEnum.RELEASE_COMPLETE.getValue().equals(taskPhase)){ - device = deviceAppService.findDeviceByCode(instruction.getNext_point_code()); - } - if (device == null){ - resp.put("code", "400"); - resp.put("message", "点位驱动不存在"); - log.info("---kit响应请求---{}", resp); - return resp; - } - device.getDeviceDriver().setDeviceInnerParam(MapOf.of("taskId",instTaskId,"agvphase",taskPhase)); - if (!taskPhase.equals(instruction.getExecute_status())){ - instruction.setExecute_status(taskPhase); - instructionService.update(instruction); - } - if (TaskStateEnum.COMPLETED.getValue().equals(taskState)){ - resp.put("code", "200"); - resp.put("message", "完成任务成功"); - log.info("---kit响应请求---{}", resp); - } - break; - default: - resp.put("code", "400"); - resp.put("message", "taskPhase值不存在"); - log.info("---kit响应请求---{}", resp); - return resp; - } - resp.put("code", "200"); - resp.put("message", taskPhaseEnum.getDescription()+"处理完毕"); - log.info("---kit响应请求---{}", resp); - return resp; - } else if (MsgTypeEnum.AGV_ID_RPT.getValue().equals(type)){ - String taskId = params.getString("taskId"); - String agvId = params.getString("agvId"); - Instruction instruction = instructionService.findByCodeFromCache(taskId); - if (ObjectUtil.isEmpty(instruction)) { - resp.put("code", "400"); - resp.put("message", "请求失败,任务信息不存在,指令号:" + taskId); - log.info("---kit响应请求---{}", resp); - return resp; - } - instruction.setCarno(agvId); - instruction.setInstruction_status(InstructionStatusEnum.BUSY.getCode()); - instruction.setUpdate_time(DateUtil.now()); - instructionService.update(instruction); - resp.put("code", "200"); - resp.put("message", "更新车号成功"); - log.info("---kit响应请求---{}", resp); - return resp; - } else if (MsgTypeEnum.TASK_RUN_RPT.getValue().equals(type)){ - resp.put("code", "200"); - resp.put("message", "更新车号成功"); - log.info("---kit响应请求---{}", resp); - return resp; - } else if (MsgTypeEnum.TASK_INDEX_RPT.getValue().equals(type)){ - String taskId = params.getString("taskId"); - Instruction instruction = instructionService.findByCodeFromCache(taskId); - if (ObjectUtil.isEmpty(instruction)) { - resp.put("code", "400"); - resp.put("message", "请求失败,任务信息不存在,指令号:" + taskId); - log.info("---kit响应请求---{}", resp); - return resp; - } - instruction.setInstruction_status(InstructionStatusEnum.BUSY.getCode()); - instruction.setUpdate_time(DateUtil.now()); - instructionService.update(instruction); - resp.put("code", "200"); - resp.put("message", "更新指令执行中成功"); - log.info("---kit响应请求---{}", resp); - return resp; - } else if (MsgTypeEnum.AGV_POWER_RPT.getValue().equals(type)){ - resp.put("code", "200"); - resp.put("message", "更新指令执行中成功"); - log.info("---kit响应请求---{}", resp); - return resp; - } else if (MsgTypeEnum.AGV_STATE_RPT.getValue().equals(type)){ - String deviceCode = StrUtil.blankToDefault(params.getString("deviceCode"), params.getString("agvId")); - Integer status = params.getInteger("status"); - String statusDescription = params.getString("statusDescription"); - if (StrUtil.isEmpty(deviceCode) || status == null) { - resp.put("code", "400"); - resp.put("message", "AGV状态上报参数异常"); - log.info("---kit响应请求---{}", resp); - return resp; - } - boolean success = acsToWmsService.deviceStatusUpdate(deviceCode, status, statusDescription); - if (!success) { - resp.put("code", "400"); - resp.put("message", "回馈WMS设备状态失败"); - log.info("---kit响应请求---{}", resp); - return resp; - } - resp.put("code", "200"); - resp.put("message", "更新指令执行中成功"); - log.info("---kit响应请求---{}", resp); - return resp; - } else if (MsgTypeEnum.AGV_ERROR_RPT.getValue().equals(type)){ - resp.put("code", "200"); - resp.put("message", "更新指令执行中成功"); - log.info("---kit响应请求---{}", resp); - return resp; + KitMessageHandler handler = handlerMap.get(type); + if (handler == null) { + JSONObject response = KitResponse.fail(type + "type类型未定义"); + log.info("---kit响应请求---{}", response); + return response; } - resp.put("code", "400"); - resp.put("message", type+"type类型未定义"); - log.info("---kit响应请求---{}", resp); - return resp; + + JSONObject response = handler.handle(params); + log.info("---kit响应请求---{}", response); + return response; } }