3.4 KiB
酒店调用来源证据 CP9
2026-09-16。本轮补齐发送时的来源登记,衔接CP5逐次调用及CP7冻结目标,不直接选择旧附件或旧Note。见CR及验证证据。
契约与调用
HotelBookingCallContracts.Intent增加可选HotelBookingCallSource,包含来源种类、酒店/环境、实际HTTP服务地址SHA256、GROUP/FIT、精确Tour Code、请求父ID、来源邮件编号、Excel引用或requestedNoteId、内容SHA256。实际新附件ID仍由原Receipt.relatedResourceId保存,不能拿请求Note ID当酒店已确认的Note ID。
附件调用使用OhipDurableWriteAdapter.sendAttachment(execution, itemKey, reference, request),构造时注入HotelBookingAttachmentSource。现有HotelBookingAttachmentLoader实现该端口,继续执行原确认、来源酒店、当前素材、Excel内容和原件访问审计。发送前重新读源文件,实际请求解码字节的SHA256必须一致;文件名和itemKey不用于推断来源。原通用send上传、未注入来源端口或未提供冻结引用均拒绝。
FIT创建/更新请求包含comments时,仅接受一个与冻结booking_note.text原文完全相同的Note;保留空格、换行和Unicode,不trim、转译或重建价格。NEW必须没有请求Note ID;UPDATE必须有请求Note ID,并属于已绑定父对象。这里的请求Note ID仍只是尝试证据,其旧归属必须由后续流程核验。其他无Note写操作继续允许source为空,不能视为已完成业务Note。
HotelBookingCallSourceValidator在调用侧和Repository锁定真实执行行后重复核对冻结确认、操作、阶段、酒店/环境、团号及目标。来源摘要不能替代授权;任意调用方自己构造DTO不等于已加载或已读回酒店内容。受信集成边界负责从实际请求和受控来源构造证据。
持久化与并发
V43只增加可空source_json列,无新表或可覆盖的“当前归属”记录。来源与请求摘要同事务INSERT;Intent完整相等才允许沿原键继续。旧JSON/原构造器可读,历史NULL表示未知,不能在重试时补来源。NOT_SENT更高attempt保留原来源;UNKNOWN/ACCEPTED/READBACK_AVAILABLE不重发;complete及迟到回执不改来源列。
实际目标地址单独留摘要,避免将未来重指的环境标签视为同一外部服务。原V41按酒店/Tour Code串行及CP7父对象冻结继续生效;没有增加重复并发锁。酒店人工修改、历史多次更新或迟到回执仍不能按updatedAt选“最新旧版”。
明确边界与下一步
来源元数据不含正文、字节、文件名、URL或Key;toString隐藏业务内容。无新Controller、员工权限码、前端字段、运行Adapter注册或服务重启。现有Spring原件加载器只是实现稳定接口,业务运行端口仍为Pending。
后续须把历史调用来源、真实返回子ID、CP8当前实际对象及精确内容摘要结合核验,才能建立旧件替换依据。同名、同文、最近回执不能自动认定归属;旧手工资料或缺证据记录保持未解决。NEW附件父对象还需从已验证创建回执关联;附件Name/Description、原生覆盖语义、Note实际ID归属、真实MySQL迁移及Oracle UAT均不由本轮测试证明。完整四流程仍未启用。