diff --git a/servo/src/main/java/com/galaxis/rcs/RCS.java b/servo/src/main/java/com/galaxis/rcs/RCS.java
new file mode 100644
index 0000000..2851b76
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/RCS.java
@@ -0,0 +1,53 @@
+package com.galaxis.rcs;
+
+import com.galaxis.rcs.common.entity.AddTaskRequest;
+import com.galaxis.rcs.common.entity.AddTaskResult;
+import com.galaxis.rcs.task.TaskService;
+import com.yvan.logisticsModel.LogisticsRuntime;
+import com.yvan.logisticsModel.LogisticsRuntimeService;
+
+/**
+ * RCS 对外API调用类
+ */
+public class RCS {
+
+ static final LogisticsRuntimeService logisticsRuntimeService = new LogisticsRuntimeService();
+
+ /**
+ * 添加任务, 示例
+ *
+ * {
+ * type: 'carry', // 任务类型
+ * agv: 'cl2', // 指定车辆
+ * lpn: 'pallet1124', // 托盘ID, 用于校验
+ * from: '27', // 起始点位
+ * priority: 1, // 优先级
+ * from: {
+ * item: '27', bay: 0, level: 1, cell: 0 // 起始点位的详细信息
+ * },
+ * to:{
+ * item: '20'
+ * }
+ * }
+ *
+ */
+ public static AddTaskResult addTask(String envCode, AddTaskRequest request) {
+ AddTaskResult result = new AddTaskResult();
+
+ LogisticsRuntime logisticsRuntime = logisticsRuntimeService.findByEnvCode(envCode);
+
+ String bizTaskId = logisticsRuntime.taskService.addBizTask(request);
+
+ logisticsRuntime.taskDispatchFactory.checkAll();
+
+ result.bizTaskId = bizTaskId;
+
+ return result;
+ }
+
+ /**
+ * 地图信息2
+ * 1<->2, 2<->3, 3<->4, 4<->5, 5<->6, 6<->7, 7<->8, 8<->9,9<->10
+ * 1 <-> 38, 1 <-> 36
+ */
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/common/entity/AddTaskRequest.java b/servo/src/main/java/com/galaxis/rcs/common/entity/AddTaskRequest.java
new file mode 100644
index 0000000..ef71c92
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/common/entity/AddTaskRequest.java
@@ -0,0 +1,54 @@
+package com.galaxis.rcs.common.entity;
+
+import com.galaxis.rcs.common.enums.BizTaskType;
+import lombok.Data;
+
+/**
+ *
+ * {
+ * type: 'carry', // 任务类型
+ * taskExecutorId: 'cl2', // 指定车辆
+ * lpn: 'pallet1124', // 托盘ID, 用于校验
+ * priority: 1, // 优先级
+ * from: {
+ * item: '27', bay: 0, level: 1, cell: 0 // 起始点位的详细信息
+ * },
+ * to: {
+ * item: '20'
+ * }
+ * }
+ *
+ */
+@Data
+public class AddTaskRequest {
+ /**
+ * 任务类型
+ * 可选值: 'carry', 'putaway', 'pick', 'move'
+ */
+ public BizTaskType type;
+
+ /**
+ * 指定任务的执行器ID
+ */
+ public String taskExecutorId;
+
+ /**
+ * 托盘ID, 用于校验
+ */
+ public String lpn;
+
+ /**
+ * 任务优先级,越大优先级越高
+ */
+ public int priority;
+
+ /**
+ * 起始位置
+ */
+ public StoreLocation from;
+
+ /**
+ * 目标位置
+ */
+ public StoreLocation to;
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/common/entity/AddTaskResult.java b/servo/src/main/java/com/galaxis/rcs/common/entity/AddTaskResult.java
new file mode 100644
index 0000000..43634c4
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/common/entity/AddTaskResult.java
@@ -0,0 +1,19 @@
+package com.galaxis.rcs.common.entity;
+
+import lombok.Data;
+
+/**
+ * 添加任务结果
+ *
+ * {
+ * taskId: 'task123'
+ * }
+ *
+ */
+@Data
+public class AddTaskResult {
+ /**
+ * 业务任务ID
+ */
+ public String bizTaskId;
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskBiz.java b/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskBiz.java
new file mode 100644
index 0000000..80ddd06
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskBiz.java
@@ -0,0 +1,109 @@
+package com.galaxis.rcs.common.entity;
+
+import com.yvan.logisticsMonitor.task.BizTask;
+import lombok.Data;
+
+/**
+ * RcsTaskBiz 类用于定义业务任务的实体
+ */
+
+/**
+ * TODO: 插入 rcs_task_biz 表, 结构为
+ * biz_task_id bigint not null,
+ * force_assign_executor_id varchar(50) not null,
+ * force_assign_executor_type varchar(50) not null,
+ * task_type varchar(10)
+ * lpn varchar(50)
+ * priority integer
+ * task_from varchar(100)
+ * task_to varchar(100)
+ * allocated_executor_id varchar(50) default 'N/A'
+ * biz_task_status varchar(10) default 'pending'
+ * create_at timestamp
+ * create_by varchar(50)
+ * update_at timestamp
+ * update_by varchar(50)
+ *
+ * create table rcs_task_biz (
+ * biz_task_id bigint not null auto_increment,
+ * force_assign_executor_id varchar(50) not null comment '用户强制指派了车号' default 'N/A',
+ * force_assign_executor_type varchar(50) not null comment '用户强制指派了车型' default 'N/A',
+ * task_type varchar(10) not null comment '任务类型' default 'carry',
+ * lpn varchar(50) not null comment '托盘ID',
+ * priority integer not null comment '任务优先级',
+ * task_from varchar(50) not null comment '任务起始点',
+ * task_to varchar(50) not null comment '任务目标点',
+ * allocated_executor_id varchar(50) default 'N/A' comment '系统分配的执行器ID',
+ * biz_task_status varchar(10) default 'pending' comment '任务状态',
+ * create_at datetime not null comment '创建时间',
+ * create_by varchar(50) not null comment '创建人',
+ * update_at datetime not null comment '更新时间',
+ * update_by varchar(50) not null comment '更新人',
+ *
+ * primary key (biz_task_id)
+ * }
+ */
+@Data
+public class RcsTaskBiz implements BizTask {
+ /**
+ * 业务任务ID
+ */
+ public long bizTaskId;
+
+ /**
+ * 强制分配的执行器ID
+ */
+ public String forceAssignExecutorId = "N/A"; // 默认值为 'N/A'
+ /**
+ * 强制分配的执行器类型
+ */
+ public String forceAssignExecutorType = "N/A"; // 默认值为 'N/A'
+ /**
+ * 任务类型
+ */
+ public String taskType;
+ /**
+ * 托盘ID
+ */
+ public String lpn;
+ /**
+ * 任务优先级
+ */
+ public int priority;
+ /**
+ * 任务起始点
+ */
+ public String taskFrom;
+ /**
+ * 任务目标点
+ */
+ public String taskTo;
+ /**
+ * 分配的执行器ID
+ */
+ public String allocatedExecutorId = "N/A"; // 默认值为 'N/A'
+ /**
+ * 业务任务状态
+ */
+ public String bizTaskStatus = "pending"; // 默认状态为 'pending'
+ /**
+ * 创建时间
+ */
+ public String createAt;
+ /**
+ * 创建人
+ */
+ public String createBy;
+ /**
+ * 更新时间
+ */
+ public String updateAt;
+ /**
+ * 更新人
+ */
+ public String updateBy;
+ /**
+ * 业务任务描述
+ */
+ public String description; // 可选字段,用于描述任务的详细信息
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskPlan.java b/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskPlan.java
new file mode 100644
index 0000000..a26f506
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/common/entity/RcsTaskPlan.java
@@ -0,0 +1,24 @@
+package com.galaxis.rcs.common.entity;
+
+/**
+ * 任务规划
+ */
+public class RcsTaskPlan {
+ /**
+ * 表名: rcs_task_plan
+ * 表结构为
+ * plan_task_id bigint not null auto_increment primary key,
+ * biz_task_id bigint not null,
+ * type varchar(50) not null,
+ * executor_id varchar(50) not null,
+ * seq integer not null,
+ * payload varchar(3000) not null,
+ * plan_task_status varchar(10) default 'waiting',
+ * error_message varchar(500) default '',
+ * description varchar(500) default '',
+ * create_at timestamp
+ * create_by varchar(50)
+ * update_at timestamp
+ * update_by varchar(50)
+ */
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/common/entity/StoreLocation.java b/servo/src/main/java/com/galaxis/rcs/common/entity/StoreLocation.java
new file mode 100644
index 0000000..2c5ad2e
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/common/entity/StoreLocation.java
@@ -0,0 +1,29 @@
+package com.galaxis.rcs.common.entity;
+
+/**
+ * 存储存储位信息
+ *
+ * {
+ * item: '27', // 货架ID
+ * bay: 0, // 列
+ * level: 1, // 层
+ * cell: 0 // 格
+ * }
+ *
+ */
+public record StoreLocation(
+ String item, // 货架ID
+ int bay, // 列
+ int level, // 层
+ int cell // 格
+) {
+ @Override
+ public String toString() {
+ return "StoreLocation{" +
+ "item='" + item + '\'' +
+ ", bay=" + bay +
+ ", level=" + level +
+ ", cell=" + cell +
+ '}';
+ }
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/common/enums/BizTaskType.java b/servo/src/main/java/com/galaxis/rcs/common/enums/BizTaskType.java
new file mode 100644
index 0000000..c03f390
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/common/enums/BizTaskType.java
@@ -0,0 +1,5 @@
+package com.galaxis.rcs.common.enums;
+
+public enum BizTaskType {
+ CARRY, // 搬运任务
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/common/enums/EnvStatus.java b/servo/src/main/java/com/galaxis/rcs/common/enums/EnvStatus.java
new file mode 100644
index 0000000..7ae1db4
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/common/enums/EnvStatus.java
@@ -0,0 +1,21 @@
+package com.galaxis.rcs.common.enums;
+
+/**
+ * 环境状态
+ */
+public enum EnvStatus {
+ /**
+ * 环境已启动
+ */
+ RUNNING,
+
+ /**
+ * 环境已停止
+ */
+ STOPPED,
+
+ /**
+ * 环境已删除
+ */
+ DELETED,
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/plan/PlanManager.java b/servo/src/main/java/com/galaxis/rcs/plan/PlanManager.java
deleted file mode 100644
index dace2ea..0000000
--- a/servo/src/main/java/com/galaxis/rcs/plan/PlanManager.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.galaxis.rcs.plan;
-
-public class PlanManager {
-}
diff --git a/servo/src/main/java/com/galaxis/rcs/plan/Planner.java b/servo/src/main/java/com/galaxis/rcs/plan/Planner.java
new file mode 100644
index 0000000..73683d3
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/plan/Planner.java
@@ -0,0 +1,19 @@
+package com.galaxis.rcs.plan;
+
+import com.galaxis.rcs.common.entity.RcsTaskBiz;
+import com.yvan.logisticsModel.LogisticsRuntime;
+
+/**
+ * 任务执行器的计划接口
+ * 用于定义如何执行任务计划
+ */
+public interface Planner {
+ /**
+ * 执行任务计划
+ *
+ * @param runtime 物流运行时环境
+ * @param tasks 任务对象,包含任务的详细信息
+ * @param executorId 执行器ID
+ */
+ void executePlan(LogisticsRuntime runtime, RcsTaskBiz tasks, String executorId);
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/plan/TaskPlannerFactory.java b/servo/src/main/java/com/galaxis/rcs/plan/TaskPlannerFactory.java
new file mode 100644
index 0000000..a83c9c7
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/plan/TaskPlannerFactory.java
@@ -0,0 +1,20 @@
+package com.galaxis.rcs.plan;
+
+import com.galaxis.rcs.plan.planner.PTRTaskPlanner;
+
+import java.util.Map;
+
+/**
+ * 根据任务执行器类型(车型),找到对应车型的任务分配器
+ */
+public class TaskPlannerFactory {
+
+ private static final Map planners = Map.of(
+ "cl2", new PTRTaskPlanner(),
+ "clx", new PTRTaskPlanner()
+ );
+
+ public static Planner getPlanner(String executorType) {
+ return planners.get(executorType);
+ }
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/plan/planner/PTRTaskPlanner.java b/servo/src/main/java/com/galaxis/rcs/plan/planner/PTRTaskPlanner.java
new file mode 100644
index 0000000..96c7826
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/plan/planner/PTRTaskPlanner.java
@@ -0,0 +1,66 @@
+package com.galaxis.rcs.plan.planner;
+
+import com.galaxis.rcs.common.entity.RcsTaskBiz;
+import com.galaxis.rcs.common.entity.RcsTaskPlan;
+import com.galaxis.rcs.plan.Planner;
+import com.yvan.logisticsModel.LogisticsRuntime;
+
+/**
+ * PTR 任务规划器。
+ * 用于处理 CL2 / CLX 等车型的任务规划
+ */
+public class PTRTaskPlanner implements Planner {
+ /**
+ * 执行任务规划
+ *
+ * @param runtime 物流运行时环境
+ * @param task 任务对象,包含任务的详细信息
+ * @param executorId 执行器ID
+ */
+ @Override
+ public void executePlan(LogisticsRuntime runtime, RcsTaskBiz task, String executorId) {
+ /**
+ * 示例数据
+ * {
+ * type: 'carry', // 任务类型
+ * agv: 'cl2', // 指定车辆
+ * lpn: 'pallet1124', // 托盘ID, 用于校验
+ * priority: 1, // 优先级
+ * // 起始点位的详细信息
+ * from: {
+ * item: '27', // 货架编号
+ * bay: 0, // 货架列
+ * level: 1, // 货架层
+ * cell: 0 // 货架格
+ * },
+ * // 目标点位的详细信息
+ * to: {
+ * item: '20' // 地堆货位号
+ * }
+ * }
+ */
+
+ /**
+ * 地图路由示例1
+ * 17<->20, 20<->21, 21<->22, 22<->23, 23<->24, 24<->25, 25<->26, 26<->27, 27<->charger2,
+ *
+ * 地图货位信息
+ * 21 左侧 rack1 / 3
+ * 22 右侧 56
+ * 23 左侧 rack1 / 2
+ * 24 旋转位
+ * 25 左侧 rack1 / 1
+ * 26 右侧 58
+ * 27 左侧 rack1 / 0
+ */
+
+ // 绑定任务执行器
+ task.setAllocatedExecutorId(executorId);
+
+ // TODO: 写入 rcs_task_biz 表, 写入 rcs_task_plan 表, 并安排规划方案的顺序执行, 并将全部规划通知给 MQTT
+ RcsTaskPlan[] planList = new RcsTaskPlan[0];
+
+ runtime.executorItemMap.get(executorId).executeTaskPlanList(runtime, task, planList);
+ }
+
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/task/TaskDispatch.java b/servo/src/main/java/com/galaxis/rcs/task/TaskDispatch.java
deleted file mode 100644
index f7ad848..0000000
--- a/servo/src/main/java/com/galaxis/rcs/task/TaskDispatch.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.galaxis.rcs.task;
-
-public class TaskDispatch {
-}
diff --git a/servo/src/main/java/com/galaxis/rcs/task/TaskDispatchFactory.java b/servo/src/main/java/com/galaxis/rcs/task/TaskDispatchFactory.java
new file mode 100644
index 0000000..261e40d
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/task/TaskDispatchFactory.java
@@ -0,0 +1,36 @@
+package com.galaxis.rcs.task;
+
+import com.galaxis.rcs.common.entity.RcsTaskBiz;
+import com.galaxis.rcs.task.dispatcher.TaiWanDispatcher;
+import com.yvan.logisticsModel.LogisticsRuntime;
+
+public class TaskDispatchFactory {
+ public final LogisticsRuntime logisticsRuntime;
+ private TaiWanDispatcher dispatcher = new TaiWanDispatcher();
+
+ public TaskDispatchFactory(LogisticsRuntime logisticsRuntime) {
+ this.logisticsRuntime = logisticsRuntime;
+ }
+
+ /**
+ * 开启轮询线程,定时检查有没有空执行器,可以用于执行选定任务
+ */
+ public void startPolling() {
+ // TODO: 启动一个线程,定时检查是否有空闲的执行器
+ RcsTaskBiz taskBiz = new RcsTaskBiz();
+ dispatcher.dispatchTask(this, taskBiz);
+ }
+
+ /**
+ * 停止轮询线程
+ */
+ public void stopPolling() {
+ // TODO: 停止轮询线程
+ }
+
+ /**
+ * 向巡视线程发送一个信号,让他启动检查
+ */
+ public void checkAll() {
+ }
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/task/TaskManager.java b/servo/src/main/java/com/galaxis/rcs/task/TaskManager.java
deleted file mode 100644
index 7589f6c..0000000
--- a/servo/src/main/java/com/galaxis/rcs/task/TaskManager.java
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.galaxis.rcs.task;
-
-public class TaskManager {
-}
diff --git a/servo/src/main/java/com/galaxis/rcs/task/TaskService.java b/servo/src/main/java/com/galaxis/rcs/task/TaskService.java
new file mode 100644
index 0000000..04ef39b
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/task/TaskService.java
@@ -0,0 +1,68 @@
+package com.galaxis.rcs.task;
+
+import com.galaxis.rcs.common.entity.AddTaskRequest;
+import com.google.common.base.Strings;
+import com.yvan.logisticsModel.LogisticsRuntime;
+import org.clever.data.jdbc.DaoFactory;
+
+/**
+ * 任务服务
+ * 用于处理业务任务的添加 / 取消 / 修改优先级 / 还入 / 暂停 等操作
+ */
+public class TaskService {
+
+ public final LogisticsRuntime logisticsRuntime;
+
+ public TaskService(LogisticsRuntime logisticsRuntime) {
+ this.logisticsRuntime = logisticsRuntime;
+ }
+
+ /**
+ * 添加业务任务
+ *
+ * @param request 任务请求
+ * @return 业务任务ID
+ */
+ public String addBizTask(AddTaskRequest request) {
+ if (Strings.isNullOrEmpty(request.taskExecutorId)) {
+ throw new RuntimeException("TaskExecutorId cannot be null or empty");
+ }
+
+ Long taskId = DaoFactory.getJdbc().nextId("rcs_task_biz");
+
+ /**
+ * TODO: 插入 rcs_task_biz 表, 结构为
+ * biz_task_id bigint not null,
+ * task_executor_id varchar(50) not null,
+ * task_type varchar(10)
+ * lpn varchar(50)
+ * priority integer
+ * task_from varchar(100)
+ * task_to varchar(100)
+ * biz_task_status varchar(10) default 'pending'
+ * create_at timestamp
+ * create_by varchar(50)
+ * update_at timestamp
+ * update_by varchar(50)
+ *
+ * create table rcs_task_biz (
+ * biz_task_id bigint not null auto_increment,
+ * task_executor_id varchar(50) not null comment '任务执行器ID' default 'N/A',
+ * task_type varchar(10) not null comment '任务类型' default 'carry',
+ * lpn varchar(50) not null comment '托盘ID',
+ * priority integer not null comment '任务优先级',
+ * task_from varchar(50) not null comment '任务起始点',
+ * task_to varchar(50) not null comment '任务目标点',
+ * biz_task_status varchar(10) default 'pending' comment '任务状态',
+ * create_at datetime not null comment '创建时间',
+ * create_by varchar(50) not null comment '创建人',
+ * update_at datetime not null comment '更新时间',
+ * update_by varchar(50) not null comment '更新人',
+ *
+ * primary key (biz_task_id)
+ * }
+ */
+
+ return taskId.toString();
+ }
+}
diff --git a/servo/src/main/java/com/galaxis/rcs/task/dispatcher/TaiWanDispatcher.java b/servo/src/main/java/com/galaxis/rcs/task/dispatcher/TaiWanDispatcher.java
new file mode 100644
index 0000000..eb0535c
--- /dev/null
+++ b/servo/src/main/java/com/galaxis/rcs/task/dispatcher/TaiWanDispatcher.java
@@ -0,0 +1,27 @@
+package com.galaxis.rcs.task.dispatcher;
+
+import com.galaxis.rcs.common.entity.RcsTaskBiz;
+import com.galaxis.rcs.plan.Planner;
+import com.galaxis.rcs.plan.TaskPlannerFactory;
+import com.galaxis.rcs.task.TaskDispatchFactory;
+
+public class TaiWanDispatcher {
+
+ public void dispatchTask(TaskDispatchFactory factory, RcsTaskBiz tasks) {
+ // TODO: 台湾展会的任务分配逻辑
+ }
+
+ /**
+ * TODO: 分配任务给指定的执行器
+ *
+ * @param tasks 任务对象,包含任务的详细信息
+ * @param executorId 执行器ID
+ */
+ public void allocateExecutorBizTask(TaskDispatchFactory factory, RcsTaskBiz tasks, String executorId) {
+ // 选定了一个执行器,分配任务给它
+ String executorType = executorId.substring(0, 3); // 假设执行器ID的前3位是车型标识
+
+ Planner planner = TaskPlannerFactory.getPlanner(executorType);
+ planner.executePlan(factory.logisticsRuntime, tasks, executorId);
+ }
+}
diff --git a/servo/src/main/java/com/yvan/logisticsEnv/EnvStartParam.java b/servo/src/main/java/com/yvan/logisticsEnv/EnvStartParam.java
new file mode 100644
index 0000000..52ea822
--- /dev/null
+++ b/servo/src/main/java/com/yvan/logisticsEnv/EnvStartParam.java
@@ -0,0 +1,23 @@
+package com.yvan.logisticsEnv;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 环境启动参数
+ */
+@Getter
+@Setter
+public class EnvStartParam {
+
+ /**
+ * 是否虚拟仿真环境
+ */
+ private boolean isVirtual;
+
+ /**
+ * 时间倍速(仿真环境专用)
+ */
+ private Integer timespeed;
+
+}
diff --git a/servo/src/main/java/com/yvan/logisticsEnv/LogisticsEnv.java b/servo/src/main/java/com/yvan/logisticsEnv/LogisticsEnv.java
new file mode 100644
index 0000000..9771c23
--- /dev/null
+++ b/servo/src/main/java/com/yvan/logisticsEnv/LogisticsEnv.java
@@ -0,0 +1,42 @@
+package com.yvan.logisticsEnv;
+
+import com.galaxis.rcs.common.enums.EnvStatus;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 物流仓储环境上下文
+ */
+@Getter
+@Setter
+public class LogisticsEnv {
+
+ private EnvStartParam startParam;
+
+ // 环境ID
+ private String envId;
+
+ // 环境状态
+ private EnvStatus state;
+
+ /**
+ * 获取AGV车列表
+ */
+ void getTasks() {
+
+ }
+
+ /**
+ * 载入地图
+ */
+ void loadMap() {
+
+ }
+
+ /**
+ * 获取库存分布状态
+ */
+ void loadInv() {
+
+ }
+}
diff --git a/servo/src/main/java/com/yvan/logisticsEnv/LogisticsEnvManager.java b/servo/src/main/java/com/yvan/logisticsEnv/LogisticsEnvManager.java
index 35a12a2..5e6e480 100644
--- a/servo/src/main/java/com/yvan/logisticsEnv/LogisticsEnvManager.java
+++ b/servo/src/main/java/com/yvan/logisticsEnv/LogisticsEnvManager.java
@@ -1,4 +1,30 @@
package com.yvan.logisticsEnv;
+import java.util.HashMap;
+import java.util.Map;
+
public class LogisticsEnvManager {
+
+ Map envs = new HashMap<>();
+
+ /**
+ * 启动参数
+ */
+ public void startEnv(EnvStartParam param) {
+
+ }
+
+ /**
+ * 复制环境, 返回新环境ID
+ */
+ public String cloneEnv(String envId) {
+ throw new RuntimeException();
+ }
+
+ /**
+ * 重置环境
+ */
+ public String resetEnv(String envId) {
+ throw new RuntimeException();
+ }
}
diff --git a/servo/src/main/java/com/yvan/logisticsModel/BaseItem.java b/servo/src/main/java/com/yvan/logisticsModel/BaseItem.java
new file mode 100644
index 0000000..cc59d8b
--- /dev/null
+++ b/servo/src/main/java/com/yvan/logisticsModel/BaseItem.java
@@ -0,0 +1,25 @@
+package com.yvan.logisticsModel;
+
+import lombok.Data;
+import lombok.Getter;
+
+import java.util.Map;
+
+/**
+ * 物流单元基类
+ */
+@Data
+public class BaseItem {
+ String id;
+ String t;
+
+ /**
+ * 变换矩阵, 3x3矩阵, 采用Y轴向上为正, X轴向右, Z轴向前的右手坐标系
+ */
+ float[][] tf;
+
+ /**
+ * 物品的自定义数据
+ */
+ Map dt;
+}
diff --git a/servo/src/main/java/com/yvan/logisticsModel/ExecutorItem.java b/servo/src/main/java/com/yvan/logisticsModel/ExecutorItem.java
new file mode 100644
index 0000000..ec36e40
--- /dev/null
+++ b/servo/src/main/java/com/yvan/logisticsModel/ExecutorItem.java
@@ -0,0 +1,27 @@
+package com.yvan.logisticsModel;
+
+import com.galaxis.rcs.common.entity.RcsTaskBiz;
+import com.galaxis.rcs.common.entity.RcsTaskPlan;
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+/**
+ * 物流任务执行单元(如拣货台、小车、AGV、堆垛机、人等)
+ */
+public class ExecutorItem extends BaseItem {
+
+ private final List currentPlanList = Lists.newArrayList();
+
+ /**
+ * 执行规划任务
+ */
+ public void executeTaskPlanList(LogisticsRuntime runtime, RcsTaskBiz task, RcsTaskPlan[] planList) {
+ if (this.currentPlanList.size() > 0) {
+ throw new RuntimeException("has plans, please wait for the current plans to finish");
+ }
+
+ // TODO: 开启轮询线程,等待下一个待执行任务
+ // 找到对应类型的 connector,进行报文的发送
+ }
+}
diff --git a/servo/src/main/java/com/yvan/logisticsModel/Floor.java b/servo/src/main/java/com/yvan/logisticsModel/Floor.java
new file mode 100644
index 0000000..c112aa9
--- /dev/null
+++ b/servo/src/main/java/com/yvan/logisticsModel/Floor.java
@@ -0,0 +1,17 @@
+package com.yvan.logisticsModel;
+
+import com.google.common.collect.Maps;
+
+import java.util.Map;
+
+/**
+ * 物流模型楼层
+ */
+public class Floor {
+
+ /**
+ * 物流固定单元(非箱子容器/非执行器的单元),比如输送线、货架、地标、路线等
+ */
+ public final Map itemMap = Maps.newConcurrentMap();
+
+}
diff --git a/servo/src/main/java/com/yvan/logisticsModel/FlowItem.java b/servo/src/main/java/com/yvan/logisticsModel/FlowItem.java
new file mode 100644
index 0000000..bc82ccc
--- /dev/null
+++ b/servo/src/main/java/com/yvan/logisticsModel/FlowItem.java
@@ -0,0 +1,7 @@
+package com.yvan.logisticsModel;
+
+/**
+ * 物流流动单元(周转箱、托盘等)
+ */
+public class FlowItem extends BaseItem {
+}
diff --git a/servo/src/main/java/com/yvan/logisticsModel/LogisticsModel.java b/servo/src/main/java/com/yvan/logisticsModel/LogisticsModel.java
new file mode 100644
index 0000000..043a94f
--- /dev/null
+++ b/servo/src/main/java/com/yvan/logisticsModel/LogisticsModel.java
@@ -0,0 +1,13 @@
+package com.yvan.logisticsModel;
+
+/**
+ * 物流模型类
+ */
+public class LogisticsModel {
+
+ /**
+ * 楼层目录
+ */
+ LogisticsRuntime catalog;
+
+}
diff --git a/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java b/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java
new file mode 100644
index 0000000..d2f81b1
--- /dev/null
+++ b/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntime.java
@@ -0,0 +1,48 @@
+package com.yvan.logisticsModel;
+
+import com.galaxis.rcs.task.TaskDispatchFactory;
+import com.galaxis.rcs.task.TaskService;
+import com.google.common.collect.Maps;
+import com.yvan.logisticsEnv.LogisticsEnv;
+
+import java.util.Map;
+
+/**
+ * 物流
+ */
+public class LogisticsRuntime {
+
+ /**
+ * 物流执行环境
+ */
+ public final LogisticsEnv logisticsEnv;
+
+ /**
+ * 任务服务
+ */
+ public TaskService taskService = new TaskService(this);
+
+ /**
+ * 任务分配服务
+ */
+ public TaskDispatchFactory taskDispatchFactory = new TaskDispatchFactory(this);
+
+ /**
+ * 物流流动单元(周转箱、托盘、纸箱等)
+ */
+ public final Map flowItemMap = Maps.newConcurrentMap();
+
+ /**
+ * 物流任务执行单元(如拣货台、小车、AGV、堆垛机、人等)
+ */
+ public final Map executorItemMap = Maps.newConcurrentMap();
+
+ /**
+ * 楼层目录 catalogCode -> Floor
+ */
+ public final Map floorMap = Maps.newHashMap();
+
+ public LogisticsRuntime(LogisticsEnv logisticsEnv) {
+ this.logisticsEnv = logisticsEnv;
+ }
+}
diff --git a/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntimeService.java b/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntimeService.java
new file mode 100644
index 0000000..4affcad
--- /dev/null
+++ b/servo/src/main/java/com/yvan/logisticsModel/LogisticsRuntimeService.java
@@ -0,0 +1,24 @@
+package com.yvan.logisticsModel;
+
+import com.google.common.collect.Maps;
+
+import java.util.Map;
+
+/**
+ * 物流运行时服务类
+ */
+public class LogisticsRuntimeService {
+
+ private final Map runtimeMap = Maps.newConcurrentMap();
+
+ /**
+ * 根据 EnvCode 查找物流运行时实例
+ */
+ public LogisticsRuntime findByEnvCode(String envCode) {
+ LogisticsRuntime runtime = runtimeMap.get(envCode);
+ if (runtime != null) {
+ return runtime;
+ }
+ throw new RuntimeException("LogisticsRuntime not found for envCode: " + envCode);
+ }
+}
diff --git a/servo/src/main/java/com/yvan/logisticsModel/StaticItem.java b/servo/src/main/java/com/yvan/logisticsModel/StaticItem.java
new file mode 100644
index 0000000..90b4445
--- /dev/null
+++ b/servo/src/main/java/com/yvan/logisticsModel/StaticItem.java
@@ -0,0 +1,10 @@
+package com.yvan.logisticsModel;
+
+import java.util.Map;
+
+/**
+ * 物流固定单元(非箱子容器/非执行器的单元),比如输送线、货架、地标、路线等
+ */
+public class StaticItem extends BaseItem {
+
+}
diff --git a/servo/src/main/java/com/yvan/logisticsMonitor/task/BizTask.java b/servo/src/main/java/com/yvan/logisticsMonitor/task/BizTask.java
index 4b48df5..2cc0c57 100644
--- a/servo/src/main/java/com/yvan/logisticsMonitor/task/BizTask.java
+++ b/servo/src/main/java/com/yvan/logisticsMonitor/task/BizTask.java
@@ -1,4 +1,39 @@
package com.yvan.logisticsMonitor.task;
-public class BizTask {
+/**
+ * bizTaskId
+ * taskType
+ * lpn
+ * priority
+ * taskFrom
+ * taskTo
+ * bizTaskStatus
+ * createAt
+ * createBy
+ * description
+ */
+public interface BizTask {
+// String getBizTaskId();
+//
+// String getTaskType();
+//
+// String getLpn();
+//
+// int getPriority();
+//
+// String getTaskFrom();
+//
+// String getTaskTo();
+//
+// String getBizTaskStatus();
+//
+// String getCreateAt();
+//
+// String getCreateBy();
+//
+// String getUpdateAt();
+//
+// String getUpdateBy();
+//
+// String getDescription();
}