This commit is contained in:
2026-10-20 10:35:59 +08:00
parent 2f8d59c871
commit c33ed689d7
6 changed files with 438 additions and 16 deletions
@@ -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/索引/无变化门禁,没有环境写入或部署。