- 19 Jul, 2026 5 commits
-
-
Push 通道形态 A 在 FRIDAY 宿主的具体化:每个 source 的 JSON 字段清单(类型/必填/语义), 形状与已验证的存量摄入(10.7 万患者/36 万事实)完全一致 → 宿主按此推送与存量无缝衔接 (幂等去重/版本演进/重叠无害)。 - 通用约定:id 一律字符串(存量实测坑)/updated_gmt_at 必须 bump(幂等键一半)/ brand_id=源 tenant_id 改名/at-least-once - 患者关系 3 source(含 upsert 主体待 PAC 排期的如实标注)/预约/病历链 3(含 diag/treat 数组元素结构与 status∈{3,4} 推送范围)/结算链 4(status 拆分规则钉死)/计划咨询 3 - 待 FRIDAY 确认清单:两套关系码枚举/treat 语义/结算剩余 status Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
统一动机:jvs-dw(拉)存量跑写 cursor_after=run_start 供首次增量接力;FRIDAY(file) 此前不写 —— 差异根源不是流程分叉(finally 记账本就单点共用),而是 incremental.per_query 声明寄生在 sql_source 之下,file 源无处声明水位列。 - manifest.schema:IncrementalDeclSchema 抽名;sql_source.incremental 引用之(形状不动), manifest 顶层新增可选 incremental(file 源用;两处都写时 sql_source 内优先) - cold-import:入口一行 ?? 兜底(sql_source 优先短路)——之后读写 cursor 走完全同一段 finally,零新逻辑。file 装载路径不消费水位(loadAllTables 文件分支忽略 incremental 参数,全量装载幂等去重),水位纯记账,供 delta 导出 WHERE 模板 / push 回放起点 - friday manifest:顶层声明 12 张事件表 updated_gmt_at(字典表/contacts 无更新列不列) 验证:tsc 0 err;jvs-dw 零影响(manifest 未动 + ?? 短路 + dry-run Cursor 解析行为不变); friday 实跑 sync_logs 首次产出 cursor_after={12 表 × run_start ISO}。 心智模型统一:所有宿主存量跑即水位创世写入,差别只剩水位消费方。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
- patient_relation ← customer_referee_circle(10,169 行,双向成对存):患者-患者边进 patient_relations 独立表(同 jvs-dw 契约,电话簿语义不冒充关系边)。
⚠ ️ 关系码字典 DB 无表(疑代码硬编码)→ 统计推断解码(互逆对+年龄差+性别三重证据, 依据全在 yaml 注释):1=spouse(92%异性同龄)/8,7=friend/3=父母按对方性别拆 father,mother(transforms lookup 对方 sex 拼"码|性别"键)/2,10=child(儿×女)/ 17,16=grandparent,grandchild/4,9=sibling/其余 other。待 FRIDAY 官方枚举校正, 改 enum_mapping 重摄即覆盖。 - consultation ← customer_consult(64 行):意向 potential_treatment + FRIDAY 独有 未成交原因 unsettled_reason(强召回信号)passthrough 进 content。 - 落库:关系边 7,996 条(friend 3511/other 2322/spouse 639/child 630/mother 349/ father 266/sibling 229/祖孙 50),100% linked(对方均在册患者)→ guardian 链路 (儿童触达取家长真名真号)对 FRIDAY 直接激活;consultation 64;failed=0。 - 退费第三轨(status=3 负额 200 单)测试库恢复后补摄完成:refund_record 齐 880 (99 整单反向+581 行级+200 负额冲减),全程幂等。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
customer_contacts.relationship(13.3 万行,57.6% 填充,host sys_dict 编码 1-9)随 phone lookup 同源带出 → patient canonical passthrough → preferences.contactPhone {relationshipCode, isSelf: 码=='1'}。零 schema 迁移(preferences Json 收纳,同 dedicatedCs)。 编码语义用本地数据统计自证(年龄分桶):1=本人(成人 78.7%/儿童仅 51.4%——儿童过半 代接号,触达该打家长);3/2 儿童特异=父母类;8 老人特异=子女类;9 全人群恒定≈其他。 完整标签待测试库恢复读 sys_dict 后在 patient.yaml enum_mapping 补解码,管道零改动。 jvs-dw 不映射 phoneRelationshipCode → 行为分毫不变。 落库验证:107,227 患者 upsert,contactPhone 44,293(本人 40,059/代接 6,234... 按码分布 与统计一致);儿童样例(2015/2018 生)代接码 2/3 符合预期。 消费端(guardian/话术标注)待字典解码后一并接,避免半吊子 UX。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
结算源 arrail-settlement-server(全品牌覆盖,实测钉死语义): - payment ← patient_settlement status∈{1,3} 且金额≥0(67,355 单):amount=receivable_this (应收=业务价值,jvs-dw 同款 LTV 决策);主导支付通道 lookup settlement_modes(金额最大者); encounterExternalId=registration_id。 - 退费三轨(比 jvs-dw 双轨多一轨,宿主表达差异): ① status=4 整单反向(99 单,全负额)⭐ paymentExternalId=ref_settlement_id 精确挂回原单 (兑现 jvs-dw refund.yaml 预留的升级); ② spec is_refund=1 行级部分退费(581 行,全归属 status=3 头单,头单仍作 payment,LTV 自然对账); ③ status=3 负金额整单冲减(200 单,2ac96f6d 品牌不用 status=4 的表达)——被 amount_cents>=0 校验正确拦截后归轨,导出侧 WHERE 按金额正负切分(transforms filter 不支持数值比较)。 - 其余 status(0/2/5/6/7/8)语义未明先不收。不从 settlement 反推治疗(财务≠临床)。 已验证:payment 67,155 + refund 99+581 facts 落库 failed=0。 待收尾:轨③ 200 单补摄等 FRIDAY 测试库恢复(宕机中,已挂探针;导出为空防护拦住了脏摄入)。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed
-
- 18 Jul, 2026 11 commits
-
-
补 Phase 1 缺口(与 jvs-dw C.3 同语义):treat[] normalize 后 route_by_pattern ① 建议/推荐 → recommendation(共享 recommendation-code 字典;实测 153 行全部翻出召回码: 拔除 69 / RCT 49 / 冠 15 / 充填 9 / 种植 3 / SRP 1,仅 7 行长尾落空) ② 流程/复查/行政词 → treatment_review(category=review 哨兵;chain S4"已复查"信号) ③ 其余 → actual。拆线(50 行)按 jvs-dw 2026-06-11 一线判例排除出 review 词表 → actual→本地 enum 拆线→surgical(判例与 route 语境耦合,留宿主本地不入共享)。 external_id 沿用原始 value(与已摄入数据幂等键连续):重摄 failed=0,老 fact 全量 unchanged;之前被 keyword 误收进 actual 的"牙周复查"类 6 行经版本流 supersede 自动 纠正为 review,无残留。终态新增 recommendation_record 153 + review 56。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
FRIDAY 病历链落地(直连勘查 2026-07-18 定案,零新算子,纯配置+导出脚本): - export.sh:host 等价单表 dump(MySQL 7 表 CSV + Mongo med_emr_info status∈{3,4} 平铺 JSON;id 字段字符串化对齐 CSV 契约;数组字段双形态:原生数组给 split, JSON 字符串给 emr 自由文本位)。凭据走 env 不入 git。 - manifest:EMR 链 transforms —— diag[] 拆行→std_diag lookup(linkCode→std_code, K 开头截 K 码,非 K/未命中自然落 code=null 自由文本)→normalize/coalesce; treat[] 拆行(=本次治疗 actual,病历无计划字段已用全字段枚举证实); med_check lookup 类型字典;customer_treat_plan 行 join 头表(无诊所行显式 filter 丢弃)。 - assemblers ×5:emr/diagnosis/treatment_actual/treatment_planned/image, 全部 dict_includes 共享字典(diagnosis-kcode / treatment-category-core+ actual/planned-rules / image-modality)—— 分层重构的首个第二宿主消费者。 - 锚点:临床事实 sourceEncounterExternalId=emr_sub_id(同诊聚合); emr 挂 appointment_id(56.5%);影像挂 emr_id 病历号。 全量实跑验证(本地):107,227 患者 / 288,383 txns / 285,986 facts,failed=0; 旧 450 样本幂等去重 ✓。诊断 83.5% 拿到 K 码(共享名称字典生效),治疗 11 类闭集 分布合理。周元策(987d743a)persona v1 + 召回计划与其 K04 诊断临床吻合,闭环通。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>luoqi committed -
多宿主字典治理:enum/keyword 映射词分两类 —— 临床通用知识(慢性牙髓炎→K04、 开髓→pulp_extirpation)拷贝必漂移(实证:jvs-dw 自己的 treatment_planned 字典 已是 treatment_actual 的陈旧拷贝);宿主怪癖(价格表项名/标点残留/用词判例)共用 会互相污染。→ 新增 dict_includes 机制:loader 在 zod 校验前解析合并,引擎零改动。 - dict-include.ts:include 解析 + 合并语义(enum 本地覆盖/keyword 本地优先/ strip 去重并集/_default 禁入共享层 strict 校验) - data/_shared/dict/ 七份共享字典:diagnosis-kcode(187 词+9 keyword 规则)、 treat-stages(45)、treatment-category-core(177=actual∩planned 干净交集)、 category keyword 按 kind 分 actual/planned 两个语义变体、image-modality(9)、 recommendation-code(27+11) - jvs-dw 五份 yaml 改用 include,本地只留判例(牙齿缺少→K08、拆线→surgical、 单据类 modality、价格表项名、标点残留死条目) 生产零变化证明(jvs-dw 每日增量无感):20/20 assembler 新旧解析结果 deep-equal (vs git HEAD);tsc 0 err;测试与 HEAD 基线完全一致(存量 3 挂套件与本次无关); reparse dry-run 真实 loader 全链冒烟通过。 已知遗留(有意不修,行为保真):planned keyword 裸「二期」误吞正畸(共享文件已标 TODO);planned 残差中文标点死条目待清理 —— 均属行为变更须评估+reparse,另行提交。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
luoqi committed -
原验证只 curl 127.0.0.1(loopback),应用绑成 loopback 时也过,但远端网关(经 ECS 私网 IP) 够不到 → 公网 502(2026-07-18 friday 踩过)。COMPOSE_MANAGED=1 时额外 curl 私网 IP:3100/3101, 不通即失败退出,把漂移在部署当场拦下。本机代理型(非 managed)不受影响。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
friday 生产经独立网关 lb1.friday.tech 转发,网关走 ECS 私网 IP 到达应用;base compose 绑 127.0.0.1(本机代理型部署用)会让网关连不上 → 502。之前生产容器是旧 compose 的 0.0.0.0, force-recreate 应用了 loopback 绑定才暴露此问题。managed override(仅托管环境叠加)用 !override 改回 0.0.0.0;安全由云安全组保证(只放行网关/VPC)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
医疗系统 fetch/xhr 面包屑 URL 带 patientId/病历号等 PII,整段被服务端打 [Filtered] 又看不出接口。 新增 sentry-scrub.sanitizeUrl:段级 id(uuid/纯数字/长hex/病历号)→ :id、query 全去掉; client/server/edge 三处 Sentry.init 挂 beforeBreadcrumb。既能看调了哪个接口,又不落患者标识。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
pac-web 的 NEXT_PUBLIC_SENTRY_DSN/ENVIRONMENT/TRACES_SAMPLE_RATE 需 build-time inline, 故 Dockerfile 加 ARG/ENV、compose build.args 加对应项(未设则空→前端 Sentry no-op,不阻塞构建)。 后端 SENTRY_* 是运行期 env,已由 env_file: apps/pac-service/.env 注入,无需改。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
自部署 Sentry 23.6.1(am.jwsmed.com),两个项目/DSN/SDK,环境用 SENTRY_ENVIRONMENT 区分(test/prod)。 已冒烟验证:老服务器接受现代 SDK v10 envelope(flush=true);pac-web next build(Turbopack)通过;pac-service 启动正常。 后端 pac-service(@sentry/nestjs): - src/instrument.ts:Sentry.init(DSN 缺省则 no-op),main.ts 首行 import;profiling 关。 - app.module 注册 SentryModule.forRoot()(请求级 tracing)。 - AllExceptionsFilter 仅对真·500(instanceof Error 分支)captureException,业务错误不上报。 前端 pac-web(@sentry/nextjs,Next16/App Router): - instrumentation-client.ts / sentry.server.config.ts / sentry.edge.config.ts / instrumentation.ts。 - next.config.mjs 用 withSentryConfig 包裹;sentryUrl 指自部署;source map 上传仅 SENTRY_AUTH_TOKEN 存在时(secret,不入库);telemetry 关;不开 Replay。 env:两端 .env.example 补 Sentry 段;DSN 走 env,真值在各机 .env(gitignored),auth token 仅构建期 env。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
- 潜在治疗/新建预约/回访 从身份卡·执行表单·通话结果头 上移到顶栏右上角动作区 (潜在·预约=默认样式,回访=主按钮);删除已成死代码 call-widget.tsx。 - 宠物引导:话术生成后停留 15s→引导给话术打是否好用;hover 回访/通话结果→引导做召回反馈 (60s 冷却、已反馈不扰),复用 emitPetEvent 气泡,不代评价。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
召回池认领→行离开池;我的返池→行离开我的。新增 usePatientPicker.removeItem (过滤 + total-1),claim/recycle 按当前 view 决定 removeItem 还是 patchItem。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed
-
- 17 Jul, 2026 4 commits
-
-
- 语音输入(麦克风)暂时隐藏:VOICE_INPUT_ENABLED=false 门控按钮,听写链路代码保留待恢复。 - 助手小窗头部加「最大化/还原」按钮(Maximize2
↔ Minimize2):点击在 400×620 吸附窗↔ 1000×634 居中大窗间切换(inset-0 m-auto 定宽高居中);收起时自动还原为小窗。 本地实测:麦克风不渲染;最大化后面板 1000×634 居中、图标切还原,链路通。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>luoqi committed -
- 头部「回收倒计时」隐藏:暂无自动回收机制(返池改手动),RecycleCountdown 组件保留待恢复。 - recycle 后端只拒终态(completed/abandoned/superseded);assigned + active 都可返池 —— 无自动 回收后 plan 可能停在 active 却仍挂客服名下,原「只 assigned 可回收」会误拒(图2 报错场景)。 - 前端「返池」按钮 gate 由 status==='assigned' 改为「有 assignee 且非终态」,与「认领」(无 assignee) 互斥。本地实测:active+挂名下 → 点返池成功、DB active/assignee=null、toast 正常。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
已认领(status=assigned)的患者行,PLAN_RECYCLE 权限(leader/admin)下 hover 出「返池」按钮: 调 plansApi.recycle → 后端置 active + 清 assignee → 原地 patchItem 改回「待认领」(不重拉)。 与「认领」共用同一 grid 叠层 hover-swap 结构(不重排);amber 区别 teal。本地 dev 实测: 点返池 → 进行中变待认领+现认领按钮、toast「已返池」、DB status=active/assignee=null,链路通。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
hits.push(...subHits) 把每个元素当实参压栈,V8 实参上限 ~6.5万;华北灌完(host ~28万患者)后 单子场景命中超限 → RangeError: Maximum call stack size exceeded,recompute-plans 中途崩、 无汇总输出。改逐个 push。parser-pipeline 的 metrics.writes.push(...results) 同型隐患 (单资源单批已 5万+ 行)一并修掉。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed
-
- 15 Jul, 2026 15 commits
-
-
上版按 !PLAN_VIEW_ALL 豁免,但 leader 角色本就带 PLAN_VIEW_ALL → 漏洞对 leader 仍在。 clinicIds 由 orgScope 派生,本应是硬边界:list 去掉 view!=='all' 豁免、detail/aggregate 去掉 view_all 豁免,始终按 clinicIds 圈诊所(null 集团池放行)。宽 scope(集团 leader/admin)clinicIds 覆盖全部 → no-op 不受影响;窄 scope 才被真正圈住。view_all 语义=本 scope 内看所有经办人,不跨诊所。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
召回池列表按 orgScope(clinicIds)过滤诊所,但 detail / aggregate(/plans/:id/full)按 ID 直取只 校验 host/tenant/sourceUnit,漏了 clinicIds → 切诊所后残留的旧 planId 仍能拉到别诊所患者详情。 现补齐:无 PLAN_VIEW_ALL 时目标诊所须在 clinicIds 内(null 集团池放行),否则 aggregate 抛 PLAN_NOT_FOUND(前端已有该码处理 → 自动跳回当前 scope 首个患者),detail/recompute 抛 404。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
- assistant:工具调用不再渲染卡片,运行中的工具以"正在xxx…"喂给下方 loading 指示(替换"生成中"), 空档默认"生成中…";英文工具名彻底不露出。 - calendar:react-day-picker 换官方 shadcn Tailwind classNames(teal 主题);中文化(日一二…/2026年7月, 周日起始);修 month_caption 盖住翻页箭头导致点不动(z-10 + pointer-events)。 - outcome-form:下次回访时间由预设下拉改 时(00-23)+分(00-59)两下拉,每分钟粒度,默认 00:00。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
上个改动的 auto-fallback 未卡「加载完成」转变:usePatientPicker 的 loading 初值 false、 total 初值 0,首帧即满足 !loading&&total===0 → 抢在「我的」加载前切 pool,而并发守卫又跳过 pool 的 fetch → tab=召回池 但数据仍是「我的」。改为等 loading true→false 完成一次再判空。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
原 rail 默认 tab 写死 pool,而落地页选默认患者是 mine 优先 → 左栏 tab 与所选患者来源不符。 改为默认 view=mine,加载完成后若 total=0 自动回落 pool(autoFellBackRef 只一次,尊重后续手动切换)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
原实现 hover 时「认领」按钮 group-hover:inline-block 冒出、StatusPill group-hover:hidden 藏起, 二者尺寸不同 → 右块宽度变 → flex-1 诊所名重排,整行看着位移。 改为二者叠在同一 grid 格,槽位恒为较大值,hover 只切 visibility(非 display),零重排。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
详情页已按 !originalArchiveUrl 隐藏手机号,召回池左侧列表项遗漏。 PatientRow 增 hidePhone,调用处传 hasPatientArchive(=VIEW_PATIENT 模板), 与详情页同条件:宿主配了原始档案入口时真号在宿主档案页看,PAC 侧为造数假号故隐藏。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
之前 auth-gate 在"非嵌入+未登录"时强制弹 MockLoginDialog(预设瑞尔/瑞泰硬编码前端), 真生产 PAC_ENABLE_MOCK_LOGIN=false 时框照弹、点了才 10107 报错,体验很怪。 改:探测后端 GET /auth/mock-users(禁用返空)→ mock 禁用时显示 SessionExpired (请从宿主进入),不弹快速登录框;dev/试部署(mock 开)行为不变。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
默认 prod 把 3100/3101/3102 绑 127.0.0.1(本机 nginx 反代)。走 SLB 时 SLB 节点在内网 其它主机、需可达这些端口 → 用 !override 替换成 0.0.0.0 绑定。
⚠ ️ 需 ECS 安全组把这三个 端口限制为仅 SLB/VPC 内网入站(禁 0.0.0.0/0)。老 prod(本机 nginx)不用此 override。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>luoqi committed -
上个修复靠 onCompositionEnd 里 setSearch(最终值) 重触发 useEffect([search]) 防抖; 但组字中 onChange 已把 search 设成最终值 → compositionEnd 再 setSearch 同值 = 不重渲染 → effect 不重跑 → keyword 永不更新 → 中文搜索不发请求(列表停在全量)。 改为手动防抖 scheduleKeyword:组字中(composingRef)onChange 不排;onCompositionEnd 解锁后直接排一次(不依赖 setSearch 是否引起重渲染)。本地实测:输入"程"→ 请求 keyword=%E7%A8%8B 发出、列表 236→1(程浩)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
- import-patient.cli:单患者精确摄入(importPatient SQL 注入 pid+brand)+ persona/plan 重算, 补 runPullForPatient 对"未摄入新患者"的死结;cursor 隔离(resource=patient_refresh)不扰增量。 - assistant / plan-detail:话术&对话默认模型 deepseek → qwen(qwen3.7-max),去掉 Gemini 选项(未配)。 - plan-detail:配了宿主 VIEW_PATIENT(原始档案)时隐藏 PAC 侧手机号行——真号在宿主档案页, PAC 侧为造数假号,防客服误拨。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
现象:搜"李石明"时请求 keyword=李石ming(拼音"明"未上屏),ILIKE 不命中 → 空结果; 搜单字"李"反而能出。根因:input onChange 在 IME 组字中就触发 300ms 防抖搜索, 拿到中间态"李石ming",组字完成(→明)后没用最终中文重搜。 修:composingRef 标记组字态,组字中 effect 跳过搜索;onCompositionEnd 解锁 + 用最终中文重新触发防抖。仅前端。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
和 --clinics 同套路:只收窄"列哪些患者"(按 cohort.list_cursor_column=last_visit_time), 被选中患者的全部历史仍全摄;可与 --clinics 叠加(AND)。不用改 manifest。 --since=2026-01-01 今年有来诊的患者 --months=12 最近 12 个月有来诊(CLI 换算成 cutoff 日期,--since 显式优先) DW 实测:全量 277万 → 今年 46万 / 近12月 75万 / 近24月 118万。 last_visit_time 是 ISO 文本,字典序=时间序,直接串比较(避 NO_COMMON_TYPE)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
根因(对接方反复报的"用着用着登录已过期"): - 竞态:bootstrap 的"过期前 60s 自动刷"定时器直接调 refreshToken(),绕过 api-client 的 单飞锁 → 定时器与请求 401 兜底刷可能同时拿同一个一次性 refresh token 去换 → 一个成功 轮换(del 旧 jti),另一个拿已作废 jti → 10103 revoked → 误清会话。 - 盲区:api-client 运行期 clear() 路径无 client-diag 信标 → 服务端无日志、不触发企微告警。 改动: - lib/auth-diag.ts:抽出共享诊断信标(bootstrap 与 api-client 共用)。 - api-client.ts:两个 clear 点(refresh 被拒 / 受保护请求鉴权失败)补运行期掉线信标。 - use-auth-bootstrap.ts:过期定时器改走共享单飞 tryRefresh,消除双刷竞态。 - auth.service.ts:clientDiag 告警门控纳入 runtime-refresh-fail / runtime-auth-clear, alertSessionExpiry 增运行期根因文案与标题。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
建国门补摄(~5万患者)时 prisma.patient.findMany({ id: { in: 50383 } }) 触发 "too many bind variables, max 32767"。改为按 2万/块分批查再合并(排序保持分片稳定序)。 小诊所行为不变;不传 --clinics 仍走原全量路径。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>luoqi committed
-
- 14 Jul, 2026 5 commits
-
-
按诊所补摄(cold-import --clinics)后,只重算新灌入那批患者,免全 host 白扫。 从 patient_transactions.clinic_id 反查患者集(与 cold-import --clinics 同口径), 与 --concurrency / --shard 组合。plans 侧不需要:runAllForHost 已并发+预取, 全量 ~5min 且幂等,直接全量跑即可。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
需求:数仓加了新诊所数据,要挑几家追加摄入,不清空重摄、且摄该诊所患者的全部相关主体。 - manifest schema:cohort 新增可选 clinic_scope {from_table, org_column}(被动声明)。 - cold-import CLI:--clinics=X,Y;service 透传;listPatientPairs 注入诊所过滤。 只收窄"列哪些患者"(挂在有 org 的事实表上求交集),不碰任何资源查询 → 被选中患者的全部主体(跨所有诊所)照常摄入,幂等追加不清空、不误删。 - jvs-dw manifest:一次性配 clinic_scope→fact_emr_treatment_out.organization_id。 - 默认(不传 --clinics)全量行为完全不变。DW 实测:单家 27194 / 两家 60992 vs 全量 569 万,收窄正确。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>luoqi committed -
走阿里云 RDS/Redis 时应用代码零改动,只需: - docker-compose.managed.yml:profile 排除自带 postgres/redis,pac-service/migrate 的 DATABASE_URL/REDIS_URL 走 .env 托管端点,!reset/!override 清掉对自带 DB 的 depends_on。 - deploy-prod.sh:COMPOSE_MANAGED=1 自动叠加该 override(默认自带模式不受影响)。 - README:托管用法 + 两个坑(Redis 用标准版非集群、RDS 与应用同 VPC/同可用区)。 compose config 已验证:托管模式服务清单无 postgres/redis,依赖/URL 均正确。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
现象:直接浏览器打开 /plans(无 code、非嵌入)也推 [PAC CRITICAL],且根因误判成 "code 到手即死"(其实压根没 code)。 - 告警门控:仅 hadCode=true 或 isEmbedded=true 才推;直接非嵌入访问只落日志。 - freshButDead 根因加 hadCode=true 前置(没 code 不判时间差); 新增"嵌入内 URL 无 code"分支。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed -
configuration.ts 早已读 QWEN_API_KEY/DASHSCOPE_API_KEY/GEMINI_API_KEY(生产四把 key 全在用), 但 .env.example 只列了 DeepSeek,gen-env 也漏了 → 换新环境会漏配 qwen 话术/实时教练。 - .env.example:补 Qwen(话术可选 provider)+ DashScope/Gemini(实时坐席教练,可选)。 - gen-env.sh:DEEPSEEK+QWEN 必填(__FILL_ME__),DASHSCOPE/GEMINI 可选(留空不报占位)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
luoqi committed
-