+ * 用于向AGV系统提交任务请求的DTO对象,包含任务执行所需的所有参数配置。
+ * 支持配置任务类型、执行路径、优先级、截止时间、机器人资源等核心属性。
+ */
+
+@JsonPropertyOrder({
+ "taskType",
+ "targetRoute",
+ "initPriority",
+ "deadline",
+ "robotType",
+ "robotCode",
+ "interrupt",
+ "robotTaskCode",
+ "groupCode",
+ "extra"
+})
+@Data
+public class SubmitRequest {
+ /**
+ * 任务类型
+ * 指定AGV需要执行的任务类型
+ */
+ @JsonProperty("taskType")
+ private String taskType;
+
+ /**
+ * 执行步骤集合
+ * 任务执行的路径规划和步骤集合
+ */
+ @JsonProperty("targetRoute")
+ private List
+ * 用于AGV任务执行过程中向系统上报任务状态信息的DTO对象,
+ * 包含任务执行的关键节点信息和当前位置信息。
+ */
+@Data
+public class TaskReporterRequest {
+
+ /**
+ * 机器人任务编码
+ * 外部任务唯一编号,用于关联具体任务实例
+ */
+ @JsonProperty("robotTaskCode")
+ private String robotTaskCode;
+
+ /**
+ * 当前执行任务的机器人唯一标识
+ * 用于标识执行当前任务的具体AGV设备
+ */
+ @JsonProperty("singleRobotCode")
+ private String singleRobotCode;
+
+ /**
+ * 自定义扩展字段
+ * 包含任务执行过程中的详细状态信息和其他扩展数据
+ */
+ @JsonProperty("extra")
+ private Extra extra;
+
+}
diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/request/taskReporter/Values.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/request/taskReporter/Values.java
new file mode 100644
index 0000000..d46841a
--- /dev/null
+++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/request/taskReporter/Values.java
@@ -0,0 +1,124 @@
+package org.cpte.modules.hikAgv.request.taskReporter;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+/**
+ * AGV任务状态上报值对象
+ *
+ * 包含AGV任务执行过程中的详细状态信息,如位置坐标、载具信息、机器人信息等
+ */
+@Data
+public class Values {
+
+ /**
+ * 地图编号
+ * 标识当前AGV所在地图的唯一编码
+ */
+ @JsonProperty("mapCode")
+ private String mapCode;
+
+ /**
+ * 存储类型
+ * 枚举值:
+ * BIN - 仓位
+ * SITE - 站点
+ */
+ @JsonProperty("slotCategory")
+ private String slotCategory;
+
+ /**
+ * 当前站点编号
+ * AGV当前所在的站点位置编码
+ */
+ @JsonProperty("slotCode")
+ private String slotCode;
+
+ /**
+ * 站点别名
+ * 1.走出储位:起点
+ * 2.任务完成:目标点
+ */
+ @JsonProperty("slotName")
+ private String slotName;
+
+ /**
+ * 机器人当前位置 x 坐标
+ * AGV在地图中的X轴坐标值
+ */
+ @JsonProperty("x")
+ private Integer x;
+
+ /**
+ * 机器人当前位置 y 坐标
+ * AGV在地图中的Y轴坐标值
+ */
+ @JsonProperty("y")
+ private Integer y;
+
+ /**
+ * 任务执行过程中消息上报的方法名
+ * 默认使用方式:
+ * start : 任务开始
+ * outbin : 走出储位
+ * end : 任务完成
+ */
+ @JsonProperty("method")
+ private String method;
+
+ /**
+ * 载具种类
+ * 标识载具的分类信息
+ */
+ @JsonProperty("carrierCategory")
+ private String carrierCategory;
+
+ /**
+ * 载具类型
+ * 标识载具的具体型号或类型
+ */
+ @JsonProperty("carrierType")
+ private String carrierType;
+
+ /**
+ * 载具编号
+ * 当前任务关联的载具唯一标识
+ */
+ @JsonProperty("carrierCode")
+ private String carrierCode;
+
+ /**
+ * 机器人种类
+ * 标识机器人的分类信息
+ */
+ @JsonProperty("amrCategory")
+ private String amrCategory;
+
+ /**
+ * 机器人类型
+ * 标识机器人的具体型号或类型
+ */
+ @JsonProperty("amrType")
+ private String amrType;
+
+ /**
+ * 机器人编号
+ * 机器人的唯一标识编码
+ */
+ @JsonProperty("amrCode")
+ private String amrCode;
+
+ /**
+ * 载具名称
+ * 载具的显示名称或描述信息
+ */
+ @JsonProperty("carrierName")
+ private String carrierName;
+
+ /**
+ * 载具角度
+ * 载具当前的方向角度值
+ */
+ @JsonProperty("carrierDir")
+ private String carrierDir;
+}
diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/response/HikResult.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/response/HikResult.java
new file mode 100644
index 0000000..57b81fc
--- /dev/null
+++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/response/HikResult.java
@@ -0,0 +1,46 @@
+package org.cpte.modules.hikAgv.response;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 接口返回数据格式
+ *
+ * @author scott
+ * @email cpteos@163.com
+ * @date 2019年1月19日
+ */
+@Data
+public class HikResult implements Serializable {
+
+ /**
+ * 返回代码
+ */
+ private String code = "";
+
+ /**
+ * 返回处理消息
+ */
+ private String message = "";
+
+ /**
+ * 返回数据对象 data
+ */
+ private ResponesData data;
+
+ public static HikResult success(ResponesData data) {
+ HikResult response = new HikResult();
+ response.code = "SUCCESS";
+ response.message = "成功";
+ response.data = data;
+ return response;
+ }
+
+ public static HikResult error(String message) {
+ HikResult response = new HikResult();
+ response.code = "FAIL";
+ response.message = message;
+ return response;
+ }
+}
diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/response/ResponesData.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/response/ResponesData.java
new file mode 100644
index 0000000..5b86466
--- /dev/null
+++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/response/ResponesData.java
@@ -0,0 +1,10 @@
+package org.cpte.modules.hikAgv.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+
+@Data
+public class ResponesData {
+ @JsonProperty("robotTaskCode")
+ private String robotTaskCode;
+}
diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/service/IHikAgvService.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/service/IHikAgvService.java
new file mode 100644
index 0000000..725868d
--- /dev/null
+++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/service/IHikAgvService.java
@@ -0,0 +1,30 @@
+package org.cpte.modules.hikAgv.service;
+
+import org.cpte.modules.agvTask.entity.AgvTask;
+import org.cpte.modules.hikAgv.request.submit.SubmitRequest;
+import org.cpte.modules.hikAgv.request.taskReporter.TaskReporterRequest;
+
+public interface IHikAgvService {
+ /**
+ * 生成任务下发JSON
+ *
+ * @param agvTask 任务
+ */
+ SubmitRequest generateAgvTaskJson(AgvTask agvTask);
+
+ /**
+ * 下发任务
+ *
+ * @param url 接口地址
+ * @param json 接口json
+ * @param agvTask 任务
+ */
+ void sendAgvTask(String url, String json, AgvTask agvTask);
+
+ /**
+ * 任务上报
+ *
+ * @param taskReporterRequest 任务上报参数
+ */
+ void taskReporter(TaskReporterRequest taskReporterRequest);
+}
diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/service/impl/IHikAgvServiceImpl.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/service/impl/IHikAgvServiceImpl.java
new file mode 100644
index 0000000..722d66d
--- /dev/null
+++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/hikAgv/service/impl/IHikAgvServiceImpl.java
@@ -0,0 +1,251 @@
+package org.cpte.modules.hikAgv.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.cpte.modules.agvTask.entity.AgvTask;
+import org.cpte.modules.agvTask.mapper.AgvTaskMapper;
+import org.cpte.modules.agvTask.service.IAgvTaskService;
+import org.cpte.modules.constant.enums.*;
+import org.cpte.modules.hikAgv.request.submit.*;
+import org.cpte.modules.hikAgv.request.taskReporter.TaskReporterRequest;
+import org.cpte.modules.hikAgv.service.IHikAgvService;
+import org.jeecg.modules.system.mapper.SysDictMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+@Service
+@Slf4j
+public class IHikAgvServiceImpl implements IHikAgvService {
+
+ // 接口开关
+ final String open_flag = "OPEN";
+
+ // 成功码
+ final String success_code = "SUCCESS";
+
+ @Autowired
+ private SysDictMapper sysDictMapper;
+
+ @Autowired
+ private AgvTaskMapper agvTaskMapper;
+
+ @Autowired
+ private IAgvTaskService iAgvTaskService;
+
+ @Override
+ public SubmitRequest generateAgvTaskJson(AgvTask agvTask) {
+ SubmitRequest submitRequest = new SubmitRequest();
+ submitRequest.setTaskType("PF-LMR-COMMON");
+
+ // 设置起点路径
+ TargetRoute srcTargetRoute = createSrcTargetRoute(agvTask);
+
+ // 设置终点路径
+ TargetRoute dstTargetRoute = createDstTargetRoute(agvTask);
+
+ submitRequest.setTargetRoute(Arrays.asList(srcTargetRoute, dstTargetRoute));
+ submitRequest.setInitPriority(agvTask == null ? 99 : agvTask.getPriority());
+
+ LocalDateTime now = LocalDateTime.now(ZoneOffset.UTC);
+ String deadline = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"));
+ submitRequest.setDeadline(deadline);
+
+ submitRequest.setRobotType("GROUPS");
+ submitRequest.setRobotCode(Collections.singletonList("c3a1e7bb"));
+
+ Extra extra1 = new Extra();
+ extra1.setCarrierInfo(createCarrierInfoList(agvTask == null ? "" : agvTask.getCarrierCode()));
+
+ submitRequest.setExtra(extra1);
+ submitRequest.setInterrupt(0);
+ submitRequest.setRobotTaskCode(agvTask == null ? "" : agvTask.getId());
+ submitRequest.setGroupCode(agvTask == null ? "" : agvTask.getId());
+
+ return submitRequest;
+ }
+
+ @Override
+ public void sendAgvTask(String url, String json, AgvTask agvTask) {
+ log.info("请求报文:{}", json);
+ // 检查接口开关, 未开启则返回
+ if (sysDictMapper.queryByDictCode(open_flag) == null) {
+ updateAgvTaskResponse(agvTask, "接口未开启", "FAILED");
+ return;
+ }
+
+ String code = null;
+ String message = null;
+ try {
+ //String result = HttpPostUtil.sendPostReq(url, json);
+ String result = "{\n" +
+ " \"message\": \"成功\",\n" +
+ " \"code\":\"SUCCESS\",\n" +
+ "}";
+ if (StringUtils.isEmpty(result)) {
+ message = "AGV返回信息:下发任务接口调用失败";
+ throw new RuntimeException(message);
+ }
+
+ JSONObject resulObject = JSON.parseObject(result);
+ if (resulObject == null) {
+ message = "AGV返回信息:下发任务接口返回为空";
+ throw new RuntimeException(message);
+ }
+
+ code = resulObject.getString("code");
+ message = resulObject.getString("message");
+
+ if (!success_code.equals(code)) {
+ throw new RuntimeException("AGV返回消息:" + message);
+ }
+
+ // 更新任务状态
+ updateAgvTaskResponse(agvTask, message, code);
+ } catch (Exception e) {
+ // 记录异常到 AgvTask
+ updateAgvTaskResponse(agvTask, e.getMessage(), "FAILED");
+ throw e; // 继续向上抛出异常供 Controller 层处理
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void taskReporter(TaskReporterRequest taskReporterRequest) {
+ AgvTask agvTask = agvTaskMapper.selectById(taskReporterRequest.getRobotTaskCode());
+ String status = taskReporterRequest.getExtra().getValues().getMethod();
+ switch (status) {
+ case "outbin":
+ //走出储位
+ handleOutBin(agvTask);
+ break;
+ case "end":
+ //任务完成
+ handleEnd(agvTask);
+ break;
+ case "resend":
+ //重新发送
+ handleResend(agvTask);
+ break;
+ }
+ }
+
+
+ /**
+ * 走出储位
+ *
+ * @param agvTask 任务
+ */
+ private void handleOutBin(AgvTask agvTask) {
+
+ }
+
+ /**
+ * 任务完成
+ *
+ * @param agvTask 任务
+ */
+ private void handleEnd(AgvTask agvTask) {
+ agvTask.setStatus(AgvStatusEnum.COMPLETED.getValue());
+ agvTask.setEndTime(new Date());
+ agvTaskMapper.updateById(agvTask);
+ }
+
+ /**
+ * 重新发送
+ *
+ * @param agvTask
+ */
+ private void handleResend(AgvTask agvTask) {
+ Long count = agvTaskMapper.isAGVTaskDuplicate(agvTask.getCarrierCode(), agvTask.getStartCode(), agvTask.getEndCode());
+ if (count > 0) {
+ throw new RuntimeException("任务已重新生成,请勿重复操作! ");
+ }
+ AgvTask newAgvTask = iAgvTaskService.createAgvTask(AgvStatusEnum.CREATED.getValue(), agvTask.getCarrierCode(), agvTask.getStartCode(), agvTask.getEndCode(), agvTask.getTaskType(), agvTask.getType());
+ switch (agvTask.getType()) {
+ case "INBOUND":
+ case "OUTBOUND":
+ //下发任务
+ sendAgvTask("", "", newAgvTask);
+ break;
+ default:
+ throw new RuntimeException("任务类型不支持: " + agvTask.getType());
+ }
+ }
+
+
+ private void updateAgvTaskResponse(AgvTask agvTask, String message, String code) {
+ if (agvTask != null) {
+ if (success_code.equals(code)) {
+ agvTask.setStatus(AgvStatusEnum.EXECUTING.getValue());
+ }
+ agvTask.setResMessage(message);
+ agvTask.setStartTime(new Date());
+ agvTaskMapper.updateById(agvTask);
+ }
+ }
+
+ /**
+ * 创建起点路径
+ *
+ * @param agvTask 任务
+ * @return TargetRoute
+ */
+ private TargetRoute createSrcTargetRoute(AgvTask agvTask) {
+ TargetRoute srcTargetRoute = new TargetRoute();
+ srcTargetRoute.setSeq(0);
+ srcTargetRoute.setType("ZONE");
+ srcTargetRoute.setCode(agvTask == null ? "" : agvTask.getStartCode());
+ srcTargetRoute.setOperation("COLLECT");
+ srcTargetRoute.setExtra(null);
+ srcTargetRoute.setRobotType("GROUPS");
+ srcTargetRoute.setRobotCode(Collections.singletonList("a361flb8"));
+ return srcTargetRoute;
+ }
+
+ /**
+ * 创建终点路径
+ *
+ * @param agvTask 任务
+ * @return TargetRoute
+ */
+ private TargetRoute createDstTargetRoute(AgvTask agvTask) {
+ TargetRoute dstTargetRoute = new TargetRoute();
+ dstTargetRoute.setSeq(1);
+ dstTargetRoute.setType("SITE");
+ dstTargetRoute.setCode(agvTask == null ? "" : agvTask.getEndCode());
+ dstTargetRoute.setOperation("DELIVERY");
+
+ Extra extra = new Extra();
+
+ AngleInfo angleInfo = new AngleInfo();
+ angleInfo.setType("RELATIVE");
+ angleInfo.setCode("90");
+
+ extra.setAngleInfo(angleInfo);
+ extra.setCarrierInfo(createCarrierInfoList(agvTask == null ? "" : agvTask.getCarrierCode()));
+
+ dstTargetRoute.setExtra(extra);
+ return dstTargetRoute;
+ }
+
+ private List