aps-agent/docs/product/journeys.md

195 lines
7.7 KiB
Markdown
Raw Normal View History

2026-07-21 11:05:57 +08:00
# 核心业务旅程(已落地)
> 只描述**当前代码真实路径**。规划能力见 `features.md` 🔜 项与 `plan.md`。
---
## 旅程 A:试排一版并看图
```mermaid
sequenceDiagram
participant U as 用户
participant Web as apps/web
participant GW as gateway
participant Intent as intent
participant WF as workflow
participant Eng as RuleEngine
participant Store as WorldStore
U->>Web: 「试排一版交期优先」
Web->>GW: POST /api/chat (SSE)
GW->>Intent: 解析 → schedule.run + strategy
Intent->>WF: 编排
WF->>Eng: solve(world, params) P1
Eng->>Store: 写入 DRAFT 版本/PO/WO/冲突
WF-->>Web: 文本 + 可选 UI 块
Web->>GW: GET /api/world/gantt|load|due
GW-->>Web: 右侧刷新
```
**业务语义(正确口径)**
1. 只处理未取消/未完成的销售订单及其未完成明细。
2. 按策略模板排序后,为每个订单项选产线、按工艺路线拆工单、在班次窗内顺排占槽。
3. 产出 **DRAFT** 排产版本;**不**自动发布。
4. 冲突写入世界状态,甘特/交期视图可高亮;**不会**自动改主数据或采购计划。
**口令示例**:试排一版交期优先 / 按产能均衡排一下
---
## 旅程 A2:维护订单后再试排
```mermaid
sequenceDiagram
participant U as 用户
participant Web as 订单面板
participant GW as gateway
participant Harness as harness
participant WF as workflow
participant Store as WorldStore
U->>Web: 新增/编辑/取消/完成订单
Web->>GW: POST /api/orders/stage
GW->>Harness: stage_confirmation(order.*)
Harness-->>Web: confirm-card
U->>Web: 批准
Web->>GW: POST /api/actions/confirm
GW->>WF: execute_confirmed(order.*)
WF->>Store: 写订单池 + 审计 + 自动 Checkpoint
U->>Web: 再试排
```
**业务语义(正确口径)**
1. `GET /api/orders` 是 P0 只读投影;页面展示订单、成品下拉、状态枚举。
2. `order.upsert` / `order.cancel` / `order.complete` 都是 P2,页面只生成确认卡,真正执行仍走 `/api/actions/confirm`。
3. `CANCELLED` / `COMPLETED` 订单不会进入后续新排产版本;历史已生成版本不被回写。
4. 当前首切片每张销售订单只维护一个明细行;批量明细、订单审核和附件在 OR-03 后续落地。
**验收口径**:取消一张订单并批准后再试排,版本 `orderCount` 从 7 变为 6,且没有对应生产订单。
---
## 旅程 A3:维护主数据后再试排(MD-01/02/03)
1. 侧栏「主数据」→ 三页签:**资源**(工厂→车间→产线→工位→设备树)/ **物料与BOM** / **日历与维保**
2. `GET /api/master` 是 P0 只读投影;编辑动作只生成确认卡(`POST /api/master/stage`),执行仍走 `/api/actions/confirm`
3. 三个 P2 写动作与影响面:
| 动作 | 改什么 | 对新排产的影响 |
| --- | --- | --- |
| `master.line.upsert` | 产线名称/日产能/效率/停启用 | 停用(INACTIVE)产线被引擎 ACTIVE 过滤排除,订单走替代产线 |
| `master.material.upsert` | 物料库存/在途/安全库存/前置期 | 齐套检查输入变化,缺料冲突随之增减 |
| `master.maintenance.upsert` | 维保窗口新增/取消 | 新窗口产生 `EQUIPMENT` 冲突或避让;取消后窗口失效 |
4. 所有写入执行前自动 Checkpoint、写审计链;**只影响后续新版本,历史版本不回写**。
**验收口径**:停用一条产线并批准后再试排,新版本没有任何工单落在该产线(`test_master_data.py`)。
**纠偏**:工位/设备编辑、周日历模板、Excel 导入(MD-04)为后续切片;BOM 明细用量与工艺步骤(工时/外协)已可编辑(选中成品物料后进入)。
---
## 旅程 A4:订单分解(MRP,对标西门子订单驱动分解)
```mermaid
flowchart LR
SO["销售订单"] --> DEC["order.decompose P1<br/>按 BOM/工艺展开"]
DEC --> MAKE["自制:成品<br/>→ 试排生成 PO/WO"]
DEC --> BUY["采购建议 DRAFT<br/>净需求+前置期倒排"]
DEC --> OUT["委外建议 DRAFT<br/>外协工艺步骤"]
MAKE --> SCHED["schedule.run 排产"]
BUY -.-> REL["确认下达(后续 P2/P3)"]
OUT -.-> REL
```
1. 入口:订单面板「分解建议」「分解此单」,或对话「分解订单 SOxxx」「生成采购建议」「MRP」
2. 分解逻辑(全部来自主数据,改主数据即改分解结果):
| 分支 | 依据 | 产出 |
| --- | --- | --- |
| 自制 | 订单明细成品 | 由排产引擎(试排)生成生产订单与工单 |
| 采购 | BOM 净需求 = 毛需求 − 库存 − 在途 > 0 | `purchaseOrders` DRAFT:数量、建议下单日(交期−前置期−1 天) |
| 委外 | 工艺步骤 `isExternal` 标记 | `outsourceOrders` DRAFT:产品、工序、数量、需求日 |
3. `order.decompose` 是 **P1**:只写建议表草稿,不改订单与主数据;重复分解幂等替换
4. 建议单确认下达(转正式采购/委外,联动 ERP)为后续 P2/P3 能力
**验收口径**:把某原料库存调零 → 分解 → 采购建议出现且下单日按前置期倒排;在工艺步骤勾「外协」→ 重分解 → 委外建议出现(`test_mrp.py`)。
---
## 旅程 B:多策略对比后采用
1. 「对比几种策略」→ `scenario.compare`(P1)
2. 深拷贝沙盒内并行多策略试排 → 返回 `scenario-cards`(KPI/差异)
3. **主干世界此时不变**
4. 用户点「采用此方案」→ 正式 `schedule.run`(或 apply 通道)把选中策略落到主干草稿
5. 右侧视图刷新
**纠偏**:对比 ≠ 发布;采用 ≠ 下发 MES。
---
## 旅程 C:发布版本(写主干)
1. 「发布这个版本」→ `schedule.publish`(P2)
2. 后端只 **暂存确认卡**,不执行
3. 用户点批准 → `/api/actions/confirm` + 一次性令牌
4. 执行前自动建 Checkpoint → 版本变 PUBLISHED、相关订单状态推进 → 审计链记账
**纠偏**:任何绕过确认卡的「直接 publish API」都不应存在(唯一执行通道)。
---
## 旅程 D:存档与回滚
| 步骤 | 动作 | 权力 |
| --- | --- | --- |
| 存档 | 「存个档」→ `checkpoint.create` | P1 |
| 回滚 | 点时间线或「回滚」→ `checkpoint.rollback` | P2 确认卡 |
| 安全网 | 回滚执行前再自动建档 | — |
检查点是**对话上下文 + 世界状态**成对快照(见 `state/checkpoints.py`)。
---
## 旅程 E:知识问答与报告
| 用户说 | 意图 | 要点 |
| --- | --- | --- |
| 换线有什么规定 | `knowledge.query` P0 | 命中必须带出处;未命中诚实说没有 |
| @知识:某标题 | 同上,直达资产 | — |
| 生成日报 / 版本对比 | `report.generate` P1 | 数字来自冻结快照模板,LLM 不得改数 |
---
## 旅程 F:重置演示数据
「清空数据重新初始化」→ `data.reset`(P2)→ 确认后重播种子。
种子是**电子装配演示工厂**,不是客户生产库。
---
## 前端项目树 vs 后端世界(易混点)
| 概念 | 存在哪里 | 含义 |
| --- | --- | --- |
| 项目 / 任务 / 聊天记录 | 浏览器 localStorage | 工作区组织,**尚未**与多租户后端世界 1:1 |
| 排产世界(订单/工单/版本) | 后端 `WorldStore` | 当前进程一份演示世界 |
| 排产版本文件登记 | 前端项目「文件」区 | UI 登记,便于找回 |
**纠偏**:删前端「项目」≠ 清空后端排产世界;后端 reset 才清世界。
---
## 失败与降级(产品应知)
| 情况 | 行为 |
| --- | --- |
| LLM 超时/非法 JSON | 降级正则意图 |
| 未登记动作 | 按 P3 拒绝 |
| 知识未命中 | 明确告知,不编造 SOP |
| 治理测跑阻塞 | 测试在线程池跑,不拖死世界视图 API |