This commit is contained in:
2026-10-20 16:45:06 +08:00
parent d97aa8d086
commit 986450024d
4 changed files with 74 additions and 8 deletions
+8
View File
@@ -8,6 +8,14 @@
已有代码检查结果及历史截图结论保留在后文;本轮视觉结论以新收到的逐项截图为准。当前发布版本与运行证据见[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)
| 页面 | 操作 | 截图依据及承载方式 | 当前布局 | 本次结论 |
@@ -22,6 +22,8 @@
14. 2026-10-20 用户在人工BOL验收中最终确认:保持现有一次下载/预览PDF的方式,PDF内按“目的地+预约号”分别生成BOL;同仓同预约号的货物合并,不同预约号分成各自BOL,不按客户拆打印分组。用户前述“不同PDF”在后续“就和现在一样”的答复中已明确沿用现有承载,总控已说明当前实际是一个PDF包含多张BOL;不新增选择弹框、压缩包或下载协议。没有预约号也能打印,预约号栏留空,同目的地且均无号的货物合成一份。各BOL明细超页时可有自身续页,按原分页容量处理;打印分组不修改各票货物、库存、派送和费用的真实客户归属。货物按真实预约分配及数量归集,不把同一明细全量重复复制到每个预约。
15. 2026-10-20 用户确认排车业务号为`PC`前缀、八位日期、四位日流水,例如`PC202610200001`。日期沿用平台业务时区`Asia/Shanghai`,每天从0001开始,全平台跨客户和仓库统一递增;首次建单分配,命令重放返回原号。流水在独立短事务中原子分配,避免持车辆/来源锁时延长全平台序列锁;取消或建单失败不复用已分配号,最大流水反映编号进度,准确单量以列表主单统计为准。四位当日用满后明确拒绝,不回绕重号。本条不表示DDL执行或环境发布完成。
## 二 原型依据与详情四块
原型为用户提供的新版 HTML,页面 `page-outbound-vehicle`、`page-outbound-vehicle-detail`,以及本轮最新排车详情截图。HTML 位于用户提供的本机原型路径,实施者沿本契约和目标模块矩阵定向读取,不扫描原型其他模块。截图最新确认优先于前一条“三块”的描述。
@@ -7,10 +7,10 @@
### 原排车查询能否直接复用
- `DispatchViews.Query` 当前没有车辆ownership、计划发车日期范围和目的仓关键词过滤;`ListRow` 没有完整目的地/预约和附加运营信息。因此不能靠浏览器取一页后筛OWNED、求统计或逐行GET补齐,列表需要本包新增**只读数据库投影**。
- 原主单详情可以在服务端直接复用 `DispatchAggregateService.detail(Actor, dispatchNo)` 的 `DispatchViews.Detail`,再组合本页附加信息;已核实其真实来源,不重写主单查询协议或状态推算。新详情响应建议保留一个明确的 `dispatch: DispatchViews.Detail` 字段;独立三页签由现有事实和附加信息映射展示,不改变排车四页签。
- 原主单详情在服务端通过公开窄端口读取 `dispatch.port.DispatchDetailReader.detail(Actor, dispatchNo)` 的 `DispatchViews.Detail`,再组合本页附加信息;已核实其真实来源,不重写主单查询协议或状态推算。新详情响应建议保留一个明确的 `dispatch: DispatchViews.Detail` 字段;独立三页签由现有事实和附加信息映射展示,不改变排车四页签。
- 新API是有自身list/edit/upload权限的投影视图与附加信息入口,**不是第二套排车API**;原排车查询/Controller/DTO/Mapper全部保持只读,不要求额外公开主流程写动作。
## 1. 已核实的事实与一个提供者缺口
## 1. 事实来源与装车归属捕获
| 事实 | 当前权威代码/数据 | 本页处理 |
| --- | --- | --- |
@@ -42,7 +42,7 @@
没有创建主单、改变运输状态、删除运输或费用发布接口;不公开内部 dispatchId/tripId 作为业务编号。
## 3. 精确 DTO 草案
## 3. 冻结v1 DTO
以下为已冻结v1结构,源码与OpenAPI按本节同步。所有 Long ID/版本通过现有Jackson策略无损输出;Money/数量测量用规范十进制字符串传输并在服务端BigDecimal校验,金额/单价不交前端重新计算。
@@ -111,9 +111,9 @@ type History = { eventSource: 'DISPATCH'|'OPERATIONS'; recordVersion: string | n
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。
6. 入口沿现有HTTP200+业务code约定;缺版本/无效金额/非法目的地为参数错误,身份与权限拒绝为403/A0403,缺主单为404/NOT_FOUND,附加版本变化/源事实变化/同键异载荷为409/A0409。普通参数/权限/缺失/版本错误沿项目A0400/A0403/A0404/A0409;上传命令另存OWNED_UPLOAD_UNKNOWN_RESULT诊断码,正文不向用户展示内部ID。
## 5. 新增结构建议(根维护实际DDL)
## 5. 新增结构(根维护实际DDL)
全部在Lastleg schema,MySQL8,内部BIGINT主键;表与列按根要求完整中文COMMENT。新包不写初始化或增量SQL文件。
@@ -140,7 +140,7 @@ type History = { eventSource: 'DISPATCH'|'OPERATIONS'; recordVersion: string | n
4. **IAM/导航/Gateway/SQL**:根集成3权限及角色授权、Admin路由菜单、Lastleg及统一基线、Gateway合同。路径已落在现有Lastleg域,但仍由根验证实际路由注册,不推定可达。
5. **照片保存语义已冻结**:逐槽上传后绑定立即保存;绑定失败保留原fileId和原绑定键恢复,不重复上传;绑定成功才显示已保存,关闭弹框不写数据。
## 8. 冻结点与预计耗时
## 8. 冻结与验证安排
v1所有业务项已冻结。仅根接共享hook、File、权限及4表基线;独占包继续实现,不等待其他无关任务。
@@ -155,6 +155,62 @@ v1所有业务项已冻结。仅根接共享hook、File、权限及4表基线;
### 根集成所需精确门禁触点
- `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持久化。
- `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:`f428a81049e4605fabf9687a8555400a9f1e3fe8a208c097ea3f1d514788aa6b`。
- 当前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|54b00c6d462c7e6e414a4268bd0cce8953834579fc2ae66452e09bba72fbde07
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项通过仅覆盖此前候选;本次新两文件输入未由本对话执行检查,待根直接受影响回归,不能扩展旧结果。
@@ -7,7 +7,7 @@
- 预约列表恢复用户截图 `codex-clipboard-840bcc07-6b54-4afa-9dc7-666d09ff04f2.png` 的左侧月/周日历、右侧当天安排。类型仅为到港、排车、还柜、计划到仓;每日期格最多三条预览,完整记录在右侧查看。保留当前范围搜索和未定日期入口。
- 月视图按当月所需显示4、5或6个完整周,仅在首尾周补齐相邻月份日期,不固定追加六周。2026年10月显示9月28日至11月1日,不显示11月2—8日整周;日历查询同步采用实际展示范围,周视图仍为7天。
- 到港优先实际到港,缺实际时采用预计到港。计划到仓默认在该到港当地日期上加两个自然日,跨月和夏令时仍按日期加两天,不补造具体时刻。人工保存的整柜时间优先,已有入库计划的冻结时间保持;尚未人工维护和未建计划的默认日期随到港事实变化。该默认值属于日历日期推算,不自动写入入库计划、不充当实际到仓。人工调整复用整柜预计到仓命令、原编辑权限、版本及幂等键;已有入库计划后仍不可改。
- 排车仅指海外仓送往 FBA/客户仓的真实车次,同车多客户只展示一次;已发车按实际起运仓当地日期,未发车按计划日期,取消车次不列入活动安排。港口提柜送海外仓不作为排车类型。
- 排车仅指海外仓送往 FBA/客户仓的真实整车排车主单,一张主单中的多客户只展示一次;已发车按实际起运仓当地日期,未发车按计划日期,取消主单不列入活动安排。日历返回真实排车单号并进入排车详情;独立旧车次不作为日历来源,也不得将内部车次号当排车号拼接路径。读取沿用排车列表权限;从详情可返回原日历日期与月/周视图。港口提柜送海外仓不作为排车类型。
- 还柜未完成按原业务截止日期提醒,完成后按实际还柜日期展示;日历不独立计算或改写还柜状态,登记进入原货柜业务。
- 用户随后明确恢复日历顶部“新增预约”:本次先支持FBA,普通客户仓不在本次范围。居中弹框选择已有货物,核对真实来源后复用原预约表单与保存接口;同起运仓、同目的FBA仓可跨客户合约,保留原写权限、版本/幂等、未知结果重试及未保存保护。货物查询栏支持可搜索、可清空的目的FBA仓下拉框;选项来自同权限范围的权威美国FBA目录,不从当前分页推算。提交查询后回到第一页,翻页沿用目的仓条件,重置恢复全部目的仓;跨页已选货物仍保留并执行同起运仓、同目的仓校验。保存成功显示真实预约编号及内容,不自动创建车次,不增加第五类日历或手工编造到港/还柜等事实。
- 入口移除全局工作待办、流程筛选、负责人分派、跟进、复核、责任交接,以及货物核实/分批/共约/共车编排入口;这些原业务在相应模块继续处理。仍由其他业务页面实际使用的精确来源或事项深链可以打开原业务表单,不恢复旧全局待办及筛选协议。