This commit is contained in:
2026-10-20 15:48:19 +08:00
parent 5a198f87a4
commit d97aa8d086
18 changed files with 251 additions and 4 deletions
+2 -2
View File
@@ -19,13 +19,13 @@
## 本机重型检查与多对话限流
- 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、时间和退出码,不保存命令参数、凭据或测试输出;名称不得包含秘密。摘要不是业务/部署事实来源。无需凭据,不访问网络、数据库或部署环境;被包装命令原有的网络/写入能力及授权要求不变。
- 本机每槽独立保存占用者与最近结果:首槽 `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`,不得以“离线合同”为由绕过。
Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 KiB

After

Width:  |  Height:  |  Size: 235 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 KiB

After

Width:  |  Height:  |  Size: 217 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 240 KiB

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 KiB

After

Width:  |  Height:  |  Size: 245 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 242 KiB

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 KiB

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 175 KiB

After

Width:  |  Height:  |  Size: 172 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 432 KiB

After

Width:  |  Height:  |  Size: 497 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 KiB

After

Width:  |  Height:  |  Size: 141 KiB

+10
View File
@@ -1,5 +1,15 @@
# Admin 货柜管理样式核对记录
## 货柜列表搜索区截图反馈(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接续。
+7 -1
View File
@@ -26,9 +26,15 @@ Jenkins `admin-web-test #653` SUCCESS,精确检出最终提交,耗时70.979
## 排车整车作业 TEST 匹配切换(2026-10-20,完整流程待验收)
14:34 PDA 排车可拣资格修复已完成 TEST H5 更新:为避免夹带独立废弃业务,根通过既有 uni --config 入口和原 Vite 配置,内存加载 `b76b7e4d8f46a2804b425ddaf51f718596fcc6cf` 的 fulfillment.js、outbound.vue,并严格匹配旧已发布 manifest 的两个字节 SHA;工作区源文件及现有本地服务未改动。唯一变化为冻结 dispatch.vue(SHA `b40e40f189c1b5b48ac34b36d4eb4af8986b07bd313fe04fbf69d1b9edf2184a`)。串行受限构建及85文件资源检查通过,前端独立对话只读确认修复已编入、来源身份规范化保留、实际废弃数量新功能未编入。早期配置探针的换行/模块加载失败均在构建配置阶段停止,无远端写入;最终候选通过后才发布。
新85文件聚合 SHA `b88d40a4d2c421bd5daa8d6a2b894a61e577590cb538f1c630192f885ebda881`,88文件静态发布包 SHA `c66947c1470f6071905bb34ed91f222e5953428c9cf537ef2047284574355664`。经原受控 TEST agent 静态发布流程,仅更新海外 H5 容器;新镜像 ID `sha256:f675d049a000c2bb32fe909f54ada9ebd76716ba13d5e388cc5447c174204c60`、容器 `e61a31df39cce34d190f989a53952f5b299e2e497a5f90b76ebd9c26dee39c51` healthy,首页 HTTP SHA 与本地一致,85个容器文件逐 SHA 通过,另一次只读 status 确认远端 receipt=DONE。证据为根 `.codex-temp/dispatch-pda-stock-h5-manifest-20261020.json`、build-selection、deploy-plan、deploy-state及对应冻结工具;私有新facts以本轮只读实例核对为准,未沿用旧部署前ID。未发布 APK/WGT,未触碰国内 PDA、后台服务、SQL或其它业务数据;当前工作区完整 App 资源编译另已通过,不能将其当成该受控 H5 候选或真机安装验收。人工页面及实体扫码仍未完成,本轮自动接口与静态发布范围已经收口。
原发布 HTTP 返回连接在远端 DONE 后仍未返回,根没有重发发布。后续独立只读 status 再核对容器、镜像、包 SHA、产物 SHA、healthy 与85文件回执一致,持久化 `.codex-temp/dispatch-pda-stock-deploy-reconciliation-20261020.json` 后,仅停止精确父进程及命令行确认过的本次本地 HTTP 客户端,统一检查入口退出 -1 并释放名额。原 deploy-state 的 DEPLOY_INTENT 保留,不伪写为原请求正常退出;发布成功依据是远端持久 DONE 与独立复核报告,而不是该本地命令退出码。
14:19 原人工排车单 HTTP 接续完成:用户明确要求继续 HTTP 后,根仅接续 `DS-E5A85B6D67214315A08135E122213D61` 的 LOADING/APPROVED v5,未重建、重审或创建下一空排车。报告 `baiyue-firstleg/reports/fleet-cross-DISPATCH20261020MANUALHTTP1/report.json`:178 次请求、673/673 断言通过,完成双客户逐来源拣货、明确装车完成、平台整车安排与合成测试费用、PDA 实际发车、分别上传并保存合成 TEST 签收证据、派送完成事件汇总;原单最终 DELIVERED v11,两箱已拣已发。车次 `TR-9VA7RGXK6K1K17LDZC75O45MC` 最终 COMPLETED v7,车辆和司机分别释放并核对可用,结案前后库存一致,自有会话全部退出。验证包含原请求键重放、异操作者原键拒绝和客户库存隔离;下一趟资源占用保护本次明确未验证。费用、容量与签收附件含明确标识的合成测试资料,不代表现场称量、真实签字、实体扫码或硬件验收;此接续覆盖原单审核后的 HTTP 链,不能替代完整人工页面验收。
本次并行查出海外 PDA 页面错误地要求仓位 allocatedPackages 大于 pickedPackages;真实接口返回 available/allocated/picked=1/0/0 且服务端 PICK 允许,页面因此无法选择。已在 dispatch.vue 改为可用库存与当前来源未拣量取较小值,保持服务端 Gate、来源身份、版本和未知结果恢复约束。48 项定向测试与 H5 构建通过;新产物尚未发布,App 资源构建和产物核对正在进行,不能沿用旧 H5 发布指纹证明本次修复已上线。
本次并行查出海外 PDA 页面错误地要求仓位 allocatedPackages 大于 pickedPackages;真实接口返回 available/allocated/picked=1/0/0 且服务端 PICK 允许,页面因此无法选择。已在 dispatch.vue 改为可用库存与当前来源未拣量取较小值,保持服务端 Gate、来源身份、版本和未知结果恢复约束。48 项定向测试、H5 构建、App 资源构建与 H5 资源核对均通过(85 文件)。新产物尚未发布:旧127输入逐SHA比对发现除 dispatch.vue 外,fulfillment.js 与 outbound.vue 也有此前已提交的差异,其中含独立废弃出库业务改动,因此发布准备在输入检查即停止,未生成新发布意图或修改远端。新H5产物只证明当前工作区编译通过,不能当成已隔离的排车发布候选;旧运行容器和镜像经只读查询未变。前端对话继续只读复核精确范围,不能沿用旧 H5 发布指纹证明本次修复已上线。
12:12 BOL节点已修复并发布TEST:用户最终选择保持现有一次PDF下载,内部同目的地同预约号合并、不同号分别成BOL、无号照打且预约栏留空。根复用fleet实现真实分配读取/模型/窄Repository及持久化测试,capacity实现打印分组并独立逐SHA审查读取代码,前端仅只读核对,无UI/API路径变更。最终读取13项(含同item同实托双订单3+2分预约及BOOKING映射)和未变打印9项均通过,网关合同5/5;先前读取12+打印9的21项也通过,不把追加测试当生产修复。Print全模块本轮66项为65通过、1个需print.capacity.tests开关的2000页容量专项跳过;两份已删除类的陈旧报告明确排除,原始回执保留。Print空ISA仍复用原文本规范化、300字符及控制字符校验;其他空字段占位符不变。
+1
View File
@@ -84,6 +84,7 @@ HTTP入口为`/api/platform/v1/last-leg/appointment-planning`,包括`GET /carg
| 仓库主数据与海外资源 | 仓库 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):车次余位发布、销售意向、确认占位、本土订单关联及统一我仓上车 | 复用上述车辆管理及本土业务入口;不开放客户端运力市场 |
| 国内出仓后船节点 | 对已确认离开国内仓库的订舱/柜次定时查询船节点,保存最新节点、异常和查询历史,贯通目的港提柜至还柜事实 | 标准语义见[船节点标准化契约](船节点标准化契约.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/` |
@@ -0,0 +1,160 @@
# 自有业务后端接口设计
2026-10-20 总控已冻结v1,进入独占包实现;尚未执行Maven或环境验收。业务唯一依据为[首版开发契约](自有业务首版开发契约.md),已纳入其第11/12条:计划发车日期筛选、四项统计同一完整筛选,以及独立居中的运营登记弹窗。所有编号以 `dispatchNo` 为用户入口。
用户最新定位已收敛:本页是**原生排车列表装车完成后的自有车辆运营视图**。不创建第二个任务/车次主单,不保存第二份排车货物、预约、单据或审核/装车/发车/签收状态机;外配后续也消费同一排车事实。
### 原排车查询能否直接复用
- `DispatchViews.Query` 当前没有车辆ownership、计划发车日期范围和目的仓关键词过滤;`ListRow` 没有完整目的地/预约和附加运营信息。因此不能靠浏览器取一页后筛OWNED、求统计或逐行GET补齐,列表需要本包新增**只读数据库投影**。
- 原主单详情可以在服务端直接复用 `DispatchAggregateService.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. 精确 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。建议诊断子码`OWNED_SOURCE_UNAVAILABLE`、`OWNED_RECORD_VERSION_CONFLICT`、`OWNED_COMMAND_MISMATCH`、`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→DispatchAggregate;QueryMapper/Repository→DispatchItem;Projection→DispatchItem/DispatchContracts;QueryService→DispatchAggregateService/DispatchContracts/DispatchTypes。根hook的DispatchAggregateService→OwnedBusinessOwnershipCapture只依赖窄端口,不回调本页查询。后端不得借此访问或修改派送/库存/Finance持久化。
- OpenAPI新增文档数、Gateway自动发现Controller及Mapper注册合同均由根统一执行,不在本对话重复门禁;实际通过尚待根。
- 新附加历史从可信会话保存operatorName到snapshot;原排车历史只有operator_id、缺少姓名权威时operatorName=null,不把内部ID伪装成姓名。
@@ -0,0 +1,62 @@
# 自有业务首版开发契约
2026-10-20 用户明确先做自有业务,并授权复用既有后端、前端两个独立对话,与当前总控三方并行开发。本契约是本页唯一共同业务边界;实现、检查、部署及真实验收分别记录。排车 HTTP 扩展继续由原排车后端对话独占,不与本页并发操作其样本。
## 已确认规则
用户最新明确本质:自有业务、外配业务就是现有排车列表装车后数据按自有车辆/外配车辆区分的运营视图,自有车辆管理细,外配车辆相对简化。本批仅实现自有视图。两页共用原排车主单及真实履约事实,不另建第二套任务、车次主单、货物、审核、装车、发车或签收状态机;新增数据仅限关联该排车单的附加运营记录。
1. 自有指我们自己的车辆,不按自有货源过滤;承运货物仍保留各客户真实归属。外配业务本批不实现。
2. 从排车装车完成后展示,覆盖装车后、派送中、派送完成;不把审核通过或拣货核平本身当作装车完成。
3. 一张排车单就是一趟车,列表一张排车单一行;多个目的仓、预约号在行内展开,不按客户或目的地重复整车统计。
4. 后台登记一次整车总金额,单价由系统按整车总金额除以实际托数计算。用明确币种记录,不将该运营金额自动当作客户应收、车队应付、Finance入账或利润;不重复收费。金额未登记与明确零金额区分,实际托数为零时不除零。
5. 实际托数按真实物理托盘去重,同一实托承载两张换标单仍计一托;不得用逻辑明细数、客户数或标准占用托位冒充实际托数。
6. 实际到达时间、实际里程和油耗由后台补录;装车及油耗照片按原型上传。多个目的地的实到时间应与对应目的地匹配,不用签收或派送完成时间伪造到达,不自动推进排车或派送状态。
7. 列表统计、筛选、字段、查看明细和上传照片沿用户新版原型及模块原型核对矩阵;正式外观沿当前Admin高密度规范,操作列在第一列。
8. 详情为独立页面,三个页签为任务与车辆信息、路线货物与凭证、操作记录;排车详情仍保持其已确认四页签,旧车次附加功能不自动迁入本页。
9. 上传照片沿760px居中弹框,装车完成、油耗图片两个页签,JPG/PNG逐框处理;上传图片不等于确认装车。真实持久化、权限和版本明确核对后才记录已上传或已保存。
10. 不写原型的固定日期、默认18.6油耗、预设GPS/ETA、驾驶证状态、占位图片或示例操作历史。缺失显示未登记或—,不借内部ID回退业务编号。
11. 用户补充确认:按计划发车日期筛选,统计随同一筛选变化,原型“今日排车数”改为“排车数”。日期范围不硬编码示例日期,统计不以当前页行数代替全部筛选结果。
12. 用户补充确认:新增“登记运营信息”居中弹框,填写整车金额、逐目的地实到时间、实际里程和油耗;照片继续沿原型独立上传弹框。具体尺寸按当前Admin表单密度与字段数量处理,不改为抽屉。
## 原型与实现差距
直接依据为用户提供 `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、绑定请求键及载荷,重试只绑定;未知上传保留原命令,不自动重新上传或虚称恢复成功。关闭弹框不另造保存动作。
- 车辆归属按原排车装车完成时点冻结,作为该排车的归属证据附加行,不构成第二套主单;根只在loadingComplete原事务接一个窄捕获点,新包提供者读取真实车辆ownership/版本。按原资源模式识别临时外配,不把MASTER当OWNED。旧已装车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可分别为空,不混淆两个版本序列;原排车事件不伪造运营快照或照片,运营事件保留其真实快照。
+9 -1
View File
@@ -1,6 +1,14 @@
# 测试环境独立任务协作登记
2026-10-20 14:19 当前排车 HTTP 接续已完成,原人工单 DELIVERED、当前车次完成且车司机分别释放,178 请求/673 断言全部通过,自有会话退出。原“人工样本不自动推进”的保留要求已由用户后续明确继续 HTTP 指令覆盖,本次只接续原单,不重建、不重审、不新建下一空排车。三个既有对话本轮已交付:排车后端一次性 driver、派送费用只读预审、前端 PDA 两文件可拣资格修复;根完成 HTTP 与 48 项直接回归、H5 构建,正在核对 App 资源与待更新 H5 产物。前端对话仅只读复核产物/旧发布工具,不再写源文件或执行环境操作。运行事实与未验范围以[部署主契约](测试环境单机部署与配置契约.md)当前记录为准,旧节点记录仅表示对应时点,不能覆盖本次接续结果。
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)顶部;人工单不自动推进,日历新增预约不接管。