action-url.ts
6.58 KB
-
fix(宿主跳转): 瑞泰患者跳瑞尔门户 —— 打开时把 arrail 换成 rytime · eb5d8b9f
jvs-dw 底下两个品牌各有一套门户:瑞尔 arrail.5i5ya.com / 瑞泰 rytime.5i5ya.com, 两边**只差域名这一段**,路径参数完全一样。而 host.actionUrls 是 host 级配置、只有一套 (现在配的是瑞尔那套)。于是瑞泰患者点「查看档案 / 病历 / 新建预约 / 回访」, 会被带到瑞尔门户 —— 那边查不到这个人。 ⇒ 打开的那一刻按**患者所属品牌**把域名换掉(lib/host-brand-url.ts)。 【为什么按患者判、不按登录人判】 登录人的品牌前端**拿不到**:/auth/session 下发的 sourceUnits 对诊所级用户是哨兵 `__pac_deny_no_brand__`(那条路按 clinicIds 过滤,不走品牌维)。2026-08-23 拿生产 三家诊所的 token 实测,全是这个值 —— 判不出品牌。而患者的 sourceUnit 是实打实的品牌名。 语义上也是患者对:这些链接要打开的就是**那个患者**在宿主里的页面。 【改了什么】 - 后端 plan-aggregate:患者 + **关系人**都下发 sourceUnit (关系人用他自己的,
⛔ 不拿本人的顶替 —— 亲属跨品牌时会跳错门户) - 新增 lib/host-brand-url.ts:applyBrandHost(url, sourceUnit) - resolveActionUrl / openHostAction 加可选的品牌参数;plan-detail-app 六个调用点全传上 【两个容易漏的点】 -🔴 **HOST_ORIGIN 也必须换** —— 它是 postMessage 的 targetOrigin。PAC 嵌在 rytime 里 而 targetOrigin 写着 arrail,浏览器**静默丢弃**这条消息:按钮点了没反应,控制台连个错都没有。 -⚠ ️ **只换域名,不碰路径和查询串**:`?from=arrail` 是宿主自己的业务参数,替换它属于越界。 URL 解不出来(相对路径 / 哨兵值 'postMessage')原样返回 —— 这条补丁不许把能用的链接变没。 【纪律】⛔ 别把它做成通用的"多品牌路由"。它成立的前提是"两个门户只差一个域名片段"。 真要支持多品牌,正解是 actionUrls 按品牌分组配置(host 管理页加一层),那时删掉这个文件。 【验证】 - 新增 host-brand-url.test.ts 14 条:替换 / 幂等 / 只换域名不碰路径查询串 / 哨兵值与 相对路径原样 / 未知品牌与空值不动 / **每个调用点都带上了品牌参数**(源码断言, 防的是"新加调用点时忘了传" —— 参数可选,漏了 tsc 不报) - 本地实测 /plans/:id/full:瑞泰患者 sourceUnit='瑞泰'、瑞尔患者 ='瑞尔' - 两端 tsc + 后端 1443 用例 + 前端 46 用例全绿 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>luoqi committed