From ed57c3482076d773f6d212d055f680e79ac338df Mon Sep 17 00:00:00 2001 From: "william.wan" Date: Tue, 17 Feb 2026 21:37:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=90=86=E8=B5=94=E5=8F=8A?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E8=AF=B4=E6=98=8E=E6=96=87=E6=A1=A3=EF=BC=88?= =?UTF-8?q?PRD=EF=BC=89=EF=BC=8C=E7=AC=A6=E5=90=88=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=8A=B6=E5=86=B5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PRD/RMO网站需求文档.docx | Bin 43861 -> 0 bytes PRD/RMO网站需求文档.md | 1112 ++++++++++------- .../临床试验保险及RMO模式网站设计思路.md | 0 PRD/{ => 存档}/临床试验责任保险报价流程.md | 70 ++ PRD/{ => 存档}/后端管理页面-SmartOPS.md | 0 PRD/{ => 存档}/网站架构.md | 0 docs/风险管理模式.md | 127 ++ src/components/Breadcrumb.vue | 7 +- src/components/DashboardLayout.vue | 14 +- src/components/Header.css | 14 +- src/components/Header.vue | 1 + src/pages/Contact.tsx | 2 +- src/pages/Home.tsx | 2 +- src/router/index.ts | 4 + src/stores/registration.ts | 118 ++ src/views/Home.vue | 2 +- src/views/Login.vue | 2 +- src/views/Register.vue | 267 ++++ src/views/dashboard/QuoteCompare.vue | 189 ++- .../dashboard/smart-ops/QuoteTaskDetail.vue | 909 ++++++++++---- .../dashboard/smart-ops/UserApprovalList.vue | 408 ++++++ 21 files changed, 2518 insertions(+), 730 deletions(-) delete mode 100644 PRD/RMO网站需求文档.docx rename PRD/{ => 存档}/临床试验保险及RMO模式网站设计思路.md (100%) rename PRD/{ => 存档}/临床试验责任保险报价流程.md (63%) rename PRD/{ => 存档}/后端管理页面-SmartOPS.md (100%) rename PRD/{ => 存档}/网站架构.md (100%) create mode 100644 docs/风险管理模式.md create mode 100644 src/stores/registration.ts create mode 100644 src/views/Register.vue create mode 100644 src/views/dashboard/smart-ops/UserApprovalList.vue diff --git a/PRD/RMO网站需求文档.docx b/PRD/RMO网站需求文档.docx deleted file mode 100644 index 312e5ff2dd39a6c9cd20e9ab0a348c5838ca7dbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43861 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 上市后质量团队 | -| 保险人 | Insurer | - 保司核保人员 | -| 服务方 | TPA | - 临研安/华泰经纪 | +### 1.4 用户需求说明(URS) + +按不同用户角色,列出其核心需求: + +#### 1.4.1 投保人(申办者、持有人) + +| 序号 | 需求类别 | 需求描述 | +|------|----------|----------| +| URS-P01 | 信息浏览 | 了解RMO模式、临床试验保险与保证方案、各方风险职责、法规指南 | +| URS-P02 | 报价申请 | 提交PV报价、临床试验保险报价、产品责任保险报价申请 | +| URS-P03 | 报价对比 | 查看各保司报价结果,按项目、方案多维度对比,便于选定 | +| URS-P04 | 项目管理 | 查看项目列表、项目明细,掌握承保状态与保障信息 | +| URS-P05 | 理赔服务 | 申请理赔,查看理赔进度及评估结果 | +| URS-P06 | 智能工具 | 使用保费测算、ICF智能修改、方案风险评分、方案风险评估、药安查等工具 | +| URS-P07 | 学习支持 | 访问培训材料、实践指南、常见问题,申请方案介绍与培训支持 | +| URS-P08 | 理赔管理 | 对项目中的理赔情况进行全流程管理:理赔申请(关联项目)、进度查询、结案总结;与 URS-P04 项目管理联动,从项目列表/项目明细发起理赔 | + +**理赔功能说明**(URS-P04 + URS-P05 + URS-P08):投保人从**项目**发起理赔申请;材料发送至 Smart-OPS,服务方整理形成标准理赔材料后发送保司,保司评价给出结论,服务方沟通达成一致;详见本文档「3.1.3.1 理赔总体流程」及「2.4.7 理赔功能」。 + + +#### 1.4.2 保险人(保司核保人员) + +| 序号 | 需求类别 | 需求描述 | +|------|----------|----------| +| URS-I01 | 询价管理 | 查看待处理询价列表,查看询价明细及项目详情 | +| URS-I02 | 报价处理 | 接收询价、评估风险、提交报价 | +| URS-I03 | 理赔管理 | 查看理赔申请,处理理赔评估 | +| URS-I04 | 智能工具 | 使用保费测算、方案风险评估、药安查等辅助评估 | +| URS-I05 | 信息浏览 | 了解RMO模式、保险与保证方案、法规与流程要求 | + +#### 1.4.3 服务方(临研安/华泰经纪) + +| 序号 | 需求类别 | 需求描述 | +|------|----------|----------| +| URS-T01 | 报价任务管理 | 管理报价任务列表,创建、跟踪报价任务全流程 | +| URS-T02 | 保司询价 | 发送询价至各保司,接收保司邮件回复至 RMO@vdano.com | +| URS-T03 | 报价整理 | 整理各保司报价,审核后回显给投保人 | +| URS-T04 | 智能工具 | 使用保费测算、方案风险评估、药安查等辅助工作 | +| URS-T05 | 工作台 | 查看待处理任务、统计数据,快捷进入报价任务与项目 | + +#### 1.4.4 访客(免登录用户,含CXO、受试者等) + +| 序号 | 需求类别 | 需求描述 | +|------|----------|----------| +| URS-G01 | 首页浏览 | 了解RMO价值主张、核心能力、知识资源入口 | +| URS-G02 | 风险职责 | 了解申办者、持有人、研究中心、CXO、受试者各方职责 | +| URS-G03 | 解决方案 | 了解药物警戒、临床保险、产品保险方案与保证设计 | +| URS-G04 | 知识资源 | 浏览PV知识、保险知识、法规指南、常见问题、学习中心 | +| URS-G05 | 临床试验 | 了解临床试验保险方案、保证方案、保险保证 | +| URS-G06 | 资源中心 | 查阅法律法规、实践指南、培训材料、常见问题 | +| URS-G07 | 联系我们 | 获取联系与沟通渠道 | +| URS-G08 | 登录入口 | 通过登录进入报价、项目管理等需权限功能 | ## 二、网站架构与页面结构 @@ -42,7 +91,7 @@ ### 2.1 整体架构 网站分为**免登录浏览区**和**登录后系统区**两部分: -#### 2.1.1 免登录浏览区(已实现) +#### 2.1.1 免登录浏览区 ``` 首页(免登录) ├── 首页 @@ -54,7 +103,9 @@ │ ├── 关于RMO(下拉) │ ├── RMO概述(/about/overview) -│ ├── 合作保司、专家经纪、第三方机构 +│ │ ├── 合作保司 +│ │ ├── 专家经纪 +│ │ └── 第三方机构 │ └── 风险职责 │ ├── 风险职责总览(/concern) │ ├── 申办者职责(/sponsor) @@ -64,37 +115,60 @@ │ └── CXO职责(/service-provider) │ ├── 解决方案(下拉) -│ ├── 药物警戒:PV服务、AI工具 -│ ├── 临床保险:保险方案(/rmo-mode/insurance)、保证设计(/rmo-mode/guarantee) -│ └── 产品保险:保险方案、保证设计(/post-market/*) -│ +│ ├── 药物警戒 +│ | ├── PV服务 +│ | └── AI工具 +│ ├── 临床保险 +│ │ ├── 保险方案 +│ │ └── 保证方案 +│ └── 产品保险 +│ ├── 保险方案 +│ └── 保证方案 ├── 知识资源(下拉) -│ ├── PV知识(法规指南、AI应用) -│ ├── 保险知识(基础知识、国外比较、条款标准) -│ ├── 常见问题(/faq,含职责逻辑、保障范围、PV与保险) -│ └── 学习中心(案例学习、培训视频、考试中心) -│ -├── 临床试验(/rmo-mode) -│ ├── 临床试验模块首页 -│ ├── 保险方案(含「获取报价」入口,跳转项目报价页) -│ ├── 保证方案 -│ └── 保险保证 -│ -├── 上市应用(/post-market) -├── 海外风险(/overseas) -│ -├── 资源中心(/system-management) -│ ├── 资源中心首页 -│ ├── 法律法规(/laws) -│ ├── 实践指南 -│ ├── 培训材料 -│ └── 常见问题 -│ +│ ├── PV知识 +| | ├── 法规指南 +│ | └── AI应用 +│ ├── 保险知识 +| | ├── 基础知识) +│ | ├── 国外比较 +│ | └── 条款标准 +│ ├── 常见问题 +│ | ├── 职责逻辑 +│ | ├── 保障范围 +│ | └── PV与保险 +│ └── 学习中心 +│ ├── 案例学习 +│ ├── 培训视频 +│ └── 考试中心 ├── 联系我们(/contact) └── 登录(右上角,/login) ``` -### 2.1.2 登录后系统区(已实现) -登录后使用 DashboardLayout,顶部保留首页、风险职责、临床试验、上市应用、海外风险、资源中心等导航入口;侧边栏根据角色显示相应菜单。用户由管理员创建账号,无需自助注册。 +#### 2.1.2 登录后系统区 +登录后使用 DashboardLayout, +顶部保留首页、关于RMO、解决方案、资源中心等导航入口; +侧边栏根据角色显示相应菜单; +#### 2.1.2.1 用户注册与审批流程 + +1. **组织选择与注册入口** + - 用户在注册页面,通过下拉列表选择其所在公司/组织(组织列表由平台提供,并可根据需要增补)。 + - 选择组织后,方可进入下一步注册。 + +2. **个人信息填写** + - 用户填写必要个人信息,包括:姓名、手机号、邮箱、职位、部门等。 + - 可选上传身份证、工作证明等。 + - 验证邮箱/手机号唯一性,避免重复注册。 + +3. **注册信息提交与审批流程** + - 用户提交注册后,注册信息(包含个人信息及所选组织)自动同步至 Smart-OPS 系统的待审批列表。 + - 平台管理员在 Smart-OPS 后台查看、审批注册申请(支持通过、驳回、备注原因)。 + - 审批通过后用户激活账号并获取登录权限,若驳回则邮件通知用户填补资料或说明原因。 + - 支持管理员手动添加或编辑组织成员。 + +4. **相关说明** + - 支持注册申请进度查询及提醒(如注册后邮件/短信通知申请已受理、进度变更等)。 + - 支持组织与角色审核分级,部分组织可指定本组织管理员进行初步审核。 + - 所有注册与审批操作有日志可追溯,保障数据合规与操作安全。 + ``` 登录后系统(需权限验证,已实现) ├── 工作台(/dashboard) @@ -105,6 +179,9 @@ ├── 项目报价(需权限:投保人,/dashboard/project-quotes) │ └── PV报价、临床试验保险报价、产品责任保险报价(分表单提交) │ +├── 报价对比(需权限:投保人,/dashboard/quote-compare) +│ └── 各保司报价结果汇总对比 +│ ├── 项目列表(需权限:投保人,/dashboard/projects) │ ├── 项目列表 │ └── 项目明细(/dashboard/projects/:id) @@ -112,26 +189,72 @@ ├── 询价列表(需权限:保险人,/dashboard/inquiries) │ └── 询价列表、询价明细(/dashboard/inquiries/:id) │ +├── Samrt-OPS +│ ├── 保险报价 Smart-OPS(需权限:服务方,/dashboard/smart-ops/quote-tasks) +│ ├── 报价任务列表、报价任务明细(/dashboard/smart-ops/quote-tasks/:id) +│ └── 理赔评估处理 +│ ├── 理赔进度(需权限:投保人、保险人,/dashboard/claims) -│ └── 理赔评估列表、理赔详情(/dashboard/claims/:id) +│ ├── 理赔列表、理赔详情(/dashboard/claims/:id) +│ └── 理赔申请(投保人,/dashboard/claims/apply,关联项目) │ └── 智能工具(/dashboard/tools) - ├── 保费测算工具(所有登录用户可见) ├── ICF智能修改(需权限:投保人) ├── 方案风险评分(需权限:投保人) ├── 方案风险评估(所有登录用户可见,AI 评估方案风险) └── 药安查(所有登录用户可见,药物安全数据查询) ``` + +#### 2.1.3 功能模块示意图 + +```mermaid +flowchart TB + subgraph 免登录浏览区["免登录浏览区"] + A1[首页] + A2[关于RMO] + A2a[RMO概述 / 合作保司 / 风险职责] + A3[解决方案] + A3a[药物警戒 / 临床保险 / 产品保险] + A4[知识资源] + A4a[PV知识 / 保险知识 / 常见问题 / 学习中心] + A5[临床试验] + A5a[保险方案 / 保证方案 / 保险保证] + A6[上市应用 / 海外风险] + A7[资源中心] + A8[联系我们] + end + + subgraph 登录后系统区["登录后系统区(需登录)"] + B1[工作台] + B2[项目报价] + B3[报价对比] + B4[项目列表] + B5[询价列表] + B6[保险报价 Smart-OPS] + B7[理赔进度] + B8[智能工具] + end + + subgraph 角色权限["角色与模块对应"] + P1[投保人: 工作台 项目报价 报价对比 项目列表 理赔进度 智能工具] + P2[保险人: 工作台 询价列表 理赔进度 智能工具] + P3[服务方: 工作台 保险报价 Smart-OPS 智能工具] + end + + 免登录浏览区 --> 登录后系统区 + 登录后系统区 --> 角色权限 +``` + ### 2.2 路由与页面结构 -#### 2.2.0 路由架构说明 +#### 2.2.1 路由架构说明 - **免登录浏览区路由**:在 `router/index.ts` 中定义,使用 `Layout` 组件包裹(Header + Footer + Breadcrumb) - **登录后系统路由**:所有 `/dashboard/*` 路由使用 `ProtectedRoute` 包裹,内层使用 `DashboardLayout`(侧边栏 + 主内容区) - **路由守卫**:`router.beforeEach` 检查登录状态,未登录访问 `/dashboard` 重定向至 `/login` 并携带 `from` 查询参数 ### 2.3 核心页面详细需求 -#### 2.2.1 首页(已实现) +#### 2.3.1 首页 **核心元素:** - **Hero 区域**(全屏滚动) - 标题:赋能生命科学风险管理 @@ -149,7 +272,7 @@ - 全屏分节滚动,带指示点导航 - 响应式设计,适配不同屏幕尺寸 -#### 2.2.2 临床试验页面(原RMO模式,已实现) +#### 2.3.2 临床试验页面(原RMO模式) **路由结构:** - `/rmo-mode`:临床试验模块首页(RmoModeOverview) - `/rmo-mode/insurance`:保险方案页面 @@ -158,13 +281,13 @@ **内容模块:** -1. **保险方案页面**(已实现) +1. **保险方案页面** - **获取报价入口**:页面内提供「获取报价」「前往报价页面」按钮;未登录点击引导登录,已登录跳转 `/dashboard/project-quotes` - 基础保障、全面保障、保险条款标准核心内容 - 保险服务内容:保险合同审查、理赔审查、保险条款修订、理赔规则制定、条款标准制定 - 服务供应商展示(保险公司、经纪公司 logo) -2. **保证方案页面**(已实现,导航中称为「保证设计」) +2. **保证方案页面** - 保证基金的基本逻辑(图示) - 保证基金管理形式比较(表格) - **自保(专项风险管理基金)** @@ -182,12 +305,12 @@ - 服务内容:联系、安抚、安排就医、沟通诉求、沟通合理预期 - 服务优势 -3. **保险保证页面**(已实现) +3. **保险保证页面** - 保险与保证方案的结合 - 综合保障机制 - 服务流程说明 -#### 2.2.3 风险职责(原"各方关注",已实现) +#### 2.3.3 风险职责 **路由结构:** - `/concern`:风险职责总览(RiskDutiesOverview) - `/sponsor`:申办者职责 @@ -198,100 +321,77 @@ **内容需求:** -##### 2.2.3.1 风险职责总览(已实现) +##### 2.3.3.1 风险职责总览 - 模块首页,展示各方职责入口卡片 - 包含:申办者职责、持有人职责、受试者专区、研究中心、CXO职责 -##### 2.2.3.2 申办者职责(已实现) +##### 2.3.3.2 申办者职责 - 风险管理体系说明 - RMO模式解决方案 - 操作流程说明 -##### 2.2.3.3 持有人职责(已实现) +##### 2.3.3.3 持有人职责 - 持有人责任说明 - 上市后药物安全责任 -##### 2.2.3.4 研究中心(已实现) +##### 2.3.3.4 研究中心 - 试验机构关注要点 - 研究者职责 - 伦理委员会职责 -##### 2.2.3.5 受试者专区(已实现) +##### 2.3.3.5 受试者专区 - 临床试验介绍 - 受试者权益保障 - 损害救济说明 -##### 2.2.3.6 CXO职责(已实现) +##### 2.3.3.6 CXO职责 - CRO支持 - CDMO支持 - SMO支持 -#### 2.2.4 资源中心(原"体系管理",已实现) -**路由结构:** -- `/system-management`:资源中心首页(ResourceCenterOverview) -- `/system-management/laws`:法律法规 -- `/system-management/practice-guide`:实践指南 -- `/system-management/training`:培训材料 -- `/system-management/faq` 或 `/faq`:常见问题 +#### 2.3.4 资源中心 +- **路由**:`/system-management`、`/system-management/laws`、`/system-management/practice-guide`、`/system-management/training`、`/system-management/faq` +- **内容**:法律法规、实践指南、培训材料、常见问题 -**内容模块:** - -1. **法律法规**(已实现) - - 临床试验与风险管理相关法律法规 - -2. **实践指南**(已实现) - - 操作指南文档 - - 最佳实践案例 - - 流程规范 - -3. **培训材料**(已实现) - - 培训视频 - - 培训文档 - - 培训课程 - -4. **常见问题**(已实现) - - FAQ列表 - - 问题分类 - - 搜索功能(待实现) - -#### 2.2.5 上市应用(已实现) +#### 2.3.5 上市应用 - **路由**:`/post-market`、`/post-market/insurance`、`/post-market/guarantee` -- **内容**:药品上市后风险管理与药物警戒的保险与保障方案(当前为建设中占位页) +- **内容**:药品上市后风险管理与药物警戒的保险与保障方案(建设中) -#### 2.2.6 海外风险(已实现) +#### 2.3.6 海外风险 - **路由**:`/overseas` -- **内容**:跨境临床试验与海外市场的风险管理保险与保障(当前为建设中占位页) +- **内容**:跨境临床试验与海外市场的风险管理保险与保障(建设中) -#### 2.2.7 登录页面(已实现) +#### 2.3.7 登录页面 - **路由**:`/login` -- **功能**:用户名/邮箱 + 密码登录表单;测试账号:admin、policyholder、insurer(密码:123456) +- **功能**:用户名/邮箱 + 密码登录表单;测试账号:admin、policyholder、insurer、tpa(密码:123456) - **登录逻辑**:登录成功后跳转到工作台(`/dashboard`);支持 `from` 查询参数回跳 - **说明**:用户由管理员创建,无自助注册;记住我、忘记密码为 UI 占位 -### 2.3 登录后系统详细需求(已实现) +### 2.4 登录后系统详细需求 -#### 2.3.1 系统架构(已实现) +#### 2.4.1 系统架构 - **布局**:侧边栏导航 + 主内容区(DashboardLayout)✅ - **顶部导航**:登录后仍可访问首页、风险职责、临床试验、上市应用、海外风险、资源中心 - **侧边栏导航结构**(根据角色动态显示): - 工作台 - - 项目报价(需权限:投保人,`/dashboard/project-quotes`) - - 项目列表(需权限:投保人) - - 询价列表(需权限:保险人) - - 理赔进度(需权限:投保人、保险人) + - 项目报价(投保人,`/dashboard/project-quotes`) + - 报价对比(投保人,`/dashboard/quote-compare`) + - 项目列表(投保人) + - 询价列表(保险人) + - 保险报价 Smart-OPS(服务方,`/dashboard/smart-ops/quote-tasks`) + - 理赔进度(投保人、保险人) - 智能工具 - - 保费测算工具(所有用户) - ICF智能修改(仅投保人) - 方案风险评分(仅投保人) - 方案风险评估(所有用户) - 药安查(所有用户) -#### 2.3.2 工作台页面(Dashboard) +#### 2.4.2 工作台页面(Dashboard) **路径**:`/dashboard` **权限说明**:所有登录用户可见,但内容根据角色不同 -##### 2.3.2.1 投保人工作台 +##### 2.4.2.1 投保人工作台 **页面内容:** 1. **数据统计卡片** - **询价项目**:显示询价项目数量,点击后进入询价项目列表 @@ -305,12 +405,12 @@ - 点击可跳转到对应详情页 3. **快捷方式**(页面右上角) - - **获取报价**:打开报价申请流程(弹窗或报价页面,见 2.3.2.3),与首页、保险方案页入口一致 + - **获取报价**:打开报价申请流程(弹窗或报价页面,见 2.4.2.3),与首页、保险方案页入口一致 - **申请理赔**:跳转到理赔申请页面(需关联项目) - **方案介绍**:申请设计并介绍方案 - **培训支持**:申请培训支持 -##### 2.3.2.2 保险人工作台 +##### 2.4.2.2 保险人工作台 **页面内容:** 1. **数据统计卡片** - **询价项目**:显示询价项目数量,点击后进入询价项目列表 @@ -324,22 +424,32 @@ - 点击可跳转到对应详情页 - 其他角色:根据权限显示相应内容 -##### 2.3.2.3 报价申请流程(获取报价)(已实现) +##### 2.4.2.3 报价申请流程(获取报价) **入口**:首页「获取报价」、保险方案页「获取报价」、工作台快捷方式「获取报价」。当前实现为**跳转至项目报价页面** `/dashboard/project-quotes`;未登录时引导先登录。 -**项目报价页面**(`/dashboard/project-quotes`)已实现三种报价类型,以可折叠卡片展示: +**项目报价页面**(`/dashboard/project-quotes`)已实现三种报价类型: 1. **PV报价**:药物警戒服务报价,表单含姓名、邮箱、电话、公司、职位、业务问题、验证码、隐私承诺 -2. **临床试验保险报价**:项目类型、风险等级、保障金额、受试者人数、试验周期、备注等 +2. **临床试验保险报价**:项目方案编号、项目标题、申办者、分期、受试者人数、限额等;详见「3.1.2.1 报价资料」完整字段(支持简洁页/详细页、AI 识别) 3. **产品责任保险报价**:产品类型、风险等级、保障金额、销售区域等 **临床试验保险弹窗流程**(QuoteRequestModal,已实现但当前未接入入口): - 弹窗内含:手动填写/上传项目方案(AI 识别)、项目方案编号/标题/申办者/分期、生成报价(AI)、获取精准报价 -- 与需求 3.3.2.1 流程一致,可将入口改为打开弹窗以保持上下文 +- 与需求 3.1.2.2 流程一致,可将入口改为打开弹窗以保持上下文 **权限**:项目报价页面仅投保人可见;获取报价入口对免登录用户点击时引导登录。 -#### 2.3.3 项目列表页面(ProjectList) +##### 2.4.2.4 报价对比页面(QuoteCompare) +**路径**:`/dashboard/quote-compare` +**权限**:仅投保人可见 +**功能**:各保司报价结果汇总,按项目、方案筛选,多维度对比呈现,便于投保人选定。报价由保司回复至 RMO@vdano.com 后经临研安整理呈现。 + +##### 2.4.2.5 保险报价 Smart-OPS(QuoteTaskList / QuoteTaskDetail) +**路径**:`/dashboard/smart-ops/quote-tasks`、`/dashboard/smart-ops/quote-tasks/:id` +**权限**:仅服务方可见 +**功能**:临研安/华泰经纪工作台,管理报价任务、发送保司询价、整理报价结果。保司回复至 RMO@vdano.com。 + +#### 2.4.3 项目列表页面(ProjectList) **路径**:`/dashboard/projects` **权限说明**:仅投保人可见 @@ -354,10 +464,10 @@ **交互功能:** - 点击"查看明细"跳转到 `/dashboard/projects/:id`(项目明细页) -- 点击"申请理赔"跳转到理赔申请页面(需关联项目ID) +- 点击"申请理赔"跳转到 `/dashboard/claims/apply?projectId=:id`(理赔申请页,预填项目) - 支持搜索、筛选(待实现) -#### 2.3.4 项目明细页面(ProjectDetail) +#### 2.4.4 项目明细页面(ProjectDetail) **路径**:`/dashboard/projects/:id` **权限说明**:仅投保人可见 @@ -383,11 +493,15 @@ - 评估报告(可下载或预览) - 其他相关文档 -4. **操作按钮** - - 查看明细 - - 申请理赔 +4. **理赔记录**(URS-P04、URS-P08) + - 该项目下的理赔列表:理赔编号、出险类型、状态、申请时间 + - 操作:查看详情、申请理赔(新建) -#### 2.3.5 询价列表页面(InquiryList) +5. **操作按钮** + - 申请理赔(跳转 `/dashboard/claims/apply?projectId=:id`) + - 查看理赔详情(跳转 `/dashboard/claims/:claimId`) + +#### 2.4.5 询价列表页面(InquiryList) **路径**:`/dashboard/inquiries` **权限说明**:仅保险人可见 @@ -405,7 +519,7 @@ - 点击"处理报价"跳转到报价处理页面(需关联项目ID) - 支持搜索、筛选(待实现) -#### 2.3.6 询价明细页面(InquiryDetail) +#### 2.4.6 询价明细页面(InquiryDetail) **路径**:`/dashboard/inquiries/:id` **权限说明**:仅保险人可见 @@ -428,46 +542,73 @@ - 查看明细 - 处理报价 -#### 2.3.7 理赔进度页面(ClaimProgress) +#### 2.4.7 理赔功能(ClaimProgress / ClaimDetail / ClaimApply) + +**需求依据**:URS-P04 项目管理、URS-P05 理赔服务、URS-P08 理赔管理。理赔与**项目**强关联,从项目发起、按项目跟踪。 + +##### 2.4.7.0 理赔入口与项目关联 +**入口**: +- **项目列表**(`/dashboard/projects`):每行「申请理赔」→ 带项目 ID 跳转理赔申请页 +- **项目明细**(`/dashboard/projects/:id`):页内「申请理赔」按钮;展示**该项目下的理赔记录**列表(理赔编号、状态、申请时间、操作) +- **工作台**:快捷方式「申请理赔」→ 需先选择项目,再进入申请页 +- **理赔进度页**(`/dashboard/claims`):「申请理赔」→ 选择项目后进入申请页 + +**路由**: +- `/dashboard/claims`:理赔列表/进度页 +- `/dashboard/claims/apply`:理赔申请页(支持 `?projectId=xxx` 预填项目) +- `/dashboard/claims/:id`:理赔详情页 + +##### 2.4.7.1 理赔申请页面(ClaimApply) +**路径**:`/dashboard/claims/apply` + +**权限**:仅投保人 + +**表单内容**(原始理赔信息,详见 3.1.3.2): + +| 分类 | 字段 | 说明 | +|------|------|------| +| **关联** | 关联项目 | 从已承保项目中选择(必填,或由入口带入 projectId) | +| **基本信息** | 报案来源、报案人、联系方式 | 报案人信息 | +| | 信息提供人 | 医院端(如 CRC)及申办者端(如 PV)联系人、电话、邮箱 | +| **项目/受试者** | 方案全称、方案编号、产品名称、研究中心、中心编号 | 项目信息 | +| | 受试者编号、姓名缩写、年龄/性别、入组日期、退出日期、受试者状态 | 受试者信息 | +| **事件** | 事件名称、事件结局、出险时间 | 如 AE/SAE 名称、CTCAE 等级 | +| | 研究者获知时间、上报申办者时间、是否报告伦理 | 时间线 | +| | 是否方案偏离、研究者相关性评价、申办者相关性评价 | 相关性判断 | +| **费用** | 预估金额、损失/费用描述 | 可选 | +| **文件** | 证明材料 | 上传试验方案、ICF、AE/SAE 报告、治疗记录、费用票据等(支持多文件、分次补充) | + +**页面模式**:支持**简洁版**(核心字段 + 文件上传)与**详细版**(完整 C.1-C.4 字段);可切换。提交后材料发送至 Smart-OPS,创建理赔任务,跳转至理赔详情页。 + +##### 2.4.7.2 投保人理赔进度 **路径**:`/dashboard/claims` -**权限说明**:投保人、保险人可见 +**列表字段**: +- 理赔编号 +- 关联项目(项目编号、试验题目) +- 出险类型、出险时间 +- 理赔状态(待提交、待收集资料、资料整理中、待发送保司、保司评估中、待沟通、已结案、已拒赔) +- 申请时间、更新时间 +- 操作:查看详情、补充资料(待补充时) -##### 2.3.7.1 投保人理赔进度 -**列表字段:** -- 项目编号 -- 试验题目 -- 保障范围 -- 承保公司 -- 承保状态 +**理赔详情页**(`/dashboard/claims/:id`)**投保人视图**: +1. **基本信息**:理赔编号、关联项目、事件名称、出险时间、申请时间 +2. **申请内容**:原始理赔信息(C.1-C.4)、损失描述、预估金额、已上传证明 +3. **进度跟踪**:当前状态、服务方/保司意见、需补充项(若有) +4. **结案总结**(已结案时):赔付金额、医药费用理算摘要、结案说明、结案时间 -**交互功能:** -- 点击"查看明细"跳转到 `/dashboard/claims/:id`(理赔评估详情页) -- 点击"申请理赔"跳转到理赔申请页面(需关联项目ID) +##### 2.4.7.3 保险人理赔进度 +**路径**:`/dashboard/claims` -**理赔评估明细页内容:** -- 详细信息 -- 相关文档 -- 操作按钮:查看明细、申请理赔 +**列表字段**:同投保人,另增承保公司、保障范围等 -##### 2.3.7.2 保险人理赔进度 -**列表字段:** -- 项目编号 -- 试验题目 -- 保障范围 -- 承保公司 -- 承保状态 +**理赔详情页**(`/dashboard/claims/:id`)**保险人视图**: +1. **申请信息**:同投保人视图 +2. **标准理赔材料**(服务方整理后):材料完整性(A.1)、方案变更(A.2)、受试者范围(A.3)、方案违背(A.4)、SUSAR 判断(A.5)、事件原因(A.6)、综合结论(A.7)、医药费用理算 +3. **审核操作**:通过、需补充资料、拒赔;填写审核意见 +4. **结案操作**:录入赔付金额、结案说明,完成结案 -**交互功能:** -- 点击"查看明细"跳转到 `/dashboard/claims/:id`(理赔评估详情页) -- 点击"处理理赔"跳转到理赔处理页面(需关联项目ID) - -**理赔评估明细页内容:** -- 详细信息 -- 相关文档 -- 操作按钮:查看明细、处理理赔 - -#### 2.3.8 智能工具页面(Tools)(已实现) +#### 2.4.8 智能工具页面(Tools)(已实现) **路径**:`/dashboard/tools` **权限说明**:所有登录用户可见 @@ -480,7 +621,7 @@ - 方案风险评估(所有用户,AI 评估方案信息不足风险与偏倚风险) - 药安查(所有用户,药物安全数据查询、不良反应与警戒信息检索) -##### 2.3.8.1 保费测算工具(PremiumCalculator) +##### 2.4.8.1 保费测算工具(PremiumCalculator) **路径**:`/dashboard/tools/premium-calculator` **权限说明**:所有登录用户可见 @@ -494,7 +635,7 @@ - 其他参数 - 输出:保费计算结果、计算依据说明 -##### 2.3.8.2 ICF智能修改(ICFEditor) +##### 2.4.8.2 ICF智能修改(ICFEditor) **路径**:`/dashboard/tools/icf-editor` **功能**: @@ -504,7 +645,7 @@ - 提供修改建议 - 导出修改后的文档 -##### 2.3.8.3 方案风险评分(RiskScoring) +##### 2.4.8.3 方案风险评分(RiskScoring) **路径**:`/dashboard/tools/risk-scoring` **功能**: @@ -513,165 +654,30 @@ - 自动计算风险评分 - 显示评分结果、风险等级、改进建议 -##### 2.3.8.4 方案风险评估(ProtocolRiskAssessment)(已实现) +##### 2.4.8.4 方案风险评估(ProtocolRiskAssessment)(已实现) **路径**:`/dashboard/tools/protocol-risk` **功能**:借助 AI 评估方案信息不足风险与偏倚风险 -##### 2.3.8.5 药安查(DrugSafetyQuery)(已实现) +##### 2.4.8.5 药安查(DrugSafetyQuery)(已实现) **路径**:`/dashboard/tools/drug-safety` **功能**:药物安全数据查询,不良反应与警戒信息检索 --- -## 三、核心业务逻辑说明 +## 三、保险报价与理赔业务逻辑 -### 3.1 一站式临床试验风险管理模式 +### 3.1 风险评估、核保与理赔流程 -#### 3.1.1 参与主体 -- **临床试验风险主体**:申办者(研究机构及研究者协助) -- **参与临床试验的主体**:申办者、研究者、研究机构工作人员、CRO、CRC、受试者 - -#### 3.1.2 临床试验风险分类 -**临床试验风险类型**:SUSAR、ADR(SADR)、AE(SAE)、与试验相关非医疗一切风险 - -**风险逻辑:** - -**从临床试验药物角度:** -1. **为证明与药物相关**:AE(不良事件) -2. **已证明与药物相关**:ADR(药物不良反应) - - **SADR(严重药物不良反应)**:严重的ADR - - ADR写入IB的RSI(参考安全信息) -3. **新发现的严重不良反应**:SUSAR(可疑且非预期的严重不良反应),需及时报告 -4. **未写入RSI的严重不良反应属于SUSAR** - -**从临床试验操作角度:** -1. 临床试验方案合理性 -2. 临床试验方案操作是否符合规定 -3. 医疗行为是否合理 -4. 临床试验组织管理是否合理 - -**其他与临床试验有相关性的内容:** -1. 行为原则 -2. 心理原因 -3. 其他 - -#### 3.1.3 赔偿/补偿的内容及基本原则 -1. **最大范围医疗报销原则**(与试验相关的一切风险)发生的必要且合理的医疗支出100%报销。(高频、时效、便捷、最好无垫付) -2. **身故、伤残赔偿金**(低频) -3. **无过错责任补偿金**(低频) -4. **精算损失赔偿金**(低频) - -#### 3.1.4 风险与保险条款的匹配性问题 - -**首要风险:** -- 投保人最关注的厌恶的风险有哪些: - - SUSAR(影响试验走向) - - SAE(经济成本、影响试验进展) - - 非医疗类恶性事件(影响试验进展) -- **特点**:此类风险发生的意愿程度,投保人与保险人完全一致。通过高杠杆方式保险解决 - -**次要风险:** -- AE与试验相关风险 -- **特点**:控制该类风险并非投保人第一关注点(本质上是道德风险),因此容易产生风险敞口,因此保险人在评估风险杠杆承担存在压力和不确定性。 -- **解决方案**:"自保"+"风险减量服务"+"外溢风险管理服务" - -#### 3.1.5 风险管理逻辑模型 - -**基于以上背景,拟提出的风险管理逻辑模型:** -1. **首要风险**:通过高杠杆方式保险解决 -2. **次要风险**:"自保"+"风险减量服务"+"外溢风险管理服务"解决 - -**具体解决方式:** - -**首要风险的责任:** -- SUSAR、SAE造成的身故、残疾赔偿金 -- **强调**:责任明确、金额较大、证据链清晰 -- **方式**:用保险进行风险转移 - -**次要风险的责任:** -- 非SUSAR所发生的医疗费用 -- **方式**:用RMO模式解决 - -### 3.2 RMO模式详细说明 - -#### 3.2.1 模式定位 -RMO模式(也可以换个名字,避免和我们全委托投保的选择冲突) - -**定位**:为投保人解决三件事: -1. "自保"代位执行 -2. 风险减量服务 -3. 外溢风险管理服务 - -#### 3.2.2 合作机构 -- 华泰保险经纪 -- 临研安 -- 其他合作方(X) - -#### 3.2.3 具体操作流程 - -**第一步:风险评估与投保** -- 华泰经纪协助申办者基于项目复杂度和风险度厘清首要风险与次要风险 -- 通过华泰保险经纪完成首要风险投保 - -**第二步:专项风险管理基金设立** -- 申办者根据项目的大小、历史或行业经验,向华泰经纪支付风险管理费采购健康医疗服务(例如一个项目3-5万) -- 双方约定健康医疗服务费的使用范围、对象、执行和审批流程、额度等要素 -- 该费用作为申办者的专项风险管理基金,实行多退少补原则 - -**第三步:费用管理** -- 健康医疗服务成本以医院出具的医疗费用清单为结算凭证 -- **风险管理费采用两种模式:** - - **比例费用**:整体费用的12-15% - - 举例:申办者支付5万元,其中6千元为风险管理费,4.4万计入专项风险管理基金 - - **案件费用**:出现大额、疑难医疗行为与受试者提出额外医疗行为时,针对每个案件收取服务费用(费用结算固定值或者减损比例值) - -**第四步:医疗直付(逐步实现)** -- 华泰力争逐步做到与医院实现直付 -- 华泰长期为日本多家保险公司提供此类服务,日本人在中国的转诊、医疗推荐、费用结算都是华泰完成,此业务已开展近30年 -- 具有外币结算资质 -- 华泰逐步实现和各家医院打通直付,具体额度、时效、范围等还需要再讨论 - -**第五步:出险处理流程** -1. 受试者发生AE或其他医疗需求 -2. 医院第一时间通知华泰 -3. 华泰正常情况下24小时内与医院、受试者沟通,并通知申办者 - - 特殊情况处理:如遇特殊情况,例如受试者非集中、境外、无法联系、不可抗力等,应急处理模式 -4. 安抚受试者、了解医院拟采取的医疗方式及成本 -5. 合理且必要的医疗行为及时安排并承诺受试者救治 -6. 评估申办者专项风险管理基金的余额 -7. 将以上信息报送申办者 -8. 申办者同意使用该基金后,华泰与医院进行结算 -9. 不足部分需申办者补齐,并提供一定费用的余额,以便下次使用 - -**注意事项**:如果真采取这个模式,对申办者内部费用管理可能也是一个挑战,例如康方这么多临床总监和项目估计费用预算都是独立的,康方是设立一个账户还是多个,各个总监的费用应该不能交叉吧,或者康方设立一个总账户类似20w只是应急性共用,总账户垫付后,各个项目在一定时效内及时把垫付的钱补上。 - -**第六步:风险减量服务** -- 华泰经纪与临研安针对临床试验链条的各个环节进行风险点检查 -- 人员培训 -- 方案完善建议 - -**第七步:外溢风险管理服务** -- 针对受试者出险后的全流程管理 -- 联系、安抚、安排就医、沟通诉求、沟通合理预期 - -#### 3.2.4 华泰与临研安的合作模式 -1. 华泰将收到的资金统一进行管理 -2. 临研安在执行中根据申办者的答复从华泰收到相关费用,并含一定比例服务费(8-10%) -3. 华泰逐步实现和各家医院打通直付,具体额度、时效、范围等需要再讨论 -4. 需要临研安经营范围内包括健康服务采购(医疗服务采购不知道是否属于特许经营,只要不涉及具体医疗服务就ok,但是这部分的经营性质、发票等都要考虑细一点) - -### 3.3 风险评估、核保与理赔流程 - -#### 3.3.1 风险评估 +#### 3.1.1 风险评估 - **AI+人工**:大数据、审查风险点 - **量化**:各类风险(试验药物+试验流程)频度和程度,如不良反应发生率和救治费用 - **保险责任设置**:SUSAR(主险必保);其他AE(附加险可保或自保) - **保单条件设置**:如赔偿限额、免赔额及其设置依据 - **风险减量服务**:合同管理等 -#### 3.3.2 核保 +#### 3.1.2 核保 - **完全授权** - **主动报价+审核** - **被动报价** @@ -679,7 +685,28 @@ RMO模式(也可以换个名字,避免和我们全委托投保的选择冲 - 保险条款优化 - 特殊需求:再保人、共保体 -#### 3.3.2.1 投保人申请报价流程 +#### 3.1.2.1 临床试验责任保险报价概述 + +**报价目的:** +- 收集保险报价必须的信息; +- 根据报价用途(制定项目预算、申请试验开展)确定后续跟进频率; +- 第一时间占据所有保司的报价渠道,规避后续业务冲突; +- 返回保司报价结果,方便投保人对比、选择。 + +**报价流程(简要):** +1. 投保人填写报价资料; +2. 服务方生成保险报价; +3. 服务方发送保险报价到保险公司,进行确认; +4. 根据保司报价,整理形成可对比的报价方式,回复投保人; +5. 投保人如需调整报价,可联系经纪人,线下沟通、调整报价。 + +**系统衔接说明:** +- **回复渠道**:保司报价回复至 RMO@vdano.com; +- **任务跟踪**:每保司报价生成一条任务,系统跟踪每一任务的完成状态; +- **数据归属**:所有报价数据属于申办者,在投保人租户下呈现; +- **API Smart-OPS**:报价信息通过 API 传输到 Smart-OPS 系统,用于后续报价、投保、理赔等流程。 + +#### 3.1.2.2 投保人申请报价流程 投保人从多入口发起「获取报价」,经资料填写/上传、AI 生成报价、系统发邮件至保司、保司邮件回复、系统拉取并审核后,将报价回显到页面。流程如下。 @@ -754,7 +781,89 @@ flowchart TB | 5 | 保司回复 | 保司通过邮件将报价回复至 rmo@vdano.com。 | | 6 | 回收与展示 | 系统从 rmo@vdano.com 提取报价,经临研安审核;审核通过的报价整理后回写到报价页面供投保人查看。 | -#### 3.3.3 理赔 +**报价资料:** + +| 类别 | 字段 | 说明 | +|------|------|------| +| **报价必备** | 项目方案编号、项目标题、投保人名称、申办者名称、受试药物名称、项目分期、试验受试者人数 | 必填 | +| | 报价用途 | 制定项目预算 / 申请试验开展 | +| **方案项**(可重复,每项即一报价方案) | 每人责任限额(万元) | ≤10、15、20、30、≥50;可 AI 推荐 | +| | 累计责任限额、每次事故免赔额、拟投保人数 | 可 AI 推荐;拟投保人数默认为受试者总人数 | + +**申请报价页面:** +- **简洁页**:项目方案文件上传(必填)、知情同意书上传;AI 识别提取必备资料;或手动填写;可跳转详细页。 +- **详细页**:除必备字段外,补充:疾病类型、每受试者试验期限、项目预计时长、质量管理水平、历史理赔赔付情况、受试者类型与健康状况、安全性监测措施、特别要求。 + +**报价记录状态流程:** + +```mermaid +flowchart TB + subgraph 信息收集与AI报价 + A[登录] --> B[填写项目信息] + B --> C[标准报价材料] + C --> D[AI报价] + D --> E[报价任务创建] + E --> F[报价任务] + F --> G[报价] + G --> H[初步评估] + H --> I[太保/大地] + H --> J[其他保司] + I --> K[核保通过] + J --> K + K --> L[正式报价] + end + subgraph 全保司报价 + L --> M[报价任务完成] + M --> N[页面对比呈现] + N --> O[价格确定] + end + subgraph 议价 + O --> P{是否含报价?} + P -->|否| Q[邮件/小程序通知] + Q --> B + P -->|是| R[再次登录] + R --> S[在线议价] + S --> T[主动人工跟进] + end +``` + +**标准报价信息表:** + +| 项目 | 取值来源 | +|------|----------| +| 承保险种 | 保险信息页面的标题 | +| 投保人、被保险人 | 投保人名称、申办者名称 | +| 承保试验、方案号、研究分期 | 项目标题、项目方案编号、项目分期 | +| 受试者人数、保单期限 | 试验受试者人数、项目预计时长 | +| 保单限额、每人责任限额、每次事故免赔额 | 累计/每人限额、免赔额 | +| 特别约定 | 特别要求 | + +#### 3.1.2.3 Smart-OPS 保险报价操作 + +**与 Smart-OPS 的衔接:** +- 收集到的报价信息传输到 Smart-OPS 系统,工作台进行后续报价、投保、理赔等流程; +- 临研安人员登录 Smart-OPS,进行报价;所有报价数据属于申办者,在投保人租户下呈现; +- 临研安在工作台页面处理报价的评估、整理。 + +**报价任务列表**(服务方):投保人、项目编号、项目标题、主险限额、附加险限额、免赔额、保司、报价状态;操作:编辑、查看、发送保司、整理报价。 + +**报价状态**:已创建、初步评估、正式报价、报价完成。报价完成时,报价信息通过接口返回到投保人端报价页面。 + +**数据结构**:项目(Project)→ 报价方案(QuotationScheme)→ 保司报价任务(InsurerQuotationTask)三级结构。方案以限额命名;每方案下有多保司报价任务,任务含报价金额、状态、邮件等。 + +**Smart-OPS 操作功能:** + +| 功能 | 说明 | 入口 | +|------|------|------| +| 生成标准报价信息 | 一键生成标准格式报价表,可导出 Excel/PDF | 报价任务列表、方案详情 | +| 风险评估 | 对方案进行定量/定性风险评估 | 方案详情 | +| 申请报价 | 发起给各保司申请正式报价,支持批量 | 报价任务列表、方案详情 | +| 整理报价 | 归集保司返回报价,生成对比表,可导出 | 方案详情、任务详情 | +| 返回报价 | 将结果返回投保人,同步到项目报价页面 | 方案详情(整理完成后) | + +**功能按钮汇总**:报价任务列表页 [生成标准报价信息] [申请报价] [整理报价];方案详情页 [风险评估] [申请报价] [整理报价] [返回报价];任务详情页 [整理报价] [返回报价]。每操作需形成业务日志,支持审计追踪。 + +#### 3.1.3 理赔业务逻辑 **SUSAR:** - 主险必保 - 抗辩义务+外溢风险管理服务 @@ -769,6 +878,181 @@ flowchart TB **利益冲突**:申办方&保险人;完善保险条款和理赔指引,减少合同纠纷和利益冲突。 +#### 3.1.3.1 网站理赔总体流程(URS-P04、URS-P08) + +理赔流程与报价类似:**投保人在网站申请** → **材料发送至 Smart-OPS** → **服务方人工整理形成标准理赔材料** → **发送至保司** → **保司评价、给出结论** → **服务方在过程中沟通、整理资料,达成各方一致**。 + +```mermaid +flowchart TB + subgraph 投保人["1. 投保人申请"] + A1[项目列表/项目明细/工作台] + A1 --> B[点击「申请理赔」] + B --> C[选择关联项目] + C --> D[填写原始理赔信息] + D --> E[上传证明材料] + E --> F[提交申请] + F --> G[材料发送至 Smart-OPS] + end + + subgraph SmartOPS["2. Smart-OPS 服务方整理"] + G --> H[服务方收到案件] + H --> I[联系医院端/申办者端收集资料] + I --> J[人工整理形成标准理赔材料] + J --> K[理赔评估 A.1-A.7] + K --> L[医药费用理算] + L --> M[发送标准材料至保司] + end + + subgraph 保司["3. 保司评价"] + M --> N[保司收到材料] + N --> O[保司评估、给出结论] + O --> P[结论返回服务方] + end + + subgraph 沟通达成["4. 服务方沟通与结案"] + P --> Q{各方一致?} + Q -->|否| R[服务方协调沟通] + R --> I + Q -->|是| S[达成一致] + S --> T[结案、试算赔偿/补偿] + T --> U[与申请人沟通方案、执行] + end +``` + +**流程说明摘要:** + +| 步骤 | 环节 | 说明 | +|------|------|------| +| 1 | 投保人申请 | 在网站填写原始理赔信息、上传证明材料;申请须**关联项目**(已承保);材料自动发送至 Smart-OPS。 | +| 2 | Smart-OPS 整理 | 服务方联系医院端(CRC 等)、申办者端(PV 团队)收集补充资料;人工整理形成**标准理赔材料**;完成理赔评估(A.1-A.7)、医药费用理算;将标准材料发送至保司。 | +| 3 | 保司评价 | 保司收到材料后评估,给出结论(赔付/拒赔/需补充);结论返回服务方。 | +| 4 | 沟通与结案 | 服务方在过程中沟通、整理资料;未达成一致时继续收集、协调;达成一致后结案,试算赔偿/补偿金额,与申请人(受试者)沟通方案设计与执行。 | + +**理赔状态**:待提交、待收集资料、资料整理中、待发送保司、保司评估中、待沟通、已达成一致、已结案、已拒赔。 + +--- + +#### 3.1.3.2 原始理赔信息收集(投保人申请时填写) + +基于 `ReferenceBook/理赔评估必要信息收集.csv`,投保人在网站申请时填写/上传以下**原始理赔信息**: + +**C.1 保单与理赔申请人**(部分从保司处获得,部分可由系统预填) +| 字段 | 说明 | +|------|------| +| 承保人、保司案件号、保单号 | 关联保单信息 | +| 投保人、保险期限 | 从项目带出 | +| 报案来源、报案人、联系方式 | 报案人信息 | +| 信息提供人 | 医院端岗位(如 CRC)、姓名、联系电话、邮箱;申办者端岗位(如 PV 团队)、姓名、联系电话、邮箱 | + +**C.2 项目与受试者信息**(向医院端信息提供人收集) +| 字段 | 说明 | +|------|------| +| 临床试验方案全称、方案编号/版本号 | 项目信息 | +| 产品名称、产品类型、研发阶段 | | +| 研究中心名称、中心编号 | | +| 受试者编号、受试者姓名缩写、年龄/性别 | 受试者信息 | +| 入组日期、退出日期、受试者当前状态、曾签署几次 ICF | | + +**C.3 事件信息(医院端)** +| 字段 | 说明 | +|------|------| +| 研究者获知事件时间、上报申办者时间 | 时间线 | +| 是否报告伦理、报告伦理时间 | | +| 事件名称、事件结局 | 如 AE/SAE 名称、CTCAE 等级 | +| 是否方案偏离/违背、研究者对相关性评价 | | + +**C.4 事件信息(申办者端)** +| 字段 | 说明 | +|------|------| +| 事件名称、申办者相关性评价 | | +| 预期性、严重性 | | +| 是否报告监管、报告监管时间 | | +| 是否揭盲、揭盲结果 | | + +**C.5 须收集的原始文件**(上传或分多次补充) +- **医院端**:最新版试验方案、中心试验合同、伦理批件、知情同意书、PI 签署的 AE/SAE 报告、事件后治疗记录、治疗费用票据 +- **申办者端**:最新版研究者手册或不良反应列表、SUSAR 报告 PDF、递交监管的 XML(含盲底)、ACK 文件、AOSE 报告 + +> 网站申请页可提供**简洁版**(核心字段 + 文件上传)与**详细版**(完整 C.1-C.4 字段)。服务方通过邮件模板向医院端(CRC)、申办者端(PV)收集补充资料,模板见 ReferenceBook 示例(如:请求试验方案、ICF、AE/SAE 报告、治疗记录、费用票据;或研究者手册、SUSAR 报告、XML、ACK、AOSE 等)。 + +--- + +#### 3.1.3.3 标准理赔信息与评估(Smart-OPS 服务方完成) + +基于 `ReferenceBook/理赔评估.csv`,服务方在 Smart-OPS 中完成**标准理赔评估**,形成可发送保司的材料: + +**A.1 材料完整性评估** +用于评估的材料须收集完成(勾选):投保时试验方案、投保时研究者手册、已签署的 ICF、被保险人与试验机构协议、PI 签署的 SAE 表、申办者评估后 SUSAR、递交监管的 XML、ACK 文件、AE/SAE 治疗过程、AE/SAE 治疗费用。SUSAR 时按表逐项评估;明确非 SUSAR 可跳过部分项。 + +**A.2 方案与 IB 变更情况** +对比投保时方案/IB 与受试者入组时方案/IB:入组标准、排除标准、用药计划、项目执行状态、安全性列表是否存在变更及原因。结论:是否与投保时发生重大变化,现行保单是否有效。 + +**A.3 受试者是否在保单范围** +受试者编号、已入组数量与保单覆盖人数是否匹配,避免超保。 + +**A.4 是否存在严重方案违背** +通过入组标准、用药记录与方案等判断;严重方案违背可能导致不受保障。 + +**A.5 是否 SUSAR** +研究者、申办者、独立评估(必要时)对预期性、相关性、严重性、递交监管及时性、是否受试药物等判断;采信有原由、有支撑、更合理的一方;无法评估时组织 3 位独立专家评估。 + +**A.6 事件原因研究** +研究者判断、同类产品/文献/机理、独立评估;与受试药物/试验流程的相关性。 + +**A.7 综合结论** +是否按主险赔付、按附加险赔付、或拒赔。决定赔偿时,进入 L.1。 + +**L.1 试算赔偿、补偿金额** +与申请人(受试者)沟通方案设计与执行。 + +--- + +#### 3.1.3.4 医药费用理算 + +基于 `ReferenceBook/医药费用理算清单.csv`: + +**费用发票底稿** +| 支出项目 | 日期 | 金额 | 医保金额 | 自费金额 | 不予支持金额 | +|----------|------|------|----------|----------|--------------| +| 医疗、护理、营养、交通等 | 按发票录入 | | | | | + +**预期费用** +| 项目 | 原由 | 金额 | 预估逻辑 | +|------|------|------|----------| + +**总计**:汇总支持金额、不予支持金额。 + +--- + +#### 3.1.3.5 理赔评估结论与方案变更对比 + +基于 `ReferenceBook/理赔评估结论建议.csv`,**方案与 IB 变更**对比表: + +| 维度 | 投保时/入组时 | 受试者入组时 | 差异点 | 评判 | +|------|---------------|--------------|--------|------| +| 入选标准 | | | | | +| 排除标准 | | | | | +| 治疗组别 | | | | | +| 用药方案 | | | | | +| 安全性信息 | | | | | + +用于支持 A.2 方案变更评估及理赔结论建议。 + +--- + +#### 3.1.3.6 Smart-OPS 理赔操作(服务方) + +服务方在 Smart-OPS 中处理理赔案件,流程与报价类似: + +| 功能 | 说明 | +|------|------| +| 接收案件 | 投保人在网站提交的理赔申请及材料自动传入 Smart-OPS;服务方在理赔任务列表查看 | +| 收集补充资料 | 通过邮件模板联系医院端(CRC)、申办者端(PV)收集 C.2-C.5 资料;支持分多次补充 | +| 整理标准材料 | 按 A.1-A.7 完成材料完整性检查、方案变更评估、受试者范围、方案违背、SUSAR 判断、事件原因研究、综合结论;填写医药费用理算清单 | +| 发送保司 | 将标准理赔材料发送至保司,请求评价 | +| 接收保司结论 | 保司结论返回后,服务方查看;未达成一致时协调沟通、补充材料 | +| 结案与试算 | 达成一致后结案,试算赔偿/补偿金额,与申请人(受试者)沟通方案设计与执行 | + --- ## 四、功能需求 @@ -781,7 +1065,7 @@ flowchart TB #### 4.1.2 登录后系统(已实现) - **登录方式**:用户名/邮箱 + 密码登录 ✅ -- **用户角色**:投保人、保险人(AuthStore 中 user.role)✅ +- **用户角色**:投保人、保险人、服务方(AuthStore 中 user.role)✅ - **权限控制**:侧边栏、工作台内容根据角色动态显示 ✅ - **路由守卫**:未登录访问 `/dashboard` 重定向至 `/login`,支持 `from` 回跳 ✅ - **状态管理**:Pinia AuthStore 管理用户信息、token、登录状态,localStorage 持久化 ✅ @@ -796,6 +1080,32 @@ flowchart TB - 保险人只能查看和操作分配给自己的项目 - **项目状态**:信息收集、询价中、已报价、已成交、已失效 +#### 4.1.4 用户注册与审批流程(已实现) + +**说明**:用户可自助注册,提交后由平台管理员在 Smart-OPS 用户审批中审核。与 2.1.2.1 对应。 + +**1. 组织选择与注册入口** +- **路径**:`/register`(注册页,可从登录页「注册」链接进入) +- **组织选择**:下拉列表选择所在公司/组织,组织列表由平台维护,支持增补 +- **流程**:选择组织后,方可进入下一步注册表单 + +**2. 个人信息填写** +- **必填字段**:姓名、手机号、邮箱、职位、部门 +- **可选字段**:上传身份证、工作证明等 +- **校验规则**:验证邮箱/手机号唯一性,避免重复注册 + +**3. 注册信息提交与审批流程** +- **提交**:用户提交后,注册信息(包含个人信息及所选组织)自动同步至 Smart-OPS 待审批列表 +- **审批**:平台管理员在 Smart-OPS 后台查看、审批(支持通过、驳回、备注原因) +- **通过**:审批通过后用户激活账号并获取登录权限 +- **驳回**:驳回时邮件通知用户,说明补齐资料或说明原因 +- **管理**:支持管理员手动添加或编辑组织成员 + +**4. 相关功能** +- **进度查询**:注册申请进度查询及提醒(如注册后邮件/短信通知申请已受理、进度变更等) +- **分级审核**:支持组织与角色审核分级,部分组织可指定本组织管理员进行初步审核 +- **操作日志**:所有注册与审批操作有日志可追溯,保障数据合规与操作安全 + ### 4.2 登录后系统功能模块(已实现) #### 4.2.1 工作台(Dashboard)(已实现) @@ -812,7 +1122,7 @@ flowchart TB - 待处理的报价项目(状态含:资料填写中、已生成报价、询价中、已回显精准报价等) - 待处理的理赔 - **快捷方式**(页面右上角): - - 获取报价:打开报价申请流程(弹窗或报价页面,见 2.3.2.3) + - 获取报价:打开报价申请流程(弹窗或报价页面,见 2.4.2.3) - 申请理赔:跳转到理赔申请页面(需关联项目) - 方案介绍:申请设计并介绍方案 - 培训支持:申请培训支持 @@ -832,9 +1142,47 @@ flowchart TB - **项目报价页面功能**: - PV报价、临床试验保险报价、产品责任保险报价(三种可折叠表单) - 各类型有独立表单字段,提交后展示提交状态 -- **临床试验保险弹窗**(QuoteRequestModal):手动填写/上传方案、AI 识别、生成报价、获取精准报价,与 3.3.2.1 流程一致 +- **临床试验保险弹窗**(QuoteRequestModal):手动填写/上传方案、AI 识别、生成报价、获取精准报价,与 3.1.2.2 流程一致 -#### 4.2.3 项目列表(ProjectList) +#### 4.2.3 报价对比(QuoteCompare)(已实现) +- **路径**:`/dashboard/quote-compare` +- **权限**:仅投保人可见 +- **功能**:各保司报价结果汇总,按项目、方案筛选,多维度对比呈现 + +##### 4.2.3.1 保司报价对比表模板(临床试验责任保险) + +临研安/华泰经纪整理各保司正式报价时按实填写,供投保人对比选择。平台统一服务热线:4009606520。 + +**一、基础报价与保障限额** + +| 保司名称 | 保费报价(元) | 每人责任限额(万) | 累计责任限额(万) | 免赔额(万) | 报价有效期 | 是否支持附加险 | +|----------|----------------|--------------------|--------------------|--------------|------------|----------------| +| 太平保险 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 太平洋保险 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 亚太 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 华泰财 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 大地 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 平安 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | + +**二、保障范围**:保险条款、承保事件(SUSAR/AE/SAE)、相关因素覆盖、赔付比例、全流程服务承诺书 + +**三、风险管理服务**:知情同意书审阅/修改/建议、CRC 及相关方风险管理与最小化培训 + +**四、理赔服务**:服务专线、费用理算、理赔结论沟通协调、理赔时效承诺(7/15天)、受试者潜在纠纷沟通协调 + +**五、价格与退费**:未入组人数退费比例、支付周期、备注 + + + +> 平台统一服务热线:4009606520 + +#### 4.2.4 保险报价 Smart-OPS(已实现) +- **路径**:`/dashboard/smart-ops/quote-tasks`、`/dashboard/smart-ops/quote-tasks/:id` +- **权限**:仅服务方可见 +- **功能**:临研安/华泰经纪工作台,管理报价任务、发送保司询价、整理报价结果 +- **详细设计**:报价状态、数据结构、操作功能(生成标准报价信息、风险评估、申请报价、整理报价、返回报价)见「3.1.2.3 Smart-OPS 保险报价操作」 + +#### 4.2.5 项目列表(ProjectList) - **路径**:`/dashboard/projects` - **权限**:仅投保人可见 - **列表字段**: @@ -848,7 +1196,7 @@ flowchart TB - 点击"查看明细"跳转到 `/dashboard/projects/:id`(项目明细页) - 点击"申请理赔"跳转到理赔申请页面(需关联项目ID) -#### 4.2.4 项目明细(ProjectDetail) +#### 4.2.6 项目明细(ProjectDetail) - **路径**:`/dashboard/projects/:id` - **权限**:仅投保人可见 - **内容**:项目详细信息展示 @@ -857,7 +1205,7 @@ flowchart TB - 相关文档:保险合同、评估报告等(可下载或预览) - 操作按钮:查看明细、申请理赔 -#### 4.2.5 询价列表(InquiryList) +#### 4.2.7 询价列表(InquiryList) - **路径**:`/dashboard/inquiries` - **权限**:仅保险人可见 - **列表字段**: @@ -869,17 +1217,24 @@ flowchart TB - 成交情况(如:已成交、待确认、已拒绝等) - **交互**:可查看评估详情、处理报价等 -#### 4.2.6 理赔进度(ClaimProgress) -- **路径**:`/dashboard/claims` -- **权限**:投保人、保险人可见 -- **投保人理赔进度**: - - 列表字段:项目编号、试验题目、保障范围、承保公司、承保状态 - - 操作按钮:查看明细、申请理赔 -- **保险人理赔进度**: - - 列表字段:项目编号、试验题目、保障范围、承保公司、承保状态 - - 操作按钮:查看明细、处理理赔 +#### 4.2.8 理赔进度与理赔管理(ClaimProgress / ClaimDetail / ClaimApply)(URS-P04、URS-P08) +- **路径**: + - `/dashboard/claims`:理赔列表/进度 + - `/dashboard/claims/apply`:理赔申请(投保人,支持 `?projectId=xxx`) + - `/dashboard/claims/:id`:理赔详情 +- **权限**:投保人、保险人可见;理赔申请仅投保人;**服务方**在 Smart-OPS 中处理(见 3.1.3.6) +- **与项目关联**:理赔须关联已承保项目;入口:项目列表、项目明细、工作台、理赔进度 +- **流程概要**:投保人申请 → 材料发送 Smart-OPS → 服务方整理标准材料 → 发送保司 → 保司结论 → 服务方沟通达成一致 → 结案(详见 3.1.3.1) +- **投保人**: + - 理赔申请:原始理赔信息(C.1-C.5,见 3.1.3.2);简洁版/详细版;上传证明材料 + - 理赔列表:理赔编号、关联项目、事件名称、状态、申请时间;支持进度查询、补充资料 + - 理赔详情:申请内容、进度、**结案总结**(赔付金额、结案说明、医药费用理算摘要) +- **保险人**: + - 理赔列表:待审核、保司评估中、已结案等状态筛选 + - 理赔详情:查看标准理赔材料、评估结论;审核(通过/需补充/拒赔)、结案(录入赔付金额、结案说明) +- **理赔状态**:待提交、待收集资料、资料整理中、待发送保司、保司评估中、待沟通、已达成一致、已结案、已拒赔 -#### 4.2.7 智能工具(Tools)(已实现) +#### 4.2.9 智能工具(Tools)(已实现) - **路径**:`/dashboard/tools` - **权限**:所有登录用户可见 - **工具入口页**:展示五个工具的入口卡片 @@ -889,24 +1244,24 @@ flowchart TB - 方案风险评估(所有用户) - 药安查(所有用户) -##### 4.2.7.1 保费测算工具(PremiumCalculator) +##### 4.2.9.1 保费测算工具(PremiumCalculator) - **路径**:`/dashboard/tools/premium-calculator` - **权限**:所有登录用户可见 - **功能**:根据项目信息、风险等级等参数计算保费 -##### 4.2.7.2 ICF智能修改(ICFEditor) +##### 4.2.9.2 ICF智能修改(ICFEditor) - **路径**:`/dashboard/tools/icf-editor` - **功能**:智能辅助修改知情同意书(ICF)内容 -##### 4.2.7.3 方案风险评分(RiskScoring) +##### 4.2.9.3 方案风险评分(RiskScoring) - **路径**:`/dashboard/tools/risk-scoring` - **功能**:对试验方案进行风险评分 -##### 4.2.7.4 方案风险评估(ProtocolRiskAssessment) +##### 4.2.9.4 方案风险评估(ProtocolRiskAssessment) - **路径**:`/dashboard/tools/protocol-risk` - **功能**:AI 评估方案信息不足风险与偏倚风险(已实现) -##### 4.2.7.5 药安查(DrugSafetyQuery) +##### 4.2.9.5 药安查(DrugSafetyQuery) - **路径**:`/dashboard/tools/drug-safety` - **功能**:药物安全数据查询、不良反应与警戒信息检索(已实现) @@ -918,8 +1273,8 @@ flowchart TB ### 4.4 交互功能(待开发) - **在线咨询**:支持在线咨询功能(未来扩展) -- **表单提交**:支持服务申请表单提交(登录后系统);报价申请支持手动填写与上传项目方案(AI 识别填充) -- **流程跟踪**:支持查看服务流程状态(登录后系统);报价申请支持状态跟踪(资料填写中、已生成报价、询价中、已回显精准报价)及精准报价结果展示 +- **表单提交**:支持服务申请表单提交(登录后系统);报价申请支持手动填写与上传项目方案(AI 识别填充);理赔申请支持关联项目、上传证明材料 +- **流程跟踪**:支持查看服务流程状态(登录后系统);报价申请支持状态跟踪(资料填写中、已生成报价、询价中、已回显精准报价);理赔支持状态跟踪(待收集资料、资料整理中、待发送保司、保司评估中、待沟通、已结案)及结案总结、医药费用理算摘要查看 - **邮件与回显**:获取精准报价时系统发送邮件至保司;系统从 rmo@vdano.com 拉取保司回复,经临研安审核后回写并展示在报价页面 ### 4.5 数据可视化(部分已实现) @@ -956,22 +1311,9 @@ flowchart TB ## 六、设计建议 -### 6.1 视觉设计 -- **风格定位**:专业、可信、现代 -- **色彩方案**:医疗健康相关配色,体现专业性 -- **图标系统**:统一的图标风格 -- **品牌元素**:临研安、华泰保险经纪品牌元素融入 - -### 6.2 用户体验 -- **导航清晰**:清晰的导航结构,易于找到信息 -- **信息层次**:重要信息突出展示 -- **交互友好**:操作简单直观 -- **内容可读性**:文字排版清晰,易于阅读 - -### 6.3 特殊页面设计 -- **模式图页面**:重点设计,支持交互式展示 -- **流程页面**:流程图清晰展示各步骤 -- **资源中心**:支持分类浏览、搜索、下载 +- **视觉**:专业、可信、现代,医疗健康相关配色 +- **导航**:清晰结构,重要信息突出 +- **特殊页面**:模式图支持交互式展示,流程图清晰,资源中心支持分类浏览 --- @@ -996,119 +1338,9 @@ flowchart TB - **图表库**:ECharts / D3.js(用于模式图可视化,如需要) - **文件预览**:@vue-office 或类似库(用于文档预览) -### 7.4 后端建议(未来扩展) -- **后端框架**:Node.js / Python Django / Java Spring Boot -- **数据库**:MySQL / PostgreSQL -- **文件存储**:OSS / 本地存储 -- **API设计**:RESTful API - -### 7.5 部署建议 -- **服务器**:云服务器(阿里云/腾讯云等) -- **CDN**:静态资源CDN加速 -- **域名SSL**:配置HTTPS证书 - ---- - -## 八、开发阶段建议 - -### 8.1 第一阶段:免登录浏览区(已完成 ✅) -1. ✅ 用户访问系统(免登录) -2. ✅ 首页(Banner、风险管理体系、角色专区) -3. ✅ 风险职责模块(总览、申办者、持有人、研究中心、受试者、CXO) -4. ✅ 临床试验模块(保险方案、保证方案、保险保证) -5. ✅ 上市应用、海外风险页面 -6. ✅ 资源中心(实践指南、培训材料、常见问题) -7. ✅ 登录页面(UI已实现,登录逻辑待开发) - -### 8.2 第二阶段:登录后系统(已完成 ✅) -1. ✅ 用户认证与权限系统 - - 登录逻辑(Pinia AuthStore,当前为模拟接口) - - 全局状态管理(AuthStore) - - 路由守卫(ProtectedRoute) - - 角色权限控制(侧边栏、工作台根据角色显示) -2. ✅ 工作台页面 - - 数据统计卡片、待处理任务、快捷方式 - - 投保人快捷方式:获取报价、报价页面、申请理赔、方案介绍、培训支持 -3. ✅ 报价申请流程(获取报价) - - 多入口跳转至项目报价页(/dashboard/project-quotes) - - 项目报价页含 PV报价、临床试验保险报价、产品责任保险报价 - - 临床试验保险弹窗(QuoteRequestModal)已实现,可接入入口 -4. ✅ 项目列表模块(带权限过滤) -5. ✅ 询价列表模块(保险人权限控制) -6. ✅ 理赔进度模块(投保人、保险人可见) -7. ✅ 智能工具模块 - - 保费测算、ICF智能修改、方案风险评分、方案风险评估、药安查 -8. ✅ DashboardLayout(侧边栏 + 主内容区) - -### 8.3 第三阶段:功能增强(未来扩展) -1. 在线咨询功能 -2. 理赔申请流程 -3. 数据统计展示 -4. 后台管理系统(内容管理、用户管理) -5. 文件上传下载功能 -6. 全文搜索功能 - ---- - -## 九、待确认事项 - -### 9.1 已确认事项 -1. ✅ **登录系统**:账号密码登录,无需注册功能(用户由管理员创建) -2. ✅ **路由架构**:免登录浏览区 + 登录后系统区,使用路由守卫控制访问 -3. ✅ **权限控制**:基于角色的权限控制,2种用户角色(投保人、保险人) - -### 9.2 待确认事项 -1. **费用管理**:申办方内部费用管理系统的集成需求(如康方案例中提到的问题) -2. **直付功能**:医院直付功能的具体实现方式和时间表 -3. **经营资质**:临研安健康服务采购的经营资质确认 -4. **发票管理**:服务费用的发票开具方式 -5. **多账户管理**:申办方多项目账户管理方案(总账户+项目账户模式) -6. **资源中心**:是否需要实现真实的文件上传下载功能 -7. **活动动态**:是否需要后台管理系统来管理活动内容 -8. **API接口**:登录后系统的后端API接口设计(接口文档、数据格式等) -9. **数据权限**:项目列表、保障评估等数据的权限控制规则细节 -10. **智能工具**:保费测算、ICF修改、风险评分等工具的具体算法和实现方式 - ---- - -## 十、附录 - -### 10.1 术语表 -- **RMO**:Risk Management Organization,风险管理组织 -- **AE**:Adverse Event,不良事件 -- **ADR**:Adverse Drug Reaction,药物不良反应 -- **SADR**:Serious Adverse Drug Reaction,严重药物不良反应 -- **SAE**:Serious Adverse Event,严重不良事件 -- **SUSAR**:Suspected Unexpected Serious Adverse Reaction,可疑且非预期的严重不良反应 -- **IB**:Investigator's Brochure,研究者手册 -- **RSI**:Reference Safety Information,参考安全信息 -- **CRO**:Contract Research Organization,合同研究组织 -- **CDMO**:Contract Development and Manufacturing Organization,合同开发与生产组织 -- **SMO**:Site Management Organization,现场管理组织 - -### 10.2 参考文件 -- 原需求文档:`临床试验保险及RMO模式网站设计思路.md` -- 相关图片资源:申办者和持有人责任风险管理相关图片 - -### 10.3 项目状态 -- **当前版本**:v1.2 -- **开发状态**: - - ✅ 免登录浏览区:已完成 - - ✅ 登录后系统:已完成(含工作台、项目报价、项目列表、询价列表、理赔进度、智能工具) - - ⏳ 待完善:报价精准回显、后端接口对接、上市应用/海外风险内容填充 -- **技术栈**:Vue 3 + TypeScript + Vite + Pinia + Vue Router -- **最后更新**:2025年2月 - ---- - -**文档版本**:v1.2 -**创建日期**:2025年1月 -**最后更新**:2025年2月(根据网站代码同步更新) - -### 10.4 开发状态说明 -- **✅ 已实现**:功能已开发完成,需求文档已与代码实现对齐 -- **⏳ 待完善**:部分流程(如报价精准回显、后端接口)需后续对接 -- **未来扩展**:上市应用/海外风险内容、在线咨询、后台管理等 +### 7.4 后端与部署(未来扩展) +- 后端:Node.js / Django / Spring Boot;数据库 MySQL/PostgreSQL;RESTful API +- 部署:云服务器 + CDN + HTTPS diff --git a/PRD/临床试验保险及RMO模式网站设计思路.md b/PRD/存档/临床试验保险及RMO模式网站设计思路.md similarity index 100% rename from PRD/临床试验保险及RMO模式网站设计思路.md rename to PRD/存档/临床试验保险及RMO模式网站设计思路.md diff --git a/PRD/临床试验责任保险报价流程.md b/PRD/存档/临床试验责任保险报价流程.md similarity index 63% rename from PRD/临床试验责任保险报价流程.md rename to PRD/存档/临床试验责任保险报价流程.md index ddee2f8..078ab26 100644 --- a/PRD/临床试验责任保险报价流程.md +++ b/PRD/存档/临床试验责任保险报价流程.md @@ -223,5 +223,75 @@ flowchart TB > 每一个操作需在系统内形成业务日志,支持后续审计和流程追踪。 +# 报价对比一览表 + +## 维度说明 +1. **保障范围**:所用保险条款;事件(SUSAR、所有AE/SAE);相关因素(受试药物、对照药物、合并用药、手术操作);赔付比例;全流程服务承诺书 +2. **风险管理服务**:知情同意书审阅/修改/建议;CRC 及相关方风险管理与最小化培训 +3. **理赔服务**:服务专线、费用理算、理赔沟通协调、理赔时效承诺、纠纷协调 +4. **价格**:保费、限额、免赔额、未入组人数退费比例 + +--- + +## 保司报价对比表 + +### 一、基础报价与保障限额 + +| 保司名称 | 保费报价(元) | 每人责任限额(万) | 累计责任限额(万) | 免赔额(万) | 报价有效期 | 是否支持附加险 | +|------------|----------------|--------------------|--------------------|--------------|------------|----------------| +| 太平保险 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 太平洋保险 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 亚太 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 华泰财 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 大地 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 平安 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | + +### 二、保障范围 + +| 保司名称 | 所用保险条款 | 承保事件(SUSAR/AE/SAE) | 相关因素覆盖(受试药物/对照药物/合并用药/手术操作) | 医药费用100%赔付 | 可能相关赔付比例 | 肯定相关赔付比例 | 全流程服务承诺书 | +|------------|------------------------|---------------------------|------------------------------------------------------|------------------|------------------|------------------|------------------| +| 太平保险 | 待填 | 待填 | 待填 | 待填 | 待填(如70%/80%)| 待填 | 待填 | +| 太平洋保险 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 亚太 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 华泰财 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 大地 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 平安 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | 待填 | + +### 三、风险管理服务 + +| 保司名称 | 知情同意书审阅、修改、建议 | CRC 及相关方风险管理与最小化培训 | +|------------|----------------------------|-----------------------------------| +| 太平保险 | 待填 | 待填 | +| 太平洋保险 | 待填 | 待填 | +| 亚太 | 待填 | 待填 | +| 华泰财 | 待填 | 待填 | +| 大地 | 待填 | 待填 | +| 平安 | 待填 | 待填 | + +### 四、理赔服务 + +| 保司名称 | 服务专线 | 相关费用理算 | 理赔结论沟通、协调 | 理赔时效承诺(7/15天) | 受试者潜在纠纷沟通、协调、解释 | +|------------|-------------|--------------|--------------------|-------------------------|--------------------------------| +| 太平保险 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 太平洋保险 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 亚太 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 华泰财 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 大地 | 待填 | 待填 | 待填 | 待填 | 待填 | +| 平安 | 待填 | 待填 | 待填 | 待填 | 待填 | + +### 五、价格与退费 + +| 保司名称 | 未入组人数退费比例 | 支付周期 | 备注 | +|------------|--------------------|----------|------| +| 太平保险 | 待填 | 待填 | — | +| 太平洋保险 | 待填 | 待填 | — | +| 亚太 | 待填 | 待填 | — | +| 华泰财 | 待填 | 待填 | 与经纪服务联动 | +| 大地 | 待填 | 待填 | 含 SUSAR/SAE 专项 | +| 平安 | 待填 | 待填 | 全国网点理赔 | + +--- + +> **使用说明**:以上表格为报价对比模板,临研安/华泰经纪在整理各保司正式报价时按实填写。服务专线 4009606520 为平台统一服务热线。 \ No newline at end of file diff --git a/PRD/后端管理页面-SmartOPS.md b/PRD/存档/后端管理页面-SmartOPS.md similarity index 100% rename from PRD/后端管理页面-SmartOPS.md rename to PRD/存档/后端管理页面-SmartOPS.md diff --git a/PRD/网站架构.md b/PRD/存档/网站架构.md similarity index 100% rename from PRD/网站架构.md rename to PRD/存档/网站架构.md diff --git a/docs/风险管理模式.md b/docs/风险管理模式.md new file mode 100644 index 0000000..10247d0 --- /dev/null +++ b/docs/风险管理模式.md @@ -0,0 +1,127 @@ +风险管理模式 + +#### 3.1.1 参与主体 +- **临床试验风险主体**:申办者(研究机构及研究者协助) +- **参与临床试验的主体**:申办者、研究者、研究机构工作人员、CRO、CRC、受试者 + +#### 3.1.2 临床试验风险分类 +**临床试验风险类型**:SUSAR、ADR(SADR)、AE(SAE)、与试验相关非医疗一切风险 + +**风险逻辑:** + +**从临床试验药物角度:** +1. **为证明与药物相关**:AE(不良事件) +2. **已证明与药物相关**:ADR(药物不良反应) + - **SADR(严重药物不良反应)**:严重的ADR + - ADR写入IB的RSI(参考安全信息) +3. **新发现的严重不良反应**:SUSAR(可疑且非预期的严重不良反应),需及时报告 +4. **未写入RSI的严重不良反应属于SUSAR** + +**从临床试验操作角度:** +1. 临床试验方案合理性 +2. 临床试验方案操作是否符合规定 +3. 医疗行为是否合理 +4. 临床试验组织管理是否合理 + +**其他与临床试验有相关性的内容:** +1. 行为原则 +2. 心理原因 +3. 其他 + +#### 3.1.3 赔偿/补偿的内容及基本原则 +1. **最大范围医疗报销原则**(与试验相关的一切风险)发生的必要且合理的医疗支出100%报销。(高频、时效、便捷、最好无垫付) +2. **身故、伤残赔偿金**(低频) +3. **无过错责任补偿金**(低频) +4. **精算损失赔偿金**(低频) + +#### 3.1.4 风险与保险条款的匹配性问题 + +**首要风险:** +- 投保人最关注的厌恶的风险有哪些: + - SUSAR(影响试验走向) + - SAE(经济成本、影响试验进展) + - 非医疗类恶性事件(影响试验进展) +- **特点**:此类风险发生的意愿程度,投保人与保险人完全一致。通过高杠杆方式保险解决 + +**次要风险:** +- AE与试验相关风险 +- **特点**:控制该类风险并非投保人第一关注点(本质上是道德风险),因此容易产生风险敞口,因此保险人在评估风险杠杆承担存在压力和不确定性。 +- **解决方案**:"自保"+"风险减量服务"+"外溢风险管理服务" + +#### 3.1.5 风险管理逻辑模型 + +**基于以上背景,拟提出的风险管理逻辑模型:** +1. **首要风险**:通过高杠杆方式保险解决 +2. **次要风险**:"自保"+"风险减量服务"+"外溢风险管理服务"解决 + +**具体解决方式:** + +**首要风险的责任:** +- SUSAR、SAE造成的身故、残疾赔偿金 +- **强调**:责任明确、金额较大、证据链清晰 +- **方式**:用保险进行风险转移 + +**次要风险的责任:** +- 非SUSAR所发生的医疗费用 +- **方式**:用RMO模式解决 + + +### 3.2 RMO模式详细说明 + +#### 3.2.1 模式定位 +RMO模式(也可以换个名字,避免和我们全委托投保的选择冲突) + +**定位**:为投保人解决三件事: +1. "自保"代位执行 +2. 风险减量服务 +3. 外溢风险管理服务 + +#### 3.2.2 合作机构 +- 华泰保险经纪 +- 临研安 +- 其他合作方(X) + +#### 3.2.3 具体操作流程 + +**第一步:风险评估与投保** +- 华泰经纪协助申办者基于项目复杂度和风险度厘清首要风险与次要风险 +- 通过华泰保险经纪完成首要风险投保 + +**第二步:专项风险管理基金设立** +- 申办者根据项目的大小、历史或行业经验,向华泰经纪支付风险管理费采购健康医疗服务(例如一个项目3-5万) +- 双方约定健康医疗服务费的使用范围、对象、执行和审批流程、额度等要素 +- 该费用作为申办者的专项风险管理基金,实行多退少补原则 + +**第三步:费用管理** +- 健康医疗服务成本以医院出具的医疗费用清单为结算凭证 +- **风险管理费采用两种模式:** + - **比例费用**:整体费用的12-15% + - 举例:申办者支付5万元,其中6千元为风险管理费,4.4万计入专项风险管理基金 + - **案件费用**:出现大额、疑难医疗行为与受试者提出额外医疗行为时,针对每个案件收取服务费用(费用结算固定值或者减损比例值) + +**第四步:医疗直付(逐步实现)** +- 华泰力争逐步做到与医院实现直付 +- 华泰长期为日本多家保险公司提供此类服务,日本人在中国的转诊、医疗推荐、费用结算都是华泰完成,此业务已开展近30年 +- 具有外币结算资质 +- 华泰逐步实现和各家医院打通直付,具体额度、时效、范围等还需要再讨论 + +**第五步:出险处理流程** +1. 受试者发生AE或其他医疗需求 +2. 医院第一时间通知华泰 +3. 华泰正常情况下24小时内与医院、受试者沟通,并通知申办者 + - 特殊情况处理:如遇特殊情况,例如受试者非集中、境外、无法联系、不可抗力等,应急处理模式 +4. 安抚受试者、了解医院拟采取的医疗方式及成本 +5. 合理且必要的医疗行为及时安排并承诺受试者救治 +6. 评估申办者专项风险管理基金的余额 +7. 将以上信息报送申办者 +8. 申办者同意使用该基金后,华泰与医院进行结算 +9. 不足部分需申办者补齐,并提供一定费用的余额,以便下次使用 + +**第六步:风险减量服务** +- 华泰经纪与临研安针对临床试验链条的各个环节进行风险点检查 +- 人员培训 +- 方案完善建议 + +**第七步:外溢风险管理服务** +- 针对受试者出险后的全流程管理 +- 联系、安抚、安排就医、沟通诉求、沟通合理预期 \ No newline at end of file diff --git a/src/components/Breadcrumb.vue b/src/components/Breadcrumb.vue index 627695f..bec0595 100644 --- a/src/components/Breadcrumb.vue +++ b/src/components/Breadcrumb.vue @@ -84,11 +84,14 @@ const pathLabels: Record = { '/privacy-policy': '隐私政策', '/overseas': '海外风险', '/login': '登录', + '/register': '用户注册', // Dashboard '/dashboard': '工作台', '/dashboard/project-quotes': '项目报价', '/dashboard/quote-compare': '报价对比', - '/dashboard/smart-ops/quote-tasks': '保险报价(Smart-OPS)', + '/dashboard/smart-ops': 'Smart-OPS', + '/dashboard/smart-ops/quote-tasks': '保险报价', + '/dashboard/smart-ops/user-approvals': '用户审批', '/dashboard/projects': '项目列表', '/dashboard/projects/:id': '项目详情', '/dashboard/inquiries': '询价列表', @@ -151,7 +154,9 @@ function getLabel(path: string): string { 'privacy-policy': '隐私政策', 'project-quotes': '项目报价', 'quote-compare': '报价对比', + 'smart-ops': 'Smart-OPS', 'quote-tasks': '保险报价', + 'user-approvals': '用户审批', projects: '项目列表', inquiries: '询价列表', claims: '理赔进度', diff --git a/src/components/DashboardLayout.vue b/src/components/DashboardLayout.vue index 19bb553..a76d39f 100644 --- a/src/components/DashboardLayout.vue +++ b/src/components/DashboardLayout.vue @@ -39,10 +39,16 @@ diff --git a/src/pages/Contact.tsx b/src/pages/Contact.tsx index d0eb933..f973720 100644 --- a/src/pages/Contact.tsx +++ b/src/pages/Contact.tsx @@ -9,7 +9,7 @@ function Contact() {
diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 8678c1c..65656df 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -184,7 +184,7 @@ function Home() { >

联系我们

-

获取RMO最新资讯,第一时间了解我们的企业动态

+

获取RMO最新资讯,第一时间了解风险管理动态

立即联系 关于RMO diff --git a/src/router/index.ts b/src/router/index.ts index c602e3a..8dbbc2a 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -35,6 +35,7 @@ import LearningCenter from '@/views/LearningCenter.vue' import Contact from '@/views/Contact.vue' import PrivacyPolicy from '@/views/PrivacyPolicy.vue' import Login from '@/views/Login.vue' +import Register from '@/views/Register.vue' // Dashboard import Dashboard from '@/views/dashboard/Dashboard.vue' @@ -50,6 +51,7 @@ import ProjectQuotes from '@/views/dashboard/ProjectQuotes.vue' import QuoteCompare from '@/views/dashboard/QuoteCompare.vue' import QuoteTaskList from '@/views/dashboard/smart-ops/QuoteTaskList.vue' import QuoteTaskDetail from '@/views/dashboard/smart-ops/QuoteTaskDetail.vue' +import UserApprovalList from '@/views/dashboard/smart-ops/UserApprovalList.vue' import ICFEditor from '@/views/dashboard/ICFEditor.vue' import RiskScoring from '@/views/dashboard/RiskScoring.vue' import ProtocolRiskAssessment from '@/views/dashboard/ProtocolRiskAssessment.vue' @@ -113,6 +115,7 @@ const router = createRouter({ { path: 'privacy-policy', component: PrivacyPolicy }, { path: 'overseas', component: Overseas }, { path: 'login', component: Login }, + { path: 'register', component: Register }, ] }, { @@ -129,6 +132,7 @@ const router = createRouter({ { path: 'quote-compare', component: QuoteCompare }, { path: 'smart-ops/quote-tasks', component: QuoteTaskList }, { path: 'smart-ops/quote-tasks/:id', component: QuoteTaskDetail }, + { path: 'smart-ops/user-approvals', component: UserApprovalList }, { path: 'projects', component: ProjectList }, { path: 'projects/:id', component: ProjectDetail }, { path: 'inquiries', component: InquiryList }, diff --git a/src/stores/registration.ts b/src/stores/registration.ts new file mode 100644 index 0000000..b459391 --- /dev/null +++ b/src/stores/registration.ts @@ -0,0 +1,118 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' + +export interface PendingRegistration { + id: string + organizationId: string + organizationName: string + name: string + phone: string + email: string + position: string + department: string + idCardFile?: string + workProofFile?: string + status: 'pending' | 'approved' | 'rejected' + rejectReason?: string + createdAt: string + updatedAt?: string +} + +export interface Organization { + id: string + name: string +} + +const STORAGE_KEY = 'rmo_pending_registrations' +const ORGS_KEY = 'rmo_organizations' + +function loadRegistrations(): PendingRegistration[] { + try { + const raw = localStorage.getItem(STORAGE_KEY) + return raw ? JSON.parse(raw) : [] + } catch { + return [] + } +} + +function saveRegistrations(list: PendingRegistration[]) { + localStorage.setItem(STORAGE_KEY, JSON.stringify(list)) +} + +export const useRegistrationStore = defineStore('registration', () => { + const organizations = ref([ + { id: 'org1', name: '示例制药有限公司' }, + { id: 'org2', name: '示例生物科技有限公司' }, + { id: 'org3', name: '华泰保险经纪有限公司' }, + { id: 'org4', name: '临研安(北京)科技有限公司' }, + { id: 'org5', name: '太平洋财产保险股份有限公司' } + ]) + + const reservedEmails = ['admin@rmo.com', 'policyholder@rmo.com', 'insurer@rmo.com', 'tpa@vdano.com'] + + function getPendingRegistrations(): PendingRegistration[] { + return loadRegistrations().filter(r => r.status === 'pending') + } + + function getAllRegistrations(): PendingRegistration[] { + return loadRegistrations() + } + + function submitRegistration(data: Omit): Promise<{ success: boolean; message?: string }> { + return new Promise((resolve) => { + const list = loadRegistrations() + if (reservedEmails.includes(data.email.toLowerCase())) { + resolve({ success: false, message: '该邮箱已被注册' }) + return + } + if (list.some(r => r.email.toLowerCase() === data.email.toLowerCase())) { + resolve({ success: false, message: '该邮箱已被注册' }) + return + } + if (data.phone && list.some(r => r.phone === data.phone)) { + resolve({ success: false, message: '该手机号已被注册' }) + return + } + const now = new Date().toISOString() + const reg: PendingRegistration = { + ...data, + id: `reg_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`, + status: 'pending', + createdAt: now + } + list.unshift(reg) + saveRegistrations(list) + resolve({ success: true }) + }) + } + + function approveRegistration(id: string): void { + const list = loadRegistrations() + const idx = list.findIndex(r => r.id === id) + if (idx >= 0) { + list[idx].status = 'approved' + list[idx].updatedAt = new Date().toISOString() + saveRegistrations(list) + } + } + + function rejectRegistration(id: string, reason?: string): void { + const list = loadRegistrations() + const idx = list.findIndex(r => r.id === id) + if (idx >= 0) { + list[idx].status = 'rejected' + list[idx].rejectReason = reason + list[idx].updatedAt = new Date().toISOString() + saveRegistrations(list) + } + } + + return { + organizations, + getPendingRegistrations, + getAllRegistrations, + submitRegistration, + approveRegistration, + rejectRegistration + } +}) diff --git a/src/views/Home.vue b/src/views/Home.vue index 601fd5a..11d4cc6 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -98,7 +98,7 @@ const sections = [ { class: 'solutions-section', title: '', subtitle: '' }, { class: 'capabilities-section', title: '核心能力', subtitle: '' }, { class: 'knowledge-section', title: '知识资源', subtitle: '分享我们对行业的洞见和风险资讯' }, - { class: 'contact-section', title: '联系我们', subtitle: '获取RMO最新资讯,第一时间了解我们的企业动态' } + { class: 'contact-section', title: '联系我们', subtitle: '获取RMO最新资讯,第一时间了解风险管理动态' } ] const capabilities = [ diff --git a/src/views/Login.vue b/src/views/Login.vue index 98b015e..24b3393 100644 --- a/src/views/Login.vue +++ b/src/views/Login.vue @@ -46,7 +46,7 @@
diff --git a/src/views/Register.vue b/src/views/Register.vue new file mode 100644 index 0000000..6be139f --- /dev/null +++ b/src/views/Register.vue @@ -0,0 +1,267 @@ + + + + + diff --git a/src/views/dashboard/QuoteCompare.vue b/src/views/dashboard/QuoteCompare.vue index e93eb11..a56ce5a 100644 --- a/src/views/dashboard/QuoteCompare.vue +++ b/src/views/dashboard/QuoteCompare.vue @@ -44,33 +44,33 @@

保司报价对比

+

归集各保司返回的正式报价,按多维度对比呈现,便于选定。

- +
- - - - - - - + + - - - - - - - - - +
保司报价状态年保费每人责任限额累计责任限额免赔额备注维度{{ q.insurer }}
{{ q.insurer }} - - {{ statusText[q.status] }} - - {{ q.premium || '--' }}{{ q.perPersonLimit || '--' }}{{ q.aggregateLimit || '--' }}{{ q.deductible || '--' }}{{ q.note || '--' }}
@@ -109,19 +109,99 @@ const mockSchemes = [ const statusText: Record = { pending: '待报价', - received: '已报价' + received: '已报价', + completed: '报价完成', + formal: '正式报价', + created: '已创建', + preliminary: '初步评估' } interface QuoteItem { insurer: string - status: 'pending' | 'received' + status: string premium?: string perPersonLimit?: string aggregateLimit?: string deductible?: string + validity?: string + addOnSupported?: string + insuranceClause?: string + coveredEvents?: string + relatedFactors?: string + med100Percent?: string + possibleRelatedPercent?: string + certainRelatedPercent?: string + fullProcessCommitment?: string + icfReview?: string + crcTraining?: string + serviceHotline?: string + expenseSettlement?: string + claimsCommunication?: string + claimsTimeCommit?: string + disputeCoordination?: string + refundForUnenrolled?: string + paymentCycle?: string note?: string } +const compareDimensionGroups = [ + { + groupName: '基础报价与保障限额', + dimensions: [ + { key: 'status', label: '报价状态' }, + { key: 'premium', label: '保费(元)' }, + { key: 'perPersonLimit', label: '每人限额(万)' }, + { key: 'aggregateLimit', label: '累计限额(万)' }, + { key: 'deductible', label: '免赔额(万)' }, + { key: 'validity', label: '有效期' }, + { key: 'addOnSupported', label: '附加险' } + ] + }, + { + groupName: '保障范围', + dimensions: [ + { key: 'insuranceClause', label: '保险条款' }, + { key: 'coveredEvents', label: '承保事件' }, + { key: 'relatedFactors', label: '相关因素' }, + { key: 'med100Percent', label: '医药费100%' }, + { key: 'possibleRelatedPercent', label: '可能相关%' }, + { key: 'certainRelatedPercent', label: '肯定相关%' }, + { key: 'fullProcessCommitment', label: '全流程承诺' } + ] + }, + { + groupName: '风险管理服务', + dimensions: [ + { key: 'icfReview', label: 'ICF审阅' }, + { key: 'crcTraining', label: 'CRC培训' } + ] + }, + { + groupName: '理赔服务', + dimensions: [ + { key: 'serviceHotline', label: '服务专线' }, + { key: 'expenseSettlement', label: '费用理算' }, + { key: 'claimsCommunication', label: '理赔沟通' }, + { key: 'claimsTimeCommit', label: '理赔时效' }, + { key: 'disputeCoordination', label: '纠纷协调' } + ] + }, + { + groupName: '价格与退费', + dimensions: [ + { key: 'refundForUnenrolled', label: '未入组退费' }, + { key: 'paymentCycle', label: '支付周期' }, + { key: 'note', label: '备注' } + ] + } +] + +function getQuoteValue(q: QuoteItem, key: string): string { + const v = (q as Record)[key] + if (v === undefined || v === null) return '' + return String(v) +} + const quotes = ref([]) function loadQuotes() { @@ -136,7 +216,7 @@ function loadQuotes() { { insurer: '大地', status: 'received', premium: '¥13,200/年', perPersonLimit: '100万', aggregateLimit: '600万', deductible: '0', note: '含SUSAR/SAE专项' }, { insurer: '平安', status: 'received', premium: '¥14,000/年', perPersonLimit: '120万', aggregateLimit: '800万', deductible: '0', note: '全国网点理赔' }, { insurer: '华泰财', status: 'received', premium: '¥12,000/年', perPersonLimit: '100万', aggregateLimit: '500万', deductible: '0', note: '与经纪服务联动' }, - { insurer: '亚太', status: 'pending', premium: undefined, perPersonLimit: undefined, aggregateLimit: undefined, deductible: undefined, note: undefined } + { insurer: '亚太', status: 'pending', note: '—' } ] } @@ -230,7 +310,7 @@ watch(selectedProject, loadQuotes) .compare-table td { padding: 12px 16px; text-align: left; - border-bottom: 1px solid var(--border-color); + border: 1px solid var(--border-color); } .compare-table th { @@ -243,19 +323,40 @@ watch(selectedProject, loadQuotes) background: rgba(14, 165, 233, 0.03); } -.insurer-name { - font-weight: 600; - color: var(--brand-primary, #0ea5e9); +.compare-desc { + font-size: 14px; + color: var(--text-color); + margin: -8px 0 16px 0; + line-height: 1.5; } -.premium { - font-weight: 600; - color: var(--brand-text-default); -} - -.note { - max-width: 180px; +.insurer-compare-table.transposed { font-size: 13px; +} + +.insurer-compare-table .th-sticky, +.insurer-compare-table .td-sticky { + position: sticky; + left: 0; + background: var(--white); + z-index: 1; + box-shadow: 2px 0 4px -2px rgba(0, 0, 0, 0.08); +} + +.insurer-compare-table thead .th-sticky { + background: rgba(14, 165, 233, 0.08); +} + +.insurer-compare-table .group-header .group-cell { + background: rgba(14, 165, 233, 0.06); + font-weight: 600; + font-size: 13px; + padding: 10px 16px; + border-bottom: 1px solid var(--border-color); +} + +.insurer-compare-table .dim-label { + font-weight: 500; color: var(--text-color); } @@ -271,11 +372,27 @@ watch(selectedProject, loadQuotes) color: #b45309; } -.status-badge.received { +.status-badge.received, +.status-badge.completed { background: rgba(34, 197, 94, 0.2); color: #15803d; } +.status-badge.formal { + background: rgba(59, 130, 246, 0.2); + color: #1d4ed8; +} + +.status-badge.preliminary { + background: rgba(234, 179, 8, 0.2); + color: #b45309; +} + +.status-badge.created { + background: rgba(107, 114, 128, 0.2); + color: #4b5563; +} + .contact-tip { margin-top: 20px; padding: 12px 16px; diff --git a/src/views/dashboard/smart-ops/QuoteTaskDetail.vue b/src/views/dashboard/smart-ops/QuoteTaskDetail.vue index 4bda1c7..77bb6ab 100644 --- a/src/views/dashboard/smart-ops/QuoteTaskDetail.vue +++ b/src/views/dashboard/smart-ops/QuoteTaskDetail.vue @@ -7,8 +7,7 @@ >