Compare commits

74 Commits
Author SHA1 Message Date
ouyangxq 249276debf 优化 2026-11-04 18:08:25 +08:00
ouyangxq f3b4e914f9 记录财务与采购运输修复续批测试发布 2026-10-30 19:02:21 +08:00
ouyangxq 57bf848432 记录10月30日测试环境发布与核验结果 2026-10-30 16:00:01 +08:00
ouyangxq 38a136e509 补充客户端新增页和海外PDA界面规范 2026-10-30 15:42:39 +08:00
ouyangxq 3ff7841a89 统一客户端新增页布局与字段校验设计规范 2026-10-29 14:16:02 +08:00
ouyangxq d7f5d02ac1 记录海外PDA托盘异步校验修复测试H5发布 2026-10-28 17:39:55 +08:00
ouyangxq b17f4592bc 记录履约界面和船节点署名测试环境发布 2026-10-28 17:03:46 +08:00
ouyangxq e33825c161 记录采购出库提示及费用重试列测试环境核验 2026-10-28 14:16:37 +08:00
ouyangxq e4c6712634 记录预约与客户工作台续批测试发布及费用菜单修复 2026-10-28 12:07:10 +08:00
ouyangxq d584217da5 记录后台统一布局与已完成修复的测试环境发布 2026-10-28 11:14:01 +08:00
ouyangxq ed07692a16 docs: 记录船期顺延真实 HTTP 验收结果 2026-10-27 17:26:11 +08:00
ouyangxq b59ad09423 docs: 记录船期日历测试发布与接口验收结果 2026-10-27 17:15:35 +08:00
ouyangxq b0d249973a docs: 明确船期日历顺延和订柜统计口径 2026-10-27 16:56:21 +08:00
ouyangxq f5a8fe5f78 docs(admin): clarify finance cards and detail spacing 2026-10-27 16:55:36 +08:00
ouyangxq 32af159987 docs: record finance reopen and lifecycle TEST acceptance 2026-10-27 15:39:48 +08:00
ouyangxq b1baceaa08 docs: record tested finance and admin deployment 2026-10-27 12:18:47 +08:00
ouyangxq e50cf9e5e6 优化 2026-10-27 12:09:18 +08:00
ouyangxq 806641c579 优化 2026-10-26 18:52:09 +08:00
ouyangxq 1a92bba2d5 优化 2026-10-26 17:27:38 +08:00
ouyangxq 517efab68c 优化 2026-10-26 13:58:45 +08:00
ouyangxq 75461279d8 docs(deploy): record evening test release and PDA static hosting 2026-10-23 20:03:13 +08:00
ouyangxq 10864cdb92 docs(lastleg): define sequenced outbound task identifiers 2026-10-23 18:45:49 +08:00
ouyangxq 2e40d91391 docs(deploy): require static PDA H5 hosting in test and gray 2026-10-23 15:25:46 +08:00
ouyangxq 51b72e8e57 docs(deploy): record gray release and postrelease acceptance 2026-10-23 14:25:39 +08:00
ouyangxq 8dc95856f5 docs(deploy): record verified dispatch publication TEST release 2026-10-23 13:23:38 +08:00
ouyangxq e4c728ff12 docs(dispatch): restrict demand publication to smart dispatch 2026-10-23 12:42:23 +08:00
ouyangxq 31b63e28a6 优化 2026-10-23 12:06:41 +08:00
ouyangxq 8201fe6ee9 docs: record TEST booking and measurement deployment 2026-10-23 11:04:42 +08:00
ouyangxq 1b0f16de1e docs: update booking workflow and TEST verification records 2026-10-23 10:56:39 +08:00
ouyangxq 519f141406 docs: verify review index widths after final release 2026-10-23 03:24:30 +08:00
ouyangxq 5672f446fb docs: close eighteen-item test release acceptance 2026-10-23 03:17:12 +08:00
ouyangxq 65dd56b543 docs: record final four-app recovery and feedback acceptance 2026-10-23 03:15:44 +08:00
ouyangxq eb265e1a93 docs: record PDA runtime fix and live dispatch verification 2026-10-23 01:55:31 +08:00
ouyangxq cbd757d1cf docs: record dispatch UI checks and pending driver preview release 2026-10-23 01:16:13 +08:00
ouyangxq 514ad62f83 docs: record release18 HTTP and partial browser acceptance 2026-10-23 00:21:29 +08:00
ouyangxq ff86bc0d46 docs: record October 22 repair scope and authorized TEST release 2026-10-22 23:15:32 +08:00
ouyangxq 2e98b7224d 优化 2026-10-22 14:38:03 +08:00
ouyangxq 9dcc1045e8 记录入库计划到仓取值修复与测试环境发布 2026-10-22 14:13:09 +08:00
ouyangxq c8099930bb 优化 2026-10-22 11:56:50 +08:00
ouyangxq 8ebea7c4cb 优化 2026-10-21 21:30:28 +08:00
ouyangxq 5273422937 docs(deploy): 记录散板需求新数据源和装车确认发布结果 2026-10-21 19:03:03 +08:00
ouyangxq 94faf0f017 docs(dispatch): 明确排车发布余位与直接装车确认规则 2026-10-21 18:50:57 +08:00
ouyangxq b781548e8c docs: 收敛散板需求旧车次入口并记录TEST发布 2026-10-21 18:18:02 +08:00
ouyangxq 9bcc71d6a3 docs: 保留其他任务发布记录的原未提交状态 2026-10-21 18:11:19 +08:00
ouyangxq b818c26e29 docs: 记录散板需求只读余位池TEST发布 2026-10-21 18:10:31 +08:00
ouyangxq e112805290 优化 2026-10-21 18:04:58 +08:00
ouyangxq de1df1b56c 优化 2026-10-21 17:57:17 +08:00
ouyangxq 06bbb88f5b 优化 2026-10-21 17:26:45 +08:00
ouyangxq 33d3a76f54 优化 2026-10-21 17:22:22 +08:00
ouyangxq 00bce8f4ba 优化 2026-10-21 17:08:56 +08:00
ouyangxq 681a85e66b 优化 2026-10-21 16:58:34 +08:00
ouyangxq 846d1ffcba 优化 2026-10-21 16:40:14 +08:00
ouyangxq 5aed9d0af0 优化 2026-10-21 15:53:29 +08:00
ouyangxq fc711c5471 优化 2026-10-21 15:10:48 +08:00
ouyangxq be51f03c6c 优化 2026-10-21 14:30:36 +08:00
ouyangxq 1fb613c8bd 优化 2026-10-21 13:22:39 +08:00
ouyangxq 5706c3483f docs(calendar): clarify container search and local dispatch dates 2026-10-21 11:44:02 +08:00
ouyangxq 64eeae4b82 优化 2026-10-21 08:03:08 +08:00
ouyangxq 7be5900f0c 优化 2026-10-21 08:00:56 +08:00
ouyangxq 1350ca6508 优化 2026-10-21 07:53:36 +08:00
ouyangxq 7fcf7c2fce 优化 2026-10-21 07:37:26 +08:00
ouyangxq 626f9b19c3 1 2026-10-21 07:10:19 +08:00
ouyangxq 5687eda629 优化 2026-10-20 23:49:58 +08:00
ouyangxq f7599dbcb9 优化 2026-10-20 23:35:46 +08:00
ouyangxq f2fb9ff669 docs: record simulation dialog width TEST release 2026-10-20 18:28:40 +08:00
ouyangxq 9bc3079fc5 docs: record scoped Admin display fixes TEST release 2026-10-20 17:19:26 +08:00
ouyangxq 986450024d 优化 2026-10-20 16:45:06 +08:00
ouyangxq d97aa8d086 优化 2026-10-20 15:48:19 +08:00
ouyangxq 5a198f87a4 优化 2026-10-20 14:25:05 +08:00
ouyangxq 29ad61c2a0 优化优化 2026-10-20 14:24:45 +08:00
ouyangxq e96d256b29 docs(agents): clarify offline index contract exemption scope
静态索引合同免排队仅限直接扫描文件的只读脚本;node --test 形式的合同测试与 pnpm test/typecheck/build、mvn 仍必须经 local-check.ps1。
2026-10-20 13:41:28 +08:00
ouyangxq 6b55816c12 docs(release): verify truck self-delivery default on TEST 2026-10-20 10:58:16 +08:00
ouyangxq a4404c2168 docs(first-leg): specify truck self-delivery as order default 2026-10-20 10:57:07 +08:00
ouyangxq c33ed689d7 优化 2026-10-20 10:35:59 +08:00
70 changed files with 4048 additions and 959 deletions
+28 -11
View File
@@ -19,19 +19,36 @@
## 本机重型检查与多对话限流
- Windows 本机的测试、类型检查、构建、依赖安装和 Maven 命令统一经 `baiyue-firstleg/scripts/local-check.ps1`(PowerShell 7)执行。锁位于当前用户 `%LOCALAPPDATA%/Chongchong/LocalChecks/`,与工作目录和对话无关;同一用户下使用该入口的任务同时只有一个执行,等待者每 15 秒提示占用。它是入口级互斥,不拦截绕过入口的命令,也不会接管已经运行的任务。
- Windows 本机的测试、类型检查、构建、依赖安装和 Maven 命令统一经 `baiyue-firstleg/scripts/local-check.ps1`(PowerShell 7)执行。两个锁位于当前用户 `%LOCALAPPDATA%/Chongchong/LocalChecks/`,与工作目录和对话无关;同一用户下最多同时执行 2 项,两槽都占用时才排队,每 15 秒提示占用。首槽沿用 `heavy.lock`,在途旧入口继续计入首槽;第二槽为 `heavy-2.lock`。已启动的旧版等待者仍只等待首槽,新调用自动选择可用槽;不终止或接管现有任务。入口不拦截绕过入口的命令。
- 在工作区根使用:`& ./baiyue-firstleg/scripts/local-check.ps1 -WorkingDirectory ./apps/admin-web -Label 'Admin typecheck' -Command @('pnpm', 'typecheck')`。定向 Vitest 示例:`-Command @('pnpm', 'exec', 'vitest', 'run', 'src/目标.test.ts')`;后端示例:`-WorkingDirectory ./baiyue-firstleg -Command @('mvn', '-pl', '目标模块', '-am', 'test-compile')`。参数使用数组,不拼接命令字符串。
- 查看占用:`& ./baiyue-firstleg/scripts/local-check.ps1 -Status`。默认最多排队 900 秒(`-WaitSeconds`),执行最多 1200 秒(`-TimeoutSeconds`)。排队超时退出 75 且不启动检查;执行超时退出 124 并回收本次进程树;其他情况透传命令退出码。锁由操作系统文件句柄维护,不删除锁文件抢占。正常结束、超时和包装器强制退出均由 Windows Job Object 回收本次后代;不按 Node/Java 进程名清理其他任务。
- 子进程默认设置 Vitest 最多 2 个 worker;Node 单进程堆上限 2048MB;Java 单进程堆上限 1536MB、可见处理器 2 个。直接运行 `node --test` 时自动补 `--test-concurrency=2`;直接运行 Maven 时补 `-T 1 -DforkCount=1 -DreuseForks=true`,拒绝重复指定这些并发参数。嵌套 shell/自定义脚本不得另行提高并发、覆盖限制或并发启动重型任务;经包管理器间接调用 Node 内置测试时,在该测试命令中显式保留 `--test-concurrency=2`。这些是每进程限制,并非整个进程树的总内存限额。
- 前后端全量入口 `backend-full-regression.ps1`、`frontend-full-regression.ps1` 执行时整批占一个名额,DryRun 不占用。已在入口保护下的批次执行原始命令,不重复申请锁;入口会拒绝嵌套调用,避免互相等待。
- 每个任务先完成必要的定向检查;批次收尾再统一执行应用要求的全量门禁,不因排队取消必要验证。复用结果前核对命令、目录、相关源码/依赖/配置均相同;验证期间相关输入变化则作废重跑。入口仅保存最近一次执行摘要,不自动计算代码快照、不自动跳过测试,也不保证先来先执行。
- 本机 `owner.json`、`last-result.json` 仅保存检查名称、目录、工具、PID、时间和退出码,不保存命令参数、凭据或测试输出;名称不得包含秘密。摘要不是业务/部署事实来源。无需凭据,不访问网络、数据库或部署环境;被包装命令原有的网络/写入能力及授权要求不变。
- 后端分层入口 `backend-check.ps1` 及前后端全量入口 `backend-full-regression.ps1`、`frontend-full-regression.ps1` 执行时整批占一个名额,DryRun 不占用。已在入口保护下的批次执行原始命令,不重复申请锁;入口会拒绝嵌套调用,避免互相等待。
- 按下文“验证范围选择”完成必要检查,不因批次收尾扩大范围;排队也不改变检查范围。复用结果须核对命令、目录和相关源码/依赖/配置;输入变化只作废依赖该输入的结果,补跑受影响检查,不自动重跑整批。交付简述范围、结果和未验证项;不能仅凭时间接近或上次绿灯推定有效。入口仅保存最近摘要,不自动计算快照或跳过测试,也不保证先来先执行。
- 本机每槽独立保存占用者与最近结果:首槽 `owner.json`、`last-result.json`,第二槽 `owner-2.json`、`last-result-2.json`。只保存检查名称、目录、工具、PID、槽号、时间和退出码,不保存命令参数、凭据或测试输出;名称不得包含秘密。`-Status` 分别展示两槽及总占用,摘要不是业务/部署事实来源。无需凭据,不访问网络、数据库或部署环境;被包装命令原有的网络/写入能力及授权要求不变。
- 只读检索和互不冲突的编辑可并行;开发服务按应用复用已有实例,不纳入短任务队列,也不通过本入口启动常驻服务。已有运行任务由所属对话收尾;本入口不自动终止它们。
- 免排队范围仅限离线只读的静态合同:`baiyue-firstleg/scripts/agents-index-contract.ps1`、`scripts/mapper-scan-contract.mjs` 等直接扫描文件的 PowerShell/MJS 脚本;`node --test` 形式的合同测试文件仍属测试。任何 `pnpm test`、`pnpm typecheck`、`pnpm build`、`node --test` 和 `mvn` 命令必须经 `local-check.ps1`,不得以“离线合同”为由绕过。
## 验证范围选择
从本轮差异、修改行为及直接引用确定范围,不把整个工作区已有改动算作本轮任务。各应用命令表是可用命令,不是每轮执行清单。
| 改动 | 默认验证 |
|---|---|
| 文案、注释、纯展示字段增删 | 核对差异及模板;已有断言受影响则调整并定向运行,不机械新增测试 |
| 文件内小逻辑、局部交互 | 覆盖修改分支和必要边界的定向测试,不自动整模块回归、typecheck 或构建 |
| 类型、签名、接口、模板绑定、模块引用、公共组件或共享逻辑 | 沿符号追踪实际消费者并运行相关测试;类型关系可能受影响时,补覆盖相关生产与测试源码的最小类型检查或编译 |
| 依赖、打包配置、模块装配 | 按变更选择受影响构建或测试;需要构建不等于同时需要全量测试 |
| 广泛公共变更或完整集成验收 | 先说明具体影响及定向检查不足的原因,再选择模块/全量范围;未调查清楚不能作为全量理由 |
- 用户明确要求完整回归时按指定范围执行;普通提交、对话结束、触及多个文件或发现他人未提交修改均不触发全量。
- 权限、金额、库存、状态和并发等关键行为必须覆盖相关边界,但不据此扫描或测试无关业务。定向失败先定位,不自动扩大测试范围。
- 仅复用编译配置、覆盖文件及相关输入相同的成功结果;构建未覆盖测试源码时,不能替代受影响测试的类型检查。API、Mapper、AGENTS 静态合同按各自触发条件执行;文档改动不触发业务回归。
## 当前开发阶段
- 项目尚未上线,没有需要兼容的生产存量数据、线上客户端或已发布接口版本;所有代码与契约直接收敛到当前确认目标,用户确认上线或存在不可变外部契约后才重新建立版本兼容和升级规则。
- 收敛范围包括源码结构、接口与 DTO、字段、状态机、权限、配置键、OpenAPI、数据库结构与初始化 SQL、事件、路由、页面、前端消费者、Mock/Fixture、测试和脚本;旧实现冲突时同步修改全部生产者与消费者并直接删除旧实现。
- 收敛范围限于本轮目标实际影响的源码结构、接口与 DTO、字段、状态机、权限、配置键、OpenAPI、数据库结构与初始化 SQL、事件、路由、页面、前端消费者、Mock/Fixture、测试和脚本;旧实现与本轮目标冲突时,同步修复实际受影响的生产者与消费者并删除被替代实现。
- 禁止为旧代码、旧调用或开发环境存量保留旧接口/旧字段别名、兼容分支、双协议、双写、灰度、回滚版本、降级解析、旧行为回退、临时适配层、迁移脚本、回填脚本、清理补偿或新旧版本并行;不得以“稳妥”“兼容历史数据”或“先保留以后删除”为由延迟收敛。
- 开发环境数据库记录、上传文件、缓存、会话、消息、搜索索引和其他运行状态均可丢弃;正常验证方式是更新最新初始化基线、重新造数或上传,并直接运行受影响回归,不模拟生产迁移。已有历史 SQL 只用于开发追溯,不构成兼容依据。
- 后端位于独立 Git 仓库 `../baiyue-firstleg/`,执行 Git 命令前确认当前工作目录。“无需兼容、直接修复”不授权自动重置数据库、删除数据/文件、执行 SQL、部署或修改环境。测试环境授权只读 `独立任务协作登记.md`,开发全流程授权只读 `开发环境独立任务协作登记.md`;未登记任务和生产环境仍需用户在当前轮明确授权。
@@ -46,18 +63,18 @@
## 通用工程与质量门禁
- 对外 API 新增、改名、删除或访问域变化,以“调用端实际路径(含 API Base)→ 对应区域 Gateway → Controller → OpenAPI → 权限”作为一个交付单元;不能只在修改网关文件时才检查注册。已被正确通配路由覆盖时无需重复添加路由,内部服务令牌接口不得为通过检查而公开。
- 提交前运行 `node --test scripts/gateway-route-contract.test.mjs` 及受影响服务/调用端的定向测试;路由合同失败不得提交或声称完成。该离线合同检查源码映射、目标服务及内部路径隔离,不代替权限、HTTP 方法、运行时 Nacos 或真实 HTTP 验收;前端 Mock 测试、类型检查及服务单测通过也不证明网关可达。
- 仅对外 API 路径/访问域新增、改名、删除或 Gateway 路由配置变化时,运行 `node --test scripts/gateway-route-contract.test.mjs` 及受影响服务/调用端测试;命中的路由合同失败不得声称完成。纯文案、内部逻辑和路径未变的前端消费不触发。该离线合同不代替权限、HTTP 方法、运行时 Nacos 或真实 HTTP 验收。
- 交付列明变更接口、路由是否复用或新增、验证结果及部署单元;Gateway 配置变化必须包含对应网关,Nacos 配置变化单独说明发布项。没有环境授权时只交付代码和待验收说明,不自动部署、发布配置或调用真实 HTTP。
- 保持变更小而聚焦,遵循目标项目现有命名、分层和格式,不顺手重构无关代码。
- 修改范围与停止条件遵循[工作区根指引](../AGENTS.md#修改范围与停止条件),保持目标项目现有命名、分层和格式。
- 优先复用现有依赖和公共能力;新增或升级依赖前说明必要性、影响范围和替代方案。
- 不提交依赖目录、构建产物、运行日志、编辑器缓存或本地临时文件;不写入密钥、令牌、真实客户数据或环境特定地址。
- 用户可见文案保持清晰一致;代码标识符使用英文,业务说明和文档可使用中文。
- 仅运行目标项目实际声明的安装、检查、测试和构建命令。每次变更至少验证直接受影响的项目,跨项目变更还要验证对应消费者。
- 修改方法、构造器、组件 Props、函数、接口、DTO 或请求/响应参数时,定向检索全部生产调用、测试调用、Mock、Fixture、契约测试和脚本引用,并同步修改。
- 仅运行目标项目实际支持的检查命令,按上文选择最小有效范围;“验证受影响项目”不等于运行该项目全部命令。
- 签名、组件 Props、接口/DTO、请求响应结构或影响调用方的行为变化时,用 `rg` 按变更符号核对直接生产调用、测试、Mock、Fixture、契约测试与脚本;只修改实际受影响的引用,必要时沿直接依赖继续追踪。仅内部实现调整且调用契约与对外行为未变时,验证受影响逻辑,不自动修改调用方、Mock、Fixture 或文档。
- 参数或类型签名变化必须运行会编译测试源码的最小检查;无法验证时明确列出未验证范围。
- 修复缺陷优先增加复现测试;没有现成测试设施时不为小改动引入整套框架,应记录验证步骤和剩余风险。
- UI 变更按受影响范围检查加载、空态、错误态、权限、目标视口和可访问性;Admin/Client 视觉细则查 `Admin-Client前端原型还原验收规则.md` 和目标应用指引。
- 行为缺陷优先用已有测试复现,缺失时补必要用例;文案和纯展示不机械新增测试,不为小改动引入框架。
- UI 只检查本轮影响的状态与交互,不机械遍历加载、空态、错误态和权限;布局或承载方式变化再按前端验收规则核对对应视觉证据。
- 需求、技术栈或接口未确认时停在可逆设计阶段,不自行作出高成本平台决策。
## 独立任务与多任务协作
+18 -34
View File
@@ -2,69 +2,53 @@
## 目标
Admin 与 Client 已向客户讲解或确认过的页面,必须以对应原型为直接事实来源逐页还原。不得先统一套用现有设计系统、抽屉、弹框、详情页或图标规范,再局部调整。
本文只维护逐操作核对方法、验收范围和证据要求。Admin 当前样式的唯一依据为 [Admin 界面规范](Admin高密度界面规范.md);Client 新增、新建、下单的通用外观按 [Client 界面样式规范](Client界面样式规范.md) 的“新增页面”章节,其他操作读取该规范的适用条款和已确认原型,不自动采用 Admin 风格。本文不重复定义配色、密度、按钮或弹窗尺寸。
页面业务字段、顺序、分组和操作承载以当前业务契约及逐操作确认为准;已有原型作为直接核对证据。Admin / Client 主规范已经确认替代的外观使用对应现行规则,其余差异逐项记录,不因套用公共组件而改动承载方式。
## 修改门禁
每个页面修改前必须先形成以下矩阵,并给出原型文件及行号、元素 ID、函数名或截图证据:
新页面、整体视觉还原、布局重排或页面/弹框/抽屉承载变化,才对受影响操作形成以下矩阵,并给出原型或用户截图依据。文案、单个展示字段增删、局部逻辑及不改变承载方式的小调整,直接核对差异,不要求矩阵、完整原型检索或全页面验收:
| 页面 | 操作 | 原型承载方式 | 原型尺寸/布局 | 当前实现 | 结论 |
|---|---|---|---|---|---|
| 示例 | 详情 | 独立页面 | 页面级头部、返回列表 | 右侧抽屉 | 改为正式路由页面 |
操作至少分别核对:详情、新增、编辑、审核/确认、文件预览、删除/停用确认。不得以其中一个操作的结论推断其他操作。
只核对本轮受影响操作,不机械遍历详情、新增、编辑、审核、预览和删除;不得用一个操作的结果推断其他操作已通过。
## 承载方式
- 原型使用独立页面:必须使用正式路由、页面级布局和明确返回入口;不得改成抽屉或弹框。
- 原型使用居中弹框:必须使用居中模态框,并按原型宽度、标题、正文、底部按钮和关闭方式还原;不得改成右侧抽屉。
- 原型使用居中弹框:必须使用居中模态框,核对标题、正文、底部按钮和关闭方式;Admin / Client 外观分别按各自现行样式规范和已确认业务例外,承载尺寸按对应操作确认,不得改成右侧抽屉。
- 原型使用侧滑面板:仅该操作允许使用抽屉,并按原型方向、宽度和内部布局还原。
- 原型未定义:先停在矩阵中标记待确认,不得因为公共组件方便而自行选择。
- 同一列表的详情、新增、编辑、审核可以采用不同承载方式,必须逐操作判断。
## 视觉与排版
- 字段顺序、分组、摆放、列宽、控件宽高、换行、对齐、外边距、内边距、间隙和留白按原型逐项核对。
- 顶部背景色、页面背景、区块背景、边框、圆角、阴影、字号、字重和文字颜色直接取原型值。
- 按钮位置、顺序、尺寸、颜色、危险语义、悬停态、禁用态按原型还原;不得自行增加“更多”菜单或纯文字替代。
- 原型已提供图标、字符图标、图片或 SVG 时直接复用原型资源;不得自行绘制或替换。
- 表格按原型核对外边框、单元格边框、表头背景、斑马纹、行悬停背景、行高和横向滚动。
- 原型没有的公司名称图标、下划线、卡片装饰、悬停上浮、缩放和渐变效果不得添加。
### Admin 已确认布局基线
- Admin 所有弹窗的统一目标风格见 [Admin 统一弹窗规范](Admin高密度界面规范.md#弹框与表单)(2026-10-19 测量弹窗样板)。按大模块逐组盘点、实现和截图确认;在已确认范围内优先采用该规范的外观与密度,原业务字段、权限、提交逻辑以及独立页面/弹框/抽屉承载方式继续逐操作核对。
- 订单样板及国内仓样式统一采用 [Admin 高密度界面规范](Admin高密度界面规范.md)。其已确认的密度、容器和页签图标规则优先于历史原型中的对应视觉;字段、业务分组、权限、操作语义与页面/弹框/抽屉承载方式继续逐操作核对。该规范不表示其他页面已完成验收。
- Admin 是高信息密度业务系统。保留原型字段、顺序、业务分组和交互语义,但普通短字段优先使用连续白底、多列键值网格、描述表或紧凑列表,不把“一个标签 + 一个值”做成独立卡片。
- 详情页顶部尽量合并返回、标题、核心状态和主要操作;路由壳层已显示标题时正文不重复。状态或流程结论只保留一个主要视觉落点,除真实错误、阻断或危险外不叠加大面积彩色横幅。
- 在 `1920×1080` 下短字段通常并排 `4–6` 组;长文本、地址、备注和异常原因可以跨列或换行。长编号集中省略说明列宽设计失败,应调整列数、宽度或跨列,不继续缩小字号。
- 同一详情页使用一致的内容底色和容器语言;连续白底区域用分隔线和间距分区,同级独立卡片的背景、圆角、边框和外间距保持一致。
- 高信息密度不授权缩小可点击区域、删除标签、强制截断关键值或牺牲可访问性。使用真实长编号、空值、状态徽标和多字段数据核对首屏。
- 原型明确的承载方式和视觉细节优先;历史原型仅因大量字段卡片、重复状态块或过度留白与当前密度基线冲突时,收敛承载方式但不改变字段、分组和交互语义。
- Admin 按 [主规范任务入口](Admin高密度界面规范.md#按任务阅读)选择对应章节核对;Client 按 [样式规范](Client界面样式规范.md) 的适用章节及对应操作原型逐项核对。矩阵标明当前依据及业务例外,不把旧试点和过程记录当成另一套通用规则。
- 核对字段分组、列宽、换行、对齐、控件、表格、按钮及图标;保留原型的业务语义和操作资格。主规范未授权的装饰、功能与交互不得自行添加。
- 长编号、长地址、长文件名、多字段、空值和业务状态使用真实形态的数据核对;不能靠缩小字号、裁切关键值或减少字段通过验收。
## 响应式与可访问性
- Admin、Client 当前只按 `1920×1080`、浏览器缩放 `100%` 验收;不检查或整改 `720px`、`320px` 等窄屏,也不删除已有响应式能力。用户恢复多视口验收后再统一调整。
- 弹框正文超过视口时只滚动正文,标题和操作区保持可见;独立详情页按正常页面滚动。
- 字段数量较多、两列会导致弹框明显过高时,在 `1920×1080`验收视口下改用宽版三列表单;短字段单列占位,地址、长文本、备注、文件和表格按内容跨列或整行。小型确认类弹框不因此扩宽。
- 弹窗尺寸和字段列数按当前样式依据及业务例外核对,不在验收阶段另设通用尺寸;核对长正文、校验错误、附件和底栏是否可用。
- 保留键盘操作、焦点、表单标签、图标按钮名称和足够对比度。可访问性调整不得改变原型的主要布局与视觉语义。
## 执行与验收
1. 先提交逐页矩阵,不直接批量替换公共组件。
2. 总控冻结该页结论后,任务只修改职责内模块,不触碰其他任务在途文件。
3. 修改后由人工在 `1920×1080`、`100%` 缩放下操作并提供截图,标注与原型仍存在的差异;缺少截图时记录“待人工截图确认”,AI 不自行批量取证。
4. 运行直接测试与类型检查;共享组件变更必须检查全部消费者。
1. 仅满足上述矩阵触发条件时记录受影响操作;局部小改直接核对差异,不批量替换公共组件。
2. 按当前对话确认的范围修改目标模块,保留其他任务在途改动;存在总控协作时沿已冻结结论执行,不因普通样式任务额外创建总控流程。
3. 需要视觉验收的布局/承载变化,由人工在 `1920×1080`、`100%` 缩放下提供受影响操作截图;缺少时记“待人工截图确认”,AI 不批量取证。文案、小逻辑和局部展示改动不以重新提交整页截图作为代码交付门禁,不据此宣称已通过视觉验收。
4. 按 `AI工程执行与协作约束.md` 的“验证范围选择”执行最小有效检查,不因页面修改自动全量测试、类型检查或构建;需要的重型检查经过 `local-check.ps1`。共享组件核对实际消费者,公共浮层选择器变化覆盖受影响的嵌套、Teleport、工具栏及全屏场景。
5. 不触发 Jenkins、不部署、不提交,除非当前对话另有明确授权。
## 已确认示例
已改造弹框回看时,复用原固定编号清单,从本轮确定的当前项逐个处理,不另建全量清单、不重排编号。单项流程为“原改造记录与当前代码核对 → 实际截图核对 → 明确保留项和必要局部修正 → 有修改时完成相应代码检查 → 本项人工确认 → 下一项”。缺少截图时只记录源码事实与待核对项,不声称视觉通过;本项未确认前不并行修改后续弹框。复杂窗口的分栏、步骤、树表、预览与已确认尺寸分别核对,不按普通表单模板统一重排。
Admin 客户管理原型:
## 证据记录
- 客户详情:独立页面(`page-tenant-detail`)。
- 新增客户:居中宽版弹框(`modal-tenant-add`,宽度约 1120px),基础资料和联系与商务使用三列,地址、备注和资质表格整行。
- 编辑客户:复用新增客户的居中宽版三列弹框(`modal-tenant-edit`,宽度约 1120px)。
- 重置密码:居中弹框(`modal-tenant-reset-password`,宽度约 520px)。
- 入驻审核:居中弹框(`modal-tenant-audit`,宽度约 900px)。
逐操作矩阵记录:页面/路由、具体操作及承载方式、原型或用户确认依据、采用的主规范章节/业务例外、自动检查结果和人工截图结论。各模块复用现有记录,不另建一份全端进度副本。示例原型的尺寸不覆盖当前已确认的业务尺寸。
这些结论只适用于上述操作,不自动推广到其他页面。
人工核对独立打开/刷新、列表到详情、页签切换、长内容、宽表、空态、部分数据、失败与重试、只读/无权限及浮层普通/全屏/关闭重开。自动检查不能证明浏览器像素布局和实际滚动已通过。
+4
View File
@@ -1,7 +1,11 @@
# Admin 列表样式推广核对记录
> 文档职责:仅维护模块范围、业务例外与检查/截图记录。通用样式统一以 [Admin 界面规范](Admin高密度界面规范.md) 为准;下文日期批次中的旧外观不再作为新改造要求。普通样式任务只在涉及本模块范围、例外或验收证据时查阅本文。
## 本轮依据与边界
2026-10-21 后续视觉确认:列表页签对齐与灰白斑马纹以[蓝白工作台当前规范](界面参考/蓝白卡片式工作台风格参考.md#视觉基线与维护入口)为准;下文“无斑马纹”为此前批次实现记录,不再作为接入要求。
2026-09-30,用户确认排车列表样式后授权按客户管理、国内仓、货柜管理、海外仓顺序推广;特殊页面保留待人工确认。直接视觉依据为本轮截图 `41fea1ee-f30a-46db-97b0-82ec96846ec7/image-1.png` 与 [排车样板](Admin排车列表样式试点.md)。仅修改测试环境工作区 `apps/admin-web`,不部署或发布。
统一布局:左侧列表名称、右侧原业务按钮与字段设置,搜索和表格位于同一连续卡片。仅列表操作列采用蓝色普通文字、红色危险文字、悬停无下划线;查询、顶部、弹框按钮不变。列显隐、排序和拖动宽度使用公共浏览器偏好存储。保持所有业务字段、状态、权限和事件,不改变详情、新增、编辑、审核、文件预览与删除确认的承载方式。
Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 440 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 497 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 718 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

+105 -2
View File
@@ -1,6 +1,77 @@
# Admin 国内仓样式核对记录
本轮先核对 **1—20 号**,后续模块样式整理暂停。本次仅补充截图入口和页面路径,不修改业务代码、字段或流程。
> 文档职责:仅维护模块范围、业务例外与检查/截图记录。通用样式统一以 [Admin 界面规范](Admin高密度界面规范.md) 为准;下文日期批次中的旧外观不再作为新改造要求。普通样式任务只在涉及本模块范围、例外或验收证据时查阅本文。
## 弹框逐项复核(2026-10-21)
用户要求收紧测量样板推广范围,并按既有改造记录逐个回看。继续使用本文[固定编号清单](#当前修改的截图核对清单),编号不变;该清单兼作此前跨模块弹窗改造的复核入口。旧记录中的三色分区、连续编辑表和历史自动检查是当时的实现事实,不作为本轮必须保留的目标。当前规则以[弹框与表单](Admin高密度界面规范.md#弹框与表单)为准,逐项方法以[执行与验收](Admin-Client前端原型还原验收规则.md#执行与验收)为准。
用户本轮明确跳过 **第 1–20 项**,记录为“按用户要求跳过”,不记为视觉通过。当前项为 **第 21 项:编辑库位**;本轮尚无人工确认完成项。第 21 项确认后再看第 22 项,不批量修改后续窗口。历史截图与修正记录保留,不直接记为本轮通过。
| 当前编号/入口 | 已核对的源码事实 | 本项待截图核对与处理 | 本轮状态 |
|---|---|---|---|
| 21:国内头程 → 库位管理 `/master-data/locations` → 库位行的「编辑」 | `apps/admin-web/src/modules/warehouse-resources/locations/pages/LocationsView.vue` 的 `editorOpen` 弹框;宽度 `min(1000px, calc(100vw - 28px))`,双列表单、标签在上;标题含库位编码,编辑时所属仓库与状态禁用;模板未使用彩色分区 `data-tone` | 核对实际底色、1000px 双列布局是否合适、只读与可编辑字段辨识、长库位编码与校验错误、底栏及字段间距;保留原字段、保存、取消与编辑锁定,不按测量样板重排 | 源码已核对;页面代码未修改,待本轮人工截图 |
## 弹框可用性回归排查(2026-10-21)
本轮仅修展示,保留已隐藏的长汇总、订单数量连续性与旧请求防覆盖、既有权限/API/状态/金额。依据本轮用户“弹框布局混乱”反馈及下表实际组件结构排查;没有新增真实页面截图,不把自动检查当成视觉验收。
| 入口 / 操作 | 当前承载及源码依据 | 实际问题与修复范围 | 人工待验 |
|---|---|---|---|
| 订单 / 测量 → 称重图片确认 | `InboundMeasurementDialog.vue` 内的 `WeightOcrPanel.vue`,1560px作业弹框内再开1080px图片确认 | 图片确认未显式 `append-to-body`;父测量框对后代 `.el-dialog__body` 设置伸缩,命中子框。二级确认独立挂到body;测量几何规则只作用自身、普通尺寸与全屏分开 | 长图片、确认/取消、父子全屏、关闭重开、错误及底部操作 |
| 价格簿 → 上传 | `CarrierRatesView.vue`,560px居中表单 | 文件按钮和长文件名同一不可换行flex行,按钮可被挤压;仅该控件允许换行并保留按钮宽度 | 长文件名、文件错误、取消重开 |
| 订单详情 → 申报/货品编辑、审核/批审、备注、扣货、费用;整柜 → 出入库 | 现有矩阵1—25项,原AppDialog/AppDrawer及独立详情 | 当前未发现需改变承载或尺寸的局部证据;保留原字段、标签、校验与原生表格滚动。公共部位选择器隔离由公共唯一写者处理 | 普通/长表单、必填和错误换行、批审宽表、底部操作 |
`InboundWorkflowWorkspace.vue` 当前未被正式页面引用,本轮不改其旧审查弹框;不以未注册组件计作路由覆盖。智能装柜专项见现有[货柜管理记录](Admin货柜管理样式核对记录.md#智能装柜嵌套弹框回归2026-10-21)。
本轮实际修改5个展示文件及4个直接测试。通过 `local-check.ps1` 完成6文件123项定向复验,包含真实Element挂载的测量/称重和智能装柜/加入两组嵌套DOM隔离、父子全屏与取消重开独立、失败保留箱数与诊断、原接口提交及长文件名上传。首轮119项通过、4项失败,定位为二级Teleport后仍从父DOM查询的旧断言、输入属性的挂载节点断言及公共选择器更新,调整为实际body节点取证并补自动卸载后复验通过;没有删除业务断言。5个组件的业务脚本与修改前逐一相同,差异空白检查通过。公共样式与AppDialog/AppDrawer处于另一唯一写者的同步修复批次,本组不改写;类型、全量、构建由总控稳定后统一执行。当前仅完成自动检查,正文实际滚动、必填/校验换行、按钮尺寸与底部可达性仍待用户1920×1080、100%截图,未打开浏览器、未部署。
## 整柜库存详情截图修正(2026-10-20)
交易记录的业务类型按用户补充要求使用浅色标签区分:入库绿色、出库蓝色,保留文字;详情现有3项定向回归通过,视觉待人工截图确认。
依据本轮用户截图`codex-clipboard-52fcc07e-e484-4184-99de-909e3095d731.png`:页头与整柜信息、交易记录分别套有圆角边框,交易表再叠一层外壳。保持`domestic-containers/inventories/:inventoryId`独立详情、四列字段、状态与不可变交易表,移除两块区域和交易表的外圈卡片样式,使用公共紧凑详情页头并对齐内容边缘;当前库存数适度强调。只调整展示,原字段、只读状态、请求及数值保持。改后待人工1920×1080、100%截图确认。
本次检查:详情现有3项定向回归通过,SFC模板/局部样式编译通过,业务脚本和事件绑定与修改前一致;差异空白检查通过。未进行发布;改后视觉待人工截图确认。
## 蓝白工作台接入矩阵(2026-10-20)
本批采用[蓝白样板](界面参考/蓝白卡片式工作台风格参考.md),沿下方已有操作编号保留承载和密度。仅本地展示改造,人工视觉均待 1920×1080、100% 截图确认。
用户随后修正:页面保持一整块白底,整页主要内容不再额外套整圈边框。订单、测量/审核、价格簿、整柜和船期日历的主列表外壳,以及订单/价格版本的整页详情显式增加 `is-page-surface`,由总控公共规则去掉外圈 border/radius/shadow;保留内部表格线、日历左右面板、独立卡片和弹框。页面边距统一由总控处理,本批不改 padding、脚本或承载,不重复全量检查,视觉仍待人工截图确认。
顶部排列收口:整柜业务的入库/出库/库存页签与订单主状态页签移至 `DataTable #toolbar-start`,替代重复正文标题,并保留原页签类、计数、加载/错误与重试、键盘切换。订单的测量审核分支由 `InboundTaskList` 在同一工具栏位置接收 `status-tabs`,独立测量/审核路由未传入页签时仍显示原标题。原 `toolbar-actions` 和 `filters` 内查询不变;按钮、页签尺寸与间距统一由公共 `is-page-surface` / `workbench-list-tabs` 维护。价格簿、船期日历及预装清单等没有同级业务页签的列表不删标题。本轮只调整排列,视觉待人工截图确认。
左右留白核对:订单中的测量审核复用分支原有两层 `AdminPage`,在该唯一嵌入调用增加 `is-embedded`,由公共规则去掉内层重复的左右各 12px;独立测量/审核入口继续使用公共页面边距。整柜业务、普通订单和货柜列表未发现额外页面 padding 或居中宽度上限,业务阶段导航与表格单元格保持原样。待人工截图确认。
| 页面与代码证据(相对 Admin `src/modules/`) | 操作与现有承载 | 本批结论 |
|---|---|---|
| `unified-orders/pages/UnifiedOrdersView.vue`:`unified-orders-results`、详情分支 | 列表、订单/入仓码独立详情;1—13号计费、审核、备注、扣货、导入、同柜组、申报、费用和图片弹框;关联抽屉 | 列表外框、连续详情、证据表与各浮层显式接入;保留业务字段、只读/危险状态与抽屉 |
| `inbounds/components/InboundTaskList.vue`:`mode`,测量/审核两个正式路由 | 测量及审核列表;14—19号作业、手工箱规、证据图、称重与审核弹框 | 保留测量作业面积和表格密度,浮层自行声明主题;只精简重复普通说明 |
| `fba-pricing/carrier-rates/pages/CarrierRatesView.vue`:`openUpload`、`openDetail`;`CarrierRateDetailView.vue` | 价格簿列表、上传弹框、独立版本详情、仓库映射与确认 | 标准列表外壳和连续详情接入,不变更报价范围、确认资格或金额 |
| `domestic-containers/pages/DomesticContainersView.vue`:三个业务页签;`DomesticContainerInventoryDetailView.vue` | 出入库/库存列表、24—25号录入弹框、库存独立详情与只读交易表 | 保留紧凑汇总与不可变流水,接入蓝白面板、表格及浮层 |
| `sailing-calendar/pages/SailingCalendarView.vue`:`selectedDateRecords`、`managementOpen`、`templateDialogOpen` | 日历及侧栏,26—35号船次、货量、历史、建议、渠道和周模板操作 | 保留日历、侧栏、表格和原生成确认,统一外框与主题;不套大指标卡 |
`first-leg-orders` 只有被消费的 API,无页面;旧 `inbounds` 列表已重定向订单列表。未注册的订单工作流页不作为正式路由覆盖计数。公共组件由总控维护,本批不改公共样式或组件。
本批实际源码清单(均相对 `apps/admin-web/src/modules/`):
| 模块 | 修改文件 |
|---|---|
| `unified-orders` | `pages/UnifiedOrdersView.vue`;`components/OrderDeclarationEditorDialog.vue`、`InboundFeeDetailManager.vue`、`OrderFulfillmentTreePanel.vue` |
| `inbounds` | `components/InboundTaskList.vue`;`core/DropshipPalletPrintPanel.vue`、`InboundHistoryPanel.vue`;`fee/InboundFeePanel.vue`;`measurement/InboundMeasurementDialog.vue`、`InboundMeasurementPanel.vue`、`components/MeasurementEvidenceThumbnail.vue`;`review/MeasurementReviewPanel.vue`;`weight/components/WeightOcrPanel.vue` |
| `fba-pricing` | `carrier-rates/pages/CarrierRatesView.vue`、`CarrierRateDetailView.vue` |
| `domestic-containers` | `pages/DomesticContainersView.vue`、`DomesticContainerInventoryDetailView.vue` |
| `sailing-calendar` | `pages/SailingCalendarView.vue` |
已接入列表真实父容器、独立浮层和原生证据表;订单详情使用连续外框,原页签保持单行横向滚动,普通内部备注说明收至帮助入口。日历保留日期格和侧栏几何,称重表取消原渐变表头并保留图片与行高。缺失操作人不再以数据库 ID 补位。业务脚本除样式及帮助组件导入外与本批起点一致。
本批与货柜组共同定向检查覆盖65文件807项:首轮54文件613项通过,另外11文件出现13项旧类名/局部外观断言失败;保留业务断言并更新展示断言、恢复详情页签单行样式后,11文件194项复验通过。最终查询/抽屉接入、缺失编号占位及打印收口另验9文件110项通过。49个修改组件的SFC模板均解析/编译通过,模块差异空白检查通过;全量测试、类型检查、构建和公共合同由总控集成时统一完成。所有检查均经 `local-check.ps1`,未打开浏览器或部署,视觉仍待人工截图确认。
本对话后续三项修正的当前发布状态见[Admin 展示修正 TEST 发布记录](测试环境单机部署与配置契约.md#admin-display-fixes-test-20261020)。下方各项“尚未部署”为修改当时的检查记录,当前状态以主契约为准。
本轮先核对 **1—20 号**,后续模块样式整理暂停。逐项根据用户截图修正展示布局,保留业务字段和流程。
页面路径相对于当前 Admin 后台域名;按下表菜单及按钮逐级打开。订单详情也支持业务入口 `/orders/inbound/{入仓码}`,将占位符替换为实际入仓码。第 1 项入口按当前代码更正为「测量数据 → 确认计费重发送」,该按钮打开的弹窗标题为「编辑计费数据」。
@@ -8,9 +79,25 @@
已有代码检查结果及历史截图结论保留在后文;本轮视觉结论以新收到的逐项截图为准。当前发布版本与运行证据见[TEST Admin弹窗发布记录](测试环境单机部署与配置契约.md#admin-dialogs-test-20261020)。后文各批次的“未提交或部署”为开发检查当时的状态,当前发布情况以该正式契约为准。
## 第 1 项可编辑字段反馈(2026-10-20)
| 页面 | 操作 | 截图依据及当前实现 | 本次结论 |
|---|---|---|---|
| `/orders` → 详情 → 测量数据 → 确认计费重发送 | 编辑计费数据,第 1 项 | 用户截图 `codex-clipboard-5b07a8aa-bc45-4e70-91e5-c85259836304.png`;三个数值输入在连续表中默认边框透明,与只读值不易区分 | 仅计费毛重、计费体积、本次对客单价显式使用公共描边编辑样式:白底、主题色浅描边,悬停及聚焦使用更明显的主题色;只读值保持文字,连续表尺寸不变 |
不变更输入精度、最小值、单位、加载禁用条件、调整原因、计费计算或确认发送逻辑。公共样式通过 `density-table-editor--outlined` 显式接入,其他连续表编辑默认样式不变。自动检查:定向 3 文件 / 118 项、类型检查、构建通过;全量执行 453 文件 / 4087 项,其中 4086 项通过、1 项海外入库弹窗用例触发原 5000ms 超时,随后不修改代码或超时设置,单独复测该文件 16 项全部通过。不将首次全量运行记为全绿;本页、公共密度 CSS、令牌和合同检查前后散列一致。尚未部署,新样式待人工截图确认。
## 第 10 项截图反馈(2026-10-20)
| 页面 | 操作 | 截图依据及承载方式 | 当前布局 | 本次结论 |
|---|---|---|---|---|
| `/orders` → 详情 → 货品信息 | 编辑客户申报资料,第 10 项 | 用户截图 `codex-clipboard-b22c324a-dae8-4314-8d98-eba5aae4e022.png`;1180px 弹窗、支持全屏 | “订单申报资料”五项采用上方标签、三列控件,纵向留白偏大 | 仅该分组改为两行连续编辑表:渠道名称、只读渠道编码、预估体积;预计到货时间、跨两列客户备注。沿用浅色背景、无左侧色条;原订单资料、货品明细及第 11 项货品编辑不变 |
保留全部字段、候选加载及错误提示、渠道变更确认、版本校验、输入范围和提交逻辑。自动检查:定向 4 文件 / 115 项、类型检查、构建和全量 444 文件 / 3970 项均通过;业务脚本、原订单资料及第 11 项货品编辑模板与修改前一致。本次修正尚未部署,新布局待人工截图确认。
## 当前修改的截图核对清单
按用户最新要求持续维护固定编号:先完成模块代码,再按本清单逐条提供截图。1—13 沿用对话中既有编号,14—17 对应此前“测量 1—4”。新增条目只向后追加,不因插入模块重排已提供编号。下表记录已落地的本次弹窗样式、共享变化及保留编号的关联核对;代码检查与人工截图结论分别记录在后文,列入清单不代表所有状态已视觉通过。
本清单保留既有改造编号与历史截图重点,当前逐项复核进度见[弹框逐项复核](#弹框逐项复核2026-10-21)。下表中的浅色分区、连续编辑表等文字只描述此前改造,不是本轮必须保留或推广的目标。1—13 沿用对话中既有编号,14—17 对应此前“测量 1—4”;新增条目只向后追加,不因插入模块重排编号。代码检查与人工截图结论分别记录,列入清单不代表本轮视觉通过。
| 编号 | 菜单 → 操作 | 本次改动及截图重点 |
|---|---|---|
@@ -1163,3 +1250,19 @@
| 入库费用作废 | 原有作废确认框;保留费用版本与原因校验 |
184 项定向检查通过;最终 253 个文件 / 1982 项全量测试、类型检查、构建和 git diff --check 通过。八处确认框均仅补充显式密度入口,提示、权限、版本和提交逻辑未变。人工截图待确认。
## 2026-10-20 订单主状态页签单独占行
依据用户截图 `codex-clipboard-1ac0b9f9-e06a-4623-a9a6-6ab3a3682d2e.png`:主状态页签被同行导入、导出、审核、智能装柜和字段设置挤压。订单普通列表与切换后的测量数据审核列表均显式使用 `orders-status-toolbar`,桌面状态页签独占工具栏首行,原业务与字段设置操作位于下一行右侧;筛选区、行密度、状态数量、加载/失败反馈、选中状态和键盘切换保持。页签过多时沿用横向查看,不隐藏任何业务阶段,不影响其他页面的公共工具栏。
源码为 `apps/admin-web/src/modules/unified-orders/pages/UnifiedOrdersView.vue` 两个列表分支及其局部排列规则。定向测试 `UnifiedOrdersView.test.ts`、`UnifiedOrdersView.requests.test.ts` 共 57 项通过;两种分支在 1920×1080、100% 缩放下的修改后截图仍待人工确认,未部署。
本次追加类型检查 `pnpm typecheck` 与目标文件 `git diff --check` 通过;均未执行部署。
### 订单页签点击时数量消失与收缩修复
用户反馈切换页签时全部数量消失且页面收缩。确认进入/离开测量数据审核会冗余重查全部数量;统计重查前清空数量并插入加载提示,导致页签宽度和工具栏高度变化。切换页签现仅切换当前列表,不刷新与主状态无关的统计;查询条件变更、重置和实际业务操作后的统计刷新保留,新查询失败仍明确提示,不展示不匹配筛选的旧数量。
列表请求增加最新请求序号保护,较旧的成功、失败及 loading 收尾不能覆盖新页签结果,切换到审核分支和卸载时使在途旧请求失效。保留同批合入的测量审核筛选逻辑及两行页签布局。新增回归覆盖普通/审核/全部之间切换时数量与加载提示稳定,以及旧请求在当前列表就绪后成功或失败两种情况;请求协调 15 项与页面合同 46 项共 61 项通过。应用类型检查复用合并任务同一源码结果通过,未重复全量检查。未部署,真实页面效果仍待人工确认。
+30
View File
@@ -1,5 +1,7 @@
# Admin 客户管理样式核对记录
> 文档职责:仅维护模块范围、业务例外与检查/截图记录。通用样式统一以 [Admin 界面规范](Admin高密度界面规范.md) 为准;下文日期批次中的旧外观不再作为新改造要求。普通样式任务只在涉及本模块范围、例外或验收证据时查阅本文。
## 范围与依据
按当前客户管理导航的两个入口:客户列表、海外仓阶梯费用;客户详情及两个入口实际调用的编辑、审核、预览一并收敛。用户要求按钮使用纯文字,避免图标占位;详情页签保留已确认的彩色 Emoji。沿用《Admin 高密度界面规范》,验收视口为 1920×1080、100% 缩放。
@@ -102,3 +104,31 @@
5. 计费规则及海外仓费用:只读分组、默认规则入口、规则编辑、币种与多档阶梯、取消和未保存提示;核对单位、公式与底部操作。
6. 操作日志:筛选、详情抽屉、成功/失败记录及快照长内容。
7. 海外仓阶梯费用列表:多档位行、横向空间、编辑弹框两类费用并排、档位增删后的表格及校验。
## 2026-10-20 蓝白样式接入
沿用上方逐操作矩阵及现有承载。客户列表、客户详情、海外仓阶梯费用三个路由页面,以及实际调用的计费规则、海外仓费用和审计面板显式接入 `admin-workbench`;列表使用外层 `workbench-table`,资质预览、编辑、审核、密码、凭证及危险确认保留各自尺寸和处理逻辑。详情成员表及阶梯表复用 `density-table` 与 `workbench-evidence`,移除原有重复表格外观;正常规则标题的“箱规计算说明”支持键盘聚焦,长公式从常驻横栏移入说明,初始化、权限与错误提示仍常驻。
不恢复当前已注释的运营指标区;`CustomerOperatingMetricCard` 无活动渲染入口,本批未修改。箱规与权重的数据层 `dimension-config` 保持原样。审计详情继续使用抽屉,业务脚本与绑定未变。定向验证及本批共同限制见下述结果;视觉均为待人工截图确认。
本组自动核对:31 个 Vue 模板及样式编译、业务脚本与模板指令对比通过,37 处表格外层、39 处弹框、7 处抽屉作用域通过。61 个受影响测试文件共 611 项已通过首轮及失败项修正后的定向复验;箱规说明以真实组件聚焦验证可读。随后按总控公共合同补齐七处 `is-drawer` 与独立查询栏 `workbench-query`,对应七文件 95 项复验通过,最终 SFC/绑定核对再次通过。全量测试、类型检查与构建由本批总控统一执行;本记录不宣称已部署或已完成人工验收。
2026-10-20 用户追加修正:整页主列表与详情外壳使用 `is-page-surface` 取消外围整圈边框、圆角与阴影,页面保持连续白底;本组共 22 处主列表和 6 处详情容器,内部子表、指标/图表卡片、独立并列面板及弹框保持原边界。布局、内边距和脚本不因本修正改变;公共规则与全量门禁由总控统一收口。财务相关三文件 41 项定向复验通过,视觉仍待人工截图确认。
## 2026-10-21 弹框可用性回归
确认的问题:新增/编辑客户仍为已确认的 1120px 居中框,但基础资料与联系商务的短字段回退成两列;资质区前的表单因此加长。恢复两个分组每行三个短字段,保持原字段顺序、必填项和绑定;注册资本、地址、备注保留整行。普通标签宽度为 120px,较长的统一社会信用代码标签单独保留 144px。客户计费、资质预览、审核、结果及危险确认的原有承载未改。
实际挂载验证包含三列单元格与整行跨列、客户名称真实 blur 校验后的错误提示、底部保存入口、原编辑与资质预览行为。测试插件按本项目其他 Element 行为测试采用同一 CJS 运行时,避免混用 ES/CJS 表单上下文使校验无法触发。客户 34 项和消息中心 22 项定向回归通过;该结果只证明挂载与交互,不证明真实排版已验收。普通/全屏、长公司名称、信用代码、文件名、多条错误、关闭重开与预览关闭后返回编辑,均待用户 1920×1080、100% 人工截图确认。
## 2026-10-22 客户编辑表单确认
用户提供当前客户编辑弹框截图并确认继续采用这套输入控件外观;通用规则唯一维护在[Admin 界面规范“输入框与字段”](Admin高密度界面规范.md#输入框与字段),本节仅记录本窗口落点。
- 保留 1120px 弹框、三列短字段及注册资本/地址/备注整行;普通标签 120px,“营业执照企业名称”和统一社会信用代码标签单独 144px。
- 输入控件白底、浅灰边框、8px 圆角,悬停加深、聚焦蓝框;注册资本与账期数字左对齐,客户昵称占位文字为“选填,默认自动生成”。通过 `density-form--outlined` 接公共边框,客户模块仅限定本编辑框的圆角与数值对齐。
- 删除底部保存/审核流程说明及已登记信用代码旁的只读说明;信用代码仍按原资格只读,保存、资质上传及提交审核行为不变。“企业认证资料”、帮助入口和现有状态标签同一行。
- 用户截图已核对输入边界和企业名称标签单行;后续数字对齐、占位文字及状态同行调整已获用户确认纳入规范。未据此推定资质区下半部分、错误态、普通/全屏及关闭重开的全部场景均完成视觉验收。相关定向检查已通过,本次写规范仅核对文档差异与引用,不重复执行业务测试。
+2
View File
@@ -1,5 +1,7 @@
# Admin 排车列表一体式布局试点
> 文档职责:仅维护历史试点依据与检查记录。通用样式统一以 [Admin 界面规范](Admin高密度界面规范.md) 为准;下文日期批次中的旧外观不再作为新改造要求。普通样式任务只在涉及本模块范围、例外或验收证据时查阅本文。
初次试点仅接入测试环境代码的 `/overseas-warehouse/dispatches`。依据为用户提供截图及 `新版.html` 的 `page-outbound-vehicle`(4472–4484 行);用户明确保留字段设置、搜索与表格不分离。2026-09-30 用户确认样板后授权推广至客户管理、国内仓、货柜管理和海外仓,并继续客户服务、海外业务、财务管理、通用、系统管理及消息列表。范围及例外见 [推广核对记录](Admin列表样式推广核对记录.md)。
船期日历单页收尾按用户当前截图接入相同的页头、筛选和连续容器,通过 `results` 插槽保留日历与当日船次详情。日历不具备表格列配置,明确关闭字段设置且不添加分页;日历日期格和右侧详情布局由业务页维护。
+26 -1
View File
@@ -1,5 +1,7 @@
# Admin 海外仓样式核对记录
> 文档职责:仅维护模块范围、业务例外与检查/截图记录。通用样式统一以 [Admin 界面规范](Admin高密度界面规范.md) 为准;下文日期批次中的旧外观不再作为新改造要求。普通样式任务只在涉及本模块范围、例外或验收证据时查阅本文。
## 范围与依据
本轮用户确认继续“海外仓”模块。范围以 `adminNavigation.ts` 的 `overseas-inventory` 分组为准,按当前公开菜单、对应独立详情和实际调用的作业弹框逐项核对;当前分组包含11个菜单,废弃单和海外库位管理均单独登记。客户服务、海外业务、隐藏产品库和旧箱号页面不在范围内。
@@ -28,7 +30,7 @@
| 派送单资料 | `DeliveryDocumentsDialog` 上传、替换、删除、下载、保存、重新加载确认 | 1040px;关闭放弃未保存修改 | 保留文件生命周期,正文单一滚动区 |
| 换标单 | `RelabelOrdersView` 新增、审核、查看 | 760px 表单;独立详情 | 保留创建与审核模式、状态候选与必填字段 |
| 换标详情 | `RelabelOrderDetailView` 完工证据、总 PDF、明细 PDF 上传/预览 | 连续详情、预览 900px | 保留 PDF 物理预览尺寸与绑定数据,紧凑文件行 |
| 托盘管理 | `PalletsView` 汇总、新增、编辑、查看;`PalletDetailView` | 760px 表单;独立详情 | 汇总改紧凑行;保留仓库编辑限制 |
| 托盘管理 | `PalletsView` 汇总、新增、编辑、查看;`PalletDetailView` | 顶部四张等宽统计卡片,采用公共紧凑卡片及图标样式,不继承186px最小高度;760px 表单;独立详情 | 统计卡片按2026-10-22用户参考截图并依后续反馈压缩高度:白底圆角、浅色图标、蓝色数字和“个”单位;原四项统计与筛选口径、仓库编辑限制保留;压缩后待人工1920×1080、100%缩放截图确认 |
| 库存管理 | `InventoryView` 汇总、查看、导出;`InventoryDetailView` | 独立详情,库位/托盘箱号/流水表 | 连续汇总、信息表;不改变库存口径 |
| 库存流水 | `InventoryTransactionsView` 导出、返回、关联数据 | 列表深链;共享关联框 1060px | 只为本轮调用显式接入共享框,保留分区域只读权限 |
| 退货库存管理 | `ReturnInventoryManagementView mode=inventory` | 库存/流水页签、查询、分页 | 两页签保留各自数据和查询模式 |
@@ -48,6 +50,14 @@
## 用户截图复核修正
2026-10-21 接续原“整理页面风格”对话的两张截图:`b93804b4-c276-49bb-bc41-7fc054f889f5` 显示排车顶部执行阶段比下方审核分区多缩进一层;`72efa811-a846-41a4-a074-3dde6d4c2ae0` 为用户指定的销量分析灰白行底色样板。本次仅调整公共对齐与表格斑马纹,修复后仍待人工截图确认。
| 操作 | 截图现状与目标 | 本次修正 |
|---|---|---|
| 排车列表执行阶段切换、审核分区及筛选 | 顶部页签叠加工具栏 12px 缩进,下方分区未叠加 | 主列表首个状态页签由公共样式抵消重复缩进;前置返回按钮、嵌套列表保留自己的间距与布局 |
| 排车及其他标准列表查看、悬停、选中 | 多数列表显式关闭斑马纹;销量分析默认灰白相间 | 清理历史关闭属性,使用 DataTable 默认斑马纹;保留悬停/选中提示和业务行色,行底色不穿透内嵌表 |
| 主列表底部分页 | 用户补充底部 padding 过大;集成列表仍为最小 64px、上下 14px | 公共主列表分页收紧到最小 48px、上下 6px、左右 12px;保持按钮尺寸与换行,内嵌表格不继承该布局;待人工截图 |
用户提供尾程详情与国内订单详情截图后,确认上一轮仅接入密度变量不足以达到样板一致:尾程存在重复页头标签、缺少业务摘要、自定义绿色状态边框、页签首项贴边且选中底色缺失、基本信息被两个标题拆断。截图证据为本轮附件 f76bcf5f(尾程)与 151a1d06(国内样板)。
| 操作 | 样板及现状 | 本次修正 |
@@ -171,6 +181,21 @@
截图337—351唯一维护在[跨模块清单](Admin国内仓样式核对记录.md),视觉待人工1920×1080、100%缩放截图确认。本地Mock覆盖先建空单、档案/临时资源、组配置保留、整组来源展开、未知结果原请求、明确拒绝重选及已证明转换后的详情重读;未真实创建或转换草稿、排车、档案及业务数据,未提交、推送或部署。下一批接续排车详情的维护/审核/移货/卸货顺序等动作窗口及附件预览,其余Admin模块仍待整理。
## 排车第14、16项当前核对(2026-10-22)
依据本轮确认:移除“调整已有排车货物”入口,调度审核采用约1100px居中弹框,信息、三类照片与审核操作分区清晰。尺寸与滚动继续使用《Admin高密度界面规范》的资料审核弹框规则。
| 页面 / 操作 | 确认承载与布局 | 当前实现 | 验收结论 |
|---|---|---|---|
| 智能排车 / 新建安排 | 保留新建草稿选货;删除已有排车调整入口 | 删除旧页签、独立组件及调用;保留三栏草稿选货、分组转换与空单创建 | 自动检查通过;待1920×1080、100%缩放实页确认 |
| 排车 / 调度及理货审核 | 居中弹框约1100px,三类照片横向并排 | 1100px及原全屏能力;车辆与货物、排车与预约、照片和审核意见分区;底部保留驳回、审核通过 | 自动检查通过;待1920×1080、100%缩放实页确认 |
本轮159项相关检查通过(5份业务测试157项、2项排车样式合同),AGENTS索引合同1622项通过。第15项已核对各阶段、装车前分区及DELIVERY/PICKUP/LOCAL_TRUCK均显示后端主单createdAt,沿用现有实现。共享样式整文件另有4项非本轮页面失败:订单详情概览类、货柜尾程费用行操作类、订舱详情局部36px规则、入仓预约分区旧断言;未修改对应页面,不将其计作通过。本轮仅本地实现与检查,未执行提交、部署或真实HTTP验收。
本轮文件(相对`apps/admin-web/`):修改`src/modules/overseas-warehouse/components/SmartDispatchDialog.vue`、`SmartDispatchDialog.test.ts`、`DispatchWorkflowDialog.vue`、`DispatchWorkflowDialog.test.ts`、`DispatchWorkflowDialog.layout.test.ts`;删除同目录`SmartDispatchExistingCargo.vue`及`SmartDispatchExistingCargo.test.ts`;同步`src/modules/overseas-warehouse/AGENTS.md`、`src/modules/overseas-warehouse/pages/prototypeContract.test.ts`、`src/styles/adminDensity.test.ts`及本记录。前述预约/BOL与6–9、11项改动保留;此包已停止编辑,交总控统一集成验收。
以下2026-10-20记录保留当时证据;本轮涉及的入口与审核尺寸以本节为准。
## 统一弹窗整理:排车详情操作与取证附件(2026-10-20)
实际操作承载为DispatchWorkflowDialog,直接引用DispatchResourceFields、DispatchArrangeFields和DispatchEvidenceFiles;后者也供DispatchDetailView只读取证使用。保留560/760/1120px动作尺寸及900px图片预览,不改变详情路由、服务器Gate、版本化命令、费用覆盖、文件鉴权或恢复协议。
+17
View File
@@ -16,3 +16,20 @@
本次只调整样式,消息发送、标记已读、模板写入、取消与重试均仅使用离线 Mock 验证,不向真实账号发送消息。42 项定向检查、253 个文件 / 1981 项全量测试、类型检查、构建和 git diff --check 均通过;本地 Vite 五个组件资源均返回 200。三个列表、两处抽屉、两处编辑弹框及状态确认均待人工在 1920×1080、100% 缩放下截图确认。
对五个组件的脚本 AST 与修改前比较,排除样式导入和确认框 customClass 后相同。新增原生 Element Plus 挂载用例核对了按权限查看/已读、任务与模板状态操作、两处详情抽屉、模板不可变编码/变量预览/版本及定时发送表单。实际字段校验、消息发送及服务端结果仍由人工业务验收补充。
## 2026-10-20 蓝白样式接入
沿用上方六行逐操作矩阵。三个正式列表及新建消息/模板编辑两个弹框显式接入主题;列表使用外层 `workbench-table`,两个弹框自身带 `admin-workbench is-dialog`,我的消息和任务详情仍分别为 680px/820px 抽屉并声明 `admin-workbench is-drawer` 独立主题作用域。取消/重试、激活/禁用确认同样显式接入;正文、模板变量、接收范围、失败原因和投递明细保持原语义。
消息中心定向回归通过;全量门禁由总控统一执行,所有修改后的状态及浮层均待人工截图确认。未新增渠道、草稿、导出或业务写入,未部署。
2026-10-20 用户追加修正:整页主列表与详情外壳使用 `is-page-surface` 取消外围整圈边框、圆角与阴影,页面保持连续白底;本组共 22 处主列表和 6 处详情容器,内部子表、指标/图表卡片、独立并列面板及弹框保持原边界。布局、内边距和脚本不因本修正改变;公共规则与全量门禁由总控统一收口。财务相关三文件 41 项定向复验通过,视觉仍待人工截图确认。
## 2026-10-21 弹框可用性回归
新建消息的模板变量名称来自服务端白名单,原来与普通字段共用固定 100px 左侧标签;长英文变量名没有换行约束。仅将变量字段标签上置,使用自动宽度及允许单词内换行,其他发送设置、定时选择、权限和请求数据保持。真实组件挂载新增长变量名与发送载荷回归,和原全屏、失败保留草稿、关闭/重开及详情抽屉用例共 22 项通过。
仍待用户截图核对长变量标签、输入区、定时发送、长正文和错误状态;不以挂载测试替代排版与正文/页脚滚动验收。公共 CSS 与 AppDialog/AppDrawer 修复由唯一公共写者集成,本域不覆盖公共规则;未打开浏览器、未截图、未部署。
+13
View File
@@ -41,3 +41,16 @@
2026-09-14 检查结果:财务、公共密度和导出提示定向测试 183 项通过;全量 `pnpm test --maxWorkers=4` 为 251 个文件、1950 项通过;`pnpm typecheck`、`pnpm build`、`git diff --check` 通过。新增/编辑、审核、上传、部分核销、金额守恒及导出行为沿用原有财务测试,未删除这些业务断言。
代码检查与财务行为测试不等同于视觉验收;所有本轮修改后的页面和弹框仍待人工在 1920×1080、100% 缩放下截图确认。
## 2026-10-20 蓝白样式接入
保留上方六菜单、11 路由和逐操作矩阵。五个主体页面显式接入蓝白主题,两个应收/应付路由封装继续复用同一主体;列表、流水、充值申请和对账单明细通过外层 `workbench-table` 接入,独立结算/对账单详情使用 `workbench-panel is-flush`,表单与凭证弹框分别声明主题作用域。保留行密度、宽表横向滚动、原有权限、幂等、金额和危险状态;未恢复没有当前路由消费者的 `CustomerStatementsPanel`。
应收款统计打印继续隐藏查询、工具栏与分页,并在打印媒体中取消新增页面内边距、卡片阴影,沿用原打印尺寸。直接 `el-table` 的主题支持由总控公共样式统一集成,不在财务模块复制配色规则。财务相关定向回归通过;本组共同 SFC/绑定核对及 61 文件 611 项定向结果见客户管理核对记录的同日结果。全量门禁由总控统一完成;11 路由及弹框仍待 1920×1080、100% 人工截图确认,未发布。
2026-10-20 用户追加修正:整页主列表与详情外壳使用 `is-page-surface` 取消外围整圈边框、圆角与阴影,页面保持连续白底;本组共 22 处主列表和 6 处详情容器,内部子表、指标/图表卡片、独立并列面板及弹框保持原边界。布局、内边距和脚本不因本修正改变;公共规则与全量门禁由总控统一收口。财务相关三文件 41 项定向复验通过,视觉仍待人工截图确认。
2026-10-21 浮层回归抽查:实际挂载检查客户账户充扣/授信/充值审核与凭证、费用来源和对账单生成/调整、应收应付创建与部分核销。沿用当前表单、宽表、错误和草稿逻辑,本批未发现需改写财务展示文件的新问题。相关选定行为回归通过;公共浮层修复合并后,普通/全屏、错误长文、凭证二级预览和正文/底部操作仍待人工截图确认。
+143
View File
@@ -1,5 +1,148 @@
# Admin 货柜管理样式核对记录
> 文档职责:仅维护模块范围、业务例外与检查/截图记录。通用样式统一以 [Admin 界面规范](Admin高密度界面规范.md) 为准;下文日期批次中的旧外观不再作为新改造要求。普通样式任务只在涉及本模块范围、例外或验收证据时查阅本文。
## 拖车预约说明提示清理(2026-10-21)
依据用户本轮拖车预约详情截图:移除说明图标及其提示内容,让页面更清爽。
| 页面 / 操作 | 现有承载与截图依据 | 本次变更 | 验收 |
|---|---|---|---|
| 拖车预约详情 | 原独立详情页;截图中的历史关联快照、拖车费、派车信息 | 删除三处 InlineHelp 及无用导入/样式;共享表单的新建与编辑入口同步移除费用和派车说明 | 定向5文件44项通过;待人工1920×1080、100%截图确认 |
| 拖车预约详情 → 单号去重 | 用户追加截图指出同一提单号显示四次 | 顶部仅保留预约号和状态,删除包含订舱号/提单号/订单号的副标题及历史关联快照行;订舱号在选择框、提单号与仓库在订舱带入信息各保留一处 | 定向5文件44项通过;待人工截图确认 |
保留订舱/供应商业务资料、字段、折叠区、校验、权限、状态操作及真实错误/阻断提示;只对展示位置去重,不改数据或共享提示组件。
本次类型检查、生产构建通过;全量4255项中4254项通过,唯一失败是并行排车文案改动后的 `overseas-warehouse/pages/prototypeContract.test.ts:264` 仍断言旧提示文字,与本次拖车提示清理无关。报告:工作区 `.codex-tmp/trucking-help-cleanup-20261021-tests.json`、`.codex-tmp/trucking-help-cleanup-20261021-full.json`。未改动排车在途文件。
## 浮层隔离与附件布局复查(2026-10-21)
本轮由用户反馈“推广后弹框混乱、不好用”触发,保留原承载与业务规则;不因定向测试通过关闭人工验收。
| 入口 / 操作 | 代码定位与问题 | 已修范围 | 人工待验 |
|---|---|---|---|
| 船期详情 → 人工补录节点 | `CarrierScheduleQueryPanel` 的子 AppDialog 原留在父框 DOM 内 | 子框显式挂到 body,保留原宽度、权限和提交 | 普通/全屏、长内容、错误重试、取消重开和父框独立状态 |
| 拖车预约 → 附件 | `TruckAttachmentDialog` 文件选择区无收缩边界 | 文件区可收缩、长文件名换行,上传/删除按钮不被挤压 | 长文件名、上传失败、全屏与重开 |
| 货柜/预装清单 → 新增模拟柜 | `ContainerSimulationCreate` 位于 DataTable 工具栏插槽,子框仍是工具栏 DOM 后代 | 显式挂到 body;工具栏公共样式另由公共唯一写者限制作用域 | 两入口普通/全屏、底部按钮尺寸、取消重开与创建失败 |
首两项定向9文件92项通过。模拟柜问题先经真实 DataTable + Element 挂载复现,第二轮4文件75项通过,保留校验、创建、取消与重开行为;公共浮层及工具栏第二轮10文件148项通过,覆盖嵌套表格和子表单密度。总控最终在 `db3b5f7157c900b885ade2626014f70c61cb0849` 输入上完成全量466文件4255项全部通过、应用类型检查与生产构建通过,1127份源码及配置快照前后一致;证据为 Admin `.logs/admin-style-audit-20261021/verification.json` 和 `full.json`。公共框架、独立主题根及工具栏选择器隔离规则统一见[风格参考](界面参考/蓝白卡片式工作台风格参考.md#弹框与抽屉的布局边界)。以上为本地代码验证,人工截图仍待确认,本轮总控未触发发布。
## 智能装柜跨客户加入与箱数对齐(2026-10-20)
### 智能装柜嵌套弹框回归(2026-10-21)
| 入口 / 操作 | 当前承载及源码依据 | 本次问题与修复范围 | 人工待验 |
|---|---|---|---|
| 订单 → 智能装柜 → 加入当前柜次 | `SmartLoadingDialog → GlobalSmartLoadingView → AppDialog`,外层默认全屏且body裁切,内层920px并可全屏 | 二级弹框未声明 `append-to-body`,实际DOM留在外层裁切/主题范围内;仅二级加入独立挂载,保留失败信息和原输入 | 父子普通/全屏、长成员表、失败保留输入、取消重开、父框状态与滚动 |
| 单柜智能装柜 → 按入仓码分配箱数 | `SmartLoadingWorkbenchView.vue`,780px确认弹框 | 四列表格右半行又套140px表单标签,标签与资料列错位并压缩输入;改用同一表格标签列并保留必填、上下限和提交 | 普通数量、整组/整托、输入及底部操作 |
本轮不继续修改跨客户装柜后端或权限,保留上一轮修复及错误诊断展示。`SmartLoadingCandidateInbounds` 的展开内容与主工作台三栏暂未发现新的局部裁切规则;公共AppDialog/主题部位选择器由公共唯一写者处理。当前没有新增真实页面截图,全部视觉项待人工1920×1080、100%确认。
本轮与国内测量、上传直接消费者合并运行定向6文件123项复验通过;装柜部分覆盖 `GlobalSmartLoadingView`、`SmartLoadingWorkbenchView`、`SmartLoadingDialog`。新增实际DOM断言证明二级加入位于外层工作台之外,取消不关闭父框,父子全屏独立,重开恢复原输入初始化;原待审核/普通/整托/同柜组提交、失败保留输入与诊断断言保留。仅两份装柜展示文件有变化,业务脚本一致;普通/全屏高度、滚动、分页及底部按钮实际视觉仍待人工截图,不因自动检查通过宣称验收完成。
用户截图 `codex-clipboard-708cec4f-a0c5-4f76-a2f5-8bfceeb998ca.png` 反馈确认加入后提示无权限、箱数输入未对齐;原始响应为 `A0403 / 客户归属不匹配`。源码确认是 `SmartLoadingService` 将柜次关联订舱的客户快照误作候选/加入/调整的客户白名单,并被前端统一403提示掩盖;不是本次管理员缺少操作权限。
后端移除该旧限制,候选、普通入仓、待审核占位、整托、调整及推荐允许跨客户,仍保留每票权威客户身份、显式筛选、权限、版本、占用、容量及作业门禁。正式语义见[阶段三4.3](头程到尾程分阶段流程/阶段三-国内货柜履约与出仓.md#43-智能推荐和人工加入)。未改IAM、网关或账号权限,也不修改测试存量数据。
“本次分配箱数”改用与上方相同的原生表格标签列,输入位于其余三列,保留必填语义、原上下限及提交逻辑。加入失败及诊断标识在当前分配弹框内呈现,保留箱数输入;主工作区不重复同一错误。真实缺权限仍按原403拒绝,不自动重试或放宽授权。
经 `local-check.ps1` 完成前端定向2文件50项测试及类型检查,均通过。后端定向 `SmartLoadingServiceTest` 的 Maven 检查已完成生产源码编译,但测试编译被工作区另一处 `FirstlegDocumentNumberGeneratorTest` 的3处旧 `JdbcTemplate` 构造参数阻断,尚不能认定服务回归通过;未改写该编号重构的在途文件。跨客户候选、普通加入和待审核加入的回归断言已同步。未部署,真实接口与1920×1080、100%缩放下的对齐效果待更新服务后人工确认。
## 货柜详情截图反馈(2026-10-20)
依据用户截图 `codex-clipboard-3e6e27f8-10fe-4b74-93a3-0bcd5ead5a11.png`,本次只调整共享货柜详情及其实际消费的异常、履约轨迹展示;当前工作区的其他在途改动保留。
| 页面 / 操作 | 截图依据与当前承载 | 本次结论 |
|---|---|---|
| 国内 / 海外货柜详情、页签切换 | `ContainerDetailView.vue` 独立页面,摘要后有较大间距;Element 页签混用原生按钮组布局类 | 采用现有 compact 页面间距,页签只用 Element 密度原语;保留路由、返回、页签及其权限 |
| 货柜信息与异常只读 | 六项字段以四列排布,最后半行空白;无异常记录仍显示表头 | 六项按两行三列展示;空异常只保留提示,有记录时保留原表头与完整历史 |
| 船期维护与历史 | 船名航次标题、按钮、资料各占一行;长船名航次换行较多 | 维护入口移至标题同行,船名航次列加宽;原船期弹框、读写权限与保存流程不变 |
| 履约轨迹与人工补录入口 | 五列无表头列表,操作人字号偏小,说明与来源区域难区分 | 高密度模式复用公共资料表,增加时间、类型、事件、说明、操作人 / 来源表头;完整换行,保留记录与排序;非高密度消费者继续沿用原列表,人工节点仍使用原弹框 |
首次定向10文件195项及类型检查通过。随后其他任务更新公共密度样式,定向复验10文件196项中193项通过;3项公共合同失败指向本次未修改的 `UnifiedOrdersView.vue`、`DispatchesView.vue`、报废页面的缺失闭合标签。本次货柜布局合同、全部9个直接业务测试文件继续通过。构建已执行,在类型检查阶段被海外仓换标订单 `RelabelOrdersView.vue` 的缺失变量错误阻断;不改写其他任务在途页面以消除失败。
全量检查完成:455个文件通过、9个文件失败;4099项通过、5项失败,另7个测试套件加载失败。失败证据包括其他页面未解决的合并标记、缺失闭合标签、重复插槽、测试文件加载失败,以及模拟柜表单字段数与其测试断言不一致。检查期间公共 `adminDensity.css`、`adminWorkbench.css` 及公共合同继续发生变化,此结果不作为全工作区冻结验收;本次三个业务组件及轨迹测试的散列保持一致,差异空白检查通过。未部署,视觉待人工在1920×1080、100%缩放下截图确认。
## 智能装柜弹框截图优化(2026-10-20)
依据用户截图 `codex-clipboard-79bcfb9c-3433-4b62-af9c-d3e6a4bbce19.png`,保留 `SmartLoadingDialog → GlobalSmartLoadingView` 的默认全屏、普通尺寸、三栏作业和二级分配弹框。
| 操作/区域 | 截图与现有实现 | 本次结论 |
|---|---|---|
| 主工作区 | 中间柜次栏占20%,候选客户列70px,左右关键数量/重量/体积排在较后位置 | 中间改240px,左右共享剩余空间;客户、数量与重量/体积优先,托盘和规则等字段保留横向查看;不缩小行高、字号 |
| 柜次选择 | 卡片重复标题与柜次号;无集装箱号显示“空柜” | 柜次号作主标题,保留柜号、渠道、仓库/柜型和选择态;缺柜号显示“模拟柜次/待补录”,不推断货物为空 |
| 查询 | 两个日期框均只显示“开始日期/结束日期” | 明确创建和预计到货起止含义,保留查询参数、布局偏好和原查询/重置事件 |
| 普通/全屏与滚动 | 外层边缘贴紧;表格撑满高度后分页仍占用额外空间 | 正文保留紧凑边距,普通模式加宽;三栏各自滚动,表格与分页共享列高;保留原关闭/重开和全屏状态行为 |
本次只改上述组件的展示配置、模板和局部布局;API、权限、计划状态、数量/金额计算与提交逻辑保持。顶部去掉与右侧容量条重复的重量/体积,分配箱数明确归属当前柜次。视觉结论待人工1920×1080、100%截图确认。
已落实为:柜次栏240px,左右按1.05:1分配剩余空间;客户列120px、入仓码180px,数量及重量/体积前移,其他字段和固定操作列保留。普通弹框加宽至最多1840px,正文保留公共12px紧凑边距;主弹框正文样式限定在直接子元素,不串入二级弹框。表格和分页改为同列伸缩,柜次卡片压缩重复标题并保留长编号换行与键盘焦点。
经 `local-check.ps1` 完成定向3文件51项覆盖,首轮一项旧“柜子数量”文案断言失败,更新后工作台47项复验通过;主弹框作用域最后2项复验通过,类型检查及差异空白检查通过。业务脚本核对仅查询展示参数和列配置有变化。未部署,未自行打开浏览器;普通/全屏、长编号、空态、宽表和分页的实际布局待用户截图确认。
## 蓝白工作台接入矩阵(2026-10-20)
本批按[蓝白样板](界面参考/蓝白卡片式工作台风格参考.md)接入,复用本记录及国内仓固定编号,不另建进度表。保留原独立详情、弹框、嵌入工作台、打印和表格尺寸;本批未部署,人工视觉均待 1920×1080、100% 截图确认。
用户随后要求移除包住整页主要内容的整圈边框:货柜、预装/装柜清单、订舱、拖车、报关、国内出仓和船期信息的主列表外壳,以及清单非内嵌独立详情增加 `is-page-surface`。公共去边框规则和页面边距由总控维护;嵌入清单、智能装柜三栏弹框/子表格、详情内部独立分区和各业务弹框保留原边框。本批仅修改14个源码中的15处模板类名并补记原矩阵,不改 padding、脚本、打印或业务承载,不重复全量检查;待人工截图确认。
用户继续指出详情主面板重复 padding:`LoadingListDetailDrawer` 的 `workbench-panel is-compact is-page-surface` 在独立清单详情叠加页面12px,在货柜清单页签叠加外层业务卡14px。本次由公共屏幕样式将显式主面板 padding 设为0;页根、货柜独立业务卡及原打印内距保留,组件参数、业务脚本和操作承载不变。独立预装、正式装柜清单和国内/海外货柜清单页签均为直接回归范围,视觉待人工新截图确认。
顶部排列收口:共享 `ContainersView` 的“未完结/已完结”页签移至 `DataTable #toolbar-start`,替代重复列表标题,保留原状态类并加入 `workbench-list-tabs`。查询仍在 `filters`,新增模拟柜与其他操作位置、权限和事件不变;`ContainerWorkbenchView` 的国内装柜/海外清关提柜属于业务阶段切换,保留外层独立导航,不与列表状态页签合并。预装/装柜、订舱、拖车等无同级业务页签的列表仅沿公共工具栏紧凑规则,不删标题。视觉待人工截图确认。
| 页面与代码证据(相对 Admin `src/modules/`) | 操作与现有承载 | 本批结论 |
|---|---|---|
| `container-loading/pages/ContainerWorkbenchView.vue`、`ContainersView.vue`:国内/海外模式 | 两个正式列表;45—51号编辑、模拟柜、订舱关联、还柜、邮件与拖车记录浮层 | 共用列表外框和阶段页签接入;现有模拟柜加宽及其他在途逻辑保留 |
| `container-loading/pages/ContainerDetailView.vue` 及实际 Overview/Customs/Fees 子组件 | 国内/海外独立详情,52—82号还柜、DO、异常、清关、卸货、拖车、柜费、托盘打印与船节点 | 连续详情、资料/历史表及浮层主题接入,未知、失败和危险语义保留 |
| `container-loading/pages/SmartLoadingWorkbenchView.vue`:分配表、候选表;`SmartLoadingDialog → GlobalSmartLoadingView` | 柜次智能装柜独立路由;订单列表及预装清单的全局三栏弹框和二级弹框 | 保留分配与候选布局、各栏滚动及模型面积,接入表格、面板及独立浮层主题 |
| `loading-lists/components/LoadingListsView.vue`、`PreloadPlanDetailView.vue`、`ConfirmedLoadingListDetailView.vue`、`LoadingListDetailDrawer.vue` | 预装/装柜两类列表及独立详情;运输、备注、确认、托盘/PDF打印与柜次费用弹框 | 列表及详情接入;名含 Drawer 的内嵌详情保持原承载;打印纸张规则保留 |
| `ocean-bookings/pages/OceanBookingsView.vue`、`OceanBookingDetailView.vue`、Documents/Print 子组件 | 订舱列表、新增/详情独立页、36—41号打印选择/PDF预览、放舱、文件替换/作废及删除确认 | 列表、资料分组与浮层接入;PDF版面、原放舱资格和不可逆警告保留 |
| `trucking/pages/TruckAppointmentsView.vue`、Create/Detail、Form/Attachment 子组件 | 预约列表、新增/详情独立页、42—44号附件与状态确认 | 紧凑表单及详情面板接入;不改订舱快照、承运商与状态 |
| `customs/pages/CustomsCasesView.vue`、`outbound-dispatch/pages/OutboundDispatchesView.vue` | 历史报关、国内出仓列表及原详情弹框、提交/确认操作 | 查询/表格及浮层显式接入;门禁和原操作保留 |
| `port-schedules/pages/PortSchedulesView.vue`、Carrier/Container 面板 | 船期列表、维护/历史弹框、货柜详情履约轨迹及人工节点浮层 | 保留两类节点含义与详情滚动,统一外框及证据表 |
公共组件和全量门禁由总控统一维护;本组仅做必要定向检查。接口、权限、状态、金额及业务脚本不在本批改造范围。
本批实际源码清单(均相对 `apps/admin-web/src/modules/`):
| 模块 | 修改文件 |
|---|---|
| `container-loading` | `pages/ContainerWorkbenchView.vue`、`ContainersView.vue`、`ContainerDetailView.vue`、`GlobalSmartLoadingView.vue`、`SmartLoadingWorkbenchView.vue`;`components/ContainerCustomsPanel.vue`、`ContainerLastLegFeesPanel.vue`、`ContainerOverviewPanel.vue`、`ContainerSimulationCreate.vue`、`OceanBookingLinkDialog.vue`、`SmartLoadingDialog.vue` |
| `loading-lists` | `components/LoadingListsView.vue`、`LoadingListDetailDrawer.vue`、`ContainerFeesPanel.vue`、`PalletLabelPrintDialog.vue`;`pages/ConfirmedLoadingListDetailView.vue`、`PreloadPlanDetailView.vue` |
| `ocean-bookings` | `pages/OceanBookingsView.vue`、`OceanBookingDetailView.vue`;`components/OceanBookingDocumentsPanel.vue`、`OceanBookingPrintDialog.vue` |
| `trucking` | `pages/TruckAppointmentsView.vue`、`TruckAppointmentCreateView.vue`、`TruckAppointmentDetailView.vue`;`components/TruckAppointmentForm.vue`、`TruckAttachmentDialog.vue` |
| `customs` | `pages/CustomsCasesView.vue` |
| `outbound-dispatch` | `pages/OutboundDispatchesView.vue` |
| `port-schedules` | `pages/PortSchedulesView.vue`;`components/CarrierScheduleQueryPanel.vue`、`ContainerPortSchedulePanel.vue` |
已完成列表真实外壳、详情卡片、资料/证据表与浮层主题接入;旧报关、出仓及船期详情的广域 `:has` 弹框覆盖和重复正文滚动已移除,使用原 AppDialog 公共框架。三栏智能装柜的表格外层保留伸缩和独立滚动;清单独立详情采用卡片,货柜页签内保持平铺;打印保留原紧凑正文内边距并去掉屏幕卡片阴影。缺失查询任务编号显示“—”。已有客户选择器、放舱修正与模拟柜1000px宽度改动均保留,未发现活动写入冲突。
总控集成时需把本批49个真实消费者纳入公共合同,并补原生 `el-table` 的中性色覆盖(订单详情、测量/审核、价格版本、柜级尾程费用、清单历史、托盘打印、船期日历与出仓门禁)。这些表格保留原几何和状态色,本组未复制一套公共表格默认规则。独立查询已使用 `workbench-query`,关联抽屉已使用 `is-drawer`。
本批定向65文件807项的分段检查、失败复验及最终模板编译结果统一记录于[国内仓本批检查结果](Admin国内仓样式核对记录.md#蓝白工作台接入矩阵2026-10-20)。业务脚本与本批起点的散列核对无漂移(仅排除样式及帮助组件导入);API、类型、权限和路由未修改。全量集成检查及人工1920×1080、100%截图待总控和用户完成。
新增模拟柜加宽的当前发布状态见[模拟柜宽度 TEST 发布记录](测试环境单机部署与配置契约.md#admin-simulation-width-test-20261020),下方尚未部署为修改当时的检查记录。
货柜搜索区修正的当前发布状态见[Admin 展示修正 TEST 发布记录](测试环境单机部署与配置契约.md#admin-display-fixes-test-20261020)。下方未部署说明为修改当时的记录,当前状态以主契约为准。
## 新增模拟柜宽度反馈(2026-10-20)
| 页面 | 操作 | 截图依据及当前实现 | 本次结论 |
|---|---|---|---|
| `/container-loading/domestic` | 新增模拟柜 | 用户截图 `codex-clipboard-fe50c8ba-755f-43c0-9c20-385564d80d06.png`;560px弹窗、两组横排,仓库和渠道占位文字被截断、规格说明多次换行 | 已接入高密度的货柜入口宽度改为1000px,并保留视口减28px上限;未接入高密度的其他消费者仍为560px。字段、标签、两组排列、默认柜型、规格、仓库渠道联动及创建请求不变 |
定向3文件114项、类型检查、构建通过;组件测试同时验证高密度入口1000px、其他入口560px及原创建请求。全量454文件4105项中4103项通过,2项导航/海外主数据路由断言失败,分别为 `adminNavigation.test.ts` 的菜单清单及 `overseas-master-data/routes.test.ts` 的路径与权限清单;本次未修改这两处实现或断言。组件脚本未变,组件及直接测试在检查前后散列一致。本次宽度调整尚未部署,待人工1920×1080、100%缩放截图确认。
## 货柜列表搜索区截图反馈(2026-10-20)
| 页面 | 操作 | 截图依据及当前实现 | 本次结论 |
|---|---|---|---|
| `/container-loading/domestic` | 客户、关键词、柜型、状态及预计开船日期筛选 | 用户截图 `codex-clipboard-d6d00778-4a50-4222-a75e-841261550182.png`;页面将公共搜索栏最后一组设为 `width:100%; flex:0 0 100%`,日期和按钮被强制另起一行 | 删除页面的强制整行覆盖,沿用 QueryToolbar 按可用宽度自然换行;最后一个筛选与查询、重置、布局按钮继续成组。筛选字段、顺序偏好、字段宽度、查询及重置行为不变 |
仅删除共享货柜列表的一行局部布局声明,不修改公共组件或筛选业务;同源海外工作台沿用同一排布。未部署;1920×1080、100% 缩放的新布局待人工截图确认。
检查结果:初次定向 3 文件 / 118 项、类型检查、构建通过;全量执行 448 文件 / 4056 项通过,但期间其他任务修改了 16 项源码输入,该结果不作为最新工作区冻结快照的完整验收。补查本页、模拟柜直接依赖、公共搜索栏及密度合同共 120 项,119 项通过,1 项失败:另一处修改删除了模拟柜说明中的“创建后自动生成柜次号”,`ContainersView.test.ts:632` 的旧文案断言尚未同步。本次未改写该组件或该断言;搜索布局合同与公共搜索栏检查通过,最终类型检查及构建重新通过。搜索页面、公共搜索栏和本次密度合同在检查前后散列一致。
## 统一弹窗整理:预装清单与全局智能装柜(2026-10-20)
本批沿预装清单的正式详情路由,以及订单列表实际调用的`SmartLoadingDialog → GlobalSmartLoadingView`进入,依据已确认的[测量样板](界面参考/Admin弹窗样板-测量.png)和[高密度规范](Admin高密度界面规范.md)。全局智能装柜实际为候选、柜次、方案三栏数据工作台,本批保留三栏尺寸、筛选、独立滚动及默认全屏。截图编号从91接续。
+27
View File
@@ -56,3 +56,30 @@
- 本地 5173 返回这七页及排车列表的新密度代码,HTTP 均为 200。排车列表已是纯省略号入口;代码与开发服务验证不能代替页面截图。
通用 10 菜单代码检查完成,全部待人工在 1920×1080、100% 缩放下核对修改后截图。首页、系统管理另行继续。
## 2026-10-20 客户财务基础组蓝白接入
本组覆盖供应商列表/独立新增/编辑/详情及资质弹框、快递公司列表/580px 编辑抽屉/批量导入、往来单位列表/680px 详情与编辑抽屉/批量导入、费用项目列表/620px 编辑抽屉/各自确认、仓库列表/650px 编辑/760px 导入、下载中心列表/720px 任务详情。另按实际入口覆盖 `warehouse-resources` 的库位与托盘列表及原居中编辑弹框;不扩展当前页面没有的业务操作。
各页面保留现有密度类并显式接入 `admin-workbench`;DataTable 的外层接入 `workbench-table`,Teleport 弹框及批量导入自身带 `admin-workbench is-dialog`,抽屉自身带 `admin-workbench is-drawer`。局部普通配色使用公共主题变量,危险色、状态、下载/重试资格和打印流程保持。当前公共批量导入消费者通过父传 class 显式接入,不修改共享组件。
上述本组页面、弹框及抽屉的定向回归通过,仍待人工截图确认。全量门禁由总控统一执行;没有部署、推送或真实业务写入。海外资料和国内价格簿属于另组,其结论以对应任务为准。
2026-10-20 用户追加修正:整页主列表与详情外壳使用 `is-page-surface` 取消外围整圈边框、圆角与阴影,页面保持连续白底;本组共 22 处主列表和 6 处详情容器,内部子表、指标/图表卡片、独立并列面板及弹框保持原边界。布局、内边距和脚本不因本修正改变;公共规则与全量门禁由总控统一收口。财务相关三文件 41 项定向复验通过,视觉仍待人工截图确认。
### 列表顶部紧凑化
依据 2026-10-20 用户整柜截图的最新要求,减少列表标题、操作和页签叠层;本组按实际结构核对如下,视觉待人工截图确认。
| 页面或范围 | 当前结构与操作证据 | 本轮收敛 |
|---|---|---|
| 供应商列表 `suppliers/pages/SuppliersView.vue` | 标题与新增在工具栏;分类、统计数量和筛选另占下方区域,分类通过 `switchCategory` 切换 | 原分类导航整块移入 `toolbar-start`,保留 `supplier-tabs density-status-tabs` 并加 `workbench-list-tabs`;新增仍在 `toolbar-actions`,`QueryToolbar` 仍在 `filters`。分类图标、数量、ARIA 和事件保持 |
| PDA 版本 `pda-releases/pages/PdaReleasesView.vue` | 国内/海外 radio 与当前 APK/WGT 信息在单独上下文行;刷新、上传在工具栏 | 原应用切换与版本事实整块移入 `toolbar-start` 并加 `workbench-list-tabs`,保留原类、radio 键盘语义、绑定、当前版本与未发布状态;刷新、上传及发布/停发确认保持 |
| 客户、财务及本组其余标准列表 | 已有标题、操作同处工具栏,没有独立列表分类页签 | 复用总控维护的公共紧凑尺寸,不批量删除标题,不改客户费用特殊入口、汇总、状态或警告;客户详情内审计面板不参与此次列表合并 |
只调整上述两页列表模板及对应既有结构断言,不改脚本、API、权限、详情或弹框。通过 `local-check.ps1` 运行 `SuppliersView.test.ts`、`SupplierRouteReuse.behavior.test.ts`、`PdaReleasesView.test.ts`,3 个文件、17 项测试通过;公共尺寸和全量门禁由总控统一维护。
2026-10-21 浮层回归抽查:供应商资质、仓库创建/导入、快递公司编辑/导入、费用项目编辑、下载任务详情与审计详情的选定组件回归通过;本批不因静态检查未见问题就批量改写这些页面。与财务/IAM/客户费用一起,选定 12 文件 200 项回归通过;另客户与消息局部修复 56 项通过。长内容、校验、关闭重开、全屏与页脚的真实排版仍待截图,不能由挂载结果推定视觉通过。
@@ -26,3 +26,16 @@
- 本地 5173 的四页源码编译请求均为 200,并返回密度样式入口;该证据只证明开发服务提供了当前代码。
此批无剩余代码检查失败;修改后视觉仍待人工截图。全模块沿组件引用继续复核,不能由四页通过推断其他共享子弹框全部通过。
## 2026-10-20 平台用户与权限蓝白接入
本组只覆盖 IAM 三个正式页面:平台用户、角色权限、菜单权限及原有 650px/860px/720px 居中编辑框、启停/删除确认。页面和浮层显式接入蓝白主题,DataTable 采用外层 `workbench-table`;保留权限树、半选、受保护账号/资源、海外 PDA 仓库绑定和未保存逻辑。活动客户远程选择器 `useActiveCustomerOptions`、公开导出及其既有在途修改均未接管。首页由本批总控负责,本节不推断首页完成状态。
IAM 相关定向回归通过;全量门禁由总控统一完成,三页及其操作待人工在 1920×1080、100% 缩放下截图确认。未部署。
2026-10-20 用户追加修正:整页主列表与详情外壳使用 `is-page-surface` 取消外围整圈边框、圆角与阴影,页面保持连续白底;本组共 22 处主列表和 6 处详情容器,内部子表、指标/图表卡片、独立并列面板及弹框保持原边界。布局、内边距和脚本不因本修正改变;公共规则与全量门禁由总控统一收口。财务相关三文件 41 项定向复验通过,视觉仍待人工截图确认。
2026-10-21 浮层回归抽查:平台用户与角色权限实际挂载回归通过,含海外 PDA 仓绑定、权限树初始化与半选、错误后保留草稿、确认和关闭行为。本批未修改 IAM 展示文件或在途客户选择器。长权限名称、展开后的树、普通/全屏和底部保存的实际排版仍待用户截图确认;首页不属于本组回归结论。
+238 -114
View File
@@ -1,35 +1,32 @@
# Admin 高密度界面规范
# Admin 界面规范
## 确认依据与适用范围
本文件是 **Admin 样式的唯一主规范**,统一维护蓝白风格、业务密度、列表、详情、弹窗、提示文字与公共样式接入。沿用原文件路径,已有引用无需迁移。验收视口为 **1920×1080,浏览器缩放 100%**。
2026-09-14,用户在 Admin 样式优化对话中确认订单列表样板,并要求以此推进国内仓样式统一。样板包括订单列表、测量与订单审核弹框、订单详情的基本信息、货品信息、费用信息、状态历史、测量数据、其他、拆分履约。详情页签使用与客户管理一致的彩色 Emoji 图标。
## 按任务阅读
本规范固定该样板的视觉与密度规则。验收视口为 **1920×1080,浏览器缩放 100%**。其他页面采用本规范不等于其功能或视觉已验收。
先看本节和“基本原则”,再只读任务对应章节,不要求每次通读全文。
这是一套后续 Admin 页面可复用的基线。新增菜单按“新模块接入规则”实施,不复制订单或客户模块 CSS;货柜管理的入口与共享组件边界见 [货柜管理核对记录](Admin货柜管理样式核对记录.md)。海外仓的 10 个菜单及共享详情边界见 [海外仓核对记录](Admin海外仓样式核对记录.md)。列入下一批入口不代表页面已完成改造或验收。
| 当前任务 | 本文入口 |
|---|---|
| 调整列表、搜索、页签、行操作 | [列表](#列表)、[尺寸与颜色](#尺寸与颜色) |
| 调整详情、费用、历史或测量 | [详情与基本信息](#详情与基本信息)、[费用、汇总与测量](#费用汇总与测量)、[历史、备注与空态](#历史备注与空态) |
| 新增、编辑、审核、上传、预览或确认弹窗 | [弹框与表单](#弹框与表单) |
| 提示小字、加载反馈、点击后页面跳动 | [提示文字与加载布局](#提示文字与加载布局) |
| 配色、工作台、指标卡或图表 | [蓝白主题与图表](#蓝白主题与图表);需要查看样板时再打开[样板目录](界面参考/蓝白卡片式工作台风格参考.md#其他页面该参考哪个样板) |
| 公共样式维护或新页面接入 | [公共样式维护边界](#公共样式维护边界)、[新模块接入规则](#新模块接入规则) |
| 确认验收方法与证据 | [前端验收规则](Admin-Client前端原型还原验收规则.md);其中不再另定 Admin 样式 |
当前推广范围包括 Admin 导航中的“国内仓”,以及本轮确认的“客户管理”两个入口:客户列表、海外仓阶梯费用,包含各入口实际使用的详情、页签、新增、编辑、审核、确认、图片/文件预览和其他业务弹框。客户管理下的海外仓阶梯费用属于客户费用配置,不扩大到海外仓作业菜单。跨菜单跳转应记录目标入口和共享组件影响;不因此把另一个菜单的全部页面自动加入改造范围。Client、PDA 与其他菜单采用规范时另行明确范围。
## 适用范围与文档职责
样板实现入口:
- [公共密度样式](../apps/admin-web/src/styles/adminDensity.css):页面显式使用 `admin-density`,Teleport 弹框显式使用 `admin-density-dialog`;默认不改变其他菜单。
- [公共密度变量](../apps/admin-web/src/styles/adminDensityTokens.css):两模块的字号、间距、控件/行/按钮/页签高度、圆角、底色和按钮语义色的唯一默认值入口。
- [维护合同检查](../apps/admin-web/src/styles/adminDensity.test.ts):限定已接入消费者,检查变量归属、公共样式作用域及页面重复实现。
- [测量作业密度](../apps/admin-web/src/modules/inbounds/measurement/measurementDensity.css):测量与审核共享作业布局,宽度由测量弹框自身提供。
- [国内仓逐操作核对记录](Admin国内仓样式核对记录.md):三组页面的承载方式、例外和验收证据。
- [客户管理局部密度样式](../apps/admin-web/src/modules/customers/customerDensity.css):客户列表、详情、计费与相关弹框的显式密度入口。
- [客户管理逐操作核对记录](Admin客户管理样式核对记录.md):两个菜单入口及关联详情、审核、编辑与预览的范围和人工验收项。
- [订单列表与详情](../apps/admin-web/src/modules/unified-orders/pages/UnifiedOrdersView.vue):列表、顶部摘要、描述表、页签、日志表及订单弹框。
- [订单局部密度样式](../apps/admin-web/src/modules/unified-orders/styles/orderDensity.css):费用、履约与测量弹框的局部样式。
- [国内仓导航](../apps/admin-web/src/core/navigation/adminNavigation.ts):`domestic-warehouse` 分组是菜单范围来源。
本规范与 [Admin/Client 前端原型还原验收规则](Admin-Client前端原型还原验收规则.md) 配合使用。在本规范适用范围内,已确认的密度、容器和页签图标规则优先于历史原型中的大卡片、大留白和单色页签图标;字段、业务分组、权限、操作语义及页面/弹框/抽屉承载方式仍按当前业务契约和逐操作矩阵核对。样板中某个字段的专属宽度不能直接当作其他页面的固定宽度。
2026-10-19,用户确认以下“[弹框与表单](#弹框与表单)”作为所有 Admin 弹窗的统一目标规范,按大模块逐组落实,首组为导航“国内头程”。该弹窗目标范围补充上文早期推广范围;页面、列表、详情页签及 Client/PDA 仍按各自已确认范围执行。规范固定不表示全部弹窗已改造或验收。
- 本规范是后续 Admin 改版基线:订单与客户管理样板确立业务密度,测量样板仅供参考弹窗基础框架,其分区配色与作业布局属于局部例外;蓝白自营样板确立配色、工作台和少提示文字风格。已确认的样式优先于历史原型中的对应外观;业务字段、分组、权限、状态、API、计算口径及页面/弹窗/抽屉承载方式仍按当前业务契约和逐操作确认保留。
- 规范适用于 Admin;Client、PDA 不自动套用。按用户确定的模块和操作范围逐批实施,规范统一不代表全端已改造或验收,也不授权批量替换公共默认值或发布。
- 本文只维护当前有效规则,不并列保留已被替代的通用样式。新增确认直接修改对应条款,不在文末继续追加另一套规则。代码令牌是数值的唯一实现入口,变更须同步本文对应条款。
- [蓝白样板目录](界面参考/蓝白卡片式工作台风格参考.md)只保存页面参考和原图;[排车列表试点](Admin排车列表样式试点.md)只保存历史依据。二者不再定义通用样式。
- 模块记录只维护本模块改造范围、业务例外、检查结果与截图证据,不覆盖本文通用规则: [国内仓](Admin国内仓样式核对记录.md)、[客户管理](Admin客户管理样式核对记录.md)、[货柜管理](Admin货柜管理样式核对记录.md)、[海外仓](Admin海外仓样式核对记录.md)、[列表推广](Admin列表样式推广核对记录.md)、[自营](../apps/admin-web/src/modules/self-operated/operation-matrix.md)。只读本轮实际涉及的记录,不要求全部加载。
## 基本原则
表格顶部操作栏的桌面尺寸统一由 `DataTable.vue` 维护:`padding: 6px 12px`、`min-height: 44px`。普通栏与 `.is-compact` 共用尺寸,后者只改变对齐;不再按 1920px 断点切换尺寸。公共密度样式和业务页面不得重复声明这部分 padding / height;组件现有移动端排列规则保留。
表格顶部操作栏的基础桌面尺寸由 `DataTable.vue` 维护:`padding: 6px 12px`、`min-height: 44px`;显式接入蓝白主题的主列表使用本文“蓝白主题与图表”的 48px 最小高度。普通栏与 `.is-compact` 只改变对齐,不按 1920px 断点切换尺寸;页面不得重复声明公共 padding / height,已有移动端排列规则保留。
1. 普通业务内容采用连续白底、细边框、描述表与数据表格。短字段以“标签 + 值”连续排列,不制作独立指标卡片。
2. 先压缩重复标题、重复汇总、容器层数和无意义留白,再调整列宽与行高。正文保持可读,不通过缩小整页、浏览器缩放或截断关键值提高密度。
@@ -51,42 +48,64 @@
| 页签图标 | 17px,固定 18px 占位,独立彩色显示 |
| 普通表格行 | 基准 36px,单元格上下内边距 4px;按内容自然增高 |
| 普通输入框与工具栏按钮 | 通常 32px |
| 表格内操作按钮 | 28px,保留文字、焦点和禁用反馈 |
| 表格内操作按钮 | 基准 28px;已接入标准列表使用纯文字行操作,保留焦点、禁用与处理中状态 |
| 区块间距 | 通常 12px;标准列表遵守现有 ListPageLayout 的单一间距,不叠加页级空白 |
| 普通内容内边距 | 12px;弹框正文 12px 16px |
| 容器圆角 | 0–4px;普通数据区无装饰阴影、渐变或上浮效果 |
| 容器圆角 | 普通业务数据区 0–4px;独立搜索区 5px、作业分区 8px、蓝白指标卡 16px 按各自规则,不叠加整页外框 |
| 内容底色 | 白色 |
| 表头、描述表标签底色 | 浅灰,参考 #f8fafc / #f9fafb |
| 表格表头 | 浅蓝底 `#edf4ff`、深蓝文字 `#284b78`,标准列表、工作台、弹框/抽屉内 Element 表格及 `density-table` 共用 |
| 描述表标签底色 | 浅灰,参考 #f8fafc / #f9fafb,不跟随表格表头变蓝 |
| 边框 | 现有 `--cc-border`;表格参考 #e5e7eb |
| 悬停、斑马纹 | 轻量区分,参考 #f3f7fb / #fcfcfd |
颜色优先复用当前 `--cc-*` 与 Element Plus 语义变量。金额和测量数字可使用等宽数字排版,只有总计或关键结论适度加粗,不将每个值都加粗。
表头颜色由 `foundation.css` 的 `--cc-list-table-header-bg` 与 `--cc-list-table-header-text` 唯一维护。颜色优先复用当前 `--cc-*` 与 Element Plus 语义变量。金额和测量数字可使用等宽数字排版,只有总计或关键结论适度加粗,不将每个值都加粗。
## 提示文字与加载布局
2026-10-21 用户确认:Admin 页面默认不额外添加提示小字、装饰性副标题、功能介绍或独立说明行;用户明确要求展示的业务信息按实际用途保留。
- 常规加载、刷新、查询及页签切换不新增“页签数量加载中…”“数据加载中…”等独立文字行,不为每个局部请求补充提示小字。
- 加载反馈复用原位置、固定尺寸的加载图标、按钮 loading、区域遮罩或与内容等尺寸的骨架;加载前、加载中、完成后保持页签、工具栏、筛选区和表格的布局稳定,不因临时提示插入或移除而推挤内容、改变区块高度或造成页面跳动。不为被禁止的提示行额外预留空白。
- “覆盖加载状态”“保留状态反馈”不等于新增可见说明行。保留 `aria-busy` 等可访问语义;必要的读屏播报不得占用可见布局。
- 接口失败与重试、表单校验、权限限制、过期或异常状态、实际操作阻断和危险后果继续清楚反馈,在对应位置集中表达,避免重复;不得以精简小字为由隐藏影响用户判断或操作的信息。
- **详细口径按需展开。** 计算公式、统计口径、图例、来源解释和操作说明放入已有说明入口或 `InlineHelp`/tooltip,支持键盘聚焦;不为每张卡增加介绍段、装饰性副标题或长解释。确需影响判断的周期、单位和版本保留最短必要表达。
- **同一事实只讲一次。** 多张卡共用的统计周期、完整性或来源在分区层级统一表达;卡片仅显示自身特有状态。主状态、进度环、数量卡与阶段节点不重复整段等待原因。
- **异常优先合并到一个清晰入口。** 同一异常影响多块内容时,在相关区域保留一条简短状态与查看详情/重试入口;不要在每张卡和图表下重复警告。独立异常仍在对应位置明确呈现,不能合并后丢失作用范围。
- **关键异常与阻断常驻。** 当前失败、未知、陈旧、权限不足、操作阻断及危险后果必须能直接识别;细节可以展开,关键状态不能只藏进 tooltip。正常完整状态不需要逐卡反复宣告。
- **事实与视觉分开。** `0` 表示已知零值,`—` 或“待确认”表示未知;历史结果和陈旧快照要有简短标识。精简文案不得把未知显示为零、把暂停显示为完成,也不得隐藏真实风险。
库存分析样板按这套规则收敛:快照解释、“本仓概览/截至日期/采集时间”整行及图表范围说明移入已有说明入口;正常指标卡只保留名称、数值和单位,删除重复的“已确认”。真实未知、陈旧和异常继续显示简短提示。删除独占一行的“展开图表”,将图表操作并入顶部简短入口。完整数值来源、采集时点和估算细节可在说明或 tooltip 中查看;估算值必须能辨认其估算属性,不得因精简文案冒充实测值。
## 各类页面规则
### 列表
- 继续使用 `ListPageLayout + QueryToolbar + DataTable`。查询、批量操作、表格、分页构成连续工作区,不重复放置正文大标题或统计卡片。
- “操作”列始终第一列,需要固定时固定在左侧。最多三个高频操作直接显示,更多操作使用已有菜单约定;保留页面已确认的直接操作数量。国内仓全部 7 个菜单及客户管理的行内业务操作采用下述纯文字描边按钮。危险动作保留明确文字与确认。
- 列宽按实际编号、状态和按钮数量决定;不能把样板的 260px 操作列套给所有列表。核对最多按钮、加载中和权限变化后的布局。
- 数值列右对齐,单位优先放表头;编号按业务需要设置宽度。保留横向滚动、列偏好、分页和已有行内编辑能力。
- 使用 `ListPageLayout + QueryToolbar + DataTable`,搜索/筛选区与下方表格分成独立区块,搜索区圆角统一 5px。`foundation.css` 的 `--cc-list-query-radius` 与 `--cc-list-query-gap` 维护尺寸;DataTable 筛选容器提供边框、底色及下方 16px 间距,内部 QueryToolbar 不重复套卡片。独立 QueryToolbar 使用相同圆角及列表已有区块间距。
- 同级状态/分类页签与顶部业务按钮共用工具栏:页签放 `toolbar-start`,操作放 `toolbar-actions`/`toolbar-end`,查询放 `filters`;蓝白页签加 `workbench-list-tabs`。不叠加重复路由标题、页签行、按钮行;保留真实业务子分区、统计数量、失败重试与当前范围。
- “操作”列在第一列,需要固定时固定在左侧。默认最多三个高频操作直接显示,其余用更多菜单;保留已确认的直接操作数量、权限和危险确认。更多入口为 `…`(`MoreHorizontal`),保留业务对象相关的可访问名称与悬停提示,菜单项纯文字。
- 已接入标准列表的行操作采用纯文字:无描边、填充或装饰图标,400 字重,普通操作蓝色、危险操作红色、禁用灰色、悬停无下划线。`RowActions` 用 `text-actions`;手写按钮组用 `row-actions density-actions admin-text-actions`,危险语义通过 `data-tone="danger"` 或 `type="danger"` 显式指定。统一外观由 `adminTextActions.css` 维护,不再沿用早期国内仓描边行按钮。顶部、查询及弹框提交按钮按各自用途保留,不机械套用行操作外观;尚未接入的消费者在本轮明确范围内再调整。
- 状态列前置:有主要业务编号时紧跟编号,没有编号时紧跟主要名称;多个当前状态集中排列,操作列仍在第一列。DataTable 的状态列通过 `afterColumn` 显式指定跟随的列键,恢复已保存的列序时仍遵守该位置,状态列不独立拖动;其他列的个人顺序、列宽和显隐继续保留。历史记录中的原状态、新状态及状态变化保留事件阅读顺序。
- 列宽按实际编号、状态和按钮数量决定,核对长编号、最多按钮、加载与权限变化;不把样板操作列宽套给所有列表。数值列右对齐,单位优先放表头;保留横向滚动、列偏好、分页和行内编辑。
- 标准 DataTable 沿用默认灰白斑马纹,不由页面显式关闭;行底色复用 `--admin-row-stripe`,悬停行、当前行及悬停单元格由 Element 状态样式处理,父表底色不穿透子表。
- 表格与分页交界只画一条底线:Element Plus 的 `el-table__inner-wrapper::before` 保留,紧邻该表格的 DataTable 分页不再叠加上边框;自定义结果区域仍保留原分页分隔线。不全局隐藏表格底线,避免空表和无分页表格缺边。
- `appearance="integrated"` 保留原组件组合能力,不再表示搜索与表格必须相连。样式维护在 DataTable 和公共 CSS,不为接入样式切换业务模式。
- 详情内的充值申请、账户流水等连续表格同样使用 `workbench-table is-page-surface` 去掉 DataTable 外壳的重复边框、圆角和阴影,保留表格本体边线、横向滚动和分页。筛选放在 DataTable 的 `filters` 插槽时,接入 `appearance="integrated"`,由筛选容器独占边框与底色;内部 QueryToolbar 不再绘制第二层边框或阴影。优先复用这些公共入口,不在页面追加隐藏边框的覆盖规则。
#### 国内仓行内按钮(以订单列表样板统一)
#### 公共列表能力
依据用户提供的白底描边按钮参考图,订单列表行内操作采用纯文字、白底、1px 细边框,无阴影,圆角 6px;保持 28px 高、13px 字号、600 字重、左右内边距 10px、按钮间距 6px。该按钮圆角为明确例外,普通内容容器仍为 0–4px。
Admin 仍使用 Element Plus。普通 `el-select` 由构建组件解析器统一接入 `src/shared/components/AdminSelect.ts`,仅将 `filterable` 默认值设为 `true`,使用 Element Plus 原有渲染、插槽、事件和公开方法;列表、表单、弹框及分页选择框均可输入关键词筛选当前选项。已有 `remote-method`、`filter-method`、多选、禁用和清空行为保持原有配置;搜索不改变候选业务范围,也不会自动新增远程接口调用。虚拟托盘选择框 `el-select-v2` 已显式启用远程搜索。
- 默认行内操作(详情、编辑、备注、更多):蓝色文字 `#1777ff` 与浅灰边框,由 `--admin-action-neutral` 统一维护。
- 审核“通过”:橙色文字与浅橙边框,保留原确认流程。
- 测量:紫色文字与浅紫边框。
- 悬停使用对应浅色底,键盘焦点保持可见;禁用、处理中状态保留。更多入口统一为 `…`(Lucide `MoreHorizontal`),保留包含业务对象的“更多操作”悬停提示和可访问名称;下拉项纯文字。
推广时列设置显式使用 `column-settings-mode="show"`。已有 `preference-key` 保持,新接入的退货库存、流水和箱号各使用独立偏好键。存在非阻断警告时使用 `notices` 插槽,列表失败时通过 `results-visible` 隐藏结果和分页,标题、查询与重试保持可用;`before-results` 保留原统计与汇总。特殊工作台可使用 `results` 插槽承载原内容和自身分页,公共表格不重置它的页码与每页数量。
该规则覆盖订单列表、订单测量、测量数据审核、预装清单、库位管理、托盘管理、整柜业务以及其详情中的行内操作。查看/编辑/备注为默认蓝色 `#1777ff`,测量为紫色,审核为橙色,启用为绿色,停用/删除为红色。预装共用组件只在 `preload` 模式接入,已确认装柜清单模式保持原规则。顶部查询/新增/批量操作和弹框提交仍使用 32px 主次按钮,不机械改成行内按钮,也不增加样板中不存在的业务操作。
列宽保存为公共 DataTable 能力,与已有列设置一同启用(提供 `preference-key` 且列设置可用),不依赖试点样式。拖动表头边界松开时,将宽度按稳定列键写入同一份本地偏好;重排、隐藏再显示不会丢失,刷新/重新进入时恢复。账号与表格分别隔离,仅保存到当前浏览器,不跨设备同步。“恢复默认”同时重置列顺序、显隐和宽度,重新采用页面声明的 width/minWidth。未启用列设置的表格不写入列宽偏好。
#### 客户管理按钮与详情
- 客户列表、海外仓阶梯费用及关联详情、编辑、审核、预览的业务操作按钮采用纯文字;查询、重置、复制也去掉装饰图标。分页箭头、列设置、筛选布局、关闭与全屏等独立图标控件保留,处理中旋转图标保留。
- 客户列表行内按钮沿用 28px 白底描边、6px 圆角、6px 间距:详情/编辑/更多为默认蓝色 `#1777ff`,审核为橙色,重置密码为紫色,跳转登录为蓝色,启用为绿色,停用/删除为红色。更多入口与订单列表统一显示 `…`,不显示“更多”文字;悬停提示及可访问名称保留,菜单项纯文字,保留原权限与操作分配。
- 海外仓阶梯费用列表按原档位顺序显示“天数:单价”,在费用单元格中连续排列、整组自然换行;不制作每档独立白块,不强制左右两列,不隐藏后续档位。币种只在独立列展示,计费单位保留在表头;零单价照常显示 `0`,没有档位显示“—”。编辑按钮沿用默认蓝色 `#1777ff` 文字、白底描边。
- 客户列表行操作采用上文统一纯文字规则;保留原权限、操作分配、更多入口和危险确认。
- 海外仓阶梯费用列表按原档位顺序显示“天数:单价”,在费用单元格中连续排列、整组自然换行;不制作每档独立白块,不强制左右两列,不隐藏后续档位。币种只在独立列展示,计费单位保留在表头;零单价照常显示 `0`,没有档位显示“—”。列表编辑按钮沿用统一纯文字行操作。
- 阶梯费用编辑弹框中的“新增阶梯”为蓝字浅蓝边、“删除”为红字浅红边,均使用 28px 高、6px 圆角的白底纯文字按钮;客户详情的海外仓费用编辑同步执行。底部保存/取消沿用 32px 主次按钮。按钮规则同时覆盖页面与 Teleport 弹框,并显式设置普通、悬停、焦点及禁用状态,避免默认主题色覆盖。
- 客户详情保留彩色页签;企业信息用连续四组键值表,联系与合作信息保留三组键值表,长地址整行。资质文件采用连续行,企业成员使用表格。
- 客户新增/编辑保留 1120px 三列表单,入驻审核保留 1040px,箱规规则编辑保留 1200px,海外仓阶梯编辑保留 1120px。宽度属于当前内容的适配值,不推广为全局默认。
@@ -96,18 +115,19 @@
- 第一行集中放返回、业务编号、核心状态及主要操作。下一行用可换行摘要展示关键上下文,不使用大数字概览卡。
- 返回使用 `density-back` 轻量导航,与业务编号和状态排在同一行,保留箭头、文字、键盘焦点及原返回目标。该行并入连续白底详情区域,不为返回单独增加卡片或空白行;整柜库存的标题行与基本信息共用一个信息区。
- 页签紧接摘要。页签已表达的标题不再在正文重复占用一大行;数量、更新时间与相关操作可放紧凑工具栏。
- 短字段通常每行四组,长内容跨两组或整行。描述表标签浅灰、数值白底,边线连续;标签宽度以 112px 为样板参考,按字段实际长度调整。
- 短字段通常每行 4–6 组,按内容和业务分组调整,长内容跨列或整行。描述表标签浅灰、数值白底,边线连续;标签宽度以 112px 为样板参考,按字段实际长度调整。
- 保留字段顺序和业务分组,不使用会改变阅读顺序的自动密集填空布局。
- 同一个订单或实体内部的内容连续分区,不再层层套卡片。
### 费用、汇总与测量
- 汇总使用单行摘要或紧凑描述表。自动费用与其他费用保持各自业务口径,金额、单价、计费量、附加费和版本完整展示。
- 客户资金账户详情采用已确认的六项紧凑金额卡片,复用公共 `workbench-metric is-compact` 外观;保留授信有效期、到期和负余额状态。导出流水与充值、扣款、授信操作集中在详情页头,流水区不再单独设置导出工具栏。结算单应收/应付详情同样使用三项紧凑金额卡片展示应收/应付、已收/已付、未结余额,到期日保留在基本信息中。以上为已确认的详情页例外,不推广到其他详情。
- 保留公式、计费依据和价格来源入口,不能为了减少行数合并不同口径的金额或重量。
- 测量各来源保留独立分组;展开时在表尾显示合计,折叠时在标题显示摘要,同一口径不在上下重复占位。
- 测量作业弹框采用用户确认的彩色分区:申报与实测对比浅绿(`#f4fbf8`)、客户申报明细浅蓝(`#f7f9ff`)、箱规明细浅黄(`#fffbf4`),保留浅色背景、细边框和 8px 圆角,不使用左侧强调色条,作为连续白底规则的局部例外。区块不得使用负外边距伸出正文;左右内边距由 `measurementDensity.css` 统一维护,通用密度规则不得将其清零。保持 1560px、92vh 居中作业弹框及原有业务分组,不因修复裁切而移除彩色分区。 三个分区同级排列,客户申报不得嵌套在实测大框内。箱数、毛重、体积集中在“指标/客户申报/平台实测/差异(实测 − 申报)”表中,不在下方重复总数;未采集显示“未测量/待测量”,申报缺失显示“—”,相等显示“一致”。净重、材积重单独显示平台事实,不与申报毛重混比。 客户申报区保持只读;实际品名和预计托数放在“平台实测箱规”区,沿用原保存与权限规则。未采集时只保留主状态,有箱规和来源后显示采集来源;平台补充数据的口径说明通过提示展示。提交按钮旁显示当前订单状态、缺少测量或称重等实际阻断原因。 桌面布局中,对比区标题与客户、渠道、状态同排;申报区标题与原单据号码同排,标签和值横向排列;实测箱规标题、实际品名、预计托数及录入操作共享一行。长内容自然换行,不截断编号或缩小字号。提交阻断原因集中在固定底栏,正文不重复显示同一提示,业务状态、偏差和冲突提醒保留。
- 测量作业弹框采用用户确认的分区配色:申报与实测对比白色(`#fff`)、客户申报明细浅蓝(`#f7f9ff`)、平台实测箱规白色(`#fff`),保留细边框和 8px 圆角,不使用左侧强调色条,作为连续白底规则的局部例外。区块不得使用负外边距伸出正文;左右内边距由 `measurementDensity.css` 统一维护,通用密度规则不得将其清零。保持 1560px、92vh 居中作业弹框及原有业务分组,各区按当前确认配色呈现,不恢复已移除的绿色背景。 三个分区同级排列,客户申报不得嵌套在实测大框内。箱数、毛重、体积集中在“指标/客户申报/平台实测/差异(实测 − 申报)”表中,不在下方重复总数;未采集显示“未测量/待测量”,申报缺失显示“—”,相等显示“一致”。净重、材积重单独显示平台事实,不与申报毛重混比。 客户申报区保持只读;实际品名和预计托数放在“平台实测箱规”区,沿用原保存与权限规则。未采集时只保留主状态,有箱规和来源后显示采集来源;平台补充数据的口径说明通过提示展示。提交按钮旁显示当前订单状态、缺少测量或称重等实际阻断原因。 桌面布局中,对比区标题与客户、渠道、状态同排;申报区标题与原单据号码同排,标签和值横向排列;实测箱规标题、实际品名、预计托数及录入操作共享一行。长内容自然换行,不截断编号或缩小字号。提交阻断原因集中在固定底栏,正文不重复显示同一提示,业务状态、偏差和冲突提醒保留。
- 同一计算策略只保留一个明确操作入口,保存中、无权限、冻结与失败信息照常显示。
- 称重图片可用缩略图加紧凑事实行;保留查看原图、托盘/库位信息和人工修正入口。可视化、图纸、标签预览、库位示意等按业务用途保留合适尺寸。
- 测量称重图片可用缩略图加紧凑事实行;审核称重图片使用表格承载,保留查看原图、托盘/库位信息和人工修正入口。可视化、图纸、标签预览、库位示意等按业务用途保留合适尺寸。
### 历史、备注与空态
@@ -117,9 +137,9 @@
### 弹框与表单
本节是 **Admin 统一弹窗规范** 的唯一维护入口。2026-10-19 用户确认以测量作业弹窗为视觉样板,统一白底框架、紧凑标题栏、正文分区和固定底部操作。适用于 Admin 各大模块的新增、编辑、审核、只读查看、上传、预览及确认弹窗;按实际用途选择尺寸和内容结构。
本节是 **Admin 弹窗基础规范** 的唯一维护入口。通用统一范围限于白底框架、基础字号与控件、标题与操作区的可用性、间距和滚动边界;不统一业务正文结构、分区数量、字段排列、固定尺寸或装饰底色。普通表单与复杂作业弹框默认白底,按各自业务组织内容。测量样板的分区配色仅适用于已明确确认的具体窗口,不自动推广到其他新增、编辑、审核、上传、预览或确认弹窗。
参考图:[测量弹窗原始截图](界面参考/Admin弹窗样板-测量.png)(原附件 `codex-clipboard-3eeb665f-6eee-437e-886b-75d3cc0dc78e.png`)。截图只用于风格依据,尺寸沿用已确认规范;验收仍为 1920×1080、浏览器 100%,不按图片像素反推控件尺寸。
参考图:[测量弹窗原始截图](界面参考/Admin弹窗样板-测量.png)(原附件 `codex-clipboard-3eeb665f-6eee-437e-886b-75d3cc0dc78e.png`)。仅参考基础框架及该测量场景,不据此复制其他窗口的配色、分区、表格结构或尺寸;验收仍为 1920×1080、浏览器 100%,不按图片像素反推控件尺寸。
![Admin 弹窗样板:测量作业](界面参考/Admin弹窗样板-测量.png)
@@ -141,24 +161,38 @@
| 批量预览、对照与选择 | 约 1100px,随实际列宽调整 | 表格为主,保留数量、逐条明细和不可操作原因 |
| 测量等大型作业 | 样板 1560px、92vh | 业务分区、作业表格和固定操作底栏 |
以上为类型参考,不覆盖已有逐操作确认的业务尺寸,例如客户重置密码 520px、客户新增/编辑 1120px。宽度同时受视口边距约束;不得靠缩小字号、隐藏字段或截断关键编号来容纳内容。
以上只用于没有已确认尺寸的新窗口,不作为重排现有弹框的模板,也不覆盖已有逐操作确认的业务尺寸,例如客户重置密码 520px、客户新增/编辑 1120px。复杂工作台按真实信息量保留宽高、分栏与独立工作区;宽度受视口边距约束,不靠缩小字号、隐藏字段或截断关键编号容纳内容。
#### 正文分区、配色与密度
- 短字段使用紧凑表单或连续键值表,明细使用表格;按业务分组保持阅读顺序。分区标题可与客户、渠道、来源单号、状态或当前操作同行,长内容自然换行。
- 同一组含只读与可编辑数据时,优先放在一张连续信息表中:只读值直接展示,可编辑值在对应单元格中录入,保留标签、单位和焦点反馈。标签和值横排,不把只读字段做成禁用输入框;少量预估值并入同组末行,不为套用配色额外拆出大汇总卡片。配色统一不能增加层级、重复标题或挤压业务明细。
- 多分区作业采用浅色背景和细边框,取消左侧强调色条;分区圆角 8px,作为普通容器圆角规则的明确例外。分区同级排列,不层层套卡片。简单确认、短表单及普通说明保持连续白底,按需采用彩色分区。
- 同类信息复用同一配色,保留文字标题;颜色不代替业务状态或校验提示。
- 默认使用白底,通过原有业务标题、间距与必要分隔线组织内容;不得因存在录入、只读、汇总或多分区就套黄、蓝、绿背景,也不为套样板新增标题、卡片或分区。
- 保留已有表单、左右分栏、主从表、步骤、树表、筛选候选、图文对照及预览区域。字段多或交互复杂不构成改成连续信息表、三列表单或同级彩色区块的理由;确有布局问题时先记录具体问题,再单独调整该窗口。
- 只读值清楚展示,可编辑控件保留可辨识的边框、焦点、标签和校验;不为了连续表外观隐藏输入特征。仅在该窗口的信息关系适合且逐项确认后使用连续编辑表,不把只读与录入强制合并、不机械横排或并入汇总末行。
- 下表只记录测量作业的已确认配色例外,不是按信息用途自动映射颜色的通用规则。其他具体窗口需要彩色分区时,在本窗口核对记录中说明业务用途与确认依据;旧批次记录中的“黄色录入区”不等于本轮已确认保留。
| 信息用途 | 样板对应分区 | 浅底色 |
| 适用窗口 | 已确认分区 | 浅底色 |
|---|---|---|
| 汇总、实测对比与结论 | 申报与实测对比 | `#f4fbf8` |
| 来源资料、只读申报与明细 | 客户申报明细 | `#f7f9ff` |
| 当前录入、编辑与作业明细 | 平台实测箱规 | `#fffbf4` |
| 测量作业主弹框 | 申报与实测对比 | `#fff`(白底、普通细边框) |
| 测量作业主弹框 | 客户申报明细 | `#f7f9ff` |
| 测量作业主弹框 | 平台实测箱规 | `#fff`(白底、普通细边框) |
| 测量作业主弹框 | 测量偏差提示 | `#fff`(保留红色警示文字与图标) |
- 表格单元格以白底为主,表头浅灰;普通字号、控件高度、行高、间距沿用本规范公共令牌。单位、必填标识、校验错误、表单标签及原因说明完整保留。
- 表格单元格以白底为主,表头采用“尺寸与颜色”的统一浅蓝底、深蓝文字;普通字号、控件高度、行高、间距沿用公共令牌。单位、必填标识、校验错误、表单标签及原因说明完整保留。
- 汇总尽量只出现一次;表格已完整表达的字段不再另做统计卡片。错误、警告、成功及禁用状态继续使用现有语义,彩色分区不掩盖真实风险。
#### 输入框与字段
2026-10-22 用户确认以客户新增/编辑弹框的输入控件外观作为后续同类表单的参考;只统一控件外观与可用性,不据此复制客户的三列布局、表格结构或弹框尺寸。
- 文本、数字、日期、下拉选择及多行文本使用白底、可辨识的浅灰边框和 8px 圆角(`--cc-radius-lg`);悬停边框加深、聚焦使用蓝色边框。普通单行控件沿用通常 32px 的公共高度,多行文本保留业务需要的行数。不能通过透明边框把可编辑内容显示成普通文字。
- 普通文本与表单数字左对齐,包括注册资本、账期等;数字增减按钮与单位、币种保留原功能。此条不改变只读数据表的金额、数量列对齐方式。
- 横向排列的表单标签与控件垂直居中,由 `adminDensity.css` 统一处理;顶部标签保持原有上下排列。普通短字段标签优先单行,较长标签按实际文字单独加宽,不缩小字号或截断标签;长地址、备注等保留已确认跨列方式。
- 占位文字简短,避免长说明被输入框截断,例如客户昵称使用“选填,默认自动生成”。标签始终保留,不能仅靠占位文字说明字段含义;详细规则确有必要时放入已有说明入口。
- 只读值直接展示,与可输入控件明确区分;禁用、权限不足、校验错误、处理中和实际操作阻断保留原反馈。精简文案不改变字段可编辑资格、保存及审核流程。
- 分区标题、已有帮助入口与该分区状态标签优先同一行,例如“企业认证资料”与“启用”;不为简短状态单独占一行。内容过长时自然换行,不强行裁切。
- 字段旁及底部不重复铺设保存/审核流程介绍、只读规则等常驻小字,按[提示文字与加载布局](#提示文字与加载布局)处理;实际风险、错误和阻断原因仍须清楚反馈。
- 实现复用 Element Plus 控件。连续编辑表内的表单通过 `density-form--outlined` 接入 [adminDensity.css](../apps/admin-web/src/styles/adminDensity.css) 的白底与中性边框规则;客户参考实现为 [CustomersView.vue](../apps/admin-web/src/modules/customers/pages/CustomersView.vue) 与 [customerDensity.css](../apps/admin-web/src/modules/customers/customerDensity.css),后者当前限定客户编辑框的圆角和数字对齐。后续在明确修改范围内接入,通用外观维护在公共入口,不逐页复制颜色与控件规则,也不自动批量改造其他弹框。
#### 底部操作与交互
- 底部以细分隔线与正文区分,右侧排列原有取消、保存、提交等操作;一个阶段突出一个主操作,其他操作保持次级样式。按钮职责、顺序和保存触发方式按当前业务确认保留,不新增原本没有的“暂存”或“保存并提交”。
@@ -167,16 +201,27 @@
- 审核、确认清楚展示业务对象;批量操作保留逐票预览、选中数量和不可操作原因。加载中、无数据、接口失败、无权限、禁用与处理中均应有明确反馈。
- 保留提交锁定、原有遮罩/Esc/关闭规则、未保存保护及失败上下文;全屏切换、关闭和重开不丢失应保留的输入,不允许重复提交。关闭、全屏等功能图标保留,不为统一风格给标题、字段或按钮添加装饰 Emoji。
#### 作用域与嵌套
新增、编辑先参考公共 `AppDialog`/`AppDrawer`,表单字段排列仍参考本业务已确认的样板。客户新增/编辑使用三列短字段,地址、备注和长内容跨列;小型确认框保留原宽度。智能装柜等工作台保留原有宽版和 92vh 高度,不把所有浮层压成同一尺寸。
- 标题、正文和页脚样式只匹配当前浮层的直接子节点;业务页的 `:deep` 规则也必须限定自身,不能通过任意后代选择器影响子弹框。
- 不假设 `AppDialog` 默认一定挂到 body。嵌在另一个弹框、工具栏或有裁切的容器中的独立浮层,应明确设置 `append-to-body`,并把主题类放到实际浮层根。核对关闭、重开、全屏和取消仅影响对应窗口。
- 标题与底部操作不随长正文滚走,正文使用单一纵向滚动区;真实宽表可在自己的区域横向滚动。不要通过整框 `overflow: hidden`、固定短高度或隐藏按钮解决溢出。
- 底部多按钮可换行且保持间距;已有复合底栏(统计、分页、提交等)保留自身布局,不强制改成一排普通按钮。工具栏的紧凑按钮尺寸不得传入浮层。
- 工具栏只控制自身操作按钮及已核实的包装层,遇到浮层、弹出菜单或内嵌 DataTable 就结束作用范围;保留按钮组与下拉按钮,不能为隔离而使已有操作失去样式。
- 长校验错误应占据正常布局空间,不能遮住下一行;长文件名允许换行,文件选择、上传和删除按钮保持可用宽度。必填标识、字段标签、错误和提交反馈不为清爽而删除。
#### 公共维护与分模块落地
- 框架能力维护在 `AppDialog.vue`,默认尺寸、字号和间距维护在 `adminDensityTokens.css`,通用外观维护在 `adminDensity.css`。彩色分区推广时提取到公共令牌与显式接入的样式原语;模块只维护字段顺序、列数、业务分组和已确认的尺寸例外,不复制通用 CSS。
- 已提供的分区原语为 `density-dialog-section`,通过 `data-tone="summary/source/work"` 分别选择汇总绿、来源蓝、录入黄;分区标题使用 `density-dialog-section__title`,连续分区容器使用 `density-dialog-sections`。弹窗通过 `admin-density-dialog` 接入;保留抽屉并显式采用相同详情密度时使用 `admin-density-drawer admin-density-drawer--detail`;实际侧滑编辑使用 `admin-density admin-density-drawer admin-density-drawer--editor`,复用相同分区、连续编辑表和底栏,不改变其他抽屉。公共选择器保持原弹窗的优先级。测量样板与订单弹窗共同消费 `--admin-dialog-*` 令牌,后续模块沿用同一入口。
- 弹窗内简短说明显式使用 `density-dialog-note`,由公共样式维护辅助字号、颜色和尾距;业务页面不重复这些普通说明外观。
- 框架能力维护在 `AppDialog.vue`,基础尺寸、字号和间距维护在 `adminDensityTokens.css`,通用外观维护在 `adminDensity.css`。模块保留业务结构及已确认尺寸;不得通过修改公共默认值,批量去色、重排或重置所有弹框。
- `density-dialog-section` 及其 `data-tone="summary/source/work"` 是既有彩色分区实现能力,不是所有弹框的必选结构;仅在明确确认保留的场景使用。分区标题类为 `density-dialog-section__title`,容器类为 `density-dialog-sections`,存在公共类不构成采用理由。普通弹窗通过 `admin-density-dialog` 接入基础外观;抽屉按实际查看/编辑用途保留 `admin-density-drawer--detail`/`admin-density-drawer--editor` 等边界,不因此改成连续编辑表或复制测量分区。共用 `--admin-dialog-*` 令牌只统一基础能力。
- 确有必要且已确认的弹窗说明使用 `density-dialog-note`,由公共样式维护外观;是否展示遵循“提示文字与加载布局”,不因存在说明类就新增小字。
- JSON及原文快照显式使用 `density-code-block`,由公共样式维护代码字号、底色和边框;长内容完整换行,沿用外框正文滚动,不另设固定高度、内容截断或纵向滚动。快照属于诊断证据,不据此将数据库ID展示为业务编号。
- 连续信息表需要单元格编辑时,在 `density-table` 上显式添加 `density-table--editable`;数值与单位使用 `density-table-editor` 横排。输入的普通边框融入表格,保留悬停、键盘焦点及禁用反馈;页面只配置标签列宽和字段排列,不复制输入框外观。
- 小表单继续使用 `density-form`;末项已有明确紧凑尾距约定时显式添加 `density-form--flush-end`,不改变其他表单末项为校验错误保留的空间。
- Teleport 弹框自身显式使用 `admin-density-dialog`,原有 `ElMessageBox` 使用 `admin-density-confirm`;原生 `el-dialog` 的外观按同一规范接入,是否收敛到 `AppDialog` 按实际能力和消费者核对,避免一次替换全部弹窗。抽屉继续使用既有 `admin-density-drawer` 边界。
- 按“盘点当前大模块 → 填写逐操作矩阵 → 完成样板组 → 人工截图确认 → 推广本模块其余弹窗 → 模块整体核对”的流程推进。先从“国内头程”的订单列表相关弹窗开始,以测量弹窗为样板,再依次整理订单测量、测量数据审核、库位管理、托盘管理、整柜业务、船期管理。实际入口以 `adminNavigation.ts` 和模块路由为准,共享弹窗记录全部直接调用方。
- 已改造弹框按原固定编号清单逐项复核,方法见 [前端验收规则](Admin-Client前端原型还原验收规则.md#执行与验收)。每项先核对改造记录、当前实现及实际截图,再决定保留或局部修正;一个样板通过不授权批量推广其业务布局和配色。共享弹框记录全部直接调用方,已有代码检查与历史截图不能替代本次视觉确认。
- 后续每个大模块按同一流程开展,进度和截图结论写入对应模块核对记录;本规范只维护稳定规则。页面字段、状态、权限、接口、计算口径、校验和提交逻辑继续按当前业务契约执行。
- 代码检查与人工视觉结论分别报告,逐项核对普通/全屏/关闭重开、长内容、空态、错误和权限状态;缺少截图时标记“待人工截图确认”。按模块汇总发布范围,部署继续沿用对应环境授权规则。
@@ -199,53 +244,147 @@
彩色图标用于详情页签。国内仓 7 个菜单的行内按钮与客户管理业务操作使用纯文字;返回箭头、顶部与弹框的既有功能图标可保留。不要给操作按钮、表头或字段添加 Emoji。
## 国内仓推广清单与顺序
此表是实施入口,不是完成状态。每个入口必须继续沿实际组件引用盘点可达弹框与详情,不把父页面验收等同于所有子界面通过。
| 顺序 | 菜单 | 主入口(相对 apps/admin-web/src) | 本组应覆盖 |
|---|---|---|---|
| 样板 | 订单列表 | `modules/unified-orders/pages/UnifiedOrdersView.vue` | 列表、详情全部页签、测量、单票/批量审核及实际可达弹框 |
| 1 | 订单测量 | `modules/inbounds/pages/InboundMeasurementsView.vue` | 列表、测量作业、称重图片与相关编辑/预览 |
| 1 | 测量数据审核 | `modules/inbounds/pages/MeasurementReviewsView.vue` | 列表、审核工作区、明细、确认及当前实际存在的修正操作 |
| 2 | 预装清单 | `modules/loading-lists/pages/PreloadPlansView.vue`、`PreloadPlanDetailView.vue` | 列表、详情各页签、相关确认及打印/预览容器 |
| 3 | 库位管理 | `modules/warehouse-resources/locations/pages/LocationsView.vue` | 列表、详情、新增/编辑及实际存在的批量操作 |
| 3 | 托盘管理 | `modules/warehouse-resources/pallets/pages/PalletsView.vue` | 列表、详情、新增/编辑及实际存在的关联操作 |
| 3 | 整柜业务 | `modules/domestic-containers/pages/DomesticContainersView.vue`、`DomesticContainerInventoryDetailView.vue` | 入库/出库/库存工作区、库存详情与实际可达弹框 |
每组先统一列表,再处理详情与弹框;同一业务工作区一起交付人工查看。未注册、已重定向或只存在于历史原型的页面不能只凭文件存在就恢复或加入本轮。
## 实现与验收
1. 改造前读取最近指引,沿菜单、路由、组件与事件定位实际页面;填写逐操作矩阵。原型已有承载方式不因密度统一而替换,明确的样式改造可在已授权范围内推进。
2. 多个真实消费者使用同类密度时,将稳定尺寸与布局能力收敛到本应用的样式变量或现有共享组件的可选能力。先明确接入范围,不让全局默认变化影响尚未改造的菜单。
3. `adminDensityTokens.css` 定义默认值,`adminDensity.css` 承载通用组件规则;`orderDensity.css`、`measurementDensity.css`、`customerDensity.css` 只保留各自业务布局与引用公共变量的局部规则。按钮外观不得在模块中另写一套。跨菜单共用组件(如模拟柜创建、托盘码打印)通过可选 `dense` 参数接入;未传参数的调用保持原布局。
4. 弹框经 Teleport 后必须仍能获得对应样式。检查普通、全屏、关闭、重开以及多个入口使用同一组件时的表现;避免无边界的全局 `.el-dialog`、`.el-table` 或 `!important` 覆盖。
5. 每页检查长编号、长地址、多条数据、空态、失败态、无权限、禁用态及处理中状态;所有字段、单位、排序、权限与操作资格应保留。测试不得继续锁定已废弃的卡片结构,也不能删除业务断言以换取通过。
6. 按 Admin 指引运行直接影响测试、类型检查、全量测试与构建;公共组件检查实际消费者。视觉默认由用户在指定视口操作并截图,缺少证据标记“待人工截图确认”;用户明确要求 AI 界面验收时,按本轮授权操作并记录实际证据,不将代码测试当作视觉通过。
7. 每组交付说明修改页面、公共影响、检查结果、剩余视觉差异。任何尺寸或布局例外记录在逐页矩阵中,避免把一次性例外写成新的全局默认。
逐操作矩阵、人工截图与自动检查的证据要求统一见 [前端验收规则](Admin-Client前端原型还原验收规则.md)。本规范不记录通过状态;缺少截图保留“待人工截图确认”。实现前核对实际路由与直接消费者,保持字段、单位、排序、权限、提交及错误处理,测试不能锁定已废弃外观或删掉业务断言。
逐页核对记录模板:
## 蓝白主题与图表
| 页面/路由 | 操作及承载方式 | 原型或确认依据 | 采用规则/业务例外 | 检查与截图结论 |
|---|---|---|---|---|
| 填写具体页面 | 分别填写详情、编辑、审核、预览等 | 原型 ID、代码入口或用户确认 | 列表/描述表/日志/作业弹框等 | 代码检查结果;待人工截图确认或实际结论 |
### 视觉基线与维护入口
规范只记录稳定规则和入口。各组进度、临时问题与验收结果写入对应核对记录,不写入 `AGENTS.md`。
| 维护内容 | 唯一实现入口 |
|---|---|
| DOM 配色、字号、间距、圆角、阴影与辅助色 | [`adminWorkbenchTokens.css`](../apps/admin-web/src/styles/adminWorkbenchTokens.css) |
| 标题、指标卡、列表外壳、页签、阶段、图表空态与弹窗外观 | [`adminWorkbench.css`](../apps/admin-web/src/styles/adminWorkbench.css) |
| Canvas 图表字体、颜色、坐标网格与提示框主题 | [`adminWorkbenchChartTheme.ts`](../apps/admin-web/src/styles/adminWorkbenchChartTheme.ts) |
| 显式接入范围、变量归属、公共类与浮层作用域合同 | [`adminWorkbench.test.ts`](../apps/admin-web/src/styles/adminWorkbench.test.ts) |
| 原有表格、控件和弹窗密度 | [`adminDensityTokens.css`](../apps/admin-web/src/styles/adminDensityTokens.css)、[`adminDensity.css`](../apps/admin-web/src/styles/adminDensity.css) |
| 弹框与抽屉的标题、正文滚动和底部操作 | [`AppDialog.vue`](../apps/admin-web/src/shared/components/AppDialog.vue)、[`AppDrawer.vue`](../apps/admin-web/src/shared/components/AppDrawer.vue);真实 Element 挂载回归见 [`AppDialog.layout.test.ts`](../apps/admin-web/src/shared/components/AppDialog.layout.test.ts) |
## 国内仓、客户管理的样式维护边界
下列取值只用于显式 `admin-workbench` 主题内的对应元素;业务表格、控件与表单继续沿用上文密度值。代码以对应令牌为准,修改数值只改唯一实现入口并同步本表,不在页面重新声明默认值。
2026-09-30 确认的连续列表模式见 [排车列表公共接入规范](Admin排车列表样式试点.md):通过 `DataTable appearance="integrated"` 显式接入标题、业务按钮、查询、结果和分页共用卡片;仅操作列使用蓝色普通文字、红色危险文字并禁止悬停下划线。该模式的行高、卡片、搜索与页头样式由 DataTable 统一维护,行操作外观由 `adminTextActions.css` 维护;查询、顶部和弹框按钮保持原样。此约定优先于本节历史的行内描边、图标和独立路由标题规则;未接入页面保持默认。当前接入范围与特殊页面见 [推广核对记录](Admin列表样式推广核对记录.md)。
| 项目 | 样板基线 |
|---|---|
| 主操作与链接 | `--workbench-primary`,`#3784FA`;悬停、按下与禁用使用配套令牌 |
| 重点数字 | `--workbench-number`,`#1890FF` |
| 正文与辅助文字 | `--workbench-text`,`#1F2937`;`--workbench-muted`,`#64748B` |
| 表面与边框 | 白色主体,浅灰蓝辅助区;`--workbench-border`,`#E5EAF2` |
| 卡片与图标底座 | 卡片圆角 16px、图标底座圆角 12px,低强度阴影;使用公共令牌 |
| 普通指标卡高度 | `--workbench-metric-min-height: 186px`;长内容可自然撑高,紧凑指标不继承此最小高度 |
| 空间 | 外壳内容区上/左右 12px、底部 16px;工作台根内边距 `--workbench-page-padding: 12px`;区块间距仍为 24px,普通卡片内边距 20px、紧凑卡片内边距 14px、同级网格间距 18px |
| 主列表顶部 | 工具栏最小高度 48px、上下内边距 6px;筛选区上下 8px;两区左右统一 12px,普通按钮与筛选控件 32px;内容多时自然换行,不截断或固定总高度 |
| 主列表底部分页 | 最小高度 48px(border-box)、上下内边距 6px、左右 12px,与筛选区对齐;保留 32px 翻页按钮和长统计换行,不沿用集成列表旧的 64px 高度、14px 上下留白 |
| 文字层级 | 页标题 24px、分区标题 18px、普通指标名称 15px、重点数字 34px、紧凑指标数字 26px |
| 辅助色 | 青、绿、紫、黄、红用于图标、分区与真实状态,不能代替状态文字 |
本节维护表适用于已接入页面及其实际子组件,当前范围以推广核对记录为准。此次收敛以保留业务字段、权限、计算与承载方式为前提。
白色和细边框负责分层,不反复套大卡片;标题与数值形成重点,单位和补充说明降低权重。蓝色强调重点数据,不要求所有数字着色。红、黄继续表示风险、失败或警告;趋势是否改善由业务决定,不能仅凭上涨或下降设绿色。
页面和区块不再常驻重复的功能介绍。一般流程、计费规则和图表图例复用 `InlineHelp.vue`,在标题或对应操作旁显示信息图标,鼠标移入或键盘聚焦时浮层展示说明,不展开正文或增加独立说明行。已有包含交互操作的统计说明弹层保留其原交互。错误、权限、过期状态、操作阻断和危险后果仍直接展示,不通过全局隐藏段落或说明组件来精简页面。
原有 `--admin-*` 密度默认值继续有效。公共控件、表格行高、行内操作、弹窗尺寸和滚动由原组件与密度规范管理;蓝白外观只在显式主题范围内生效。
页面边缘采用紧凑双层留白:`.page-container` 与 `.admin-workbench.admin-page` 分别使用 12px,避免旧外壳 20px 再叠加工作台 24px 挤占内容。页边距与区块间距使用独立令牌,不通过缩小表格行高、控件或文字来换空间。
页面内复用另一个完整 `AdminPage` 时,仅在嵌入调用上显式加 `is-embedded`,去掉内层重复 padding;独立路由打开仍保留原页边距。订单内的测量审核分支是此用法的参考。不要在业务页重复声明公共间距变量,也不要全局清空所有面板内距。
整页主体是一块连续白底,不再额外套一圈边框、圆角和阴影。包住主要列表的 `workbench-table`/`workbench-toolbar` 或整页详情 `workbench-panel` 显式增加 `is-page-surface`;内部指标、图表、并列独立面板继续保留细边框,表格单元格、表头和操作分隔线也保留。不能通过清除全部 `border` 把卡片、控件和表格边界一起抹掉。
详情主容器的 `workbench-panel.is-page-surface` 在屏幕展示时不再叠加 padding,即使同时有 `is-compact` 也由外层页面或业务分区提供唯一一层留白。独立预装/装柜清单详情和货柜内的清单页签按此规则接入;内部独立紧凑卡片仍为 14px,普通卡片仍为 20px。该规则排除 `AdminPage` 页根并仅用于屏幕,不覆盖页面原有 12px 或打印内距。
财务详情通过 `financeDensity.css` 的 `finance-density-detail` 统一收敛:账户、费用来源、对账单和结算单的页头、摘要、正文及底栏在屏幕上不重复增加左右内边距,由外层 `AdminPage` 提供。嵌套 `AdminPage` 必须使用 `admin-workbench is-embedded`;区块纵向间距、金额卡片、描述表单元格和筛选控件的内部留白保留,打印内距不变。
国内/海外托盘、整柜业务、应收款统计和应收/应付结算单的顶部统计卡片独立置于列表工具栏与筛选区上方。卡片网格与紧随其后的 DataTable 工具栏之间外层 `gap` 为 `0`,留白由工具栏已有的上下 padding 与最小高度提供,不能再叠加 6px 或默认页面间距;卡片之间的网格间距独立保留。此规则仅适用于这类直接相邻结构,不清零普通业务分区或筛选区与表格之间的间距。
间距和边框核对必须包含公共组件编译后的 scoped 选择器、模块规则、断点及加载顺序。显式接入规则应有稳定的优先级,不能仅凭源码出现 `gap: 0` 或 `padding: 0` 就判断已生效;自动合同检查与实际截图核对分别报告,不用 `!important` 或负外边距掩盖重复容器。
### 公共样式接入
页面直接导入 `@/styles/adminWorkbench.css`,保留原有密度入口,并在实际页面根容器增加 `admin-workbench`。不依赖先打开样板页后残留的 CSS,不将主题放入全局入口,不修改 `:root`。导航、顶栏、页签由总控在各自容器显式接入,不给包含业务页面的 `.app-shell` 或 `.app-main` 添加主题类;业务页和 Teleport 浮层仍须自己接入。
```vue
<script setup lang="ts">
import '@/styles/adminDensity.css'
import '@/styles/adminWorkbench.css'
// 继续使用该页面原有数据、筛选、权限与事件。
</script>
<template>
<AdminPage class="admin-density admin-workbench">
<ListPageLayout>
<div class="workbench-table is-page-surface">
<DataTable :data="rows" :columns="columns">
<!-- 原有工具栏、查询和操作插槽 -->
</DataTable>
</div>
</ListPageLayout>
<AppDialog
v-model="detailOpen"
class="admin-density-dialog admin-workbench is-dialog"
>
<!-- 原有内容与尺寸配置 -->
</AppDialog>
</AdminPage>
</template>
```
这个片段只说明主题作用域。`rows`、`columns`、弹窗宽高、事件与组件导入仍按目标页原实现补齐,不代表需要新建弹窗或更换承载方式。
| 场景 | 公共类与用法 |
|---|---|
| 页头与分区 | `workbench-heading`、`workbench-title`、`workbench-meta`、`workbench-section`、`workbench-section-heading`、`workbench-section-title`、`workbench-badge` |
| 普通指标卡 | `workbench-metric`、`workbench-metric-heading`、`workbench-icon`、`workbench-metric-label`、`workbench-metric-value`、`workbench-status`、`workbench-note` |
| 紧凑指标 | 在指标卡和图标上增加 `is-compact`;不继承总览卡片的最小高度 |
| 面板与提示 | `workbench-panel`、`workbench-notice`、`workbench-skeleton`;紧凑/自带头部面板使用 `is-compact`/`is-flush` |
| 图表与空态 | `workbench-chart`、`workbench-chart-heading`、`workbench-chart-title`、`workbench-chart-actions`、`workbench-chart-canvas`、`workbench-chart-empty`、`workbench-chart-empty-icon` |
| 标准列表 | **外层 `div.workbench-table` 包裹 DataTable**,统一外框、表头、边框、行悬停和分页强调;不修改业务列宽或行密度 |
| 整页主要内容 | 主要列表的 `workbench-table`/`workbench-toolbar`、整页详情的 `workbench-panel` 增加 `is-page-surface`,去掉整页外框、圆角和阴影;详情主容器的屏幕 padding 为 0,保留页面根及内部卡片内距;主表顶部同时使用公共紧凑高度与左右边界,子表格不自动套用 |
| 嵌入完整页面 | 仅在嵌入调用上加 `is-embedded`,清除内层 AdminPage 的重复内距;独立路由不加 |
| 独立查询区 | QueryToolbar 自身添加 `workbench-query`,保留控件与换行;位于 DataTable 的筛选区时由外层提供独立搜索区的边框、底色及间距,内部不重复套卡片 |
| 列表页签与操作 | 页签放 `toolbar-start` 并加 `workbench-list-tabs`,按钮保留原操作插槽;标准主表统一 48px 最小工具栏、32px 控件,无需销量页专属紧凑类。保留自动换行与键盘切换,嵌套表格、详情和弹框不继承该布局 |
| 只有查询工具栏 | 外层 `div.workbench-toolbar` 包裹 DataTable,保留组件原有工具栏和筛选排列 |
| 原生页签与输入 | 页签父级 `workbench-tabs`,保留按钮的 `aria-pressed` 和点击事件;原生输入使用 `workbench-input`,页面只保留业务宽度 |
| 阶段节点 | `workbench-step`、`workbench-step-index`,从已确认的 `data-state` 选择状态,不从任务名或阶段顺序推断完成 |
| 证据内容 | 容器 `workbench-evidence`;已有 `density-table` 保留行密度 |
| 详情与表单 | 显式主题根保留原密度类,已有 `density-detail-*`、`density-fields`、`density-descriptions`、`density-form`、`density-form-section` 适配中性外观;字段列数、字号、业务色、校验及尺寸保持原契约 |
| 抽屉 | 实际根使用 `admin-density-drawer admin-workbench is-drawer`,保留原有详情/编辑 modifier、方向、宽度、贴边形态和正文滚动 |
| 白色品牌资源底座 | `workbench-brand-mark` 提供蓝底与公共圆角;图片比例、容器宽高由实际布局决定,不替换品牌图形 |
| 辅助色 | 元素增加 `workbench-tone`,按需选择 `data-tone` 为 `blue`、`teal`、`green`、`purple`、`amber` 或 `rose`;语义胶囊可加 `workbench-badge is-toned` |
DataTable 的属性透传目标是内部表格,不能只把 `workbench-table` 加到组件上就认为外框已接入。默认与 integrated 模式各保留原密度,不能为了外观切换模式。Teleport 弹框必须自身带 `admin-workbench is-dialog`,页面祖先不能替代;同时保留 `admin-density-dialog`、全屏、关闭、重开和正文滚动规则。抽屉使用 `is-drawer`,不能套用弹窗类改变承载。
业务页只保留列数、排列、业务宽度与高度;接入公共类后删除被接管的私有配色、边框和标题外观,不能保留两套 CSS 再叠加优先级或 `!important`。共享组件应明确接入模式并核对实际调用者,避免影响尚未推广的页面。
### 图表与数据表达
Canvas 图表显式导入 `adminWorkbenchChartTheme`,在 option 构建处组合字体、轴标签、网格、颜色与 tooltip;不注册全局 ECharts 主题。业务 option 入口分别为 [`skuTrendChart.ts`](../apps/admin-web/src/modules/self-operated/skuTrendChart.ts)、[`dashboardChartOptions.ts`](../apps/admin-web/src/modules/self-operated/dashboardChartOptions.ts)、[`turnoverPresentation.ts`](../apps/admin-web/src/modules/self-operated/turnoverPresentation.ts)。
- 趋势使用蓝色直线和轻面积。只有连续完整数据段可以填充,未知与缺失日期继续断线,未完整日继续以虚线/空心点表达。
- 柱图使用圆角、真实数值尺度和清晰单位;未知分类用灰色并显示文字,不把缺失量补成零。排名、tooltip 内容、精度和点击业务键由业务模块负责。
- 进度环只表达当前已知阶段;总量未知、分母为零或数量异常时保留未知状态。待机不等于全部完成,当前阶段 100% 不代表报表已发布。
- 普通、加载、空数据、错误和部分数据都保留已有语义。减少装饰不能删掉覆盖不足、过期、权限或操作阻断提示。
- 图表面积按用途选择。库存周转保留 360px 面板及内部伸缩画布,不机械套用固定画布类;体积图保留右侧数值标签空间。长标签、长数字及单位不得挤出可视区域。
- 同类指标统一千分位,保留业务小数精度和单位,不为排版缩写成“万”或先舍入再计算;筛选文案明确对象,不使用多个无上下文的“全部”。
- 运行看板区分主状态、阶段进度、发布结果及等待原因;已关闭/暂停与保留进度应同时可辨认,不把保留进度表达为正在续采。采集完整与修订核对未知分别表达。
- 横向宽表保留业务标识的可见性;只读库存表可固定 SKU 首列,有操作列的业务表仍将操作列放第一列。按钮按用户理解的结果命名,保留原行为、权限和禁用条件。
### 导航外壳
自营样板不包含导航外壳;后续 Admin 推广由总控统一维护公共样式、共享组件和外壳,各业务任务按实际消费者逐模块接入。外壳参考 `AppLayout.vue`、`WorkspaceTabs.vue` 和 `shell.css`:白色顶栏、蓝色激活态、轻分隔线,现有白色 Logo 保留蓝底承载;折叠菜单和页签下拉单独声明 `popper-class` 主题范围。保留菜单尺寸、彩色图标、未保存标记、权限与页签行为,不能通过全局注入主题或替换所有 Element 默认样式跳过验收。Client、PDA 不自动套用。
折叠侧栏保留 76px 宽度,展开仍为 240px。菜单宽度随纵向滚动条占用后的实际可用空间伸缩,折叠触发器去掉重复横向 padding 和图标右边距并居中;侧栏只允许纵向滚动,悬浮子菜单继续 Teleport 到侧栏滚动区之外,不能为去掉横向滚动条而裁切子菜单。
## 公共样式维护边界
<a id="国内仓客户管理的样式维护边界"></a>
密度、蓝白主题与基础组件分别维护各自能力;模块只提供字段、列数、跨列、业务宽高及已确认例外,不重复定义公共默认值。下表适用于本轮已明确接入的实际消费者。
| 要修改什么 | 唯一维护位置 | 页面需要做什么 |
|---|---|---|
| 正文/辅助/分区/页头字号 | `adminDensityTokens.css` 的 `--admin-font-*` | 引用变量,不重新写 13px 等普通字号 |
| 表格行高、输入高度、操作按钮高度、页签高度 | `--admin-row-height`、`--admin-control-height`、`--admin-action-height`、`--admin-tab-height` | 使用已有公共组件和公共类 |
| 常用间距、圆角、普通数据区底色 | `--admin-space-*`、`--admin-radius`、`--admin-surface` 等 | 业务布局引用变量;不可在页面重定义变量默认值 |
| 表头配色、独立搜索区圆角与间距 | `foundation.css` 的 `--cc-list-table-header-*`、`--cc-list-query-*` | 标准组件消费统一值,不在模块重定义 |
| 列表纯文字行操作 | `adminTextActions.css`,`RowActions` 的 `text-actions`/手写组的 `admin-text-actions` | 保留动作资格与显式危险语义,不复制旧描边行按钮 |
| 描边按钮外观、悬停/禁用/焦点状态 | `adminDensity.css` 的 `.density-action` | 只选择 `data-tone` 与业务事件 |
| 列表状态/分类页签(国内订单、尾程订单、车辆、供应商、整柜业务、国内/海外货柜工作台、退货库存) | `adminDensity.css` 的 `.density-status-tabs` | 原生按钮使用 `is-active`,Element 页签同时保留 `density-element-tabs`;保留业务分类、图标、数量、查询与切换,不在页面复制页签样式;详情页签继续使用原有详情规则 |
| 详情返回导航 | `.density-back` | 使用 `link`,保留返回事件和可访问名称;客户管理按纯文字约定保留返回文字 |
@@ -263,6 +402,8 @@
### 使用约定
下列 `density-action` 是非列表行操作的描边按钮原语;标准列表行操作使用上文 `text-actions`/`admin-text-actions`,不照搬此描边示例。
```html
<!-- 业务按钮只选择语义,不复制尺寸、颜色及交互状态规则 -->
<el-button class="density-action" @click="edit">编辑</el-button>
@@ -287,7 +428,7 @@
2. **新增通用尺寸先改变量。** 模块与页面只引用 `--admin-*`;禁止在页面重定义公共默认值。局部标签宽度是明确的业务参数,不改变全局标签宽度。
3. **不要把代码搬到模块 CSS 就称为公共化。** 多个业务共用的按钮、页签、信息表与弹框规则留在公共层;模块 CSS 不能依赖另一个业务模块的类名,也不引入第二套按钮颜色变量。
4. **保留显式接入边界。** 公共样式不能使用无范围的 `.el-button`、`.el-table`、`.el-dialog` 选择器。Teleport 的弹框、抽屉必须自己携带密度类;不能仅依赖页面父级。
5. **共用组件保留未接入消费者。** CSS 变量的兜底值用于独立渲染和未接入入口;两个已接入模块始终由公共变量决定实际值,兜底值不是第二份密度配置。打印标签、PDF 尺寸、原图、画布和既有窄屏规则不能机械替换。
5. **共用组件保留未接入消费者。** CSS 变量的兜底值用于独立渲染和未接入入口;已接入消费者始终由公共变量决定实际值,兜底值不是第二份密度配置。打印标签、PDF 尺寸、原图、画布和既有窄屏规则不能机械替换。
6. **公共调整按消费者回归。** `adminDensity.test.ts` 维护明确的页面/组件清单,不扫描全部后台。检查模板中公共按钮、页签和信息表的真实祖先是否带有密度入口,不能仅断言文件导入了 CSS 或出现过密度类;页面弹框带有 `admin-density-dialog` 不代表列表与详情已接入。新增接入时同步清单及逐操作矩阵,运行合同、受影响测试、类型检查、全量测试和构建。
7. **视觉与代码分开记录。** 本轮默认人工截图;代码通过不等于视觉验收通过。已确认业务宽度和工作区高度可以保留为例外,例外写入核对记录。
@@ -296,33 +437,16 @@
### 先确定范围,再选择公共能力
1. 用导航与实际路由列出全部菜单入口,以及新建、详情、编辑和深链页面;不能把文件夹数量当作页面覆盖数。为每个页面沿实际组件引用列出弹框、抽屉、消息确认、预览与打印入口,按逐操作矩阵记录承载方式。
2. 默认复用普通表格 36px 行高、正文 13px、辅助文字 12px、行内描边按钮 28px、页签 38px、轻量返回和连续信息表。新模块的行内业务操作默认纯文字;顶部/提交保留 32px 主次按钮。动作语义色沿用本规范,不通过按钮文字自动猜测。
2. 默认复用普通表格 36px 行高、正文 13px、辅助文字 12px、行内操作基准 28px、页签 38px、轻量返回和连续信息表。新模块的行内业务操作默认纯文字;顶部/提交保留 32px 主次按钮。动作语义色沿用本规范,不通过按钮文字自动猜测。
3. 模块只保留业务列宽、字段跨列、布局与图纸尺寸等参数。`density-fields` 的四列是默认值,不是固定业务要求;返回位置与大弹框尺寸也不能从订单整页复制。
4. 编辑表格、流程图、装柜模型、数据看板、图片、标签和 PDF 保留业务所需面积;指标卡和图表不得套用 `.density-fields`或其他详情表格样式,模型画布和打印尺寸不套普通行高。空态、错误、长内容、处理中、只读和无权限仍要可用。
5. 获准采用蓝白外观的页面按 [蓝白样板接入入口](界面参考/蓝白卡片式工作台风格参考.md#其他页面该参考哪个样板) 选择对应页面类型;列表参考销量分析,复杂分析参考库存分析,运行看板参考数据采集,不一律复制经营总览的大指标卡。保留现有密度根,显式接入主题根和公共类,浮层自行声明作用域;具体覆盖与截图结论回到目标模块现有矩阵。
### 完整接入示例
### 密度类与浮层接入
下面展示已有页面的接入结构,`rows`、`columns`、事件与表单仍使用该页面原实现。页面脚本直接导入 `@/styles/adminDensity.css`,不依赖先进入其他菜单后残留的样式,也不把这份 CSS 放入 `scoped` 样式块。
页面直接导入 `@/styles/adminDensity.css`,实际根使用 `admin-density`;蓝白主题的组合示例见本文“蓝白主题与图表”。
```vue
<AdminPage class="admin-density">
<ListPageLayout>
<DataTable :data="rows" :columns="columns">
<template #actions="{ row }">
<div class="density-actions">
<el-button class="density-action" @click="openDetail(row)">详情</el-button>
<el-button class="density-action" data-tone="warning" @click="review(row)">审核</el-button>
</div>
</template>
</DataTable>
</ListPageLayout>
<AppDialog class="admin-density-dialog" v-model="editorOpen" title="编辑资料">
<!-- 原有业务表单 -->
</AppDialog>
</AdminPage>
```
此结构只说明样式接入,不授权新增审核等业务动作。详情复用页面根节点的 `admin-density`;原生详情页签用 `density-tabs` / `density-tab-icon`,连续信息表用 `density-fields`。既有 Element 页签使用 `density-element-tabs`;页签栏与正文分离时隐藏空内容容器。在 `el-tab-pane` 内承载正文的页面必须同时使用 `density-contained-tabs`,保留正文并由公共样式设置内容间距。不得依赖页面 CSS 覆盖隐藏规则。既有原生资料/历史表用 `density-table`,分组表单用 `density-form`。返回按钮使用 `link class="density-back"`,跟编号、状态排在同一行。
样式接入不授权新增业务动作。详情复用页面根节点的 `admin-density`;原生详情页签用 `density-tabs` / `density-tab-icon`,连续信息表用 `density-fields`。既有 Element 页签使用 `density-element-tabs`;页签栏与正文分离时隐藏空内容容器。在 `el-tab-pane` 内承载正文的页面必须同时使用 `density-contained-tabs`,保留正文并由公共样式设置内容间距。不得依赖页面 CSS 覆盖隐藏规则。既有原生资料/历史表用 `density-table`,分组表单用 `density-form`。返回按钮使用 `link class="density-back"`,跟编号、状态排在同一行。
Teleport 弹框用 `admin-density-dialog`,抽屉框架用 `admin-density-drawer`,`ElMessageBox` 用 `customClass: 'admin-density-confirm'`;这些浮层必须各自声明,页面祖先不能替代。抽屉当前公共框架负责字号、标题和正文边距;其正文若复用页面级表格、信息表或按钮原语,在正文业务根节点显式接入 `admin-density`。不要把名为 Drawer 的嵌入组件当作实际抽屉,承载方式以模板和调用端为准。
+146 -2
View File
@@ -2,14 +2,17 @@
## 范围与验收状态
- 本规范由客户端样式对话确认建立,首个验收样板为“头程物流 → 订单列表”(`/orders/first-leg`)。当前为首版实现,待人工截图确认;通过后再逐模块推广。
- 本文是客户端样式的现行维护正文,按新增页面和列表分别定义规则。后续客户端的新增、新建、下单操作统一采用下文“新增页面”的风格;列表沿用列表章节,不把两者的控件尺寸和间距混用。
- 新增页以“海外采购下单”和“美国本土卡车下单”在当前对话确认的外观与布局为样板:满宽、无阴影、精简说明、12px 模块间距、浅色 placeholder 和字段右上角校验提示。两页的不同字段排列见下文,不按整页截图机械复制。规范确定不等于所有新增页已改造或通过视觉验收。列表首个验收样板为“头程物流 → 订单列表”(`/orders/first-leg`),其验收状态见文末。
- 只维护 `apps/client-web/` 内的样式和公共组件,不与 Admin 跨应用链接依赖。
- 左侧菜单背景保持现状,不修改 `shell.css` 中的导航背景,也不通过全局品牌变量间接改变导航。
- 标准通过正文容器 `.client-ui` 接入;首批覆盖订单列表。创建、详情与其他模块需分别核对承载方式和字段,不以列表通过代替整模块验收。
- 标准通过正文容器 `.client-ui` 接入;新增页在本页或新增表单容器内覆盖对应令牌,不将新增页尺寸写入全局默认值。创建、详情与其他模块需分别核对承载方式和字段,不以某个样板通过代替整模块验收。
- 按 1920×1080、浏览器缩放 100% 验收,保留现有窄屏能力。
## 公共入口与职责
按任务阅读:新增、新建、下单读“新增页面”;列表读“尺寸与布局”“颜色与按钮”及适用的列表样板条款。视觉核对方法只维护在 [Admin / Client 前端原型还原验收规则](Admin-Client前端原型还原验收规则.md)。
| 入口(相对 apps/client-web) | 职责 |
|---|---|
| `src/styles/client-ui.css` | `--client-*` 颜色、尺寸、间距;正文按钮和状态外观 |
@@ -17,11 +20,150 @@
| `src/components/common/DataTable.vue` | 表格、工具栏、行操作、分页;工具栏内容用插槽提供 |
| `src/components/common/tableActions.ts` | 三个操作以内全部展示,超过三个折叠;禁用和加载状态执行保护 |
| `src/modules/first-leg/utils/firstLegOrder.ts` | 头程状态码 → 语义色,不在公共样式中判断业务状态码 |
| `src/modules/cross-border/views/ProcurementView.vue` 的新增分支 | 新增页外观样板;只参考当前新增分支,不跨模块导入该业务页面 |
| `src/modules/cross-border/components/BusinessOrdersView.vue` 与 `TransportDemandForm.vue` 的新增分支 | 本土卡与散板共用新增外观;参考三列短字段、两列详细地址和右上角校验。编辑分支及各业务的视觉验收分别核对,不从共用组件推定已通过 |
页面只提供字段、操作、业务状态与权限,不再覆盖公共工具栏 padding、表格行高及分页 padding。确有业务差异时增加明确的组件能力,避免重复页面 CSS。
## 新增页面
### 适用范围与设计依据
- 后续客户端新增、新建、下单操作按本章实施。既有页面在对应任务触及时按授权范围调整,不因规范更新批量改造其他页面。
- 本章替代最初海外采购 HTML / UI Redesign Spec 中的 1240px 内容宽度上限、26px 模块间距、24px 表单卡片内边距及重复说明文字;不采用带阴影的大圆角截图版本。桌面导出文件是参考材料,后续规则统一更新本文,不要求开发者依赖个人桌面文件或设计工具链接。
- 统一外观不统一业务表单:字段、顺序、分组、必填条件、默认值、权限、计算口径和提交行为仍按各业务契约及已确认原型。海外采购的采购方向、币种、收件资料等不自动成为其他新增页的字段。
- 独立页面、居中弹框、抽屉仍按对应操作的已确认承载方式;本规范不将所有新增操作改成独立页面。后续用户明确确认的外观例外优先于本章,其余通用外观不回退到旧原型的大留白、阴影或说明堆叠。
- 本章只约束新增内容区。复用现有侧边栏、顶栏、页签和面包屑,不复制设计稿中的静态用户名、菜单或页签,不因新增页改造修改公共外框。
### 企业设置承载方式
以下为当前已确认的企业设置操作,不按字段数量自动改造其他业务。企业设置常规表单采用“完整维护进入独立页面,少量字段用居中弹框”的方式;这些操作不再使用右侧抽屉。
| 操作 | 当前承载方式 |
|---|---|
| 编辑企业资料 | 独立页面,分企业基本信息、联系信息两块;保存后返回企业资料 |
| 成员新增/编辑 | 独立页面,分账号信息、联系信息与角色两块;保存后返回成员列表 |
| 角色新增/编辑 | 三个字段,使用居中弹框;内置角色和权限限制沿用业务规则 |
| 角色权限分配 | 保持现有独立页面 |
| 资质上传、文件预览、成员密码重置 | 保持各自专项弹框与原有业务校验 |
独立编辑页沿用本章的满宽、白色无阴影卡片、三列短字段、12px 模块间距与右上角校验提示。新增与编辑路由分别校验对应操作权限,菜单仍只展示原有业务入口;直接打开与刷新应重新加载服务端资料,加载失败提供重试,保存失败保留填写内容。
### 页面组织与信息密度
1. 独立新增页使用一个清晰标题,右侧按现有列表访问权限提供返回入口;默认不增加标题下的解释性段落。
2. 摘要区按业务需要使用,展示数量、预算等真实表单派生值。已有三项摘要时等宽三列;没有必要摘要的表单直接进入业务区,不为套用样板硬凑三个指标。
3. 表单按业务分组呈现为独立白色卡片,标题位于卡片上方,以小圆点区分分组。常规短字段使用三列等宽网格;成对详细地址可使用两列,单个长地址、链接、长备注可占满整行。具体排列按下文样板及业务确认,不把所有区域强制设成相同列数。既有明确分组和摆放不得因凑满网格擅自重排。
4. 独立页底部操作靠右,返回列表在前、主提交按钮在后;返回资格沿用现有权限。弹框或抽屉保留其已确认的取消、关闭和提交语义,不硬加“返回列表”。
5. 内容填满所在容器的可用宽度,使用 `width: 100%`、`min-width: 0`;独立页不设置 1240px 等固定内容上限造成右侧空白。弹框和抽屉中的满宽指其正文容器,不是铺满浏览器视口;保留应用壳层或容器已有边距,不重复包一层大 padding。
6. 在 1920×1080、100% 缩放下优先减少无效留白和重复文案,使主要填写内容更集中。长表单允许正常滚动,不通过隐藏必要字段、缩小字号、裁切内容或未经确认拆步骤强行塞进一屏;一屏效果以人工截图为准。
### 字段列数与宽度
“内容区满宽”“字段单独一行”和“控件占满整行”是三个不同要求,实施前按下表区分。
| 场景 | 当前标准 | 样板 |
|---|---|---|
| 页面、表单卡片 | 铺满可用正文宽度,不留下固定宽度上限造成的右侧空白 | 两个新增页 |
| 常规短字段 | 一行三列等宽,横向间距 20px;输入框填满所在列 | 采购品类/商品名称/商品规格;本土卡取货地/联系人/电话 |
| 前置选择项独立一行 | 单独占一行位置,控件只占三列中的一列,与下一行第一列对齐,右侧留空 | 采购方向、车辆类型 |
| 成对详细地址 | 同一行两列等宽,分别放取货地址、送达地址 | 本土卡运输信息 |
| 单个长字段 | 按已确认分组占满该行,例如商品链接、完整收货地址、备注 | 海外采购及本土卡备注 |
- 前置选择项的一列宽度按正文网格计算:`calc((100% - 40px) / 3)`,其中 40px 是两个 20px 列间距。不得改成任意固定的 280px,也不得把“独立一行”理解成下拉框横跨整张卡片。
- 混合三列短字段与两列地址时,可以使用六列基础网格,短字段跨两格、详细地址跨三格;这只是实现方式,用户看到的仍是三列或两列。前置项独占整行位置,再将自身宽度限制为标准一列。
- 字段按实际阅读顺序写入模板,键盘 Tab 顺序与视觉顺序一致;不只用 CSS `order` 把同一组联系人拆散重排。
### 两个样板的具体排列
以下是后续页面可对照的布局依据,不是要求其他业务复制相同字段、默认值或摘要指标。
| 页面/区域 | 已确认排列 |
|---|---|
| 海外采购/摘要 | 数量、预算单价、币种三张等宽卡片,数值与当前表单联动 |
| 海外采购/商品与预算 | 采购方向独立一行、控件一列宽;其后采购品类/商品名称/商品规格三列,采购数量/预算单价/预算币种三列;商品链接整行,预算总上限用普通文本 |
| 海外采购/收件资料 | 收件人、联系电话各占三列网格的一列,第三列留空;完整收货地址、采购要求各占整行 |
| 本土卡/运输信息 | 车辆类型独立一行、控件一列宽;取货地/取货联系人/取货联系电话一行三列;送达地/送达联系人/送达联系电话一行三列;取货地址/送达地址一行两列 |
| 本土卡/货物信息 | 托数/总重量/总体积一行三列 |
| 本土卡/费用与时效 | 预算总价与币种组成同一字段,占两列网格的左列,右列留空;取货时间/送达时间一行两列;备注整行 |
代码参考:[海外采购新增分支](../apps/client-web/src/modules/cross-border/views/ProcurementView.vue)、[本土卡页面外框](../apps/client-web/src/modules/cross-border/components/BusinessOrdersView.vue)、[本土卡表单](../apps/client-web/src/modules/cross-border/components/TransportDemandForm.vue)。新业务先确定字段分组与承载方式,再使用通用外观;若要调整上述排列或推广到其他共用分支,须在对应任务中明确范围,不顺手扩展。
### 尺寸与间距
以下数值分别适用,不将所有间距一律改为 12px。
| 元素 | 新增页标准 |
|---|---|
| 页头、摘要区、表单模块底部间距 | `margin-bottom: 12px` |
| 摘要卡之间 | 横向 gap 16px |
| 摘要卡内部 | padding 12px 16px;纵向 gap 8px |
| 摘要标题行 | 图标与标题 gap 12px;图标底块 44×44px,圆角 8px;线性图标 20px |
| 表单卡片 | padding 16px;1px 边框;圆角 10px |
| 摘要卡片 | 1px 边框;圆角 10px |
| 分组标题 | 下方 margin 10px;圆点 9px;圆点与标题 gap 10px |
| 表单网格 | 常规三列等宽,两列/整行区域按上文布局;纵向 gap 12px、横向 gap 20px;单项不另叠加底部 margin |
| 标签与控件 | 间距 6px;标签行高 20px |
| 字段校验提示 | 字段右上角、标签同行,12px 字号、20px 行高;不增加底部占位和字段高度 |
| 输入框、选择框 | 最小高 44px;圆角 6px;padding 10px 14px |
| 多行输入 | 最小高 110px;padding 11px 14px;允许纵向调整;字数计数在下方右侧,间距 4px |
| 预算等必要汇总值 | 上方 margin 10px;字号 13px、行高 20px;普通文本,不做说明横幅 |
| 底部按钮间距 | gap 12px |
| 次按钮 | 最小高 44px;padding 10px 18px;圆角 6px |
| 主按钮 | 最小高 44px;padding 12px 28px;圆角 6px |
### 字体、颜色与状态
字体沿用中文无衬线栈:`"PingFang SC", "Microsoft YaHei", "Noto Sans SC", sans-serif`。
| 用途 | 标准 |
|---|---|
| 独立页标题 | 26px / 700;margin 0 |
| 分组标题 | 18px / 700 |
| 正文、输入内容 | 14px / 400 |
| 字段标签 | 14px / 600 |
| 摘要标题、数值、单位 | 15px / 600;30px / 700;14px / 500 |
| 内容底色、卡片及控件底色 | `#F4F7FC`、`#FFFFFF` |
| 主文字、标签、次要文字 | `#1F2937`、`#374151`、`#6B7280` |
| 占位文字 placeholder | `#B0B7C3`;输入框、多行输入和选择框的未填写提示统一使用,已填写内容保持正文色 |
| 卡片边框、控件及次按钮边框 | `#E3E8F0`、`#D5DCE8` |
| 主按钮 | `#2F7BFF` 背景、白字 |
| 次按钮、摘要数值 | `#1D5FE0`;次按钮白底描边 |
| 必填星号 | `#E5484D` |
| 焦点 | 2px `#2F7BFF` outline;无发光阴影 |
- 卡片、输入框、选择框及其弹出层、按钮均不使用装饰阴影、渐变、毛玻璃或位移动效;分隔依靠边框与底色。
- 主要操作以蓝色为强调色,其他颜色仅用于必要的业务状态、错误反馈和小面积分组标记。样板图标底块可使用蓝 `#EAF2FF / #2F7BFF`、绿 `#E8F8F0 / #16A34A`、橙 `#FFF5E0 / #D97706`;分组圆点使用蓝色或青色 `#0EA5A4`,不把整块表单染成状态色。
- 已确认的原型图标沿用对应资源;未定义的图标使用项目既有图标库,不引入第二套组件库或表情图标。无需要时不添加装饰图标。
- 保留清晰的禁用、提交中、焦点和错误状态,状态不只依赖颜色表达;不得为了“干净”删去校验、失败重试或权限说明。
### 文案与数据绑定
- 删除重复解释性提示:不恢复页头“一单一个商品及规格……”、摘要卡下的说明行,也不新增类似的常驻说明段落或黄色提示横幅。
- 字段标签与简短占位提示负责说明输入用途;校验错误、提交失败、无权限及必要业务提示按实际状态就近出现。保留影响客户正确操作的必要信息,不将“去提示”理解为关闭验证或隐藏错误。
- 未填写字段应提供简短 placeholder,例如“请选择车辆类型”“请输入取货联系人姓名”“请选择取货日期和时间”;不要通过 `placeholder=""` 将必要输入提示清空。按字段性质标明选填,不使用整段业务说明代替占位文字;已存在默认值时显示真实值,不为显示 placeholder 清除默认值,尤其不得把有效的 `0` 当作空值。
- 保留真实汇总数据,例如货款预算总上限;摘要和汇总跟随当前表单实时更新,不能保留设计稿中的静态 `1`、`USD` 或 `0 / 1000`。
- 空值显示“—”,合法零值按零展示;金额沿用现有精度处理,不因样式调整改变校验或金额口径。支持多个币种或方向的业务继续联动展示,不用原型示例缩减现有能力。
### 必填校验与稳定布局
- 字段错误提示统一放在输入框右上方,与字段标签同行、靠右对齐;保留必填星号与错误边框。提示出现、纠正或清空时,后续字段和整张卡片不得上下跳动。
- 错误不参与正常文档流,不在控件下面额外预留 16px 空行;标签区应能同时容纳标签与简短错误文案。对当前明确的单行标签,可相对 `.el-form-item__content` 使用 `bottom: calc(100% + 6px)`、`right: 0` 定位,宽度避开标签。更长标签或提示须单独核对,不截断必要错误或覆盖标签、输入内容。
- 必填星号必须配套字段级校验:Element Plus 表单绑定 `ref`、`model`、`rules`,校验项绑定对应 `prop`;文本失焦、选项变化时校验当前字段,提交时校验全部必填项。未通过时不发送创建请求,不用整页错误代替缺失字段提示。
- 填写正确并再次触发校验后清除该字段错误;重置表单时清除校验状态;提交中防重复点击,失败保留填写内容。采购预算单价 `0` 是有效值,不得误报必填。
- 已有金额、格式、权限和服务端校验继续保留;非字段级请求失败仍按原有页面错误反馈处理。本规范不改变业务规则,也不将两页未统一的所有校验逻辑推定为已统一。
### 接入与核对
- 使用现有 Vue、Element Plus 和 `.client-ui`;新增页所需 44px 控件、14px 字号、配色等在新增内容容器内覆盖。列表仍使用下文的 32px 控件,不修改全局 `:root` 使其他页面跟随变化。
- 同一组件同时承载列表、新增和详情时,新增样式必须限制在新增分支;不得扩大到列表、详情或侧边导航。跨模块稳定复用时按应用指引抽取通用能力,不跨模块导入采购页,也不复制设计工具的 React 运行时。
- 新增或整体重排页面时,按前端验收规则核对该操作的承载方式、满宽、字段分组和按钮;重点检查前置选择项是否与三列网格对齐、短字段和成对地址列数、placeholder、长值、摘要联动、空值与零值、校验出现/消失时的位置稳定及正常滚动。纯文案或小间距调整只核对差异,不重复建立完整矩阵。
- 自动检查按实际变更选择;文案和纯样式不自动升级为全量测试、类型检查或构建。真实视觉由人工提供截图确认,部署成功或静态资源命中不等于一屏布局通过;不开展当前阶段未要求的窄屏验收。
## 尺寸与布局
本节用于列表、查询栏和表格工具栏;新增表单使用上文“新增页面”的尺寸。
| 项目 | 标准 |
|---|---|
| 正文、表格、按钮字号 | 13px |
@@ -42,6 +184,8 @@
## 颜色与按钮
本节用于列表操作和状态语义;新增表单按钮的外观使用上文“新增页面”,业务危险语义和权限要求仍须保留。
| 用途 | 文字色 | 背景色 |
|---|---|---|
| 默认操作 | `#1777ff` | 白色 |
+39 -77
View File
@@ -1,88 +1,50 @@
# 虫虫出海文档索引
# 虫虫出海文档入口
项目交付文档按业务域组织。当前只有测试环境,以端到端全流程为统一范围;历史规划、确认和验收记录保留在对应业务域目录,仅用于追溯决策,不构成功能边界。
本文件只负责选入口,不保存业务规则或部署进度。已知页面、文件、API 或当前正文时跳过本文件;未知代码入口查[业务索引](业务快速索引.md)的命中行,不沿所有 README 逐层读取。
- [测试环境单机部署与配置契约](测试环境单机部署与配置契约.md):唯一环境、部署配置、整体切换与验收。
- [统一认证与服务通信契约](统一认证与服务通信契约.md):统一入口、权限撤销、逐事件投递与幂等。
## 按任务选一种入口
## 业务域文档
| 任务 | 从哪里开始 |
|---|---|
| 改代码、文案或局部逻辑 | 已知目标文件及适用 `AGENTS.md`;业务语义不明才补一段正文 |
| 只有中文业务词或多义词 | [业务索引](业务快速索引.md),代码入口与规则正文分开选择 |
| 跨阶段流程、节点关系或上下游交接 | [全流程维护入口](头程到尾程/README.md),只查受影响阶段 |
| 已知某个业务域,需要找规则 | 下表选择该域;找到正文后停止扩展 |
| 运行、验证、部署或数据库操作 | 下方工程专题,按操作类型只选对应章节 |
- [业务快速索引](业务快速索引.md):按关键词检索跨端代码入口与业务边界;先查根 AGENTS.md 短路由,按需读取命中行。
- 终端业务细则:[Admin](../apps/admin-web/docs/business-index.md)、[Client](../apps/client-web/docs/business-index.md)、[海外 PDA](../apps/pda-overseas-uniapp/docs/business-index.md);先从各应用 AGENTS.md 短表定位,行为变更再核对受影响条款。
## 业务域入口
- [订单与客户](订单与客户/README.md):登录认证、客户与企业、权限、头程订单和客户工作台。
- [入库测量与计费](入库测量与计费/README.md):预约取货、到仓收货、箱码与箱唛、测量、尺寸策略、计价和入库费用。
- [Firstleg 按需业务索引](../baiyue-firstleg/firstleg/docs/business-index.md):服务代码入口及测量、计价、装柜、PDA 资源结算细则;先读服务 AGENTS,再查受影响条款。
- [国内货柜履约](国内货柜履约/README.md):分柜与同柜、智能排柜、订舱、拖车、PDA 拣货、装柜、报关和国内出仓。
- [船期日历功能规划](国内货柜履约/船期日历功能规划.md):渠道、周模板、单次船期、收货截止时间和按渠道货量统计的独立日历规划。
- [海外仓业务](海外仓业务/README.md):船节点、海外接柜、入仓、库存、托盘、换标、转运、废弃、退货、排车、PDA 出库、派送、异常退回、客户回访、一件代发及海外本土业务。
- [Lastleg 按需业务索引](../baiyue-firstleg/lastleg-service/docs/business-index.md):服务代码入口及事件、查询、履约约束;先读服务 AGENTS,再查受影响条款。
- [排车列表统一作业改造契约](海外仓业务/排车列表统一作业改造契约.md):五阶段排车、一单一趟、跨客户同车、派送安排及四块排车详情的当前改造入口。
- [排车流程修复规划](海外仓业务/排车流程修复规划.md):取消释放、派送状态、换标全托、合托来源和前端草稿的修复边界、分工及回归要求。
- [采购订单样品履约流程变更需求](海外仓业务/采购订单样品履约流程变更需求.md):采购样品购买、装箱、面单、交寄、国内核费与寄客户的变更入口。
- [船节点标准化契约](海外仓业务/船节点标准化契约.md):统一船司原始状态、标准节点、预计/实际时间、异常事实、还柜停止规则和新增船司接入门禁。
- [美国预约管理统一总览与优化方案](海外仓业务/美国预约管理统一总览与优化方案.md):美国段各类预约的范围、关联关系、表单精简及分步实施建议。
- [预约工作日历 V13 变更说明](海外仓业务/预约工作日历V13变更说明.md):多客户共车、分批后送、改期取消、重新预约和未定日期跟进的正式业务规则与验收场景。
- [预约工作日历开发协作契约](海外仓业务/预约工作日历开发协作契约.md):工作日历与完整待办的接口、数据归属和开发文件边界。
- [预约送仓](海外仓业务/README.md#预约送仓):预约日历与跨客户同仓预约入口。
- [车辆管理原型梳理与任务规划](海外仓业务/车辆管理原型梳理与任务规划.md):司机资质、车次、自有/外接承运、运维与报价的范围及契约入口。
- [内部拼车需求池首版开发契约](海外仓业务/内部拼车需求池首版开发契约.md):车次余位发布、销售意向、承运占位、本土订单关联及我仓上车流程。
- [财务管理](财务管理/README.md):应收、应付、费用池、账单、收款、成本、核销、凭证以及国内外业务费用来源。
- [自营业务](自营业务/README.md):平台自营经营总览图表、SKU 销量、分仓产品库存、库存周转视图与数据采集;Admin 入口 `apps/admin-web/src/modules/self-operated/AGENTS.md`,业务设计、采集页面与进度图、查询性能优化及领星 API 联调依据见该业务域入口。
- [打印标签维护](打印标签维护/README.md):箱唛、各类托盘标、HOLD、BOL 与其他单据的现状盘点、参考样张和逐项改版记录。
| 业务域 | 入口 |
|---|---|
| 客户、企业、权限与头程订单 | [订单与客户](订单与客户/README.md) |
| 到仓、测量、箱码、计价与入库费用 | [入库测量与计费](入库测量与计费/README.md) |
| 分柜、装柜、订舱、拖车、报关与国内出仓 | [国内货柜履约](国内货柜履约/README.md) |
| 接柜、库存、库内服务、排车、预约与海外本土业务 | [海外仓业务](海外仓业务/README.md) |
| 费用入池、账单、资金账户与收付款 | [财务管理](财务管理/README.md) |
| 自营经营、库存周转与领星采集 | [自营业务](自营业务/README.md) |
| 箱唛、托盘标、HOLD 与 BOL | [打印标签维护](打印标签维护/README.md) |
## 全流程公共契约
## 公共契约与工程专题(命中才读)
### 当前流程入口(收尾变更只看这里)
| 主题 | 当前入口 |
|---|---|
| 服务拓扑、环境配置、部署状态与验收项 | [部署主契约](测试环境单机部署与配置契约.md) |
| Gateway、Auth 会话、服务身份与可靠投递 | [认证与通信主契约](统一认证与服务通信契约.md) |
| 平台/客户、菜单与操作权限 | [层级与权限契约](平台客户层级与权限契约.md) |
| 单据编号、订单主状态与操作 | [编号契约](业务单据编号契约.md)、[订单状态契约](统一订单主状态与操作契约.md),按问题选一项 |
| 本机资源、最小验证、工作区与协作执行 | [工程执行约束](AI工程执行与协作约束.md) |
| Admin 样式、Client 样式或视觉验收 | [Admin 样式](Admin高密度界面规范.md)、[Client 样式](Client界面样式规范.md)、[前端验收](Admin-Client前端原型还原验收规则.md),不将三份作为共同必读 |
| 海外 PDA 首页、作业列表与待办样式 | [海外 PDA 样式规范](海外PDA界面样式规范.md),不自动套用 Admin/Client 样式 |
| 测试 Jenkins、数据库操作与中文注释 | [测试部署指南](测试环境Jenkins部署指南.md)、[数据库操作手册](../baiyue-firstleg/deploy/sql/数据库迁移操作手册.md)、[数据库注释规范](数据库注释维护规范.md),按操作选读 |
| 测量设备上传 | [墨家接口说明](墨家设备测量上传接口说明-V3.md) |
- [头程到尾程当前维护入口](头程到尾程/README.md):集中进入总览、六个阶段、货柜入口、报关专题,以及页面和需求参考。
## 方案、证据与历史(按需)
### 历史与参考(保留,不作为日常流程入口)
- 独立主题设计只在该任务触发:[数据库发布方案](数据库版本迁移与Jenkins自动发布方案.md)、[生产发布方案](生产服务监控告警与无停机发布方案.md)、[生产环境方案](阿里云生产环境选型压测与上线手册.md)、[OSS 设计](阿里云OSS文件中心接入设计与评审.md)、[看板规划](首页数据看板真实化与统计策略规划.md)。方案不证明已实现或已部署。
- 原型与截图按应用指引定向查找;样板、样式核对记录、进度表和验收报告不作为日常开发入口。
- [历史流程](归档/头程到尾程/README.md)、[货柜历史](国内货柜履约/归档/README.md)、[财务历史](财务管理/归档/财务闭环盘点历史记录.md)仅用于追溯;旧双区域架构不覆盖当前主契约。
- 只有独立任务协作才查[开发环境独立任务协作登记](开发环境独立任务协作登记.md)或[测试环境独立任务协作登记](独立任务协作登记.md),不同时读取两表。
- [头程到尾程历史文档](归档/头程到尾程/README.md):全流程操作手册、旧现状全景、AI 上下文和易用性方案。
- [国内货柜履约历史记录](国内货柜履约/归档/README.md):开发规划、进度、门禁、验收矩阵、审计和旧确认材料。
## 维护边界
以上文件继续保留,分别用于历史现状、操作说明和方案追溯;开发规划、进度、门禁和验收记录也按业务域保留,不再与当前节点总表同步改写。
- [跨区域认证与服务通信契约](跨区域认证与服务通信契约.md):统一账号、国内/海外 Token、双区域 API、JWKS、Outbox/Inbox 与服务身份边界。
- [双区域部署与 Nacos 规划](双区域部署与Nacos规划.md):开发/测试同机共置、生产国内/海外独立控制面、Nacos、数据库及 Event Bridge 部署边界。
### 通用规则与专项入口
- [平台、客户层级与权限契约](平台客户层级与权限契约.md):平台/客户两级产品语义、列表包含详情的只读权限和跨层同步要求。
- [统一订单主状态与操作契约](统一订单主状态与操作契约.md):统一订单状态、操作编码、内部状态映射和可信履约回传边界。
- [Admin/Client 前端原型还原验收规则](Admin-Client前端原型还原验收规则.md):页面操作承载方式、视觉还原、响应式检查和验收证据要求。
- [Admin 高密度界面规范](Admin高密度界面规范.md):已确认订单样板的字号、间距、表格、描述表和彩色页签规则;[统一弹窗规范](Admin高密度界面规范.md#弹框与表单)维护所有 Admin 弹窗的目标风格、尺寸分类和分模块实施入口。
- [Admin 客户管理样式核对记录](Admin客户管理样式核对记录.md):客户列表、海外仓阶梯费用及关联详情和弹框的样式与人工验收项。
- [Admin 国内仓样式核对记录](Admin国内仓样式核对记录.md):7 个菜单、关联详情与浮层的范围、样式复核和验收证据。
- [Admin 货柜管理样式核对记录](Admin货柜管理样式核对记录.md):订舱、拖车、送柜报关、清关提柜入口及共享组件边界。
- [Admin 海外仓样式核对记录](Admin海外仓样式核对记录.md):海外仓 10 个菜单、独立详情、作业弹框和共享组件显式接入边界。
- [AI 工程执行与协作约束](AI工程执行与协作约束.md):工作区、依赖、Git、部署、数据库、质量门禁、本机多对话重型检查限流和独立任务协作规则。
- [数据库中文注释维护规范](数据库注释维护规范.md):数据库注释口径、职责、迁移流程、自动门禁与实值验收要求。
- [数据库版本迁移与 Jenkins 自动发布方案](数据库版本迁移与Jenkins自动发布方案.md):两人团队自动迁移规划;统一工具入口、自动编号、开发/测试/生产执行分工、单服务迁移范围、漏写迁移检查、Flyway 校验、失败候选修订、发布证据保留、带数据升级演练及实施顺序。
- [数据库迁移操作手册](../baiyue-firstleg/deploy/sql/数据库迁移操作手册.md):开发者和发布执行人日常使用说明;包含新建、检查、生成清单、测试执行、生产晋级、失败处理和维护规则。
- [生产服务监控告警与无停机发布方案](生产服务监控告警与无停机发布方案.md):容器与外部可用性监控、部署期告警处理、自动恢复、发布通知及滚动/蓝绿发布演进方案。
- [测试环境 Jenkins 部署指南](测试环境Jenkins部署指南.md):测试环境持续部署授权、Job 参数、健康检查与失败处理。
- [阿里云生产环境选型、压测与上线手册](阿里云生产环境选型压测与上线手册.md):ECS/ALB、RDS MySQL、Redis、OSS、Nacos、RocketMQ、压测、高可用、监控、备份与上线清单。
- [阿里云 OSS 文件中心接入设计与评审](阿里云OSS文件中心接入设计与评审.md):Admin、Client、国内/海外 PDA 文件接入 OSS 的区域拓扑、存储适配、权限、一致性、实施拆分、验收门禁和方案评审。
- [首页数据看板真实化与统计策略规划](首页数据看板真实化与统计策略规划.md):首页指标、实时与缓存边界、统计口径和实施顺序。
- [墨家设备测量上传接口说明 V3](墨家设备测量上传接口说明-V3.md):测量设备经 Gateway 上传箱码、尺寸、重量和图片的接口契约。
## 环境协作
- [开发环境独立任务协作登记](开发环境独立任务协作登记.md):开发环境全流程总控与长期专项的稳定任务、职责及开发数据库/部署/HTTP 授权。
- [测试环境独立任务协作登记](独立任务协作登记.md):测试环境独立任务的稳定身份、职责和协作边界。
- [测试任务盘点与需求台账](测试任务盘点与需求台账.md):历史任务快照、未闭环需求、提交线索和待核实证据,不作为当前调度依据。
## 参考资料
- `悦/`:产品原型、流程图、历史架构资料和调研数据,只作为需求参考,不直接定义当前范围。
- `superpowers/`:按日期和主题保留的具体功能设计与实施记录。
## 维护规则
- 新文档按业务域归档,不新增以开发批次编号命名的目录、文件、标题、任务或范围标签。
- 已完成开发阶段的流程手册、规划、进度和验收资料统一放入 `归档/`;后续流程变更只从[头程到尾程当前维护入口](头程到尾程/README.md)进入。
- 当前交付范围始终按端到端全流程理解;业务域目录只用于检索和职责归属,不用于排除上下游流程。
- 范围、字段或流程冲突时遵循根 AGENTS.md 的事实优先级;归档确认记录不覆盖当前正式契约。文档角色按当前入口和明确标记判断,不只按文件名判断。
- 业务事实变化只修改其当前主文档及实际受影响的接口、权限、SQL、代码和测试;业务域 README 与索引仅在入口或职责变化时更新。历史规划、确认和验收记录冻结,不为追随当前规则批量改写。
- 原型中出现的功能不自动成为有效实现;必须由正式契约、代码和验收证据共同确认。
同一主题优先更新现行正文,不为每轮对话新增方案、总结、进度或交接文件。只有独立主题且现有正文无法承载时才新增,并在所属域登记角色、触发条件和替代关系。已完成的过程材料冻结归档;索引只同步路径或职责变化,不复制阶段数量、字段、状态、测试结果或完成进度。事实优先级及修改范围遵循工作区根指引。
+48
View File
@@ -0,0 +1,48 @@
# 业务单据编号契约
## 格式与分配
纳入本契约的新建业务单据采用 `前缀 + yyyyMMdd + 四位流水`,无分隔符。前缀为 2~4 位大写英文字母,总长度为 14~16 位,例如 `FL202610200001`。
- 业务日期统一按 `Asia/Shanghai` 计算;每个前缀每天独立分配 `0001` 至 `9999`。
- 同一前缀不按客户或仓库分段;服务内所有创建入口共用同一个序列。前缀按下表归属,禁止在不同服务重复分配同一前缀。
- 单号由服务端生成并保持不变。编辑、审核、作废、重复提交不换号;幂等重放返回原业务记录及原号,不重新取号。
- 序列在所属服务数据库内以原子更新和独立短事务分配;外层业务回滚允许断号,已分配号不回收。不以最大业务编号加一、时间戳、随机串、实体 ID 或其截断值生成。
- 单日四位流水用尽时明确失败,不改为五位、不循环或随机回退。日期在取号前确定,不能在格式化时重新读取日期。
- 本契约不授权对已有测试数据改号、回填、重置或执行 SQL;数据库与部署操作须独立授权。
## 前缀登记
| 服务 | 前缀与单据 |
|---|---|
| Order | `FL` 头程主订单 |
| Warehouse | `ZGRK` 国内整柜入库、`ZGCK` 国内整柜出库 |
| Firstleg | `OB` 订舱、`TA` 国内拖车派车、`LP` 预装/正式装柜计划、`DECL` 报关申报批次、`BR` 报关行批次、`PS` 船节点船期、`SL` 船期日历航次、`ST` 船期周模板、`CLG` 同柜组 |
| Lastleg 入出库 | `WC` 头程来源尾程订单、`IP` 入仓计划、`CK` 普通出库、`DFCK` 一件代发出库、`HBCK` 换标出库、`THCK` 退货出库、`PDA` 出库作业任务、`DL` 派送、`EX` 异常、`CD` 废弃 |
| Lastleg 库内服务 | `TB` 换标、`ZY` 转运、`TH` 退货、`THHB` 退货换标、`RR` 退货收货、`RB` 收货批次、`HX` 合箱计划、`YY` 送仓预约 |
| Lastleg 商业业务 | `TR` 本土卡车、`LB` 散板、`CG` 采购订单、`PR` 采购实收、`PJ` 采购交寄、`PF` 采购费用(含更正与退款费用)、`PN` 采购说明、`PX` 采购关闭、`PG` 采购更正记录 |
| Lastleg 车队 | `PC` 海外排车(原规则已符合)、`CT` 车次、`FB` 车队预订、`FO` 运力发布、`VR` 车辆运维记录 |
| Finance | `REC` 对账单、`AR` 应收结算、`AP` 应付结算、`RC` 充值申请、`AC` 账户流水、`VC` 车辆成本、`VP` 车辆付款、`PAY` 结算付款流水 |
同柜组按入仓码查询的公开摘要返回 `groupNo`;结算详情的付款流水返回 `transactionNo`,均取已生成的业务号。应收结算引用的收款凭证不生成 PAY 号,其 `transactionNo` 为空,不以内部 ID 或银行参考号替代。
同一类型的所有创建入口共用序列:例如普通卡车下单与车队商业池创建均使用 `TR`;正常车次与取货车次均使用 `CT`。预装和正式装柜清单继续使用同一个 `LP` 计划编号。
海外出库作业任务统一使用 `PDA + yyyyMMdd + 四位流水`,例如 `PDA202610230001`;一件代发、退货、转运和换标出库共用该序列,不拼接内部实体 ID。PDA 出库列表及详情以出库单号为主标识,任务号标明“任务号”作为辅助信息;扫描出库单号或任务号均可定位当前任务。入仓任务编号不在此规则范围内。
头程来源尾程订单采用 `WC + yyyyMMdd + 四位流水`,共14位,例如 `WC202610210001`,按来源柜 `sourceContainerBookingId` 复用:该来源柜首次创建尾程订单时在柜级行锁内取号,后续同柜的入仓单、不同客户或跨日交接事件复用原号;事件重放不重新取号。真实集装箱号 `containerNo` 不作为复用身份,不同来源柜即使使用相同集装箱号也不能共用尾程编号。
## 明确保留的规则
- 入仓码、拆分子订单号和子入仓码不变。子订单继续使用主订单号加拆分后缀;新主订单改号后子单自然继承主号,但不改拆分算法或重新分配独立流水。
- 柜次号继续使用全局连续的 `D0001`,不按日期重置,超过四位自然增长。
- 实物箱码、散货托盘码、退货/转运箱码及一件代发 `DP-yyMMdd-####` 托盘标签不纳入本次改号。
- 换标、转运、退货来源尾程订单继续沿用对应业务单号,不增加第二套业务身份。
- 自营采集任务号、主数据编码及未列入登记表的其他编号不在本次范围。
- 外部提单号、真实集装箱号、运单号、FBA 货件号、银行流水号等保留外部原号。
## 实现与验收
通用格式由 `baiyue-firstleg/common-core/.../number/DailyDocumentNumber.java` 提供;各服务通过自己的 `DocumentSequenceRepository → DocumentSequenceMapper` 访问本库编号表。海外排车继续复用原 `DispatchNumberSequence`。
验证覆盖北京时间跨日、前缀独立、并发唯一、外层回滚不复用、缓存绕过、9999 上限、业务重放及保留编号规则。数据库变更同步模块空库基线和 `deploy/sql/` 统一空库入口;本地测试不代表已执行数据库变更或已部署。
+315
View File
@@ -0,0 +1,315 @@
# 业务实现边界
角色:按主题读取的跨端实现约束正文,承接原业务快速索引中的边界说明;不作为启动必读或部署进度来源。已知目标代码时直接工作,只有接口、状态、权限或业务归属不明确时才读取命中章节。
用 `rg -n -F '主题词' docs/业务实现边界.md` 定位标题,只读该标题到下一个同级标题。路径从工作区根或文中注明的应用 `src/` 起算;专题正式契约优先,新增专题规则只在其主文档维护,本文件保留必要的实现引用。
公共架构按主题选择[部署契约](测试环境单机部署与配置契约.md)或[认证与通信契约](统一认证与服务通信契约.md),不因读取本文件而同时加载两份契约,也不在本文另建环境、会话或投递规则。
## 登录认证
范围依据:`docs/订单与客户/README.md`。
Admin `modules/auth/`、`core/auth/`;Client `modules/auth/`;Backend `auth/`、`iam/`。统一 Token 不携带角色或权限集;各端读取 Auth 登录/刷新响应的顶层授权快照用于展示,Gateway 与业务服务通过统一会话及 Auth 权威校验执行授权,不再依赖 Lastleg 安全投影
## 客户与企业
范围依据:`docs/订单与客户/README.md`、`docs/订单与客户/订单与客户头程订单闭环设计.md`。
Admin `modules/customers/`;Client `modules/tenant-management/`、`modules/account/`;Backend `iam/`、`auth/`、`file/`。公司联系电话/邮箱是企业资料,不作为成员登录标识且不要求跨企业唯一;成员登录手机号归账号链路,修改时同步 Auth 并撤销该账号会话。审核必填资质仅营业执照与统一社会信用代码;法人身份证选填,可在已有营业执照后单独补传或替换,营业执照仍须与统一社会信用代码整包提交;默认尺寸配置由 IAM 持久任务异步调用 `firstleg/`,未就绪不得审核通过
## 供应商与国内整柜
范围依据:`docs/国内货柜履约/国内货柜履约需求确认表.md`。
Admin `modules/suppliers/`、`modules/domestic-containers/`;Backend `warehouse/`;OpenAPI `supplier-v1.yaml`、`domestic-container-v1.yaml`
## 平台收货仓
范围依据:`docs/订单与客户/订单与客户头程订单闭环设计.md`。
Admin `modules/warehouses/`;Client `modules/first-leg/`;Backend `warehouse/`
## 头程订单、批量审核预览与入仓码关系
范围依据:`docs/订单与客户/README.md`、头程订单闭环设计。
Admin `modules/first-leg-orders/`、`modules/unified-orders/`;Client `modules/first-leg/api/inboundCodeAssociations.ts`、`modules/first-leg/`;Backend `order/` 的 `InboundCodeAssociationService`、`UnifiedOrderQueryService`、`BatchOrderReviewPreviewService` 与 `firstleg/`。Order 为 `SUBMITTED` 时,即使 Firstleg 已存在准备中入库投影,统一列表仍固定显示 `PENDING_REVIEW` 并提供审核动作;批量审核弹框只调用 `/orders/first-leg/batch-review-preview` 一次获取按请求顺序返回的快照,不逐票查询详情,主要展示入仓码而非内部订单 ID
## 客户头程订单批量导入
范围依据:当前 Order 契约。
Client `modules/first-leg/views/FirstLegOrdersView.vue`、`api/firstLeg.ts`;Backend `order/` 的 `MerchantBatchImportService`、`MerchantWarehouseCatalogClient`、`MerchantPricingCatalogClient` 与 `order-v1.yaml`。中文 XLSX 模板按当前客户动态生成地址、全部有效仓库和渠道下拉;导入时重新校验动态选项与客户归属,最多 50 行,只创建草稿,支持部分成功或整批原子模式
## 平台旧系统订单导入
范围依据:当前 Order 契约。
Admin `modules/unified-orders/pages/UnifiedOrdersView.vue`、`api/unifiedOrders.ts`;Backend `order/` 的 `PlatformLegacyOrderImportService` 与 `/api/platform/v1/orders/first-leg/legacy-import`。固定归属启用客户“IT测试公司”,保留旧入仓码,按当前公共仓库和客户价格簿逐行校验,成功行进入待审核
## 平台修改客户原始申报与履约渠道
范围依据:当前 Order/Firstleg 契约。
Admin `modules/unified-orders/components/OrderDeclarationEditorDialog.vue`、`api/unifiedOrders.ts`;Backend `order/` 的 `OrderDeclarationUpdateService` 与 `order-v1.yaml`,通过 `ORDER_DECLARATION_UPDATED_V1` 同步 `firstleg/` 的 `OrderDeclarationSyncService`。只修改申报快照,不覆盖仓库/PDA 实测、测量审核、箱码或已确认费用;渠道变化额外校验分柜、同柜、装柜可逆性与重新计价,国内收货仓或中转仓变化必须重新下单
## 脚本管理、全量验证与测试造数
范围依据:`baiyue-firstleg/scripts/AGENTS.md`、`baiyue-firstleg/scripts/README.md`。
本机重型检查经 `scripts/local-check.ps1` 统一限流,规则见 `docs/AI工程执行与协作约束.md`;Backend `scripts/` 为仓库级入口,`scripts/admin-test-env-modules/` 为 Admin HTTP 内部模块;服务局部脚本留在 `<service>/scripts/`,不得散落到 `src/test/scripts/`;真实 HTTP、部署或环境写入仍须当前轮明确授权
## 平台/企业 RBAC
范围依据:订单与客户契约;公共语义见 `docs/平台客户层级与权限契约.md`。
Admin `modules/iam/`、`core/access/`;Client `modules/tenant-management/`;Backend `iam/`、`auth/`
## 消息中心与站内通知
范围依据:触发业务的阶段/专题契约,收件箱以 IAM OpenAPI 为准。
Admin/Client `modules/notifications/`;Backend `iam/.../notification/`;生产者留在所属服务
## PDA 拣货与柜级装柜证据
范围依据:国内 PDA README、拣货原型、国内货柜履约需求确认。
PDA `pages/picking/`、`stores/picking.js`、`api/pda-loading.js`;证据以 `taskId + warehouseId` 进入任务专用 API,业务所有权固定真实 `containerBookingId`,不得按入仓单或客户拆分;上传以幂等键绑定包含文件内容的请求哈希,完全重放直接返回已有结果且不得重复上传 File;Backend `firstleg/`、`warehouse/`、`file/`
## 到仓测量、测量库位、箱规策略与头程计费
范围依据:`docs/入库测量与计费/README.md`;规则查 `baiyue-firstleg/firstleg/AGENTS.md` 对应入口。
Admin `modules/inbounds/measurement/InboundMeasurementDialog.vue`、`InboundMeasurementPanel.vue`,称重 `modules/inbounds/weight/components/WeightOcrPanel.vue`;Backend `firstleg/` 的 `InboundMeasurementService`、`MeasurementLocationOccupationService`、`FbaPricingService`。库位归 `warehouse/`,图片归 `file/`,OCR 归 `integration-service/`;只按实际调用增加服务指引
## 客户专属报价、柜级阶梯运费与费用调整
范围依据:当前 Firstleg 计价契约、`docs/入库测量与计费/README.md`。
Admin `modules/fba-pricing/carrier-rates/`、`modules/inbounds/fee/`、`modules/unified-orders/components/InboundFeeDetailManager.vue`;Backend `firstleg/` 的 `PlatformPriceBookService`、`ActivePriceBookEstimator`、`FbaPricingService`、`ContainerTierAmountAllocator`、`InboundFeeDetailService` 与 `fba-pricing-v1.yaml`。公共报价使用 `customerId=0`,客户专属报价按客户独立版本化并优先于公共 ACTIVE 版本;柜级区域重量阶梯只聚合同柜同客户中费用快照同为 `REGION_WEIGHT_TIER` 的成员并守恒分摊,混柜的固定仓价等其他模型不参与阶梯且保持原费用,装柜成员变化只重算未锁定的区域阶梯费用。人工调整计费量限系统基准上下 10% 且必须带版本、原因和二次确认;`PRIVATE_LAST_MILE_DELIVERY` 只允许私人目的仓;一件代发在预装确认前完成计价,`WAIT_PALLETIZE` 试算不得回退托盘化状态
## 箱唛、箱码与单箱测量
范围依据:`docs/入库测量与计费/入库测量与计费需求优化版-v2-测量计费入库主流程.md`、`docs/墨家设备测量上传接口说明-V3.md`。
Admin `modules/inbounds/measurement/`;Client `modules/first-leg/`;Backend 按 `firstleg/AGENTS.md` 的箱唛与测量入口
## 称重确认、整票库位块与部分拣货资源结算
范围依据:`baiyue-firstleg/firstleg/AGENTS.md` 的称重入口、`baiyue-firstleg/warehouse/AGENTS.md` 的 A0/资源结算规则。
Admin `modules/inbounds/weight/components/WeightOcrPanel.vue`;Backend Firstleg `MeasurementLocationOccupationService`、`InboundMeasurementService`、`MeasurementSubmissionService` → Warehouse `LocationBlockService`。国内整票资源结算按 `reservationId` 定位;称重、槽位容量和部分拣货的详细门禁留在所属服务指引
## 入库扣货、解除与凭证
范围依据:入库测量与计费、国内货柜履约契约。
Admin `modules/unified-orders/pages/UnifiedOrdersView.vue`、`modules/inbounds/core/api.ts`;Backend `firstleg/` 的 `InboundHoldService`、`InboundHoldGuard`、`InboundHoldEvidenceService`,文件归 `file/` 的 `INBOUND_HOLD_EVIDENCE`。扣货状态必须阻断后续物理履约写入;已发生拣货、装柜或出仓时禁止手工扣货/解除,命令携带版本与幂等键,只有进入不可变历史的凭证可下载
## 财务管理与柜级公共费用分摊
范围依据:`docs/财务管理/` 产品确认、五页验收契约、Firstleg-Finance 跨服务契约。
Admin `modules/finance/`、`modules/loading-lists/components/ContainerFeesPanel.vue`;Client `modules/finance/views/FinanceBillsView.vue`,账单行按 `inboundCode` 复用头程入仓关系详情;Backend `finance/`、`firstleg/`,契约 `container-fees-v1.yaml`;导出与凭证归 `file/`。跨客户公共柜费按柜内真实客户与订单归属原子建组,金额合计等于柜费总额,审核、驳回、调整和作废整组处理,单行入口不得破坏组一致性
## 客户资金账户、充值、授信与业务扣费
范围依据:[客户资金账户规则](财务管理/财务对账结算P1闭环.md#客户资金账户);资金指令投递查[统一通信契约](统一认证与服务通信契约.md#b-逐事件直接投递与结果确认)。
Admin `modules/finance/pages/FinanceCustomerAccountsView.vue`;Client `modules/finance/views/FinanceAccountView.vue`;Backend `finance/` 的 `FinanceWalletService` 与三类 Wallet Controller。充值申请经 File 保存凭证,平台审核或手工充扣;余额、授信、冻结、结算和释放以 Finance 主账为准。海外业务经 `WALLET_COMMAND_REQUESTED/COMPLETED` Outbox 直接投递往返,不跨区同步调用钱包
## 订单编排、分柜、同柜不可拆组与柜次
范围依据:`docs/国内货柜履约/README.md`、`docs/国内货柜履约/国内货柜履约需求确认表.md`、`docs/统一订单主状态与操作契约.md`。
Admin `modules/unified-orders/api/coLoadGroups.ts`、`modules/unified-orders/`、`container-loading/`;Client `modules/first-leg/`;Backend `firstleg/loading/coload/`、`firstleg/split/`、`firstleg/loading/`、`order/`;同柜组按订单创建,由服务端冻结每票全部可用入仓片段,仅要求同国内仓、同渠道,允许跨客户及不同目的仓港
## 全局智能排柜、预装与真实集装箱号后补
范围依据:`docs/国内货柜履约/README.md`、`docs/国内货柜履约/国内货柜履约需求确认表.md`、`docs/统一订单主状态与操作契约.md`。
Admin `modules/container-loading/components/SmartLoadingDialog.vue` 内嵌 `pages/GlobalSmartLoadingView.vue`,柜次页 `SmartLoadingWorkbenchView.vue`,预装详情 `loading-lists/pages/PreloadPlanDetailView.vue`;PDA `pages/picking/`;Backend `firstleg/` 的 `PlatformSmartLoadingController`、`SmartLoadingService`、`PendingReviewOrderClient`、`loading/`,待审核事实来自 Order `PendingReviewOrderQueryService`。全局候选覆盖 `PENDING_REVIEW/WAIT_MEASURE/WAIT_SPLIT/LOADING`,状态只用于筛选展示,能否加入以服务端 `canAssign` 为准;待审核/待测量可提前占位,但确认预装或启动 PDA 前必须进入 `WAIT_SPLIT`。暂估明细的 `totalPackageCount/remainingPackageCount` 在测量前取 Order 原始申报箱数,测量完成后取最新已审核测量箱数,读取补充失败只回退当前已分配数,写入调整仍重新校验权威数量。同柜不可拆组仅在全员命中状态集合时作为一个分页与分配单元;人工加入允许跨渠道,智能推荐仍按柜次渠道。计划可一次性移除全部未拣明细,但任一成员已拣的同柜组必须整组保留。创建柜次时原子生成唯一预装计划,加入入仓码即建立关联;真实集装箱号不阻塞订舱关联,但确认预装和创建 PDA 任务前必须补齐。历史缺号任务允许在预装详情首次补录,保存后恢复 PDA 可进入状态
## 客户入库结果与头程费用确认
范围依据:入库测量与计费主流程、当前 Firstleg 契约。
Client `modules/first-leg/components/InboundBillingPanel.vue`、`api/inboundBilling.ts`;Backend `firstleg/` 的 `MerchantInboundBillingController`、`MerchantInboundBillingService`、`FbaPricingService` 与 `firstleg-v1.yaml`。客户仅能确认本客户 `SENT` 的最新费用版本,提交 `expectedFeeVersion` 与幂等键;确认记录当前成员和时间并永久锁定该版本,平台不得再修改
## 订舱资料、放舱、出仓前船期与订舱级拖车
范围依据:国内货柜履约 README、需求确认和实施边界。
Admin `modules/ocean-bookings/`、`port-schedules/`、`trucking/`;Backend `firstleg/oceanbooking/`、`firstleg/portschedule/`、`TruckAppointmentService`。拖车预约由 `RELEASED` 订舱拥有,不按客户、柜次、装柜计划或真实柜号归属;每个订舱最多一张非终态拖车单,创建候选由服务端排除缺提单/有效订舱文件或已有有效拖车单的订舱;PDA 装柜完成不推进拖车状态;全部要求货柜确认国内离仓后自动完成,人民币拖车费按实装体积分摊为柜次应付并经 Finance Outbox 入池
## 目的港码头拖车与还空预警
范围依据:`docs/海外仓业务/README.md`。
与订舱级拖车预约是不同生命周期。Admin 海外清关提柜列表/详情 `modules/container-loading/pages/OverseasContainersView.vue`、`modules/container-loading/pages/OverseasContainerDetailView.vue`;Firstleg 拖车 API `api/terminalDrayages.ts`,柜级到仓 API `api/containerArrivalTimes.ts`。原预约/实际提柜列改为预计/实际到仓:预计时间由平台在列表快捷选择并同步 Lastleg 整柜尾程订单,实际时间取海外 PDA 首次开始收货;车队、邮件、还柜与 `unloadingCompletedAt + 72h` 预警仍归 `firstleg/terminaldrayage/`。
## 整柜报关资料与完成文件
范围依据:国内货柜履约契约。
装柜完成后由 Admin `modules/container-loading/components/ContainerCustomsPanel.vue` 管理整柜报关,Client `modules/first-leg/components/CustomsDocumentsDialog.vue`、`api/customs.ts` 按订单处理本客户退税资料;Backend `firstleg/customs/container/`、`customs-v1.yaml`,文件归 `file/`。客户资料可覆盖同柜多个退税入仓码,开始报关后冻结;平台逐资料回传完成文件,全买单柜走平台确认与明细导出
## 国内出仓确认
范围依据:国内货柜履约契约。
Admin `modules/outbound-dispatch/`;Backend `firstleg/outbound/dispatch/`
## 客户统计与平台日志
范围依据:[客户统计指引](../apps/admin-web/src/modules/customers/AGENTS.md)、[操作审计指引](../apps/admin-web/src/modules/audit/AGENTS.md),按对象选一项。
Admin `modules/customers/`、`modules/audit/`;Backend `firstleg/customerstatistics/`、`audit-service/`
## 客户工作台账户与设置
范围依据:订单与客户契约。
Client `modules/account/`、`system/`、`tenant-management/`;Backend `iam/`、`auth/`
## 企业订单与跨境业务
范围依据:订单与客户、国内货柜履约契约。
Client `modules/order-management/`、`cross-border/`;Backend `order/`、`firstleg/`、`integration-service/`
## 海外接柜、入库与库内库存
范围依据:`docs/海外仓业务/README.md`。
Admin 按 `apps/admin-web/AGENTS.md` 海外模块入口;海外入口 `gateway/`;尾程/入仓/换标/库存 `lastleg-service/`;仓库主档归国内 `warehouse/`,库位/托盘/锁归 `warehouse-overseas-service/` 并只引用国内 warehouseId;与排车、出库、派送共同组成海外仓全流程
## 尾程订单控制与柜级入仓计划转换
范围依据:`docs/海外仓业务/README.md`。
Admin `modules/overseas-warehouse/pages/LastMileOrdersView.vue`、`LastMileOrderDetailView.vue`、`api/lastMileOrders.ts`;Backend `lastleg-service/` 的 `LastlegOrderController`、`LastlegOrderCommandService`、`InboundPlanService`、`ContainerInboundPlanConversionCoordinator`,资源归 `warehouse-overseas-service/` 的 `WarehousePalletBatchService`。`orders/container-summaries` 按 `sourceContainerBookingId` 跨客户聚合并分页返回全部稳定来源柜,已完成计划转换的柜仍保留用于接柜仓查询与修改;生成动作只消费 `allPlansReady/pendingPlanCount/resourcePendingPlanCount`,详情不受列表分页截断。确认前从 `/inbound-plans/container-preview` 读取服务端分组、托数、阻断项与 `snapshotVersion/snapshotHash`;`convert-container` 锁柜重算后先批量预留真实托盘,再本地原子生成剩余独立计划并确认资源,失败仅补偿未确认资源,同柜重放不得产生第二批资源。单票手工计划保存后,全柜计划齐全且预览就绪时自动生成并绑定托盘资源,一票柜立即触发;`resourcePendingPlanCount` 表示自动生成异常后的重试入口,资源未齐不得进入 PDA 接柜。自动入口见 Lastleg `ContainerInboundPlanConversionCoordinator.convertManualAndAutoMaterialize`。单票可维护完整入库计划、暂扣/解除及八行人工节点快照;命令提交订单版本与幂等键,新增暂扣只允许完成入库后执行并仅阻断该票后续排车/出库,不阻断入库计划或入库作业;人工节点首次保存后固定 `MANUAL` 来源且不得回退柜级节点
### Admin 入仓计划页面约束
代码路径相对 `apps/admin-web/src/modules/overseas-warehouse/`,含 `../` 的路径按模块关系解析。
柜子工作台按 `sourceContainerBookingId` 消费 `/orders/container-summaries`;服务端分页返回全部稳定来源柜,计划已经齐全的柜仍保留用于接柜仓查询和修改,并按冻结 `plannedArrivalAt` 升序、空值最后排序。详情返回全柜订单且不受列表分页截断;单票手工计划保存后,由服务端在整柜最后一票计划齐全时自动生成并绑定全柜托盘码,一票柜立即生成;`resourcePendingPlanCount` 只表示自动生成异常的重试入口,不是正常人工步骤。柜级确认弹框先调用 `/inbound-plans/container-preview`,按服务端 FBA/一件代发/私人地址分组展示头程已有、海外仓补充和最终托数以及 `readiness/blockers`;散货最终托数不得少于头程已有托盘码,差额连续补码且不阻断流程;一件代发必须严格按不可变头程封托托盘数整体入库,单票表单托数锁定且服务端再次失败关闭校验。前端不计算托数、不逐票建计划、不预占托盘,再把同一 `snapshotVersion/snapshotHash` 原样提交 `/inbound-plans/convert-container`,快照冲突后重新获取预览。服务端只为剩余订单逐票生成独立计划,并为异常遗留的人工计划补齐真实托盘,整批原子且重放不得产生第二批资源。单票完整入库计划、暂扣/解除和八行人工节点均从 `api/lastMileOrders.ts` 提交订单版本与幂等键;入库弹框每次打开通过 `/orders/container-arrival-times/query` 读取柜级权威到仓结果,不使用订单列表旧快照作为显示或提交门禁;优先展示人工时间,未维护且未建计划时展示服务端按到港当地日期加两个自然日返回的 `plannedDate/isDefault`,默认日期不补零点,首个计划生成后沿用冻结日期。加载中、读取失败、缺失或同柜不一致时阻止提交;预计到仓时间不进入人工计划请求,服务端按整柜校验并写入同一日期;入仓码只读展示并提交订单冻结值,不允许人工改写。新增暂扣只在 `INBOUND_COMPLETED` 开放,解除暂扣保持可用;暂扣不阻断入库计划,只限制后续排车和出库。人工节点一经保存不得回退柜级节点。转仓候选只取 `../iam/api/platformIam.ts` 的平台公共 `ACTIVE + FBA` 仓主档;Backend `lastleg-service/`
## 海外仓 PDA
范围依据:`apps/pda-overseas-uniapp/AGENTS.md`;执行规则查 `baiyue-firstleg/lastleg-service/AGENTS.md`,跨模块流程才查海外仓 README。
入仓 `src/pages/operation/`、`src/api/inbound.js`;排车与出库 `src/pages/dispatch/`、`src/pages/outbound/`、`src/api/fulfillment.js`。Backend `lastleg-service/inboundplan/pda/`、`dispatch/pda/`、`delivery/`;统一经 `gateway/`。柜级收货与单票客户隔离按 Lastleg“PDA 入仓”规则核对
## 海外采购、本土卡车与散板
范围依据:`docs/海外仓业务/README.md`。
Admin `modules/overseas-business/`;Client `modules/cross-border/`;Backend `lastleg-service/` 的 `procurement/`、`trucking/`、`looseboard/`;统一经 `gateway/`
## 采购样品、货款、装箱清单、面单、预估快递费、国内收货寄客户
范围依据:`docs/海外仓业务/采购订单样品履约流程变更需求.md`。
采购流程变更入口;代码从上述采购模块进入
## 海外仓库与通用资料
范围依据:主档查 [Warehouse 指引](../baiyue-firstleg/warehouse/AGENTS.md),海外库位、托盘与锁查 [Warehouse Overseas 指引](../baiyue-firstleg/warehouse-overseas-service/AGENTS.md)。
全部仓库主档进入 Admin `modules/warehouses/` 与国内 `warehouse/`;海外库位/托盘/锁进入 `warehouse-overseas-service/` 并引用国内 warehouseId;报价、汇率、车辆按海外服务实际契约
## 车辆管理、司机证照、保养加油、车辆维修/故障/救援/异常、外接货与车次
范围依据:`apps/admin-web/src/modules/overseas-master-data/AGENTS.md`、`baiyue-firstleg/lastleg-service/AGENTS.md`;原型范围有疑问时查 `docs/海外仓业务/车辆管理原型梳理与任务规划.md`。
Admin `modules/overseas-master-data/`;Backend `lastleg-service/fleet/`,接口 `lastleg-service/src/main/resources/openapi/fleet-drivers-v1.yaml`、`fleet-trips-v1.yaml`、`fleet-vehicle-records-v1.yaml`;证照与运维照片存储查 `file/AGENTS.md`
## 拼车需求池、车次余位、销售拼车意向
范围依据:`docs/海外仓业务/内部拼车需求池首版开发契约.md`、`apps/admin-web/src/modules/overseas-master-data/AGENTS.md`。
复用 Lastleg Fleet 与本土业务;区分车次余位发布和客户订单,不从需求池生成第二套库存或费用
## 国内出仓后船节点
范围依据:`docs/海外仓业务/README.md`。
Admin `modules/port-schedules/`、`ocean-bookings/`、货柜详情;Backend `firstleg/portschedule/`、`integration-service/`;从确认国内出仓查询至目的港到达、提柜和还柜。节点按 `containerBookingId` 柜级聚合,跨区事件使用 `tenantId=0` 平台技术范围,不携带或校验客户
## 海外出库、排车、派送、异常与回访
范围依据:排车改造查[排车列表统一作业改造契约](海外仓业务/排车列表统一作业改造契约.md);既有缺陷修复查[排车流程修复规划](海外仓业务/排车流程修复规划.md)。
Admin `modules/overseas-warehouse/pages/DispatchesView.vue`、`DispatchDetailView.vue`、`OutboundsView.vue`、`DeliveryOrdersView.vue`、`ExceptionOrdersView.vue`、`CustomerVisitsView.vue`;Backend `lastleg-service/dispatch/`、`delivery/`、`dropship/`、`exceptionorder/`、`customervisit/`;统一经 `gateway/`
以下 Admin 条款来自模块指引,按具体页面选读;排车状态、照片门禁及自动发车时机以本节排车现行契约为准。代码路径相对 `apps/admin-web/src/modules/overseas-warehouse/`,含 `../` 的路径按模块关系解析。
### Admin 出库与派送页面约束
`api/outbounds.ts`、`api/deliveryOrders.ts`;出库详情使用 `deliveries` 展示按目的 FBA 仓拆出的全部派送单,派送列表和详情必须显示目的 FBA 仓。人工状态入口不提供完成派送;签收资料保存成功后提示自动完成并刷新列表。出库列表按类型筛选并展示中文类型,状态须覆盖 `WAIT_PICK/待拣货`、`PICKING/拣货中`、`PICKED/已拣货`、`WAIT_OUTBOUND/待出库`、`OUTBOUNDED/已出库` 和 `CANCELLED/已取消`;仅未开始的 `WAIT_PICK/WAIT_OUTBOUND` 允许取消。一件代发新建弹窗直接跨客户加载服务端可用候选,不单独展示客户筛选,海外仓必选并优先默认洛杉矶仓;订单条件可按订单号、入库单号、客户、托盘号、SKU 或品名查询/重置,以托盘+SKU 行分页多选。提交时从所选行解析唯一客户,并校验所选行属于当前唯一海外仓,不要求先选客户。退货出库客户下拉同时展示客户名称与联系电话并支持手机号检索,客户和仓库选项独立容错加载;选择客户后须立即按当前默认/已选海外仓加载库存。SKU 与箱号查询均使用输入态/已查询态分离,只允许点击查询按钮后生效;支持英文逗号批量条件,查询时清除空格并按任一条件命中,左右列表分别提供每页 5/10/20/50 条选择。SKU 列表只展示 `availableQuantity > 0` 的未占用可用数量,合箱后已扣减为零的 SKU 不再作为可选库存显示,实际作业以可用箱唛选择和箱内 SKU 明细扣减为准。取消、派送列表/详情及退回入口对应 Backend `lastleg-service/delivery/`、`dropship/`
### Admin 排车审核附件
- 排车调度/理货审核分区仅显示审核、详情;审核弹框的车辆图片、司机照片和驾驶证照片通过既有本车附件接口上传,随 `ReviewCommand.attachments` 保存,不调用资源编辑命令。已有资源与审核附件只读预览,详情合并展示;当前审核权限与服务端 Gate 控制上传及提交,列表查看权限控制读取。
### Admin 一件代发出库候选
- 一件代发出库候选选择:`pages/OutboundsView.vue` 按 `inventoryPositionId + skuCode` 保留跨页选择,只提供本页全选;查询/重置回到第一页,切换海外仓清空选择。提交仍校验同客户、同海外仓,数量取所选行的 `availablePackages`(箱数),不能按 SKU 件数替代;候选同时展示当前可出箱数对应的毛重、材积重和体积,创建出库单时服务端按本次出库箱数占实际入库箱数的比例冻结三项测量快照。候选交互回归见 `pages/OutboundsView.selection.test.ts`;状态展示与取消门禁见 `pages/OutboundsView.test.ts`、`pages/OutboundDetailView.test.ts`。
### Admin 货物计划与装车命令
- 装车完成通过`completeDispatchLoading`一次提交,返回状态、照片可上传阶段与自动推进条件按本节排车现行契约消费;原请求恢复不重建单据。未知费用保持未确认,由既有后台费用管理维护,不按金额推断覆盖或重复记费。已有排车加货和移货仅从`SmartDispatchDialog.vue`内的`SmartDispatchExistingCargo.vue`进入;移货必须使用`GET items`返回的真实dispatchItemId及逐项remove Gate;路线仅重排`GET route`返回的既有全部目的地,包含外接点,不能新增或猜测目的地。附件沿`DispatchEvidenceFiles.vue`的本车鉴权上传/读取,上传与主单引用保存分开。
- 排车列表车辆信息编辑、BOL PDF 和装车完成从 `pages/DispatchesView.vue` → `api/dispatches.ts` 进入;列表和详情不另设添加/移除货物入口。货物计划统一由 `components/SmartDispatchDialog.vue` 承载:新建使用候选、草稿及托盘锁,已有排车经 `components/SmartDispatchExistingCargo.vue` 读取实际明细并按版本增减;两类服务端命令不得混用。原加货/移货未知请求也在智能排车恢复。回归为对应组件测试、`pages/DispatchesView.test.ts`、`pages/DispatchDetailView.test.ts` 及 `pages/prototypeContract.test.ts`。
### Admin 取消与费用展示
- 出库取消提示先解除车次关联,取消后仍须在排车列表释放原排车占用;不提示库存已自动回滚。派送详情费用读取reviewStatus/sourceStatus/voidStatus,同一详情响应展示待财务确认、待财务处理、确认作废,不逐行查询,也不把取消成功视为费用作废。货柜费用面板直接消费同一费用来源接口,待确认时同样禁止调整和重复作废,沿用原页面/弹框承载。
### Admin 业务导出
- 尾程订单、库存余额与进销存记录导出统一使用 `../downloads/` 的 `useExportTask` 创建 XLSX 任务;保留当前筛选和业务导出权限,并要求 `platform:download:list`。Lastleg 内部 Provider 契约为 `lastleg-exports-v1.yaml`,业务页面不再请求同步 CSV。
### Admin 装车照片与资料入口
- 装车照片与资料从 `components/DispatchDocumentsDialog.vue` → `DispatchLoadingDocuments.vue` → `api/dispatchLoadingDocuments.ts` 进入;五框按整车保存,不依赖派送权限或派送单。原上传/绑定结果未知保留原文件、版本及键;明确版本冲突后刷新再用原文件保存。两端共享及自动推进规则唯一见排车正式契约。
## 海外业务费用来源与客户财务
范围依据:当前实现查财务契约与统一认证与服务通信契约;阶段 0A—0E 开发再读 `docs/财务管理/海外仓费用统一接入阶段0技术契约.md`。
当前 V1 由 `lastleg-service/financefee/` 校验海外入仓、采购、美国卡车、本土散板和海外仓服务费,通过完整快照和 Outbox 直接投递 Finance 内部入口入池;阶段 0 目标改为收费身份/候选版本、Finance 接受或拒绝结果事件及版本化资金计划。必须沿代码确认落地范围,不把技术契约当成已实现状态;Client 仍只读取获准客户财务
## 自营销量与领星统计
范围依据:`docs/自营业务/README.md`。
领星 WMS 自研系统(OMP)、经营总览图表、自营 SKU 日销量、热销与滞销排行、分仓产品库存与可售天数、库存周转、数据采集:先读 `apps/admin-web/src/modules/self-operated/AGENTS.md`;查询与采集编排查 `baiyue-firstleg/lastleg-service/AGENTS.md` 的自营入口,签名/限流/供应商分页问题才读 `baiyue-firstleg/integration-service/AGENTS.md`。区别于整箱库存和客户 WMS 作业库存。
自营专题按任务选择:总览图形/下钻查 `docs/自营业务/经营总览图表设计.md`,库存周转查 `docs/自营业务/库存周转视图设计.md`,采集交互查 `docs/自营业务/数据采集页面设计.md`,查询性能查 `docs/自营业务/领星统计查询性能优化方案.md`,外部接口联调查 `docs/自营业务/领星WMS接口联调手册.md`。架构/表结构不明时从 `docs/自营业务/README.md` 定位一期方案,不默认同时读取所有专题。
## 预约管理与工作日历
范围依据:`docs/海外仓业务/预约工作日历V13变更说明.md`(业务规则);`docs/海外仓业务/预约工作日历开发协作契约.md`(接口与文件边界),按本次问题选一项。
美国各类预约统一总览、提柜/用车/送仓预约梳理:`docs/海外仓业务/美国预约管理统一总览与优化方案.md`(设计建议);实际维护仍按下述来源模块进入。
预约工作日历、多客户共车、中转分批后送、改期取消、重新预约和未定日期事项:先读 `docs/海外仓业务/预约工作日历V13变更说明.md`(正式业务规则与验收),再读 `docs/海外仓业务/预约工作日历开发协作契约.md`(接口与文件边界);权威业务事实仍由下述来源模块维护。
预约管理、预约列表、到港/排车/还柜/计划到仓四类日历:Admin `apps/admin-web/src/modules/appointment-calendar/`,当前入口与日期规则见 `docs/海外仓业务/预约工作日历V13变更说明.md` 的“2026-10-19 当前预约列表收敛规则”;原送仓业务仍从 `docs/海外仓业务/README.md` 的“预约送仓”进入。排车只取海外仓送往 FBA/客户仓的真实车次,区别于订舱级拖车和港口提柜。
## 退货预报、签收、库存与合箱
范围依据:`baiyue-firstleg/lastleg-service/docs/business-index.md` 的退货入口。
退货预报、签收、库存与合箱:Client `modules/overseas-warehouse/views/ReturnOrdersView.vue`、`ReturnInventoryView.vue`;Admin `modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue`;海外 PDA `src/pages/return-receipt/return-receipt.vue`、`src/pages/return-packing/return-packing.vue`,API 与检查入口见 `apps/pda-overseas-uniapp/AGENTS.md`;Backend `lastleg-service/returnreceipt/`,执行规则先读 `baiyue-firstleg/lastleg-service/AGENTS.md`,详细接口与状态按需查 `baiyue-firstleg/lastleg-service/docs/business-index.md` 的退货入口,OpenAPI 为 `overseas-business-v1.yaml`。客户预报 → 平台审核 → PDA 签收 → 退货箱/SKU 库存 → 同客户合箱 → `delivery/` 退货出库;两个 PDA 页面均在 `src/pages.json` 注册,由 `src/data/overseas-workbench.js` 提供入口,真机验收另取证。派送异常退回仍归 `exceptionorder/`。
## 散货托盘码生成、打印与跨区传递
范围依据:`docs/打印标签维护/README.md`;各应用/服务最近指引。
散货托盘码生成、打印与跨区传递:Admin `modules/loading-lists/components/PalletLabelPrintDialog.vue`;Firstleg `LoadingPalletLabelService`、`LoadingCompletedOutboxService`;Lastleg `LastlegSourcePalletMapper`、`InboundPlanService`。从各项目最近指引继续定位;散货 FBA 标签与一件代发实装托盘分别取各自冻结事实。
+76 -95
View File
@@ -1,40 +1,16 @@
# 业务快速索引
本文件按需检索,不作为启动必读文档。以下路径均按工作区根目录或表内注明的应用源码根目录起算,不相对于 docs/。
本文件只负责消除歧义与定位,不是启动必读清单。已知文件、组件或 API 时跳过本文件;先按终端选应用,再用 `rg -n -F '组合词' docs/业务快速索引.md` 读取命中行。
Firstleg 代码从 `baiyue-firstleg/firstleg/AGENTS.md` 的短表定位;状态、计价、装柜和 PDA 资源规则按需查 `baiyue-firstleg/firstleg/docs/business-index.md` 对应条款,不全文加载其他业务。
Admin、Client、海外 PDA 从各应用 AGENTS.md 短表定位,行为变更按需查 [Admin 细则](../apps/admin-web/docs/business-index.md)、[Client 细则](../apps/client-web/docs/business-index.md)、[海外 PDA 细则](../apps/pda-overseas-uniapp/docs/business-index.md);Lastleg 的事件、查询与履约细则见[服务业务索引](../baiyue-firstleg/lastleg-service/docs/business-index.md),只读取受影响条款。
架构/环境/部署查[测试环境单机部署与配置契约](测试环境单机部署与配置契约.md);网关/Token/会话撤销/事件通信查[统一认证与服务通信契约](统一认证与服务通信契约.md)。下文旧区域服务路径用于定位现有实现,目标规则以这两份主契约为准。
代码问题直接进入列出的模块并读适用指引;只有业务边界不清时才读“边界正文”的命中章节,不串读各层 README、其他应用索引或整个正文文件。表内代码入口相对工作区根,前端仍按任务终端分流;服务端入口不要求纯展示任务先读后端。
## 常用说法与歧义分流
仓储转运审核、转运驳回:Admin 尾程订单 `apps/admin-web/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue` → `apps/admin-web/src/modules/overseas-warehouse/components/WarehouseTransferReviewDialog.vue`;权限、状态及 API 见该模块 `AGENTS.md` 的“仓储转运审核、通过与驳回”。不要把该入口当作头程订单审单,也不要按“转运”误入排车转派送。
先从任务中取“终端 + 业务对象 + 动作”,如“海外 PDA + 柜号 + 收货”。优先检索下面列出的组合词,不拿整句自然语言做精确匹配;命中后沿指定模块继续,不把所有含同一宽词的行全部读入。代码路径从工作区根起算,检索提示不替代业务契约。
- 审核:订单审核 / 测量审核 / 仓储转运审核,分别进入 Order / Firstleg / Admin 海外仓模块。
- 库位:海外库位 / 整票库位块,分别进入 Warehouse Overseas / 国内 Warehouse,按任务只选其一。
- 收货:柜号签收 / 到仓测量,分别进入 Lastleg `ReceivingContainerService` / Firstleg 测量入口。
- 拖车:订舱级拖车 / 目的港码头拖车,分别进入 Firstleg `TruckAppointmentService` / `TerminalDrayageService`。
- 托盘:自动生成托盘 / 托盘标签,前者进入 Lastleg `ContainerInboundPlanConversionCoordinator`;后者先区分国内散货、一件代发与海外资源。
先在本节定位组合词,再只查命中的一行或模块。仍无法区分且会改变修改范围时,补问终端、对象或操作阶段。
### 高频任务最小读取集
- 订单审核:根 `AGENTS.md` → `docs/业务快速索引.md` 本节 → `apps/admin-web/src/modules/unified-orders/` → `baiyue-firstleg/order/AGENTS.md`;只有审核门禁跨到履约时才增加 `firstleg/AGENTS.md`。不读海外仓审核或全量权限 SQL。
- PDA 出库:根 `AGENTS.md` → `apps/pda-overseas-uniapp/AGENTS.md` → `src/pages/dispatch/` 和 `src/api/fulfillment.js` → `lastleg-service/AGENTS.md`;只有网关路径或 Token 失败才增加 `gateway/AGENTS.md`。不读 Admin 排车配置,除非问题涉及平台转派送资格。
- 客户账单:根 `AGENTS.md` → Client `apps/client-web/AGENTS.md` → `src/modules/finance/` → `baiyue-firstleg/finance/AGENTS.md`;平台账单才切换 Admin Finance。不要因“账单”自动加载柜费分摊或海外费用契约。
- 退货、异常、拖车:先用终端、阶段和动作分流;无法确定时只读取本节对应行,不全文加载海外仓 README 或 Lastleg 全部业务索引。
- Admin 弹窗样式、统一弹窗:先读 [Admin 统一弹窗规范](Admin高密度界面规范.md#弹框与表单),再进入当前大模块最近指引和实际弹窗组件;逐操作核对记录按 [Admin/Client 验收规则](Admin-Client前端原型还原验收规则.md) 维护。
每个入口标出业务边界,避免把相邻生命周期当作同一业务。读取量与适用指引层级统一遵循根 AGENTS.md;已提供的根规则不重复全文加载,跨服务只增加实际涉及的直接消费者或提供者。
取“终端+对象+动作”组合词;只读命中行。不同解释会改变范围且仍无法判断时再询问。
| 常用说法 | 区分依据 | 首个定位范围 |
|---|---|---|
| 没有报价、价格未命中、人工定价、手工报价 | FBA 单票费用的显式人工报价,不是价格簿上传或静默回退 | Admin `apps/admin-web/src/modules/inbounds/fee/api.ts` 的 `createManualInboundQuote`;Backend `baiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/service/FbaPricingService.java` 的 `manualQuote`,联查 `PlatformFbaPricingController`、`fba-pricing-v1.yaml`;Client 快照类型 `apps/client-web/src/modules/first-leg/types/inboundBilling.ts` |
| 没有报价、价格未命中、人工定价、手工报价、私人地址报价 | FBA 未命中报价时人工定价;PRIVATE 私人地址使用人工头程报价,区别于价格簿上传 | Admin `apps/admin-web/src/modules/inbounds/fee/api.ts` 的 `createManualInboundQuote`;Backend `baiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/service/FbaPricingService.java` 的 `manualQuote`,联查 `PlatformFbaPricingController`、`fba-pricing-v1.yaml`;Client 快照类型 `apps/client-web/src/modules/first-leg/types/inboundBilling.ts` |
| 退货换标候选、退货单创建换标 | 客户退货库存进入换标申请,区别于平台审核与 PDA 签收 | `baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/returnreceipt/controller/MerchantReturnOrderController.java` 的 `GET /{returnNo}/relabel-candidates`、`POST /{returnNo}/relabel` → `ReturnReceiptService.relabelCandidates/createRelabel`;公共前缀 `/api/merchant/v1/last-leg/return-orders`,客户范围取认证身份 |
| 退货审核、退货驳回、换标审核 | 先区分退货预报准入与换标申请审核,均不是仓储转运审核 | 退货预报 `apps/admin-web/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue`;换标申请 `apps/admin-web/src/modules/overseas-warehouse/pages/RelabelOrdersView.vue`;条件与 API 见该模块 `AGENTS.md` |
| PDA版本、安装包下载、热更新、发布版本、停发 | 平台管理版本与设备检查更新分开定位,先区分国内/海外 PDA | 管理页 `apps/admin-web/src/modules/pda-releases/pages/PdaReleasesView.vue`;设备更新为国内 `apps/pda-uniapp/utils/app-update.js`、海外 `apps/pda-overseas-uniapp/src/utils/app-update.js`;后端查 `baiyue-firstleg/file/AGENTS.md` |
@@ -47,83 +23,88 @@ Admin、Client、海外 PDA 从各应用 AGENTS.md 短表定位,行为变更
| 审核、测量审核、实测审核 | 仓库测量结果审核 | `baiyue-firstleg/firstleg/AGENTS.md` 中“审核与初始计价”;页面先查 Admin 入库模块 |
| 费用、运费、报价、计费、船期价格表、价格簿 | 单票入仓计价、客户专属报价或调价 | `apps/admin-web/src/modules/inbounds/fee/`、`apps/admin-web/src/modules/fba-pricing/carrier-rates/pages/CarrierRatesView.vue`(列表/上传)、`apps/admin-web/src/modules/fba-pricing/carrier-rates/pages/CarrierRateDetailView.vue`(版本详情/映射确认);后端查 `FbaPricingService` |
| 柜费、公共费用、分摊 | 国内柜费来源归 Firstleg;海外柜费来源归 Lastleg;账单与结算结果归 Finance | 业务路由查“财务管理与柜级公共费用分摊”或“海外业务费用来源与客户财务”,按实际请求区分 |
| 充值、余额、授信、账单、核销 | 客户自助与平台管理先按终端区分 | Client `apps/client-web/src/modules/finance/`;Admin `apps/admin-web/src/modules/finance/` |
| 钱包、充值、余额、授信、账单、核销 | 客户自助与平台管理先按终端区分 | Client `apps/client-web/src/modules/finance/`;Admin `apps/admin-web/src/modules/finance/` |
| 客户账单、客户对账单、账单确认 | 客户查看和确认本企业账单,不是平台柜费分摊或充值审核 | Client `apps/client-web/src/modules/finance/views/FinanceBillsView.vue`;Admin 平台账单查 `apps/admin-web/src/modules/finance/`;Backend `baiyue-firstleg/finance/` 的 Client Finance Controller |
| 自动生成托盘、托盘码没生成、计划齐全、重试生成托盘码 | 海外入库计划保存后资源生成,不是国内托盘标签打印 | Admin `apps/admin-web/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue`;Backend `baiyue-firstleg/lastleg-service/docs/business-index.md` 的“人工计划自动生成托盘与资源重试”,执行规则先读该服务 `AGENTS.md` |
| 托盘码、托盘标签、补打 | 先区分散货装柜、一件代发和海外实体托盘 | 散货 `apps/admin-web/src/modules/loading-lists/components/PalletLabelPrintDialog.vue`;一件代发 `apps/admin-web/src/modules/inbounds/core/DropshipPalletPrintPanel.vue`,从订单“托盘打印”页签进入;海外单张打印 `apps/admin-web/src/modules/overseas-warehouse/pages/PalletsView.vue`,详见各应用/模块指引 |
| 箱码、箱唛、箱标、单箱扫码 | 单箱身份与测量,不是托盘或库位 | 业务路由查“箱唛、箱码与单箱测量”;后端查 `InboundCartonLabelService` |
| 库位、托盘、占位、释放 | 国内称重整票块归 Warehouse;海外实物托盘资源归 Warehouse Overseas;业务任务归 Lastleg | 业务路由查“称重确认”或“海外仓库与通用资料”;用国内/海外和业务阶段继续限定 |
| 库位、托盘、占位、释放 | 国内资源归 Warehouse;海外资源归 Warehouse Overseas;海外库存业务归 Lastleg | 业务路由查“称重确认”或“海外库位”;仓库名称/地址查“海外仓库主档” |
| 拖车、派车、提柜、还柜 | 国内订舱拖车与目的港码头车队是不同业务;海外配送排车另属 Lastleg | 国内 `apps/admin-web/src/modules/trucking/`;目的港 `apps/admin-web/src/modules/container-loading/api/terminalDrayages.ts`;配送查“海外出库、排车” |
| 报关资料、退税资料、完成文件 | 平台整柜操作与客户订单上传先按终端区分 | Admin `apps/admin-web/src/modules/container-loading/components/ContainerCustomsPanel.vue`;Client `apps/client-web/src/modules/first-leg/components/CustomsDocumentsDialog.vue` |
| 退货、退货预报、退货换标、退货签收、退货合箱 | 客户退货预报及签收库存,区别于派送异常退回 | Client `apps/client-web/src/modules/overseas-warehouse/views/ReturnOrdersView.vue`;Admin `apps/admin-web/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue`;PDA `apps/pda-overseas-uniapp/AGENTS.md`;Lastleg `returnreceipt/`,见下文“退货预报、签收、库存与合箱” |
| PDA 出库、PDA 发车、扫码出库、整托出库 | 海外 PDA 执行排车和出库,不是平台排车配置或客户派送查询 | 海外 PDA `apps/pda-overseas-uniapp/src/pages/dispatch/dispatch.vue`、`src/api/fulfillment.js`;Backend `baiyue-firstleg/lastleg-service/dispatch/pda/`;统一经 `gateway/` |
| 异常、退回、退仓、回访 | 派送异常退回与库存退货业务不可混用 | 派送查 `apps/admin-web/src/modules/overseas-warehouse/pages/ExceptionOrdersView.vue`;退货预报/库存查 Lastleg `returnreceipt/` |
## 定位步骤与反馈
- 已知文件、组件或请求路径:读取适用指引后直接进入该文件或限定服务搜索路由,无需经过词表。
- 页面问题:终端指引 → 命中页面 → 实际 import/API → 对应 Controller/Service。纯展示问题定位到相关组件即可;遇到后端业务判断再追踪调用链。
- 状态或权限问题:已知请求时先定位 Controller 的权限与 Service 的状态门禁,再核对前端消费;尚不知请求时从触发动作找到 API。不要先扫所有权限初始化 SQL。
- 无精确命中:从用户原话提取短词查本表;仍有歧义时利用页面标题、业务编号类型和国内/海外范围缩小。每次只扩展相邻业务范围。
- 实际任务若发生入口误导、路径失效或重复扩大搜索,在当次交付中简记“原说法 → 最终入口 → 绕路原因”,并修正命中的索引行;进度与临时结果不写回本文件。
- 评价检索质量看首次入口是否正确、扩大范围次数、找到目标前额外读取的无关文件数;文件存在或离线合同通过只能证明部分有效性,不能代替真实任务耗时。普通任务不额外建立计时脚本或登记台账。
| 异常、退回、退仓、异常回仓、回访 | 派送异常回仓归 `exceptionorder/`,客户退货预报归 `returnreceipt/`,PDA 两类签收不可混用 | 平台查 `apps/admin-web/src/modules/overseas-warehouse/AGENTS.md`;现场查 `apps/pda-overseas-uniapp/AGENTS.md` 的 `ExceptionReturnWork.vue` |
| 仓储转运审核、转运通过 | 平台转运审核通过弹框 | `apps/admin-web/src/modules/overseas-warehouse/components/WarehouseTransferReviewDialog.vue` |
| 转运驳回、REJECT | API 审核结论;当前弹框无此动作 | `apps/admin-web/src/modules/overseas-warehouse/api/warehouseTransfers.ts` 的 `reviewWarehouseTransfer`;界面能力查最近指引 |
## 业务快速路由表
领星 WMS 自研系统(OMP)、经营总览图表、自营 SKU 日销量、热销与滞销排行、分仓产品库存与可售天数、库存周转、数据采集:先读 `apps/admin-web/src/modules/self-operated/AGENTS.md`;查询与采集编排查 `baiyue-firstleg/lastleg-service/AGENTS.md` 的自营入口,签名/限流/供应商分页问题才读 `baiyue-firstleg/integration-service/AGENTS.md`。区别于整箱库存和客户 WMS 作业库存。
自营专题按任务选择:总览图形/下钻查 `docs/自营业务/经营总览图表设计.md`,库存周转查 `docs/自营业务/库存周转视图设计.md`,采集交互查 `docs/自营业务/数据采集页面设计.md`,查询性能查 `docs/自营业务/领星统计查询性能优化方案.md`,外部接口联调查 `docs/自营业务/领星WMS接口联调手册.md`。架构/表结构不明时从 `docs/自营业务/README.md` 定位一期方案,不默认同时读取所有专题。
美国各类预约统一总览、提柜/用车/送仓预约梳理:`docs/海外仓业务/美国预约管理统一总览与优化方案.md`(设计建议);实际维护仍按下述来源模块进入。
预约工作日历、多客户共车、中转分批后送、改期取消、重新预约和未定日期事项:先读 `docs/海外仓业务/预约工作日历V13变更说明.md`(正式业务规则与验收),再读 `docs/海外仓业务/预约工作日历开发协作契约.md`(接口与文件边界);权威业务事实仍由下述来源模块维护。
预约管理、预约列表、到港/排车/还柜/计划到仓四类日历:Admin `apps/admin-web/src/modules/appointment-calendar/`,当前入口与日期规则见 `docs/海外仓业务/预约工作日历V13变更说明.md` 的“2026-10-19 当前预约列表收敛规则”;原送仓业务仍从 `docs/海外仓业务/README.md` 的“预约送仓”进入。排车只取海外仓送往 FBA/客户仓的真实车次,区别于订舱级拖车和港口提柜。
退货预报、签收、库存与合箱:Client `modules/overseas-warehouse/views/ReturnOrdersView.vue`、`ReturnInventoryView.vue`;Admin `modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue`;海外 PDA `src/pages/return-receipt/return-receipt.vue`、`src/pages/return-packing/return-packing.vue`,API 与检查入口见 `apps/pda-overseas-uniapp/AGENTS.md`;Backend `lastleg-service/returnreceipt/`,执行规则先读 `baiyue-firstleg/lastleg-service/AGENTS.md`,详细接口与状态按需查 `baiyue-firstleg/lastleg-service/docs/business-index.md` 的退货入口,OpenAPI 为 `overseas-business-v1.yaml`。客户预报 → 平台审核 → PDA 签收 → 退货箱/SKU 库存 → 同客户合箱 → `delivery/` 退货出库;两个 PDA 页面均在 `src/pages.json` 注册,由 `src/data/overseas-workbench.js` 提供入口,真机验收另取证。派送异常退回仍归 `exceptionorder/`。
本表只路由到范围依据和首个代码入口;Admin/Client 路径从对应应用的 `src/` 起算,国内 PDA 路径从 `apps/pda-uniapp/` 起算,海外 PDA 路径从 `apps/pda-overseas-uniapp/src/` 起算,Backend 路径从 `baiyue-firstleg/` 起算。进入目标后继续读最近的 `AGENTS.md`,不要把根表当作模块细节清单。
| 业务 | 范围依据 | 首个代码入口 |
| 业务 | 首个代码入口 | 边界正文(仅需要规则时读) |
|---|---|---|
| 登录认证 | `docs/订单与客户/README.md` | Admin `modules/auth/`、`core/auth/`;Client `modules/auth/`;Backend `auth/`、`iam/`。统一 Token 不携带角色或权限集;各端读取 Auth 登录/刷新响应的顶层授权快照用于展示,Gateway 与业务服务通过统一会话及 Auth 权威校验执行授权,不再依赖 Lastleg 安全投影 |
| 客户与企业 | `docs/订单与客户/README.md`、`docs/订单与客户/订单与客户头程订单闭环设计.md` | Admin `modules/customers/`;Client `modules/tenant-management/`、`modules/account/`;Backend `iam/`、`auth/`、`file/`。公司联系电话/邮箱是企业资料,不作为成员登录标识且不要求跨企业唯一;成员登录手机号归账号链路,修改时同步 Auth 并撤销该账号会话。审核必填资质仅营业执照与统一社会信用代码;法人身份证选填,可在已有营业执照后单独补传或替换,营业执照仍须与统一社会信用代码整包提交;默认尺寸配置由 IAM 持久任务异步调用 `firstleg/`,未就绪不得审核通过 |
| 供应商与国内整柜 | `docs/国内货柜履约/国内货柜履约需求确认表.md` | Admin `modules/suppliers/`、`modules/domestic-containers/`;Backend `warehouse/`;OpenAPI `supplier-v1.yaml`、`domestic-container-v1.yaml` |
| 平台收货仓 | `docs/订单与客户/订单与客户头程订单闭环设计.md` | Admin `modules/warehouses/`;Client `modules/first-leg/`;Backend `warehouse/` |
| 头程订单、批量审核预览与入仓码关系 | `docs/订单与客户/README.md`、头程订单闭环设计 | Admin `modules/first-leg-orders/`、`modules/unified-orders/`;Client `modules/first-leg/api/inboundCodeAssociations.ts`、`modules/first-leg/`;Backend `order/` 的 `InboundCodeAssociationService`、`UnifiedOrderQueryService`、`BatchOrderReviewPreviewService` 与 `firstleg/`。Order 为 `SUBMITTED` 时,即使 Firstleg 已存在准备中入库投影,统一列表仍固定显示 `PENDING_REVIEW` 并提供审核动作;批量审核弹框只调用 `/orders/first-leg/batch-review-preview` 一次获取按请求顺序返回的快照,不逐票查询详情,主要展示入仓码而非内部订单 ID |
| 客户头程订单批量导入 | 当前 Order 契约 | Client `modules/first-leg/views/FirstLegOrdersView.vue`、`api/firstLeg.ts`;Backend `order/` 的 `MerchantBatchImportService`、`MerchantWarehouseCatalogClient`、`MerchantPricingCatalogClient` 与 `order-v1.yaml`。中文 XLSX 模板按当前客户动态生成地址、全部有效仓库和渠道下拉;导入时重新校验动态选项与客户归属,最多 50 行,只创建草稿,支持部分成功或整批原子模式 |
| 平台旧系统订单导入 | 当前 Order 契约 | Admin `modules/unified-orders/pages/UnifiedOrdersView.vue`、`api/unifiedOrders.ts`;Backend `order/` 的 `PlatformLegacyOrderImportService` 与 `/api/platform/v1/orders/first-leg/legacy-import`。固定归属启用客户“IT测试公司”,保留旧入仓码,按当前公共仓库和客户价格簿逐行校验,成功行进入待审核 |
| 平台修改客户原始申报与履约渠道 | 当前 Order/Firstleg 契约 | Admin `modules/unified-orders/components/OrderDeclarationEditorDialog.vue`、`api/unifiedOrders.ts`;Backend `order/` 的 `OrderDeclarationUpdateService` 与 `order-v1.yaml`,通过 `ORDER_DECLARATION_UPDATED_V1` 同步 `firstleg/` 的 `OrderDeclarationSyncService`。只修改申报快照,不覆盖仓库/PDA 实测、测量审核、箱码或已确认费用;渠道变化额外校验分柜、同柜、装柜可逆性与重新计价,国内收货仓或中转仓变化必须重新下单 |
| 脚本管理、全量验证与测试造数 | `baiyue-firstleg/scripts/AGENTS.md`、`baiyue-firstleg/scripts/README.md` | 本机重型检查经 `scripts/local-check.ps1` 统一限流,规则见 `docs/AI工程执行与协作约束.md`;Backend `scripts/` 为仓库级入口,`scripts/admin-test-env-modules/` 为 Admin HTTP 内部模块;服务局部脚本留在 `<service>/scripts/`,不得散落到 `src/test/scripts/`;真实 HTTP、部署或环境写入仍须当前轮明确授权 |
| 平台/企业 RBAC | 订单与客户契约;公共语义见 `docs/平台客户层级与权限契约.md` | Admin `modules/iam/`、`core/access/`;Client `modules/tenant-management/`;Backend `iam/`、`auth/` |
| 消息中心与站内通知 | 触发业务的阶段/专题契约,收件箱以 IAM OpenAPI 为准 | Admin/Client `modules/notifications/`;Backend `iam/.../notification/`;生产者留在所属服务 |
| PDA 拣货与柜级装柜证据 | 国内 PDA README、拣货原型、国内货柜履约需求确认 | PDA `pages/picking/`、`stores/picking.js`、`api/pda-loading.js`;证据以 `taskId + warehouseId` 进入任务专用 API,业务所有权固定真实 `containerBookingId`,不得按入仓单或客户拆分;上传以幂等键绑定包含文件内容的请求哈希,完全重放直接返回已有结果且不得重复上传 File;Backend `firstleg/`、`warehouse/`、`file/` |
| 到仓测量、测量库位、箱规策略与头程计费 | `docs/入库测量与计费/README.md`;规则查 `baiyue-firstleg/firstleg/AGENTS.md` 对应入口 | Admin `modules/inbounds/measurement/InboundMeasurementDialog.vue`、`InboundMeasurementPanel.vue`,称重 `modules/inbounds/weight/components/WeightOcrPanel.vue`;Backend `firstleg/` 的 `InboundMeasurementService`、`MeasurementLocationOccupationService`、`FbaPricingService`。库位归 `warehouse/`,图片归 `file/`,OCR 归 `integration-service/`;只按实际调用增加服务指引 |
| 客户专属报价、柜级阶梯运费与费用调整 | 当前 Firstleg 计价契约、`docs/入库测量与计费/README.md` | Admin `modules/fba-pricing/carrier-rates/`、`modules/inbounds/fee/`、`modules/unified-orders/components/InboundFeeDetailManager.vue`;Backend `firstleg/` 的 `PlatformPriceBookService`、`ActivePriceBookEstimator`、`FbaPricingService`、`ContainerTierAmountAllocator`、`InboundFeeDetailService` 与 `fba-pricing-v1.yaml`。公共报价使用 `customerId=0`,客户专属报价按客户独立版本化并优先于公共 ACTIVE 版本;柜级区域重量阶梯只聚合同柜同客户中费用快照同为 `REGION_WEIGHT_TIER` 的成员并守恒分摊,混柜的固定仓价等其他模型不参与阶梯且保持原费用,装柜成员变化只重算未锁定的区域阶梯费用。人工调整计费量限系统基准上下 10% 且必须带版本、原因和二次确认;`PRIVATE_LAST_MILE_DELIVERY` 只允许私人目的仓;一件代发在预装确认前完成计价,`WAIT_PALLETIZE` 试算不得回退托盘化状态 |
| 箱唛、箱码与单箱测量 | `docs/入库测量与计费/入库测量与计费需求优化版-v2-测量计费入库主流程.md`、`docs/墨家设备测量上传接口说明-V3.md` | Admin `modules/inbounds/measurement/`;Client `modules/first-leg/`;Backend 按 `firstleg/AGENTS.md` 的箱唛与测量入口 |
| 称重确认、整票库位块与部分拣货资源结算 | `baiyue-firstleg/firstleg/AGENTS.md` 的称重入口、`baiyue-firstleg/warehouse/AGENTS.md` 的 A0/资源结算规则 | Admin `modules/inbounds/weight/components/WeightOcrPanel.vue`;Backend Firstleg `MeasurementLocationOccupationService`、`InboundMeasurementService`、`MeasurementSubmissionService` → Warehouse `LocationBlockService`。国内整票资源结算按 `reservationId` 定位;称重、槽位容量和部分拣货的详细门禁留在所属服务指引 |
| 入库扣货、解除与凭证 | 入库测量与计费、国内货柜履约契约 | Admin `modules/unified-orders/pages/UnifiedOrdersView.vue`、`modules/inbounds/core/api.ts`;Backend `firstleg/` 的 `InboundHoldService`、`InboundHoldGuard`、`InboundHoldEvidenceService`,文件归 `file/` 的 `INBOUND_HOLD_EVIDENCE`。扣货状态必须阻断后续物理履约写入;已发生拣货、装柜或出仓时禁止手工扣货/解除,命令携带版本与幂等键,只有进入不可变历史的凭证可下载 |
| 财务管理与柜级公共费用分摊 | `docs/财务管理/` 产品确认、五页验收契约、Firstleg-Finance 跨服务契约 | Admin `modules/finance/`、`modules/loading-lists/components/ContainerFeesPanel.vue`;Client `modules/finance/views/FinanceBillsView.vue`,账单行按 `inboundCode` 复用头程入仓关系详情;Backend `finance/`、`firstleg/`,契约 `container-fees-v1.yaml`;导出与凭证归 `file/`。跨客户公共柜费按柜内真实客户与订单归属原子建组,金额合计等于柜费总额,审核、驳回、调整和作废整组处理,单行入口不得破坏组一致性 |
| 客户资金账户、充值、授信与业务扣费 | `docs/财务管理/README.md`、统一认证与服务通信契约 | Admin `modules/finance/pages/FinanceCustomerAccountsView.vue`;Client `modules/finance/views/FinanceAccountView.vue`;Backend `finance/` 的 `FinanceWalletService` 与三类 Wallet Controller。充值申请经 File 保存凭证,平台审核或手工充扣;余额、授信、冻结、结算和释放以 Finance 主账为准。海外业务经 `WALLET_COMMAND_REQUESTED/COMPLETED` Outbox 直接投递往返,不跨区同步调用钱包 |
| 订单编排、分柜、同柜不可拆组与柜次 | `docs/国内货柜履约/README.md`、`docs/国内货柜履约/国内货柜履约需求确认表.md`、`docs/统一订单主状态与操作契约.md` | Admin `modules/unified-orders/api/coLoadGroups.ts`、`modules/unified-orders/`、`container-loading/`;Client `modules/first-leg/`;Backend `firstleg/loading/coload/`、`firstleg/split/`、`firstleg/loading/`、`order/`;同柜组按订单创建,由服务端冻结每票全部可用入仓片段,仅要求同国内仓、同渠道,允许跨客户及不同目的仓港 |
| 全局智能排柜、预装与真实集装箱号后补 | 同上 | Admin `modules/container-loading/components/SmartLoadingDialog.vue` 内嵌 `pages/GlobalSmartLoadingView.vue`,柜次页 `SmartLoadingWorkbenchView.vue`,预装详情 `loading-lists/pages/PreloadPlanDetailView.vue`;PDA `pages/picking/`;Backend `firstleg/` 的 `PlatformSmartLoadingController`、`SmartLoadingService`、`PendingReviewOrderClient`、`loading/`,待审核事实来自 Order `PendingReviewOrderQueryService`。全局候选覆盖 `PENDING_REVIEW/WAIT_MEASURE/WAIT_SPLIT/LOADING`,状态只用于筛选展示,能否加入以服务端 `canAssign` 为准;待审核/待测量可提前占位,但确认预装或启动 PDA 前必须进入 `WAIT_SPLIT`。暂估明细的 `totalPackageCount/remainingPackageCount` 在测量前取 Order 原始申报箱数,测量完成后取最新已审核测量箱数,读取补充失败只回退当前已分配数,写入调整仍重新校验权威数量。同柜不可拆组仅在全员命中状态集合时作为一个分页与分配单元;人工加入允许跨渠道,智能推荐仍按柜次渠道。计划可一次性移除全部未拣明细,但任一成员已拣的同柜组必须整组保留。创建柜次时原子生成唯一预装计划,加入入仓码即建立关联;真实集装箱号不阻塞订舱关联,但确认预装和创建 PDA 任务前必须补齐。历史缺号任务允许在预装详情首次补录,保存后恢复 PDA 可进入状态 |
| 客户入库结果与头程费用确认 | 入库测量与计费主流程、当前 Firstleg 契约 | Client `modules/first-leg/components/InboundBillingPanel.vue`、`api/inboundBilling.ts`;Backend `firstleg/` 的 `MerchantInboundBillingController`、`MerchantInboundBillingService`、`FbaPricingService` 与 `firstleg-v1.yaml`。客户仅能确认本客户 `SENT` 的最新费用版本,提交 `expectedFeeVersion` 与幂等键;确认记录当前成员和时间并永久锁定该版本,平台不得再修改 |
| 订舱资料、放舱、出仓前船期与订舱级拖车 | 国内货柜履约 README、需求确认和实施边界 | Admin `modules/ocean-bookings/`、`port-schedules/`、`trucking/`;Backend `firstleg/oceanbooking/`、`firstleg/portschedule/`、`TruckAppointmentService`。拖车预约由 `RELEASED` 订舱拥有,不按客户、柜次、装柜计划或真实柜号归属;每个订舱最多一张非终态拖车单,创建候选由服务端排除缺提单/有效订舱文件或已有有效拖车单的订舱;PDA 装柜完成不推进拖车状态;全部要求货柜确认国内离仓后自动完成,人民币拖车费按实装体积分摊为柜次应付并经 Finance Outbox 入池 |
| 目的港码头拖车与还空预警 | `docs/海外仓业务/README.md` | 与订舱级拖车预约是不同生命周期。Admin 海外清关提柜列表/详情 `modules/container-loading/pages/OverseasContainersView.vue`、`modules/container-loading/pages/OverseasContainerDetailView.vue`;Firstleg 拖车 API `api/terminalDrayages.ts`,柜级到仓 API `api/containerArrivalTimes.ts`。原预约/实际提柜列改为预计/实际到仓:预计时间由平台在列表快捷选择并同步 Lastleg 整柜尾程订单,实际时间取海外 PDA 首次开始收货;车队、邮件、还柜与 `unloadingCompletedAt + 72h` 预警仍归 `firstleg/terminaldrayage/`。 |
| 整柜报关资料与完成文件 | 国内货柜履约契约 | 装柜完成后由 Admin `modules/container-loading/components/ContainerCustomsPanel.vue` 管理整柜报关,Client `modules/first-leg/components/CustomsDocumentsDialog.vue`、`api/customs.ts` 按订单处理本客户退税资料;Backend `firstleg/customs/container/`、`customs-v1.yaml`,文件归 `file/`。客户资料可覆盖同柜多个退税入仓码,开始报关后冻结;平台逐资料回传完成文件,全买单柜走平台确认与明细导出 |
| 国内出仓确认 | 国内货柜履约契约 | Admin `modules/outbound-dispatch/`;Backend `firstleg/outbound/dispatch/` |
| 客户统计与平台日志 | 当前统计/审计契约 | Admin `modules/customers/`、`modules/audit/`;Backend `firstleg/customerstatistics/`、`audit-service/` |
| 客户工作台账户与设置 | 订单与客户契约 | Client `modules/account/`、`system/`、`tenant-management/`;Backend `iam/`、`auth/` |
| 企业订单与跨境业务 | 订单与客户、国内货柜履约契约 | Client `modules/order-management/`、`cross-border/`;Backend `order/`、`firstleg/`、`integration-service/` |
| 海外接柜、入库与库内库存 | `docs/海外仓业务/README.md` | Admin 按 `apps/admin-web/AGENTS.md` 海外模块入口;海外入口 `gateway/`;尾程/入仓/换标/库存 `lastleg-service/`;仓库主档归国内 `warehouse/`,库位/托盘/锁归 `warehouse-overseas-service/` 并只引用国内 warehouseId;与排车、出库、派送共同组成海外仓全流程 |
| 尾程订单控制与柜级入仓计划转换 | `docs/海外仓业务/README.md` | Admin `modules/overseas-warehouse/pages/LastMileOrdersView.vue`、`LastMileOrderDetailView.vue`、`api/lastMileOrders.ts`;Backend `lastleg-service/` 的 `LastlegOrderController`、`LastlegOrderCommandService`、`InboundPlanService`、`ContainerInboundPlanConversionCoordinator`,资源归 `warehouse-overseas-service/` 的 `WarehousePalletBatchService`。`orders/container-summaries` 按 `sourceContainerBookingId` 跨客户聚合并分页返回全部稳定来源柜,已完成计划转换的柜仍保留用于接柜仓查询与修改;生成动作只消费 `allPlansReady/pendingPlanCount/resourcePendingPlanCount`,详情不受列表分页截断。确认前从 `/inbound-plans/container-preview` 读取服务端分组、托数、阻断项与 `snapshotVersion/snapshotHash`;`convert-container` 锁柜重算后先批量预留真实托盘,再本地原子生成剩余独立计划并确认资源,失败仅补偿未确认资源,同柜重放不得产生第二批资源。单票手工计划保存后,全柜计划齐全且预览就绪时自动生成并绑定托盘资源,一票柜立即触发;`resourcePendingPlanCount` 表示自动生成异常后的重试入口,资源未齐不得进入 PDA 接柜。自动入口见 Lastleg `ContainerInboundPlanConversionCoordinator.convertManualAndAutoMaterialize`。单票可维护完整入库计划、暂扣/解除及八行人工节点快照;命令提交订单版本与幂等键,新增暂扣只允许完成入库后执行并仅阻断该票后续排车/出库,不阻断入库计划或入库作业;人工节点首次保存后固定 `MANUAL` 来源且不得回退柜级节点 |
| 海外仓 PDA | `apps/pda-overseas-uniapp/AGENTS.md`;执行规则查 `baiyue-firstleg/lastleg-service/AGENTS.md`,跨模块流程才查海外仓 README | 入仓 `src/pages/operation/`、`src/api/inbound.js`;排车与出库 `src/pages/dispatch/`、`src/pages/outbound/`、`src/api/fulfillment.js`。Backend `lastleg-service/inboundplan/pda/`、`dispatch/pda/`、`delivery/`;统一经 `gateway/`。柜级收货与单票客户隔离按 Lastleg“PDA 入仓”规则核对 |
| 海外采购、本土卡车与散板 | `docs/海外仓业务/README.md` | Admin `modules/overseas-business/`;Client `modules/cross-border/`;Backend `lastleg-service/` 的 `procurement/`、`trucking/`、`looseboard/`;统一经 `gateway/` |
| 采购样品、货款、装箱清单、面单、预估快递费、国内收货寄客户 | `docs/海外仓业务/采购订单样品履约流程变更需求.md` | 采购流程变更入口;代码从上述采购模块进入 |
| 海外仓库与通用资料 | `docs/海外仓业务/README.md` | 全部仓库主档进入 Admin `modules/warehouses/` 与国内 `warehouse/`;海外库位/托盘/锁进入 `warehouse-overseas-service/` 并引用国内 warehouseId;报价、汇率、车辆按海外服务实际契约 |
| 车辆管理、司机证照、保养加油、车辆维修/故障/救援/异常、外接货与车次 | `apps/admin-web/src/modules/overseas-master-data/AGENTS.md`、`baiyue-firstleg/lastleg-service/AGENTS.md`;原型范围有疑问时查 `docs/海外仓业务/车辆管理原型梳理与任务规划.md` | Admin `modules/overseas-master-data/`;Backend `lastleg-service/fleet/`,接口 `lastleg-service/src/main/resources/openapi/fleet-drivers-v1.yaml`、`fleet-trips-v1.yaml`、`fleet-vehicle-records-v1.yaml`;证照与运维照片存储查 `file/AGENTS.md` |
| 拼车需求池、车次余位、销售拼车意向 | `docs/海外仓业务/内部拼车需求池首版开发契约.md`、`apps/admin-web/src/modules/overseas-master-data/AGENTS.md` | 复用 Lastleg Fleet 与本土业务;区分车次余位发布和客户订单,不从需求池生成第二套库存或费用 |
| 国内出仓后船节点 | `docs/海外仓业务/README.md` | Admin `modules/port-schedules/`、`ocean-bookings/`、货柜详情;Backend `firstleg/portschedule/`、`integration-service/`;从确认国内出仓查询至目的港到达、提柜和还柜。节点按 `containerBookingId` 柜级聚合,跨区事件使用 `tenantId=0` 平台技术范围,不携带或校验客户 |
| 海外出库、排车、派送、异常与回访 | 排车改造查[排车列表统一作业改造契约](海外仓业务/排车列表统一作业改造契约.md);既有缺陷修复查[排车流程修复规划](海外仓业务/排车流程修复规划.md) | Admin `modules/overseas-warehouse/pages/DispatchesView.vue`、`DispatchDetailView.vue`、`OutboundsView.vue`、`DeliveryOrdersView.vue`、`ExceptionOrdersView.vue`、`CustomerVisitsView.vue`;Backend `lastleg-service/dispatch/`、`delivery/`、`dropship/`、`exceptionorder/`、`customervisit/`;统一经 `gateway/` |
| 海外业务费用来源与客户财务 | 当前实现查财务契约与统一认证与服务通信契约;阶段 0A—0E 开发再读 `docs/财务管理/海外仓费用统一接入阶段0技术契约.md` | 当前 V1 由 `lastleg-service/financefee/` 校验海外入仓、采购、美国卡车、本土散板和海外仓服务费,通过完整快照和 Outbox 直接投递 Finance 内部入口入池;阶段 0 目标改为收费身份/候选版本、Finance 接受或拒绝结果事件及版本化资金计划。必须沿代码确认落地范围,不把技术契约当成已实现状态;Client 仍只读取获准客户财务 |
| 登录认证 | [模块指引](../apps/admin-web/src/modules/auth/AGENTS.md) | [对应章节](业务实现边界.md#登录认证) |
| 客户与企业 | [模块指引](../apps/admin-web/src/modules/customers/AGENTS.md) | [对应章节](业务实现边界.md#客户与企业) |
| 供应商与国内整柜 | [模块指引](../apps/admin-web/src/modules/suppliers/AGENTS.md) | [对应章节](业务实现边界.md#供应商与国内整柜) |
| 平台收货仓 | [模块指引](../apps/admin-web/src/modules/warehouses/AGENTS.md) | [对应章节](业务实现边界.md#平台收货仓) |
| 头程订单、批量审核预览与入仓码关系 | [模块指引](../apps/admin-web/src/modules/unified-orders/AGENTS.md) | [对应章节](业务实现边界.md#头程订单批量审核预览与入仓码关系) |
| 客户头程订单批量导入 | [模块指引](../apps/client-web/src/modules/first-leg/AGENTS.md) | [对应章节](业务实现边界.md#客户头程订单批量导入) |
| 平台旧系统订单导入 | [模块指引](../apps/admin-web/src/modules/unified-orders/AGENTS.md) | [对应章节](业务实现边界.md#平台旧系统订单导入) |
| 平台修改客户原始申报与履约渠道 | [模块指引](../apps/admin-web/src/modules/unified-orders/AGENTS.md) | [对应章节](业务实现边界.md#平台修改客户原始申报与履约渠道) |
| 脚本管理、全量验证与测试造数 | [模块指引](../baiyue-firstleg/scripts/AGENTS.md) | [对应章节](业务实现边界.md#脚本管理全量验证与测试造数) |
| 平台/企业 RBAC | [模块指引](../apps/admin-web/src/modules/iam/AGENTS.md) | [对应章节](业务实现边界.md#平台企业-rbac) |
| 消息中心与站内通知 | [模块指引](../apps/admin-web/src/modules/notifications/AGENTS.md) | [对应章节](业务实现边界.md#消息中心与站内通知) |
| PDA 拣货与柜级装柜证据 | [模块指引](../apps/pda-uniapp/AGENTS.md) | [对应章节](业务实现边界.md#pda-拣货与柜级装柜证据) |
| 到仓测量、测量库位、箱规策略与头程计费 | [模块指引](../apps/admin-web/src/modules/inbounds/AGENTS.md) | [对应章节](业务实现边界.md#到仓测量测量库位箱规策略与头程计费) |
| 客户专属报价、柜级阶梯运费与费用调整 | [模块指引](../apps/admin-web/src/modules/fba-pricing/AGENTS.md) | [对应章节](业务实现边界.md#客户专属报价柜级阶梯运费与费用调整) |
| 箱唛、箱码与单箱测量 | [模块指引](../baiyue-firstleg/firstleg/AGENTS.md) | [对应章节](业务实现边界.md#箱唛箱码与单箱测量) |
| 称重确认、整票库位块与部分拣货资源结算 | [模块指引](../baiyue-firstleg/warehouse/AGENTS.md) | [对应章节](业务实现边界.md#称重确认整票库位块与部分拣货资源结算) |
| 入库扣货、解除与凭证 | [模块指引](../apps/admin-web/src/modules/unified-orders/AGENTS.md) | [对应章节](业务实现边界.md#入库扣货解除与凭证) |
| 财务管理与柜级公共费用分摊 | [模块指引](../apps/admin-web/src/modules/finance/AGENTS.md) | [对应章节](业务实现边界.md#财务管理与柜级公共费用分摊) |
| 平台资金账户、充值审核、手工充扣与授信 | [Admin 财务](../apps/admin-web/src/modules/finance/AGENTS.md) | [资金账户规则](财务管理/财务对账结算P1闭环.md#客户资金账户) |
| 客户资金账户、余额、授信与充值申请 | [Client 财务](../apps/client-web/src/modules/finance/AGENTS.md) | [资金账户规则](财务管理/财务对账结算P1闭环.md#客户资金账户) |
| 服务端资金账户、授信、冻结、结算与业务扣费 | [Finance](../baiyue-firstleg/finance/AGENTS.md) | [资金账户规则](财务管理/财务对账结算P1闭环.md#客户资金账户) |
| 订单编排、分柜、同柜不可拆组与柜次 | [模块指引](../apps/admin-web/src/modules/container-loading/AGENTS.md) | [对应章节](业务实现边界.md#订单编排分柜同柜不可拆组与柜次) |
| 全局智能排柜、预装与真实集装箱号后补 | [模块指引](../apps/admin-web/src/modules/container-loading/AGENTS.md) | [对应章节](业务实现边界.md#全局智能排柜预装与真实集装箱号后补) |
| 客户入库结果与头程费用确认 | [模块指引](../apps/client-web/src/modules/first-leg/AGENTS.md) | [对应章节](业务实现边界.md#客户入库结果与头程费用确认) |
| 订舱资料、放舱、出仓前船期与订舱级拖车 | [模块指引](../apps/admin-web/src/modules/ocean-bookings/AGENTS.md) | [对应章节](业务实现边界.md#订舱资料放舱出仓前船期与订舱级拖车) |
| 目的港码头拖车与还空预警 | [模块指引](../baiyue-firstleg/firstleg/AGENTS.md) | [对应章节](业务实现边界.md#目的港码头拖车与还空预警) |
| 整柜报关资料与完成文件 | [模块指引](../apps/admin-web/src/modules/container-loading/AGENTS.md) | [对应章节](业务实现边界.md#整柜报关资料与完成文件) |
| 国内出仓确认 | [模块指引](../apps/admin-web/src/modules/outbound-dispatch/AGENTS.md) | [对应章节](业务实现边界.md#国内出仓确认) |
| 客户统计与运营指标 | [客户模块](../apps/admin-web/src/modules/customers/AGENTS.md) | [统计与日志边界](业务实现边界.md#客户统计与平台日志) |
| 平台日志、操作日志、审计日志与操作人缺失 | [审计模块](../apps/admin-web/src/modules/audit/AGENTS.md) | [统计与日志边界](业务实现边界.md#客户统计与平台日志) |
| 客户工作台账户与设置 | [模块指引](../apps/client-web/AGENTS.md) | [对应章节](业务实现边界.md#客户工作台账户与设置) |
| 企业订单与跨境业务 | [模块指引](../apps/client-web/AGENTS.md) | [对应章节](业务实现边界.md#企业订单与跨境业务) |
| 海外接柜、入库与库内库存 | [模块指引](../apps/admin-web/src/modules/overseas-warehouse/AGENTS.md) | [对应章节](业务实现边界.md#海外接柜入库与库内库存) |
| 尾程订单控制与柜级入仓计划转换 | [模块指引](../apps/admin-web/src/modules/overseas-warehouse/AGENTS.md) | [对应章节](业务实现边界.md#尾程订单控制与柜级入仓计划转换) |
| 海外仓 PDA | [模块指引](../apps/pda-overseas-uniapp/AGENTS.md) | [对应章节](业务实现边界.md#海外仓-pda) |
| 海外采购、本土卡车与散板 | [模块指引](../apps/admin-web/src/modules/overseas-business/AGENTS.md) | [对应章节](业务实现边界.md#海外采购本土卡车与散板) |
| 采购样品、货款、装箱清单、面单、预估快递费、国内收货寄客户 | [模块指引](../apps/admin-web/src/modules/overseas-business/AGENTS.md) | [对应章节](业务实现边界.md#采购样品货款装箱清单面单预估快递费国内收货寄客户) |
| 海外仓库主档、名称、地址与能力 | 前端 [Admin](../apps/admin-web/src/modules/warehouses/AGENTS.md);后端 [Warehouse](../baiyue-firstleg/warehouse/AGENTS.md) | [资源归属](业务实现边界.md#海外仓库与通用资料) |
| 海外库位、托盘与资源锁 | [Warehouse Overseas](../baiyue-firstleg/warehouse-overseas-service/AGENTS.md) | [资源归属](业务实现边界.md#海外仓库与通用资料) |
| 车辆管理、司机证照、保养加油、车辆维修/故障/救援/异常、外接货与车次 | [模块指引](../apps/admin-web/src/modules/overseas-master-data/AGENTS.md) | [对应章节](业务实现边界.md#车辆管理司机证照保养加油车辆维修故障救援异常外接货与车次) |
| 拼车需求池、车次余位、销售拼车意向、散板加货 | [模块指引](../apps/admin-web/src/modules/overseas-master-data/AGENTS.md) | [对应章节](业务实现边界.md#拼车需求池车次余位销售拼车意向) |
| 国内出仓后船节点 | [模块指引](../apps/admin-web/src/modules/port-schedules/AGENTS.md) | [对应章节](业务实现边界.md#国内出仓后船节点) |
| 海外出库、排车、派送、异常与回访 | [模块指引](../apps/admin-web/src/modules/overseas-warehouse/AGENTS.md) | [对应章节](业务实现边界.md#海外出库排车派送异常与回访) |
| 海外费用明细、仓租库存与资金/投递重试 | [模块指引](../apps/admin-web/src/modules/overseas-business/AGENTS.md) | [后端入口](../baiyue-firstleg/lastleg-service/AGENTS.md#快速索引) |
| 海外业务费用来源与客户财务 | [模块指引](../baiyue-firstleg/finance/AGENTS.md) | [对应章节](业务实现边界.md#海外业务费用来源与客户财务) |
| 自营销量与领星统计 | [模块指引](../apps/admin-web/src/modules/self-operated/AGENTS.md) | [对应章节](业务实现边界.md#自营销量与领星统计) |
| 预约管理与工作日历 | [模块指引](../apps/admin-web/src/modules/appointment-calendar/AGENTS.md) | [对应章节](业务实现边界.md#预约管理与工作日历) |
| 退货预报、签收、库存与合箱 | [模块指引](../baiyue-firstleg/lastleg-service/AGENTS.md) | [对应章节](业务实现边界.md#退货预报签收库存与合箱) |
| 散货托盘码生成、打印与跨区传递 | [模块指引](../apps/admin-web/src/modules/loading-lists/AGENTS.md) | [对应章节](业务实现边界.md#散货托盘码生成打印与跨区传递) |
散货托盘码生成、打印与跨区传递:Admin `modules/loading-lists/components/PalletLabelPrintDialog.vue`;Firstleg `LoadingPalletLabelService`、`LoadingCompletedOutboxService`;Lastleg `LastlegSourcePalletMapper`、`InboundPlanService`。从各项目最近指引继续定位;散货 FBA 标签与一件代发实装托盘分别取各自冻结事实。
## 原型入口索引
仅在根指引的原型触发条件满足时读取。路径从工作区根起算;按终端只查命中行,不把原型当作当前部署或验收事实。
| 范围 | 首选入口 |
|---|---|
| 平台管理后台 | `docs/悦/货代SAAS平台后台/AGENTS.md`,按其中模块索引读取拆分原型;完整入口 `docs/悦/货代SAAS平台后台/index.html` |
| 企业客户端栏目与业务架构 | `docs/悦/柏悦物流客户端/柏悦物流客户端-栏目架构图.html` |
| 企业工作台与头程下单 | `docs/悦/官网头程下单/workbench.html` |
| 官网与企业入口 | `docs/悦/官网头程下单/index.html`、`docs/悦/官网头程下单/login.html`、`docs/悦/官网头程下单/register.html` |
| 微信小程序 | `docs/悦/虫虫出海小程序/index.html` |
| PDA 拣货 | `docs/悦/PDA拣货/pda-picking.html` |
| WMS 字段补充 | `docs/悦/货代SAAS平台后台/wms_full_data.json`、`docs/悦/货代SAAS平台后台/柏悦WMS系统文档.md` |
| 国内货柜履约原型盘点 | `docs/国内货柜履约/国内货柜履约页面与原型清单.md` |
| 海外仓全流程 | [海外仓页面 ID](海外仓业务/业务规则.md#原型页面定向索引) |
| 海外仓 PDA | `apps/pda-overseas-uniapp/AGENTS.md`、`apps/pda-overseas-uniapp/src/data/overseas-workbench.js`、`apps/pda-overseas-uniapp/src/pages/operation/operation.vue` 与[海外仓页面 ID](海外仓业务/业务规则.md#原型页面定向索引) |
| Admin/Client 验收 | `docs/Admin-Client前端原型还原验收规则.md` |
+2 -2
View File
@@ -1,6 +1,6 @@
# 国内货柜履约
本目录负责国内分柜、订舱、拖车、拣货、装柜、装柜后的报关协同、送港、进港和甩柜事实。整体货柜流程进入收尾,**报关协同代码尚未完成**;当前只在这里查找流程节点,报关开发请转到交接清单。
本目录负责国内分柜、订舱、拖车、拣货、装柜、装柜后的报关协同、送港、进港和甩柜事实。本入口只维护流程路由;代码、部署和验收状态以环境主契约及实际证据为准,不在此重复记录。
## 当前流程入口
@@ -9,7 +9,7 @@
- [阶段四:海运、目的港与尾程计划](../头程到尾程分阶段流程/阶段四-海运目的港与尾程计划.md):实际开船后的海运、目的港和尾程计划衔接。
- [报关资料与船期价格接入梳理](报关资料与船期价格接入梳理.md):报关资料、报关行回执、客户确认/打回、正式申报、海关结果和船期价格专题。
- [船期日历功能规划](船期日历功能规划.md):渠道、周模板、单次船期、收货截止时间和按渠道货量统计的独立日历规划。
- [报关代码开发交接清单](../头程到尾程/报关代码开发交接清单.md):报关代码当前未完成时,下一开发对话使用的范围和验收条件。
- [报关代码开发交接清单](../头程到尾程/报关代码开发交接清单.md):报关专项的实现范围与验收线索,任务确实涉及时读取,不代表当前完成状态。
## 货柜关键节点
@@ -6,7 +6,7 @@
> **当前展示版范围已重新冻结:只做船期维护和只读展示,不做自动归班、不消费预报、不改写收货审核、不自动改绑,也不改变现有智能排柜流程。** 首版只需要让管理人员看到每个航次的已收/预计货量、可用容量、按柜型初算的建议柜数、已订柜和待补柜,并据此人工判断是否合并到其他船。后续若要增加货物归班,再单独立项评审。第 15.8 节覆盖本文此前关于自动归班和异常改配的旧口径。
> **展示版统计口径**:每个船期按“收货仓 + 渠道 + 起运港 + 目的港”展示;已收使用现有收货/测量结果,预计量使用现有入仓和智能排柜可读数据;不创建或变更船期归班事实。收货截止时间只用于标记“截止前参考量/截止后风险”,不触发自动分配。订柜数只做只读初算,最终以现有智能排柜和人工确认结果为准。
> **展示版统计口径**:日历仅展示上海时区今天及以后开船的计划。未离仓审核实测货量优先保留有效订舱和排柜对应的船期,未安排或原安排失效的余量按“收货仓 + 渠道”展示在最近一班尚未截仓的有效船期;各船期继续展示自身起运港和目的港。顺延只改变日历货量和订柜参考,不创建或变更船期归班、订舱或排柜事实。订柜数按统一柜型容量向上取整,已离仓柜的容量不再抵扣余货需求,最终以现有智能排柜和人工确认结果为准,详细规则以第 15.8 节为准。
## 1. 输入来源与现状边界
@@ -652,20 +652,21 @@ Phase 1 不提供正常货量的批量改绑、强制赶截止和容量预占;
当前版本允许运营人员维护渠道、周模板和具体船期;货量相关能力全部只读:
- **已收 CBM**:读取现有收货/测量流程已经产生的有效实测结果,不在船期页面重新生成收货事实。
- **有效船期与过期**:按 `Asia/Shanghai` 自然日,月历和汇总只纳入今天及以后开船的计划;今天之前的计划自然过期并从日历移除,不删除记录、不伪造已开船状态。服务端返回上海本地时间 `nextRefreshAt`,取下一零点和同仓、同渠道范围内最近截仓时刻之后 1 毫秒的较早值;截仓查询不受展示月份、船名、港口或状态筛选限制。页面据此自动刷新,失败后延迟 60 秒重试,避免跨月顺延后货量停留在旧值。
- **已收 CBM 与未发货顺延**:读取现有收货/测量流程已经产生且尚未确认国内离仓的有效实测体积。已排柜且关联有效 `RELEASED` 订舱的部分,保留在其开船日期不早于今天、状态为 `OPEN/CLOSED` 的船期,截仓后仍保留;支持既有跨仓、跨渠道安排。未安排或原安排取消、日期过期的余量,按原收货仓和渠道选取 `OPEN`、开船日期不早于今天且截止时间不早于当前时刻的最近一班,按开船时间、船期编号、ID 稳定排序。同一份货量只计入一班,部分排柜按体积分开,不受原收货月份限制;没有下一有效船期时保留原货物事实,后续新增有效计划即可承接。这里只改变只读展示,不改已确认订舱、排柜或真实运输安排。
- **预计 CBM**:读取现有入仓预报或智能排柜可读数据;没有可靠来源时显示“暂无数据”,不凭渠道名称或订单分页猜测。
- **截止前参考量**:按船期的收货仓、渠道、起运港、目的港和 `warehouseCutoffAt` 做查询口径,只用于显示“理论上可供管理人员参考的货量池”,不表示货物已经归入该船。
- **截止前参考量**:对顺延后的待发货量按收货时间与 `warehouseCutoffAt` 区分参考量和风险量,不表示货物已经绑定该船。每次月历查询共用一个业务时刻,避免跨过截仓瞬间造成重复。
- **已明确本船量**:只读取现有系统已经明确关联到该船名/航次或现有订舱/柜次事实的数据;日历不新增关联。
- **建议订柜数**:按可展示货量和统一柜型容量做初算,显示计算时间、柜型和“最终以智能排柜/人工确认结果为准”;不创建订舱、不锁舱位、不改柜次。
- **建议订柜数**:对展示的待发实测与可核验预计体积之和,除以统一柜型容量向上取整;正货量不足一柜也算一柜,零货量为零柜。晚到/风险标签不直接抹除已收货量。待补柜按货量先扣除未离仓柜的可用订舱容量,再按对应柜型向上取整,下限为零;已离仓柜的容量不能抵扣仓内余货。日历卡片、汇总和各柜型方案保持一致。不创建订舱、不锁舱位、不改柜次。
- **合船判断**:页面只提供“本船未满、建议关注相邻船期”的提示,并展示相邻船的可用容量和货量对比;不自动合并、不自动改绑。
展示版的数据实现口径再明确一层:已收实测只统计测量审核为 `APPROVED` 且有 `actual_volume_cbm` 的有效入库单,按上一班截止时间到当前班截止时间的窗口汇总;主单只在未拆分时统计,拆分后的有效余量子单单独统计,避免父子单重复。当前没有可核验的预计体积来源时,预计量按 0 展示并在页面提示“暂无可核验数据”,不得把申报体积、原始体积或分页列表合计冒充预计量。已订柜读取已放舱订舱的柜型需求,优先识别已有船期关联,同时允许用仓库、渠道、港口、船名、航次和开船日期做确定性只读匹配;日历页面不创建关联。建议柜数只按统一柜型容量计算,待补柜只做提示。
展示版的数据实现口径再明确一层:已收实测只统计测量审核为 `APPROVED` 且有 `actual_volume_cbm` 的有效入库单,限定 `WAIT_PALLETIZE/WAIT_SPLIT/LOADING/LOADED`。未拆分单与拆分后的余量单各按自身实测体积统计;PDA 拣货结算后处于 `FULLY_SPLIT + LOADING/LOADED` 的源单已归一化为实际装柜部分,未离仓前同样保留,不能与整票原始体积重复。每票按有效装柜明细拆分为已离仓体积、有效订舱占用体积与未安排余量;已离仓要求客户、入库单和柜次一致,离仓状态为 `WAITING_FOR_LOADING` 且存在确认时间。扣除已离仓和有效订舱占用后,余量最低为零;订舱占用部分单独计入对应船期,撤销离仓后按现有运输安排重新纳入。当前没有可核验的预计体积来源时,预计量按 0 展示并在页面提示“暂无可核验数据”,不得把申报体积、原始体积或分页列表合计冒充预计量。已订柜读取已放舱订舱的柜型需求,存在有效显式关联时只认该关联;没有有效显式关联才用仓库、渠道、港口、船名、航次和开船日期做确定性只读匹配,每条订舱只选一班。已订总容量保存在 `bookedPlanningCapacityCbm`,扣除已离仓柜后的可用容量为 `availableBookedCapacityCbm`;按订舱需求中的柜型容量整柜扣除,同柜多票只扣一次,撤销离仓后恢复。日历页面不创建关联,待补柜只做提示。
当前版本明确不做以下写操作:
1. 收货审核通过时,不调用船期日历服务,不写入 `fl_sailing_assignment`、预报消费或船期实收事实。
2. 创建或修订预报不自动生成船期归班;预报维护接口不作为本轮页面入口。
3. 取消船期不自动把任何货物转到下一班;货物归属仍由原智能排柜和订舱流程维护。
3. 取消船期后未离仓货量按上述规则顺延展示;不改写货物实际归属,仍由原智能排柜和订舱流程维护。
4. 页面不提供货量异常改配、手工绑定实收、订舱关联/解除等操作;这些操作留在现有业务流程。
因此,本轮验收重点从“自动归班正确”改为:船期维护正确、展示口径透明、已收/预计/已订柜/建议柜数不重复、取消或截止只影响展示标签、不会改变原收货和智能排柜数据。后续如果需要让管理人员在页面上确认“合并到哪一班”,再单独增加人工确认动作和正式归属模型。
因此,本轮验收重点从“自动归班正确”改为:船期维护正确、展示口径透明、未发货量顺延且不重复、建议柜数向上取整、取消或截止只影响只读展示,不会改变原收货和智能排柜数据。后续如果需要让管理人员在页面上确认“合并到哪一班”,再单独增加人工确认动作和正式归属模型。
+1 -1
View File
@@ -1,6 +1,6 @@
# 头程到尾程分阶段流程
本目录是端到端流程的分段查找入口。F01-F40 流程基线已确认,当前用于全流程收尾变更;阶段三报关协同代码已接入并通过真实 HTTP 验收。总览和节点关系看[《头程到尾程流程节点梳理》](../头程到尾程流程节点梳理.md),字段、页面操作、权限和异常细节在对应阶段文件维护。
本目录是端到端流程的分段查找入口。F01-F40 流程基线已确认,当前用于全流程收尾变更;本入口不记录代码、部署或验收进度,相关事实只查环境主契约。总览和节点关系看[《头程到尾程流程节点梳理》](../头程到尾程流程节点梳理.md),字段、页面操作、权限和异常细节在对应阶段文件维护。
## 三大业务块与六个分段
@@ -27,7 +27,7 @@
| 角色 | 终端 | 主要操作 |
|---|---|---|
| 排柜操作员 | Admin | 创建模拟柜、搜索候选、推荐/人工加入、调整预装 |
| 订舱操作员 | Admin | 建订舱草稿、维护运输资料、上传文件、放舱 |
| 订舱操作员 | Admin | 建订舱草稿、维护运输资料、放舱 |
| 国内调度 | Admin | 建订舱级拖车预约、选择供应商、维护时间和附件 |
| 仓库主管 | Admin | 预装确认、真实柜号补录、任务和证据监督 |
| PDA 拣货员 | 国内 PDA | 领取唯一柜次任务、扫码、异常、拍照、完成装柜 |
@@ -89,6 +89,10 @@
人工加入:选择候选,填写普通货分配箱数或选择一件代发整托,携带计划版本提交。系统重新校验资格;页面旧结果不能作为写入依据。
平台柜次允许拼装多个客户的货物。关联订舱中的客户资料是业务快照,不是柜次的客户准入名单;不能据此裁剪其他客户的候选,或拒绝其普通箱数、待审核占位、整托分配及后续数量调整。智能推荐仍遵循渠道和用户显式选择的客户/入仓码范围。
跨客户拼柜不改变货物归属。每条明细仍以权威订单、入库单及托盘的原客户身份取数、写入和重算费用;客户端、文件、费用、报关资料及其他客户可见接口继续按原客户隔离,不能把物理拼柜当作跨客户读取授权。
一件代发一票多托时逐托展示,其中一托已分配不得隐藏其他未分配托盘。容量不足时跳过整托,不能回退成按箱拆托。
### 4.4 调整与费用影响
@@ -111,9 +115,12 @@
3. 选择 `ACTIVE/BOOKING` 订舱供应商;
4. 填写三类参与方和已知运输资料;
5. 至少维护一项、最多二十项柜型需求,数量为正整数;
6. 保存为 `DRAFT`,系统生成 `OB-yyMMdd-####` 订舱号。
6. 录入预报(委)件数、毛重、体积及包装单位、品名、唛头;未确定的数据留空;
7. 保存为 `DRAFT`,系统生成 `OB-yyMMdd-####` 订舱号并留在详情,可继续维护资料、上传文件和打印托运单。
草稿允许资料不完整、替换文件和继续编辑。柜型需求只表达需要多少个什么柜型,不创建真实货柜行。
草稿允许资料不完整和继续编辑;关系方名称未填时,其已录入的联系人、邮箱、电话、税号和地址仍随草稿保存,放舱前必须补齐三方名称。柜型需求只表达需要多少个什么柜型,不创建真实货柜行。
新建页面默认柜型 `40HQ`、整箱 `FCL`,运费条款 `FREIGHT PREPAID`、运输条款 `CY-CY`、包装单位 `CARTONS`,均按实际业务维护。港口、日期、品名、免用箱要求及货量不写样例默认值;包装单位可选 CARTONS、PCS、PALLETS,货量为本订舱总量。
### 5.2 补齐并放舱
@@ -123,16 +130,26 @@
- 船名、航次、起运港、目的港、ETD、ETA 和运输条款完整;
- 渠道仍有效;
- 柜型需求与平台规格一致;
- 存在有效 `BOOKING_CONFIRMATION` 或 `BILL_OF_LADING` 文件;
- 不要求上传订舱确认文件或提单文件;订舱页面不再展示“订舱资料”模块;
- 订舱供应商仍为有效主档。
点击放舱后状态从 `DRAFT` 进入 `RELEASED`,运输快照永久只读。放舱不要求真实柜号,不得为了通过校验伪造柜号。
点击放舱后状态从 `DRAFT` 进入 `RELEASED`,运输和预报货量快照永久只读;实际货量通过独立受控入口补录。放舱不要求真实柜号,不得为了通过校验伪造柜号。
### 5.3 客服补实与单据打印
- 客服手工录入本订舱的实际件数、毛重(KGS)和体积(CBM),不自动汇总关联柜或覆盖仓库测量事实。未采集保持 NULL;已填写数值必须大于零,件数为整数,重量、体积最多三位小数。
- 草稿保存委/实资料;放舱后仅持有订舱编辑权限的人员可通过 `PUT /api/platform/v1/ocean-bookings/{oceanBookingId}/actual-cargo` 补录或修正三项实值,必须提交当前版本、幂等键和原因,同事务递增版本并记录前后快照、操作人和时间。运输资料、三方关系人、柜型需求、预报货量和文件关联仍冻结。
- 核心资料右侧并排展示发货人、收货人、通知人,下方独立展示船名、航次、提单号。保留仓库、渠道、预计到港及多柜型需求,移除订舱文件入口。
- “打印托运单”读取已保存的委值;“打印提单确认件”读取已保存的实值。两类单据复用现有 A4 PDF 模板和预览/下载,未填字段显示“—”,实值缺失不能回退为委值,也不以柜型容量代替货量。未保存修改须先保存再打印。
- 柜量描述按柜型需求和数量生成,件数英文大写按对应的委/实件数及包装单位生成;品名、唛头及三方联系信息来自已保存资料。没有来源的传真、代理联系人等保持“—”。
- 系统仅生成提单确认件,正式提单由外部提供;不新增正式提单签发模板。订舱页面移除附件资料模块,放舱及后续拖车预约、派车不依赖订舱附件。
- 不在订舱新增中实现 FBA 同组入仓 30 天校验;该规则须先明确分组与时间事实后单独确认。
## 6. F16 订舱级国内拖车
入口:Admin → 国内拖车预约。
1. 从服务端候选中选择已 `RELEASED`、有提单号和有效订舱文件的订舱;
1. 从服务端候选中选择已 `RELEASED` 且有提单号的订舱(不要求订舱文件);
2. 选择 `ACTIVE/TRUCKING/DOMESTIC` 供应商;
3. 填写计划装柜时间、联系人和附件;
4. 保存/提交预约;
+1 -1
View File
@@ -24,7 +24,7 @@
## 跨层同步
- 菜单结构、路由权限、页面按钮、Controller `@PreAuthorize`、OpenAPI 权限说明及 IAM 初始化/统一增量 SQL 必须同步核对,不能以局部测试通过替代跨层一致性。
- 新增、修改或删除权限码、访问域或授权语义时,仅对实际受影响的菜单、路由、页面按钮、Controller `@PreAuthorize`、OpenAPI 权限说明及 IAM 初始化/统一增量 SQL 同步核对;核对不等于必须修改各层,不能以局部测试通过替代跨层一致性。按钮或菜单的界面调整及对已有状态、权限和操作资格的消费不触发本节联动,服务端鉴权与业务校验仍须保留。
- 业务功能任务只维护所属页面与接口,不得根据局部旧上下文覆盖共享导航、根路由装配、IAM 菜单权限初始化或统一增量脚本中的已确认语义。
- 发现共享文件与本契约冲突时,保留现有其他任务改动并交由对应总控统一收口;只有用户当前明确改变本契约时才能调整。
+4 -2
View File
@@ -26,10 +26,12 @@
## 参数与门禁
总控支持AUTO、SELECT、ALL。AUTO保留失败服务重试与直接依赖识别;架构首次切换使用审核后的完整匹配发布清单,不以AUTO遗漏服务。ENVIRONMENT仅test,下游前缀仅baiyue-firstleg-。DEPLOY默认false;IMAGE_REPOSITORY必须替换为已核镜像仓库,DOCKER_BASE_IMAGE由构建节点可访问的Java17镜像提供。不得将凭据拼入参数、URL或日志。
总控支持AUTO、SELECT、ALL。AUTO保留失败服务重试与直接依赖识别;架构首次切换使用审核后的完整匹配发布清单,不以AUTO遗漏服务。ENVIRONMENT仅test,下游前缀仅baiyue-firstleg-。DEPLOY默认false;IMAGE_REPOSITORY首次在各Job参数默认值中配置已核镜像仓库,后续流水线沿用当前Job参数值,不在每次构建后重置为空;总控仍明确向下游传递本次地址。更换仓库才需修改,空值、示例域名与格式校验仍保留,不在源码固定环境地址。DOCKER_BASE_IMAGE由构建节点可访问的Java17镜像提供。不得将凭据拼入参数、URL或日志。
默认执行Maven测试;仅明确选择SKIP_TESTS时跳过执行,仍编译测试源码。总控先统一测试,再向固定commit的单服务任务传递跳过重复执行。发布前还须完成网关路由、部署拓扑、失败回滚和受影响前端合同。离线检查不能证明镜像健康或HTTP闭环。
总控 `TEST_SCOPE=AUTO` 在单个 Lastleg 的可追踪局部 Java 变更中,按反向类型引用、接口实现、测试夹具和变更写入 SQL 的同表消费者选择测试;公开契约变更追加相关静态合同。基线仅取带有新门禁通过标记、确实测试了目标服务的成功构建;跳过测试、失败、取消或仅测过其他服务的构建均不能作基线。公共模块、共享模型、配置、Schema、未知路径、多服务、其他服务或基线不可用时保持完整模块测试;`TEST_SCOPE=MODULE` 可显式执行完整回归,临时灰度始终保持 MODULE。完整生产和测试源码编译及既有 1GB/单 fork/类隔离不变。定向测试必须逐类取得本轮非零执行报告;真实环境 opt-in 类单独列为未执行,不计为通过,仍由完整模块/专项授权入口负责。此静态筛选不能发现所有运行时耦合,涉及未被 Java/SQL 引用表达的跨业务影响时须选 MODULE。首次发布本次流水线变更需先执行完整模块测试建立新基线。流水线/发布脚本变化仍命中既有 AUTO 全服务规则,首次可使用 SELECT 仅选 Lastleg、TEST_SCOPE=MODULE 建立基线;后续 AUTO 才按关联范围执行。精确耗时以部署后 Jenkins 为准。
同机测试代理的执行器数量固定为1,避免构建与其他重任务挤占业务服务。总控测试和单服务打包还必须共用 `firstleg-test-maven` 跨Job锁,经 `deploy/scripts/run-ci-maven.sh` 执行;仅 `disableConcurrentBuilds()` 不能限制不同Job并发。入口按同一构建账号使用本机flock,控制端掉线后已有任务仍持锁时拒绝再起Maven,不删除锁文件绕过互斥。部署的SOURCE_COMMIT必须包含此入口及 `ci-bounded` POM配置,旧提交缺少防护时应失败,不能回退到裸mvn。
当前初始预算:Maven堆768MiB、测试堆1GiB、单测试fork,并分别限制元空间和直接内存;Surefire保留JaCoCo,启用父进程心跳检查、停止时kill、fork运行20分钟和退出30秒上限。宿主机GNU timeout提供45分钟期限及30秒强制终止,Jenkins内部另设50分钟上限。预算不是总RSS保证,须在真实Linux节点核对代理内存、memory.events/pressure和完整服务测试峰值;不足时按证据调整,不能重新放开三个Maven并发,也不能仅提高MemoryHigh挤占业务服务。代理服务保持 `KillMode=control-group`、`SendSIGKILL=yes`;代理掉线或构建中止后,先检查该服务cgroup是否仍有构建/测试子进程,确认退出再恢复,不把Job的ABORTED当作进程已清理。
@@ -42,7 +44,7 @@
所有服务使用同一Nacos Namespace ID/Group、Redis DB与会话前缀。Auth独占签名私钥;JWKS和内部会话验证共用Auth。EVENT_OPERATIONS_TOKEN独立于内部业务令牌,留空禁用运维操作。现有文件卷和非桥业务MQ保留,topic/group使用test-前缀。
Admin与Client各自Compose项目共接后端网络,发布必须给出CLIENT_WEB_URL/VITE_ADMIN_WEB_ORIGIN;两个PDA保留独立产物及仓绑定。域名、Namespace ID、MQ范围、数据卷和主机容量必须据实际清单核实,不能用模板默认值充当验收。
Admin与Client各自Compose项目共接后端网络,发布必须给出CLIENT_WEB_URL/VITE_ADMIN_WEB_ORIGIN;两个PDA保留独立产物及仓绑定,H5 直接上传宿主机 Nginx 站点,不纳入容器或 Jenkins 镜像发布;执行方式以[部署契约](测试环境单机部署与配置契约.md)的“PDA H5 发布方式”为准。域名、Namespace ID、MQ范围、数据卷和主机容量必须据实际清单核实,不能用模板默认值充当验收。
## 发布与验收
File diff suppressed because it is too large Load Diff
+101
View File
@@ -0,0 +1,101 @@
# 海外 PDA 界面样式规范
## 适用范围与维护职责
- 本文是 `apps/pda-overseas-uniapp/` 首页、作业入口和卡片列表外观的唯一维护正文,后续同类页面按本文调整。Admin、Client、国内 PDA 各自遵循所属规范,不自动互相套用。
- 当前样板为“拆柜收货”的候选柜列表、“仓储转运测量”的待测列表,以及首页的入口卡片与分项待办。规则统一不代表其他页面已改造或通过真机验收;详情、扫码、拍照和测量表单不因列表调整自动改版。
- 本文维护信息层级、尺寸、颜色、去重和反馈方式;业务字段、状态、权限、统计资格及提交行为仍按业务契约和实际接口维护。后续样式规则只更新本文,不另建页面样式总结副本。
按任务阅读:列表读“卡片列表”“信息去重”“状态与反馈”;首页读“首页入口与待办”;局部文案只核对对应条款。
| 当前实现入口 | 用途 |
|---|---|
| [公共样式](../apps/pda-overseas-uniapp/src/styles/pda.scss)、[列表样式](../apps/pda-overseas-uniapp/src/styles/task-list.scss)、[PortalHeader](../apps/pda-overseas-uniapp/src/components/PortalHeader.vue) | 页面外壳、导航、首页网格与基础样式;其他接入列表使用 `pda-task-list` 范围内的列表类,不覆盖未接入分支 |
| [拆柜收货](../apps/pda-overseas-uniapp/src/pages/operation/operation.vue) | `phase === 'candidates'` 列表分支;`.container-card-compact` |
| [仓储转运测量](../apps/pda-overseas-uniapp/src/pages/warehouse-transfer/warehouse-transfer.vue) | `entryMode === 'list'` 分支;`.transfer-card` |
| [首页](../apps/pda-overseas-uniapp/src/pages/home/home.vue)、[入口配置](../apps/pda-overseas-uniapp/src/data/overseas-workbench.js)、[待办读取](../apps/pda-overseas-uniapp/src/api/workbench.js) | 入口名称、卡片密度、待办展示与数据来源 |
## 卡片列表
### 页面与工具栏
- 顶部沿用 `PortalHeader`,保留返回和个人中心。页面标题只在导航栏出现一次,正文不再重复放置同名大标题。当前入口与页标题使用“仓储转运测量”。
- 工具栏左侧显示当前列表名称与数量,右侧放刷新,例如“共 38 柜”“待测转运单 · 6 单”。数量带业务单位,不用功能入口数量代替待办数量。
- 采用 CSS 逻辑像素,不把设计图或截图的物理像素直接当作控件尺寸;宽度随 PDA 可用视口适配。
| 元素 | 当前基准 |
|---|---|
| 列表背景 | `#f1f5fd` |
| 内容边距 | 左右 `14px`,列表顶部 `14px`;底部预留安全区 |
| 工具栏 | 最小高度 `36px`,与卡片间距 `11px` |
| 工具栏文字 | `14px`,行高 `20px`,字重 `700`,颜色 `#526174` |
| 刷新按钮 | 白底,`36px` 高,最小宽度 `72px`,左右内边距 `14px`,圆角 `20px`,边框 `1px solid #b8d1f5` |
| 刷新按钮内容 | 蓝色 `#135ee8`,图标 `18px`,文字 `13–14px`,图文间距 `5px`;请求中禁用并显示“刷新中…” |
### 卡片信息层级
卡片按以下顺序组织,不把所有信息挤进标题行:
1. **编号与状态**:左侧为柜号、转运单号等主要业务编号,右侧为状态标签。计划到仓等辅助时间放在编号下方。
2. **关键指标**:上方显示数值、下方显示名称,指标之间用细竖线分隔,整组上下用细横线界定。按业务选择必要指标,不为凑满列数补字段。
3. **补充信息**:展示接柜点、目的仓等未在上方表达的必要事实;缺码等额外问题单独提示。
4. **操作入口**:放在卡片底部右侧,使用“详情”“继续”“只读”“测量”“继续测量”等短文案与右箭头。左侧可放必要且不重复的补充业务码。
| 元素 | 当前基准 |
|---|---|
| 卡片容器 | 白底,内边距 `14px`,边框 `1px solid #dce5f0`,圆角 `13px`,无阴影,卡片间距 `11px` |
| 编号 | `18–20px`,字重 `750`,行高 `26px`,颜色 `#1f2937`;拆柜柜号当前 `20px`,转运单号当前 `18px` |
| 标题行 | 编号区域 `flex: 1; min-width: 0`,与状态间距 `10px`;状态不被挤压 |
| 状态标签 | `13px`,行高 `16px`,内边距 `6px 10px`,圆角 `9px`;保持完整状态文案 |
| 指标布局 | 四项等宽;转运三项当前为 `1 : 1.3 : 1`,中间目的仓适当加宽;分隔线 `#e1e7f0` |
| 指标区域 | 与标题间距 `12px`,上下内边距 `7–9px` |
| 指标值 | `22px`,行高 `26px`,字重 `750`,颜色 `#1f2937` |
| 指标名称 | `12px`,行高 `18px`,颜色 `#6f8194`,与值间距 `2–3px` |
| 辅助时间 | `12px`,行高 `18px`,颜色 `#718095` |
| 补充信息 | `12px`,行高 `20px`,行间距 `5px`;接柜点等关键归属信息可加粗 |
| 底部操作 | 蓝色 `#135ee8`,文字 `13px`、字重 `700`、行高 `22px`,右箭头 `14px`;底行最小高度 `28–32px` |
- 长编号、多目的仓和较大数值允许自然换行,不以省略号隐藏作业所需信息,也不把状态或操作挤出卡片。
- 隐藏底部补充信息后,操作仍靠右;不要因左侧无内容而把唯一操作移到左侧。
- 保留整卡已有的点击目标与操作资格;不要为了增大可点区域新增嵌套按钮或重复触发事件。
- 列表样式限定在列表分支;首页或列表的密度调整不覆盖详情、测量表单、照片区和底部提交栏。修改公共默认值前核对直接消费者。
## 信息去重
- 同一卡片内同一事实只展示一次。指标栏已展示计划数量和未操作数量时,不再追加“已生成 X 个入库计划,Y 个未操作”的重复汇总句。
- 仓储转运卡片以转运单号为主编号:入仓码为空,或去掉首尾空格后与转运单号相同,隐藏底部入仓码;不同时保留该入仓码。比较不改变业务码内容或大小写。
- 缺入仓码等上方未表达的异常信息继续单独展示,例如“2 单缺入仓码”;不要为去重隐藏问题提示。
- 不同含义的字段即使值相同也应保留,例如“总订单 1”和“入仓码 1”。不同记录共享接柜点或目的仓也不构成应删除的重复记录。
- 只展示服务端业务标识;必要关系缺失时使用“—”或明确的未关联提示,不以内部数据库 ID 回退。次要信息没有内容且无需提示时,不保留空白占位行。
## 状态与反馈
- 状态使用短文案配浅底标签。本轮样板中,待签收为橙色、待测量为蓝色、测量中为绿色、待齐全为灰色;颜色不代替文字,映射沿用对应业务状态。
- 待齐全或不可操作的柜保持灰色卡片与“只读”入口,仍能查看已有摘要;不能因为样式变灰而隐藏候选或放开写操作。
- 首次加载显示加载态;刷新保留已有列表并显示请求状态,避免连点。空态说明当前没有哪类任务,并提供适用的刷新入口。
- 加载失败与成功无记录是不同结果;错误不能变成“0”或成功提示。业务错误码、`requestId`、`traceId` 只用于故障诊断,不作业务编号。
## 首页入口与待办
### 紧凑入口卡片
- 保持三列网格,列间距 `8px`。入口保留图标、名称和一条待办或用途提示,不重复增加说明段落。
- 卡片使用 `height: auto; min-height: 104px; padding: 10px 6px`;长名称或较长待办文案可自然撑高,同一网格行保持对齐,不裁切内容。
- 图标区域当前 `40px × 40px`,图标 `28px`。名称当前 `12px`、行高 `17px`、顶部间距 `5px`,`.home-operation-name` 最小高度为 `17px`,最多两行;单行名称不强制预留两行的 `34px` 高度。
- 待办标签当前 `10px`、行高 `16px`,宽度不超过卡片;允许换行,避免长待办挤出卡片。
### 分项待办
- 待办数量放在各自入口,按对应业务单位展示,例如“38 柜”“6 单”“2 托”。首页不再以“16 项可处理”或分组下的功能个数冒充工作量,也不把不同单位和重叠阶段的任务简单相加。
- 任务列表与当前作业分开表达,例如仓储转运待测列表显示待测数量,转运测量入口显示本设备当前单的进行中状态;具体统计范围和资格维护在实际数据来源中。
- 分页接口使用明确的总数,不能将当前页记录数当全部待办;相同业务记录不重复计数。出库和废弃等不同工作来源需要分别标明。
- 正数用浅橙提示(文字 `#9a5300`、底色 `#fff0d6`);零、加载中和扫码提示用中性色(文字 `#6f8194`、底色 `#e7edf4`);获取失败用浅红提示(文字 `#b42318`、底色 `#fff1f0`)。
- 成功无任务可显示 `0`;尚未开始的当前作业可显示“未开始”。无独立待办队列的入口使用“扫码签收”“扫码作业”“扫码查询”等用途提示,不编造数量。
- 返回首页自动刷新,并提供手动刷新入口。局部获取失败只影响对应入口,保留其他成功数量;账号、仓库变化或旧页面请求返回时,不回显过期统计。
## 修改与验收
- 后续页面先确定主要业务编号、必要指标、补充信息和主操作,再按本规范组织卡片,不机械复制样板字段与状态。
- 人工检查重点为:长编号、多目的仓、指标较大值、入仓码相同与不同、缺码提示、零待办、加载失败、只读候选,以及首页长名称与标签换行。
- 视觉以用户提供的当前页面截图和人工验收为准;模板、样式编译及定向自动检查单独报告,不将编译成功记为真机扫码、照片上传、打印或整页视觉验收通过。
- 验证范围按[工程执行约束](AI工程执行与协作约束.md#验证范围选择)选择;纯文档维护不运行应用全量测试或构建。
+20 -173
View File
@@ -1,182 +1,29 @@
# 海外仓业务范围与快速索引
## 已确认业务边界
# 海外仓业务文档入口
- 当前开发环境按端到端全流程交付,不再用开发批次切断上下游。订单与客户、入库测量与计费、国内货柜履约、海外仓业务和财务共同组成一条连续业务链。
- 海外仓业务从国内装柜完成及确认出仓后的船节点开始,覆盖海运在途、海外接柜、卸货入仓、库存与托盘、换标、转运、废弃、退货、排车、PDA 拣货与出库、发车、转派送、派送完成、异常退回、客户回访和一件代发。
- 海外采购、本土卡车、本土散板、海外仓报价、汇率和车辆主数据属于同一海外业务域,并统一经当前 `gateway/` 访问。
- 功能是否可用以正式路由、Controller/OpenAPI、权限、数据库结构和验收证据为准;历史规划只用于追溯,不再用于排除已经纳入全流程的能力。
本文件只帮助选择正文,不定义字段、状态或部署进度。已定位页面、API 或服务时跳过本文件;代码从目标应用/服务最近 `AGENTS.md` 进入,业务依据只读下表命中的主题或条款。
## 人工验收入口
## 当前业务正文
- 端到端人工验收统一使用[《虫虫出海全流程人工验收手册》](虫虫出海全流程人工验收手册.md)。手册覆盖客户与订单、国内履约、跨区事件、海外 PDA 入仓、库存与库内服务、排车出库、派送、异常退回、一件代发、海外主数据和海外业务,并区分页面、真机和自动化证据。
## 功能快速路由
- [排车列表统一作业改造契约](排车列表统一作业改造契约.md):五阶段排车、一单一趟、跨客户同车、派送安排及四块排车详情的当前改造入口。
- [排车流程修复规划](排车流程修复规划.md):排车撤销、派送状态、换标全托、合托来源及草稿交互的修改范围、分工与回归要求。
- [采购订单样品履约流程变更需求](采购订单样品履约流程变更需求.md):采购样品购买、装箱、面单、交寄、国内核费与寄客户的变更入口。
- [美国预约管理统一总览与优化方案](美国预约管理统一总览与优化方案.md):提柜、用车、FBA及普通送货等统一展示的需求梳理与设计建议。
- [预约工作日历 V13 变更说明](预约工作日历V13变更说明.md):已确认的多客户共车、分批后送、改期取消、重新预约、未定日期及下一步操作规则和验收场景。
- [预约工作日历开发协作契约](预约工作日历开发协作契约.md):工作日历的接口、数据归属与唯一文件写者;不是已实现或环境验收说明。
### 预约送仓
本轮变更行为以[预约工作日历 V13 变更说明](预约工作日历V13变更说明.md)为主入口。下述接口用于定位既有业务归属;涉及整票占用、分批、取消及重约的实现须按 V13 收敛,不能由接口入口存在推定本轮规则已全部实现。
内部历史展示读取仓库元数据使用`POST /internal/warehouses/platform-metadata/batch`,由Warehouse权威提供,内部服务令牌鉴权且不经公网Gateway。每批1至2000个不重复正数ID,只读平台公共仓的编号、名称、类型、国家、原时区和状态,包含停用仓;不存在、非公共或已删除的ID统一列为缺失,不返回联系人及客户数据。调用方不得把原固定偏移或缺失时区猜成IANA地点时区;国家/时区不明时单列待定位,不放入美国当地日期格。接口合同见Warehouse `warehouse-v1.yaml`。
仓库主档时区使用IANA地点标识(如`America/New_York`),不以固定UTC偏移表示当地时间。国内默认`Asia/Shanghai`;明确单一时区的美国州可自动选择,多时区或存在地方例外的州须按实际地址确认。新增、编辑和导入在Warehouse共用校验。初始化地址资料无法确定地点时区时保留为空并阻止正式预约确认;不根据旧偏移批量猜测或迁移现有主档。参考[IANA时区数据说明](https://www.iana.org/time-zones)。
- 预约以同一美国起运仓和目的FBA仓组织,允许多个客户的真实货源统一安排。未建入仓计划也可保存;同仓不同日期/时段、不同货物可以分别建约。主单不归属单一客户,客户归属保留在每票货物明细,库存、订单、费用及派送的客户隔离不随合并改变。
- 预约管理日历和入仓单中的预约操作共用 Lastleg 的 FBA 预约记录。平台可读取完整预约;客户只能经自己的订单/入仓单读取本客户货物,不开放跨客户预约详情。
- FBA日历按地点当地时段与查询范围相交读取,跨日安排在覆盖的每一天展示同一业务记录;午夜结束不占次日,仅日期安排只占当天。确认时段与计划时段成对选用,不用旧计划结束时间补齐未知确认结束时间。卡片保留完整起止日期,切换已加载日期不追加查询。
- 系统生成全局唯一AP业务单号,外部确认号单独保存并按目的FBA仓唯一。创建和编辑携带持久化幂等键、操作者及请求摘要,同键同内容返回原命令快照,即使后来编辑也不改变原结果;异内容拒绝。主单、明细和命令记录同事务。本轮分批后的占用按 V13 逐来源数量及有效批次身份收敛,不能继续用整票唯一占用阻断合法部分分配;取消后恢复原单或重约仍须重新核对当前占用。
- 计划日期、可选计划时段、对方确认时段分别保存;仅有日期不补09点/零点,未定日期进入未定时列表。PENDING允许外部约号及箱数暂缺,不伪造值;SUCCESS必须有真实货量、FBA货件号或追踪号、外部确认号以及目的仓权威IANA时区,校验夏令时并保存对应UTC时间点。结束时间未知保持空。预计装车归运输安排,不再作为FBA预约写入字段;没有权威装车事实的关联查询明确返回未知。
- 入仓明细入口仅用lineIds选择业务货物,服务端批量转换成原ORDER/BOOKING整票来源;外接来货后仍保持BOOKING键,禁止同时以ORDER别名建约。主表和明细只有一套,不并行维护“提前预约”副本。仓储转运的目的地和货件资料读取实际转运主记录,不能把未填充的尾程展示投影误报为目的地变化。
- 取消/未约成须记录原因,解除失效预约的有效覆盖/绑定,并保留原计划、确认事实和历史;仍需送货的批次数量与后续需求按 V13 第六至七节保留,不回退库存或使同一货量再次可选。已有有效排车时先核对并处理运输安排。编辑使用版本校验,已确认预约不能直接退回待确认。
- 用车计划来源读取Fleet日期范围接口,一车一条,保留计划/实际出发及司机任务预计结束的UTC时间点,不表示收货预约已确认。前端最多显示42个起运仓当地日期,通过前后各14小时的UTC检索余量覆盖跨日,已发车按实际出发时间、未发车按计划出发时间检索并逐条按权威地点时区落格,原计划保留供核对,改期不移动已执行事实;缺仓库、国家或时区时独立展示待定位记录,不用浏览器时区猜测。服务端UTC保护窗口最多44天,超过2000条明确拒绝并要求缩小范围,不逐页扫描或静默截断。读取仍需车次列表权限,正常一个车次SQL和一次内部仓库元数据批量调用;目录失败不可当作空结果。
- 提柜日历读取Firstleg原码头拖车记录,入口为`GET /api/platform/v1/terminal-drayages/calendar`,同时要求预约列表与码头拖车列表权限。按启用目的仓国家筛选美国业务范围,不推断港口国家;已提柜按船节点权威实际日期、未提柜按预约日期检索和展示,原预约时间独立保留,改期不移动已执行事实;原业务日期无时区事实时显示待核实,不套用收货仓时区或转为UTC。日期范围最多42天,预约来源和船节点实际来源分别有界读取并按柜去重;任一来源超出1000条或目的仓无法分类时标记统计不完整,目录失败报错,不能假装无预约。详情回到原清关提柜业务,不由日历直接写原状态。
- Admin 入口为 `../../apps/admin-web/src/modules/appointment-calendar/`,既有入仓单入口为 `modules/overseas-warehouse/`。日历读取权限为 `platform:appointment:list`,既有预约写权限独立;API 合同见 `../../baiyue-firstleg/lastleg-service/src/main/resources/openapi/fba-appointment-calendar-v1.yaml`。合并预约不表示已经排车或发车,运输执行继续按既有排车与共享车次流程处理。
#### 在途货源与拼车外接货的预约跟进合同
本节规定来源解析、人工跟进和已有预约覆盖的共同边界。美国全类型预约的总体目标见[优化方案](美国预约管理统一总览与优化方案.md);本节接口不代表总体目标、环境发布或整链验收已经完成。
| 事实 | 唯一来源与规则 |
| 任务 | 读取入口 |
|---|---|
| 头程已开船货 | `ORDER:<尾程订单ID>`;依据真实船节点和美国接仓点/FBA目录读取,不要求先建入仓计划。建计划后仍是同一来源,不重复计票。内部ID仅用于关联,不作为业务编号展示。 |
| 拼车外接货 | `BOOKING:<原登记号>`;Fleet提供客户、目的地、接仓点、承运阶段、版本及可空的实际订单关联。确认承运后尚未来货可记录联系;生成订单后保持BOOKING键,禁止同时以ORDER别名重复计货。未知箱数保持空值。 |
| 时间 | 在途列表的预计到港/到仓是订单保存的快照;船节点观察时间不代表实时ETA。预约已确认时间只读,不被预计时间更新覆盖。原预约缺少时区时明确待核实,不按操作者浏览器时区猜测。 |
| 人工跟进 | `ll_appointment_followup`保留追加历史,跟进人取登录主体;允许没有入仓计划、约号、车辆时保存。提柜联系与码头申请按稳定柜次共享,接仓联系按柜次及实际接仓点共享,FBA联系按ORDER/BOOKING货源及客户保存;各事项独立,不推进正式确认或作业状态。 |
| 预约覆盖 | `AppointmentCoverageService.query`按稳定来源及客户批量读取FBA预约,数量核对未覆盖、部分覆盖、待确认、已确认和待复核。外接货尚无订单但已保存安排时返回待确认及资料缺项,不返回假确认。正式确认号、地点时区和已核实来源版本分别读取;来源版本变化仅提示复核,不声称已完成精确船期影响分析。仓储转运的目的地与货件资料以转运主记录为准,缺少资料与实际目的地变化分开表达。 |
| 运输和容量 | 车次、正式排车关联、容量、余位及发布由Fleet维护。预约侧读取其真实结果,不以联系记录生成库存、托盘、车次或容量,也不在前端扣减余位。 |
| 尾程订单、入仓计划、接柜、库存与仓储资源 | [系统边界](业务规则.md#系统边界与索引维护),按订单/计划/托盘等符号只读命中条款 |
| 海外排车、出库与派送改造 | [排车现行契约](排车列表统一作业改造契约.md);已有缺陷追溯才读[修复规划](排车流程修复规划.md) |
| 外配车辆与承运 | [外配业务契约](外配业务首版开发契约.md) |
| 预约工作日历、多客户共车、分批、改期取消 | [V13 业务规则](预约工作日历V13变更说明.md);接口/文件归属问题才读[开发协作契约](预约工作日历开发协作契约.md) |
| 船节点、查询频率、还柜与码头邮件 | [船节点契约](船节点标准化契约.md);实现补充查[定时查询](业务规则.md#船节点定时查询边界)或[码头邮件](业务规则.md#码头车队邮件) |
| 本土卡车与散板表单 | [统一表单](业务规则.md#本土卡车与散板统一前端下单)、[散板](业务规则.md#本土散板简化下单)、[美国本土卡](业务规则.md#美国本土卡独立下单),按任务选一项 |
| 采购样品、面单与寄送 | [采购样品流程](采购订单样品履约流程变更需求.md) |
| 司机、证照、车队与拼车需求池 | [车辆业务范围](车辆管理原型梳理与任务规划.md)、[拼车业务契约](内部拼车需求池首版开发契约.md),按具体业务选读 |
| 自有业务 | [自有业务契约](自有业务首版开发契约.md);接口细节查[接口设计](自有业务后端接口设计.md) |
HTTP入口为`/api/platform/v1/last-leg/appointment-planning`,包括`GET /cargo`、`GET /sources/resolve`及`GET/POST /sources/{sourceKey}/follow-ups`;请求和响应定义见[预约筹划OpenAPI](../../baiyue-firstleg/lastleg-service/src/main/resources/openapi/appointment-planning-v1.yaml)。深链进入预约页时须由后端重新核对客户、来源与目的仓,不能信任URL赋予资格。读取同时要求`platform:appointment:list`与`platform:overseas-warehouse:last-mile-order:list`,追加跟进另需`platform:appointment:followup`;仅平台主体可用,客户端不暴露跨客户货源。
专题契约描述确认目标,不表示代码、部署或真实验收已完成。只改唯一规则正文;入口或职责变化才同步本表。
整柜入口为`GET /containers`、`GET /containers/{containerId}`与`GET/POST /containers/{containerId}/follow-ups`,沿用上述权限。未传`warehouseId`记录整柜提柜或码头联系,传入时仅记录该柜实际接仓点的接仓联系。共享来源键由服务端生成`CONTAINER:<柜次>`或`CONTAINER:<柜次>:WAREHOUSE:<仓库>`,技术平台作用域不接收客户端客户参数,也不在界面展示内部键。原货源写入口仅接受FBA联系,不能逐客户重复登记整柜事项。
## 预约送仓
整柜列表读取实际已开船且仍有效的头程货物,覆盖美国接仓点的各种目的地类型;不要求先建入仓计划。关键词命中某票后仍统计同柜全部美国范围货物,接仓点一次批量分组加载。任一票箱数未知则汇总箱数显示待核实;同柜另有未知或非美国接仓点时明确标记范围不完整并禁止新联系记录。来源预计到港仍是订单快照,不能当作实时船期或预约确认。已有联系历史在来源离开活动列表后保留可读。
送仓预约的基础边界见[预约送仓正文](业务规则.md#预约送仓);日历相关变更优先按上表定位 V13,不默认再读取总体优化方案和开发协作契约。
跟进写入携带事项版本和持久化幂等键。同键、同操作者、同内容重试返回原记录;异内容或不同版本冲突拒绝,未知结果重试保持原请求。跟进保存成功不代表预约申请或确认成功。仓库目录失败必须报错;日历某来源失败时保留其他来源结果并标注统计不完整。
## 原型与验收(按需)
跨客户合批核对入口为`POST /batches/preview`,读取权限与来源查询相同,单批最多100票。服务端批量核对ORDER/BOOKING来源、客户归属及真实订单,拒绝重复别名、不同起运仓/目的FBA仓、暂扣、多目的地及已有有效预约;未知箱数保留缺项。`POST /appointments`重新核对后保存同一FBA预约聚合,另需既有FBA预约写权限;`GET /appointments/unscheduled`按预约列表权限分页读取无日期安排。允许未建计划及已确认承运但尚未来货的真实来源,不能信任浏览器预览作为写入依据。两种创建入口均自动提交选择时的接仓点和目的FBA仓,服务端在锁定货源后与当前事实比对;任一变化返回冲突并要求重新核对,不静默改约至新仓,也不增加人工填写字段。备妥窗口无权威依据时明确待核实,不能用预计到港或到仓替代。部署与真实验收状态见环境主契约。
已确认承运的外接货从原登记深链或`GET /external-candidates`服务端分页列表进入,必须经服务端核对后才能加入既有预约合批工作区;使用同一预览/创建接口,与同起运仓、同目的FBA仓的头程货共同保存,保留原BOOKING键,不生成ORDER别名。来源已有有效预约时不再提供新增入口;未形成入仓码或箱数未知仍可保存待确认安排,正式确认继续核验资料。
外接候选由Fleet只读适配器按原登记分页发现,限已确认承运/已实收/已绑定、车次未取消或完成、权威启用美国接仓点和FBA目的仓范围;支持登记号、车次号、客户名称及来货号检索,每页最多100票。预约侧对当页来源和覆盖批量核实,保留客户归属、原登记、真实订单关联及未知箱数;目录失败显式报错。Admin仅打开外接货源列表时请求,切换头程/外接保留同一合批选择,保存后刷新覆盖。它不提供承运确认、车次容量或发布写入。
共同样例:两柜头程货送同一美国接仓点再送ONT8,提柜分别按两柜联系,FBA货源保留各票ORDER来源;同一车次接入外部登记B-1时保留BOOKING:B-1。B-1确认承运但尚未来货时可以跟进和保存安排,不伪造入仓码或对方确认;实际来货在原登记行锁和同一事务内,将已有有效预约明细关联到真实订单及入仓码,继续通过同一BOOKING键读取覆盖;关联失败则来货事务一起回滚。该关联不自动改写预约数量快照、确认时间或来源版本,也不扫描补填历史记录。预约保存按登记号和订单号的稳定顺序锁定货源,并在订单锁定后清除查询缓存、重新核对来源,防止使用锁定前的旧事实。客户不符、目的仓变化、重复别名或已取消承运均不能借用其他货物的预约结果。跨来源筹划、正式确认和变化处理遵循总体方案,读取或核对成功不能代替保存和正式确认成功。
| 业务域 | 能力范围 | 原型入口 |
|---|---|---|
| 海外仓 | 尾程订单、入库单、换标单、托盘管理、库存管理;箱号管理与产品库当前暂不进入海外仓业务正式入口;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/` |
| 海外仓排车与智能预排 | 平台查看排车列表/详情,按入仓计划或已收托盘创建预排,并完成编辑、取消、拣货、出库、发车和转派送 | 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/` |
| 海外仓 PDA 柜号签收与退货入库 | 独立应用 `../../apps/pda-overseas-uniapp/`;拆柜收货完成柜号认领、三类照片、按目的类型实收与全柜完成;退货入库支持扫描退货单号或 SKU 候选并按本包实收生成退货箱和计费批次,签收后可按同客户退货单合箱 | 拆柜前端 `src/api/inbound.js`、`receiving-adapter.js`、`pages/operation/operation.vue`;退货前端 `src/api/return-receipt.js`、`src/api/return-packing.js`、`pages/return-receipt/return-receipt.vue`、`pages/return-packing/return-packing.vue`;Backend 分别为 `inboundplan/pda/` 与 `returnreceipt/controller/PdaReturnReceiptController.java`、`PdaReturnInventoryController.java`,经统一 `gateway/` |
| 海外仓 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` |
| 车辆管理、司机资质与保养加油 | 业务范围见[车辆管理原型梳理与任务规划](车辆管理原型梳理与任务规划.md);后端 `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/fleet/`,OpenAPI `fleet-drivers-v1.yaml`、`fleet-trips-v1.yaml`、`fleet-vehicle-records-v1.yaml`;证照和运维照片复用 File | Admin 接入目录 `../../apps/admin-web/src/modules/overseas-master-data/`;原型来源和页面 ID 按规划第 1、2 节定位 |
| 内部拼车需求池 | [内部拼车需求池首版开发契约](内部拼车需求池首版开发契约.md):车次余位发布、销售意向、确认占位、本土订单关联及统一我仓上车 | 复用上述车辆管理及本土业务入口;不开放客户端运力市场 |
| 国内出仓后船节点 | 对已确认离开国内仓库的订舱/柜次定时查询船节点,保存最新节点、异常和查询历史,贯通目的港提柜至还柜事实 | 标准语义见[船节点标准化契约](船节点标准化契约.md);Admin `../../apps/admin-web/src/modules/port-schedules/`、`ocean-bookings/` 及货柜详情;Backend `../../baiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/portschedule/`、`../../baiyue-firstleg/integration-service/` |
## 原型页面定向索引
原型本地完整入口为 `../悦/货代SAAS平台后台/index.html`。页面任务优先读取下列命中模块和页面 ID,不先加载完整原型。
### 海外仓
- 尾程订单:`last-mile-orders`、`last-mile-order-detail`。
- 入库单:`fba-inbound-order`、`fba-inbound-order-detail`;入库和退货入库相关库存视图按任务联查 `overseas-inbound`、`fba-return-inbound`。
- 换标单:`fba-relabel-order`、`fba-relabel-order-detail`;换标库存视图按任务联查 `overseas-relabel`、`fba-return-relabel`。
- 托盘管理:`fba-pallet`、`fba-pallet-detail`。
- 箱号管理:`fba-carton`、`fba-carton-detail` 当前暂缓,不注册正式菜单和路由。
- 产品库:`fba-product`、`fba-product-detail` 当前暂缓,不注册正式菜单和路由。
- 库存管理:`fba-stock-management`、`overseas-location`、`inventory-overview`、`warehouse-stock`、`overseas-stock`、`warehouse-stock-detail`、`inventory-transactions`、`purchase-stock`、`purchase-stock-detail`、`fba-return-stock`。
### 海外业务
- 采购订单:`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-*` 页面不是海外仓业务默认入口;只有实际流程明确复用时才联查。
### 仓库与通用资料
- 海外仓合作仓:优先核对 `gen-partner-warehouse`,并同步核对现有平台仓库类型、接口和初始化 SQL。
- 海外仓报价:`gen-overseas-quote`;涉及车队报价时再联查 `delivery-fleet-quote`。
- 汇率管理:`gen-exchange-rate`。
- 车辆列表与详情:`vehicle`、`vehicle-detail`。
## 终端与模块边界
- 海外仓出库、派送、异常退回和一件代发已经纳入全流程,不再作为海外入仓之后的独立开发批次。
- 派送业务由 Admin/Client 承载,不进入海外 PDA;海外 PDA 负责现场入仓、托盘、排车拣货和出库等已注册作业。
- 箱号和产品信息作为入仓、库存、箱唛及 SKU 快照的一部分使用;是否提供独立维护页面由正式路由决定,不影响全流程状态推进。
- 高级 BI、开放平台和独立移动 APP 属于独立产品能力,不与现有业务全流程完成状态混为一谈。
## 船节点定时查询边界
- 所有供应商统一节点、时间语义、异常事实、停止规则和新增船司接入门禁以[船节点标准化契约](船节点标准化契约.md)为准;供应商缺失的节点保持缺失,不推测补齐。
- 现有 `CarrierScheduleQuery` 查询任务及其查询尝试、历史、来源、过期标识和频率约束整体重新归入海外仓业务;不再把它列作国内货柜履约港务/船期查询能力,也不得另建一套重复任务。
- 定时查询对象必须关联真实订舱、柜次以及可用的船司/船名航次或跟踪标识,不建立脱离业务单据的孤立轮询任务。
- Firstleg `portschedule/` 负责任务编排、业务关联、最新节点、节点历史、幂等和停止条件;`integration-service/` 只负责船司或轨迹供应商适配、限流、超时、重试和错误归一化,不保存业务主数据。
- 查询从确认柜子离开国内仓库后开始,贯通目的港到达、卸船、清关、提柜和还柜事实,默认在实际 `EMPTY_RETURNED` 后停止;这只扩展货柜轨迹事实,不纳入海外派送、海外仓出库或库存离仓业务。失败不能伪造成功节点,需保留来源、观测时间、最近成功时间和失败原因。
- 现有“每 3 天一次、窗口最多 3 次”、六家船公司来源、最近有效结果和过期标识是同一查询能力的既有约束,归海外仓业务继续核对;后续若调整自动轮询频率、供应商额度、退避或停止规则,应只修改海外仓业务契约和这套任务。
- 当前原型没有独立的“船节点定时查询”页面;涉及页面展示时从订舱、船期或货柜详情进入,不得为了匹配原型菜单把它归入海外派送。
## 本土卡车与散板统一前端下单
- 同一业务在 Admin 新增/编辑和 Client 下单使用一致的字段、顺序、控件、默认值、校验及提交转换;Admin 新增额外选择客户,编辑固定原订单客户;Client 的客户仅由登录会话确定,业务请求体不携带客户标识。
- 业务表单统一为运输信息、货物信息、费用与时效和备注。起运地/目的地、两端联系人、电话及详细地址左右对应;件数、预计托数、重量和体积默认零,预算默认为空、币种 USD,空预算和零预算分别保留。车辆只在卡车填写,商品与预计托数只在散板填写。
- 两端统一使用数字控件和 USD/CNY 选择;重量支持三位小数、体积六位小数、预算两位小数;取送时间按当地分钟输入并提交秒为零的值,不进行时区转换。四项联系信息及两个时间均必填,送货不能早于取货。
- 各应用内部由 `TransportDemandForm.vue` 和 `transportDemandForm.ts` 复用表单、校验与业务请求转换;两端对应源码按同一内容核对,不建立跨应用目录依赖。创建保留稳定幂等键;平台编辑保留客户、业务单号和版本,受状态及只读承运来源限制。
## 本土散板简化下单
- 平台代客创建必须显式选择客户;客户端客户范围只取认证会话。新增、编辑保持现有独立页面;平台普通编辑仍只允许待接单且非拼车来源订单,池来源继续只读展示真实承运安排。
- 下单移除运输方式及柜型字段,不再要求选择自送或我司提货。拼车或优先拼载属于内部安排,不再冒充交货方式或作为下单必填项;运输类型和是否打盘不在新增主表单要求填写,未知安排保持空,不自动补造。散板移除柜型字段。
- 需求保存取货地、目的地、可选详细地址补充、起运地联系人及联系电话、目的地联系人及联系电话、商品名称、预计托数、件数、总重量、总体积、预算总价、币种、取货与送达时间和备注。商品名称、预算和备注选填;四项联系人信息与取货、送货时间全部必填;预计托数、件数及重量体积可为零,不能为负。件数、地址补充和备注按统一前端下单表单展开填写。
- `estimatedPalletCount` 是下单预计托数;`packageCount` 是件数,二者独立。下单不生成实物托盘,不把预计托数写成实际收货或实占托位;拼车来源沿真实询价的货名与预计托数保存。
- `pickupAt` 与 `deliveryAt` 保存不带时区的当地日期时间,按分钟输入、原值显示,不进行 UTC 转换。取货与送货时间均必填;送货时间不能早于取货时间。预算明确显示 USD 或 CNY,金额空值与零值区分。
- 平台和客户接口共用 Lastleg `looseboard/dto/LocalLooseboardRequests.java`、`LocalLooseboardResponses.java` 及 `overseas-business-v1.yaml`,不保留旧运输枚举或要求日期别名。现有 API 路径与权限复用,空库结构同步模块基线及海外统一初始化,不回填测试存量,不自动执行 SQL 或部署。
## 美国本土卡独立下单
- 客户端和平台新增/编辑共用同一服务端需求合同:移除运输类型、柜型、下单预报托盘数及原要求时间;车辆类型为必选的“15拖”(`PALLET_15`)或“30拖”(`PALLET_30`)。车辆主档仍独立维护实际容量,车型不等于本票货量。
- 起运地联系人、起运地联系电话、目的地联系人、目的地联系电话、取货时间和送货时间全部必填。时间按日期及小时分钟填写,不进行时区转换;送货不能早于取货。列表、详情与平台编辑展示同一份保存值,客户端不提交客户标识。
- 独立下单不生成预报托盘,首次实际收货确定确认托数;已有拼车来源的真实预报及实际履约继续独立记录。拼车来源未提供的车型、目的地联系人/电话、送货时间保持未知,页面显示“—”,不捏造数据。美本土散板按本文“本土散板简化下单”使用独立需求合同。
- 接口及字段唯一实现合同为 Lastleg `trucking/dto/UsTruckOrderRequests.java`、`UsTruckOrderResponses.java` 与 `src/main/resources/openapi/overseas-business-v1.yaml`;数据结构同步模块基线及海外统一空库初始化。页面承载核对见 Client `cross-border/PROTOTYPE_MATRIX.md` 和 Admin `overseas-business/PROTOTYPE_MATRIX.md`。
## 系统边界与索引维护
- 托盘管理提供当前托盘单张标签 PDF:Admin `PalletsView.vue` → `warehouse-overseas-service` 的 `GET /api/platform/v1/warehouse-admin/{warehouseId}/pallets/{id}/label`。有 FBA 仓码的托盘与国内统一使用 Print `FBA_PALLET_A4_LANDSCAPE_V1`(297×210 mm):顶部 SCK8 等仓码,中间 Code 128、底部完整托盘号,141 等内部编号保留在托盘号中;其他托盘使用 `INBOUND_MARK_V1`(100×100 mm)。只按真实托盘编码打印,不重新生成编号;模板约束、服务接入与权限见海外资源服务 `AGENTS.md`。
- 海外仓合作仓是现有头程仓库主数据的类型扩展,需同步核对 Admin `warehouses`、Warehouse Service 的 DTO/Controller/OpenAPI/SQL 及实际消费者;不得因此把海外库存业务写入国内 Warehouse Service。
- 海外库存、库内作业和海外本土业务已有明确服务入口:`gateway/` 是统一 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` 服务端聚合全柜订单、入仓码、计划数、未操作数和 `allPlansReady`,分页返回全部稳定来源柜,已生成计划的柜仍保留供接柜仓查询与修改;`pendingPlanCount` 区分待建计划,`resourcePendingPlanCount` 区分托盘资源待生成,后者仅用于自动生成异常后的重试;详情 `/{sourceContainerBookingId}` 返回柜内全部订单与计划且不受订单分页截断。`plannedArrivalAt` 只来自装柜完成事件 `estimatedWarehouseArrivalAt` 冻结到 Lastleg `ll_order.estimated_warehouse_at` 的计划到仓事实,不得使用创建时间、预计到港或当前时间替代,并按该时间升序、空值最后排序。确认后调用 `POST /api/platform/v1/last-leg/inbound-plans/convert-container`;服务端一次锁定整柜、每票独立生成一个计划,整批原子且幂等。转换成功才将尾程订单推进为 `INBOUND_PLANNED`,并把库存余额的来源入仓码展示快照替换为各自 `planNo`。
- 尾程订单的 `inboundCode` 只保存并展示真实来源入仓码;换标申请、本土散板等没有入仓关系的海外本土业务保持为空,由页面显示 `—`,不得用换标单号、本土散板单号或内部 ID 冒充入仓码。
- 平台可按单票尾程订单入库计划(托数、托盘类型、分配/可合托/加急和备注);入库仓、入仓码和预计到仓时间均展示冻结事实,不允许人工改写。预计到仓日期由服务端锁定来源柜全部订单的 `estimated_warehouse_at`,缺失或同柜不一致时阻断,人工与自动计划统一写入该柜日期。写入时校验订单版本、客户归属、仓库主档和幂等键;一票柜保存后立即自动生成并绑定托盘码、海外仓托盘和资源锁,多票柜在最后一票计划齐全时自动为全柜完成同一动作。`resourcePendingPlanCount` 只用于自动生成失败后的显式重试,不是正常人工步骤。分配、可合托、加急必须随入库单列表和海外 PDA 入仓码作业返回并展示,其中“可合托”只向现场提供选择:合托时扫描同目的仓已使用的托盘码,独立收货时扫描新托盘码,不作为实收或完成门禁。新增暂扣只允许货物完成入库后执行;暂扣只作用于该票并仅阻断排车和出库,不阻断入库计划或入库作业,同柜其他订单不受影响。
- 头程散货在预装确认且真实集装箱号就绪后,按 `集装箱号-FBA仓编码-三位序号` 冻结托盘码;序号在当前柜、当前 FBA 仓内从 001 独立递增。送柜报关、清关提柜和预装清单共用同一按 FBA 仓分组的打印清单,可整柜打印或选择单仓前 N 张补打。该编号随装柜完成事件进入海外,生成入库计划与海外实体托盘时原样沿用;一件代发继续使用国内装箱打托形成的托盘号,不参与散货重新编号。
- 头程与海外仓允许装托密度不同。尾程最终托数取不低于头程已有托盘码数的海外计划结果:头程已有编码全部保留,数量不足时在同柜、同 FBA 内按连续下标补码,不因数量差异阻断。柜级预览必须分别返回并展示头程已有、海外仓补充和最终托数;最终总数不得标成“本次新增”。
- 尾程订单人工节点固定为国内报关完成、预计/实际开船、预计到港、国外清关完成、实际到港等待卸船、预约提柜和卸柜八行完整快照。第一次保存后该订单永久使用 `MANUAL` 来源,读取和页面展示不得再回退柜级节点,也不得反向修改货柜船节点。
- 目的港码头拖车仍归 Firstleg 货柜聚合,但 Admin 清关提柜列表不再使用预约/实际提柜作为到仓业务时间:原两列改为“预计到仓/实际到仓”。预计到仓在列表内人工选择并由 Lastleg 按 `sourceContainerBookingId` 原子同步整柜尾程订单,已有入库计划后锁定;实际到仓只取海外 PDA 首次开始收货的 `ll_receiving_container_session.receiving_at`。车队、邮件、还柜及 `unloadingCompletedAt + 72h` 还空预警仍按原码头拖车链路处理。
- 手动还柜以真实海外卸柜完成且尚未还柜为准,仍校验独立还柜权限;无需事先存在车队、预约或提柜时间。首次命令使用版本 0 创建拖车记录,车队字段可为空,不补造提柜事实。还柜时间不得早于卸柜完成时间或已有提柜时间,成功后同步标准还柜节点并解除报空预警。
- 船节点是头程海运在途事实与海外接柜之间的衔接能力,业务聚合继续由 Firstleg 按 `containerBookingId` 柜级持有,不绑定客户;跨区域事件使用 `tenantId=0` 平台技术范围,到港/可提柜结果通过明确契约提供给海外区域,不复制第二套轮询任务。
- Admin、Client 仍使用统一账号体系,并按根 `AGENTS.md` 的双区域 API、海外 Token 和跨区域事件约定接入;业务页面不自行实现第二套登录。
- 海外仓 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 仓也不得冒充实际收货仓。
- 海外 PDA 接柜候选、认领会话、国内五类装柜照片对照、海外三类签收照片与整柜完成均按 `sourceContainerBookingId + containerNo` 聚合,不保存客户并允许同柜多个客户。国内照片在签收阶段展开、收货阶段折叠,只读加载失败不阻断拆柜。签收后为柜内每个计划按其自身客户生成任务;入仓码解析、SKU 实收、托盘占用和库存入账继续按该票真实客户隔离,整柜完成需全部计划核平且只发布一次柜级完成事件。
- 新增实际代码模块、API、权限、OpenAPI 或数据库入口后,同步更新根 `AGENTS.md`、对应应用/服务 `AGENTS.md` 和本文件;不把排期、完成比例或临时任务状态写入快速索引。
## 码头车队邮件
首次选择车队后从清关提柜列表发送请求,更换车队时原子保存原车队取消和新车队提柜两封邮件;同一车队重复选择不发信。邮箱读取供应商资料,缺失或无效时阻断发送或换队。邮件顺序投递,失败待人工核对后重试。接口、临时模板和启用方式见 [Firstleg 车队邮件说明](../../baiyue-firstleg/firstleg/docs/terminal-drayage-mail.md)。
- 页面还原按[页面 ID 索引](业务规则.md#原型页面定向索引)读取命中页面;不加载全部原型。
- 用户明确要求全流程人工验收时查[人工验收手册](虫虫出海全流程人工验收手册.md);普通修改按根指引选择最小验证。
- [美国预约总体优化方案](美国预约管理统一总览与优化方案.md)、[PDA 改造评审](海外仓PDA拆柜收货改造方案评审稿.md)、后端缺口清单和原型核对属于专项设计/评审资料,不是普通开发的必读清单。
+173
View File
@@ -0,0 +1,173 @@
# 海外仓业务规则与实现边界
角色:业务规则正文,不是导航或部署进度。已知代码入口时直接沿模块指引工作;需要业务依据时,按索引链接或 `rg -n -F '符号或主题' docs/海外仓业务/业务规则.md` 读取命中标题/条款,不全文加载。
专题正式契约优先:排车查《排车列表统一作业改造契约》,预约查《预约工作日历V13变更说明》,船节点查《船节点标准化契约》,纸张与标签查打印标签维护入口;下列实现约束不得覆盖这些当前主题规则。部署与验收状态只查工作区根指引指定的环境主契约。
## 业务范围
- 当前开发环境按端到端全流程交付,不再用开发批次切断上下游。订单与客户、入库测量与计费、国内货柜履约、海外仓业务和财务共同组成一条连续业务链。
- 海外仓业务从国内装柜完成及确认出仓后的船节点开始,覆盖海运在途、海外接柜、卸货入仓、库存与托盘、换标、转运、废弃、退货、排车、PDA 拣货与出库、发车、转派送、派送完成、异常退回、客户回访和一件代发。
- 海外采购、本土卡车、本土散板、海外仓报价、汇率和车辆主数据属于同一海外业务域,并统一经当前 `gateway/` 访问。
- 功能是否可用以正式路由、Controller/OpenAPI、权限、数据库结构和验收证据为准;历史规划只用于追溯,不再用于排除已经纳入全流程的能力。
## 预约送仓
本轮变更行为以[预约工作日历 V13 变更说明](预约工作日历V13变更说明.md)为主入口。下述接口用于定位既有业务归属;涉及整票占用、分批、取消及重约的实现须按 V13 收敛,不能由接口入口存在推定本轮规则已全部实现。
内部历史展示读取仓库元数据使用`POST /internal/warehouses/platform-metadata/batch`,由Warehouse权威提供,内部服务令牌鉴权且不经公网Gateway。每批1至2000个不重复正数ID,只读平台公共仓的编号、名称、类型、国家、原时区和状态,包含停用仓;不存在、非公共或已删除的ID统一列为缺失,不返回联系人及客户数据。调用方不得把原固定偏移或缺失时区猜成IANA地点时区;国家/时区不明时单列待定位,不放入美国当地日期格。接口合同见Warehouse `warehouse-v1.yaml`。
仓库主档时区使用IANA地点标识(如`America/New_York`),不以固定UTC偏移表示当地时间。国内默认`Asia/Shanghai`;明确单一时区的美国州可自动选择,多时区或存在地方例外的州须按实际地址确认。新增、编辑和导入在Warehouse共用校验。初始化地址资料无法确定地点时区时保留为空并阻止正式预约确认;不根据旧偏移批量猜测或迁移现有主档。参考[IANA时区数据说明](https://www.iana.org/time-zones)。
- 预约以同一美国起运仓和目的FBA仓组织,允许多个客户的真实货源统一安排。未建入仓计划也可保存;同仓不同日期/时段、不同货物可以分别建约。主单不归属单一客户,客户归属保留在每票货物明细,库存、订单、费用及派送的客户隔离不随合并改变。
- 预约管理日历和入仓单中的预约操作共用 Lastleg 的 FBA 预约记录。平台可读取完整预约;客户只能经自己的订单/入仓单读取本客户货物,不开放跨客户预约详情。
- FBA日历按地点当地时段与查询范围相交读取,跨日安排在覆盖的每一天展示同一业务记录;午夜结束不占次日,仅日期安排只占当天。确认时段与计划时段成对选用,不用旧计划结束时间补齐未知确认结束时间。卡片保留完整起止日期,切换已加载日期不追加查询。
- 系统生成全局唯一AP业务单号,外部确认号单独保存并按目的FBA仓唯一。创建和编辑携带持久化幂等键、操作者及请求摘要,同键同内容返回原命令快照,即使后来编辑也不改变原结果;异内容拒绝。主单、明细和命令记录同事务。本轮分批后的占用按 V13 逐来源数量及有效批次身份收敛,不能继续用整票唯一占用阻断合法部分分配;取消后恢复原单或重约仍须重新核对当前占用。
- 计划日期、可选计划时段、对方确认时段分别保存;仅有日期不补09点/零点,未定日期进入未定时列表。PENDING允许外部约号及箱数暂缺,不伪造值;SUCCESS必须有真实货量、FBA货件号或追踪号、外部确认号以及目的仓权威IANA时区,校验夏令时并保存对应UTC时间点。结束时间未知保持空。预计装车归运输安排,不再作为FBA预约写入字段;没有权威装车事实的关联查询明确返回未知。
- 入仓明细入口仅用lineIds选择业务货物,服务端批量转换成原ORDER/BOOKING整票来源;外接来货后仍保持BOOKING键,禁止同时以ORDER别名建约。主表和明细只有一套,不并行维护“提前预约”副本。仓储转运的目的地和货件资料读取实际转运主记录,不能把未填充的尾程展示投影误报为目的地变化。
- 取消/未约成须记录原因,解除失效预约的有效覆盖/绑定,并保留原计划、确认事实和历史;仍需送货的批次数量与后续需求按 V13 第六至七节保留,不回退库存或使同一货量再次可选。已有有效排车时先核对并处理运输安排。编辑使用版本校验,已确认预约不能直接退回待确认。
- 用车计划来源读取Fleet日期范围接口,一车一条,保留计划/实际出发及司机任务预计结束的UTC时间点,不表示收货预约已确认。前端最多显示42个起运仓当地日期,通过前后各14小时的UTC检索余量覆盖跨日,已发车按实际出发时间、未发车按计划出发时间检索并逐条按权威地点时区落格,原计划保留供核对,改期不移动已执行事实;缺仓库、国家或时区时独立展示待定位记录,不用浏览器时区猜测。服务端UTC保护窗口最多44天,超过2000条明确拒绝并要求缩小范围,不逐页扫描或静默截断。读取仍需车次列表权限,正常一个车次SQL和一次内部仓库元数据批量调用;目录失败不可当作空结果。
- 提柜日历读取Firstleg原码头拖车记录,入口为`GET /api/platform/v1/terminal-drayages/calendar`,同时要求预约列表与码头拖车列表权限。按启用目的仓国家筛选美国业务范围,不推断港口国家;已提柜按船节点权威实际日期、未提柜按预约日期检索和展示,原预约时间独立保留,改期不移动已执行事实;原业务日期无时区事实时显示待核实,不套用收货仓时区或转为UTC。日期范围最多42天,预约来源和船节点实际来源分别有界读取并按柜去重;任一来源超出1000条或目的仓无法分类时标记统计不完整,目录失败报错,不能假装无预约。详情回到原清关提柜业务,不由日历直接写原状态。
- Admin 入口为 `../../apps/admin-web/src/modules/appointment-calendar/`,既有入仓单入口为 `modules/overseas-warehouse/`。日历读取权限为 `platform:appointment:list`,既有预约写权限独立;API 合同见 `../../baiyue-firstleg/lastleg-service/src/main/resources/openapi/fba-appointment-calendar-v1.yaml`。合并预约不表示已经排车或发车,运输执行继续按既有排车与共享车次流程处理。
#### 在途货源与拼车外接货的预约跟进合同
本节规定来源解析、人工跟进和已有预约覆盖的共同边界。美国全类型预约的总体目标见[优化方案](美国预约管理统一总览与优化方案.md);本节接口不代表总体目标、环境发布或整链验收已经完成。
| 事实 | 唯一来源与规则 |
|---|---|
| 头程已开船货 | `ORDER:<尾程订单ID>`;依据真实船节点和美国接仓点/FBA目录读取,不要求先建入仓计划。建计划后仍是同一来源,不重复计票。内部ID仅用于关联,不作为业务编号展示。 |
| 拼车外接货 | `BOOKING:<原登记号>`;Fleet提供客户、目的地、接仓点、承运阶段、版本及可空的实际订单关联。确认承运后尚未来货可记录联系;生成订单后保持BOOKING键,禁止同时以ORDER别名重复计货。未知箱数保持空值。 |
| 时间 | 在途列表的预计到港/到仓是订单保存的快照;船节点观察时间不代表实时ETA。预约已确认时间只读,不被预计时间更新覆盖。原预约缺少时区时明确待核实,不按操作者浏览器时区猜测。 |
| 人工跟进 | `ll_appointment_followup`保留追加历史,跟进人取登录主体;允许没有入仓计划、约号、车辆时保存。提柜联系与码头申请按稳定柜次共享,接仓联系按柜次及实际接仓点共享,FBA联系按ORDER/BOOKING货源及客户保存;各事项独立,不推进正式确认或作业状态。 |
| 预约覆盖 | `AppointmentCoverageService.query`按稳定来源及客户批量读取FBA预约,数量核对未覆盖、部分覆盖、待确认、已确认和待复核。外接货尚无订单但已保存安排时返回待确认及资料缺项,不返回假确认。正式确认号、地点时区和已核实来源版本分别读取;来源版本变化仅提示复核,不声称已完成精确船期影响分析。仓储转运的目的地与货件资料以转运主记录为准,缺少资料与实际目的地变化分开表达。 |
| 运输和容量 | 车次、正式排车关联、容量、余位及发布由Fleet维护。预约侧读取其真实结果,不以联系记录生成库存、托盘、车次或容量,也不在前端扣减余位。 |
HTTP入口为`/api/platform/v1/last-leg/appointment-planning`,包括`GET /cargo`、`GET /sources/resolve`及`GET/POST /sources/{sourceKey}/follow-ups`;请求和响应定义见[预约筹划OpenAPI](../../baiyue-firstleg/lastleg-service/src/main/resources/openapi/appointment-planning-v1.yaml)。深链进入预约页时须由后端重新核对客户、来源与目的仓,不能信任URL赋予资格。读取同时要求`platform:appointment:list`与`platform:overseas-warehouse:last-mile-order:list`,追加跟进另需`platform:appointment:followup`;仅平台主体可用,客户端不暴露跨客户货源。
整柜入口为`GET /containers`、`GET /containers/{containerId}`与`GET/POST /containers/{containerId}/follow-ups`,沿用上述权限。未传`warehouseId`记录整柜提柜或码头联系,传入时仅记录该柜实际接仓点的接仓联系。共享来源键由服务端生成`CONTAINER:<柜次>`或`CONTAINER:<柜次>:WAREHOUSE:<仓库>`,技术平台作用域不接收客户端客户参数,也不在界面展示内部键。原货源写入口仅接受FBA联系,不能逐客户重复登记整柜事项。
整柜列表读取实际已开船且仍有效的头程货物,覆盖美国接仓点的各种目的地类型;不要求先建入仓计划。关键词命中某票后仍统计同柜全部美国范围货物,接仓点一次批量分组加载。任一票箱数未知则汇总箱数显示待核实;同柜另有未知或非美国接仓点时明确标记范围不完整并禁止新联系记录。来源预计到港仍是订单快照,不能当作实时船期或预约确认。已有联系历史在来源离开活动列表后保留可读。
跟进写入携带事项版本和持久化幂等键。同键、同操作者、同内容重试返回原记录;异内容或不同版本冲突拒绝,未知结果重试保持原请求。跟进保存成功不代表预约申请或确认成功。仓库目录失败必须报错;日历某来源失败时保留其他来源结果并标注统计不完整。
跨客户合批核对入口为`POST /batches/preview`,读取权限与来源查询相同,单批最多100票。服务端批量核对ORDER/BOOKING来源、客户归属及真实订单,拒绝重复别名、不同起运仓/目的FBA仓、暂扣、多目的地及已有有效预约;未知箱数保留缺项。`POST /appointments`重新核对后保存同一FBA预约聚合,另需既有FBA预约写权限;`GET /appointments/unscheduled`按预约列表权限分页读取无日期安排。允许未建计划及已确认承运但尚未来货的真实来源,不能信任浏览器预览作为写入依据。两种创建入口均自动提交选择时的接仓点和目的FBA仓,服务端在锁定货源后与当前事实比对;任一变化返回冲突并要求重新核对,不静默改约至新仓,也不增加人工填写字段。备妥窗口无权威依据时明确待核实,不能用预计到港或到仓替代。部署与真实验收状态见环境主契约。
已确认承运的外接货从原登记深链或`GET /external-candidates`服务端分页列表进入,必须经服务端核对后才能加入既有预约合批工作区;使用同一预览/创建接口,与同起运仓、同目的FBA仓的头程货共同保存,保留原BOOKING键,不生成ORDER别名。来源已有有效预约时不再提供新增入口;未形成入仓码或箱数未知仍可保存待确认安排,正式确认继续核验资料。
外接候选由Fleet只读适配器按原登记分页发现,限已确认承运/已实收/已绑定、车次未取消或完成、权威启用美国接仓点和FBA目的仓范围;支持登记号、车次号、客户名称及来货号检索,每页最多100票。预约侧对当页来源和覆盖批量核实,保留客户归属、原登记、真实订单关联及未知箱数;目录失败显式报错。Admin仅打开外接货源列表时请求,切换头程/外接保留同一合批选择,保存后刷新覆盖。它不提供承运确认、车次容量或发布写入。
共同样例:两柜头程货送同一美国接仓点再送ONT8,提柜分别按两柜联系,FBA货源保留各票ORDER来源;同一车次接入外部登记B-1时保留BOOKING:B-1。B-1确认承运但尚未来货时可以跟进和保存安排,不伪造入仓码或对方确认;实际来货在原登记行锁和同一事务内,将已有有效预约明细关联到真实订单及入仓码,继续通过同一BOOKING键读取覆盖;关联失败则来货事务一起回滚。该关联不自动改写预约数量快照、确认时间或来源版本,也不扫描补填历史记录。预约保存按登记号和订单号的稳定顺序锁定货源,并在订单锁定后清除查询缓存、重新核对来源,防止使用锁定前的旧事实。客户不符、目的仓变化、重复别名或已取消承运均不能借用其他货物的预约结果。跨来源筹划、正式确认和变化处理遵循总体方案,读取或核对成功不能代替保存和正式确认成功。
| 业务域 | 能力范围 | 原型入口 |
|---|---|---|
| 海外仓 | 尾程订单、入库单、换标单、托盘管理、库存管理;箱号管理与产品库当前暂不进入海外仓业务正式入口;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/` |
| 海外仓排车与智能预排 | 平台查看排车列表/详情,按入仓计划或已收托盘创建预排,并完成编辑、取消、拣货、出库、发车和转派送 | 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/` |
| 海外仓 PDA 柜号签收与退货入库 | 独立应用 `../../apps/pda-overseas-uniapp/`;拆柜收货完成柜号认领、三类照片、按目的类型实收与全柜完成;退货入库支持扫描退货单号或 SKU 候选并按本包实收生成退货箱和计费批次,签收后可按同客户退货单合箱 | 拆柜前端 `src/api/inbound.js`、`receiving-adapter.js`、`pages/operation/operation.vue`;退货前端 `src/api/return-receipt.js`、`src/api/return-packing.js`、`pages/return-receipt/return-receipt.vue`、`pages/return-packing/return-packing.vue`;Backend 分别为 `inboundplan/pda/` 与 `returnreceipt/controller/PdaReturnReceiptController.java`、`PdaReturnInventoryController.java`,经统一 `gateway/` |
| 海外仓 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` |
| 车辆管理、司机资质与保养加油 | 业务范围见[车辆管理原型梳理与任务规划](车辆管理原型梳理与任务规划.md);后端 `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/fleet/`,OpenAPI `fleet-drivers-v1.yaml`、`fleet-trips-v1.yaml`、`fleet-vehicle-records-v1.yaml`;证照和运维照片复用 File | Admin 接入目录 `../../apps/admin-web/src/modules/overseas-master-data/`;原型来源和页面 ID 按规划第 1、2 节定位 |
| 自有业务运营视图 | [自有业务首版开发契约](自有业务首版开发契约.md)、[后端接口设计](自有业务后端接口设计.md) | Admin海外通用资料模块;Lastleg `fleet/ownedbusiness/`,原排车为主事实,File分类契约 `fleet-owned-business-photos-v1.yaml` |
| 外配业务运营视图 | [外配业务首版开发契约](外配业务首版开发契约.md) | Admin海外通用资料模块;Lastleg `fleet/outsourcedbusiness/`,复用原排车事实和附加运营记录 |
| 内部拼车需求池 | [内部拼车需求池首版开发契约](内部拼车需求池首版开发契约.md):车次余位发布、销售意向、确认占位、本土订单关联及统一我仓上车 | 复用上述车辆管理及本土业务入口;不开放客户端运力市场 |
| 国内出仓后船节点 | 对已确认离开国内仓库的订舱/柜次定时查询船节点,保存最新节点、异常和查询历史,贯通目的港提柜至还柜事实 | 标准语义见[船节点标准化契约](船节点标准化契约.md);Admin `../../apps/admin-web/src/modules/port-schedules/`、`ocean-bookings/` 及货柜详情;Backend `../../baiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/portschedule/`、`../../baiyue-firstleg/integration-service/` |
## 原型页面定向索引
原型本地完整入口为 `../悦/货代SAAS平台后台/index.html`。页面任务优先读取下列命中模块和页面 ID,不先加载完整原型。
### 海外仓
- 尾程订单:`last-mile-orders`、`last-mile-order-detail`。
- 入库单:`fba-inbound-order`、`fba-inbound-order-detail`;入库和退货入库相关库存视图按任务联查 `overseas-inbound`、`fba-return-inbound`。
- 换标单:`fba-relabel-order`、`fba-relabel-order-detail`;换标库存视图按任务联查 `overseas-relabel`、`fba-return-relabel`。
- 托盘管理:`fba-pallet`、`fba-pallet-detail`。
- 箱号管理:`fba-carton`、`fba-carton-detail` 当前暂缓,不注册正式菜单和路由。
- 产品库:`fba-product`、`fba-product-detail` 当前暂缓,不注册正式菜单和路由。
- 库存管理:`fba-stock-management`、`overseas-location`、`inventory-overview`、`warehouse-stock`、`overseas-stock`、`warehouse-stock-detail`、`inventory-transactions`、`purchase-stock`、`purchase-stock-detail`、`fba-return-stock`。
### 海外业务
- 采购订单:`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-*` 页面不是海外仓业务默认入口;只有实际流程明确复用时才联查。
### 仓库与通用资料
- 海外仓合作仓:优先核对 `gen-partner-warehouse`,并同步核对现有平台仓库类型、接口和初始化 SQL。
- 海外仓报价:`gen-overseas-quote`;涉及车队报价时再联查 `delivery-fleet-quote`。
- 汇率管理:`gen-exchange-rate`。
- 车辆列表与详情:`vehicle`、`vehicle-detail`。
## 终端与模块边界
- 海外仓出库、派送、异常退回和一件代发已经纳入全流程,不再作为海外入仓之后的独立开发批次。
- 派送业务由 Admin/Client 承载,不进入海外 PDA;海外 PDA 负责现场入仓、托盘、排车拣货和出库等已注册作业。
- 箱号和产品信息作为入仓、库存、箱唛及 SKU 快照的一部分使用;是否提供独立维护页面由正式路由决定,不影响全流程状态推进。
- 高级 BI、开放平台和独立移动 APP 属于独立产品能力,不与现有业务全流程完成状态混为一谈。
## 船节点定时查询边界
- 所有供应商统一节点、时间语义、异常事实、停止规则和新增船司接入门禁以[船节点标准化契约](船节点标准化契约.md)为准;供应商缺失的节点保持缺失,不推测补齐。
- 现有 `CarrierScheduleQuery` 查询任务及其查询尝试、历史、来源、过期标识和频率约束整体重新归入海外仓业务;不再把它列作国内货柜履约港务/船期查询能力,也不得另建一套重复任务。
- 定时查询对象必须关联真实订舱、柜次以及可用的船司/船名航次或跟踪标识,不建立脱离业务单据的孤立轮询任务。
- Firstleg `portschedule/` 负责任务编排、业务关联、最新节点、节点历史、幂等和停止条件;`integration-service/` 只负责船司或轨迹供应商适配、限流、超时、重试和错误归一化,不保存业务主数据。
- 查询从确认柜子离开国内仓库后开始,贯通目的港到达、卸船、清关、提柜和还柜事实,默认在实际 `EMPTY_RETURNED` 后停止;这只扩展货柜轨迹事实,不纳入海外派送、海外仓出库或库存离仓业务。失败不能伪造成功节点,需保留来源、观测时间、最近成功时间和失败原因。
- 现有“每 3 天一次、窗口最多 3 次”、六家船公司来源、最近有效结果和过期标识是同一查询能力的既有约束,归海外仓业务继续核对;后续若调整自动轮询频率、供应商额度、退避或停止规则,应只修改海外仓业务契约和这套任务。
- 当前原型没有独立的“船节点定时查询”页面;涉及页面展示时从订舱、船期或货柜详情进入,不得为了匹配原型菜单把它归入海外派送。
## 本土卡车与散板统一前端下单
- 同一业务在 Admin 新增/编辑和 Client 下单使用一致的字段、顺序、控件、默认值、校验及提交转换;Admin 新增额外选择客户,编辑固定原订单客户;Client 的客户仅由登录会话确定,业务请求体不携带客户标识。
- 业务表单统一为运输信息、货物信息、费用与时效和备注。起运地/目的地、两端联系人、电话及详细地址左右对应;件数、预计托数、重量和体积默认零,预算默认为空、币种 USD,空预算和零预算分别保留。车辆只在卡车填写,商品与预计托数只在散板填写。
- 两端统一使用数字控件和 USD/CNY 选择;重量支持三位小数、体积六位小数、预算两位小数;取送时间按当地分钟输入并提交秒为零的值,不进行时区转换。四项联系信息及两个时间均必填,送货不能早于取货。
- 各应用内部由 `TransportDemandForm.vue` 和 `transportDemandForm.ts` 复用表单、校验与业务请求转换;两端对应源码按同一内容核对,不建立跨应用目录依赖。创建保留稳定幂等键;平台编辑保留客户、业务单号和版本,受状态及只读承运来源限制。
## 本土散板简化下单
- 平台代客创建必须显式选择客户;客户端客户范围只取认证会话。新增、编辑保持现有独立页面;平台普通编辑仍只允许待接单且非拼车来源订单,池来源继续只读展示真实承运安排。
- 下单移除运输方式及柜型字段,不再要求选择自送或我司提货。拼车或优先拼载属于内部安排,不再冒充交货方式或作为下单必填项;运输类型和是否打盘不在新增主表单要求填写,未知安排保持空,不自动补造。散板移除柜型字段。
- 需求保存取货地、目的地、可选详细地址补充、起运地联系人及联系电话、目的地联系人及联系电话、商品名称、预计托数、件数、总重量、总体积、预算总价、币种、取货与送达时间和备注。商品名称、预算和备注选填;四项联系人信息与取货、送货时间全部必填;预计托数、件数及重量体积可为零,不能为负。件数、地址补充和备注按统一前端下单表单展开填写。
- `estimatedPalletCount` 是下单预计托数;`packageCount` 是件数,二者独立。下单不生成实物托盘,不把预计托数写成实际收货或实占托位;拼车来源沿真实询价的货名与预计托数保存。
- `pickupAt` 与 `deliveryAt` 保存不带时区的当地日期时间,按分钟输入、原值显示,不进行 UTC 转换。取货与送货时间均必填;送货时间不能早于取货时间。预算明确显示 USD 或 CNY,金额空值与零值区分。
- 平台和客户接口共用 Lastleg `looseboard/dto/LocalLooseboardRequests.java`、`LocalLooseboardResponses.java` 及 `overseas-business-v1.yaml`,不保留旧运输枚举或要求日期别名。现有 API 路径与权限复用,空库结构同步模块基线及海外统一初始化,不回填测试存量,不自动执行 SQL 或部署。
## 美国本土卡独立下单
- 客户端和平台新增/编辑共用同一服务端需求合同:移除运输类型、柜型、下单预报托盘数及原要求时间;车辆类型为必选的“15拖”(`PALLET_15`)或“30拖”(`PALLET_30`)。车辆主档仍独立维护实际容量,车型不等于本票货量。
- 起运地联系人、起运地联系电话、目的地联系人、目的地联系电话、取货时间和送货时间全部必填。时间按日期及小时分钟填写,不进行时区转换;送货不能早于取货。列表、详情与平台编辑展示同一份保存值,客户端不提交客户标识。
- 独立下单不生成预报托盘,首次实际收货确定确认托数;已有拼车来源的真实预报及实际履约继续独立记录。拼车来源未提供的车型、目的地联系人/电话、送货时间保持未知,页面显示“—”,不捏造数据。美本土散板按本文“本土散板简化下单”使用独立需求合同。
- 接口及字段唯一实现合同为 Lastleg `trucking/dto/UsTruckOrderRequests.java`、`UsTruckOrderResponses.java` 与 `src/main/resources/openapi/overseas-business-v1.yaml`;数据结构同步模块基线及海外统一空库初始化。页面承载核对见 Client `cross-border/PROTOTYPE_MATRIX.md` 和 Admin `overseas-business/PROTOTYPE_MATRIX.md`。
## 系统边界与索引维护
- 托盘管理的单张标签 PDF 从 Admin `PalletsView.vue` → `warehouse-overseas-service` 的 `GET /api/platform/v1/warehouse-admin/{warehouseId}/pallets/{id}/label` 进入,只按真实托盘编码打印,不重新生成编号。纸张、方向和模板字段只查[打印标签当前入口](../打印标签维护/README.md)的对应类型;服务接入与权限见海外资源服务 `AGENTS.md`,不在本文复制模板常量或尺寸。
- 海外仓合作仓是现有头程仓库主数据的类型扩展,需同步核对 Admin `warehouses`、Warehouse Service 的 DTO/Controller/OpenAPI/SQL 及实际消费者;不得因此把海外库存业务写入国内 Warehouse Service。
- 海外库存、库内作业和海外本土业务已有明确服务入口:`gateway/` 是统一 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` 服务端聚合全柜订单、入仓码、计划数、未操作数和 `allPlansReady`,分页返回全部稳定来源柜,已生成计划的柜仍保留供接柜仓查询与修改;`pendingPlanCount` 区分待建计划,`resourcePendingPlanCount` 区分托盘资源待生成,后者仅用于自动生成异常后的重试;详情 `/{sourceContainerBookingId}` 返回柜内全部订单与计划且不受订单分页截断。`plannedArrivalAt` 只来自装柜完成事件 `estimatedWarehouseArrivalAt` 冻结到 Lastleg `ll_order.estimated_warehouse_at` 的计划到仓事实,不得使用创建时间、预计到港或当前时间替代,并按该时间升序、空值最后排序。确认后调用 `POST /api/platform/v1/last-leg/inbound-plans/convert-container`;服务端一次锁定整柜、每票独立生成一个计划,整批原子且幂等。转换成功才将尾程订单推进为 `INBOUND_PLANNED`,并把库存余额的来源入仓码展示快照替换为各自 `planNo`。
- 尾程订单的 `inboundCode` 只保存并展示真实来源入仓码;换标申请、本土散板等没有入仓关系的海外本土业务保持为空,由页面显示 `—`,不得用换标单号、本土散板单号或内部 ID 冒充入仓码。
- 平台可按单票尾程订单入库计划(托数、托盘类型、分配/可合托/加急和备注);入库仓、入仓码和预计到仓时间均展示冻结事实,不允许人工改写。预计到仓日期由服务端锁定来源柜全部订单的 `estimated_warehouse_at`,缺失或同柜不一致时阻断,人工与自动计划统一写入该柜日期。写入时校验订单版本、客户归属、仓库主档和幂等键;一票柜保存后立即自动生成并绑定托盘码、海外仓托盘和资源锁,多票柜在最后一票计划齐全时自动为全柜完成同一动作。`resourcePendingPlanCount` 只用于自动生成失败后的显式重试,不是正常人工步骤。分配、可合托、加急必须随入库单列表和海外 PDA 入仓码作业返回并展示,其中“可合托”只向现场提供选择:合托时扫描同目的仓已使用的托盘码,独立收货时扫描新托盘码,不作为实收或完成门禁。新增暂扣只允许货物完成入库后执行;暂扣只作用于该票并仅阻断排车和出库,不阻断入库计划或入库作业,同柜其他订单不受影响。
- 头程散货在预装确认且真实集装箱号就绪后,按 `集装箱号-FBA仓编码-三位序号` 冻结托盘码;序号在当前柜、当前 FBA 仓内从 001 独立递增。送柜报关、清关提柜和预装清单共用同一按 FBA 仓分组的打印清单,可整柜打印或选择单仓前 N 张补打。该编号随装柜完成事件进入海外,生成入库计划与海外实体托盘时原样沿用;一件代发继续使用国内装箱打托形成的托盘号,不参与散货重新编号。
- 头程与海外仓允许装托密度不同。尾程最终托数取不低于头程已有托盘码数的海外计划结果:头程已有编码全部保留,数量不足时在同柜、同 FBA 内按连续下标补码,不因数量差异阻断。柜级预览必须分别返回并展示头程已有、海外仓补充和最终托数;最终总数不得标成“本次新增”。
- 尾程订单人工节点固定为国内报关完成、预计/实际开船、预计到港、国外清关完成、实际到港等待卸船、预约提柜和卸柜八行完整快照。第一次保存后该订单永久使用 `MANUAL` 来源,读取和页面展示不得再回退柜级节点,也不得反向修改货柜船节点。
- 目的港码头拖车仍归 Firstleg 货柜聚合,但 Admin 清关提柜列表不再使用预约/实际提柜作为到仓业务时间:原两列改为“预计到仓/实际到仓”。未人工维护且未建入库计划时,预计到仓按[预约日历统一日期规则](预约工作日历V13变更说明.md#2026-10-19-当前预约列表收敛规则)展示到港日期加两个自然日的默认值,列表与详情一致且不自动写入。人工调整在列表内选择日期时间并由 Lastleg 按 `sourceContainerBookingId` 原子同步整柜尾程订单,已有入库计划后锁定;实际到仓只取海外 PDA 首次开始收货的 `ll_receiving_container_session.receiving_at`。车队、邮件、还柜及 `unloadingCompletedAt + 72h` 还空预警仍按原码头拖车链路处理。
- 手动还柜以真实海外卸柜完成且尚未还柜为准,仍校验独立还柜权限;无需事先存在车队、预约或提柜时间。首次命令使用版本 0 创建拖车记录,车队字段可为空,不补造提柜事实。还柜时间不得早于卸柜完成时间或已有提柜时间,成功后同步标准还柜节点并解除报空预警。
- 船节点是头程海运在途事实与海外接柜之间的衔接能力,业务聚合继续由 Firstleg 按 `containerBookingId` 柜级持有,不绑定客户;跨区域事件使用 `tenantId=0` 平台技术范围,到港/可提柜结果通过明确契约提供给海外区域,不复制第二套轮询任务。
- Admin、Client 及海外 PDA 按当前统一 Gateway、Auth 会话与可靠直接投递契约接入;不沿用旧双区域 API 或独立海外 Token,业务页面不自行实现第二套登录。
- 海外仓 PDA 使用独立 `apps/pda-overseas-uniapp/` 工程和发布身份,但账号仍由国内 Auth 唯一签发;真实作业请求必须经统一 Gateway 的显式 PDA 路由。工作台只展示已注册并启用的现场作业,其他业务通过 Admin/Client 完成,不以某个终端是否承载全部操作判断端到端流程是否完成。
- 海外 PDA 的实际收货仓是国内 `warehouse-service` 中 `tenant_id=0`、类型为 `OVERSEAS`、状态 `ACTIVE` 且启用 `RECEIVING` 能力的平台共享物理仓,并由当前海外 PDA 作业账号的仓绑定固定,角色与会话字段以统一认证契约为准;海外数据库只保存相同 `warehouseId` 引用。PDA 不接收仓库 ID,也不能切换柜号。统一 Gateway 对每个 `/api/pda/**` 请求在本地验签后向 Auth 实时核对账号 `token_version` 与当前仓绑定,换仓或清空绑定后旧 Token 立即失效,Auth 不可用时拒绝请求。待收柜在首次准备时原子认领到该仓,入仓计划、尾程订单和收货会话冻结实际仓 ID/名称;国内装柜事件的仓库仅作为来源仓快照,目的仓/FBA 仓也不得冒充实际收货仓。
- 海外 PDA 接柜候选、认领会话、国内五类装柜照片对照、海外三类签收照片与整柜完成均按 `sourceContainerBookingId + containerNo` 聚合,不保存客户并允许同柜多个客户。国内照片在签收阶段展开、收货阶段折叠,只读加载失败不阻断拆柜。签收后为柜内每个计划按其自身客户生成任务;入仓码解析、SKU 实收、托盘占用和库存入账继续按该票真实客户隔离,整柜完成需全部计划核平且只发布一次柜级完成事件。
- 业务规则只改本主题正文或相应正式契约;仅代码入口、职责或路径变化时更新实际受影响的索引与最近指引,不批量同步所有层级。不把排期、完成比例或临时任务状态写入快速索引。
## 码头车队邮件
首次选择车队后从清关提柜列表发送请求,更换车队时原子保存原车队取消和新车队提柜两封邮件;同一车队重复选择不发信。邮箱读取供应商资料,缺失或无效时阻断发送或换队。邮件顺序投递,失败待人工核对后重试。接口、临时模板和启用方式见 [Firstleg 车队邮件说明](../../baiyue-firstleg/firstleg/docs/terminal-drayage-mail.md)。
@@ -4,6 +4,16 @@
## 1. 目标与首版范围
### 当前页面范围(2026-10-21)
用户确认「海外业务 → 散板需求」当前仅作为平台内部的排车余位需求池,人工联系、下单,不向客户公开运力市场。2026-10-22 简化智能排车:搜索区仅提供默认不勾选的“发布公共需求”,统一应用于本次生成的所有排车单,每车独立保存;移除下方计划时间与备注填写区,需求时间直接使用关联排车的计划发车时间,时间和备注沿用“维护车辆信息”维护。2026-10-23 收敛为仅在“智能排车”建单时选择发布,默认不勾选;排车列表和入库单复用同一智能排车弹窗。维护车辆不再提供发布、取消发布或恢复发布,编辑命令不接收发布字段;预约工作日历创建排车不自动发布,服务端新建缺省也不发布。需要重发时,按原取消门禁取消当前排车,再通过智能排车重新创建并勾选发布。发布选择与新建命令同事务保存,沿用原权限和幂等键。
数据源直接来自当前排车主单,不再依赖旧车次的人工余位发布记录,也不创建另一份车次、发布单或占位。仅勾选发布、ACTIVE、DELIVERY、未实际发车且处于装车前/装车中/装车后的排车进入列表;取消排车、实际发车/进入派送中或任一已知容量维度满载时自动退出。取货和本土卡车排车不参与。查询复用实时排车快照,按本车业务号一行展示,不返回客户货物、司机私人信息或内部ID。
车辆容量与已排实托数分别展示,不将实托数等同标准托位。可靠装载确认存在时,用去重实托的标准托位、重量和体积计算起运段可再接的余量;首版均从我仓上车,沿途只卸货。任一已知维度已满即退出;缺少可靠装载/容量资料时保留需求并明确“余位待确认”,不填零、不按车型名称或默认30托推算。不存在可公开的调度联系方式时,不以司机电话替代。新列表仅读取运输和容量摘要,不开放详情跳入旧车次、登记、确认承运、来货、核量或排入本车等操作。
原需求池与后续拼车实现保留,不增加开放登记的功能开关、不删除组件或业务处理代码。客户本土散板下单入口保持独立;下文完整拼车流程描述保留能力,不能据此认为当前页面已开放。新增发布字段、读接口与页面的代码完成不等于已执行SQL、已部署或已通过真实环境验收。
### 2026年10月9日操作简化开发定稿与预约交接
本次已收到开始开发指令,采用《拼车数据入口与操作简化评估草案》第七、八节的完整范围:已有车次接货,分阶段登记、服务端缺项及角色提示、原登记连续履约、合格排车候选、共用车次准备与实收排入。保留直接外接预订来源,不新增独立待配货池、虚拟运力或跨车改配。本文记录规则,发布与实际验收继续归环境主契约。
@@ -0,0 +1,39 @@
# 外配任务开发契约
## 已确认业务边界(2026-10-21更新)
本页是原排车装车后实际接入拼车货物的运营视图,与自有业务按是否实际拼车区分,不按车辆归属区分。仅显示 ACTIVE 且 AFTER_LOADING、DELIVERING、DELIVERED 的原排车,一单一行,多个目的地、预约在行内展开。自有车辆、档案外配车辆、临时外配车辆均可进入;车辆信息继续读取原装车证据,不在GET回填旧样本。原排车四页签及履约流程不变。
实际拼车判定复用原关系:`ll_fleet_external_booking.offer_id`非空、状态BOUND、有实收确认,且trip_id/dispatch_no指向本车;来货客户和入仓来源须在本车真实计划托盘组成中,实托已关联且货物箱数为正。只发布余位、询价、确认占位、未排入的实收、已取消或移出本车的货物不计;非需求池来源的普通外接登记和多客户同车本身也不计。用EXISTS判断,至少一票即整车归入外配任务,多票不得重复计数。自有入口使用相同条件的否定;列表、全量统计、详情和运营操作保持一致。装车后货物不能普通增删,已绑定预订不能普通取消;复用这些现行门禁及关联事实,不新增分类持久化或回填链路。
用户本轮明确批准:后台登记整车承运金额,单价为金额除以实际物理托数;保留逐目的仓实际到达时间和五个装车照片位,省略实际里程、油耗与两个油耗照片位。不实现原型的自有货/外接货拆分成本或自动分摊、应付/支付;不增加报价、派单、改派或异常状态机。异常仍按已确认的线下处理规则。
沿自有业务已确认的计划发车日期筛选、完整筛选统计、三阶段、物理托盘去重、币种 CNY/USD 显式选择、金额零值与空值区分、两位单价及版本/原键恢复约束。承运商、车牌、司机电话来自原资源快照;临时外配 vehicleId 为空合法,缺承运商显示“—”,不猜当前档案。装车及运营信息不推定真实签收。
## 共同接口与承载
- API 前缀 `/api/platform/v1/last-leg/fleet/outsourced-business`;前端路由 `/overseas-master-data/outsourced-business` 和 `/:dispatchNo`;权限 `platform:fleet:outsourced-business:list/edit/upload`,查看含详情、历史及已授权照片读取。原权限与客户隔离不放宽,外配权限不能调用自有 API,反之亦然。
- list/detail/history/operations/photos/commands 八类路径及请求方法沿自有业务结构;查询字段与同筛选四项统计相同,不拿当前页算总数。公开标识只用 dispatchNo,后台权威金额与托数计算,不逐行 GET。
- 外配 DTO 单独明确表达精简字段:`operations={money,arrivals}`,无实际里程/油耗;`vehicle={vehicleId,plate,ownership,carrierName}`,vehicleId 可空;`photoSummary={loadingCount}`。其他 Row/Detail/History/Command 字段及版本语义沿已确认自有合同,附加与原主单版本独立。后台拒绝本域不支持的油耗写入/照片槽,不能仅前端隐藏。
- 五框枚举为 LOADING_SCENE、LOADING_LIST、PRE_DEPARTURE_CHECK、DRIVER_LICENSE、RECEIPT;复用已经发布的原排车装车照片 File 分类,不新增 File 分类。上传与绑定分开,multipart 内 file/idempotencyKey,未知停写、绑定失败复用原 fileId 与原键。
- 详情三个彩色图标页签:任务与车辆信息、路线货物与凭证、操作记录。运营登记和照片居中弹窗沿现有组件规范;照片只有装车五框。列表操作列第一列;缺值明确“—”,无 GPS/ETA 样例。
- 复用四张附加表及原装车捕获;服务端按实际拼车分类与可信入口限定业务访问,原车辆冻结证据只保证真实车辆信息。vehicle.ownership允许OWNED/DISPATCHED,不能固定返回DISPATCHED。本次不扩展两页运营表单及照片槽,本域不新增业务表、不改原主单/库存/财务。
## 本批职责与验证
总控为当前 TEST 对话 `01a15230-a9d6-7503-a8a9-d70691df49e5`,工作区保持 `C:/Users/BY-OY/Desktop/code/chongchong-global`。复用用户明确指定的三个独立对话,不创建新对话。
- 排车派送与费用后端 `01a1524f-56a9-7320-a5fd-8ff76fa4356b`:外配后端唯一实现者;可写 `fleet/outsourcedbusiness/`、直接测试和本域独立 OpenAPI;为复用原附加记录,允许定点调整 `fleet/ownedbusiness/` 的公共内部作用域/查询/命令服务及其直接测试,保留自有公开合同和已有行为。不得写 dispatch 主流程、File、IAM、共享 SQL、导航或其他后端域;共享触点交根。先返回计划改动路径和共同 DTO 确认,再按本契约实现。
- 排车前端与 PDA `01a1524f-52c7-7cc3-9b08-d34ad24c172a`:外配 Admin 页面、组件、类型、API 及直接测试;不得改自有在途生产组件或共享导航/路由/权限。先做显示与交互,再按后端真实合同接线,禁止 Mock/Fixture 进入实际页面。
- 排车后端 `01a1524f-4f11-70c2-8a46-8e06e73a2d86`:本批转为自有发布候选及 HTTP 验收专项;共享环境只在根明确交接执行窗口后写入,不与根同时发布或造数。
- 根唯一维护公共契约、导航/根路由/权限/SQL/API 门禁、发布和集成;自有固定发布对象 `7c6a3af473e892a7e244ddc0b88cf00ca5708a7d` 与后续外配源码分开核实,不夹带在途外配进入本次自有发布。
测试经 local-check,先受影响回归、同批统一门禁;同时覆盖自有不回归、两类外配身份、缺快照、三个阶段、多客户同托、多目的地、完整过滤统计、金额清空/零值/两位单价、到达、五图历史/授权/幂等,以及油耗写入拒绝。实现完成、检查通过、TEST 发布、真实 HTTP 与1920×1080、100%人工页面验收分别记录;下节记录已交付的实现与验证,最新运行及HTTP事实只查部署主契约,不将准备阶段状态当作当前状态。
## 本轮实现、验证与执行交接
首版已交付:前端19个新文件,摘要`e33793d079d06010a8c221eaebb337424988489ce77ea14b0f3a60aa89c1efa2`;后端14文件,包含三外配生产类、内部固定作用域复用、独立OpenAPI及14个新增测试。根首次编译发现限定泛型的类型注解问题,已改为显式导入Arrival后复验。联合Maven82项全部通过,覆盖原自有35、scope10、外配合同4、原装车24及读适配/Mapper/schema门禁;IAM权限种子4项、Gateway/依赖联合34项通过,八公开路径及56条引用可解析,AGENTS索引1229项通过。
前端36项定向、默认资源类型检查与构建通过。完整Admin461文件4144项中4094通过、50失败,来自其他在途客户选择器改造的三份OceanBooking/GlobalSmartLoading测试,本域及导航路由没有失败。不修改或发布这些在途文件,不标记完整全绿。外配最小24路径及23项直接依赖已与实际Admin#661一致核对,用户批准固定Admin`3f4021c0ab05b9811bbb193bf47ebb6e9bf4c5db`、Lastleg`9f3755f8e246f763054d1048e58ef52f7e0fca39`发布和三权限最小SQL;不新增表或重置数据。真实发布与HTTP结果唯一维护在部署主契约。
用户进一步要求发布和联调也分配三个对话:56执行已授权IAM及Lastleg,52独立审IAM后执行Admin,4f在根交接环境窗口后执行自有/外配真实HTTP;根停止环境写操作,维护门禁、回执核对及调度。各任务修改新独占一次性发布/验收驱动,不相互覆盖根已冻结的驱动和原人工样本;未知写必须按原意图核对,不能自动重试。
@@ -61,7 +61,7 @@
| 页签(建议图标) | 固定字段/列顺序 | 现有来源与缺口 | 消费要求 |
| --- | --- | --- | --- |
| 车辆信息 `🚚` | 车牌号、司机、联系电话、拖车公司名称、车辆状态 | `DispatchSummaryDto.vehiclePlate/driverName/driverPhone/carrierName/status`;当前 `status` 是排车状态,是否作为车辆显示状态须明确 | 返回主档或临时外配的真实显示快照和明确车辆状态文案;紧凑白底4–6组短字段,长车队名跨列。不拿内部主档ID或“待分配”示例代替缺失值。 |
| 排车信息 `📋` | 路线、发车时间、预计到达时间、FBA预约、车辆预约 | 已有route/departAt/estimatedArrivalAt/fbaAppointmentStatus/vehicleAppointmentStatus;整车多目的仓只有一个预约号/状态不足 | 路线由货物目的地真实事实生成,不手输演示“30托盘”;发车只显示实际时间。多目的仓预约需真实逐目的仓/批次事实或服务端明确整车摘要,不能显示一个仓已约即全车已约;冻结精确展示。 |
| 排车信息 `📋` | 路线、发车时间、预计到达时间、FBA预约 | 当前原生dispatchInfo提供路线、实际发车和逐批FBA预约;车辆预约字段及关联已按用户最新裁定移除 | 路线由货物目的地真实事实生成,不手输演示“30托盘”;发车只显示实际时间。多目的仓FBA预约按真实逐目的仓/批次事实展示,不能显示一个仓已约即全车已约。 |
| 单据信息 `📝` | 排车单号、关联派送单、创建时间、更新时间、备注 | `DispatchDetailView.vue:93–101` 使用orderNos且缺updatedAt/remark;现有 `TransferDeliveryItem` 不含客户归属,详情没有deliveries | 返回所有真实派送业务号、对应客户+目的仓及状态供关联;多单号完整换行/明确链接,读取目标仍受各自权限;创建/更新时间与备注从服务端返回。关联订单不能代替关联派送单。 |
| 关联订单明细 `📦` | 订单号、重量kg、托数、目的FBA仓、体积m³、集装箱号 | `DispatchItemDto` 无客户/containerNo,只有托级weight/volume及orderRefs;现有多订单循环重复累加整托载荷,containerNo恒空;bolLines有containerNo但不是订单级汇总映射 | 后端返回有客户归属的订单汇总行或足以准确归属的明细;同托多订单的重量/体积不可由浏览器猜分;未知显示“—”。只读通栏表,不为套规范新增操作列;订单业务号可完整展示,客户身份保留在模型,是否增显示列由总控决定,不自行改变S1六列。 |
@@ -309,7 +309,7 @@
可交总控集成;尚未提交、推送、部署、启动后端、写入测试数据/SQL或执行真实 HTTP。后端真实路由、权限、完整持久化和幂等并发链仍由总控统一验收;Admin/Client 人工1920×1080、100%截图与 PDA 真机扫码/安装仍待确认。本任务自查不冒充独立复核。
## 当前可集成候选:既有批次版本与权限接线(2026-10-19 17:38)
## 历史候选:既有批次版本与权限接线(2026-10-19 17:38,已由下方车辆预约取消候选替代)
按总控本轮精确授权,仅解除原排车模型/API/wire、SmartDialog、Workflow ADD_CARGO和既有Work排车表单对此版本字段的冻结;不触及日历新增预约、planningApi、面板生产逻辑、公共密度、PDA、Java或Maven。修改前已核对公共Java实际签名:DispatchContracts.BatchAllocation(..., Long recordVersion)、BatchReference(..., Long recordVersion)都要求显式非负版本且零合法;BatchReference的自动DISPATCH引用使用其真实主单版本。该文件读取摘要为73b5b83fcd0155bf09b18c18b1bd6a5bbb0175221102a13101248f92ca84f641。预约Provider的Allocation随后也实际增加recordVersion;AppointmentWorkDispatchCandidates第43行已用appointment.version().longValue()返回权威版本,前端不从Result.version、显示约号或默认零补造字段。
@@ -359,3 +359,11 @@ apps/pda-overseas-uniapp/src/stores/fulfillment.js
```
共享提供者仍在途,不能把上述前端离线证据当预约—排车端到端接通:17:38读取的DispatchAggregateService与DispatchDraftService候选构造仍分别在第158/265行传入空appointmentBatches;尤其Smart草稿逐托选择/恢复后需由真实Provider保留引用和版本,前端不能拿旧显示约号或旧候选补造。总控/主后端继续处理实际候选/草稿提供、数据库锁内批次版本、完整持久化和发车复验。尚未提交、推送、部署、执行真实HTTP或写环境数据。新增日历预约及车辆预约权威提供者不在本前端包。
## 当前候选:取消排车车辆预约及完整构建复验(2026-10-19 19:03)
用户最新确认取消排车信息中的车辆预约字段及关联;FBA预约保留,详情仍严格为车辆信息、排车信息、单据信息、关联订单明细四个彩色图标页签。改动为API、模型、详情及直接样例/测试共8文件,精确清单与逐文件SHA在根`.codex-temp/dispatch-remove-vehicle-appointment-20261019.json`。总控已逐项核对8/8无漂移,聚合为`f256c5a71bc67ad146702a28d30d7da0579fc69bb4ea92642c7f47ea44835957`;4文件73项定向测试通过为前端执行证据。
完整类型检查先在2GB下OOM,启用节省内存选项仍OOM,均不计通过。用户随后明确授权本次完整检查临时使用4GB;总控经local-check执行`node --max-old-space-size=4096 --optimize-for-size ./node_modules/vue-tsc/bin/vue-tsc.js --noEmit --pretty false`,实际退出0(工具输出ef45f8)。随后恢复正常2GB限制,单独执行`pnpm exec vite build`,实际退出0,5135模块、Vite4.06s(工具输出79545d)。两步共同证明当前输入的完整类型检查与打包通过,没有排除测试、修改tsconfig或提高后续检查默认内存。上述结果不清除早前全量测试超时,也不代表真实页面、HTTP或PDA硬件验收。
日历新增预约仍归用户指定的其他对话,本批不接管。17:38候选的提供者缺失描述仅表示当时输入,当前公共字段/版本以最新主契约、Java和实际检查为准。
@@ -39,7 +39,7 @@
### 0.1 骨架修订:缺版本、既有预约、实载与草稿
公开已有单/草稿写请求的recordVersion均改为Long并在record紧凑构造器拒绝null/负数,显式0合法;创建主单/草稿没有既有版本。不是仅依赖Controller @Valid或Jackson对primitive的默认0。Update.vehicleAppointment已收敛为`DispatchCommands.AppointmentReference(referenceNo,Long recordVersion)`,没有status/appointmentAt写字段,保存时必须读取权威已有预约并复验版本;读模型仍可显示实际确认状态/时间,本批不新建预约流程。没有关联提供者解锁时该写接线待总控分配,不能拼一个本地确认状态替代。
公开已有单/草稿写请求的recordVersion均改为Long并在record紧凑构造器拒绝null/负数,显式0合法;创建主单/草稿没有既有版本。不是仅依赖Controller @Valid或Jackson对primitive的默认0。按最新用户裁定,排车不保留车辆预约字段、类型或关联;Update和DispatchInfo均无该属性,不输出空占位。FBA预约及真实批次继续按原权威核验,日历新增预约不在本批范围。
新增实际种子及端口见 `DispatchPlanningModels.java/DispatchPlanningPort.java`,源数据生产者已沿原方法核对,前端按下表接入;当前尚无新Controller映射或可调用运行端点,不以端点常量冒充实现。
@@ -121,10 +121,111 @@
同托多来源不能用 `orderNo/orderRefs/inboundCode` 展示快照作为分摊依据。复用 `ll_dispatch_pda_pick_order` 的逐入仓/退回来源和真实箱数,不另造第二套逐箱库存模型;拣货前的容量/预约/候选读取真实库存组成,拣货后派送和费用读取不可变拣货来源。每条 pick 的客户必须等于对应 item 和真实来源客户。普通、退回入仓、`RELABEL`、`RETURN_RELABEL` 四类实际分支均保留;来源阶段不是客户端随意传入的业务状态。
原来源锁 `ll_dispatch_pallet_lock` 保留真实客户与来源;实物托盘的全局唯一占用防止两个来源别名被分配两车,PLAN 与 RECEIVED 不能成为同一实物的两个有效锁。现有 `(customer_id,active_key)` 不足以单独证明实物全局排他,建议增加可空 `active_warehouse_pallet_id` 唯一索引,仍保留来源占用键;取消只释放属于当前主单的活动锁,不碰其他新单占用。
原来源锁 `ll_dispatch_pallet_lock` 保留真实客户与完整逻辑来源键,引用独立物理占用 `ll_dispatch_physical_pallet_lock`。活动实托唯一键只属于物理层;逻辑层不保留 `active_warehouse_pallet_id` 空别名。同一拥有者的多个真实来源可共享一个实托,跨主单、跨草稿容器仍排他。物理拥有者是主单或原草稿容器,不以第一条来源或第一客户代表。释放逻辑来源后,只有本拥有者最后一条活动成员结束才释放物理占用;取消、到期与转换不能触碰后续新拥有者的占用。
#### 2.3.1 同实托多换标来源的共同读取合同
本批支持两张换标单合到同一实托后整托同车。物理托盘、实载重量体积和实际容量只计一次;客户、换标业务号、逻辑箱数、真实扫码与费用归属保留分行。既有整申请全部应排托盘规则保留,因此完整选货集合是“申请包含的全部应排托盘”与“实托包含的全部有效逻辑来源”共同形成的闭包。不得只依据页面当前筛选结果或托盘展示号拼组。
`DispatchPlanningModels` 的冻结参数顺序如下,无旧签名兼容构造器:
```java
SelectionGroup(String groupKey, String groupVersion,
List<SelectionGroupSource> sources, List<SelectionGroupPallet> pallets,
boolean complete, List<String> blockReasons)
SelectionGroupSource(CargoSelection selection, String sourceKey,
String customerId, String customerName, String sourceBusinessType,
String sourceBusinessNo, long packages)
SelectionGroupPallet(Long warehousePalletId, String palletNo,
List<String> sourceKeys, long packageCount)
Candidate(CargoSelection selection, String sourceKey, String sourceVersion,
String customerId, String customerName, String warehouseId, String warehouseCode,
String warehouseName, String orderNo, String inboundCode, String planNo,
String palletNo, String containerNo, Destination destination, long availablePackages,
BigDecimal suggestedWeightKg, BigDecimal suggestedVolumeCbm, String measurementSource,
List<BatchReference> appointmentBatches, List<String> blockReasons,
SelectionGroup selectionGroup)
```
`selectionGroup` 由服务端完整来源事实生成;缺失组、缺少组版本或 `complete=false` 都不构成完整可选证明。组版本绑定全部成员及来源版本、换标完工/确认轮次、实际位置和组成;不得用单条来源版本冒充组版本。页面选择组后,`Create/AddCargo.cargo[]` 仍显式提交组中全部逐来源选择;服务端在锁内重算闭包并核对精确集合。草稿 `DraftSelection.source` 请求形状保持,单次加入/移除命令由服务端原子处理完整组并返回全部成员,不由前端循环单来源命令凑组;容器布局与正式转换不得拆开同一完整组。
草稿解除、释放及纯租约动作使用原冻结实托集合先取得共同串行行,再读取逻辑成员及物理拥有者,避免与到期接管的物理→逻辑顺序交叉。来源事实变旧不妨碍合法拥有者释放原占用;这些动作不新增当前来源资格条件。选货、布局和转换仍先锁完整申请/订单,再取得共同实托锁。
`DispatchViews` 的冻结参数顺序如下:
```java
PdaItem(Long dispatchItemId, String customerId, String customerName, String palletNo,
Destination destination, long scheduledPackages, long pickedPackages,
List<Position> positions, List<ReturnCarton> returnCartons,
String sourceKey, String sourceBusinessType, String sourceBusinessNo)
OrderDetail(String customerId, String customerName, String orderNo, String inboundCode,
BigDecimal grossWeightKg, Integer palletCount, String destinationFbaWarehouse,
BigDecimal volumeCbm, String containerNo, String sourceKey,
String sourceBusinessType, String sourceBusinessNo)
```
来源业务号直接取真实 `sourceBusinessNo`,换标来源为对应换标申请号;普通来源无该业务号时保持空,由页面显示“—”。不得解析 `sourceKey` 或以内部 ID 回退。PDA 保留逐 `dispatchItemId` 的既有 `Pick` 形状,不改为整托一次多写;同托多来源必须辨明逻辑来源,所选位置的额度和不可变拣货归属按本来源核对。`CargoSelection` 形状不变。
`LoadingPreview.pallets` 按实际 `warehousePalletId` 一托一行,计划箱数、已拣箱数为该实托各逻辑来源合计。不得把同一整托重量体积复制给每条逻辑 `CargoLine`;逐来源没有真实测量时保持未知,不按箱数分摊。现有同实托目的地一致、整申请排车、退货箱隔离和重做轮次规则保持,不引入拆托卸货或第五个详情页签。
普通换标贡献须保留逐 `RelabelItem` 的原货源快照与实际绑定位置。`application.lastlegOrderId` 可为独立申请生成的换标履约单,不等于所有原货源订单。工作事实先按申请和 item 聚合再关联,通知箱数不冒充成功箱数,成功/异常结果和新旧箱唛保留。无真实 SKU 件数时不能从箱数推算件数。原生退货继续使用真实退货箱及已有转换事实,不能伪造普通库存位置或收货凭据。
新增物理占用与来源贡献表后,`scripts/fleet-trip-rollback-test-env.mjs` 的全字段数据库基线也是直接消费者,必须纳入新事实后才可继续声称完整回滚;当前已验收脚本版本保持独立冻结,不与来源模型实现同时修改。
PDA 每车一个平台作业 task,删除 task 的 customer 头部;pick 与 pick_order 继续每条真实客户。task 业务号沿正式编号生成器生成,不能继续 `DPDA + 内部ID` 展示。主流程操作/幂等归平台整车,不借客户表承载。
#### 2.3.2 换标贡献提供者的内部Java合同
提供者入口为 `relabel/port/RelabelDispatchSourcePort.java`,实现分别位于 `relabel/service/RelabelDispatchSourceService.java`、`relabel/repository/RelabelDispatchSourceRepository.java`、`relabel/mapper/RelabelDispatchSourceMapper.java`,保持 Service → Repository → Mapper。dispatch 只消费公开port,不直读换标持久化实体。方法与嵌套record参数顺序如下:
```java
Snapshot snapshot(String warehouseId, List<Long> warehousePalletIds);
void lockApplications(List<String> relabelNos);
Snapshot lockedSnapshot(String warehouseId, List<Long> warehousePalletIds);
UnitFact(Long id, String oldLabel, String newLabel, String result, Integer quantity)
Application(Long applicationId, String relabelNo, String customerId,
Long fulfillmentOrderId, String status, String fulfillmentStatus,
String deliveryMethod, String roundKey,
LocalDateTime updatedAt, LocalDateTime customerConfirmedAt)
BoundSource(Long applicationId, String relabelNo, Long itemId,
String customerId, String warehouseId, Long warehousePalletId,
Long inventoryPositionId, Long inventoryBalanceId,
Long sourceInventoryBalanceId, Long sourceInboundOrderId,
String sourceInboundOrderNo, String sourceInboundCode,
long notifiedPackageCount, long boundPackageCount,
Long productQuantity, String bindingBasisHash, List<UnitFact> unitFacts)
Position(Long positionId, String customerId, Long inventoryBalanceId,
Long warehousePalletId, long availablePackages, long holdPackages,
long allocatedPackages, long pickedPackages, long receivingPackages,
long recordVersion)
Snapshot(List<Application> applications, List<BoundSource> sources,
List<Position> positions, String compositionVersion,
boolean complete, List<String> blockReasons)
```
`snapshot` 读取当前完整运输组成,不按页面筛选或排车资格隐藏关系。已作废 `CANCELLED` 申请保留在原业务历史中,不再扩展为当前运输来源;实际库存位置全部保留,残余HOLD无法由当前贡献解释时仍阻断。其他状态的资格由消费方判断。`lockApplications` 必须在调用方事务内按换标业务号稳定顺序一次锁齐。`lockedSnapshot` 重新读取已锁申请组成,不提前取得库存锁。dispatch 先计算闭包,固定申请全集→真实来源订单全集→共同 `ll_physical_pallet_guard` 实托串行行→组成重读→库存和运输占用顺序;发现新申请、订单或实托不得临时按发现顺序追加锁,整笔冲突重试。仓内组拆托入口使用同一共同串行点。
此port只提供换标及库存事实,不反查dispatch账本;`Snapshot.complete` 用于零扫码选货阶段。两申请共享position时,贡献总箱数须与该position真实HOLD共同核对,不能只逐item各自判断HOLD足够。实际扫码后仍读取原身份、轮次和逐件事实,但箱数以已冻结 `ll_dispatch_item_source` 减去不可变 `ll_dispatch_pda_pick_order` 已消费额度,再核对全实托剩余贡献与真实HOLD;不得将零扫码完整性或最初通知数当作当前剩余额度。
`ll_dispatch_item_source.relabel_round_key` 保存原提供者的真实作业轮次。原 `bindingBasisHash` 保留完整选货依据,但含库存数量、版本及申请生命周期,不用于要求正常扫码后摘要保持不变。执行锁内分别比较冻结轮次、申请/明细/客户、实际位置与余额、原货源、通知及商品件数和逐件事实;当前位置剩余HOLD按冻结贡献减已消费额度核对。PDA逐逻辑明细只显示本来源实际位置和剩余额度,同一position不向每个申请重复提供整仓位HOLD。
正常TRUCK客户确认到实际扫码前仍保持HOLD,通用AVAILABLE合拆托不能移动冻结仓位;实际扫码在单一事务连续RELEASE/ALLOCATE/PICK/SHIP,不形成已提交AVAILABLE窗口。转运关联换标走原RESERVED/WAIT_TRANSFER_OUTBOUND分支,退出普通RELABEL候选。公开库存release仍可能使事实改变,因此必须保留锁内聚合及版本校验,不能宣称HOLD全局不可改变。原生退货箱继续由原提供者提供,不被普通位置贡献替代。
#### 2.3.3 派送与费用消费的换标原货源快照
共同字段位于 `DispatchContracts`,冻结顺序为:
```java
SourceOrigin(Long dispatchItemSourceId, Long relabelApplicationId, Long relabelItemId,
Long sourceInventoryBalanceId, Long sourceInboundOrderId,
String sourceInboundOrderNo, String sourceInboundCode, Long productQuantity)
```
`CargoLine` 保留原参数顺序,在末尾 `List<BatchAllocation> batchAllocations` 后追加 `SourceOrigin sourceOrigin`。`SourceOrigin` 实际为上述八字段,不另加字段别名或旧签名构造器。普通换标的第四真实拣货来源必须链接冻结贡献,并由此带出原货源;其他分支保留原真实receipt/return凭据,`sourceOrigin`为空。`DepartureFacts`等外层形状不变。
`CargoLine.orderId` 仍是本条真实履约计数归属,不以原货源订单替换或把独立换标申请的履约单伪装成原货源。`SourceOrigin.productQuantity` 表示本次归属中有真实依据的件数,未知为空;不复制整个贡献或实托的总件数。出库、派送及费用快照保留这份不可变来源,用户界面显示原业务号而不回退内部ID。整托实载重量体积不复制到来源行。
### 2.4 主档与临时外配
推荐车辆、司机分别使用显式联合类型,支持一个选档案、另一个临时填写:
@@ -167,7 +268,7 @@ MASTER 的状态、区域、能力、证照及占用由服务端主档复验;
| `GET D`、`GET D/{dispatchNo}` | Query及统计见4.5;公开status/stage按第3节唯一定义,ListRow/Detail均带recordVersion | 保留路径,替换旧三阶段;平台customerId仅以真实item筛车,不改变主单归属 |
| `GET D/candidates` | 按仓、来源类型、订单/目的仓过滤,返回真实 customer/sourceKey/availablePackages/sourceVersion/blockReasons | 保留路径,移除多客户 planIds 的单客户推断;有界批量读取 |
| `POST D` | `Create { idempotencyKey, warehouseId, vehicle?, driver?, plannedDepartureAt?, estimatedArrivalAt?, remark?, cargo[], batchAllocations[] }` → CommandResult | 新入口;cargo为空建空单,非空同事务选货建车;没有customerId/tripNo字段;未取得服务端生成号时通过原POST同键恢复 |
| `PUT D/{dispatchNo}` | `Update { recordVersion,idempotencyKey,vehicle?,driver?,plannedDepartureAt?,estimatedArrivalAt?,vehicleAppointment?,remark? }` | 保留路径;关键字段修改触发审核失效;不接收 status 或实际时间 |
| `PUT D/{dispatchNo}` | `Update { recordVersion,idempotencyKey,vehicle?,driver?,plannedDepartureAt?,estimatedArrivalAt?,remark? }` | 保留路径;关键字段修改触发审核失效;不接收 status 或实际时间 |
| `POST D/{dispatchNo}/items` | `AddCargo { recordVersion,idempotencyKey,cargo[],batchAllocations[] }` | 新入口;可继续在空单加货;批次分配提交最终完整快照,来源锁和保存原子 |
| `POST D/{dispatchNo}/items/{itemId}/remove` | `{ recordVersion,idempotencyKey,reason? }` | 替换旧无版本 DELETE,保留删除历史与占用证据;不物理删除已执行事实 |
| `POST D/{dispatchNo}/cancel` | `{ recordVersion,idempotencyKey,reason }` | 替换旧无版本 DELETE;取消前真实未拣货、无活动派送/出库;保留原取消历史及资金作废语义 |
@@ -205,7 +306,7 @@ MASTER 的状态、区域、能力、证照及占用由服务端主档复验;
ListRow 返回业务号、五阶段、审核和装车/派送摘要、车辆司机、起运仓、计划/实际发车、数量、版本及动作资格;不装载完整订单/附件集合。Detail补充:
- `vehicleInfo { vehicleMode,vehicleId?,plate,driverMode,driverId?,driverName,driverPhone,carrierName,vehicleStatus? }`;临时车辆没有主档状态时显示“—”,不虚构启用状态。
- `dispatchInfo { route,plannedDepartureAt,departedAt,estimatedArrivalAt,fbaAppointments[],vehicleAppointment }`。多目的仓不能只返回一个 FBA 约号;预约从有效批次读,保留未知与待复核,不用头部可编辑约号覆盖正式预约。
- `dispatchInfo { route,plannedDepartureAt,departedAt,estimatedArrivalAt,fbaAppointments[],appointmentBatches[] }`。多目的仓不能只返回一个 FBA 约号;预约从有效批次读,保留未知与待复核,不用头部可编辑约号覆盖正式预约。
- `documents { dispatchNo,deliveries:[{customerId,deliveryNo,destinationKey,status}],createdAt,updatedAt,remark }`;完整返回业务单号,列表摘要批量读取。
- `orderDetails[]`:真实客户、订单号/入仓码、重量kg、托数、目的FBA仓、体积m³、集装箱号及来源键。按真实订单组成批量组装,不把同托全量重量/体积复制到每个订单;没有可信分摊则对应字段null。`containerNo`、updatedAt、remark、多派送单当前排车DTO缺失需补齐。
@@ -309,9 +410,9 @@ statistics {
| 新操作 | 根以后实际需要的链 | 不能做的事 |
| --- | --- | --- |
| 装车前编辑/审核/资源变更 | 根→资源(涉及才取)→dispatch→binding;涉及批次/来源变更再按batchKey及真实来源ID锁,触及预建出库时先取出库/派送再取来源 | 不将审核前置查询直接解释为来源已锁;不在库存锁后改批次或派送 |
| PDA扫码 | 根→必要资源校验→dispatch→binding→task/item→真实来源订单升序→退回来源行(对应分支)→position→balance,库存命令和pick归属同事务 | 本链不请求outbound/delivery行锁,不写整车派送完成;否则会与签收的delivery→source相反 |
| 装车完成 | 根→必要资源→dispatch→binding→task/item;批次/装载快照按当前事实复验,读取既有pick/归属;若需要来源锁则按ID升序且不再申请delivery锁 | 不先造派送以满足装车门禁;不执行allocate/pick/ship |
| 安排/发车/关联出库取消 | 根→资源→dispatch→binding→整车安排行/命令检查→全部客户outbound(客户/ID排序)→全部delivery(客户/ID排序)→task/item(需锁才取)→相关预约批次→真实来源订单/转运/换标等来源行→费用来源/Outbox及DML | 所有需取得的delivery行必须在第一个来源订单锁之前取得;不在持来源锁后补锁另一张派送,不再扣库存;取消只适用已有未执行合法分支 |
| PDA扫码 | 根→必要资源校验→dispatch→binding→全部换标申请→真实来源订单升序→共同实托串行行→组成重读→task/item→退回来源行(对应分支)→position→balance,库存命令和pick归属同事务 | 本链不请求outbound/delivery行锁,不写整车派送完成;不得按当前item才逐个补取申请和订单 |
| 装车完成 | 根→必要资源→dispatch→binding→全部换标申请→真实来源订单升序→共同实托串行行→库存及冻结贡献复验;读取既有pick/归属与当前装载清单 | 不先造派送以满足装车门禁;不执行allocate/pick/ship,不再申请delivery锁 |
| 安排/发车/关联出库取消 | 根→资源→dispatch→binding→整车安排行/命令检查→全部客户outbound(客户/ID排序)→全部delivery(客户/ID排序)→task/item(需锁才取)→相关预约批次;涉及实托来源执行/释放时再按全部换标申请→真实来源订单升序→共同实托串行行→库存/运输占用及来源状态取得锁,最后费用来源/Outbox及DML | 所有需取得的delivery行必须在第一个来源锁之前取得;不在持来源锁后补锁另一张派送,不再扣库存;取消只适用已有未执行合法分支 |
| 签收资料/来源完成证明 | 本delivery→来源订单升序(保持既有显式READ_COMMITTED链)→业务完成/Outbox/待汇总信号提交 | 不取得trip/dispatch/outbound行锁;来源证明只读历史证据,不以父锁替代跨趟来源序列化 |
| 主流程汇总 | 新事务trip→dispatch(不请求资源锁)→普通读全部已提交本趟签收/异常事实→CAS主stage→acknowledge本信号→同事务提交 | 不调用SourceDeliveryCompletionQuery.proveAll、不锁来源/历史派送;资源不因汇总释放;失败阶段与ack同时回滚 |
@@ -524,3 +625,35 @@ Fleet现继续按真主单收敛:`FleetDispatchGateway.Snapshot(dispatchId,dis
2026-10-19 17:39 IAM权限新输入串行验证:`mvn -pl iam -am '-Dtest=Phase5DeliveryPermissionSqlContractTest,Phase5DeliveryPermissionSqlExecutionTest,AuthorizationSnapshotServiceTest,IamOpenApiContractTest,OverseasPhase4PermissionSqlContractTest' '-Dsurefire.failIfNoSpecifiedTests=false' test`实际29/29(1+5+7+5+11)通过。源码与target/classes/db/lastleg-permissions.sql SHA-256均为9deef80d2bcf383918b5ad48a63bea893ced2d9a32528e33268c02e73bbd4f67。输出`.logs/dispatch-iam-retired-smart-tests.log`;报告`iam/target/surefire-reports/`。File49当前输入未变,本轮未重跑。
预约接线正在实施:已新增`DispatchAppointmentAllocations`按Provider实际record字段顺序逐字段映射(Provider版本在第3字段,公共DTO在末尾),一次合并当前保留分配+新请求版本预锁,缺失/负数/同批混版本拒绝;create/add与草稿全groups预锁位于来源锁前。仅将已保存DispatchItem的真实客户传给bindItems,touched增量保留他人。源码已增加Fleet全范围父级/全部资源预锁及主单排序锁、内部预约改量端口实现:原主版本/零真实扫码/BEFORE_LOADING、完整实物及原分配集合复验、稳定父键子命令恢复,移出不解绑/取消整车,主单/来源/审核/历史随父事务回滚。新测试与整体验证尚在补齐;候选真实批读仍待Provider实际薄签名后接入,不能将这些源码视为已编译通过或链路完成。旧DispatchService.preArrange及两个私有单客户创建实现已移除,不恢复Provider旧bind/requireReplay;BOL仍待从旧platformDetail读取切到整车投影,旧测试和残留DTO同步继续。
2026-10-19 18:13 当前源码收口:主候选已使用实际Provider candidateBatches有界批读,校验返回覆盖每个真实客户/计划实物;owned draft由外层校验,未将本操作者自己的占用误判为他人占用。BOL已从旧platformDetail改为DispatchBolReadService一致快照,整车SQL逐明细客户取原订单组成,按客户+实际目的地分组;退回实收/换标不套用原完整计划箱数。旧DispatchService单客户页/详情/创建/修改/取消及旧PDA公开扫码流程已移除,来源与原换标占用规则保留,未恢复旧Provider接口。
最近一次实际完整Maven展开1062生产源码及453测试源码:生产编译通过;测试阻断已收敛为移交原派送写者的DispatchRepairWorkflowTest旧调用。原预约两FBA测试由总控修复父命令键;Fleet直接消费者、取货负断言已按现行createPickup收口。新增主单原预约移货/父事务回滚/客户数量原分配校验/真实扫码守卫和BOL两客户/部分退回SQL测试尚待统一运行。旧增量输出曾因IDE更新显示Nothing to compile,不能据此认定完整测试编译或回归通过;最终仍用稳定源码重新构建。主单cancel已改为仅活动非CANCELLED出库阻断,保留历史单据和原版本、阶段、零真实扫码边界,实际回归待运行。
2026-10-19 18:24 本轮实际闭环证据:标准Maven完整`test-compile`实际重新编译1055个生产源码、454个测试源码并BUILD SUCCESS(此前移除6个本域旧DTO/实体/Mapper及原派送无生产调用Query;当前Mapper扫描为10模块/392 Mapper通过)。记录`.logs/dispatch-full-current-test-compile.log` SHA256=3852983b13e1182be8d22baeea4adaf774e4ddf57db11fe0354c0a900913d85f;旧客户头类class已核不存在,不用排除消费者的局部编译代替全服务编译。
行为回归先运行71类438项,实际423通过、8断言失败和7错误;随后按新输入只复跑修正项与新增直接消费者,9类69/69、8类90/90、3类16/16均BUILD SUCCESS。按每类最新结果去重共80类501项,0失败/0错误;这是分批组合覆盖,不宣称一次501项全绿Maven。机器可核摘要为`.logs/dispatch-final-evidence.json`,包含每份日志SHA256和每类最新来源日志。实际覆盖原预约分配/整票移货/父事务回滚、主单PDA双客户真实库存命令、装发/签收消费、来源发布并发、取消重排、归箱与异常来源、候选批读、BOL真实SQL、网关与资源附加能力。测试替身隔离的提供者和手工准备的已发运夹具不等同真实环境整链验收。File49及IAM29输入未变,仍引用先前实际通过结果,未重复计入501。
FleetAppointmentImpactMapper已使用唯一binding+真实item客户EXISTS(SHA256=36ae1dccaff96dcc49a8bc1a43ebaba18950b641440cf6bc5682ffa0e6911381);VehicleFulfillmentMapper也以真实item客户证明替代binding头客户(SHA256=79ec8f7a818c412931e81f7e2b6a5299cb4c8bf38939ca5f645a5a5d43d70761),车辆履约7项与权限/只读合同2项在90项中通过。其夹具为一张整车、两客户、一条车次绑定,并保留伪客户、原发车、换车及交接断言。
依赖门禁本轮先发现新增既有预约→整车公共端口7条精确类型引用未登记,已按获批接线加入reviewedClassDependencies(不加整个slice许可);随后总控接管该基线和反向越界检查,最终Node结果以总控交付后复跑为准。原fleet.pickup的Mapper/Repository/Service到WarehouseTransferOrder三条旧直接实体引用及fleet outgoing限制仍是开工前既存阻断,不在排车作业里放行。未执行部署、SQL、环境写入、真实HTTP/PDA或人工截图验收。
2026-10-19 18:26 总控冻结依赖输入后实际Node复跑13项:10通过、3失败;新增original appointment adapters use only the reviewed dispatch port types合同通过,包括未知消费者及主流程实现类型的反向拒绝。剩余失败仅由上述开工前取货三实体直接依赖及fleet outgoing限制触发,未放宽slice。日志`.logs/dispatch-lastleg-dependency-contract.log` SHA256=6a767619db627952ce59aaba5d4530413728d18a4c21928b61ca2f05008a6cff;501行为组合覆盖及编译证据摘要已同步依赖结果。最终Mapper合同为10模块/392个Mapper通过,受影响路径git diff --check通过。
2026-10-19 18:27 最终冻结输入的一次联合Maven已实际完成:80类501/501,0失败/0错误/0跳过,BUILD SUCCESS;日志`.logs/dispatch-final-joint-regression.log` SHA256=b56da123ceb74409530793c3de92467cac686b03d97eb4afc34febc1a4b83238。这次结果独立于前述分批组合,不用组合结果冒充单次通过。完整命令参数及源码/合同快照在`.logs/dispatch-final-inputs.json`(运行前后1519份文件逐项SHA一致,其中生产Java1055、测试Java454;归一化路径排序聚合3ff451e8b6e6774e53bbc62fba5b2fcd2b7098e129d490434468b3ef91594de9;快照文件SHA256=ae07cb978c639488c8de78b458e9c1995fe6e66bee1fcd4bb8e34a79a644ad12),摘要`.logs/dispatch-final-evidence.json`已追加finalJointRun,未排除任何测试编译消费者。
Gateway路由合同最终5/5通过(`.logs/dispatch-final-gateway-route.log`)。AGENTS索引第一次仅“海外PDA指引超过8000字符预算”失败,没有缺失路径;总控已交原前端写者精简该唯一指引,源码及本次501输入不受其文案变化影响,待新指引后单独复验。整体依赖门禁仍为10/13,不标为全通过;现有取货依赖是独立限制。行为已通过输入不再反复测试。
最新用户裁定取消排车车辆预约字段及关联:Create原本无该字段;本次从Update和DispatchInfo彻底删除vehicleAppointment及AppointmentReference/VehicleAppointment类型,Aggregate删除对应拒绝分支和固定null参数,无别名或空占位。车辆预约不再列为待接通依赖。FBA预约及批次保留,日历新增预约不变。此前单次501回归绑定删除字段前的输入;本次签名变更以新的全测试编译及直接消费回归为准,保留旧日志作为历史证据。
2026-10-19 18:38 按“取消车辆预约字段”新输入完成无排除test-compile,BUILD SUCCESS(`.logs/dispatch-without-vehicle-appointment-test-compile.log` SHA256=50cc293c71a64a8242ca6f5852875542d7a8ff822def7f012fae926dd9103071)。直接受影响5类25/25、0失败/错误/跳过,BUILD SUCCESS;日志`.logs/dispatch-without-vehicle-appointment-direct-tests.log` SHA256=dbadeab653c67610b8c2b09ac8cd9af8177c0d7decdb0b7ab7bd94f8748475f7,真实Update新增验证计划保存/原键恢复及详情JSON无车辆预约字段,并保留FBA展示。相对旧501快照恰好8份Java/合同/测试输入变化,新源码快照`.logs/dispatch-vehicle-appointment-removal-inputs.json`,聚合1607ea98c3f9a8fadf66541f95c70f33e4ebae55cb3823b3801d52d5196b0685;完整命令和变更列表见`.logs/dispatch-final-evidence.json`的新vehicleAppointmentRemovalVerification。不重跑未受影响库存、发车或派送501组合。
公共类型新SHA256:DispatchCommands.java=0553f0af5dbe31bb9d63701872540261398536f1925edfc3d7f309202aeeea56;DispatchViews.java=2c027f2516ee7a1a0a544e52aaa4a8be70b1439a0b94008223335d499ebf2ae9。两被移除嵌套类型的target/classes也已核不存在。新AGENTS长度已合格,但第二次索引仅缺两段固定文字“涉及业务行为变更时必须核对对应细则”“不得与国内 PDA 混用”;继续交原前端指引写者恢复,尚未记索引门禁通过。
Java候选交接边界:总控已核取消车辆预约后无排除test-compile及25项直接回归均BUILD SUCCESS。Java本域停止对未变输入重复检查;Maven写权仅供后续真实Java问题续接。此前501单次回归继续绑定旧字段输入,不冒充新协议501通过。总控继续统一AGENTS索引、前端及现行HTTP验收脚本消费者,未将它们标记为本Java域已完成。总控报告当前OpenAPI按源重生97 schemas、29平台+7PDA路径、649 refs和两SQL静态通过,无车辆预约字段;该重生输出及索引/脚本最终证据由总控持有。依赖门禁仍10/13,旧取货直接实体引用不豁免;无环境发布/真实HTTP/PDA/截图验收。
2026-10-19 C52路线事实修复:FleetTripService.updateDispatchCargo不再仅追加旧路线。起点与本车起运仓一致;按当前真实货物目的地和有效外接预订(CONFIRMED/RECEIVED/BOUND)目的地保留原站点相对顺序,删除没有任何有效支持的旧站,新货目的地追加。有效预订要求的站若原路线已缺失则整笔主单事务失败,不编造站名/地址。原计划容量、实载和理货快照继续随货物修改清空;车次更新增加原版本条件,和明细、来源占用、绑定货量、命令账本同事务回滚。直接提供者仅新增FleetBookingReservations.requiredRouteDestinations并复用到原requireRoute,未扩展其他业务或公共API。
实际检查经scripts/local-check.ps1单槽执行,未提高Maven默认1536MB/2处理器限制:无排除test-compile exit0/BUILD SUCCESS;5类33/33、0失败/错误/跳过/BUILD SUCCESS,其中FleetDispatchRoutePersistenceTest新7项涵盖多站末托移除、有效站原序/新站追加、同目的地多托保留、空车仅起点、三种有效预订保护与取消后去站、缺失必要站冲突、真实绑定写入失败后的主单/路线/占用/货量/账本回滚及同键重放。其余直接回归为DispatchAggregatePersistenceTest11、FleetTripPersistenceTest7、FleetReceiptCapacityTest5、FleetTripMatchedStopsTest3。Fixture复用真实服务/Mapper/H2事务,目录与选货权威仍是受控提供者,预订作为持久化输入;不宣称真实环境HTTP/库存或预订确认整链验收。
C52源码SHA256:FleetTripService.java=28eca09b87337b07a04955039a50c3c55805289955c24db75fe9df6fbf0b3bcc;FleetBookingReservations.java=84906c28ccaf94125a41c03a30c9df392400af74569ed26c2da8abd5c116144c;FleetDispatchRoutePersistenceTest.java=687248640255a40456f4197cab28dd32e8a16f97a833858fc868e171dcf2b62c。3路径聚合9fab733033d4fffaeb716b4cb2720dd72b26c14ece1b97d6bd6d2e30db502aa2(规范化路径Unicode顺序、path+空格+小写SHA、LF连接无尾LF)。命令/资源限制/3份源文件时间与哈希、5份JUnit XML摘要及用例名、Maven日志均在`.logs/dispatch-route-evidence.json`,SHA256=642624474f2d978247e5d02582dc4f4ced3a89000bf694091de0cb15a5fd892d。Wrapper日志`.logs/dispatch-route-test-compile.log`/`dispatch-route-regression.log`,原始子进程输出分别留在`dispatch-route-test-compile.maven.log`/`dispatch-route-regression.maven-tail.log`,后者完整保留5类结果及BUILD SUCCESS。33通过后生产和测试输入未再修改;没有重跑501/索引/无变化门禁,没有环境写入或部署。
@@ -577,7 +577,7 @@ lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/receiving/FbaReceiv
## 14. 第13节既有预约接线实施包(2026-10-19)
本轮授权后实际实现包为下列19个后端路径;主流程公共合同、Aggregate桥接和锁实现由主后端独占,根接走的旧查询3+1不在本包。File冻结;草稿仅解除DispatchDraftService候选/视图及其直接测试,生命周期、命令重放、到期修正保持。此处仅是实施交接,编译和回归仍由唯一Maven执行者确认,不将新增测试或静态检查记为通过结果。
本轮授权后实际实现包为下列19个后端路径;总控随后只对`FbaAppointmentPersistenceTest`与`FbaReceivingPersistenceTest`补齐13处父命令键参数(部分移动直接断言原键`partial-confirm`),其余17文件保持交付输入,本节已更新两文件及聚合摘要;主流程公共合同、Aggregate桥接和锁实现由主后端独占,根接走的旧查询3+1不在本包。File冻结;草稿仅解除DispatchDraftService候选/视图及其直接测试,生命周期、命令重放、到期修正保持。此处仅是实施交接,编译和回归仍由唯一Maven执行者确认,不将新增测试或静态检查记为通过结果。
- 原Provider:`Allocation(planPalletId,batchKey,Long recordVersion,customerId,sourceKey,destinationKey,packageCount)`;`PhysicalItem(itemId,customerId,planPalletId,sourceStage,packages)`;`BatchReference(batchKey,batchNo,Long recordVersion,customerId,sources)`。版本显式必填,零合法;移除旧bind/requireReplay。批次预锁固定String键排序,一次锁齐,事务后续只能复用已经声明的集合。
- 候选实际入口:`Map<CandidatePhysical,CandidateBatches> candidateBatches(List<CandidatePhysical>)`;`CandidatePhysical(String customerId,Long planPalletId)`;`CandidateBatches(List<BatchReference> appointmentBatches,List<String> blockReasons,boolean occupied)`。最多1000个输入,整页两次本地SQL,来源去重后遵守原100票边界分块规范化;不逐候选循环batchContext。真实客户/计划托盘、BOOKING/ORDER、批次版本、目的地、跨车原分配余量与全来源有效实托占用共同决定结果。sources.packageCount由本托逐票实物和该批余量共同限定,零余量不伪装成可选项;缺失/陈旧归属返回阻断。occupied含本草稿自身,调用方仍按真实草稿身份核占用,不能直接阻断自己的已选来源。
@@ -596,7 +596,7 @@ mvn -pl lastleg-service -am '-Dtest=AppointmentWorkDispatchBindingTest,Appointme
车辆预约未定位权威提供者,现有拒绝门禁保持;未新增预约权威表、预约创建API或日历表单/面板。
19路径聚合SHA256:`a1ebcebf57812efcab400b49f8681f596941e0a3864ea2f48d937991d604fdd7`。按JS默认localeCompare排序,使用`path + 空格 + 小写SHA256`以LF连接,末尾无换行、UTF-8无BOM:
19路径聚合SHA256:`70526153276ae4d8f5be3e211b5067ca3a8ae79a24eefe7b490df4b1486ad658`。按JS默认localeCompare排序,使用`path + 空格 + 小写SHA256`以LF连接,末尾无换行、UTF-8无BOM:
```text
lastleg-service/src/main/java/com/baiyue/lastleg/appointmentwork/AppointmentWorkDispatchPort.java 33f2ec5f8a19eaa814a9f618dc7e91908dfb609174912a98224fb89be47cd653
lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/service/DispatchDraftService.java 0330fe2f78484a0a744b4d5fbdb5471dd1ad1fbe5360af190040377419114d46
@@ -611,8 +611,8 @@ lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/work/FbaAppointment
lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/work/FbaAppointmentTransportAdapter.java 4124e454ea63d6803cf1d82f5376a009806088ce8213f2d736759edf369f2c9c
lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/service/DispatchDraftPersistenceTest.java 846aa50bb8af260a16f806cb92686f155bf5c81d2dc607f94216965e66220e96
lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/AppointmentWorkPreArrangementPersistenceTest.java 8300008cda492a6be58542e1ec5e22409ebb2b22caec315b797a2c5dd83643a2
lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/FbaAppointmentPersistenceTest.java dd31a3bad09797cc4c60cdaa199978deb1f217608b98590ecc823cfc932d0596
lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/FbaReceivingPersistenceTest.java 0b33acb5ad56882f11746909167178d4e802c4d9e4d1885cd6f0ff35414836ed
lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/FbaAppointmentPersistenceTest.java 222cc71e3b24f7bbe25cc743fc964891f6d2c385e276744af59b45d5abe72d7c
lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/service/FbaReceivingPersistenceTest.java 504c79ab02cac49cbb5c4698959ace76d2c3970532bf9e3c372e64930f449407
lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/work/AppointmentWorkDispatchBindingTest.java df2b0e6a7f86f2678ae8c857a20016e1ce9a7ed2adf6870571e0577974212e61
lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/work/AppointmentWorkDispatchPersistenceTest.java 06b3fb5da55e373f874e6f700a699f60f5edd1c8d1a33498be2da3e154853f27
lastleg-service/src/test/java/com/baiyue/lastleg/inboundplan/work/FbaAppointmentExecutionAdapterTest.java 076198846409ee929853807d3e822c9cbf106bf26fb09a69def7bbe2d715774f
@@ -1,25 +1,66 @@
# 排车列表统一作业改造契约
本契约规定排车列表五阶段、整车与客户货物归属、派送安排及 Admin 和海外 PDA 的共同目标。2026-10-19 用户确认一张排车单代表一趟车,并指定当前对话为本批总控;经逐项问答确定本契约的业务和界面基线,再下发三个任务做技术准备,共同接口冻结后才解锁生产代码实现。本契约描述目标及实施边界,不表示代码、部署或真实验收已完成;部署与真实验收事实仍维护在两份环境主契约。
本契约规定排车列表作业阶段、整车与客户货物归属、派送安排及 Admin 和海外 PDA 的共同目标。2026-10-19 用户确认一张排车单代表一趟车,并指定当前对话为本批总控;经逐项问答确定本契约的业务和界面基线,再下发三个任务做技术准备,共同接口冻结后才解锁生产代码实现。本契约描述目标及实施边界,不表示代码、部署或真实验收已完成;部署与真实验收事实仍维护在两份环境主契约。
本批规则优先于旧车次独立列表及多张客户排车关联共享车次的交互说明。旧缺陷修复规划仅用于核对已修复行为,不覆盖本批目标。
## 一 用户已确认的业务目标
1. 排车列表一次覆盖装车前、装车中、装车后、派送中、派送完成五个阶段。
2026-10-22 用户最新确认:允许先排车后预约,也允许先预约后排车;本条替代同日此前“FBA必须先约才能选入排车”的口径。一张排车单同一FBA目的仓仅填写一个约好的编号,同仓多票、多托及跨客户货物共用该目的仓编号;两个目的仓填写两个编号,不要求客服逐票关联或分配预约箱数。尚未预约不阻止普通入仓货物候选、新建、加货、草稿及正式转换,未实收仍沿真实计划来源,不伪造库存。客服在维护车辆信息中按目的仓填写,保存允许暂缺;提交调度审核必须补齐本车所有FBA目的仓编号,缺失时明确提示仓码。调度和理货通过、真实拣货、装车及发车继续复验,取消、驳回回车辆信息及失败后继续操作的规则保留。换标、退货独立来源不新增预约创建入口,实际客户、货物数量与库存归属保持逐来源核验。
车辆维护在现有派送信息区直接展示“目的仓/预约号/确认送达时间/货件号”表格,同仓只出现一行及一个预约号输入框,确认时间和全部货件号自动带出;修改编号后保存前不沿用原编号的确认时间,不再从关联订单跳转逐票预约分配弹框。已有完整且唯一的已确认预约来源可自动携带,按目的仓合并编号;同仓存在多个不同确认号时由客服明确填写本车使用的一个号,不任选第一条。未选正式批次时仍按本车真实客户、来源与箱数保存内部实物关联;已有明确批次引用继续核实归属及分配数量,但不要求客服逐票操作。维护写入沿用原Update的`maintenance.destinationAppointments[{destinationKey,appointmentNo}]`,存于既有resourcesJson,不新增表、权限或预约创建接口;原整车单号、货物和库存不变,编号变化使原审核依据失效。非法目的仓、重复仓、过期版本及阶段不符须拒绝并回滚,页面保留输入、重新读取后可重试。
列表、详情、审核、PDA与车辆维护共用按目的仓汇总的预约投影,BOL沿同一目的仓使用客服保存的编号,各票客户归属及箱数不改变;预约号筛选包含目的仓登记值,不再命中该仓已被人工改选覆盖的旧编号。已确认时间仍取匹配编号的当前有效正式确认,保留当地时区和原时段校验;仅填写编号不伪造正式确认时间,显示已登记,不能用计划发车或预计到达代替。货件号沿本车真实客户、计划逐票分配及直接订单关联读取,不依赖是否存在正式FBA预约批次;手填目的仓预约号时也须带出实际货件,同仓合并去重,不把其他客户货物并入本票。排车列表司机与联系电话保持两列,仅消费真实字段,缺失显示“—”。所有阶段、装车前审核分区和排车类型均展示主单created_at的真实创建时间,不以计划发车或更新时间替代,不逐行请求详情。
2026-10-22 车辆与图片门禁:车辆候选按海外在役状态及真实车次占用在服务端分页前筛选,排除其他车次占用并保留本车资源;当前选择失效可清除或改选,提交仍复验。草稿允许分步保存,提交审核及审核通过必须分别具备至少一张有效车辆图片、司机照片、驾驶证照片;选图未上传、上传失败、作废文件不计为有效资料;驾驶证接受PDF/JPG/PNG原件。每次放行复核文件有效性及分类归属;主档驾驶证按冻结来源读取,本趟补传图片按排车归属保留,不因主档解析丢失。主档换证后再次保存,服务端按原冻结来源标记剔除旧主档引用,再由车队解析当前主档;保留本趟补传图片及原历史,不把旧主档证照改按排车附件校验。
2026-10-21 新增内部散板需求发布选项,2026-10-22 简化智能排车入口;当前发布选项、时间来源及派送排车的候选、满载退出和未知容量口径统一见[内部散板需求池当前范围](内部拼车需求池首版开发契约.md#当前页面范围2026-10-21)。选项仅随新建命令按车同事务持久化,编辑不修改发布选择,不改变排车审核、实际拣货、装车照片或发车流程。
1. 2026-10-21 用户最新确认:排车列表恢复装车前、装车中、装车后、派送中、派送完成五个作业阶段。装车中可同步上传资料;确认装车完成且资料齐全才进入派送中。装完但资料未齐留在装车后,资料先齐则确认装车时直接派送;此规则替代同日此前“装完即发车”的确认。
2. 一张排车单就是一趟车,允许同车多个客户、多个目的仓;各票货物、库存、单据和费用必须保留真实客户归属。
3. 装车前包含车辆信息、调度审核、理货员审核;维护车辆信息后提交调度审核,再经理货员审核进入装车中。
4. 装车完成与实际发车是两个动作,均允许后台和 PDA 确认;两端使用相同服务端规则、版本和防重复约束。
5. 装车完成进入装车后;后台在装车后、实际发车前办理安排派送,核对派送信息及各客户费用,按客户和目的仓拆分派送单。派送安排完成后才允许后台或 PDA 确认发车。
6. 实际发车进入派送中;全部正常派送签收完成后自动汇总派送完成。拒收、退回等作为异常,先线下人工处理,不自动视为正常签收完成,不在本批新建线上异常闭环或伪造库存恢复、签收、账务结果。
3. 装车前包含车辆信息、调度审核、理货员审核;维护车辆信息后提交调度审核,再经理货员审核进入装车中。2026-10-21 用户确认审核链:客服在最初的车辆信息入口维护并提交,不新增独立客服审批级别;调度或理货员任一环节驳回均须填写原因,并统一回车辆信息/客服处理分区,离开待审队列。客服处理期间保留驳回环节、原因和原审核记录,编辑不抹除原因;重新提交开启新轮次,必须重新经过调度及理货审核,不复用旧批准。理货审核允许 Admin 或绑定仓 PDA 操作,两端共用版本、幂等和审核依据;通过前不得真实拣货,通过后才进入装车中。
2026-10-21 用户确认精简车辆维护入口:仓库派送排车的列表、详情隐藏“调整卸货顺序”和独立“提交调度审核”;提交统一放在“维护车辆信息”弹框,保留“保存”和“提交审核”。提交审核先保存本次车辆、司机、时间与附件,再读取最新版本和服务端资格提交;两步分别执行,失败提示后保留输入并结束请求态,用户再次点击按当前事实重新请求。车辆维护和提交审核不提供备注输入,保留已有备注;调度/理货审核的驳回原因仍必填。到仓取货沿独立运输操作入口,不受本次车辆维护弹框合并影响。
2026-10-21 用户进一步确认:调度审核、理货员审核两个列表分区只提供“审核、详情”,不展示维护车辆信息或其他操作菜单。Admin审核弹框可补充车辆图片、司机照片、驾驶证照片,已有证据只读预览;新增附件随本次通过或驳回保存,不借维护车辆信息重写车辆/司机资料或改变审核依据。上传及提交均按当前待审环节的审核权限校验,并逐文件核验本车及分类归属;附件读取沿列表查看权限。理货驳回、客服修改保留已提供证据,新一轮提交清当前审核附件并保留历史。PDA继续使用既有审核入口,本次不新增PDA上传界面。
维护资料通过 `DispatchCommands.Update.maintenance` 保存到现有 `resourcesJson.maintenance`,详情对称返回 `vehicleInfo.maintenance`,唯一类型为 `DispatchContracts.Maintenance`。整体及八字段均可空,空白文本规范为 null,允许空草稿保存:`plannedDeliveryDate` 为 ISO 日期 `YYYY-MM-DD`;`deliveryMethod` 为 FBA自提/客户自提/卡派打托/卡派地板/快递/外配;`pickupMethod` 为一提一卸/一提多卸;`loadType` 为托盘/地板/混装;`fleetEmail` 最多254字符;`vehicleType` 为厢式货车/平板车/集装箱卡车;`appointmentAccount` 最多128字符;`destinationAppointments` 按本车目的仓去重,每项为目的仓业务键和最多128字符的预约号,空白可暂存但提交审核必须齐全。不新增审核级别或权限,正式确认时间、实际发车及派送费用口径保留。MASTER/EXTERNAL 车辆的本趟 `evidenceFileIds` 均保留到资源快照,不能被主档解析清空;保存及审核对非空照片逐项核验本排车及 VEHICLE 类别、有效性,调度审核读取同一已保存证据,不写入车辆主档。
2026-10-21 用户确认:在装车前清除“有效排车”筛选后,仍保留车辆信息、调度审核、理货员审核三个页签及当前选中项;查询沿用空值默认有效排车的规则,切换页签继续按当前审核分区查询。
4. 2026-10-21 用户确认:装车完成确认真实实载,Admin与PDA成功结果在资料未齐时为AFTER_LOADING、资料已齐时为DELIVERING。装车中及装车后均提供司机驾驶证、车牌照片、装车完成、封车照片、BOL司机签字五类资料(每类1至5份),两端均可拍照/选择图片、上传、预览及替换,按整张排车单共用当前照片与附加资料版本,不依赖派送单或按客户重复上传。五框全部绑定保存且已确认装车完成后自动进入派送中;不以选图、文件上传回执或重复槽位充数。保留真实拣货核平、实载校验、版本及防重复约束。
自动带入规则:理货审核通过、进入装车阶段时,服务端将本趟已核验驾驶证和车辆照片分别复制为“司机驾驶证”“车牌照片”类别的独立装车附件,PC与PDA共用同一份照片记录及版本。每类最多带入5份,仅填充空类别,来源未变化时保留已有现场照片及替换结果,重复审核不重复复制;退回后保存车辆身份、司机身份或对应证照附件变更时,对应类别的旧资料(含手工上传)与资源修改同事务失效,保留文件和历史,车辆身份变化还须失效装车完成和封车照片,司机身份变化还须失效BOL司机签字;同一身份仅补换证照图片时保留其他现场凭证。再次理货通过后仅按新来源带入驾驶证及车牌资料,失效的现场凭证须重新上传。上传携带选择照片时的审核轮次reviewRound,服务端保存到原上传账本;绑定携uploadKey,核对文件、类别、操作者及当前审核轮次,旧轮次上传即使采用最新资料版本也不得绑定。后续主档换图不改本趟附件。司机人像不放入驾驶证类别,其余三类由现场上传。驾驶证支持PDF原件(计一份)并可在两端查看;其他类别只接受JPG/PNG。复制失败时本次审核与资料绑定同事务回滚;GET保持只读,不执行测试存量补写。
5. 装车已完成时,第五张装车照片绑定与按客户和目的地生成出库/派送单、记录实际发车并进入派送中在同一事务完成;照片先齐时,这些动作随装车确认在同一事务完成,仍无人工安排派送及确认发车入口。上传和绑定各保留稳定原请求键;第五张绑定或派送失败时保留装车后、前四张及原上传文件,原请求可恢复,不能留下半车或重复派送。PDA每次按Token绑定仓校验,Admin沿排车list只读、edit上传保存。照片使用原整车附加记录及文件归属,不新增存储表;五个既有技术槽位按顺序映射上述五类资料,不替代司机审核或真实签收。真实外接报价沿原费用路径发布,未知派送补充资料与费用保持未确认,不猜测金额或原费用覆盖、不填写零费;后续由既有后台资料/费用管理维护。装车中上传齐资料不会提前发车;照片先齐时派送失败回滚本次装车确认、保留已保存照片,原请求可重试。装车完成原键恢复本次事务原最终阶段(AFTER_LOADING或DELIVERING),资料保存原键恢复原保存结果,当前阶段须另读;不重复扣库存。
6. 实际发车后为派送中;全部正常签收完成后自动进入配送完成。派送中可以“标记异常”:类型必填(拒收、部分签收、车辆异常),退货去向选填(退回海外仓、其他),说明和图片选填。登记沿排车维护权限,按本车版本及原请求键防重,异常记录和图片保存在主单并于现有“排车信息”详情回看;阶段仍为派送中,不自动创建退货、恢复库存或确认签收。异常后续处置由人工处理,本轮不新增线上异常闭环。
资料入口(2026-10-28 最新确认):装车中、装车后从“管理资料”打开整车五类资料;有效排车在派送中从“管理资料”居中弹框进入,签收文件、装车资料两个页签,配送完成列表不再提供“管理资料”入口;2026-10-22 暂隐藏油耗图片上传和展示入口,原图片、版本及历史保留;按本车真实关联派送单及客户范围切换。签收文件与 BOL 复用派送单原附件记录;排车装车资料只维护整车共用的五类资料,不再同时显示另一套派送单装车照片上传框。派送单既有附件仍可从派送单资料入口查看,当前页签的上传类别统计只包含该页签内容。签收文件保存即沿现行逻辑完成对应派送单,全车全部正常签收才汇总配送完成;其他资料后补,不作为完成门禁。车辆与司机审核附件只读回看,油耗图片按车复用车队附加照片、版本及历史;保留原油耗接口的dispatch:list读取、dispatch:edit上传权限,当前排车页面不挂载油耗框,不改变车队原独立权限。外配任务原入口仍只输出五个装车框,但共享记录允许排车入口补充油耗图片;不复制派送签收文件为车队照片,不新增状态或数据库表。
2026-10-21 本轮登记契约:`POST /api/platform/v1/last-leg/dispatches/{dispatchNo}/exceptions`,动作`MARK_EXCEPTION`,`recordVersion/idempotencyKey/exceptionType`必填;`returnDirection/description/imageFileIds`选填。说明最多1000字、图片最多20张;异常图片类型`OVERSEAS_DISPATCH_EXCEPTION_EVIDENCE`,平台0、本车ID归属,非空JPG/PNG、单文件10MiB。主表新增可空`exceptions_json`,与原版本、历史、命令账本同事务保存;代码及基线已准备,未执行SQL或部署。
7. 本批聚焦排车列表、详情、直接关联操作及必要生产者和消费者。车辆列表、司机管理、自有业务、外配业务、出车记录的整页改造后续逐页处理。
8. 同时支持先选同一起运仓的可排货物/托盘再生成排车单,以及先创建空排车单再添加货物;空单不能伪造货物、拣货、装车或发车事实。
8. 同时支持先选同一起运仓的可排货物/托盘再生成排车单,以及先创建空排车单再添加货物;空单不能伪造货物、拣货、装车或发车事实。2026-10-21 用户进一步明确先排车和货物,车辆、司机在建单后由调度或客服在后台补充,不涉及客户自助填写;新建排车不展示或要求填写车辆、司机及证照,先完成货物分组,允许选填每趟计划时间和备注。计划托位仅用于预排分组,不表示已绑定真实车辆。后续维护车辆信息及提交审核继续使用既有资源资格校验。用户随后明确:货物计划增减统一在智能排车办理,排车列表车辆信息及详情不再单独提供添加/移除货物。智能排车同时承载新建及已生成排车货物调整,已有单使用原排车号和正式货物命令,不转换为草稿或重建单据;保留真实PDA拣货,已扫码禁止调整,理货审核通过且零扫码时先显式退回重审后再调整。
2026-10-21 区域入口确认:智能排车新建选货删除查询区的海外仓选择,仅保留“全部/洛杉矶/纽约”。候选接口 `warehouseId` 可选,不传时按区域做数据库分页、计数;指定仓的已有排车和预约消费者保持单仓查询。首个选中来源决定草稿真实起运仓,草稿建立后按该仓读取并禁止切换至其他区域混仓;全部表示该草稿仓的全部候选。未确定起运仓且区域匹配多个仓时不能提前创建服务器车辆容器,先选货再确定仓。空单没有来源可推断仓,其起运仓放入排车设置内选择。创建、锁货和转换的同仓约束保持不变。
9. 车辆和司机既可从已有档案选择,也允许临时填写外配车辆和司机;临时填写不伪造车辆或司机档案关联,不自行创建主档。
10. 后台确认装车完成必须以PDA真实拣货核平为前提。后台不提供替代PDA的拣货数量补录来绕过此条件;PDA和后台均可确认装车完成及实际发车的既有确认保持。
11. 用户随后澄清本次“新增预约”是预约日历的功能需求,先与本批排车改造分开整理。本批不新增日历预约创建或独立约车流程;排车已有FBA预约、车辆预约字段及权威关联继续保留。此前确认的先保存后关联意见保留为日历需求输入,不作为本批扩大实现范围的授权。
10. 后台确认装车完成必须以PDA真实拣货核平为前提。后台不提供替代PDA的拣货数量补录来绕过此条件;PDA和后台均可确认装车完成;两端可在装车中同步上传五类装车资料,由服务端在装车与资料均完成时自动发车。
11. 用户随后澄清本次“新增预约”是预约日历的功能需求,先与本批排车改造分开整理。本批不新增日历预约创建或独立约车流程;排车保留已有FBA预约关联;用户随后对车辆预约权威来源问题答复“那就不要”,因此排车取消车辆预约字段、关联操作及公开协议,不再等待或新建该权威提供者。此前确认的先保存后关联意见保留为日历需求输入,不作为本批扩大实现范围的授权。
12. 用户进一步明确“本批支持整托同车”:两张换标单已合到同一实托时,整托进入同一排车主单,物理托盘及容量只计一次,各换标单的箱数、客户及扫码归属分别保留。不得只装第一来源、借第一客户承载其他来源,或把同一实托拆成两张排车绕过排他占用;此确认取代该场景的待决定状态及仅作前置拦截的候选方案。
13. 用户进一步确认:换标已由客户确认完成、关联出库单尚未扫码时,只取消本次出库安排,保留已完成的换标成果,退回待安排。不得将已确认换标申请一并作废;取消须清除本次有效出库关联,保持真实客户、原换标成果及重新安排资格。此规则不放开已扫码取消或新增回库流程,整车取消仍遵循既有阶段、版本和零扫码门禁。2026-10-21 用户确认排车安排与货物事实分离:整车取消只撤销本车运输安排、预约分配及逻辑/物理占用,恢复本车换标预占,不改变货物实收、库存或已完成换标成果;未实收计划无需实托,已有实托也不重新按当前库存数量、来源组成或装车资格校验取消。取消仍先锁本车原换标申请及原实托串行点,并保留版本、装车前、零真实扫码、无有效出库及车队未执行门禁;扫码、装车和发运继续使用原严格货源校验。
14. 2026-10-21 用户确认:排车BOL前端仅在本轮调度审核通过后展示下载入口,无需等待理货审核或装车完成;未提交、待审核、驳回及审核失效时隐藏。用户明确本次仅改前端,后端下载接口不增加审核判断。审核分区仍仅保留审核、详情。2026-10-20 用户在人工BOL验收中最终确认:保持现有一次下载/预览PDF的方式,PDF内按“目的地+预约号”分别生成BOL;同仓同预约号的货物合并,不同预约号分成各自BOL,不按客户拆打印分组。用户前述“不同PDF”在后续“就和现在一样”的答复中已明确沿用现有承载,总控已说明当前实际是一个PDF包含多张BOL;不新增选择弹框、压缩包或下载协议。没有预约号也能打印,预约号栏留空,同目的地且均无号的货物合成一份。各BOL明细超页时可有自身续页,按原分页容量处理;打印分组不修改各票货物、库存、派送和费用的真实客户归属。货物按真实预约分配及数量归集,不把同一明细全量重复复制到每个预约。
15. 2026-10-20 用户确认排车业务号为`PC`前缀、八位日期、四位日流水,例如`PC202610200001`。日期沿用平台业务时区`Asia/Shanghai`,每天从0001开始,全平台跨客户和仓库统一递增;首次建单分配,命令重放返回原号。流水在独立短事务中原子分配,避免持车辆/来源锁时延长全平台序列锁;取消或建单失败不复用已分配号,最大流水反映编号进度,准确单量以列表主单统计为准。四位当日用满后明确拒绝,不回绕重号。本条不表示DDL执行或环境发布完成。
16. 2026-10-20 用户澄清“预约排车”指入库单的智能排车:货物离港后,即可按入库计划预排,无需等待海外仓实收。自动生成并预留的托盘码不是实收库存;尚未开始收货的预留托盘按 PLAN 来源选择和占用,不能据其仓托关联过滤在途候选。全部真实来源按权威柜节点或已覆盖的人工节点核对实际离港,人工覆盖后不回退柜节点。预排不伪造库存、拣货、装车或发车;后续实收身份及数量沿原计划绑定与 PDA 门禁复核。智能排车保持居中弹框,按起运仓与方式、选货分组、当前组车辆时间组织操作,草稿与多组原子转换继续沿现有公开协议。
17. 用户要求真实 HTTP 跑通“货柜实际出港→实收前预排→到仓→原排车出库”完整流程,并要求请求完整响应小于 1s;单用现有库存直接排车不覆盖该验收。用户允许在全量候选优化后仍慢时采用分页显示。分页须由服务端处理查询范围、筛选和排序,明确当前页与总量语义,不先完整计算所有候选后仅切片;选货仍按权威完整选择组核对跨页同托来源,不以当前可见页冒充整托完整货物。此条记录目标与条件授权,不表示已实现分页或已通过性能验收。
候选分页参数为`page`(默认1)、`size`(默认20,最大50)及服务端仓库页签`warehouseTab=ALL/LAX/NYC`;沿用原仓、计划、订单、目的仓、来源阶段和草稿筛选。响应`total/page/size/pages`明确筛选全集及当前页,顶层`complete`仅首且唯一页包含全部来源时为true,不能用于拒绝普通分页;`selectionGroup.complete`继续独立证明同托及整申请完整来源。原草稿一次选取仍由服务端解析完整组,不能按页拆开锁货。
2026-10-22 用户进一步确认:逐托数量在拆柜清点并确认入库时确定,收货9+11,原车出货也必须为9+11;不能等首次出货再补写数量。实收前的预排估算仅保留计划依据,不作为实收后逐托箱数相等的门禁。确认入库在原事务内先锁齐原车辆、排车与预约,再按已确认的逐客户、订单及托盘来源更新原排车实托绑定、明细箱数、整车/车次汇总和预约逐票分配;失败整体回滚,不产生出库扣减。预约归属沿原选择唯一匹配,不按托数均分实收、不替现场猜测多批次分配;身份及归属不变的自然实收保留原审核与历史。PDA任务GET只读取收货已交接事实,不投影修正数量;出货扫码只执行已确认的实托及箱数,不补绑定或改写收货数量,默认带出本来源可拣数量。未实收、来源身份变化、冻结/其他占用及重复扣货仍须阻止,不能吞入其他客户、订单或未选中的同托来源。诊断接口补仓位不算正式PDA产品链路通过。
2026-10-23 用户确认:普通入仓货物实收前保留计划分托估算;确认入库时,按各来源订单毛重×本托确认箱数÷该来源应收箱数汇总毛重(保留三位小数),体积汇总收货端记录的逐来源体积,并在原事务内同步原预排明细,包括清除已失去来源依据的计划值。后续新建/加货的已收货候选按当前可用库存位置及余额关联的真实入仓来源计算,以来源毛重/体积×当前可用箱数÷来源总箱数汇总,毛重三位、体积四位;拆合托及部分出库后不复用原整托收货数量,合入不同来源逐来源计算,缺少任一有效来源依据时对应指标保持未知。客户来货的仓储转运优先使用同一转运来源、同仓、全量可用且未拆合换绑的唯一逐托实测值;不将尾程订单ID当作入仓单ID,不把整托实测复制给部分库存。分摊值不冒充实测,不以材积重、零或旧计划值补齐未知货量;实际装载仍遵循独立实测证据契约。来源身份、箱数、预约归属、审核保留及失败整体回滚规则不变,关联订单仍按原来源逐行展示,不回填历史排车快照。
## 二 原型依据与详情四块
2026-10-21 用户确认排车列表的主筛选改为“车辆状态”,本次提供待发车、配送中、已送达,已返回及返仓确认后续再补。这里表示本趟运输进度:有效排车的装车前/装车中/装车后显示待发车,派送中显示配送中,派送完成显示已送达;不读取车辆档案的在役、维修或归还状态作为本趟进度。列表新增同名状态列,取消单显示“—”,仍由单据状态标识已取消。单据范围(有效排车/已取消/全部单据)移至高级筛选,收起时仍提示非默认范围;切换单据范围为已取消或全部单据会清除车辆状态,选择车辆状态则回到有效排车。状态查询与现有阶段页签联动:配送中/已送达切到对应阶段,待发车保留当前装车前、装车中或装车后,否则切回装车前;切换阶段时同步已选车辆状态。查询、页码、总量与审核分区沿用服务端阶段分页,待发车仍按当前装车阶段/审核分区查看,不在浏览器截取当前页筛选。重置清除全部筛选(含收起的单据范围),恢复有效排车,保留当前阶段及审核分区。
原型为用户提供的新版 HTML,页面 `page-outbound-vehicle`、`page-outbound-vehicle-detail`,以及本轮最新排车详情截图。HTML 位于用户提供的本机原型路径,实施者沿本契约和目标模块矩阵定向读取,不扫描原型其他模块。截图最新确认优先于前一条“三块”的描述。
排车详情继续使用独立页面、页头排车单号、状态和返回入口。用户在最新确认中明确将下列四块分别作为四个彩色图标页签,样式沿用现有后台横向页签;此确认取代此前同页四分区的布局描述。原型灰色卡片仅保留业务字段依据,具体字号、密度、底色、边线与页签使用现有公共规范。不新增路线或操作记录页签:
@@ -27,7 +68,7 @@
| 分区 | 截图字段或列 | 布局 |
| --- | --- | --- |
| 车辆信息 | 车牌号、司机、联系电话、拖车公司名称、车辆状态 | 第一个彩色图标页签;紧凑字段布局 |
| 排车信息 | 路线、发车时间、预计到达时间、FBA预约、车辆预约 | 第二个彩色图标页签;紧凑字段布局 |
| 排车信息 | 路线、发车时间、预计到达时间、FBA预约 | 第二个彩色图标页签;紧凑字段布局 |
| 单据信息 | 排车单号、关联派送单、创建时间、更新时间、备注 | 第三个彩色图标页签;多单号完整展示 |
| 关联订单明细 | 订单号、重量kg、托数、目的FBA仓、体积m³、集装箱号 | 第四个彩色图标页签;通栏只读表格 |
@@ -76,7 +117,7 @@
- 同一仓多个客户、多个目的仓装一车;同一目的仓不同客户的派送及费用不串客户,客户只读只能访问自己的货物和单据。
- 调度审核与理货员审核的正常通过、驳回与重提;未通过不能进入装车,改货物或关键资源后旧审核不得误用。
- 装车完成与发车分离,未安排派送不得发车;后台与PDA对同一版本同时操作只产生一次合法结果,未知结果按原请求键核对和重试。
- 装车完成且资料齐全才进入派送中,两项可并行;后台与PDA对同一版本同时操作只产生一次合法结果,自动建单、发车和命令结果同事务,服务端继续保证版本校验和业务防重。2026-10-21 用户确认取消Admin排车前端的未确认请求持久化、旧请求重放及失败锁页:仅请求进行中防连点,任何失败均结束请求态并保留输入,下一次点击按当前事实重新请求;关闭重开不恢复历史失败请求,也不阻断其他排车或操作入口。
- 全部正常签收才汇总派送完成;部分签收仍未完成,异常不伪造完成、退库或费用结算。
- 普通入仓、换标/退货来源、同托多来源及既有预约批次/工作事项的直接调用不丢来源、不重复扣库存或收费;保留上一批修复约束。
- 加载、空态、错误、无权限、附件预览及四页签长编号展示;不逐行查询列表详情或附件。
@@ -102,9 +143,10 @@
| 事项 | 确定规则 | 决策影响 |
| --- | --- | --- |
| 临时外配取证 | 建单人补齐本趟车辆容量、司机证照和预计任务结束,由调度审核核实;空单可先保存,审核前补齐 | 临时输入、证据上传、资格快照及审核必填;不自动建车辆或司机主档 |
| 实际装载核对 | 在确认装车弹框接入既有实载核对,有依据的实际数据自动带出,缺项再确认;保持PDA真实拣货核平前置 | 实载来源/字段/弹框及双端核验;不新增第五个详情页签,不代填拣货箱数 |
| 实际装载核对 | 确认弹框仅展示已扫托数、箱数并整车一次确认,不要求操作员逐托填写托位、重量、体积;已有实测由服务端带出,未知保留空值且不阻塞装车,保持PDA真实拣货核平前置 | 实载来源/字段/弹框及双端核验;不新增第五个详情页签,不代填拣货箱数 |
| 零扫码变更 | 保留原排车单号,显式退回装车前,修改后两级审核重提 | 新审核轮次、权限和历史;已经扫码的退装/回库不在本批新增 |
| 客户直接创建派送 | 本批整车安排仅由平台执行,客户继续查看自己的派送单,移除旧客户直接创建这类派送入口 | 派送后端移除对应Merchant创建写入口;前端任务按第九节更新Client直接消费者,保留本客户读取及合法资料操作 |
| 换标合托同车 | 同一实托可承载两张换标单的逻辑运输来源并整托同车;各来源真实箱数、客户及扫码归属保留,托盘和实际容量只计一次 | 同车内物理占用共享、跨车排他;候选、整托完整性、扫码归属、实际装载及派送/来源状态的直接契约须一致,不能只放开重复托盘校验 |
工程事项仍由总控负责:公开版本字段、请求摘要与业务摘要、真实库存扣减点、子单与来源锁序、签收持久提醒的写入和消费职责等不要求用户裁定技术细节。尚未核实的资源/预约提供者反向锁点必须在实现前补齐证据,不能用业务确认替代代码和并发验证。
@@ -118,7 +160,7 @@
4. 采用全局唯一idempotencyKey的共同持久命令账本,绑定原主体/动作/排车及严格commandHash;同键不得换主体或载荷。安排业务另有整车唯一事实及arrangementBusinessHash,当前有权限的主体用新键、当前版本引用同一已安排业务,不再生成单据或收费;`replayed`与`alreadyArranged`语义分开。原动作结果不可变,前端随后GET当前事实。
5. 共同根锁按已核对Fleet顺序为trip→涉及的车辆主档→司机/资源→dispatch;不采用准备稿早期trip→dispatch→资源的相反序列。扫码只走来源→库存链且不取派送锁;安排/发车先收齐全部客户出库/派送锁,再取得来源/费用锁;签收保持delivery→来源→持久信号、始终不回头申请父锁。装车/安排/发车不重复执行扫码已完成的库存SHIP。未核实的预约/资源提供者交集仍须补源码和竞争测试,不宣称已证明全域无死锁。
6. 共享契约只定义在`dispatch/port/`的DTO/接口,主流程后端唯一写入。采用DispatchExecutionPort、DispatchDeliveryPort、DispatchCompletionPort及明确的提醒数据访问端口;实现分别归dispatch和delivery,不跨域共享Entity或注入对方具体Controller/Service。派送任务保存持久信号及数据访问实现,主流程负责有界消费/退避/重扫;主阶段CAS和本次已核对信号确认在同一汇总事务中完成,失败回滚,错误记录在回滚后独立短事务更新。
7. 平台新增排车、确认装车完成和确认实际发车分别使用`platform:overseas-warehouse:dispatch:create`、`platform:overseas-warehouse:dispatch:loading-complete`、`platform:overseas-warehouse:dispatch:depart`,列表/详情仍为dispatch:list,两级审核沿用既有独立审核权限。整车草稿及选货候选GET统一使用dispatch:list,草稿全部写动作统一使用dispatch:create;前端既有入仓单选货建排车入口同样核对排车查看与新建权限,不再依赖旧入仓单智能排车权限,不增加OR别名或通过补授旧权限绕过。客户仅保留本客户派送读取,不再登记或默认授予`merchant:warehouse:delivery:create`;海外PDA继续使用其独立作业角色、权限和仓绑定,不通过后台按钮权限进入作业。正式权限目录和角色关联以IAM源码及国内统一基线为准。
7. 平台新增排车和装车完成分别使用`platform:overseas-warehouse:dispatch:create`、`platform:overseas-warehouse:dispatch:loading-complete`;装车完成自动建单和发车,不额外要求已移除人工入口的安排/发车权限,列表/详情仍为dispatch:list,两级审核沿用既有独立审核权限。整车草稿及选货候选GET统一使用dispatch:list,草稿全部写动作统一使用dispatch:create;前端既有入仓单选货建排车入口同样核对排车查看与新建权限,不再依赖旧入仓单智能排车权限,不增加OR别名或通过补授旧权限绕过。客户仅保留本客户派送读取,不再登记或默认授予`merchant:warehouse:delivery:create`;海外PDA继续使用其独立作业角色、权限和仓绑定,不通过后台按钮权限进入作业。正式权限目录和角色关联以IAM源码及国内统一基线为准。
### 首批解锁和停止点
@@ -140,6 +182,30 @@
- 主后端继续唯一维护上述草稿移交包以外的`dispatch/`、`fleet/trip/`和共享端口,补审核/装发、实际来源、PDA、Fleet一对一收敛及真实读写合同;不新增页面或业务规则。主后端保留唯一Maven执行权,按稳定输入覆盖File和派送用例。前端冻结后的只读差异核对已发现Long数量/附件大小字符串造成的真实阻断,总控仅解除其原有独占范围冻结以修正响应边界、直接消费者和真实wire回归;ID/版本继续无损,不改共享解析器、DataTable、导航或新增预约。
- 总控直接承担共享数据库基线、OpenAPI、权限及根入口收口,其他任务不写这些文件;File上述独占契约除外。索引/AGENTS最终统一维护,避免另建重复状态文档。
### 换标同实托多来源的实施冻结
用户已确认本批支持整托同车。本次按真实物理托盘与逻辑运输来源分层:同一车内共享物理占用,来源分别保留客户、换标业务号、原货源与可拣贡献;跨车及跨草稿容器继续物理排他。只移除一条来源不得提前释放仍有其余来源的实托,取消、草稿失效/转换及零扫码重审沿同一完整集合执行,不通过第一条来源或FIFO推断其他来源。
候选由服务端返回完整选择组及组成版本,使用未被页面筛选截断的事实闭包,兼顾既有整申请规则;前端不按当前可见相同托盘码自行拼组。正式Create/AddCargo保留显式逐来源选择并在服务端复核全组;草稿单来源动作须服务端一次命令原子处理完整组,不能用前端循环多个写请求代替整组一致性。PDA保留逐明细精确扫码,展示明确换标业务号及该来源可拣位置/额度,全部逻辑来源核平后才允许装车;不新增整托一键多次扫码或自动补拣数量。
装车确认仅传当前版本、清单摘要与幂等键,服务端按已扫实托去重计算托数(每实托一托),沿已有路线确定卸货站。已有重量、体积保留原实测依据,未知不要求现场重复测量、不填零、不推算;已知货量超出容量仍拦截,未知重量体积不作为可售余量。LoadingPreview及实际容量按每实托一行,逻辑箱数、来源状态与费用分别按真实归属保留。整托实测重量/体积不复制到每逻辑来源;业务份额只使用实际来源证据,缺少证据保持未知,不按箱数推件数或平均分摊重量。主流程先产出字段级公共骨架及唯一接口设计,前端以实际Java记录对齐;来源贡献的仓库生产者/移动触点及精确DDL由主流程提出,总控核对现有写者后逐文件分配。共享SQL/OpenAPI仍由总控集成,Maven仍由主流程唯一执行;此前普通流程通过结果不覆盖本次新增模型。
来源贡献的直接验证按主流程明确释放的有限边界并行:派送专项唯一新增`lastleg-service/src/test/java/com/baiyue/lastleg/dispatch/service/DispatchItemSourcePersistenceTest.java`,验证冻结贡献、逐明细/客户/位置消费、已消费额度、HOLD合计及事务回滚;该文件移交前主流程确认未创建、未写入。`DispatchItemSourceService`、Repository、Mapper、Entity及公共port仍由主流程唯一维护,派送专项不并修生产;提供者受控输入的组件测试不能代替真实provider与主流程的组合回归,Maven仍只由主流程执行。
### 实托组成冻结的共同串行点
当前运输组成须排除已由既有换标作废事务结束的申请历史,不沿其旧明细指针扩展实托闭包;真实库存位置仍完整保留,残余HOLD没有当前来源贡献解释时继续阻断。活跃、尚未取得排车资格的申请仍参加完整性核对。普通纯SKU的既有履约资格和库存生命周期保持原规则。
草稿纯释放和续租入口(UNSELECT、RELEASE、CREATE_CONTAINER、REMOVE_CONTAINER)须先按原草稿冻结实托集合取得共同Serial,再读取逻辑和物理占用,并在等待后复核原租约;不重新要求当前来源业务资格。SELECT、SNAPSHOT及CONVERT继续遵循既有资源、申请、订单到Serial的完整锁序,不把Serial提前到来源锁之前。到期接管与原草稿动作共享该串行点,不能分别采用逻辑成员到物理占用、物理占用到逻辑成员的相反锁序。
主流程已提出且总控冻结窄协议:`inventory/port/PhysicalPalletSerialPort.java`仅提供`void lock(List<Long> warehousePalletIds)`。永久表`ll_physical_pallet_guard`仅有真实全局`warehouse_pallet_id`主键与首次`created_at DATETIME(3)`,没有客户、状态、TTL或运输owner。调用方事务内对去重升序实托执行保留原时间的主键upsert及逐行FOR UPDATE,空目标也取得同一串行点;未关联实托的计划不伪造ID。
原有资源/主单父锁之后,预读完整源目标组成,稳定取得全部申请、真实订单,再取得全部实托串行行,重读组成,最后库存及运输claim。新增申请、订单或实托必须整笔冲突,不能持锁后追加无序集合。仓内移动、原托保留、return/unbound都覆盖普通库存、原生退货及空目标;不得给仓内作业新增暂扣资格限制。退货远端physical.apply须置于门禁之后,原业务失败补偿在共同串行锁仍持有时完成。
本有限包文件分配:既有B专项唯一新增inventory下上述port、`service/PhysicalPalletSerialService.java`、`repository/PhysicalPalletSerialRepository.java`、`mapper/PhysicalPalletSerialMapper.java`和对应真实Mapper/H2持久化测试,不修改排车/草稿消费者。主流程A唯一接入正式排车与草稿,并仍唯一维护公共排车模型及执行Maven。既有内部`native_fleet_script`唯一修改`palletops/service/PdaPalletOperationService.java`、其原直接测试,按必要最小范围修改本域Repository/Mapper及新增`PdaPalletDispatchFreezePersistenceTest.java`,不写inventory共同实现或dispatch/relabel提供者。SQL两基线与初始化合同总控唯一维护。各包先读取最近指引,交付准确SHA与未验证项;不得增加HTTP、状态协议或迁移。
草稿后续接线按主流程明确交接再次细分:B唯一维护`DispatchDraftService.java`、`DispatchDraftRepository.java`、`DispatchDraftClaimMapper.java`、`DispatchDraftPersistenceTest.java`四文件,A确认当前未写且暂停这四文件;A保留完整来源解析、正式主流程、PDA及公共模型。B以`selectionGroup(warehouse, selection)`读取完整组,以`lockDraftSources(warehouse, 全部组成员)`锁定并复核,选择、解除、布局、释放、到期与转换不得拆开同一完整组;按物理实托共享claim并只计一次容量,按逻辑来源保留真实客户及箱数。源版本与组成必须服务端核验,不增加前端循环写或公开协议别名。永久串行点的草稿接入由该B四文件包消费A来源锁方法,覆盖上段原先由A统一接draft的安排,其他边界不变。`DispatchItemSourcePersistenceTest.java`仍B唯一维护,按A明确新增`relabel_round_key VARCHAR(128) NOT NULL`同步手写建表并保持原16场景;SQL仍根维护。
### 既有预约接线的本轮授权
2026-10-19用户明确批准按《排车列表派送费用接口设计》第13节接线,新增预约不动。本段覆盖下列既有消费者的此前只读限制,不接管日历新增预约或建立车辆预约权威表。
@@ -148,10 +214,18 @@
- 主后端继续唯一维护`dispatch/port/`和主流程,给既有批次候选引用、分配补权威`recordVersion`(0合法、缺失及同批混版本拒绝),提供版本化的窄内部原预约变更命令;负责创建、加货以及草稿全批转换在来源锁之前预锁完整批次集合。另取得`ExceptionOrderService`及其直接测试的最小适配权,仅修正新共享PDA任务接口消费并保留明细/扫码/订单按真实客户隔离,不新增异常功能。
- 前端只在原排车模型/API/wire/弹框、三个已授权既有Work排车表单及直接测试内,按实际Java合同透传批次版本;原冻结候选仅对此接线解除冻结,其他部分保持。不得猜版本、补0或改日历新增预约、面板、planningApi及公共密度文件。
- 批次分配采用本次触及明细的增量替换,保留其他客户与未变明细的原分配,并以整车有效总量复核。统一锁序为全部父trip/资源/dispatch及必要的全部客户outbound、delivery,再全部既有批次、来源及实物/库存占用,协调guard在业务锁与变更之后;不能形成来源→批次反序。原命令身份、两级审核失效、主版本、零真实扫码、完整实物及整事务回滚规则不变,不补回退役Fleet绑定/移货别名。
- 车辆预约仍须明确原权威记录、版本和归属提供者。当前未定位到该提供者时保持显式门禁,不能用FBA批次、外接预订或旧手填状态替代;此授权不包含新的车辆预约表、创建API或日历业务。
- 用户最新明确取消排车的车辆预约:删除页面展示/输入、Update引用字段、详情字段、对应公开类型和拒绝占位分支,FBA预约不变;不保留旧字段别名或空字段,也不新增车辆预约表、创建API或日历业务。此前“保留权威关联、未定位时拒绝”的安排被本次裁定替代。
共享SQL、OpenAPI、权限仍由总控集成,Maven仍由主后端唯一执行;不增加任务、不部署、不执行环境SQL或真实业务写入。
本轮收口为减少串行等待,总控独占适配四个实际旧查询消费者:`exceptionorder/mapper/ReturnCartonStockReceiptMapper`、`inventory/mapper/ReturnStockReceiptMapper`、`delivery/mapper/DeliverySourceEvidenceMapper`、根`mapper/CustomerOrderProgressMapper`,并补齐同一旧任务客户头引用的`delivery/mapper/DeliveryOperationMapper.returnReceipts`,及直接查询测试`CustomerOrderProgressMapperTest`、`DeliverySourceEvidenceMapperTest`、`SharedDispatchReturnQueryTest`。仅消除已退出的主单/任务客户头、旧状态及发车列依赖,保留真实明细/扫码/订单/派送客户隔离与原数量规则;派送任务不并写移交的查询Mapper。原前端写者同步`CapacityInquiryTable`、`CapacityInquiryDialog`两处同一外接入车API的当前新建权限,保留其他三项独立权限。派送任务另独占`ReturnCartonReturnPersistenceTest`及主后端随后明确释放的`DispatchRepairWorkflowTest`的新模型夹具和构造器适配,主后端不并写该文件;现有归箱、逐SKU恢复、幂等、客户隔离、回滚和真实结案断言保留。总控另精确接手已交付19文件包内`FbaAppointmentPersistenceTest`、`FbaReceivingPersistenceTest`的transport.apply父命令键测试签名收敛,派送任务不并写这两个测试;其他17文件保持冻结。总控另唯一维护`DeliveryTransferService`及其直接测试:PDA解析改用真实整车Repository并保留绑定仓,取消出库不再被整车自动创建的唯一Fleet关系误阻断;ACTIVE/装车前/零真实扫码发运、子单未执行与费用门禁保留。本轮总控还收敛实际旧模型的直接查询消费者:`DispatchFeeCargoMapper`及`DispatchFeeCargoMapperTest`、`PlatformDispatchOutboundContractTest`;无生产调用的`DispatchCargoSourceQuery`删除,原真实来源断言转到现行FleetAdapter。另由总控唯一修改`LastlegOrderMapper.findDispatchStatuses`、`InventoryCommandMapper.shipmentSources`、`InboundPlanQueryMapper.SCHEDULED_DISPATCH`、`AppointmentImpactRelationMapper.dispatches`及四份直接查询测试;仅调整共享头身份/阶段,明细客户、真实库存命令、仓库及取消边界继续核验,不改预约创建。`FleetAppointmentImpactMapper`由主后端单写同一模型的绑定查询,双方不并写。没有新增异常、库存、外接或预约业务。
### 本轮测试环境实施授权补充
用户随后明确授权总控部署测试环境、操作测试数据库、调用真实HTTP,并使用内置浏览器登录验收样式、交互及请求量;Admin/Client按1920×1080,国内/海外PDA按390×848。此前仅离线检查、默认不部署和由用户截图的限制在此精确范围内由新授权取代。目标仍为本契约所属TEST项目及当前排车改造,不接管日历新增预约,不操作开发或生产环境。总控统一协调发布、SQL及环境写入,先核对匹配源码、结构、权限和现有运行版本,执行后按实际证据维护环境主契约;部署成功、HTTP通过和浏览器验收分别记录。
本轮换标出库取消修正的唯一实现者为总控内部`native_capacity_consumers`,只写`DeliveryTransferService.java`、`DeliveryCancellationRepository.java`及`ReturnOutboundClosureTest.java`;覆盖原生箱及普通仓托,保留原配送方式、已确认成果及库存事实,TRUCK退回待排车,其他方式退回待独立安排。不把非TRUCK来源改成TRUCK、不重跑换标完工确认或新增旧独立出库安排API。非TRUCK再次独立安排入口的接线尚不属于本次取消修正,不以取消持久化成功推定再次安排已完成。后端其他写者冻结这三文件,Maven仍由主后端统一执行。
## 十 日历新增预约的范围分离
用户澄清“新增预约”应放在预约日历,并指定由对话 `01a15231-2507-7802-8015-34b01f5eb2c4` 处理,明确本总控不用接管。三个排车任务不修改预约日历的新增预约表单、权威预约模型或预约新建API,也不承担其设计和矩阵;本批只处理整车改造确实影响的既有预约读取/关联消费者,有限接线写权见第九节,不自行接管新增预约或跨对话派工。
@@ -0,0 +1,222 @@
# 自有业务后端接口设计
2026-10-20 总控已冻结v1,进入独占包实现;尚未执行Maven或环境验收。业务唯一依据为[首版开发契约](自有业务首版开发契约.md),已纳入其第11/12条:计划发车日期筛选、四项统计同一完整筛选,以及独立居中的运营登记弹窗。所有编号以 `dispatchNo` 为用户入口。
用户最新定位已收敛:本页是**原生排车列表装车完成后的自有车辆运营视图**。不创建第二个任务/车次主单,不保存第二份排车货物、预约、单据或审核/装车/发车/签收状态机;外配后续也消费同一排车事实。
### 原排车查询能否直接复用
- `DispatchViews.Query` 当前没有车辆ownership、计划发车日期范围和目的仓关键词过滤;`ListRow` 没有完整目的地/预约和附加运营信息。因此不能靠浏览器取一页后筛OWNED、求统计或逐行GET补齐,列表需要本包新增**只读数据库投影**。
- 原主单详情在服务端通过公开窄端口读取 `dispatch.port.DispatchDetailReader.detail(Actor, dispatchNo)` 的 `DispatchViews.Detail`,再组合本页附加信息;已核实其真实来源,不重写主单查询协议或状态推算。新详情响应建议保留一个明确的 `dispatch: DispatchViews.Detail` 字段;独立三页签由现有事实和附加信息映射展示,不改变排车四页签。
- 新API是有自身list/edit/upload权限的投影视图与附加信息入口,**不是第二套排车API**;原排车查询/Controller/DTO/Mapper全部保持只读,不要求额外公开主流程写动作。
## 1. 事实来源与装车归属捕获
| 事实 | 当前权威代码/数据 | 本页处理 |
| --- | --- | --- |
| 主单、三个阶段、计划/实际发车、装车时间 | `dispatch/entity/DispatchAggregate.java`;`ll_dispatch_order` | 只读 `ACTIVE` 且 `AFTER_LOADING/DELIVERING/DELIVERED`,必须有真实装车确认;不以 `DEPART` 历史作为入选前置 |
| 实际托数 | `DispatchContracts.ConfirmedLoad.pallets`;`loading_confirmation_json` | 按 `warehousePalletId` 去重数,不取逻辑明细数,不合计 `palletSpaces`;缺少可信确认时不伪造托数 |
| 车辆、司机、容量 | `resources_json` 的 `DispatchContracts.Resources` | 读取本趟快照;`VehicleSnapshot` 没有 ownership 字段,`MASTER` 也不等于自有 |
| 当前车辆归属 | `masterdata/vehicle/.../VehicleRepository.VehicleSnapshot.ownership`;`ll_vehicle.ownership` | 有真实 `OWNED/DISPATCHED`,但车辆可在未占用时改归属;当前表不能独自证明历史归属 |
| 历史车辆归属 | 原快照未保存ownership | 已冻结在装车完成同事务捕获真实OWNED/DISPATCHED;根接唯一hook,旧已装车TEST无快照不回填、不按当前主档降级 |
| 多目的仓、货物、各客户 | `ll_dispatch_item`、真实来源及其 destinationKey | 服务端批量汇总;同车一行,各客户来源保留 |
| 预约号、时间和分配数量 | `ll_dispatch_appointment_allocation` + `ll_inbound_fba_appointment`;查询规则见 `DispatchReadMapper.batches` | 按 destinationKey/实际分配关联返回数组,不取首个预约,也不按客户重复整车 |
| 到达、里程、燃油、运营金额 | 当前主单无此页独立权威登记 | 新增附加记录;不推导到达、不改签收、不写Finance、不改排车版本 |
`fleet/reporting/TripOperationsRepository` 仅查实际发车且按货源分类,并使用旧 JdbcTemplate;本模块不复用它的业务过滤或持久化实现。新模块严格 `Controller → Service → Repository → @Mapper`。
## 2. API、权限与入口
统一前缀 `/api/platform/v1/last-leg/fleet/owned-business`。全部要求可信平台身份 `appCode=PLATFORM, tenantId=0`,服务端重复核对真实归属、阶段和仓权限,不接受浏览器声明 ownership/客户归属/托数。
| 方法与相对路径 | 权限 | 作用 |
| --- | --- | --- |
| `GET /` | `platform:fleet:owned-business:list` | 分页与完整筛选四项统计同一只读快照返回;浏览器不逐行GET |
| `GET /{dispatchNo}` | 同上 | 独立三页签所需任务车辆、路线货物与凭证、附加信息及版本 |
| `GET /{dispatchNo}/history?page=1&size=20` | 同上 | 真实操作记录分页;无模拟初始操作 |
| `PUT /{dispatchNo}/operations` | `platform:fleet:owned-business:edit` | 运营弹窗保存;整车金额、逐目的地到达、里程与燃油同一附加版本 |
| `POST /{dispatchNo}/photos/{slot}/uploads` | `platform:fleet:owned-business:upload` | multipart `file` + `idempotencyKey`,只准备一个真实文件,不假称已经保存照片 |
| `PUT /{dispatchNo}/photos/{slot}` | 同上 | 将已上传的 fileId 绑定/替换到该分类框;独立于运营编辑权限 |
| `GET /{dispatchNo}/photos/{slot}/files/{fileId}/content?revisionVersion=` | list | 当前或明确历史版本中已绑定文件的授权代理读取,不返回File内部地址 |
| `GET /{dispatchNo}/commands/{idempotencyKey}` | list | 按当前操作者恢复本页写命令;不允许读取别人的命令载荷 |
没有创建主单、改变运输状态、删除运输或费用发布接口;不公开内部 dispatchId/tripId 作为业务编号。
## 3. 冻结v1 DTO
以下为已冻结v1结构,源码与OpenAPI按本节同步。所有 Long ID/版本通过现有Jackson策略无损输出;Money/数量测量用规范十进制字符串传输并在服务端BigDecimal校验,金额/单价不交前端重新计算。
```ts
type Stage = 'AFTER_LOADING' | 'DELIVERING' | 'DELIVERED'
type PhotoSlot = 'LOADING_SCENE' | 'LOADING_LIST' | 'PRE_DEPARTURE_CHECK'
| 'DRIVER_LICENSE' | 'RECEIPT' | 'FUEL_START' | 'FUEL_END'
type Money = { currency: string; amount: string }
type Arrival = { destinationKey: string; actualArrivedAt: string | null }
type Photo = { slot: PhotoSlot; category: 'LOADING'|'FUEL'; fileId: string;
fileName: string; contentType: 'image/jpeg'|'image/png'; sizeBytes: string;
uploadedAt: string; savedAt: string | null }
type Operations = { money: Money | null; actualDistanceMiles: string | null;
fuelConsumptionLitresPer100Km: string | null; arrivals: Arrival[] }
type Gate = { allowed: boolean; blockReason: string | null }
type Destination = { destinationKey: string; warehouseCode: string | null;
warehouseName: string | null; address: string | null;
appointments: { appointmentNo: string; confirmationNo: string | null;
scheduledAt: string | null; allocatedPackages: string }[];
actualArrivedAt: string | null }
type Row = { dispatchNo: string; stage: Stage; plannedDepartureAt: string;
loadingCompletedAt: string; departedAt: string | null; deliveryCompletedAt: string | null;
origin: { warehouseId: string; warehouseCode: string; warehouseName: string };
vehicle: { vehicleId: string; plate: string; ownership: 'OWNED' };
driver: { name: string | null; phone: string | null };
destinations: Destination[]; actualPalletCount: number | null;
operations: Operations; unitPrice: string | null; recordVersion: string;
dispatchRecordVersion: string;
photoSummary: { loadingCount: number; fuelCount: number };
actions: { edit: Gate; upload: Gate }; sourceIssues: string[] }
type Query = { page?: number; size?: number; plannedDepartureFrom?: string;
plannedDepartureTo?: string; keyword?: string; stage?: Stage; warehouseId?: string }
type ListResult = { records: Row[]; page: number; size: number; total: number;
summary: { dispatchCount: number; afterLoadingCount: number;
deliveringCount: number; deliveredCount: number } }
type Detail = { row: Row; dispatch: DispatchViews.Detail;
cargo: { sourceKey: string; customerId: string; customerName: string | null;
orderNo: string | null; inboundCode: string | null; palletNo: string;
destinationKey: string; packages: string }[]; photos: Photo[] }
type SaveOperations = { recordVersion: string; idempotencyKey: string;
operations: Operations; reason: string | null }
type BindPhoto = { recordVersion: string; idempotencyKey: string; fileId: string }
type Command = { dispatchNo: string; action: 'SAVE_OPERATIONS'|'UPLOAD_PHOTO'|'BIND_PHOTO';
idempotencyKey: string; state: 'SUCCEEDED'|'PENDING'|'UNKNOWN_RESULT'|'REJECTED';
recordVersion: string | null; replayed: boolean; result: Detail | Photo | null;
errorCode: string | null; retryAllowed: boolean }
type History = { eventSource: 'DISPATCH'|'OPERATIONS'; recordVersion: string | null; dispatchRecordVersion: string | null; action: string; operatorName: string | null;
occurredAt: string; reason: string | null; operations: Operations; photos: Photo[] }
```
- 日期筛选明确对应 `planned_departure_at`;接口接收带时区的ISO时间边界,`[from,to)`,前端按最终选定显示时区将日期范围转换,不能靠数据库会话时区猜测。
- page默认1、size默认20且1–200,keyword最长128;匹配dispatchNo/车牌/实际目的仓,不匹配内部ID。
- 四项统计与列表使用完全相同过滤条件,按dispatch去重,统计不带LIMIT;stage筛选也同时作用于统计。标题为“排车数”,没有“固定今天”分支。
- `recordVersion` 是本页附加版本,未登记时只读返回`0`,不因GET建记录;第一笔成功绑定/登记返回`1`。不占用、不回写主单recordVersion。
- `dispatchRecordVersion`仅用于原排车事实的只读定位;运营保存和照片绑定提交本页`recordVersion`,不可混用这两个版本。
- 0金额表示明确登记零;`money=null`表示未登记。Money存在时currency和amount必须成对完整,金额`DECIMAL(18,2)`非负;单价`amount/actualPalletCount`按HALF_UP两位,只读返回;未知/零托数返回null。
- 币种仅CNY/USD,不预选、不换汇;同一dispatch只有一份money,允许同一版本化编辑更正或清空,并留不可变历史。money=null与明确0严格区分。
- 多目的地实到以原车实际destinationKey集合为边界,不额外设置站数上限,禁止重复/不属于该车的key;不要求首站到达等于签收。输入时间必须带时区;不以estimatedArrivalAt或signedAt回填。
- actualDistanceMiles为mile;fuelConsumptionLitresPer100Km为手工登记的L/100km,均可空或明确0,非负、DECIMAL(12,3)。不派生总燃油量,不写默认18.6。
- 7个PhotoSlot来自原型最终函数的5个装车框和2个油耗框;`DRIVER_LICENSE`/`RECEIPT`只表示本页图片位置,不审批司机资格,也不触发派送签收。每框一个当前文件,替换保存不可变历史,不删除File对象。无照片清空入口,避免扩大当前原型操作。
## 4. 保存、命令恢复与错误
1. 编辑/绑定先核对平台、权限、真实自有资格和三个阶段,再读取/创建附加行。并发首次创建依dispatch唯一约束串行;同一附加行内CAS版本、命令成功结果及历史同事务提交。
2. 命令唯一键为dispatchId + idempotencyKey,另存operatorId并强制匹配;摘要包含action、原recordVersion和完整规范化载荷。同键同操作者同摘要返回原结果,不同操作者403、同键异载荷409。重放先于新写版本判断,不修改原版本重发。
3. 新增独立上传命令意图,文件调用前持久化`PENDING`且不持业务行锁跨HTTP;成功后记录原fileId和元数据,不推进附加版本。上传响应未知转`UNKNOWN_RESULT`且`retryAllowed=false`,禁止自动换键/重复上传;GET命令返回原已知状态。现有File没有此业务上传请求键的查找接口,因此不承诺把未知上传自动恢复为成功。
4. 绑定时复核File的tenantId=0、两个受控businessType之一、businessId=本单内部dispatchId、fileId、JPG/PNG及大小;绑定成功才标记照片已保存。上传失败不创建新的业务主单;已知成功上传的fileId可保留原请求另行明确恢复绑定,未知文件不伪造已上传。
5. 不持派送、库存、Finance或车辆占用写锁;只写本页附加行/命令/历史。源读取与CAS的并发保护需要第7节捕获的稳定装车事实;没有新排车状态机。
6. 入口沿现有HTTP200+业务code约定;缺版本/无效金额/非法目的地为参数错误,身份与权限拒绝为403/A0403,缺主单为404/NOT_FOUND,附加版本变化/源事实变化/同键异载荷为409/A0409。普通参数/权限/缺失/版本错误沿项目A0400/A0403/A0404/A0409;上传命令另存OWNED_UPLOAD_UNKNOWN_RESULT诊断码,正文不向用户展示内部ID。
## 5. 新增结构(根维护实际DDL)
全部在Lastleg schema,MySQL8,内部BIGINT主键;表与列按根要求完整中文COMMENT。新包不写初始化或增量SQL文件。
| 表 | 精确主要字段与约束 |
| --- | --- |
| `ll_fleet_owned_business_record` | `id BIGINT PK`;`dispatch_id BIGINT NOT NULL UNIQUE`;`record_version BIGINT NOT NULL`(持久行首次成功为1);`currency VARCHAR(3) NULL`;`total_amount DECIMAL(18,2) NULL`;`actual_distance_miles DECIMAL(12,3) NULL`;`fuel_consumption_litres_per_100km DECIMAL(12,3) NULL`;`arrivals_json JSON NOT NULL`;`photos_json JSON NOT NULL`;`created_by/updated_by VARCHAR(64)`、`created_at/updated_at DATETIME(3)`。Money成对、非负与JSON形状由业务层及可实现CHECK约束共同保证 |
| `ll_fleet_owned_business_command` | `id BIGINT PK`;`dispatch_id BIGINT`、`idempotency_key VARCHAR(128)`联合唯一;另存`operator_id VARCHAR(64) NOT NULL`;`action VARCHAR(32)`;`expected_version BIGINT NULL`(上传无需编辑版本);`request_hash CHAR(64)`;`request_json JSON`;`status VARCHAR(24)`;`result_json JSON NULL`;`error_code VARCHAR(64) NULL`;`created_at/updated_at DATETIME(3)`。保留原请求和原结果,不只保存hash |
| `ll_fleet_owned_business_history` | `id BIGINT PK`;`dispatch_id BIGINT`、`record_version BIGINT`唯一;`action VARCHAR(32)`、`operator_id VARCHAR(64)`、`reason VARCHAR(1000) NULL`、`snapshot_json JSON`、`occurred_at DATETIME(3)`;索引`(dispatch_id,record_version)` |
| `ll_fleet_owned_business_ownership` | `dispatch_id BIGINT PK`;`vehicle_id BIGINT NULL`;`resource_mode VARCHAR(16) NOT NULL`;`vehicle_ownership VARCHAR(16) NOT NULL`;`vehicle_record_version BIGINT NULL`;`ownership_captured_at DATETIME(3) NOT NULL`;`loading_completion_hash VARCHAR(128) NOT NULL`;`loading_completed_at DATETIME(3) NOT NULL`。MASTER读真实VehicleRepository;原dispatch EXTERNAL资源原样保存,并记DISPATCHED及null车辆版本;仅保存归属证据,不复制主单/货物/状态 |
金额、arrival、photo可以用有界JSON存附加行,暂不新增逐目的地/逐图片业务表;历史提供文件旧版本授权依据。并发初建使用唯一键+事务锁,不用未保存的随机业务ID假造记录;主单表不更新。
## 6. 查询与分层实现
新增包内 `controller/OwnedBusinessController`、`model/OwnedBusinessModels`、`service/OwnedBusinessQueryService`、`OwnedBusinessRecordService`、`OwnedBusinessPhotoService`、`repository/OwnedBusinessRepository`、`mapper/OwnedBusinessQueryMapper`、`OwnedBusinessRecordMapper`、`OwnedBusinessCommandMapper`、`OwnedBusinessHistoryMapper` 及`gateway/OwnedBusinessFileGateway`。
所有Mapper显式`@Mapper`,由既有Lastleg根扫描注册。GET为repeatable-read快照;count/四项统计共用同一SQL过滤片段,再做主单分页,页内目的地、预约及货物使用dispatchId集合批量查询,Mapper局部只读复用真实表,不循环调用排车GET或浏览器逐行补数据。细节API直接给三个页签所需数据,不把旧车次八页签整体搬来。
## 7. 根负责的精确外部触点
1. **已冻结唯一捕获hook**:根在DispatchAggregateService.loadingComplete最终确认时点同事务调用本包port.OwnedBusinessOwnershipCapture.capture(long dispatchId, Long vehicleId, String resourceMode, String loadingCompletionHash, Instant loadingCompletedAt)。实现经Repository→Mapper持久化,MASTER只普通读VehicleRepository真实归属/版本,不反向加车辆写锁;EXTERNAL记DISPATCHED。相同原事实捕获重放只返回,异事实拒绝;原命令已成功的回放不补写。
2. **旧已装车单**:无归属快照不回填、不在GET降级使用当前主档;本页不纳入,原排车读取完全不变。新原生样本用装车同事务快照验收。
3. **文件分类(根已明确冻结)**:`OVERSEAS_DISPATCH_LOADING_PHOTO`、`OVERSEAS_DISPATCH_FUEL_PHOTO`,平台tenantId固定0、businessId为原dispatch内部ID,JPG/PNG、每文件10MiB及内容签名校验。根唯一修改File分类、直接测试和契约;本包新增代理只按此消费,并承担原dispatch可见性、类别及当前/历史引用授权。不复用客户POD、司机、运维或车次运营类别授权,也不把dispatchId冒充tripId。内部HTTP沿`/internal/file/v1/business-files/0/{type}/{dispatchId}`,不将该地址或内部业务ID交浏览器。根共享File接线不阻断本包结构实现。
4. **IAM/导航/Gateway/SQL**:根集成3权限及角色授权、Admin路由菜单、Lastleg及统一基线、Gateway合同。路径已落在现有Lastleg域,但仍由根验证实际路由注册,不推定可达。
5. **照片保存语义已冻结**:逐槽上传后绑定立即保存;绑定失败保留原fileId和原绑定键恢复,不重复上传;绑定成功才显示已保存,关闭弹框不写数据。
## 8. 冻结与验证安排
v1所有业务项已冻结。仅根接共享hook、File、权限及4表基线;独占包继续实现,不等待其他无关任务。
本包实现及有意义的定向测试预计2–3小时;根统一排队的编译/Maven、共享接线和环境验收另计。每阶段交付记录在本设计末尾,实际通过仅按根执行证据报告。
## 实现检查点(根统一验证前)
- port.OwnedBusinessOwnershipCapture及MANDATORY捕获提供者已落源码;根只需现有唯一loadingComplete hook。原dispatch实际模式MASTER/EXTERNAL原样持久化,不引入另一套资源模式枚举。
- 原排车和附加流水由UNION ALL在同一查询排序分页,History区分eventSource和两个可空版本;原排车事件operations=null、photos=[],不复制原流水。
- 四表DML已按根当前lastleg.sql末部字段实现:更新显式写NULL;命令二元唯一且摘要含操作者/action/原版本/请求。源码与直接回归仍在收口,尚未运行任何检查。
### 根集成所需精确门禁触点
- `scripts/synchronous-dependency-baseline.mjs`:新增 `lastleg-service/.../fleet/ownedbusiness/gateway/HttpOwnedBusinessFileGateway.java` → file-service,REQUEST、READ_WRITE、MIXED。元数据和内容只读;上传无File远端幂等键,本域写前持久化意图、未知停写,不能自动重试。
- `lastleg-service/src/test/resources/architecture/lastleg-slice-dependencies.json`:原baseline不允许宽泛fleet→dispatch-delivery,需要逐类只读边评审。本包实际复用为 Models→DispatchViews;Rows/QueryMapper/Repository仅使用本包Source与CargoRow只读投影,不依赖dispatch实体;Projection→公开DispatchContracts;QueryService→公开DispatchDetailReader/DispatchContracts/DispatchTypes。根hook的DispatchAggregateService→OwnedBusinessOwnershipCapture只依赖窄端口,不回调本页查询。后端不得借此访问或修改派送/库存/Finance持久化。
- OpenAPI新增文档数、Gateway自动发现Controller及Mapper注册合同均由根统一执行,不在本对话重复门禁;实际通过尚待根。
- 新附加历史从可信会话保存operatorName到snapshot;原排车历史只有operator_id、缺少姓名权威时operatorName=null,不把内部ID伪装成姓名。
- 根已冻结读取边界:本包不继承DispatchAggregate,不返回DispatchItem,不引用DispatchAggregateService。Source/CargoRow仅描述原SQL所需字段;详情经新公开DispatchDetailReader提供,根唯一维护适配及精确port依赖基线。
### 源码候选完成,等待根统一验证
- 新包生产16文件、独占测试包(夹具与7个测试类)、独立OpenAPI已完成首轮实现,未改主单/派送/财务/库存状态机;原4表DDL及hook根独占。
- 直接回归包含H2读取根4表基线、真实MyBatis NULL清空/CAS、并发0版本单胜出、原键重放、非法目的地不落记录、照片替换与历史引用、原主历史合并分页、同筛选四统计、归属捕获随父事务回滚、异账号恢复403及未知上传不重发。只是测试源码交付,尚未执行。
- 根可统一运行test-compile和7个OwnedBusiness*Test,再按影响运行Mapper、Gateway、同步依赖、端口边及OpenAPI门禁;本对话没有启动Maven、任何检查或环境操作。
### 交根统一验证的冻结输入
- 25路径:生产16、测试8、OpenAPI1;Ordinal路径排序,各行`path|sha256`,UTF-8/LF且末尾一个LF。
- 聚合SHA256:`b8d7c7d9108fe0475410f950579879ca5b4e3819d05f08a3b6e90cdc99ac456f`。
- 当前35个自有业务测试声明已由根实际执行,结果见下方当前验证记录。
- 根已修正两份DDL的money CHECK;新增真实基线回归覆盖币种NULL/金额非空拒绝、两者NULL合法、明确CNY零金额合法及再次清空。
- 根已登记5条公开port读取边、同步File客户端依赖,并报告静态无包环;本对话未运行门禁。后续仅按根确切失败定点解冻。
```text
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/controller/OwnedBusinessController.java|913b4df8cf80f21bc42ea59459ef2a04136ab0d563a0145c4c94e3f233d7fe9a
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/gateway/HttpOwnedBusinessFileGateway.java|4e2bbbd5292df8d15cb689eabf57d270f11c177c4503dc44e73387398cf1d3fd
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/gateway/OwnedBusinessFileGateway.java|a6a3baedfa380dde6f0c3e9a39d6a7f5bf2fdf9e2a4e9b47f8d989ee4f546cfc
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/mapper/OwnedBusinessMapper.java|6317c3428f10b2ccb6f3b71135e117e01e3da76ad742e4e1cb37f74caf808c60
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/mapper/OwnedBusinessQueryMapper.java|d36deb1f2840c103e96de1aab867b03aa80bed9e1f755778afa91db564a037d8
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/model/OwnedBusinessModels.java|c2c7a953c9c9cacb57b059daf6134828d160e0351be97d27e231b7c821a32c1e
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/model/OwnedBusinessRows.java|5d31468f7c5f3f177fe7aef4063bc8f5e71b3f37f56e0b49beeb531ffb16277a
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/port/OwnedBusinessOwnershipCapture.java|f354de8142cbab49a7d42ab6837c2ba836b4940560dbabb100b0642cadd05b08
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/repository/OwnedBusinessRepository.java|27c7cf185e65907923bbbf18a05f10bdfa5e091da608e44a798600a061917ad5
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/service/OwnedBusinessCommandService.java|ac507f63245436cb31a2b99001d7c5c7ff9ae2938e7417d795ae17c18cf462e8
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/service/OwnedBusinessOwnershipService.java|e1a6d10ab69d44915bbff958a28df970cbdd26b6bb19c83118877c29d09e8868
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/service/OwnedBusinessPhotoService.java|e951d0314f66e4b9f5ad17fa70e7c413cc5c6a74eee6ece560223fc1b5787658
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/service/OwnedBusinessProjection.java|0a3a2ddb6368add9af5696f119fdbe31a1e807edcfc34a4fb0487b60d11d3cbf
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/service/OwnedBusinessQueryService.java|39512a8321dc15e88080570a138ea8c8b56f8ff834c5bc3ada3db4c173b8a586
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/service/OwnedBusinessRecordService.java|09a6af10f9bd4ecba2eb50ecd7b338c9b01498bf7ac397a785e5f13ca63669b6
lastleg-service/src/main/java/com/baiyue/lastleg/fleet/ownedbusiness/service/OwnedBusinessSupport.java|e6f71eca2ecb7dd1a1803a5600aa954a7517091c2f1e7c7678b743ee591a20b7
lastleg-service/src/main/resources/openapi/fleet-owned-business-v1.yaml|34ced2f1cde024701bc9900fd0248de875d2500c47b817aab42d7edc91183364
lastleg-service/src/test/java/com/baiyue/lastleg/fleet/ownedbusiness/OwnedBusinessCommandTest.java|562ef97a01e96ad8e7e951c9ac01f175caa4ee2e1b2b4dca766b9b24902ff524
lastleg-service/src/test/java/com/baiyue/lastleg/fleet/ownedbusiness/OwnedBusinessFileGatewayTest.java|df97ee090d18b8f1663715275ee18135a0bc81061edab3dd3042c35ae91a2148
lastleg-service/src/test/java/com/baiyue/lastleg/fleet/ownedbusiness/OwnedBusinessFixtures.java|dca8eb00914c23e9eec9b776a1800f063e2189e7d3a4b16190d04f35fba8d341
lastleg-service/src/test/java/com/baiyue/lastleg/fleet/ownedbusiness/OwnedBusinessOwnershipTest.java|6f22c03e61a80b8f238253645510b3f941de6ec11f18e2c5df49c8a78ed14eb2
lastleg-service/src/test/java/com/baiyue/lastleg/fleet/ownedbusiness/OwnedBusinessPersistenceTest.java|97836b6665b90186e74a17ec26ffbd2d71238ec7a7fc64d3a091e8bfe45ada08
lastleg-service/src/test/java/com/baiyue/lastleg/fleet/ownedbusiness/OwnedBusinessPhotoTest.java|b4e5f907ce6c56ac7a382788685b24f5989dd018120d0d77739f0af33bb543a2
lastleg-service/src/test/java/com/baiyue/lastleg/fleet/ownedbusiness/OwnedBusinessProjectionTest.java|412711599c45a9d547397087bf9090f48ff3efa44226af48fe41452f9b732358
lastleg-service/src/test/java/com/baiyue/lastleg/fleet/ownedbusiness/OwnedBusinessQueryTest.java|12ab10a71a61ca24556238ea2ae9ce7f6321a242b426c7171a67204db03ce3e6
```
#### 当前验证记录
- Projection仅将DispatchContracts星号import展开为ConfirmedLoad/Resources两条显式import;业务方法未变。逆向还原import后精确得到原45f60872… SHA,根Maven覆盖当前显式import字节。
- 根报告session24317 BUILD SUCCESS:65项、0失败、0错误、0跳过;其中自有业务35、原DispatchAggregatePersistence24、只读适配1、Mapper2、中文schema3。本对话未执行Maven。
- 本轮只读YAML/JSON Pointer核对:48个唯一可达引用,读取2份直接相关OpenAPI,未解析引用0个。DispatchDetail对应DispatchViews.Detail的13字段、required集合及四块结构一致。这不代替根的完整公开API/权限门禁,也不代表部署或HTTP通过。
#### 照片历史中文文案定点修正(待根复验)
- 仅OwnedBusinessRecordService和OwnedBusinessPersistenceTest解冻:7个照片槽位保存原因改为准确中文,现有真实Mapper绑定/替换历史断言均核对中文。未改状态、版本、接口或其他源码。
- 上方65项通过仅覆盖此前候选;本次新两文件输入未由本对话执行检查,待根直接受影响回归,不能扩展旧结果。
#### multipart文档定点修正及计划发车非空核实
- 仅独立OpenAPI解冻:上传idempotencyKey从query移到multipart requestBody,与file共同required,长度8–128保持;Controller、Java DTO、前端及业务逻辑均未改。
- plannedDepartureAt保留非空string:DispatchAggregateService.loadingComplete在写装车完成及捕获归属前调用verifyReviewResources;该方法明确拒绝row.plannedDepartureAt=null(原方法约602行)。原编辑入口requireEditing仅允许BEFORE_LOADING且零扫码,装车后不能经此清空计划发车。自有视图只纳入有新装车归属快照的三个阶段,因此正常受控写路径已保证非空;不新增业务必填门禁,不要求前端类型改为nullable。缺失/损坏存量不作为兼容依据,原无快照TEST仍不回填。
- 本次只读核对并修改文档;公开OpenAPI/权限门禁由根安排,未运行检查或环境HTTP。
@@ -0,0 +1,71 @@
# 自有业务首版开发契约
2026-10-20 用户明确先做自有业务,并授权复用既有后端、前端两个独立对话,与当前总控三方并行开发。本契约是本页唯一共同业务边界;实现、检查、部署及真实验收分别记录。排车 HTTP 扩展继续由原排车后端对话独占,不与本页并发操作其样本。
## 已确认规则
2026-10-21 用户确认按实际拼车货物分类:自有业务是未实际接入拼车货物的排车,外配任务是已实际接入拼车货物的排车,与车辆属于自有或外配无关。本契约维护自有视图;外配任务维护在[外配业务首版开发契约](外配业务首版开发契约.md)。两页共用原排车主单及真实履约事实,不另建第二套任务、车次主单、货物、审核、装车、发车或签收状态机。本次最小变更保留原页面、统计项及两页运营表单差异,不新增分类表或分类字段。
1. 自有业务按“无实际拼车货物”筛选,允许自有车辆、档案外配车辆及临时外配车辆;承运货物仍保留各客户真实归属。实际拼车的判定唯一见外配契约,列表、完整统计、详情及运营写入统一使用同一分类;同车多客户本身不代表拼车。
2. 从排车装车完成后展示,覆盖装车后、派送中、派送完成;不把审核通过或拣货核平本身当作装车完成。
3. 一张排车单就是一趟车,列表一张排车单一行;多个目的仓、预约号在行内展开,不按客户或目的地重复整车统计。
4. 后台登记一次整车总金额,单价由系统按整车总金额除以实际托数计算。用明确币种记录,不将该运营金额自动当作客户应收、车队应付、Finance入账或利润;不重复收费。金额未登记与明确零金额区分,实际托数为零时不除零。
5. 实际托数按真实物理托盘去重,同一实托承载两张换标单仍计一托;不得用逻辑明细数、客户数或标准占用托位冒充实际托数。
6. 实际到达时间、实际里程和油耗由后台补录;装车及油耗照片按原型上传。多个目的地的实到时间应与对应目的地匹配,不用签收或派送完成时间伪造到达,不自动推进排车或派送状态。
7. 列表统计、筛选、字段、查看明细和上传照片沿用户新版原型及模块原型核对矩阵;正式外观沿当前Admin高密度规范,操作列在第一列。
8. 详情为独立页面,三个页签为任务与车辆信息、路线货物与凭证、操作记录;排车详情仍保持其已确认四页签,旧车次附加功能不自动迁入本页。
9. 上传照片沿760px居中弹框,装车完成、油耗图片两个页签,JPG/PNG逐框处理;上传图片不等于确认装车。真实持久化、权限和版本明确核对后才记录已上传或已保存。
10. 不写原型的固定日期、默认18.6油耗、预设GPS/ETA、驾驶证状态、占位图片或示例操作历史。缺失显示未登记或—,不借内部ID回退业务编号。
11. 用户补充确认:按计划发车日期筛选,统计随同一筛选变化,原型“今日排车数”改为“排车数”。日期范围不硬编码示例日期,统计不以当前页行数代替全部筛选结果。
12. 用户补充确认:新增“登记运营信息”居中弹框,填写整车金额、逐目的地实到时间、实际里程和油耗;照片继续沿原型独立上传弹框。具体尺寸按当前Admin表单密度与字段数量处理,不改为抽屉。
13. 2026-10-21 字段核对确认:列表总价、单价、预约到达时间、实际到达时间独立成列,仍一车一行且按目的仓标识关联时间;“派送仓库”就是目的仓,复用同一来源展示,不新增独立仓库关系。“最晚装车完成时间”先留空显示“—”,不以计划发车或实际装车时间代替;保留已有计划发车列。图中仓库名称上方误写的“托数”保留正式名称“提货仓库”,物理托数仍只有一项;状态表头统一为“状态”。本项仅调整列表展示,不新增金额、日期写入或履约逻辑。
## 原型与实现差距
直接依据为用户提供 `C:/Users/BY-OY/Documents/WXWork/1688854456873012/Cache/File/2026-10/悦/悦/新版.html`:`page-vehicle-own-business` 8772行,详情8779行,上传弹框8791行;最终照片函数23082行覆盖22842行同名定义。模块 `PROTOTYPE_MATRIX.md` 的“自有业务准备核对”记录逐操作承载及原型错位。
正式源码已接入本页菜单、列表/详情路由及独立权限;共享路由与权限22项检查通过,尚未据此发布或认定真实页面验收。现有TripOperations仅按实际发车查询,并按OWN/EXTERNAL货源筛选,不能通过换标题或套用其筛选实现本页。车辆归属取原装车完成时点的真实OWNED/DISPATCHED证据;原排车事实、实际托数、预约及多目的地读取与附加运营记录按下文冻结接口实现。
原型统计标题和日期口径已由用户按第11项修正,运营补录承载按第12项冻结。历史车辆归属取值时点及真实提供者按下文接口冻结v1,不由浏览器用当前档案推算历史。
## 三方职责及写入边界
| 对话 | 本轮职责 | 唯一写入边界 |
|---|---|---|
| 排车派送与费用后端 `01a1524f-56a9-7320-a5fd-8ff76fa4356b` | 自有业务权威查询、附加运营记录及附件代理;先给正式API/数据设计,再实现与直接验证 | 新增Lastleg `fleet/ownedbusiness/`及对应测试、新增`fleet-owned-business-v1.yaml`、`docs/海外仓业务/自有业务后端接口设计.md`。其它生产目录与共享模型默认只读,需要触点先交总控协调 |
| 排车前端与PDA `01a1524f-52c7-7cc3-9b08-d34ad24c172a` | 列表、独立三页签详情、照片及运营补录操作、前端API/类型与直接回归 | Admin海外通用资料模块中新增OwnedBusiness前缀页面/组件、ownedBusiness前缀API/类型及其测试;共同API冻结前不猜DTO。不得写PDA或其它业务页 |
| 当前总控 `01a15230-a9d6-7503-a8a9-d70691df49e5` | 业务及接口冻结、共享接线、必要提供者与数据结构、集成及审查 | 本契约、原型矩阵、协作登记、Admin共享导航/路由/权限及测试、IAM和Lastleg初始化基线/必要增量SQL及必要直接File/Gateway接线。执行SQL/部署仍核对当前授权,不由专项自行触发 |
两个专项不修改AGENTS、共享runner、排车HTTP脚本、原排车/派送主链、旧出车记录实现、共享路由导航权限、数据库基线、依赖与锁文件。跨边界触点先交精确文件和原因,总控处理;不新建对话、不再委派、不创建分支/worktree/项目副本、不覆盖其它在途修改。
## 顺序与验收
1. 后端先提出API路径、字段、权限、原始事实来源、分页/统计、版本与幂等、附件归属、保存及历史、必要结构;原型未定义的字段不自动放进公开写模型。前端并行完成纯展示组件与逐操作矩阵,等待冻结API接线。
2. 总控核对并冻结共同合同,协调共享文件和提供者触点后,两个任务继续实现;技术例行选择不重复请用户批准,改变业务语义才询问。
3. 只读list权限包含详情、历史和已授权附件读取;保存及上传分别独立权限。所有过滤、所属车辆、阶段、真实单据归属、数量与金额计算由后端保证。
4. 写操作保存稳定请求键、版本与完整载荷,未知结果不当作失败重建;文件上传失败不重建业务记录。后端Money用明确十进制,单价按两位小数展示;前端不重算权威统计或用当前页行数作总数。
5. 覆盖自有/外配区分、装车前不显示与三个阶段、多客户多目的仓去重、同托多换标、金额缺失/零值/单价/币种、逐目的地到达、里程油耗及附件、并发版本/幂等/隔离/权限、空态失败及长编号。若存在需澄清字段,标未验证,不填假数据通过。
6. 所有测试、类型、构建、Maven经local-check串行;默认Node2GB/Java1536MB/CPU2,不继承先前一次性内存例外。先跑受影响检查再统一完成必要门禁,不各自重复全量。
7. 本轮开发不自动授予提交推送、SQL执行、环境发布、清理或业务写入。部署及本页真实HTTP由总控在匹配版本就绪后统一安排;Admin1920×1080、100%缩放人工截图验收,代码通过不代表页面已验收。
## 接口及技术冻结 v1
共同API结构以 `自有业务后端接口设计.md` 第2、3、4节为基础,并以下列最终规则覆盖草案中的待选项。两任务可据此实施,不再等待重复业务确认。
- API前缀 `/api/platform/v1/last-leg/fleet/owned-business`;公开业务身份dispatchNo。前端路由 `/overseas-master-data/owned-business` 及 `/:dispatchNo`;list/edit/upload权限分别为 `platform:fleet:owned-business:list/edit/upload`,新增查看不授予主排车操作权限。
- 查询投影仍读取原排车及真实关联表,详情组合原 `DispatchViews.Detail`,不复制履约主模型。附加运营recordVersion与只读dispatchRecordVersion分别返回,初始附加版本0合法;GET不建记录。
- 油耗按原型单位L/100km,手填字段 `fuelConsumptionLitresPer100Km`;实际里程为mile,字段 `actualDistanceMiles`。不把油耗率变成燃油总升数,不自动推算总油量。
- 金额币种沿已有CNY/USD,必须明确选择,不预选不换汇。一份整车金额可在同一版本化编辑中更正或清空,并保存历史;“登记一次”表示同车唯一记录,不是一次提交后永久不可编辑。零值、未登记及单价除零按既有条款区分。
- 照片沿原型七框,逐槽上传后绑定立即保存;只有绑定回执成功才显示已保存。上传成功绑定失败保留原fileId、绑定请求键及载荷,重试只绑定;未知上传保留原命令,不自动重新上传或虚称恢复成功。关闭弹框不另造保存动作。
- 车辆归属仍按原排车装车完成时点冻结,仅作车辆事实及装车依据一致性校验,不再决定业务分类。两个入口的vehicle.ownership均可为OWNED/DISPATCHED,临时车辆vehicleId可空;按真实快照返回,不能以所在页面改写车辆归属。原loadingComplete捕获点不变,旧已装车TEST无车辆快照不回填、不按当前主档猜测;原排车读取不受影响。
- 数据表为附加record/command/history及ownership证据,结构由后端提出、根维护基线;文件分类为 `OVERSEAS_DISPATCH_LOADING_PHOTO`/`OVERSEAS_DISPATCH_FUEL_PHOTO`,平台0、businessId=原dispatch内部主键,JPG/PNG、10MiB。没有新的主排车状态机、客户收费或Finance写入。
- 附加命令唯一键为 `(dispatch_id,idempotency_key)`,记录并验证原operator;异操作者复用原键A0403,不按操作者分组创建第二条命令。同一原操作者只恢复同动作、原版本、原载荷,异载荷A0409;上传和绑定各保留自己的稳定键。
- 操作记录只读聚合原排车真实历史与本页附加历史,不复制原流水。历史明确 `eventSource=DISPATCH/OPERATIONS`,附加recordVersion和原dispatchRecordVersion可分别为空,不混淆两个版本序列;原排车事件不伪造运营快照或照片,运营事件保留其真实快照。
## 当前集成与验收记录(2026-10-20)
- 前端18文件候选`3deb4b56181d2b323298289cde353d1b0ced1cd75f41160ef28c04cd1f94fb40`已逐字节复算;新增页面/弹窗及API六文件直接测试连同共享路由、菜单、密度合同共113项通过。`pnpm typecheck`与`pnpm build`在默认资源限制下通过,完整Admin453文件4087项全部通过;核对全量运行窗口没有Admin TS/Vue/CSS源码改动,不继承旧批次的内存例外。
- 后端首轮统一Maven65项全部通过(本域35、原整车持久化24、只读适配1、Mapper架构2、中文基线3),含原装车捕获失败回滚、不改原主单版本、同实托多来源计一次、真实Mapper/CAS清空及并发、照片历史授权。随后只修正照片保存历史中的内部枚举文案及直接断言,受影响持久化/照片15项及IAM种子5项复验通过。最终25路径候选`b8d7c7d9108fe0475410f950579879ca5b4e3819d05f08a3b6e90cdc99ac456f`仅再收敛独立OpenAPI的multipart上传键声明,不改实际调用。装车完成沿原verifyReviewResources守卫要求计划发车非空,本页不新增门禁。
- File两类平台排车照片及相邻凭证回归21项通过;Mapper扫描406项注册及AGENTS索引1229项通过。新增OpenAPI八路径、39个直接引用可解析,原详情引用保留现行13字段结构。
- 最后全仓API/依赖联合33项全部通过,含Gateway五项和Lastleg依赖十四项。本域只登记五条公开只读端口引用,不开放fleet→dispatch通用许可,不保留实体或具体Service依赖和包循环。根对共享检查发现的六个现存客户端仅补同步依赖事实分类:四个Feign只读,两个HTTP沿真实背景诊断/请求照片读写分类;没有修改它们的业务实现。图谱保留实际Firstleg→Lastleg请求边及原有最长六跳风险,不提高预算或隐藏粗粒度环。明细证据在根`.codex-temp/owned-business-api-contracts-20261020.xml`。
- 本轮获用户明确批准后,最小环境SQL已完成:四张空附加表、三权限及仅PLATFORM_ADMIN授权,四subject持久权限版本和会话刷新;File #154已发布且248项CI通过、实际容器healthy。Admin实际#659已包含本域全部23路径,逐文件核对一致,不重复发布。Lastleg固定38路径候选7c6a已独立复核无阻断,CI #381全量检查进行中,尚未部署;真实HTTP和1920×1080、100%人工截图仍未验收。实时环境事实唯一见部署主契约。旧已装车TEST无归属快照不回填,HTTP使用新原生合成测试资料,与人工原单隔离;明确区分正式HTTP真实写入、TEST合成测量输入和现实硬件/实物测量未验收。
@@ -64,6 +64,7 @@
3. 节点按固定序号单调推进;迟到的较早节点仍保存为历史事实,但不能回退最新实际节点。
4. 同一供应商事件使用稳定 `providerEventId` 幂等;重复查询不得重复插入。
5. 一个供应商事件只映射一个最精确的标准节点,不因中间节点缺失而自动补齐整条链路。
6. 柜级实际到港时间在预约日历、清关提柜列表与详情中统一读取 `ARRIVED_DESTINATION_PORT` 的最新非空实际事实:按 `observedAt` 降序,同观测时间按事实记录顺序降序选一条。后续观测可能修正为更早的实际日期,不得用历史 `actualAt` 最大值覆盖新观测;仅有预计时间的观测不覆盖已取得的实际到港时间。本规则不改变节点序号推进或已保存事实。
## 4. 异常事实
@@ -4,14 +4,16 @@
本节来自用户本次确认,优先于下文 V13 对预约列表入口、类型与承载方式的早期规定;下文数量、客户隔离、真实执行等原业务约束继续适用于各自业务模块。
- 预约列表恢复用户截图 `codex-clipboard-840bcc07-6b54-4afa-9dc7-666d09ff04f2.png` 的左侧月/周日历、右侧当天安排。类型仅为到港、排车、还柜、计划到仓;每日期格最多三条预览,完整记录在右侧查看。保留当前范围搜索和未定日期入口。
- 预约列表恢复用户截图 `codex-clipboard-840bcc07-6b54-4afa-9dc7-666d09ff04f2.png` 的左侧月/周日历、右侧当天安排。类型仅为到港、排车、还柜、计划到仓;货柜事项以柜次号作为主标识,集装箱号只在明细与检索中展示;每日期格最多三条预览,完整记录在右侧查看。保留当前范围搜索和未定日期入口。
- 月视图按当月所需显示4、5或6个完整周,仅在首尾周补齐相邻月份日期,不固定追加六周。2026年10月显示9月28日至11月1日,不显示11月2—8日整周;日历查询同步采用实际展示范围,周视图仍为7天。
- 到港优先实际到港,缺实际时采用预计到港。计划到仓默认在该到港当地日期上加两个自然日,跨月和夏令时仍按日期加两天,不补造具体时刻。人工保存的整柜时间优先,已有入库计划的冻结时间保持;尚未人工维护和未建计划的默认日期随到港事实变化。该默认值属于日历日期推算,不自动写入入库计划、不充当实际到仓。人工调整复用整柜预计到仓命令、原编辑权限、版本及幂等键;已有入库计划后仍不可改。
- 排车仅指海外仓送往 FBA/客户仓的真实车次,同车多客户只展示一次;已发车按实际起运仓当地日期,未发车按计划日期,取消车次不列入活动安排。港口提柜送海外仓不作为排车类型。
- 到港优先实际到港,缺实际时采用预计到港。计划到仓默认在该到港当地日期上加两个自然日,跨月和夏令时仍按日期加两天,不补造具体时刻。人工保存的整柜时间优先,已有入库计划的冻结时间保持;尚未人工维护和未建计划的默认日期随到港事实变化。预约日历“计划到仓”与清关提柜列表、详情“预计到仓”共用该日期规则,默认值显示日期并标明“默认/默认推算”,不补零点。默认日期由 Lastleg 统一读取 Firstleg 权威到港来源后解析,清关提柜、日历及生成入库计划共用 plannedDate/isDefault;读取时不写尾程订单,生成入库计划时冻结该日期,不补造零点,也不充当实际到仓;读取失败或已有计划但时间不一致时,不以默认日期掩盖缺失。人工调整复用整柜预计到仓命令、原编辑权限、版本及幂等键;已有入库计划后仍不可改。
- 排车仅指海外仓送往 FBA/客户仓的真实整车排车主单,一张主单中的多客户只展示一次;已发车按实际起运仓当地日期,未发车按计划日期,取消主单不列入活动安排。日历返回真实排车单号并进入排车详情;独立旧车次不作为日历来源,也不得将内部车次号当排车号拼接路径。读取沿用排车列表权限;从详情可返回原日历日期与月/周视图。港口提柜送海外仓不作为排车类型。
- 还柜未完成按原业务截止日期提醒,完成后按实际还柜日期展示;日历不独立计算或改写还柜状态,登记进入原货柜业务。
- 用户随后明确恢复日历顶部“新增预约”:本次先支持FBA,普通客户仓不在本次范围。居中弹框选择已有货物,核对真实来源后复用原预约表单与保存接口;同起运仓、同目的FBA仓可跨客户合约,保留原写权限、版本/幂等、未知结果重试及未保存保护。货物查询栏支持可搜索、可清空的目的FBA仓下拉框;选项来自同权限范围的权威美国FBA目录,不从当前分页推算。提交查询后回到第一页,翻页沿用目的仓条件,重置恢复全部目的仓;跨页已选货物仍保留并执行同起运仓、同目的仓校验。保存成功显示真实预约编号及内容,不自动创建车次,不增加第五类日历或手工编造到港/还柜等事实。
- 平台新建及重新登记 FBA 送仓预约时填写已取得的外部约号,直接保存正式确认,不再提供“先保存安排,等待对方确认”选项。确认开始、结束时间改为可选;预约列表的新增窗口不再显示这两个输入及其夏令时时差输入,未提供的确认时间保持为空,不从计划日期推造。其他原业务入口补充真实确认时段时仍执行地区时区、夏令时和起止顺序校验;已有取消、替代和只读记录仍展示真实历史状态。货物核对自动展示并带入有效货件号或追踪号:已补录的非空核实值优先,未补录货件时采用同客户原订单资料,只补过箱数的记录不得遮蔽原有编号;原资料确实缺失时仍须补齐。客户、来源版本、目的仓、货物完整性与外部约号唯一性校验继续执行。
- 入口移除全局工作待办、流程筛选、负责人分派、跟进、复核、责任交接,以及货物核实/分批/共约/共车编排入口;这些原业务在相应模块继续处理。仍由其他业务页面实际使用的精确来源或事项深链可以打开原业务表单,不恢复旧全局待办及筛选协议。
- 缺权限、来源失败或缺时区明确提示数据范围不完整,不能显示为全部完成或完整空日历。未知日期保留未定,不用浏览器当前日期、内部 ID 或假数据补齐。
- 排车日历同时返回各排车单货物快照中的关联集装箱号,以及货物通过同客户真实尾程订单关联的原装柜事件中的柜次短号(如 D1821),分别按单去空、去重;同车多个完整柜号、柜次短号均可在当前日历范围搜索,支持忽略大小写的包含匹配,仍只展示一条排车安排。没有装柜来源时不推测短号,也不依赖当月到港记录拼接短号。柜号只作检索和展示,不改变客户归属、货物数量或排车状态。详情明确展示起运仓时区及当地计划出发时间;北京时间与美国当地日期可能跨日,不把浏览器日期用作日历归属。
- 缺权限、来源失败或缺时区明确提示数据范围不完整,不能显示为全部完成或完整空日历。未能定位日期的排车提示具体排车单号和原因,避免误认为当前搜索的单据缺资料。未知日期保留未定,不用浏览器当前日期、内部 ID 或假数据补齐。
代码与自动检查、部署、真实 HTTP 及人工视觉验收分别判定;本次 UI 目标仍为1920×1080、100%缩放,用户截图确认后才记录视觉通过。
+287
View File
@@ -1,7 +1,156 @@
# 测试环境独立任务协作登记
## 2026-10-22 用户反馈18项修复与发布验收
总控为“22号问题总控”`01a16320-fcec-7332-8223-0b51e9c382e9`,目标为 TEST 项目 `c64729ff-6710-43c6-8ef2-d84e9666cc1e`、host `local`、当前工作区 `C:/Users/BY-OY/Desktop/code/chongchong-global`。复用现有任务,不新建聊天、分支或 worktree,不操作开发工作区。
用户明确纠正:`01a16323-8ab4-7a83-be01-df8966f4ac8d` 是由用户直接跟进请求重放问题的对话,不接受本总控新增派工、优先级、冻结或交接要求。此前相关追加要求撤销,总控停止向它发送消息;它不承担本批12–18项。其既有差异保留,由总控只读核对交付和文件边界。
用户已授权全部代码提交、TEST部署、测试数据库操作、真实HTTP调用,以及随后内置浏览器登录验收。Admin/Client按1920×1080,国内/海外PDA按390×848验收。最新目标同时要求验收请求重放机制删除后的行为;该验收由总控负责,不给上述独立对话追加任务。凭据只从用户指定私有配置目录读取,不进入源码、文档或公开报告。实际发布、SQL和HTTP/UI结果只维护在[测试环境主契约](测试环境单机部署与配置契约.md)。
需求梳理已经结束,本批实施1–18;第19项“快递派送”明确暂缓。第12项放舱后仅允许维护预计到港,其他冻结资料不放开;第14项删除“调整已有排车货物”页签及调整能力,错误配货按现有资格取消并重新建单,不迁移调整入口或自动取消。第18项沿现有槽位命名“装车现场、装车清单、发车前检查、驾驶证、回执”。
| task_id | 对话及稳定职责 | 本批交付与边界 |
| --- | --- | --- |
| `01a16323-754a-7002-90a6-547545105647` | 22号修复|订单审核与称重 | 1–3、13、17–18已交付并停止编辑;海外PDA样式和五照片名称在总控只读核实原写者结束后接续完成,69项直接检查通过。 |
| `01a16323-7a96-7182-a73c-7ffa47b53b72` | 22号修复|订舱关联与报关 | 4–5、12已交付;Admin和Firstleg预计到港窄维护、柜号规则及预录单展示。数据库规则由总控按本轮授权审阅执行。 |
| `01a16323-8036-7353-b467-fe3e8465628f` | 22号修复|排车与车辆资料 | 6–9、11、14–16已交付并停止编辑;删除货物调整入口、1100px审核弹框、真实创建时间;末轮159项相关检查通过。共享样式测试另有4项非本轮页面失败,不据此宣称整套通过。 |
| `01a16323-8ab4-7a83-be01-df8966f4ac8d` | 22号修复|PC与PDA请求错误锁定清理 | 用户直接跟进的独立请求重放处理;不接受本总控派工或交接要求。已有源码由总控集成、部署及验收,不改派其职责。 |
共享文件实现已结束,进入总控固定版本、发布及真实验收阶段。执行专项不自行部署、执行SQL或改测试数据。总控保留其他对话已有修改;测试/构建经 `baiyue-firstleg/scripts/local-check.ps1` 两槽门禁,按差异复用有效结果。源码、自动检查、发布健康、真实HTTP、浏览器及扫描设备验收分别记录,未完成项不推定通过。
关键验收口径:确认测量弹框标题“确认测量”,正文“审核通过后,入库单将进入待分柜”;预录单/出口报关仅隐藏可见版本,不移除内部并发语义;预约编号、时间和货件来自正式预约与实际货物,去重不得丢票;三类车辆照片在送审/通过时必填,草稿允许未补齐。四端请求失败后提示错误、释放操作态并保留可编辑输入,允许关闭与重新操作,不强制刷新、查询或重放;在途防连点、服务端权限/状态/版本及幂等校验仍保持。实际失败和结果未知分开记录,不能以界面解锁推定业务未执行或据此伪造成功。
## 2026-10-21 用户验收32项修复与统一发布
总控为 `01a15eae-fd50-7f42-93b5-eb203648b808`。用户本轮指定复用五个既有对话,并在“样式优化”分区新增两个独立对话,合计七个执行专项;目标为 TEST 项目 `c64729ff-6710-43c6-8ef2-d84e9666cc1e`、host `local`、当前工作区 `C:/Users/BY-OY/Desktop/code/chongchong-global`。两个新对话保存项目已核对为 TEST;五个旧对话的项目迁移工具返回成功,但复读仍为 `projectId=null`,按实际空值登记,不声称迁移已落地。五者均为用户本轮精确指定的本地同工作区任务,未发生跨环境调度;不操作开发工作区、不新建分支或 worktree。
用户授权在本批全部修复、必要检查及总控复核完成后,由本总控统一部署受影响 TEST 服务及端侧,并执行真实 HTTP 验收。执行专项只有本地实现与定向检查写权,不自行提交、推送、发布、执行 SQL、造数或调用写接口。根负责精确发布候选、发布窗口及验收数据;删除、重置、SQL 和本批外发布不在授权内。凭据仅从用户指定的 `C:/Users/BY-OY/.codex/env/chongchong-global` 私有目录加载,禁止输出真实值或把值写入源码、文档及报告。部署事实只维护部署主契约,本节维护派工和文件归属。
| task_id | 本批稳定职责 | 问题编号及唯一写入边界 |
| --- | --- | --- |
| `01a15dcc-dfe7-7660-98b0-7f9a2384c439` | 订单、测量与审核 | 1–7;Admin `unified-orders`、`first-leg-orders` 及实际复用的入库测量/审核组件和直接测试;纯展示不进入后端。费用明细面板展示归本专项,财务记录调整逻辑归下行。 |
| `01a15dcc-5645-77b1-984b-f95af08120b7` | 客户应收应付 | 8;Admin `finance`、Finance费用调整的直接后端与测试。确需 Firstleg 费用来源修改先列精确文件,避开订单面板和柜费面板。 |
| `01a15dcc-7f62-70d1-a016-1410a5ae6b1e` | 货柜、智能装柜与预装清单 | 9–12、16–17、21–22、25;Admin `container-loading`(含本批 SmartLoading)与 `loading-lists`、对应直接测试。历史重复若需后端,仅对应历史生产/读取触点;不得并写 PDA完成链路。 |
| `01a15dcb-8638-7ca0-9037-b27b2a1ccac2` | 订舱管理 | 13–15;Admin `ocean-bookings` 与直接测试;时间字段缺失时可追踪 Firstleg `oceanbooking` 的直接生产者。货柜中的订舱关联弹框归货柜专项。 |
| `01a15eb4-8850-7582-8cf0-5ab848427ae7` | 国内PDA装柜完成链路 | 18;国内 PDA `pages/picking`、完成状态/请求辅助和直接测试,Firstleg装柜完成命令/查询的直接链路与测试。先拆分等待来源,不以隐藏处理中代替修复;货柜/清单展示文件不写入。 |
| `01a15eb4-8c12-7903-844f-a3241adcef3c` | 客户端头程订单与资料 | 19–20;Client `first-leg` 和退税报关资料直接使用组件及测试;“关闭”改“提交”只改文字,不改动作。 |
| `01a15e2b-3e40-7110-8d2b-88d15e965110` | 海外预约、尾程与入库 | 23–24、26–28;Admin `appointment-calendar` 与实际海外入库/FBA预约页面、Lastleg预约来源/编号/预计到仓传递的直接后端及测试;客户预约号的直接读取消费归本专项,Client源码若需修改须先协调。 |
总控唯一维护本批登记、公共样式/组件、共享导航/根路由/IAM/统一SQL和发布验收接线。实现者先回报入口、精确文件与预计验证,随后在授权范围继续;共享文件需求交总控,不并发改写。各组复用有效定向结果,不各跑全量;所有测试、类型检查、构建经 `scripts/local-check.ps1` 两槽门禁。界面视觉仍以1920×1080、100%人工截图为准;代码检查、部署/HTTP通过、人工视觉确认分别记录。
启动时已有他人差异必须保留:Admin 的 `WorkSharedTripForm.vue`、排车三个组件、`dispatchCommandRecovery.ts`、`DispatchesView.vue`;后端 `DispatchAggregateService/DispatchService` 与直接两测试,以及全量验收脚本专项在 `scripts/` 的现存差异。各专项不接管这些文件;必要交叉由总控确认唯一写者后接续。第1项先按移除“已经确认数据”节点展示定位,不授权删除业务数据;第11项先核重复来源,保留真实有效历史;第26项修复权威编号生成,不前端截短。
定位后的必要扩展:货柜专项追加 `port-schedules/components/CarrierScheduleQueryPanel.vue`、`ContainerPortSchedulePanel.vue` 实际路径与直接测试的展示写权,覆盖货柜人工补录及嵌入船期弹框;海外专项追加 Firstleg 日历柜次号的直接 DTO、查询/组装器和测试,精确类路径由专项回报,不改其他船节点、订舱历史或PDA完成链路。货柜组已冻结并按SHA256释放 `ContainersView.vue`、`ContainerDetailView.vue`,到仓结果映射的写权交海外组;实际类型触点为 `api/containerArrivalTimes.ts`。公共 `adminDensity.test.ts` 仍归总控。
用户后续追加29–32,仍复用上述七个执行对话,不新建聊天:订舱专项接续29–31排车“维护车辆信息”的原型字段补齐、上传操作及调度审核照片回显,PDA专项在18租约返修后接续32海外PDA装车照片样式。29的依据为用户截图 `codex-clipboard-0b236f6d-d66c-4878-8992-52ad04104489.png` 及命中的局部原型;先核字段与直接契约,不将原型示例或计划时间伪装为实际发车事实。新增前端触点以实际资源表单/审核/照片组件为限;现有排车并行写者未冻结前,共享调度文件只读。32仅复用国内上传呈现思路,海外源码留在本应用,保留照片、权限和命令语义。
29–31跨端拆包:`01a15dcc-5645-77b1-984b-f95af08120b7`在财务冻结后接续唯一后端实现,维护 `DispatchCommands.Update.maintenance`、`DispatchViews.VehicleInfo.maintenance`、必要资源快照/存取、Aggregate update/detail、`FleetTripService.dispatchResources`及直接测试/OpenAPI;订舱/车辆专项只写对应前端。八个可空字段为plannedDeliveryDate、deliveryMethod、pickupMethod、loadType、fleetEmail、vehicleType、appointmentAccount、appointmentNo;不新增金额/审核硬门禁,不把本趟预约资料替代正式FBA预约。优先沿已有资源JSON的唯一正式类型保存,不引入无必要表列。取消专项已完成并idle;总控已记录其既有调度文件差异基线,再释放 `DispatchWorkflowDialog.vue` 给前端、Aggregate局部给后端,保留全部在先差异,禁止整体覆盖。18/32已交付12文件并冻结,租约缺口已补实际Mapper/事务回归;财务同毫秒排序返修已通过独立只读复核。26前缀与24范围采用用户后续确认,见本节当前状态。
当前状态:七个实现包均已交付;财务同毫秒历史排序与PDA旧worker租约检查点两项审查缺陷均已返修并经独立复核关闭。订单超限提醒、订舱时间、货柜/预装白底、客户端两项、预约真实确认状态、到仓日期传递、车辆资料保存/照片审核与海外PDA照片均已完成相应定向检查;次数有交叉,不相加为覆盖总数。用户随后明确26采用WC+日期+四位流水,24暂不做客户原预约号自动带入;海外专项据此收口编号主契约,不新增客户字段或猜测referenceId映射。车辆后端独立审查无阻断;总控对照用户原型发现MASTER模式承运公司和电话缺少展示,现唯一释放 `DispatchResourceFields.vue` continuous分支及直接测试给订舱/车辆专项补只读可见信息,其他模式和入口保持原语义。
发布准备:Admin及Client生产构建通过,国内PDA的H5和appResource、海外PDA的H5和app资源编译通过;未发布APK/WGT、未在设备验证。MASTER补显34项及日期消费者32项定向检查已通过。客户端专项只在忽略临时目录准备逐项核实的HTTP验收草案,不读取凭据或联网;执行权仍归总控。人工视觉核对仍待1920×1080、100%截图。
固定发布候选:Backend `2c3435adafe48c8e97ef145fa301eaa11ea230be`、Admin `2e26477db523cebf23db8c28f8a4dc39cb0df1bd`、Client `7adb97d145e28e61eb391ff7609aecdb2fda7e62`、国内PDA `5fcc51d73c2ba48f109ca513831f4a5f816dbb92`、海外PDA `9c2f0a54ec1e9147db7cd434455e963e8c4cb22a`,均已推到各自既有分支。共享文件用本轮前快照剥离取消专项增量后写入index提交,保留完整工作树;布局测试亦只提交本批字段/照片用例。远端随后出现未部署的尾程列表需求,正常合并并保留分支源码,但本批发布仍pin上述原提交,不追加Order或该新需求;当前运行版本已核为本批候选祖先。尝试扩展审查后及时撤回该范围,局部草稿不进入发布。发布由总控执行,实际Jenkins、容器及HTTP事实只写部署主契约。
用户随后明确完整验收目标:总控在本批修改完成后,先运行真实HTTP流程,通过后打开内置浏览器登录检查样式、交互和请求量;Admin/Client使用已部署TEST、1920×1080,国内/海外PDA使用本地 `http://localhost:5176/#/`、390×848。该明确授权覆盖本轮默认人工截图限制,并允许TEST部署、真实HTTP及必要测试数据库操作;不据此清空用户数据或操作其他环境。总控继续唯一环境执行,专项只收口本地草案。当前部署与已验证范围见部署主契约,HTTP全链及四端页面未完成前不关闭目标。
## 2026-10-20 排车、自有及外配 HTTP 扩展收尾
2026-10-21 本轮明确的TEST真实HTTP与小于1秒目标已完成:4f交付原PLAN主链及原extra两单后缀全部履约、结案、资源释放和完整库存证明;7b独立复核主链身份/时序/失败闭合通过;根核三单最终事实、真实全响应计时和两客户全部阶段库存一致。具体结果及保留限制只维护部署主契约顶部。56、63实现/审查候选保持冻结;没有新增生产改动、SQL或发布任务,不重复派工或重跑成功链。52此前四图与材料有效校验已纳入证据,若旧turn仍显示active不据此重启或扩大任务。
2026-10-21 原PLAN主链已真实履约完成,具体状态、计时和库存证明见部署主契约顶部。4f保持唯一HTTP执行权,接续已审287cfb35原extra自有/临时外配两单,先刷新两客户完整库存证明及运行版本,不重造样本;7b并行只读复核原PLAN主链的最终证据。56的after-loading两文件及63最终审查已交付冻结,暂无新增生产修改或发布,根继续处理证据整合与实际失败的最小分工。
2026-10-21 原单后缀实际完成装车至AFTER_LOADING/v6,派送安排前的本地字段校验停止,安排POST未发送、无未知写。实际库存balance.inboundOrderNo保存原计划号,而脚本误与订单号相等比较。56仅获新增 `.codex-temp/fleet-plan-after-loading-continuation-20261021.mjs` 及直接 `.test.mjs` 的写权,绑定此次成功装车回执及state/journal,从派送安排继续,不重放装车或前段、不新增通用reconcile;原eb后缀及报告保持冻结。63只读核库存字段写入语义及最终窄差异;4f核对原v6、装车命令成功及完整库存后仍为唯一HTTP执行者。根维护接口关联和实际结果,7b此次#391发布已完成,不重复部署。
2026-10-21 后续接续已完成原柜到港、实收及原预排首拣,当前原单LOADING/v5、2/2核平;只读托盘解析被仓储A0409“已报废”拒绝并在Lastleg误映射为S0503。63沿该resolver与实际生命周期核定必要生产修复,不得为测试恢复或重置报废托盘;4f唯一执行正式只读取证及之后HTTP。56唯一新增 `.codex-temp/fleet-plan-after-pick-continuation-20261021.mjs`、`.test.mjs`、`.plan.md`,绑定已成功fulfill前段state/journal,仅从已拣货断点继续装车/派送/签收/释放,禁止到港、收货、拣货、审核、建单及新的reconcile。已冻结f38b、d9fc、extra及原报告不改;7b继续独立审查和必要发布,根负责合法查询语义与接续范围裁定。实际结果与提供方响应唯一见部署主契约及引用证据。
2026-10-21 原离港预排已实际到 `PC202610210001/LOADING/v4`;#389真实分页通过,未实收装车负例出现S0500并经只读恢复确认原命令未生效、主单和完整库存未变。63唯一修改该生产装车前置校验及直接回归,7b按#389基线独立审查和最小发布。56唯一新增 `.codex-temp/fleet-plan-loading-negative-continuation-20261021.mjs`、`.test.mjs`、`.plan.md`,保留原失败报告、原请求和冻结f38b驱动,形成严格 `PLAN_LOADING_NEGATIVE_RECONCILED_V1` 接续检查点;4f唯一修改 `fleet-plan-arrival-20261021.mjs` 及直接测试消费该检查点、新部署版本和原父封印。4f仍唯一HTTP执行者,当前暂停依赖写入;修复/接续审查与运行状态核验后继续原单,不重建或重审。extra新版287cfb35已完成90项检查及独立审查,主PLAN库存操作完成后再刷新证明执行;52此前材料校验已纳入有效证据,不重复检查。具体运行结果唯一见部署主契约。
2026-10-21 接续:56 的离港分段驱动已冻结为 `f38b81abb42ab825bbc5e07402d7223aa1b93bc7701d4fb8f7123692f07bcd5b`,82 项离线检查通过,7b 已独立复审 GO;4f 的专属正例只停在实际离港且尚未到港/实收,待匹配版本和执行放行。56 已完成 `fleet-extra-stage-continuation-plan-20261021.md` 的只读接线清单,随后获准新增 `fleet-extra-stage-continuation-20261021.mjs` 及直接测试,处理既有两张 extra 单从 AFTER_LOADING 到结案、车/司机分别释放的计时缺口;原冻结脚本/报告和离港驱动不改,不执行 HTTP,不新增生产需求或业务样本。4f 并行准备这两原单只读预览及明确 TEST 费用、收据材料,执行仍由 4f 串行,离港全链优先。63/52 分别交付后端与 Admin 真分页,统一交 7b 审查和匹配发布;分页是否达到小于 1s 仍须发布后由 4f 实测。
分页实施分工更新:63 已明确本轮未修改 Admin 候选分页并释放前端写权;52 接管 `SmartDispatchDialog`、候选 API/类型及直接消费者和测试的分页实施,不能修改 Java/SQL/OpenAPI 或其他组共享样式。63 保留后端分页、离港 PLAN 候选及首拣位置只读解析的唯一写权。7b 接续前后端候选及 56 全链脚本的独立审查、最终串行发布;52 不自审其新增前端实现。56 按正式分页 DTO 接线新离港全链驱动,4f 准备专属素材并唯一执行。原 extra 续跑已完成独立核对,原脚本与报告保持冻结。
用户随后明确增加整链验收:货柜实际出港后先预排车,再衔接到仓及出库全部流程。既有合托、临时外配及性能收尾继续保留。56 负责复用正式编排入口形成离港 PLAN 预排至出库的 HTTP 驱动及直接测试;4f 只读选择可用合成货柜与计划并唯一执行正式接口;52 独立核对未离港、未实收门禁和同原计划/排车关联的连续性;63 核对预排候选业务逻辑及相对实际部署的必要增量;7b 统一审查及串行发布。原库存直接排车不能代替离港预排证据,预留托盘不能代替实收库存,到仓后不得另建现货排车冒充原预排链衔接。当前在途性能发布 #387 保持冻结,新必要生产增量另按最终候选验证和发布。
2026-10-20 本轮最新用户目标覆盖此前本批授权限制:持续授权本总控在 TEST 部署、操作测试数据库并调用真实 HTTP 跑流程,优先完成 HTTP 联调;请求完整返回耗时要求小于 1000ms。凭据仍仅从 `C:/Users/BY-OY/.codex/env/chongchong-global` 私有目录加载,不进入源码、报告或对话输出。复用用户明确提供的五个既有对话,不创建新任务。4f 唯一本批业务造数及流程执行;56 唯一扩展脚本与直接测试修复;52 独立复核脚本、输入、真实证据与耗时口径;`01a15963-16ca-7610-90e3-7afce598a7d8` 保留当前智能排车对齐和候选查询性能修复职责,独占其已修改文件;`01a1597b-17d2-75e3-8429-5024c21b61fd` 保留排车编号修复及在途 Lastleg 发布,统一串行发布本批后端候选。发布窗口与业务写入串行衔接,编号建单验证复用 4f 新单;性能定位可只读,不能并发压测污染流程样本。功能通过与小于 1s 的性能验收分别记录,尚未计时不能推定性能通过。实际部署与 HTTP 结果仍只维护部署主契约。
总控仍为 `01a15230-a9d6-7503-a8a9-d70691df49e5`,范围保持 TEST 项目 `c64729ff-6710-43c6-8ef2-d84e9666cc1e`、host local、当前工作区;复用下述三个既有对话,不新建任务。用户已明确授权自行创建第二个 TEST 平台测试账号,全部凭据仅保存于指定本机私有环境目录。4f 通过正式 IAM/Auth API 创建一个专用自定义角色和账号,仅授予自有、外配的 list/edit/upload 六项权限,验证真实有权异账号重放原成功请求键被拒绝;不授予平台管理员、不改旧角色或其他账号、不执行 SQL。仅本轮账号在测试后正常退出并停用,未知创建或停用保持明确未确认,不换标识重造。
4f `01a1524f-4f11-70c2-8a46-8e06e73a2d86` 保持唯一业务 HTTP 执行人,独占第二账号独立脚本及直接测试;56 `01a1524f-56a9-7320-a5fd-8ff76fa4356b` 只实现临时 EXTERNAL 无车辆主档及同一实托两来源的独立扩展脚本与直接测试,当前不写环境;52 `01a1524f-52c7-7cc3-9b08-d34ad24c172a` 独立只读审查候选及实际证据,不读取新账号私有密码。总控协调、核验与维护主契约,不夺回环境写权。已成功的主流程脚本、原报告和原样本保持封存;实际阶段结果及仍未验范围只维护于[部署主契约](测试环境单机部署与配置契约.md)对应记录。
## 2026-10-20 Admin 蓝白清爽风格推广
本节原由 `01a1587b-196b-7221-8774-933aab521ce9`(整理页面风格)总控维护;2026-10-21 用户明确要求接手,现由 `01a15c55-dbec-78b3-9719-7d01b737679b` 在同一工作区接续。此前用户反馈推广后多处页面、尤其弹框布局不可用,明确提供五个既有对话要求分工修复;这批五组修复已完成自动检查,人工验收仍待截图。原五任务的桌面保存项目绑定均为 TEST `c64729ff-6710-43c6-8ef2-d84e9666cc1e`、host local、实际 cwd `C:/Users/BY-OY/Desktop/code/chongchong-global`,与本登记匹配;不使用同项目保存根中的开发目录。
当前接续范围为原对话最后两张截图提出的主列表状态页签对齐和灰白斑马纹:接续已有公共 CSS 修改,恢复标准表格默认斑马纹,保留业务行色与悬停/选中状态;不重新启动此前五组排查。本轮仅当前对话及内部子代理分工,公共样式与集成验证由当前总控唯一维护,内部子代理只清理列表 stripe 关闭属性及直接断言。既有排车、拖车在途业务改动保留;无部署或环境写入。
2026-10-21 接续新增用户要求:收紧主列表底部分页留白,公共规则采用最小 48px、上下 6px、左右 12px,保留翻页控件尺寸和换行。已清理58个Vue文件中59处标准DataTable关闭斑马纹属性,并启用财务调账明细表斑马纹;页签修复限主列表首项,避免挤压前置返回按钮。自动检查期间,用户另在 `01a15c6a-e715-7172-9d69-4c31cd5e0fb1`(分离搜索区与表格)要求公共搜索区独立、5px圆角及浅蓝表头,该对话仍维护这些增量。双方现有改动均保留,本接续不覆盖对方共享文件,不另启动重复全量。接续全量报告为467文件、4269项通过,但前后快照检测到7个公共文件被该对话更新,故该报告不作为最终统一快照通过证明;对方最新构建与129项公共定向检查已通过。最新整体全量收尾以该对话在途检查及其最终输入为准。本轮证据位于 Admin `.logs/admin-style-handoff-20261021/`;未发布,实际页面仍待人工截图。
此前全量自动检查仅证明当时输入的测试与编译结果,不能证明弹框视觉或交互已验收;此轮优先处理浮层布局、嵌套污染、正文与页脚滚动、表单和按钮可用性,再处理列表与详情的间距。用户已直接确认隐藏的长汇总不恢复,业务与权限变化不夹入本轮。
接续三项样式在搜索区/表头增量合入后,已追加公共组件及样式6文件135项定向确认,全部通过;最新结果与并行输入限制见上述证据目录的 `verification.json`。本接续实现与定向验证收口,整体统一快照及发布不在此处重复宣告完成。
共同视觉合同为[蓝白卡片式工作台风格参考](界面参考/蓝白卡片式工作台风格参考.md):清爽、少提示,复用公共样式;保留当前业务、权限、数据含义、密度和交互承载。各组覆盖本域正式路由及其关联表单、详情、弹框和抽屉;打印版面保持原尺寸。以下目录均相对 `apps/admin-web/src/modules/`,只授予展示改造及直接验证、最近验收矩阵写权,不接管 API、业务状态、路由接线或其他专项在途逻辑。
| task_id | 当前对话名 | 唯一风格改造职责 |
| --- | --- | --- |
| `01a159e5-95a7-7732-a9c8-6dc550f5ca65` | 优化新增船期弹框 | 唯一公共浮层与样式实现者:`src/styles/adminDensity*`、`src/styles/adminWorkbench*`、`src/shared/components/AppDialog*`、`AppDrawer*` 及直接回归;另维护 `sailing-calendar` 的船期弹框。先核实真实 Element 根节点、嵌套与 Teleport 隔离,业务特例不写入公共规则。 |
| `01a159e7-0159-7ad1-bafe-33ed6b30a32c` | 优化货柜详情样式 | 货柜及物流详情、弹框与相关页面:`container-loading`(排除下行 SmartLoading 专属文件)、`loading-lists`、`ocean-bookings`、`trucking`、`customs`、`outbound-dispatch`、`port-schedules`。重点详情重复内距、子页签、清单嵌入及新增/编辑/预览浮层。 |
| `01a15933-5343-7e63-9fcc-6dd662f422d3` | 待安排任务-1 | 国内订单、入库与定价:`unified-orders`、其直接使用的 `first-leg-orders`、`inbounds`、`fba-pricing`、`domestic-containers`;另独占 `container-loading` 内 `SmartLoadingDialog`、`SmartLoadingCandidateInbounds`、`SmartLoadingWorkbenchView`、`GlobalSmartLoadingView` 及同名直接测试。本轮不扩大此前跨客户装柜后端修复。 |
| `01a15933-78e2-7d43-8808-80a82c7b009b` | 待安排任务-2 | 海外业务:`overseas-warehouse`、`overseas-business`、`overseas-master-data`、`appointment-calendar`。在途排车、自有/外配及预约文件先核实是否仍有写者,冲突项只读列出,由总控协调后再改。 |
| `01a15932-9d23-7013-9546-b609ca824429` | 待安排任务-0 | 客户、财务与基础管理:`customers`、`finance`、`suppliers`、`warehouses`、`warehouse-resources`、`master-data`、`fee-items`、`iam`、`notifications`、`downloads`、`pda-releases`、`audit`、`dimension-config`。 |
本轮以上公共样式及 AppDialog/AppDrawer 写权从总控交给“优化新增船期弹框”,根不并行修改。总控保留其余 `src/styles/`、`src/shared/components/`、应用外壳及导航呈现、`dashboard`、`auth`、`self-operated`、共同规范与本登记表,负责独立审查、全量检查和集成交付;不改变共享路由和权限语义。模块任务不复制公共样式、不修改其他组目录;共享缺口写明具体选择器与消费者,由总控转交唯一写者。已有改动和用户在其他对话确认的业务修复均保留;发现活动写入冲突先跳过该文件继续本域其他页面。
每组先回报实际问题、受影响入口和预计文件,然后继续最小修复,无需等待重复确认;维护本域已有验收矩阵,区分已修、自动检查通过、待人工截图。重点覆盖普通表单、长表单、全屏工作台、详情抽屉、预览以及二级弹框;检查关闭/重开/全屏切换、校验错误、底部操作、横向表格和纵向滚动,不以新增主题类或源码字符串断言当作可用性证据。仅做必要定向检查,公共代码稳定后由总控统一全量检查;不让五组各跑全量。
2026-10-21 本轮五组派工已逐一发送成功,并已核对五个新回合全部 active/inProgress,修复结果尚待回报;先前检查结果不作为本轮完成证明。总控独立只读复核发现 AppDialog 默认并非必然 Teleport,智能装柜内部分配弹框可真实嵌套,公共后代部位选择器存在穿透风险;已分别交公共唯一写者与国内业务组核实并最小修复。workspace 的92vh和独立compact卡14px应保留,不因排查一律清零或压缩。
2026-10-21 第一轮五组已交付,各组定向检查分别116、92、256、123、257项通过(存在范围重叠,不相加为总覆盖数)。总控继续第二轮:公共组处理工具栏后代按钮规则穿透浮层,并获 `DataTable.vue` 与直接测试的唯一附加写权;货柜组处理 `ContainerSimulationCreate` 的工具栏内浮层挂载。其余三组只读交叉审查公共、海外预约、客户通知改动,业务源码冻结。货柜共同核对记录由总控合并,避免两组并写。
第一轮41文件已由另一个用户任务提交为 Admin `0a1968a1`,基线为 `2f9a3330`,该提交不等于本轮最终验收。其完整回归运行期间不启动重复全量;第二轮输入变化后,根以最终源码快照决定必要重验。公共规范新增浮层隔离、单一正文滚动、底部操作与长错误占位约束;用户人工截图仍未收到,本批实际页面可用性不能宣告验收完成。
2026-10-21 第二轮全部执行组已收口冻结:公共浮层/工具栏10文件148项通过,模拟柜4文件75项通过;交叉审查发现的comfortable子表单污染与预约辅助按钮拉满均已修复。内嵌DataTable亦作为工具栏边界排除。总控独立复核comfortable唯一业务消费者的实际表单路径,无遗漏;客户/通知、海外/预约的业务脚本及绑定审查无阻断。本轮代码修复与统一自动检查已收尾,不继续扩范围。
最终验证:当前 Admin 提交 `db3b5f7157c900b885ade2626014f70c61cb0849`,全量466个测试文件、4255项全部通过,0失败/0跳过;应用类型检查与生产构建通过,`git diff --check` 通过。验证前后1127份源码及配置SHA-256完全一致,Admin工作区干净。验证证据统一在 `.logs/admin-style-audit-20261021/verification.json`、`full.json` 与源码快照,完整报告SHA-256为 `E913D8D218C1C018DD272DD9AFBAF543CD0B50B51757BA1F7BD1BB49E65FF3DA`。五个既有执行任务均已完成本轮实现/交叉审查,没有未安排的代码返修项;仍待用户1920×1080、100%截图确认实际页面布局、滚动与操作区。总控本轮未触发部署,不以其他任务提交或发布推定本轮视觉验收完成。
当前授权为本地实施与检查,执行任务不推送、不部署、不执行 SQL 或真实业务写入,不打开浏览器;样板已发布不等于全 Admin 已发布或已完成人工验收。检查统一走 `local-check.ps1` 两槽入口,执行任务只运行必要定向检查,稳定后由总控统一全量检查;截图由用户提供。各执行任务在自身对话交付文件清单、覆盖范围、检查结果和未验项,总控读取结果,不由派工消息额外授予互发消息权限。当前阶段:三个执行任务的模块展示改造及总控公共样式、首页登录、外壳已完成集成;已核对113条正式业务路由、99个页面入口及实际复用组件。随后按用户截图统一12px页边距、移除整页外框、合并同级列表页签与按钮、收紧顶部和筛选区、消除订单嵌入审核重复内距,并修复折叠菜单横向溢出。最终经共享门禁完成464个测试文件/4204项全通过,类型检查与生产构建通过,验证窗口1114份源码摘要一致;证据留在 Admin 本地忽略目录 `.logs/admin-workbench-rollout-20261020/`。公共规范和各域既有矩阵已更新,仍待用户1920×1080、100%截图确认;本批未推送、未部署。
总控随后只读核对预约专项已交付并 idle,原排车前端专项当前只做 driver 来源与账本只读预审;因此将之前保护的预约、排车、自有/外配及关联车次页面的展示写权交回本批海外组。保留其业务差异及 API,逐文件修改前核对无内容漂移;出现新的活动 UI 写者则暂停该文件。此记录不接管上述专项的业务、环境或验收职责。
2026-10-20 19:20 用户再次要求优先安排任务。总控已重新下发并核对三个既有对话均active/inProgress:4f独占热修后只读接口预检及自有LIVE2真实HTTP,同时独占外配driver三项审查缺陷修正;52独立复核修正后封印及Admin消费协议,不改driver;56负责#384发布收尾和受影响持久查询只读预审,联调失败时先交最小根因。外配执行需自有LIVE2成功且新driver独立审查通过。根独立核实际Lastleg c324镜像healthy,仅维护共同契约和交接,不夺回环境写权、不新建任务。
2026-10-20 用户明确要求“不要自己一个人干,优先安排任务”,并批准外配固定 Lastleg9f3755f8/Admin3f4021c0及三权限最小清单。本轮执行权已实际交给三个现有对话:56独占最小外配IAM及Lastleg发布;52独占Admin发布及配置恢复;4f独占匹配版本就绪后的自有/外配真实HTTP。根不再执行SQL、触发发布或业务HTTP写入,只维护共同契约、当地检查、独立核对及环境交接。权限脚本需先由52独立审查,再由根向56发EXECUTE_IAM_GO;56/52交健康与权限回执后根才给4f HTTP_WINDOW_GO。新候选以实际#382/6771和Admin#661/9726为基线保留他人发布,避免回退;固定38路径自有CI#381已SUCCESS,外配联合82、IAM4、API/结构34及前端36/类型/构建通过。完整Admin50失败来自3个其他在途客户选择器测试,不夹入24路径外配发布包,不宣称全量全绿。
2026-10-20 17:50 TEST总控按用户“外配也要继续安排开发”及对三个既有task_id的明确授权,复用56后端、52前端并行实现外配,4f主后端转自有固定候选/HTTP验收;不创建新对话。用户已确认外配整车承运金额÷实托数,逐目的仓到达和五装车照片,省里程、油耗和两油耗照片。唯一规则与精确写权见[外配业务首版开发契约](海外仓业务/外配业务首版开发契约.md)。根继续唯一发布和共享接线,环境执行窗口未交接前各专项不写TEST。自有冻结Git对象7c6a与外配后续工作区改动分开,本次自有候选CI #381进行中、DEPLOY=false,不夹带外配源码。
2026-10-20 自有业务源码与本轮自动验证收口:前端18文件冻结摘要`3deb4b56…f94fb40`,Admin定向113项、默认资源源码typecheck/build及全量453文件4087项通过;全量窗口无Admin TS/Vue/CSS漂移。后端最终25路径`b8d7c7d9…9ac456f`,首轮65项及最后文案修正后的持久化/照片15项、IAM种子5项通过;File相邻21项、Mapper406、AGENTS索引1229、Gateway/同步依赖/Lastleg结构联合33项通过。根只读端口适配和共享SQL/IAM/File接线已落源码,六个现存客户端仅在根同步依赖清单补真实分类、未改其业务。两专项源码冻结,当前未执行本页环境SQL、部署或HTTP,原型页面仍待人工验收;具体共同边界与证据见自有业务首版契约,不把代码/自动检查等同已在TEST可用。
2026-10-20 自有业务已按用户最新解释收敛为原排车装车后的自有车辆运营视图,外配为同一原排车的另一车辆归属视图且本批不实现;共同API v1及金额/油耗单位、照片保存与命令恢复规则见首版契约。两个既有任务均已启动实现。根已补Admin菜单、列表/详情路由与三权限及22项直接回归,IAM三权限与国内统一权限种子、File两类平台排车照片及契约/测试;经local-check的File直接回归21/21通过。根接原loadingComplete同事务车辆归属捕获,维护其唯一直接持久化测试,并同步Lastleg及海外统一空库基线4张附加表(ownership/record/command/history)。后端及页面候选仍在收口,未运行本页环境SQL、部署或业务HTTP,原排车HTTP扩展仍由主后端对话独占;两个专项不得覆盖共享接线或原排车主链。
2026-10-20 用户明确复用排车派送与费用后端`01a1524f-56a9-7320-a5fd-8ff76fa4356b`及排车前端与PDA`01a1524f-52c7-7cc3-9b08-d34ad24c172a`,与当前总控三方并行开发自有业务,不新建对话。共同业务及文件边界唯一见[自有业务首版开发契约](海外仓业务/自有业务首版开发契约.md)。后端独占新增ownedbusiness包、直接测试、独立OpenAPI及设计;前端独占新增OwnedBusiness页面/组件及ownedBusiness API/类型与直接测试,PDA及共享接线不动;根负责业务接口冻结、导航路由权限、基线和提供者触点、集成检查。先交窄接口及页面承载设计,冻结后实现接线,不猜未知业务。专项暂不重型检查,根统一local-check窗口,无HTTP/SQL/发布/推送授权扩张。原排车后端继续独占既有排车HTTP扩展,自己的新marker样本与本页隔离。
2026-10-20 用户明确指定由“排车后端”`01a1524f-4f11-70c2-8a46-8e06e73a2d86`接手真实 HTTP 联调及扩展测试,总控已派工并核对该对话 active/inProgress。该任务为本轮排车扩展 HTTP 唯一执行者,使用新 marker 和独立 TEST 数据;原人工单已完成,仅只读,不重放旧续跑。先核已有673断言的真实覆盖,再补多目的仓、审核重提/零扫码变更、同托换标/取消保留成果、双端竞争/资格隔离及预约BOL分量等缺口,缺前置或未执行的注入不得记作通过。允许的脚本写权为 fleet-cross-customer-fixture及其直接合同、新增dispatch-workflow-extension验收模块及直接合同、dispatch-workflow-extensions-test-env入口和对应最小README登记;生产源码、共享runner、SQL及部署仍不因此解锁。所有检查经local-check串行,未知写保留原键原载荷并停止依赖操作。总控同期只读检查自有业务/外配业务的菜单与页面,避免并发环境写入;未新建对话或接管日历新增预约。
2026-10-20 14:34 当前排车自动检查与本轮修复已收口:原单 HTTP 178请求/673断言通过、派送完成且车司机释放;PDA可拣资格修复48项回归通过,受控仅排车H5候选已独立只读审查、发布healthy及85文件逐SHA核对,未夹带废弃业务。三个既有独立对话本轮均已交付并空闲,不继续重复检查或另建任务。剩余为人工页面/实体扫码验收,不能以自动检查替代;运行指纹、候选输入及限制见[部署主契约](测试环境单机部署与配置契约.md)当前14:34记录。
2026-10-20 14:19 当前排车 HTTP 接续已完成,原人工单 DELIVERED、当前车次完成且车司机分别释放,178 请求/673 断言全部通过,自有会话退出。原“人工样本不自动推进”的保留要求已由用户后续明确继续 HTTP 指令覆盖,本次只接续原单,不重建、不重审、不新建下一空排车。三个既有对话本轮已交付:排车后端一次性 driver、派送费用只读预审、前端 PDA 两文件可拣资格修复;根完成 HTTP 与 48 项直接回归、H5/App 资源构建和85文件核对。14:26发布输入比对发现当前包还含另一项已提交的废弃出库改动,根在准备阶段阻止发布,无远端写入;前端对话仅只读复核这些额外差异及产物,不再写源文件或执行环境操作。运行事实与未验范围以[部署主契约](测试环境单机部署与配置契约.md)当前记录为准,旧节点记录仅表示对应时点,不能覆盖本次接续结果。
2026-10-20 11:31当前人工验收节点为“提交调度审核”:根复用native_fleet_script(Java/直接测试两文件)、native_capacity_consumers(recovery/直接测试两文件)、native_fulfillment_script(弹框/列表/详情/既有预约加货八文件),均已交付冻结,无新对话和跨域扩权。后端24项及前端49+75项直接回归通过;根唯一发布后端#376并以真实只读HTTP核对人工单待调度审核v3、不可再提交、主单未变。Admin完整4012项仅fixture边界1项失败;最小修正后9项复验通过,根已完成十文件精确#654发布、类型/构建、运行healthy及公网5资源逐SHA核对,临时Job配置原文恢复。只待用户刷新人工确认本节点,不等同整条人工验收完成。运行、提交和HTTP证据唯一维护在[部署主契约](测试环境单机部署与配置契约.md)顶部;人工单不自动推进,日历新增预约不接管。
2026-10-20 BOL当前人工节点:用户最终确认保持现有一次PDF下载,内部按目的地+预约号分BOL、同仓同号跨客户合并、无号留空同仓合并;不新增下载弹框/ZIP/API,不扩大日历。根复用fleet只读设计真实分配数量与BOL投影,capacity独立只读核对,不跑重复检查,fulfillment已只读确认无需UI修改并交下载错误解析建议(另记待办,不并入当前包)。根随后冻结fleet五文件、capacity两文件及根Print两文件/唯一OpenAPI描述,均完成交付;读取13+打印9、网关5通过,Print全模块66中65通过1容量开关专项跳过。根已唯一发布Lastleg#377及Print#107,正式GET确认同仓空号由2页合1页、两票两箱均保留、ISA空白;人工主单LOADING/v5完全未变、自有会话已退出。只待用户重新下载确认,不代扫码或装车。实际环境证据见[部署主契约](测试环境单机部署与配置契约.md)。
2026-10-20 用户明确要求继续HTTP并复用三个既有独立对话加速;总控已重新派工并实际核对三者均active/inProgress。排车后端唯一写根.codex-temp/dispatch-manual-http-continuation-20261020.mjs,准备原人工DS从LOADING/v5到签收及本trip资源结束的一次性driver,不执行;派送费用后端只读预审安排/费用/签收;前端PDA原先只读预审已发现页面以allocated>picked误判可拣;根真实PDA响应确认两行available=1/allocated=0/picked=0后,精确解锁海外PDA dispatch.vue与dispatch-workflow.test.mjs两文件修复,API/store/样式不动,根统一验证与发布;HTTP继续不受页面修正阻断。内部三代理本轮只读交接已结束,不与独立对话并写;根仍唯一环境写者、local-check及执行者。本轮明确接续原单,不重建/重审,也不调用默认结案助手中的新建下一空排车探针;只结束本trip并核当前占用。根当前只读HTTP已确认LOADING/APPROVEDv5、零拣零发、唯一trip TR-9VA7RGXK6K1K17LDZC75O45MC,未推进任何业务。旧MANUAL_HANDOFF报告/intent保留,后续只用新报告、严格实时前置及新seal,未知写停;真实环境事实仍唯一维护在[部署主契约](测试环境单机部署与配置契约.md)。
## 2026-10-19 排车列表统一作业改造
2026-10-20 10:54总控交人工节点:主C后半链HTTP实际455/455及结案释放通过,司机证照三文件修复43项clean回归、TEST #375部署和真实元数据/内容/隔离复验通过;Admin已核#653/f422包含原展示修正,未重复发布。三内部执行者当前均已交付冻结,无新增任务或写权。根以唯一受保护执行准备人工单`DS-E5A85B6D67214315A08135E122213D61`,装车前DRAFT/版本2、双客户双托双箱、车辆司机已配、零扫码;准备85请求157/157,manualReady=true、自有会话已退出。最新环境事实和来源/托盘号只维护在[部署主契约](测试环境单机部署与配置契约.md)顶部。该单交用户从提交调度审核开始逐步验收,根及自动跟踪只读,未经用户新指令不得自动推进或清理,不能把准备检查点误作待修复失败而续跑。
2026-10-20 10:27总控当前安排:用户要求先HTTP全链路再人工走单,停止进一步样式验收。原C已装车后v8,根唯一准备显式AFTER_LOADING续跑,不重建或重做前半程;实际环境节点以[部署主契约](测试环境单机部署与配置契约.md)顶部为准。复用三个既有内部执行者:capacity唯一写跨客户脚本及direct合同2文件,修正测试模型A0403文案并以唯一85488等待共享检查槽;fleet已冻结证照读取Java及测试3文件,现只读检查后半程DTO,不跑环境;fulfillment已交详情展示3文件、16/16通过并冻结。根负责原单HTTP、共享文档、后续精确集成及发布,未新建用户可见任务。下方09:45的80263及LOADING v5属于此前检查点,不是当前状态。
2026-10-20 09:45总控接续:已按用户“测试可删除、不要备份”完成固定旧运输链清理和原生结构匹配;实际环境事实只维护在[测试环境单机部署与配置契约](测试环境单机部署与配置契约.md)。两处仓库字符比较及空单取消已由既有内部执行者交付、根集成135ffa662de10c1af76183ceef73eb37de73899f、45项通过并在TEST #374部署,原样本复验成功;无新建用户可见任务,根仍唯一发布和SQL/HTTP写者。新C两客户样本已到LOADING v5,验收脚本车牌大小写错误两文件经34项通过,单独精确对象689bd219ff015cee62b2e480b7b2a7c0522b4380(未另部署业务服务)。原C显式续跑驱动`.codex-temp/dispatch-cross-c-explicit-continuation-20261020.mjs`已排local-check,执行句柄80263,等待另一Admin全量检查释放共享槽;未启动则不得将其记为后半链已执行。新报告DISPATCH20261020CRESUME、原C报告和原命令全部保留,禁止从头重放。日历新增预约仍排除,页面控制超时单独列未验收,不以CI或静态审查关闭视觉节点。
用户明确当前对话 `01a15230-a9d6-7503-a8a9-d70691df49e5` 为本批总控并要求先定义规则再下发。旧三个排车对话已归档,本轮消息未送达,保持归档状态;用户随后明确新建三个独立任务。所属TEST项目 `c64729ff-6710-43c6-8ef2-d84e9666cc1e`、host local、cwd `C:/Users/BY-OY/Desktop/code/chongchong-global` 已核对。用户已确认四个彩色图标详情页签、两种建单方式、允许临时填写外配车辆司机、PDA拣货核平后后台才能确认装车完成。新建任务如下,依后端工作量采用两个后端和一个Admin/PDA联合前端任务;首批仅做技术准备,共同接口冻结并由总控明确解锁前不修改生产代码。本批业务和文件边界唯一见[排车列表统一作业改造契约](海外仓业务/排车列表统一作业改造契约.md)。
| task_id | 对话 | 本批稳定职责 |
@@ -58,6 +207,144 @@ File三文件实际哈希已逐项匹配交付,12个新增用例交主后端
2026-10-19 17:32接线检查点:两侧薄合同已实际落地并由总控核对SHA,公共DispatchContracts为`73b5b83f…ca84f641`、窄DispatchAppointmentAmendmentPort为`45aca62f…7887b238`、原AppointmentWorkDispatchPort为`81107e69…717a784b`。两个公共批次DTO版本在末尾、Provider版本在中间,已向双方明确逐字段映射;版本必填、0合法,不增加HTTP入口。前端已据真实公共DTO接续,B开始从真实明细/分配读取客户并实现保留旧分配的增量。总控已将公共批次版本同步OpenAPI,4份相关OpenAPI的重复键/653引用/退役路径/版本规则及两份12表静态结构通过;Fleet已移除8个退役操作且保留附加能力入口,实际网关路由合同5/5通过。Fleet旧未用schemas及最新响应类型仍待最终提供者清单,不记完整契约收口。原22前端候选仅为此次版本消费解除相应冻结,包含DispatchWorkflowDialog ADD_CARGO直接调用;没有再次申请同一已授权范围。各本域实现和全服务编译/联合行为回归仍未完成。
2026-10-19 17:56提速交付:用户要求加快,总控已亲自完成四处旧查询及三份直接测试,精确归属见主契约第九节,7文件清单`.codex-temp/dispatch-root-query-manifest.json`SHA`8269869d…9332e2d`;移除共享主单/任务客户头依赖,客户进度使用ACTIVE和真实五阶段/发车时间,原数量、明细/扫码/订单客户过滤保留。仅静态差异检查通过,3类测试交唯一执行者;新H2回仓查询测试将MySQL BINARY转等价VARBINARY,独立探测同值相等、大小写/尾空格不等,未冒称MySQL环境执行。派送接线19路径已正式交付,总控逐项及聚合复算`a1ebcebf…d604fdd7`匹配并交主后端8类直接回归;候选批读/草稿投影不再只是待定接口,运行结果仍待验证。前端版本及外接入口包报告183项/typecheck/build通过,完整26文件候选待总控复核。主后端新报告全量1060生产源码编译通过,452测试源码编译现卡FleetTripPersistenceTest的旧Preparation类;主后端继续主夹具,已将独立ReturnCartonReturnPersistenceTest交派送任务并行适配,保留原业务断言、不恢复旧协议。根7文件独立复核交原前端只读执行,未新增任务。退役smart权限源码/种子已删除,当前统一逐VALUES记录统计为454权限/618关联且静态唯一/外键通过,之前按INSERT行数得到的计数已废止;新5类IAM29/29为主后端报告,根还需核对实际报告和种子哈希。无部署、环境SQL或真实验收。
2026-10-19 18:04收口:总控补齐第五处旧查询`DeliveryOperationMapper.returnReceipts`,只移除共享任务客户头条件,真实明细客户条件保留;根查询清单现为8文件,原7文件独立只读复核无确定缺陷,新查询由归箱6用例覆盖待唯一Maven执行。派送任务已交付并冻结`ReturnCartonReturnPersistenceTest`新模型夹具,原6业务用例保留,SHA`d7e37c99…267d8cdce`。主后端随后展开6个旧测试阻断,已精确将其释放的`DispatchRepairWorkflowTest`交原派送任务单文件适配,主后端处理其余5类,不并写;保留取消回滚、混托来源/费用及退货来源断言。总控已实际核对新IAM五类29/29及源/target种子SHA一致,关闭该离线权限包。主后端仍在全服务测试编译和BOL/旧测试消费者收口;最新前端26文件摘要与交付不符,前端正在只读定位PDA fulfillment.js交付后变化,尚不接受新摘要或宣告原检查覆盖当前输入。既有预约19文件已核对稳定,不再等待新增业务批准;无部署、环境SQL或真实验收。
2026-10-19 18:10提速:最新1062生产源码完整编译通过后,主后端继续Fleet类测试阻断,派送任务并行保留修复工作流断言;总控直接完成两个已授权FBA持久测试13处transport.apply父命令键签名收敛并冻结,19文件包逐项及新聚合`70526153…86ad658`实核匹配,等待主后端唯一完整编译/直接回归。总控同步Fleet实际无客户头响应,删除已退出入口的Prepare/Create/BindingCommand/Review孤立schemas,保留capacity-plan复用的ConfirmLoad;4份OpenAPI651引用/重复键及两份SQL12表静态检查通过。前端摘要差异查明仅PDA货物废弃SKU的quantityUnit合入及行尾变化,其余25文件一致,待静态核定其与排车链隔离后按当前输入更新摘要;未恢复或覆盖他人变更。以上仍非全链通过或部署验收。
2026-10-19 18:11收口:总控完成并冻结`DeliveryTransferService`及直接测试两文件(SHA`126e3852…f57b4a`/`1088520d…15d27e`):PDA两处解析读取无客户头整车,直接扫码同仓成功/异仓404回归补齐;取消出库删除旧requireUnbound,保留原阶段、真实执行及费用守卫。主后端已修整车取消只阻断有效出库,CANCELLED历史保留且不误阻断,并加入回归;上述新输入均等待唯一完整编译/运行,尚无全链通过结论。派送任务继续原修复工作流native适配,不并写服务;总控此前两个FBA测试已交付,不再是编译等待。
2026-10-19 18:19并包:派送任务最后工作流测试7方法/9场景已交,根实核SHA`9cf2fa9e…d35ec5`,保留混托3+2、排除他客99、运费60、原箱来源、取消重排等当前断言。根费用来源SQL去任务头客户,来源回归改实际FleetAdapter,删除无生产消费者旧Query;直接消费者清单SHA`8e6691d5…95f8b98`。另收敛订单/计划排车状态、原预约影响、库存SHIP来源4查询及4测试(SHA`3ba52b3b…d71b6cf`),均保持真实明细/pick客户、仓和命令身份,不改预约创建。Fleet影响绑定SQL仍归主后端唯一维护;所有根/B输入已冻结交唯一Maven干净编译与直接回归。总控实际日志已核一轮完整454测试源码编译成功,但新输入仍须重编译。前端当前26摘要`8cb5db64…238fda`已根复算,唯一差异为独立废弃SKU字段及行尾,排车函数未变化,原相关检查只按未变化输入复用。无部署或真实验收。
2026-10-19 18:25验证收口:根实际核两份日志,修正/原生查询69项和费用来源/出库/Fleet查询90项均0失败0错误并BUILD SUCCESS;这不是最终联合回归通过。统一438项先前暴露的来源发布、签收并发、取消工作流3类本地原生夹具已由派送任务修复并交回,根逐项核SHA匹配,唯一Maven继续实跑。根审阅依赖基线中两个FBA适配器到公共port的7条精确引用,并补反向合同及当前维护入口;没有增加slice通用许可,旧pickup三处Entity违规仍列既存门禁阻断,不在本批重做取货业务。所有业务范围仍按现行主契约;日历新增预约未接管,无部署、SQL或真实验收。
2026-10-19 最终联合回归收口:当前冻结输入下单次80类501项全部通过,无失败/错误/跳过,日志`dispatch-final-joint-regression.log`SHA`b56da123…b83238`。根独立逐项复核1519份输入与聚合`3ff451e8…594de9`一致,当前无漂移;不再把之前分批组合覆盖作为最终单次证明。Gateway合同5/5通过。依赖13项中10通过、3失败仅由开工前pickup实体边触发,新公共port和反向越界检查通过,没有加宽许可。AGENTS索引唯一新失败为海外PDA指引超8000字符,原前端任务正在单文件精简,完成后唯一执行者复验。车辆预约仍有真实未接通限制:Create无该字段,Update非空关联被拒绝,详情输出null,未定位权威提供者且本批不新建日历/预约权威;不得报为全字段打通。环境SQL、部署、真实HTTP、1920页面及PDA硬件验收均未执行,不把本地代码/离线验证通过等同最终验收。
2026-10-19 用户最新裁定:对排车车辆预约权威来源问题答“那就不要”,总控已确认取消排车车辆预约字段及关联,FBA预约和四页签保持,新增预约日历仍不接管。主后端独占移除公共Update/DispatchInfo字段及相关类型和服务占位;原前端删除直接展示/输入与测试;派送后端只读核直接构造引用,若主后端释放测试再精确移交;总控已同步主契约和OpenAPI。前轮501/501及1519快照只证明裁定前输入,变更后须重做直接受影响编译/检查,不冒称旧结果覆盖新协议。用户询问增加独立对话,总控判断当前共同接口收口不适合继续加写者,复用现有三任务,不新建对话。
2026-10-19 车辆预约取消后复验:后端公共字段/类型及服务占位已移除,全服务test-compile和25项直接回归实际通过;总控按现行Java重生97公开schemas,29平台/7PDA路径及649引用、重复键、版本阶段、两SQL静态检查通过。前端8文件删除和73项定向测试已交,Admin完整构建在vue-tsc触及2GB堆上限退出134,Vite尚未执行,不能记typecheck/build通过。PDA指引长度已合格,但两固定语义索引句还需原写者恢复,后端无须空等,由总控接索引复验。
现行验收脚本仍使用已退役公开调用,按真实直接消费者收敛:原派送任务单写phase4-overseas-dispatch及grouped-dispatch-acceptance各脚本/合同4文件;总控在本对话内用一次性内部并行执行者分别单写phase5-overseas-fulfillment和fleet-trip-fulfillment各脚本/合同4文件,不新增用户可见独立对话。禁止执行真实HTTP/SQL/造数,只有离线合同;保持marker、身份仓和原命令证据,不借旧样本或伪造实载。真实LoadingPreview缺托位等实测时须等本轮真实测量,不能沿旧脚本用常数假定实际载荷。脚本写权不延伸到Java/新日历/其他在途业务;其他直接消费者发现后只报精确触点再分配。
2026-10-19 18:55收尾并行:总控已实际执行Fleet/phase5两个脚本合同共78项全部通过,并独立复核4文件哈希与冻结交付相同;AGENTS索引1181项通过,前一检查点的长度/固定语义句阻断已关闭,主后端无须继续等待。原派送任务报告phase4与grouped两合同共15项通过,待总控核对最终文件及证据。继续复用原两个内部执行者,各自唯一修改phase5-root-fulfillment脚本/合同、fleet-test-env-acceptance入口/直接合同,收敛已发现的直接消费者;不新增用户可见对话或改动已冻结helper。原前端任务仅诊断Admin完整类型检查2GB内存不足,不提高内存限制、不改生产配置、不重复盲跑。总控保留共享集成、实际证据核对和最终报告;后端501项为删车辆预约字段前输入,最新删字段后25项与完整test-compile独立报告,不能相互冒替。真实HTTP、部署和人工页面/PDA验收仍未执行。
2026-10-19 19:05实质复验:用户明确授权本次Admin完整类型检查临时4GB,总控经local-check执行完整vue-tsc(无文件排除、无配置修改)实际退出0,随后正常2GB下Vite构建退出0、5135模块、4.06秒;该授权仅覆盖这一次类型检查,已使用。最新车辆预约删除8文件逐SHA核对无漂移,详情四页签和FBA保留。原生脚本当前离线实跑分别为Fleet/phase5合同79/79、财务/合并合同16/16、phase4/grouped/root合同57/57、保留占位/在途交接合同44/44;这些是各自具体输入的本地脚本证据,不代表真实HTTP。总控修复实际LoadingPallet的Jackson Long箱数字符串读取,保留数量安全边界及长ID/版本。流程合同发现服务端updateDispatchCargo只追加站点、移除最后一托仍留旧目的地,已交原主后端按有效货物/预订和原站序最小修复及真实回归;不是增加业务范围。原派送专项接续费用覆盖与外接同主单加货的4个直接脚本/合同,FULL与PARTIAL保留正向覆盖,必须使用不同本轮实物,不允许已扫码后取消复用。独立Fleet专项入口及其余已发现直接消费者尚未全部接通,不能报脚本全量完成;日历新增预约仍不处理。3项既存pickup依赖失败、环境SQL/部署/真实HTTP和人工页面/PDA验收仍分别保留未通过/未执行状态。
2026-10-19 19:11跟踪:总控实际读取路线修复日志,完整test-compile退出0,5类33项全部通过,含新FleetDispatchRoutePersistenceTest 7项;最终源码/测试快照待原后端交付核对,不把旧501结果扩展到本次新输入。脚本实测Long字符串零箱数在资源准备/两审/装车/空排车取消中的严格零比较已修,实际三合同122/122通过;随后补原生写命令空成功/缺业务体判未知并停写,phase5与root两合同96/96通过,各结果按实际输入分别保留,不拼成单次全套。两个内部执行者接续跨客户一主单共享fixture/验收4文件,以及混柜/换标两个原生留存入口(必要精准合同),仍不改日历新增预约、不执行环境操作;原费用专项4文件及根Fleet专项入口顺序仍待集成。用户询问剩余时长,总控按当前工作量估代码及离线收尾1–2小时,部署与人工验收另算;估计不是验收承诺,不因时间到达标记完成。
2026-10-19 19:28集成检查点:路线修复3源码/4日志逐哈希与交付相符,33项及完整测试编译正式接收;跨客户一主单4文件逐哈希相符、35项实际通过;自有/外接共用主单成本消费者改为原生发车回执与真实实测托位,成本38项通过,主入口成本预期定向1项通过(不是整个入口通过);费用/外接4文件逐哈希相符、根实跑35项通过;混柜/换标两个留存入口及精准合同3文件逐哈希相符、语法和7项通过,README登记合同4项通过。前述均为各自具体冻结输入的离线证据,不合并冒称单次全套或真实HTTP。
剩余写权继续分离:原派送专项仅改显式return-redispatch原生消费者及合同2文件;内部执行者分别独占Fleet专项入口/直接测试2文件、通用TEST换标生产者/新合同2文件、正式单票海外阶段/直接测试2文件,不创建用户可见任务。容量池和UI4文件已交付冻结,根接灰度组化时间的直接测试,并修复容量脚本同作用域重复声明;四文件组合检查因容量语法及仍在写入的Fleet入口import中断,未执行场景,待上游冻结后重验,不计通过。根只接共享文档、直接灰度测试、成本2文件及证据;检查仍经全局单槽,当前有其他已知任务占用,按实际句柄等待,不抢锁。换标两申请合到同一实托后分别建车的物理冲突已交原后端只读核对,不擅自拆托、放宽占用或改变业务规则。真实测量缺项、既存pickup3项依赖、部署/SQL/HTTP及人工页面/PDA验收仍独立记录。
2026-10-19 19:41集成检查点:全局检查槽释放,容量脚本语法复核实际退出0。Fleet入口、容量池TEST/UI及灰度直接合同、正式单票海外阶段、通用换标生产者与保留来源、显式退回合同九文件组合实际227项,226通过、1项容量编排静态断言仍匹配旧局部变量名;修正该断言后所属21项全部通过,未把两次运行冒称同次227全绿。原退回专项两文件已交付冻结,57项为专项自身结果,根组合已覆盖其合同。正式单票实测文件通道和通用换标生产者均已纳入根此次实际组合;共享实托换标仍待用户业务选择,不推定完整场景支持。
同路线成本入口确认另一个真实接线依赖:其两张WAREHOUSE_TRANSFER货物与同主单外接不属于费用覆盖专用FULL/PARTIAL,不能伪造费用用例满足helper。原派送专项接续仅外接helper及直接合同两文件,最小支持显式普通原生安排模式,真实加货/复审/PDA实拣/实测装车/客户目的地及外接约定报价校验均保留;普通模式与原费用覆盖模式明确二选一,逐组费用有据、不复制猜测金额。内部同路线消费者等待正式签名后接线,两文件写权保持;原后端继续只读定位当前发车真实晚期锁点,为回滚脚本设计提供依据。未新增用户可见任务、未扩展日历或环境权限,未宣称部署或真实页面/PDA完成。
2026-10-19 19:50收口进展:跨客户入口及夹具4文件交付逐SHA匹配,根实际运行入口/fixture/acceptance三合同55/55通过;明确CROSS_CUSTOMER、CAPACITY_POOL、SAME_ROUTE_COST三个当前用途,返回必须为所选本轮注册proof同一对象并匹配marker、dispatchNo、tripNo,严禁不同专项互借成功结果结案。夹具支持Jackson数量字符串并拒绝空值/布尔/非规范及超安全整数,context.checkpoint及HTTP写前fsync/未知结果停写已接入。根已在容量池caller明确CAPACITY_POOL并补主单编号,成本入口由唯一执行者接SAME_ROUTE_COST;这些直接调用点待上游外接helper冻结后组合复核。原79/16项临时证据快照已明确标记历史,新55项和当前输入及TAP哈希追加到原证据文件,不冒称单次全套通过。
根已补正式单票实测文件通道、TEST换标生产者显式来源/合托前置限制/实测证据,以及跨客户和同路线两业务分摊的文档;登记合同实际4/4、三个已冻结生产入口语法退出0,后续文档小修最终门禁统一复核。原后端独占回滚脚本及直接测试2文件,按第二客户转仓晚期UPDATE定位、真实等待事务会话超时和完整数据库前后快照重写,不改生产Java。原派送专项独占外接helper及合同2文件,内部只读审查已从真实DTO/Service确认报价摘要、cargo目的地、费用字段和混合自有/外接同组规则一致,结果限当时暂态候选,冻结后再验证。另一个Admin任务占用全局检查槽,根跨客户两个语法检查已排队,保留原执行句柄等待,不抢锁、不重启其他任务。未部署、未执行环境SQL/HTTP,合托换标业务选择仍待用户。
2026-10-19 19:53用户明确“本批支持整托同车”:两张换标单合到同一实托后共用一张原生排车,托盘/容量只计一次,换标单各自箱数、客户和扫码归属保留。主契约第一、八节已同步,此前待业务选择状态结束,不能把该场景仅前置拒绝当最终交付。主流程后端先完成当前回滚脚本2文件并冻结,再接原有dispatch/fleet来源模型职责,先交精确生产/测试/公共DTO及直接消费者清单供总控冻结;不允许仅解除去重、按第一来源/客户承载或不分来源FIFO凑通过。原派送任务继续当前外接helper2文件,不并改公共port;原前端任务复用为只读准备,定向列同托多逻辑来源的候选选择、容量去重、PDA扫码歧义和必要接口/测试触点,正式合同冻结后再精确解锁。四彩色图标页签、日历排除边界和环境操作门禁保持;未创建新任务、未追加环境权限。
2026-10-19 20:01联合检查:共享槽已释放,原28228/60575两个跨客户语法句柄均终态退出0;外接NATIVE、同路线成本入口及其合同三个语法检查退出0。根逐项匹配外接2文件和成本2文件交付SHA后,实际串行运行16个相关合同文件(含费用覆盖、普通外接、同路线成本、跨客户入口/fixture/验收、容量池TEST/UI及GRAY、Fleet入口/成本/显式退回、正式单票、换标生产者和保留来源),426/426通过、0失败,TAP为后端`.codex-temp/dispatch-native-final-consumers.tap`。该结果覆盖当前已冻结的直接消费者组合,不代表脚本全量、共享实托新模型或环境验收通过。
合托模型只读准备已形成方向:服务端完整来源集合及组成版本;物理占用与逐客户逻辑来源占用分离;逐dispatchItemId精确拣货不新增整托一键多写;LoadingPreview每实托一行。前端精确触点已交主流程,仍冻结待字段级合同。提供者事实已核实:换标专用绑定逐item更新实际position,application/customer/绑定箱数/sourceInbound快照仍保留;实际新旧唛与成功数量须按app+item先聚合,不能把独立application.lastlegOrderId当全部原货源或从箱数推件数。通用混合仓位后续无归属部分移动仅凭余额不能还原应用份额,方案不得退回FIFO推断。B仅只读核对下游守恒:当前物理托数去重、逻辑箱数累加;来源重量体积无证据保持未知,禁止把整托实测复制到每来源。主流程继续字段级DTO/贡献/SQL草案,根等待精确DDL后同步两个初始化基线;未执行环境操作。
2026-10-19 20:07模型边界冻结:根已实际读取回滚脚本/真实Schema对应反例,独立运行rollback+cross外层两个合同63/63通过,2文件SHA为`fdc042d2b8abd5a08b7f99a0221402475bcddaa25d5da071e6c5f972a72b052f`及`73d3992390a8e1dff24d261344215ec42c3eee56fb3d0cc18b885ce20cf03e8b`;原专项83项为其不同命令范围,未混称根同次结果。README已按目标转仓晚期UPDATE、等待会话超时及全字段基线同步;新增合托表后取证表集合必须更新,当前结果不是新模型完成证明。
主流程给出精确SelectionGroup/Source/Pallet与Candidate.selectionGroup、PdaItem/OrderDetail来源业务号草案,根已技术同意并要求立即产出原port公共骨架及其唯一设计记录;核对实际记录后解锁前端并行,不能等主流程全部实现再开始。Pick/CargoSelection形状保持;组版本绑定完整组成、完工轮次、位置及来源版本,草稿动作服务端一次原子处理全组,Create/AddCargo逐来源显式提交并重算完整闭包。本条只冻结公开骨架和分层原则;来源贡献保存/后续移动的生产者精确触点、内部port及DDL仍待主流程字段级方案,总控再按已有写者分配。B的派送只读终稿及仓库提供者事实已交主流程,禁止复制整托实测到逻辑来源或以换标申请生成的尾程单冒充全部原货源。环境权限未变化。
2026-10-19 20:27共享实托实施检查点:三个既有任务均active。总控已逐字段及SHA核对实际SelectionGroup/Candidate/PdaItem/OrderDetail公开记录,前端已据此开始完整组选择、组成版本阻断及PDA同托/同箱唛明确选源;其新输入检查仍排队,旧73项/typecheck/build不扩展为新输入通过。派送专项已交付真实`RelabelDispatchSourcePort`骨架,SHA为`af771fd474faf6c411543b077c646479e6368b98ab3cab875c4cd6c0b3b24978`,总控核对三个方法及全部record参数与冻结合同一致后通知主流程接线;该专项独占新port/service/repository/mapper及持久化测试五文件,主流程不并写。来源提供者实现、完整闭包及锁内真实HOLD聚合仍在进行,不以骨架推定实现完成。
总控已同步模块和海外统一空库基线:新增物理实托占用、不可变换标来源贡献两表,逻辑占用改引用物理占用,PDA归属新增真实来源贡献引用并保持四选一,整车明细按来源键唯一;海外实际表数为227。初始化/容量Schema及两份五表定义一致性合同实际26/26通过,日志为`baiyue-firstleg/.codex-temp/dispatch-physical-schema.tap`;未执行环境SQL。两份公开OpenAPI已据实际Java记录同步100个类型和29平台/7PDA路径,正式文档校验及新模型组合回归尚未完成。回滚脚本两文件已由主流程移交原内部执行者,补齐新两表全字段及零行覆盖、物理owner/link和普通来源四选一取证,当前语法检查仍在原session16553排队;原63项结果属于此前输入。主流程新物理占用10个真实Mapper/事务用例已写入,原Maven session49123等待共享名额;不因排队重建检查或抢占其他任务。当前瓶颈为来源提供者到主流程的真实行为集成及共享检查队列;代码/离线回归估计3–4小时,部署与真实页面/PDA验收另计。四页签、已确认整托同车、日历排除及环境权限边界未变化。
2026-10-19 20:34实质复验:回滚两文件语法检查实际exit0,原内部写者定向合同62/62通过、零跳过;总控逐SHA确认两文件及被测模块DDL匹配,新增两表完整取证已接收,未据此宣称真实故障注入或HTTP通过。总控接口只读校验实际exit0,覆盖86个公开Java记录的568字段、336个可达本地引用及3份关联文档,重复键、来源组必需字段、五阶段和已删除车辆预约字段均检查;平台实际为30路径(29个本批维护路径加既有BOL打印),PDA7路径。首次本地校验将合法BOL遗漏于路径计数,核对真实QueryController后修正校验,生产路径未因计数而删除。该结果是字段/引用合同验证,未安装Swagger依赖、不冒称正式Swagger或运行时验收。
主流程物理占用定向Maven已运行但测试编译失败:新DispatchPhysicalClaimPersistenceTest两处泛型tx.execute结果直接传assertThat导致重载歧义,10用例尚未执行;总控已交唯一写者按明确类型变量最小修复。前端报告新输入Admin7文件140项、PDA履约35项及业务标识4项通过,完整类型/构建仍待,不把旧完整门禁扩大复用。换标提供者Service/Repository/Mapper已落盘,专项继续H2真实持久化/锁测试;原换标producer两文件由原内部作者接续NEW/MERGE同组一次Create及原键重放、每来源归属/一实托实测证据,不扩展该入口到审核装发,也不并写留存consumer。独立只读审查同步检查物理占用基础;所有实现写权保持唯一,不新增用户可见任务或环境权限。
2026-10-19 20:38独立审查发现正常链阻断:来源提供者以任务reviewedAt作为作业轮次,但正式客户确认会重写该时间;PALLET_BIND/SKU_SCAN仍保存确认前的INITIAL或返工作业轮次,造成正常已完工来源箱数归零且组成被判不完整。总控实际核对provider与RelabelApplicationService确认代码后,仅解除来源专项原5文件中的实际实现及直接测试冻结,要求按真实作业历史/返工边界识别并增加客户确认前后回归;port签名保持,原PDA/客户确认生产者不修改。冻结旧5文件哈希已匹配、12个测试仅为源码数量,不能记执行通过。主流程已通知继续按稳定port接线,待修复新候选后统一运行来源测试;物理基础独立只读审查未发现确定问题,草稿完整生命周期、来源集成及MySQL真实锁行为仍未证明。
前端新一轮完整类型检查在默认2GB下达到堆上限退出134,未通过;本批此前一次4GB例外已消耗,未再次提高内存、删测试或排除源码,也不重复同一OOM检查。前端继续Vite/PDA资源构建并交冻结候选,总控待稳定输入统一收口完整类型门禁,不能以定向140项或旧全量结果替代。当前阻断均已明确负责人,不增加日历业务或环境操作。
2026-10-19 20:51联合收口:来源专项已仅修Service及测试,改由真实COMPLETE.roundKey、PALLET_BIND/SKU_SCAN.round及返工归档边界识别作业轮次;新Service SHA `949ea59036d710af0cc0b81848a77e17da0da3de049e44124a36be141ee81fe0`、测试SHA `e745fe1da80ecdd1093fdb875f8e545b147558c0e1d256ee4edce81b2110a648`经根匹配,其余三文件不变。14个测试声明已交唯一Maven写者,尚无运行通过结论。独立前端审查另发现PDA将sourceBusinessNo无条件必填,实际普通入仓/退回来源该展示字段合法为空,导致无法选源;根已核对实际toItem、PDA查询及页面guard并交前端原范围修复,按真实RELABEL_ORDER类型校验换标业务号,其他来源仍要求真实sourceKey。新增普通wire/精确位置提交回归及Admin组字段可空语义一并核对,不能造业务编号或恢复旧别名。
共享换标producer两文件已按完整选择组一次Create和原键重放收敛,NEW/MERGE共用主单并保留各自来源,SPLIT原闭包保留,实测按唯一实托校验;原作者32/32及两次语法exit0,根匹配SHA `3cf7c8bdd6bbad471fc9ab2401895f1ee38cce25d34bd7604861dfa3ab23d450`/`bfbb872c7648abe15ece27dbdd927ad65469e3759baac7ebd4ed364011275a95`,README已同步,不再以所有共享托前置拒绝当交付。既有留存consumer仍只继续SPLIT,真实共享组装发全链没有因此宣告通过。
根完整运行脚本门禁:83个scripts根测试文件加131个Admin模块合同,共214文件,2204 tests、2199 pass、5 fail、0 skipped。首次子进程输出绕过PowerShell重定向,故针对同5项未解决失败再以Node reporter destination捕获,数量一致,完整TAP在`baiyue-firstleg/.codex-temp/dispatch-script-full-contracts-results.tap`。精确失败位置为phase3-producer-chain-contract:698、database-schema-alignment-migrations-contract:113、java-quality-summary:64、synchronous-dependency-contract:106及114;已交内部只读逐项归因,不直接判为既存无关或豁免,不改断言换绿。主流程另已产出SourceOrigin八字段及CargoLine尾字段,根核对Java SHA `5086523d9df7c7d00840d391e9608b1685e4edb71d19154b1608339afe7421e2`后,派送专项接其原delivery/financefee直接消费及测试构造点,前端接原CargoLine类型/wire,根接OpenAPI;公共Java主流程单写,SQL根单写。PDA逐来源位置贡献和草稿完整生命周期仍待主链证明。当前没有部署、环境SQL或真实HTTP。
2026-10-19 21:08新输入检查:根实际读取物理占用修正Maven日志及JUnit XML,10/10、零失败/错误/跳过,源码五文件哈希与主流程报告逐项相符,主生产类时间早于测试编译及报告;该结果仅证明物理基础。来源14项与派送/费用15项组合实际29项,27通过、1失败、1错误;两处经B定位均在测试:移走明细后原实托闭包仍可有效,须另读新实托验证旧绑定失效(不是reviewedAt轮次规则错误);重设Spy成功桩时when触发旧失败桩,改doAnswer,保留真实CAS/回滚/溯源断言。两测试新SHA `93e662367224e61850b0e57b29eb9e6d68e5ae4edc09e5c109c0bdb9cbc883ce`及`b989d8db720bd10aa4c928297ed387486353a06922d043d298b234bbc3c26b29`经根匹配并已交唯一Maven写者复验,生产未因追绿改动。
SourceOrigin公开文档已按实际Java重新同步101个typed schemas,根本地校验87记录、577字段、337可达引用、3份相关spec实际exit0,29维护平台路径外保留既有BOL,PDA7;不是正式Swagger或真实HTTP验收。根完成本批证据网关REQUEST/READ_WRITE/MIXED同步事实,语法通过,13项依赖合同11过/2失败;剩余明确为另3个预约Feign及2个废弃/领星HTTP未登记,不把已登记本批网关再列缺口。质量文档库存按实际扫描100份同步基线并显式纳入dispatch-evidence/fleet-preparation,3/3通过,未重生或改写旧覆盖率和SpotBugs结果。全214文件旧2199/2204结果保持原范围,未拼接冒称新全量全绿;phase3排版500字符断言、迁移目录版本及上述跨域metadata缺口仍保留未通过。
前端报告修正后Admin8文件147项通过、PDA43项通过,23源码快照及Vite/App资源构建仍待最终交付,完整类型检查仍为2GB OOM未通过。主流程另明确释放新增`DispatchItemSourcePersistenceTest.java`给既有B专项,根已下发并同步主契约;生产四文件与公共port仍A独占,B仅写该一测试,Maven仍A唯一执行。A并行完成来源闭包/草稿/PDA精确额度;目标托向已排车实托追加成员的palletops风险由根只读核对最小修复边界,尚未新增其写权,不把在途假设当已修复。所有环境操作门禁和日历排除范围保持。
2026-10-19 21:19本轮类型门禁:用户明确授权“6G,直接干”,根通过local-check实际使用6144MB执行完整Admin vue-tsc,包含源码和测试、不改项目配置,退出2且未再OOM。诊断仅在SailingCalendarView.test.ts第152、154、185行,共3处字段或MessageBoxData类型不符;不能标记完整门禁通过。执行前1022输入快照与执行后比较发现其他在途业务DomesticContainersView.test.ts、SailingCalendarView.vue,随后同一日历测试文件也变化,证据保留在根`.codex-temp/dispatch-final-typecheck-6gb-result.json`与原始输出;不将其冒称稳定全项目结论。排车23文件逐SHA仍一致,聚合6b31b6c02acfc616c0b5a4d2bfec6e9f11706cb27bc5c18fb8af39cbf7cf018f,Admin147/PDA43及Vite、App资源编译证据已接收,完整类型门禁独立保留未过。
B新增DispatchItemSourcePersistenceTest.java已冻结16用例,SHA 7da5553596458350d8a796421cb15b355306288375cfa8197daa1ba6c09e3e1c经根核对,已交A唯一Maven窗口;受控port的真实Mapper/H2组件测试不能代替完整provider组合。根另安排既有内部代理只读审查该测试,不授生产写权。palletops已确认目标已排车实托仍可被另一申请追加的顺序缺口,空目标/不相交来源并发还需共同串行点;A负责冻结最小port/DDL协议,仓内调用文件在协议冻结前仍只读,不以简单计数或单次重读宣称并发闭合。以上未新增对话、部署、环境SQL、真实HTTP或接管日历新增预约。
2026-10-19 21:22并行收口:A已提出最小共同串行点,总控按主契约冻结`ll_physical_pallet_guard`两字段及`PhysicalPalletSerialPort.lock(List<Long>)`,无第三owner、状态、TTL、HTTP或迁移。B独占inventory port/service/repository/mapper与真实持久化测试五文件;A独占dispatch/draft消费;既有内部native_fleet_script独占PdaPalletOperationService/Mapper、现有ServiceTest、新本域Repository及真实冻结PersistenceTest五文件,三个仓内分支统一门禁及原补偿;总控独占模块/海外统一SQL、初始化合同和说明,新增永久guard后海外空库表数228(国内227不变),六表定义同步校验已排队。原内部回滚脚本写者接续两文件23表完整快照,不改既有relabel生产者冻结包。B已交16用例经独立只读复核无已证实签名/Mapper问题,仍待A运行,受控provider及直接准备pick账本的边界继续保留。未新增用户可见任务或环境操作。
2026-10-19 21:30交付复核:B永久实托串行port/service/repository/mapper及12项真实Mapper/H2事务测试已落盘,根逐SHA匹配并独立只读审查,无确定生产锁或签名缺陷;两项并发测试仅在SQL前释放latch并等待Future超时,尚不能排除线程未进入数据库,已仅解冻该新测试要求真实数据库等待观测,不放宽协议、生产四文件仍冻结,Maven待A统一运行。根自己的结构门禁已实际exit0,TAP 27 tests/27 pass/0 fail/0 skip,覆盖两份SQL的永久两字段guard、六表一致性和容量约束;海外228表、国内227。该证据不表示环境SQL或业务链已通过。草稿完整组仍待接入,根已向A请求明确释放准确草稿文件给原B以继续并行;确认前保持单写者,不重复派工或并写。
2026-10-19 21:34持续复核:回滚脚本两文件已按新永久guard补齐23表,根读取范围、COUNT与全字段快照、普通来源空贡献及四来源XOR断言,逐SHA匹配脚本b71320d1918cea7e63779499ac3c0f2c0eeca4ad8547f47e14fa3ac1946f42d0及测试da00e939817fcc26cf5cf54d104894fe081329c556dc083e0deaa6807039be46;作者报告75/75合同与两语法exit0,根读取共享检查Last result同一精确标签exit0,不重复运行。B共同锁12测试已改为真实H2会话guard写语句与BLOCKER_ID关系,根实际读取关键代码并匹配新SHA 444bd8d361f4d90fbdaf1e4d1d205906b5452096670f57bd3459906716e36c7e,仍待A运行;生产四文件不变。仓内caller五文件已落盘尚未冻结,根发现TransactionTemplate默认隔离级别会使MySQL RR中的组成重读沿用旧快照,已交原唯一写者明确RC并补底层默认RR反例,不以H2默认RC或清Mapper缓存代替该证明。环境门禁及日历排除范围保持。
2026-10-19 21:49本轮检查点:根实际读取`.logs/dispatch-source-serial-persistence.maven.log`及六份JUnit XML,提供者14、派送/费用15、冻结来源16、永久串行12合计57/57,零失败/错误/跳过,实际重新编译1072生产与460测试源码并BUILD SUCCESS;444/7da测试SHA匹配。其后A已增执行时轮次/来源复核,生产发生变化,57不覆盖后续输入。A明确释放草稿Service/Repository/ClaimMapper/PersistenceTest四文件并停止写入,总控补读此前被最后快照遮住的中间交接确认后立即派B;主契约已同步,B另维护原ItemSource测试的真实轮次列。B缺物理占用整托移容器与全token/operator续期Service桥接已精确交A,禁止B跨层绕过。
根同步`relabel_round_key VARCHAR(128) NOT NULL`两SQL、初始化合同及说明后,实际经local-check运行结构/容量/23表回滚三文件,TAP 102/102、0失败/跳过,输入SHA在根证据清单的roundGuardSchemaRollback102。共享public Java仍5086523d9df7c7d00840d391e9608b1685e4edb71d19154b1608339afe7421e2,前端23文件逐SHA仍零漂移,未重复资源构建。新Mapper注册合同正在原session23482等待共享检查位,未启动或记通过。
仓内caller实际表结构复核发现计划托盘不存在warehouse_pallet_id,原写者已改真实pallet_no+父仓+客户/plan分配链,新真实表结构测试补不同仓同码;根已逐SHA匹配。继续逐入口核对又确认普通assemble/disassemble/swap/unbind因relabelMutation为空会跳过共同锁,普通AVAILABLE来源可向已排同目的仓目标追加,故同一五文件包已再次解冻给原唯一写者,需将generic分支也纳入原完整组成/RC重读/运输claim与锁内补偿;不增加页面、接口或资格。此包等待新冻结指纹,不把旧10项未运行用例当修后结论。A其后一次清理编译撞到B草稿在途方法,测试未执行,已要求等输入稳定后统一运行;不把WIP编译失败判为业务回归。环境SQL、真实HTTP、部署及页面/真机验收均仍未执行。
2026-10-19 22:11收口检查点:根实际读取`dispatch-merged-stable-integrated.maven.log`,本轮176项为165通过、2失败、9错误,未判整体通过。数值事实规范化、旧夹具缺列及断言修正后,`dispatch-merged-source-normalization.maven.log`的40项为37通过、3错误;其余3项为H2测试DDL不支持MySQL布尔求和CHECK,改等价CASE并保留四来源唯一约束后,根实际读取`dispatch-merged-main-caller-corrected.maven.log`,新真实提供者整托主链10及仓内caller旧单元20合计30/30,零失败/错误/跳过,BUILD SUCCESS。该主链覆盖同/跨客户合托、各来源扫码与一次SHIP、回滚重试、取消重排和一托容量,不替代真实HTTP、全部五阶段环境验收或页面/设备验收。
草稿20、物理claim/桥接13及仓内caller持久化20在176项批次中实际通过;来源17及主流程11、PDA读取1、整申请2在后续40项批次实际通过,分别保留输入边界,不混加成一次全绿。普通计划真实表结构新用例22:08因H2同schema约束名冲突失败,交A仅修测试DDL等价命名;A明确释放的`DispatchRepairWorkflowTest.java`已交B唯一修正旧装配和旧物理列夹具,原B五文件继续冻结,A保留唯一Maven执行权。
根Mapper门禁原session23482已实际exit0:10个持久化模块、396个Mapper注册通过,不再记排队。用户本次6GB完整Admin类型检查已实际终止exit2且无OOM,三项诊断均在`SailingCalendarView.test.ts`;排车23文件逐SHA未漂移,但检查期间其他域三文件变化,故不能宣称当前全应用门禁通过。排车147项Admin、43项PDA及资源构建证据仍单列;不改日历、不重复使用一次性内存例外,不提交、部署或写环境。
22:14结构事实校正:此前“计划托盘不存在warehouse_pallet_id”只读取了CREATE块,结论不完整;模块lastleg.sql第809行的有效guarded ALTER会补该列,第827行起还会补分配箱数等字段。根已要求A按最终初始化结构和真实收货状态修普通计划用例、保留生产冻结,不以H2缺列夹具反向改业务模型。新增只读复核交既有内部审查者,仅核对四个主链生产Service的完整来源、扫码额度与原货源归属,不并写、不另开Maven。
22:17内部主链只读审查结束,无可确证新生产缺陷;根逐SHA复核四Service与主链测试均匹配,指纹及范围写入根临时证据清单mainSourceReadonlyReview。核对覆盖完整闭包与锁后重读、逐来源客户/原货源和额度、原命令重放、扫码库存与归属同事务、确认装车不再SHIP;外部车队/测量仍受控、测试未由审查者运行,不能据此关闭运行验收。
22:21直接消费者收口:caller原作者已仅修Mapper与持久化测试两文件,以真实warehouse_pallet_id取计划来源,保留父仓/客户/plan/allocation/line隔离;测试改从完整最终初始化提列,原20方法保留并新增1项,覆盖同码异实托/异仓/未绑定排除及展示码不同不漏真实绑定。根实际匹配960bb9/a8ef7e;旧20通过不覆盖新输入,21项待A唯一Maven。B仅修DispatchRepairWorkflowTest的真实provider/Serial、新占用与换标事实,保留9项业务断言,并按最终真实计划写customer101和physical501;根匹配最终4a4d01,已交A,不再等待其他实现写者。其余包冻结;共享检查位当前被另一个Admin检查进程64760占用,根实际Get-Process确认存活,不抢占或绕过限流。
22:32草稿最后锁序包已冻结:B仅两文件,根匹配Service a2682e、Test35b7c4,原20加4参数化真实H2 guard SQL/阻塞会话场景共24;等待后复核租约,旧动作回滚及新owner不释放的断言已读,尚未Maven,A已获最终输入。根确认唯一手工构造器直接消费者已同步,主契约补纯释放/租约锁序边界。普通计划完整最终初始化用例实际1/1、BUILD SUCCESS,日志dispatch-plan-final-initialization.maven.log已核对。
根实际离线全量83根文件加131模块合同共214文件,2218项中2214通过、4失败,Node测试输入未漂移。原shell重定向未保存原生控制台的完整TAP,首次仅采纳实际终止计数,不以不完整文件证明精确失败归属;已用Node reporter-destination排队session8791保存完整报告,不启动其他重复检查。当前共享执行位仍由其他Admin检查47088占用,根实际进程存活;A完整Lastleg模块检查等待最后包/执行位,未判通过。前端补核对确认最新23文件未跑完整Admin Vitest,历史11超时不作当前通过;Client601/type/build仅旧交付文字、暂无独立原始日志。已让原C准备默认资源下必要离线检查,暂不入队,待根通知后运行,避免挤占后端;不重复使用本次6GB例外、不改超时追绿、不动日历新增预约。
2026-10-19 22:57收口检查点:完整Lastleg运行22:44:52已终止,3075项为3056通过、6失败、4错误、9跳过;草稿24、整托主链11、冻结来源17、仓内持久化21/单元20、Repair9、provider14在该输入实际通过,整体未通过。A负责BrowserApiBoundary/DispatchService/ReturnCandidate三个旧测试,内部唯一接四个旧预约/转运直接测试;其中A先前已改的Repartition/Pagination两文件在派工交叉时被内部读到漂移,内部未写即停,A明确释放后才继续,现四文件66071b/b9196d/5fbe3b/787e78已冻并根核对。没有恢复头客户、旧状态或新建预约。
只读证实客户确认前合法作废会真实RELEASE库存但保留旧item/position指针,旧provider再次引入该CANCELLED历史会误挡新排车。B仅Repo+ProviderTest两文件修复,根匹配Repo12b957、Test最终6eb43b(SKU方式NULL,16项待Maven),保留全部真实位置及残余HOLD阻断、不扩修纯SKU完成/HOLD生命周期。Root主契约同步边界。所有本轮修正已冻结,A已获明确通知立即按受影响类入队并编译全部测试源,不再等待未证实疑点,不重复整轮已知旧失败。
独立旧换标出库取消另有真实业务冲突:出库取消要求READY_FOR_OUTBOUND,却调用被申请状态机禁止的CANCELLED;原测试mock掩盖该矛盾。相关ReturnOutboundClosureTest及生产保持冻结,根已发异步业务选择“只取消出库安排、保留换标回待安排(推荐)/本批暂不处理旧入口”,待用户回复,不伪造来源取消通过。该问题与确认前合法作废历史过滤分开。
前端必要补验已终止:Admin418文件3541项中3540通过、1失败(adminDensity对ContainerLastLegFeesPanel缺density-action),这两个外域文件运行中漂移,本批23文件零漂移,故不判当前完整Admin通过;Client629/629、typecheck、build均exit0,三个检查同一661ac51a输入前后不变,原始报告在根`.codex-temp/dispatch-current-full-gates-20261019T144504659Z/report.json`。根已实际读取原始诊断、计数及SHA。完整离线脚本214文件2218中2214通过、4失败,完整TAP已保存并核准失败为phase3正则、历史迁移版本、预约Feign及Lingxing/Discard HTTP元数据;原shell重定向不完整文件不作完整TAP证据。根清单已记录各自边界,原6GB类型检查仍exit2/日历3诊断,不借其他进程标签判通过。环境SQL、提交、部署、真实HTTP和页面/真机验收均未执行。
2026-10-19 用户追加确认及授权:已确认换标、关联出库尚未扫码时,只取消本次出库安排,保留换标成果,退回待安排。内部`native_capacity_consumers`独占`DeliveryTransferService.java`、`DeliveryCancellationRepository.java`、`ReturnOutboundClosureTest.java`,原非TRUCK方式不改成TRUCK、不伪造换标再次确认;真实取消/清关联/回滚验证交A执行。最新65输入定向111项为110通过、1失败;根查明Repartition夹具allocation引用item11/physical12却插入item1/physicalNULL,仅把夹具改为真实11/12,新SHA f2f717,生产联接及原禁止拆分/并发断言不改,待统一复验。用户同时更新目标,明确授权当前排车TEST部署、操作测试数据库、真实HTTP与内置浏览器验收,Admin/Client1920×1080、两PDA390×848。总控统一环境写入和发布;现有独立任务不自行触发。此前“未获环境授权”限制已被本次明确授权替代,实际部署/HTTP/视觉仍待执行,不以授权当完成。日历新增预约不接管,开发/生产环境不操作。
2026-10-20 00:06收尾检查点:换标取消按用户确认保留成果/回待安排已完成,三个生产与直接测试文件冻结;最终定向94/94通过,Lastleg完整3081项为3072通过、0失败/错误、9条件跳过,1706输入核验零漂移。File完整242/242通过,286唯一输入无漂移;海外PDA本轮H5构建及verify-h5退出0,85产物、127输入及23冻结文件无漂移。以上仅各自本地输入证据,真实版本与HTTP仍单列环境主契约。
总控已执行获授权的八张新增空表及File三文件发布,详见环境主契约;未删除旧链。339旧排车、163草稿及关联218出库/269派送的备份废弃重建仍待用户明确处置答复,不能用默认审核/来源/实测补齐旧模型。CI #369单fork1GiB堆OOM,未部署;A只读核对最小生命周期修正,不增加并发或任意扩大内存,根检查真实代理cgroup容量。根依据实际Lastleg a563而非初始SCM e067组装d891候选,B独立核验346路径及已发布修复保留。C交付Client实际运行513b之上的六文件最小移除提案,根已核对并推送ba659固定标签,Client #432已排队;只是发布准备,未判运行成功。共享SQL/环境/根文档仍由根唯一执行,日历新增预约不接管。
2026-10-20 00:17发布检查点:Client #432精确ba659成功、容器健康、五公网资源与容器一致,临时Job配置完整恢复;真实DOM交互/CDP连续超时,仅确认登录和到达列表路由,不判视觉或请求量通过。A只改并冻结Lastleg POM一处reuseForks=false(0f2312),根基于已审d891组装8898、347路径并推固定标签,#370完整测试执行中、DEPLOY=false;代理无残留fork/cgroup OOM,只调整测试生命周期,未增堆/并发。旧链处置问题仍待答复,主版本、Admin与海外PDA保持未切换。
2026-10-20 00:31收尾检查点:本机CI资源/流水线三文件实际31/31通过、exit0,session68393已终止,没有残留本批本机重型检查。CI370的唯一当前断言失败确认为转运旧运行生产与当前在途测试夹具误配;A/B独立逐blob核对后只恢复候选测试到a563 d6823085,保留50用例及原ownership拒绝,当前工作区不动。B对20个差异生产输入和316个已纳入Java/MJS的直接配对未发现第二处同类偏差。根推送d761固定标签(346路径),队列8257待370结束后完整验证、不部署;旧轮继续收集其余失败,不能将局部通过当全量成功。Client新开页DOM读取17条、无创建按钮;尺寸、截图及网络观察工具仍超时,视觉/请求量待验。旧测试运输链处置仍未获答复,没有删除或结构切换。
2026-10-20 00:39 CI检查点:#370已终止FAILURE,496份类结果为依赖134加Lastleg默认3027、合计3161项,1失败/0错误/9跳过,无OOM;默认阶段失败导致后置SQL语义两类未执行,未声称全部断言完成。只有已定位并在下一候选恢复的转运夹具。原队列8257已转为#371并运行,精确d761、完整测试、不部署;134项当前通过不是整轮通过。根继续跟踪该明确运行句柄,不重启/重复派工。浏览器Page.getLayoutMetrics在正确读取本次CDP说明并设置1.5秒命令期限后仍工具超时,真实尺寸/截图/网络仍待验;新问题仅索取两PDA TEST H5入口,现有配置只找到API地址,未借用历史会话或猜域名。旧链处置确认仍未答复,无额外环境写入。
2026-10-20 00:53权限准备检查点:根只读核实当前IAM三个新增动作资源缺失,父列表有效;按既有本轮TEST非破坏性数据库授权及已验证源种子,只新增5107065/66/67三个目录资源,未改岗位关联/账号/安全版本/会话,回查新资源关联授权0。实际回执与切换待办只列环境主契约。CI371当前1176项无失败/错误,根实际从控制台提取确认转运原50项全过,修正候选问题已复验;完整CI及后置SQL语义仍执行中。两项缺失输入保持:旧运输测试链处置答复与两PDA TEST H5地址。
2026-10-20 01:20收口及阻塞审计:#371精确d761已SUCCESS、clean package、完整执行、未部署;JUnit3212=3203通过+9跳过、0失败/错误,Lastleg3027默认+51后置SQL合计3078,依赖134。原夹具50/50已复验,9跳过原因及不同本地输入计数只维护环境主契约,不冒充真实HTTP/四端验收。节点无残留Maven/Surefire、cgroup OOM0,所有本批检查句柄已终止;A200/B157/C120均idle,无新派工。六容器健康且Lastleg/Admin/两PDA仍旧运行版本,Admin源基线未变;海外H5127记录输入/23冻结文件/85产物复算0漂移,未发布。
同一旧运输链备份废弃重建确认已连续至少三轮未答复,01:17主单/草稿仍339/163;PDA TEST H5地址请求亦未答复。根未把通用数据库授权当作该删除/重建确认,未执行旧链处置或匹配主版本切换。可独立推进的候选及验证均已收齐,当前剩余端到端推进依赖用户输入,满足目标blocked审计;完整目标不标complete,收到所需输入后按实际状态继续,不重启已成功CI或接管日历新增预约。
2026-10-20 07:51输入补齐:用户提供两个本地PDA H5入口,根只读打开后确认5175国内、5176海外,两端登录前390×848截图完成。环境与验收证据仅维护环境主契约;未登录、改配置、重启、发布或执行业务写入。发现本地配置指向非TEST代理,已询问是否切换本地服务后继续,未把本地入口当作跨环境授权;旧链备份废弃重建确认仍未答复。三个既有任务不重复唤醒或派工,主版本切换与完整作业验收仍未完成。
2026-10-20 08:05本地PDA接通:按用户明确同意,仅切换两项目未提交本地API配置;HBuilderX自动重启,实际代理日志确认为TEST,两端正常UI登录及只读任务列表入口完成,各首次入口1个业务GET。有效截图及工具缩放限制只维护环境主契约;未领取/扫码或改任务状态。入口与本地环境切换不再待答复;旧链备份废弃重建仍未获确认,未推进主结构/Lastleg/Admin/海外H5匹配发布,不将本轮入口验收视为五阶段验收完成。无新派工或源码写权变化。
同轮海外H5配置输入变化已由根经local-check重建并校验,均退出0,85产物相对原构建不变,未发布。共同冻结文件复查发现两个Admin弹框当前输入变化,后续集成须按新输入复核,未覆盖或自行收回其他写入者文件;完整指纹和适用限制仅维护环境主契约。
2026-10-20 08:26用户明确旧运输TEST数据直接删除、不需要备份,原删除重建授权阻塞已解除。根为唯一SQL/发布执行者;复用内部代理分别只读审核当前Admin两弹框变更、旧运输关系闭包和实际运行发布基线,均不写环境、不改其他会话文件、不创建独立任务。根08:25只读预检主单/草稿等计数未变化,尚未删除/切换。当前阶段转为清理方案闭包与匹配发布准备,后续由根统一执行并验收,不再重复询问是否备份。
## 2026-10-18 预约演示问题交接与原总控退出
用户明确指定既有对话 `01a14f36-9fae-7dc0-90e6-1d3c54d22de6`(Bug 处理-1)处理 D1674 演示中的三个问题:保存预约后页面 A0409、查看原排车单后事项弹窗未关闭、继续安排本批车辆提示操作资格已变化;并明确 `01a13df2-c639-7560-a3e2-30bc23a579b3`(预约)不再担任总控。原对话已将操作指南、四张用户截图路径、已有诊断和保护边界发送给指定对话,停止开发调度、修改与部署。下方历史预约总控身份不再代表当前授权;本次不指定新的全局总控、不新建长期专项。
Binary file not shown.

After

Width:  |  Height:  |  Size: 509 KiB

@@ -0,0 +1,50 @@
# 蓝白样板目录与原始视觉参考
本文件只供按页面类型查找样板和原始截图。**Admin 样式统一从 [Admin 界面规范](../Admin高密度界面规范.md) 进入**;通用规则和公共类说明已并入主规范,本文件不再单独维护规则。普通样式任务无需先读本文件。
## 其他页面该参考哪个样板
| 页面类型 | 参考入口 | 源码入口 | 复用内容与保留边界 |
|---|---|---|---|
| 经营总览、首页指标、数据摘要 | **经营总览** `/self-operated/overview` | [`OverviewView.vue`](../../apps/admin-web/src/modules/self-operated/pages/OverviewView.vue)、[`DashboardTrend.vue`](../../apps/admin-web/src/modules/self-operated/components/DashboardTrend.vue)、[`DashboardBars.vue`](../../apps/admin-web/src/modules/self-operated/components/DashboardBars.vue) | 页头操作、统计口径、分区标题、指标卡、趋势和排行榜;按实际指标数量组织,六列指标、2:1 主图和三列榜单只属于该页 |
| 标准查询列表、业务台账 | **销量分析** `/self-operated/sales` | [`SalesView.vue`](../../apps/admin-web/src/modules/self-operated/pages/SalesView.vue) → [`AnalyticsView.vue`](../../apps/admin-web/src/modules/self-operated/components/AnalyticsView.vue) | 独立筛选区、列表外壳、主次按钮、表头与悬停态、分页;保留行密度、筛选条件、权限和操作列,不增加大指标卡 |
| 有分类/状态页签的业务列表 | **整柜业务**、**排车列表** | [`DomesticContainersView.vue`](../../apps/admin-web/src/modules/domestic-containers/pages/DomesticContainersView.vue)、[`DispatchesView.vue`](../../apps/admin-web/src/modules/overseas-warehouse/pages/DispatchesView.vue) | 顶部左侧分类页签、右侧操作共用一行,随后为筛选和表格;排车审核子分区保留真实层级 |
| 复杂分析、指标加宽表、多视图查询 | **库存分析** `/self-operated/inventory`,分别看“库存周转”和“库存明细” | [`InventoryView.vue`](../../apps/admin-web/src/modules/self-operated/pages/InventoryView.vue) → [`InventoryTurnoverView.vue`](../../apps/admin-web/src/modules/self-operated/components/InventoryTurnoverView.vue)/[`AnalyticsView.vue`](../../apps/admin-web/src/modules/self-operated/components/AnalyticsView.vue) | 视图页签、两组紧凑指标、可展开图表、宽表和关注条件;保留业务列宽、横向查看、固定业务标识及筛选作用范围 |
| 采集、同步、批处理等运行看板 | **数据采集** `/self-operated/collection` | [`CollectionView.vue`](../../apps/admin-web/src/modules/self-operated/pages/CollectionView.vue) → [`CollectionAccountMonitor.vue`](../../apps/admin-web/src/modules/self-operated/components/CollectionAccountMonitor.vue)、[`CollectionTaskProgress.vue`](../../apps/admin-web/src/modules/self-operated/components/CollectionTaskProgress.vue)、[`CollectionProgressGauge.vue`](../../apps/admin-web/src/modules/self-operated/components/CollectionProgressGauge.vue) | 主状态、当前阶段进度环、数量卡、右侧后续安排、阶段流程与各仓结果;进度与发布结果分开表达,不复制该模块的任务状态机 |
| SKU 趋势、图表明细和证据浮层 | 在上述页面点击已有趋势/明细入口 | [`SkuTrend.vue`](../../apps/admin-web/src/modules/self-operated/components/SkuTrend.vue)、[`ChartDetailsDialog.vue`](../../apps/admin-web/src/modules/self-operated/components/ChartDetailsDialog.vue),调用方见前三类页面 | 独立主题根、蓝白图表、说明与证据表;保留普通/全屏、关闭重开、正文滚动、原尺寸和数据重置行为 |
样板只用于参考结构,不授权跨模块引用内部组件或改变业务字段、权限及承载方式。自营模块的逐操作与验收记录见 [operation-matrix.md](../../apps/admin-web/src/modules/self-operated/operation-matrix.md)。
## 视觉基线与维护入口
已统一至 [Admin 界面规范对应章节](../Admin高密度界面规范.md#视觉基线与维护入口)。
## 信息层级与渐进披露
已统一至 [Admin 界面规范对应章节](../Admin高密度界面规范.md#提示文字与加载布局)。
## 公共样式接入
已统一至 [Admin 界面规范对应章节](../Admin高密度界面规范.md#公共样式接入)。
## 弹框与抽屉的布局边界
已统一至 [Admin 界面规范对应章节](../Admin高密度界面规范.md#作用域与嵌套)。
## 图表与数据表达
已统一至 [Admin 界面规范对应章节](../Admin高密度界面规范.md#图表与数据表达)。
## 本轮截图收尾约定
已统一至 [Admin 界面规范对应章节](../Admin高密度界面规范.md#实现与验收)。
## 后续推广顺序与验收
已统一至 [Admin 界面规范对应章节](../Admin高密度界面规范.md#新模块接入规则)。
## 原始视觉参考
![用户提供的蓝白卡片式工作台参考](蓝白卡片式工作台参考.png)
原图为 2874×1468 像素,像素尺寸不等于浏览器 CSS 尺寸。参考的是配色、卡片层级和克制的装饰;AI 报告、搜索、图钉等原系统功能不属于本项目的新增需求。悬停、焦点、禁用、加载和错误交互沿用本项目规则,不从静态截图推断。
+6 -7
View File
@@ -144,7 +144,7 @@
- 库存立方数=当前全品质实物件数×单件体积。不叠加冻结、次品或在途,不代表托盘/库位占用或含空隙的仓储空间。过期、缺失或异常库存保持未知。
- 出库立方数=对应完整出库窗口件数×当前商品单件体积。所有历史出库体积均明确标为估算,不冒充历史包裹实测体积;7/15/30 天及所选 N 天独立判断覆盖,不以部分销量冒充完整体积。
- 先按 SKU 计算再聚合货主与本仓,不平均尺寸、不按当前页求和、不把同名 SKU 跨客户合并。已知零件数可得零体积;正件数缺尺寸及数量未知分开统计。正式总量未知显示“—”,保留已知体积小计、缺尺寸件数/SKU 数、数量待确认 SKU 数及商品尺寸估算件数。
- 表格体积列的m³放在有效数值后,未知值只显示“—”,估算及缺尺寸说明保留;库存立方数、所选窗口出库立方数支持SKU/货主全量升降序,单件体积仅SKU支持排序。排序取正式未舍入值,未知末尾,不以已知小计代替;切换排序保持上下文并回第一页。
- 表格体积列的m³放在有效数值后,未知值显示“—”并保留必要的简短状态;完整数值来源、估算依据及缺尺寸原因在已有说明或 tooltip 中按需查看,估算属性仍须可辨认,不得冒充实测。库存立方数、所选窗口出库立方数支持SKU/货主全量升降序,单件体积仅SKU支持排序。排序取正式未舍入值,未知末尾,不以已知小计代替;切换排序保持上下文并回第一页。
- 不增加领星请求、重新采集或改动采集节奏。当前扩展仅在库存周转视图展示体积,原库存明细及销量分析保持现有指标。
保持 `/self-operated/inventory` 和现有菜单,页内提供「库存周转」「库存明细」两个视图。普通菜单进入默认“库存周转”,其中默认“按 SKU”;“按货主”是可选切换,不要求先选择货主,不在经营总览和销量分析恢复货主面板。
@@ -159,24 +159,23 @@
## 页面示意与交互
以下是布局与承载设计,不是实际数据或已验收截图。沿用模块 ECharts、蓝紫主色及浅色指标卡,数量、异常和数据状态同时有文字,不只靠颜色。
以下是布局与承载设计,不是实际数据或已验收截图。2026-10-20 用户授权与经营总览、销量分析一起采用[蓝白工作台公共样式](../界面参考/蓝白卡片式工作台风格参考.md):两组各三张摘要卡使用紧凑模式,图表面板、货主件数/体积/日均图表、库存视图页签和关注筛选统一蓝白外观。保留现有 360px 双图面板和内部伸缩画布、表格密度及趋势/证据弹窗尺寸。本轮按用户截图收尾:快照解释、本仓概览/截至/采集时间整行和图表范围说明移入已有说明入口;正常卡片只保留名称、数值及单位,删除重复“已确认”;移除独立“展开图表”行,将图表操作并入顶部简短入口。真实未知、陈旧和异常保留简短文字,来源及估算细节按需查看;估算不冒充实测,状态不只靠颜色。视觉待人工截图确认。
```text
库存分析 库存周转〔默认〕 库存明细 数据采集
库存分析 库存周转〔默认〕 库存明细 图表 数据采集 显示更多指标 说明
仓库 [当前仓] 统计时间范围 [最近3 / 7 / 15 / 30天 / 自定义] 查询 刷新
按 SKU / 按货主 SKU 搜索〔仅 SKU 视图〕 关注条件 / 阈值 / 排序
销量:7日完整、15日缺2日、30日缺12日 当前库存采集:开始……完成……
────────────────────────────────────────────────────────────────────
实物件数 正品可售件数 所选时段无出库 SKU 待评估 SKU
实物件数 正品可售件数 库存立方数 | 无出库 SKU 出库立方数 待评估 SKU
────────────────────────────────────────────────────────────────────
货主实物件数 Top10(横条) 货主库存立方数 Top10/日均出库对比
────────────────────────────────────────────────────────────────────
全部 | 实物件数最多 | 所选时段无出库 | 消化较慢 | 消化较快 | 待评估
SKU/商品/货主 | 实物/可售 | 7日/15日/30日出库 | 日均 | 可售天数 | 状态
……服务端分页,20条/页…… 扩展列/统计说明
……服务端分页,20条/页……
```
图表约 220~260px 高,可折叠且记住本页偏好,表格仍是比较明细的主区。四张指标卡和两图显示当前仓库及精确货主范围的整体情况,不随 SKU 关键字、关注筛选及翻页改变;区块标明“本仓概览”或“本货主概览”。列表上方单独显示筛选结果条数,不能让全仓卡片被误读为当前页合计。
图表面板保持 360px 高,可折叠且记住本页偏好,表格仍是比较明细的主区。两组各三张指标卡和两图显示当前仓库及精确货主范围的整体情况,不随 SKU 关键字、关注筛选及翻页改变;完整作用范围在已有说明入口明确,不另设常驻概览解释行。筛选结果条数沿现有列表呈现,不能让全仓卡片被误读为当前页合计。
指标卡主数值只展示正式总量,未知总量显示“—”;已知小计(含0)与待核验SKU数放辅助说明,不用已知小计冒充完整总量。库存过期须明确显示最近观测完成时间及受影响指标;同仓采集失败独立显示原因、真实任务号与状态观测时间,沿现有数据采集入口查看。整体刷新同时更新只读采集状态,状态请求失败须说明,不能继续把旧失败当最新状态或影响已成功返回的经营数据。样本证据明确区分出库历史、原始库存观测和流水还原的日末库存;截止日只允许已结束的北京时间日期。当天08:00库存仅作为独立锚点,尾段和对账齐全后可还原并发布昨日库存,不需要再等一天。
+3 -1
View File
@@ -29,7 +29,9 @@
### 2026-10-13 单账号首屏收敛(优先于下方原方案)
用户在最新截图中明确:只有一个领星账号,首页只关心账号正在做什么、完成/剩余多少、预计本阶段多久结束及后续处理。首屏改为账号运行看板,直接使用账号活动与各仓实际活动摘要,不受历史任务号或仓库筛选影响;不能把停止的历史记录作为主进度。布局按配套原型重构为运行看板,配色使用现有 Admin 白色卡片与蓝紫色强调,保留环形进度、三项数量、预计时间和阶段流程;待机时显示最近发布结果与各仓可用状态,不把待机画成100%完成。
用户在最新截图中明确:只有一个领星账号,首页只关心账号正在做什么、完成/剩余多少、预计本阶段多久结束及后续处理。首屏改为账号运行看板,直接使用账号活动与各仓实际活动摘要,不受历史任务号或仓库筛选影响;不能把停止的历史记录作为主进度。布局按配套原型重构为运行看板,保留环形进度、三项数量、预计时间和阶段流程;待机时显示最近发布结果与各仓可用状态,不把待机画成100%完成。
2026-10-20 用户追加数据采集与经营总览、销量和库存一起采用[蓝白卡片式工作台样板](../界面参考/蓝白卡片式工作台风格参考.md)。页面显式接入 `admin-workbench` 公共作用域,采用白色圆角面板、蓝色进度环、紧凑数量卡和阶段状态标签;保留左侧主进度、右侧后续安排、下方阶段流程和各仓结果。主状态使用单一、清楚的表达,采集关闭且有保留进度时明确关闭/暂停,不同时重复“待机”“等待续采”等容易混淆的提示;进度数值与真实阶段证据继续保留。完整口径、任务摘要限制、阶段预计时间及发布区别等解释进入已有说明入口按需查看,同一等待或异常原因不跨区块重复,关键失败、未知和阻断保留简短提示。蓝色表示当前强调,绿色表示已有完成证据,灰色表示待确认;刷新、轮询、计数和当前阶段预计时间的依据均不变。实际视觉待人工1920×1080、100%截图确认。
按用户最新要求,采集页移除仓库筛选、任务定位、配置、历史详情、诊断与恢复表单,只读一个账号概览接口;旧链接中的仓库和任务号不改变账号首屏。后续阶段用流程说明展示,不宣称已确定执行顺序;待处理只列服务端已返回的活动摘要(每仓每类型有上限),不能将其数量冒充全账号剩余任务总数。没有完整队列与总任务ETA契约时如实说明,继续展示可靠的当前阶段剩余量和阶段ETA。
+4
View File
@@ -6,6 +6,10 @@
## 菜单与页面布局
2026-10-20 用户选择本页作为[蓝白卡片式工作台风格](../界面参考/蓝白卡片式工作台风格参考.md)的首个样板:六项指标采用淡彩图标底座、蓝色大数字和轻边框圆角卡片;保留两列主图及三榜,并增加分区标题。公共外观由 Admin `src/styles/adminWorkbenchTokens.css`、`adminWorkbench.css` 管理,通过 `admin-workbench` 显式启用(同日已获授权扩展到销量、库存分析与数据采集);查询、数据口径、下钻、图表高度和原弹窗承载不变。整端推广待老板确认,视觉待人工 1920×1080、100% 截图核对。
同日按用户补充截图同步优化图表内部:公共 `src/styles/adminWorkbenchChartTheme.ts` 提供蓝白配色、灰蓝坐标、轻网格与提示框外观;本页趋势使用蓝色直线和更轻的缩放条,仅连续完整数据段填充浅色面积。柱图采用圆角条、千位分隔数值和按业务分类键稳定配色,待核验保持灰色;空榜单使用居中图标和原因说明。真实数值、零与未知、日期断线和下钻映射保留。主题由总览图表显式接入;同日按用户后续授权,共用 SKU 趋势与库存周转图表也统一接入。
新增路由 `/self-operated/overview`,模块页建议为 `apps/admin-web/src/modules/self-operated/pages/OverviewView.vue`。菜单顺序为经营总览、销量分析、库存分析、数据采集;沿用 `platform:self-operated-analytics:list`,总控统一集成路由、导航及 IAM。保留原三个页面的查询与作业入口,不更改登录后的全局首页。
总览只选一个仓库,不合并两仓库存、规则或可售天数;不增加来源账号、货主或 SKU 输入框。仓库首次为空时提示选择,返回页面可恢复最近选择;无有效仓库不查询经营接口。来源账号由已有受控配置确定,不在业务页面显示技术键。
@@ -309,7 +309,7 @@
订单列表包含订单号、参考号、运输方式、起运地、目的地、状态、负责人、预计时间和更新时间;支持关键词、状态、运输方式和创建日期筛选。
头程下单取货方式按“卡车自送、我司提货、快递自提”排序。仅快递自提显示选填快递单号;服务端去除首尾空白,空值清空,其他取货方式不保存单号。复制订单时清空单号,避免复用上一票快递信息。
头程下单取货方式按“卡车自送、我司提货、快递自提”排序,新建、重置及快速下单生成草稿默认使用“卡车自送”;编辑已有草稿保留已保存的取货方式。仅快递自提显示选填快递单号;服务端去除首尾空白,空值清空,其他取货方式不保存单号。复制订单时清空单号,避免复用上一票快递信息。
创建页按以下顺序组织:
+15 -384
View File
@@ -1,390 +1,21 @@
# 财务管理闭环盘点与范围建议
# 财务文档入口
当前费用入池 P0 的唯一收口说明见:[财务费用入池 P0 闭环](财务费用入池P0闭环.md)。费用入池后的对账、应收应付结算、收付款、冻结、隔离和导出闭环见:[财务对账结算 P1 闭环](财务对账结算P1闭环.md)。两份闭环文档覆盖当前已确认范围;与本文历史范围冲突时,以闭环文档和更新日期更晚的产品确认优先。
只负责路由。已知页面、接口或服务时跳过本文件;接口实现从 Finance Controller/DTO/OpenAPI 与最近指引进入,规则只读下表命中的正文段落。历史五页范围不覆盖后来确认的资金账户与当前闭环。
## 当前确认:一件代发客户资金账户(2026-09-05)
## 当前规则正文
当前对话已将资金账户作为一件代发的前置节点重新纳入范围,并覆盖本文后续历史章节中“钱包不做”的旧结论。首批固定为 CNY。平台设置授信时必须同时设置晚于今天的到期日,最远日期不设上限;到期日当天仍有效。有效期内消费先扣实际可用资金,不足部分累计为已用授信;次日授信失效时,已用授信自动并入实际余额并允许形成负数,负数实际余额会阻止客户提交新订单。充值先归还已用授信或负余额,剩余金额才形成正数资金。
客户选择固定或自定义金额,查看后台配置的平台统一静态收款码,付款后上传 JPG/PNG 截图形成待审核申请。平台在客户账户明细顶部审核或驳回,也可手工充值、扣款和设置客户限时授信;每次变动写不可变账户流水。新账户默认授信为 `0.00`,只有平台明确设置额度与有效期后才启用。Finance 还提供仅服务令牌可访问、按业务类型和业务单号幂等的冻结、结算和释放接口,供一件代发等模块接入。审核、账户更新、流水、冻结记录和幂等结果在 Finance 单事务内完成,文件内容仍归 File 服务。接口契约见 [客户资金账户 OpenAPI](openapi/finance-wallet-v1.yaml)。
> 盘点日期:2026-09-09
> 当前状态:费用入池 P0 与对账结算 P1 已完成测试环境部署及真实 HTTP 全链验收;最终报告为 `baiyue-firstleg/reports/admin-test-env-acceptance-20260909103401.json`,1518/1518 通过。领导页面人工截图仍按独立验收规则执行
> 盘点范围:入库计费现状、平台后台财务原型、Admin/Client/Firstleg 当前实现
> 结论口径:本文区分“代码已实现”“原型展示”和“建议范围”;原型功能不自动成为开发范围。
## 费用来源扩展确认(2026-09-02)
- Finance 继续保持独立服务和独立数据库;业务服务只生产费用事实,不能直接写财务单据或余额。
- Firstleg 入库费用继续按客户和入仓码进入 Finance;柜级公共费用必须先按柜内真实客户与业务订单原子分摊,再逐客户进入应收应付。入仓码是可选引用:存在时必须校验真实归属,不存在时保留订单/业务单号,禁止伪造入仓码。
- Lastleg 的海外入仓、海外采购、本土卡车、本土散板和海外仓服务费使用统一版本化来源。审核通过、调整和作废同事务写海外 Outbox,通过 Event Bridge 向国内 Finance 投递完整不可变快照;Finance 不跨海外数据库回查。
- Finance 以 `sourceSystem + sourceType + sourceFeeId + sourceVersion` 唯一入池;重复事件幂等,同版本不同哈希拒绝,已进入有效账单或结算单的来源禁止替换/作废。
- 海外仓服务费只强制客户、海外仓和业务编号;入仓记录/入仓码按真实业务选填,月租、仓租等无入仓码费用仍可入池。
当前实现包含柜级分摊 API/Admin 录入、海外费用来源 API、跨区事件、Finance 通用消费入口及数据库脚本,并已完成测试环境数据库和真实 HTTP 验收。页面人工截图仍按独立验收规则执行。
## 历史测试环境部署状态(2026-08-12,已解除)
当时的 Finance 全链路测试环境实跑报告为 `baiyue-firstleg/reports/finance-full-acceptance-20260812.json`:共 430 项,411 项通过,19 项失败,当时结论为 `DEPLOYMENT_BLOCKED`。这些阻断已在后续版本解除,当前结论以 P0/P1 闭环文档和 2026-09-09 最终报告为准。
当前主要部署阻断:
- Gateway 健康,但 `/finance-service/v3/api-docs` 返回 HTTP 503,测试环境 Finance 服务不可用。
- `baiyue_finance` 当前仅部署旧 F0 schema;`fin_bill`、`fin_fee_source` 等存量表无业务数据,G3/G4 新表未部署。因此对账、应收应付、凭证及结算写链无法完成真实 HTTP 验收。
- 本地脚本和模块契约测试通过只证明验收程序契约成立,不代表测试环境 Finance 服务或数据库迁移已经部署成功。
报告生成后,产品进一步确认现有 ACTIVE 往来单位均可作为应付结算候选,不要求 `SUPPLIER` 类型。曾为诊断临时新增的 `FIN-FULL-SUP-20260812` 及其类型映射已从测试库完整删除;全量脚本和 Admin 页面均已改为复用现有 ACTIVE 往来单位。原报告中的“未找到 ACTIVE SUPPLIER”仅反映当时脚本的旧过滤条件,不能倒推为测试环境已通过。当前仍需完成墨家测量实重同步修复、Finance 服务部署和 G3/G4 schema 迁移,再重跑同一三模块链路形成新报告。
产品/业务逐项确认请使用:[财务管理产品确认表](财务管理产品确认表.md)。
产品回传后的差异和剩余门禁见:[财务管理产品确认版差异与剩余待确认](财务管理产品确认版差异与剩余待确认.md)。
技术边界已确认:[财务服务边界设计](财务服务边界设计.md)。Finance 采用独立服务和独立数据库,Firstleg 仅提供业务费用来源。
开发前总控门禁与 F0/F1 任务清单:[财务开工门禁与F0-F1任务清单](财务开工门禁与F0-F1任务清单.md)。
订单与客户领导验收唯一范围入口:[财务核心五页产品与接口验收契约](财务核心五页产品与接口验收契约.md)。
订单与客户 11 个 P0 操作、状态机与验收用例:[财务核心 P0 操作契约与验收用例](财务核心P0操作契约与验收用例.md)。
订单与客户实现与 Admin 接入证据(不反向修改目标契约):[财务核心 P0 实现证据矩阵](财务核心P0实现证据矩阵.md)。
文档优先级:五页验收契约和本轮产品确认 > 五页目标 OpenAPI > 既有人工 F1 契约/门禁 > 领域模型、历史全量规划和迁移文档。旧文档用于追溯,不得据此把钱包、充值、发票、费用分析或利润表重新纳入订单与客户。
旧文档降级规则:
| 文档/章节 | 当前用途 | 订单与客户实施约束 |
|---|---|---|
| 本文第六节起的“历史全量规划” | 保存早期盘点和演进背景 | 与五页契约冲突时全部失效,不作为菜单、路由、字段或接口依据 |
| `财务领域模型与跨服务契约.md` | 历史合并稿 | 已被数据字典和跨服务契约替代 |
| `财务服务边界设计.md`、`财务领域模型与数据字典.md` | 服务边界和长期模型参考 | 其中钱包、充值、发票、费用分析、利润模型不属于订单与客户 |
| `财务历史迁移与上线验收方案.md`、`财务F0实施任务拆分.md` | 历史迁移、底座任务追溯 | 不得覆盖五页范围和当前实现状态 |
详细设计材料:
- [海外仓费用统一接入财务评审方案](海外仓费用统一接入财务评审方案.md)
- [海外仓费用统一接入阶段0技术契约](海外仓费用统一接入阶段0技术契约.md)
- [财务业务操作流程图](财务全链路流程图.md)
- [财务业务全流程总览图(PNG)](财务业务全流程总览图.png)
- [财务来源接入现状](财务来源接入现状.md)
- [财务领域模型与数据字典](财务领域模型与数据字典.md)
- [Firstleg-Finance跨服务契约](Firstleg-Finance跨服务契约.md)
- [F1 人工账单、收款、成本接口契约](F1人工账单收款成本接口契约.md)
- [F1 人工财务契约审查与门禁](F1人工财务契约审查与门禁.md)
- [财务核心五页产品与接口验收契约](财务核心五页产品与接口验收契约.md)
- [财务核心五页 OpenAPI](openapi/finance-core-five-pages-v1.yaml)
- [财务核心 P0 操作契约与验收用例](财务核心P0操作契约与验收用例.md)
- [财务核心 P0 实现证据矩阵](财务核心P0实现证据矩阵.md)
- [财务历史迁移与上线验收方案](财务历史迁移与上线验收方案.md)
- [财务F0实施任务拆分](财务F0实施任务拆分.md)
历史合并稿:[财务领域模型与跨服务契约](财务领域模型与跨服务契约.md) 已由“领域模型与数据字典”和“Firstleg-Finance 跨服务契约”两份文档替代,不作为后续实施依据。
## 一、结论
当前首期采用人工简化方案:平台财务登记收付款并上传凭证;客户可查询并确认本人已出账对账单。首期不做银行自动对账、自动核销任务、复杂审批、客户钱包、发票、供应商在线结算、汇率、月结或总账。
当前已经实现业务计费闭环,并已落地 Finance 独立服务/数据库、人工账单/收款/成本基础接口、平台与客户权限种子、Admin 财务页面和 Client 只读账单页面。当前不是“整体未开发”,而是已进入专项修复和契约收敛阶段。
已具备的基础链路:
```text
测量/称重
-> 测量审核
-> 计费规则匹配
-> 费用试算与快照
-> 发布对客费用
-> 客户查看并确认已出账对账单
-> 完成入库
```
当前 F1 已具备的实现链路:
```text
平台财务创建草稿账单
-> 出账冻结
-> 人工登记收款
-> 一笔收款分配多张账单
-> 部分收款/收清状态更新
-> 客户只读查询
```
此前基础链路已完成 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 页:客户账户、客户应收应付、客户对账单、结算单应收、结算单应付。费用分析、利润表、发票和钱包不做,也不保留菜单、路由或假按钮。客户账户改为账单、收款和应收应付来源派生的财务往来总览,不做充值/预收。
## 二、事实来源与边界
本次按以下资料核对:
1. 入库测量与计费需求文档明确入库测量与计费只做头程计费,不自动形成应收、应付、对账单、收付款、核销、发票、利润或总账。
2. 平台后台原型提供财务管理全量参考,但其中数据和交互主要由单页 HTML 内的静态数据及前端脚本驱动。
3. 当前代码用于证明“已经实现什么”,不反向扩大产品范围。
主要依据:
- `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/`
- `apps/admin-web/src/prototype/modules/finance/`
- `apps/client-web/src/modules/first-leg/`
- `apps/client-web/src/modules/finance/`
- `baiyue-firstleg/firstleg/`
## 三、当前已经具备什么
### 3.1 可作为财务上游的业务数据
| 能力 | 当前状态 | 可复用价值 | 不能代表什么 |
|---|---|---|---|
| 实测重量、体积、计费量 | 已实现 | 作为费用计算依据和业务快照 | 不是财务凭证 |
| 客户计费规则、船司价格 | 已实现 | 产生确定的对客头程价格 | 船司价格不等于供应商应付 |
| 费用试算、确认、发布 | 已实现 | 形成版本化对客费用快照 | 不等于应收单或账单 |
| 费用调整 | 已实现 | 已发布费用调整生成新版本并留原因 | 尚未定义已出账或已核销后的调整方式 |
| 客户侧费用与账单查看 | 已实现 | 客户能看到入库及已发布费用结果,并在线确认本人已出账且待确认的对账单 | 客户不能修改金额、在线提出争议或登记收款/核销 |
| 费用项目主数据 | 已实现 | 支持费用编码、分类、国内/国际、提货/仓库应收应付属性 | 费用项目属性不自动生成财务记录 |
| 入库费用明细 | 后端已实现 | 支持人工新增、编辑、删除、审核、自动发布的入库运费明细 | 尚无跨入库单财务台账和结算生命周期 |
| 权限与审计基础 | 部分具备 | 费用明细查看、编辑、删除、审核已有权限和业务审计 | 财务制单、复核、收款、核销、反核销权限尚未定义 |
### 3.2 当前费用明细的真实边界
Firstleg 已有 `fl_inbound_fee_detail`,包含:
- 入库单、费用项目、方向、业务发生日、币种、单价、金额;
- 重量、体积、计费量等业务快照;
- 审核状态、审核人、驳回原因;
- 发布状态、发布时间;审核通过后自动发布并成为结算候选;
- 自动计费来源的费用单号和版本。
但当前仍存在以下断点:
- 自动发布链路只生成 `RECEIVABLE` 对客运费。
- 人工 `PAYABLE` 明细使用 Warehouse `supplierId/supplierName` 快照;费用项目 `supplierCategory` 可空,空表示任意启用供应商,非空严格匹配。
- 人工明细采用编辑、提交、审核、调整、作废闭环;审核通过后自动发布,不再存在“是否结算”开关。
- 已发布应收明细只能按单个入库单查询,未形成按客户、币种、账期聚合的财务台账。
- 没有冻结、出账、核销后的费用变更规则,无法保证历史账单金额稳定。
## 四、原型中有什么
平台后台原型的财务菜单包含以下能力:
| 原型模块 | 原型展示的主要能力 | 当前代码状态 | 是否能直接纳入首期 |
|---|---|---|---|
| 客户账户 | 原型为余额、冻结、可用余额和充值流水 | 未实现 | 订单与客户保留汇总/详情/流水结构,但改为未收、待出账、本期已收等派生指标;删除充值/钱包能力 |
| 客户应收应付 | 费用明细、编辑审核、按截止时间或勾选生成账单 | 已接入真实费用来源和编辑审核闭环 | 作为应收应付费用池 |
| 客户对账单 | 账期、汇率、应收、已收、结清、明细和支付历史 | 未实现 | 可作为应收闭环核心,但汇率和开票先暂缓 |
| 结算单应收 | 应收、已收、余额、到期日、审批、部分收款 | 未实现 | 可合并进账单/应收单,避免首期重复建模 |
| 结算单应付 | 供应商应付、已付、余额、审批、部分付款、利润 | 未实现;上游成本来源不完整 | 订单与客户纳入,但删除利润字段/按钮;必须先补真实供应商应付来源和付款凭证链路 |
| 费用分析 | 内外部费用对比、趋势和明细 | 未实现 | 订单与客户明确不做,不进菜单/路由 |
| 利润表 | 按客户、货柜、单票、月份统计收入、成本、利润率 | 未实现 | 订单与客户明确不做,不进菜单/路由 |
原型还出现了发票抬头、开票日期、汇率、支付方式、收付款凭证号等字段。它们只说明未来可能需要,不代表当前产品已经确认税务、外币折算、资金或发票边界。
当前 Admin 已有正式财务路由、账单详情/草稿修改/出账/调整/作废、人工收款和成本页面及真实凭证上传调用,Client 已有正式只读账单页面。后端已改为根据 `containerId` 调 Firstleg 体积快照并完成成本凭证校验,但 Admin 仍强制人工填写并提交柜内订单体积,且未接客户账期和 revision,因此前端创建闭环尚未与最终契约对齐。
## 五、当前修复中缺口
| 序号 | 断点 | 直接影响 |
|---|---|---|
| 1 | 五页读接口、平台/客户固定 DTO 和追踪响应已实现 | Finance 35/35 BUILD SUCCESS;本轮使用现有 Surefire 报告核对,不重新执行 Maven |
| 2 | 收款和成本均已校验凭证,但 `fileClient == null` 时仍 fail-open | File 客户端缺失时可能绕过凭证校验 |
| 3 | 后端已使用 Firstleg 真实体积快照,Admin 仍要求人工填写并提交体积 | 页面与最终请求契约不一致,产生无效输入和误导 |
| 4 | 幂等已有 SHA-256 与同参重放,但未覆盖完整规范化请求,缺 PROCESSING 恢复测试 | 仍可能误判同参或无法恢复中间态 |
| 5 | 客户账单已过滤可见状态,收款列表仍暴露平台字段且未按可见账单过滤 | 客户只读边界仍不完整 |
| 6 | Admin 已接账单动作,但未接客户账期、revision,整柜仍人工填体积 | 平台财务页面仍非完整闭环 |
| 7 | 业务错误码仍以通用错误和中文消息为主 | 前端无法稳定区分版本、幂等、凭证和归属错误 |
| 8 | revision 后端查询已落地,Admin 尚未接展示 | 调整历史仍不能在产品页面核对 |
## 六、全量财务规划与交付顺序
### 6.1 历史全量规划(不作为订单与客户范围)
以下内容只保留为历史分析。若与《财务核心五页产品与接口验收契约》冲突,以五页契约为准。
| 目标域 | 业务结果 | 主要来源 | 不能提前假定的口径 |
|---|---|---|---|
| 客户账户 | 客户财务往来派生汇总、详情和流水 | 账单、收款和应收应付来源 | 订单与客户不建设钱包、充值、预收或自动扣款 |
| 客户应收 | 客户欠款、到期、逾期、结清 | 已发布对客费用、补差/冲销 | 收入确认节点和账期规则 |
| 客户应付 | 客户代垫或返还类应付款(如确有业务) | 业务费用或人工单据 | 产品是否真的存在“平台向客户付款”的场景 |
| 客户对账单 | 期间内费用汇总、明细、平台出账和客户确认 | 应收/应付费用池 | 一张账单是否允许混合方向、混合币种 |
| 结算单应收 | 可审批、可收款、可核销的应收结算单 | 已确认客户账单 | 与客户对账单是一对一还是一对多 |
| 结算单应付 | 供应商成本、付款、余额和结清 | 供应商费用、运力/仓储/报关成本 | 成本确认、供应商账期、审批和付款方式 |
| 收付款与核销 | 到账/付款凭证,部分结算、反核销 | 银行流水或人工登记 | 是否首期接银行流水,是否允许一笔多单核销 |
| 发票 | 开票申请、开具、红冲、作废和关联 | 已确认应收/收款 | 税率、含税/未税、开票主体、外部平台 |
| 费用分析 | 历史规划,订单与客户不做 | 应收应付台账 | 不进入订单与客户菜单、路由和验收 |
| 利润 | 客户/单票/柜次/月度收入、成本、利润率 | 应收收入 + 应付成本 + 分摊 | 汇率、成本分摊、收入成本确认时间 |
### 6.2 分阶段交付顺序
全量目标建议拆成五个可验收阶段:
| 阶段 | 交付范围 | 关键闭环 | 前置依赖 |
|---|---|---|---|
| F0 财务底座 | 独立 Finance 服务/数据库、财务主体、客户/供应商往来单位、币种、费用科目、期间、权限、审计、幂等、金额精度 | 所有后续对象使用同一基础口径 | 服务边界已技术确认;产品确认主体、币种、权限和编码 |
| F1 应收与客户对账 | 应收费用池、平台出账、客户确认、结算单应收、收款登记、核销、反核销 | 费用 → 账单 → 客户确认 → 应收 → 收款 → 结清 | 当前已发布对客费用来源 |
| F2 应付与供应商结算 | 成本费用池、供应商账单、结算单应付、付款登记、付款核销、应付调整 | 成本 → 供应商账单 → 应付 → 付款 → 结清 | 供应商主数据和真实成本来源 |
| F3 客户账户与发票 | 订单与客户只做派生客户账户总览;发票暂缓 | 账户只读聚合,不维护资金余额 | 发票不属于订单与客户 |
| F4 分析与利润 | 订单与客户不做 | 不建设菜单、路由或假入口 | 后续重新立项 |
阶段之间可以并行做页面原型和契约设计,但生产数据链路必须按 F0 → F1/F2 → F3 → F4 验收。F4 不能用原型静态数字先行替代真实台账。
### 6.3 F1 最小财务闭环
F1 先处理当前已经有可靠来源的对客头程费用:
```text
已审核并发布的应收费用明细
-> 进入待对账费用池
-> 按客户 + 币种 + 账期生成对账单
-> 内部复核
-> 客户在线确认(异议仍线下反馈)
-> 平台财务出账后形成应收
-> 登记实际收款
-> 将收款核销到应收
-> 全额核销后结清
-> 错误时按权限反核销并留审计
```
F1 建议页面:
1. 应收费用池:查询、编辑、提交、审核、调整、作废;审核通过自动进入结算候选。
2. 客户对账单:生成、明细、内部复核、发送、关闭;平台财务可重开或调整。
3. 应收与收款:应收余额、到期日、收款登记、附件/凭证号、部分核销。
4. 核销记录:每笔收款对应哪些应收、核销金额、剩余余额、反核销历史。
5. 客户侧账单:查看明细、收款与未结余额,并在线确认本人已出账账单;不做在线争议。
以下历史排除清单已被 2026-08-11 的五页范围取代。结算单应付现在属于订单与客户;其余未确认能力继续排除:
- 供应商在线确认和自动付款(应付结算单与人工付款属于订单与客户);
- 客户预充值、余额冻结和自动扣款;
- 发票申请、开票和税务接口;
- 多币种折算与汇兑损益;
- 利润表、利润率和总账;
- 银行流水自动认领;
- 复杂费用分摊和会计凭证。
### 6.4 全量阶段的范围门禁
| 范围 | 开工门禁 |
| 任务 | 唯一维护入口 |
|---|---|
| 客户账户 | 已确认只做派生财务往来总览;禁止充值、冻结/解冻、退款、自动扣款和可写余额 |
| 客户应收应付 | 明确客户作为付款方还是收款方;没有真实业务场景的方向不建菜单和数据 |
| 供应商应付 | 必须有供应商主数据、成本来源凭证、审批人、付款方式和付款责任主体 |
| 收付款核销 | 明确人工登记与银行流水的边界;收款、付款、核销、反核销分开授权 |
| 发票 | 明确开票主体、税率、含税/未税、红冲/作废和外部开票平台;未确认前只保留接口扩展位 |
| 费用分析/利润 | 先冻结汇率、收入成本确认日、成本分摊和跨币种折算;报表必须能钻取到原始费用和结算单 |
| 客户资金账户、充值、授信、冻结与业务扣费 | [资金账户规则](财务对账结算P1闭环.md#客户资金账户);请求/响应查[资金账户 OpenAPI](openapi/finance-wallet-v1.yaml) |
| 业务费用来源、入池、直接已付与重复扣费隔离 | [费用入池规则](财务费用入池P0闭环.md),按来源字段、覆盖矩阵或幂等条款读取 |
| 客户账单、AR/AP、收付款、作废与金额并发 | [对账结算规则](财务对账结算P1闭环.md),只读相应出单、生命周期或不变量段落 |
| 客户/平台财务页面口径与导出 | [页面与数据口径](财务对账结算P1闭环.md#5-页面与数据口径) |
| Firstleg 与 Finance 的费用事件和服务边界 | [跨服务契约](Firstleg-Finance跨服务契约.md);通信方式以[统一通信契约](../统一认证与服务通信契约.md)为准 |
| 海外费用接入阶段 0 专项 | [阶段 0 技术契约](海外仓费用统一接入阶段0技术契约.md),仅该改造任务触发;不能据此推定当前实现已切换 |
## 七、已确认的产品结论(历史问题关闭结果)
## 专题与历史(按需)
下表原为产品问题清单,现按本轮确认结果保留。不得再把这些条目解释为待产品确认;实现仍受真实费用来源链路和专项技术门禁约束。
| 编号 | 待确认问题 | 建议默认值 |
|---|---|---|
| F1 | 订单与客户领导验收范围 | 固定为客户账户、客户应收应付、客户对账单、结算单应收、结算单应付;费用分析和利润表不做 |
| F2 | 账单生成维度 | 客户 + 币种 + 账期;不同币种不合并 |
| F3 | 哪些费用可以进入账单 | `APPROVED + PUBLISHED + AVAILABLE + CNY + amount>0` 且未出账;无人工结算开关 |
| F4 | 当前已发布头程费用是否自动进入待对账池 | 是,但仍由财务选择并生成账单 |
| F5 | 账单生成后上游费用能否直接调整 | 不能;应走补差单/冲销单并保留原账单 |
| F6 | 客户是否需要在线确认和提出争议 | 客户在线确认本人已出账对账单;确认状态独立于主状态,在线争议暂不做 |
| F7 | 是否需要内部复核 | 建议制单与复核权限分离,首期允许同人需业务明确 |
| F8 | 收付款是人工登记还是接银行流水 | F1/F2 先人工登记,F3 再接银行流水;必须保存到账日/付款日、方式、凭证号和附件 |
| F9 | 一笔收款能否核销多张应收,一张应收能否被多次收款 | 两者都允许,禁止累计核销超过余额 |
| F10 | 反核销和作废权限 | 独立高风险权限,必须填写原因并完整审计 |
| F11 | 到期日如何计算 | 由客户结算条款或账单确认日 + 账期天数计算 |
| F12 | 历史已发布费用如何迁移 | 仅迁移满足入池条件且尚未形成线下已结算事实的费用 |
## 八、建议状态模型
状态应按对象拆分,避免把费用、账单和资金状态混为一个字段。
### 8.1 费用明细
```text
DRAFT -> PENDING -> APPROVED -> PUBLISHED -> BILLED
-> REJECTED
PUBLISHED/BILLED -> ADJUSTED(通过补差或冲销,不覆盖原记录)
```
### 8.2 对账单
```text
DRAFT -> REVIEWED -> SENT -> CONFIRMED -> CLOSED
-> DISPUTED -> DRAFT/VOIDED
```
### 8.3 应收与核销
```text
应收:OPEN -> PARTIALLY_SETTLED -> SETTLED
-> OVERDUE
收款:DRAFT -> CONFIRMED -> PARTIALLY_ALLOCATED -> FULLY_ALLOCATED
核销:ACTIVE -> REVERSED
```
“收款已登记”与“应收已核销”必须分开。只有核销完成后,对应应收余额才减少;反核销恢复余额,但不得删除原记录。
## 九、关键数据与约束建议
首期至少需要以下独立对象,不能只在现有费用明细表上继续追加字段:
| 对象 | 核心职责 |
|---|---|
| 财务费用来源 | 引用不可变的业务费用版本,保存来源服务、来源单据、来源版本和来源幂等键 |
| 对账单 | 客户、币种、账期、状态、版本、金额合计和确认信息 |
| 对账单明细 | 关联费用来源并保存出账时快照;一条有效费用只能进入一张有效账单 |
| 应收单 | 应收金额、已核销金额、余额、到期日和状态 |
| 收款单 | 到账金额、币种、日期、方式、凭证号、附件和登记/确认人 |
| 核销记录 | 收款单、应收单、核销金额、操作人、时间和幂等键 |
| 反核销记录 | 原核销记录、原因、审批/操作人和恢复金额 |
| 财务操作日志 | 对账、确认、争议、收款、核销、反核销和作废的完整历史 |
必须具备的约束:
- 金额统一使用定点小数,币种使用 ISO 三位码;不同币种首期禁止合并和直接核销。
- 长整型 ID 按字符串跨前端传输。
- 所有写操作带幂等键和乐观锁版本。
- 同一费用来源版本只能进入一个未作废的账单明细。
- 核销累计金额不得超过收款可用余额或应收未结余额。
- 出账、核销后禁止物理删除;调整、作废和反核销必须保留原记录。
- 客户隔离由服务端登录上下文保证;平台员工操作目标客户时必须显式选择客户并校验权限。
- 客户不可看到供应商成本、内部备注、审核意见和平台凭证附件。
## 十、原型需要修正或裁剪的地方
后续做正式页面时,不建议直接照搬原型:
1. “客户应收应付”把客户应收和供应商应付混在同一概念下,应按交易对手和职责拆分。
2. “客户对账单”和“结算单应收”字段大量重复,首期应定义清晰的一对一或一对多关系,避免两套金额状态并存。
3. 原型中的“支付历史”在应收场景应统一使用“收款/核销记录”,避免收付款术语混用。
4. 原型允许直接登记部分收付款,但没有展示确认、撤销、反核销、超额校验和并发冲突。
5. 客户账户充值与应收结算不是同一个闭环,不能用余额字段代替收款和核销台账。
6. 利润表直接展示结果,但没有收入确认、成本来源、外币折算和分摊规则,当前结果不可审计。
7. 所有正式业务表格的“操作”列应放在第一列;原型部分旧页面需要按仓库统一规则调整。
## 十一、完成标准
只有同时满足以下条件,才可以称为“客户应收财务闭环”:
- 每笔应收都能追溯到已审核、已发布且不可变的费用来源版本;
- 能生成、复核、发送并确认客户对账单;
- 能形成有到期日和余额的应收;
- 支持一次或多次收款及多对多核销;
- 支持部分核销、全额结清、反核销和作废;
- 所有金额变化均可审计,重复提交和并发操作不会多记账;
- Admin 与 Client 对同一账单、应收余额和状态的展示一致;
- 越权、跨客户、不同币种、超额核销、已出账费用调整等异常路径有服务端硬校验;
- 使用真实 API 完成至少一条“费用 -> 对账 -> 应收 -> 收款 -> 核销 -> 结清”回归,并验证反核销恢复余额。
## 十二、下一步文档工作
在写代码前建议依次完成:
1. 由产品/业务填写 F1-F12,冻结首期范围。
2. 形成《客户应收闭环需求确认表》,明确页面、角色、状态和异常处理。
3. 使用《财务管理产品确认表》完成 S1-S8、F0-F4 的产品确认。
4. 服务边界、领域模型、跨服务契约及 F0/F1 基础实现已经形成;当前按《F1人工财务契约审查与门禁》完成专项修复和测试放行,不再等待产品填写 XLSX 或重复讨论是否拆服务。
5. 形成《客户应收接口与权限契约》,包括错误码、幂等、数据范围和审计事件。
6. 形成《历史费用迁移与上线方案》,避免已有线下结算数据被重复出账。
- [领域模型与数据字典](财务领域模型与数据字典.md)、[服务边界设计](财务服务边界设计.md)用于字段或模型专题核对,不覆盖上表当前业务规则。
- [五页操作与验收用例](财务核心P0操作契约与验收用例.md)、[实现证据矩阵](财务核心P0实现证据矩阵.md)只在对应验收或历史追溯时读取。
- 原入口的旧范围、开发门禁、历史部署结果与规划已冻结到[历史盘点](归档/财务闭环盘点历史记录.md),不继续同步改写。
- 当前部署状态与未关闭验收项只查[部署主契约](../测试环境单机部署与配置契约.md)及[认证通信主契约](../统一认证与服务通信契约.md);旧报告不证明当前快照已验证。
@@ -240,6 +240,7 @@ paths:
get:
operationId: listFinanceFeeSources
summary: 分页查询客户应收应付费用来源
description: 默认按 sourceSystem + sourceType + sourceFeeId 只展示最新版本,计数与分页口径一致;同名不同来源费用不合并。显式筛选 SUPERSEDED 时查询被替代的历史版本。
x-permission: platform:finance:customer-arap:list
parameters:
- name: page
@@ -256,7 +257,7 @@ paths:
schema: {$ref: '#/components/schemas/FeeDirection'}
- name: status
in: query
schema: {type: string, enum: [AVAILABLE, LOCKED, BILLED, VOIDED, SUPERSEDED]}
schema: {type: string, enum: [AVAILABLE, LOCKED, BILLED, SETTLED, PAYABLE_BILLED, PARTIALLY_PAID, PAID, VOIDED, SUPERSEDED]}
- name: reviewStatus
in: query
schema: {$ref: '#/components/schemas/ReviewStatus'}
@@ -1023,8 +1024,11 @@ components:
amount: {$ref: '#/components/schemas/Money'}
currency: {type: string, enum: [CNY]}
reviewStatus: {$ref: '#/components/schemas/ReviewStatus'}
sourceStatus: {type: string, enum: [AVAILABLE, LOCKED, BILLED, VOIDED, SUPERSEDED]}
statementGenerated: {type: boolean}
sourceStatus:
type: string
enum: [AVAILABLE, LOCKED, BILLED, SETTLED, PAYABLE_BILLED, PARTIALLY_PAID, PAID, VOIDED, SUPERSEDED]
description: 当前来源展示状态。应付按同客户有效结算单显示 PAYABLE_BILLED(已生成应付单)、PARTIALLY_PAID(部分付款)、PAID(已付款);直接已付也显示 PAID,作废单不占用来源。
statementGenerated: {type: boolean, description: 是否关联同客户的有效客户对账单;应付来源不使用该字段判断付款进度}
FeeSourceDetail:
allOf:
- $ref: '#/components/schemas/FeeSource'
@@ -1034,6 +1038,7 @@ components:
sourceHash: {type: string}
operationLogs:
type: array
description: 同客户、同收付方向、同来源费用身份的历次同步及财务审计;保留版本和调整前后金额,系统同步不冒充原业务操作者。历史版本仅返回当时及此前版本记录。
items: {$ref: '#/components/schemas/OperationLog'}
FeePoolItemRead:
type: object
@@ -1091,7 +1096,7 @@ components:
required: [statementId, statementNo, customerId, customerName, periodStart, periodEnd, creditDays, currency, lineCount, sourceCount, sourceAmount, adjustmentAmount, totalReceivable, receivedAmount, outstandingAmount, settled, status, version, customerConfirmationStatus, createdBy, createdAt, updatedBy, updatedAt]
properties:
statementId: {$ref: '#/components/schemas/Id'}
statementNo: {type: string, pattern: '^REC-\d{6}-\d{4}$', example: REC-260818-0001}
statementNo: {type: string, pattern: '^REC[0-9]{12}$', example: REC202608180001}
customerId: {$ref: '#/components/schemas/Id'}
customerName: {type: string}
periodStart: {type: string, format: date}
@@ -1226,7 +1231,7 @@ components:
properties:
id: {$ref: '#/components/schemas/Id'}
customerId: {$ref: '#/components/schemas/Id'}
settlementNo: {type: string, pattern: '^AR-\d{6}-\d{4}$', example: AR-260818-0001}
settlementNo: {type: string, pattern: '^AR[0-9]{12}$', example: AR202608180001}
billDate: {type: string, format: date}
dueDate: {type: string, format: date}
receivableAmount: {$ref: '#/components/schemas/Money'}
@@ -1241,7 +1246,7 @@ components:
properties:
id: {$ref: '#/components/schemas/Id'}
customerId: {$ref: '#/components/schemas/Id'}
settlementNo: {type: string, pattern: '^AP-\d{6}-\d{4}$', example: AP-260818-0001}
settlementNo: {type: string, pattern: '^AP[0-9]{12}$', example: AP202608180001}
costType: {type: string, enum: [SINGLE_ORDER, CONTAINER_SHARED]}
orderId: {$ref: '#/components/schemas/Id'}
inboundId: {$ref: '#/components/schemas/Id'}
@@ -1313,7 +1318,7 @@ components:
required: [settlementId, settlementNo, direction, currency, totalAmount, paidAmount, outstandingAmount, generatedDate, dueDate, paymentStatus, status, version]
properties:
settlementId: {$ref: '#/components/schemas/Id'}
settlementNo: {type: string, pattern: '^(AR|AP)-\d{6}-\d{4}$', example: AR-260818-0001}
settlementNo: {type: string, pattern: '^(AR|AP)-\d{6}-\d{4}$', example: AR202608180001}
direction: {$ref: '#/components/schemas/FeeDirection'}
customerId: {$ref: '#/components/schemas/Id'}
customerName: {type: string}
@@ -1384,6 +1389,7 @@ components:
required: [transactionId, transactionType, transactionDate, amount, method, createdBy, createdAt]
properties:
transactionId: {$ref: '#/components/schemas/Id'}
transactionNo: {type: string, nullable: true, pattern: '^PAY[0-9]{12}$', description: 结算付款落库业务号;收款记录未生成PAY号时为空,不使用内部ID或凭证参考号替代}
transactionType: {type: string, enum: [RECEIPT, PAYMENT]}
transactionDate: {type: string, format: date}
amount: {$ref: '#/components/schemas/PositiveMoney'}
@@ -0,0 +1,392 @@
# 财务闭环盘点历史记录
> 角色:冻结历史。由原财务 README 迁入,用于追溯当时范围、方案和验收证据;下文“当前”“唯一”等称谓均属于记录当时,不是现行开发指令。当前规则从[财务入口](../README.md)进入,资金账户正文已归入[对账结算规则](../财务对账结算P1闭环.md#客户资金账户)。不为追随当前实现继续更新本记录。
当前费用入池 P0 的唯一收口说明见:[财务费用入池 P0 闭环](../财务费用入池P0闭环.md)。费用入池后的对账、应收应付结算、收付款、冻结、隔离和导出闭环见:[财务对账结算 P1 闭环](../财务对账结算P1闭环.md)。两份闭环文档覆盖当前已确认范围;与本文历史范围冲突时,以闭环文档和更新日期更晚的产品确认优先。
## 当前确认:一件代发客户资金账户(2026-09-05)
当前对话已将资金账户作为一件代发的前置节点重新纳入范围,并覆盖本文后续历史章节中“钱包不做”的旧结论。首批固定为 CNY。平台设置授信时必须同时设置晚于今天的到期日,最远日期不设上限;到期日当天仍有效。有效期内消费先扣实际可用资金,不足部分累计为已用授信;次日授信失效时,已用授信自动并入实际余额并允许形成负数,负数实际余额会阻止客户提交新订单。充值先归还已用授信或负余额,剩余金额才形成正数资金。
客户选择固定或自定义金额,查看后台配置的平台统一静态收款码,付款后上传 JPG/PNG 截图形成待审核申请。平台在客户账户明细顶部审核或驳回,也可手工充值、扣款和设置客户限时授信;每次变动写不可变账户流水。新账户默认授信为 `0.00`,只有平台明确设置额度与有效期后才启用。Finance 还提供仅服务令牌可访问、按业务类型和业务单号幂等的冻结、结算和释放接口,供一件代发等模块接入。审核、账户更新、流水、冻结记录和幂等结果在 Finance 单事务内完成,文件内容仍归 File 服务。接口契约见 [客户资金账户 OpenAPI](../openapi/finance-wallet-v1.yaml)。
> 盘点日期:2026-09-09
> 当前状态:费用入池 P0 与对账结算 P1 已完成测试环境部署及真实 HTTP 全链验收;最终报告为 `baiyue-firstleg/reports/admin-test-env-acceptance-20260909103401.json`,1518/1518 通过。领导页面人工截图仍按独立验收规则执行
> 盘点范围:入库计费现状、平台后台财务原型、Admin/Client/Firstleg 当前实现
> 结论口径:本文区分“代码已实现”“原型展示”和“建议范围”;原型功能不自动成为开发范围。
## 费用来源扩展确认(2026-09-02)
- Finance 继续保持独立服务和独立数据库;业务服务只生产费用事实,不能直接写财务单据或余额。
- Firstleg 入库费用继续按客户和入仓码进入 Finance;柜级公共费用必须先按柜内真实客户与业务订单原子分摊,再逐客户进入应收应付。入仓码是可选引用:存在时必须校验真实归属,不存在时保留订单/业务单号,禁止伪造入仓码。
- Lastleg 的海外入仓、海外采购、本土卡车、本土散板和海外仓服务费使用统一版本化来源。审核通过、调整和作废同事务写海外 Outbox,通过 Event Bridge 向国内 Finance 投递完整不可变快照;Finance 不跨海外数据库回查。
- Finance 以 `sourceSystem + sourceType + sourceFeeId + sourceVersion` 唯一入池;重复事件幂等,同版本不同哈希拒绝,已进入有效账单或结算单的来源禁止替换/作废。
- 海外仓服务费只强制客户、海外仓和业务编号;入仓记录/入仓码按真实业务选填,月租、仓租等无入仓码费用仍可入池。
当前实现包含柜级分摊 API/Admin 录入、海外费用来源 API、跨区事件、Finance 通用消费入口及数据库脚本,并已完成测试环境数据库和真实 HTTP 验收。页面人工截图仍按独立验收规则执行。
## 历史测试环境部署状态(2026-08-12,已解除)
当时的 Finance 全链路测试环境实跑报告为 `baiyue-firstleg/reports/finance-full-acceptance-20260812.json`:共 430 项,411 项通过,19 项失败,当时结论为 `DEPLOYMENT_BLOCKED`。这些阻断已在后续版本解除,当前结论以 P0/P1 闭环文档和 2026-09-09 最终报告为准。
当前主要部署阻断:
- Gateway 健康,但 `/finance-service/v3/api-docs` 返回 HTTP 503,测试环境 Finance 服务不可用。
- `baiyue_finance` 当前仅部署旧 F0 schema;`fin_bill`、`fin_fee_source` 等存量表无业务数据,G3/G4 新表未部署。因此对账、应收应付、凭证及结算写链无法完成真实 HTTP 验收。
- 本地脚本和模块契约测试通过只证明验收程序契约成立,不代表测试环境 Finance 服务或数据库迁移已经部署成功。
报告生成后,产品进一步确认现有 ACTIVE 往来单位均可作为应付结算候选,不要求 `SUPPLIER` 类型。曾为诊断临时新增的 `FIN-FULL-SUP-20260812` 及其类型映射已从测试库完整删除;全量脚本和 Admin 页面均已改为复用现有 ACTIVE 往来单位。原报告中的“未找到 ACTIVE SUPPLIER”仅反映当时脚本的旧过滤条件,不能倒推为测试环境已通过。当前仍需完成墨家测量实重同步修复、Finance 服务部署和 G3/G4 schema 迁移,再重跑同一三模块链路形成新报告。
产品/业务逐项确认请使用:[财务管理产品确认表](../财务管理产品确认表.md)。
产品回传后的差异和剩余门禁见:[财务管理产品确认版差异与剩余待确认](../财务管理产品确认版差异与剩余待确认.md)。
技术边界已确认:[财务服务边界设计](../财务服务边界设计.md)。Finance 采用独立服务和独立数据库,Firstleg 仅提供业务费用来源。
开发前总控门禁与 F0/F1 任务清单:[财务开工门禁与F0-F1任务清单](../财务开工门禁与F0-F1任务清单.md)。
订单与客户领导验收唯一范围入口:[财务核心五页产品与接口验收契约](../财务核心五页产品与接口验收契约.md)。
订单与客户 11 个 P0 操作、状态机与验收用例:[财务核心 P0 操作契约与验收用例](../财务核心P0操作契约与验收用例.md)。
订单与客户实现与 Admin 接入证据(不反向修改目标契约):[财务核心 P0 实现证据矩阵](../财务核心P0实现证据矩阵.md)。
文档优先级:五页验收契约和本轮产品确认 > 五页目标 OpenAPI > 既有人工 F1 契约/门禁 > 领域模型、历史全量规划和迁移文档。旧文档用于追溯,不得据此把钱包、充值、发票、费用分析或利润表重新纳入订单与客户。
旧文档降级规则:
| 文档/章节 | 当前用途 | 订单与客户实施约束 |
|---|---|---|
| 本文第六节起的“历史全量规划” | 保存早期盘点和演进背景 | 与五页契约冲突时全部失效,不作为菜单、路由、字段或接口依据 |
| `财务领域模型与跨服务契约.md` | 历史合并稿 | 已被数据字典和跨服务契约替代 |
| `财务服务边界设计.md`、`财务领域模型与数据字典.md` | 服务边界和长期模型参考 | 其中钱包、充值、发票、费用分析、利润模型不属于订单与客户 |
| `财务历史迁移与上线验收方案.md`、`财务F0实施任务拆分.md` | 历史迁移、底座任务追溯 | 不得覆盖五页范围和当前实现状态 |
详细设计材料:
- [海外仓费用统一接入财务评审方案](../海外仓费用统一接入财务评审方案.md)
- [海外仓费用统一接入阶段0技术契约](../海外仓费用统一接入阶段0技术契约.md)
- [财务业务操作流程图](../财务全链路流程图.md)
- [财务业务全流程总览图(PNG)](../财务业务全流程总览图.png)
- [财务来源接入现状](../财务来源接入现状.md)
- [财务领域模型与数据字典](../财务领域模型与数据字典.md)
- [Firstleg-Finance跨服务契约](../Firstleg-Finance跨服务契约.md)
- [F1 人工账单、收款、成本接口契约](../F1人工账单收款成本接口契约.md)
- [F1 人工财务契约审查与门禁](../F1人工财务契约审查与门禁.md)
- [财务核心五页产品与接口验收契约](../财务核心五页产品与接口验收契约.md)
- [财务核心五页 OpenAPI](../openapi/finance-core-five-pages-v1.yaml)
- [财务核心 P0 操作契约与验收用例](../财务核心P0操作契约与验收用例.md)
- [财务核心 P0 实现证据矩阵](../财务核心P0实现证据矩阵.md)
- [财务历史迁移与上线验收方案](../财务历史迁移与上线验收方案.md)
- [财务F0实施任务拆分](../财务F0实施任务拆分.md)
历史合并稿:[财务领域模型与跨服务契约](../财务领域模型与跨服务契约.md) 已由“领域模型与数据字典”和“Firstleg-Finance 跨服务契约”两份文档替代,不作为后续实施依据。
## 一、结论
当前首期采用人工简化方案:平台财务登记收付款并上传凭证;客户可查询并确认本人已出账对账单。首期不做银行自动对账、自动核销任务、复杂审批、客户钱包、发票、供应商在线结算、汇率、月结或总账。
当前已经实现业务计费闭环,并已落地 Finance 独立服务/数据库、人工账单/收款/成本基础接口、平台与客户权限种子、Admin 财务页面和 Client 只读账单页面。当前不是“整体未开发”,而是已进入专项修复和契约收敛阶段。
已具备的基础链路:
```text
测量/称重
-> 测量审核
-> 计费规则匹配
-> 费用试算与快照
-> 发布对客费用
-> 客户查看并确认已出账对账单
-> 完成入库
```
当前 F1 已具备的实现链路:
```text
平台财务创建草稿账单
-> 出账冻结
-> 人工登记收款
-> 一笔收款分配多张账单
-> 部分收款/收清状态更新
-> 客户只读查询
```
此前基础链路已完成 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 页:客户账户、客户应收应付、客户对账单、结算单应收、结算单应付。费用分析、利润表、发票和钱包不做,也不保留菜单、路由或假按钮。客户账户改为账单、收款和应收应付来源派生的财务往来总览,不做充值/预收。
## 二、事实来源与边界
本次按以下资料核对:
1. 入库测量与计费需求文档明确入库测量与计费只做头程计费,不自动形成应收、应付、对账单、收付款、核销、发票、利润或总账。
2. 平台后台原型提供财务管理全量参考,但其中数据和交互主要由单页 HTML 内的静态数据及前端脚本驱动。
3. 当前代码用于证明“已经实现什么”,不反向扩大产品范围。
主要依据:
- `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/`
- `apps/admin-web/src/prototype/modules/finance/`
- `apps/client-web/src/modules/first-leg/`
- `apps/client-web/src/modules/finance/`
- `baiyue-firstleg/firstleg/`
## 三、当前已经具备什么
### 3.1 可作为财务上游的业务数据
| 能力 | 当前状态 | 可复用价值 | 不能代表什么 |
|---|---|---|---|
| 实测重量、体积、计费量 | 已实现 | 作为费用计算依据和业务快照 | 不是财务凭证 |
| 客户计费规则、船司价格 | 已实现 | 产生确定的对客头程价格 | 船司价格不等于供应商应付 |
| 费用试算、确认、发布 | 已实现 | 形成版本化对客费用快照 | 不等于应收单或账单 |
| 费用调整 | 已实现 | 已发布费用调整生成新版本并留原因 | 尚未定义已出账或已核销后的调整方式 |
| 客户侧费用与账单查看 | 已实现 | 客户能看到入库及已发布费用结果,并在线确认本人已出账且待确认的对账单 | 客户不能修改金额、在线提出争议或登记收款/核销 |
| 费用项目主数据 | 已实现 | 支持费用编码、分类、国内/国际、提货/仓库应收应付属性 | 费用项目属性不自动生成财务记录 |
| 入库费用明细 | 后端已实现 | 支持人工新增、编辑、删除、审核、自动发布的入库运费明细 | 尚无跨入库单财务台账和结算生命周期 |
| 权限与审计基础 | 部分具备 | 费用明细查看、编辑、删除、审核已有权限和业务审计 | 财务制单、复核、收款、核销、反核销权限尚未定义 |
### 3.2 当前费用明细的真实边界
Firstleg 已有 `fl_inbound_fee_detail`,包含:
- 入库单、费用项目、方向、业务发生日、币种、单价、金额;
- 重量、体积、计费量等业务快照;
- 审核状态、审核人、驳回原因;
- 发布状态、发布时间;审核通过后自动发布并成为结算候选;
- 自动计费来源的费用单号和版本。
但当前仍存在以下断点:
- 自动发布链路只生成 `RECEIVABLE` 对客运费。
- 人工 `PAYABLE` 明细使用 Warehouse `supplierId/supplierName` 快照;费用项目 `supplierCategory` 可空,空表示任意启用供应商,非空严格匹配。
- 人工明细采用编辑、提交、审核、调整、作废闭环;审核通过后自动发布,不再存在“是否结算”开关。
- 已发布应收明细只能按单个入库单查询,未形成按客户、币种、账期聚合的财务台账。
- 没有冻结、出账、核销后的费用变更规则,无法保证历史账单金额稳定。
## 四、原型中有什么
平台后台原型的财务菜单包含以下能力:
| 原型模块 | 原型展示的主要能力 | 当前代码状态 | 是否能直接纳入首期 |
|---|---|---|---|
| 客户账户 | 原型为余额、冻结、可用余额和充值流水 | 未实现 | 订单与客户保留汇总/详情/流水结构,但改为未收、待出账、本期已收等派生指标;删除充值/钱包能力 |
| 客户应收应付 | 费用明细、编辑审核、按截止时间或勾选生成账单 | 已接入真实费用来源和编辑审核闭环 | 作为应收应付费用池 |
| 客户对账单 | 账期、汇率、应收、已收、结清、明细和支付历史 | 未实现 | 可作为应收闭环核心,但汇率和开票先暂缓 |
| 结算单应收 | 应收、已收、余额、到期日、审批、部分收款 | 未实现 | 可合并进账单/应收单,避免首期重复建模 |
| 结算单应付 | 供应商应付、已付、余额、审批、部分付款、利润 | 未实现;上游成本来源不完整 | 订单与客户纳入,但删除利润字段/按钮;必须先补真实供应商应付来源和付款凭证链路 |
| 费用分析 | 内外部费用对比、趋势和明细 | 未实现 | 订单与客户明确不做,不进菜单/路由 |
| 利润表 | 按客户、货柜、单票、月份统计收入、成本、利润率 | 未实现 | 订单与客户明确不做,不进菜单/路由 |
原型还出现了发票抬头、开票日期、汇率、支付方式、收付款凭证号等字段。它们只说明未来可能需要,不代表当前产品已经确认税务、外币折算、资金或发票边界。
当前 Admin 已有正式财务路由、账单详情/草稿修改/出账/调整/作废、人工收款和成本页面及真实凭证上传调用,Client 已有正式只读账单页面。后端已改为根据 `containerId` 调 Firstleg 体积快照并完成成本凭证校验,但 Admin 仍强制人工填写并提交柜内订单体积,且未接客户账期和 revision,因此前端创建闭环尚未与最终契约对齐。
## 五、当前修复中缺口
| 序号 | 断点 | 直接影响 |
|---|---|---|
| 1 | 五页读接口、平台/客户固定 DTO 和追踪响应已实现 | Finance 35/35 BUILD SUCCESS;本轮使用现有 Surefire 报告核对,不重新执行 Maven |
| 2 | 收款和成本均已校验凭证,但 `fileClient == null` 时仍 fail-open | File 客户端缺失时可能绕过凭证校验 |
| 3 | 后端已使用 Firstleg 真实体积快照,Admin 仍要求人工填写并提交体积 | 页面与最终请求契约不一致,产生无效输入和误导 |
| 4 | 幂等已有 SHA-256 与同参重放,但未覆盖完整规范化请求,缺 PROCESSING 恢复测试 | 仍可能误判同参或无法恢复中间态 |
| 5 | 客户账单已过滤可见状态,收款列表仍暴露平台字段且未按可见账单过滤 | 客户只读边界仍不完整 |
| 6 | Admin 已接账单动作,但未接客户账期、revision,整柜仍人工填体积 | 平台财务页面仍非完整闭环 |
| 7 | 业务错误码仍以通用错误和中文消息为主 | 前端无法稳定区分版本、幂等、凭证和归属错误 |
| 8 | revision 后端查询已落地,Admin 尚未接展示 | 调整历史仍不能在产品页面核对 |
## 六、全量财务规划与交付顺序
### 6.1 历史全量规划(不作为订单与客户范围)
以下内容只保留为历史分析。若与《财务核心五页产品与接口验收契约》冲突,以五页契约为准。
| 目标域 | 业务结果 | 主要来源 | 不能提前假定的口径 |
|---|---|---|---|
| 客户账户 | 客户财务往来派生汇总、详情和流水 | 账单、收款和应收应付来源 | 订单与客户不建设钱包、充值、预收或自动扣款 |
| 客户应收 | 客户欠款、到期、逾期、结清 | 已发布对客费用、补差/冲销 | 收入确认节点和账期规则 |
| 客户应付 | 客户代垫或返还类应付款(如确有业务) | 业务费用或人工单据 | 产品是否真的存在“平台向客户付款”的场景 |
| 客户对账单 | 期间内费用汇总、明细、平台出账和客户确认 | 应收/应付费用池 | 一张账单是否允许混合方向、混合币种 |
| 结算单应收 | 可审批、可收款、可核销的应收结算单 | 已确认客户账单 | 与客户对账单是一对一还是一对多 |
| 结算单应付 | 供应商成本、付款、余额和结清 | 供应商费用、运力/仓储/报关成本 | 成本确认、供应商账期、审批和付款方式 |
| 收付款与核销 | 到账/付款凭证,部分结算、反核销 | 银行流水或人工登记 | 是否首期接银行流水,是否允许一笔多单核销 |
| 发票 | 开票申请、开具、红冲、作废和关联 | 已确认应收/收款 | 税率、含税/未税、开票主体、外部平台 |
| 费用分析 | 历史规划,订单与客户不做 | 应收应付台账 | 不进入订单与客户菜单、路由和验收 |
| 利润 | 客户/单票/柜次/月度收入、成本、利润率 | 应收收入 + 应付成本 + 分摊 | 汇率、成本分摊、收入成本确认时间 |
### 6.2 分阶段交付顺序
全量目标建议拆成五个可验收阶段:
| 阶段 | 交付范围 | 关键闭环 | 前置依赖 |
|---|---|---|---|
| F0 财务底座 | 独立 Finance 服务/数据库、财务主体、客户/供应商往来单位、币种、费用科目、期间、权限、审计、幂等、金额精度 | 所有后续对象使用同一基础口径 | 服务边界已技术确认;产品确认主体、币种、权限和编码 |
| F1 应收与客户对账 | 应收费用池、平台出账、客户确认、结算单应收、收款登记、核销、反核销 | 费用 → 账单 → 客户确认 → 应收 → 收款 → 结清 | 当前已发布对客费用来源 |
| F2 应付与供应商结算 | 成本费用池、供应商账单、结算单应付、付款登记、付款核销、应付调整 | 成本 → 供应商账单 → 应付 → 付款 → 结清 | 供应商主数据和真实成本来源 |
| F3 客户账户与发票 | 订单与客户只做派生客户账户总览;发票暂缓 | 账户只读聚合,不维护资金余额 | 发票不属于订单与客户 |
| F4 分析与利润 | 订单与客户不做 | 不建设菜单、路由或假入口 | 后续重新立项 |
阶段之间可以并行做页面原型和契约设计,但生产数据链路必须按 F0 → F1/F2 → F3 → F4 验收。F4 不能用原型静态数字先行替代真实台账。
### 6.3 F1 最小财务闭环
F1 先处理当前已经有可靠来源的对客头程费用:
```text
已审核并发布的应收费用明细
-> 进入待对账费用池
-> 按客户 + 币种 + 账期生成对账单
-> 内部复核
-> 客户在线确认(异议仍线下反馈)
-> 平台财务出账后形成应收
-> 登记实际收款
-> 将收款核销到应收
-> 全额核销后结清
-> 错误时按权限反核销并留审计
```
F1 建议页面:
1. 应收费用池:查询、编辑、提交、审核、调整、作废;审核通过自动进入结算候选。
2. 客户对账单:生成、明细、内部复核、发送、关闭;平台财务可重开或调整。
3. 应收与收款:应收余额、到期日、收款登记、附件/凭证号、部分核销。
4. 核销记录:每笔收款对应哪些应收、核销金额、剩余余额、反核销历史。
5. 客户侧账单:查看明细、收款与未结余额,并在线确认本人已出账账单;不做在线争议。
以下历史排除清单已被 2026-08-11 的五页范围取代。结算单应付现在属于订单与客户;其余未确认能力继续排除:
- 供应商在线确认和自动付款(应付结算单与人工付款属于订单与客户);
- 客户预充值、余额冻结和自动扣款;
- 发票申请、开票和税务接口;
- 多币种折算与汇兑损益;
- 利润表、利润率和总账;
- 银行流水自动认领;
- 复杂费用分摊和会计凭证。
### 6.4 全量阶段的范围门禁
| 范围 | 开工门禁 |
|---|---|
| 客户账户 | 已确认只做派生财务往来总览;禁止充值、冻结/解冻、退款、自动扣款和可写余额 |
| 客户应收应付 | 明确客户作为付款方还是收款方;没有真实业务场景的方向不建菜单和数据 |
| 供应商应付 | 必须有供应商主数据、成本来源凭证、审批人、付款方式和付款责任主体 |
| 收付款核销 | 明确人工登记与银行流水的边界;收款、付款、核销、反核销分开授权 |
| 发票 | 明确开票主体、税率、含税/未税、红冲/作废和外部开票平台;未确认前只保留接口扩展位 |
| 费用分析/利润 | 先冻结汇率、收入成本确认日、成本分摊和跨币种折算;报表必须能钻取到原始费用和结算单 |
## 七、已确认的产品结论(历史问题关闭结果)
下表原为产品问题清单,现按本轮确认结果保留。不得再把这些条目解释为待产品确认;实现仍受真实费用来源链路和专项技术门禁约束。
| 编号 | 待确认问题 | 建议默认值 |
|---|---|---|
| F1 | 订单与客户领导验收范围 | 固定为客户账户、客户应收应付、客户对账单、结算单应收、结算单应付;费用分析和利润表不做 |
| F2 | 账单生成维度 | 客户 + 币种 + 账期;不同币种不合并 |
| F3 | 哪些费用可以进入账单 | `APPROVED + PUBLISHED + AVAILABLE + CNY + amount>0` 且未出账;无人工结算开关 |
| F4 | 当前已发布头程费用是否自动进入待对账池 | 是,但仍由财务选择并生成账单 |
| F5 | 账单生成后上游费用能否直接调整 | 不能;应走补差单/冲销单并保留原账单 |
| F6 | 客户是否需要在线确认和提出争议 | 客户在线确认本人已出账对账单;确认状态独立于主状态,在线争议暂不做 |
| F7 | 是否需要内部复核 | 建议制单与复核权限分离,首期允许同人需业务明确 |
| F8 | 收付款是人工登记还是接银行流水 | F1/F2 先人工登记,F3 再接银行流水;必须保存到账日/付款日、方式、凭证号和附件 |
| F9 | 一笔收款能否核销多张应收,一张应收能否被多次收款 | 两者都允许,禁止累计核销超过余额 |
| F10 | 反核销和作废权限 | 独立高风险权限,必须填写原因并完整审计 |
| F11 | 到期日如何计算 | 由客户结算条款或账单确认日 + 账期天数计算 |
| F12 | 历史已发布费用如何迁移 | 仅迁移满足入池条件且尚未形成线下已结算事实的费用 |
## 八、建议状态模型
状态应按对象拆分,避免把费用、账单和资金状态混为一个字段。
### 8.1 费用明细
```text
DRAFT -> PENDING -> APPROVED -> PUBLISHED -> BILLED
-> REJECTED
PUBLISHED/BILLED -> ADJUSTED(通过补差或冲销,不覆盖原记录)
```
### 8.2 对账单
```text
DRAFT -> REVIEWED -> SENT -> CONFIRMED -> CLOSED
-> DISPUTED -> DRAFT/VOIDED
```
### 8.3 应收与核销
```text
应收:OPEN -> PARTIALLY_SETTLED -> SETTLED
-> OVERDUE
收款:DRAFT -> CONFIRMED -> PARTIALLY_ALLOCATED -> FULLY_ALLOCATED
核销:ACTIVE -> REVERSED
```
“收款已登记”与“应收已核销”必须分开。只有核销完成后,对应应收余额才减少;反核销恢复余额,但不得删除原记录。
## 九、关键数据与约束建议
首期至少需要以下独立对象,不能只在现有费用明细表上继续追加字段:
| 对象 | 核心职责 |
|---|---|
| 财务费用来源 | 引用不可变的业务费用版本,保存来源服务、来源单据、来源版本和来源幂等键 |
| 对账单 | 客户、币种、账期、状态、版本、金额合计和确认信息 |
| 对账单明细 | 关联费用来源并保存出账时快照;一条有效费用只能进入一张有效账单 |
| 应收单 | 应收金额、已核销金额、余额、到期日和状态 |
| 收款单 | 到账金额、币种、日期、方式、凭证号、附件和登记/确认人 |
| 核销记录 | 收款单、应收单、核销金额、操作人、时间和幂等键 |
| 反核销记录 | 原核销记录、原因、审批/操作人和恢复金额 |
| 财务操作日志 | 对账、确认、争议、收款、核销、反核销和作废的完整历史 |
必须具备的约束:
- 金额统一使用定点小数,币种使用 ISO 三位码;不同币种首期禁止合并和直接核销。
- 长整型 ID 按字符串跨前端传输。
- 所有写操作带幂等键和乐观锁版本。
- 同一费用来源版本只能进入一个未作废的账单明细。
- 核销累计金额不得超过收款可用余额或应收未结余额。
- 出账、核销后禁止物理删除;调整、作废和反核销必须保留原记录。
- 客户隔离由服务端登录上下文保证;平台员工操作目标客户时必须显式选择客户并校验权限。
- 客户不可看到供应商成本、内部备注、审核意见和平台凭证附件。
## 十、原型需要修正或裁剪的地方
后续做正式页面时,不建议直接照搬原型:
1. “客户应收应付”把客户应收和供应商应付混在同一概念下,应按交易对手和职责拆分。
2. “客户对账单”和“结算单应收”字段大量重复,首期应定义清晰的一对一或一对多关系,避免两套金额状态并存。
3. 原型中的“支付历史”在应收场景应统一使用“收款/核销记录”,避免收付款术语混用。
4. 原型允许直接登记部分收付款,但没有展示确认、撤销、反核销、超额校验和并发冲突。
5. 客户账户充值与应收结算不是同一个闭环,不能用余额字段代替收款和核销台账。
6. 利润表直接展示结果,但没有收入确认、成本来源、外币折算和分摊规则,当前结果不可审计。
7. 所有正式业务表格的“操作”列应放在第一列;原型部分旧页面需要按仓库统一规则调整。
## 十一、完成标准
只有同时满足以下条件,才可以称为“客户应收财务闭环”:
- 每笔应收都能追溯到已审核、已发布且不可变的费用来源版本;
- 能生成、复核、发送并确认客户对账单;
- 能形成有到期日和余额的应收;
- 支持一次或多次收款及多对多核销;
- 支持部分核销、全额结清、反核销和作废;
- 所有金额变化均可审计,重复提交和并发操作不会多记账;
- Admin 与 Client 对同一账单、应收余额和状态的展示一致;
- 越权、跨客户、不同币种、超额核销、已出账费用调整等异常路径有服务端硬校验;
- 使用真实 API 完成至少一条“费用 -> 对账 -> 应收 -> 收款 -> 核销 -> 结清”回归,并验证反核销恢复余额。
## 十二、下一步文档工作
在写代码前建议依次完成:
1. 由产品/业务填写 F1-F12,冻结首期范围。
2. 形成《客户应收闭环需求确认表》,明确页面、角色、状态和异常处理。
3. 使用《财务管理产品确认表》完成 S1-S8、F0-F4 的产品确认。
4. 服务边界、领域模型、跨服务契约及 F0/F1 基础实现已经形成;当前按《F1人工财务契约审查与门禁》完成专项修复和测试放行,不再等待产品填写 XLSX 或重复讨论是否拆服务。
5. 形成《客户应收接口与权限契约》,包括错误码、幂等、数据范围和审计事件。
6. 形成《历史费用迁移与上线方案》,避免已有线下结算数据被重复出账。
@@ -84,3 +84,11 @@ P1 没有发现 Finance 单据状态机或金额处理缺陷。发现并修正
- 自动费用造数只选择已配置内部编号且被 ACTIVE 价格簿覆盖的 FBA 仓;测试环境 `ABE3` 已通过正式仓库接口补齐内部编号。
这些修正只增强验收数据和证据,不绕过生产权限、状态机、幂等、服务边界或数据库约束。
## 客户资金账户
本节承接原财务 README 的已确认资金账户规则,覆盖历史“五页范围”中排除钱包或充值的旧结论;与对账单派生的往来账户汇总分别维护。
首批固定为 CNY。平台设置授信时必须同时设置晚于今天的到期日,最远日期不设上限;到期日当天仍有效。有效期内消费先扣实际可用资金,不足部分累计为已用授信;次日授信失效时,已用授信自动并入实际余额并允许形成负数,负数实际余额会阻止客户提交新订单。充值先归还已用授信或负余额,剩余金额才形成正数资金。
客户选择固定或自定义金额,查看后台配置的平台统一静态收款码,付款后上传 JPG/PNG 截图形成待审核申请。平台在客户账户明细顶部审核或驳回,也可手工充值、扣款和设置客户限时授信;每次变动写不可变账户流水。新账户默认授信为 `0.00`,只有平台明确设置额度与有效期后才启用。Finance 还提供仅服务令牌可访问、按业务类型和业务单号幂等的冻结、结算和释放接口,供一件代发等模块接入。审核、账户更新、流水、冻结记录和幂等结果在 Finance 单事务内完成,文件内容仍归 File 服务。接口契约见 [客户资金账户 OpenAPI](openapi/finance-wallet-v1.yaml)。
@@ -61,6 +61,8 @@ USD 费用必须命中业务日期所在月份的有效 USD/CNY 汇率。入池
| 调整 | 新版本替换旧版本;Finance 仍按来源费用号和版本幂等消费 |
| 作废 | 仅未冻结来源允许作废;已结算或已出单来源必须走财务调整流程 |
客户应收应付默认按 `sourceSystem + sourceType + sourceFeeId` 展示同一费用的最新版本,计数、分页和金额均采用该口径;明确筛选“已被调整替代”时才单独查询旧版本。同名费用项目但来源费用号不同的记录不得合并。业务调整重新审核发布后更新该费用的当前展示,旧快照保留用于账单追溯,不能覆盖已出单或已结清事实。费用详情的操作记录串联同客户、同收付方向的历次版本及财务审计,记录版本、调整前后金额;同步记录明确显示系统同步时间,不冒充原业务操作者或审批时间。历史版本详情只展示当时及此前记录。
资金账户事件和费用来源事件可能先后到达。Finance 会在任一事件到达时尝试按客户、业务类型、业务单号和金额互相绑定,保证同一业务不会既自动扣款又再次生成对账单。
## 6. P0 验收标准