5.2 KiB
附件替换与查询续办 CP11
2026-09-16,承接CP10旧件匹配。本地实现及相关167项检查通过,完整检查结果见证据。默认运行仍为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表示以及外部部署/配置/原生验收。