diff --git a/AGENTS.md b/AGENTS.md index 1b7e0e93..38d9eb30 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -33,13 +33,13 @@ ## 一期/二期/三期 Admin 快速索引 -按阶段处理需求时,先核对仓库根目录对应阶段文档,再进入下列模块;阶段范围高于原型中的全量菜单。模块代码均从 `src/` 起算。 +按阶段处理需求时,先核对仓库根目录对应阶段文档,再按“模块目录 → `routes.ts`/页面 → `api`/类型”定位;阶段范围高于原型中的全量菜单。模块代码均从 `src/` 起算。本表只描述 Admin 页面、路由和前端契约,不替代后端模块指引。 | 阶段 | Admin 范围与入口 | 当前边界 | |---|---|---| | 一期:头程订单闭环 | `modules/auth/` 登录;`customers/` 客户与企业审核;`iam/` 内部用户、角色、权限;`warehouses/` 平台收货仓;`master-data/` 快递公司、往来单位;`first-leg-orders/` 头程订单;`dashboard/` 工作台 | 功能基本完成,处于测试环境部署、样本补齐和验收收口;企业审核已合并客户列表,平台 RBAC 仅维护平台员工与平台权限资源 | -| 二期:到仓与头程计费 | `modules/inbounds/` 入库预报、收货、测量/OCR、审核、差异与费用快照;`warehouse-resources/pallets/` 托盘;`warehouse-resources/locations/` 库位;`fba-pricing/`、`dimension-config/` 计费规则与尺寸配置;`unified-orders/` 订单工作流编排 | 技术闭环完成,验收终点为 `WAIT_SPLIT + APPROVED + CONFIRMED`(等待三期分柜);海外仓阶梯费用仅后端契约已具备,前端联调仍需单独确认;不得把内部备注、文件或租户上下文泄露给 Client | -| 三期:国内出仓 | 当前无正式三期模块;规划复用 `first-leg-orders/`、`unified-orders/`、`inbounds/` 的订单与入库工作流页面,新增出仓能力时按稳定契约拆分模块 | 当前 NO-GO。先解除 `../../docs/三期/三期需求确认表.md` 的 P3-Q1/Q2/Q5/Q9/Q11/Q12/Q13 等阻断项;不得把原型中的分柜、装柜、报关、港务或完整 WMS 菜单提前展示 | +| 二期:到仓与头程计费 | `modules/inbounds/` 入库预报、收货、测量/OCR、审核、差异与费用快照;`warehouse-resources/pallets/` 托盘;`warehouse-resources/locations/` 库位;`fba-pricing/`、`dimension-config/` 计费规则与尺寸配置;`unified-orders/` 订单工作流编排 | 页面范围停在 `WAIT_SPLIT + APPROVED + CONFIRMED`;海外仓阶梯费用页面是否开放需单独确认;客户侧可见字段按授权结果映射,内部备注、文件和原始证据不得进入 Client 契约 | +| 三期:国内出仓 | 当前无正式三期模块;如需求确认后复用 `first-leg-orders/`、`unified-orders/`、`inbounds/`,新增出仓能力按稳定契约拆分模块 | 当前 NO-GO。P3 阻断项未解除前不新增菜单、路由或 `release: active` 页面;不得把原型中的分柜、装柜、报关、港务或完整 WMS 菜单提前展示 | 阶段文档入口(路径相对本文件所在目录):一期读 `../../docs/一期/一期开发进度表.md` 与 `../../docs/一期/一期头程订单闭环设计.md`;二期读 `../../docs/二期/README.md`、`../../docs/二期/二期需求优化版-v2-测量计费入库主流程.md` 及联调报告;三期读 `../../docs/三期/README.md`、`../../docs/三期/三期开发规划.md`、`../../docs/三期/三期需求确认表.md` 和页面清单。阶段状态与代码现状冲突时,以需求确认和验收证据为准,并在改动说明中记录。 diff --git a/shared/AGENTS.md b/shared/AGENTS.md index 08e71d0d..bbf68c1d 100644 --- a/shared/AGENTS.md +++ b/shared/AGENTS.md @@ -15,9 +15,11 @@ ## 一期/二期/三期共享模型索引 -- 一期消费者主要是 `customers`、`iam`、`warehouses`、`master-data`、`first-leg-orders`;`CurrentUser`、`NavigationItem`、`ApiResponse`、平台收货仓快照及头程订单状态常量由 `src/index.ts` 统一导出。共享导出只描述前端数据形状,不替代 Java 服务端权限或状态机。 -- 二期消费者主要是 `inbounds`、`warehouse-resources`、`fba-pricing`、`dimension-config` 与 `unified-orders`。测量、费用、托盘、库位等类型若只被单一模块使用,应留在模块内;确需跨模块复用时,先核对 `baiyue-firstleg` Controller/DTO/OpenAPI,再以兼容方式新增导出。 -- 三期当前 NO-GO,暂无正式三期共享契约。不要为了复用原型中的分柜、装柜、报关或 PDA 字段提前扩展本包;待 `../../../docs/三期/三期需求确认表.md` 阻断项解除并锁定后端契约,再评估新增类型并同步全部 Admin 消费者。 +- 一期共享消费者:`customers`、`iam`、`warehouses`、`master-data`、`first-leg-orders`;稳定导出集中在 `src/index.ts`(用户、导航、响应、仓库摘要、订单状态)。 +- 二期共享消费者:`inbounds`、`warehouse-resources`、`fba-pricing`、`dimension-config`、`unified-orders`;单模块使用的测量、费用、托盘、库位类型留在模块内,只有真实跨模块复用才新增导出。 +- 三期当前 NO-GO,无正式共享契约;不得预留分柜、装柜、报关或 PDA 字段,待需求确认和服务端契约冻结后再新增。 + +定位规则:先在 `src/index.ts` 确认公共导出,再搜索 `src/` 消费者;后端字段或状态有疑问时回到对应 Controller/DTO/OpenAPI,不在 shared 中猜测业务规则。 阶段依据(路径相对本文件所在目录):一期 `../../../docs/一期/`,二期 `../../../docs/二期/`,三期 `../../../docs/三期/`;共享包不保存阶段进度,也不承载跨应用(Client)源码复用。 diff --git a/src/modules/unified-orders/api/unifiedOrders.test.ts b/src/modules/unified-orders/api/unifiedOrders.test.ts index c63da301..775219de 100644 --- a/src/modules/unified-orders/api/unifiedOrders.test.ts +++ b/src/modules/unified-orders/api/unifiedOrders.test.ts @@ -50,6 +50,23 @@ describe('unified orders API contract', () => { }) }) + it('forwards every main-status tab with search and pagination unchanged', async () => { + const statuses = [ + 'PENDING_REVIEW', 'WAIT_MEASURE', 'INBOUNDED', 'WAIT_SPLIT', + 'LOADING', 'LOADED', 'DELIVERED', + ] as const + vi.mocked(http.get).mockResolvedValue({ data: { records: [], page: 3, size: 20, total: 0, pages: 0 } }) + + for (const mainStatus of statuses) { + await listPlatformUnifiedOrders({ keyword: 'CC-2026', orderNo: 'FL-77', mainStatus, page: 3, size: 20 }) + } + + expect(vi.mocked(http.get).mock.calls).toEqual(statuses.map((mainStatus) => [ + '/platform/v1/orders', + { params: { keyword: 'CC-2026', orderNo: 'FL-77', mainStatus, page: 3, size: 20 } }, + ])) + }) + it('normalizes C02 row IDs and keeps inboundId for measurement routing', async () => { vi.mocked(http.get).mockResolvedValue({ data: { records: [{ orderId: '90001', tenantId: '208', inboundId: '77', inboundVersion: 3, mainStatus: 'WAIT_MEASURE', customerRemark: '客户备注', latestInternalNote: '最新内部备注', measurement: null, preload: null, loading: null, delivery: null, transport: null }],