# 通用命令队列模块 **脚本入口:** `eve.Orders()` Orders 提供不绑定具体实体类型的确定性优先级队列。一个队列同时最多有一个 active 命令,其余命令按优先级降序、同优先级按插入顺序调度;完成、失败、取消、抢占和超时 都会留下可查询事件。完整组合示例见 `examples/commandery-rts`。 ## 创建和执行队列 ```squirrel local result = eve.Orders().newQueueOwned(); if (!result.ok) throw result.status.summary; local queue = result.value; local idResult = queue.append("move", 10, 5.0); if (!idResult.ok) throw idResult.status.summary; local order = queue.current(); order.getPayload().setNumber("x", 12.0); order.getPayload().setNumber("y", 8.0); queue.update(dt); if (arrived) queue.complete(idResult.value); ``` `append` 添加普通命令;`replace` 取消所有未结束命令并立即开始新命令;`interrupt` 只在优先级允许时抢占 active 命令。所有 Result 都必须检查,负数/非有限 `dt`、空 kind 和非法状态迁移不会静默成功。 ## API 快查 | 对象 | API | 说明 | |---|---|---| | `Orders` | `getName()` / `newQueueOwned()` | 查询模块名或创建模块拥有的队列 Result。 | | 拥有型队列 | `ownership()` / `handle()` / `isStale()` / `release()` | 查询所有权、句柄和失效状态,或提前释放。 | | 队列 | `append()` / `replace()` / `interrupt()` | 创建命令并返回稳定 ID。 | | 队列 | `complete()` / `fail()` / `cancel()` | 终结命令;失败/取消可附带 reason。 | | 队列 | `update(dt)` / `clear()` | 推进超时或完全重置队列和计数器。 | | 队列 | `current()` / `find(id)` | 借用当前命令或按稳定 ID 查询历史命令。 | | 队列 | `queuedCount()` / `orderCount()` / `orderAt(i)` | 查询排队数量或按创建顺序枚举所有命令。 | | 队列 | `eventCount()` / `eventAt(i)` / `clearEvents()` | 消费确定性生命周期事件。 | | 队列 | `snapshot()` / `restore(json)` | 返回 Result 快照或事务性恢复;失败保持原状态。 | | `Order` | `getId()` / `getKind()` / `getState()` | 命令身份、类型及 queued/active/completed/failed/cancelled 状态。 | | `Order` | `getPriority()` / `getTimeout()` / `getElapsed()` | 调度和超时信息。 | | `Order` | `getPayload()` | 返回命令拥有的即时借用 Payload。 | | Payload | `setString()` / `setNumber()` / `setBool()` / `setNull()` | 写入 JSON 兼容值。 | | Payload | `setJson()` / `getJson()` / `toJson()` | 解析字段 JSON、读取字段或确定性序列化。 | | Payload | `has()` / `erase()` / `clear()` | 测试、删除或清空字段。 | | Event | `getSequence()` / `getOrderId()` / `getKind()` | 事件顺序与关联命令。 | | Event | `getFrom()` / `getTo()` / `getReason()` | 状态迁移和原因。 | ## 生命周期与确定性 - 队列是模块拥有的 generation-qualified 对象;模块重载或 `release()` 后 stale。 - `Order`、Payload 和 Event 都是即时借用观察,任何队列修改后应重新查询。 - `update(dt)` 只使用注入的模拟时间;确定性回放需保持相同输入顺序和 `dt`。 - 快照包含 schema/version、队列成员、历史、事件和计数器;只恢复 `snapshot()` 产物。