Files
Wyndham-RSVN-0918/docs/project/integrations/ohip-attachment-replacement-cp11.md
T
2026-09-17 10:13:16 +08:00

46 lines
5.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 附件替换与查询续办 CP11
2026-09-16,承接[CP10旧件匹配](ohip-artifact-match-cp10.md)。本地实现及相关167项检查通过,完整检查结果见[证据](../../../.project-docs/50-evidence/topics/2026-09-16-ohip-attachment-replacement-cp11.md)。默认运行仍为Pending,未迁移真实数据库或操作酒店。
## 已实现路径
`OhipAttachmentReplacementAdapter`显式构造,消费原人工确认、CP7固定父对象、CP8观测及CP10旧件证明。仅支持UPDATE当前邮件一个Excel、各父对象一个已证明且名称为Tour Code的旧件;可覆盖一个GROUP或全部已绑定FIT父对象。多个Excel、多旧件、无关同名文件、缺证据或名称关系未证实时,任何上传前停止。本轮不按文件顺序、数量或相似名称分配新旧文件。这是现平台契约的技术限制,不改变用户希望上传全部预订Excel的需求。
平台`attachment_writes.go`要求覆盖前恰好一个同名附件且实际ID/hash匹配;上传必须携带已核实linkType,名称/Description为Tour Code。真实linkType由环境验证后配置,不能猜常量;本地测试使用明确合成值。
## 固定保存与隔离
V44新增`workflow_hotel_attachment_replacement`,以原execution_id为主键,只有首次插入及读取,没有覆盖/删除业务接口。Plan保存固定绑定、实际地址摘要、linkType、冻结Excel引用/字节摘要、每父旧件ID/hash/历史证据键及完整旧清单元数据摘要。没有文件内容、URL、酒店原文或Secret。
首次保存前要求原确认尚无任何写调用,时间不早于本轮进度;同一数据库短事务锁定完整酒店/task/card/版本/scope/revision/token/租约及snapshot/progress,对照完整历史并验证每个旧件的实际上传ID/来源hash。`JdbcHotelBookingCallRepository.historyInTransaction`仅供同库计划仓储在现有事务复用;公开history仍自己开启短事务,不在锁内做HTTP。
计划保存后立即重新查询全部父对象旧清单和字节。后续prepare只读既有计划,不能重新选旧件;每次HTTP和写入前读取计划并核对当前执行者。目标、地址、原件内容、租约或计划丢失/变化时停止。V44需在运行版本升级时迁移,本轮没有执行实际迁移。
## 三种上传结果与独立清理
发送复用CP5固定键与CP9受控原件,回执先落盘;恢复按同一固定键验证完整实际请求摘要和来源,实际新附件ID只能来自这次持久回执。
| 酒店结果 | 后续动作 |
| --- | --- |
| 沿用旧ID,内容已更新 | 实际GET比对新内容及元数据,不调用删除 |
| 返回新ID,旧ID已消失 | 实际GET核对新件和完整清单,不调用删除 |
| 返回新ID,旧ID仍在 | 全部父对象的新件均实际核对后,按精确旧ID/hash和替代ID/hash独立删除 |
每次独立删除前重新检查全部父对象的新件和旧件;平台自身再做旧/新字节核对。删除完成后重新查询全部清单与新内容。无关文件的清单元数据须保持;文件GET元数据须与本轮清单一致,防止查询间变更被忽略。已删除旧ID重新出现时停止,不自动再删。
覆盖上传本身可能原位改旧件,因此多父对象处理并非原子操作。第一父对象成功、第二父对象失败时保留第一笔事实;不能声称失败前全部旧件仍原样存在。
## 中断、未知与结果
`reconcile`只读。上传已存实际回执但后续查询中断时,恢复先查同一实际ID,不重复上传。明确NOT_SENT只能在更高attempt重试;DISPATCHED/UNKNOWN/ACCEPTED/REJECTED/CONFLICT保持未解决,不换键重发、不按同名/hash反推成功。未知删除即使当前清单已无旧件也不冒认本次删除成功,等待可信恢复证据;当前平台没有纯读取调用回执的恢复接口。
Result分开保存`observations`和`recordedWrites`:前者只是本轮成功获得的实时查询子集,后者是已读取并验证归属的持久技术成功回执。查询失败可能令前者为空,但后者仍可说明已存上传事实;它不能被当成最新酒店值。回执读取也失败时,列表不保证完整,空列表绝不表示“没有发生写入”。最终员工回显必须保留这种区分。
VERIFIED只表示当前附件环节核对通过,`businessComplete()`恒false;不设置整个办理成功,不生成输入回显,不更新前端。NEW父对象绑定、四流程完整执行、最终业务查询/回显和真实MySQL/Oracle UAT仍须接续。
## 验证及后续
新增47项实际H2交付SQL+localhost HTTP测试,相关167项通过。覆盖三种返回、多FIT、保存回执后中断/查询失败、部分成功、未知上传/删除、NOT_SENT、并发、旧/新/无关文件变化、历史变化、租约/计划丢失及来源/环境隔离。
没有新增公共接口、权限或运行注册,Domain/ADR/前后端契约保持;安全边界和架构仅记录新增内部模块。平台候选仍`56bbe86`,本轮未改平台、推送或部署。后续先补NEW父对象关联及完整执行器,继续处理GROUP完整范围、FIT分配/TA、多个同名Excel表示以及外部部署/配置/原生验收。