From 40492cdae80147d66750307c748c94b54ff21552 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Fri, 4 Sep 2026 16:44:08 +0800 Subject: [PATCH] docs: organize contracts by business domain --- AI工程执行与协作约束.md | 10 +- README.md | 55 ++++++----- ...-07-28-admin-static-rbac-preview-design.md | 2 +- 一期/虫虫出海一期开发进度表.xlsx | Bin 29095 -> 0 bytes 三期/README.md | 51 ---------- 三期/虫虫出海三期开发进度表.xlsx | Bin 30592 -> 0 bytes 二期/README.md | 86 ----------------- 二期/二期计费财务需求确认表.xlsx | Bin 10355 -> 0 bytes 二期/二期需求确认清单.xlsx | Bin 12802 -> 0 bytes .../2026-07-28-二期需求确认-产品回传.xlsx | Bin 30733 -> 0 bytes .../2026-07-31-二期需求确认-产品回传-v1.xlsx | Bin 19439 -> 0 bytes .../2026-07-28-覆盖前-二期开发进度表.xlsx | Bin 23857 -> 0 bytes 二期/虫虫出海二期开发进度表.xlsx | Bin 23409 -> 0 bytes 入库测量与计费/README.md | 86 +++++++++++++++++ .../产品回传/2026-07-28-产品确认审核记录.md | 14 +-- ...07-28-入库测量与计费需求确认-产品回传.xlsx | Bin 0 -> 24866 bytes .../产品回传/2026-07-31-产品确认合并记录.md | 24 ++--- ...31-入库测量与计费需求确认-产品回传-v1.xlsx | Bin 0 -> 14965 bytes {二期 => 入库测量与计费}/产品回传/README.md | 12 +-- .../入库测量与计费V2需求确认清单.md | 44 ++++----- .../入库测量与计费产品待确认事项.md | 22 ++--- .../入库测量与计费前端联调报告-2026-08-04.md | 16 ++-- ...量与计费前端页面清单与多对话并行任务表.md | 14 +-- .../入库测量与计费开发规划.md | 36 ++++---- .../入库测量与计费开发进度表.md | 32 +++---- .../入库测量与计费计费财务模块规划.md | 24 ++--- .../入库测量与计费计费财务需求确认表.md | 36 ++++---- .../入库测量与计费计费财务需求确认表.xlsx | Bin 0 -> 10393 bytes .../入库测量与计费费用项目数据归属决策记录.md | 6 +- ...与计费需求优化版-v2-测量计费入库主流程.md | 46 ++++----- .../入库测量与计费需求优化版-原型对照.md | 38 ++++---- .../入库测量与计费需求确认清单.md | 72 +++++++-------- .../入库测量与计费需求确认清单.xlsx | Bin 0 -> 12844 bytes .../参考资料/头程物流流程图.svg | 0 .../海外仓阶梯费用前端联调说明-2026-08-05.md | 0 ...07-28-覆盖前-入库测量与计费开发进度表.xlsx | Bin 0 -> 23927 bytes .../第三方入仓测量接口联调说明-2026-08-04.md | 4 +- .../虫虫出海入库测量与计费开发进度表.xlsx | Bin 0 -> 23468 bytes 国内货柜履约/README.md | 51 ++++++++++ {三期 => 国内货柜履约}/参考资料/出仓流程.png | Bin .../国内货柜履约Wave1开发任务卡-2026-08-09.md | 10 +- .../国内货柜履约开发规划.md | 84 ++++++++--------- .../国内货柜履约开发进度表.md | 74 +++++++-------- .../国内货柜履约开工门禁.md | 12 +-- ...内货柜履约装柜闭环产品确认表-2026-08-08.md | 6 +- ...货柜履约装柜闭环开发前确认单-2026-08-08.md | 16 ++-- .../国内货柜履约闭环审计报告-2026-08-08.md | 74 +++++++-------- .../国内货柜履约需求确认表.md | 30 +++--- .../国内货柜履约页面与原型清单.md | 24 ++--- .../国内货柜履约验收任务拆分与待确认清单.md | 4 +- .../虫虫出海国内货柜履约开发进度表.xlsx | Bin 0 -> 30688 bytes .../货柜履约原型字段验收矩阵-2026-08-17.md | 0 .../货柜管理全链验收矩阵-2026-08-13.md | 8 +- 开发环境独立任务协作登记.md | 54 +++++++++-- {四期 => 海外仓业务}/README.md | 46 ++++----- .../海外仓PDA接柜入库全流程图-20260828.png | Bin .../海外仓业务后端缺口清单.md | 44 ++++----- {四期 => 海外仓业务}/船节点标准化契约.md | 6 +- .../虫虫出海全流程人工验收手册.md | 87 +++++++++++------- 统一订单主状态与操作契约.md | 6 +- {一期 => 订单与客户}/README.md | 22 ++--- 订单与客户/虫虫出海订单与客户开发进度表.xlsx | Bin 0 -> 29110 bytes .../订单与客户头程订单闭环设计.md | 84 ++++++++--------- .../订单与客户开发进度表.md | 82 ++++++++--------- 财务管理/F1人工财务契约审查与门禁.md | 6 +- 财务管理/F1人工账单收款成本接口契约.md | 2 +- 财务管理/Firstleg-Finance跨服务契约.md | 4 +- 财务管理/README.md | 62 ++++++------- ...1.yaml => finance-core-five-pages-v1.yaml} | 10 +- 财务管理/财务历史迁移与上线验收方案.md | 4 +- 财务管理/财务开工门禁与F0-F1任务清单.md | 10 +- 财务管理/财务服务边界设计.md | 2 +- ...证据矩阵.md => 财务核心P0实现证据矩阵.md} | 8 +- ...例.md => 财务核心P0操作契约与验收用例.md} | 16 ++-- ....md => 财务核心五页产品与接口验收契约.md} | 28 +++--- .../财务管理产品确认版差异与剩余待确认.md | 12 +-- 财务管理/财务管理产品确认表.md | 44 ++++----- 财务管理/财务领域模型与数据字典.md | 4 +- 财务管理/财务领域模型与跨服务契约.md | 2 +- 79 files changed, 916 insertions(+), 852 deletions(-) delete mode 100644 一期/虫虫出海一期开发进度表.xlsx delete mode 100644 三期/README.md delete mode 100644 三期/虫虫出海三期开发进度表.xlsx delete mode 100644 二期/README.md delete mode 100644 二期/二期计费财务需求确认表.xlsx delete mode 100644 二期/二期需求确认清单.xlsx delete mode 100644 二期/产品回传/2026-07-28-二期需求确认-产品回传.xlsx delete mode 100644 二期/产品回传/2026-07-31-二期需求确认-产品回传-v1.xlsx delete mode 100644 二期/版本归档/2026-07-28-覆盖前-二期开发进度表.xlsx delete mode 100644 二期/虫虫出海二期开发进度表.xlsx create mode 100644 入库测量与计费/README.md rename {二期 => 入库测量与计费}/产品回传/2026-07-28-产品确认审核记录.md (69%) create mode 100644 入库测量与计费/产品回传/2026-07-28-入库测量与计费需求确认-产品回传.xlsx rename {二期 => 入库测量与计费}/产品回传/2026-07-31-产品确认合并记录.md (70%) create mode 100644 入库测量与计费/产品回传/2026-07-31-入库测量与计费需求确认-产品回传-v1.xlsx rename {二期 => 入库测量与计费}/产品回传/README.md (53%) rename 二期/二期V2需求确认清单.md => 入库测量与计费/入库测量与计费V2需求确认清单.md (74%) rename 二期/二期产品待确认事项.md => 入库测量与计费/入库测量与计费产品待确认事项.md (76%) rename 二期/二期前端联调报告-2026-08-04.md => 入库测量与计费/入库测量与计费前端联调报告-2026-08-04.md (96%) rename 二期/二期前端页面清单与多对话并行任务表.md => 入库测量与计费/入库测量与计费前端页面清单与多对话并行任务表.md (95%) rename 二期/二期开发规划.md => 入库测量与计费/入库测量与计费开发规划.md (88%) rename 二期/二期开发进度表.md => 入库测量与计费/入库测量与计费开发进度表.md (88%) rename 二期/二期计费财务模块规划.md => 入库测量与计费/入库测量与计费计费财务模块规划.md (83%) rename 二期/二期计费财务需求确认表.md => 入库测量与计费/入库测量与计费计费财务需求确认表.md (54%) create mode 100644 入库测量与计费/入库测量与计费计费财务需求确认表.xlsx rename 二期/二期费用项目数据归属决策记录.md => 入库测量与计费/入库测量与计费费用项目数据归属决策记录.md (95%) rename 二期/二期需求优化版-v2-测量计费入库主流程.md => 入库测量与计费/入库测量与计费需求优化版-v2-测量计费入库主流程.md (89%) rename 二期/二期需求优化版-原型对照.md => 入库测量与计费/入库测量与计费需求优化版-原型对照.md (84%) rename 二期/二期需求确认清单.md => 入库测量与计费/入库测量与计费需求确认清单.md (58%) create mode 100644 入库测量与计费/入库测量与计费需求确认清单.xlsx rename {二期 => 入库测量与计费}/参考资料/头程物流流程图.svg (100%) rename {二期 => 入库测量与计费}/海外仓阶梯费用前端联调说明-2026-08-05.md (100%) create mode 100644 入库测量与计费/版本归档/2026-07-28-覆盖前-入库测量与计费开发进度表.xlsx rename {二期 => 入库测量与计费}/第三方入仓测量接口联调说明-2026-08-04.md (97%) create mode 100644 入库测量与计费/虫虫出海入库测量与计费开发进度表.xlsx create mode 100644 国内货柜履约/README.md rename {三期 => 国内货柜履约}/参考资料/出仓流程.png (100%) rename 三期/三期Wave1开发任务卡-2026-08-09.md => 国内货柜履约/国内货柜履约Wave1开发任务卡-2026-08-09.md (85%) rename 三期/三期开发规划.md => 国内货柜履约/国内货柜履约开发规划.md (79%) rename 三期/三期开发进度表.md => 国内货柜履约/国内货柜履约开发进度表.md (73%) rename 三期/三期开工门禁.md => 国内货柜履约/国内货柜履约开工门禁.md (73%) rename 三期/三期装柜闭环产品确认表-2026-08-08.md => 国内货柜履约/国内货柜履约装柜闭环产品确认表-2026-08-08.md (96%) rename 三期/三期装柜闭环开发前确认单-2026-08-08.md => 国内货柜履约/国内货柜履约装柜闭环开发前确认单-2026-08-08.md (92%) rename 三期/三期闭环审计报告-2026-08-08.md => 国内货柜履约/国内货柜履约闭环审计报告-2026-08-08.md (69%) rename 三期/三期需求确认表.md => 国内货柜履约/国内货柜履约需求确认表.md (79%) rename 三期/三期页面与原型清单.md => 国内货柜履约/国内货柜履约页面与原型清单.md (73%) rename 三期/三期验收任务拆分与待确认清单.md => 国内货柜履约/国内货柜履约验收任务拆分与待确认清单.md (90%) create mode 100644 国内货柜履约/虫虫出海国内货柜履约开发进度表.xlsx rename {三期 => 国内货柜履约}/货柜履约原型字段验收矩阵-2026-08-17.md (100%) rename {三期 => 国内货柜履约}/货柜管理全链验收矩阵-2026-08-13.md (97%) rename {四期 => 海外仓业务}/README.md (57%) rename {四期 => 海外仓业务}/海外仓PDA接柜入库全流程图-20260828.png (100%) rename 四期/四期后端缺口清单.md => 海外仓业务/海外仓业务后端缺口清单.md (70%) rename {四期 => 海外仓业务}/船节点标准化契约.md (97%) rename 四期/三期装柜完成后至四期人工验收手册.md => 海外仓业务/虫虫出海全流程人工验收手册.md (84%) rename {一期 => 订单与客户}/README.md (58%) create mode 100644 订单与客户/虫虫出海订单与客户开发进度表.xlsx rename 一期/一期头程订单闭环设计.md => 订单与客户/订单与客户头程订单闭环设计.md (82%) rename 一期/一期开发进度表.md => 订单与客户/订单与客户开发进度表.md (87%) rename 财务管理/openapi/{finance-phase1-five-pages-v1.yaml => finance-core-five-pages-v1.yaml} (99%) rename 财务管理/{财务一期P0实现证据矩阵.md => 财务核心P0实现证据矩阵.md} (96%) rename 财务管理/{财务一期P0操作契约与验收用例.md => 财务核心P0操作契约与验收用例.md} (92%) rename 财务管理/{财务一期五页产品与接口验收契约.md => 财务核心五页产品与接口验收契约.md} (92%) diff --git a/AI工程执行与协作约束.md b/AI工程执行与协作约束.md index 47d0c82..b8df966 100644 --- a/AI工程执行与协作约束.md +++ b/AI工程执行与协作约束.md @@ -23,14 +23,14 @@ - 收敛范围包括源码结构、接口与 DTO、字段、状态机、权限、配置键、OpenAPI、数据库结构与初始化 SQL、事件、路由、页面、前端消费者、Mock/Fixture、测试和脚本;旧实现冲突时同步修改全部生产者与消费者并直接删除旧实现。 - 禁止为旧代码、旧调用或开发环境存量保留旧接口/旧字段别名、兼容分支、双协议、双写、灰度、回滚版本、降级解析、旧行为回退、临时适配层、迁移脚本、回填脚本、清理补偿或新旧版本并行;不得以“稳妥”“兼容历史数据”或“先保留以后删除”为由延迟收敛。 - 开发环境数据库记录、上传文件、缓存、会话、消息、搜索索引和其他运行状态均可丢弃;正常验证方式是更新最新初始化基线、重新造数或上传,并直接运行受影响回归,不模拟生产迁移。已有历史 SQL 只用于开发追溯,不构成兼容依据。 -- 后端位于独立 Git 仓库 `../baiyue-firstleg/`,执行 Git 命令前确认当前工作目录。“无需兼容、直接修复”不授权自动重置数据库、删除数据/文件、执行 SQL、部署或修改环境。测试环境授权只读 `独立任务协作登记.md`,开发五期授权只读 `开发环境独立任务协作登记.md`;未登记任务和生产环境仍需用户在当前轮明确授权。 +- 后端位于独立 Git 仓库 `../baiyue-firstleg/`,执行 Git 命令前确认当前工作目录。“无需兼容、直接修复”不授权自动重置数据库、删除数据/文件、执行 SQL、部署或修改环境。测试环境授权只读 `独立任务协作登记.md`,开发全流程授权只读 `开发环境独立任务协作登记.md`;未登记任务和生产环境仍需用户在当前轮明确授权。 ## 联调、部署与数据库 -- 默认只准备代码、验证结果和人工部署步骤,不触发 Jenkins、不启动本地 Java/Nacos/数据库。开发五期总控可按 `开发环境独立任务协作登记.md` 的授权操作开发数据库、部署开发环境并执行开发环境真实 HTTP;登记专项可按 `独立任务协作登记.md` 的持续授权查询和修改用户指定的测试数据库。两类授权不得跨环境复用,也不得自动扩大到 Jenkins 或生产环境。 +- 默认只准备代码、验证结果和人工部署步骤,不触发 Jenkins、不启动本地 Java/Nacos/数据库。开发全流程总控可按 `开发环境独立任务协作登记.md` 的授权操作开发数据库、部署开发环境并执行开发环境真实 HTTP;登记专项可按 `独立任务协作登记.md` 的持续授权查询和修改用户指定的测试数据库。两类授权不得跨环境复用,也不得自动扩大到 Jenkins 或生产环境。 - 只有用户在当前轮明确授权指定环境、服务和提交时,才可部署或执行 HTTP 验收;测试数据库的读写例外仅适用于登记表中已持续授权的总控与专项,并遵守其中的职责和破坏性操作门禁。 - 环境地址、凭据和 Token 不写入源码或 `AGENTS.md`。接口不可用或契约不一致时记录路径、状态、错误码、`requestId`/`traceId` 和阻断原因,不回退到模拟成功。 -- 测试环境联调、部署和验收命令读取 `测试环境Jenkins部署指南.md`;开发五期只按 `开发环境独立任务协作登记.md` 的授权与目标项目指引执行,不把测试 Jenkins 流程当作开发部署入口。 +- 测试环境联调、部署和验收命令读取 `测试环境Jenkins部署指南.md`;开发全流程只按 `开发环境独立任务协作登记.md` 的授权与目标项目指引执行,不把测试 Jenkins 流程当作开发部署入口。 ## 通用工程与质量门禁 @@ -48,9 +48,9 @@ ## 独立任务与多任务协作 - 跨环境调度必须先核对保存项目 projectId、任务 cwd 与环境登记表三项一致;任一不一致不得下发或执行。禁止把测试环境任务通过绝对路径提示临时改作开发环境任务,反向同样禁止。 -- 开发环境五期任务只使用 `开发环境独立任务协作登记.md`;测试环境任务只使用 `独立任务协作登记.md`。两套任务不互相复用,不在两个目录之间复制未提交文件、生成补丁、自动合并或 cherry-pick。 +- 开发环境全流程任务只使用 `开发环境独立任务协作登记.md`;测试环境任务只使用 `独立任务协作登记.md`。两套任务不互相复用,不在两个目录之间复制未提交文件、生成补丁、自动合并或 cherry-pick。 -- 普通任务不读取协作登记。只有用户明确指定当前对话为总控,或要求检索历史任务、独立任务或跨对话通信时,才按当前保存项目与 cwd 读取唯一匹配的登记表:开发五期读 `开发环境独立任务协作登记.md`,测试环境读 `独立任务协作登记.md`;不得同时加载两表后混合选取任务。 +- 普通任务不读取协作登记。只有用户明确指定当前对话为总控,或要求检索历史任务、独立任务或跨对话通信时,才按当前保存项目与 cwd 读取唯一匹配的登记表:开发全流程读 `开发环境独立任务协作登记.md`,测试环境读 `独立任务协作登记.md`;不得同时加载两表后混合选取任务。 - 总控在接收任务时必须先做时长评估;预计单一执行链超过 15 分钟时,不得继续由一个任务从定位包办到验收,必须立即拆成可并行的“根因/契约核对、实现修复、回归验收”等独立工作包,并明确每包文件写权限和交付物。优先复用登记表中的长期专项;一次性工作使用内部子代理。该规则不自动授权创建新的用户可见任务。 - 实际执行超过 15 分钟仍未形成可验证交付时,总控必须主动重新拆分或缩小范围,向用户报告当前阻断与并行安排,不得静默等待、继续扩展设计或把非必要兼容、迁移、补偿工作并入主修复链。 - 用户按业务流程逐节点进行人工验收时,总控必须以“当前验收节点”为调度和完成单位,而不是以代码模块或单个 Bug 为单位。收到该节点首个问题后,应立即并行检查前端交互、后端状态与契约、数据/权限前置和自动化验收覆盖;同一节点后续问题统一并入该批次,不得连续串行追加给一个长期专项。 diff --git a/README.md b/README.md index 5a00418..9581044 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,44 @@ # 虫虫出海文档索引 -项目交付文档按阶段归档,跨阶段原型、调研和过程设计保留在原专题目录。 +项目交付文档按业务域组织。当前开发环境以端到端全流程为统一范围;历史规划、确认和验收记录保留在对应业务域目录,仅用于追溯决策,不构成功能边界。 -## 阶段文档 +## 业务域文档 -- [一期文档](一期/README.md):一期范围、开发进度和头程订单最小闭环。 -- [二期文档](二期/README.md):预约取货、到仓收货、实测差异和指定库位闭环。 -- [三期文档](三期/README.md):智能排柜、订舱、拖车、PDA 拣货、报关协同和国内出仓闭环。 -- [四期文档](四期/README.md):国内出仓后的船节点定时查询、海外接柜、合作仓卸货入库、库存与库内操作,以及海外采购、本土卡车和本土散板;不包含海外仓出库业务。 - - [船节点标准化契约](四期/船节点标准化契约.md):统一船司原始状态、十个标准节点、预计/实际时间、异常事实、还柜停止规则和新增船司接入门禁。 -- [测试环境独立任务协作登记](独立任务协作登记.md):只维护测试环境系统总控与长期专项的稳定 `task_id`、父子关系、职责和测试数据库授权。 -- [开发环境独立任务协作登记](开发环境独立任务协作登记.md):只维护开发环境五期总控与专项的稳定 `task_id`、projectId、职责及开发数据库/部署/HTTP 授权。 +- [订单与客户](订单与客户/README.md):登录认证、客户与企业、权限、头程订单和客户工作台。 +- [入库测量与计费](入库测量与计费/README.md):预约取货、到仓收货、箱码与箱唛、测量、尺寸策略、计价和入库费用。 +- [国内货柜履约](国内货柜履约/README.md):分柜与同柜、智能排柜、订舱、拖车、PDA 拣货、装柜、报关和国内出仓。 +- [海外仓业务](海外仓业务/README.md):船节点、海外接柜、入仓、库存、托盘、换标、转运、废弃、退货、排车、PDA 出库、派送、异常退回、客户回访、一件代发及海外本土业务。 + - [船节点标准化契约](海外仓业务/船节点标准化契约.md):统一船司原始状态、标准节点、预计/实际时间、异常事实、还柜停止规则和新增船司接入门禁。 +- [财务管理](财务管理/README.md):应收、应付、费用池、账单、收款、成本、核销、凭证以及国内外业务费用来源。 -## 跨阶段参考 +## 全流程公共契约 - [跨区域认证与服务通信契约](跨区域认证与服务通信契约.md):统一账号、国内/海外 Token、双区域 API、JWKS、Outbox/Inbox 与服务身份边界。 - [双区域部署与 Nacos 规划](双区域部署与Nacos规划.md):开发/测试同机共置、生产国内/海外独立控制面、Nacos、数据库及 Event Bridge 部署边界。 -- [阿里云生产环境选型、压测与上线手册](阿里云生产环境选型压测与上线手册.md):面向新手运维的 ECS/ALB、RDS MySQL、Tair/Redis、OSS、MSE Nacos、RocketMQ 选型,压测步骤、高可用演练、监控、备份与上线清单。 - [平台、客户层级与权限契约](平台客户层级与权限契约.md):平台/客户两级产品语义、列表包含详情的只读权限和跨层同步要求。 -- [AI 工程执行与协作约束](AI工程执行与协作约束.md):临时目录、依赖复用、当前开发阶段、部署数据库授权、质量门禁和独立任务协作规则。 -- [财务管理闭环盘点与范围建议](财务管理/README.md):基于当前入库计费、财务原型和现有代码盘点财务闭环、缺口及建议的首期应收边界。 -- [墨家设备测量上传接口说明 V3](墨家设备测量上传接口说明-V3.md):墨家测量设备经 Gateway 上传箱码、尺寸、重量和图片的开放接口契约。 -- [统一订单主状态与操作契约](统一订单主状态与操作契约.md):统一订单七状态、操作编码、内部状态兼容映射,以及与三期一致的 `LOADED` 硬门禁和 `DELIVERED` 可信回传边界。 -- [首页数据看板真实化与统计策略规划](首页数据看板真实化与统计策略规划.md):记录首页看板当前数据能力、实时/缓存边界、指标口径和后续实施顺序。 -- [Admin/Client 前端原型还原验收规则](Admin-Client前端原型还原验收规则.md):已确认原型页面的逐操作承载方式、视觉还原、响应式检查和验收证据要求。 +- [统一订单主状态与操作契约](统一订单主状态与操作契约.md):统一订单状态、操作编码、内部状态映射和可信履约回传边界。 +- [Admin/Client 前端原型还原验收规则](Admin-Client前端原型还原验收规则.md):页面操作承载方式、视觉还原、响应式检查和验收证据要求。 +- [AI 工程执行与协作约束](AI工程执行与协作约束.md):工作区、依赖、Git、部署、数据库、质量门禁和独立任务协作规则。 - [数据库中文注释维护规范](数据库注释维护规范.md):数据库注释口径、职责、迁移流程、自动门禁与实值验收要求。 -- [测试环境 Jenkins 部署指南](测试环境Jenkins部署指南.md):测试环境持续部署授权、Job 参数、执行边界、健康检查与失败处理。 -- `悦/`:产品原型、流程图、历史架构资料和调研数据,仅作为需求参考,不直接等同于已确认范围。 -- `superpowers/`:具体功能的设计与实施记录,按日期和主题维护。 +- [测试环境 Jenkins 部署指南](测试环境Jenkins部署指南.md):测试环境持续部署授权、Job 参数、健康检查与失败处理。 +- [阿里云生产环境选型、压测与上线手册](阿里云生产环境选型压测与上线手册.md):ECS/ALB、RDS MySQL、Redis、OSS、Nacos、RocketMQ、压测、高可用、监控、备份与上线清单。 +- [首页数据看板真实化与统计策略规划](首页数据看板真实化与统计策略规划.md):首页指标、实时与缓存边界、统计口径和实施顺序。 +- [墨家设备测量上传接口说明 V3](墨家设备测量上传接口说明-V3.md):测量设备经 Gateway 上传箱码、尺寸、重量和图片的接口契约。 + +## 环境协作 + +- [开发环境独立任务协作登记](开发环境独立任务协作登记.md):开发环境全流程总控与长期专项的稳定任务、职责及开发数据库/部署/HTTP 授权。 +- [测试环境独立任务协作登记](独立任务协作登记.md):测试环境系统总控与长期专项的稳定任务、职责和测试数据库授权。 + +## 参考资料 + +- `悦/`:产品原型、流程图、历史架构资料和调研数据,只作为需求参考,不直接定义当前范围。 +- `superpowers/`:按日期和主题保留的具体功能设计与实施记录。 ## 维护规则 -- 只影响单个阶段的范围、进度和验收文档放入对应阶段目录。 -- 公共架构、跨阶段契约和长期产品资料保留在 `docs/` 根目录或独立专题目录。 -- 阶段范围变化时同步更新该阶段的规划、进度表及受影响的公共契约。 -- 原型中出现的功能不自动进入开发范围,必须在阶段规划中明确优先级、依赖和验收标准。 +- 新文档按业务域归档,不新增以开发批次编号命名的目录、文件、标题、任务或范围标签。 +- 当前交付范围始终按端到端全流程理解;业务域目录只用于检索和职责归属,不用于排除上下游流程。 +- 范围、字段或流程冲突时,按“当前对话确认 > 正式契约与确认记录 > 项目指引与代码 > 原型 > 历史记录”判断。 +- 新增或修改业务能力时,同步更新业务域 README、跨端契约、接口、权限、SQL、测试和验收入口。 +- 原型中出现的功能不自动成为有效实现;必须由正式契约、代码和验收证据共同确认。 diff --git a/superpowers/specs/2026-07-28-admin-static-rbac-preview-design.md b/superpowers/specs/2026-07-28-admin-static-rbac-preview-design.md index 2604b0b..7b098cc 100644 --- a/superpowers/specs/2026-07-28-admin-static-rbac-preview-design.md +++ b/superpowers/specs/2026-07-28-admin-static-rbac-preview-design.md @@ -59,7 +59,7 @@ - 退出操作先调用权限预览 Store 的重置动作,清除内存状态与持久化演示角色 ID,再调用 `auth.logout()`;认证 Store 不承担预览状态职责。 - 登录成功后由登录流程调用权限预览 Store 的初始化动作,默认选择启用的超级管理员;超级管理员不可用时选择第一个启用角色。未登录阶段不自动初始化或重新持久化默认角色。 - 顶栏固定区分两个来源:`登录身份:{auth.user.name}({auth.user.account})` 与 `权限预览:{previewRole.name}`。认证角色 `auth.user.roles` 不作为无标签副标题展示,也不被预览状态读取或改写。 -- `localStorage` 在同源标签页之间共享,但本期不监听 `storage` 事件做实时跨标签同步;其他标签页刷新后读取最新持久化角色。 +- `localStorage` 在同源标签页之间共享,但当前不监听 `storage` 事件做实时跨标签同步;其他标签页刷新后读取最新持久化角色。 ### 权限数据流 diff --git a/一期/虫虫出海一期开发进度表.xlsx b/一期/虫虫出海一期开发进度表.xlsx deleted file mode 100644 index 76d32443c391383bc64827c6697d96a5ef47b108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29095 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%0AEMdfUXzjI7$9nbbDLu&qt^x= zG^ty$M93eos9W)5$ZwcbnSX#jYlTYcTRprvQD6`>(Em(4_IB0%eiZos_4dxUydV6Y z1?%sjKtKilHE*-{7bn91it1^Q2rm%{Hs3R-;w%*;G_Dl=kfdg)cf;z zpM3s<@?G;^QGVOg_bBh<`#&fh#{WZ_cUt}TSoIGA^BalCe~Vn-ANqYv_Ge(A+3!RD zhY0OG&ig3h4-U4)dqwI>lh-Uf!0sP~s-vhpPd4B*Ato}cMe;nX@!1uo7 i4Hh!$TzNGB diff --git a/三期/README.md b/三期/README.md deleted file mode 100644 index 3050d5e..0000000 --- a/三期/README.md +++ /dev/null @@ -1,51 +0,0 @@ -# 三期文档 - -三期以国内头程后程作业为范围,完成从排柜、订舱、拖车和仓内拣货,到装柜证据齐全并进入 `LOADED`/装柜完成的业务闭环。`DELIVERED`/派送完成由到达海外仓后的可信回传推进,不属于国内三期操作范围。 - -> 范围更正:三期只维护订舱和出仓前所需的船名航次、港口、ETD/ETA 等资料。柜子确认离开国内仓库后的 `CarrierScheduleQuery`、六家船公司查询、每 3 天/最多 3 次、来源/过期标识和后续定时船节点查询整体归四期,见 `../四期/README.md`。三期不再建设或验收这套查询。 - -## 当前主体模型与开工禁令 - -- 三期继续按业务单租户、“平台—客户”两级开发,客户之间严格隔离。Java 与接口中的业务 `tenant_id > 0` / `tenantId` 当前表示客户 ID;`tenant_id=0` 是平台身份、平台 RBAC 和平台公共仓库、快递公司、托盘、库位等公共资源技术作用域。客户往来单位、订单、文件和费用仍归属客户 `tenant_id>0`。 -- 三期不得新增租户主表、租户选择器、客户所属租户配置、租户切换、租户级 RBAC 或租户级配置,也不得把当前 `tenant_id` 从客户 ID 改义为上级租户 ID。 -- `tenant`、`Tenant*`、`merchant`、接口路径和字段属于历史兼容命名,继续保留;真实租户能力必须等未来独立需求、数据迁移和跨服务契约方案确认后再实施。 - -## 文档 - -- [三期闭环审计报告(2026-08-08)](三期闭环审计报告-2026-08-08.md):基于当前代码、接口、自动化和测试环境证据的闭环审计,列出阻断项、优先级和 GO 准入标准。 -- [三期装柜闭环产品确认表(2026-08-08)](三期装柜闭环产品确认表-2026-08-08.md):提供给产品直接填写的纯业务确认表,不包含技术实现细节。 -- [三期装柜闭环开发前确认单(2026-08-08)](三期装柜闭环开发前确认单-2026-08-08.md):用于产品确认直接开发前的状态、门禁、PDA 取证、冲正和验收细节。 -- [三期开发规划:国内出仓](三期开发规划.md) -- [三期开发进度表](三期开发进度表.md):参考一期采用“大任务 → 详细任务 → 里程碑 → 未确认事项 → 开工准入 → 验收”结构维护。 -- [虫虫出海三期开发进度表(Excel)](虫虫出海三期开发进度表.xlsx):可筛选、可下拉维护并使用公式汇总的项目进度工作簿。 -- [三期需求确认表](三期需求确认表.md):集中跟踪 P3-Q1~P3-Q13、负责人和最终结论。 -- [三期开工门禁](三期开工门禁.md):维护已确认范围、跨端硬边界和局部阻断项;模块指引引用本文件,不重复维护阶段状态。 -- [三期页面与原型清单](三期页面与原型清单.md):按管理后台、企业客户端和 PDA 维护页面范围及原型状态。 -- [三期验收任务拆分与待确认清单](三期验收任务拆分与待确认清单.md):真实 HTTP/真机验收覆盖、coverageGap 解除条件和并行任务入口。 -- `参考资料/出仓流程.png`:本期 9 个核心动作及业务终点的原始参考图。 - -## 当前状态 - -三期已进入分模块部署联调。已确认不新建独立出仓单,现有订单列表/详情承载主状态;支持一单多柜、一个柜拼多个订单,并采用“父订单→子订单→柜次”关系,已装载数量形成子订单,未装载数量自动生成后续子订单。进入 `LOADED`/装柜完成前,订舱完成、拖车完成、报关放行回执、PDA 拣货完成及五类证据完整均为服务端硬门禁;`LOADED` 后错误统一线下人工处理,国内 Admin/PDA 不提供在线冲正或手工推进 `DELIVERED`。当前不能因子链路已通过而宣告整期完成,最终结论以真实 HTTP 全链路验收为准。 - -柜子出仓后的船公司/船节点查询已重新归入四期。三期报关首版不做系统对接,全部由人工整理、线下提交和人工上传回执。仓库初始化角色包括操作员、拣货员、理货员,具体权限矩阵由 IAM 契约任务落表。 - -P3-Q1~P3-Q13 均已确认;P3-Q4 采用 uni-app 开发并支持在线更新,Android 广播扫描已接入。P3-Q5 复用二期实时库存、当前位置和可用量接口,不扩展完整 WMS。 - -### PDA 当前确认口径(2026-08-10) - -- Android 扫描广播方式已接入;PDA 采用 uni-app 开发并支持在线更新,按既定发布安排完成真机验收。 -- 正式作业仅支持在线:进入任务即标记“拣货中”,扫描保存在绑定作业员+任务+柜次的设备持久化草稿,点击提交时批量写后端。 -- 允许部分拣货或跳拣,但每个未完成项必须填写异常原因;存在未解决异常时不能完成或进入 `LOADED`。 -- 重复提交返回原结果,版本冲突提示员工刷新重试。 -- PDA 只能现场拍照,Admin 可人工上传;五类证据各至少 1 张有效照片,可同类型多张追加,错图只作废不硬删除。 -- 单柜次只允许一名作业员作业,不做多人并行和任务接管;进入任务即标记“拣货中”,扫描草稿按作业员+任务+柜次隔离,点击提交时批量写入后端。 -- 后台操作员、理货员可按权限人工上传证据;拣货员只负责 PDA 现场拍照,不开放后台人工上传。照片无限期保留,客户不可见照片和锁码。 - -### 发布与真实验收状态(2026-08-10) - -- Admin 已部署 `b593d72`:智能装柜、预装清单、装柜清单均可访问真实接口;预装/装柜清单不再要求选择仓库,详情仍使用列表行返回的真实仓库归属。 -- Firstleg 已部署 `3bfc11a`:修复 PDA 拣货时库位分配状态提前变更的问题;真实复跑仍发现 PDA `pick` 第二处 `S0500`,当前仍阻断 PDA 复核、装柜完成、报关 LOADED 关联和最终门禁,不能标记三期闭环完成。 -- 验收 fixture 顺序已核实为 `orders → inbound-measurement → phase3-container-loading → phase3-loading → phase3-customs → phase3-port-schedules → phase3-loading-finalize`;脚本保留真实失败,不以 mock、历史资源或 coverage gap 伪装通过。 -- PDA“点击提交时批量写入后端”的原子 batch 契约尚未实现;当前页面仍不能证明整批事务、批次幂等、服务端库存快照和失败整批回滚已具备。 -- ZIM hCaptcha、COSCO 动态页继续按产品确认的人工兜底保留为 `MANUAL_REQUIRED`,不作为自动查询 PASS。 diff --git a/三期/虫虫出海三期开发进度表.xlsx b/三期/虫虫出海三期开发进度表.xlsx deleted file mode 100644 index a63981d2d7447ed71cb4cc3896fd503604f89b5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30592 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 diff --git a/二期/README.md b/二期/README.md deleted file mode 100644 index 196707b..0000000 --- a/二期/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# 二期文档 - -二期当前范围止于头程下单、商户提交、平台审核、到仓测量与称重、费用试算和费用确认。测量审核后主状态停在 `WAIT_SPLIT`,费用可独立维护且不得回退主流程状态;分柜、托盘/库位、预装、PDA 拣货、装柜和派送统一归入三期。二期不建设应收应付、对账、收付款、核销、发票和利润模块。 - -## 当前主体模型 - -- 二期继续按“平台—客户”两级开发。`tenant_id > 0` / `tenantId` 当前表示客户 ID,用于客户隔离;`tenant_id=0` 是平台技术作用域。 -- 不新增真实租户、租户选择器或租户级 RBAC,也不把兼容字段重定义为上级租户。历史路径、字段与配置名继续保留。 -- 平台公共仓库、快递公司、托盘、库位和费用项目统一归属平台技术作用域 `tenant_id=0`,不绑定客户;客户往来单位、订单、文件和费用明细仍按所属客户 `tenant_id>0` 严格隔离,费用明细引用公共 `fee_item_id`。`10001` 是客户 ID,不得用于公共资源归属。 - -## 文档 - -- [二期 V2 需求确认清单(当前会议填写)](二期V2需求确认清单.md) -- [二期需求优化版 V2:测量、计费、托盘入库主流程](二期需求优化版-v2-测量计费入库主流程.md) -- [二期需求优化版:原型对照(上一版优化稿)](二期需求优化版-原型对照.md) -- [二期开发规划:头程到仓](二期开发规划.md) -- [二期头程计费模块规划](二期计费财务模块规划.md) -- [二期头程计费需求确认表](二期计费财务需求确认表.md) -- [二期费用项目数据归属决策记录](二期费用项目数据归属决策记录.md) -- [二期头程计费需求确认表(Excel,保留历史文件名)](二期计费财务需求确认表.xlsx) -- [二期产品待确认事项(发产品填写)](二期产品待确认事项.md) -- [二期开发进度表](二期开发进度表.md) -- [二期开发进度表(Excel)](虫虫出海二期开发进度表.xlsx) -- [二期前端页面清单与多对话并行任务表](二期前端页面清单与多对话并行任务表.md) -- [海外仓阶梯费用前端联调说明(2026-08-05)](海外仓阶梯费用前端联调说明-2026-08-05.md) -- [二期需求确认清单:产品与业务确认](二期需求确认清单.md) -- [二期需求确认清单(会议填写 Excel)](二期需求确认清单.xlsx) -- [规划依据:头程物流流程图](参考资料/头程物流流程图.svg) - -## 当前状态 - -截至 2026-08-06,当前阶段边界已重新确认为 `WAIT_SPLIT + APPROVED + CONFIRMED`:`WAIT_SPLIT` 只表示二期已完成、等待未来三期分柜,不代表三期已启动。2026-08-04 的 `INBOUNDED + APPROVED + SENT` 是旧范围下的历史回归结果,不再作为当前二期验收终点。 - -- 订单:`2084549604719718402` -- 入库单:`2084549769916538881` -- 入仓码:`RK-2084549604719718402` -- 测量批次:`2084556854154715137` -- 费用单:`FBAF-2084549769916538881-1` -- 计费结果:实重 `20kg`,体积 `0.24m³`,计费量 `40.08kg`,费用 `440.68 CNY` -- 自动化测试:Firstleg 77 项、Warehouse 68 项、公共仓储技术归属专项(历史测试名含“资源租户”)3 项全部通过 -- 在线验证:7 个隔离服务健康状态均为 `UP` - -本地 OCR 未配置真实供应商凭证,因此本轮验证的是“图片上传成功、OCR 返回失败、人工修正并确认、继续完成计费入库”的可用降级链路。真实 OCR 识别准确率仍需在测试环境使用现场秤图验证。 - -产品确认与技术验收是两类状态。V2 的 C1-C8 产品结论仍由产品/业务负责人填写;已经实现和测试通过的技术能力记录在验收报告及确认清单的技术状态章节中。 - -## 核心文档 - -- [二期前端联调报告(2026-08-04)](二期前端联调报告-2026-08-04.md) -- [第三方入仓测量接口联调说明](第三方入仓测量接口联调说明-2026-08-04.md) -- [二期需求优化版 V2:测量、计费、托盘入库主流程](二期需求优化版-v2-测量计费入库主流程.md) -- [二期 V2 需求确认清单](二期V2需求确认清单.md) - -## 规划与历史文档 - -- [二期需求优化版:原型对照](二期需求优化版-原型对照.md) -- [二期开发规划:头程到仓](二期开发规划.md) -- [二期开发进度表](二期开发进度表.md) -- [二期头程计费模块规划](二期计费财务模块规划.md) -- [二期头程计费需求确认表](二期计费财务需求确认表.md) -- [二期费用项目数据归属决策记录](二期费用项目数据归属决策记录.md) -- [二期产品待确认事项](二期产品待确认事项.md) -- [二期需求确认清单:产品与业务确认](二期需求确认清单.md) - -## 数据库增量 - -可重复执行的测试库增量脚本位于: - -```text -D:\baiyue-firstleg\deploy\sql\头程数据库统一增量-MySQL8.sql -``` - -该文件是头程数据库唯一增量入口,后续数据库变更只追加到此文件。当前已包含一期、二期以及海外仓阶梯费用基础资料所需结构、索引和权限。历史日期脚本不再作为部署入口。 - -其中海外仓阶梯费用新增: - -- `wh_overseas_storage_fee_rule` -- `wh_overseas_storage_fee_tier` -- 5 个查询、唯一性和关联索引 -- 4 项平台端按钮权限及平台系统管理员默认授权 - -原二期回归字段仍包含: - -- `fl_inbound_weight_result.created_by` -- `fl_inbound_weight_result.updated_by` -- `fl_inbound_pallet_allocation.warehouse_resource_tenant_id` diff --git a/二期/二期计费财务需求确认表.xlsx b/二期/二期计费财务需求确认表.xlsx deleted file mode 100644 index 33192480097b52d280311beb18ae42e58e4eae3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10355 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 K#o|!>y!tPoQV-q$ diff --git a/二期/二期需求确认清单.xlsx b/二期/二期需求确认清单.xlsx deleted file mode 100644 index ffaf890120364dad08aac779df2cb12921219432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12802 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 Gr~e158HT0+ diff --git a/二期/产品回传/2026-07-28-二期需求确认-产品回传.xlsx b/二期/产品回传/2026-07-28-二期需求确认-产品回传.xlsx deleted file mode 100644 index ba38438e9cdb5d56f9d8997e0a887e134230d9da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30733 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

B3~hs&UJ8 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 diff --git a/二期/产品回传/2026-07-31-二期需求确认-产品回传-v1.xlsx b/二期/产品回传/2026-07-31-二期需求确认-产品回传-v1.xlsx deleted file mode 100644 index b283441a752b7b8d22007a6b77303e0240d8d20b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19439 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 diff --git a/二期/版本归档/2026-07-28-覆盖前-二期开发进度表.xlsx b/二期/版本归档/2026-07-28-覆盖前-二期开发进度表.xlsx deleted file mode 100644 index dbfc6b796c8813e1c8e295e86e3cbbbc7c3916d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23857 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

DAoTB2P|)z&z=Bz&bW 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 OaNk3?-@*(IuKojlO-n8S diff --git a/入库测量与计费/README.md b/入库测量与计费/README.md new file mode 100644 index 0000000..92c6322 --- /dev/null +++ b/入库测量与计费/README.md @@ -0,0 +1,86 @@ +# 入库测量与计费文档 + +入库测量与计费当前范围止于头程下单、商户提交、平台审核、到仓测量与称重、费用试算和费用确认。测量审核后主状态停在 `WAIT_SPLIT`,费用可独立维护且不得回退主流程状态;分柜、托盘/库位、预装、PDA 拣货、装柜和派送统一归入国内货柜履约。入库测量与计费不建设应收应付、对账、收付款、核销、发票和利润模块。 + +## 当前主体模型 + +- 入库测量与计费继续按“平台—客户”两级开发。`tenant_id > 0` / `tenantId` 当前表示客户 ID,用于客户隔离;`tenant_id=0` 是平台技术作用域。 +- 不新增真实租户、租户选择器或租户级 RBAC,也不把兼容字段重定义为上级租户。历史路径、字段与配置名继续保留。 +- 平台公共仓库、快递公司、托盘、库位和费用项目统一归属平台技术作用域 `tenant_id=0`,不绑定客户;客户往来单位、订单、文件和费用明细仍按所属客户 `tenant_id>0` 严格隔离,费用明细引用公共 `fee_item_id`。`10001` 是客户 ID,不得用于公共资源归属。 + +## 文档 + +- [入库测量与计费 V2 需求确认清单(当前会议填写)](入库测量与计费V2需求确认清单.md) +- [入库测量与计费需求优化版 V2:测量、计费、托盘入库主流程](入库测量与计费需求优化版-v2-测量计费入库主流程.md) +- [入库测量与计费需求优化版:原型对照(上一版优化稿)](入库测量与计费需求优化版-原型对照.md) +- [入库测量与计费开发规划:头程到仓](入库测量与计费开发规划.md) +- [入库测量与计费头程计费模块规划](入库测量与计费计费财务模块规划.md) +- [入库测量与计费头程计费需求确认表](入库测量与计费计费财务需求确认表.md) +- [入库测量与计费费用项目数据归属决策记录](入库测量与计费费用项目数据归属决策记录.md) +- [入库测量与计费头程计费需求确认表(Excel,保留历史文件名)](入库测量与计费计费财务需求确认表.xlsx) +- [入库测量与计费产品待确认事项(发产品填写)](入库测量与计费产品待确认事项.md) +- [入库测量与计费开发进度表](入库测量与计费开发进度表.md) +- [入库测量与计费开发进度表(Excel)](虫虫出海入库测量与计费开发进度表.xlsx) +- [入库测量与计费前端页面清单与多对话并行任务表](入库测量与计费前端页面清单与多对话并行任务表.md) +- [海外仓阶梯费用前端联调说明(2026-08-05)](海外仓阶梯费用前端联调说明-2026-08-05.md) +- [入库测量与计费需求确认清单:产品与业务确认](入库测量与计费需求确认清单.md) +- [入库测量与计费需求确认清单(会议填写 Excel)](入库测量与计费需求确认清单.xlsx) +- [规划依据:头程物流流程图](参考资料/头程物流流程图.svg) + +## 当前状态 + +截至 2026-08-06,当前阶段边界已重新确认为 `WAIT_SPLIT + APPROVED + CONFIRMED`:`WAIT_SPLIT` 只表示入库测量与计费已完成、等待未来国内货柜履约分柜,不代表国内货柜履约已启动。2026-08-04 的 `INBOUNDED + APPROVED + SENT` 是旧范围下的历史回归结果,不再作为当前入库测量与计费验收终点。 + +- 订单:`2084549604719718402` +- 入库单:`2084549769916538881` +- 入仓码:`RK-2084549604719718402` +- 测量批次:`2084556854154715137` +- 费用单:`FBAF-2084549769916538881-1` +- 计费结果:实重 `20kg`,体积 `0.24m³`,计费量 `40.08kg`,费用 `440.68 CNY` +- 自动化测试:Firstleg 77 项、Warehouse 68 项、公共仓储技术归属专项(历史测试名含“资源租户”)3 项全部通过 +- 在线验证:7 个隔离服务健康状态均为 `UP` + +本地 OCR 未配置真实供应商凭证,因此本轮验证的是“图片上传成功、OCR 返回失败、人工修正并确认、继续完成计费入库”的可用降级链路。真实 OCR 识别准确率仍需在测试环境使用现场秤图验证。 + +产品确认与技术验收是两类状态。V2 的 C1-C8 产品结论仍由产品/业务负责人填写;已经实现和测试通过的技术能力记录在验收报告及确认清单的技术状态章节中。 + +## 核心文档 + +- [入库测量与计费前端联调报告(2026-08-04)](入库测量与计费前端联调报告-2026-08-04.md) +- [第三方入仓测量接口联调说明](第三方入仓测量接口联调说明-2026-08-04.md) +- [入库测量与计费需求优化版 V2:测量、计费、托盘入库主流程](入库测量与计费需求优化版-v2-测量计费入库主流程.md) +- [入库测量与计费 V2 需求确认清单](入库测量与计费V2需求确认清单.md) + +## 规划与历史文档 + +- [入库测量与计费需求优化版:原型对照](入库测量与计费需求优化版-原型对照.md) +- [入库测量与计费开发规划:头程到仓](入库测量与计费开发规划.md) +- [入库测量与计费开发进度表](入库测量与计费开发进度表.md) +- [入库测量与计费头程计费模块规划](入库测量与计费计费财务模块规划.md) +- [入库测量与计费头程计费需求确认表](入库测量与计费计费财务需求确认表.md) +- [入库测量与计费费用项目数据归属决策记录](入库测量与计费费用项目数据归属决策记录.md) +- [入库测量与计费产品待确认事项](入库测量与计费产品待确认事项.md) +- [入库测量与计费需求确认清单:产品与业务确认](入库测量与计费需求确认清单.md) + +## 数据库增量 + +可重复执行的测试库增量脚本位于: + +```text +D:\baiyue-firstleg\deploy\sql\头程数据库统一增量-MySQL8.sql +``` + +该文件是头程数据库唯一增量入口,后续数据库变更只追加到此文件。当前已包含订单与客户、入库测量与计费以及海外仓阶梯费用基础资料所需结构、索引和权限。历史日期脚本不再作为部署入口。 + +其中海外仓阶梯费用新增: + +- `wh_overseas_storage_fee_rule` +- `wh_overseas_storage_fee_tier` +- 5 个查询、唯一性和关联索引 +- 4 项平台端按钮权限及平台系统管理员默认授权 + +原入库测量与计费回归字段仍包含: + +- `fl_inbound_weight_result.created_by` +- `fl_inbound_weight_result.updated_by` +- `fl_inbound_pallet_allocation.warehouse_resource_tenant_id` diff --git a/二期/产品回传/2026-07-28-产品确认审核记录.md b/入库测量与计费/产品回传/2026-07-28-产品确认审核记录.md similarity index 69% rename from 二期/产品回传/2026-07-28-产品确认审核记录.md rename to 入库测量与计费/产品回传/2026-07-28-产品确认审核记录.md index 70874f0..d76f812 100644 --- a/二期/产品回传/2026-07-28-产品确认审核记录.md +++ b/入库测量与计费/产品回传/2026-07-28-产品确认审核记录.md @@ -1,11 +1,11 @@ -# 2026-07-28 二期产品确认回传审核记录 +# 2026-07-28 入库测量与计费产品确认回传审核记录 -> 回传原件:[2026-07-28-二期需求确认-产品回传.xlsx](2026-07-28-二期需求确认-产品回传.xlsx) +> 回传原件:[2026-07-28-入库测量与计费需求确认-产品回传.xlsx](2026-07-28-入库测量与计费需求确认-产品回传.xlsx) > 审核结论:暂不直接合并为正式需求基线 ## 一、确认口径 -二期由单一产品负责人统一确认,不要求填写产品跟进人、业务确认人和确认日期。回传文件中状态为“已确认”且已填写最终结论,即视为产品确认结果;状态为“暂缓”的项目需要明确二期临时处理方式。 +入库测量与计费由单一产品负责人统一确认,不要求填写产品跟进人、业务确认人和确认日期。回传文件中状态为“已确认”且已填写最终结论,即视为产品确认结果;状态为“暂缓”的项目需要明确入库测量与计费临时处理方式。 ## 二、需要产品补充澄清 @@ -17,17 +17,17 @@ | P2-Q4 | 重量体积(毛重/363);总材积重(长×宽×高/6000)×箱数 | 单位、公式中 `/363` 的业务含义、计费重是否取毛重和材积重较大值、精度和舍入规则 | | P2-Q5 | 差异需客户确认 | 是否所有差异都确认;客户拒绝、超时未确认以及确认前货物能否上架/计费 | | P2-Q6 | 没有隔离单独的区域 | 差异未关闭时货物放哪里、系统是否使用“业务暂停”而不使用隔离库位、谁可以解除暂停 | -| P2-Q7 | 当前没有库位容量 | 二期是否完全不做容量校验;库位停用、占用和货物类型不匹配是否仍需拦截 | +| P2-Q7 | 当前没有库位容量 | 入库测量与计费是否完全不做容量校验;库位停用、占用和货物类型不匹配是否仍需拦截 | | P2-Q8 | 称重照片、测量照片上传 | 是否必传、每个箱件还是每个收货批次上传、允许的文件数量/大小和补传规则 | -| P2-Q9 | 暂缓 | 明确二期不接 PDA,并确定使用后台网页或响应式作业页 | +| P2-Q9 | 暂缓 | 明确入库测量与计费不接 PDA,并确定使用后台网页或响应式作业页 | | P2-Q10 | 暂缓 | 暂缓期间无预报货物是否拒收;如允许收货,需要临时认领和超期规则 | -| P2-Q11 | 保存 12 个月 | 从哪个时间点起算、到期删除还是归档、各类照片/联系方式/凭证是否采用同一期限 | +| P2-Q11 | 保存 12 个月 | 从哪个时间点起算、到期删除还是归档、各类照片/联系方式/凭证是否采用同订单与客户限 | ## 三、当前可保留的结论 - `P2-Q12`:标签打印设备为佳博 1324D 热敏标签打印机;标签纸、连接、驱动和指令协议仍需实机核验。 - `P2-Q8` 已明确需要称重照片和测量照片,可作为规则方向保留,必传粒度和附件限制补齐后再锁定。 -- `P2-Q9、P2-Q10` 可以保持“暂缓”,但必须给出二期临时处理规则,否则仍会阻塞对应开发任务。 +- `P2-Q9、P2-Q10` 可以保持“暂缓”,但必须给出入库测量与计费临时处理规则,否则仍会阻塞对应开发任务。 ## 四、下一步 diff --git a/入库测量与计费/产品回传/2026-07-28-入库测量与计费需求确认-产品回传.xlsx b/入库测量与计费/产品回传/2026-07-28-入库测量与计费需求确认-产品回传.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..70cbd54bdd14aa9c3b4a7a2e74b9bfeb514ee143 GIT binary patch literal 24866 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 K8`S;z>i+<(T8qs9 literal 0 HcmV?d00001 diff --git a/二期/产品回传/2026-07-31-产品确认合并记录.md b/入库测量与计费/产品回传/2026-07-31-产品确认合并记录.md similarity index 70% rename from 二期/产品回传/2026-07-31-产品确认合并记录.md rename to 入库测量与计费/产品回传/2026-07-31-产品确认合并记录.md index a484b19..8aa4b17 100644 --- a/二期/产品回传/2026-07-31-产品确认合并记录.md +++ b/入库测量与计费/产品回传/2026-07-31-产品确认合并记录.md @@ -1,26 +1,26 @@ -# 2026-07-31 二期产品确认合并记录 +# 2026-07-31 入库测量与计费产品确认合并记录 -> 原始回传:[2026-07-31-二期需求确认-产品回传-v1.xlsx](2026-07-31-二期需求确认-产品回传-v1.xlsx) -> 回传来源:WXWork 文件 `二期需求确认清单.xlsx` +> 原始回传:[2026-07-31-入库测量与计费需求确认-产品回传-v1.xlsx](2026-07-31-入库测量与计费需求确认-产品回传-v1.xlsx) +> 回传来源:WXWork 文件 `入库测量与计费需求确认清单.xlsx` > 原始文件 SHA-256:`841F976133F772BD52E085785C57D8BA90687CA07CC57B8009C71138F78C8563` -## 一、已合并到二期到仓基线 +## 一、已合并到入库测量与计费到仓基线 | 编号 | 产品结论 | 合并后的开发口径 | |---|---|---| | P2-Q1 | 以实际货物重量、体积为准 | 收货实测结果作为后续作业和头程计费输入;少货关闭规则按现有临时基线保留 | | P2-Q4 | 小数点三位向上取整 | 测量和计费中间结果保留原始值,展示/业务结果按三位向上取整;公式版本可追溯 | | P2-Q5 | 差异同步给客户,无需客户确认,只做记录 | 差异不再阻塞后续作业,不建设客户确认动作;保留差异记录、通知和审计 | -| P2-Q6 | 不考虑 | 二期不建设独立隔离区和隔离释放流程 | +| P2-Q6 | 不考虑 | 入库测量与计费不建设独立隔离区和隔离释放流程 | | P2-Q8 | 照片必传,大小不限制 | 称重照片、测量照片必传;产品未设置业务大小上限,系统仍保留可配置的技术安全上限和文件类型校验 | -| P2-Q10 | 不考虑,无此场景 | 二期不建设无预报货物认领流程;不预留正式订单绑定和计费入口 | +| P2-Q10 | 不考虑,无此场景 | 入库测量与计费不建设无预报货物认领流程;不预留正式订单绑定和计费入口 | | P2-Q11 | 永久保存 | 业务上不自动删除照片、凭证和测量记录;具体存储成本、合规删除和备份策略由运维另行制定 | ## 二、财务范围合并结论 -产品在本轮确认中明确:二期财务只做“头程计费”,不做后续财务闭环。 +产品在本轮确认中明确:入库测量与计费财务只做“头程计费”,不做后续财务闭环。 -### 二期纳入 +### 入库测量与计费纳入 - 头程费用项目维护。 - 头程计费规则、计费单位、价格版本和生效区间。 @@ -28,7 +28,7 @@ - 费用结果的人工补录、调整、审核、作废和审计留痕。 - 头程费用明细查询、订单关联、计算过程和规则快照。 -### 二期明确不纳入 +### 入库测量与计费明确不纳入 - 应收应付台账。 - 客户或供应商对账单、结算周期和账单确认。 @@ -37,7 +37,7 @@ - 汇率结算、利润、利润率和财务报表。 - 总账、会计凭证、在线支付和银企直连。 -这些模块的原型页面只作为后续阶段参考,不再进入二期开发任务、验收标准或进度统计。 +这些模块的原型页面只作为后续阶段参考,不再进入入库测量与计费开发任务、验收标准或进度统计。 ## 三、未合并内容 @@ -49,7 +49,7 @@ ## 四、合并后处理 -- 更新二期开发规划、计费规划、需求确认清单和开发进度表。 -- 从二期财务任务中移除应收应付、对账、付款、核销、发票和利润任务。 +- 更新入库测量与计费开发规划、计费规划、需求确认清单和开发进度表。 +- 从入库测量与计费财务任务中移除应收应付、对账、付款、核销、发票和利润任务。 - 将 P2-Q13 标记为“已确认:仅头程计费”,P2-Q14 至 P2-Q16 保持待确认。 - 产品原始回传只读归档,不覆盖;后续回传使用新版本文件名。 diff --git a/入库测量与计费/产品回传/2026-07-31-入库测量与计费需求确认-产品回传-v1.xlsx b/入库测量与计费/产品回传/2026-07-31-入库测量与计费需求确认-产品回传-v1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6854a0f68cee655c159a73028b7cb79258fd3c1c GIT binary patch literal 14965 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 i{R7y@1_bmkruU-^_*;C{vpz+%P literal 0 HcmV?d00001 diff --git a/二期/产品回传/README.md b/入库测量与计费/产品回传/README.md similarity index 53% rename from 二期/产品回传/README.md rename to 入库测量与计费/产品回传/README.md index 005346f..aad93c8 100644 --- a/二期/产品回传/README.md +++ b/入库测量与计费/产品回传/README.md @@ -1,11 +1,11 @@ -# 二期产品确认回传管理 +# 入库测量与计费产品确认回传管理 -本目录只保存产品原始回传文件,不直接作为正式开发进度表使用,也不覆盖 `docs/二期/虫虫出海二期开发进度表.xlsx`。 +本目录只保存产品原始回传文件,不直接作为正式开发进度表使用,也不覆盖 `docs/入库测量与计费/虫虫出海入库测量与计费开发进度表.xlsx`。 ## 文件命名 ```text -YYYY-MM-DD-二期需求确认-产品回传-vN.xlsx +YYYY-MM-DD-入库测量与计费需求确认-产品回传-vN.xlsx ``` ## 合并条件 @@ -16,13 +16,13 @@ YYYY-MM-DD-二期需求确认-产品回传-vN.xlsx - 例外情况、暂缓范围和临时处理规则明确。 - 与其他确认项不存在冲突。 -二期由单一产品负责人统一确认,不要求填写确认人、产品跟进人和确认日期。产品将状态设置为“已确认”即代表结论生效。 +入库测量与计费由单一产品负责人统一确认,不要求填写确认人、产品跟进人和确认日期。产品将状态设置为“已确认”即代表结论生效。 ## 合并流程 1. 原样保存产品回传文件,不在原件上二次修改。 2. 对比正式确认清单,形成回传审核记录。 3. 产品补充不完整或冲突的结论,并将状态设置为“已确认”或“暂缓”。 -4. 按 `P2-Qxx` 合并到 `二期需求确认清单.md`。 +4. 按 `P2-Qxx` 合并到 `入库测量与计费需求确认清单.md`。 5. 同步更新开发规划、开发任务、依赖、验收标准和 Excel 进度表。 -6. 合并前后的正式版本分别保存到 `docs/二期/版本归档/`。 +6. 合并前后的正式版本分别保存到 `docs/入库测量与计费/版本归档/`。 diff --git a/二期/二期V2需求确认清单.md b/入库测量与计费/入库测量与计费V2需求确认清单.md similarity index 74% rename from 二期/二期V2需求确认清单.md rename to 入库测量与计费/入库测量与计费V2需求确认清单.md index a2d04c0..56c1c52 100644 --- a/二期/二期V2需求确认清单.md +++ b/入库测量与计费/入库测量与计费V2需求确认清单.md @@ -1,42 +1,42 @@ -# 虫虫出海二期 V2 需求确认清单 +# 虫虫出海入库测量与计费 V2 需求确认清单 -> 创建日期:2026-08-03 -> 当前状态:待产品与业务确认 -> 确认对象:[二期需求优化版 V2:测量、计费、托盘入库闭环](二期需求优化版-v2-测量计费入库主流程.md) +> 创建日期:2026-08-03 +> 当前状态:待产品与业务确认 +> 确认对象:[入库测量与计费需求优化版 V2:测量、计费、托盘入库闭环](入库测量与计费需求优化版-v2-测量计费入库主流程.md) > 适用范围:头程订单审核通过后的测量、计费、托盘分配、库位占用和入库闭环 > 技术状态(2026-08-04):任务 `019fc6f9-8dcf-74e1-bc68-d42f15d7802a` 已完成核心正常主链路开发和真实 API 回归。以下“产品确认状态”仍由产品/业务负责人填写,技术完成不自动等同于产品确认。 > 订单衔接规则更新(2026-08-07,已确认):客户草稿不生成入仓码;客户提交进入待审核时立即生成并固定唯一入仓码。平台审核不以选择承运商为前置条件;审核通过后才创建可进入测量流程的正式入库单,并沿用提交时生成的入仓码。承运商可在后续履约或计费前补充。 -> 主体模型:二期只实现“平台—客户”两级;业务数据的 `tenant_id>0` 是客户隔离兼容字段,平台公共仓储资源归属 `tenant_id=0`。下表历史“资源租户”均指公共主数据技术归属,不代表真实租户。 +> 主体模型:入库测量与计费只实现“平台—客户”两级;业务数据的 `tenant_id>0` 是客户隔离兼容字段,平台公共仓储资源归属 `tenant_id=0`。下表历史“资源租户”均指公共主数据技术归属,不代表真实租户。 ## 一、使用说明 -- 本清单是二期 V2 的唯一会议确认入口。 +- 本清单是入库测量与计费 V2 的唯一会议确认入口。 - 产品只有一人,不填写确认人和确认时间,只填写“最终结论”和“状态”。 - 状态统一使用:`待确认`、`已确认`、`暂缓`。 - 认可当前建议时,可将当前建议直接复制为最终结论,并把状态改为“已确认”。 - 修改当前建议时,必须写清可直接转成页面、接口、状态、计算或验收规则的最终结论。 -- 暂时无法确定时,状态改为“暂缓”,同时填写二期临时处理方式。 +- 暂时无法确定时,状态改为“暂缓”,同时填写入库测量与计费临时处理方式。 - C1 至 C8 全部形成可开发结论后,V2 才能替换现有 24 项开发计划。 ## 二、产品与业务必须确认的 8 项 | 编号 | 需要确认的事项 | 当前建议 | 最终结论 | 状态 | |---|---|---|---|---| -| C1 | 是否正式采用 V2 作为二期唯一开发基线 | 采用“测量数据采集 → 测量审核 → 自动试算 → 人工确认 → 发送费用 → 托盘与库位占用 → 入库成功”主流程;确认后旧 24 项计划和第一份优化稿停止作为开发依据 | 待填写 | 待确认 | +| C1 | 是否正式采用 V2 作为入库测量与计费唯一开发基线 | 采用“测量数据采集 → 测量审核 → 自动试算 → 人工确认 → 发送费用 → 托盘与库位占用 → 入库成功”主流程;确认后旧 24 项计划和第一份优化稿停止作为开发依据 | 待填写 | 待确认 | | C2 | 长宽高和重量分别从哪里取得 | 长宽高由第三方测量设备按入仓码回传;重量由称重图片 OCR 识别,允许人工校正并保留 OCR 原值、修正值和修正原因 | 待填写 | 待确认 | | C3 | 测量审核失败是否允许继续计费和入库 | 默认禁止;仅在 Nacos 异常放行开关开启、操作人有专属权限且填写放行原因时允许继续;作废单、缺少费用快照或无可用库位始终禁止放行 | 待填写 | 待确认 | -| C4 | 二期计费结果的业务边界 | 二期只生成发送给客户的头程费用;船司价格只作为计价基础,不生成船司应付、成本、对账、收付款、核销、发票或利润数据 | 待填写 | 待确认 | +| C4 | 入库测量与计费计费结果的业务边界 | 入库测量与计费只生成发送给客户的头程费用;船司价格只作为计价基础,不生成船司应付、成本、对账、收付款、核销、发票或利润数据 | 待填写 | 待确认 | | C5 | KG/CBM 计费公式、换算系数和价格匹配维度 | 包税按 `体积 × 167` 转换为 KG 后与实重取大;不包税按 `重量 ÷ 363` 转换为 CBM 后与实测体积取大;`167`、`363` 按客户规则版本配置,不硬编码;价格按起运仓、渠道/计费类型、船司、FBA 目的仓和有效期唯一匹配 | 待填写 | 待确认 | -| C6 | 二期首批头程费用项目白名单 | 只纳入实际使用的基础运费和明确附加费;每项费用必须确认编码、名称、计费单位、币种、自动/人工、触发条件及是否允许人工调整 | 待填写 | 待确认 | -| C7 | 发送费用、入库成功及复核节点 | “发送费用给客户”作为二期完成节点:锁定费用快照、生成托盘分配、占用库位并将入库单改为已入库;默认不再增加独立接收审核或第二人复核 | 待填写 | 待确认 | -| C8 | 托盘拆分和库位占用规则 | 按实际总体积除以单托盘可用容积向上取整;二期默认一托一库位;托盘只分配体积和箱数汇总,不拆到 SKU;入库后换位作为 P1 独立功能 | 待填写 | 待确认 | +| C6 | 入库测量与计费首批头程费用项目白名单 | 只纳入实际使用的基础运费和明确附加费;每项费用必须确认编码、名称、计费单位、币种、自动/人工、触发条件及是否允许人工调整 | 待填写 | 待确认 | +| C7 | 发送费用、入库成功及复核节点 | “发送费用给客户”作为入库测量与计费完成节点:锁定费用快照、生成托盘分配、占用库位并将入库单改为已入库;默认不再增加独立接收审核或第二人复核 | 待填写 | 待确认 | +| C8 | 托盘拆分和库位占用规则 | 按实际总体积除以单托盘可用容积向上取整;入库测量与计费默认一托一库位;托盘只分配体积和箱数汇总,不拆到 SKU;入库后换位作为 P1 独立功能 | 待填写 | 待确认 | ## 三、C6 首批费用项目填写表 -没有实际业务的费用不要为了匹配原型而纳入二期。白名单之外的费用默认不能自动生成。 +没有实际业务的费用不要为了匹配原型而纳入入库测量与计费。白名单之外的费用默认不能自动生成。 | 费用编码 | 费用名称 | 计费单位 | 默认币种 | 自动/人工 | 单价来源 | 触发条件 | 是否允许调整 | 备注 | |---|---|---|---|---|---|---|---|---| @@ -56,10 +56,10 @@ | T2 | OCR 接入参数 | 确认 OCR 服务商、图片格式、单图技术上限、单批数量、识别时限、置信度阈值、公斤/磅识别、失败重试和人工校正规则;业务服务通过 `fileId` 调用,不传服务器目录 | 待填写 | 待确认 | | T3 | 托盘和库位基础资料 | 确认托盘编码规则、标准可用容积、仓库现有托盘数量、库位编码、可用状态及初始化数据;并发占位由数据库唯一约束或乐观锁保证 | 待填写 | 待确认 | -## 五、确认后形成的二期主流程 +## 五、确认后形成的入库测量与计费主流程 ```text -一期头程订单提交待审核 +订单与客户头程订单提交待审核 → 生成并固定唯一入仓码 → 平台审核通过(承运商不是审核前置条件) → 创建正式入库单并沿用该入仓码 @@ -76,7 +76,7 @@ → 异步发送客户通知 ``` -## 六、明确不纳入二期 +## 六、明确不纳入入库测量与计费 - 船司应付、供应商应付和应付审核。 - 客户或供应商对账单、结算周期和账单争议。 @@ -108,16 +108,16 @@ C1 至 C8 确认后,原 P2-Q14 至 P2-Q16 不再单独维护,避免形成两 ## 八、确认完成后的文档处理 1. 将本文件状态改为“已确认”。 -2. 将 [二期需求优化版 V2](二期需求优化版-v2-测量计费入库主流程.md) 标记为正式开发基线。 -3. 将 [二期需求优化版:原型对照](二期需求优化版-原型对照.md) 标记为历史版本,不再用于开发。 +2. 将 [入库测量与计费需求优化版 V2](入库测量与计费需求优化版-v2-测量计费入库主流程.md) 标记为正式开发基线。 +3. 将 [入库测量与计费需求优化版:原型对照](入库测量与计费需求优化版-原型对照.md) 标记为历史版本,不再用于开发。 4. 用 V2 的 13 项任务替换现有 24 项开发计划,并同步 Markdown 和 Excel 进度表。 5. 将 C1 至 C8 的结论转换为状态、接口、数据表、权限、异常和验收规则。 6. 将 T1 至 T3 分配给技术、仓库和供应商负责人,在对应开发任务开始前补齐。 -7. 后续新增应收应付、对账、收付款、发票或利润时,必须另行立项,不得直接扩入二期。 +7. 后续新增应收应付、对账、收付款、发票或利润时,必须另行立项,不得直接扩入入库测量与计费。 ## 九、进入开发排期的完成标准 -- C1 至 C8 均为“已确认”,或“暂缓”但已写明二期可执行的临时处理方式。 +- C1 至 C8 均为“已确认”,或“暂缓”但已写明入库测量与计费可执行的临时处理方式。 - C6 至少形成一版可初始化的费用项目白名单。 - 计费公式、换算系数、唯一匹配维度和费用发送节点可以转为自动化测试。 - 托盘数量、库位占用和并发冲突规则可以转为数据库约束和接口验收。 @@ -131,7 +131,7 @@ C1 至 C8 确认后,原 P2-Q14 至 P2-Q16 不再单独维护,避免形成两 | C1 主链路 | 已完成正常链路 | 下单、审核、测量、称重、计费、费用发送、托盘库位、入库已通过真实 API | | C2 测量与重量来源 | 已实现 | 第三方/平台箱规明细、图片证据、OCR 失败人工修正与确认已验证 | | C3 审核失败放行 | 已实现配置和权限边界 | Nacos 开关默认关闭;正常审核通过链路已验证 | -| C4 计费边界 | 已按二期范围实现 | 仅生成客户头程费用,不扩展应付、对账、核销、发票和利润 | +| C4 计费边界 | 已按入库测量与计费范围实现 | 仅生成客户头程费用,不扩展应付、对账、核销、发票和利润 | | C5 KG/CBM 规则 | 已实现并验证样本 | 实重 `20kg`、体积重 `40.08kg`,取 `40.08kg` 计费 | | C6 费用项目白名单 | 技术能力已具备,业务内容待确认 | 本轮使用测试价格 `11 CNY/kg`,不能代替正式费用白名单 | | C7 费用发送与入库节点 | 已实现 | 审核通过后自动生成费用 `440.68 CNY`,最终 `SENT + INBOUNDED` | @@ -140,4 +140,4 @@ C1 至 C8 确认后,原 P2-Q14 至 P2-Q16 不再单独维护,避免形成两 | T2 OCR 参数 | 降级链路已验证,真实供应商待接入 | 本地 OCR 未配置,已验证失败后人工修正继续入库 | | T3 托盘库位基础资料 | 已实现并通过 API 创建 | 当前公共主数据技术归属规则为 `tenant_id=0`,分配状态 `CONFIRMED`;`10001` 不再作为公共资源归属 | -完整接口与回归证据见 [二期前端联调报告(2026-08-04)](二期前端联调报告-2026-08-04.md)。 +完整接口与回归证据见 [入库测量与计费前端联调报告(2026-08-04)](入库测量与计费前端联调报告-2026-08-04.md)。 diff --git a/二期/二期产品待确认事项.md b/入库测量与计费/入库测量与计费产品待确认事项.md similarity index 76% rename from 二期/二期产品待确认事项.md rename to 入库测量与计费/入库测量与计费产品待确认事项.md index e845fe2..de11434 100644 --- a/二期/二期产品待确认事项.md +++ b/入库测量与计费/入库测量与计费产品待确认事项.md @@ -1,15 +1,15 @@ -# 虫虫出海二期产品待确认事项 +# 虫虫出海入库测量与计费产品待确认事项 -> 更新日期:2026-07-31 -> 适用范围:头程物流“02 到仓”及头程计费 -> 正式状态以 [二期需求确认清单](二期需求确认清单.md) 为准。 +> 更新日期:2026-07-31 +> 适用范围:头程物流“02 到仓”及头程计费 +> 正式状态以 [入库测量与计费需求确认清单](入库测量与计费需求确认清单.md) 为准。 > 产品只有一人,不需要填写确认人和确认时间;会议只填写最终结论和状态。 ## 一、会议结论摘要 -- 产品已确认到仓作业规则及二期“只做头程计费”的范围。 +- 产品已确认到仓作业规则及入库测量与计费“只做头程计费”的范围。 - 当前只需确认 P2-Q14、P2-Q15、P2-Q16,共 3 项。 -- P2-Q17 至 P2-Q24 对应应收应付、对账、收付款、核销、发票、汇率结算和利润能力,均不纳入二期。 +- P2-Q17 至 P2-Q24 对应应收应付、对账、收付款、核销、发票、汇率结算和利润能力,均不纳入入库测量与计费。 - 产品回传中 Q14 至 Q16 的“63”没有业务含义,本次会议需要重新填写。 ## 二、本次会议需要确认的 3 项 @@ -22,7 +22,7 @@ ## 三、P2-Q14 首批费用项目填写模板 -没有实际业务的费用不要为了匹配原型而纳入二期。 +没有实际业务的费用不要为了匹配原型而纳入入库测量与计费。 | 费用编码 | 费用名称 | 费用性质 | 计费对象 | 计费单位 | 默认币种 | 默认税率 | 自动/人工 | 触发节点 | |---|---|---|---|---|---|---|---|---| @@ -30,7 +30,7 @@ ## 四、已确认,无需再次询问 -| 编号 | 产品结论 | 二期开发口径 | +| 编号 | 产品结论 | 入库测量与计费开发口径 | |---|---|---| | P2-Q1 | 以实际货物重量、体积为准 | 实测结果作为后续作业和头程计费输入 | | P2-Q2 | 不做系统服务商调度 | 线下安排取货,系统记录结果 | @@ -43,14 +43,14 @@ | P2-Q10 | 不考虑无预报货物 | 不建设无预报认领和正式订单绑定流程 | | P2-Q11 | 永久保存 | 业务记录不自动删除;运维补充备份和合规策略 | | P2-Q12 | 使用佳博 1324D 热敏标签打印机 | 开发前核验纸张、连接、驱动和指令协议 | -| P2-Q13 | 二期只做头程计费 | 不生成应收、应付、账单、付款、核销、发票或利润数据 | +| P2-Q13 | 入库测量与计费只做头程计费 | 不生成应收、应付、账单、付款、核销、发票或利润数据 | -P2-Q9 暂缓:二期不接 PDA,使用后台或响应式作业页。 +P2-Q9 暂缓:入库测量与计费不接 PDA,使用后台或响应式作业页。 ## 五、确认后的处理 1. 将 Q14 至 Q16 的最终结论和状态回写正式需求确认清单。 2. 技术审核结论是否足以转为字段、状态、计算、权限、异常和验收规则。 -3. 同步更新二期开发规划、头程计费规划、开发进度表和 Excel。 +3. 同步更新入库测量与计费开发规划、头程计费规划、开发进度表和 Excel。 4. 保留产品原始回传和本次会议版本;后续修改用新版本,不覆盖历史文件。 diff --git a/二期/二期前端联调报告-2026-08-04.md b/入库测量与计费/入库测量与计费前端联调报告-2026-08-04.md similarity index 96% rename from 二期/二期前端联调报告-2026-08-04.md rename to 入库测量与计费/入库测量与计费前端联调报告-2026-08-04.md index 75adb5a..304a6be 100644 --- a/二期/二期前端联调报告-2026-08-04.md +++ b/入库测量与计费/入库测量与计费前端联调报告-2026-08-04.md @@ -1,4 +1,4 @@ -# 二期入库测量、计费与入库前端联调报告 +# 入库测量、计费与入库前端联调报告 > 版本日期:2026-08-04 > 后端仓库:`D:\baiyue-firstleg` @@ -9,7 +9,7 @@ ## 一、联调结论 -二期后端主流程、平台测量、OCR 重量、客服审核、FBA 计费、费用发布、入库完成、库位和托盘维护、客户只读查询、第三方测量回传接口均已形成代码闭环。 +入库测量与计费后端主流程、平台测量、OCR 重量、客服审核、FBA 计费、费用发布、入库完成、库位和托盘维护、客户只读查询、第三方测量回传接口均已形成代码闭环。 最终正常业务流程是: @@ -75,7 +75,7 @@ Swagger 分组: | 7 | `firstleg-service` | 9202 | 入库、测量、审核和计费主流程 | | 8 | `gateway` | 9000 | 前端统一入口和聚合文档 | -若登录或订单前置流程依赖其他一期服务,应在 Firstleg 前启动。前端业务请求统一走网关,不要将各服务端口写死到页面。 +若登录或订单前置流程依赖其他订单与客户服务,应在 Firstleg 前启动。前端业务请求统一走网关,不要将各服务端口写死到页面。 ## 三、全局请求与响应约定 @@ -413,7 +413,7 @@ DELETE /api/platform/v1/fba-pricing/carrier-rates/{id} } ``` -当前平台托盘 DTO 只返回主数据,不暴露内部 `AVAILABLE / RESERVED / OCCUPIED` 状态;也没有单独的托盘启停或状态筛选 API。页面本期只实现查询、新增、编辑、删除。已预占或占用托盘删除会被后端拒绝。这是当前明确的接口边界,不要自行猜测状态路径。 +当前平台托盘 DTO 只返回主数据,不暴露内部 `AVAILABLE / RESERVED / OCCUPIED` 状态;也没有单独的托盘启停或状态筛选 API。页面当前只实现查询、新增、编辑、删除。已预占或占用托盘删除会被后端拒绝。这是当前明确的接口边界,不要自行猜测状态路径。 ## 十一、商户端只读接口 @@ -486,7 +486,7 @@ image:该条箱规唯一对应的 JPG/PNG/BMP 图片,最大 5 MB ## 十三、推荐前端联调顺序 1. 验证平台登录、刷新 Token、退出、过期会话、401 和 403。 -2. 给测试角色同步二期权限,确认按钮显示与后端权限码一致。 +2. 给测试角色同步入库测量与计费权限,确认按钮显示与后端权限码一致。 3. 初始化启用仓库、至少一个托盘、足量可用库位、客户计费规则和船司 FBA 费率。 4. 创建或准备一条已进入待测量状态的真实入库单。 5. 调用入库列表和详情,核对 Long ID 均按字符串处理。 @@ -558,12 +558,12 @@ D:\apache-maven-3.8.8\bin\mvn.cmd clean test -pl order,firstleg,warehouse,file,i 本次回归没有启动服务、没有占用 `9000/9100/920x` 默认端口,也没有连接或修改 MySQL。以下内容必须在测试环境由后端与前端共同验证后,才能判定上线验收通过: -1. 二期 SQL 在真实 MySQL 的建表/迁移执行,以及历史数据与唯一约束冲突检查。 +1. 入库测量与计费 SQL 在真实 MySQL 的建表/迁移执行,以及历史数据与唯一约束冲突检查。 2. Gateway、Nacos、Redis、MySQL、服务间令牌和各微服务的真实 HTTP 联通。 3. OCR 引擎对现场秤图的识别准确率、超时和失败重试。 4. 并发提交、并发抢托盘/库位、A0 多托盘共享在真实数据库事务下的压力验证。 5. 浏览器端完整登录、刷新 Token、权限按钮、403、跨客户拒绝、空态、加载态和重复提交体验。 -6. 当前托盘管理没有独立启停和状态筛选接口;本期页面只做查询、新增、编辑、删除。 +6. 当前托盘管理没有独立启停和状态筛选接口;页面只做查询、新增、编辑、删除。 上述内容是本报告初版时的阶段结论。2026-08-04 已继续完成真实数据库迁移和隔离端口在线 HTTP 回归,最终结论以第十七章为准。 @@ -624,4 +624,4 @@ D:\apache-maven-3.8.8\bin\mvn.cmd clean test -pl order,firstleg,warehouse,file,i - 浏览器端视觉、移动端适配和真实用户操作体验仍由前端按本报告接口完成联调验收。 - 数据库唯一增量入口:`D:\baiyue-firstleg\deploy\sql\头程数据库统一增量-MySQL8.sql`。后续变更只追加到该文件,历史日期脚本不再作为部署入口。 -最终结论:**二期核心正常主链路已经完成真实 MySQL、真实 HTTP 和自动化回归,后端达到前端联调条件;真实 OCR 供应商识别和浏览器端体验属于后续环境验收项。** +最终结论:**入库测量与计费核心正常主链路已经完成真实 MySQL、真实 HTTP 和自动化回归,后端达到前端联调条件;真实 OCR 供应商识别和浏览器端体验属于后续环境验收项。** diff --git a/二期/二期前端页面清单与多对话并行任务表.md b/入库测量与计费/入库测量与计费前端页面清单与多对话并行任务表.md similarity index 95% rename from 二期/二期前端页面清单与多对话并行任务表.md rename to 入库测量与计费/入库测量与计费前端页面清单与多对话并行任务表.md index aebd20c..19b6221 100644 --- a/二期/二期前端页面清单与多对话并行任务表.md +++ b/入库测量与计费/入库测量与计费前端页面清单与多对话并行任务表.md @@ -1,4 +1,4 @@ -# 二期前端页面清单与多对话并行任务表 +# 入库测量与计费前端页面清单与多对话并行任务表 > 盘点日期:2026-08-05 > 适用项目:`apps/admin-web/`、`apps/client-web/` @@ -11,7 +11,7 @@ ## 一、结论 -二期前端应围绕已经落地的“入库测量、OCR、测量审核、FBA 计费、托盘库位、客户只读结果”建设,不继续沿用旧 24 项计划直接开工。 +入库测量与计费前端应围绕已经落地的“入库测量、OCR、测量审核、FBA 计费、托盘库位、客户只读结果”建设,不继续沿用旧 24 项计划直接开工。 - Admin 新增 6 个正式菜单页面:入库单、客户计费规则、船司 FBA 价格、库位管理、托盘管理、海外仓阶梯费用。 - 入库详情承载测量/OCR、审核、费用快照、托盘库位结果和历史,不再新增独立“接收审核”页面。 @@ -25,7 +25,7 @@ 1. 用户本轮要求:只整理和开发前端,不修改后端,可以直接只读后端代码。 2. 后端真实 Controller、DTO、权限 SQL、状态枚举和服务编排。 -3. `二期需求优化版-v2-测量计费入库主流程.md` 的范围边界。 +3. `入库测量与计费需求优化版-v2-测量计费入库主流程.md` 的范围边界。 4. Admin 原型仅用于布局、字段和交互参考,不补造后端没有的业务能力。 已确认的实现差异: @@ -70,10 +70,10 @@ ### 3.3 全局装配变更 -- `src/app/router/index.ts`:装配二期模块路由。 +- `src/app/router/index.ts`:装配入库测量与计费模块路由。 - `src/core/navigation/adminNavigation.ts`:在“国内仓”下增加入库单、库位、托盘;新增“头程计费”分组;在客户或海外仓基础资料分组增加“海外仓阶梯费用”。 - 路由和导航测试同步更新。 -- IAM 权限页面无需业务改造;后端返回二期权限资源后沿用现有展示和授权能力。 +- IAM 权限页面无需业务改造;后端返回入库测量与计费权限资源后沿用现有展示和授权能力。 - 不恢复“接收审核”“费用项目”“完整财务管理”等原型菜单。 ## 四、Client 页面变更清单 @@ -130,8 +130,8 @@ Client 只修改现有 `FirstLegOrdersView.vue` 的订单详情抽屉,新增 - 新增 `P2-ADM-12` 海外仓阶梯费用前端任务:后端接口、权限和 SQL 已完成,前端页面待实现与联调。 - Admin 已通过 `pnpm test`(58 个文件、262 个测试)、`pnpm typecheck` 和 `pnpm build`。 - Client 已通过 `pnpm test`(135 个测试)、`pnpm typecheck` 和 `pnpm build`。 -- Admin 二期新增模块的 Impeccable detector 结果为 `[]`,模块依赖边界测试已通过。 -- Admin 二期页面已再次按平台后台原型校正搜索条件、表格字段、字段顺序和详情分区;视觉组件统一复用现有 `QueryToolbar`、`DataTable`、`AppDrawer` 及状态组件。 +- Admin 入库测量与计费新增模块的 Impeccable detector 结果为 `[]`,模块依赖边界测试已通过。 +- Admin 入库测量与计费页面已再次按平台后台原型校正搜索条件、表格字段、字段顺序和详情分区;视觉组件统一复用现有 `QueryToolbar`、`DataTable`、`AppDrawer` 及状态组件。 - 原型字段只在当前后端 Controller/DTO 支持时落地;未恢复接收审核、客户确认、报关、智能装柜、托盘状态/启停、尺寸/承重及无接口的导入导出。 - Client 入库费用区沿用既有订单详情视觉,补充换算系数、舍入精度和规则/价格版本,保持只读并继续使用“入仓码”业务术语。 - 本轮未修改 `baiyue-firstleg/`;8.1 节的 Client 服务端响应数据暴露风险仍是上线阻断,不影响本轮前端任务完成状态。 diff --git a/二期/二期开发规划.md b/入库测量与计费/入库测量与计费开发规划.md similarity index 88% rename from 二期/二期开发规划.md rename to 入库测量与计费/入库测量与计费开发规划.md index edd1b82..f4b3ccb 100644 --- a/二期/二期开发规划.md +++ b/入库测量与计费/入库测量与计费开发规划.md @@ -1,17 +1,17 @@ -# 虫虫出海二期开发规划:头程到仓与头程计费 +# 虫虫出海入库测量与计费开发规划:头程到仓与头程计费 > 创建日期:2026-07-28 > 更新日期:2026-07-31 > 状态:开发已启动,3 项计费细节确认中 > 流程依据:[头程物流流程图](参考资料/头程物流流程图.svg)中的头程物流“02 到仓” > 产品确认:[2026-07-31 产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md) -> 前置阶段:[一期文档](../一期/README.md) +> 前置阶段:[订单与客户文档](../订单与客户/README.md) -> 主体模型:二期只实现“平台—客户”两级。`tenant_id > 0` / `tenantId` 是客户 ID 兼容字段,`tenant_id=0` 是平台技术作用域;不得新增真实租户、租户选择器、租户级 RBAC 或重定义现有隔离字段。 +> 主体模型:入库测量与计费只实现“平台—客户”两级。`tenant_id > 0` / `tenantId` 是客户 ID 兼容字段,`tenant_id=0` 是平台技术作用域;不得新增真实租户、租户选择器、租户级 RBAC 或重定义现有隔离字段。 -## 一、二期目标 +## 一、入库测量与计费目标 -二期承接一期“客户下单并选择平台收货仓”的结果,完成货物从待到仓、实际收货、测量、差异记录到指定库位的作业闭环,并在实测数据之上完成头程费用计算。 +入库测量与计费承接订单与客户“客户下单并选择平台收货仓”的结果,完成货物从待到仓、实际收货、测量、差异记录到指定库位的作业闭环,并在实测数据之上完成头程费用计算。 ```text 线下预约 / 送货预报 @@ -27,11 +27,11 @@ 头程费用试算与费用明细确认 ``` -二期不建设应收应付、对账、收付款、核销、发票、利润或总账。完成标准是每票货能够回答:何时到仓、实际收到什么、实测结果是什么、与申报差多少、差异是否已通知、最终放在哪个库位,以及产生了哪些头程费用和计算依据。 +入库测量与计费不建设应收应付、对账、收付款、核销、发票、利润或总账。完成标准是每票货能够回答:何时到仓、实际收到什么、实测结果是什么、与申报差多少、差异是否已通知、最终放在哪个库位,以及产生了哪些头程费用和计算依据。 ## 二、阶段边界 -### 纳入二期 +### 纳入入库测量与计费 - 客户取货或送货预报,以及线下预约结果、改期和取消记录。 - 平台收货仓到仓签到、分批收货、处理单元标签和收货冲正。 @@ -41,7 +41,7 @@ - 头程费用项目、计费规则版本、费用试算、人工费用、调整、确认和费用明细。 - 服务端权限、基于兼容字段 `tenant_id` 的客户隔离、状态、幂等、并发、文件鉴权、审计和历史快照。 -### 明确不纳入二期 +### 明确不纳入入库测量与计费 - 应收应付台账、客户/供应商对账、账单确认和争议。 - 收款、付款、退款、核销、反核销、银行流水和在线支付。 @@ -49,7 +49,7 @@ - 会计科目、会计凭证和总账。 - 流程图头程“03 出仓”:智能排柜、订舱、拖车、PDA 拣货、装柜、报关和港务信息。 - 完整 WMS:可用库存、库存成本、常规移库、盘点、冻结、拣货、复核和出库。 -- PDA 硬件或厂商 SDK;二期使用后台或响应式作业页。 +- PDA 硬件或厂商 SDK;入库测量与计费使用后台或响应式作业页。 - 独立隔离区、差异等待客户确认、无预报货物认领和待认领区。 - 时间窗容量调度、自动服务商分配、地图、GPS 和外部承运商接口。 - FBA/海外目的仓及尾程到港、到仓、出仓和签收流程。 @@ -66,11 +66,11 @@ | P2-Q6 | 不考虑隔离区 | 不建设隔离库位、隔离上架和释放流程 | | P2-Q7 | 不做库位容量校验 | 仅校验库位启停、仓库归属和权限合法性 | | P2-Q8 | 称重、测量照片必传,大小不限制 | 产品不设业务大小上限;系统保留文件类型校验和可配置技术安全上限 | -| P2-Q9 | PDA 暂缓 | 二期使用后台或响应式作业页 | +| P2-Q9 | PDA 暂缓 | 入库测量与计费使用后台或响应式作业页 | | P2-Q10 | 不考虑无预报货物 | 不建设无预报认领和正式订单绑定流程 | | P2-Q11 | 永久保存 | 业务记录不自动删除;访问审计、备份和合规策略由运维补充 | | P2-Q12 | 佳博 1324D 热敏标签打印机 | 开发前实机核验纸张、连接、驱动和指令协议 | -| P2-Q13 | 二期只做头程计费 | 费用结果不自动形成应收、应付、账单或收付款数据 | +| P2-Q13 | 入库测量与计费只做头程计费 | 费用结果不自动形成应收、应付、账单或收付款数据 | ## 四、角色与数据边界 @@ -125,7 +125,7 @@ ### 6. 库位与上架 - 维护仓库、库区、库位编码、名称、状态和权限范围。 -- 二期不做承重、箱数或体积容量校验,也不建设隔离区和待认领区。 +- 入库测量与计费不做承重、箱数或体积容量校验,也不建设隔离区和待认领区。 - 上架任务关联收货批次、目标库位、执行人、状态和完成时间。 - 上架完成后写入处理单元当前位置和历史位置,为后续出仓提供输入。 @@ -136,7 +136,7 @@ - 头程订单、到仓实测或已确认业务事件触发费用试算,重复事件不得重复计费。 - 支持自动费用、人工补录、调整、确认、作废、查询和导出。 - 已确认费用不直接覆盖,变更通过调整记录留痕。 -- 详细规则见 [二期头程计费模块规划](二期计费财务模块规划.md)。 +- 详细规则见 [入库测量与计费头程计费模块规划](入库测量与计费计费财务模块规划.md)。 ## 六、状态模型 @@ -203,7 +203,7 @@ - 创建取货或送货预报。 - 查看预约结果、到仓时间线、实测、公开照片、差异通知和上架结果。 -- 如二期客户端展示头程费用,只显示本企业公开费用,不显示内部备注和其他企业数据。 +- 如入库测量与计费客户端展示头程费用,只显示本企业公开费用,不显示内部备注和其他企业数据。 ### 国内头程后端 `baiyue-firstleg/` @@ -216,7 +216,7 @@ | 里程碑 | 交付目标 | 进入条件 | |---|---|---| -| P2-M0 规则锁定 | 到仓契约、测量口径、头程计费边界和权限基线确认 | 一期订单及基础资料契约稳定 | +| P2-M0 规则锁定 | 到仓契约、测量口径、头程计费边界和权限基线确认 | 客户订单及基础资料契约稳定 | | P2-M1 到仓预报 | 取货/送货预报及线下预约结果可记录 | 收货仓 API 可用 | | P2-M2 到仓收货 | 签到、分批收货、标签、照片和冲正可追溯 | 文件服务和仓库权限可用 | | P2-M3 测量差异 | 原始测量、三位向上取整、差异记录和通知可用 | 测量公式可用 | @@ -228,7 +228,7 @@ | ID | 端 | 模块 | 交付内容 | 优先级 | 依赖 | |---|---|---|---|---|---| -| P2-BASE-01 | 公共 | 到仓契约 | 状态、枚举、权限、事件、错误码和快照模型 | P0 | 一期订单契约 | +| P2-BASE-01 | 公共 | 到仓契约 | 状态、枚举、权限、事件、错误码和快照模型 | P0 | 客户订单契约 | | P2-BASE-02 | 公共 | 数据模型 | 到仓单、批次、处理单元、标签、测量、差异、库位、位置、费用和审计 | P0 | P2-BASE-01 | | P2-ADM-01 | 后台 | 到仓列表 | 查询、筛选、分页、详情、空态和异常态 | P0 | P2-BASE-01 | | P2-ADM-02 | 后台 | 预约结果 | 记录、调整和取消线下预约结果 | P0 | P2-ADM-01 | @@ -253,7 +253,7 @@ | P2-TEST-01 | 公共 | 自动化测试 | 越权、幂等、测量舍入、计费复算、标签、差异、位置、文件和审计 | P0 | 所有 P0 模块 | | P2-REL-01 | 公共 | 发布验收 | 初始化仓库、库位、测量规则、标签和费用基础数据,联调、验收和发布 | P0 | P2-TEST-01 | -二期开发任务共 24 项。应收应付、对账、账单中心、收付款核销、发票和利润六项任务已根据产品确认从二期移除。 +入库测量与计费开发任务共 24 项。应收应付、对账、账单中心、收付款核销、发票和利润六项任务已根据产品确认从入库测量与计费移除。 ## 十一、测试与验收重点 @@ -278,7 +278,7 @@ | P2-Q15 | 计费维度、阶梯价、最低收费、封顶、组合价和优先级 | 先支持客户、往来单位、仓库、服务和生效区间 | | P2-Q16 | 费用试算、生成、确认、调整和作废节点 | 实测完成试算,其他费用按已确认业务事件生成 | -回传中的“63”不作为业务结论。P2-Q13 已确认仅做头程计费;P2-Q17 至 P2-Q24 不纳入二期。 +回传中的“63”不作为业务结论。P2-Q13 已确认仅做头程计费;P2-Q17 至 P2-Q24 不纳入入库测量与计费。 ## 十三、建议实施顺序 diff --git a/二期/二期开发进度表.md b/入库测量与计费/入库测量与计费开发进度表.md similarity index 88% rename from 二期/二期开发进度表.md rename to 入库测量与计费/入库测量与计费开发进度表.md index c3df208..24d7b85 100644 --- a/二期/二期开发进度表.md +++ b/入库测量与计费/入库测量与计费开发进度表.md @@ -1,11 +1,11 @@ -# 虫虫出海二期开发进度表:到仓与头程计费 +# 虫虫出海入库测量与计费开发进度表:到仓与头程计费 > 创建日期:2026-07-28 > 更新日期:2026-07-31 > 当前阶段:开发已启动,需求确认并行 > 总体状态:到仓规则和范围已确认,3 项计费细节待补充;实际开发进度待负责人回填 -二期严格以头程物流“02 到仓”和头程计费为范围。范围依据见 [二期开发规划](二期开发规划.md),确认结论见 [二期需求确认清单](二期需求确认清单.md)。原型只用于页面、字段和流程参考,不自动扩大二期范围。 +入库测量与计费严格以头程物流“02 到仓”和头程计费为范围。范围依据见 [入库测量与计费开发规划](入库测量与计费开发规划.md),确认结论见 [入库测量与计费需求确认清单](入库测量与计费需求确认清单.md)。原型只用于页面、字段和流程参考,不自动扩大入库测量与计费范围。 ## 零、2026-08-05 增量状态 @@ -19,16 +19,16 @@ ## 一、进度口径 - 开发任务共 24 项;未收到具体完成量、负责人和日期前,不虚填开发进度。 -- 需求问题共 24 项:已确认 12 项、暂缓 1 项、待确认 3 项、不纳入二期 8 项。 +- 需求问题共 24 项:已确认 12 项、暂缓 1 项、待确认 3 项、不纳入入库测量与计费 8 项。 - 当前会议只需处理 P2-Q14、P2-Q15、P2-Q16。 -- P2-Q9 暂缓,二期不接 PDA;P2-Q17 至 P2-Q24 不纳入二期。 +- P2-Q9 暂缓,入库测量与计费不接 PDA;P2-Q17 至 P2-Q24 不纳入入库测量与计费。 - 应收应付、对账、收付款、核销、发票、汇率结算、利润和总账不进入任务、排期和验收。 ## 二、总体进度 | 工作流 | 范围 | 状态 | 开发进度 | 需求状态 | 负责人 | 备注 | |---|---|---|---:|---|---|---| -| 规则与数据 | 到仓契约、数据模型、权限、文件和审计 | 待开始 | 0% | 到仓规则已确认 | 待分配 | 一期订单及基础资料契约是前置依赖 | +| 规则与数据 | 到仓契约、数据模型、权限、文件和审计 | 待开始 | 0% | 到仓规则已确认 | 待分配 | 客户订单及基础资料契约是前置依赖 | | 到仓预报 | 取货/送货预报和线下预约结果记录 | 待开始 | 0% | Q2、Q3 已确认 | 待分配 | 不做容量调度和系统服务商分配 | | 到仓收货 | 签到、分批收货、标签、照片、异常和冲正 | 待开始 | 0% | Q1、Q8、Q10、Q12 已确认 | 待分配 | 不建设无预报认领流程 | | 测量差异 | 实测、三位向上取整、差异记录和客户通知 | 待开始 | 0% | Q4、Q5、Q6 已确认 | 待分配 | 差异无需客户确认,不阻塞上架或计费 | @@ -40,7 +40,7 @@ | ID | 里程碑 | 端 | 模块 | 功能/交付内容 | 优先级 | 状态 | 进度 | 原型覆盖 | 需求阻塞 | 依赖 | 负责人 | 计划开始 | 计划完成 | 备注 | |---|---|---|---|---|---|---|---:|---|---|---|---|---|---|---| -| P2-BASE-01 | P2-M0 | 公共 | 到仓契约 | 状态、枚举、权限、事件、错误码和快照模型 | P0 | 待开始 | 0% | 部分 | - | 一期订单契约 | 待分配 | 待排期 | 待排期 | 按已确认到仓规则建设 | +| P2-BASE-01 | P2-M0 | 公共 | 到仓契约 | 状态、枚举、权限、事件、错误码和快照模型 | P0 | 待开始 | 0% | 部分 | - | 客户订单契约 | 待分配 | 待排期 | 待排期 | 按已确认到仓规则建设 | | P2-BASE-02 | P2-M0 | 公共 | 数据模型 | 到仓单、批次、处理单元、标签、测量、差异、库位、位置、费用和审计 | P0 | 待开始 | 0% | 部分 | - | P2-BASE-01 | 待分配 | 待排期 | 待排期 | 不包含后续财务对象 | | P2-ADM-01 | P2-M1 | 后台 | 到仓列表 | 查询、筛选、分页、详情、空态和异常态 | P0 | 待开始 | 0% | 较完整 | - | P2-BASE-01 | 待分配 | 待排期 | 待排期 | 后台原型可参考 | | P2-ADM-02 | P2-M1 | 后台 | 预约结果 | 记录、调整和取消线下预约结果 | P0 | 待开始 | 0% | 部分 | - | P2-ADM-01 | 待分配 | 待排期 | 待排期 | 不建设容量调度和自动分配 | @@ -55,7 +55,7 @@ | P2-HOLD-01 | P2-M3 | 公共 | 异常记录 | 非差异类异常、责任人、证据、处理结果和审计 | P1 | 待开始 | 0% | 部分 | - | P2-BASE-02 | 待分配 | 待排期 | 待排期 | 不建设隔离区或差异暂停 | | P2-LOC-01 | P2-M4 | 后台 | 库位维护 | 库区、库位编码、状态和权限范围 | P0 | 待开始 | 0% | 较完整 | - | P2-BASE-02 | 待分配 | 待排期 | 待排期 | 不做容量校验 | | P2-PUT-01 | P2-M4 | 后台 | 上架任务 | 创建、分配、拆分、异常和完成 | P0 | 待开始 | 0% | 较完整 | - | P2-LOC-01、P2-WH-02 | 待分配 | 待排期 | 待排期 | 不做隔离上架 | -| P2-POS-01 | P2-M4 | 公共 | 位置记录 | 处理单元当前位置和进入/移出历史 | P0 | 待开始 | 0% | 部分 | - | P2-PUT-01 | 待分配 | 待排期 | 待排期 | 二期不建设完整库存系统 | +| P2-POS-01 | P2-M4 | 公共 | 位置记录 | 处理单元当前位置和进入/移出历史 | P0 | 待开始 | 0% | 部分 | - | P2-PUT-01 | 待分配 | 待排期 | 待排期 | 入库测量与计费不建设完整库存系统 | | P2-SEC-01 | P2-M0 | 公共 | 文件与保留 | 文件鉴权、类型/安全校验、访问审计、永久保存和备份边界 | P0 | 待开始 | 0% | 无 | - | P2-WH-01 | 待分配 | 待排期 | 待排期 | 产品不设业务大小上限 | | P2-TIME-01 | P2-M6 | 公共 | 时间线通知 | 对客事件、差异通知和失败补偿记录 | P1 | 待开始 | 0% | 部分 | - | 核心流程完成 | 待分配 | 待排期 | 待排期 | 外部通知渠道另行配置 | | P2-FEE-01 | P2-M5 | 后台 | 费用项目 | 头程费用项目、单位、币种、税务属性和启停 | P0 | 需求确认中 | 0% | 较完整 | Q14 | P2-BASE-01 | 待分配 | 待排期 | 待排期 | 仅头程费用白名单 | @@ -69,7 +69,7 @@ | 里程碑 | 交付目标 | 状态 | 开发进度 | 进入条件 | 计划完成 | |---|---|---|---:|---|---| -| P2-M0 规则锁定 | 到仓契约、数据关系、权限和文件基线 | 待开始 | 0% | 一期订单及基础资料契约稳定 | 待排期 | +| P2-M0 规则锁定 | 到仓契约、数据关系、权限和文件基线 | 待开始 | 0% | 客户订单及基础资料契约稳定 | 待排期 | | P2-M1 到仓预报 | 取货/送货预报和线下预约结果可记录 | 待开始 | 0% | 收货仓 API 可用 | 待排期 | | P2-M2 到仓收货 | 签到、分批收货、标签、照片和冲正可追溯 | 待开始 | 0% | 文件服务、仓库权限及标签设备可用 | 待排期 | | P2-M3 测量差异 | 原始测量、三位向上取整、差异记录和通知可用 | 待开始 | 0% | 测量规则可用 | 待排期 | @@ -79,7 +79,7 @@ ## 五、原型映射与范围边界 -| 流程/能力 | 原型覆盖 | 二期任务 | 二期处理 | +| 流程/能力 | 原型覆盖 | 入库测量与计费任务 | 入库测量与计费处理 | |---|---|---|---| | 取货/送货预报 | 部分 | P2-ADM-02、P2-CLI-01 | 记录线下预约结果,不做容量调度 | | 到仓收货 | 部分 | P2-WH-01、P2-REV-01 | 分批收货和冲正;不建设无预报认领 | @@ -88,19 +88,19 @@ | 指定库位 | 较完整 | P2-LOC-01、P2-PUT-01、P2-POS-01 | 不做容量校验和隔离区 | | 标签打印 | 部分 | P2-LABEL-01 | 使用佳博 1324D 实机适配 | | 头程费用 | 部分 | P2-FEE-01、P2-RATE-01、P2-CALC-01、P2-FEE-02 | 只做费用项目、规则、试算、调整和明细 | -| 应收应付、对账、收付款、核销 | 原型存在 | - | 不纳入二期 | -| 发票、汇率结算、利润和财务报表 | 原型存在 | - | 不纳入二期 | -| PDA | 有“03 出仓”原型 | - | Q9 暂缓,二期不接 PDA | -| 完整库存/WMS | 原型存在 | - | 二期只维护处理单元位置记录 | +| 应收应付、对账、收付款、核销 | 原型存在 | - | 不纳入入库测量与计费 | +| 发票、汇率结算、利润和财务报表 | 原型存在 | - | 不纳入入库测量与计费 | +| PDA | 有“03 出仓”原型 | - | Q9 暂缓,入库测量与计费不接 PDA | +| 完整库存/WMS | 原型存在 | - | 入库测量与计费只维护处理单元位置记录 | ## 六、需求确认进度 | 状态 | 数量 | 编号 | 说明 | |---|---:|---|---| | 已确认 | 12 | Q1-Q8、Q10-Q13 | 到仓规则和“仅头程计费”已进入基线 | -| 暂缓 | 1 | Q9 | 二期不接 PDA | +| 暂缓 | 1 | Q9 | 入库测量与计费不接 PDA | | 待确认 | 3 | Q14-Q16 | 费用白名单、计费复杂度、费用生成节点 | -| 不纳入二期 | 8 | Q17-Q24 | 后续财务与结算能力 | +| 不纳入入库测量与计费 | 8 | Q17-Q24 | 后续财务与结算能力 | ## 七、测试与验收重点 @@ -121,4 +121,4 @@ - 原型覆盖统一使用:较完整、部分、无、不适用;原型覆盖不得换算为开发进度。 - 负责人、计划开始和计划完成由排期会议填写;未获得实际数据时保持“待分配/待排期”。 - 开始编码后才能填写大于 0% 的开发进度;开发、测试和验收完成后才能标记“已完成”。 -- 需求结论先回写 [二期需求确认清单](二期需求确认清单.md),再同步本表、开发规划、任务依赖和验收标准。 +- 需求结论先回写 [入库测量与计费需求确认清单](入库测量与计费需求确认清单.md),再同步本表、开发规划、任务依赖和验收标准。 diff --git a/二期/二期计费财务模块规划.md b/入库测量与计费/入库测量与计费计费财务模块规划.md similarity index 83% rename from 二期/二期计费财务模块规划.md rename to 入库测量与计费/入库测量与计费计费财务模块规划.md index 4e32237..6ca3e93 100644 --- a/二期/二期计费财务模块规划.md +++ b/入库测量与计费/入库测量与计费计费财务模块规划.md @@ -1,15 +1,15 @@ -# 虫虫出海二期头程计费模块规划 +# 虫虫出海入库测量与计费头程计费模块规划 -> 创建日期:2026-07-28 -> 更新日期:2026-07-31 -> 状态:产品已确认范围,计费规则细节确认中 -> 历史文件名保留:`二期计费财务模块规划.md` -> 关联规划:[二期开发规划](二期开发规划.md) -> 产品确认记录:[2026-07-31 二期产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md) +> 创建日期:2026-07-28 +> 更新日期:2026-07-31 +> 状态:产品已确认范围,计费规则细节确认中 +> 历史文件名保留:`入库测量与计费计费财务模块规划.md` +> 关联规划:[入库测量与计费开发规划](入库测量与计费开发规划.md) +> 产品确认记录:[2026-07-31 入库测量与计费产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md) ## 一、产品确认的范围结论 -二期只做头程业务的费用计算,不建设后续财务闭环。计费结果是头程订单的业务费用明细,不自动形成应收、应付、账单、付款、核销、发票或利润数据。 +入库测量与计费只做头程业务的费用计算,不建设后续财务闭环。计费结果是头程订单的业务费用明细,不自动形成应收、应付、账单、付款、核销、发票或利润数据。 ```text 头程订单 / 到仓实测 / 业务事件 @@ -23,7 +23,7 @@ 头程费用明细确认 ``` -## 二、二期纳入范围 +## 二、入库测量与计费纳入范围 ### 1. 头程费用项目 @@ -63,7 +63,7 @@ 费用项目、规则发布、试算、人工补录、调整、确认、作废和导出均需记录审计日志。 -## 三、二期明确不纳入 +## 三、入库测量与计费明确不纳入 - 应收、应付台账及账龄。 - 客户或供应商对账单、结算周期、账单确认和争议处理。 @@ -73,7 +73,7 @@ - 在线支付、银企直连、银行流水自动认领。 - 会计科目、会计凭证、总账和法定财务报表。 -原型中的上述页面仅作为后续阶段参考,不进入二期任务、排期或验收。 +原型中的上述页面仅作为后续阶段参考,不进入入库测量与计费任务、排期或验收。 ## 四、核心数据对象 @@ -104,7 +104,7 @@ | P2-Q15 | 计费规则维度,以及是否支持阶梯价、最低收费、封顶、组合价和冲突优先级 | 回传中的“63”无业务含义,未合并 | | P2-Q16 | 各类费用在哪个节点试算、生成、确认和作废,人工费用何时生效 | 回传中的“63”无业务含义,未合并 | -P2-Q13 已确认:二期只做到头程费用计算。P2-Q17 至 P2-Q24 对应的应收应付、对账、收付款、发票、汇率结算和利润能力不适用于二期。 +P2-Q13 已确认:入库测量与计费只做到头程费用计算。P2-Q17 至 P2-Q24 对应的应收应付、对账、收付款、发票、汇率结算和利润能力不适用于入库测量与计费。 ## 七、验收重点 diff --git a/二期/二期计费财务需求确认表.md b/入库测量与计费/入库测量与计费计费财务需求确认表.md similarity index 54% rename from 二期/二期计费财务需求确认表.md rename to 入库测量与计费/入库测量与计费计费财务需求确认表.md index 2101d4d..14e9eb1 100644 --- a/二期/二期计费财务需求确认表.md +++ b/入库测量与计费/入库测量与计费计费财务需求确认表.md @@ -1,15 +1,15 @@ -# 二期头程计费需求确认表 +# 入库测量与计费头程计费需求确认表 -> 更新日期:2026-07-31 -> 状态:产品已确认二期只做头程计费,当前仅剩 3 项计费细节待确认 -> 历史文件名保留:`二期计费财务需求确认表.md` -> 关联文档:[二期头程计费模块规划](二期计费财务模块规划.md)、[产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md) +> 更新日期:2026-07-31 +> 状态:产品已确认入库测量与计费只做头程计费,当前仅剩 3 项计费细节待确认 +> 历史文件名保留:`入库测量与计费计费财务需求确认表.md` +> 关联文档:[入库测量与计费头程计费模块规划](入库测量与计费计费财务模块规划.md)、[产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md) ## 一、已确认的范围 -| 编号 | 产品结论 | 二期开发口径 | 状态 | +| 编号 | 产品结论 | 入库测量与计费开发口径 | 状态 | |---|---|---|---| -| P2-Q13 | 二期只做头程计费 | 建设头程费用项目、计费规则、费用试算、人工补录、调整、确认、作废和费用明细 | 已确认 | +| P2-Q13 | 入库测量与计费只做头程计费 | 建设头程费用项目、计费规则、费用试算、人工补录、调整、确认、作废和费用明细 | 已确认 | 头程费用结果不自动形成应收、应付、对账单、收付款、核销、发票、利润或总账数据。 @@ -29,24 +29,24 @@ |---|---|---|---|---|---|---|---|---| | 待填写 | 待填写 | 待填写 | 待填写 | CNY | 待填写 | 待填写 | 待填写 | 待填写 | -## 三、明确不纳入二期 +## 三、明确不纳入入库测量与计费 -| 编号 | 主题 | 二期处理 | +| 编号 | 主题 | 入库测量与计费处理 | |---|---|---| -| P2-Q17 | 汇率结算和本位币折算 | 不纳入二期 | -| P2-Q18 | 财务税务结算口径 | 不纳入二期;费用项目如需税率字段,按 Q14 配置 | -| P2-Q19 | 财务费用审批、应收应付审批 | 不纳入二期;仅保留头程费用调整审计 | -| P2-Q20 | 客户/供应商对账和结算周期 | 不纳入二期 | -| P2-Q21 | 账单确认、争议和关闭 | 不纳入二期 | -| P2-Q22 | 收付款、核销、反核销和银行流水 | 不纳入二期 | -| P2-Q23 | 发票登记和外部开票平台 | 不纳入二期 | -| P2-Q24 | 利润、利润率和财务报表 | 不纳入二期 | +| P2-Q17 | 汇率结算和本位币折算 | 不纳入入库测量与计费 | +| P2-Q18 | 财务税务结算口径 | 不纳入入库测量与计费;费用项目如需税率字段,按 Q14 配置 | +| P2-Q19 | 财务费用审批、应收应付审批 | 不纳入入库测量与计费;仅保留头程费用调整审计 | +| P2-Q20 | 客户/供应商对账和结算周期 | 不纳入入库测量与计费 | +| P2-Q21 | 账单确认、争议和关闭 | 不纳入入库测量与计费 | +| P2-Q22 | 收付款、核销、反核销和银行流水 | 不纳入入库测量与计费 | +| P2-Q23 | 发票登记和外部开票平台 | 不纳入入库测量与计费 | +| P2-Q24 | 利润、利润率和财务报表 | 不纳入入库测量与计费 | ## 四、会议填写规则 - 认可当前建议:将建议复制到“最终结论”,状态改为“已确认”。 - 修改当前建议:填写会议确定的可开发口径,状态改为“已确认”。 -- 暂时无法确定:状态改为“暂缓”,并写清二期临时处理方式。 +- 暂时无法确定:状态改为“暂缓”,并写清入库测量与计费临时处理方式。 - 不需要填写确认人和确认时间。 - 确认后保留本次会议文件,不覆盖产品原始回传;新一轮确认使用新版本文件名。 diff --git a/入库测量与计费/入库测量与计费计费财务需求确认表.xlsx b/入库测量与计费/入库测量与计费计费财务需求确认表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6b90afbdc460017a7abe325c2e8884b71ccd296a GIT binary patch literal 10393 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 形成日期:2026-08-10 > 状态:已确认 > 决策范围:`费用类型.xls` 中 110 条费用类型的数据归属、初始化和存量迁移 -> 关联确认项:[二期 V2 需求确认清单](二期V2需求确认清单.md) C6、[二期头程计费需求确认表](二期计费财务需求确认表.md) P2-Q14 +> 关联确认项:[入库测量与计费 V2 需求确认清单](入库测量与计费V2需求确认清单.md) C6、[入库测量与计费头程计费需求确认表](入库测量与计费计费财务需求确认表.md) P2-Q14 ## 一、最终结论 @@ -11,7 +11,7 @@ - 客户费用明细仍是客户隔离数据,`fl_inbound_fee_detail.tenant_id > 0`;其 `fee_item_id` 直接引用 `tenant_id = 0` 的公共费用项目。 - 不再按客户复制费用项目,不建立“客户 ID + 模板版本”的初始化副本,也不允许用客户级费用项目承接公共定义。 - `tenant_id = 0` 只是平台技术作用域,不增加用户可见的租户层级、租户选择器或租户级运营流程。 -- 本结论只确定费用项目主数据归属。计费单位、币种、税率、自动/人工、触发节点、价格规则和结算范围仍按 C6/P2-Q14 单独确认;110 条公共项目处于 `ACTIVE` 不等于 110 条都自动参与二期计费。 +- 本结论只确定费用项目主数据归属。计费单位、币种、税率、自动/人工、触发节点、价格规则和结算范围仍按 C6/P2-Q14 单独确认;110 条公共项目处于 `ACTIVE` 不等于 110 条都自动参与入库测量与计费计费。 ## 二、源文件核对 diff --git a/二期/二期需求优化版-v2-测量计费入库主流程.md b/入库测量与计费/入库测量与计费需求优化版-v2-测量计费入库主流程.md similarity index 89% rename from 二期/二期需求优化版-v2-测量计费入库主流程.md rename to 入库测量与计费/入库测量与计费需求优化版-v2-测量计费入库主流程.md index 7aaedce..d63d937 100644 --- a/二期/二期需求优化版-v2-测量计费入库主流程.md +++ b/入库测量与计费/入库测量与计费需求优化版-v2-测量计费入库主流程.md @@ -1,22 +1,22 @@ -# 虫虫出海二期需求优化版 V2:测量、计费、托盘入库闭环 +# 虫虫出海入库测量与计费需求优化版 V2:测量、计费、托盘入库闭环 -> 形成日期:2026-08-01 -> 文档状态:待业务审核 -> 依据:二期原型、现有二期需求优化稿及 2026-08-01 新增流程说明 -> 本文只定义二期范围和业务契约,不代表功能已经开发完成。 +> 形成日期:2026-08-01 +> 文档状态:待业务审核 +> 依据:入库测量与计费原型、现有入库测量与计费需求优化稿及 2026-08-01 新增流程说明 +> 本文只定义入库测量与计费范围和业务契约,不代表功能已经开发完成。 -> 主体模型:本文业务数据中的“租户”历史术语与 `tenantId` / `tenant_id` 字段,当前均按客户归属兼容语义理解;产品只有“平台—客户”两级。`tenant_id=0` 是平台身份、RBAC 和平台公共仓储资源技术作用域,客户往来单位、订单、文件和费用使用所属客户 `tenant_id>0`。二期不引入真实租户层。 +> 主体模型:本文业务数据中的“租户”历史术语与 `tenantId` / `tenant_id` 字段,当前均按客户归属兼容语义理解;产品只有“平台—客户”两级。`tenant_id=0` 是平台身份、RBAC 和平台公共仓储资源技术作用域,客户往来单位、订单、文件和费用使用所属客户 `tenant_id>0`。入库测量与计费不引入真实租户层。 -> 技术实现状态更新(2026-08-04):任务 `019fc6f9-8dcf-74e1-bc68-d42f15d7802a` 已完成核心正常主链路开发,并通过本地测试 MySQL 和隔离端口真实 API 回归。产品/业务待确认项仍以第九章和《二期 V2 需求确认清单》为准。 +> 技术实现状态更新(2026-08-04):任务 `019fc6f9-8dcf-74e1-bc68-d42f15d7802a` 已完成核心正常主链路开发,并通过本地测试 MySQL 和隔离端口真实 API 回归。产品/业务待确认项仍以第九章和《入库测量与计费 V2 需求确认清单》为准。 > 订单衔接规则更新(2026-08-07,已确认):草稿不生成入仓码;订单提交进入待审核时立即生成并固定唯一入仓码。平台审核无需先选择承运商;审核通过后才创建正式入库单并沿用该码,承运商可在后续履约或计费前补充。 ## 一、结论 -二期主流程应从原来的“人工测量—测量审核—接收审核—人工计费—填写一个库位”调整为: +入库测量与计费主流程应从原来的“人工测量—测量审核—接收审核—人工计费—填写一个库位”调整为: ```text -一期头程订单提交待审核 +订单与客户头程订单提交待审核 → 生成并固定唯一入仓码 → 平台审核通过(承运商不是审核前置条件) → 创建正式入库单并沿用该入仓码 @@ -32,9 +32,9 @@ → 异步通知客户 ``` -“发送费用给客户”是二期业务完成节点,也是入库成功节点。原方案中的独立“接收审核”不再作为入库前置节点;如页面需要保留,可改名为“入库确认”,其核心动作就是确认费用并完成托盘、库位占用。 +“发送费用给客户”是入库测量与计费业务完成节点,也是入库成功节点。原方案中的独立“接收审核”不再作为入库前置节点;如页面需要保留,可改名为“入库确认”,其核心动作就是确认费用并完成托盘、库位占用。 -二期不新增微服务: +入库测量与计费不新增微服务: - 入库单、测量数据、审核、计费试算和费用快照放在头程服务。 - 托盘基础资料、库位及库位占用放在仓库服务。 @@ -174,7 +174,7 @@ POST /api/platform/inbounds/{inboundId}/weight-results/confirm ### 2.4 FBA 计费范围 -二期只支持 FBA 目的仓计费,不做完整财务、账单、收付款、核销和利润模块。 +入库测量与计费只支持 FBA 目的仓计费,不做完整财务、账单、收付款、核销和利润模块。 计费匹配顺序: @@ -200,7 +200,7 @@ POST /api/platform/inbounds/{inboundId}/weight-results/confirm 基础费用 = 计费体积 × CBM 单价 ``` -其中 `167`、`363` 只是当前业务给出的默认示例,必须配置在客户规则版本中,不得硬编码。金额还可叠加船司价格表中明确配置的附加费;二期头程/FBA 计费不支持阶梯价、组合优惠和复杂表达式。Warehouse 服务中的海外仓客户级天数阶梯仓储费仅为基础资料 CRUD,当前不参与本流程自动计费。 +其中 `167`、`363` 只是当前业务给出的默认示例,必须配置在客户规则版本中,不得硬编码。金额还可叠加船司价格表中明确配置的附加费;入库测量与计费头程/FBA 计费不支持阶梯价、组合优惠和复杂表达式。Warehouse 服务中的海外仓客户级天数阶梯仓储费仅为基础资料 CRUD,当前不参与本流程自动计费。 费用单必须保存以下快照,避免基础资料后续修改影响历史订单: @@ -244,7 +244,7 @@ POST /api/platform/inbounds/{inboundId}/weight-results/confirm 示例:总体积 `20 CBM`,托盘可用容积 `2 CBM`,需要 `10` 个托盘;默认一个托盘绑定一个库位,因此需要占用 `10` 个库位。若总体积为 `20.1 CBM`,则需要 `11` 个托盘,最后一个托盘保存剩余分配体积。 -注意:业务含义应是“10 个托盘分别绑定 10 个库位”,不是“一个托盘同时绑定 10 个库位”。如果实际仓库允许同一库位存多个托盘,后续再增加库位容量模型;二期默认一托一位,以避免占用口径不清。 +注意:业务含义应是“10 个托盘分别绑定 10 个库位”,不是“一个托盘同时绑定 10 个库位”。如果实际仓库允许同一库位存多个托盘,后续再增加库位容量模型;入库测量与计费默认一托一位,以避免占用口径不清。 拆分规则: @@ -280,13 +280,13 @@ POST /api/platform/inbounds/{inboundId}/weight-results/confirm ## 四、服务与数据边界 -| 服务 | 二期职责 | 主要新增数据 | +| 服务 | 入库测量与计费职责 | 主要新增数据 | |---|---|---| | 头程服务 | 入库单、第三方测量接入、OCR 结果业务管理、测量审核、计费匹配、费用快照、入库编排 | 入库单、测量批次/明细、OCR 重量结果、审核记录、客户规则、船司价格、费用快照、托盘分配引用 | | 仓库服务 | 托盘资料、库位资料、可用库位查询、预占/确认/释放 | 托盘、库位、库位占用、预占记录 | | 文件服务 | 称重图片、测量图片和附件 | 文件元数据和对象存储引用 | | 事件桥接服务 | 客户通知的可靠投递 | Outbox 消费记录、通知结果 | -| IAM | 客户归属、企业、仓库范围和按钮权限 | 新增二期权限资源,不新增业务数据 | +| IAM | 客户归属、企业、仓库范围和按钮权限 | 新增入库测量与计费权限资源,不新增业务数据 | 头程与仓库分库,不能依赖跨库事务。采用“仓库库位预占 → 头程确认入库 → 仓库确认占用”的幂等 Saga;补偿只释放仍处于预占状态的库位,已经完成实物入库的记录不得被通知失败反向释放。 @@ -340,7 +340,7 @@ POST /internal/location-reservations/{reservationNo}/release - 测量视频。 - 单票导出。 -## 七、二期开发任务重排 +## 七、入库测量与计费开发任务重排 | ID | 模块 | 交付内容 | 优先级 | |---|---|---|---| @@ -362,7 +362,7 @@ POST /internal/location-reservations/{reservationNo}/release ### 8.1 正常流程 -1. 一期订单提交待审核时生成唯一入仓码,审核通过后创建正式入库单并沿用该码。 +1. 客户订单提交待审核时生成唯一入仓码,审核通过后创建正式入库单并沿用该码。 2. 第三方用入仓码回传多条长宽高,同一事件重复回传不产生重复数据。 3. 操作员上传多张称重图片,OCR 识别后可逐条修正,系统正确累加 KG。 4. 审核员通过测量,系统按客户规则、船司、FBA 目的仓匹配唯一有效价格。 @@ -384,23 +384,23 @@ POST /internal/location-reservations/{reservationNo}/release ## 九、仍需业务最终确认的事项 1. 包税是否固定采用 `CBM × 167` 转 KG,不包税是否固定采用 `KG ÷ 363` 转 CBM;不同客户能否配置不同系数。 -2. “根据客户规则然后根据船司计算”是只生成客户应收费用,还是同时保存船司成本。本文默认二期只向客户发送应收费用,船司价格作为计价基础,不进入应付和利润闭环。 +2. “根据客户规则然后根据船司计算”是只生成客户应收费用,还是同时保存船司成本。本文默认入库测量与计费只向客户发送应收费用,船司价格作为计价基础,不进入应付和利润闭环。 3. 船司价格唯一匹配所需维度是否就是:起运仓、渠道/类型、船司、FBA 目的仓和有效期。 4. 托盘是否始终一托一库位。本文按一托一位设计;若一个库位可放多个托盘,需要补充库位容积、承重和剩余容量规则。 -5. 托盘分配是只按体积平均拆分,还是还要拆到具体 SKU/箱数。本文二期只分配体积和箱数汇总,不做完整 SKU 库存。 +5. 托盘分配是只按体积平均拆分,还是还要拆到具体 SKU/箱数。本文入库测量与计费只分配体积和箱数汇总,不做完整 SKU 库存。 6. 点击发送费用前是否还需要第二人复核。本文默认测量审核完成后由有发送权限的操作员确认,不再增加独立接收审核。 7. OCR 服务商、图片格式、单图大小、识别时限和失败重试次数需要在技术接入前确定。 ## 十、本次相对上一版的变更 -- 第三方长宽高测量从“不纳入”改为二期 P0,并定义按入仓码接入的开放接口。 -- OCR 称重从“不纳入”改为二期 P0,支持多图累加和人工修正。 +- 第三方长宽高测量从“不纳入”改为入库测量与计费 P0,并定义按入仓码接入的开放接口。 +- OCR 称重从“不纳入”改为入库测量与计费 P0,支持多图累加和人工修正。 - 人工简单计费改为客户规则加船司 FBA 目的仓自动试算。 - 新增 KG/CBM 换算取大和费用规则/价格快照。 - 新增 Nacos 审核失败异常放行开关,默认关闭。 - 原“接收审核通过即入库”改为“发送费用给客户即入库成功”。 - 原“只填一个库位”改为按托盘容积向上拆分,并一托一位占用库位。 -- 托盘管理从“不纳入”改为二期必要基础能力,但不扩展为完整 WMS。 +- 托盘管理从“不纳入”改为入库测量与计费必要基础能力,但不扩展为完整 WMS。 ## 十一、实现与验收状态(2026-08-04) diff --git a/二期/二期需求优化版-原型对照.md b/入库测量与计费/入库测量与计费需求优化版-原型对照.md similarity index 84% rename from 二期/二期需求优化版-原型对照.md rename to 入库测量与计费/入库测量与计费需求优化版-原型对照.md index 7ac6f28..cbddd97 100644 --- a/二期/二期需求优化版-原型对照.md +++ b/入库测量与计费/入库测量与计费需求优化版-原型对照.md @@ -1,15 +1,15 @@ -# 虫虫出海二期需求优化版:头程入库测量闭环 +# 虫虫出海入库测量与计费需求优化版:头程入库测量闭环 -> 形成日期:2026-08-01 -> 需求依据:`D:\docs\悦` 原型、WMS 文档、头程物流流程图及现有二期文档 -> 优化原则:以实际原型可见流程为主,优先复用一期订单与现有微服务,不建设当前业务不需要的完整 WMS 和计费平台。 +> 形成日期:2026-08-01 +> 需求依据:`D:\docs\悦` 原型、WMS 文档、头程物流流程图及现有入库测量与计费文档 +> 优化原则:以实际原型可见流程为主,优先复用客户订单与现有微服务,不建设当前业务不需要的完整 WMS 和计费平台。 ## 一、优化结论 -二期主目标收缩为:一期头程订单提交后,后台能够完成入库单查看、实际测量、测量审核、接收审核,并记录简单库位和头程费用。 +入库测量与计费主目标收缩为:订单与客户头程订单提交后,后台能够完成入库单查看、实际测量、测量审核、接收审核,并记录简单库位和头程费用。 ```text -一期头程订单 +订单与客户头程订单 → 入库单列表/详情 → 录入实际测量数据与图片 → 测量审核 @@ -20,11 +20,11 @@ 不再单独建设到仓预约单、分批收货、处理单元、上架任务、位置历史和自动计费引擎。 -## 二、二期纳入范围 +## 二、入库测量与计费纳入范围 ### 1. 入库单列表和详情 -- 直接复用一期头程订单生成或展示入库单,不新增“订单—到仓单 1:N”模型。 +- 直接复用订单与客户头程订单生成或展示入库单,不新增“订单—到仓单 1:N”模型。 - 支持按入仓码、订单状态、测量审核状态、费用审核状态、客户、仓库和预计到达时间查询。 - 详情展示基本信息、货物明细、测量数据、费用信息、状态历史和其他信息。 - 其他信息包括快递公司、快递单号、关联文件、备注和客服内部备注。 @@ -60,7 +60,7 @@ - 差异不再建设独立差异单、客户确认、通知补偿和关闭流程。 - 在测量审核页面直接展示原单与实测箱数、重量、体积和材积差值。 - 差异仅用于审核参考和历史记录,不阻塞审核人员主动通过。 -- 原型中的“待客户确认”页签不纳入二期,应删除或改为“测量待审核”。 +- 原型中的“待客户确认”页签不纳入入库测量与计费,应删除或改为“测量待审核”。 ### 6. 库位 @@ -71,7 +71,7 @@ ### 7. 头程费用 -- 只维护二期实际使用的头程费用项目白名单。 +- 只维护入库测量与计费实际使用的头程费用项目白名单。 - 在入库单详情人工新增费用项目、数量、单价、币种、金额和备注。 - 金额由服务端按“数量 × 单价”计算,也允许固定金额。 - 费用状态:草稿、待审核、审核通过、审核不通过、作废。 @@ -82,7 +82,7 @@ ### 8. 文件、打印和导出 - 测量图片和关联文件使用现有文件服务,下载时校验租户和订单权限。 -- 打印唛头复用现有打印服务;二期只要求按入库单打印,不建设处理单元标签生命周期。 +- 打印唛头复用现有打印服务;入库测量与计费只要求按入库单打印,不建设处理单元标签生命周期。 - 单票入库清单导出列为 P1;FBA 流转单、批量 ZIP 和自定义列暂不纳入。 ## 三、状态模型 @@ -97,7 +97,7 @@ | `RECEIVED` | 接收审核通过,完成入库 | | `VOIDED` | 入库单已作废 | -不使用“待客户确认、差异关闭、上架中、上架完成”等二期无实际操作页面的状态。 +不使用“待客户确认、差异关闭、上架中、上架完成”等入库测量与计费无实际操作页面的状态。 ## 四、角色与按钮权限 @@ -126,12 +126,12 @@ | P2-08 | 费用项目 | 头程费用项目白名单和启停 | P0 | | P2-09 | 入库费用 | 人工录入、计算、提交、审核、驳回和作废 | P0 | | P2-10 | 文件与打印 | 测量图片、关联文件、鉴权下载和打印唛头 | P0 | -| P2-11 | 客户端展示 | 在一期订单详情只读展示实测、入库状态和公开费用 | P1 | +| P2-11 | 客户端展示 | 在客户订单详情只读展示实测、入库状态和公开费用 | P1 | | P2-12 | 测试发布 | 权限、越权、状态、重复提交、金额计算、文件和回归测试 | P0 | 原 24 项任务收缩为 12 项,不新增微服务:入库和审核放在头程服务,库位/快递公司继续使用仓库服务,文件与打印复用现有服务。 -## 六、从原型发现但原二期文档覆盖不足 +## 六、从原型发现但原入库测量与计费文档覆盖不足 | 原型内容 | 当前覆盖情况 | 优化处理 | |---|---|---| @@ -140,13 +140,13 @@ | 客户下单/外箱规/实际测量三组对比 | 未完整描述 | 纳入测量详情和审核页 | | 审核不通过及失败原因 | 未完整描述 | 测量和接收审核均必须支持驳回原因 | | 测量视频 | 原文只写照片 | 改为 P1 可选附件 | -| 快递公司、快递单号 | 有一期字段,但未进入二期入库详情 | 纳入“其他信息” | +| 快递公司、快递单号 | 有订单与客户字段,但未进入入库详情 | 纳入“其他信息” | | 关联文件、备注、客服内部备注 | 覆盖不足 | 纳入详情,内部备注不对客户展示 | | 作废、打印唛头、单票导出 | 覆盖不完整 | 作废和打印 P0,单票导出 P1 | | 费用审核状态 | 计费方案过度复杂 | 改为人工费用提交与审核 | | 状态历史 | 有数据对象但没有明确页面 | 详情页只读展示操作时间线 | -## 七、原型存在但二期不纳入 +## 七、原型存在但入库测量与计费不纳入 - 智能装柜、合关报关、配载、船期和 FIST 推送。 - 到仓预约容量、自动服务商分配和多批次收货。 @@ -159,20 +159,20 @@ ### 7.1 海外仓阶梯费用补充边界(2026-08-05) -Warehouse 服务已提供海外仓客户级天数阶梯仓储费的分页、详情、新增、编辑和删除接口。该功能属于基础资料配置,不代表海外仓 WMS 或自动计费已经纳入二期。当前配置不参与入库/FBA 费用计算、费用发送、账单或结算。 +Warehouse 服务已提供海外仓客户级天数阶梯仓储费的分页、详情、新增、编辑和删除接口。该功能属于基础资料配置,不代表海外仓 WMS 或自动计费已经纳入入库测量与计费。当前配置不参与入库/FBA 费用计算、费用发送、账单或结算。 ## 八、仍需产品确认的最少事项 1. 测量审核和接收审核是否必须由不同账号完成。 2. 接收审核不通过后退回到测量环节,还是直接作废入库单。 -3. 二期首批费用项目清单,以及哪些费用允许人工录入。 +3. 入库测量与计费首批费用项目清单,以及哪些费用允许人工录入。 4. 客户端是否展示费用;如果展示,只展示审核通过的费用。 5. “是否扣货/扣货理由”只作为备注字段,还是需要真实业务状态。 6. 测量视频是否保留;建议非必填并放入 P1。 ## 九、验收主流程 -1. 一期审核通过的头程订单出现在后台入库单列表。 +1. 订单与客户审核通过的头程订单出现在后台入库单列表。 2. 测量员录入箱规、重量和体积,上传测量图片并提交。 3. 审核员查看原单与实测对比,驳回时必须填写原因。 4. 测量通过后进入接收审核,接收通过后状态变为已入库。 diff --git a/二期/二期需求确认清单.md b/入库测量与计费/入库测量与计费需求确认清单.md similarity index 58% rename from 二期/二期需求确认清单.md rename to 入库测量与计费/入库测量与计费需求确认清单.md index 4362ee6..bdeb660 100644 --- a/二期/二期需求确认清单.md +++ b/入库测量与计费/入库测量与计费需求确认清单.md @@ -1,18 +1,18 @@ -# 虫虫出海二期需求确认清单:头程到仓与头程计费 +# 虫虫出海入库测量与计费需求确认清单:头程到仓与头程计费 -> 创建日期:2026-07-28 -> 更新日期:2026-07-31 -> 当前状态:产品已确认二期只做头程计费,3 项计费细节待补充 -> 确认范围:头程物流“02 到仓”及头程费用计算 -> 关联规划:[二期开发规划](二期开发规划.md) -> 原型依据:[头程物流流程图](参考资料/头程物流流程图.svg) +> 创建日期:2026-07-28 +> 更新日期:2026-07-31 +> 当前状态:产品已确认入库测量与计费只做头程计费,3 项计费细节待补充 +> 确认范围:头程物流“02 到仓”及头程费用计算 +> 关联规划:[入库测量与计费开发规划](入库测量与计费开发规划.md) +> 原型依据:[头程物流流程图](参考资料/头程物流流程图.svg) > 产品回传:[2026-07-31 产品确认合并记录](产品回传/2026-07-31-产品确认合并记录.md) ## 一、文档用途 -本清单记录二期产品确认结果和仍需补齐的开发规则。产品已确认的结论直接进入基线;仍待确认的事项不得写成不可变的业务默认值,应保持配置化或可替换。二期由单一产品负责人统一确认,不记录确认人和确认时间;项目负责人组织业务、仓库、计费和技术共同补齐可开发结论。 +本清单记录入库测量与计费产品确认结果和仍需补齐的开发规则。产品已确认的结论直接进入基线;仍待确认的事项不得写成不可变的业务默认值,应保持配置化或可替换。入库测量与计费由单一产品负责人统一确认,不记录确认人和确认时间;项目负责人组织业务、仓库、计费和技术共同补齐可开发结论。 -二期财务边界已经确定:只做头程费用项目、计费规则、费用试算和头程费用明细,不做应收应付、对账、付款、核销、发票、汇率结算、利润或总账。 +入库测量与计费财务边界已经确定:只做头程费用项目、计费规则、费用试算和头程费用明细,不做应收应付、对账、付款、核销、发票、汇率结算、利润或总账。 ## 二、确认参与人 @@ -29,7 +29,7 @@ | 编号 | 原型/回传情况 | 本次需要确定 | 当前建议 | 临时结论 | 状态 | |---|---|---|---|---|---| -| P2-Q14 | 费用白名单位置出现“63”占位值,不能作为业务结论 | “02 到仓”首批费用项目、计费单位、币种、税率/税务属性和触发节点 | 只纳入二期实际使用的头程费用;白名单外允许人工补录但必须留痕 | 待填写 | 待确认 | +| P2-Q14 | 费用白名单位置出现“63”占位值,不能作为业务结论 | “02 到仓”首批费用项目、计费单位、币种、税率/税务属性和触发节点 | 只纳入入库测量与计费实际使用的头程费用;白名单外允许人工补录但必须留痕 | 待填写 | 待确认 | | P2-Q15 | 计费规则复杂度位置出现“63”占位值,不能作为业务结论 | 计费维度,以及是否支持阶梯价、最低收费、封顶、组合价和冲突优先级 | 先支持客户、往来单位、仓库、服务类型和生效区间;复杂结构按业务需要裁剪 | 待填写 | 待确认 | | P2-Q16 | 费用生成节点位置出现“63”占位值,不能作为业务结论 | 实测、差异、上架和人工费用分别在哪个节点试算、生成、确认和作废 | 实测完成生成试算;其他费用按已确认头程业务事件生成;来源键保证幂等 | 待填写 | 待确认 | @@ -41,7 +41,7 @@ ## 四、已确认的到仓作业结论 -| 编号 | 产品结论 | 二期开发口径 | 状态 | +| 编号 | 产品结论 | 入库测量与计费开发口径 | 状态 | |---|---|---|---| | P2-Q1 | 以实际货物重量、体积为准 | 收货实测结果作为后续作业和头程计费输入 | 已确认 | | P2-Q2 | 不走系统服务商调度,取货安排线下完成 | 系统记录到仓结果,不建设服务商调度闭环 | 已确认 | @@ -51,26 +51,26 @@ | P2-Q6 | 不考虑隔离区 | 不建设独立隔离区和隔离释放流程 | 已确认 | | P2-Q7 | 当前不做库位容量校验 | 不做容量强校验,但校验库位停用和状态合法性 | 已确认 | | P2-Q8 | 称重、测量照片必传,大小不限制 | 必传照片;保留可配置技术安全上限、类型校验和访问审计 | 已确认 | -| P2-Q9 | 暂缓 PDA | 二期使用后台或响应式作业页,不接 PDA | 暂缓 | +| P2-Q9 | 暂缓 PDA | 入库测量与计费使用后台或响应式作业页,不接 PDA | 暂缓 | | P2-Q10 | 不考虑无预报货物场景 | 不建设无预报货物认领和正式订单绑定流程 | 已确认 | | P2-Q11 | 永久保存 | 业务记录不自动删除;运维另行制定存储、备份和合规处理策略 | 已确认 | | P2-Q12 | 使用佳博 1324D 热敏标签打印机 | 纸张、连接、驱动和指令协议在开发前实机核验 | 已确认 | ## 五、已确认的头程计费范围 -| 编号 | 产品结论 | 二期处理 | +| 编号 | 产品结论 | 入库测量与计费处理 | |---|---|---| -| P2-Q13 | 二期只做头程计费 | 只建设费用项目、计费规则、费用试算、调整、确认和头程费用明细 | -| P2-Q17 | 不进入二期 | 不建设汇率结算和本位币折算 | -| P2-Q18 | 不进入二期 | 不建设财务税务结算口径;费用项目如需税率字段,按 Q14 配置即可 | -| P2-Q19 | 不进入二期 | 不建设财务费用审核、应收应付审核或会计审计链;保留头程费用调整审计 | -| P2-Q20 | 不进入二期 | 不建设客户/供应商对账和结算周期 | -| P2-Q21 | 不进入二期 | 不建设账单确认、争议和关闭流程 | -| P2-Q22 | 不进入二期 | 不建设收付款、核销、反核销和银行自动认领 | -| P2-Q23 | 不进入二期 | 不建设发票登记和外部开票平台 | -| P2-Q24 | 不进入二期 | 不建设利润、利润率和财务报表 | +| P2-Q13 | 入库测量与计费只做头程计费 | 只建设费用项目、计费规则、费用试算、调整、确认和头程费用明细 | +| P2-Q17 | 不进入入库测量与计费 | 不建设汇率结算和本位币折算 | +| P2-Q18 | 不进入入库测量与计费 | 不建设财务税务结算口径;费用项目如需税率字段,按 Q14 配置即可 | +| P2-Q19 | 不进入入库测量与计费 | 不建设财务费用审核、应收应付审核或会计审计链;保留头程费用调整审计 | +| P2-Q20 | 不进入入库测量与计费 | 不建设客户/供应商对账和结算周期 | +| P2-Q21 | 不进入入库测量与计费 | 不建设账单确认、争议和关闭流程 | +| P2-Q22 | 不进入入库测量与计费 | 不建设收付款、核销、反核销和银行自动认领 | +| P2-Q23 | 不进入入库测量与计费 | 不建设发票登记和外部开票平台 | +| P2-Q24 | 不进入入库测量与计费 | 不建设利润、利润率和财务报表 | -原型中对应的完整财务页面不自动进入二期,后续阶段如需建设,另行立项确认。 +原型中对应的完整财务页面不自动进入入库测量与计费,后续阶段如需建设,另行立项确认。 ## 六、全量状态跟踪 @@ -88,26 +88,26 @@ | P2-Q10 | P0 | 无预报货物 | 已确认 | | P2-Q11 | P0 | 数据保存 | 已确认 | | P2-Q12 | P0 | 标签设备 | 已确认 | -| P2-Q13 | P0 | 二期财务范围 | 已确认 | +| P2-Q13 | P0 | 入库测量与计费财务范围 | 已确认 | | P2-Q14 | P0 | 首批费用项目 | 待确认 | | P2-Q15 | P0 | 计费规则复杂度 | 待确认 | | P2-Q16 | P0 | 费用生成节点 | 待确认 | -| P2-Q17 | P0 | 汇率结算 | 不纳入二期 | -| P2-Q18 | P0 | 财务税务结算 | 不纳入二期 | -| P2-Q19 | P0 | 财务费用审批 | 不纳入二期 | -| P2-Q20 | P0 | 对账周期 | 不纳入二期 | -| P2-Q21 | P0 | 账单确认争议 | 不纳入二期 | -| P2-Q22 | P0 | 收付款核销 | 不纳入二期 | -| P2-Q23 | P1 | 发票管理 | 不纳入二期 | -| P2-Q24 | P1 | 利润报表 | 不纳入二期 | +| P2-Q17 | P0 | 汇率结算 | 不纳入入库测量与计费 | +| P2-Q18 | P0 | 财务税务结算 | 不纳入入库测量与计费 | +| P2-Q19 | P0 | 财务费用审批 | 不纳入入库测量与计费 | +| P2-Q20 | P0 | 对账周期 | 不纳入入库测量与计费 | +| P2-Q21 | P0 | 账单确认争议 | 不纳入入库测量与计费 | +| P2-Q22 | P0 | 收付款核销 | 不纳入入库测量与计费 | +| P2-Q23 | P1 | 发票管理 | 不纳入入库测量与计费 | +| P2-Q24 | P1 | 利润报表 | 不纳入入库测量与计费 | ## 七、确认完成标准 -P2-Q14 至 P2-Q16 形成可开发结论后,头程计费模块可以进入正式任务拆分和开发验收。后续需求变化按变更流程处理,不得将应收应付、对账、付款、核销、发票或利润功能默认带入二期。 +P2-Q14 至 P2-Q16 形成可开发结论后,头程计费模块可以进入正式任务拆分和开发验收。后续需求变化按变更流程处理,不得将应收应付、对账、付款、核销、发票或利润功能默认带入入库测量与计费。 确认完成后需要同步: -- 二期头程计费模块规划。 -- 二期开发规划和开发进度表。 +- 入库测量与计费头程计费模块规划。 +- 入库测量与计费开发规划和开发进度表。 - 头程计费任务依赖、数据对象和验收标准。 -- 二期会议确认 Excel 及产品回传归档记录。 +- 入库测量与计费会议确认 Excel 及产品回传归档记录。 diff --git a/入库测量与计费/入库测量与计费需求确认清单.xlsx b/入库测量与计费/入库测量与计费需求确认清单.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c2aa8797fbdd150ef94ac5dd1fc63614c9e44c5b GIT binary patch literal 12844 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 R0D$=Vj(FAisQ15q{Xf);tET_} literal 0 HcmV?d00001 diff --git a/二期/参考资料/头程物流流程图.svg b/入库测量与计费/参考资料/头程物流流程图.svg similarity index 100% rename from 二期/参考资料/头程物流流程图.svg rename to 入库测量与计费/参考资料/头程物流流程图.svg diff --git a/二期/海外仓阶梯费用前端联调说明-2026-08-05.md b/入库测量与计费/海外仓阶梯费用前端联调说明-2026-08-05.md similarity index 100% rename from 二期/海外仓阶梯费用前端联调说明-2026-08-05.md rename to 入库测量与计费/海外仓阶梯费用前端联调说明-2026-08-05.md diff --git a/入库测量与计费/版本归档/2026-07-28-覆盖前-入库测量与计费开发进度表.xlsx b/入库测量与计费/版本归档/2026-07-28-覆盖前-入库测量与计费开发进度表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9fbf83c0e910d354f07e6368c385e4f9299e2205 GIT binary patch literal 23927 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%0AWO&-x_%4gL0dp1bKwZa(U}KbH)1+wL7qk! zB0z9<2oAEVkscTR%4U)bzmF9QB5u4Y>#B^yyWZxp{*V8EYDx>XhMSgOxi9)#-}HZR z?Ecr6=aaZAw<87K82R7; zr5S|1%A2_9xdyiw;sVjKnq8uZl=C>kQOaNXCWxH?}-+ zu2hhHxfJo_8Hl$BTg)g7Hjp8Vs`NS5d5m-EP|RVWW`94D;&gI~6=k2H~9FvoA^B+!ELtXf0uzp&3YM)E;cXM>%z)|1bZ!X|Z%@AM)|K9v}epCbG zQQWcMre3(62l2fl;@(kH#|MmDKTcj%Kd;(7?h6BRsMcOBm?K(}%F;qrbL7+7PkA37 zVj@Br*&}*J@#SlKx@Tg}ZaOB4P`mrb3M?kGl0Ro0|73794PqlusJr4T>7OUC z_x_d99`KV~PqEDN6glReEkabRSjn+7tNlOfahR+%|DON)ZHNEgep}Z6+#R|#t(6ZX z(7&n6z42hs1)IQHapv7hCd%_ie9S9ew7~*Pz##0y3qN30=%~UkeNu2;hNNw)�)t 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 SL?k3)`0XD2KU(cyul@zvr!Z0g literal 0 HcmV?d00001 diff --git a/二期/第三方入仓测量接口联调说明-2026-08-04.md b/入库测量与计费/第三方入仓测量接口联调说明-2026-08-04.md similarity index 97% rename from 二期/第三方入仓测量接口联调说明-2026-08-04.md rename to 入库测量与计费/第三方入仓测量接口联调说明-2026-08-04.md index 10b744b..77950b2 100644 --- a/二期/第三方入仓测量接口联调说明-2026-08-04.md +++ b/入库测量与计费/第三方入仓测量接口联调说明-2026-08-04.md @@ -184,10 +184,10 @@ GET 同样需要 `X-App-Key`、`X-Timestamp`、`X-Nonce` 和 `X-Signature`,不 firstleg/src/main/resources/db/phase2-third-party-single-measurement-migration.sql ``` -或执行已内联该增量的二期统一脚本: +或执行已内联该增量的入库测量与计费统一脚本: ```text -deploy/sql/2026-08-04-二期入库新增表字段-MySQL8一键执行.sql +deploy/sql/2026-08-04-入库新增表字段-MySQL8一键执行.sql ``` 同时确认 Firstleg、Order、File 使用一致的 `INTERNAL_SERVICE_TOKEN`,并配置 `ORDER_SERVICE_URL`、`FILE_SERVICE_URL` 或启用 Nacos 服务发现。 diff --git a/入库测量与计费/虫虫出海入库测量与计费开发进度表.xlsx b/入库测量与计费/虫虫出海入库测量与计费开发进度表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0f74b19a85627c77cbb48760ce969f665e4d0933 GIT binary patch literal 23468 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 H!=wKItM)|3 literal 0 HcmV?d00001 diff --git a/国内货柜履约/README.md b/国内货柜履约/README.md new file mode 100644 index 0000000..7fb868c --- /dev/null +++ b/国内货柜履约/README.md @@ -0,0 +1,51 @@ +# 国内货柜履约文档 + +国内货柜履约以国内头程后程作业为范围,完成从排柜、订舱、拖车和仓内拣货,到装柜证据齐全并进入 `LOADED`/装柜完成的业务闭环。`DELIVERED`/派送完成由到达海外仓后的可信回传推进,不属于国内国内货柜履约操作范围。 + +> 范围更正:国内货柜履约只维护订舱和出仓前所需的船名航次、港口、ETD/ETA 等资料。柜子确认离开国内仓库后的 `CarrierScheduleQuery`、六家船公司查询、每 3 天/最多 3 次、来源/过期标识和后续定时船节点查询整体归海外仓业务,见 `../海外仓业务/README.md`。国内货柜履约不再建设或验收这套查询。 + +## 当前主体模型与开工禁令 + +- 国内货柜履约继续按业务单租户、“平台—客户”两级开发,客户之间严格隔离。Java 与接口中的业务 `tenant_id > 0` / `tenantId` 当前表示客户 ID;`tenant_id=0` 是平台身份、平台 RBAC 和平台公共仓库、快递公司、托盘、库位等公共资源技术作用域。客户往来单位、订单、文件和费用仍归属客户 `tenant_id>0`。 +- 国内货柜履约不得新增租户主表、租户选择器、客户所属租户配置、租户切换、租户级 RBAC 或租户级配置,也不得把当前 `tenant_id` 从客户 ID 改义为上级租户 ID。 +- `tenant`、`Tenant*`、`merchant`、接口路径和字段属于历史兼容命名,继续保留;真实租户能力必须等未来独立需求、数据迁移和跨服务契约方案确认后再实施。 + +## 文档 + +- [国内货柜履约闭环审计报告(2026-08-08)](国内货柜履约闭环审计报告-2026-08-08.md):基于当前代码、接口、自动化和测试环境证据的闭环审计,列出阻断项、优先级和 GO 准入标准。 +- [国内货柜履约装柜闭环产品确认表(2026-08-08)](国内货柜履约装柜闭环产品确认表-2026-08-08.md):提供给产品直接填写的纯业务确认表,不包含技术实现细节。 +- [国内货柜履约装柜闭环开发前确认单(2026-08-08)](国内货柜履约装柜闭环开发前确认单-2026-08-08.md):用于产品确认直接开发前的状态、门禁、PDA 取证、冲正和验收细节。 +- [国内货柜履约开发规划:国内出仓](国内货柜履约开发规划.md) +- [国内货柜履约开发进度表](国内货柜履约开发进度表.md):参考订单与客户采用“大任务 → 详细任务 → 里程碑 → 未确认事项 → 开工准入 → 验收”结构维护。 +- [虫虫出海国内货柜履约开发进度表(Excel)](虫虫出海国内货柜履约开发进度表.xlsx):可筛选、可下拉维护并使用公式汇总的项目进度工作簿。 +- [国内货柜履约需求确认表](国内货柜履约需求确认表.md):集中跟踪 P3-Q1~P3-Q13、负责人和最终结论。 +- [国内货柜履约开工门禁](国内货柜履约开工门禁.md):维护已确认范围、跨端硬边界和局部阻断项;模块指引引用本文件,不重复维护阶段状态。 +- [国内货柜履约页面与原型清单](国内货柜履约页面与原型清单.md):按管理后台、企业客户端和 PDA 维护页面范围及原型状态。 +- [国内货柜履约验收任务拆分与待确认清单](国内货柜履约验收任务拆分与待确认清单.md):真实 HTTP/真机验收覆盖、coverageGap 解除条件和并行任务入口。 +- `参考资料/出仓流程.png`:本期 9 个核心动作及业务终点的原始参考图。 + +## 当前状态 + +国内货柜履约已进入分模块部署联调。已确认不新建独立出仓单,现有订单列表/详情承载主状态;支持一单多柜、一个柜拼多个订单,并采用“父订单→子订单→柜次”关系,已装载数量形成子订单,未装载数量自动生成后续子订单。进入 `LOADED`/装柜完成前,订舱完成、拖车完成、报关放行回执、PDA 拣货完成及五类证据完整均为服务端硬门禁;`LOADED` 后错误统一线下人工处理,国内 Admin/PDA 不提供在线冲正或手工推进 `DELIVERED`。当前不能因子链路已通过而宣告整期完成,最终结论以真实 HTTP 全链路验收为准。 + +柜子出仓后的船公司/船节点查询已重新归入海外仓业务。国内货柜履约报关首版不做系统对接,全部由人工整理、线下提交和人工上传回执。仓库初始化角色包括操作员、拣货员、理货员,具体权限矩阵由 IAM 契约任务落表。 + +P3-Q1~P3-Q13 均已确认;P3-Q4 采用 uni-app 开发并支持在线更新,Android 广播扫描已接入。P3-Q5 复用入库测量与计费实时库存、当前位置和可用量接口,不扩展完整 WMS。 + +### PDA 当前确认口径(2026-08-10) + +- Android 扫描广播方式已接入;PDA 采用 uni-app 开发并支持在线更新,按既定发布安排完成真机验收。 +- 正式作业仅支持在线:进入任务即标记“拣货中”,扫描保存在绑定作业员+任务+柜次的设备持久化草稿,点击提交时批量写后端。 +- 允许部分拣货或跳拣,但每个未完成项必须填写异常原因;存在未解决异常时不能完成或进入 `LOADED`。 +- 重复提交返回原结果,版本冲突提示员工刷新重试。 +- PDA 只能现场拍照,Admin 可人工上传;五类证据各至少 1 张有效照片,可同类型多张追加,错图只作废不硬删除。 +- 单柜次只允许一名作业员作业,不做多人并行和任务接管;进入任务即标记“拣货中”,扫描草稿按作业员+任务+柜次隔离,点击提交时批量写入后端。 +- 后台操作员、理货员可按权限人工上传证据;拣货员只负责 PDA 现场拍照,不开放后台人工上传。照片无限期保留,客户不可见照片和锁码。 + +### 发布与真实验收状态(2026-08-10) + +- Admin 已部署 `b593d72`:智能装柜、预装清单、装柜清单均可访问真实接口;预装/装柜清单不再要求选择仓库,详情仍使用列表行返回的真实仓库归属。 +- Firstleg 已部署 `3bfc11a`:修复 PDA 拣货时库位分配状态提前变更的问题;真实复跑仍发现 PDA `pick` 第二处 `S0500`,当前仍阻断 PDA 复核、装柜完成、报关 LOADED 关联和最终门禁,不能标记国内货柜履约闭环完成。 +- 验收 fixture 顺序已核实为 `orders → inbound-measurement → phase3-container-loading → phase3-loading → phase3-customs → phase3-port-schedules → phase3-loading-finalize`;脚本保留真实失败,不以 mock、历史资源或 coverage gap 伪装通过。 +- PDA“点击提交时批量写入后端”的原子 batch 契约尚未实现;当前页面仍不能证明整批事务、批次幂等、服务端库存快照和失败整批回滚已具备。 +- ZIM hCaptcha、COSCO 动态页继续按产品确认的人工兜底保留为 `MANUAL_REQUIRED`,不作为自动查询 PASS。 diff --git a/三期/参考资料/出仓流程.png b/国内货柜履约/参考资料/出仓流程.png similarity index 100% rename from 三期/参考资料/出仓流程.png rename to 国内货柜履约/参考资料/出仓流程.png diff --git a/三期/三期Wave1开发任务卡-2026-08-09.md b/国内货柜履约/国内货柜履约Wave1开发任务卡-2026-08-09.md similarity index 85% rename from 三期/三期Wave1开发任务卡-2026-08-09.md rename to 国内货柜履约/国内货柜履约Wave1开发任务卡-2026-08-09.md index de0c5c9..df503cd 100644 --- a/三期/三期Wave1开发任务卡-2026-08-09.md +++ b/国内货柜履约/国内货柜履约Wave1开发任务卡-2026-08-09.md @@ -1,4 +1,4 @@ -# 三期 Wave 1 开发任务卡 +# 国内货柜履约 Wave 1 开发任务卡 整理日期:2026-08-09 用途:产品确认后用于研发排期和任务分派。 @@ -7,9 +7,9 @@ ## 一、统一范围口径 - 不新增独立出仓单主对象、列表或详情页面。 -- 现有订单是三期唯一主对象;柜次是执行对象。 +- 现有订单是国内货柜履约唯一主对象;柜次是执行对象。 - 订单与柜次通过履约分片/分配关系表达一单多柜、一柜多单和部分履约。 -- 国内三期终点是 `LOADED`/装柜完成;国内端不能手工推进 `DELIVERED`。 +- 国内国内货柜履约终点是 `LOADED`/装柜完成;国内端不能手工推进 `DELIVERED`。 - 五类装柜照片为:空仓、半仓、满仓、锁仓、带锁码照;锁码文本单独保存。 ## 二、第一批可立即开发 @@ -18,9 +18,9 @@ |---|---|---|---|---|---| | W1-BE-01-R | 后端 | 订单-柜次-履约分片契约设计 | 现有 order/firstleg/loading DTO、关系表和 OpenAPI;不得创建 `fl_outbound_order` | 支持多对多关系、快照、版本和客户隔离;形成评审稿 | 产品确认 Q2/Q11 后冻结实现 | | W1-BE-06 | 后端 | 拖车幂等与实际节点修复 | TruckAppointmentService、Controller、Mapper、测试 | 缺少幂等键时拒绝;同键重放返回原结果;冲突返回 409;到仓/离仓时间可追溯 | 无 | -| W1-BE-08 | 后端 | OpenAPI 盘点与集成测试骨架 | 订舱、拖车、排柜、PDA、文件、门禁接口文档和契约测试 | 文档路径与 Controller 一致;建立二期终点到装柜完成的测试骨架 | 仅依赖现有接口 | +| W1-BE-08 | 后端 | OpenAPI 盘点与集成测试骨架 | 订舱、拖车、排柜、PDA、文件、门禁接口文档和契约测试 | 文档路径与 Controller 一致;建立入库测量与计费终点到装柜完成的测试骨架 | 仅依赖现有接口 | | A-01 | Admin | 订舱 DTO、版本和动作权限对齐 | `apps/admin-web/src/modules/ocean-bookings/` | 创建、编辑、提交、确认、放舱、变更、取消均使用真实字段、版本和权限 | 后端现有契约 | -| A-02 | Admin | 订单详情挂载三期作业组件 | `apps/admin-web/src/modules/unified-orders/` | 从订单详情可进入分柜、预装、拣货、装柜;刷新可恢复;错误和无权限有明确提示 | 订单与入库关联字段确认 | +| A-02 | Admin | 订单详情挂载国内货柜履约作业组件 | `apps/admin-web/src/modules/unified-orders/` | 从订单详情可进入分柜、预装、拣货、装柜;刷新可恢复;错误和无权限有明确提示 | 订单与入库关联字段确认 | | PDA-01 | PDA | 五证据槽位和上传队列基础 | `apps/pda-uniapp/pages/` 及文件上传适配 | 五类槽位固定;临时路径不作为业务证据;失败可重试;重复提交不产生重复有效记录 | File 上传接口 | | CLI-01 | Client | 内部证据字段脱敏 | `apps/client-web/src/modules/first-leg/` | Client 不返回、不展示照片、锁码和 `sealNo`;订单状态仍可正常展示 | 后端响应兼容 | diff --git a/三期/三期开发规划.md b/国内货柜履约/国内货柜履约开发规划.md similarity index 79% rename from 三期/三期开发规划.md rename to 国内货柜履约/国内货柜履约开发规划.md index 0fda4a0..28b930a 100644 --- a/三期/三期开发规划.md +++ b/国内货柜履约/国内货柜履约开发规划.md @@ -1,19 +1,19 @@ -# 虫虫出海三期开发规划:国内出仓 +# 虫虫出海国内货柜履约开发规划:国内出仓 > 创建日期:2026-07-28 > 状态:已进入分模块开发规划 -> 流程依据:[出仓流程](参考资料/出仓流程.png)中的头程物流“03 出仓”;用户已于 2026-08-08 确认国内三期以 `LOADED`/装柜完成为阶段终点 -> 前置阶段:[一期文档](../一期/README.md) · [二期文档](../二期/README.md) +> 流程依据:[出仓流程](参考资料/出仓流程.png)中的头程物流“03 出仓”;用户已于 2026-08-08 确认国内国内货柜履约以 `LOADED`/装柜完成为阶段终点 +> 前置阶段:[订单与客户文档](../订单与客户/README.md) · [入库测量与计费文档](../入库测量与计费/README.md) -> 2026-08-10 产品确认版:三期不新建独立出仓单;支持一单多柜、一个柜拼多个订单,采用“父订单→子订单→柜次”关系,已装载数量形成子订单,未装载数量自动生成后续子订单。`LOADED` 硬门禁为订舱完成、拖车完成、报关放行回执、PDA 拣货完成和五类证据完整;`LOADED` 后错误线下人工处理。五类证据各至少 1 张有效照片,同类型多张追加,PDA 仅现场拍照,后台操作员和理货员可人工上传,照片无限期保留且客户不可见。 +> 2026-08-10 产品确认版:国内货柜履约不新建独立出仓单;支持一单多柜、一个柜拼多个订单,采用“父订单→子订单→柜次”关系,已装载数量形成子订单,未装载数量自动生成后续子订单。`LOADED` 硬门禁为订舱完成、拖车完成、报关放行回执、PDA 拣货完成和五类证据完整;`LOADED` 后错误线下人工处理。五类证据各至少 1 张有效照片,同类型多张追加,PDA 仅现场拍照,后台操作员和理货员可人工上传,照片无限期保留且客户不可见。 -> 当前范围更正:原 `P3-PORT-01`、六家船公司官网查询及 `CarrierScheduleQuery` 是柜子确认离开国内仓库后的业务,整体重新归入四期。三期仅保存订舱与出仓前所需的船名航次、港口和 ETD/ETA 等资料,不建设或验收出仓后的定时节点查询。 +> 当前范围更正:原 `P3-PORT-01`、六家船公司官网查询及 `CarrierScheduleQuery` 是柜子确认离开国内仓库后的业务,整体重新归入海外仓业务。国内货柜履约仅保存订舱与出仓前所需的船名航次、港口和 ETD/ETA 等资料,不建设或验收出仓后的定时节点查询。 -> 主体模型与硬约束:三期只实现“平台—客户”两级,业务 `tenant_id > 0` / `tenantId` 当前表示客户 ID;`tenant_id=0` 是平台身份、平台 RBAC 和平台公共仓储资源技术作用域,客户往来单位、订单、文件和费用归属客户 `tenant_id>0`。禁止新增租户主表、租户选择器、客户所属租户配置、租户切换、租户级 RBAC 或租户级配置,禁止把现有 `tenant_id` 改义为上级租户 ID;历史类名、路径和字段继续兼容。 +> 主体模型与硬约束:国内货柜履约只实现“平台—客户”两级,业务 `tenant_id > 0` / `tenantId` 当前表示客户 ID;`tenant_id=0` 是平台身份、平台 RBAC 和平台公共仓储资源技术作用域,客户往来单位、订单、文件和费用归属客户 `tenant_id>0`。禁止新增租户主表、租户选择器、客户所属租户配置、租户切换、租户级 RBAC 或租户级配置,禁止把现有 `tenant_id` 改义为上级租户 ID;历史类名、路径和字段继续兼容。 -## 一、三期目标 +## 一、国内货柜履约目标 -三期承接二期“货物完成到仓、实测、差异处理和指定库位”的结果,将已受理货物转化为可执行、可追踪、可审计的国内出仓任务。 +国内货柜履约承接入库测量与计费“货物完成到仓、实测、差异处理和指定库位”的结果,将已受理货物转化为可执行、可追踪、可审计的国内出仓任务。 流程覆盖九个动作: @@ -26,10 +26,10 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 ↓ 维护订舱与出仓前所需的船名航次、港口和预计时间 ↓ -国内三期完成:`LOADED`/装柜完成 +国内国内货柜履约完成:`LOADED`/装柜完成 ``` -三期完成标准是同一订单/柜次已完成排柜和 PDA 拣货,空仓、半仓、满仓、锁仓、带锁码照五类证据各至少 1 张有效照片已真实上传,锁码文本已保存,服务端门禁通过并将订单推进为 `LOADED`/装柜完成。`DELIVERED`/派送完成必须等货物到达海外仓后由海外仓可信回传推进,不是国内三期人工操作。 +国内货柜履约完成标准是同一订单/柜次已完成排柜和 PDA 拣货,空仓、半仓、满仓、锁仓、带锁码照五类证据各至少 1 张有效照片已真实上传,锁码文本已保存,服务端门禁通过并将订单推进为 `LOADED`/装柜完成。`DELIVERED`/派送完成必须等货物到达海外仓后由海外仓可信回传推进,不是国内国内货柜履约人工操作。 ### 原型动作覆盖 @@ -43,13 +43,13 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 | 6. 客户上传报关资料 | 报关资料协同 | P3-CUS-01 | 已覆盖 | | 7. 整理给到报关代理报关 | 报关资料协同 | P3-CLEAR-01 | 已覆盖 | | 8. 回执上传到系统供客户下载 | 报关回执与客户下载 | P3-CLEAR-01、P3-CUS-02 | 已覆盖,首版由授权人员人工上传放行回执 | -| 9. 出仓后查询港务/船节点 | 四期船节点定时查询 | 原 P3-PORT-01、P3-CUS-02 对应查询部分 | 已重新归入四期,不是三期动作或验收项 | +| 9. 出仓后查询港务/船节点 | 海外仓业务船节点定时查询 | 原 P3-PORT-01、P3-CUS-02 对应查询部分 | 已重新归入海外仓业务,不是国内货柜履约动作或验收项 | ## 二、阶段边界 -### 纳入三期 +### 纳入国内货柜履约 -- 现有订单三期状态、订单-柜次关联、智能排柜建议、人工调整和版本确认。 +- 现有订单国内货柜履约状态、订单-柜次关联、智能排柜建议、人工调整和版本确认。 - 订舱申请、舱位结果,以及出仓前人工确认或业务录入的船名航次、港口、ETD/ETA 等资料快照。 - 预约拖车、车辆司机、到仓装柜和离仓记录。 - PDA 任务领取、扫码拣货、部分拣货、异常、复核和幂等提交。 @@ -58,14 +58,14 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 - 报关回执上传、版本、客户可见范围和授权下载。 - 装柜完成门禁、确认、时间线和站内通知;`LOADED` 后纠错走线下人工流程。 -### 明确不纳入三期 +### 明确不纳入国内货柜履约 -- 入库、上架、移库、盘点、冻结、补货和完整 WMS;拣货仅复用二期实时库存、当前位置和可用量接口。 +- 入库、上架、移库、盘点、冻结、补货和完整 WMS;拣货仅复用入库测量与计费实时库存、当前位置和可用量接口。 - 港区闸口、车队、船公司、海关单一窗口的正式自动化接口。 - GPS 实时跟车、电子铅封、称重设备、摄像头 OCR 和 IoT 自动采集。 - 自动报关、关税计算、退税、完整清关业务和自动单证识别。 - 海上运输、海外清关、目的港提柜、海外仓入库和末端派送。 -- 柜子确认离开国内仓库后的 `CarrierScheduleQuery`、船公司查询、定时船节点和到港跟踪;整体归四期。 +- 柜子确认离开国内仓库后的 `CarrierScheduleQuery`、船公司查询、定时船节点和到港跟踪;整体归海外仓业务。 - 无人工确认的全自动排柜、自动订舱和不可逆业务操作。 ## 三、参与角色与数据边界 @@ -89,14 +89,14 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 原型以 1 至 9 编号表达动作顺序。产品确认后,订舱、拖车、报关放行、PDA 拣货和证据完整是进入 `LOADED` 的强制前置;智能排柜、订舱、拖车和资料整理可按子流程并行,但服务端不得绕过门禁。PDA 单柜次单作业员,不实现多人并行或任务接管。 -### 1. 现有订单的三期主状态 +### 1. 现有订单的国内货柜履约主状态 | 稳定编码 | 中文名称 | 含义 | |---|---|---| -| `WAIT_SPLIT` | 待分柜 | 二期已完成,等待排柜/预装 | +| `WAIT_SPLIT` | 待分柜 | 入库测量与计费已完成,等待排柜/预装 | | `LOADING` | 装柜中 | 预装已确认,PDA 执行拣货和装柜证据上传 | | `LOADED` | 装柜完成 | 订舱、拖车、报关放行回执、PDA 拣货完成,且五类证据各至少 1 张有效照片和锁码文本已通过服务端门禁 | -| `DELIVERED` | 派送完成 | 货物到达海外仓后由海外仓可信回传推进;属于三期之后的只读状态 | +| `DELIVERED` | 派送完成 | 货物到达海外仓后由海外仓可信回传推进;属于国内货柜履约之后的只读状态 | ### 2. 子流程状态 @@ -104,7 +104,7 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 - 拖车:待预约、已预约、车辆已到仓、装柜中、已离仓、改约、已取消。 - 拣货:待分配、待拣货、拣货中、待复核、已完成、异常挂起、已取消。 - 报关:资料待上传、资料待审核、待补件、待提交、已提交代理、回执待上传、回执已上传、已退回、已取消;有效放行回执是 `LOADED` 硬门禁,首版由授权人员人工上传。 -- 出仓前船期资料:待维护、已确认、信息变更;出仓后节点和“已开船”等运输事实归四期。 +- 出仓前船期资料:待维护、已确认、信息变更;出仓后节点和“已开船”等运输事实归海外仓业务。 主状态由服务端根据已确认的必要子流程推进。客户端不得通过传任意目标状态跳过拣货复核、装柜证据或已配置的装柜完成门禁。 @@ -112,7 +112,7 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 ### 1. 现有订单与柜次 -- 不创建独立出仓单,现有订单从 `WAIT_SPLIT` 继续推进三期状态。 +- 不创建独立出仓单,现有订单从 `WAIT_SPLIT` 继续推进国内货柜履约状态。 - 通过“父订单→子订单→柜次”表达一张订单分多柜、多张订单拼柜和拆批;已装载数量形成子订单,未装载数量自动生成后续子订单,子订单必须保留来源订单和数量分摊快照。 - 订单保持用户当前看到的主状态;柜次承载多订单共享的订舱、拖车、装柜证据和船期信息。 - 订单详情展示关联柜次、子流程状态、异常和整体时间线。 @@ -127,11 +127,11 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 ### 3. 订舱与出仓前船期资料 -- 三期只维护订舱和装柜/出仓交接所需的预计开船、到港等静态资料,不执行出仓后的船公司或船节点查询。 +- 国内货柜履约只维护订舱和装柜/出仓交接所需的预计开船、到港等静态资料,不执行出仓后的船公司或船节点查询。 - 船公司/订舱代理、航线、订舱号、船名航次、起运港、目的港、截单、截关、截港、ETD 和 ETA 暂列为候选字段。 - 订舱失败、改船、甩柜、船期延误和取消暂列为候选异常场景,按业务确认结果实现。 -- 六家船公司来源、每 3 天/最多 3 次、最近有效结果和过期标识,以及对应适配层全部移至四期船节点查询维护。 -- 三期页面展示的 ETD/ETA 必须明确为订舱或人工确认快照,不得伪装成出仓后的实时查询结果。 +- 六家船公司来源、每 3 天/最多 3 次、最近有效结果和过期标识,以及对应适配层全部移至海外仓业务船节点查询维护。 +- 国内货柜履约页面展示的 ETD/ETA 必须明确为订舱或人工确认快照,不得伪装成出仓后的实时查询结果。 - 建议关键信息变更保留旧值、新值、原因,并向授权用户发送站内提醒。 ### 4. 预约拖车 @@ -183,14 +183,14 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 - 服务端校验排柜已确认、PDA 拣货已完成、五类证据各至少 1 张有效且未作废的图片已取得真实 `fileId`、锁码文本已保存。 - 门禁通过后仅将订单推进为 `LOADED`/装柜完成,记录柜次、柜号、锁码、操作人、时间和证据版本。 - 该操作必须幂等、乐观锁、完整审计和失败回复,禁止从前端跳过门禁。 -- 装柜完成后发现错误统一线下人工处理;本期不提供在线冲正/回退接口,系统保留原状态、证据和审计记录。 +- 装柜完成后发现错误统一线下人工处理;当前不提供在线冲正/回退接口,系统保留原状态、证据和审计记录。 - `DELIVERED`/派送完成只接受海外仓可信回传,必须有来源身份、签名/防重放、幂等键、请求摘要和审计;国内 Admin/PDA 不提供手工“确认派送完成”操作。 ## 六、核心数据对象 | 数据对象 | 关键内容 | |---|---| -| 现有订单三期投影 | 订单、客户、仓库、三期主状态、关联柜次、子流程摘要和版本 | +| 现有订单国内货柜履约投影 | 订单、客户、仓库、国内货柜履约主状态、关联柜次、子流程摘要和版本 | | 父/子订单关系 | 父订单、子订单、来源柜次、已装载数量、未装载数量和自动生成原因 | | 排柜方案 | 经确认的规则版本、输入快照、柜次、货物分配、规则计算结果和确认记录 | | 柜次 | 柜型、柜号、铅封号、装载顺序、重量、体积和关联订单 | @@ -235,13 +235,13 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 - 最终保证身份、客户归属、仓库数据范围、权限、状态、门禁、幂等、并发和审计。 - 管理出仓、排柜、订舱、拖车、拣货、装柜、报关和时间线的事务边界。 - 文件上传校验类型、大小、内容和权限;使用不可预测标识和授权下载。 -- 三期服务端保存订舱与出仓前船期资料;六家船公司和定时船节点查询由四期负责。车队、海关仍只预留适配层,报关首版全部人工处理,不承诺正式系统对接。 +- 国内货柜履约服务端保存订舱与出仓前船期资料;六家船公司和定时船节点查询由海外仓业务负责。车队、海关仍只预留适配层,报关首版全部人工处理,不承诺正式系统对接。 ## 八、建议里程碑 | 里程碑 | 交付目标 | 进入条件 | |---|---|---| -| P3-M0 规则与设备锁定 | 流程、角色、状态、排柜规则、PDA、文件和验收确认 | 二期到仓契约稳定 | +| P3-M0 规则与设备锁定 | 流程、角色、状态、排柜规则、PDA、文件和验收确认 | 入库测量与计费到仓契约稳定 | | P3-M1 订单与排柜 | 现有订单可进入待分柜,并按确认范围提供柜次建议、人工确认与追溯 | 排柜规则确认 | | P3-M2 订舱与拖车 | 订舱、出仓前船期资料、拖车预约和异常处理可用 | 服务商与权限可用 | | P3-M3 PDA 拣货 | 在线任务、持久化草稿、批量提交、差异、复核和幂等可用 | 服务端任务与库存契约可用 | @@ -254,13 +254,13 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 | ID | 端 | 模块 | 交付内容 | 优先级 | 依赖 | |---|---|---|---|---|---| -| P3-BASE-01 | 公共 | 出仓契约 | 主/子状态、权限、事件、错误码、门禁和快照模型 | P0 | 二期到仓契约 | -| P3-BASE-02 | 公共 | 数据模型 | 现有订单三期投影、订单-柜次、排柜、订舱、拖车、拣货、装柜、报关和时间线 | P0 | P3-BASE-01 | -| P3-DSP-01 | 后台 | 订单三期编排 | 在现有订单列表/详情中接入柜次、子流程、异常、时间线和门禁操作 | P0 | P3-BASE-02 | +| P3-BASE-01 | 公共 | 出仓契约 | 主/子状态、权限、事件、错误码、门禁和快照模型 | P0 | 入库测量与计费到仓契约 | +| P3-BASE-02 | 公共 | 数据模型 | 现有订单国内货柜履约投影、订单-柜次、排柜、订舱、拖车、拣货、装柜、报关和时间线 | P0 | P3-BASE-01 | +| P3-DSP-01 | 后台 | 订单国内货柜履约编排 | 在现有订单列表/详情中接入柜次、子流程、异常、时间线和门禁操作 | P0 | P3-BASE-02 | | P3-PLAN-01 | 公共 | 排柜规则 | 按已确认规则实现输入、约束、偏好和冲突判断 | P0 | P3-BASE-02、P3-Q1 | | P3-PLAN-02 | 后台 | 智能排柜 | 按已确认范围实现建议、人工确认和追溯 | P0 | P3-PLAN-01 | | P3-BOOK-01 | 后台 | 订舱 | 订舱和经确认的船名航次、港口、变更及异常;订舱完成是 `LOADED` 门禁 | P0 | P3-DSP-01 | -| 原 P3-PORT-01 | 后台/服务端 | 出仓后船节点查询 | 已重新归入四期,不作为三期交付或验收项;沿用现有 `CarrierScheduleQuery`,不得重复实现 | 四期 | P3-BOOK-01、确认国内出仓 | +| 原 P3-PORT-01 | 后台/服务端 | 出仓后船节点查询 | 已重新归入海外仓业务,不作为国内货柜履约交付或验收项;沿用现有 `CarrierScheduleQuery`,不得重复实现 | 海外仓业务 | P3-BOOK-01、确认国内出仓 | | P3-TRUCK-01 | 后台 | 拖车预约 | 服务商、车辆司机、时间窗、到离仓和异常 | P0 | P3-DSP-01 | | P3-PICK-01 | 公共 | 拣货任务 | 按排柜方案生成任务、明细、差异和复核规则 | P0 | P3-PLAN-02 | | P3-PDA-01 | PDA | 在线扫码拣货 | 进入任务标记拣货中、扫描草稿、部分/跳拣异常原因和批量提交 | P0 | P3-PICK-01 | @@ -269,7 +269,7 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 | P3-LOAD-02 | PDA/Admin/服务端 | 柜封拍照上传 | PDA 现场拍摄、Admin 人工上传、五类证据多图追加、真实文件上传、预览、失败重试、作废和提交 | P0 | P3-LOAD-01、文件能力可用 | | P3-CUS-01 | 客户端 | 报关资料 | 清单、上传、补件、版本和进度查看 | P0 | 文件能力可用 | | P3-CLEAR-01 | 后台 | 报关协同 | 人工审核、补件、线下提交代理、人工上传放行回执和版本审计 | P0 | P3-CUS-01 | -| P3-CUS-02 | 客户端 | 回执及出仓前船期资料 | 回执下载、订舱预计开船/到港快照和变更时间线;出仓后查询展示归四期 | P0 | P3-BOOK-01、P3-CLEAR-01 | +| P3-CUS-02 | 客户端 | 回执及出仓前船期资料 | 回执下载、订舱预计开船/到港快照和变更时间线;出仓后查询展示归海外仓业务 | P0 | P3-BOOK-01、P3-CLEAR-01 | | P3-GATE-01 | 服务端 | 装柜完成门禁 | 校验订舱、拖车、报关放行回执、PDA 拣货、五类证据和锁码文本,幂等推进 `LOADED`;`LOADED` 后仅线下人工处理 | P0 | P3-PICK-01、P3-LOAD-01、P3-LOAD-02 | | P3-OVERSEAS-01 | 服务端 | 海外仓派送完成回传 | 只接受海外仓可信回传,校验身份、签名、时间窗、防重放和幂等,推进 `DELIVERED` | P1/后续阶段 | 海外仓契约 | | P3-NOTIFY-01 | 公共 | 通知异常 | 站内通知、阻塞、责任人、时限和失败补偿 | P1 | 核心流程完成 | @@ -280,21 +280,21 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 ## 十、测试与验收重点 - 系统排柜符合已确认的业务规则;如启用建议解释、人工调整、版本或原因记录,对应结果可追溯。 -- 多订单拼柜和一单多柜的件数、重量、体积能与二期实测版本对账。 +- 多订单拼柜和一单多柜的件数、重量、体积能与入库测量与计费实测版本对账。 - PDA 重复扫码、超量、错货和重复提交不产生重复扣减或完成事件;断网时禁止正式作业和提交。 - 本地草稿在应用重启后可由同一作业员、任务和柜次恢复,不能被其他账号继承;批量提交成功后清理。 - 柜封照片能够在 PDA 现场拍摄或由 Admin 受权上传;同类型可多张追加,失败重试不重复创建同一记录,错图只作废不硬删除。 - 未完成 PDA 拣货、缺少任意一张必传照片或锁码文本时不能进入 `LOADED`/装柜完成。 - 企业 A 无法查看、上传或下载企业 B 的报关资料和回执。 - 报关资料替换、退回、补件、提交和回执均能追溯到明确版本。 -- 订舱与出仓前船期资料变更保留历史;出仓后船节点查询结果的来源、更新时间和过期验收归四期。 +- 订舱与出仓前船期资料变更保留历史;出仓后船节点查询结果的来源、更新时间和过期验收归海外仓业务。 - 确认装柜完成的并发请求只产生一次状态变化和一次有效审计事件。 - 管理后台覆盖加载、空态、失败、无权限和数据冲突;PDA 覆盖弱网、前后台切换和硬件扫描。 -- 三期验收基线为 `LOADED`/装柜完成;`DELIVERED`/派送完成只由海外仓回传推进,不属于国内三期验收条件。 +- 国内货柜履约验收基线为 `LOADED`/装柜完成;`DELIVERED`/派送完成只由海外仓回传推进,不属于国内国内货柜履约验收条件。 ## 十一、启动前技术澄清事项 -验收任务拆分、真实 HTTP 覆盖和未确认项解除条件统一见[三期验收任务拆分与待确认清单](三期验收任务拆分与待确认清单.md)。当前已确认的 PDA/证据规则已进入 `phase3-container-loading.mjs`、`phase3-loading.mjs`;未确认规则不得标记为三期完成。 +验收任务拆分、真实 HTTP 覆盖和未确认项解除条件统一见[国内货柜履约验收任务拆分与待确认清单](国内货柜履约验收任务拆分与待确认清单.md)。当前已确认的 PDA/证据规则已进入 `phase3-container-loading.mjs`、`phase3-loading.mjs`;未确认规则不得标记为国内货柜履约完成。 | 编号 | 待确认问题 | 当前建议 | |---|---|---| @@ -302,20 +302,20 @@ PDA 拣货 → 装柜并上传货柜/铅封照片 | P3-Q2 | 是否存在拼柜、一单多柜和拆批出仓? | 已确认:父订单→子订单→柜次;已装载/未装载数量自动形成子订单 | | P3-Q3 | “预约托车”是否统一为“预约拖车”? | 已确认统一使用“预约拖车” | | P3-Q4 | PDA 开发、扫描与发布方式是什么? | 已确认采用 uni-app 开发并支持在线更新;Android 广播接入已完成,设备型号不构成门禁 | -| P3-Q5 | 拣货是否依赖实时库存和库位可用量? | 已确认依赖二期实时库存、当前位置和可用量接口;不扩展完整 WMS | +| P3-Q5 | 拣货是否依赖实时库存和库位可用量? | 已确认依赖入库测量与计费实时库存、当前位置和可用量接口;不扩展完整 WMS | | P3-Q6 | 柜封照片有哪些必传角度和留存期限? | 已确认:五类各至少 1 张、同类型可多张追加、后台操作员/理货员可上传、拣货员仅 PDA 现场采集、错图作废、无限期保留、客户不可见 | | P3-Q7 | 报关资料清单是否按国家、渠道和货物类型变化? | 已确认首版人工维护清单和版本,不接自动报关 | | P3-Q8 | 报关代理如何接收资料和返回回执? | 已确认线下提交,授权人员人工上传回执 | -| P3-Q9 | 原型中的“港务信息”具体指船期、港口作业状态还是两者,包含哪些字段,由谁维护? | 当前更正:三期只维护订舱与出仓前船期资料;六家船公司及出仓后节点查询整体归四期 | -| P3-Q10 | 进入装柜完成后发现错误如何处理? | 已确认线下人工处理,本期不提供在线冲正 | +| P3-Q9 | 原型中的“港务信息”具体指船期、港口作业状态还是两者,包含哪些字段,由谁维护? | 当前更正:国内货柜履约只维护订舱与出仓前船期资料;六家船公司及出仓后节点查询整体归海外仓业务 | +| P3-Q10 | 进入装柜完成后发现错误如何处理? | 已确认线下人工处理,当前不提供在线冲正 | | P3-Q11 | 九个动作中哪些是强制前置,哪些允许并行? | 已确认订舱、拖车、报关放行、PDA 拣货和五类证据为 `LOADED` 硬门禁;单柜次单作业员 | | P3-Q12 | “报关回执”具体包含哪些类型,海关放行是否为国内出仓硬门禁? | 已确认有效放行回执为 `LOADED` 硬门禁,首版人工上传 | -| P3-Q13 | 三期终点以什么状态为准? | 已确认为 `LOADED`/装柜完成;`DELIVERED`/派送完成由海外仓回传,不属于国内三期 | +| P3-Q13 | 国内货柜履约终点以什么状态为准? | 已确认为 `LOADED`/装柜完成;`DELIVERED`/派送完成由海外仓回传,不属于国内国内货柜履约 | ## 十二、建议实施顺序 1. 固化已确认业务规则,按 uni-app 在线更新安排推进 PDA 开发、发布和真机验收。 -2. 统一订单、柜次、订舱、拖车、拣货、报关和出仓前船期资料的稳定编码与关联契约;出仓后查询按四期衔接。 +2. 统一订单、柜次、订舱、拖车、拣货、报关和出仓前船期资料的稳定编码与关联契约;出仓后查询按海外仓业务衔接。 3. 先实现服务端权限、状态、门禁、幂等、并发和审计,再接各端页面。 4. 完成管理后台的出仓编排,再接 PDA 现场执行和客户资料协同。 5. 使用脱敏数据演练拼柜、一单多柜、未装数量生成子订单、错拣、补件和改船;`LOADED` 后不演练在线冲正。 diff --git a/三期/三期开发进度表.md b/国内货柜履约/国内货柜履约开发进度表.md similarity index 73% rename from 三期/三期开发进度表.md rename to 国内货柜履约/国内货柜履约开发进度表.md index a919a32..4c7093c 100644 --- a/三期/三期开发进度表.md +++ b/国内货柜履约/国内货柜履约开发进度表.md @@ -1,24 +1,24 @@ -# 虫虫出海三期开发进度表 +# 虫虫出海国内货柜履约开发进度表 -> 创建日期:2026-07-28 -> 当前阶段:已确认口径下的分模块部署、联调与缺口收口 -> 总体状态:分模块已部署联调;PDA 主链仍阻断,尚未达到三期闭环验收 -> 规划依据:`三期开发规划.md` -> 维护方式:参考一期进度表,采用“总体大任务 → 详细任务 → 里程碑 → 未确认事项 → 开工准入 → 验收”的结构。 +> 创建日期:2026-07-28 +> 当前阶段:已确认口径下的分模块部署、联调与缺口收口 +> 总体状态:分模块已部署联调;PDA 主链仍阻断,尚未达到国内货柜履约闭环验收 +> 规划依据:`国内货柜履约开发规划.md` +> 维护方式:参考订单与客户进度表,采用“总体大任务 → 详细任务 → 里程碑 → 未确认事项 → 开工准入 → 验收”的结构。 -## 一、三期目标 +## 一、国内货柜履约目标 -三期承接二期到仓、实测、差异处理、处理单元编码和当前位置记录,完成智能排柜、订舱、拖车预约、PDA 拣货、装柜拍照、报关协同、港务信息查询,并将现有订单推进到 `LOADED`/装柜完成。 +国内货柜履约承接入库测量与计费到仓、实测、差异处理、处理单元编码和当前位置记录,完成智能排柜、订舱、拖车预约、PDA 拣货、装柜拍照、报关协同、港务信息查询,并将现有订单推进到 `LOADED`/装柜完成。 -当前验收基线已确认为 `LOADED`/装柜完成。`DELIVERED`/派送完成只能在货物到达海外仓后由海外仓可信回传推进,不属于国内三期操作和验收范围。 +当前验收基线已确认为 `LOADED`/装柜完成。`DELIVERED`/派送完成只能在货物到达海外仓后由海外仓可信回传推进,不属于国内国内货柜履约操作和验收范围。 ## 二、总体进度(大任务) | 大任务 ID | 大任务 | 范围 | 状态 | 进度 | 计划开始 | 计划完成 | 负责人 | 关键依赖/备注 | |---|---|---|---|---:|---|---|---|---| | T01 | 需求确认与原型 | 锁定阶段边界、流程依赖、排柜规则、设备、文件、报关和港务信息;完成页面原型 | 已完成 | 100% | 2026-07-28 | 2026-08-10 | 总控 | 产品确认版已同步;PDA 采用 uni-app、在线更新和 Android 广播扫描 | -| T02 | 公共契约与数据模型 | 主/子状态、权限、事件、错误码、订单三期投影、柜次、任务、证据、报关和审计模型 | 进行中 | 60% | 2026-08-10 | 待排期 | 总控 | 父子单、硬门禁、仓库角色、证据和费用契约已有真实接口;PDA batch 契约未完成 | -| T03 | 订单三期编排与柜次 | 增强现有订单列表/详情,建立父子订单-柜次关系、拆分/拼柜和时间线 | 联调中 | 80% | 2026-08-10 | 待排期 | 总控 | 父子履约树和柜次分片已通过真实验收,最终 LOADED 仍受 PDA 阻断 | +| T02 | 公共契约与数据模型 | 主/子状态、权限、事件、错误码、订单国内货柜履约投影、柜次、任务、证据、报关和审计模型 | 进行中 | 60% | 2026-08-10 | 待排期 | 总控 | 父子单、硬门禁、仓库角色、证据和费用契约已有真实接口;PDA batch 契约未完成 | +| T03 | 订单国内货柜履约编排与柜次 | 增强现有订单列表/详情,建立父子订单-柜次关系、拆分/拼柜和时间线 | 联调中 | 80% | 2026-08-10 | 待排期 | 总控 | 父子履约树和柜次分片已通过真实验收,最终 LOADED 仍受 PDA 阻断 | | T04 | 智能排柜 | 排柜规则、系统建议、冲突、人工确认和追溯 | 联调中 | 80% | 2026-08-10 | 待排期 | Admin/Firstleg | 智能装柜工作台与真实候选、计划、分配、推送接口已部署;最终完成依赖 PDA | | T05 | 订舱与港务信息 | 订舱、变更异常、船公司官网查询、更新时间和过期标识 | 联调中 | 80% | 2026-08-10 | 待排期 | Firstleg/Admin | 订舱、港务船期生命周期已通过;ZIM/COSCO 保留人工兜底 | | T06 | 拖车预约 | 服务商、车辆司机、预约时间窗、到离仓节点和异常 | 联调中 | 80% | 2026-08-10 | 待排期 | Firstleg/Admin | 预约生命周期和服务中心串联已通过,最终 LOADED 门禁待 PDA | @@ -26,7 +26,7 @@ | T08 | 装柜及柜封证据 | 装柜节点、柜号、铅封号、PDA 现场拍照、后台角色上传、多图追加、作废和复核 | 联调中 | 80% | 2026-08-10 | 待排期 | Firstleg/Admin/PDA | 五类证据、多图追加、作废和硬门禁已通过;终态仍依赖 PDA | | T09 | 报关资料与回执 | 人工资料清单、后台审核补件、线下提交代理、人工上传放行回执 | 联调中 | 70% | 2026-08-10 | 待排期 | Firstleg/Admin | 人工清单和资料版本已通过;LOADED 子订单关联受 PDA 失败级联阻断 | | T10 | 装柜完成门禁 | 校验订舱、拖车、报关放行、PDA 拣货、五类证据和锁码文本,推进 `LOADED` | 已阻塞 | 70% | 2026-08-10 | 待排期 | Firstleg | 门禁逐项读取和 fail-closed 已通过,真实推进 `LOADED` 等 PDA 修复 | -| T11 | 客户端三期协同 | 装柜进度、柜次、回执、预计开船/到港和变更时间线 | 待开始 | 0% | 待排期 | 待排期 | 待分配 | 客户不查看装柜照片和锁码;依赖 T05、T09、T10 | +| T11 | 客户端国内货柜履约协同 | 装柜进度、柜次、回执、预计开船/到港和变更时间线 | 待开始 | 0% | 待排期 | 待排期 | 待分配 | 客户不查看装柜照片和锁码;依赖 T05、T09、T10 | | T12 | 联调测试与发布 | 跨端联调、自动化测试、PDA 真机、安全、弱网、迁移、验收和发布 | 联调中 | 70% | 2026-08-10 | 待排期 | 总控/测试 | Admin、Firstleg 已分模块部署并持续真实 HTTP 验收;PDA S0500、batch 契约和真机验收未收口 | ## 三、详细任务表 @@ -37,7 +37,7 @@ |---|---|---|---|---|---|---|---:|---|---|---| | P3-T01-00 | T01 | 公共 | 需求确认与原型 | 完成需求确认表、页面清单和原型评审,锁定开工阻断项 | P0 | 已完成 | 100% | - | 总控 | 已同步产品确认版;PDA 技术路线已确认 | | P3-T02-00 | T02 | 公共 | 公共契约与数据模型 | 拆状态、权限、数据模型、接口和审计;初始化操作员/拣货员/理货员角色 | P0 | 进行中 | 60% | P3-T01-00 | 总控 | 主体契约已进入真实联调;PDA 原子 batch 仍缺 | -| P3-T03-00 | T03 | 后台/服务端 | 订单三期编排与柜次 | 实现父订单→子订单→柜次、一单多柜、拼柜、未装数量自动子订单和时间线 | P0 | 联调中 | 80% | P3-T02-00 | Order/Firstleg/Admin | 父子履约树、柜次分片与整体时间线已通过真实接口 | +| P3-T03-00 | T03 | 后台/服务端 | 订单国内货柜履约编排与柜次 | 实现父订单→子订单→柜次、一单多柜、拼柜、未装数量自动子订单和时间线 | P0 | 联调中 | 80% | P3-T02-00 | Order/Firstleg/Admin | 父子履约树、柜次分片与整体时间线已通过真实接口 | | P3-T04-00 | T04 | 后台/服务端 | 智能排柜 | 实现 110% 装载率上限、可配置税率排序、人工确认和版本追溯 | P0 | 联调中 | 80% | P3-T03-00 | Firstleg/Admin | 候选、计划、分配、调整与推送已部署;最终完成依赖 PDA | | P3-T05-00 | T05 | 后台/服务端 | 订舱与港务信息 | 订舱状态及六家船公司查询、三日周期、三次上限、过期标识 | P0 | 联调中 | 80% | P3-T03-00 | Firstleg/Admin | 港务生命周期已通过;ZIM/COSCO 为人工兜底,不算自动查询通过 | | P3-T06-00 | T06 | 后台/服务端 | 拖车预约 | 服务商、车辆司机、时间窗、到离仓和异常;完成状态供门禁校验 | P0 | 联调中 | 80% | P3-T03-00 | Firstleg/Admin | 预约、附件、历史及服务中心链路已通过真实接口 | @@ -45,25 +45,25 @@ | P3-T08-00 | T08 | PDA/后台/服务端 | 装柜及柜封证据 | 实现五类多图追加、角色上传、作废和无限期留存,客户不可见 | P0 | 联调中 | 80% | P3-T07-00 | Firstleg/Admin/PDA | 五类证据与安全边界已通过,真机拍照和终态待验收 | | P3-T09-00 | T09 | 客户端/后台/服务端 | 报关资料与回执 | 实现人工清单、补件、线下提交记录、人工放行回执上传 | P0 | 联调中 | 70% | P3-T02-00 | Firstleg/Admin | 人工协同接口已部署,最终子订单关联受 PDA 失败级联阻断 | | P3-T10-00 | T10 | 后台/服务端 | 装柜完成门禁 | 实现订舱/拖车/放行/PDA/证据硬门禁并推进 `LOADED` | P0 | 已阻塞 | 70% | P3-T07-00、P3-T08-00、P3-T09-00 | Firstleg | 门禁读取已通过;推进 LOADED 受 PDA 主链阻断 | -| P3-T11-00 | T11 | 客户端/服务端 | 客户端三期协同 | 展示柜次、装柜进度、客户可见回执和船期;不返回照片与锁码 | P0 | 待开始 | 0% | P3-T05-00、P3-T09-00、P3-T10-00 | 待分配 | - | +| P3-T11-00 | T11 | 客户端/服务端 | 客户端国内货柜履约协同 | 展示柜次、装柜进度、客户可见回执和船期;不返回照片与锁码 | P0 | 待开始 | 0% | P3-T05-00、P3-T09-00、P3-T10-00 | 待分配 | - | | P3-T12-00 | T12 | 公共 | 联调测试与发布 | 维护定向/全量真实 HTTP、PDA 真机、安全和发布回归 | P0 | 联调中 | 70% | P3-T02-00~P3-T11-00 | 总控/测试 | 已进入分模块部署验收;不得用 mock、历史资源或 coverage gap 伪装通过 | -| P3-T01-PROTO-01 | T01 | 公共 | 原型盘点 | 盘点流程图、后台、企业客户端和 PDA 中与三期相关的页面及交互 | P0 | 已完成 | 100% | - | 待分配 | 2026-07-28 已完成首次盘点,来源为 `docs/悦` | -| P3-T03-PROTO-01 | T03 | 后台 | 订单三期编排原型 | 在现有订单列表/详情中设计柜次、子流程摘要、阻塞原因、时间线和操作入口 | P0 | 进行中 | 50% | P3-T01-PROTO-01、P3-Q11 | 待分配 | 不新建出仓单页面 | +| P3-T01-PROTO-01 | T01 | 公共 | 原型盘点 | 盘点流程图、后台、企业客户端和 PDA 中与国内货柜履约相关的页面及交互 | P0 | 已完成 | 100% | - | 待分配 | 2026-07-28 已完成首次盘点,来源为 `docs/悦` | +| P3-T03-PROTO-01 | T03 | 后台 | 订单国内货柜履约编排原型 | 在现有订单列表/详情中设计柜次、子流程摘要、阻塞原因、时间线和操作入口 | P0 | 进行中 | 50% | P3-T01-PROTO-01、P3-Q11 | 待分配 | 不新建出仓单页面 | | P3-T04-PROTO-01 | T04 | 后台 | 智能排柜原型核验 | 映射智能装柜的线路页签、筛选、智能锁定、订单分柜、拖放调整和集装箱详情 | P0 | 已完成 | 100% | P3-T01-PROTO-01 | 待分配 | 按 110% 装载率上限和可配置税率排序实现 | -| P3-T05-PROTO-01 | T05 | 后台 | 订舱与出仓前船期资料原型核验 | 映射订舱列表、新增/详情、放舱、船名航次、港口和 ETD/ATD/ETA/ATA 字段 | P0 | 已完成 | 100% | P3-T01-PROTO-01 | 待分配 | 出仓后的六家船公司及节点查询已重新归入四期 | -| P3-T06-PROTO-01 | T06 | 后台 | 拖车原型核验 | 映射拖车列表、新增表单、运输公司、司机、车头号、装箱日期、费用和附件 | P0 | 已完成 | 100% | P3-T01-PROTO-01 | 待分配 | 预约时间窗和到离仓节点仍需按三期流程补充 | +| P3-T05-PROTO-01 | T05 | 后台 | 订舱与出仓前船期资料原型核验 | 映射订舱列表、新增/详情、放舱、船名航次、港口和 ETD/ATD/ETA/ATA 字段 | P0 | 已完成 | 100% | P3-T01-PROTO-01 | 待分配 | 出仓后的六家船公司及节点查询已重新归入海外仓业务 | +| P3-T06-PROTO-01 | T06 | 后台 | 拖车原型核验 | 映射拖车列表、新增表单、运输公司、司机、车头号、装箱日期、费用和附件 | P0 | 已完成 | 100% | P3-T01-PROTO-01 | 待分配 | 预约时间窗和到离仓节点仍需按国内货柜履约流程补充 | | P3-T07-PROTO-01 | T07 | 后台/PDA | 拣货原型核验 | 对照通用 WMS 出库拣货和现有 PDA 集装箱拣货,锁定可复用交互与真实接口缺口 | P0 | 已完成 | 100% | P3-T01-PROTO-01 | 待分配 | 已确认在线作业、进入即开始、持久化草稿和批量提交;真实任务、鉴权与契约仍需完成 | | P3-T08-PROTO-01 | T08 | 后台 | 装柜证据原型核验 | 映射货柜列表、预装清单、装柜清单、柜号、单证、船期和装柜明细 | P0 | 已完成 | 100% | P3-T01-PROTO-01 | 待分配 | 后台参考较完整,但现场拍照上传原型缺失 | | P3-T08-PROTO-02 | T08 | PDA | 装柜拍照原型 | 新增柜次确认、五类证据多图追加、锁码文本、预览、重试、作废和提交页面原型 | P0 | 待开始 | 0% | P3-Q6 | 待分配 | PDA 仅拍照、Admin 可上传、每类至少一张和错图作废已确认 | | P3-T09-PROTO-01 | T09 | 后台 | 报关单证原型核验 | 映射报关单列表、单证管理、报关/清关/放行资料及装柜清单附件 | P0 | 已完成 | 100% | P3-T01-PROTO-01 | 待分配 | 客户上传和回执下载页面仍需新建 | | P3-T10-PROTO-01 | T10 | 后台 | 装柜完成门禁原型 | 在现有订单详情设计门禁检查、阻塞原因和确认装柜完成交互 | P0 | 进行中 | 30% | P3-Q10~P3-Q12 | 待分配 | 不提供在线冲正,不需要独立门禁页面 | -| P3-T11-PROTO-01 | T11 | 客户端 | 客户端三期原型 | 新增装柜进度、报关资料上传/补件、回执下载和出仓前船期资料展示 | P0 | 待开始 | 0% | P3-Q7~P3-Q9、P3-Q12 | 待分配 | 出仓后船节点页面归四期 | +| P3-T11-PROTO-01 | T11 | 客户端 | 客户端国内货柜履约原型 | 新增装柜进度、报关资料上传/补件、回执下载和出仓前船期资料展示 | P0 | 待开始 | 0% | P3-Q7~P3-Q9、P3-Q12 | 待分配 | 出仓后船节点页面归海外仓业务 | ## 四、原型对照与开发影响 | 大任务 | `docs/悦` 现有原型 | 覆盖判断 | 开发处理 | |---|---|---|---| -| T03 订单三期编排与柜次 | 现有订单列表/详情、货柜列表、装柜清单 | 部分参考 | 增强现有订单页并建立订单-柜次关联,不新增出仓单页面 | +| T03 订单国内货柜履约编排与柜次 | 现有订单列表/详情、货柜列表、装柜清单 | 部分参考 | 增强现有订单页并建立订单-柜次关联,不新增出仓单页面 | | T04 智能排柜 | 入库单列表中的“智能装柜”弹窗 | 已有参考 | 复用线路、筛选、锁定、分柜和拖放交互,按 P3-Q1 裁剪规则 | | T05 订舱与港务信息 | 订舱列表、新增/详情、放舱、货柜船期字段 | 已有参考 | 复用订舱字段和页面结构,确认港务信息范围及来源后裁剪 | | T06 拖车预约 | 拖车列表、新增拖车 | 已有参考 | 复用车辆司机和费用字段,补预约时间窗、到仓及离仓节点 | @@ -71,9 +71,9 @@ | T08 装柜及柜封证据 | 货柜列表、预装清单、装柜清单 | 部分参考 | 后台页面裁剪复用;PDA 只拍照,Admin 可上传,同类型多张追加,错图作废 | | T09 报关资料与回执 | 报关单列表、单证管理、装柜清单附件 | 部分参考 | 后台裁剪复用;客户上传、补件和回执下载页面新建 | | T10 装柜完成门禁 | 现有订单状态操作和分散证据字段 | 部分参考 | 在订单详情补门禁检查和确认装柜完成;不提供在线冲正或国内确认派送 | -| T11 客户端三期协同 | 头程下单客户端只有船期字段和少量装柜摘要 | 覆盖不足 | 新建三期客户端装柜进度、报关和港务信息页面 | +| T11 客户端国内货柜履约协同 | 头程下单客户端只有船期字段和少量装柜摘要 | 覆盖不足 | 新建国内货柜履约客户端装柜进度、报关和港务信息页面 | -> `货代SaaS平台原型.html` 是全量平台参考原型,其中海外仓、完整 WMS、费用和清关能力不自动纳入三期;所有复用项仍需经过三期范围裁剪。 +> `货代SaaS平台原型.html` 是全量平台参考原型,其中海外仓、完整 WMS、费用和清关能力不自动纳入国内货柜履约;所有复用项仍需经过国内货柜履约范围裁剪。 ## 五、建议拆分模板 @@ -93,26 +93,26 @@ | 里程碑 | 交付目标 | 状态 | 计划完成 | |---|---|---|---| | P3-M0 需求与原型锁定 | 阶段边界、流程、规则、设备、文件和页面原型确认 | 已完成 | 2026-08-10 | -| P3-M1 公共契约 | 二三期输入、状态、权限、数据模型和接口契约稳定 | 进行中 | 待排期 | -| P3-M2 订单三期编排 | 现有订单、柜次、排柜、订舱、港务和拖车可关联追溯 | 联调中 | 待排期 | +| P3-M1 公共契约 | 入库测量与计费及国内货柜履约输入、状态、权限、数据模型和接口契约稳定 | 进行中 | 待排期 | +| P3-M2 订单国内货柜履约编排 | 现有订单、柜次、排柜、订舱、港务和拖车可关联追溯 | 联调中 | 待排期 | | P3-M3 仓内出仓 | PDA 拣货、复核、装柜和柜封证据闭环 | 已阻塞 | 待排期 | | P3-M4 报关协同 | 客户资料、后台审核、提交代理、回执上传下载闭环 | 联调中 | 待排期 | | P3-M5 装柜完成 | 订舱、拖车、放行回执、PDA 和证据门禁满足后进入 `LOADED`;后续错误线下处理 | 已阻塞 | 待排期 | -| P3-M6 三期上线 | 联调、真机、安全、测试、验收和生产发布完成 | 进行中 | 待排期 | +| P3-M6 国内货柜履约上线 | 联调、真机、安全、测试、验收和生产发布完成 | 进行中 | 待排期 | ## 七、未确认事项(需求确认进度) -当前 13 项主确认事项均已有产品最终结论;P3-Q4 已确认采用 uni-app、在线更新与 Android 广播扫描。完整结论统一维护在 [三期需求确认表](三期需求确认表.md)。 +当前 13 项主确认事项均已有产品最终结论;P3-Q4 已确认采用 uni-app、在线更新与 Android 广播扫描。完整结论统一维护在 [国内货柜履约需求确认表](国内货柜履约需求确认表.md)。 -验收拆分已建立:PDA 进入任务、拣货幂等/版本冲突、五类证据真实上传、多图追加和锁码门禁进入自动化;真机在线、设备草稿批量提交、证据作废、设备与权限留存等仍保留 coverageGap,详见[三期验收任务拆分与待确认清单](三期验收任务拆分与待确认清单.md)。 +验收拆分已建立:PDA 进入任务、拣货幂等/版本冲突、五类证据真实上传、多图追加和锁码门禁进入自动化;真机在线、设备草稿批量提交、证据作废、设备与权限留存等仍保留 coverageGap,详见[国内货柜履约验收任务拆分与待确认清单](国内货柜履约验收任务拆分与待确认清单.md)。 | 编号 | 阻断级别 | 待确认事项 | 状态 | 主要影响 | |---|---|---|---|---| | P3-Q1 | 开工阻断 | 智能排柜的硬约束和软偏好 | 已确认 | T04 智能排柜、T07 拣货任务 | -| P3-Q2 | 开工阻断 | 是否支持拼柜、一单多柜和拆批装柜 | 已确认 | T03 订单三期编排与柜次、T04 智能排柜 | +| P3-Q2 | 开工阻断 | 是否支持拼柜、一单多柜和拆批装柜 | 已确认 | T03 订单国内货柜履约编排与柜次、T04 智能排柜 | | P3-Q3 | 非阻断 | “预约托车”是否统一为“预约拖车” | 已确认 | T06 拖车预约、页面与接口文案 | | P3-Q4 | 非阻断 | PDA 开发、扫描与发布方式 | 已确认 | 采用 uni-app 开发并支持在线更新;Android 广播模式已接入,设备型号不构成门禁 | -| P3-Q5 | 开工阻断 | 拣货是否依赖实时库存和库位可用量 | 已确认 | 复用二期实时库存、当前位置和可用量接口;不扩展完整 WMS | +| P3-Q5 | 开工阻断 | 拣货是否依赖实时库存和库位可用量 | 已确认 | 复用入库测量与计费实时库存、当前位置和可用量接口;不扩展完整 WMS | | P3-Q6 | 模块阻断 | 装柜照片和锁码规则 | 已确认 | 五类多图、角色上传、无限期保留、客户不可见 | | P3-Q7 | 模块阻断 | 报关资料清单是否按国家、渠道和货物类型变化 | 已确认 | T09 报关资料、文件版本 | | P3-Q8 | 模块阻断 | 报关代理接收资料和返回回执的方式 | 已确认 | 线下提交、人工上传回执 | @@ -120,22 +120,22 @@ | P3-Q10 | 模块阻断 | 装柜完成后的错误处理和冲正方式 | 已确认 | 线下人工处理,不提供在线冲正 | | P3-Q11 | 开工阻断 | 九个动作的强制前置和并行关系 | 已确认 | 订舱/拖车/放行/PDA/证据为硬门禁;单柜次单人 | | P3-Q12 | 开工阻断 | 报关回执类型及海关放行是否为装柜完成硬门禁 | 已确认 | 有效放行回执为硬门禁,人工上传 | -| P3-Q13 | 开工阻断 | 三期终点 | 已确认 | `LOADED`/装柜完成;`DELIVERED` 由海外仓回传,移出三期验收 | +| P3-Q13 | 开工阻断 | 国内货柜履约终点 | 已确认 | `LOADED`/装柜完成;`DELIVERED` 由海外仓回传,移出国内货柜履约验收 | ## 八、开工准入记录 -三期已进入分模块部署联调。下表保留开工条件及当前补齐状态,用于检查契约、原型和任务拆分是否仍有缺口,不再作为“尚未开始开发”的结论。 +国内货柜履约已进入分模块部署联调。下表保留开工条件及当前补齐状态,用于检查契约、原型和任务拆分是否仍有缺口,不再作为“尚未开始开发”的结论。 | 准入编号 | 准入条件 | 当前状态 | 责任方 | 完成证据 | |---|---|---|---|---| -| P3-GO-01 | P3-Q1~P3-Q13 均形成产品结论 | 已完成 | 产品、业务 | `三期需求确认表.md` 已同步最终结论 | +| P3-GO-01 | P3-Q1~P3-Q13 均形成产品结论 | 已完成 | 产品、业务 | `国内货柜履约需求确认表.md` 已同步最终结论 | | P3-GO-02 | 确认结论已同步开发规划、进度表、页面清单和验收范围 | 已完成 | 产品、项目负责人 | README、进度表、页面清单和验收口径已按确认版同步 | -| P3-GO-03 | 关键缺失原型已补齐并评审,包括订单装柜完成门禁、客户端三期页面和 PDA 五类多图拍照 | 进行中 | 产品、设计、业务 | 页面清单中的关键页面达到已确认状态 | -| P3-GO-04 | T02 公共契约完成,二期输入、状态机、权限、数据模型、接口、错误码和审计口径稳定 | 进行中 | 前后端、架构/技术负责人 | 主体契约已部署;PDA 原子 batch 契约仍缺 | +| P3-GO-03 | 关键缺失原型已补齐并评审,包括订单装柜完成门禁、客户端国内货柜履约页面和 PDA 五类多图拍照 | 进行中 | 产品、设计、业务 | 页面清单中的关键页面达到已确认状态 | +| P3-GO-04 | T02 公共契约完成,入库测量与计费输入、状态机、权限、数据模型、接口、错误码和审计口径稳定 | 进行中 | 前后端、架构/技术负责人 | 主体契约已部署;PDA 原子 batch 契约仍缺 | | P3-GO-05 | T03~T12 已拆成 RULE、DATA、API、ADM/CLI/PDA、TEST、ACCEPT 任务,并填写负责人和计划 | 进行中 | 项目负责人、研发、测试 | 已按独立任务推进;客户端、PDA batch 和真机验收任务仍需收口 | | P3-GO-06 | 产品、业务、研发和测试完成开工评审,确认范围、依赖、风险和首批任务 | 进行中 | 项目负责人 | 产品范围已确认并开工,正式评审证据仍需归档 | -当前口径:未完成的准入项作为收口风险继续跟踪,不回退已经开始的开发和联调;只有契约、真机和真实 HTTP 验收全部完成后,才能标记三期完成。 +当前口径:未完成的准入项作为收口风险继续跟踪,不回退已经开始的开发和联调;只有契约、真机和真实 HTTP 验收全部完成后,才能标记国内货柜履约完成。 ## 九、状态维护规则 @@ -150,5 +150,5 @@ 1. 修复 PDA `pick` 第二处 `S0500`,复跑领取、拣货、复核、报关关联和装柜完成链路。 2. 独立实现 PDA 原子 batch 契约及测试,覆盖整批事务、幂等、服务端库存快照和失败回滚。 3. 完成 PDA 真机广播扫码、在线草稿、五类证据拍照、多图追加和作废验收。 -4. 收口 T11 客户端三期页面及客户可见性、安全边界。 -5. 复跑三期定向和默认全量真实 HTTP 验收,完成发布记录后再评估三期完成状态。 +4. 收口 T11 客户端国内货柜履约页面及客户可见性、安全边界。 +5. 复跑国内货柜履约定向和默认全量真实 HTTP 验收,完成发布记录后再评估国内货柜履约完成状态。 diff --git a/三期/三期开工门禁.md b/国内货柜履约/国内货柜履约开工门禁.md similarity index 73% rename from 三期/三期开工门禁.md rename to 国内货柜履约/国内货柜履约开工门禁.md index d227a9f..2f7d818 100644 --- a/三期/三期开工门禁.md +++ b/国内货柜履约/国内货柜履约开工门禁.md @@ -1,20 +1,20 @@ -# 三期开工门禁 +# 国内货柜履约开工门禁 -> 本文维护三期跨端开发的稳定门禁。实时任务进度见 `三期开发进度表.md`;产品决策以 `三期需求确认表.md` 为准。 +> 本文维护国内货柜履约跨端开发的稳定门禁。实时任务进度见 `国内货柜履约开发进度表.md`;产品决策以 `国内货柜履约需求确认表.md` 为准。 ## 可直接开展的范围 - 已确认规则可进入契约、数据、接口、页面和测试拆分,不需要等待整期所有模块完成。 -- 订单继续承载三期主状态,不新建独立出仓单;支持父订单、子订单与柜次关系,以及一单多柜和多订单拼柜。 +- 订单继续承载国内货柜履约主状态,不新建独立出仓单;支持父订单、子订单与柜次关系,以及一单多柜和多订单拼柜。 - 智能排柜、订舱与船期、拖车预约、PDA 在线拣货、五类装柜证据、人工报关回执和 `LOADED` 服务端门禁按需求确认表执行。 -- 三期国内终点为 `LOADED`;`DELIVERED` 只由海外仓可信回传推进。 +- 国内货柜履约的国内终点为 `LOADED`;`DELIVERED` 只由海外仓可信回传推进。 ## 跨端硬边界 - `LOADED` 前必须由服务端校验订舱完成、拖车完成、有效报关放行回执、PDA 拣货完成和五类有效证据完整;国内 Admin/PDA 不提供在线冲正或手工推进 `DELIVERED`。 - PDA 正式作业仅在线;单柜次只允许一名作业员,不支持多人并行、任务接管或换班释放。进入任务即由服务端标记拣货中,扫描草稿按作业员、任务和柜次隔离,提交时批量写入。 - 每类证据至少一张有效照片,允许同类型追加;错误照片只能作废并保留审计。客户不可见照片与锁码。 -- 前端页面、菜单和路由只能在对应服务端契约、权限和数据模型稳定后发布;原型中的完整 WMS、海外仓及未确认能力不属于三期默认范围。 +- 前端页面、菜单和路由只能在对应服务端契约、权限和数据模型稳定后发布;原型中的完整 WMS、海外仓及未确认能力不属于国内货柜履约默认范围。 ## 局部阻断项 @@ -24,6 +24,6 @@ ## 使用方式 -1. 先读 `README.md`、`三期需求确认表.md` 和本文件,确认任务属于已确认范围。 +1. 先读 `README.md`、`国内货柜履约需求确认表.md` 和本文件,确认任务属于已确认范围。 2. 再进入目标应用或服务的 `AGENTS.md`,按本地模块入口实现。 3. 发现新的产品决策或门禁变化时,先更新确认表与本文,再更新受影响模块指引;不要将短期进度、联调故障或环境地址写回模块规则。 diff --git a/三期/三期装柜闭环产品确认表-2026-08-08.md b/国内货柜履约/国内货柜履约装柜闭环产品确认表-2026-08-08.md similarity index 96% rename from 三期/三期装柜闭环产品确认表-2026-08-08.md rename to 国内货柜履约/国内货柜履约装柜闭环产品确认表-2026-08-08.md index 004772d..b43b294 100644 --- a/三期/三期装柜闭环产品确认表-2026-08-08.md +++ b/国内货柜履约/国内货柜履约装柜闭环产品确认表-2026-08-08.md @@ -1,4 +1,4 @@ -# 三期装柜闭环产品确认表 +# 国内货柜履约装柜闭环产品确认表 > 确认方式:产品只需在“产品确认”一列填写“同意”,或写明修改后的规则。 > 会议目标:本表确认后直接进入开发,不再补完整高保真原型。 @@ -8,7 +8,7 @@ | 事项 | 已确认结论 | |---|---| | 是否新增出仓单 | 不新增,全部状态继续放在现有订单列表和订单详情中 | -| 国内三期做到哪里结束 | 国内做到“装柜完成”即结束 | +| 国内国内货柜履约做到哪里结束 | 国内做到“装柜完成”即结束 | | 海外仓状态由谁更新 | 货物到达海外仓后,由海外仓回传;国内人员不能手工确认 | | 装柜需要哪些照片 | 空仓、半仓、满仓、锁仓、带锁码照片五类;每类至少 1 张有效照片,同类型允许多张 | | 是否填写锁码 | 必填 | @@ -37,7 +37,7 @@ | 13 | 一个订单分到多个柜时,什么时候算订单“装柜完成”? | 建议该订单关联的所有柜次都完成装柜后,订单才显示“装柜完成” | 待确认 | | 14 | 装柜完成后发现错柜、错照片或错锁码,由谁更正? | 建议只有平台指定角色可以更正,必须填写原因并保留修改前记录 | 待确认 | | 15 | 现有“派送完成”状态是否改名? | 建议改为“海外仓已收货”,避免误解为国内派送或末端派送 | 待确认 | -| 16 | 海外仓回传后,国内是否还能更改装柜信息? | 建议不能直接更改,需走单独异常处理流程,不纳入本次三期开发 | 待确认 | +| 16 | 海外仓回传后,国内是否还能更改装柜信息? | 建议不能直接更改,需走单独异常处理流程,不纳入本次国内货柜履约开发 | 待确认 | | 17 | 五类照片需要保存多久? | 请产品、业务或合规给出期限;未确认前不做自动删除 | 待确认 | | 18 | 客户是否可以查看五类装柜照片和锁码? | 建议客户可查看照片和锁码;如存在内部证据,应明确哪些照片仅平台可见 | 待确认 | | 19 | 同一柜次是否允许多人并行拣货? | 待产品确认任务拆分、数量合并、重复扫描和责任归属;未确认前按单任务单作业员设计,但不固化为不可扩展模型 | 待确认 | diff --git a/三期/三期装柜闭环开发前确认单-2026-08-08.md b/国内货柜履约/国内货柜履约装柜闭环开发前确认单-2026-08-08.md similarity index 92% rename from 三期/三期装柜闭环开发前确认单-2026-08-08.md rename to 国内货柜履约/国内货柜履约装柜闭环开发前确认单-2026-08-08.md index 1301f99..9f4f622 100644 --- a/三期/三期装柜闭环开发前确认单-2026-08-08.md +++ b/国内货柜履约/国内货柜履约装柜闭环开发前确认单-2026-08-08.md @@ -1,4 +1,4 @@ -# 三期装柜闭环开发前确认单 +# 国内货柜履约装柜闭环开发前确认单 > 整理日期:2026-08-08 > 用途:产品、业务、仓库、研发在直接开发前确认最小闭环细节 @@ -6,8 +6,8 @@ ## 一、已确认,不再重复讨论 -1. 三期不新增独立出仓单,现有订单列表和订单详情承载三期主状态。 -2. 国内三期终点为 `LOADED`/装柜完成。 +1. 国内货柜履约不新增独立出仓单,现有订单列表和订单详情承载国内货柜履约主状态。 +2. 国内国内货柜履约终点为 `LOADED`/装柜完成。 3. `DELIVERED` 只能在货物到达海外仓后由海外仓可信回传推进,国内 Admin/PDA 不提供手工操作。 4. 空仓、半仓、满仓、锁仓、带锁码照五类证据各至少提交 1 张有效真实图片,可同类型多张追加;带锁码照同时填写锁码文本。 5. PDA 只能现场拍照,Admin 可人工上传;错图不硬删除,以作废记录保留原因、操作人和时间。 @@ -75,7 +75,7 @@ DELIVERED / 海外仓已收货 ### 4.3 Admin 订单详情 -- 在现有订单详情增加“三期作业”区域,不新增出仓单详情。 +- 在现有订单详情增加“国内货柜履约作业”区域,不新增出仓单详情。 - 展示柜次、柜号、拣货进度、五类证据、锁码、各子流程摘要和整体时间线。 - 门禁未通过时展示具体阻塞项,例如“半仓照未上传”“拣货差异待复核”。 - `LOADED` 后隐藏普通编辑动作,仅授权角色可发起冲正。 @@ -109,7 +109,7 @@ DELIVERED / 海外仓已收货 - `LOADED` 后:禁止直接覆盖证据或修改数据库状态,必须发起冲正。 - 冲正记录原因、申请人、审核/执行人、前后状态、原证据版本和请求关联 ID。 - 冲正后重新满足门禁才能再次进入 `LOADED`。 -- 已由海外仓回传进入 `DELIVERED` 后,国内冲正是否允许必须单独制定跨阶段处理规则;三期首版不提供该操作。 +- 已由海外仓回传进入 `DELIVERED` 后,国内冲正是否允许必须单独制定跨业务域处理规则;国内货柜履约当前不提供该操作。 ## 七、验收用例 @@ -132,8 +132,8 @@ DELIVERED / 海外仓已收货 ## 八、本次不自动纳入 - 不新增独立出仓单和对应列表/详情。 -- 不把装船、清关、海外仓入库、海外仓出库和末端派送纳入国内三期。 -- 报关、Client 回执和港务信息是否作为三期上线必交付,以产品对 P3-Q7/P3-Q8/P3-Q9/P3-Q12 的结论为准。 +- 不把装船、清关、海外仓入库、海外仓出库和末端派送纳入国内国内货柜履约。 +- 报关、Client 回执和港务信息是否作为国内货柜履约上线必交付,以产品对 P3-Q7/P3-Q8/P3-Q9/P3-Q12 的结论为准。 - 未确认前,不把订舱、拖车和报关默认设置为 `LOADED` 硬门禁。 ## 九、会议输出 @@ -141,6 +141,6 @@ DELIVERED / 海外仓已收货 产品确认后应形成以下结果: 1. C1 至 C12 均填写最终结论;不能确认的事项明确排除范围和临时方案。 -2. 更新 `三期需求确认表.md` 中对应的 P3-Q2/P3-Q4/P3-Q5/P3-Q6/P3-Q10/P3-Q11/P3-Q12。 +2. 更新 `国内货柜履约需求确认表.md` 中对应的 P3-Q2/P3-Q4/P3-Q5/P3-Q6/P3-Q10/P3-Q11/P3-Q12。 3. 明确是否允许按“服务端门禁 -> PDA -> Admin -> 联调验收”的顺序直接开发。 4. 将本清单作为接口、页面和测试验收的共同依据。 diff --git a/三期/三期闭环审计报告-2026-08-08.md b/国内货柜履约/国内货柜履约闭环审计报告-2026-08-08.md similarity index 69% rename from 三期/三期闭环审计报告-2026-08-08.md rename to 国内货柜履约/国内货柜履约闭环审计报告-2026-08-08.md index 18d61de..7313354 100644 --- a/三期/三期闭环审计报告-2026-08-08.md +++ b/国内货柜履约/国内货柜履约闭环审计报告-2026-08-08.md @@ -1,15 +1,15 @@ -# 虫虫出海三期闭环审计报告 +# 虫虫出海国内货柜履约闭环审计报告 -> 审计日期:2026-08-08 -> 审计范围:二期终点→智能排柜→订舱→拖车→PDA 拣货→装柜/柜封证据→`LOADED`/装柜完成 -> 审计对象:Admin、Client、PDA、`baiyue-firstleg` 后端、OpenAPI/SQL、自动化测试与现有测试环境报告 -> 结论:**NO-GO,当前不能按“三期业务闭环”验收** +> 审计日期:2026-08-08 +> 审计范围:入库测量与计费终点→智能排柜→订舱→拖车→PDA 拣货→装柜/柜封证据→`LOADED`/装柜完成 +> 审计对象:Admin、Client、PDA、`baiyue-firstleg` 后端、OpenAPI/SQL、自动化测试与现有测试环境报告 +> 结论:**NO-GO,当前不能按“国内货柜履约业务闭环”验收** ## 1. 执行摘要 -当前已实现多个真实持久化的三期子能力,不是纯页面原型:智能装柜/预装、订舱、拖车、PDA 拣货接口、装柜证据元数据和装柜清单均已有后端实现,订舱和拖车 API 也已在测试环境完成独立生命周期验证。 +当前已实现多个真实持久化的国内货柜履约子能力,不是纯页面原型:智能装柜/预装、订舱、拖车、PDA 拣货接口、装柜证据元数据和装柜清单均已有后端实现,订舱和拖车 API 也已在测试环境完成独立生命周期验证。 -用户已于 2026-08-08 确认:**三期不新建独立出仓单,现有订单列表就是主流程承载面;国内三期以 `LOADED`/装柜完成为终点**。`DELIVERED`/派送完成只能在货物到达海外仓后由海外仓可信回传推进,不属于国内三期操作和验收范围。因此“没有出仓单”不再是缺口;真正的缺口是现有订单与柜次、订舱、拖车、拣货、装柜证据和报关子流程尚未统一编排,服务端也没有为进入 `LOADED` 提供组合门禁。 +用户已于 2026-08-08 确认:**国内货柜履约不新建独立出仓单,现有订单列表就是主流程承载面;国内国内货柜履约以 `LOADED`/装柜完成为终点**。`DELIVERED`/派送完成只能在货物到达海外仓后由海外仓可信回传推进,不属于国内国内货柜履约操作和验收范围。因此“没有出仓单”不再是缺口;真正的缺口是现有订单与柜次、订舱、拖车、拣货、装柜证据和报关子流程尚未统一编排,服务端也没有为进入 `LOADED` 提供组合门禁。 最重要的判断是: @@ -17,13 +17,13 @@ - **订舱和拖车是可独立运行的业务模块,但尚未与出仓主链强绑定。** - **报关资料/补件/代理提交/回执/客户下载基本未建模。** - **现有订单进入 `LOADED` 的统一门禁和冲正尚未闭合;平台手工推进 `DELIVERED` 的现有接口与最新业务边界冲突。** -- **Client 没有三期协同入口,PDA 仍是演示数据与真实接口混合,尚未完成真实身份、任务领取、文件上传和真机验收。** +- **Client 没有国内货柜履约协同入口,PDA 仍是演示数据与真实接口混合,尚未完成真实身份、任务领取、文件上传和真机验收。** ## 2. 闭环判定口径 -本次不以“有页面”、“有 Controller”或“单模块测试全绿”作为闭环标准。三期只有同时满足以下条件才算闭环: +本次不以“有页面”、“有 Controller”或“单模块测试全绿”作为闭环标准。国内货柜履约只有同时满足以下条件才算闭环: -1. 同一个真实客户订单能从二期终点 `WAIT_SPLIT + APPROVED + CONFIRMED` 进入三期。 +1. 同一个真实客户订单能从入库测量与计费终点 `WAIT_SPLIT + APPROVED + CONFIRMED` 进入国内货柜履约。 2. 同一订单可追溯所属柜次、排柜方案、订舱、拖车、拣货、装柜证据、报关文件与回执。 3. 服务端独立校验所有强制前置,不能靠页面按钮顺序保证。 4. 弱网、重复提交、并发、越权、证据缺失和冲正均有明确行为和审计记录。 @@ -31,42 +31,42 @@ 6. 订单能在服务端门禁通过后进入 `LOADED`/装柜完成;国内端不能手工推进 `DELIVERED`。 7. 有一条测试环境证据,让同一业务对象贯穿全流程,并完成负向门禁验证。 -## 3. 三期业务矩阵 +## 3. 国内货柜履约业务矩阵 | 环节 | 当前能力 | 审计结论 | 主要缺口 | 优先级 | |---|---|---|---|---| -| 二期入口 | 统一订单已有 `WAIT_SPLIT` 投影 | 部分具备 | 没有一条验收数据从二期贯穿到三期终点 | P0 | -| 订单三期主编排 | 订单列表已承载待分柜、装柜中、装柜完成等状态 | 部分具备 | 无订单级统一门禁、子流程关联和整体时间线;不需新建出仓单 | P0 | +| 入库测量与计费入口 | 统一订单已有 `WAIT_SPLIT` 投影 | 部分具备 | 没有一条验收数据从入库测量与计费贯穿到国内货柜履约终点 | P0 | +| 订单国内货柜履约主编排 | 订单列表已承载待分柜、装柜中、装柜完成等状态 | 部分具备 | 无订单级统一门禁、子流程关联和整体时间线;不需新建出仓单 | P0 | | 智能排柜 | 有容量型推荐、预装和持久化 | 部分具备 | 无业务硬约束/软偏好规则版本、冲突解释、独立方案确认和版本对比 | P0 | | 订舱/船期 | 后端生命周期可用,测试环境 API 已通过 | 部分具备 | Admin 创建/版本/返回 DTO 存在契约错配;未与订单/柜次强关联;无数据来源和时效语义 | P0 | -| 拖车预约 | 后端和 Admin 正式模块已存在,API 生命周期已验证 | 部分具备 | 与订单三期编排未汇聚;前端需手填多个关联 ID;附件上传未接入;幂等重放不完整 | P0 | +| 拖车预约 | 后端和 Admin 正式模块已存在,API 生命周期已验证 | 部分具备 | 与订单国内货柜履约编排未汇聚;前端需手填多个关联 ID;附件上传未接入;幂等重放不完整 | P0 | | PDA 拣货 | 有柜次级拣货服务和入库单级汇总接口 | 部分具备 | 两套语义可互相绕过;无领取/分配/复核/异常挂起/撤销闭环;未校验实时处理单元与库位量 | P0 | | 装柜/柜封证据 | 有证据元数据和 File 归属校验 | 部分具备 | 已确认空仓、半仓、满仓、锁仓、带锁码照共 5 张必传,锁码文本必填;当前 Admin/PDA 真实文件上传和服务端硬门禁未实现 | P0 | | 客户上传报关资料 | Client 无正式入口 | **未具备** | 无清单版本、上传、补件、进度和客户隔离契约 | P0 | | 平台报关协同 | 仅有历史文档类型占位 | **未具备** | 无审核退回、补件、代理提交批次、文件版本冻结 | P0 | | 回执上传/客户下载 | 无业务模型和页面 | **未具备** | 无回执类型、版本、可见范围、下载授权和门禁关联 | P0 | -| 出仓后港务/船节点查询 | 订舱实体有 ETD/ETA、船名航次等字段 | 已重新归入四期 | 本历史审计发现的来源、更新时间、过期标识和客户查询端缺口由四期承接,不再作为三期闭环缺口 | 四期 | +| 出仓后港务/船节点查询 | 订舱实体有 ETD/ETA、船名航次等字段 | 已重新归入海外仓业务 | 本历史审计发现的来源、更新时间、过期标识和客户查询端缺口由海外仓业务承接,不再作为国内货柜履约闭环缺口 | 海外仓业务 | | 装柜完成门禁 | 有 `LOADING -> LOADED`,但当前可无证据完成 | **未具备** | 未强制校验 PDA 拣货、5 张真实图片和锁码文本;无冲正 | P0 | -| 海外仓回传边界 | 有平台手工 `DELIVERED` 动作 | **契约冲突** | 国内端可手工推进派送完成;缺海外仓可信来源、签名、防重放、幂等和审计契约 | P0/跨阶段 | -| 客户三期可见性 | 订单详情有拣货/装柜少量只读摘要 | 严重不足 | 无柜次、报关、回执、船期变更时间线 | P0 | +| 海外仓回传边界 | 有平台手工 `DELIVERED` 动作 | **契约冲突** | 国内端可手工推进派送完成;缺海外仓可信来源、签名、防重放、幂等和审计契约 | P0/跨业务域 | +| 客户国内货柜履约可见性 | 订单详情有拣货/装柜少量只读摘要 | 严重不足 | 无柜次、报关、回执、船期变更时间线 | P0 | ## 4. 核心阻断项 -### P0-1:现有订单缺少三期统一编排和服务端门禁 +### P0-1:现有订单缺少国内货柜履约统一编排和服务端门禁 -产品已确认不新建独立出仓单,因此应复用现有订单作为三期主对象,柜次作为多订单共享的执行对象。当前问题不是少一张单,而是订单状态与各子流程尚未由统一编排器计算。 +产品已确认不新建独立出仓单,因此应复用现有订单作为国内货柜履约主对象,柜次作为多订单共享的执行对象。当前问题不是少一张单,而是订单状态与各子流程尚未由统一编排器计算。 当前实际是四条彼此独立的状态链: ```text 装柜计划:EDITING -> LOADING -> COMPLETED -订单国内三期:WAIT_SPLIT -> LOADING -> LOADED +订单国内国内货柜履约:WAIT_SPLIT -> LOADING -> LOADED 海外仓后续回传:LOADED -> DELIVERED 订舱:DRAFT -> SUBMITTED -> CONFIRMED -> RELEASED 拖车:DRAFT -> ... -> DEPARTED -> COMPLETED ``` -订单上没有一个汇聚节点计算“是否可进入下一状态”,因此即使四条链各自通过,也不等于三期闭环。应在现有订单/入库履约聚合上增加统一编排,不应新建重复的出仓单业务对象。 +订单上没有一个汇聚节点计算“是否可进入下一状态”,因此即使四条链各自通过,也不等于国内货柜履约闭环。应在现有订单/入库履约聚合上增加统一编排,不应新建重复的出仓单业务对象。 ### P0-2:装柜完成可绕过拣货和柜封证据 @@ -78,11 +78,11 @@ - 铅封号是否重复; - 订舱、拖车和报关是否属于进入 `LOADED` 的硬门禁(P3-Q11/P3-Q12 尚待确认)。 -现有单元测试 `completesLoadingWithoutEvidenceGate` 还把“无证据也可完成”固化成预期,与三期规划直接冲突。 +现有单元测试 `completesLoadingWithoutEvidenceGate` 还把“无证据也可完成”固化成预期,与国内货柜履约规划直接冲突。 ### P0-3:国内端可手工推进海外仓状态 -当前存在平台手工完成派送的 `POST /delivery/complete` 能力,但最新业务确认是:只有货物到达海外仓后,才能由海外仓可信回传推进 `DELIVERED`。因此该操作必须从国内 Admin/PDA 的三期入口移除或禁用;后续海外仓回传接口需单独定义来源认证、签名/时间窗、防重放、幂等和审计。该接口整改是状态边界修复,但海外仓业务本身不纳入三期验收。 +当前存在平台手工完成派送的 `POST /delivery/complete` 能力,但最新业务确认是:只有货物到达海外仓后,才能由海外仓可信回传推进 `DELIVERED`。因此该操作必须从国内 Admin/PDA 的国内货柜履约入口移除或禁用;后续海外仓回传接口需单独定义来源认证、签名/时间窗、防重放、幂等和审计。该接口整改是状态边界修复,但海外仓业务本身不纳入国内货柜履约验收。 ### P0-4:报关协同和回执链路未实现 @@ -122,7 +122,7 @@ PDA 已有调用拣货/证据/装柜接口的适配代码,但当前仍存在 ## 5. 已实现且可保留的能力 -本次 NO-GO 不代表三期必须重做。以下能力已有明确复用价值: +本次 NO-GO 不代表国内货柜履约必须重做。以下能力已有明确复用价值: - 柜次、智能装柜、预装和装柜清单的持久化模型。 - 订舱 `DRAFT -> SUBMITTED -> CONFIRMED -> RELEASED` 生命周期、历史和幂等。 @@ -130,7 +130,7 @@ PDA 已有调用拣货/证据/装柜接口的适配代码,但当前仍存在 - 柜次级 PDA 明细拣货、部分拣货和跳过与防重操作。 - 装柜证据文件归属校验、业务历史、乐观锁和部分幂等基础。 - Admin 订舱和拖车页面壳、统一订单后半程组件。 -- Client 对统一订单三期只读摘要的兼容映射。 +- Client 对统一订单国内货柜履约只读摘要的兼容映射。 ## 6. 需求确认项重新定性 @@ -148,7 +148,7 @@ PDA 已有调用拣货/证据/装柜接口的适配代码,但当前仍存在 | P3-Q9 港务 | 仅有订舱船期字段 | 仍为 P1,但必须在客户展示前确认 | | P3-Q10 冲正 | 无 reverse 动作 | 仍为 P0 高风险状态阻断 | | P3-Q11 强制前置/并行 | 子模块彼此独立 | 仍为 P0 统一门禁阻断 | -| P3-Q13 三期终点 | 已确认国内终点为 `LOADED`;`DELIVERED` 由海外仓回传 | 已解除范围阻断;需整改国内手工派送接口 | +| P3-Q13 国内货柜履约终点 | 已确认国内终点为 `LOADED`;`DELIVERED` 由海外仓回传 | 已解除范围阻断;需整改国内手工派送接口 | ## 7. 自动化和环境证据 @@ -167,13 +167,13 @@ PDA 已有调用拣货/证据/装柜接口的适配代码,但当前仍存在 `reports/admin-test-env-acceptance-all-green-20260808.json` 记录 Gateway `http://8.163.30.128:9000` 的 549/549 项通过,其中订舱 23 项、拖车 43 项、service-center-flow 10 项。这证明已部署子模块的 API 生命周期可用。 -`docs/二三期业务功能测试回归报告.md` 在 2026-08-07 将“三期结果”写为通过,但其明确的三期测试范围只有:虚拟柜、智能装柜、预装、PDA 拣货和最终装柜清单。该结论应改名为“三期装柜子链路通过”,不应作为整期闭环证据。 +`docs/入库测量与计费及国内货柜履约业务功能测试回归报告.md` 在 2026-08-07 将“国内货柜履约结果”写为通过,但其明确的国内货柜履约测试范围只有:虚拟柜、智能装柜、预装、PDA 拣货和最终装柜清单。该结论应改名为“国内货柜履约装柜子链路通过”,不应作为整期闭环证据。 ### 7.3 测试缺口 当前缺少以下验收证据: -- 同一订单从二期 `WAIT_SPLIT` 贯穿到三期终点。 +- 同一订单从入库测量与计费 `WAIT_SPLIT` 贯穿到国内货柜履约终点。 - 订舱、拖车、柜次、拣货、证据和报关关联到同一批订单/柜次。 - 未完成 PDA 拣货、缺任意一张必传照片或缺锁码文本时,进入 `LOADED` 必须失败。 - 若 P3-Q11/P3-Q12 将订舱、拖车或报关确认为硬门禁,对应前置未满足时进入 `LOADED` 必须失败。 @@ -188,10 +188,10 @@ PDA 已有调用拣货/证据/装柜接口的适配代码,但当前仍存在 ### 里程碑 A:锁定业务契约(P0) 1. 由产品/业务对尚未确认的 P3-Q1/Q2/Q5/Q7/Q8/Q10/Q11/Q12 给出最终结论。 -2. 按已确认结论固定三期终点为 `LOADED`/装柜完成,并将 `DELIVERED` 移出国内三期状态操作。 +2. 按已确认结论固定国内货柜履约终点为 `LOADED`/装柜完成,并将 `DELIVERED` 移出国内国内货柜履约状态操作。 3. 定义订舱、拖车和报关中哪些是进入 `LOADED` 的强制前置,哪些允许并行。 -### 里程碑 B:在现有订单上建立三期统一编排与门禁(P0) +### 里程碑 B:在现有订单上建立国内货柜履约统一编排与门禁(P0) 1. 复用现有订单主状态,补齐订单-柜次关联、整体时间线、版本和审计投影,不新建出仓单。 2. 将排柜、订舱、拖车、拣货、证据和报关子流程绑定到订单/柜次。 @@ -220,22 +220,22 @@ PDA 已有调用拣货/证据/装柜接口的适配代码,但当前仍存在 ## 9. GO 准入标准 -以下条件全部满足后,才建议将三期从 NO-GO 改为 GO: +以下条件全部满足后,才建议将国内货柜履约从 NO-GO 改为 GO: - [ ] P3-Q1至P3-Q13 已有明确结论,文档与代码口径一致。 -- [ ] 现有订单可通过柜次追溯全部三期子流程。 +- [ ] 现有订单可通过柜次追溯全部国内货柜履约子流程。 - [ ] 装柜完成门禁在服务端生效,缺 PDA 拣货、任一必传照片或锁码文本时不能进入 `LOADED`。 - [ ] 报关资料、补件、代理提交、回执和客户下载闭环。 -- [ ] Admin 所有三期正式入口可达,前后端 DTO 和权限一致。 -- [ ] Client 只能访问当前客户的三期数据和文件。 +- [ ] Admin 所有国内货柜履约正式入口可达,前后端 DTO 和权限一致。 +- [ ] Client 只能访问当前客户的国内货柜履约数据和文件。 - [ ] PDA 真实鉴权、任务、扫码、文件上传、弱网和重试已真机通过。 - [ ] 装柜完成后进入 `LOADED` 并支持授权冲正,国内端不能手工推进 `DELIVERED`。 - [ ] 同一测试订单完成全链路正向与负向验收,证据可重放。 ## 10. 最终结论 -当前三期建议对外口径为: +当前国内货柜履约建议对外口径为: -> **三期已确认复用现有订单列表承载全部主状态,不新建出仓单,国内终点为 `LOADED`/装柜完成;已完成排柜/预装/PDA 拣货/装柜清单子链路,订舱和拖车 API 可用。但订单三期统一编排、五张装柜照片与锁码文本硬门禁、报关协同、冲正、Client 协同和 PDA 真机仍未闭环,且国内手工推进 `DELIVERED` 的现有能力必须整改,当前不具备整期验收条件。** +> **国内货柜履约已确认复用现有订单列表承载全部主状态,不新建出仓单,国内终点为 `LOADED`/装柜完成;已完成排柜/预装/PDA 拣货/装柜清单子链路,订舱和拖车 API 可用。但订单国内货柜履约统一编排、五张装柜照片与锁码文本硬门禁、报关协同、冲正、Client 协同和 PDA 真机仍未闭环,且国内手工推进 `DELIVERED` 的现有能力必须整改,当前不具备整期验收条件。** -因此,现阶段不应标记“三期完成”,应标记为“**子能力已实现,闭环整改中**”。 +因此,现阶段不应标记“国内货柜履约完成”,应标记为“**子能力已实现,闭环整改中**”。 diff --git a/三期/三期需求确认表.md b/国内货柜履约/国内货柜履约需求确认表.md similarity index 79% rename from 三期/三期需求确认表.md rename to 国内货柜履约/国内货柜履约需求确认表.md index 4d938c0..75d1f41 100644 --- a/三期/三期需求确认表.md +++ b/国内货柜履约/国内货柜履约需求确认表.md @@ -1,14 +1,14 @@ -# 虫虫出海三期需求确认表 +# 虫虫出海国内货柜履约需求确认表 > 创建日期:2026-07-28 > 当前状态:已进入开发规划(已确认结论按本表执行;技术实现项仍需契约评审) -> 用途:记录会影响三期范围、流程、数据模型、页面和验收的产品决策。 +> 用途:记录会影响国内货柜履约范围、流程、数据模型、页面和验收的产品决策。 ## 一、维护规则 - 状态统一使用:待确认、确认中、已确认、已取消。 - 阻断级别统一使用:开工阻断、模块阻断、非阻断。 -- 结论确认后同步更新 `三期开发规划.md`、`三期开发进度表.md` 和受影响的页面原型。 +- 结论确认后同步更新 `国内货柜履约开发规划.md`、`国内货柜履约开发进度表.md` 和受影响的页面原型。 - 未确认事项只能作为候选方案,不能直接写成固定开发或验收承诺。 ## 二、确认事项 @@ -19,15 +19,15 @@ | P3-Q2 | 是否存在拼柜、一单多柜和拆批出仓? | 通过订单-柜次关系预留能力,页面按高频场景逐步开放 | 开工阻断 | 已确认 | 产品/业务 | 2026-08-10 | 支持一单多柜、一个柜拼多个订单;采用“父订单→子订单→柜次”关系。已装载数量形成子订单,未装载数量自动生成待后续处理的子订单;不新建独立出仓单 | 订单、柜次、排柜、拣货 | | P3-Q3 | 原型“预约托车”是否统一为“预约拖车”? | 建议使用行业常用的“拖车”,同时确认业务实际含义 | 非阻断 | 已确认 | 产品/业务 | 2026-08-10 | 页面、接口和文档统一使用“预约拖车” | 页面文案、接口字段说明 | | P3-Q4 | PDA 开发、扫描与发布方式是什么? | 保持设备适配层,不绑定厂商 SDK | 非阻断 | 已确认 | 用户当前对话确认 | 2026-08-10 | 采用 uni-app 开发并支持在线更新;Android 广播方式已接入:Action=`android.intent.action.SCANRESULT`、字符串 Extra=`value`。设备型号不构成开发、发布或验收门禁,扫描适配保持厂商无关 | PDA 拣货、在线更新、真机验收 | -| P3-Q5 | 拣货是否依赖实时库存和库位可用量? | 默认使用二期处理单元和当前位置;如需完整库存,单独评估 WMS 范围 | 开工阻断 | 已确认 | 产品/业务 | 2026-08-10 | PDA 拣货必须依赖实时库存和库位可用量;首版复用二期处理单元、当前位置和可用量接口,超量、库存不足和库位不可用由服务端拒绝;不扩展完整 WMS | 二三期契约、拣货、库存边界 | +| P3-Q5 | 拣货是否依赖实时库存和库位可用量? | 默认使用入库测量与计费处理单元和当前位置;如需完整库存,单独评估 WMS 范围 | 开工阻断 | 已确认 | 产品/业务 | 2026-08-10 | PDA 拣货必须依赖实时库存和库位可用量;首版复用入库测量与计费处理单元、当前位置和可用量接口,超量、库存不足和库位不可用由服务端拒绝;不扩展完整 WMS | 入库测量与计费及国内货柜履约契约、拣货、库存边界 | | P3-Q6 | 柜封照片有哪些必传类型、数量、采集方式、处理规则和留存期限? | 五类证据、角色和留存按确认版直接进入契约 | 模块阻断 | 已确认 | 产品/业务 | 2026-08-10 | 空仓、半仓、满仓、锁仓、带锁码照五类各至少 1 张有效照片,同类型可无限追加;PDA 只能现场拍照;后台操作员和理货员可人工上传;拣货员只负责 PDA 现场采集,不开放后台人工上传;错图不硬删除,按原因、操作人、时间作废;带锁码照必须填写锁码文本;照片无限期保留,客户不可见照片和锁码 | 装柜、PDA 拍照、Admin 上传、文件存储、订单后程门禁 | | P3-Q7 | 报关资料清单是否按国家、渠道和货物类型变化? | 清单配置化,并保存业务使用的清单版本 | 模块阻断 | 已确认 | 产品/业务 | 2026-08-10 | 首版不对接海关或代理系统;按人工维护资料清单、收集/补件并保存版本,具体清单可配置 | 客户资料、报关审核、文件版本 | | P3-Q8 | 报关代理如何接收资料并返回回执? | 首版系统内整理、线下提交,正式接口后续评估 | 模块阻断 | 已确认 | 产品/业务 | 2026-08-10 | 全部人工处理:平台整理资料后线下交代理,授权人员人工上传代理回执;系统记录提交批次、回执版本和时间,不建设自动对接 | 报关协同、回执上传 | -| P3-Q9 | “港务信息”指船期、港口作业状态还是两者,包含哪些字段,由谁维护? | 三期只维护订舱与出仓前船期资料 | 已重新归期 | 已确认 | 产品/业务 | 2026-08-19 | 柜子确认离开国内仓库后的船公司/货物跟踪查询、每 3 天最多 3 次、来源、更新时间和过期标识整体归四期;三期不建设或验收该查询 | 三期订舱资料、四期船节点查询 | +| P3-Q9 | “港务信息”指船期、港口作业状态还是两者,包含哪些字段,由谁维护? | 国内货柜履约只维护订舱与出仓前船期资料 | 已重新归期 | 已确认 | 产品/业务 | 2026-08-19 | 柜子确认离开国内仓库后的船公司/货物跟踪查询、每 3 天最多 3 次、来源、更新时间和过期标识整体归海外仓业务;国内货柜履约不建设或验收该查询 | 国内货柜履约订舱资料、海外仓业务船节点查询 | | P3-Q10 | 订单进入“装柜完成”后发现错误如何处理? | 仅保留线下人工处理和审计,不建设在线冲正 | 模块阻断 | 已确认 | 产品/业务 | 2026-08-10 | `LOADED` 后不提供在线冲正/回退入口,统一线下人工处理;系统保留原状态和审计记录,不由国内 Admin/PDA 推进 `DELIVERED` | 装柜完成门禁、权限、审计 | | P3-Q11 | 九个动作中哪些是强制前置,哪些允许并行? | 统一门禁按已确认前置执行;PDA 单柜次单人作业 | 开工阻断 | 已确认 | 产品/业务 | 2026-08-10 | 订舱完成、拖车完成、报关资料完成且有放行回执、PDA 拣货完成及五类证据完整均为进入 `LOADED` 的强制门禁;PDA 单柜次单人作业,不做多人并行;进入任务即拣货中,提交时批量写入 | 全流程、状态机、PDA、页面进度 | | P3-Q12 | 报关回执包含哪些类型,海关放行是否为装柜完成硬门禁? | 有效放行回执作为硬门禁,首版人工上传 | 开工阻断 | 已确认 | 产品/业务 | 2026-08-10 | 首版回执由人工上传;必须存在有效放行回执才能通过 `LOADED` 门禁。回执类型和版本可追溯,具体字段按人工业务单据映射 | 报关状态、装柜完成门禁、客户回执 | -| P3-Q13 | 三期终点以什么状态为准? | 国内系统以能掌控的最后环节为终点 | 开工阻断 | 已确认 | 用户当前对话确认 | 2026-08-08 | 三期终点为 `LOADED`/装柜完成;`DELIVERED`/派送完成只能在到达海外仓后由海外仓可信回传推进,不属于国内三期操作和验收范围 | 阶段边界、状态、里程碑、验收、海外仓回传 | +| P3-Q13 | 国内货柜履约终点以什么状态为准? | 国内系统以能掌控的最后环节为终点 | 开工阻断 | 已确认 | 用户当前对话确认 | 2026-08-08 | 国内货柜履约终点为 `LOADED`/装柜完成;`DELIVERED`/派送完成只能在到达海外仓后由海外仓可信回传推进,不属于国内国内货柜履约操作和验收范围 | 阶段边界、状态、里程碑、验收、海外仓回传 | | P3-Q14 | 订舱、渠道柜次、放舱与智能排柜的先后关系是什么? | 线下已订妥的订舱在创建时完整登记五项真实运输快照并直接确认;放舱不覆盖首次快照 | 开工阻断 | 已确认 | 用户当前对话确认 | 2026-08-12 | 订舱创建请求必须携带提单号、船名、航次、预计开船时间、预计到港时间五项真实运输数据,并直接进入 `CONFIRMED`;渠道、箱型和数量同时确定,系统按箱型需求数量生成绑定渠道的稳定内部柜次。未放舱不影响候选查询、智能推荐、人工调整和保存装柜计划;同一柜次只能装同渠道入库单,服务端禁止跨渠道混装。`RELEASED` 仅作为后续放舱/PDA 门禁,不补录、不覆盖首次五项运输快照;真实集装箱号可在放舱时或之后录入 | 订舱、柜次、智能排柜、预装、PDA、运输信息 | ### 2.1 PDA 已确认子决策 @@ -44,23 +44,23 @@ | P3-PDA-D08 | 2026-08-09 | 同类型证据允许多张并采用追加记录;错误/重复照片不硬删除,只作废 | 每条照片独立保存;作废记录原因、操作人和时间,历史可追溯 | | P3-PDA-D09 | 2026-08-09 | 空仓、半仓、满仓、锁仓、带锁码照五类证据各至少 1 张有效且未作废的照片,可多张;带锁码照同时要求锁码文本 | 服务端完整性门禁按“每类至少一张有效记录”校验,不能按单槽位替换模型实现 | -> 验收映射:当前自动化已真实覆盖五类证据上传、同类型多图追加、跨类型/伪造 `fileId` 拒绝、锁码文本门禁和错图作废审计;设备在线、持久化草稿批量提交仍按[验收任务拆分与待确认清单](三期验收任务拆分与待确认清单.md)保留 coverageGap。 +> 验收映射:当前自动化已真实覆盖五类证据上传、同类型多图追加、跨类型/伪造 `fileId` 拒绝、锁码文本门禁和错图作废审计;设备在线、持久化草稿批量提交仍按[验收任务拆分与待确认清单](国内货柜履约验收任务拆分与待确认清单.md)保留 coverageGap。 ## 三、已确认架构决策 | 编号 | 确认日期 | 最终结论 | 影响 | |---|---|---|---| -| P3-D1 | 2026-08-08 | 三期不新建独立出仓单,现有订单列表承载全部主状态;柜次、订舱、拖车、拣货、证据和报关作为订单关联子对象 | 取消出仓单页面和数据模型规划,改为增强现有订单列表/详情及服务端统一编排 | +| P3-D1 | 2026-08-08 | 国内货柜履约不新建独立出仓单,现有订单列表承载全部主状态;柜次、订舱、拖车、拣货、证据和报关作为订单关联子对象 | 取消出仓单页面和数据模型规划,改为增强现有订单列表/详情及服务端统一编排 | | P3-D2 | 2026-08-10 | 订单拆分采用“父订单→子订单→柜次”;已装载数量形成子订单,未装载数量自动生成后续子订单;支持一单多柜和多订单拼柜 | 后端必须保留父子订单、柜次、数量分摊和整体时间线;不得把未装载部分静默丢弃 | | P3-D3 | 2026-08-10 | `LOADED` 的硬门禁包含订舱完成、拖车完成、报关放行回执、PDA 拣货完成和五类证据完整;`LOADED` 后错误线下人工处理 | 统一门禁服务负责校验,国内页面不提供在线冲正或 `DELIVERED` 操作 | -| P3-D4 | 2026-08-10;2026-08-19 更正归期 | 船公司官网查询:每 3 天一次、最多 3 次,保存来源、更新时间和过期标识 | 该能力及首批六家来源整体归四期,三期只保留订舱与出仓前船期资料 | +| P3-D4 | 2026-08-10;2026-08-19 更正归期 | 船公司官网查询:每 3 天一次、最多 3 次,保存来源、更新时间和过期标识 | 该能力及首批六家来源整体归海外仓业务,国内货柜履约只保留订舱与出仓前船期资料 | | P3-D5 | 2026-08-10 | 初始化仓库常用角色:操作员、拣货员、理货员;按最小权限授予拣货、证据上传和查看能力 | 角色初始化由 IAM/统一 SQL 任务实现,具体权限矩阵在技术契约评审中落表 | ## 四、建议确认顺序 1. 已完成 P3-Q1~P3-Q3、P3-Q5~P3-Q14 的产品确认,可直接进入契约和实现拆分。 2. P3-Q4 已确认采用 uni-app、在线更新与 Android 广播扫描;后续按既定发布安排完成常规真机验收。 -3. P3-Q5 已确认复用二期实时库存、当前位置和可用量接口,完整 WMS 不纳入三期。 +3. P3-Q5 已确认复用入库测量与计费实时库存、当前位置和可用量接口,完整 WMS 不纳入国内货柜履约。 ## 五、产品与业务确认会议 @@ -74,15 +74,15 @@ ### 5.2 会议输入 - 本确认表中的 P3-Q1~P3-Q13。 -- `三期开发规划.md` 的流程、状态、里程碑和任务骨架。 -- `三期页面与原型清单.md` 中已有参考原型和待补页面。 -- 二期输出契约、目标 PDA 信息、文件存储能力及报关/港务协作现状。 +- `国内货柜履约开发规划.md` 的流程、状态、里程碑和任务骨架。 +- `国内货柜履约页面与原型清单.md` 中已有参考原型和待补页面。 +- 入库测量与计费输出契约、目标 PDA 信息、文件存储能力及报关/港务协作现状。 ### 5.3 每项确认要求 1. 必须填写负责人、计划确认日期和可执行的最终结论,不能只记录“按建议处理”。 2. 最终结论需明确正常流程、异常/冲正、权限责任和验收口径。 -3. 暂缓事项必须写明本期是否排除、临时方案、影响模块和再次确认日期。 +3. 暂缓事项必须写明当前范围是否排除、临时方案、影响模块和再次确认日期。 4. 开工阻断项未解除时,不得将受影响模块标记为可开发。 5. 会议结束后,将结论同步到开发规划、开发进度表、页面原型和后续验收任务。 @@ -90,6 +90,6 @@ - 14 项确认事项的状态和最终结论已同步;P3-Q4 已确认采用 uni-app、在线更新与 Android 广播扫描。 - 需要新增或调整的原型清单。 -- 三期范围内/范围外清单及跨期依赖。 +- 国内货柜履约范围内/范围外清单及跨期依赖。 - 仍有风险的事项、责任人和完成日期。 - 已允许进入 T02 契约设计与任务拆分;未决技术项只阻断其对应实现,不反向阻断整期已确认范围。 diff --git a/三期/三期页面与原型清单.md b/国内货柜履约/国内货柜履约页面与原型清单.md similarity index 73% rename from 三期/三期页面与原型清单.md rename to 国内货柜履约/国内货柜履约页面与原型清单.md index 7f08845..7bfd6f3 100644 --- a/三期/三期页面与原型清单.md +++ b/国内货柜履约/国内货柜履约页面与原型清单.md @@ -1,9 +1,9 @@ -# 虫虫出海三期页面与原型清单 +# 虫虫出海国内货柜履约页面与原型清单 -> 创建日期:2026-07-28 -> 当前状态:核心 Admin 装柜页面已部署联调;PDA 提交契约和客户端三期页面仍未完成 +> 创建日期:2026-07-28 +> 当前状态:核心 Admin 装柜页面已部署联调;PDA 提交契约和客户端国内货柜履约页面仍未完成 > 原型依据:`参考资料/出仓流程.png`、现有订单列表/详情、现有 PDA 拣货原型 -> 已确认边界:不新增独立出仓单;国内三期终点为 `LOADED`/装柜完成 +> 已确认边界:不新增独立出仓单;国内国内货柜履约终点为 `LOADED`/装柜完成 ## 一、维护规则 @@ -16,11 +16,11 @@ | 页面 ID | 页面/入口 | 主要能力 | 对应大任务 | 原型状态 | 依赖确认项 | 备注 | |---|---|---|---|---|---|---| -| P3-ADM-01 | 现有订单列表三期增强 | 查询、筛选、三期主状态、异常和阻塞摘要 | T03 订单三期编排与柜次 | 待原型 | P3-Q2、P3-Q11 | 复用现有订单列表,不新增出仓单列表和创建入口 | -| P3-ADM-02 | 现有订单详情三期增强 | 柜次、任务、五类装柜照片、锁码、报关和时间线 | T03 订单三期编排与柜次 | 待原型 | P3-Q11 | 组合现有货柜和装柜清单能力,补统一编排区 | +| P3-ADM-01 | 现有订单列表国内货柜履约增强 | 查询、筛选、国内货柜履约主状态、异常和阻塞摘要 | T03 订单国内货柜履约编排与柜次 | 待原型 | P3-Q2、P3-Q11 | 复用现有订单列表,不新增出仓单列表和创建入口 | +| P3-ADM-02 | 现有订单详情国内货柜履约增强 | 柜次、任务、五类装柜照片、锁码、报关和时间线 | T03 订单国内货柜履约编排与柜次 | 待原型 | P3-Q11 | 组合现有货柜和装柜清单能力,补统一编排区 | | P3-ADM-03 | 智能排柜 | 生成建议、冲突、调整和确认 | T04 智能排柜 | 开发中 | P3-Q1、P3-Q2 | Admin `/container-loading/smart-loading` 已部署;真实完成态受 PDA 门禁阻断 | | P3-ADM-04 | 订舱管理 | 订舱申请、结果、变更和异常 | T05 订舱与港务信息 | 已有参考原型 | P3-Q9、P3-Q11 | 已有订舱列表、新增和详情 | -| P3-ADM-05 | 订舱与出仓前船期资料 | 人工维护船名航次、港口及预计时间快照 | T05 订舱资料 | 部分参考原型 | P3-Q9 | 出仓后的来源、更新时间和节点查询页面整体归四期 | +| P3-ADM-05 | 订舱与出仓前船期资料 | 人工维护船名航次、港口及预计时间快照 | T05 订舱资料 | 部分参考原型 | P3-Q9 | 出仓后的来源、更新时间和节点查询页面整体归海外仓业务 | | P3-ADM-06 | 拖车预约 | 服务商、车辆司机、时间窗和节点 | T06 拖车预约 | 已有参考原型 | P3-Q3、P3-Q11 | 已有拖车列表和新增表单,需补预约及到离仓节点 | | P3-ADM-07 | 拣货任务与复核 | 分配、进度、差异、复核和异常 | T07 PDA 拣货与复核 | 已阻塞 | P3-Q5 | 真实任务领取可用;PDA `pick` 仍返回 S0500,批量提交契约未实现 | | P3-ADM-08 | 装柜证据复核 | 柜号、锁码文本、五类多图、Admin 上传、作废和复核 | T08 装柜及柜封证据 | 开发中 | P3-Q6 | 五类多图追加、作废和 Admin 上传已通过真实接口;终态复核受 PDA 阻断 | @@ -31,11 +31,11 @@ | 页面 ID | 页面/入口 | 主要能力 | 对应大任务 | 原型状态 | 依赖确认项 | 备注 | |---|---|---|---|---|---|---| -| P3-CLI-01 | 现有订单列表三期增强 | 查看本企业订单的装柜阶段、柜次和当前节点 | T11 客户端三期协同 | 待原型 | P3-Q11 | 复用现有订单列表,不新增出仓单列表 | -| P3-CLI-02 | 现有订单详情三期增强 | 时间线、柜号、船期和允许公开的证据 | T11 客户端三期协同 | 待原型 | P3-Q6、P3-Q9 | 在现有订单详情补三期区块,不新建重复详情对象 | +| P3-CLI-01 | 现有订单列表国内货柜履约增强 | 查看本企业订单的装柜阶段、柜次和当前节点 | T11 客户端国内货柜履约协同 | 待原型 | P3-Q11 | 复用现有订单列表,不新增出仓单列表 | +| P3-CLI-02 | 现有订单详情国内货柜履约增强 | 时间线、柜号、船期和允许公开的证据 | T11 客户端国内货柜履约协同 | 待原型 | P3-Q6、P3-Q9 | 在现有订单详情补国内货柜履约区块,不新建重复详情对象 | | P3-CLI-03 | 报关资料上传 | 清单、上传、补件、版本和处理进度 | T09 报关资料与回执 | 待原型 | P3-Q7 | 文件规则确认后细化 | | P3-CLI-04 | 报关回执下载 | 回执列表、类型、版本和授权下载 | T09 报关资料与回执 | 待原型 | P3-Q8、P3-Q12 | 区分客户可见回执 | -| P3-CLI-05 | 出仓前船期资料 | 订舱预计开船、到港快照和变更 | T11 客户端三期协同 | 待原型 | P3-Q9 | 出仓后的实时节点、来源、更新时间和过期展示归四期 | +| P3-CLI-05 | 出仓前船期资料 | 订舱预计开船、到港快照和变更 | T11 客户端国内货柜履约协同 | 待原型 | P3-Q9 | 出仓后的实时节点、来源、更新时间和过期展示归海外仓业务 | ## 四、PDA @@ -52,5 +52,5 @@ 1. 先修复 PDA `pick` 第二处 `S0500`,恢复领取、拣货、复核、装柜完成和报关终态真实链路。 2. 单独实现 P3-PDA-04 原子批量提交契约,覆盖整批事务、幂等、版本/库存快照和失败回滚。 3. 完成 P3-PDA-05 真机拍照、多图追加、失败重试与作废验收。 -4. 补齐 P3-ADM-01、P3-ADM-02、P3-ADM-10 和企业客户端三期页面的最终交互验收。 -5. 复跑三期定向和默认全量 HTTP 验收,只有所有硬门禁真实通过后才把页面和整期标记为完成。 +4. 补齐 P3-ADM-01、P3-ADM-02、P3-ADM-10 和企业客户端国内货柜履约页面的最终交互验收。 +5. 复跑国内货柜履约定向和默认全量 HTTP 验收,只有所有硬门禁真实通过后才把页面和整期标记为完成。 diff --git a/三期/三期验收任务拆分与待确认清单.md b/国内货柜履约/国内货柜履约验收任务拆分与待确认清单.md similarity index 90% rename from 三期/三期验收任务拆分与待确认清单.md rename to 国内货柜履约/国内货柜履约验收任务拆分与待确认清单.md index 2f4e896..217e0a6 100644 --- a/三期/三期验收任务拆分与待确认清单.md +++ b/国内货柜履约/国内货柜履约验收任务拆分与待确认清单.md @@ -1,4 +1,4 @@ -# 三期验收任务拆分与待确认清单 +# 国内货柜履约验收任务拆分与待确认清单 > 更新日期:2026-08-10 > 本清单只描述真实 HTTP/设备验收边界,不把原型或 mock 结果视为通过。 @@ -14,7 +14,7 @@ | 锁码门禁 | 缺少锁码照片或锁码文本为空时,完成装柜请求被拒绝 | `phase3-loading.mjs` | | 统一装柜门禁 | 订舱未完成、拖车未完成、报关无有效放行回执、PDA 未完成或五类证据不完整时,真实 `LOADED` 请求均被拒绝 | `service-center-flow.mjs` / `phase3-loading.mjs` | | 订单/柜次聚合 | 一单多柜、一个柜多订单、父子订单数量分摊及未装数量自动生成子订单可追溯 | `phase3-order-aggregate.mjs`(待补) | -| 出仓后船节点查询 | 已重新归入四期,不属于三期验收 | 四期沿用现有 `CarrierScheduleQuery` 设计验收入口,不再补 `phase3-vessel-tracking.mjs` | +| 出仓后船节点查询 | 已重新归入海外仓业务,不属于国内货柜履约验收 | 海外仓业务沿用现有 `CarrierScheduleQuery` 设计验收入口,不再补 `phase3-vessel-tracking.mjs` | | 仓库角色 | 操作员、拣货员、理货员初始化、最小权限和跨客户隔离 | `phase3-role-contract.mjs`(待补) | | 伪造与交叉归属 | 不存在 `fileId`、其他证据类型的 `fileId` 不能绑定 | `phase3-loading.mjs` | diff --git a/国内货柜履约/虫虫出海国内货柜履约开发进度表.xlsx b/国内货柜履约/虫虫出海国内货柜履约开发进度表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b3e9b591a700ce695e8dbcba854898dba3c374f3 GIT binary patch literal 30688 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 Z-D^2$&?FB5@f`FU1P1{jVfV+o{|DXZfRq3L literal 0 HcmV?d00001 diff --git a/三期/货柜履约原型字段验收矩阵-2026-08-17.md b/国内货柜履约/货柜履约原型字段验收矩阵-2026-08-17.md similarity index 100% rename from 三期/货柜履约原型字段验收矩阵-2026-08-17.md rename to 国内货柜履约/货柜履约原型字段验收矩阵-2026-08-17.md diff --git a/三期/货柜管理全链验收矩阵-2026-08-13.md b/国内货柜履约/货柜管理全链验收矩阵-2026-08-13.md similarity index 97% rename from 三期/货柜管理全链验收矩阵-2026-08-13.md rename to 国内货柜履约/货柜管理全链验收矩阵-2026-08-13.md index 14b5f40..fb6a309 100644 --- a/三期/货柜管理全链验收矩阵-2026-08-13.md +++ b/国内货柜履约/货柜管理全链验收矩阵-2026-08-13.md @@ -8,7 +8,7 @@ ## 验收口径 -- 本矩阵以当前对话、三期产品确认版开发规划和实际冻结契约为准。旧确认单中的待确认项不覆盖后续已冻结结论。 +- 本矩阵以当前对话、国内货柜履约产品确认版开发规划和实际冻结契约为准。旧确认单中的待确认项不覆盖后续已冻结结论。 - 已冻结能力按事实来源落具体路径和断言;尚未冻结能力继续只保留能力级占位,不预设 HTTP 方法、路径、DTO 字段或业务错误码。 - 自动化必须通过业务 API 生成数据;人工验收必须能从 Admin/PDA 可见入口点击到对应状态。不得以数据库直写、mock、原型或前端本地假状态代替。 - 每次真实 HTTP 验收记录请求用途、响应状态、业务码、`requestId`、`traceId`、关键资源 ID 和清理/保留策略;敏感凭据不得写入报告。 @@ -105,19 +105,19 @@ ## P3-Q14 文档同步待总控统一 - 当前冻结验收时序:订舱只登记 `containerRequirements` 并在完整 release 后进入 `RELEASED`;不会生成真实货柜。未订舱时先建 `SIMULATION/ACTIVE` 模拟柜并排货、无号 push,港口取得真实 `containerNo` 后用四字段 link 原地补全模拟柜并创建 allocation。 -- `docs/三期/三期需求确认表.md` 的 P3-Q14 尚未完整描述新的 DRAFT/RELEASED 与港口四字段关联模型。本任务不擅改需求确认表,标记为 `WAIT_CONTROLLER_DOC_SYNC`,由总控统一文档;本矩阵及自动化以当前冻结 DTO/OpenAPI 为准。 +- `docs/国内货柜履约/国内货柜履约需求确认表.md` 的 P3-Q14 尚未完整描述新的 DRAFT/RELEASED 与港口四字段关联模型。本任务不擅改需求确认表,标记为 `WAIT_CONTROLLER_DOC_SYNC`,由总控统一文档;本矩阵及自动化以当前冻结 DTO/OpenAPI 为准。 - 五项运输事实保存在 DRAFT 聚合,release 只校验完整性并冻结持久化快照;RELEASED 不接受编辑或删除。 ## 契约冻结清单 ### 既有冻结基线 -以下能力在本轮新增 overview 契约之前已经由三期产品确认版、既有 OpenAPI/Controller 和专项测试冻结。本轮不重定义其路径或状态机。 +以下能力在本轮新增 overview 契约之前已经由国内货柜履约产品确认版、既有 OpenAPI/Controller 和专项测试冻结。本轮不重定义其路径或状态机。 | 能力标识 | 冻结边界 | 事实来源 | 状态 | |---|---|---|---| | `booking-requirements-and-port-link` | 订舱按 `containerRequirements[]` 保存箱型数量,不生成真实柜;link 在港口取得真实柜号后补全模拟柜并创建 allocation | `PlatformContainerController`、`ContainerService`、`OceanBookingService`、`firstleg-v1.yaml`、`ocean-bookings-v1.yaml` | 本轮目标冻结,待环境验收 | -| `channel-isolation` | 渠道隔离与禁止跨渠道混装 | 三期产品确认版及既有排柜契约 | 既有冻结,待环境验收 | +| `channel-isolation` | 渠道隔离与禁止跨渠道混装 | 国内货柜履约产品确认版及既有排柜契约 | 既有冻结,待环境验收 | | `container-number-lifecycle` | 模拟柜无真实柜号允许排柜及 push;push 本身不开放 PDA;link 从未消费真实柜带入唯一 `containerNo`,内部柜、计划、bridge 身份稳定;作业中换号身份稳定 | `ContainerService`、`SmartLoadingService`、`SplitPreloadService`、`LoadingListService`、相关 OpenAPI 与合同测试 | 新时序已冻结,待环境验收 | | `preload-and-loading-list` | `PENDING -> EDITING -> CONFIRMED`;计划级确认原子确认全部关联票据并唯一建 task;ACTIVE 模拟柜已关联 `RELEASED` 订舱需求、真实柜号和 readiness 全部满足后 `readyForPda=true`,claim 才推进 `LOADING` | `LoadingListService.confirmPreload`、`LoadingPickService`、`POST /loading-plans/{planId}/confirm` 及 Loading List OpenAPI/DTO | 计划级确认已冻结,待环境验收 | | `customs-documents-lock` | 清关/报关专用流程、完成态禁止替换 | 既有 `LoadingListService`、专用 Controller 与专项测试 | 既有冻结,待环境验收 | diff --git a/开发环境独立任务协作登记.md b/开发环境独立任务协作登记.md index af123e4..22d081f 100644 --- a/开发环境独立任务协作登记.md +++ b/开发环境独立任务协作登记.md @@ -4,7 +4,7 @@ ## 环境隔离门禁 -- 开发总控只向本表 task_id 下发五期开发工作;不得向 `C:\Users\BY-OY\Desktop\code\chongchong-global` 的测试环境任务下发,即使提示中另写开发目录也不例外。 +- 开发总控只向本表 task_id 下发当前系统全流程开发工作;不得向 `C:\Users\BY-OY\Desktop\code\chongchong-global` 的测试环境任务下发,即使提示中另写开发目录也不例外。 - 每个任务必须同时满足 projectId、cwd 和登记环境一致;任一项不一致立即停止,不读取、不修改、不运行命令,也不得自行切换目录补救。 - 开发专项日常只执行源码实现、定向测试、类型检查和构建;开发数据库与开发部署只能由开发总控在代码门禁通过后按精确服务、数据库和变更清单单独下发。测试环境、测试数据库、生产环境和 Jenkins 仍禁止。 - 开发与测试目录之间不得复制未提交文件、生成补丁、自动合并或 cherry-pick;需要移交时由用户明确授权具体方向、提交和范围。 @@ -17,7 +17,7 @@ - 数据库操作前必须确认开发库、精确表、业务主键或 SQL 文件和预计影响行;优先使用事务并保留执行结果。仓库已审核的开发增量 SQL、测试造数和职责范围内的数据修正可执行。 - `DROP`、`TRUNCATE`、整库重置、清空表、无明确主键范围的批量删除及其他不可恢复操作不在授权内,仍需用户当轮单独确认。 - 开发部署必须在受影响测试、类型检查或构建通过后进行,并记录精确部署单元、使用的提交或工作区状态、配置来源和部署结果。若唯一部署方式依赖 Jenkins,执行前重新取得用户对 Jenkins 的明确授权。 -- 开发环境真实 HTTP 在部署和数据库变更完成后执行,可包含当前五期职责范围内的读写验收;只使用开发身份和开发数据,记录接口路径、HTTP 状态、业务码、`requestId`/`traceId` 与结果,不输出或持久化 Token、密码和敏感载荷。破坏性批量请求仍需单独确认。 +- 开发环境真实 HTTP 在部署和数据库变更完成后执行,可包含当前全流程职责范围内的读写验收;只使用开发身份和开发数据,记录接口路径、HTTP 状态、业务码、`requestId`/`traceId` 与结果,不输出或持久化 Token、密码和敏感载荷。破坏性批量请求仍需单独确认。 ## 登记表 @@ -25,16 +25,54 @@ | task_id | project_id | 展示名称 | 长期职责 | |---|---|---|---| -| `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发总控】五期开发 | 接收五期开发任务,冻结跨端契约和串行批次,协调本表专项完成实现、定向测试和构建;代码门禁通过后按本表授权操作开发数据库、部署开发环境并执行真实 HTTP 验收;不操作测试/生产环境或 Jenkins。 | +| `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发总控】全流程开发 | 接收当前系统端到端全流程开发任务,冻结跨端契约和串行批次,协调本表专项完成实现、定向测试和构建;代码门禁通过后按本表授权操作开发数据库、部署开发环境并执行真实 HTTP 验收;不操作测试/生产环境或 Jenkins。 | 长期专项: | task_id | parent_task_id | project_id | 展示名称 | 唯一长期职责 | |---|---|---|---|---| -| `01a05b23-bfc6-7121-a6f2-7fc14ee456a3` | `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发五期前端】Admin | `apps/admin-web/` 五期海外仓排车、出库、派送、异常退回、客户回访页面、路由、API、权限消费、测试与构建;不修改 Client、PDA、后端或 SQL。 | -| `01a05b23-c20f-7f52-8a26-543f1563f0f8` | `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发五期前端】Client | `apps/client-web/` 五期客户派送页面、详情、创建表单、路由、API、权限消费、测试与构建;不修改 Admin、PDA、后端或 SQL。 | -| `01a05b78-6e28-7460-babf-3a87331f6dd4` | `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发五期前端】海外PDA | `apps/pda-overseas-uniapp/` 五期排车拣货、一件代发出库、任务完成、发车入口、真实 API、恢复、扫码、幂等、测试与构建;派送不进入 PDA。 | -| `01a05b23-c5ff-77c3-8f77-ceb4f4c40de2` | `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发五期后端】Lastleg | `baiyue-firstleg/lastleg-service/` 五期 dispatch、delivery、dropship、exceptionorder、customervisit、PDA 出库与发车的接口、业务、OpenAPI、SQL、权限强制和测试。 | -| `01a05b23-c7f8-72e0-bb3c-afbbf1c7f9e7` | `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发五期后端】IAM权限 | `baiyue-firstleg/iam/` 及必要 common-security 的五期平台/客户权限资源、角色初始化、授权快照、OpenAPI、SQL 和测试;不修改 Lastleg 业务或前端。 | +| `01a05b23-bfc6-7121-a6f2-7fc14ee456a3` | `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程前端】Admin | `apps/admin-web/` 全部平台管理页面、路由、API、权限消费、测试与构建;不修改 Client、PDA、后端或 SQL。 | +| `01a05b23-c20f-7f52-8a26-543f1563f0f8` | `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程前端】Client | `apps/client-web/` 全部客户工作台页面、路由、API、权限消费、测试与构建;不修改 Admin、PDA、后端或 SQL。 | +| `01a05b78-6e28-7460-babf-3a87331f6dd4` | `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程前端】海外PDA | `apps/pda-overseas-uniapp/` 全部海外仓现场作业、真实 API、恢复、扫码、幂等、测试与构建;派送仍由 Admin/Client 承载。 | +| `01a05b23-c5ff-77c3-8f77-ceb4f4c40de2` | `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程后端】Lastleg | `baiyue-firstleg/lastleg-service/` 海外尾程、入仓、库存、换标、转运、废弃、排车、出库、派送、一件代发、异常、回访及海外业务的接口、OpenAPI、SQL、权限强制和测试。 | +| `01a05b23-c7f8-72e0-bb3c-afbbf1c7f9e7` | `01a05b10-a5fc-7d51-8203-c671f3a823ad` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程后端】IAM权限 | `baiyue-firstleg/iam/` 及必要 common-security 的平台/客户全流程权限资源、角色初始化、授权快照、OpenAPI、SQL 和测试;不修改 Lastleg 业务或前端。 | 验收与部署任务不常驻登记。只有用户明确要求开始验收、准备部署或执行验收时,才另行决定是否创建;开发任务不得代行。 + +## 当前 P0 全流程补齐批次 + +本批只处理原型盘点确认的 P0,不混入 Admin 经营分析、销售管理、官网、小程序、独立 APP 或全量视觉验收。现有文档业务域改名属于总控在途改动,各专项必须保留,不得暂存、提交、覆盖或回滚。 + +| 工作包 | 执行任务 | 写入范围 | 交付目标 | 依赖与集成边界 | +|---|---|---|---|---| +| `P0-BE-LASTLEG` | 【开发全流程后端】Lastleg | `baiyue-firstleg/lastleg-service/` | 补齐客户海外采购、本土卡、本土散板、海外入库订单所需客户 API;核对并补齐 PDA 盘点、移库、换标、库存/库位/托盘查询专用 API、OpenAPI 与测试 | 先冻结 DTO、权限码和状态机并通知 Client、海外 PDA、IAM;不修改 `iam/`、统一 SQL或前端 | +| `P0-BE-IAM` | 【开发全流程后端】IAM权限 | `baiyue-firstleg/iam/` 及必要 `common-security/` | 补齐并核对客户海外业务、海外入库查询和海外 PDA 现场作业的权限资源、角色初始化、OpenAPI 与模块 SQL | 消费 Lastleg 冻结的权限码;不修改 Lastleg、统一 SQL或前端 | +| `P0-FE-CLIENT` | 【开发全流程前端】Client | `apps/client-web/` | 将海外采购、美国本土卡、美本土散板和海外入库订单从占位收敛为真实页面;修正首页快捷入口;覆盖权限、加载、空态、错误态、幂等与测试 | 只消费客户正式 API,不调用平台/内部接口,不模拟成功;“我的订单”统一查询不在本批 | +| `P0-FE-OVERSEAS-PDA` | 【开发全流程前端】海外PDA | `apps/pda-overseas-uniapp/` | 接通库存盘点、商品移库、换标收货/执行/复核、库存/库位/托盘查询共 8 项现场能力,完成扫码、恢复、并发冲突、幂等、错误态和构建测试 | 只调用 `/api/pda/**` 正式接口;不得通过 `available: true` 掩盖未接通能力,不改后端或其他前端 | + +完成门禁:四包定向测试与构建通过,跨端契约一致,所有 P0 页面或 PDA 入口均不再是 `prototype`、`available: false` 或模拟成功。专项本批不提交、不推送、不部署、不执行数据库和真实 HTTP;总控汇总差异并处理现有文档改动后,再按各仓库最新测试分支同步门禁统一集成。 + +### P0 批次结果(2026-09-04) + +| 工作包 | 状态 | 结果与门禁 | +|---|---|---| +| `P0-BE-LASTLEG` | 已完成 | 客户海外采购、本土卡、本土散板、海外入库列表/详情接口及 PDA 作业 OpenAPI 已补齐;Lastleg 548 项测试通过,2 项跳过 | +| `P0-BE-IAM` | 已完成 | 4 项客户权限已冻结并只授予企业负责人,PDA 继续使用统一 `lastleg:pda:operate`;IAM 全量 284 项测试通过 | +| `P0-FE-CLIENT` | 已完成(总控接管) | 原 Client 任务连续两次网络流中断;总控在同一工作区完成三类跨境订单列表/详情/新增、海外入库列表/详情和首页正确路由;Client 263 项测试、类型检查、生产构建通过 | +| `P0-FE-OVERSEAS-PDA` | 已完成 | 盘点、移库、换标收货/执行/复核、库存/库位/托盘查询 8 项入口已接真实 `/api/pda/**`;64 项测试及 H5/App 资源构建通过 | +| 总控集成 | 已完成 | IAM 模块 SQL 与统一增量 SQL 内容一致;开发/测试登记隔离、页面索引、权限、Gateway、PDA 能力等 832 项索引合同通过;各 Git 仓库 `git diff --check` 通过 | + +总控已在每次提交前重新获取并合并对应测试分支,完成开发分支提交与推送:Backend `54cb9cea`、Auth 修复 `81470359`,Client `6998f81`,Admin `7d29f3d`,国内 PDA `881c273`,海外 PDA `f960b9f`。五个工作区提交后均保持在 `dev` 分支且无未提交业务改动。 + +开发部署已完成:Admin Jenkins `#41`、Client `#42`、IAM `#33`、Lastleg `#65`、Auth `#24` 均成功,其中后端任务显式使用 `ENVIRONMENT=development` 与 `DEPLOY=true`;未触发测试或生产任务。开发数据库只在 `8.163.49.32:3306` 执行统一增量,环境标记为 `dev`,迁移合同结果为 `PASS`,4 项权限及负责人授权、唯一索引和重复绑定清理结果均已核对;未重建或删除数据库。 + +开发环境真实 HTTP 已通过:登录后签发国内及海外 Token,IAM 返回 4 项目标权限;海外采购、本土卡、本土散板和海外入仓计划 4 个客户接口均返回 HTTP 200、业务码 200。Client 已按 `1920×1080`、浏览器缩放 `100%` 验收业务总览、三个出海下单列表、散板新增表单和海外入仓列表,未发现遮挡、溢出、错误日志或“暂无权限”;海外 PDA H5/App 构建已通过,真机广播扫码、拍照等硬件能力仍需设备证据。 + +### 全流程收口检查点(2026-09-04) + +- Backend 已在提交前重新获取并合并 `origin/test`,开发分支提交为 `e477f739`、`b8a649e7`;开发 Jenkins Backend `#165` 及下游 Firstleg `#72` 成功。 +- 最新开发环境真实 HTTP 全流程报告 `baiyue-firstleg/reports/admin-test-env-acceptance-20260904080448.json` 结果为 `PASS`:`8166/8166` 断言通过、`112` 次模块运行、`92` 个唯一模块、`4981` 个唯一请求,`failed=0`、`skippedModules=0`、`deploymentBlockers=0`。17 项覆盖说明均为非阻断项,包含设备能力、外部船司依赖和无公开接口可稳定构造的中间状态。 +- Admin 已合并最新 `origin/release/test`,冲突按当前全流程契约收敛;补齐智能装柜箱数输入提示,`233/233` 个测试文件、`1670/1670` 条测试及生产构建通过,本地提交 `871d0a5`、`bc6629d`。Client 已合并最新 `origin/release/test`,全量测试及生产构建通过,本地提交 `dbd3c61`。国内 PDA `118/118` 条测试通过。海外 PDA `65/65` 条测试及 H5 构建通过,本地提交 `4f314fa`。 +- 海外 PDA 已按 `390×844` 通过 H5 登录、工作台、拆柜收货、托盘、盘点、移库、换标、库存/库位/托盘查询、排车、出库、历史和个人中心的页面路由与横向溢出检查;托盘管理页不再显示“PDA 广播扫码与 H5 人工输入均可使用”。Android 广播扫码、相机与弱网恢复仍只计入设备验收,不以 H5 结果替代。 +- Git 域名入口的写入凭据失效后,使用本机已登记的同一 Git 服务入口 `8.163.30.128:10082` 完成推送,未修改仓库远程配置:Admin `bc6629d`、Client `dbd3c61`、海外 PDA `4f314fa` 已进入远端 `dev`。本检查点无代码、部署或验收阻断。 +- 最新前端提交已部署到开发环境:Admin Jenkins `#42`、Client Jenkins `#43` 均为 `SUCCESS`,`http://dev-admin.buggoglobal.com/healthz` 与 `http://dev-app.buggoglobal.com/healthz` 均返回 HTTP 200。Backend、Admin、Client、国内 PDA、海外 PDA 五个仓库的本地 `HEAD` 与远端 `origin/dev` 一致且工作区干净;AGENTS 索引合同 `872/872` 通过。 diff --git a/四期/README.md b/海外仓业务/README.md similarity index 57% rename from 四期/README.md rename to 海外仓业务/README.md index 7b5ceba..341a85d 100644 --- a/四期/README.md +++ b/海外仓业务/README.md @@ -1,26 +1,28 @@ -# 四期范围与快速索引 +# 海外仓业务范围与快速索引 ## 已确认业务边界 -- 一期、二期、三期覆盖国内头程仓内操作,三期完成装柜及国内出仓交接;柜子确认离开国内仓库后的节点查询不属于三期。 -- 四期从柜子确认国内出仓后开始定时查询船节点,持续跟踪国内出仓、港口、开航、海运在途、到港、卸船、清关、提柜及还柜事实;统一语义和停止规则见[船节点标准化契约](船节点标准化契约.md)。海外仓作业继续覆盖安排车辆提柜、运抵合作海外仓、卸货、入库、形成库存和库内操作。 -- 四期止于海外仓库存和库内作业,不包含海外仓出库单、出库履约、海外派送或其他库存离仓业务。 -- “尾程订单”属于本期已确认的订单管理范围,但不得据此把海外仓出库、派送履约或 `海外派送` 原型模块整体纳入四期。 -- 历史文档中把高级 BI、开放平台、移动端或性能优化称为“四期”的内容不再作为当前四期范围依据。 +- 当前开发环境按端到端全流程交付,不再用开发批次切断上下游。订单与客户、入库测量与计费、国内货柜履约、海外仓业务和财务共同组成一条连续业务链。 +- 海外仓业务从国内装柜完成及确认出仓后的船节点开始,覆盖海运在途、海外接柜、卸货入仓、库存与托盘、换标、转运、废弃、退货、排车、PDA 拣货与出库、发车、转派送、派送完成、异常退回、客户回访和一件代发。 +- 海外采购、本土卡车、本土散板、海外仓报价、汇率和车辆主数据属于同一海外业务域,并统一经 `gateway-overseas/` 访问。 +- 功能是否可用以正式路由、Controller/OpenAPI、权限、数据库结构和验收证据为准;历史规划只用于追溯,不再用于排除已经纳入全流程的能力。 ## 人工验收入口 -- 国内装柜完成后的三期尾端至四期完整人工验收,统一使用[《三期装柜完成后至四期人工验收手册》](三期装柜完成后至四期人工验收手册.md)。手册从 `LOADED` 柜次开始,覆盖国内出仓、船节点、跨区建单、海外 PDA 入仓、库存/库内结果、海外主数据和海外业务,并明确区分当前可操作页面与仅后端自动化已通过的能力。 +- 端到端人工验收统一使用[《虫虫出海全流程人工验收手册》](虫虫出海全流程人工验收手册.md)。手册覆盖客户与订单、国内履约、跨区事件、海外 PDA 入仓、库存与库内服务、排车出库、派送、异常退回、一件代发、海外主数据和海外业务,并区分页面、真机和自动化证据。 ## 功能快速路由 -| 业务域 | 本期范围 | 原型入口 | +| 业务域 | 能力范围 | 原型入口 | |---|---|---| -| 海外仓 | 尾程订单、入库单、换标单、托盘管理、库存管理;箱号管理与产品库当前暂不进入四期正式入口;Admin 入口 `../../apps/admin-web/src/modules/overseas-warehouse/` | 原型 `../悦/货代SAAS平台后台/prototype-src/modules/03-overseas-warehouse.html`;Backend `../../baiyue-firstleg/lastleg-service/`、`../../baiyue-firstleg/warehouse-overseas-service/`,经 `gateway-overseas/` | -| 海外仓排车查询与智能预排 | 平台查看排车列表/详情,按入仓计划或已收托盘筛选候选并创建待出库预排;不开放排车编辑、取消、发车、PDA 出库或派送 | Admin `../../apps/admin-web/src/modules/overseas-warehouse/pages/DispatchesView.vue`、`api/dispatches.ts`;Backend `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/controller/DispatchQueryController.java`、`SmartDispatchController.java` | +| 海外仓 | 尾程订单、入库单、换标单、托盘管理、库存管理;箱号管理与产品库当前暂不进入海外仓业务正式入口;Admin 入口 `../../apps/admin-web/src/modules/overseas-warehouse/` | 原型 `../悦/货代SAAS平台后台/prototype-src/modules/03-overseas-warehouse.html`;Backend `../../baiyue-firstleg/lastleg-service/`、`../../baiyue-firstleg/warehouse-overseas-service/`,经 `gateway-overseas/` | +| 海外仓排车与智能预排 | 平台查看排车列表/详情,按入仓计划或已收托盘创建预排,并完成编辑、取消、拣货、出库、发车和转派送 | Admin `../../apps/admin-web/src/modules/overseas-warehouse/pages/DispatchesView.vue`、`api/dispatches.ts`;Backend `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/` | | 海外仓客户自助服务 | 客户工作台正式开放贴标申请、仓储转运、货物废弃和退货换标;所有查询和写入只使用登录态客户范围 | Client `../../apps/client-web/src/modules/overseas-warehouse/routes.ts`、`views/WarehouseServiceView.vue`、`api/warehouseServices.ts`;Backend `../../baiyue-firstleg/lastleg-service/` 的 `relabel/`、`transfer/`、`discard/`,经 `gateway-overseas/` | | 海外仓 PDA 柜号签收与入仓 | 独立应用 `../../apps/pda-overseas-uniapp/`;当前真实前端只开放拆柜收货,完成柜号认领、三类照片、FBA 按 SKU 箱数/OVERSEAS 逐箱实收与全柜完成 | 前端 `src/api/inbound.js`、`receiving-adapter.js`、`pages/operation/operation.vue`;Backend `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/pda/controller/ReceivingContainerController.java`、`ReceivingContainerService.java`,经 `gateway-overseas/` | -| 海外仓 PDA 库内、托盘、换标与查询 | Lastleg 已提供 PDA 专用盘点、同仓整托移库、托盘组拆换绑、换标与库存/库位/托盘查询后端;海外 PDA 工作台入口仍禁用,前端接入前不得宣称全链路完成 | Backend `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/pda/stocktake/`、`pda/move/`、`pda/warehouse/`、`palletops/`、`relabel/pda/`;契约 `src/main/resources/openapi/overseas-pda-operations-v1.yaml` | +| 海外仓 PDA 库内、托盘、换标与查询 | Lastleg 提供盘点、同仓整托移库、托盘组拆换绑、换标和库存/库位/托盘查询能力;当前终端入口按工作台能力开关启用,未进入 PDA 的操作由 Admin/Client 正式页面承载 | Backend `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/pda/stocktake/`、`pda/move/`、`pda/warehouse/`、`palletops/`、`relabel/pda/`;契约 `src/main/resources/openapi/overseas-pda-operations-v1.yaml` | +| 海外仓出库与派送 | 排车编辑/取消、PDA 排车拣货、出库任务、发车门禁、转派送、客户派送单和派送完成 | Admin `../../apps/admin-web/src/modules/overseas-warehouse/`;Overseas PDA `../../apps/pda-overseas-uniapp/src/pages/dispatch/`、`src/pages/outbound/`;Backend `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/`、`delivery/` | +| 异常退回与客户回访 | 异常建档、派送退回入仓、派送状态、签收/回访附件和客户回访 | Admin `ExceptionOrdersView.vue`、`CustomerVisitsView.vue`;Backend `exceptionorder/`、`customervisit/` | +| 一件代发 | 国内订单强制 SKU 快照、装柜工作托盘、海外 SKU/箱唛库存和一件代发出库 | Backend `order/`、`firstleg/`、`lastleg-service/dropship/`;跨区事件见 `common-event-contract/` | | 海外业务 | 本土散板、采购订单、本土卡车;Admin 入口 `../../apps/admin-web/src/modules/overseas-business/` | 原型 `../悦/货代SAAS平台后台/prototype-src/modules/07-overseas-business.html`;Backend `../../baiyue-firstleg/lastleg-service/` 的 `procurement/`、`trucking/` 及后续本土散板子域 | | 仓库主数据与海外资源 | 仓库 ID、类型、状态、地址、能力统一由国内仓库主数据维护;海外服务只维护库位、托盘和资源锁 | Admin `../../apps/admin-web/src/modules/warehouses/`;国内权威 `../../baiyue-firstleg/warehouse/`;海外资源 `../../baiyue-firstleg/warehouse-overseas-service/` | | 通用资料 | 海外仓报价、汇率管理、车辆列表;Admin 入口 `../../apps/admin-web/src/modules/overseas-master-data/` | `../悦/货代SAAS平台后台/prototype-src/modules/10-general.html` | @@ -45,7 +47,7 @@ - 采购订单:`overseas-purchase`、`overseas-purchase-edit`、`overseas-purchase-detail`。 - 本土卡车:`overseas-truck`、`overseas-truck-add`、`overseas-truck-edit`。 - 本土散板:`overseas-looseboard`、`overseas-looseboard-add`、`overseas-looseboard-edit`。 -- `domestic-*` 和 `legacy-*` 页面不是四期默认入口;只有实际流程明确复用时才联查。 +- `domestic-*` 和 `legacy-*` 页面不是海外仓业务默认入口;只有实际流程明确复用时才联查。 ### 仓库与通用资料 @@ -54,31 +56,31 @@ - 汇率管理:`gen-exchange-rate`。 - 车辆列表与详情:`vehicle`、`vehicle-detail`。 -## 明确排除 +## 终端与模块边界 -- 海外仓出库及退货出库:`overseas-outbound`、`fba-outbound-order`、`fba-outbound-order-detail`、`fba-return-outbound`。 -- `prototype-src/modules/04-overseas-delivery.html` 中的海外派送、出库派车、自提和其他离仓履约页面。 -- 当前暂缓的箱号管理与产品库正式页面、平台查询和维护接口;保留既有源码供后续迭代恢复,不在四期菜单、路由和联调门禁中出现。 -- 未经后续确认的财务扩展、高级 BI、开放平台、移动端、完整海外 WMS 或四期之后的出库业务。 +- 海外仓出库、派送、异常退回和一件代发已经纳入全流程,不再作为海外入仓之后的独立开发批次。 +- 派送业务由 Admin/Client 承载,不进入海外 PDA;海外 PDA 负责现场入仓、托盘、排车拣货和出库等已注册作业。 +- 箱号和产品信息作为入仓、库存、箱唛及 SKU 快照的一部分使用;是否提供独立维护页面由正式路由决定,不影响全流程状态推进。 +- 高级 BI、开放平台和独立移动 APP 属于独立产品能力,不与现有业务全流程完成状态混为一谈。 ## 船节点定时查询边界 - 所有供应商统一节点、时间语义、异常事实、停止规则和新增船司接入门禁以[船节点标准化契约](船节点标准化契约.md)为准;供应商缺失的节点保持缺失,不推测补齐。 -- 现有 `CarrierScheduleQuery` 查询任务及其查询尝试、历史、来源、过期标识和频率约束整体重新归入四期;不再把它列作三期港务/船期查询能力,也不得另建一套重复任务。 +- 现有 `CarrierScheduleQuery` 查询任务及其查询尝试、历史、来源、过期标识和频率约束整体重新归入海外仓业务;不再把它列作国内货柜履约港务/船期查询能力,也不得另建一套重复任务。 - 定时查询对象必须关联真实订舱、柜次以及可用的船司/船名航次或跟踪标识,不建立脱离业务单据的孤立轮询任务。 - Firstleg `portschedule/` 负责任务编排、业务关联、最新节点、节点历史、幂等和停止条件;`integration-service/` 只负责船司或轨迹供应商适配、限流、超时、重试和错误归一化,不保存业务主数据。 - 查询从确认柜子离开国内仓库后开始,贯通目的港到达、卸船、清关、提柜和还柜事实,默认在实际 `EMPTY_RETURNED` 后停止;这只扩展货柜轨迹事实,不纳入海外派送、海外仓出库或库存离仓业务。失败不能伪造成功节点,需保留来源、观测时间、最近成功时间和失败原因。 -- 现有“每 3 天一次、窗口最多 3 次”、六家船公司来源、最近有效结果和过期标识是同一查询能力的既有约束,归四期继续核对;后续若调整自动轮询频率、供应商额度、退避或停止规则,应只修改四期契约和这套任务。 +- 现有“每 3 天一次、窗口最多 3 次”、六家船公司来源、最近有效结果和过期标识是同一查询能力的既有约束,归海外仓业务继续核对;后续若调整自动轮询频率、供应商额度、退避或停止规则,应只修改海外仓业务契约和这套任务。 - 当前原型没有独立的“船节点定时查询”页面;涉及页面展示时从订舱、船期或货柜详情进入,不得为了匹配原型菜单把它归入海外派送。 ## 系统边界与索引维护 - 海外仓合作仓是现有头程仓库主数据的类型扩展,需同步核对 Admin `warehouses`、Warehouse Service 的 DTO/Controller/OpenAPI/SQL 及实际消费者;不得因此把海外库存业务写入国内 Warehouse Service。 - 海外库存、库内作业和海外本土业务已有明确服务入口:`gateway-overseas/` 是海外 API 网关,`lastleg-service/` 拥有尾程订单、入仓计划、换标、库存业务、采购和本土卡车;国内 `warehouse-service` 是仓库主数据唯一权威,`warehouse-overseas-service/` 只拥有库位、托盘及资源锁并引用国内 `warehouseId`。不得把海外库存业务塞入国内 `firstleg/` 或 `warehouse/`。 -- 国内装柜完成事件只在海外生成 `PENDING_ASSIGNMENT` 尾程订单、冻结快照和 `FIRST_LEG` 在途库存,不自动生成入仓计划。平台通过 `GET /api/platform/v1/last-leg/orders/container-summaries` 按稳定 `sourceContainerBookingId` 服务端聚合全柜订单、入仓码和有效计划,在分页前排除全部入仓码均已生成有效独立计划的柜,仅向柜子工作台返回仍有入仓码待生成计划的柜;详情 `/{sourceContainerBookingId}` 返回柜内全部订单与计划且不受订单分页截断。`plannedArrivalAt` 只来自装柜完成事件 `estimatedWarehouseArrivalAt` 冻结到 Lastleg `ll_order.estimated_warehouse_at` 的计划到仓事实,不得使用创建时间、预计到港或当前时间替代,并按该时间升序、空值最后排序。确认后调用 `POST /api/platform/v1/last-leg/inbound-plans/convert-container`;服务端一次锁定整柜、每票独立生成一个计划,整批原子且幂等。转换成功才将尾程订单推进为 `INBOUND_PLANNED`,并把库存余额的来源入仓码展示快照替换为各自 `planNo`。 -- 船节点是头程海运在途事实与四期海外接柜之间的衔接能力,业务聚合继续由 Firstleg 持有;到港/可提柜结果通过明确契约或跨区域事件提供给海外区域,不复制第二套轮询任务。 +- 国内装柜完成事件只在海外生成 `PENDING_ASSIGNMENT` 尾程订单、冻结快照和 `FIRST_LEG` 在途库存,不自动生成入仓计划。平台通过 `GET /api/platform/v1/last-leg/orders/container-summaries` 按稳定 `sourceContainerBookingId` 服务端聚合全柜订单、入仓码、计划数、未操作数和 `allPlansReady`,在分页前排除全部入仓码均已生成有效独立计划的柜,仅返回仍有入仓码待生成计划的柜;详情 `/{sourceContainerBookingId}` 返回柜内全部订单与计划且不受订单分页截断。`plannedArrivalAt` 只来自装柜完成事件 `estimatedWarehouseArrivalAt` 冻结到 Lastleg `ll_order.estimated_warehouse_at` 的计划到仓事实,不得使用创建时间、预计到港或当前时间替代,并按该时间升序、空值最后排序。确认后调用 `POST /api/platform/v1/last-leg/inbound-plans/convert-container`;服务端一次锁定整柜、每票独立生成一个计划,整批原子且幂等。转换成功才将尾程订单推进为 `INBOUND_PLANNED`,并把库存余额的来源入仓码展示快照替换为各自 `planNo`。 +- 船节点是头程海运在途事实与海外接柜之间的衔接能力,业务聚合继续由 Firstleg 持有;到港/可提柜结果通过明确契约或跨区域事件提供给海外区域,不复制第二套轮询任务。 - Admin、Client 仍使用统一账号体系,并按根 `AGENTS.md` 的双区域 API、海外 Token 和跨区域事件约定接入;业务页面不自行实现第二套登录。 -- 海外仓 PDA 使用独立 `apps/pda-overseas-uniapp/` 工程和发布身份,但账号仍由国内 Auth 唯一签发;真实作业请求必须经海外 Gateway 的显式 PDA 路由。当前拆柜收货已接真实 API;库内、托盘、换标和查询仍按工作台禁用状态管理,即使 Lastleg Controller 已存在也不得据此宣称设备端联调完成。 +- 海外仓 PDA 使用独立 `apps/pda-overseas-uniapp/` 工程和发布身份,但账号仍由国内 Auth 唯一签发;真实作业请求必须经海外 Gateway 的显式 PDA 路由。工作台只展示已注册并启用的现场作业,其他业务通过 Admin/Client 完成,不以某个终端是否承载全部操作判断端到端流程是否完成。 - 海外 PDA 的实际收货仓是国内 `warehouse-service` 中 `tenant_id=0`、类型为 `OVERSEAS`、状态 `ACTIVE` 且启用 `RECEIVING` 能力的平台共享物理仓,并由 `WAREHOUSE_PICKER` 的 Token Claim 固定;海外数据库只保存相同 `warehouseId` 引用。PDA 不接收仓库 ID,也不能切换柜号。海外 Gateway 对每个 `/api/pda/**` 请求在本地验签后向 Auth 实时核对账号 `token_version` 与当前仓绑定,换仓或清空绑定后旧 Token 立即失效,Auth 不可用时拒绝请求。待收柜在首次准备时原子认领到该仓,入仓计划、尾程订单和收货会话冻结实际仓 ID/名称;国内装柜事件的仓库仅作为来源仓快照,目的仓/FBA 仓也不得冒充实际收货仓。 - 新增实际代码模块、API、权限、OpenAPI 或数据库入口后,同步更新根 `AGENTS.md`、对应应用/服务 `AGENTS.md` 和本文件;不把排期、完成比例或临时任务状态写入快速索引。 diff --git a/四期/海外仓PDA接柜入库全流程图-20260828.png b/海外仓业务/海外仓PDA接柜入库全流程图-20260828.png similarity index 100% rename from 四期/海外仓PDA接柜入库全流程图-20260828.png rename to 海外仓业务/海外仓PDA接柜入库全流程图-20260828.png diff --git a/四期/四期后端缺口清单.md b/海外仓业务/海外仓业务后端缺口清单.md similarity index 70% rename from 四期/四期后端缺口清单.md rename to 海外仓业务/海外仓业务后端缺口清单.md index d4d31f0..ba140bd 100644 --- a/四期/四期后端缺口清单.md +++ b/海外仓业务/海外仓业务后端缺口清单.md @@ -1,39 +1,39 @@ -# 四期后端缺口清单 +# 海外仓业务后端缺口清单 更新日期:2026-08-19 ## 口径与边界 -- 本清单以当前四期范围、后端代码、静态 OpenAPI、数据库基线、IAM 初始化 SQL 和本地测试为依据。 +- 本清单以当前海外仓业务范围、后端代码、静态 OpenAPI、数据库基线、IAM 初始化 SQL 和本地测试为依据。 - “已实现”表示已有可定位的领域实现、持久化和直接测试,不代表已经部署或完成测试环境 HTTP 验收。 - “部分实现”表示已有主体或单点能力,但缺少安全、契约、状态衔接或页面所需查询中的至少一项,不能作为稳定前端契约交付。 -- 明确排除海外仓出库、退货出库、海外派送及其他库存离仓履约。代码中的 `dispatch/`、`delivery/`、`ll_outbound_*` 不计入四期完成度。 +- 明确排除海外仓出库、退货出库、海外派送及其他库存离仓履约。代码中的 `dispatch/`、`delivery/`、`ll_outbound_*` 不计入海外仓业务完成度。 ## 总览 | 业务域 | 判定 | 当前事实 | 主要缺口或下一闭环 | |---|---|---|---| -| 海外 Token 与 JWKS | 部分实现 | Auth 登录与刷新已同时返回国内 Token 和短时 RS256 海外 Token,海外 Token Claims 已统一为下划线命名;JWKS、海外网关和两个海外业务服务按 `lastleg-api` Audience 验签并使用 Claims 授权,不依赖国内 Redis 会话 | 仍缺 Auth—Gateway—Servlet 服务跨模块契约测试;`POST /auth/overseas/token` 仅保留为过渡兑换能力,不作为四期稳定前端契约 | -| `gateway-overseas` 路由与入口安全 | 部分实现 | 已路由 `/api/*/v1/last-leg/**`、海外仓库、File/Print 等海外部署服务;可校验 Issuer、Audience、必要 Claims 和应用域,并清洗可信身份头 | 网关只做应用域,不做资源权限;静态路由未覆盖尚未实现的四期通用资料 API;可信身份头只传身份、不传权限是合理边界,资源权限必须由下游 JWT Claims 校验 | -| 装柜完成跨区建单 | 已实现 | Firstleg Outbox、版本化装柜完成事件、Event Bridge Inbox/重试/死信式 `DEAD`、Lastleg Inbox 幂等和事务建单均有实现及测试 | 与四期到港/可提柜衔接是另一事件,当前缺失,不能复用装柜完成事件冒充到港 | +| 海外 Token 与 JWKS | 部分实现 | Auth 登录与刷新已同时返回国内 Token 和短时 RS256 海外 Token,海外 Token Claims 已统一为下划线命名;JWKS、海外网关和两个海外业务服务按 `lastleg-api` Audience 验签并使用 Claims 授权,不依赖国内 Redis 会话 | 仍缺 Auth—Gateway—Servlet 服务跨模块契约测试;`POST /auth/overseas/token` 仅保留为过渡兑换能力,不作为海外仓业务稳定前端契约 | +| `gateway-overseas` 路由与入口安全 | 部分实现 | 已路由 `/api/*/v1/last-leg/**`、海外仓库、File/Print 等海外部署服务;可校验 Issuer、Audience、必要 Claims 和应用域,并清洗可信身份头 | 网关只做应用域,不做资源权限;静态路由未覆盖尚未实现的海外仓业务通用资料 API;可信身份头只传身份、不传权限是合理边界,资源权限必须由下游 JWT Claims 校验 | +| 装柜完成跨区建单 | 已实现 | Firstleg Outbox、版本化装柜完成事件、Event Bridge Inbox/重试/死信式 `DEAD`、Lastleg Inbox 幂等和事务建单均有实现及测试 | 与海外仓业务到港/可提柜衔接是另一事件,当前缺失,不能复用装柜完成事件冒充到港 | | 尾程订单 | 部分实现 | 有事件建单、列表、详情、CSV 导出、目的仓单条/批量调整、客户隔离与状态历史 | 平台接口大多仅校验平台应用域,未按 `list/edit/export` 等资源权限闭环;IAM 仍保留独立 `detail` 权限,违反“列表包含详情只读”统一语义;缺静态 OpenAPI | | 海外接柜、卸货与入仓 | 部分实现 | 有入仓计划转换、FBA 预约、托盘分配、PDA 实收/上架/合托/完成以及实收后库存落账 | 缺“国内出仓后到港结果 → 海外可提柜/接柜任务”的事件或内部契约;缺接柜车辆/运抵/卸货节点聚合;入仓单列表和正式详情契约不足,现有 Controller 主要是转换与单号详情;权限资源和静态 OpenAPI 未闭环 | -| 换标 | 部分实现 | 有换标申请、明细、状态历史和库存联动服务及测试 | 仅有平台接口且权限未闭环;状态机与前端四期页面字段尚无静态 OpenAPI;需确认换标完成后库存 SKU/箱唛快照的稳定查询形态 | +| 换标 | 部分实现 | 有换标申请、明细、状态历史和库存联动服务及测试 | 仅有平台接口且权限未闭环;状态机与前端海外仓业务页面字段尚无静态 OpenAPI;需确认换标完成后库存 SKU/箱唛快照的稳定查询形态 | | 海外仓托盘与库位 | 部分实现 | `warehouse-overseas-service` 有仓库、地址、能力、库位、托盘、绑定和资源锁;平台/商户及内部锁定接口均存在 | 平台资源接口要求显式 `customerId`,与“仓储资源可独立查询全部客户和仓库”的产品约定存在冲突;仅校验平台应用域,缺细粒度权限;缺静态 OpenAPI | -| 箱号管理 | 部分实现 | 一件代发领域保存来源箱唛、箱级库存和箱流水,库存查询可返回部分箱/SKU事实 | 没有面向四期 Admin 的箱号列表、详情、筛选及只读权限契约;现有 Dropship 接口是内部接收口,不能直接作为平台箱号管理 API | +| 箱号管理 | 部分实现 | 一件代发领域保存来源箱唛、箱级库存和箱流水,库存查询可返回部分箱/SKU事实 | 没有面向海外仓业务 Admin 的箱号列表、详情、筛选及只读权限契约;现有 Dropship 接口是内部接收口,不能直接作为平台箱号管理 API | | 产品库 | 缺失 | 现有 SKU 仅作为尾程明细、采购明细或一件代发库存快照存在 | 无独立产品主档、平台 CRUD/查询、唯一键/启停规则、静态 OpenAPI、权限和表结构 | -| 库存及库内操作 | 部分实现 | 有余额、仓位、流水、汇总查询;有 hold/release/allocate/unallocate/pick/ship/adjust 命令幂等;PDA 实收后可入可用库存 | 四期排除库存离仓,因此 `pick/ship` 不应作为四期交付;其余平台命令有代码权限常量但 IAM 未初始化;查询接口缺只读权限;跨仓转移包含出仓动作,需把四期可验收部分限定为不离仓库内操作;缺静态 OpenAPI | -| 海外采购订单 | 部分实现 | 商户下单、平台审核/管理、采购单据余量及测试已存在,PDA 实收才进入可用库存的边界已建立 | 页面需要的平台列表/详情/编辑字段需与现有 API 冻结;代码使用的 `lastleg:overseas-procurement:*` 未写入 IAM 种子;手工采购出库属于库存离仓,不纳入四期;缺静态 OpenAPI | -| 本土卡车 | 部分实现 | 平台/商户订单、托盘明细、状态历史和测试存在 | 需确认该子域是四期“本土卡车”而非海外派送;平台只使用单一 `manage` 权限且 IAM 未初始化;缺列表只读/操作拆分和静态 OpenAPI | +| 库存及库内操作 | 部分实现 | 有余额、仓位、流水、汇总查询;有 hold/release/allocate/unallocate/pick/ship/adjust 命令幂等;PDA 实收后可入可用库存 | 海外仓业务排除库存离仓,因此 `pick/ship` 不应作为海外仓业务交付;其余平台命令有代码权限常量但 IAM 未初始化;查询接口缺只读权限;跨仓转移包含出仓动作,需把海外仓业务可验收部分限定为不离仓库内操作;缺静态 OpenAPI | +| 海外采购订单 | 部分实现 | 商户下单、平台审核/管理、采购单据余量及测试已存在,PDA 实收才进入可用库存的边界已建立 | 页面需要的平台列表/详情/编辑字段需与现有 API 冻结;代码使用的 `lastleg:overseas-procurement:*` 未写入 IAM 种子;手工采购出库属于库存离仓,不纳入海外仓业务;缺静态 OpenAPI | +| 本土卡车 | 部分实现 | 平台/商户订单、托盘明细、状态历史和测试存在 | 需确认该子域是海外仓业务“本土卡车”而非海外派送;平台只使用单一 `manage` 权限且 IAM 未初始化;缺列表只读/操作拆分和静态 OpenAPI | | 本土散板 | 缺失 | `lastleg-service` 无稳定子域、Controller、表或测试 | 新建独立领域,不能复用出库/派送表;先冻结状态、字段、权限和与库存的非离仓边界 | | 海外仓合作仓类型 | 已实现 | 国内 Warehouse 已新增正式类型码 `OVERSEAS_PARTNER`,与普通海外仓 `OVERSEAS` 明确区分;保存、查询筛选、列表响应、批量导入、Schema 注释、统一 SQL 和测试已同步;Admin 已完成列表筛选、新增/编辑及保存透传;内部服务令牌接口 `GET /internal/warehouses/overseas-partners` 仅供海外报价服务读取当前启用候选 | 实际环境 SQL 尚未执行;前端不得调用内部合作仓接口,也不跨区域为报价拉取国内候选 | -| 海外仓报价 | 缺失 | 国内 Warehouse 有“海外仓阶梯仓租费”,但没有四期原型所指完整海外仓报价主数据;已冻结合作仓来源方案:海外报价服务仅在创建时通过内部服务身份读取国内 `ACTIVE + OVERSEAS_PARTNER` 列表并缓存 30 分钟 | 需实现报价维度、币种、有效期、服务项、仓库/客户作用域和权限/OpenAPI/SQL;报价保存合作仓 ID、编码、名称快照,缓存未命中时强制刷新一次后再拒绝 | -| 汇率管理 | 缺失 | 四期目标服务中无汇率主档、接口、权限或表 | 汇率仅作为业务换算主数据;财务记账/结算汇率口径必须交财务总控冻结 | +| 海外仓报价 | 缺失 | 国内 Warehouse 有“海外仓阶梯仓租费”,但没有海外仓业务原型所指完整海外仓报价主数据;已冻结合作仓来源方案:海外报价服务仅在创建时通过内部服务身份读取国内 `ACTIVE + OVERSEAS_PARTNER` 列表并缓存 30 分钟 | 需实现报价维度、币种、有效期、服务项、仓库/客户作用域和权限/OpenAPI/SQL;报价保存合作仓 ID、编码、名称快照,缓存未命中时强制刷新一次后再拒绝 | +| 汇率管理 | 缺失 | 海外仓业务目标服务中无汇率主档、接口、权限或表 | 汇率仅作为业务换算主数据;财务记账/结算汇率口径必须交财务总控冻结 | | 车辆列表/详情 | 缺失 | 卡车订单仅保存车辆字段快照,没有车辆主档 | 需独立车辆主数据、启停/证照字段、平台查询与权限;不得把订单快照当车辆主档 | -| 国内出仓后船节点 | 部分实现 | Firstleg 已有 `CarrierScheduleQuery` 任务、尝试、历史、来源、过期、幂等、真实订舱/柜次关联和“3 天窗口最多 3 次”约束;船期及查询任务的列表、详情、历史、船司辅助查询已统一使用 `*:list`,旧 `*:view` 初始化资源已清理 | 当前适配器全部返回 `MANUAL_REQUIRED`,Integration 无船司/轨迹 DTO、内部接口或适配器;没有定时调度、任务租约、退避、失败重试、到港停止条件、最新标准节点事实或到港跨区事件;领域 SQL 文件仍沿用历史三期命名 | -| 四期 IAM 权限 | 缺失 | 仅初始化少量尾程订单权限;代码内有库存、PDA、废弃、转仓、采购、卡车等权限常量 | 建立四期资源矩阵;所有正式列表用 `*:list` 覆盖详情和只读辅助接口,写操作独立;同步 Controller、OpenAPI、IAM 基线、统一 SQL 和契约测试 | -| 四期静态 OpenAPI | 缺失 | 船节点已有静态 YAML;Lastleg、Overseas Warehouse、Auth 海外 Token、到港事件及四期主数据没有完整静态 OpenAPI | 按浏览器公网 API、内部 API、事件三类拆分契约,先于前端正式联调冻结 DTO 与错误码 | -| 海外费用与 Finance | 跨总控依赖 | Lastleg 当前无四期费用事实 Outbox;Finance 口径不属于本总控 | 本总控只定义来源事件候选、业务键、币种/金额/来源快照与幂等字段,提交财务总控冻结入池条件、审核、结算和汇率口径后再实现生产者 | +| 国内出仓后船节点 | 部分实现 | Firstleg 已有 `CarrierScheduleQuery` 任务、尝试、历史、来源、过期、幂等、真实订舱/柜次关联和“3 天窗口最多 3 次”约束;船期及查询任务的列表、详情、历史、船司辅助查询已统一使用 `*:list`,旧 `*:view` 初始化资源已清理 | 当前适配器全部返回 `MANUAL_REQUIRED`,Integration 无船司/轨迹 DTO、内部接口或适配器;没有定时调度、任务租约、退避、失败重试、到港停止条件、最新标准节点事实或到港跨区事件;领域 SQL 文件仍沿用历史国内货柜履约命名 | +| 海外仓业务 IAM 权限 | 缺失 | 仅初始化少量尾程订单权限;代码内有库存、PDA、废弃、转仓、采购、卡车等权限常量 | 建立海外仓业务资源矩阵;所有正式列表用 `*:list` 覆盖详情和只读辅助接口,写操作独立;同步 Controller、OpenAPI、IAM 基线、统一 SQL 和契约测试 | +| 海外仓业务静态 OpenAPI | 缺失 | 船节点已有静态 YAML;Lastleg、Overseas Warehouse、Auth 海外 Token、到港事件及海外仓业务主数据没有完整静态 OpenAPI | 按浏览器公网 API、内部 API、事件三类拆分契约,先于前端正式联调冻结 DTO 与错误码 | +| 海外费用与 Finance | 跨总控依赖 | Lastleg 当前无海外仓业务费用事实 Outbox;Finance 口径不属于本总控 | 本总控只定义来源事件候选、业务键、币种/金额/来源快照与幂等字段,提交财务总控冻结入池条件、审核、结算和汇率口径后再实现生产者 | ## 已确认可复用的实现 @@ -48,7 +48,7 @@ ### 批次 0:认证与契约门禁 1. 收口海外 Token 下划线 Claims、Audience/JWKS 和 Claims 模式权限快照;增加 Auth—Gateway—Servlet 服务跨模块契约测试。 -2. 冻结四期 API 路径、DTO、错误码和权限矩阵;删除尾程/船节点旧独立详情权限,按 `list` 统一只读语义。 +2. 冻结海外仓业务 API 路径、DTO、错误码和权限矩阵;删除尾程/船节点旧独立详情权限,按 `list` 统一只读语义。 3. 为 Lastleg、Overseas Warehouse、海外 Token 增加静态 OpenAPI;补齐 Gateway 路由合同测试。 验收终点:平台/商户海外 Token 能分别访问正确应用域;错误 Audience、缺 Claim、过期/错签、伪造身份头和缺资源权限均稳定拒绝。 @@ -68,7 +68,7 @@ 2. 补齐换标、托盘、箱号、产品、库存查询及不离仓库内操作的权限/OpenAPI。 3. 调整海外仓资源查询,不以客户筛选限制仓库候选;补细粒度资源权限和越权测试。 -验收终点:四期前端所需七类海外仓页面均有稳定的列表、详情和允许操作 API,且不暴露出库/派送能力。 +验收终点:海外仓业务前端所需七类海外仓页面均有稳定的列表、详情和允许操作 API,且不暴露出库/派送能力。 ### 批次 3:海外业务闭环 @@ -83,16 +83,16 @@ 2. 实现海外仓报价、汇率、车辆主数据及权限/OpenAPI/SQL。 3. 将海外费用事件候选契约提交财务总控;只有财务口径冻结后才实现费用 Outbox。 -验收终点:合作仓、报价、汇率、车辆均可作为稳定主数据被四期业务引用;任何财务落账仍以财务总控确认契约为准。 +验收终点:合作仓、报价、汇率、车辆均可作为稳定主数据被海外仓业务业务引用;任何财务落账仍以财务总控确认契约为准。 ## 跨总控依赖 | 接收方 | 需要冻结/确认 | 本总控交付 | |---|---|---| -| 四期前端页面总控 | 合作仓类型码、各页面最小字段/筛选/动作、平台与商户 API 使用范围 | 稳定路径、DTO、枚举、权限码、错误码、分页/幂等约定和 OpenAPI;不修改前端共享导航/根路由 | +| 海外仓业务前端页面总控 | 合作仓类型码、各页面最小字段/筛选/动作、平台与商户 API 使用范围 | 稳定路径、DTO、枚举、权限码、错误码、分页/幂等约定和 OpenAPI;不修改前端共享导航/根路由 | | 财务改造总控 | 海外费用入池条件、审核与结算状态、记账/结算汇率、来源作废/调整规则 | 业务来源事件候选、不可变来源快照、业务键/版本/币种/金额/发生时间/区域和幂等语义;不改 Finance 状态机 | -当前协同状态:四期前端总控已完成双 Token 原子适配,登录/刷新消费 `overseasAccessToken: string | null` 与秒单位 `overseasExpiresIn`;海外请求缺 Token、临近过期或收到 401 时统一触发一次国内刷新并使用响应中的新海外 Token 重放,不再依赖 `POST /auth/overseas/token`。共享认证定向 19 个测试已通过;前端后续全量 typecheck 与 build 也已通过。 +当前协同状态:海外仓业务前端总控已完成双 Token 原子适配,登录/刷新消费 `overseasAccessToken: string | null` 与秒单位 `overseasExpiresIn`;海外请求缺 Token、临近过期或收到 401 时统一触发一次国内刷新并使用响应中的新海外 Token 重放,不再依赖 `POST /auth/overseas/token`。共享认证定向 19 个测试已通过;前端后续全量 typecheck 与 build 也已通过。 合作仓协同状态:Admin 已启用 `OVERSEAS_PARTNER` 的类型、筛选、新增、编辑与保存透传,普通 `OVERSEAS` 保持独立;前端定向 30 个测试、全量 1144 个测试、typecheck 与 build 均通过。前端不调用 `/internal/warehouses/overseas-partners`,该接口只属于未来海外报价服务的服务间契约。 diff --git a/四期/船节点标准化契约.md b/海外仓业务/船节点标准化契约.md similarity index 97% rename from 四期/船节点标准化契约.md rename to 海外仓业务/船节点标准化契约.md index 942bbac..e8f9e93 100644 --- a/四期/船节点标准化契约.md +++ b/海外仓业务/船节点标准化契约.md @@ -1,4 +1,4 @@ -# 四期船节点标准化契约 +# 海外仓业务船节点标准化契约 > 状态:已确认 > @@ -12,7 +12,7 @@ - 每家供应商保留自己的原始节点编码和文案,再映射到本契约的标准节点。 - 供应商没有提供的标准节点保持缺失,不推测、不补造,也不要求所有船司返回相同数量的节点。 -- 四期船节点从国内确认出仓开始,持续记录至已还柜 `EMPTY_RETURNED` 后停止。 +- 海外仓业务船节点从国内确认出仓开始,持续记录至已还柜 `EMPTY_RETURNED` 后停止。 - `PICKED_UP`、`EMPTY_RETURNED` 在本契约中只是货柜轨迹事实,不代表启用海外派送、海外仓出库或库存离仓业务。 - Firstleg 拥有查询任务、标准节点、异常事实和停止条件;Integration Service 只负责供应商访问、解析、标准化和错误归一化。 @@ -162,6 +162,6 @@ - Firstleg 的标准节点枚举、任务状态推进、节点事实、查询历史、停止条件、SQL 约束和 OpenAPI。 - Admin 的 TypeScript 类型、节点中文文案、时间展示、状态标签和页面测试。 - HTTP 验收脚本中的节点枚举、详情和历史断言。 -- 四期 README、相关 `AGENTS.md` 和新增供应商映射证据。 +- 海外仓业务 README、相关 `AGENTS.md` 和新增供应商映射证据。 不得只修改某一家适配器而跳过统一模型,也不得为单一供应商新增含义重复的业务节点。 diff --git a/四期/三期装柜完成后至四期人工验收手册.md b/海外仓业务/虫虫出海全流程人工验收手册.md similarity index 84% rename from 四期/三期装柜完成后至四期人工验收手册.md rename to 海外仓业务/虫虫出海全流程人工验收手册.md index 32507ea..92a54e1 100644 --- a/四期/三期装柜完成后至四期人工验收手册.md +++ b/海外仓业务/虫虫出海全流程人工验收手册.md @@ -1,27 +1,27 @@ -# 三期装柜完成后至四期人工验收手册 +# 虫虫出海全流程人工验收手册 > 适用环境:开发环境 > 国内 API:`http://dev-api-cn.buggoglobal.com` > 海外 API:`http://dev-api-global.buggoglobal.com` -> 验收起点:国内装柜已完成,入库单和装柜计划已经进入 `LOADED` / `COMPLETED` -> 验收终点:海外仓完成签收、实收和库存落账;四期独立主数据与海外业务完成各自生命周期核对 +> 验收起点:客户与账号有效,客户订单具备可履约货物 +> 验收终点:海外仓完成入仓、库内服务、出库和派送;异常退回、一件代发及国内外回写均可核对 -## 1. 本手册不重复的内容 +## 1. 全流程范围 -以下属于装柜完成前流程,本手册不再重复: +本手册统一覆盖: -- 客户建档、资质审核和账号创建; -- 客户下单、入库单生成、测量、称重和计费; -- 分柜、智能排柜、预装清单和真实柜号关联; -- 订舱放舱、国内 PDA 拣货、装柜照片和铅封证据; -- 报关资料、补件、代理提交和放行回执; -- 将入库单推进至 `LOADED` 的装柜完成操作。 +- 客户建档、资质审核、账号、角色和权限; +- 客户下单、入库单、测量称重、尺寸策略、计价和费用; +- 分柜、同柜、智能排柜、订舱、拖车、国内 PDA 拣货、装柜、报关和国内出仓; +- 船节点、跨区建单、海外接柜、卸货入仓、库存、托盘、换标、转运、废弃和退货换标; +- 排车、海外 PDA 拣货与出库、发车、转派送、派送完成、异常退回和客户回访; +- 一件代发、海外采购、本土卡车、本土散板、海外费用来源及国内外事件回写。 -本手册从已有 `LOADED` 柜次开始。若开发库没有可用柜次,可先运行第 15 节的自动化脚本生成隔离数据,但人工页面验收仍从 `LOADED` 柜次开始记录。 +可按业务域分段复核,但最终结论必须以端到端状态、库存、费用、权限和事件一致为准。开发库没有可用数据时,可使用第 15 节自动化脚本生成隔离数据。 ## 2. 当前验收边界 -### 2.1 本轮必须验收 +### 2.1 必须验收 1. 国内出仓确认与撤销边界; 2. 出仓后自动创建船节点查询任务; @@ -33,15 +33,20 @@ 8. 海外仓合作仓、报价、汇率和车辆主数据; 9. 海外采购、本土卡车和本土散板; 10. 海外账号、权限、双 Token、撤权即时失效和跨区事件回写。 +11. 客户换标、仓储转运、货物废弃和退货换标; +12. 排车编辑/取消、海外 PDA 拣货、出库、发车和转派送; +13. 客户派送单、派送状态、派送完成和签收附件; +14. 异常订单、派送退回入仓和客户回访; +15. 一件代发 SKU/箱唛库存与出库。 -### 2.2 明确不验收 +### 2.2 验收方式边界 -- 海外仓出库、退货出库和海外派送; - 箱号管理和产品库正式页面; -- PDA 出库拣货或派送; - 车辆派送履约历史; - 通过数据库手工修改业务状态; - 使用历史柜、伪造节点或直接调用内部接口代替正式流程。 +- 派送由 Admin/Client 验收,不要求在海外 PDA 提供派送页面。 +- PDA 工作台未注册的库内操作通过真实 HTTP、Admin/Client 页面和最终库存事实联合验收,不把终端入口与业务能力混为一谈。 ### 2.3 页面与接口验收层级 @@ -54,6 +59,9 @@ | 采购创建 | 自动化 HTTP 或具备客户入口时由客户创建 | Admin 当前主要承载列表、详情、编辑和审核结果查看 | | 本土卡车、本土散板 | Admin 页面 | 可创建、编辑并核对状态 | | 海外主数据 | Admin 页面 | 报价、汇率、车辆支持创建和状态维护 | +| 排车、出库和发车 | Admin + 海外 PDA | 核对拣货、出库数量、发车门禁与状态历史 | +| 派送、异常退回和客户回访 | Admin + Client | 核对客户范围、派送状态、退回入仓和附件 | +| 一件代发 | Client/Admin + 海外 PDA | 核对 SKU/箱唛快照、库存扣减、幂等和出库结果 | ## 3. 验收人员和账号准备 @@ -62,7 +70,7 @@ | 身份 | 用途 | 必须满足 | | ---------------- | -------------------------- | ---------------------------------------------------------------------------------------- | -| 平台管理员 | Admin 全部页面验收 | 使用开发环境验收账号;具备三、四期 canonical 权限 | +| 平台管理员 | Admin 全部页面验收 | 使用开发环境验收账号;具备三、海外仓业务 canonical 权限 | | 海外仓操作员 | 海外 PDA 真机验收 | 角色为`WAREHOUSE_PICKER`;权限含 `lastleg:pda:operate`;绑定且只能绑定一个实际海外收货仓 | | 第二海外仓操作员 | 抢柜和账号隔离验证 | 与第一操作员绑定同一实际海外仓 | | 客户账号 | 客户侧采购或海外仓服务验证 | 客户状态为`ACTIVE`,国内/海外 Token 属于同一客户主体 | @@ -296,8 +304,8 @@ Admin → **系统管理 → 用户管理**: ### 10.1 登录检查 - 登录成功后同时取得国内和海外会话; -- 首页只开放 **入仓作业 → 拆柜收货**; -- 库存盘点、商品移库、托盘管理、换标和现场查询入口当前应显示未开放; +- 首页开放已注册的拆柜收货、库存盘点、商品移库、托盘管理、换标收货/执行/复核、库存/库位/托盘查询、排车拣货和出库作业; +- 库内、换标和现场查询需在 PDA 页面验收扫码/人工输入、错误恢复,并与真实 HTTP 及 Admin/Client 最终事实交叉核对; - 平台管理员或普通客户账号不得进入拆柜收货。 ### 10.2 选择柜号 @@ -389,7 +397,7 @@ Admin → **海外仓 → 尾程订单/入库单**: - 状态已完成入仓; - 总箱数、实收箱数、入仓码和柜号一致; - 历史包含创建、签收、实收和完成事实; -- 不出现出库或派送状态。 +- 出库、派送和异常状态只来自对应子单及状态历史,不覆盖尾程主流程状态。 ### 12.2 库存 @@ -421,7 +429,7 @@ Admin → **海外仓 → 托盘管理**: - 实际报空/卸柜事实没有重复写入; - 相同海外卸柜完成事件重放不产生第二条事实。 -## 13. PDA P2~P5 后端验收与当前前端边界 +## 13. 海外 PDA 库内能力与终端边界 以下后端能力已经纳入真实 HTTP 自动化: @@ -430,15 +438,15 @@ Admin → **海外仓 → 托盘管理**: - P4:换托、拆托、合托、解绑、物理状态补偿和幂等; - P5:换标认领、正常处理、跳过、异常、返工、复核和完成。 -当前海外 PDA 工作台这些入口仍为 `available: false`。因此人工验收规则是: +当前海外 PDA 工作台已开放库存盘点、商品移库、托盘管理、换标收货/执行/复核和库存/库位/托盘查询,按以下规则验收: -1. 不要求验收人员在真机点击不存在的页面; -2. 使用第 15 节自动化报告证明写链; -3. 在 Admin 的库存、托盘和换标页面人工核对自动化产生的最终事实; -4. 等 PDA 页面按最终原型接入后,再追加真机操作、扫码焦点、弱网恢复和视觉验收; -5. 在此之前不能把“后端 HTTP 已通”写成“PDA 页面已验收”。 +1. 在 H5 使用人工输入完成基础流程与错误态检查,在 PDA 真机补充广播扫码、拍照和设备返回行为; +2. 使用第 15 节自动化报告证明写链、幂等、旧版本冲突和资源隔离; +3. 在 Admin 的库存、托盘和换标页面核对 PDA 作业产生的最终事实; +4. 网络失败后保留任务和稳定幂等键,恢复时以服务端当前状态为准,不得重复提交; +5. 排车拣货、出库和发车同样必须补充真机扫码、弱网恢复和视觉证据。 -## 14. 四期独立业务验收 +## 14. 海外仓业务独立业务验收 这些业务与柜号主链共享账号、权限和海外 Gateway,但不依赖同一柜次才能创建。 @@ -514,7 +522,7 @@ Admin → **海外业务 → 本土散板**: 6. 终态不能逆向推进; 7. 不复用本土卡车状态或接口。 -### 14.7 排车查询与智能预排 +### 14.7 排车、出库与派送 Admin → **海外仓 → 排车列表**: @@ -523,7 +531,10 @@ Admin → **海外仓 → 排车列表**: - 草稿加入托盘后立即锁定; - 从草稿移除或关闭时释放锁; - 预排创建后锁转换为正式排车锁; -- 本期只验收查询和预排,不验收编辑、取消、发车、PDA 出库或派送。 +- 编辑、取消、PDA 拣货、出库、发车和转派送均需验收; +- 转派送必须发生在发车前,并生成待出库单; +- PDA 只按服务端 `canDepart` 与 `departBlockReason` 开放发车; +- 派送完成、异常退回入仓和客户回访必须保留状态及附件证据。 ## 15. 自动化复核:数据怎么自动创建和清理 @@ -538,7 +549,7 @@ $env:ADMIN_TEST_USERNAME='platform_admin' $env:ADMIN_TEST_PASSWORD='<从本机安全配置读取>' node scripts/admin-test-env-acceptance.mjs ` - --modules phase4-overseas-warehouse,phase4-overseas-pda,phase4-overseas-pda-operations,phase4-overseas-inbound-operations,phase4-overseas-client-services,phase4-overseas-dispatch,phase4-cross-region-events,phase4-overseas-business,phase4-overseas-master-data,phase4-carrier-nodes + --modules phase4-overseas-warehouse,phase4-overseas-pda,phase4-overseas-pda-operations,phase4-overseas-inbound-operations,phase4-overseas-client-services,phase4-overseas-dispatch,phase5-overseas-fulfillment,phase4-cross-region-events,phase4-overseas-business,phase4-overseas-master-data,phase4-carrier-nodes ``` ### 15.2 自动数据流 @@ -617,14 +628,17 @@ node scripts/admin-test-env-acceptance.mjs ` - [ ] 国内柜次收到海外卸柜完成回写 - [ ] `EMPTY_RETURNED` 后船节点任务 `STOPPED` -### 17.2 独立业务完成 +### 17.2 海外仓与派送完成 - [ ] 海外合作仓可创建和筛选 - [ ] 报价、汇率、车辆完成创建/编辑/状态/导出 - [ ] 采购完成创建事实、编辑三态、审核和流水核对 - [ ] 本土卡车完成创建、编辑和版本冲突核对 - [ ] 本土散板完成创建、编辑、状态流转和终态核对 -- [ ] 排车查询与智能预排没有扩大到出库和派送 +- [ ] 换标、转运、废弃和退货换标完成并可核对库存流水 +- [ ] 排车完成预排、编辑、PDA 拣货、出库、发车和状态核对 +- [ ] 转派送、派送完成、异常退回和客户回访完成 +- [ ] 一件代发 SKU/箱唛库存与出库数量核平 ### 17.3 验收结论分级 @@ -632,13 +646,13 @@ node scripts/admin-test-env-acceptance.mjs ` | 结论 | 条件 | | ---------- | ------------------------------------------------------------------------------------------------ | | 通过 | 所有必验项通过,无 S0500/5xx/数据串仓;自动化报告全绿;页面/真机证据齐全 | -| 有条件通过 | 后端和业务状态全通,仅剩已明确的 PDA P2~P5 页面尚未按原型接入,已记录负责人和补验时间 | +| 有条件通过 | 业务状态全通,但存在已明确不由当前终端承载的页面;替代验收证据齐全且不影响端到端业务结果 | | 不通过 | 主链断裂、状态可绕过、权限越权、重复入账、跨客户/跨仓串数据、非预期 S0500/5xx 或关键页面不可操作 | ## 18. 验收证据目录建议 ```text -三四期人工验收-YYYYMMDD/ +虫虫出海全流程人工验收-YYYYMMDD/ 01-装柜完成起点/ 02-国内出仓/ 03-船节点/ @@ -651,6 +665,9 @@ node scripts/admin-test-env-acceptance.mjs ` 10-采购卡车散板/ 11-权限弱网反证/ 12-自动化报告/ + 13-换标转运退货/ + 14-排车出库派送/ + 15-异常回访一件代发/ ``` 每张截图保留浏览器地址、柜号/业务单号、状态和时间;不得把密码、完整 Token、身份证件原图或其他敏感信息放入验收包。 diff --git a/统一订单主状态与操作契约.md b/统一订单主状态与操作契约.md index 42288e0..dd075bc 100644 --- a/统一订单主状态与操作契约.md +++ b/统一订单主状态与操作契约.md @@ -37,7 +37,7 @@ ## 三、门禁与修改规则 -- `WAIT_MEASURE -> WAIT_SPLIT` 必须满足二期测量、审核和费用确认契约;客户确认和差异沟通不单独增加主状态,也不替代服务端门禁。 +- `WAIT_MEASURE -> WAIT_SPLIT` 必须满足入库测量与计费测量、审核和费用确认契约;客户确认和差异沟通不单独增加主状态,也不替代服务端门禁。 - `LOADING -> LOADED` 必须由服务端校验订舱完成、拖车完成、有效放行回执、PDA 拣货完成、五类证据各至少一张有效照片及锁码文本;任何一项缺失都不得推进。 - 本版本不新增异常、驳回、阻塞、取消等主状态。异常说明、差异说明和补充资料作为子状态、备注、附件或自定义节点保存。 - `LOADED` 前的业务资料可在权限和状态规则内修改;修改资料不自动回退主状态。`LOADED` 后错误统一线下人工处理,国内系统不提供在线冲正。 @@ -83,7 +83,7 @@ → 智能分柜并确认预装清单 → 完成订舱、拖车、报关放行和 PDA 拣货 → 五类有效照片及锁码文本通过门禁 -→ 装柜完成(LOADED,国内三期终点) +→ 装柜完成(LOADED,国内国内货柜履约终点) ``` -后续由海外仓可信回传把 `LOADED` 推进为 `DELIVERED`,不属于国内三期验收主链。每一段均需验证:满足门禁时可推进、重复操作幂等、操作有留痕、客户未确认不额外阻断,并且 Admin、Client、PDA 显示同一主状态。 +后续由海外仓可信回传把 `LOADED` 推进为 `DELIVERED`,不属于国内国内货柜履约验收主链。每一段均需验证:满足门禁时可推进、重复操作幂等、操作有留痕、客户未确认不额外阻断,并且 Admin、Client、PDA 显示同一主状态。 diff --git a/一期/README.md b/订单与客户/README.md similarity index 58% rename from 一期/README.md rename to 订单与客户/README.md index 3ae0c6f..1ef2db1 100644 --- a/一期/README.md +++ b/订单与客户/README.md @@ -1,29 +1,29 @@ -# 一期文档 +# 订单与客户文档 -一期目标是完成平台后台与企业客户端的真实业务基础,以及头程订单最小闭环。 +订单与客户目标是完成平台后台与企业客户端的真实业务基础,以及头程订单最小闭环。 ## 当前主体模型 -- 一期及后续未单独启用租户能力的阶段统一按“平台—客户”两级开发,当前是业务单租户、平台管理多客户、客户严格隔离。 +- 订单与客户及后续未单独启用租户能力的阶段统一按“平台—客户”两级开发,当前是业务单租户、平台管理多客户、客户严格隔离。 - Java 与接口中的 `tenant_id > 0`、`tenantId` 当前表示客户 ID,是客户隔离兼容字段;`tenant_id=0` 是平台账号和平台 RBAC 的技术作用域,不是可管理租户。 - 历史表名、类名、接口路径和字段保留 `tenant` 命名,但不得据此新增租户主表、租户选择器、租户级权限或把现有字段改义为上级租户。 ## 文档 -- [一期开发进度表](一期开发进度表.md) -- [一期头程订单闭环设计](一期头程订单闭环设计.md) -- `虫虫出海一期开发进度表.xlsx`:面向团队日常维护的 Excel 进度表。 +- [订单与客户开发进度表](订单与客户开发进度表.md) +- [订单与客户头程订单闭环设计](订单与客户头程订单闭环设计.md) +- `虫虫出海订单与客户开发进度表.xlsx`:面向团队日常维护的 Excel 进度表。 ## 原型来源 - 产品原型统一位于 `docs/悦/`。 -- 企业登录与注册分别参考 `docs/悦/合并/login.html`、`docs/悦/合并/register.html`;一期只默认包含中文账号密码登录和基础企业注册闭环。 +- 企业登录与注册分别参考 `docs/悦/合并/login.html`、`docs/悦/合并/register.html`;订单与客户只默认包含中文账号密码登录和基础企业注册闭环。 - 快递公司和往来单位参考 `docs/悦/货代SAAS平台后台/货代SaaS平台原型.html` 中“通用”菜单下的对应页面。 -- 原型用于确认信息架构、字段和视觉方向;是否已进入当前 Vue 应用、是否具备完整交互与数据持久化,以一期开发进度表为准。 +- 原型用于确认信息架构、字段和视觉方向;是否已进入当前 Vue 应用、是否具备完整交互与数据持久化,以订单与客户开发进度表为准。 ## 当前边界 -- 平台后台:内部账号登录、客户及企业资料审核、内部用户、角色权限、平台收货仓、快递公司、往来单位和头程订单;工作台不作为一期交付项。 -- 企业客户端:中文邮箱/手机号加密码登录、免审核企业注册、企业资料、成员角色权限、头程下单、订单列表和详情;企业资料经平台人工审核通过后才允许提交订单,一期不接短信/邮箱验证码及微信、企业微信登录。 +- 平台后台:内部账号登录、客户及企业资料审核、内部用户、角色权限、平台收货仓、快递公司、往来单位和头程订单;工作台不作为订单与客户交付项。 +- 企业客户端:中文邮箱/手机号加密码登录、免审核企业注册、企业资料、成员角色权限、头程下单、订单列表和详情;企业资料经平台人工审核通过后才允许提交订单,订单与客户不接短信/邮箱验证码及微信、企业微信登录。 - 服务端:认证、基于兼容字段 `tenant_id` 的客户隔离、权限、文件、基础资料、订单状态机、幂等和审计。 -- 不包含工作台、部门/组织架构、完整 WMS、FBA/海外目的仓服务、在线报价、财务结算、完整报关清关、外部物流接口、多语言及微信/企业微信登录;快递公司和往来单位一期支持批量导入,不提供导出。 +- 不包含工作台、部门/组织架构、完整 WMS、FBA/海外目的仓服务、在线报价、财务结算、完整报关清关、外部物流接口、多语言及微信/企业微信登录;快递公司和往来单位订单与客户支持批量导入,不提供导出。 diff --git a/订单与客户/虫虫出海订单与客户开发进度表.xlsx b/订单与客户/虫虫出海订单与客户开发进度表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6c49842f780c06e9b83eeb6f2ad5abc8b0899b08 GIT binary patch literal 29110 zcmZ^~QvvagEw6n9KbGNZ>UYwR36hHvK zQ-kzsecO=PFuWR$Qrp#U?5xjU-%g0hD8#EOdm`|~l1cUFPTEUl7RA1u~kf)P98K+$Kt+f^AUiJZm^ zFYPLN7`J$Ss`AVSu;JYx%Bv4VYa6-*eA#1xN!Q{tAPr0e(qBvd9VZ4RD85!fl9?58 z1dh@OL7tCNf$NGo_t;x-zDR)oG*YPG>aK&N5mF|rZT%;*{*Se}e5vF7sxN;p_k^9S zBu?iZ2%Hs*d>=uJ^x44$Jd1Ddw5(g>juc-PMZ}&Eiu~yPWlEd`Fk8GzySd{x52x=` zXzKcomP9ZVA`{RBcMWLz<)7U$-6UL`Q+PSOm#^`4D~Tf%BCluKBOyydp!_H*g!8DW z^C*s5Z(#ZV5tI56jAB06uYC3a0AT-5Ois=o)+SE>5z@7eOkySn!WT7N#d8}Y(yo$2 z17>u^bApuPTIJ{nn+lM2+PLS#W$Ww1nnq$jjDE*f*sZpbHJIVH`Y z_}e)t`M!0hQEDnCiWtsEsQpUH{3sGFrVFn==X)Q>OGnjAs#hEy-(|(hZI2QBWPNFl zqz$S(2Z5CJX zJhy8VmFEf*#XBnM`uVNDF_T6T|Cl#;zfOy08s87JIk zlK+hR1%D~&9u>b+%BuQ0(yU}Wcs5de47<3Jez|askKQqpZl@66HQon)aIkk7O0&}D z%;HG|PCr+KdIVjiv+U?B(#5!ij9OrYt+LQ)CZ(coS^3XCwV!g*`scD+!+mybqxQ{W z>jL<8O)VOoOTE!HzRbR-5f8iH)bXXW9sjF5bH^0d&_yempdaRzlToeZXs*$)xyE0q zrMEQpU&U0va(y_ybb37^C(4B}EsN?Tik0mJRqXNgnuL`Q$P)ibV(5c*+t zL0gWoo+p4!SNMxWR`~l6f%0vDG^O zCZhN$eO}(10&6VEVeXpwPpcUTHn`T#X(431_{IPLSqgwft6+t5#X&KQa@&2zt$Cxg zLN`uUT6ZExpdliHx`k;lT+&Q`e~NCI@2jPMS0)(f9qHX$dAD4-t}%l)0_)sYFbe_X zsV+et;7&d>zM7Gw@~uM)N<~Xt&UGemL@ATvI6Q)Y5XGY47(_BgWtH$^D3q}s@AksW z-~=gHBrpof0EXoXK(K!+EXpq9Vks00f5sO(lVrt;oB`^W2<8z)K!4kjG9Z*=UFdl+ z3iryklcoS(#6^go|8^8KB#49(pcy2#cxPYZbMoejOw-*T&hugHxeA?>Dno^~_3>Oa zpAllo`14iCVoDr|l7R2LY#sn>r>tCQ^`8Oi|2qI##x&wGer(4#K->~+J&cYYfG8A4 z%Kz2Exf4UDaQ@luVW4@nEHERE!$a~;b$cS1lEHSlvUEu#UX_W}Wao6;J}PrT#^pL{ zKi>;=>yZJY>mkeZ@00PqaGenV8}Qr$UV82Q!gU6BE0oE#PhYjJBti1-Yc8Je;aQUp zT~6hq4^>Hq~P2YV$#)gIefblzG@vEy?uLS0##(hRQ0e;m(dXe{e7{} zUT_yGQmFqrQiD7d;4RN44nt&R(I(`u-jB};4!h%a$dwbvY$mhojEpL7l zLhfMbybHuGIcdI%A_LcC`#12w;nv;av%kLWo)0z2qUE{YaiCC_qMJnClfzx8)nd>L z6HR?Ga5k4N7S=vxgNZ+Th<8iG=aibc)zyqnx0-&jqshB7tVK9wi}6SDKM6`sBBFIj z>wp$wNB0VIvZc9&(h73XiQC!qMm=T2RhcaKycrgm66-&iM}&9>$u6R`&qK1&CWgA--?32zj6=Y7# zGoZ!S#E&F?vtT%njMHzk|2~%FqV|6XeY|7N!NSUNg&?W0! zq=V?pqU3&j8s_4{JlR}+oR|Ip{I4#1*9O!81_l7w_*G=c|EJ5G%}s1f=>L0V{EtTK zR@-#UWI*{u6}^RJclsA>j5KPCzhF^14nIa95QBgx5u4q6OJEBWeaPZ^1ukVcyDoBC zH?Z3Jk!4;R?w~z~kfsJUhY%BqvB(0V_1F7f|MfI$Rus&!cp-xrp}MiW_sx1P;DEosGgeDM2#ORSwgLAUxH3zjNCRGu*})Drf=#=FONcKxcLs0|bH`V|qa zu#)=9Y!oE!({<0`i_+qF9AbC40z+{?kAP;e=bb>Y^7w={=UiYq+c52{?P=a5$kJnp z?!;$*r5w5lICKq!j)X;O4mzgXpR(*cMkJx2gH|O!OMapug)>!hGxl+{lA~ap)sN2T8c9khH@)n*gAq|J za{o3U6=WbR+NzL3(ZJsX%>PPnp?>Q=x%r-?VT+CeA8Ujnr*A%`Rxt+}d;`L&+)AIE zKO5u~mIx$btY479Z!c@a>H5@g=A>)^sxPJ4v9M||@zciv8fC@>HfKC3p!7#GT4|nr z{VLE3GfwQ^825s=2}wOnQ9`6XhADnIZ9Z`6;F@%J@?Gj{F1cFC^hKh#=L4H)FM1W* z^IKA)uH<>CFTapKmcgp#C7kVvpLf-Ha|z|LUSBZETxI0M{tU2GwfzSC-!%h^*M4U5 zyH=cjKmP&mzcAg&+`!SqSjpMZ!q)7+Fc7p~0cwx{24JpI{M&4cZzO&rM`WW3iVQ6g zHm>(2#m3QzA4{{7#Qhy0*7#N|nYw>xc}?EYQ$ZOn4jGL3P(IVf^|k zsImO^P^cUH_z(17he0(6yCZE-oEpFXWefLG-Q5iOmmg{X0F3`*>p!OlCvy`MXQy8d ze~bUF=j;p{C9H9@(cX!z@{VS&%B?#Bg8CI}%-no~S(n97>F9Brhx z+0-N4v-C0^IM04uTUl~bJki;i&9q!07QW}8 zr)in!qUu2!^R)1@cd{Z3gWQ;@z`U%JZPt?$KT>d=4EzIFRW!`Eb(@^62ezj3)OR&M zY`4wR`t9|U>=h6FzDGeaZ~B{^eV zHovF>9Ih2Ous{c_y-V zbH+PQA8t6+sRt{qIQ>8hHVrAk9>f@&VJr9${HRwG^SlE+@33#eEbrSb6-rxT5I063 zZIFXoB!o6m@~=hAGG!r!#Ap!21|Y1KqC*tw_0MBPj6q4FT9T?e=(HxRu_+C!OhSz#5~eHzG0_VioS<4o;~^XR*UMJD?#D;KR}A#1Z}7ewvw-| z+EyakBgZ?Y67-HruY=f*KXU^=oQ>X5(dCBr*~&hXA4Q=a2$aWdGRgfW>^fg z!aS!Iu!&Bx{fcYmo}cE!_WaN9`^)q3GCIlX3Fp%8t?cS zNHO!?J2ReJf_cJDVrt^HPC5&$9M;o2pepOQtLvnIBSSGK-lOt;K{@mG`P$@o#QAw{ zX)nGHGb1k->-=^<<>DPm}36&;}QkrxJ_Ky#Spr%A^Sq8VVwZ zZcr-cwL>%8V%TxOq2+MR)OJnM5^PPQVk}17DT@vV6r0h42cT5%+o$~pkm$d>&zsCy z`eCR&b5Pci27+$|KAmLZp(P$s#<)aIQiT|Hk(Jo>V6u_;ba9|z5i3C^I7H4o-WM5w zkrw?6e+WPw5TSli0?A;1vPiL_e}T%J2vU4^bWjr!c6>ip-)b|{;mf@3@nBkrF0?4r z_{Gx%ZQs#Acw;-NiSEuFs!H}>8ana@6X3gg{)ZG@8}XNv=UsW4LD*V~q_nFq1~i-6 zp2>hA-^BJf*P3qFW{7F81+bTkt_lwX>bVE;X&rwGlu4$ANOJ$O1qmBlSc-r%;~S6_ zsj{}21HQrV(Bu!8HUfN7)}i)aD;7hn#zpKYW{o`+Wkt;O*+k~J21y;I9OQ$yHifMo zrO++xr4S_;qBEd^?NbcgGJyvo;^@?S)1lr?28pG?*!N@S1lI{$9f#w zb6dkqne2@K%F=DbV?O%Oxrhs7c|e(B`74C<3mB1-lR7due@&mJ%C#QdnI(ZPQpe~V zG%$)X7f&llnfM@xv*7cJ7w{F6Nn%mKrkGcppB5Uym_q(5M6+sL4u7PqdIY6qG^8Xe zh7<7ZMWh>el!RA=`ARUHlNQJABxIsT;Y{(Li_ID*)P*9qC(X02RaIcyjogcb(0x1J z$TjvhPiekqd`t{8=kwhE6P3=!=bVhj$C4}r2SF-W9DTAcs7i<9B8nxtqJIxIwCYfl z89;u+c%x)|)d=zj=wL~{Ws~7vgf1sC+08hZrP)0jXdDXyOqsh3!u)z2yN6-x71$cB zNLaS23)rL}l`#YT+OewmVn$SMoI}C8j6-9bV;(3k23e;#1X*SoiX4tGr_GQu)L~#5 zeMV^NtTOfY8NHE`5^f#Vj^DAWa0=J6I{+;31L>W?3N~MZK~SgtlJaNivtI>^VOod? z&_M2Ir&0371-`VQvI-1rvP1S7U#f1<1Jxq^ge*y;+eWHPGNV^AU+`vNIlCR zv#4%4Of8YN4CHB->}5g^P`@|Sqk@D`K^h2pc3`IUG|Ih+e%HSqK!DVGEo zxJ1%XHrTWTeUrugyl7_4f>35jB(DD#?41SpN$s8iBuYm0}DG1&S*&?Iq&1Gm4EN?zZhjzyYlx*Qd`Nk$sid_^jAu>@vlDU;0&odx?)~pg6az z-UiAvugD7~A~c0iKwqYvWv2Eno#BFZF&NpVqBO&Ix?uQm`{naN4owcAP-#BlxIHS18Yd3_COJ;d z8gjxSYV#11;J$Q-iBxtc+3gfK8`DvxycoQxKxOY;D;%04;k=T7PFpgBOJ%~oM`UHW z?%jIwEbs~Tg9@hA^-6`oqT7pc zt~t7kGvtLOF2lLib-8uoUa||sTj0tUPH#Gm02&Td-{{LjfjKd}&-ksreXM;9oXU3Gx2BSuM-sf#tJsYy68WTV3=;?NF$l1KT%sNs zoF;+^oj0T6TA)2-cxM3eLvmOhgSlt#JCrRF&mZj(7 z6n*sxz&0>*Z`F5d>#l7#2{5^uY&>&f4qBgLg2n^Cb%5xl#)r6v&Kf1V%drjUqlG4> z;ZhhsI{tLH{D=W}uXFZf;Ohept%isHlZ^-FOxG>dEl*I5+X+W&ox{B^T>(wn$1~FYWhC< zwk21$SL3>1=^%AoFlGSXp0@J_%fskIRT629+A2Q|0L z3BP?|Ro7O{vIb4sIQE(J%=!%9jt=U7;}ca?6YrCLe7JZIpUezsSTM2LR+jAxTSt)5 zkKo{7VtBe%o;bdDHfD={zAvezYPlez--w|YPr9^qrk=KK6(E6iUS(- z$*1n0?;Bg(&j;_X-|w+MleE9eXJ_F;JHy_q+b688ZC}5|y}`z@2n2tq^uvbXfmHc= z2*v}=-NM4gd3CTSLFian+Bym-@q-2X0rb1U-AnD-{TinB9(w6|>NLs;=nLu@{j=}Y zPu>a~1dkt5%i7%Jw6$3I)lUd_1`p>E3cg>N$usC9_x6(u0~d_1V`X{I?tupj2LmGN z?(`M+XMgW*H>OtwFUUR@@I_^hmTs>atg9L5))~-_dCvx|Yx@*v$F^^ix|+Sy{{yzI z7szeVGYs(7yy{67c*mmO$JVoF(%(%*)6NMnOiiR4kaRe6Lo*w1ubP5jb?v6d9{&>q zn(sdPK2tzLYg4+exF?JC%YODLg-kA-TKZK}iGpY3=VA8taf>=dQyz+$=0!3F|MCsD znk7F;(wYjo`Wtz(CC72lGjg@VRmr|u%f4F7{@Sa*Su4=06?D}Tbk(;`@81Jl!xOT( z#;azc+=d+AH^@)1ui@zCghpsFe3FnPwXc5twG{8mo3o4-Wql*)(;!}^xNoHJ`V^QK zXSFSw`uC9%$$RT4ApB(ak}2GpcEa?GdF{XVUqcv9-75%pjCnCEZ|awKM~Pll{Q=x$ zk0~;B&dJYfOL6-fe{eya?h+YPf3t0WGhTo5E$FH(WX(33_9d$JN55~iC`#T#s86+m z&tGNDw?Xge)S-n<+AFLB+iMqH=MR|!R~P!pl~mzyTcG|DwnsBF-Qu?5q?C2x=wn&o zJ3OG8EV@Q@ZR(pyfn6nhR+l2t0-_;Wpa3i~p{)|#D{q~jHVUCfMH?L3v#?(3;R1+9 z;AJ1J#EY*4{D6k=CxiFHN1OxO?XJe}ffKuk2Ck6x#k!zFabmhH$iy;#{xgxJ6Ij z{>o`PieViavRPeTWGa#;D7Vaz3i0h4y{hx|B1LyPkWcYKPp~lXvF;yXV8Fx%@Z7$&GQIPdoKzemH9AYU*^AwrG4J1(x0^yn5d#5f`0Ko(H_2#MuVrps$PXjSmwv z+WUtzJo%4-sCwph$P7igJd2H9o;TXFkY7o77sC)CWZYLgVA31eXjDxBK&zWIb3!gD zQ3~c^o+fr8)T|*D$pCP;d2?H4^YCu!?-=wAufZ)!@7^7u-8CqZWe}1EBlg~}F0S{Q zQP&64j?H0v6yDY4)s3>vFH+a8mGak=(Zbi1;W?WN{{|GAGXu533-=YEnAhevE_t|u zbBX31Ne0NGe#?)3KM>Kr$W!vBX^PAZkDuC#+3Tj~yOR-rTy(5!%GC&( zGC#-8x_s}VnO1!VwB4YdwCL#b(=SMmNtf-QT#%=mQ`Q04GhfP9FJ3Rdz5?XOyy)-r zX%IY*7?15sPj{v_SN%F}=c8(q7t%Y@X>Z95qa@ahg< zE~cJO7g=$fmS3yb>H&A&H>6zI)MBeH&=Ygz5-rIJ=uSLS^&KLgSdU|X=@O?j!*sF8)S>C09hN9|Em2aKI zO^2)B?me(VS1c?9T$Gy-lZ1sbkq^S{Wha_zmDLTX zWqm<30R)_zw5XFan{8GEqi<+0GJCz3ceih{qq&+lYfT=g$XHu8?4&@`2T#R|rq;Io zof&AfCwb4=bjv+TmJY!MZGr|QmU4n~;+0W}md|ea8%hFSpP-pE4T;3n&SkPTIvHYj z{&Euh&0(HY`Fls;Qn;D2_2=l8t=ce#*D2ko)!QT$%1ch1$5%p`yZ=6UurS(vTT?gB zir!td&fKU%EK)T6qcTfV%pfQH?mKYOflb5*ZLW9_NhV!#}vwzP(Z?DBL4kpad`kNSc*`8TgUV2nTl0Db- ziV@FR(QObb)+SKUKSTEw3sKf_d*~j$S^8vEGZKUisF;IiHHnJRq5D&r<1DU@!8yI}jMcXz>l3;j{N*$F z0fxOY7!{e{xIwhwptcU2oFD*>Q)Lu&?kV9QlPGCJ98?S;%Iq!8Q_jmAys1n4v6o?9 z`pl6cX$BwH!7?fKpCdCZpX49vbSuUc29k;8AGj>-AsE!32lWNA^UdCo!gk+lAJ^Mn z{C>M1#F&zcj(;yXK$V~P_h^+?zgSj7@R8T84DZ~bqn{`Ai1t!{ zrj~e&8;X6J@-$i$B*vt6@DqC{dQ+e$`AEp6FF5JD_QvxbQERUCMn|8Qahs0y>W$52 zM-o6{64y$LOWdS+8&zb0B3J?luMXK7@7v0x%H`l zU8~2V?NZd-ap)pOv`?7NTmM!P|D7)qwe?U;#AwH!v|RYz2PcL*xSET7C@hL$*$@|J z9M{fcg!O$}BPB|JX@^Nd?U_DE6{MLG$rYrb3V)g14%Qu=;+F2&2N*O97@9a^`V#ML z*2eszvniBDa`U>`CbTg!@(@P~)hV^*6WfHC65ZrT9U|$-@g7-$yJStqwPj710OEWc zghirQ6o>kADaRfmh^oxqPnFV$KY3YOr9xoIq>wX-sg!6Mx^-rrQ;cL)G3iY3W$GwX zj1+jF%()&(qb3V2R#Swl_<}TWO;kojaqg{4DcrOuV#6F6VV@R7D@_?fodQ`i=iWmG|V>Xi5xc_*lbg(fPmLyo~#MB&MUD2k2 zyVy8Z)iEjOy22!)u_RCvGc>-CG-Ud?kj9DM>d{PT?&7MXFQ!gGMXx-fn~>tHAL)?p z{rkdgPLu3U%(9|E7wlp~11&b#=CUkFuU}p!qfmV=uf0{Aq#2VMqYmwuWdPx(>!g!~8y?ucrGo})I)3e9& zBJo&my~uvp1OCliNbg+j??okKrPD>CwFsKP{1^4I3YO^^)g$GM*G6Ml@@tM8-AVkV zGqAVqq6PrLn-xXH8a%;YCJ|D`*htBeaE_6Qwu`V%O&}lu7rYhZ->=>_gfz+Wr*V&i zI>nDd?PC=R`#ni`4VaP^*pu4nbsJ@RIOfa5r1eGuFKyZ`T1T=px3;Y5ead+q&dSXk zZ`*+_DxcmRV9=HN154U-HDrYo649jSmsvbdZ(Ej)G|R@1iEA>y9N3UC#%^3CX6jfi zqsR?Yp>w+6u{G5{Ca^(QrfPU9@J9Z5kE7RD+_Siwg z2W=%KvLp-eqctPi7>I0X+Uo;rZKng^(15+yG(n;?0*-Jn22M8{pp%oW2s_PtYFml1 z(`YoEe%u1&M&@e`^S;r^ul~&Og>S#)pxGDkOKmqn;7XXLa41YiO2EnCw|V!-r8!uV^{R2QMFW4uZCWs35lm_2>;o@kg( z{p3!`S@@4|*Hl8p5BvFD+khSdrM;I~XVosaeRU~sK{S6J~qM5sYmcM^7pi&}-OoUR3 zrEr@;N0@c=!tO|dDOr{6%esVW@B&*3d!a##ZOF22eOV55Srjt6H{76X*Y|YNat3u_ zft8wcMxkDk2BEjr{n^-Ce?zO~;UuqI>G1%9ojVs{r8sVXq%9qQxgX4@L=`4QqlcTi zU?S90$B%I7H4iW$p2NB>?6~oY?^GLDM>ZOD9C%*InCebWQdDhD0El3EG9V*Svbq%y z8&jiZwS}9vk@Tin=t_bno$&l7-jk1L;=Lhn4h0w+TPJB6 z!2^hX%71};WanHz5AE?jt9hL+;0t{|8A-H(wYlQX5}$iZ7N!37Bq@9B_^<)3DwaX(@FK4rV|BP05`P(z8hJ9s-zt0 zk~NMs625$s8|l_RNmv~4N=wt;n)<>?S`*{-%AB7LDaDe2BBGdj%FZ;JCjzTK@>cmB z8PaP;3ihFAsF%h@DA2|pJf6M3`$%O1__`?RchY8??zxsEN^WrewOH}Ucdm>@Cpd;I zrYmJ@RrY-w)r;hGQPW$Tr*F4q@Q93o_u|ek{KlY)X5~otsUjm$ds#6}y?_I7Yze9C zw>ptX*^A$T#AldfLFA2$w<qvv_)7BH4V`Hy~5LUK&# zNP5`VVXfix3P@sCQ3wrbM2Fx?yI5X%W>wuGhxYD~Oe&PY7Lwhnp9)fyv$tNdUr7s?q@Dkddc9#kFLF0O`tXApjjS zUI;9096?ci>IPxMee;Z}Hg_Gsbxc==xF_P5_gC9!mZ1Ji4B=|6@eJvvi|qpB)3$a~ z^{u>WCu^;p&R5u#ot6U^jjOVT7A_B$*iu~!4D7z$3V$7~mNQa?b!xNKTEqalRuX7{ z?B#uWwU)`P9KYA7X>~+_ssm)IevWcPOW#dMkZ_!7ieeVKyaQL)xcM?Wlt-jzaVg9! zSmADB>j5EFMM_Jf2MX2ML?~y@NAZW09nv>!Y^uVos5ORFvNlLF|5l5a7E_o(=ywT4uB0Rlild>eWSu5ORjuAdzQSXmx2QgSYWdIu@x@ou(afp{3940MXub`% z`@%p^+LJQ037;}n22!iajyA}`EjeT|fcei!1GwBgZ4ssaF$FoEB2?`|v+J7yZ^ls4qDrTrTjbhbJX%&s`G;X4s*0mcTb;KqY zDD~iz1Coj*g|PUGBQ2Ts&wG9v#b#|&XH6L|hh<}z(rw~e?VRT}UpPL;xY67>FrdIk zEGwA^` zc?btD86zpq5Ie$`2a7o?b;aVysa9r|Ua`as@|F2fRi8R0E5_7UG-&&0Y%q-Ew3A@5 zujd^yl}qp33ZPJxZ;_rv6rP30chrB@2c6Z){T>BJ`g|RO>w}A@5R~r%#;BfjwUlSV-7<^E>k3pN5SAB$1Bc|5X9!F+STY39AE5o$}@^ zYd6rJ5pYOS_-b$BCB2noL|5BVQ@#Bgqi0^)^)F(nhasnMEZkNPZCC`B)*Yt;uw1tQK801DA3|J?T%^kT6Ps_>=RIvqLV`~nwE~N z2|n=LPz~i)ExS1Zo2@`@{@qqlL8zMs-YOl%UR_0NhFdfuUo6xpfP5Z7K)dJF{T{K$ zVBDF3d(L{D0?dh`ODmEraXQ_v-skqqSx6O~HxGTmck&zdMShfKBj^xwc?14rv? z?{7|C6@nfx{*&>xicj>l|%*Q9}b-gKz3fgQM)j z_}>Nb1%zAsj|I%plb8WC&#K`VC036y;XBh$Hs=OAEH_g#rxEC$Z$A`R!lMK-QMaq?2;pRG^yD=zrsPear#Ay`NzHVOHeN);s@2`3 zeUxOcLWarW$HKtIg8>B#Cguq)gjYGik~1g{DX7QE91Ge1iNc?YC|BgqvisJSu|Dd7 zXyv-X#X+ONX_#JH9C$G>Ue zEB-gXeyJ6*k{Mbdj0S>?CFP6EV6D7l_;gh65Qjj`2LtdGw(PyGhB*BW20YXcHaY|k zHuf3L{fan11p+(zQ#i6X6$b1++Qy@Or~z)6adXSG36Ox1ivKH_N{To*o8}W^w<{a|87oU21bPzAq7&Qlv#smbq>&^Ln;xzj zX;iEX?%5`z4D6qyose`&76A8Xp0~jm(XPz;tVn8G2qNk^VV`W-Ia?4gDa`UajbXP) z3yKT=s@LdhvN)oRi3AO|(}L?=K~9q@bT2nUvp!9XkuS+2uE&W8gn>CBz)f5~Lnr~v zDG4TU?U2j~wquvYNE;M8(aW5E3xKe2)M9H4iq)Bp?yBL> z%O!mc?uEbV@=)F8QTme*Ha@v5?VCGg_<;SJ@E-ZtkjPfOu}t+Urp=avY4Yy3=m-|Z zN{a<47_LJ}tsQDNaij}1_^Yj*RHiw%1cuq$AuWV@Km?H=d^u&L)ooe?rjQ%bH%Jc; zU^0a{n0n$F2qx)y`CVSNK5ir0^=w~ux;LF}l}J2mPfg`+cVCAy`F|dzZmV-WJ$XWp z?2%QCL7&lcaMmxc_fEhGW=Ab}d;KTJ7;nL#eK~|FQJVQ9)AB<1(9vJ-6$6sj3l=?W zD#Pu;soG`4fc;sNoe4#eP6SAiRCPw6apf5^Ny0J%Sz>n!1*WK6C8{K?lP&r{GKVRv z+$c+;CyV|gEE8?A;&D@|;mu!5{(@z2cN5N072&^y7RxkyZ|)l0%IqH&V}l5So;a1F zNvSZ^WdL=3)xbAWl7JRu6Vjf4W2&ru?m(*9HMPPPotsN60AqrpniILgT=9kb4GSbl zC(n{1+&h{nMWsj^JD?B&c56Vy!#{wsn0OL@XxdPmhE13GuHXH6xM_iMvg$5f9$6a-9zzs=ixYDqpY)$Hy;q zI5>e9K1obNYo&-h&D8-y-VaOVRnx0hv5zYiMgUh87By=$i_`!tym#N+e#UC-n z`7-L)9E8%8yES4c2N=OOO6?t!|Gr$J;gmAp*VF5TYZ;UrLhAT1^v+-d2y0@q*X3sv zkH?d8!v0lPPrOdSsC?+JgzH})4=d~}Ze9oMV}w0yTz8|rWv1k1eSLg9oYBm4_Ns{I%mGgW0?¬^TVm zQ7Md*UH@6=J7qvYSXkfcCPNBMfmQHE!s5ojV&g8=5uN}qM{e7zz~g`riwllnDx{*s z?p97_Ug_g(>*qtzVN&tfz;&DKHxWgnu0W9|J&Yrw0V^|qh$1(a4lF5-jCr?y)HvHu zylQf1d`)kOR7Npo2TQc={+sl1M2iBFm{U_g3tZSo#pMHq}G zM!k-&+$jCJ{cG9I%oXT&jcl;wkcRD>7={eDyv-{jjAMH}S|=)=I4@=Rc7;_6%IBmp zHr;9tEC){vzaJAZH={8AJJnI!2q4V1!L_07Nja(MD14(E5GN1|m!O6sIfMxL>kvGk zjgNtcbFW^k8ojJsm(x(;8Sq5@;Y_D}G*76##d9p8O?8NAos&LMfnT_>(-dvEl&OG{ z=*KHjPiHtpNFmy6=$%YFEZ#mrDcWB_5vuo2iPZg5JKsnDWfW9s5cke~^%f|6^BJnR z719_jC6eeZDu`=!f)-*}>!xo%#bYBci|Y3eolE}?VBDT4=O2+EQbjxlq>6a-7Y?=6 zQv+Ay^Pjookka2MV17i|`&2|*|HF)*%ld$d+9a^0$ROq+%rsQOrE^};nsyAWv z<30*VyRy|{_dnaWeVJ&62=|Cx`5EOX@$AUq@=gsI!UJN@3xR(V!-F+UCkxe}4n~sZAxeQIN zJ`5(kO7c*jP~OrADM)N`N*U52$|xxp@X2!FnigD?LrFFhs8WS z2XeUQ6EIOBAPD*{7XSgavtUQa`6oa~wLesv9212J62A|!EPIxnD!t44G->Z5f>wfM zKV_Tur&$5^;uA|=>M=x$cZKS%b4#IQ3*Cc8uI*Y9x_VqJD9hX~R_2QZ2()$5Z-Mvi z_pJ@~P4~^omtCZq(cJB6E6c>of3R;GAQ>^Kr0k zp~Jz)@;nBA^N&6?>4fYh?7r;n9OnCzfBsI+=92F{@iseq5@-H9maQX9_xC)vJxwL4 z#@=yeE;bAtY?vSDxJbxYu#xwH{`$#q`#pdQn(6av{bhFgZzVtQCKff;d0jE&F(q`FCS}%rH_HJ> zA|00fO3Q-5dPpbFZ4u;Z6&YtPR)gu%HuHk&iU>L}jWlX{9hP}pJD>_*PPPDU@?Pod z{oUc+WWWVIkjUU>PA(2|uh@LMi3}nA$in(vr=!jlR z2J;`Rks&=+vL-)Rqk~$et82Z%G-qYZ=jU1jX|4*G&YxXNY0XQOj~S|gj~`{D1q~7R zpI_2km1h?}FBpmMUd@r`-~VY_nRfF_s;KdQZ!7=rwxc5bcRUHT<-FZ{a;(IF9{b(h z_fRnK_q|#|IlsGm2;o}}N7bKY_u>40`L^;2GrL1}eu!9De!L5-x0-^vU3Jfwm}0zL zb;Zw-iz~Y-zPFNxi@Ti_=6$iJ&7~J#9>va2U$@NO_RWWBo!#6u;Z-%80W{1nyYu4! zfuBA5-FO{jKiJ@05Fp|etzFAb&&vlbcC}Wsugw?ST%=}Sp9lt+)>|v6!jgy|`Ols3|r_ONI0<3Jh*s) zw^z_%H6WvSoFUl)-7^M!(j*+=KY!hua6)H-%~oh9$D_q%)Rzx@XP zUuQ88a7?eb-#G9;zkyl*e}IXzf#Gj}G5vpw|3-1RBy36!GT?;iksj?dZ#rMpMN$BZ zbj#}z)U0Do<&%_Gx<$J8fy)aD3o8iDL6_?Dc29LYF&1T4%bs7S-im#fMo{J|)CCk1 z1!~o)GZ6N5(OC~`^IRRx*b5kxdkvJDt;~ zwi)!FJG%5JhW7Q3jW}vFnFfzGgGM2k=Oe1{k9~%y;>;gFK42bKTxiYBZ&YK2R&b{g zsvyvv@D;)mVlGq=7%$4#42`M6jbtbk8fTye5e^t^0Y5aAAy(AmR85XyWg#vZX$QQ! z1(1FITgnyS@^4@N*&m`P7QMY86r(Jae0e6~;hw1vRiftMiF4hFk+om;;Dvl~9sEem z8WYDl@5&DD1n=G>6RR>7!Q*plZE>oaUy9_D8{Fd>#hT>%;)u$Lb*#E_EO_=<>bU|D zj8$i8?5Tb3jBAZBg`uOItUi;8JazwLY?eMCVvQV^Odua?z8tRHkt-8RWeR}Sp8aQLmcN@jp^-boLjwQ zt$ndQHT`l*=CtI6lN68%7BaOe**EB3z7mioQRx{_!!P$MqSh1 zy;rw^T*kf#7C4L7?ZZ};V~q$UrNuLOx|!dxh-}2XZpOgU3&}Yj-ggLVCr=_fZwsL> z%er48Wr`F7Gf*4x^!L>LI7;|@Pkh9r=wX6B&_RMgu?LS;h9tAbKerS!K`POYAeQ6< zjTB^=j@M|QqDOq=DL1sxzAvA)-N3NzK42gBzQB(Gy1jlr9(S~5^OnQTUpnjz~()@NuhtHW8z6`~wBEe`?f9qJDG?t9aI`zd3(zPw&DDZAj6+4>C z%s9qlU?J;}*M6w|`u7s+_Y&|A9@7-y@pp-a@4w^k(-8al#(&?%FRd-M%{*TqJ)1)% zVGrG(F7qpzqkaP!{=de)0yvIk$yUrPS!jV}F*7qWGlNHx#Y~oDF*BnrMvIx5nVFfH z>FfIaUGLSqZ(}E-XQHFKPIqQaXJut)m0Db#=UK=)BE6J4+J?j-MwMvD^pNvywt6W9+__EE8xMe zA{}`7$6;ebp9*c7OsABKpGQ;}L16A$q$|rLhdU5{z{)M?>zK8A`W>$vmJ}Ny$f=Qa z7~xt}jrT&Ns><5Bp!DBeVLUw6&+NDPSX_YMnbLL|z$03G>D?Nmw<>2dQ&S|w!r(qf}D^v6Na2@Pu55=WX(^q}OX5+Z6EnWi+ z$?5+fs<$e1Ov65Aer*>B%=_JUTiX_8Z<)KQ%CGRTXC-{5JAjbOV{uSfZ=F}ovNIT_ zb!$x0t<+SsyELHax!Jk_M57jH&?-~~qu2_kSo+QdKmKP&9Qsh{`ZS#);}m;cLx2RQ zwauy{^T&yg&Df~34Cn9(BrWTD8+5|Kc`K7nt_6TbD1Akg9Mkt23Ohro9faR_hrPTvXpZPt6`wM6KL>hcRj-IJX!y_Hkw}nnw>6OySBL zJbbY!l&Wu{SJ-Px6>z;V?+eR015S%&2StkfX`fjs3QszN3sq;UM-ZrZ{g2sGl6wjr znpbU~Z{=x@53ne%CsR|ma@oAxz}2WFc2Lyn$Y>h49R**=N>s&jTzSN_P}K3xqWhq> z7~#$gq7`14Y!utcew5zpY>b4q$*<}Ahm6~ZgTc{KwA!ijDVno*wVt^l^GXB0=tR4m zjXmK-F{BOwiQ_>4(ZCuoJt>SGN@vwOXsGCVeWL4IYXt%28fs4iV8FHW`?mq$W_oPe zk+8o&=?v&$&)^C=M}D%$0-c9G!6fv7TbG<&Ujv<&qroJBz#>%D+v7g$cqpo*1>k5J zTE+tpX^X6>Lqt$0X(b~UgYG@)@$!4A0$EgkKKo9>2(p>NWp|OdT}MBNWjF&9t}YRw z9=w+4vBPFTNn)8g+LJrD)P_aUzihNcL`xCdM$8v_6E12ZK>}HH50@Q!kCs{R4FyQy zp(<_zGd{+Kl1~v@97M$@-{ko_)BU@&ZR`PDclNiX(L9X*(U3F!UL&oksYob}{z3^h z+8DOf)IEpFI7#1#Q;tK=Sx)~rBsP!YvnFs|bqSG0Kvt_FgmWgqN@2+ASHpr{yVGkA zFgoATo$DLQB+HmU`PSebC2_IE?$E+DE7kJg3g|a`h=T>=_E=4we=zAV-*CJ1sO`PA zA9)JZy*sSBKkU^l9^$!$^nj+Z{b;43e(~U4Noltu{6qIgwVL;3$Wk=rU0>_ay-Iu& z>`Pm82qMn~Xk}r}vAr=M(6BSz*cSFwn3=c5@-|(8QzrfHu{CuTevw5A| z-1N5Ffv$wEe3?Ie1^@nx$ck0L^)isz*mdjshzJ~$qG`>2dBOX3dfFwI_SWu@3TcLB zQrhh|==P>nGmVS2T9%Y}Ey}G|yNDFsR7On;qsh$P;~h8O<)=!5Q{9Ksi)B452}{L3 z3sBo$%q>U1rIKjQ-t`l?K3t0Xtt#YtKss1vH7U)CA3n&-ZZ1%g?*}8Nt03hMC|f({ zsaC&?6eFRAN0WTqJl!r24GUagYB~vAg9_QjrMwW4l~BH9P%*Q9%YiU@q6C!ETopG& z3gbS?7#{^W4hejj4h&`P8BMZq3O4^tDTNS31zXBz3kgfvoK z*-Fz_jBH0WluI$P3@NmxIl*GeI(h%@T6--S41Qb4lhPXekvY`kxj@$= zCGI&e5l8{#5J5`(i0UOCk0o_T zNOw=bs7H@wGr5>vFMXRtl#5oHJPA)POQNpXWCK01Ymc8blR@Oa$B{k;JPtK9vt6WE zQ0+b`lP>}_VQgDG4cooGgHNC+I1dxIm8*UCvS>wh_RLJSE62}w&sUED&qnV$ZQ~!qW=Y)=Bt1G zVJOXzR{-tXB#oyMT6Q_I=N5u#TBgbet)q0?muP!QAx7}cG{G(+;#ZgBh6D*;V{3-oN^r(}Eq>sL%oA=01< zj0=}UOYQiCpGHY-FB}6po+B)dd)Ri7$Kk;45ZrVyjr;DuMT~KAm>qI;HN>GetDV* zpeSaU0!K;O&rg6CweAJ7k8fMY$-#{)TP|RNme~XzQ@B7+RP)nEjff3bY_M*MkA+=H zP;)p-CX3*vkkQMS$Itfe-9o5YjbDGuXj;-{ZR_EnVNr=^p1&?H=jlsMG>2fPC6C~v zS_mPM_kgz~wP9H>?`TeT!!w#!_`WP}*q|LEZeS-Dm}c33?i3r-;XuiMFTdFqE-f`s zgzLwpkf6a1K<&2GSQYPwCnyht4GII$Ah?T}BQj#3fhoOYC1+n2~>v@Vas|I!`!JU+1lesP} zV4&`ux z8?mFbcDjs(c~0Pb#0g(WPwOf7x)R`Pgia=9V~KB)0ejH& zkiduT?X2MnfuHs$#f+BiXnxDBtu+{DaZ3y~R-VcV&WqB9My9=yTZbW)kCJ3hRc0s= zN#k$^T&@~-Mrf*S28B+Ex3-RxVmkFQhL~BC0v)0iAIANwk7H~Ho`oGMRHrhv?Y9MCY;+$VQbhH!V4CQ2tpdn8Mw z7z*Mu-z(Vr10{7gSkjS$EZ~YwmEAbnA94_E_I_q{Wwg8egoLe@dQ1Z@WKDVSG)qDz%KA@; z*7~s=(h;!TOq2PT^{63jKrkdpBHP)AtY!3=R#!8VcVz^&Po9P2Y6?BJ&>DAx1!f1= z)`u#JcZ!d`qKA6iFqFh~t2u<&1dNvB;n0{OnXA(P6ik9nBFf!u4doJFC@SwMYOi8n z6xaUG)H8VAa3MJ)M;P`aKVmC>IDo|QS*=PKeB8md_f3W`Ib~h#m_nyoi8s1RH(z4F zMP0M2O+xm)ilLi%Y6Lb=D5nm1(<7-Icw(U8GRCG43zs-gEEpeG zOtSO>CI4~i(>nNxtpj+Xh1{Ziiq0C+>?1mRs&E3evdaB)vYWD3y+eU=o;cp{Jse%N zJ4G%FdhWyXw;4B3DRrgi7*cSpOgJqV72T|8Ag4o#9qEO8DKM-M#Dwcc(JQ&&8bxaq zJ^^^KSrgt6@3(}yNQS@`w54LjIyAwf(W8*&h|A=cMo$rK^bvkzQGQ*re(&}SSel2P z%K%3RbCzdCpttMHVJcLi9+Bwb(w}VQi5Vi{gVL9c z_Fd8|SnH+&1YBZ2t(df2R6bk~bF3UQ>X1vKT4KbxznaobC8E;K?dc`i-hlIh2ZuL_j&l>TUxc<$#sbnzKDVUk*F7%J zZQHw4Ey^b2j{__rR#W4R_O%#Ew~tGBE1S3VO;4Ee=B)A_z&fXPb<) z#v9)?cXoy@J@8L2?z~^uRh%pPn=3qNE26_MZQC{xo$prrswH0;Fs#pC+US5si_h$g zm<_IJUzUA*1P9xV`Z8LJAZCRebZ$H}66;IRbB(IrO7;1m=aN=^{HQAj%hG)l21u>1 z#z_6i56f74)3KE><-NJ0VQmUXefX%6IAxpo60K2JtDBfKF~D}oUPb3Vcq#SdVrt#! zJS$66+I!rw3L$;@V$6ewv%HrO?5iUi$$H2p_ay0Utdnqkz6Sov5D5yKG17)uJB#PD zIFzuJo7j=Cag%3a`z5fe9WbkSqFd6Y7(r`tVGH||>asB&JCBymj(9)xn9xs}H-A<6 zbN5;DIZt?Gdk5sM-;#y;?z!oKkA?2^VSey=4d(3NCc{z*mlfQI`-J^6VrHK_Z*qGr zwFGNKe|Kkipi~j$_TC}*yM8<4DEIj&ujYmu*RzX+=j8;e))f`x<2QE#1Q(_6Fqe0) ze~+8-ei)xpd<%RUgZyLQ^Y;o_hbU@`*UoT9kpr8gM+OZKdDbi=g z{gbG55KFB(I(}7}B}oIVM9-h>s;E8pS@Rj-Xm!0Y)9>s5ebCGn7yGQ#T) zAR`-A+Uc2au7B;!Rr7UZ0lDD^8lZrh81`K*DVG2T)k%Zl=se|N9f4ab6jVQdCZMl? z8qUG1vMk{lskcw|`qf-K}qLK~Q=05aH(#?E00m1oeLfG(5@{=pK>t~rq_ zYhe&6%pzj1Ah&vnQ1C^I-vd@M?ZkS0%=}cCHK3+SET@7<%RN3<*ml5QRM6cb$ClW$)+XIvpDbF51-FZfhcJ*(> zHN>q4qjLvM8TuMYwYW%$J57aTdc2>ak)PW~d6QD4Ar%U56e1*}+jHWC6cDq0+?MFj zLA}!hHlqm-P!BR=r6_~)3&}GxWb-wo#xR)0L-mrPk+^7PW77j|qecClZ=BR6_9H}6 z@l+LgzuIo8vXk%guXNjyUBN252kE?`v@3Qj{o<>>Ll)H?s|!T?kbu%-$9!E$)Vm=P z=_G5Q&4HwXs`j>}5@!8!kwKokVx``>QiD$jo&(<+-Igp^ z*B=U$-N7#)r-(itwh)ooWxUj95H%4&AJk`TZ+08)#VYJ6*7nP>0WyPjME&(KSh^;V zY7{hjZ6w$?ublR|=cf49@Fw49bL5W~y_$A|+rtX5V7jw2a5?R=&k8}jM- z#Pu-8e3HUO2mDZlMIo_1p zv&GzjbUnv*MICll8_FI`V zM2!qmMl;0Huf?2(=N2yP(C<=o9wN-I^JO$QYI^=c&w7~QYY!-v7ET&@UCA(=vb=;s z`o;*wjk9`ahh_pZBI8Qn2d%UiTYDl578*akcMJYh(6nayfIcuRO0YQXh#v? zb>F~Onv6tYhQ~%>=y<)RK`)Mxu5Xv9EN2s~BR%ES8kZn;G+ld{vR$V*%eh7e*YY7G zPuF&vEgKgsemWuQmS_2%xckeF>|#@4@SkHUt+)?<83$joTwQISMtxjEi!V7+h><9q zExFZ@7M?JeXo@A!&S%_UA`jjJlbZ}s#Btk(PFD$Ll8=x^?@qi*$?x9E9wE-oN8Zv# zo#e_xzPp>3!#JNL8f}(?7gTo5sv{C1f)8ur!cbQ3#EKLfS^Zi6zSExQX*Kg-+_S$!W>t zYCaFEcK9~&n&Ag~ty%Q;63fbM;&yH*4{h(lIAC?NRF`8)w1<=zlUe;qdij}Ils!>=F*M|R=g3Q% zjg0gqD#T@(1S_khu{MQQnuEM0>C6IOy@lPut9qW#&mVMSSrDcR`_^=L4xEpn5ys1} z#H&eGb4a!g!ZJ>M!!y8r)YP_;0dCo}_2(k6%Ev#=o8W2L9OE~p63TkwGgxdOK|i>1 zdh8a=^W9Hr-$VOE>`qyExDaAEeY#NpC6rMY;=PL$EEYiA6nfHjQ&C~#ADlP9k4ZdI zhSZ8A&mr~GArYH%^oJ8KVMXw!E;^rW*)@W|!iN@IZFAswbpTW=b?bQU@>#EA$R`-ip3K|L{ z*KF-MuOuvqaM2;ZQw92@n zM94-xf}hq!me@F1g3Or675X}Ex4+fLb^c)ZBF^M}9Z2*;kMas)-1zKaY$hI@@mdfn zU*>7^^0Fm;`A0&)6Irqk-$?^rSG+~aMFZZ%RBQKu`H3G@HE6d5VQ1VLDT6k&hcJ>} zxhwJAYQ-rQA~9<)Sw)C${&C<3esS{w;*SnfMXfC^FSmKTtvOo<8ER(fQY!3Fo%iJj zcH$e=wW-y3Cx^do7uz|~aeq;B!d;sn3=0aY(Rbu{POyLU4TI|cWI!xIh!ni2Q1$C; z61rk)n`L8hVRkOK29Z%iKv(;MyU5ickFaC!9DqWuf#8h)7uB@P*o2Og0>OHSp~f&a z8}JMW89D}SOzl(4>KbCH2fCXn&99Nb zU?P{|M_aX_Up~e7MUP44IbdxbRR1FmQV%_D z0ufyeOgT(0NvPrKZlWQ_Tlz84RG|onBBjzMF}XZJ<{A-_Rzf9sIZB-5D;DGCu%<{AAu)H z3AC*p!omXiR0=_jwjY>W1Y+ceq;roRMTG6N$B!8*esd^77zB<>1ECbqUeQW)3Lgvd zN_B6%X1K_zjJS=Jwvj2lo1DFUn^^L9PVKr`o^f@F#thCHf&<@gZz%cG3ninfj2nf5*I<&WF0%d#Do zs+^?Ar?=ODfB94D2MH7*ksGdR zzi4x4iDXDF$;F{(hw4(RQpf4%Q2@a2?eU5&qHPIO2o8w>M>zI1>s6qQ7>= zZ@8uk7hn$MSMtj6hPC}xhuO5lc?L8fm20?Fmx5YqzOUCs#BCWUs?#1A@pIGMl9!13 zROl0j1#}}XY^7zLC7NJ${@i*3>1t`arw{5lbX6FbwKkHg{A^hhFm-Eo(Slzr(j@|O zyL5=9#O8TNs&!a(lKBl zWQr!c4Sr*|=dt~UYN7@k*M^@mv(053;&mN$_gHBMFzDTi8_cbGr^_T9^P@cD#)79h#uuB3~7ig<=ce|G|jI30iPwwr^v%p?&rZl=N~N| zL7WSG2nM>=HVB*hd=h9UtZ+QyPc)r+5VzPnj;MIV$9^|h#rud5{v~kB0b(5_cxN4- zV%dD=NbiYc7a-iM(KLNR7)_4eGB@q&h`=xA&<-k?%M0_QOg@8dyV&ZCnZ|*%3jUfH z&@Z<$f4pHAFhkR9H*UKS{~=}N4rlP9R9h3%W-V60T+#x+n9*x zLvk$wJe@>&o!au@TQm}GK6N4xm8B=1d8$Q8J+zOQ3)%ib;cF{|gO`0C8=isL9#x=A z(WIzxEMLLuwutY-YK)#sg$1rvf99gS!9`R6BM5_JS7r*X4S}YcUp#2^DYvl z=z>bR!>@FQ>xr)hXY_j262Vv8S-v~w?ucmrHgWatVk>qDlk6u6nE)~6Aa)K6 zu4G60o29OLEX!b*k-9!&ZDV1ZAtD-_%{!H${Ob?g;k2H8)1ww7jx(Fq7cw)3c2Qk{h zc=KodekH7%a}8djoDF^C)hEz4eT+T;J}O>5+V?nGX8>{lz8GY6O2JO%fde@d{DjHu zG-z^P`3W7E>xh6b?-kMC*B|Qs;WI%*(a+g6q(- zG#4wyXZ>uzAe}@#{*+3o+If)^<8qdVeVhTMwXf;2}3nM;FH%$7Tw!ivcD3g826t z^iOe~N1?Yc2LC^YF@C51I7I$M=7Hv?3rK8EtNIW%RuwD2FNZOMffYNk%d*TC7g#;{JTK(2p&>Q~SG;j+m#Yp6rnM z7ltrk3q@~;di&MBM=z3~q2+pFX!a#v%ztg{Y4pe>Nm8Hn z5d-BD9XhYzDQcN$ymT@$8Gb@OGNPT~;$&b@T!<>OoXlyBH4QZinVtmLJT|zxE%L~h z*06Xqt)d~`zScFE&Dz??YjIa@Z{*Z9mJFF!s>J+Q)9UaFA6BivZuAyK3X*alvk6KH z^K(!$F2a&@?5mYyXV!@FF7lw1KQ_s)9nXD*{x7Wq{bo=3)Ha$ z?PzKK`aW%J<>GytR}eS?Z0){US#lH7)6fwT04xoyzPwdz<|cHoH=<@Eufkjz{$84j20%)rbgzq zoQX>HM8fn#VOeABJ2y!0FVCTxT3eQvs0Dv=Z+_(9RUulXi(WTrI_}9OlpWW$=wCh_ zM)-!y$?IQ}B2WYOj7c%k!=|l>EfwN}fWy092iJUgnQl0DSDz8X0=Z1E9V*U|hr89p zxQI{sB%9?_!svWDJn3opl$Gf3d_*5_q9FgBNGr= z^mvGuK?vxNZ#-G0%(BV~Xwez{AL82%j)|2srWqG{*_;e7ziI5NbfD_hqm_ICVH3-u z?f-Uu`Kc=KJoN_kCxR#D?kSd#V>w83>-Nvu2h(u!`AN7(JB|PgNo=(sC+4 z!7(n#oLM?#Grhe=%CAwel{U&e73Ni8A7^5ppy>zVLIeFSzf_J_!ir?8)s>}VT+pC* zxU1vQH{p~q&mVVAeivdLm6(|C5BQYw;z=JQk6M-j1xt*Oczt?Bp&S(k;h4mx)mv^+ zRPjTIdnO>49i+3Rb9nZBUaTLFEOW#EMfTr0IsYwt$N!g|logDD3oXFkNTUnlBr&C{ zgLWRmWrn4jDu`MR4qQxe?1%0{w%z0Xv12#3&30my6UvS9GiO0@u(?*!Zv85!SGsEPAUbyC|vdk69bFGv)B2&r>f$|R?ybZ z5Bg)lw>sKXjZcW7NiA?bYziOQCEE;Maz(!u8o&pR#`t!+HJfT`*h=E)(5QK}wR9$w zKI8uVS$u+rNvQw7i2gf%^6#S0f(0T43o^n}8-U{Na+LSHiJnv~Uq)2JN3RHn0{*+# zBNm%iRgLHU6j<6})mT1ax_l7XBn95h#L%2We2)4>MRLcLlBn)5V+?FZZWE9=EhV!< zB6KmWjvF0A%=$?hGv^@+Re#VWV80c(l!R0JvpXR~aad+)`bfB&3#eh#YP@IKm*jk? zHq-BUtrez)m2C)Fo|`J+ZbvK@wOg*z4dDKQ5wyAiq<@z@yZDTW@9od-1Nkq83Qa*P zOZzvIsQZ^CwbTA9Tr{jKDbq=Z)GV<@UAPR9k7POlUItE7=V?O{r2M*-6n|w-#fGBF z=O70TRZxf>Wd6jmd7EV1k8gDv0x*`Y@d{jM^d7#81+2xER++)n`i6K(OZ5Qf^-_<6DvVsMIJ#?ZrWzxajIsp;cWg;6&>iFzt*Aa;}+704bJn7 zzSgP?)_m1+LZJY;VNet)vP{`z@0yu5Gxo*nC7 zP2Vb?dgZGE!h4kW)n5OgEMoj4%5P)+9_9TqfIlcuJpWS1`$Ylo5#Hya|3T>I{m1+G z?V7$vd7lLN2PIngA5ngr-}fl*-|hWD0apAsY5q|k?_W&)LGV}l$NTvGn(F<1ypKWu zL0MP(N0i?d^*zda7yl1RpW(kr^G>V(?5_Sn-~s&2d3}HB_iovrh7m@;FZ~~!wD&mg zJ&8X!L?-VQ@sEDRd%*X@^B+Khum20+pTYV);QK-E4 状态:产品决策已确认,前端静态闭环实施中 > 创建日期:2026-07-28 > 适用范围:`apps/client-web`、`apps/admin-web`、`baiyue-firstleg` -> 主体模型:本设计按“平台—客户”两级执行。现有 `tenant_id > 0` / `tenantId` 当前表示客户 ID,是客户隔离兼容字段;`tenant_id=0` 是平台技术作用域。历史命名继续兼容,不在一期引入真实租户层。 +> 主体模型:本设计按“平台—客户”两级执行。现有 `tenant_id > 0` / `tenantId` 当前表示客户 ID,是客户隔离兼容字段;`tenant_id=0` 是平台技术作用域。历史命名继续兼容,不在订单与客户引入真实租户层。 ## 一、目标 -一期形成可验收的最小订单闭环: +订单与客户形成可验收的最小订单闭环: 1. 企业注册成功后可直接登录,不经过注册审核。 2. 企业提交资料,由平台人员人工点击审核通过;只有审核通过的企业才可提交头程订单。 @@ -21,20 +21,20 @@ ## 原型依据与迁移原则 -一期原型统一以 `docs/悦/` 为依据。快递公司、往来单位的直接参考页面位于 `docs/悦/货代SAAS平台后台/货代SaaS平台原型.html` 的“通用”菜单: +订单与客户原型统一以 `docs/悦/` 为依据。快递公司、往来单位的直接参考页面位于 `docs/悦/货代SAAS平台后台/货代SaaS平台原型.html` 的“通用”菜单: -| 原型页面 | 已有内容 | 一期迁移说明 | +| 原型页面 | 已有内容 | 订单与客户迁移说明 | |---|---|---| -| 快递公司 | 公司名称、编码、官网、客服电话、合作状态;名称/编码和状态筛选;新增、导入、导出、编辑入口 | 保留核心字段与列表方向;状态统一映射为 `ACTIVE` / `INACTIVE`;一期实现标准模板导入,不实现导出 | -| 往来单位 | 单位名称、类型、联系人、电话、启停状态;名称、类型和状态筛选;新增、导入、导出、编辑、详情入口 | 补充稳定编码、邮箱和完整地址;类型与一期订单的发货方/收货方角色统一;一期实现标准模板导入,不实现导出 | +| 快递公司 | 公司名称、编码、官网、客服电话、合作状态;名称/编码和状态筛选;新增、导入、导出、编辑入口 | 保留核心字段与列表方向;状态统一映射为 `ACTIVE` / `INACTIVE`;订单与客户实现标准模板导入,不实现导出 | +| 往来单位 | 单位名称、类型、联系人、电话、启停状态;名称、类型和状态筛选;新增、导入、导出、编辑、详情入口 | 补充稳定编码、邮箱和完整地址;类型与客户订单的发货方/收货方角色统一;订单与客户实现标准模板导入,不实现导出 | 现有 HTML 原型已完成菜单、静态列表、演示数据和表格渲染,但多数按钮没有完整的数据提交、校验、失败反馈和持久化流程。因此迁移到 `apps/admin-web`、`apps/client-web` 时,必须按当前项目的 Vue、Pinia、RBAC、响应式和测试约定重新实现,不能把原型存在等同于当前工程已经完成。 -原型负责提供信息架构、字段和视觉参考;一期范围、数据隔离、权限和历史快照规则以本设计及开发进度表为准。原型中的 FBA、海外仓、库位、货架、托盘、船期价格和完整 WMS 菜单不因复用同一页面而进入一期。 +原型负责提供信息架构、字段和视觉参考;订单与客户范围、数据隔离、权限和历史快照规则以本设计及开发进度表为准。原型中的 FBA、海外仓、库位、货架、托盘、船期价格和完整 WMS 菜单不因复用同一页面而进入订单与客户。 -## 二、一期边界 +## 二、订单与客户边界 -### 纳入一期 +### 纳入订单与客户 - 客户端:订单列表、组合筛选、创建、编辑草稿、提交、详情、取消。 - 管理后台:企业资料审核通过、订单列表、详情、待审核订单人工修改、受理、负责人分配和状态更新。 @@ -43,9 +43,9 @@ - 平台收货仓:后台维护国内收货仓档案和启停状态;客户端新建订单只选择已启用仓库。 - 快递公司:后台人员统一维护快递公司档案和启停状态;企业客户端不维护,订单详情只读展示履约快递信息。 - 往来单位:后台人员维护发货单位、收货单位、供应商和服务商;企业客户端只读选择当前可用的发货方和收货方。 -- 货物信息:一期至少支持一条货物明细,并允许同一订单包含多条明细。 +- 货物信息:订单与客户至少支持一条货物明细,并允许同一订单包含多条明细。 -### 暂不纳入一期 +### 暂不纳入订单与客户 - 在线询价、自动报价和费率计算。 - 应收应付、对账、结算和利润核算。 @@ -54,9 +54,9 @@ - Excel 批量下单、快速下单和复制订单。 - 客户端批量取消或批量修改。 - FBA/海外目的仓、库存、库位、货架及入出库等 WMS 作业。 -- 将旧架构文档中的 11 个微服务直接作为一期落地方案。 +- 将旧架构文档中的 11 个微服务直接作为订单与客户落地方案。 -原型中的 FBA 批量下单、渠道、商检、退税和复杂货物属性作为后续扩展依据,不进入一期最小闭环的必填字段。 +原型中的 FBA 批量下单、渠道、商检、退税和复杂货物属性作为后续扩展依据,不进入订单与客户最小闭环的必填字段。 ## 三、参与者与数据边界 @@ -71,15 +71,15 @@ 服务端必须从已验证身份中取得客户归属上下文。客户端传入的 `tenantId`、`customerId` 或查询参数不能单独作为授权依据;其中 `tenantId` 是客户 ID 的兼容参数名。 -企业客户端菜单和操作权限由企业管理员为本企业角色分配。一个成员可拥有多个角色,权限取角色权限并集;一期不引入部门或组织架构,成员直接归属企业。企业管理员不能配置平台后台菜单,也不能跨企业授权。 +企业客户端菜单和操作权限由企业管理员为本企业角色分配。一个成员可拥有多个角色,权限取角色权限并集;订单与客户不引入部门或组织架构,成员直接归属企业。企业管理员不能配置平台后台菜单,也不能跨企业授权。 客户读取、更新、提交和取消订单时,服务端必须同时匹配订单 ID、当前客户 ID(兼容字段 `tenant_id`)和删除标记;不允许先按全局 ID 查出订单后再仅依赖前端隐藏。 -平台国内收货仓由后台统一维护,企业客户只读选择。停用仓库不得用于新建或重新提交订单,但不能破坏历史订单已经保存的仓库名称;一期首批覆盖义乌、深圳、青岛、上海、宁波和厦门,不将其与 FBA/海外目的仓混为同一模型。 +平台国内收货仓由后台统一维护,企业客户只读选择。停用仓库不得用于新建或重新提交订单,但不能破坏历史订单已经保存的仓库名称;订单与客户首批覆盖义乌、深圳、青岛、上海、宁波和厦门,不将其与 FBA/海外目的仓混为同一模型。 快递公司和往来单位均由当前平台后台人员维护。企业客户端不提供对应的新增、编辑、启停菜单和写接口:快递公司只通过订单详情展示,往来单位只用于下单时只读查询和选择。服务端必须按后台人员权限和数据范围校验写操作,并按当前企业可见范围过滤客户端往来单位查询,不能依赖前端隐藏按钮实现边界。 -## 四、一期订单状态 +## 四、客户订单状态 ### 已确认的统一状态 @@ -90,10 +90,10 @@ | `ACCEPTED` | 已受理 | 平台审核通过并进入履约准备 | | `BOOKED` | 已订舱 | 已完成舱位或对应运输资源确认 | | `IN_TRANSIT` | 运输中 | 货物已进入运输过程 | -| `COMPLETED` | 已完成 | 一期订单履约结束 | +| `COMPLETED` | 已完成 | 客户订单履约结束 | | `CANCELLED` | 已取消 | 客户或平台按规则取消 | -该方案与当前管理后台实现最接近。两个前端应用内 `shared/` 现有“处理中”以及旧架构文档中的“已确认、已报关、到港待提”不作为一期并存状态;产品确认后分别迁移。 +该方案与当前管理后台实现最接近。两个前端应用内 `shared/` 现有“处理中”以及旧架构文档中的“已确认、已报关、到港待提”不作为订单与客户并存状态;产品确认后分别迁移。 ### 允许的状态转换 @@ -106,12 +106,12 @@ - 草稿可由客户编辑、提交或取消。 - 待审核订单允许获授权的后台人员人工修改;平台无法直接确认的信息由平台联系客户修改。客户和后台修改后订单仍保持待审核,修改前后值、操作者和时间必须写入审计记录。 -- 已受理后取消可能已经产生成本,一期默认仅平台可执行;客户只能联系平台处理。 +- 已受理后取消可能已经产生成本,订单与客户默认仅平台可执行;客户只能联系平台处理。 - 已订舱、运输中和已完成不允许客户取消。 - 已取消和已完成为终态,不允许直接恢复。 - 所有状态变更必须校验当前状态,不能由前端提交任意目标状态。 -## 五、一期数据模型 +## 五、订单与客户数据模型 ### 企业资料审核状态 @@ -134,7 +134,7 @@ | `consigneeSnapshot` | 私人仓时提交必填 | 仅目的仓类型为 `PRIVATE` 时保存私人收件地址快照;FBA 仓、海外仓使用所选公共仓主数据,不重复填写收件资料 | | `deliveryInfo` | 平台维护 | 可选履约信息,包含快递公司 ID/快照和快递单号;企业客户端只读 | | `transportMode` | 提交必填 | FCL、LCL、AIR、ROAD | -| `businessType` | 提交必填 | 一期支持 EXPORT、IMPORT | +| `businessType` | 提交必填 | 订单与客户支持 EXPORT、IMPORT | | `origin` | 提交必填 | 起运地或起运港 | | `destination` | 提交必填 | 目的地或目的港 | | `expectedDepartureDate` | 可选 | 客户期望出发日期,不等同于平台确认 ETD | @@ -147,7 +147,7 @@ | `version` | 服务端维护 | 乐观锁版本,防止覆盖并发修改 | | `createdBy`、`createdAt`、`updatedAt` | 服务端维护 | 审计信息 | -订单金额不由客户创建接口提交。一期若后台继续展示金额,应标记为平台估算字段,并在报价/结算范围确认后单独设计。 +订单金额不由客户创建接口提交。订单与客户若后台继续展示金额,应标记为平台估算字段,并在报价/结算范围确认后单独设计。 ### 平台收货仓 @@ -176,7 +176,7 @@ | `status` | `ACTIVE` 或 `INACTIVE` | | `remark`、`updatedAt` | 后台说明和更新时间 | -快递公司只能由获授权的后台人员维护。停用后不得新增到订单履约信息,但历史订单继续展示保存的快递公司名称和编码。企业客户端不直接查询快递公司主数据,只通过订单详情响应读取后台已保存的履约信息。一期不接快递轨迹订阅和自动回传;一个订单只支持一组快递公司与快递单号,多包裹和多段运输后续扩展。 +快递公司只能由获授权的后台人员维护。停用后不得新增到订单履约信息,但历史订单继续展示保存的快递公司名称和编码。企业客户端不直接查询快递公司主数据,只通过订单详情响应读取后台已保存的履约信息。订单与客户不接快递轨迹订阅和自动回传;一个订单只支持一组快递公司与快递单号,多包裹和多段运输后续扩展。 ### 往来单位 @@ -185,7 +185,7 @@ | `id` | 服务端稳定 ID | | `code` | 所属数据范围内唯一编码 | | `name` | 单位名称 | -| `types` | 可多选的稳定单位类型集合;一期覆盖供应商、客户、承运商、报关行、发货单位和收货单位 | +| `types` | 可多选的稳定单位类型集合;订单与客户覆盖供应商、客户、承运商、报关行、发货单位和收货单位 | | `contactName`、`contactPhone`、`email` | 主要联系人信息 | | `country`、`province`、`city`、`postalCode`、`address` | 主要地址信息 | | `status` | `ACTIVE` 或 `INACTIVE` | @@ -196,9 +196,9 @@ ### 基础资料批量导入 -一期确认支持后台批量导入快递公司和往来单位,企业客户端不提供导入入口。平台提供版本化的 `.xlsx` 标准模板;后台人员上传后,服务端先完成整批校验,存在任一错误时不写入业务表,并返回包含行号、字段和原因的错误报告。 +订单与客户确认支持后台批量导入快递公司和往来单位,企业客户端不提供导入入口。平台提供版本化的 `.xlsx` 标准模板;后台人员上传后,服务端先完成整批校验,存在任一错误时不写入业务表,并返回包含行号、字段和原因的错误报告。 -导入至少校验必填字段、稳定编码、名称、单位类型、联系方式、地址、数据范围和启停值;同一文件内重复、与现有档案重复或越过操作人数据范围的记录必须拒绝,不得静默覆盖已有档案。一期批量导入只新增,不更新或覆盖已有档案;任一记录失败时整批不写入。每次导入记录操作人、原始文件名、总行数、成功/失败数量、失败原因摘要和服务端时间。文件大小和最大行数使用服务端可配置上限;快递公司和往来单位导出不纳入一期。 +导入至少校验必填字段、稳定编码、名称、单位类型、联系方式、地址、数据范围和启停值;同一文件内重复、与现有档案重复或越过操作人数据范围的记录必须拒绝,不得静默覆盖已有档案。订单与客户批量导入只新增,不更新或覆盖已有档案;任一记录失败时整批不写入。每次导入记录操作人、原始文件名、总行数、成功/失败数量、失败原因摘要和服务端时间。文件大小和最大行数使用服务端可配置上限;快递公司和往来单位导出不纳入订单与客户。 ### 货物明细 @@ -268,7 +268,7 @@ | `POST` | `/api/v1/admin/first-leg-orders/{id}/cancel` | `first-leg:status` | 平台取消,原因必填 | | `GET` | `/api/v1/admin/company-verifications` | `company:verification:list` | 查询企业资料审核状态和待审核企业 | | `GET` | `/api/v1/admin/company-verifications/{companyId}` | `company:verification:list` | 查看企业资料与资质详情 | -| `POST` | `/api/v1/admin/company-verifications/{companyId}/approve` | `company:verification:approve` | 人工点击审核通过并开通下单资格;一期无驳回动作 | +| `POST` | `/api/v1/admin/company-verifications/{companyId}/approve` | `company:verification:approve` | 人工点击审核通过并开通下单资格;订单与客户无驳回动作 | | `GET` | `/api/v1/admin/platform-receiving-warehouses` | `warehouse:list` | 分页查询全部平台收货仓 | | `POST` | `/api/v1/admin/platform-receiving-warehouses` | `warehouse:write` | 新增平台收货仓 | | `PUT` | `/api/v1/admin/platform-receiving-warehouses/{id}` | `warehouse:write` | 编辑平台收货仓 | @@ -285,7 +285,7 @@ | `POST` | `/api/v1/admin/counterparties/import` | `counterparty:import` | 在授权数据范围内使用标准模板批量导入往来单位 | | `PUT` | `/api/v1/admin/first-leg-orders/{id}/delivery-info` | `first-leg:update` | 后台维护快递公司和快递单号 | -一期不使用通用的“传任意目标状态”接口替代状态动作。服务端根据当前状态、动作、操作者和权限决定目标状态。 +订单与客户不使用通用的“传任意目标状态”接口替代状态动作。服务端根据当前状态、动作、操作者和权限决定目标状态。 ### 请求一致性 @@ -321,7 +321,7 @@ ### 管理后台 -新增企业资料审核、平台收货仓、快递公司和往来单位管理。企业资料审核只有“审核通过”,资料不正确时由平台联系客户修改;基础资料页面支持列表筛选、新增、编辑和启停,并由 RBAC 与数据范围控制。快递公司、往来单位页面沿用 `docs/悦` 原型的信息层级和主要字段,但使用当前后台视觉体系和交互组件重新实现;一期实现标准模板下载、文件上传、校验结果和错误报告,不提供导出入口。保留当前订单列表和详情方向,将自由状态下拉改为服务端返回的可用动作;补充待审核订单人工修改、受理、分配、订舱、发运、完成、取消和履约快递信息维护动作,不提供驳回入口。 +新增企业资料审核、平台收货仓、快递公司和往来单位管理。企业资料审核只有“审核通过”,资料不正确时由平台联系客户修改;基础资料页面支持列表筛选、新增、编辑和启停,并由 RBAC 与数据范围控制。快递公司、往来单位页面沿用 `docs/悦` 原型的信息层级和主要字段,但使用当前后台视觉体系和交互组件重新实现;订单与客户实现标准模板下载、文件上传、校验结果和错误报告,不提供导出入口。保留当前订单列表和详情方向,将自由状态下拉改为服务端返回的可用动作;补充待审核订单人工修改、受理、分配、订舱、发运、完成、取消和履约快递信息维护动作,不提供驳回入口。 ## 八、测试与验收 @@ -359,20 +359,20 @@ 以下决策于 2026-07-28 至 2026-07-29 确认: -1. 采用“草稿、待审核、已受理、已订舱、运输中、已完成、已取消”七个一期状态,不设置“已驳回”。 +1. 采用“草稿、待审核、已受理、已订舱、运输中、已完成、已取消”七个订单与客户状态,不设置“已驳回”。 2. 待审核订单无驳回操作;信息有误时由后台人工修改,或由平台联系客户修改,订单保持待审核并完整记录修改审计。 -3. 已受理后客户不能直接取消,一期由客户联系平台并由平台执行取消。 +3. 已受理后客户不能直接取消,订单与客户由客户联系平台并由平台执行取消。 4. 保留平台代客户创建订单的能力。 -5. 一期使用本设计的精简必填字段;FBA 批量下单、渠道、商检和退税后续扩展。 +5. 订单与客户使用本设计的精简必填字段;FBA 批量下单、渠道、商检和退税后续扩展。 6. 快递公司和往来单位均由当前平台后台人员维护;企业客户端不提供维护入口和写接口,仅按权限只读使用。 -7. 一期包含快递公司、往来单位标准模板批量导入,不包含对应导出功能。 -8. 一期客户端包含我的信息和公司信息,范围以 `docs/悦/头程下单/柏悦客户端.html` 原型为基准并接入真实权限与接口。 +7. 订单与客户包含快递公司、往来单位标准模板批量导入,不包含对应导出功能。 +8. 订单与客户客户端包含我的信息和公司信息,范围以 `docs/悦/头程下单/柏悦客户端.html` 原型为基准并接入真实权限与接口。 9. 企业注册不需要审核,注册成功即可登录;提交订单前必须提交企业资料并由平台人工点击审核通过。 -10. 一期支持一个用户拥有多个角色,权限取角色权限并集。 -11. 往来单位按所属业务主体隔离并支持一个单位拥有多个稳定编码类型;一期类型覆盖供应商、客户、承运商、报关行、发货单位和收货单位。 -12. 一个订单一期只支持一组快递公司和快递单号。 -13. 快递公司、往来单位批量导入一期只新增,不更新或覆盖已有档案;重复或任一行错误时整批失败。 +10. 订单与客户支持一个用户拥有多个角色,权限取角色权限并集。 +11. 往来单位按所属业务主体隔离并支持一个单位拥有多个稳定编码类型;订单与客户类型覆盖供应商、客户、承运商、报关行、发货单位和收货单位。 +12. 一个订单订单与客户只支持一组快递公司和快递单号。 +13. 快递公司、往来单位批量导入订单与客户只新增,不更新或覆盖已有档案;重复或任一行错误时整批失败。 14. “我的信息”中的用户名只读,不允许修改。 -15. 企业客户端菜单和操作权限由企业管理员为本企业角色分配,一期不做部门/组织架构。 -16. 企业注册一期不接短信或邮箱验证码,只做基础字段、密码和账号重复校验。 -17. 一期仅支持中文账号密码登录,不做多语言、微信和企业微信登录。 +15. 企业客户端菜单和操作权限由企业管理员为本企业角色分配,订单与客户不做部门/组织架构。 +16. 企业注册订单与客户不接短信或邮箱验证码,只做基础字段、密码和账号重复校验。 +17. 订单与客户仅支持中文账号密码登录,不做多语言、微信和企业微信登录。 diff --git a/一期/一期开发进度表.md b/订单与客户/订单与客户开发进度表.md similarity index 87% rename from 一期/一期开发进度表.md rename to 订单与客户/订单与客户开发进度表.md index 54454e0..e594838 100644 --- a/一期/一期开发进度表.md +++ b/订单与客户/订单与客户开发进度表.md @@ -1,37 +1,37 @@ -# 虫虫出海一期开发进度表 +# 虫虫出海订单与客户开发进度表 > 创建日期:2026-07-27 > 更新日期:2026-08-03 -> 当前阶段:一期功能基本完成,进入测试环境部署、业务样本补齐和验收收口。双端核心页面已接真实 API;后端 19 个 Reactor 模块、169 项测试及本地真实接口回归已通过。2026-08-03 最新门禁中,Client 99 项测试和双端生产构建通过,Admin 129 项测试中 122 项通过、7 项失败,需先修正企业审核标识映射及其余页面断言后再做最终验收 -> 总体状态:收口中(暂不标记一期完成) +> 当前阶段:订单与客户功能基本完成,进入测试环境部署、业务样本补齐和验收收口。双端核心页面已接真实 API;后端 19 个 Reactor 模块、169 项测试及本地真实接口回归已通过。2026-08-03 最新门禁中,Client 99 项测试和双端生产构建通过,Admin 129 项测试中 122 项通过、7 项失败,需先修正企业审核标识映射及其余页面断言后再做最终验收 +> 总体状态:收口中(暂不标记订单与客户完成) > 主体模型:当前只实现“平台—客户”两级;`tenant_id > 0` 是客户 ID 兼容字段,`tenant_id=0` 是平台技术作用域。进度项中的历史 `tenant` 命名不得解释为真实租户层。 -头程订单一期闭环范围与接口草案见 `一期头程订单闭环设计.md`。 +头程订单订单与客户闭环范围与接口草案见 `订单与客户头程订单闭环设计.md`。 ## 原型依据与进度口径 -- 一期产品原型统一以 `docs/悦/` 为依据;企业登录、注册页面分别来源于 `docs/悦/合并/login.html`、`docs/悦/合并/register.html`,快递公司、往来单位页面来源为 `docs/悦/货代SAAS平台后台/货代SaaS平台原型.html`。 +- 订单与客户产品原型统一以 `docs/悦/` 为依据;企业登录、注册页面分别来源于 `docs/悦/合并/login.html`、`docs/悦/合并/register.html`,快递公司、往来单位页面来源为 `docs/悦/货代SAAS平台后台/货代SaaS平台原型.html`。 - 登录原型包含邮箱/手机号、密码、记住我、忘记密码提示和其他登录方式占位;注册原型包含企业名称、联系人、邮箱、手机号、8–20 位密码及服务协议/隐私政策确认。 -- 一期只做中文账号密码登录和基础企业注册闭环,不接短信/邮箱验证码、微信/企业微信登录及多语言;独立找回密码和工作台也不纳入一期。 +- 订单与客户只做中文账号密码登录和基础企业注册闭环,不接短信/邮箱验证码、微信/企业微信登录及多语言;独立找回密码和工作台也不纳入订单与客户。 - 原型已经包含“通用 → 快递公司 / 往来单位”菜单、列表、筛选、状态、操作按钮和演示数据,可作为字段、布局和交互方向参考。 - 原型中的新增、编辑、详情、查询、导入和导出多数仅有静态入口或表格渲染,不等同于 `apps/admin-web`、`apps/client-web` 已完成开发。 - 进度表将“原型核对”和“Vue 工程实现”分开统计:原型核对可标记完成,未进入当前 Vue 应用的页面、状态管理、权限和测试仍按待开始或 0% 记录。 -- Client 静态页面完成度与接口联调完成度分开统计:当前一期客户端路由均已落到正式页面,无在用占位页,静态页面完成度为 100%;各任务百分比继续反映真实接口、数据和验收进度。 -- 一期权限与业务边界以本目录文档为准;旧原型中的租户角色、FBA、海外仓和 WMS 菜单不自动纳入一期。 +- Client 静态页面完成度与接口联调完成度分开统计:当前订单与客户客户端路由均已落到正式页面,无在用占位页,静态页面完成度为 100%;各任务百分比继续反映真实接口、数据和验收进度。 +- 订单与客户权限与业务边界以本目录文档为准;旧原型中的租户角色、FBA、海外仓和 WMS 菜单不自动纳入订单与客户。 -## 一、一期目标 +## 一、订单与客户目标 -一期完成两个端的基础业务闭环: +订单与客户完成两个端的基础业务闭环: -- 平台后台:内部账号登录、客户与企业资料审核、内部用户、角色、权限和头程订单管理;工作台不作为一期交付项。 +- 平台后台:内部账号登录、客户与企业资料审核、内部用户、角色、权限和头程订单管理;工作台不作为订单与客户交付项。 - 企业客户端:用户名加密码登录、免审核企业注册、企业资料、企业成员、角色、菜单及权限管理;企业资料审核通过后才可提交订单。 - 头程订单:提供客户端下单和订单查询能力,形成前后台业务闭环。 - 平台收货仓:平台统一维护国内收货仓,客户端下单时选择已启用仓库并保存仓库 ID、编码、名称和地址快照。 - 快递公司:当前平台后台人员统一维护快递公司档案,企业客户端不维护;订单履约时记录快递公司与快递单号。 - 往来单位:当前平台后台人员维护发货单位、收货单位、供应商和服务商,企业客户端只读选择并在头程订单中保存快照。 -一期基础资料范围包括平台收货仓、快递公司和往来单位。仓库能力限定为义乌、深圳、青岛、上海、宁波、厦门等国内收货仓的档案、启停、查询和订单关联,不包含 FBA/海外目的仓、库存、库位、货架、入库、出库、盘点等 WMS 作业;快递能力不包含轨迹订阅和自动回传。 +订单与客户基础资料范围包括平台收货仓、快递公司和往来单位。仓库能力限定为义乌、深圳、青岛、上海、宁波、厦门等国内收货仓的档案、启停、查询和订单关联,不包含 FBA/海外目的仓、库存、库位、货架、入库、出库、盘点等 WMS 作业;快递能力不包含轨迹订阅和自动回传。 权限边界暂按以下模型设计: @@ -64,7 +64,7 @@ | BASE-02 | 公共 | 数据库 | 用户、企业、企业资料审核、成员、角色、菜单、权限、订单、仓库等核心表设计 | P0 | 待开始 | 0% | BASE-01 | 待分配 | 企业资料审核状态与注册账号状态分离;仓库主数据与订单仓库快照分离 | | BASE-03 | 公共 | 认证 | Admin 与企业端登录、退出、Token、密码加密、登录状态和接口鉴权 | P0 | 联调中 | 55% | BASE-02 | 待分配 | Client 已接真实登录/退出、Access/Refresh Token、MERCHANT 身份校验、并发 401 单次刷新;2026-07-30 Gateway/Auth 登录均出现 503,待后端恢复服务发现后验收 | | BASE-04 | 公共 | 通用能力 | 统一响应、错误码、分页、操作日志、文件上传 | P0 | 进行中 | 25% | BASE-01 | 待分配 | Client 已实现 code 字符串响应解包、字段错误模型、常见网络错误和 multipart 营业执照上传;分页与日志待接入 | -| BASE-05 | 公共 | 接口文档 | 输出并维护一期 API 文档 | P0 | 待开始 | 0% | BASE-01 | 待分配 | 建议使用 OpenAPI;同步企业资料审核、下单资格、仓库、快递公司、往来单位与订单快照契约 | +| BASE-05 | 公共 | 接口文档 | 输出并维护订单与客户 API 文档 | P0 | 待开始 | 0% | BASE-01 | 待分配 | 建议使用 OpenAPI;同步企业资料审核、下单资格、仓库、快递公司、往来单位与订单快照契约 | | ADM-AUTH-01 | 后台 | 登录认证 | 平台内部员工账号密码登录、退出、登录回跳、路由守卫和无权限跳转 | P0 | 进行中 | 70% | BASE-03 | 待分配 | 已接 `/api/auth/**` 与 `/api/platform/v1/iam/permissions`,校验 PLATFORM 身份并按 JWT 与启用权限资源交集授权;等待 Gateway/Nacos 路由恢复后完成真实环境验收 | | ADM-CUSTOMER-01 | 后台 | 客户管理 | 客户列表、搜索、分页、详情、新增、编辑和启停 | P0 | 进行中 | 70% | BASE-03 | 待分配 | 前端已完成并通过浏览器验收,等待接口联调 | | ADM-CUSTOMER-02 | 后台 | 客户管理 | 查看企业资料和资质,人工点击审核通过并维护下单资格 | P0 | 联调中 | 82% | ADM-CUSTOMER-01、CLI-PROFILE-02 | 待分配 | 独立审核页已接 IAM 待审列表、按租户资质查询、平台 Token 文件预览、通过与驳回接口;待使用真实待审记录验证完整写操作 | @@ -83,7 +83,7 @@ | ADM-WH-01 | 后台 | 平台收货仓 | 仓库列表、关键词和状态筛选、分页及空态 | P0 | 进行中 | 75% | BASE-03、WH-BASE-01 | 待分配 | 静态页面和权限已完成,等待接口联调 | | ADM-WH-02 | 后台 | 平台收货仓 | 新增、编辑、启用和停用仓库;校验编码唯一性 | P0 | 进行中 | 75% | ADM-WH-01 | 待分配 | 停用仓库不允许新订单选择,不物理删除历史引用 | | WH-BASE-01 | 公共 | 仓库模型 | 定义国内平台收货仓、启停状态及订单仓库关联 | P0 | 进行中 | 65% | BASE-02 | 待分配 | 共享仓库及快照模型已完成,数据库与 API 契约待实现 | -| MD-PROTO-01 | 公共 | 基础资料原型 | 核对 `docs/悦` 中快递公司、往来单位菜单、列表、字段、状态和现有交互,形成一期迁移口径 | P0 | 已完成 | 100% | - | 待分配 | 已确认原型存在;原型资产与当前 Vue 工程实现分开统计 | +| MD-PROTO-01 | 公共 | 基础资料原型 | 核对 `docs/悦` 中快递公司、往来单位菜单、列表、字段、状态和现有交互,形成订单与客户迁移口径 | P0 | 已完成 | 100% | - | 待分配 | 已确认原型存在;原型资产与当前 Vue 工程实现分开统计 | | MD-BASE-01 | 公共 | 基础资料模型 | 统一快递公司、往来单位的稳定编码、启停、审计、数据范围和订单快照规则 | P0 | 进行中 | 10% | BASE-02、BASE-04、MD-PROTO-01 | 待分配 | 设计文档已有字段草案;共享类型、数据库与 API 契约尚未实现 | | ADM-EXP-01 | 后台 | 快递公司 | 快递公司列表、关键词搜索、按状态筛选及详情 | P0 | 进行中 | 80% | BASE-03、MD-BASE-01 | 待分配 | Vue 列表、组合筛选、详情和响应式展示完成;Pinia 静态数据等待新架构业务 API | | ADM-EXP-02 | 后台 | 快递公司 | 后台人员新增、编辑、启用和停用;校验稳定编码与名称唯一性 | P0 | 进行中 | 80% | ADM-EXP-01 | 待分配 | Vue 维护、权限控制、编码/名称不区分大小写唯一校验和历史引用提示完成;服务端校验待接入 | @@ -99,7 +99,7 @@ | CLI-MY-01 | 客户端 | 我的信息 | 查看用户名、姓名、联系电话、邮箱和所属公司,支持进入编辑、保存和取消 | P0 | 联调中 | 90% | CLI-AUTH-01 | 待分配 | 已接个人资料查询/编辑接口;用户名和所属公司只读,电话与邮箱按 OpenAPI 可选约束处理,保存失败保留输入 | | CLI-MY-02 | 客户端 | 我的信息 | 使用当前密码、新密码和确认密码修改登录密码 | P0 | 联调中 | 90% | CLI-MY-01、BASE-03 | 待分配 | 已接 `PUT /api/auth/password`,按 8–64 位且同时包含字母数字校验;成功后清理旧会话并返回登录页 | | CLI-PROFILE-01 | 客户端 | 公司信息 | 企业基本信息、法人信息、联系人、手机、邮箱、微信和地址查看与维护 | P0 | 进行中 | 65% | CLI-REG-01 | 待分配 | 原型按“企业基本信息/联系信息”分页签展示;当前静态编辑交互已完成,等待接口和真实权限控制 | -| CLI-PROFILE-02 | 客户端 | 公司信息 | 一期营业执照状态、查看和上传 | P1 | 联调中 | 90% | BASE-04 | 待分配 | 已接资料编辑、资质查询、营业执照上传及携带 Token 的图片预览;按后端限制为单张 JPG/PNG、最大 5MB,待稳定环境完成浏览器验收 | +| CLI-PROFILE-02 | 客户端 | 公司信息 | 订单与客户营业执照状态、查看和上传 | P1 | 联调中 | 90% | BASE-04 | 待分配 | 已接资料编辑、资质查询、营业执照上传及携带 Token 的图片预览;按后端限制为单张 JPG/PNG、最大 5MB,待稳定环境完成浏览器验收 | | CLI-MEMBER-01 | 客户端 | 企业成员 | 成员列表、新增、编辑、启停和重置密码 | P0 | 联调中 | 92% | CLI-REG-01 | 待分配 | 姓名、联系方式、memberNo 和 roleIds 已真实回显;新增、编辑、启停、重置密码均接精确 membershipId 路径,所有者保护由服务端最终校验 | | CLI-ROLE-01 | 客户端 | 角色 | 企业角色新增、编辑、删除、启停 | P0 | 测试中 | 90% | CLI-MEMBER-01 | 待分配 | 已从后端只读源码确认并接入编辑、状态和删除真实接口;浏览器真实读取正常,当前只有内置角色,需自定义角色样本复测操作入口且暂不执行写入 | | CLI-ROLE-02 | 客户端 | 角色 | 为成员分配一个或多个角色 | P0 | 联调中 | 92% | CLI-ROLE-01 | 待分配 | 成员 roleIds 已回显,新增/编辑成员通过精确 membershipId 全量保存角色;待浏览器执行一次真实写入验收 | @@ -112,14 +112,14 @@ | CLI-ORDER-02 | 客户端 | 头程订单 | 我的订单列表和详情 | P0 | 测试中 | 95% | CLI-ORDER-01 | 待分配 | 浏览器真实读取 1 条草稿及详情,货物、双方快照和状态历史正常回显;编辑前强制加载完整详情,修复列表简要数据导致空货物和响应式复制异常 | | CLI-ORDER-03 | 客户端 | 头程订单 | 下单选择平台收货仓;提交时保存仓库 ID 和展示快照 | P0 | 测试中 | 90% | CLI-WH-01、CLI-ORDER-01 | 待分配 | 新订单真实仓库选择和详情回显已验证;当前旧草稿引用已不存在的仓库 `2001`,客户端清空失效选择并提示重新选择,服务端样本关联待修复 | | CLI-ORDER-04 | 客户端 | 头程订单 | 从已启用往来单位选择发货方/收货方并带入联系人和地址,提交时保存快照 | P0 | 测试中 | 94% | CLI-CP-01、CLI-ORDER-01 | 待分配 | 真实候选接口和订单双方快照已接;创建/编辑请求已用发货方 ID 填充后端必填 `customerId`。当前无启用收货仓,创建入口被禁用,候选下拉待准备仓库样本后复测 | -| ADM-ORDER-05 | 后台 | 头程订单 | 维护履约快递公司、快递单号并在订单详情展示 | P1 | 进行中 | 80% | ADM-EXP-02、ADM-ORDER-02 | 待分配 | Vue 列表/详情/维护弹窗、单组限制、停用历史回显和审计记录完成;一期不接轨迹订阅,业务 API 待新架构确认 | +| ADM-ORDER-05 | 后台 | 头程订单 | 维护履约快递公司、快递单号并在订单详情展示 | P1 | 进行中 | 80% | ADM-EXP-02、ADM-ORDER-02 | 待分配 | Vue 列表/详情/维护弹窗、单组限制、停用历史回显和审计记录完成;订单与客户不接轨迹订阅,业务 API 待新架构确认 | | CLI-ORDER-05 | 客户端 | 头程订单 | 订单详情只读展示后台维护的快递公司和快递单号 | P1 | 测试中 | 75% | ADM-ORDER-05、CLI-ORDER-02 | 待分配 | 真实订单详情已验证“平台尚未维护快递信息”空态,客户侧无编辑入口;仍需后台准备含快递公司和单号的样本复测有值回显 | | TEST-01 | 公共 | 测试 | 用户、角色、权限和越权访问测试 | P0 | 进行中 | 40% | 权限模块完成 | 待分配 | 客户端已覆盖权限过滤、403、首个可访问页面、按钮权限和会话恢复;跨企业越权及接口拒绝必须待服务端测试 | | TEST-02 | 公共 | 测试 | Admin 登录、企业端免审核注册、企业资料审核、下单资格和头程订单业务流程测试 | P0 | 进行中 | 45% | 业务模块完成 | 待分配 | 客户端已覆盖免审核注册、资料待审核可存草稿、提交阻断和资料引导;仍需接口失败、审核通过提交及服务端越权测试 | | TEST-03 | 公共 | 测试 | 编码唯一、启停控制、客户端只读选择及订单仓库关联测试 | P0 | 进行中 | 65% | ADM-WH-02、CLI-ORDER-03 | 待分配 | 前端自动化已覆盖停用限制和主数据变更后的历史快照;服务端测试待补 | | TEST-04 | 公共 | 测试 | 快递公司和往来单位编码唯一、数据范围、启停控制、批量导入、只读查询、订单带入及快照测试 | P0 | 进行中 | 25% | ADM-EXP-03、ADM-CP-04、CLI-ORDER-05 | 待分配 | 补充模板版本、必填/格式/重复校验、整批失败、错误报告、导入权限和审计测试 | | REL-01 | 公共 | 发布 | 测试环境部署、初始化账号、基础菜单权限和首批基础资料 | P0 | 待开始 | 0% | BASE-01、ADM-WH-02、ADM-EXP-02、ADM-CP-03 | 待分配 | 首批收货仓、快递公司、往来单位数据需业务验收;禁止使用通用弱密码 | -| REL-02 | 公共 | 验收 | 一期验收、问题修复和生产发布 | P0 | 待开始 | 0% | TEST-01、TEST-02、TEST-03、TEST-04 | 待分配 | 形成验收清单 | +| REL-02 | 公共 | 验收 | 订单与客户验收、问题修复和生产发布 | P0 | 待开始 | 0% | TEST-01、TEST-02、TEST-03、TEST-04 | 待分配 | 形成验收清单 | ## 四、建议里程碑 @@ -131,7 +131,7 @@ | M4 企业权限 | 客户端角色、菜单和权限完整可用 | 进行中 | 待排期 | | M5 基础资料主数据 | 后台可维护平台收货仓、快递公司、往来单位;客户端只读查询并受数据范围控制 | 进行中 | 待排期 | | M6 订单闭环 | 客户选择收货仓和往来单位提交订单,后台维护履约信息,历史展示稳定 | 进行中 | 待排期 | -| M7 一期上线 | 联调、测试、验收和生产发布完成 | 待排期 | 待排期 | +| M7 订单与客户上线 | 联调、测试、验收和生产发布完成 | 待排期 | 待排期 | ## 五、产品决策与待确认事项 @@ -139,26 +139,26 @@ | 编号 | 决策 | 结论 | |---|---|---| -| Q1 | 客户端一期是否包含头程下单、订单列表和详情? | 包含,作为一期前后台订单闭环的必要范围 | +| Q1 | 客户端订单与客户是否包含头程下单、订单列表和详情? | 包含,作为订单与客户前后台订单闭环的必要范围 | | Q2 | 企业注册与企业资料审核关系 | 注册无需审核,成功后即可登录;提交订单前必须提交企业资料并由平台人工点击审核通过 | | Q3 | 客户端“菜单分配”的操作人 | 企业管理员为本企业角色分配菜单和操作权限,不能管理其他企业或平台后台菜单 | -| Q4 | 一个用户能否拥有多个角色? | 一期支持多角色,服务端按角色权限并集授权 | -| Q5 | 企业注册是否使用短信或邮箱验证码? | 一期不接验证码,仅做必填、格式、密码强度和账号重复校验 | -| Q6 | 头程订单一期状态 | 草稿、待审核、已受理、已订舱、运输中、已完成、已取消;不设置已驳回状态 | -| Q7 | 是否需要部门/组织架构? | 一期不纳入,成员直接关联企业并通过角色授权 | -| Q8 | 一期仓库范围与维护方 | 平台后台统一维护国内收货仓,客户端只读选择启用仓库;FBA/海外目的仓不纳入本次 | +| Q4 | 一个用户能否拥有多个角色? | 订单与客户支持多角色,服务端按角色权限并集授权 | +| Q5 | 企业注册是否使用短信或邮箱验证码? | 订单与客户不接验证码,仅做必填、格式、密码强度和账号重复校验 | +| Q6 | 头程订单订单与客户状态 | 草稿、待审核、已受理、已订舱、运输中、已完成、已取消;不设置已驳回状态 | +| Q7 | 是否需要部门/组织架构? | 订单与客户不纳入,成员直接关联企业并通过角色授权 | +| Q8 | 订单与客户仓库范围与维护方 | 平台后台统一维护国内收货仓,客户端只读选择启用仓库;FBA/海外目的仓不纳入本次 | | Q9 | 仓库停用后的订单处理 | 禁止新单选择;历史订单继续展示下单时仓库编码、名称和地址快照 | | Q10 | 快递公司和往来单位维护方 | 均由当前平台后台人员维护;企业客户端无维护入口和写接口,仅可按权限查询、选择和查看 | | Q11 | 往来单位的数据范围 | 按所属业务主体隔离,平台人员仅在授权数据范围内维护和查看 | -| Q12 | 往来单位一期类型 | 使用稳定编码并支持一个单位多选类型;一期覆盖供应商、客户、承运商、报关行、发货单位和收货单位 | -| Q13 | 一个订单支持几组快递公司和快递单号? | 一期只支持一组履约快递信息;多包裹、多段运输后续扩展 | -| Q15 | Admin 工作台是否纳入一期? | 不纳入一期交付与验收;一期先完成简单登录、企业资料审核、权限、基础资料和订单闭环 | -| Q14 | 快递公司、往来单位批量导入是否纳入一期? | 已确认纳入一期,均由获授权的后台人员使用标准模板导入 | -| Q16 | 多语言、微信和企业微信登录是否纳入一期? | 不纳入;一期仅交付中文账号密码登录,第三方登录后续单独排期 | -| Q17 | 快递公司、往来单位导出是否纳入一期? | 不纳入;一期仅实现标准模板批量导入 | -| Q18 | 一期客户端是否包含我的信息和公司信息? | 已确认包含;按现有客户端原型覆盖个人资料编辑、修改密码、企业基本/联系信息和资质文件查看维护 | -| Q19 | 待审核订单信息不正确时如何处理? | 一期无驳回操作;后台可人工修改,不能直接确认时联系客户修改,订单保持待审核并记录修改审计 | -| Q20 | 批量导入是否更新已有档案? | 一期仅新增;重复编码或唯一键冲突时整批失败,不覆盖已有档案 | +| Q12 | 往来单位订单与客户类型 | 使用稳定编码并支持一个单位多选类型;订单与客户覆盖供应商、客户、承运商、报关行、发货单位和收货单位 | +| Q13 | 一个订单支持几组快递公司和快递单号? | 订单与客户只支持一组履约快递信息;多包裹、多段运输后续扩展 | +| Q15 | Admin 工作台是否纳入订单与客户? | 不纳入订单与客户交付与验收;订单与客户先完成简单登录、企业资料审核、权限、基础资料和订单闭环 | +| Q14 | 快递公司、往来单位批量导入是否纳入订单与客户? | 已确认纳入订单与客户,均由获授权的后台人员使用标准模板导入 | +| Q16 | 多语言、微信和企业微信登录是否纳入订单与客户? | 不纳入;订单与客户仅交付中文账号密码登录,第三方登录后续单独排期 | +| Q17 | 快递公司、往来单位导出是否纳入订单与客户? | 不纳入;订单与客户仅实现标准模板批量导入 | +| Q18 | 订单与客户客户端是否包含我的信息和公司信息? | 已确认包含;按现有客户端原型覆盖个人资料编辑、修改密码、企业基本/联系信息和资质文件查看维护 | +| Q19 | 待审核订单信息不正确时如何处理? | 订单与客户无驳回操作;后台可人工修改,不能直接确认时联系客户修改,订单保持待审核并记录修改审计 | +| Q20 | 批量导入是否更新已有档案? | 订单与客户仅新增;重复编码或唯一键冲突时整批失败,不覆盖已有档案 | | Q21 | “我的信息”中的用户名能否修改? | 用户名只读,不允许修改 | ### 待确认事项 @@ -181,7 +181,7 @@ | 验收项 | 结果 | 证据/说明 | |---|---|---| | 客户管理 | 通过(静态,待调整) | 列表、筛选、分页、新增/编辑、详情和启停已完成;原注册审核交互需改为企业资料审核通过 | -| Admin 登录 | 通过(静态) | 登录必填/失败反馈、退出确认、安全回跳、403 路由及按角色首个业务页落地已完成;一期工作台入口已移除,真实 Token 与会话失效处理待接入 | +| Admin 登录 | 通过(静态) | 登录必填/失败反馈、退出确认、安全回跳、403 路由及按角色首个业务页落地已完成;订单与客户工作台入口已移除,真实 Token 与会话失效处理待接入 | | 内部用户 | 通过 | 列表、筛选、新增/编辑、多角色、重置密码、启停及管理员保护 | | 角色管理 | 通过 | 新增/编辑/删除/启停、权限树、数据范围及内置角色保护 | | 权限管理 | 通过 | 目录/菜单/按钮/接口资源树、上下级维护、状态与唯一编码校验 | @@ -192,7 +192,7 @@ | 生产构建 | 通过 | `pnpm build`,输出至 `apps/admin-web/dist`;产物扫描确认不包含平台联调账号、密码和开发提示 | | impeccable 样式检测 | 通过(已修复告警) | 修复字体栈以及 width/margin 布局动画;保留既有后台视觉体系 | -> 客户档案、内部用户和基础资料仍使用 Pinia 模拟数据;企业审核、平台角色、菜单及按钮权限资源已切换到真实 IAM 接口。后台前端阶段完成不等于一期业务完成,仍需后端数据、真实 RBAC 鉴权、联调和测试后才能标记“已完成”。 +> 客户档案、内部用户和基础资料仍使用 Pinia 模拟数据;企业审核、平台角色、菜单及按钮权限资源已切换到真实 IAM 接口。后台前端阶段完成不等于订单与客户业务完成,仍需后端数据、真实 RBAC 鉴权、联调和测试后才能标记“已完成”。 ### Admin 认证联调记录(2026-07-29) @@ -220,8 +220,8 @@ | 企业角色 | 通过(静态) | 新增/编辑/删除/启停、成员和权限数量、内置角色保护及权限入口已完成 | | 菜单权限 | 通过(静态) | 角色选择、分组菜单与操作权限、全选/半选、保存/重置和只读保护已完成 | | 我的信息与修改密码 | 通过(静态) | 原型字段、查看/编辑/保存/取消、只读账号与企业、当前密码错误、密码强度和静态会话/审计结果已完成 | -| 头程订单与仓库 | 通过(静态) | 下单、草稿、提交、列表、详情、启用仓库选择、历史仓库快照及后端必填字段已完成;取消不纳入本轮一期客户端验收 | -| 静态页面完整性与响应式 | 通过(100%) | 一期客户端导航和路由均落到正式页面,无在用占位页;桌面、720px 和 390px 布局、移动导航、44px 主要操作及无横向溢出已验证 | +| 头程订单与仓库 | 通过(静态) | 下单、草稿、提交、列表、详情、启用仓库选择、历史仓库快照及后端必填字段已完成;取消不纳入本轮订单与客户客户端验收 | +| 静态页面完整性与响应式 | 通过(100%) | 订单与客户客户端导航和路由均落到正式页面,无在用占位页;桌面、720px 和 390px 布局、移动导航、44px 主要操作及无横向溢出已验证 | | 自动化测试 | 通过 | `apps/client-web` 执行 `pnpm test`,94 项通过,覆盖认证、个人资料、成员、角色权限、超大整数响应、业务总览真实加载、往来单位历史快照、仓库详情、头程订单完整详情编辑、幂等、快递字段、失败恢复、未保存保护、响应式和关键源码契约 | | TypeScript 类型检查 | 通过 | `apps/client-web` 执行 `pnpm typecheck` | | 生产构建 | 通过 | `apps/client-web` 执行 `pnpm build`;产物扫描确认不包含商户联调账号和开发提示 | @@ -232,7 +232,7 @@ | 快递信息 | 通过(静态) | 订单详情只读展示平台维护的快递公司和单号,并提供未维护空态;客户侧无写入口 | | 服务端与数据安全 | 联调中 | 认证、权限资源、企业资料、营业执照、个人资料、成员完整维护、角色完整维护、仓库详情、往来单位、头程订单及快递只读字段已接真实 API;订单 `customerId` 与 `CUSTOMER / SUPPLIER / BOTH` 契约已按后端源码和回归脚本复核 | -> 客户端静态页面阶段通过不等于一期业务完成。菜单隐藏和页面只读只用于前端体验,服务端仍必须按当前用户、`tenant_id` 和权限编码执行授权校验。 +> 客户端静态页面阶段通过不等于订单与客户业务完成。菜单隐藏和页面只读只用于前端体验,服务端仍必须按当前用户、`tenant_id` 和权限编码执行授权校验。 ### Client 认证与企业资料联调记录(2026-07-29) @@ -263,7 +263,7 @@ - 新版联调文档和 Gateway Swagger 已确认可用;实测商户登录、企业资料、资质、权限、角色、成员、仓库分页、订单分页与订单详情均返回 `code=0`,订单详情不返回平台内部备注。 - 已接企业资料 `PUT`、资质图片鉴权下载、仓库分页、订单分页/详情、创建/编辑草稿和提交;`SUBMITTED/PROCESSING`、`transportMode/containerMode` 均通过适配层映射,未把 FCL/LCL 错当运输方式。 - 页面新增渠道、提货方式、报关模式、目的仓类型、包装类型等后端必填字段;订单和仓库请求失败不回退模拟数据,仓库为空时禁用创建。 -- Swagger 虽存在订单取消接口,但新版任务文档明确取消不纳入本轮本地一期验收,因此客户端不暴露取消写操作。 +- Swagger 虽存在订单取消接口,但新版任务文档明确取消不纳入本轮本地订单与客户验收,因此客户端不暴露取消写操作。 - 远端环境在浏览器验收阶段再次无响应;`http://127.0.0.1:5190` 登录页正常加载并发起真实登录,但 Gateway 健康检查与登录请求均超时,未进入工作台。 - 代码已再次通过 81 项自动化测试和 TypeScript 检查;本轮生产构建与浏览器验收结果见交付记录,真实草稿写入、资质预览与空仓禁建仍需在稳定 Gateway 和有效仓库数据下继续验收。 @@ -271,7 +271,7 @@ - 最新文档再次确认浏览器只通过 Gateway `9000` 和同源 `/api` 访问,禁止直连 `9100/9201/9204/9205/9206` 等服务端口;后端文档记录 8 个应用健康检查均为 `UP`,平台账号也已由人工登录进入 Admin。 - 本轮真实接入范围为商户企业资料/资质、商户仓库和头程订单 CRUD/提交,以及平台待审列表、指定租户资质、鉴权文件查看和审核动作。平台订单审核、受理、履约、完成、取消及 Admin 快递公司/往来单位业务接口未纳入最新本地联调契约,前端继续保留静态实现,不猜测接口。 -- 后端任务文档写有“`DRAFT`、`REJECTED` 可编辑”,与已确认的一期订单七状态规则冲突。产品确认优先:订单不恢复“已驳回”状态;兼容旧接口返回的订单 `REJECTED` 时映射为待审核且不开放客户编辑。企业资料和资质审核的 `REJECTED` 仍正常保留,这是独立业务状态。 +- 后端任务文档写有“`DRAFT`、`REJECTED` 可编辑”,与已确认的客户订单七状态规则冲突。产品确认优先:订单不恢复“已驳回”状态;兼容旧接口返回的订单 `REJECTED` 时映射为待审核且不开放客户编辑。企业资料和资质审核的 `REJECTED` 仍正常保留,这是独立业务状态。 - 平台企业审核详情改为按租户查询资质,文件通过平台 Token 请求二进制后临时预览,不再直接打开商户文件 URL;覆盖加载、空数据、失败重试和对象地址释放。 - 商户订单创建与提交请求增加 `Idempotency-Key`,并将 `merchant:order:create/edit/submit` 映射为三个独立前端操作权限;商户详情仍不读取或渲染 `internalNotes`。 - 交付门禁通过:Admin `21` 个测试文件、`147` 项测试,Client `81` 项测试;两端 `pnpm typecheck` 与 `pnpm build` 均通过。已使用真实平台账号进入 `http://localhost:5173/customers/reviews`,待审列表真实返回空数据且无控制台错误;桌面和 390px 窄屏无页面级横向溢出。由于当前无待审记录,资质抽屉的真实文件预览仍待准备样本后人工验收。 @@ -327,4 +327,4 @@ - 从后端 `iam/RbacController.java` 与 `RbacDtos.java` 确认平台角色已提供详情、编辑、启停、删除和权限全量替换接口,前端不再受旧联调文档缺口限制。 - Admin 角色页现同时读取角色 `permissionIds` 与权限资源,真实回显菜单和按钮授权;编辑使用 `PUT /api/platform/v1/iam/roles/{roleId}`,启停使用 `PUT /api/platform/v1/iam/roles/{roleId}/status`,删除使用 `DELETE /api/platform/v1/iam/roles/{roleId}`,授权使用 `PUT /api/platform/v1/iam/roles/permissions`。 - 19 位角色和权限 ID 延续字符串处理,避免 JavaScript 数值精度丢失;保存、启停和删除均有重复提交防护与真实失败反馈,不回退本地成功。 -- 后端订单 Controller 仍包含订单驳回接口,与当前一期“不设置已驳回状态”的确认结论冲突,本轮明确不接入该接口;企业资料审核驳回不受此订单规则影响。 +- 后端订单 Controller 仍包含订单驳回接口,与当前订单与客户“不设置已驳回状态”的确认结论冲突,本轮明确不接入该接口;企业资料审核驳回不受此订单规则影响。 diff --git a/财务管理/F1人工财务契约审查与门禁.md b/财务管理/F1人工财务契约审查与门禁.md index 2a185c1..cd4709d 100644 --- a/财务管理/F1人工财务契约审查与门禁.md +++ b/财务管理/F1人工财务契约审查与门禁.md @@ -4,7 +4,7 @@ > 审查范围:Finance Java、Finance 建库 SQL、统一增量 SQL、Admin/Client Finance API、File Java/测试、`openapi/finance-f1-manual-v1.yaml` > 结论:F0/F1 基础代码已经实现,当前处于专项修复与契约收敛阶段;不是整体未开发。修复项完成前尚未达到完整联调验收/测试放行。 -> 范围重定:领导验收改为《财务一期五页产品与接口验收契约》中的 5 页。本文 D1-D11 继续作为既有人工接口专项门禁,并新增来源链路和五页门禁。 +> 范围重定:领导验收改为《财务核心五页产品与接口验收契约》中的 5 页。本文 D1-D11 继续作为既有人工接口专项门禁,并新增来源链路和五页门禁。 ## 1. 已确认且已对齐 @@ -92,7 +92,7 @@ | D11 | 客户状态可见性 | **后端完成。** 客户账单只见 `ISSUED/PARTIALLY_PAID/PAID`;客户收款只见 `CONFIRMED`,使用 `ClientReceipt` 专用 DTO 并去除凭证、操作人和内部字段;脱敏测试通过 | 后端门禁关闭;保留跨客户与序列化回归 | | D12 | Finance 费用来源写入 | **后端完成。** 内部事件入口、令牌鉴权、Inbox 幂等、Firstleg 快照回查、来源写入/替代/作废均已实现;非作废事件必须 `PUBLISHED`,未发布返回 `FIN-EVT-015`;金额必须 `>0`,零/负返回 `FIN-EVT-010`;专项 10/10、Finance 全量 35/35 通过 | 后端门禁关闭;保留真实跨服务 HTTP 冒烟 | | D13 | 柜子费用来源 | **后端完成并验证。** Firstleg 已有柜子费用模型、审核/参与结算/作废、事件、Relay 和内部快照;Firstleg 相关 17/17、Finance 柜子来源消费测试通过 | 后端门禁关闭;测试环境补真实跨服务事件冒烟 | -| D14 | 一期 5 页 | **FAIL / 一期 P0 未关闭。** 11 个目标 operation 契约已冻结;实现状态不再写入 OpenAPI 或主契约,G1-G4 证据矩阵当前均未放行 | G1-G4 分别完成组内全部后端直接行为测试和 Admin 真实接入,证据矩阵更新为 `PASS` 后再完成五页端到端验收 | +| D14 | 订单与客户 5 页 | **FAIL / 订单与客户 P0 未关闭。** 11 个目标 operation 契约已冻结;实现状态不再写入 OpenAPI 或主契约,G1-G4 证据矩阵当前均未放行 | G1-G4 分别完成组内全部后端直接行为测试和 Admin 真实接入,证据矩阵更新为 `PASS` 后再完成五页端到端验收 | ## 4. 非阻断但需锁定的契约说明 @@ -107,7 +107,7 @@ 进入前后端联调前至少满足: -1. D1-D8、D10-D13 已具备后端直接证据;D14 当前 FAIL,G1-G4 任一组未同时通过后端行为测试与 Admin 真实接入,均不得通过一期完整联调验收。 +1. D1-D8、D10-D13 已具备后端直接证据;D14 当前 FAIL,G1-G4 任一组未同时通过后端行为测试与 Admin 真实接入,均不得通过订单与客户完整联调验收。 2. D2 已固定为首期非分页数组;后续若改服务端分页须另行升级契约。 3. 幂等门禁已关闭;后续写 operation 继续复用同参重放、异参冲突和恢复语义。 4. Finance 集成测试覆盖:默认 30 天、CNY 拒绝、出账冻结、300 分 3 单、超额/跨客户/草稿拒绝、部分收款到收清、调整修订、已收不可作废。 diff --git a/财务管理/F1人工账单收款成本接口契约.md b/财务管理/F1人工账单收款成本接口契约.md index accff49..f26b341 100644 --- a/财务管理/F1人工账单收款成本接口契约.md +++ b/财务管理/F1人工账单收款成本接口契约.md @@ -5,7 +5,7 @@ > 状态:目标契约;以《F1人工财务契约审查与门禁》为开发/联调准入依据 > OpenAPI:`openapi/finance-f1-manual-v1.yaml` -> 一期 5 页产品与新增接口以《财务一期五页产品与接口验收契约》和 `openapi/finance-phase1-five-pages-v1.yaml` 为准;本文保留现有人工账单、收款和成本能力的细化契约。 +> 订单与客户 5 页产品与新增接口以《财务核心五页产品与接口验收契约》和 `openapi/finance-core-five-pages-v1.yaml` 为准;本文保留现有人工账单、收款和成本能力的细化契约。 ## 1. 首期边界 diff --git a/财务管理/Firstleg-Finance跨服务契约.md b/财务管理/Firstleg-Finance跨服务契约.md index 8907716..9db2f23 100644 --- a/财务管理/Firstleg-Finance跨服务契约.md +++ b/财务管理/Firstleg-Finance跨服务契约.md @@ -2,9 +2,9 @@ > 版本:V0.4(费用作废命令与事件回流对齐) > 日期:2026-08-20 -> 状态:技术边界和一期产品口径已确认;Firstleg 事件/Relay/快照、Finance Inbox/来源写入及 Finance 发起的业务作废闭环均已实现。 +> 状态:技术边界和订单与客户产品口径已确认;Firstleg 事件/Relay/快照、Finance Inbox/来源写入及 Finance 发起的业务作废闭环均已实现。 -本文是 `firstleg-service` 与已落地 `finance-service` 之间的费用来源技术契约。产品范围以《财务一期五页产品与接口验收契约》为准。 +本文是 `firstleg-service` 与已落地 `finance-service` 之间的费用来源技术契约。产品范围以《财务核心五页产品与接口验收契约》为准。 ## 1. 事实依据与当前实现差异 diff --git a/财务管理/README.md b/财务管理/README.md index cf56485..8303e15 100644 --- a/财务管理/README.md +++ b/财务管理/README.md @@ -1,8 +1,8 @@ # 财务管理闭环盘点与范围建议 -> 盘点日期:2026-08-10 -> 当前状态:F0/F1 已有 Finance 服务、数据库、权限、Admin/Client 页面和基础接口;一期 11 个 P0 operation 的目标契约已冻结,本地实现验收按独立 G1-G4 证据矩阵均为 `PASS`;真实 MySQL、测试环境 HTTP 冒烟和领导页面验收仍需单独执行 -> 盘点范围:二期入库计费现状、平台后台财务原型、Admin/Client/Firstleg 当前实现 +> 盘点日期:2026-08-10 +> 当前状态:F0/F1 已有 Finance 服务、数据库、权限、Admin/Client 页面和基础接口;订单与客户 11 个 P0 operation 的目标契约已冻结,本地实现验收按独立 G1-G4 证据矩阵均为 `PASS`;真实 MySQL、测试环境 HTTP 冒烟和领导页面验收仍需单独执行 +> 盘点范围:入库计费现状、平台后台财务原型、Admin/Client/Firstleg 当前实现 > 结论口径:本文区分“代码已实现”“原型展示”和“建议范围”;原型功能不自动成为开发范围。 ## 费用来源扩展确认(2026-09-02) @@ -35,21 +35,21 @@ Finance 全链路测试环境实跑报告为 `baiyue-firstleg/reports/finance-fu 开发前总控门禁与 F0/F1 任务清单:[财务开工门禁与F0-F1任务清单](财务开工门禁与F0-F1任务清单.md)。 -一期领导验收唯一范围入口:[财务一期五页产品与接口验收契约](财务一期五页产品与接口验收契约.md)。 +订单与客户领导验收唯一范围入口:[财务核心五页产品与接口验收契约](财务核心五页产品与接口验收契约.md)。 -一期 11 个 P0 操作、状态机与验收用例:[财务一期 P0 操作契约与验收用例](财务一期P0操作契约与验收用例.md)。 +订单与客户 11 个 P0 操作、状态机与验收用例:[财务核心 P0 操作契约与验收用例](财务核心P0操作契约与验收用例.md)。 -一期实现与 Admin 接入证据(不反向修改目标契约):[财务一期 P0 实现证据矩阵](财务一期P0实现证据矩阵.md)。 +订单与客户实现与 Admin 接入证据(不反向修改目标契约):[财务核心 P0 实现证据矩阵](财务核心P0实现证据矩阵.md)。 -文档优先级:五页验收契约和本轮产品确认 > 五页目标 OpenAPI > 既有人工 F1 契约/门禁 > 领域模型、历史全量规划和迁移文档。旧文档用于追溯,不得据此把钱包、充值、发票、费用分析或利润表重新纳入一期。 +文档优先级:五页验收契约和本轮产品确认 > 五页目标 OpenAPI > 既有人工 F1 契约/门禁 > 领域模型、历史全量规划和迁移文档。旧文档用于追溯,不得据此把钱包、充值、发票、费用分析或利润表重新纳入订单与客户。 旧文档降级规则: -| 文档/章节 | 当前用途 | 一期实施约束 | +| 文档/章节 | 当前用途 | 订单与客户实施约束 | |---|---|---| | 本文第六节起的“历史全量规划” | 保存早期盘点和演进背景 | 与五页契约冲突时全部失效,不作为菜单、路由、字段或接口依据 | | `财务领域模型与跨服务契约.md` | 历史合并稿 | 已被数据字典和跨服务契约替代 | -| `财务服务边界设计.md`、`财务领域模型与数据字典.md` | 服务边界和长期模型参考 | 其中钱包、充值、发票、费用分析、利润模型不属于一期 | +| `财务服务边界设计.md`、`财务领域模型与数据字典.md` | 服务边界和长期模型参考 | 其中钱包、充值、发票、费用分析、利润模型不属于订单与客户 | | `财务历史迁移与上线验收方案.md`、`财务F0实施任务拆分.md` | 历史迁移、底座任务追溯 | 不得覆盖五页范围和当前实现状态 | 详细设计材料: @@ -61,10 +61,10 @@ Finance 全链路测试环境实跑报告为 `baiyue-firstleg/reports/finance-fu - [Firstleg-Finance跨服务契约](Firstleg-Finance跨服务契约.md) - [F1 人工账单、收款、成本接口契约](F1人工账单收款成本接口契约.md) - [F1 人工财务契约审查与门禁](F1人工财务契约审查与门禁.md) -- [财务一期五页产品与接口验收契约](财务一期五页产品与接口验收契约.md) -- [财务一期五页 OpenAPI](openapi/finance-phase1-five-pages-v1.yaml) -- [财务一期 P0 操作契约与验收用例](财务一期P0操作契约与验收用例.md) -- [财务一期 P0 实现证据矩阵](财务一期P0实现证据矩阵.md) +- [财务核心五页产品与接口验收契约](财务核心五页产品与接口验收契约.md) +- [财务核心五页 OpenAPI](openapi/finance-core-five-pages-v1.yaml) +- [财务核心 P0 操作契约与验收用例](财务核心P0操作契约与验收用例.md) +- [财务核心 P0 实现证据矩阵](财务核心P0实现证据矩阵.md) - [财务历史迁移与上线验收方案](财务历史迁移与上线验收方案.md) - [财务F0实施任务拆分](财务F0实施任务拆分.md) @@ -101,21 +101,21 @@ Finance 全链路测试环境实跑报告为 `baiyue-firstleg/reports/finance-fu 此前基础链路已完成 Firstleg 真实柜次体积快照、客户归属、成本凭证校验、revision、双权限上传、费用来源事件/Relay/快照、Finance `fin_fee_source` 消费写入和完整幂等。在此基础上,固定五页所需的 11 个目标 operation、Admin 页面动作与 IAM 权限目录现已闭环,G1-G4 本地门禁均为 `PASS`;最终直接证据包括 Finance 聚合 82/82、G3 16/16、G4 18/18、收款及 AR 同步 12/12、IAM 168/168、Admin 财务专项 60/60、Admin 全量 654/654 及 Admin 构建通过。真实 MySQL 执行、测试环境 HTTP 冒烟和领导页面验收仍需单独完成,未经当前对话明确授权不触发 Jenkins。 -一期范围已重新冻结为原型 5 页:客户账户、客户应收应付、客户对账单、结算单应收、结算单应付。费用分析、利润表、发票和钱包不做,也不保留菜单、路由或假按钮。客户账户改为账单、收款和应收应付来源派生的财务往来总览,不做充值/预收。 +订单与客户范围已重新冻结为原型 5 页:客户账户、客户应收应付、客户对账单、结算单应收、结算单应付。费用分析、利润表、发票和钱包不做,也不保留菜单、路由或假按钮。客户账户改为账单、收款和应收应付来源派生的财务往来总览,不做充值/预收。 ## 二、事实来源与边界 本次按以下资料核对: -1. 二期需求文档明确二期只做头程计费,不自动形成应收、应付、对账单、收付款、核销、发票、利润或总账。 +1. 入库测量与计费需求文档明确入库测量与计费只做头程计费,不自动形成应收、应付、对账单、收付款、核销、发票、利润或总账。 2. 平台后台原型提供财务管理全量参考,但其中数据和交互主要由单页 HTML 内的静态数据及前端脚本驱动。 3. 当前代码用于证明“已经实现什么”,不反向扩大产品范围。 主要依据: -- `docs/二期/二期计费财务需求确认表.md` -- `docs/二期/二期V2需求确认清单.md` -- `docs/二期/二期需求优化版-v2-测量计费入库主流程.md` +- `docs/入库测量与计费/入库测量与计费计费财务需求确认表.md` +- `docs/入库测量与计费/入库测量与计费V2需求确认清单.md` +- `docs/入库测量与计费/入库测量与计费需求优化版-v2-测量计费入库主流程.md` - `docs/悦/货代SAAS平台后台/货代SaaS平台原型.html` - `apps/admin-web/src/modules/inbounds/` - `apps/admin-web/src/modules/fee-items/` @@ -163,13 +163,13 @@ Firstleg 已有 `fl_inbound_fee_detail`,包含: | 原型模块 | 原型展示的主要能力 | 当前代码状态 | 是否能直接纳入首期 | |---|---|---|---| -| 客户账户 | 原型为余额、冻结、可用余额和充值流水 | 未实现 | 一期保留汇总/详情/流水结构,但改为未收、待出账、本期已收等派生指标;删除充值/钱包能力 | +| 客户账户 | 原型为余额、冻结、可用余额和充值流水 | 未实现 | 订单与客户保留汇总/详情/流水结构,但改为未收、待出账、本期已收等派生指标;删除充值/钱包能力 | | 客户应收应付 | 费用明细、编辑审核、按截止时间或勾选生成账单 | 已接入真实费用来源和编辑审核闭环 | 作为应收应付费用池 | | 客户对账单 | 账期、汇率、应收、已收、结清、明细和支付历史 | 未实现 | 可作为应收闭环核心,但汇率和开票先暂缓 | | 结算单应收 | 应收、已收、余额、到期日、审批、部分收款 | 未实现 | 可合并进账单/应收单,避免首期重复建模 | -| 结算单应付 | 供应商应付、已付、余额、审批、部分付款、利润 | 未实现;上游成本来源不完整 | 一期纳入,但删除利润字段/按钮;必须先补真实供应商应付来源和付款凭证链路 | -| 费用分析 | 内外部费用对比、趋势和明细 | 未实现 | 一期明确不做,不进菜单/路由 | -| 利润表 | 按客户、货柜、单票、月份统计收入、成本、利润率 | 未实现 | 一期明确不做,不进菜单/路由 | +| 结算单应付 | 供应商应付、已付、余额、审批、部分付款、利润 | 未实现;上游成本来源不完整 | 订单与客户纳入,但删除利润字段/按钮;必须先补真实供应商应付来源和付款凭证链路 | +| 费用分析 | 内外部费用对比、趋势和明细 | 未实现 | 订单与客户明确不做,不进菜单/路由 | +| 利润表 | 按客户、货柜、单票、月份统计收入、成本、利润率 | 未实现 | 订单与客户明确不做,不进菜单/路由 | 原型还出现了发票抬头、开票日期、汇率、支付方式、收付款凭证号等字段。它们只说明未来可能需要,不代表当前产品已经确认税务、外币折算、资金或发票边界。 @@ -190,13 +190,13 @@ Firstleg 已有 `fl_inbound_fee_detail`,包含: ## 六、全量财务规划与交付顺序 -### 6.1 历史全量规划(不作为一期范围) +### 6.1 历史全量规划(不作为订单与客户范围) -以下内容只保留为历史分析。若与《财务一期五页产品与接口验收契约》冲突,以五页契约为准。 +以下内容只保留为历史分析。若与《财务核心五页产品与接口验收契约》冲突,以五页契约为准。 | 目标域 | 业务结果 | 主要来源 | 不能提前假定的口径 | |---|---|---|---| -| 客户账户 | 客户财务往来派生汇总、详情和流水 | 账单、收款和应收应付来源 | 一期不建设钱包、充值、预收或自动扣款 | +| 客户账户 | 客户财务往来派生汇总、详情和流水 | 账单、收款和应收应付来源 | 订单与客户不建设钱包、充值、预收或自动扣款 | | 客户应收 | 客户欠款、到期、逾期、结清 | 已发布对客费用、补差/冲销 | 收入确认节点和账期规则 | | 客户应付 | 客户代垫或返还类应付款(如确有业务) | 业务费用或人工单据 | 产品是否真的存在“平台向客户付款”的场景 | | 客户对账单 | 期间内费用汇总、明细、平台出账和客户确认 | 应收/应付费用池 | 一张账单是否允许混合方向、混合币种 | @@ -204,7 +204,7 @@ Firstleg 已有 `fl_inbound_fee_detail`,包含: | 结算单应付 | 供应商成本、付款、余额和结清 | 供应商费用、运力/仓储/报关成本 | 成本确认、供应商账期、审批和付款方式 | | 收付款与核销 | 到账/付款凭证,部分结算、反核销 | 银行流水或人工登记 | 是否首期接银行流水,是否允许一笔多单核销 | | 发票 | 开票申请、开具、红冲、作废和关联 | 已确认应收/收款 | 税率、含税/未税、开票主体、外部平台 | -| 费用分析 | 历史规划,一期不做 | 应收应付台账 | 不进入一期菜单、路由和验收 | +| 费用分析 | 历史规划,订单与客户不做 | 应收应付台账 | 不进入订单与客户菜单、路由和验收 | | 利润 | 客户/单票/柜次/月度收入、成本、利润率 | 应收收入 + 应付成本 + 分摊 | 汇率、成本分摊、收入成本确认时间 | ### 6.2 分阶段交付顺序 @@ -216,8 +216,8 @@ Firstleg 已有 `fl_inbound_fee_detail`,包含: | F0 财务底座 | 独立 Finance 服务/数据库、财务主体、客户/供应商往来单位、币种、费用科目、期间、权限、审计、幂等、金额精度 | 所有后续对象使用同一基础口径 | 服务边界已技术确认;产品确认主体、币种、权限和编码 | | F1 应收与客户对账 | 应收费用池、平台出账、客户确认、结算单应收、收款登记、核销、反核销 | 费用 → 账单 → 客户确认 → 应收 → 收款 → 结清 | 当前已发布对客费用来源 | | F2 应付与供应商结算 | 成本费用池、供应商账单、结算单应付、付款登记、付款核销、应付调整 | 成本 → 供应商账单 → 应付 → 付款 → 结清 | 供应商主数据和真实成本来源 | -| F3 客户账户与发票 | 一期只做派生客户账户总览;发票暂缓 | 账户只读聚合,不维护资金余额 | 发票不属于一期 | -| F4 分析与利润 | 一期不做 | 不建设菜单、路由或假入口 | 后续重新立项 | +| F3 客户账户与发票 | 订单与客户只做派生客户账户总览;发票暂缓 | 账户只读聚合,不维护资金余额 | 发票不属于订单与客户 | +| F4 分析与利润 | 订单与客户不做 | 不建设菜单、路由或假入口 | 后续重新立项 | 阶段之间可以并行做页面原型和契约设计,但生产数据链路必须按 F0 → F1/F2 → F3 → F4 验收。F4 不能用原型静态数字先行替代真实台账。 @@ -246,9 +246,9 @@ F1 建议页面: 4. 核销记录:每笔收款对应哪些应收、核销金额、剩余余额、反核销历史。 5. 客户侧账单:查看明细、收款与未结余额,并在线确认本人已出账账单;不做在线争议。 -以下历史排除清单已被 2026-08-11 的五页范围取代。结算单应付现在属于一期;其余未确认能力继续排除: +以下历史排除清单已被 2026-08-11 的五页范围取代。结算单应付现在属于订单与客户;其余未确认能力继续排除: -- 供应商在线确认和自动付款(应付结算单与人工付款属于一期); +- 供应商在线确认和自动付款(应付结算单与人工付款属于订单与客户); - 客户预充值、余额冻结和自动扣款; - 发票申请、开票和税务接口; - 多币种折算与汇兑损益; @@ -273,7 +273,7 @@ F1 建议页面: | 编号 | 待确认问题 | 建议默认值 | |---|---|---| -| F1 | 一期领导验收范围 | 固定为客户账户、客户应收应付、客户对账单、结算单应收、结算单应付;费用分析和利润表不做 | +| F1 | 订单与客户领导验收范围 | 固定为客户账户、客户应收应付、客户对账单、结算单应收、结算单应付;费用分析和利润表不做 | | F2 | 账单生成维度 | 客户 + 币种 + 账期;不同币种不合并 | | F3 | 哪些费用可以进入账单 | `APPROVED + PUBLISHED + AVAILABLE + CNY + amount>0` 且未出账;无人工结算开关 | | F4 | 当前已发布头程费用是否自动进入待对账池 | 是,但仍由财务选择并生成账单 | diff --git a/财务管理/openapi/finance-phase1-five-pages-v1.yaml b/财务管理/openapi/finance-core-five-pages-v1.yaml similarity index 99% rename from 财务管理/openapi/finance-phase1-five-pages-v1.yaml rename to 财务管理/openapi/finance-core-five-pages-v1.yaml index 8b1b904..3cb6158 100644 --- a/财务管理/openapi/finance-phase1-five-pages-v1.yaml +++ b/财务管理/openapi/finance-core-five-pages-v1.yaml @@ -3,10 +3,10 @@ info: title: Finance Phase 1 Five-page Acceptance API version: 1.0.0-draft description: >- - 一期领导验收 5 页目标契约:客户账户、客户应收应付、客户对账单、结算单应收、 + 订单与客户领导验收 5 页目标契约:客户账户、客户应收应付、客户对账单、结算单应收、 结算单应付。只支持 CNY。费用分析、利润表、钱包、预收和充值不属于本契约。 - 本文件冻结一期目标契约及后续确认的费用编辑审核、客户确认和应收统计扩展。实现与 - Admin 接入证据单独维护在财务一期P0实现证据矩阵.md,不得因代码文件出现反复修改本契约。 + 本文件冻结订单与客户目标契约及后续确认的费用编辑审核、客户确认和应收统计扩展。实现与 + Admin 接入证据单独维护在财务核心P0实现证据矩阵.md,不得因代码文件出现反复修改本契约。 servers: - url: /api x-product-scope: @@ -46,8 +46,8 @@ x-customer-account-ui-contract: x-phase1-p0-contract: status: FROZEN rule: 所有已列 operation 均为当前目标契约;实现状态不得写入本文件。 - contract: ../财务一期P0操作契约与验收用例.md - evidenceMatrix: ../财务一期P0实现证据矩阵.md + contract: ../财务核心P0操作契约与验收用例.md + evidenceMatrix: ../财务核心P0实现证据矩阵.md x-idempotency-contract: scope: method + normalizedPath + resolvedCustomerId + completeQueryAndBody sameKeySameRequest: replay original result diff --git a/财务管理/财务历史迁移与上线验收方案.md b/财务管理/财务历史迁移与上线验收方案.md index 3b31f1e..de0e365 100644 --- a/财务管理/财务历史迁移与上线验收方案.md +++ b/财务管理/财务历史迁移与上线验收方案.md @@ -12,7 +12,7 @@ 本方案用于把 Finance 上线前已经存在于 Firstleg 的历史对客费用,安全地接入独立 `finance-service` 和 `baiyue_finance`,并定义 F0/F1 从测试、灰度到正式启用的验收门禁。 -本方案不把“费用已发送/已发布”推断为“客户尚欠款”,也不把二期计费状态推断为财务结算状态。历史迁移分成三个明确步骤: +本方案不把“费用已发送/已发布”推断为“客户尚欠款”,也不把入库测量与计费计费状态推断为财务结算状态。历史迁移分成三个明确步骤: ```text Firstleg 历史费用候选集 @@ -71,7 +71,7 @@ Firstleg 历史费用候选集 ### 3.1 候选来源 -首批只处理能够追溯到 Firstleg 已发布对客费用版本的 `RECEIVABLE` 数据。当前二期费用用于证明业务计费结果,不直接证明应收、收款或核销事实。 +首批只处理能够追溯到 Firstleg 已发布对客费用版本的 `RECEIVABLE` 数据。当前入库测量与计费费用用于证明业务计费结果,不直接证明应收、收款或核销事实。 每条候选记录至少应能提供: diff --git a/财务管理/财务开工门禁与F0-F1任务清单.md b/财务管理/财务开工门禁与F0-F1任务清单.md index 6861fa3..fdf41d6 100644 --- a/财务管理/财务开工门禁与F0-F1任务清单.md +++ b/财务管理/财务开工门禁与F0-F1任务清单.md @@ -9,7 +9,7 @@ Finance 的服务拆分、独立数据库、基础表、权限、人工账单/收款/成本接口及 Admin/Client 基础页面已经落地。后端真实体积快照、归属、成本凭证、revision、双权限上传、费用来源事件/Relay/快照、固定 DTO、完整幂等、File fail-closed、客户收款 DTO 和稳定错误码已经完成并通过专项测试;当前继续收口 Admin 最终契约适配和五页剩余 operation。 -F0 的平台主体、首期仅 RMB/CNY、自定义账期、编号、费用冻结、无历史迁移、客户角色和首期简化审批已经确认。一期领导验收固定为 5 页;客户账户为派生财务往来总览,不做钱包/充值,费用分析和利润表不做。详见[财务一期五页产品与接口验收契约](财务一期五页产品与接口验收契约.md)。 +F0 的平台主体、首期仅 RMB/CNY、自定义账期、编号、费用冻结、无历史迁移、客户角色和首期简化审批已经确认。订单与客户领导验收固定为 5 页;客户账户为派生财务往来总览,不做钱包/充值,费用分析和利润表不做。详见[财务核心五页产品与接口验收契约](财务核心五页产品与接口验收契约.md)。 ## 二、文档交付状态 @@ -48,7 +48,7 @@ G0 允许:完善 API/OpenAPI、数据库迁移草案、契约测试样例、 当前按以下冻结口径修复和补测: -- `财务一期P0操作契约与验收用例.md` 中的 11 个 operation 全部为一期 P0;目标契约不跟随开发中间态修改,G1-G4 证据矩阵任一组未同时通过后端行为测试和 Admin 真实接入时均不得关闭; +- `财务核心P0操作契约与验收用例.md` 中的 11 个 operation 全部为订单与客户 P0;目标契约不跟随开发中间态修改,G1-G4 证据矩阵任一组未同时通过后端行为测试和 Admin 真实接入时均不得关闭; - 账单聚合维度(首期固定 RMB/CNY)和账期计算规则冻结; - 平台出账、关闭、重开和线下异议录入状态冻结;客户首期只读; @@ -56,9 +56,9 @@ G0 允许:完善 API/OpenAPI、数据库迁移草案、契约测试样例、 - 预收、多收、手续费、退款、反核销的处理方式冻结; - 至少准备一组真实或脱敏费用来源样本,能够完成费用→账单→应收→收款→核销回归。 -### G3/G4:一期应付与排除项门禁 +### G3/G4:订单与客户应付与排除项门禁 -结算单应付纳入一期,但必须有供应商和真实 PAYABLE 来源。客户账户只做派生查询。发票、费用分析、利润、汇率和月结不属于一期,禁止保留假入口。 +结算单应付纳入订单与客户,但必须有供应商和真实 PAYABLE 来源。客户账户只做派生查询。发票、费用分析、利润、汇率和月结不属于订单与客户,禁止保留假入口。 ## 四、F0/F1 任务清单 @@ -89,7 +89,7 @@ G0 允许:完善 API/OpenAPI、数据库迁移草案、契约测试样例、 ### 本轮不再等待产品确认 -- 一期只支持 CNY,验收 5 页及其真实费用来源、对账、应收/应付和人工收付款链路。 +- 订单与客户只支持 CNY,验收 5 页及其真实费用来源、对账、应收/应付和人工收付款链路。 - 客户账户是派生总览;发票、费用分析、利润、汇率、月结不属于本轮。 - 首发不迁移历史,不阻塞 F1 修复。 diff --git a/财务管理/财务服务边界设计.md b/财务管理/财务服务边界设计.md index b8ff9fa..af7cc34 100644 --- a/财务管理/财务服务边界设计.md +++ b/财务管理/财务服务边界设计.md @@ -1,6 +1,6 @@ # 财务服务边界设计 -> **范围说明**:本文只作为 Finance 独立服务/独立数据库的技术边界依据。文中的钱包、充值、发票、费用分析和利润属于长期模型,不属于一期;一期唯一产品范围以《财务一期五页产品与接口验收契约》为准。 +> **范围说明**:本文只作为 Finance 独立服务/独立数据库的技术边界依据。文中的钱包、充值、发票、费用分析和利润属于长期模型,不属于订单与客户;订单与客户唯一产品范围以《财务核心五页产品与接口验收契约》为准。 > 决策日期:2026-08-10 > 决策状态:技术已确认 diff --git a/财务管理/财务一期P0实现证据矩阵.md b/财务管理/财务核心P0实现证据矩阵.md similarity index 96% rename from 财务管理/财务一期P0实现证据矩阵.md rename to 财务管理/财务核心P0实现证据矩阵.md index a25a6f3..fe5eb34 100644 --- a/财务管理/财务一期P0实现证据矩阵.md +++ b/财务管理/财务核心P0实现证据矩阵.md @@ -1,7 +1,7 @@ -# 财务一期 P0 实现证据矩阵 +# 财务核心 P0 实现证据矩阵 -> 日期:2026-08-11 -> 目标契约:`openapi/finance-phase1-five-pages-v1.yaml`、`财务一期P0操作契约与验收用例.md` +> 日期:2026-08-11 +> 目标契约:`openapi/finance-core-five-pages-v1.yaml`、`财务核心P0操作契约与验收用例.md` > 使用规则:本文件只记录验收证据,不反向修改目标契约;Controller 文件、编译成功或开发中间态均不能单独关闭门禁 ## 1. 状态更新规则 @@ -15,7 +15,7 @@ ## 2. G1-G4 稳定验收表 -| 分组 | 一期 P0 operation | 后端行为测试放行条件 | Admin 真实接入放行条件 | 当前可复核证据 | 结论 | +| 分组 | 订单与客户 P0 operation | 后端行为测试放行条件 | Admin 真实接入放行条件 | 当前可复核证据 | 结论 | |---|---|---|---|---|---| | G1 客户账户 | `listDerivedCustomerAccounts`、`listDerivedCustomerAccountLedger` | 派生金额、分页筛选、日期边界、停用客户历史、跨客户隔离、固定 DTO/追踪字段测试全部通过 | 客户账户列表、筛选、详情入口、流水筛选均调用真实接口;无钱包、充值、预收或余额写入口 | 后端 G1 专项 4/4、Admin G1 专项 15/15、Finance 专项 21/21、Admin typecheck、IAM 166/166、IAM 权限契约 3/3、Finance 权限契约 2/2 通过;统一 SQL 已同步权限目录且未默认授予角色 | `PASS` | | G2 费用来源 | `getFinanceFeeSource`、`reviewFinanceFeeSource`、`updateFeeSourceSettlementInclusion` | 详情、PENDING 审核、非法状态、expectedVersion、占用冻结、完整幂等、跨客户隐藏和 CNY 条件全部通过 | 客户应收应付页详情、审核、参与/禁止结算使用真实接口;权限和服务端错误态可见,不存在假成功 | 后端 G2 专项 9/9、Admin G2 专项 21/21、Admin typecheck/build、IAM 166/166、IAM 权限契约 3/3、Finance 权限契约 2/2 通过;统一 SQL 已同步权限目录且未默认授予角色 | `PASS` | diff --git a/财务管理/财务一期P0操作契约与验收用例.md b/财务管理/财务核心P0操作契约与验收用例.md similarity index 92% rename from 财务管理/财务一期P0操作契约与验收用例.md rename to 财务管理/财务核心P0操作契约与验收用例.md index 52f5f4c..9799635 100644 --- a/财务管理/财务一期P0操作契约与验收用例.md +++ b/财务管理/财务核心P0操作契约与验收用例.md @@ -1,9 +1,9 @@ -# 财务一期 P0 操作契约与验收用例 +# 财务核心 P0 操作契约与验收用例 -> 日期:2026-08-11 -> 适用范围:一期财务闭环及后续确认的费用编辑审核、客户确认操作 -> 状态口径:以下 11 项全部是一期 P0,目标契约已冻结;实现和 Admin 接入证据只维护在 `财务一期P0实现证据矩阵.md` -> 机器契约:`openapi/finance-phase1-five-pages-v1.yaml` +> 日期:2026-08-11 +> 适用范围:订单与客户财务闭环及后续确认的费用编辑审核、客户确认操作 +> 状态口径:以下 11 项全部是订单与客户 P0,目标契约已冻结;实现和 Admin 接入证据只维护在 `财务核心P0实现证据矩阵.md` +> 机器契约:`openapi/finance-core-five-pages-v1.yaml` ## 1. 统一冻结规则 @@ -32,11 +32,11 @@ | P0-10 | `getSettlement` | `SettlementIdPath` | `SettlementDetailEnvelope` | AR/AP view 二选一并与单据方向匹配 | 返回结算单、来源快照、revision 和收付款记录;没有对应方向权限时 HTTP 403。验收 AC-22、AC-23 | | P0-11 | `createSettlementPayment` | `CreateSettlementPaymentRequest` | `SettlementDetailEnvelope` | `platform:finance:payment:create` | 只允许 PAYABLE 的 ISSUED/PARTIALLY_PAID;金额不得超过余额,凭证 File fail-closed;更新为 PARTIALLY_PAID/PAID。验收 AC-24 至 AC-26 | -`createReceiptWithAllocations` 已实现,不计入上述 11 项,但仍属于一期 P0 回归门禁:一笔 300 元收款可人工分配到同一客户 3 张各 100 元应收结算单并共用凭证;跨客户、草稿、超额、非 CNY、无有效凭证必须拒绝。 +`createReceiptWithAllocations` 已实现,不计入上述 11 项,但仍属于订单与客户 P0 回归门禁:一笔 300 元收款可人工分配到同一客户 3 张各 100 元应收结算单并共用凭证;跨客户、草稿、超额、非 CNY、无有效凭证必须拒绝。 ### 2.1 契约与证据分离 -本文件不记录 Controller、编译和测试中间态,也不使用 `NOT_IMPLEMENTED/IN_PROGRESS/IMPLEMENTED` 标记。G1-G4 后端行为测试和 Admin 真实接入证据统一见 `财务一期P0实现证据矩阵.md`;开发过程不得反向修改本文件冻结的路径、DTO、状态机和验收标准。 +本文件不记录 Controller、编译和测试中间态,也不使用 `NOT_IMPLEMENTED/IN_PROGRESS/IMPLEMENTED` 标记。G1-G4 后端行为测试和 Admin 真实接入证据统一见 `财务核心P0实现证据矩阵.md`;开发过程不得反向修改本文件冻结的路径、DTO、状态机和验收标准。 ## 3. 状态机 @@ -80,7 +80,7 @@ ISSUED --VOID--> VOIDED(已收付金额=0) VOIDED --REOPEN--> ISSUED(新 revision) ``` -一期不处理预收、多收、退款、手续费、自动银行对账或汇率折算。人工收付款只能分配到同客户、同方向、CNY 且已出账的结算单。 +订单与客户不处理预收、多收、退款、手续费、自动银行对账或汇率折算。人工收付款只能分配到同客户、同方向、CNY 且已出账的结算单。 ## 4. 请求字段条件 diff --git a/财务管理/财务一期五页产品与接口验收契约.md b/财务管理/财务核心五页产品与接口验收契约.md similarity index 92% rename from 财务管理/财务一期五页产品与接口验收契约.md rename to 财务管理/财务核心五页产品与接口验收契约.md index e3fe813..abde133 100644 --- a/财务管理/财务一期五页产品与接口验收契约.md +++ b/财务管理/财务核心五页产品与接口验收契约.md @@ -1,16 +1,16 @@ -# 财务一期五页产品与接口验收契约 +# 财务核心五页产品与接口验收契约 -> 日期:2026-08-11 -> 状态:产品范围已确认;一期 11 个 P0 operation 的目标契约已冻结;实现与 Admin 接入只按独立 G1-G4 证据矩阵验收,当前未放行 -> 领导验收范围:客户账户、客户应收应付、客户对账单、结算单应收、结算单应付 +> 日期:2026-08-11 +> 状态:产品范围已确认;订单与客户 11 个 P0 operation 的目标契约已冻结;实现与 Admin 接入只按独立 G1-G4 证据矩阵验收,当前未放行 +> 领导验收范围:客户账户、客户应收应付、客户对账单、结算单应收、结算单应付 > 原型依据:`docs/悦/货代SAAS平台后台/货代SaaS平台原型.html` -> 目标 OpenAPI:`openapi/finance-phase1-five-pages-v1.yaml`;当前人工接口继续参考 `openapi/finance-f1-manual-v1.yaml`。 -> 11 个 P0 操作的 DTO、状态机、权限、幂等、错误码、隔离和验收用例以 `财务一期P0操作契约与验收用例.md` 为准;实现证据只维护在 `财务一期P0实现证据矩阵.md`。 +> 目标 OpenAPI:`openapi/finance-core-five-pages-v1.yaml`;当前人工接口继续参考 `openapi/finance-f1-manual-v1.yaml`。 +> 11 个 P0 操作的 DTO、状态机、权限、幂等、错误码、隔离和验收用例以 `财务核心P0操作契约与验收用例.md` 为准;实现证据只维护在 `财务核心P0实现证据矩阵.md`。 -## 1. 一期范围结论 +## 1. 订单与客户范围结论 -一期只交付原型中的以下 5 页,并实现页面结构、字段、筛选、详情和状态: +订单与客户只交付原型中的以下 5 页,并实现页面结构、字段、筛选、详情和状态: 1. 客户账户。 2. 客户应收应付。 @@ -20,7 +20,7 @@ 明确不做:费用分析、利润表、钱包、预收、手动充值、自动扣款余额、汇率、外币、发票、月结、银行自动对账。未实现能力不得保留按钮、菜单、路由或模拟成功入口。 -所有金额只使用 CNY。原型中的 USD、汇率、开票日期、利润审批、利润金额仅为历史原型字段,一期删除。 +所有金额只使用 CNY。原型中的 USD、汇率、开票日期、利润审批、利润金额仅为历史原型字段,订单与客户删除。 客户对账单、应收结算单、应付结算单统一使用短业务编号:`REC-YYMMDD-NNNN`、`AR-YYMMDD-NNNN`、`AP-YYMMDD-NNNN`。日期按北京时间的单据创建日计算,各单据类型分别按日从 `0001` 递增;编号生成后不可修改,作废也不回收。 @@ -45,7 +45,7 @@ ## 3. 五页验收矩阵 -| 页面 | 原型结构和筛选 | 一期字段 | 一期操作 | 状态与验收 | +| 页面 | 原型结构和筛选 | 订单与客户字段 | 订单与客户操作 | 状态与验收 | |---|---|---|---|---| | 客户账户 | 汇总卡、客户列表、账户详情、流水详情;客户名称/编号、账户状态、余额条件、流水类型和日期 | 客户基本信息、客户编号、联系人、电话、未收余额、待出账金额、本期已收金额、总成本、已付成本、待付金额、账户状态、最后变动时间;流水号、时间、业务类型、关联单据、应收/应付变动、变动后未收余额、操作人、备注 | 详情、查询、重置、导出;**无充值、扣款或余额调整** | 运营资金只认三类:待收客户款=正式 AR outstanding,不叠加待出账;待付供应商款=AP outstanding+未制单有效 ON_ACCOUNT 来源并按来源去重;已线下支付供应商款=AP paid+有效 DIRECT_PAID,明细区分账期付款和现场已付。不存在客户线下支付分类,也不新增已收客户款卡片 | | 客户应收应付 | 工具栏、组合查询、选中汇总、费用列表、费用详情、审核进度、关联业务、操作记录 | 客户、费用单号、是否已生成对账单、审核状态、应收/应付、结算方式、已付时间/方式/凭证、入仓码/柜次号、业务状态、费用类型、金额、业务发生日、来源类型、来源版本 | 详情、编辑草稿/驳回项、提交审核、审核通过/拒绝、调整、作废、按截止时间或勾选生成;不提供“是否结算”开关 | PAYABLE 必须区分 ON_ACCOUNT/DIRECT_PAID;前者可进入 AP,后者只计成本且排除 AP;同一来源版本只能识别一次成本 | @@ -57,7 +57,7 @@ ### 3.1 五页现状/目标差异 -| 页面 | 当前仓库事实 | 一期目标 | 差异等级 | +| 页面 | 当前仓库事实 | 订单与客户目标 | 差异等级 | |---|---|---|---| | 客户账户 | 后端已新增 `/customer-accounts/{customerId}` 和固定读 DTO;无列表接口 | 派生财务往来汇总、详情和流水,无任何充值/余额写入口 | IMPLEMENTED(单客户查询);列表/筛选仍缺,Finance DTO 测试通过 | | 客户应收应付 | `/fee-sources` 固定 DTO、Firstleg 事件/快照和 `fin_fee_source` 写入均已实现 | 真实入库/柜子费用来源池,支持编辑、提交、审核、调整、作废、详情和生成对账单 | 审核通过自动成为结算候选,不提供人工结算开关 | @@ -96,7 +96,7 @@ flowchart LR 当前柜子费用来源表/实体、Controller、审核/调整/作废服务、自动发布事件、Relay 和内部快照已经实现。Firstleg 的真实柜次体积快照同时服务 Finance 整柜成本分摊,但仍不能由 Admin 手工提交的订单归属或体积替代。 -一期至少需要业务侧模型: +订单与客户至少需要业务侧模型: - `containerFeeId/version`、`containerId/containerNo`、费用方向、费用项目、业务日、CNY 金额。 - 应付来源必须有供应商;应收来源必须有客户分摊结果。 @@ -151,11 +151,11 @@ Finance 必须通过 Inbox 幂等消费来源版本,或通过受保护的快 ## 7. 专项优先级 -### P0:一期验收硬阻断 +### P0:订单与客户验收硬阻断 1. 财务 operation 全部通过直接行为测试:账户列表/流水;费用来源详情及编辑审核闭环;对账单生成、审核、出账、客户确认、调整/作废;应收/应付结算单生成与详情;人工收付款登记。人工收款继续覆盖 300 元分配 3 张 100 元应收单等回归。 2. 对账单、应收/应付结算单、付款和 revision 所需数据模型与唯一约束同步落地,不能只做空 Controller。 -3. 详细冻结契约见 `财务一期P0操作契约与验收用例.md`;不得把其中任何一项标为 P1、后续优化或假入口。 +3. 详细冻结契约见 `财务核心P0操作契约与验收用例.md`;不得把其中任何一项标为 P1、后续优化或假入口。 ### P1:领导验收前必须完成 diff --git a/财务管理/财务管理产品确认版差异与剩余待确认.md b/财务管理/财务管理产品确认版差异与剩余待确认.md index 4e18fd8..67cb72d 100644 --- a/财务管理/财务管理产品确认版差异与剩余待确认.md +++ b/财务管理/财务管理产品确认版差异与剩余待确认.md @@ -4,7 +4,7 @@ > 复核日期:2026-08-10 > 用途:把产品回填内容转成可开发口径;不替代产品原始回传表。 -> **降级说明(2026-08-11)**:本文保留首次回填复核过程,不再作为一期范围入口。当前范围和冲突处理以《财务一期五页产品与接口验收契约》为准;原文中的“仍待确认”“F3 整体暂缓”“成本/利润统计”均不得覆盖已确认的五页范围。 +> **降级说明(2026-08-11)**:本文保留首次回填复核过程,不再作为订单与客户范围入口。当前范围和冲突处理以《财务核心五页产品与接口验收契约》为准;原文中的“仍待确认”“F3 整体暂缓”“成本/利润统计”均不得覆盖已确认的五页范围。 ## 一、回传表复核结论 @@ -12,7 +12,7 @@ 其中,以下内容可直接纳入正式文档: -- 一期页面固定为客户账户、客户应收应付、客户对账单、结算单应收、结算单应付;客户账户只是派生财务往来总览,不做钱包/预收;发票和外部接口不做。 +- 订单与客户页面固定为客户账户、客户应收应付、客户对账单、结算单应收、结算单应付;客户账户只是派生财务往来总览,不做钱包/预收;发票和外部接口不做。 - 供应商付款为线下付款并上传凭证;单票成本直接归属单票,整柜清关、拖车等公共成本按柜内体积分摊。 - 首期账单只支持 RMB/CNY;每个客户维护自己的账期配置,默认 30 天。 - 收款全部由财务人工填写表单并上传收款图片;一笔 300 元可由财务分别填入 3 张 100 元账单,关联同一张凭证。 @@ -36,17 +36,17 @@ | 事项 | 暂缓口径 | |---|---| -| F2-01、F2-03、F2-04 | 供应商在线确认、自动付款等能力暂缓;一期仍须交付结算单应付页、真实 PAYABLE 来源和人工付款凭证链路 | -| F3-01 至 F3-04 | 一期建设客户账户派生总览页,但不建设钱包余额、充值、冻结、自动扣款或退款对象 | +| F2-01、F2-03、F2-04 | 供应商在线确认、自动付款等能力暂缓;订单与客户仍须交付结算单应付页、真实 PAYABLE 来源和人工付款凭证链路 | +| F3-01 至 F3-04 | 订单与客户建设客户账户派生总览页,但不建设钱包余额、充值、冻结、自动扣款或退款对象 | | F3-05 至 F3-07 | 发票和外部开票/银行接口首期线下处理;只保留未来扩展位 | -| F4-04 | 费用分析和利润表一期不进菜单/路由;后续重新立项时再定义权限 | +| F4-04 | 费用分析和利润表订单与客户不进菜单/路由;后续重新立项时再定义权限 | ## 四、当前放行判断 - F0 技术方案和客户主体/成员边界已经冻结,可以继续做 Finance 服务骨架、数据库迁移草案、事件契约和权限矩阵设计。 - F1 客户应收的核心产品口径已补齐;账期日期算法、账单单据粒度和收款字段可按本文默认值直接写入契约。 - F2/F4 的产品口径已补齐;开发前只需把人工成本/收款表单字段、凭证关联和体积分摊公式写入接口与验收契约。 -- F3 钱包/充值/发票能力可暂缓;客户账户派生总览属于一期五页,不得整体暂缓。 +- F3 钱包/充值/发票能力可暂缓;客户账户派生总览属于订单与客户五页,不得整体暂缓。 因此,本轮已没有新的核心产品问题;剩余工作是把确认版 XLSX 的状态归一化,并在接口/验收契约中补充账期日期算法、收款表单字段、收款凭证与账单分配关系、成本来源字段和体积分摊公式。 diff --git a/财务管理/财务管理产品确认表.md b/财务管理/财务管理产品确认表.md index b6e4f9f..fa6685c 100644 --- a/财务管理/财务管理产品确认表.md +++ b/财务管理/财务管理产品确认表.md @@ -1,15 +1,15 @@ # 财务管理产品确认表 -> 版本:V1.1 -> 创建日期:2026-08-10 -> 状态:一期 5 页范围已确认 +> 版本:V1.1 +> 创建日期:2026-08-10 +> 状态:订单与客户 5 页范围已确认 > 适用范围:客户账户、客户应收应付、客户对账单、结算单应收、结算单应付 > 技术方案说明:服务边界、跨服务访问、事件幂等、金额存储、状态留痕和正式模块发布方式已按当前仓库架构直接确认,不再要求产品确认;以 XLSX 的“技术结论”工作表为准。 正式技术决策见:[财务服务边界设计](财务服务边界设计.md)。 -一期领导验收及接口事实以[财务一期五页产品与接口验收契约](财务一期五页产品与接口验收契约.md)为准;本文后续 F2-F4 历史问题不自动进入一期。 +订单与客户领导验收及接口事实以[财务核心五页产品与接口验收契约](财务核心五页产品与接口验收契约.md)为准;本文后续 F2-F4 历史问题不自动进入订单与客户。 产品回传版 XLSX 的逐项复核和剩余确认门禁见:[财务管理产品确认版差异与剩余待确认](财务管理产品确认版差异与剩余待确认.md)。 @@ -44,7 +44,7 @@ | 实施复杂度 | 首期全部由平台财务人工填写账单、收款和成本表单并上传凭证;不建设自动银行对账、自动核销、复杂审批、钱包、发票或总账 | | 审批复杂度 | 首期不做强制双人复核和金额分级审批;保留独立权限、操作原因和完整审计 | | 成员停用 | 客户子用户停用只撤销访问权限;客户账单、应收、余额等仍归客户企业,不触发财务单据转交;历史保留操作人快照 | -| 一期页面 | 只做客户账户、客户应收应付、客户对账单、结算单应收、结算单应付;费用分析和利润表不进菜单/路由 | +| 订单与客户页面 | 只做客户账户、客户应收应付、客户对账单、结算单应收、结算单应付;费用分析和利润表不进菜单/路由 | | 客户账户性质 | 财务往来派生总览,不是钱包;删除手动充值、预收、可消费余额和自动扣款入口 | | 费用来源链路 | 入库单费用和柜子费用审核通过后自动发布到 Finance 来源池并成为结算候选;不保留人工“是否结算”标记 | @@ -53,13 +53,13 @@ | 编号 | 范围 | 建议结论 | 最终结论 | 状态 | |---|---|---|---|---| | S1 | 客户账户 | 做预充值、冻结、解冻、扣款、退款和账户流水;账户余额与应收核销分开,任何抵扣都产生核销记录 | 只做账单、收款和应收应付来源派生的财务往来总览;不做钱包、预收、充值和自动扣款 | 已确认 | -| S2 | 客户应收 | 做客户费用池、对账单、应收单、到期/逾期、收款、部分核销、结清、反核销 | 纳入一期 5 页;平台财务操作,客户只读 | 已确认 | +| S2 | 客户应收 | 做客户费用池、对账单、应收单、到期/逾期、收款、部分核销、结清、反核销 | 纳入订单与客户 5 页;平台财务操作,客户只读 | 已确认 | | S3 | 客户应付 | 仅在确有平台向客户付款的业务场景时启用;否则不开放菜单和数据方向 | 客户应收应付页按来源方向展示;没有真实 PAYABLE 来源时为空,不造模拟数据 | 已确认 | | S4 | 客户对账单 | 按客户 + 币种 + 账期生成,支持平台内部复核、发送、关闭和财务重开;客户只读查看 | 平台财务出账,客户只读,异议线下反馈 | 已确认 | -| S5 | 供应商应付 | 做供应商成本池、供应商对账、应付单、付款、付款核销和反核销 | 结算单应付纳入一期;只使用具有供应商和真实来源的 CNY 应付费用,付款人工登记 | 已确认 | -| S6 | 发票 | 做发票申请、开票登记、票号/文件关联、红冲和作废;不直接假定外部开票平台 | 一期不做,不设计菜单、路由或按钮 | 已确认 | -| S7 | 费用分析 | 按费用项目、客户、供应商、期间统计发生额、已结算额和余额,支持钻取来源单据 | 一期不做,不进菜单/路由 | 已确认 | -| S8 | 利润 | 支持客户、货柜、单票、月份维度;收入、成本、分摊、汇率和利润率必须可追溯 | 一期不做,不进菜单/路由;应付页删除利润字段和利润审批 | 已确认 | +| S5 | 供应商应付 | 做供应商成本池、供应商对账、应付单、付款、付款核销和反核销 | 结算单应付纳入订单与客户;只使用具有供应商和真实来源的 CNY 应付费用,付款人工登记 | 已确认 | +| S6 | 发票 | 做发票申请、开票登记、票号/文件关联、红冲和作废;不直接假定外部开票平台 | 订单与客户不做,不设计菜单、路由或按钮 | 已确认 | +| S7 | 费用分析 | 按费用项目、客户、供应商、期间统计发生额、已结算额和余额,支持钻取来源单据 | 订单与客户不做,不进菜单/路由 | 已确认 | +| S8 | 利润 | 支持客户、货柜、单票、月份维度;收入、成本、分摊、汇率和利润率必须可追溯 | 订单与客户不做,不进菜单/路由;应付页删除利润字段和利润审批 | 已确认 | ## 三、F0 财务底座确认 @@ -104,7 +104,7 @@ | F1-07 | 核销关系 | 支持一笔收款核销多张应收、一张应收被多笔收款核销;禁止跨币种和超额 | 一笔客户付款可分配到多张账单;财务分别填写各账单对应金额并关联同一收款凭证;首期不处理预收、多收、手续费、退款 | 已确认 | | F1-08 | 反核销/作废 | 独立高风险权限,填写原因并保留原记录;不物理删除 | 首期不做复杂反核销;未收单据可作废,已出账调整/作废重开必须留原因、版本和原记录 | 已确认 | | F1-09 | 出账后调整 | 已出账冻结;平台财务通过调整/作废重开形成新版本,保留原金额和原因 | 仅平台财务手工调整,不允许客户修改 | 已确认 | -| F1-10 | 预收/多收/手续费/退款 | 单独建模为预收、其他应付款或退款,不直接冲减应收金额 | 一期全部不做;不设计钱包或预收入口 | 已确认 | +| F1-10 | 预收/多收/手续费/退款 | 单独建模为预收、其他应付款或退款,不直接冲减应收金额 | 订单与客户全部不做;不设计钱包或预收入口 | 已确认 | | F1-11 | 应收款统计表 | 按结算单生成自然月和客户汇总 CNY 正式应收 | 展示应收总额、已收合计、余额未收,支持打印和异步 Excel;不做 FBA 渠道拆分、USD、编辑或零头减免 | 已确认 | ## 五、F2 供应商应付与结算确认 @@ -113,11 +113,11 @@ |---|---|---|---|---| | F2-01 | 成本来源 | 只有具备 Warehouse 供应商、真实业务来源、审核和 CNY 正金额的 PAYABLE 来源才能进入应付池 | 供应商必须为 `ACTIVE`,名称只取 Warehouse 快照;费用项目 `supplierCategory` 为空时允许任意启用供应商,非空时严格匹配类别 | 已确认 | | F2-02 | 成本确认节点 | 费用审核通过后自动发布并进入 Finance 结算候选,确认后冻结成本快照 | 不保留“参与结算”开关;来源版本冻结 | 已确认 | -| F2-03 | 供应商账单 | DRAFT → INTERNAL_REVIEW → SENT → CONFIRMED → CLOSED;差异走争议/补差/冲销 | 一期不单独做供应商对账页,直接在结算单应付中生成、审核和付款 | 已确认 | +| F2-03 | 供应商账单 | DRAFT → INTERNAL_REVIEW → SENT → CONFIRMED → CLOSED;差异走争议/补差/冲销 | 订单与客户不单独做供应商对账页,直接在结算单应付中生成、审核和付款 | 已确认 | | F2-04 | 应付状态 | OPEN → PARTIALLY_PAID → PAID;到期增加 OVERDUE 标记 | DRAFT → PENDING_REVIEW → ISSUED → PARTIALLY_PAID → PAID;可拒绝/作废并留痕 | 已确认 | | F2-05 | 付款与核销 | 付款单独登记,支持多对多付款核销;禁止跨币种和超额 | 平台财务人工登记付款表单和凭证;不得跨供应商或超额 | 已确认 | -| F2-06 | 审批 | 应付确认和付款前复核使用独立权限;是否需要金额分级审批待确认 | 使用独立审核权限;一期不做金额分级或强制双人 | 已确认 | -| F2-07 | 预付/押金/代付/退款 | 不混入普通应付余额,单独建模并保留关联单据 | 一期不做 | 已确认 | +| F2-06 | 审批 | 应付确认和付款前复核使用独立权限;是否需要金额分级审批待确认 | 使用独立审核权限;订单与客户不做金额分级或强制双人 | 已确认 | +| F2-07 | 预付/押金/代付/退款 | 不混入普通应付余额,单独建模并保留关联单据 | 订单与客户不做 | 已确认 | | F2-08 | 当前人工 PAYABLE 明细 | 仅作为待补充来源,不得直接视为供应商应付闭环 | 没有供应商、审核和发布事实的明细不得进入结算单应付 | 已确认 | | F2-09 | 账期应付与已付成本 | 费用方向只表示收付对象,支付时点另建字段 | `direction` 保持 `RECEIVABLE/PAYABLE`;PAYABLE 必填 `settlementMode=ON_ACCOUNT/DIRECT_PAID`。ON_ACCOUNT 进入 AP,DIRECT_PAID 只计成本且永不进入 AP 或待付金额 | 已确认 | | F2-10 | 已付成本凭证 | 已付事实必须具备时间、方式和可追溯证据 | DIRECT_PAID 必填 `paidAt`、`paymentMethod`;方式限 `ONLINE/BANK_TRANSFER/CASH/OTHER`,`paymentReferenceNo` 与付款凭证至少一项 | 已确认 | @@ -131,7 +131,7 @@ | F3-01 | 账户余额性质 | 明确是客户预付款余额还是平台内部授信;充值必须有到账凭证,余额变更原子落流水 | 不是资金余额;客户账户页只展示账单、收款和费用来源派生指标 | 已确认 | | F3-02 | 账户与应收关系 | 账户扣款可以核销应收,但不得直接修改应收原金额;余额、扣款、核销三条记录均保留 | 不做账户扣款;收款只通过结算单分配更新未收余额 | 已确认 | | F3-03 | 冻结与解冻 | 明确冻结触发、解冻人、原因、部分冻结和失败补偿 | 不做钱包冻结/解冻;待出账金额由合格未出账来源派生 | 已确认 | -| F3-04 | 退款 | 退款必须关联原充值/收款,记录审批、到账方式、退款凭证和余额恢复规则 | 一期不做充值和退款 | 已确认 | +| F3-04 | 退款 | 退款必须关联原充值/收款,记录审批、到账方式、退款凭证和余额恢复规则 | 订单与客户不做充值和退款 | 已确认 | | F3-05 | 发票主体 | 明确开票主体、税率、含税/未税、发票类型和客户抬头校验 | 待填写 | 待确认 | | F3-06 | 开票流程 | 申请 → 审核 → 开票登记 → 票据/文件关联;红冲、作废不可删除原票 | 待填写 | 待确认 | | F3-07 | 外部平台 | 首版可人工登记,外部开票平台和银行流水接口另定接入契约 | 待填写 | 待确认 | @@ -140,13 +140,13 @@ | 编号 | 需要确认的事项 | 建议结论 | 最终结论 | 状态 | |---|---|---|---|---| -| F4-01 | 收入口径 | 按已确认/已发布应收还是已收款确认收入,二者报表分开显示 | 费用分析/利润表一期不做 | 已确认 | -| F4-02 | 成本口径 | 按已确认应付还是已付款确认成本,二者报表分开显示 | 费用分析/利润表一期不做;来源成本仍用于应付结算 | 已确认 | -| F4-03 | 分摊维度 | 支持客户、订单、单票、柜次、费用项目;明确公共成本分摊算法 | 一期只为来源和结算保留真实分摊,不开发利润分析页面 | 已确认 | -| F4-04 | 汇率 | 明确交易日、账单日或月末汇率,以及本位币和汇兑损益 | 一期只支持 CNY,不做汇率 | 已确认 | -| F4-05 | 期间锁定 | 月结后报表冻结;调整通过新期间补差/冲销反映 | 一期不做月结 | 已确认 | -| F4-06 | 利润维度 | 客户、货柜、单票、月份均支持;每个结果可钻取到收入、成本、分摊和原始单据 | 一期不做利润表 | 已确认 | -| F4-07 | 导出与权限 | 导出按财务数据权限控制,客户不可见供应商成本和内部利润 | 一期无利润菜单、路由或权限 | 已确认 | +| F4-01 | 收入口径 | 按已确认/已发布应收还是已收款确认收入,二者报表分开显示 | 费用分析/利润表订单与客户不做 | 已确认 | +| F4-02 | 成本口径 | 按已确认应付还是已付款确认成本,二者报表分开显示 | 费用分析/利润表订单与客户不做;来源成本仍用于应付结算 | 已确认 | +| F4-03 | 分摊维度 | 支持客户、订单、单票、柜次、费用项目;明确公共成本分摊算法 | 订单与客户只为来源和结算保留真实分摊,不开发利润分析页面 | 已确认 | +| F4-04 | 汇率 | 明确交易日、账单日或月末汇率,以及本位币和汇兑损益 | 订单与客户只支持 CNY,不做汇率 | 已确认 | +| F4-05 | 期间锁定 | 月结后报表冻结;调整通过新期间补差/冲销反映 | 订单与客户不做月结 | 已确认 | +| F4-06 | 利润维度 | 客户、货柜、单票、月份均支持;每个结果可钻取到收入、成本、分摊和原始单据 | 订单与客户不做利润表 | 已确认 | +| F4-07 | 导出与权限 | 导出按财务数据权限控制,客户不可见供应商成本和内部利润 | 订单与客户无利润菜单、路由或权限 | 已确认 | ## 八、全量验收主链路 diff --git a/财务管理/财务领域模型与数据字典.md b/财务管理/财务领域模型与数据字典.md index 9233ba7..350000e 100644 --- a/财务管理/财务领域模型与数据字典.md +++ b/财务管理/财务领域模型与数据字典.md @@ -1,11 +1,11 @@ # 财务领域模型与数据字典(F0/F1 首版) -> **范围说明**:本文包含长期数据模型候选。钱包、充值、发票、费用分析和利润表不属于一期,不得据此建菜单、路由或接口;一期数据模型以《财务一期五页产品与接口验收契约》为准。 +> **范围说明**:本文包含长期数据模型候选。钱包、充值、发票、费用分析和利润表不属于订单与客户,不得据此建菜单、路由或接口;订单与客户数据模型以《财务核心五页产品与接口验收契约》为准。 > 版本:V0.1(开发前设计稿) > 日期:2026-08-10 > 范围:F0 财务底座、F1 客户应收与对账;F2-F4 预留 -> 关联:[财务服务边界设计](财务服务边界设计.md)、[财务管理产品确认表](财务管理产品确认表.md)、[二期费用项目数据归属决策记录](../二期/二期费用项目数据归属决策记录.md) +> 关联:[财务服务边界设计](财务服务边界设计.md)、[财务管理产品确认表](财务管理产品确认表.md)、[入库测量与计费费用项目数据归属决策记录](../入库测量与计费/入库测量与计费费用项目数据归属决策记录.md) ## 1. 阅读和决策标记 diff --git a/财务管理/财务领域模型与跨服务契约.md b/财务管理/财务领域模型与跨服务契约.md index 74ee769..8000e14 100644 --- a/财务管理/财务领域模型与跨服务契约.md +++ b/财务管理/财务领域模型与跨服务契约.md @@ -1,6 +1,6 @@ # 财务领域模型与跨服务契约(历史合并稿) -> **历史文档,非一期实施依据**:本合并稿已被《财务领域模型与数据字典》《Firstleg-Finance 跨服务契约》和《财务一期五页产品与接口验收契约》替代。钱包、充值、发票、费用分析和利润模型不属于一期。 +> **历史文档,非订单与客户实施依据**:本合并稿已被《财务领域模型与数据字典》《Firstleg-Finance 跨服务契约》和《财务核心五页产品与接口验收契约》替代。钱包、充值、发票、费用分析和利润模型不属于订单与客户。 > 文档状态:已被拆分替代,仅保留历史设计过程,不作为后续实施依据 > 替代文档:[财务领域模型与数据字典](财务领域模型与数据字典.md)、[Firstleg-Finance 跨服务契约](Firstleg-Finance跨服务契约.md)