Commit 7758f537 by luoqi

chore: untrack .history (editor backup dir, already in .gitignore)

parent 2f8c962a
NODE_ENV=development
PORT=3001
LOG_LEVEL=info
DATABASE_URL=postgresql://pac:pac@localhost:5432/pac?schema=public
REDIS_URL=redis://localhost:6379
JWT_SECRET=dev-secret-change-me-in-production-min-32-chars
JWT_REFRESH_SECRET=dev-refresh-secret-change-me-in-prod-min-32
JWT_EXPIRES_IN=2h
JWT_REFRESH_EXPIRES_IN=7d
# AI — DeepSeek 直连(国内 endpoint,合规);本地开发留空时跑会抛 Missing API key,设置 DEEPSEEK_API_KEY 即可
DEEPSEEK_API_KEY=
DEEPSEEK_BASE_URL=https://api.deepseek.com
AI_DEFAULT_MODEL=deepseek-v4-pro
AI_REQUEST_TIMEOUT_SEC=60
CORS_ORIGINS=http://localhost:3000
EXCHANGE_CODE_TTL_SECONDS=60
NODE_ENV=development
PORT=3001
LOG_LEVEL=info
DATABASE_URL=postgresql://pac:pac@localhost:5432/pac?schema=public
REDIS_URL=redis://localhost:6379
JWT_SECRET=dev-secret-change-me-in-production-min-32-chars
JWT_REFRESH_SECRET=dev-refresh-secret-change-me-in-prod-min-32
JWT_EXPIRES_IN=2h
JWT_REFRESH_EXPIRES_IN=7d
# AI — DeepSeek 直连(国内 endpoint,合规);本地开发留空时跑会抛 Missing API key,设置 DEEPSEEK_API_KEY 即可
DEEPSEEK_API_KEY=sk-e758111fa0bf4389a2f408d87cc06b6c
DEEPSEEK_BASE_URL=https://api.deepseek.com
AI_DEFAULT_MODEL=deepseek-v4-pro
AI_REQUEST_TIMEOUT_SEC=60
CORS_ORIGINS=http://localhost:3000
EXCHANGE_CODE_TTL_SECONDS=60
NODE_ENV=development
PORT=3001
LOG_LEVEL=info
DATABASE_URL=postgresql://pac:pac@localhost:5432/pac?schema=public
REDIS_URL=redis://localhost:6379
JWT_SECRET=dev-secret-change-me-in-production-min-32-chars
JWT_REFRESH_SECRET=dev-refresh-secret-change-me-in-prod-min-32
JWT_EXPIRES_IN=2h
JWT_REFRESH_EXPIRES_IN=7d
# AI — DeepSeek 直连(国内 endpoint,合规);本地开发留空时跑会抛 Missing API key,设置 DEEPSEEK_API_KEY 即可
DEEPSEEK_API_KEY=sk-e758111fa0bf4389a2f408d87cc06b6c
DEEPSEEK_BASE_URL=https://api.deepseek.com
AI_DEFAULT_MODEL=deepseek-v4-pro
AI_REQUEST_TIMEOUT_SEC=60
CORS_ORIGINS=http://localhost:3000
EXCHANGE_CODE_TTL_SECONDS=60
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
# Claude Design 提示词 — PAC 演示页面(客服任务详情)
> 这份提示词丢给 Claude design 让它产出演示页面设计稿(面向管委会)。
> 它能读项目,所以把关键文档 / schema 入口列出来,让它自己消化。
---
## 任务一句话
为 PAC 设计一个**客服视角的召回任务 One-Page Summary 演示页面**,面向集团管委会评审,要在一屏内说清"为什么打这个患者 + 怎么打"。
---
## 项目背景(必读这几份)
按以下顺序读,5 分钟即可建立坐标系:
1. **`docs/pac-goal-alignment.md`** — PAC v1 定位:治疗链外的人工召回引擎(automated_followup vs manual_recall 区分 + 治疗链 5 阶段)
2. **`docs/three-layer-model.md`** — 三层模型:patient_facts → persona → followup_plan(单向数据流 + 证据链)
3. **`docs/scenarios/README.md`** + **`docs/scenarios/treatment_aftercare_recall.md`** — PAC v1 主战场召回算法 + 4 个子场景(根管未戴冠 / 正畸保持期 / 种植年度复查 / 牙周维护)
4. **`docs/design-system.md`** — 已定的设计基调(配色 / 字体 / 信息密度纪律 / 组件清单)
5. **`apps/pac-service/prisma/schema.prisma`** — 真理源,重点看:`FollowupPlan` / `PlanReason` / `PlanScript` / `PlanSummary` / `PlanExecution` / `Persona` / `PersonaFeature` / `Patient` 这 8 个 model
---
## 本页定位
- **使用者**:客服(staff 角色)— 已经被分配了这个召回任务(`FollowupPlan.status = 'assigned'`, `assignee_user_id = <当前客服>`)
- **形态**:**One-Page Summary** — 客服打电话前快读,一屏掌握"打谁 / 为什么 / 怎么打 / 打完怎么记"
- **不是**:列表 / Dashboard / 配置 / 报表
- **核心问题**:页面要直接回答两件事 —
1. **为什么召回这个患者**(说服客服,这通电话值得打)
2. **怎么操作**(拨号 / 看话术 / 跳宿主档案 / 回写结果)
---
## 必须包含的内容(信息分层,不规定具体布局)
### 焦点层(永远可见,不折叠)
- 患者身份(姓名脱敏 + 性别 + 年龄 + VIP/普通标签)
- 召回理由摘要(scenario + 一句话 reason,如"种植 11 个月未做年度复查,医嘱要求 1 年内 CBCT")
- 当前召回目标(本次想拉患者回来做什么 — 取自 plan 上下文)
- 优先级表达(渐变条,不直显分数)
- **治疗链可视化区**(下文单独说,这是核心差异化)
- 主 CTA(拨打 / 话术 / 跳档案)+ 执行回写入口
### 次级层(折叠 / 抽屉 / Tab)
- AI 生成的 One-Page Summary 全文(`plan_summaries.summary_type = 'one_page'`)
- 病历摘要 / 治疗链概览(`plan_summaries.summary_type = 'medical_record' / 'treatment_chain'`)
- 话术全文(`plan_scripts`,Markdown,含开场 / 跟进 / 异议处理多子段)
- Persona features(VIP 价值 / 触达活跃度 / 沟通偏好等)
- AI 产物**生成时间**(唯一对客服暴露的元数据)
### 隐藏层(客服看不到)
- `evidence.factIds` 原始证据 ID
- `agent_invocations` 调用账本 / token / cost
- `patient_transactions` rawPayload
- fact / persona / plan 版本历史
---
## 治疗链可视化(核心差异化,要重点设计)
这是 PAC 跟其他召回工具的视觉差异化点,**要做好**
### 业务约束(必须遵守)
- 一个患者**可能有多条治疗链**(种植链 / 正畸链 / 牙周维护链 ... 互不干扰)
- 每条链对应**已发生**的治疗历史,锚定治疗链 5 阶段(发现机会 → 进入 → 执行 → 术后管理 → 闭环)
— 5 阶段定义见 `docs/pac-goal-alignment.md` §0
- **不要展示"未来推演"**(治疗链是历史 + 现状,不预测)
- **顶部可标注当前召回目标**(本次召回想触达哪条链的哪个节点)
### 设计自由
- 横向 / 纵向 / 卡片堆叠都可以,你选最合适的
- 多链怎么并列展示,你设计
- 链上节点的视觉语言(实心 / 空心 / 间隔标月数 / 断点高亮)你定
- 这一区可以占页面较大面积,管委会会盯着看
### 不要做的事
- 不要做成 EMR 病历时间轴(信息密度爆炸)
- 不要展示原始 transaction 流水
- 不要做成甘特图(太工程)
---
## 演示场景(自己挑一个最有说服力的患者)
PAC v1 主战场是 `treatment_aftercare_recall`,4 个子场景:
| # | 子场景 | 时间窗 |
|---|---|---|
| 1 | 根管未戴冠 | 30 天-18 个月 |
| 2 | 正畸保持期未回诊 | 6-24 个月 |
| 3 | 种植年度复查 | 330-540 天 |
| 4 | 牙周维护期 | 150-360 天 |
挑一个**故事完整、临床价值高、客服动作清晰**的场景作为演示主案例。如果患者历史上有多条治疗链(例如做过种植 + 正在做正畸),更好,可以展示多链并列。
患者数据自己编(合理脱敏:`张先生` / `138****1234`),金额数值用真实区间(种植 ¥15k-25k / 正畸 ¥30k-50k / 根管 ¥1k-3k)。
---
## 已定的设计基调(不要破坏)
`docs/design-system.md`,重点:
- 主色 **teal-600** `#0D9488`,辅助 **indigo-500**;状态色 emerald/amber/rose/sky
- 中性灰阶 **shadcn slate** 不动
- 字体 **PingFang SC** + system font 链(不引外部字体)
- 数字 **`tabular-nums`** 等宽
- 圆角 **8px** base,卡片 `rounded-lg`,chip `rounded-full`
- 阴影 `shadow-sm` 默认 / hover `shadow-md`,**禁重阴影**
- Motion ease-out 150ms,**禁 bounce / 大幅 scale**
- 触控目标最小 **44×44px**
- 中文优先 + 移动优先
---
## 输出要求
1. **完整页面**(mobile 视口 375px 起,sm/md/lg 渐进增强)— 实现成可运行的 Next.js page 在 `apps/pac-web/src/app/`
2. **演示数据写死在前端 mock**(不接后端,管委会演示不需要真数据)
3. **可点击的交互骨架**:CTA 弹 outcome 表单 / 抽屉展开次级信息 / 折叠区可开合
4. **配色与组件遵循 shadcn/ui + Tailwind 4 token**,新增组件放 `src/components/`,可复用单元尽量抽出
5. **不引外部资源**(图标用 lucide-react,字体走系统)
---
## 关键决策提醒
- 焦点层只放决策必需信息,其余收抽屉 / 折叠
- 治疗链可视化是亮点,值得多花时间
- 客服角度思考:打这通电话前 30 秒,他需要看到什么
- 别堆功能,**演示页面赢在叙事清晰,不在功能多**
# Claude Design 提示词 — PAC 演示页面(客服任务详情)
---
## 任务一句话
为 PAC 设计一个**客服视角的召回任务 One-Page Summary 演示页面**,面向集团管委会评审,要在一屏内说清"为什么打这个患者 + 怎么打"。
---
## 项目背景(必读这几份)
按以下顺序读,5 分钟即可建立坐标系:
1. **`docs/pac-goal-alignment.md`** — PAC v1 定位:治疗链外的人工召回引擎(automated_followup vs manual_recall 区分 + 治疗链 5 阶段)
2. **`docs/three-layer-model.md`** — 三层模型:patient_facts → persona → followup_plan(单向数据流 + 证据链)
3. **`docs/scenarios/README.md`** + **`docs/scenarios/treatment_aftercare_recall.md`** — PAC v1 主战场召回算法 + 4 个子场景(根管未戴冠 / 正畸保持期 / 种植年度复查 / 牙周维护)
4. **`docs/design-system.md`** — 已定的设计基调(配色 / 字体 / 信息密度纪律 / 组件清单)
5. **`apps/pac-service/prisma/schema.prisma`** — 真理源,重点看:`FollowupPlan` / `PlanReason` / `PlanScript` / `PlanSummary` / `PlanExecution` / `Persona` / `PersonaFeature` / `Patient` 这 8 个 model
---
## 本页定位
- **使用者**:客服(staff 角色)— 已经被分配了这个召回任务(`FollowupPlan.status = 'assigned'`, `assignee_user_id = <当前客服>`)
- **形态**:**One-Page Summary** — 客服打电话前快读,一屏掌握"打谁 / 为什么 / 怎么打 / 打完怎么记"
- **不是**:列表 / Dashboard / 配置 / 报表
- **核心问题**:页面要直接回答两件事 —
1. **为什么召回这个患者**(说服客服,这通电话值得打)
2. **怎么操作**(拨号 / 看话术 / 跳宿主档案 / 回写结果)
---
## 必须包含的内容(信息分层,不规定具体布局)
### 焦点层(永远可见,不折叠)
- 患者身份(姓名脱敏 + 性别 + 年龄 + VIP/普通标签)
- 召回理由摘要(scenario + 一句话 reason,如"种植 11 个月未做年度复查,医嘱要求 1 年内 CBCT")
- 当前召回目标(本次想拉患者回来做什么 — 取自 plan 上下文)
- 优先级表达(渐变条,不直显分数)
- **治疗链可视化区**(下文单独说,这是核心差异化)
- 主 CTA(拨打 / 话术 / 跳档案)+ 执行回写入口
### 次级层(折叠 / 抽屉 / Tab)
- AI 生成的 One-Page Summary 全文(`plan_summaries.summary_type = 'one_page'`)
- 病历摘要 / 治疗链概览(`plan_summaries.summary_type = 'medical_record' / 'treatment_chain'`)
- 话术全文(`plan_scripts`,Markdown,含开场 / 跟进 / 异议处理多子段)
- Persona features(VIP 价值 / 触达活跃度 / 沟通偏好等)
- AI 产物**生成时间**(唯一对客服暴露的元数据)
### 隐藏层(客服看不到)
- `evidence.factIds` 原始证据 ID
- `agent_invocations` 调用账本 / token / cost
- `patient_transactions` rawPayload
- fact / persona / plan 版本历史
---
## 治疗链可视化(核心差异化,要重点设计)
这是 PAC 跟其他召回工具的视觉差异化点,**要做好**
### 业务约束(必须遵守)
- 一个患者**可能有多条治疗链**(种植链 / 正畸链 / 牙周维护链 ... 互不干扰)
- 每条链对应**已发生**的治疗历史,锚定治疗链 5 阶段(发现机会 → 进入 → 执行 → 术后管理 → 闭环)
— 5 阶段定义见 `docs/pac-goal-alignment.md` §0
- **不要展示"未来推演"**(治疗链是历史 + 现状,不预测)
- **顶部可标注当前召回目标**(本次召回想触达哪条链的哪个节点)
### 设计自由
- 横向 / 纵向 / 卡片堆叠都可以,你选最合适的
- 多链怎么并列展示,你设计
- 链上节点的视觉语言(实心 / 空心 / 间隔标月数 / 断点高亮)你定
- 这一区可以占页面较大面积,管委会会盯着看
### 不要做的事
- 不要做成 EMR 病历时间轴(信息密度爆炸)
- 不要展示原始 transaction 流水
- 不要做成甘特图(太工程)
---
## 演示场景(自己挑一个最有说服力的患者)
PAC v1 主战场是 `treatment_aftercare_recall`,4 个子场景:
| # | 子场景 | 时间窗 |
|---|---|---|
| 1 | 根管未戴冠 | 30 天-18 个月 |
| 2 | 正畸保持期未回诊 | 6-24 个月 |
| 3 | 种植年度复查 | 330-540 天 |
| 4 | 牙周维护期 | 150-360 天 |
挑一个**故事完整、临床价值高、客服动作清晰**的场景作为演示主案例。如果患者历史上有多条治疗链(例如做过种植 + 正在做正畸),更好,可以展示多链并列。
患者数据自己编(合理脱敏:`张先生` / `138****1234`),金额数值用真实区间(种植 ¥15k-25k / 正畸 ¥30k-50k / 根管 ¥1k-3k)。
---
## 已定的设计基调(不要破坏)
`docs/design-system.md`,重点:
- 主色 **teal-600** `#0D9488`,辅助 **indigo-500**;状态色 emerald/amber/rose/sky
- 中性灰阶 **shadcn slate** 不动
- 字体 **PingFang SC** + system font 链(不引外部字体)
- 数字 **`tabular-nums`** 等宽
- 圆角 **8px** base,卡片 `rounded-lg`,chip `rounded-full`
- 阴影 `shadow-sm` 默认 / hover `shadow-md`,**禁重阴影**
- Motion ease-out 150ms,**禁 bounce / 大幅 scale**
- 触控目标最小 **44×44px**
- 中文优先 + 移动优先
---
## 输出要求
1. **完整页面**(mobile 视口 375px 起,sm/md/lg 渐进增强)— 实现成可运行的 Next.js page 在 `apps/pac-web/src/app/`
2. **演示数据写死在前端 mock**(不接后端,管委会演示不需要真数据)
3. **可点击的交互骨架**:CTA 弹 outcome 表单 / 抽屉展开次级信息 / 折叠区可开合
4. **配色与组件遵循 shadcn/ui + Tailwind 4 token**,新增组件放 `src/components/`,可复用单元尽量抽出
5. **不引外部资源**(图标用 lucide-react,字体走系统)
---
## 关键决策提醒
- 焦点层只放决策必需信息,其余收抽屉 / 折叠
- 治疗链可视化是亮点,值得多花时间
- 客服角度思考:打这通电话前 30 秒,他需要看到什么
- 别堆功能,**演示页面赢在叙事清晰,不在功能多**
# Claude Design 提示词 — PAC 演示页面(客服任务详情)
---
## 任务一句话
为 PAC 设计一个**客服视角的召回任务 One-Page Summary 演示页面**,面向集团管委会评审,要在一屏内说清"为什么打这个患者 + 怎么打"。
---
## 项目背景(必读这几份)
按以下顺序读,5 分钟即可建立坐标系:
1. **`docs/pac-goal-alignment.md`** — PAC v1 定位:治疗链外的人工召回引擎(automated_followup vs manual_recall 区分 + 治疗链 5 阶段)
2. **`docs/three-layer-model.md`** — 三层模型:patient_facts → persona → followup_plan(单向数据流 + 证据链)
3. **`docs/scenarios/README.md`** + **`docs/scenarios/treatment_aftercare_recall.md`** — PAC v1 主战场召回算法 + 4 个子场景(根管未戴冠 / 正畸保持期 / 种植年度复查 / 牙周维护)
4. **`docs/design-system.md`** — 已定的设计基调(配色 / 字体 / 信息密度纪律 / 组件清单)
5. **`apps/pac-service/prisma/schema.prisma`** — 真理源,重点看:`FollowupPlan` / `PlanReason` / `PlanScript` / `PlanSummary` / `PlanExecution` / `Persona` / `PersonaFeature` / `Patient` 这 8 个 model
---
## 本页定位
- **使用者**:客服(staff 角色)— 已经被分配了这个召回任务(`FollowupPlan.status = 'assigned'`, `assignee_user_id = <当前客服>`)
- **形态**:**One-Page Summary** — 客服打电话前快读,一屏掌握"打谁 / 为什么 / 怎么打 / 打完怎么记"
- **不是**:列表 / Dashboard / 配置 / 报表
- **核心问题**:页面要直接回答两件事 —
1. **为什么召回这个患者**(说服客服,这通电话值得打)
2. **怎么操作**(拨号 / 看话术 / 跳宿主档案 / 回写结果)
---
## 必须包含的内容(信息分层,不规定具体布局)
### 焦点层(永远可见,不折叠)
- 患者身份(姓名脱敏 + 性别 + 年龄 + VIP/普通标签)
- 召回理由摘要(scenario + 一句话 reason,如"种植 11 个月未做年度复查,医嘱要求 1 年内 CBCT")
- 当前召回目标(本次想拉患者回来做什么 — 取自 plan 上下文)
- 优先级表达(渐变条,不直显分数)
- **治疗链可视化区**(下文单独说,这是核心差异化)
- 主 CTA(拨打 / 话术 / 跳档案)+ 执行回写入口
### 次级层(折叠 / 抽屉 / Tab)
- AI 生成的 One-Page Summary 全文(`plan_summaries.summary_type = 'one_page'`)
- 病历摘要 / 治疗链概览(`plan_summaries.summary_type = 'medical_record' / 'treatment_chain'`)
- 话术全文(`plan_scripts`,Markdown,含开场 / 跟进 / 异议处理多子段)
- Persona features(VIP 价值 / 触达活跃度 / 沟通偏好等)
- AI 产物**生成时间**(唯一对客服暴露的元数据)
### 隐藏层(客服看不到)
- `evidence.factIds` 原始证据 ID
- `agent_invocations` 调用账本 / token / cost
- `patient_transactions` rawPayload
- fact / persona / plan 版本历史
---
## 治疗链可视化(核心差异化,要重点设计)
这是 PAC 跟其他召回工具的视觉差异化点,**要做好**
### 业务约束(必须遵守)
- 一个患者**可能有多条治疗链**(种植链 / 正畸链 / 牙周维护链 ... 互不干扰)
- 每条链对应**已发生**的治疗历史,锚定治疗链 5 阶段(发现机会 → 进入 → 执行 → 术后管理 → 闭环)
— 5 阶段定义见 `docs/pac-goal-alignment.md` §0
- **不要展示"未来推演"**(治疗链是历史 + 现状,不预测)
- **顶部可标注当前召回目标**(本次召回想触达哪条链的哪个节点)
### 设计自由
- 横向 / 纵向 / 卡片堆叠都可以,你选最合适的
- 多链怎么并列展示,你设计
- 链上节点的视觉语言(实心 / 空心 / 间隔标月数 / 断点高亮)你定
- 这一区可以占页面较大面积,管委会会盯着看
### 不要做的事
- 不要做成 EMR 病历时间轴(信息密度爆炸)
- 不要展示原始 transaction 流水
- 不要做成甘特图(太工程)
---
## 演示场景 — 漏治新链(treatment_initiation_recall)
**只演这一个场景**:患者已存在治疗机会(影像 / EMR / 医生医嘱 / 收费单已开),但**未进入治疗链** — 没缴费、没预约、没治疗计划、没后续接诊。PAC 召回客服去邀约患者回诊,把这条新治疗链**启动**起来。
**典型触发**:
- CBCT / X 光发现需治疗病灶,医生 EMR 标注需治疗,但患者后续无动作
- 医生开了治疗计划单,患者未缴费 / 未预约
- 咨询后留档评估有治疗需求,但未转化
**治疗链区域怎么画**:
- **历史链**:展示患者过往已发生的治疗链(可能多条,如做过洗牙 / 单颗修复),反映这是个老客户不是陌生人
- **新链标注**:顶部明确"本次召回目标 = 启动 XX 新治疗链",指向那个**已发现但未进入**的治疗机会点
患者数据自己编(合理脱敏:`张先生` / `138****1234`),金额参考真实区间(种植 ¥15k-25k / 正畸 ¥30k-50k / 根管 ¥1k-3k / 单颗修复 ¥2k-5k)。
---
## 已定的设计基调(不要破坏)
`docs/design-system.md`,重点:
- 主色 **teal-600** `#0D9488`,辅助 **indigo-500**;状态色 emerald/amber/rose/sky
- 中性灰阶 **shadcn slate** 不动
- 字体 **PingFang SC** + system font 链(不引外部字体)
- 数字 **`tabular-nums`** 等宽
- 圆角 **8px** base,卡片 `rounded-lg`,chip `rounded-full`
- 阴影 `shadow-sm` 默认 / hover `shadow-md`,**禁重阴影**
- Motion ease-out 150ms,**禁 bounce / 大幅 scale**
- 触控目标最小 **44×44px**
- 中文优先 + 移动优先
---
## 输出要求
1. **完整页面**
2. **演示数据写死在前端 mock**(不接后端,管委会演示不需要真数据)
3. **可点击的交互骨架**:CTA 弹 outcome 表单 / 抽屉展开次级信息 / 折叠区可开合
---
## 关键决策提醒
- 焦点层只放决策必需信息,其余收抽屉 / 折叠
- 治疗链可视化是亮点,值得多花时间
- 客服角度思考:打这通电话前 30 秒,他需要看到什么
- 别堆功能,**演示页面赢在叙事清晰,不在功能多**
# PAC UI 设计基调
> Next 16 + React 19 + TailwindCSS 4 + shadcn/ui(new-york / slate)+ Radix + lucide + zustand
> 移动优先,iframe 嵌入约束。
---
## 1. 场景约束
| 约束 | 设计含义 |
|---|---|
| iframe 嵌入多个宿主 | **中性不抢宿主**,但保留 PAC 辨识 |
| 客服打电话边看边记 | 高信息密度、单手可操作、CTA 显眼 |
| 移动优先 | 默认 mobile,sm/md/lg 渐进 |
| 医疗 SaaS | 专业 > 花哨,不弹跳不彩虹 |
## 2. 配色
| 槽位 | 值 | 用途 |
|---|---|---|
| Primary | `teal-600` `#0D9488` | 主操作 / 选中态 |
| Primary subtle | `teal-50` | 标签底 / 高亮区 |
| 辅助强调 | `indigo-500` `#6366F1` | Persona / AI 产物标识 |
| Success | `emerald-600` | success_appointed |
| Warning | `amber-500` | scheduled_next / 待跟进 |
| Danger | `rose-600` | abandoned / 投诉 / DNC |
| Info | `sky-500` | 同步状态 / 默认信息 |
| 中性灰阶 | shadcn **slate**(不动) | 跟宿主和谐 |
**渠道色**:phone=sky · wecom=emerald · sms=violet · other=slate
**优先级条**:emerald → amber → rose 三段渐变(不直显数字)
## 3. 字体 / 数字
- 中文:`PingFang SC, "Noto Sans CJK SC", system-ui, sans-serif`(不引外部字体)
- 数字:**`tabular-nums`** 等宽 — 金额 / 时间窗 / 计数
- 字号阶梯(mobile):12 / 14 / 16 / 20 / 24,标题最大 24
## 4. 形状 / 间距
| | 值 |
|---|---|
| 圆角 base | `--radius: 0.5rem`(8px) |
| 卡片 | `rounded-lg` |
| chip | `rounded-full` |
| 阴影 | 默认 `shadow-sm`,hover `shadow-md`,**禁重阴影** |
| 卡片内边距 | mobile `p-4` / desktop `p-5` |
| 列表间距 | `gap-3` |
| 触控目标 | 最小 **44×44px** |
## 5. 信息密度纪律
> **视觉焦点只放决策必需的信息,其余收进抽屉 / 折叠 / 二级页。**
| 层级 | 形态 | 内容 |
|---|---|---|
| 焦点 | always-on | 身份 / 优先级 / 召回理由摘要 / CTA |
| 次级 | accordion / tab | reason 证据列表 / 治疗链时间轴 / AI 产物 |
| 详情 | 抽屉 / 全屏 modal | 完整 transaction timeline / EMR 原文 / 影像 metadata |
| 调试 | 隐藏(角色门控) | rawPayload / agentInvocation token / fact version 历史 |
**不强制卡片结构**,但**强制信息分层** — 任何页面都要明确"什么进焦点、什么进抽屉"。
## 6. Motion
- ease-out **150ms** 通用
- 状态切换 / 列表插入 pulse **300ms**
- 禁:bounce / 大幅 scale / 旋转
## 7. iframe 嵌入约束
- 容器用 `bg-background` token,不假设白底
- 不用 fixed/absolute 全屏遮罩
- 不引外部字体(走宿主 system font 链)
- 链接 `target="_top"`(deep-link 跳宿主原页)
## 8. 关键 UI 单元清单(W3-W4 落地)
| 组件 | 用途 | 优先级 |
|---|---|---|
| `<PlanCard>` | 召回任务列表项 | P0 |
| `<PersonaCard>` | 患者画像快读 | P0 |
| `<ReasonChip>` | scenario 标签 | P0 |
| `<PriorityBar>` | 5 段渐变优先级 | P0 |
| `<ChannelIcon>` | 渠道图标 | P0 |
| `<TreatmentChainTimeline>` | 治疗链横向时间轴 ⭐ 差异化 | P0 |
| `<OutcomeDialog>` | 执行回写(强枚举) | P0 |
| `<ScriptViewer>` | Markdown 话术(开场/跟进/异议折叠) | P1 |
| `<EvidenceDrawer>` | factIds → transaction 原文 | P1 |
# PAC UI 设计基调
> Next 16 + React 19 + TailwindCSS 4 + shadcn/ui + Radix + lucide + zustand
> 移动优先,iframe 嵌入约束。
---
## 1. 场景约束
| 约束 | 设计含义 |
|---|---|
| iframe 嵌入多个宿主 | **中性不抢宿主**,但保留 PAC 辨识 |
| 客服打电话边看边记 | 高信息密度、单手可操作、CTA 显眼 |
| 移动优先 | 默认 mobile,sm/md/lg 渐进 |
| 医疗 SaaS | 专业 > 花哨,不弹跳不彩虹 |
## 2. 配色
| 槽位 | 值 | 用途 |
|---|---|---|
| Primary | `teal-600` `#0D9488` | 主操作 / 选中态 |
| Primary subtle | `teal-50` | 标签底 / 高亮区 |
| 辅助强调 | `indigo-500` `#6366F1` | Persona / AI 产物标识 |
| Success | `emerald-600` | success_appointed |
| Warning | `amber-500` | scheduled_next / 待跟进 |
| Danger | `rose-600` | abandoned / 投诉 / DNC |
| Info | `sky-500` | 同步状态 / 默认信息 |
| 中性灰阶 | shadcn **slate**(不动) | 跟宿主和谐 |
**渠道色**:phone=sky · wecom=emerald · sms=violet · other=slate
**优先级条**:emerald → amber → rose 三段渐变(不直显数字)
## 3. 字体 / 数字
- 中文:`PingFang SC, "Noto Sans CJK SC", system-ui, sans-serif`(不引外部字体)
- 数字:**`tabular-nums`** 等宽 — 金额 / 时间窗 / 计数
- 字号阶梯(mobile):12 / 14 / 16 / 20 / 24,标题最大 24
## 4. 形状 / 间距
| | 值 |
|---|---|
| 圆角 base | `--radius: 0.5rem`(8px) |
| 卡片 | `rounded-lg` |
| chip | `rounded-full` |
| 阴影 | 默认 `shadow-sm`,hover `shadow-md`,**禁重阴影** |
| 卡片内边距 | mobile `p-4` / desktop `p-5` |
| 列表间距 | `gap-3` |
| 触控目标 | 最小 **44×44px** |
## 5. 信息密度纪律
> **视觉焦点只放决策必需的信息,其余收进抽屉 / 折叠 / 二级页。**
| 层级 | 形态 | 内容 |
|---|---|---|
| 焦点 | always-on | 身份 / 优先级 / 召回理由摘要 / CTA |
| 次级 | accordion / tab | reason 证据列表 / 治疗链时间轴 / AI 产物 |
| 详情 | 抽屉 / 全屏 modal | 完整 transaction timeline / EMR 原文 / 影像 metadata |
| 调试 | 隐藏(角色门控) | rawPayload / agentInvocation token / fact version 历史 |
**不强制卡片结构**,但**强制信息分层** — 任何页面都要明确"什么进焦点、什么进抽屉"。
## 6. Motion
- ease-out **150ms** 通用
- 状态切换 / 列表插入 pulse **300ms**
- 禁:bounce / 大幅 scale / 旋转
## 7. iframe 嵌入约束
- 容器用 `bg-background` token,不假设白底
- 不用 fixed/absolute 全屏遮罩
- 不引外部字体(走宿主 system font 链)
- 链接 `target="_top"`(deep-link 跳宿主原页)
## 8. 关键 UI 单元清单(W3-W4 落地)
| 组件 | 用途 | 优先级 |
|---|---|---|
| `<PlanCard>` | 召回任务列表项 | P0 |
| `<PersonaCard>` | 患者画像快读 | P0 |
| `<ReasonChip>` | scenario 标签 | P0 |
| `<PriorityBar>` | 5 段渐变优先级 | P0 |
| `<ChannelIcon>` | 渠道图标 | P0 |
| `<TreatmentChainTimeline>` | 治疗链横向时间轴 ⭐ 差异化 | P0 |
| `<OutcomeDialog>` | 执行回写(强枚举) | P0 |
| `<ScriptViewer>` | Markdown 话术(开场/跟进/异议折叠) | P1 |
| `<EvidenceDrawer>` | factIds → transaction 原文 | P1 |
# PAC v1 = 治疗链外的人工召回引擎
> 对上确认单 — 逐项打勾。
---
## 1. automated_followup vs manual_recall
| | automated_followup | **manual_recall ⭐ PAC v1** |
|---|---|---|
| 患者所处 | 链**内**,正常推进 | 链**外** / 未进入 / 断裂 / 沉睡 |
| 谁执行 | 机器(短信 / 企微 / AI) | 人(客服电话 / 企微) |
| 内容 | 标准模板 | Persona + Script 个性化 |
| 目的 | 维持连续性 | **重新拉回**服务链 |
| 客服工时 | 不消耗 | 消耗(有 assignee + 熔断) |
| 异常处理 | 升级 → 转 manual_recall | 触达耗尽 → abandoned |
**唯一交点**:automated_followup 异常 → 产 manual_recall 任务进 PAC。
**exception_escalation**:行为同 manual_recall(都是人触达),仅紧急度 + assignee 角色不同 — 不独立 plan_type,用 `priority + assignee_role + reason_type` 区分即可。
- [ ] PAC v1 聚焦 manual_recall
- [ ] 不做 automated_followup(归宿主或独立模块)
- [ ] exception_escalation 合入 manual_recall,不独立类型
# PAC v1 = 治疗链外的人工召回引擎
---
## 1. automated_followup vs manual_recall
| | automated_followup | manual_recall |
|---|---|---|
| 患者所处 | 链**内**,正常推进 | 链**外** / 未进入 / 断裂 / 沉睡 |
| 谁执行 | 机器(短信 / 企微 / AI) | 人(客服电话 / 企微) |
| 内容 | 标准模板 | Persona + Script 个性化 |
| 目的 | 维持连续性 | **重新拉回**服务链 |
| 客服工时 | 不消耗 | 消耗(有 assignee + 熔断) |
| 异常处理 | 升级 → 转 manual_recall | 触达耗尽 → abandoned |
- [ ] manual_recall
- [ ] automated_followup
# PAC v1 = 治疗链外的人工召回引擎
---
## 0. 治疗链 5 阶段
```mermaid
flowchart LR
S1["① 发现治疗机会<br/>影像 / EMR / 医嘱 / 收费"]
S2["② 进入治疗链<br/>治疗计划 / 收费 / 收款 / 预约 / 接诊"]
S3["③ 治疗执行<br/>处置 / 用药 / EMR"]
S4["④ 术后与复查管理<br/>术后医嘱 / 用药提醒 / 复查计划 / 术后随访"]
S5["⑤ 治疗链闭环<br/>处置完成 + 复查完成 + 无风险信号"]
S1 --> S2 --> S3 --> S4 --> S5
```
---
## 1. automated_followup(自动随访) vs manual_recall(人工召回)
| | automated_followup | manual_recall |
| ---- | --------------------------- | -------------------------------------------------------- |
| 典型场景 | 拔牙术后 D1 注意事项、用药提醒、复查前 N 天提醒 | 检查/影像/病历提示有治疗机会但未进入治疗链、种植 11 月没复查、根管未戴冠超 30 天、咨询未转化、长期沉睡 |
| 患者所处 | 链**内**,正常推进 | 链**外** / 未进入 / 断裂 / 沉睡 |
| 谁执行 | 机器(短信 / 企微自动消息 / 自填反馈) | 人(客服电话 / 人工企微) |
| 内容 | 标准模板 | Persona + Script 个性化 |
| 目的 | 维持连续性 | **重新拉回**服务链 |
| 客服工时 | 不消耗 | 消耗(有 assignee + 熔断) |
| 异常处理 | 升级 → 转 manual_recall | 触达耗尽 → abandoned |
- [ ] manual_recall
- [ ] automated_followup
- [ ] automated_followup 异常(无响应 / 风险答案 / 投诉信号)→ 升级为 manual_recall
# PAC v1 = 治疗链外的人工召回引擎
---
## 0. 治疗链 5 阶段
```mermaid
flowchart LR
S1["① 发现治疗机会<br/>影像 / EMR / 医嘱 / 收费"]
S2["② 进入治疗链<br/>治疗计划形成 / 收费单提交 / 收款完成 / 预约计划形成 / 患者被接诊"]
S3["③ 治疗执行<br/>处置 / 用药 / EMR / 收费 / 退费 / 补费"]
S4["④ 术后与复查管理<br/>术后医嘱 / 用药提醒 / 复查计划 / 术后随访"]
S5["⑤ 治疗链闭环<br/>处置完成 + 复查完成 + 无风险信号"]
S1 --> S2 --> S3 --> S4 --> S5
```
---
## 1. automated_followup(自动随访) vs manual_recall(人工召回)
| | automated_followup | manual_recall |
| ---- | --------------------------- | -------------------------------------------------------- |
| 典型场景 | 拔牙术后 D1 注意事项、用药提醒、复查前 N 天提醒 | 检查/影像/病历提示有治疗机会但未进入治疗链、种植 11 月没复查、根管未戴冠超 30 天、咨询未转化、长期沉睡 |
| 患者所处 | 链**内**,正常推进 | 链**外** / 未进入 / 断裂 / 沉睡 |
| 谁执行 | 机器(短信 / 企微自动消息 / 自填反馈) | 人(客服电话 / 人工企微) |
| 内容 | 标准模板 | Persona + Script 个性化 |
| 目的 | 维持连续性 | **重新拉回**服务链 |
| 客服工时 | 不消耗 | 消耗(有 assignee + 熔断) |
| 异常处理 | 升级 → 转 manual_recall | 触达耗尽 → abandoned |
- [ ] manual_recall
- [ ] automated_followup
- [ ] automated_followup 异常(无响应 / 风险答案 / 投诉信号)→ 升级为 manual_recall
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment