PRD Folder Created. 报价流程:前端信息收集、SmartOps报价评估、发送保司、回收比较、前端呈现。
This commit is contained in:
parent
863a8a6d9a
commit
830b8ccb45
|
|
@ -0,0 +1,119 @@
|
||||||
|
# 临床试验责任保险报价流程
|
||||||
|
|
||||||
|
> 基于 ProcessOn 流程图(RMO保险报价.pos)整理
|
||||||
|
|
||||||
|
## 一、泳道角色
|
||||||
|
|
||||||
|
| 泳道 | 说明 |
|
||||||
|
|------|------|
|
||||||
|
| **申办者** | 投保人(采购、项目经理等) |
|
||||||
|
| **系统** | RMO 网站及 Smart-Ops 系统 |
|
||||||
|
| **临研安/华泰** | 服务方(TPA 经纪) |
|
||||||
|
| **保司** | 太保/大地、其他保险公司 |
|
||||||
|
|
||||||
|
## 二、流程阶段
|
||||||
|
|
||||||
|
### 阶段一:信息收集与 AI 报价
|
||||||
|
|
||||||
|
1. **登录**(申办者)
|
||||||
|
- 申办者登录系统
|
||||||
|
|
||||||
|
2. **填写项目信息**(申办者)
|
||||||
|
- 上传项目方案、知情同意书或手动填写报价必备资料
|
||||||
|
- 可通过邮件/小程序通知进入此步骤
|
||||||
|
|
||||||
|
3. **标准报价材料**(系统)
|
||||||
|
- 系统生成标准报价材料
|
||||||
|
|
||||||
|
4. **AI 报价**(系统)
|
||||||
|
- 基于标准材料进行 AI 报价
|
||||||
|
|
||||||
|
5. **报价任务创建**(系统)
|
||||||
|
- 生成报价任务文档
|
||||||
|
- 通过 **API Smart-Ops** 与 Smart-Ops 系统对接
|
||||||
|
|
||||||
|
6. **报价任务**(临研安/华泰)
|
||||||
|
- 每保司报价生成一条任务
|
||||||
|
- 跟踪每一任务的完成状态
|
||||||
|
|
||||||
|
7. **报价**(临研安/华泰)
|
||||||
|
- 发件人:RMO@vdano.com
|
||||||
|
- 向各保司发起报价请求
|
||||||
|
|
||||||
|
8. **初步评估**(保司)
|
||||||
|
- 太保/大地、其他保司分别进行初步评估
|
||||||
|
|
||||||
|
9. **核保通过**(保司)
|
||||||
|
- 保司核保通过后,生成正式报价
|
||||||
|
|
||||||
|
10. **正式报价**(保司)
|
||||||
|
- 输出正式报价文档
|
||||||
|
|
||||||
|
### 阶段二:全保司报价
|
||||||
|
|
||||||
|
11. **报价任务完成**(临研安/华泰)
|
||||||
|
- 汇总各保司报价结果
|
||||||
|
|
||||||
|
12. **页面对比呈现**(临研安/华泰)
|
||||||
|
- 保司回复到:RMO@vdano.com
|
||||||
|
- 整理形成可对比的报价方式,呈现给申办者
|
||||||
|
|
||||||
|
13. **价格确定**(保司)
|
||||||
|
- 确定最终报价
|
||||||
|
|
||||||
|
### 阶段三:议价
|
||||||
|
|
||||||
|
14. **是否含报价?**(判断)
|
||||||
|
- **否**:邮件/小程序通知 → 返回「填写项目信息」
|
||||||
|
- **是**:进入「再次登录」流程
|
||||||
|
|
||||||
|
15. **再次登录?**(申办者)
|
||||||
|
- 申办者再次登录系统
|
||||||
|
|
||||||
|
16. **在线议价**(临研安/华泰)
|
||||||
|
- 申办者与经纪人在线沟通、调整报价
|
||||||
|
|
||||||
|
17. **主动人工跟进**(临研安/华泰)
|
||||||
|
- 经纪人对未完成报价的保司进行主动跟进
|
||||||
|
|
||||||
|
## 三、流程示意(Mermaid)
|
||||||
|
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
## 四、关键说明
|
||||||
|
|
||||||
|
- **API Smart-Ops**:报价信息通过 API 传输到 Smart-Ops 系统,用于后续报价、投保、理赔等流程
|
||||||
|
- **任务跟踪**:每保司报价生成一条任务,系统跟踪每一任务的完成状态
|
||||||
|
- **回复渠道**:保司报价回复至 RMO@vdano.com
|
||||||
|
- **数据归属**:所有报价数据属于申办者,在投保人租户下呈现
|
||||||
|
|
@ -3,8 +3,11 @@
|
||||||
## 一、项目概述
|
## 一、项目概述
|
||||||
|
|
||||||
### 1.1 项目背景
|
### 1.1 项目背景
|
||||||
- **RMO定义**:RMO(Risk Management Organization,风险管理组织)是一个"一站式的、涉及到患者/受试者安全责任的保险与保障方案"。
|
- **RMO定义**:RMO(Risk Management Organization,风险管理组织)是一个"一站式的患者/受试者安全责任的保险与保障方案平台"。
|
||||||
- **项目目的**:我们需要做一个网站,用以介绍RMO的模式,介绍申办者、研究机构、SMO、CRO在临床试验中各自应承担的职责。从首页延伸出各角色的职责、以及保险的方法如何进行保证;保证(金)方式如何进行保障。最终确保受试者在临床试验过程中的安全。
|
- **项目目的**:
|
||||||
|
构建一站式临床试验、持有人责任保险知识/资源、报价、理赔平台;
|
||||||
|
- RMO的模式、申办者、研究机构在临床试验中各自应承担的职责;
|
||||||
|
- 保险的方法、保证(金)方式如何进行保障。
|
||||||
- **该网站所有内容围绕受试者安全保障与患者安全保障**。
|
- **该网站所有内容围绕受试者安全保障与患者安全保障**。
|
||||||
- **法律依据**:在临床试验中,申办者需要承担受试者保护的责任依据是《临床试验质量管理规范》第三十九条,
|
- **法律依据**:在临床试验中,申办者需要承担受试者保护的责任依据是《临床试验质量管理规范》第三十九条,
|
||||||
(一)申办者应当向研究者和临床试验机构提供与临床试验相关的法律上、经济上的保险或者保证,并与临床试验的风险性质和风险程度相适应。但不包括研究者和临床试验机构自身的过失所致的损害。
|
(一)申办者应当向研究者和临床试验机构提供与临床试验相关的法律上、经济上的保险或者保证,并与临床试验的风险性质和风险程度相适应。但不包括研究者和临床试验机构自身的过失所致的损害。
|
||||||
|
|
@ -13,20 +16,26 @@
|
||||||
|
|
||||||
### 1.2 网站目标
|
### 1.2 网站目标
|
||||||
- 协助药企(申办者、持有人)规划患者、受试者安全责任保障的方式、方法;
|
- 协助药企(申办者、持有人)规划患者、受试者安全责任保障的方式、方法;
|
||||||
- 清晰展示申办者、持有人、研究机构、SMO、CRO在临床试验中各自应承担的职责
|
- 清晰展示申办者、持有人、研究机构、SMO、CRO在临床试验中各自应承担的职责;
|
||||||
- 说明保险和保证方式如何保障受试者安全,帮助申办者承担其职责
|
- 说明保险和保证方式如何保障受试者安全,帮助申办者承担其职责;
|
||||||
- 为不同角色(申办方、持有人、试验机构、受试者、服务方)提供针对性的信息和服务
|
- 为不同角色(申办方、持有人、试验机构、受试者、服务方)提供针对性的信息和服务;
|
||||||
- **登录后系统**:为已登录用户提供工作台、项目管理、保障评估、智能工具等功能,根据用户角色呈现有权限的内容
|
- **登录后系统**:为已登录用户提供保险报价、保险管理。
|
||||||
|
|
||||||
### 1.3 目标用户
|
### 1.3 目标用户
|
||||||
- **主要用户**:申办者(制药企业、生物技术公司等)、持有人
|
- **主要用户**:投保人(申办者、持有人、临床试验研究机构)
|
||||||
- **次要用户**:研究机构、研究者、伦理委员会
|
- **次要用户**:华泰经纪、保险公司
|
||||||
- **其他用户**:CRO、CDMO、SMO、受试者
|
- **其他用户**:CXO、受试者
|
||||||
- **登录后系统用户角色**:
|
- **登录后系统用户角色**:
|
||||||
- **投保人**:可以是申办者、持有人;如果为研究者发起的试验,需要将其同时标记为申办者。可申请保障、查看自己的项目和保障、使用智能工具等
|
- **投保人**:申办者、持有人;研究者发起的试验:将其同时标记为申办者。
|
||||||
- **保险人**:保险公司,可查看分配给自己的项目、进行保障评估、处理报价和理赔、使用智能工具
|
- **服务方**:华泰经纪,与客户进行在线的项目沟通,报价。
|
||||||
|
|
||||||
|
### 1.4 目标用户
|
||||||
|
| 角色 | 名称 | 对应岗位 |
|
||||||
|
|-----------|-----------------|-----------------------------------|
|
||||||
|
| 投保人 | Policyholder | - 申办者采购、项目经理<br>- 上市后质量团队 |
|
||||||
|
| 保险人 | Insurer | - 保司核保人员 |
|
||||||
|
| 服务方 | TPA | - 临研安/华泰经纪 |
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 二、网站架构与页面结构
|
## 二、网站架构与页面结构
|
||||||
|
|
||||||
|
|
@ -0,0 +1,105 @@
|
||||||
|
临床试验责任保险报价流程:
|
||||||
|
# 目的:
|
||||||
|
- 收集保险报价必须的信息;
|
||||||
|
- 根据不同的报价用途:确定后续跟进频率(预算目的报价、申请试验开展);
|
||||||
|
- 第一时间占据所有保司的报价渠道,规避后续业务冲突;
|
||||||
|
- 返回保司报价的结果,方便投保人对比、选择。
|
||||||
|
|
||||||
|
# 角色
|
||||||
|
| 角色 | 名称 | 对应岗位 |
|
||||||
|
|----------|-----------------|----------------------------------|
|
||||||
|
| 投保人 | Policyholder | - 申办者采购、项目经理<br>- 上市后质量团队 |
|
||||||
|
| 保险人 | Insurer | - 保司核保人员 |
|
||||||
|
| 服务方 | TPA | - 临研安/华泰经纪 |
|
||||||
|
|
||||||
|
|
||||||
|
# 流程
|
||||||
|
- 投保人填写报价资料;
|
||||||
|
- 服务方生成保险报价;
|
||||||
|
- 服务方发送保险报价到保险公司,进行确认;
|
||||||
|
- 根据保司报价,整理形成可对比的报价方式,回复申办者;
|
||||||
|
|
||||||
|
# 报价资料
|
||||||
|
## 报价必备资料
|
||||||
|
- 项目方案编号(必填)
|
||||||
|
- 项目标题(必填)
|
||||||
|
- 申办者名称(必填)
|
||||||
|
- 受试药物名称(必填)
|
||||||
|
- 项目分期(I、II、III、IV期、其他:___)(必填)
|
||||||
|
- 试验受试者人数(必填)
|
||||||
|
- 报价用途:制定项目预算;申请试验开展;
|
||||||
|
- 每人责任限额(万元)(选项:≤10、15、20、30、≥50)[非必填,可以AI推荐];
|
||||||
|
- 累计责任限额[非必填,可以AI推荐];
|
||||||
|
- 每次事故免赔额[非必填,可以AI推荐];
|
||||||
|
|
||||||
|
## 申请报价页面
|
||||||
|
1. 简洁页面:
|
||||||
|
由AI自动识别,提取报价必备资料;上传:
|
||||||
|
- 项目方案文件上传(必填)
|
||||||
|
- 知情同意书上传
|
||||||
|
- 生成报价按钮
|
||||||
|
或,手动填写。
|
||||||
|
可以从简洁页面点击按钮跳转到详细页面。
|
||||||
|
2. 详细页面:
|
||||||
|
除上述简洁页面需要的字段,补充以下西信息:
|
||||||
|
- 疾病类型(选项:癌症、心脏类疾病、生育类疾病、疫苗试验、其他)
|
||||||
|
- 每一试验受试者的试验期限(月)(选项:6、(6,12]、(12,24]、(24,36]、(36,48]、(48,60]、(60,72]、(72,84]、>84)
|
||||||
|
- 质量管理水平(选项:通过GMP、ISO等认证,质量标准要求高,管理先进、通过必要的认证,质量标准要求较高,管理较先进、其他情况)
|
||||||
|
- 历史理赔赔付情况(选项:极少、较少、较多、极多)
|
||||||
|
- 试验受试者类型(选项:儿童、老年人、孕妇、其他成年人)
|
||||||
|
- 试验受试者健康状况(选项:良好、一般、较差)
|
||||||
|
- 安全性监测措施(选项:完善、较完善、不完善)
|
||||||
|
|
||||||
|
# 报价流程
|
||||||
|
- 投保人填写报价资料;
|
||||||
|
- 服务方生成保险报价;
|
||||||
|
- 服务方发送保险报价到保险公司,进行确认;
|
||||||
|
- 根据保司报价,整理形成可对比的报价方式,回复投保人;
|
||||||
|
- 投保人如需要调整报价,可以联系经纪人,线下沟通、调整报价;
|
||||||
|
|
||||||
|
# 报价记录状态
|
||||||
|
```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
|
||||||
|
```
|
||||||
|
|
||||||
|
- **API Smart-Ops**:报价信息通过 API 传输到 Smart-Ops 系统,用于后续报价、投保、理赔等流程
|
||||||
|
- **任务跟踪**:每保司报价生成一条任务,系统跟踪每一任务的完成状态
|
||||||
|
- **回复渠道**:保司报价回复至 RMO@vdano.com
|
||||||
|
- **数据归属**:所有报价数据属于申办者,在投保人租户下呈现
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 与Smart-OPS的衔接
|
||||||
|
- 收集到的报价信息,报价信息将传输到Smart-OPS系统,工作台进行后续的报价、投保、理赔等流程;
|
||||||
|
- 临研安人员登录Smart-OPS系统,进行报价,所有报价数据属于申办者所有,该数据将在投保人租户下呈现;
|
||||||
|
- 临研安人员在工作台页面处理所有报价的评估、整理。
|
||||||
|
-
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 444 KiB |
File diff suppressed because one or more lines are too long
Binary file not shown.
|
|
@ -0,0 +1,232 @@
|
||||||
|
<template>
|
||||||
|
<nav class="breadcrumb" aria-label="面包屑导航">
|
||||||
|
<ol class="breadcrumb-list">
|
||||||
|
<li v-for="(item, index) in items" :key="item.path" class="breadcrumb-item">
|
||||||
|
<template v-if="index < items.length - 1">
|
||||||
|
<RouterLink :to="item.path" class="breadcrumb-link">{{ item.label }}</RouterLink>
|
||||||
|
<span class="breadcrumb-sep">/</span>
|
||||||
|
</template>
|
||||||
|
<span v-else class="breadcrumb-current" aria-current="page">{{ item.label }}</span>
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { computed } from 'vue'
|
||||||
|
import { useRoute } from 'vue-router'
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
|
|
||||||
|
// 路径到中文标签的映射(按路径长度降序,优先匹配长路径)
|
||||||
|
const pathLabels: Record<string, string> = {
|
||||||
|
// 关于RMO
|
||||||
|
'/about/overview': 'RMO概述',
|
||||||
|
'/about/insurers': '合作保司',
|
||||||
|
'/about/brokers': '专家经纪',
|
||||||
|
'/about/third-party': '第三方机构',
|
||||||
|
'/about': '关于RMO',
|
||||||
|
// 风险职责
|
||||||
|
'/concern': '风险职责',
|
||||||
|
'/sponsor': '申办者',
|
||||||
|
'/holder': '持有人',
|
||||||
|
'/institution': '研究中心',
|
||||||
|
'/service-provider': 'CXO',
|
||||||
|
'/participant': '参与者',
|
||||||
|
// 解决方案
|
||||||
|
'/solutions/pharmacovigilance': '药物警戒',
|
||||||
|
'/solutions/clinical-insurance': '临床保险',
|
||||||
|
'/solutions/product-insurance': '产品保险',
|
||||||
|
'/solutions/fund-payment': '资金支付',
|
||||||
|
'/solutions': '解决方案',
|
||||||
|
// 风险数据
|
||||||
|
'/risk-data/smart-acquisition': '智能采集',
|
||||||
|
'/risk-data/pv-report': 'PV报告',
|
||||||
|
'/risk-data/drug-safety-dict': '药安词典',
|
||||||
|
'/risk-data/pv-service': 'PV服务',
|
||||||
|
'/risk-data/ai-tools': 'AI工具',
|
||||||
|
'/risk-data': '风险数据',
|
||||||
|
// 临床试验
|
||||||
|
'/rmo-mode/insurance': '保险方案',
|
||||||
|
'/rmo-mode/guarantee': '保证方案',
|
||||||
|
'/rmo-mode/insurance-guarantee': '保险保证',
|
||||||
|
'/rmo-mode': '临床试验',
|
||||||
|
// 上市应用
|
||||||
|
'/post-market/insurance': '保险方案',
|
||||||
|
'/post-market/guarantee': '保证设计',
|
||||||
|
'/post-market': '上市应用',
|
||||||
|
// 知识资源
|
||||||
|
'/knowledge/PVknowledge': 'PV知识',
|
||||||
|
'/knowledge/ai-app': 'AI应用',
|
||||||
|
'/knowledge/insurance/PVknowledge': '基础知识',
|
||||||
|
'/knowledge/insurance/overseas': '国外比较',
|
||||||
|
'/knowledge/insurance/group-standard': '条款标准',
|
||||||
|
'/knowledge/insurance': '保险知识',
|
||||||
|
'/knowledge/pv-insurance': 'PV保险知识',
|
||||||
|
'/knowledge/learning-center/cases': '案例学习',
|
||||||
|
'/knowledge/learning-center/videos': '培训视频',
|
||||||
|
'/knowledge/learning-center/exam': '考试中心',
|
||||||
|
'/knowledge/learning-center': '学习中心',
|
||||||
|
'/knowledge': '知识资源',
|
||||||
|
// 资源中心
|
||||||
|
'/system-management/laws': '法律法规',
|
||||||
|
'/system-management/practice-guide': '实践指南',
|
||||||
|
'/system-management/training': '培训材料',
|
||||||
|
'/system-management/faq': '常见问题',
|
||||||
|
'/system-management': '资源中心',
|
||||||
|
// FAQ
|
||||||
|
'/faq/duty-logic': '职责逻辑',
|
||||||
|
'/faq/coverage': '保障范围',
|
||||||
|
'/faq/pv-insurance': 'PV与保险',
|
||||||
|
'/faq': '常见问题',
|
||||||
|
// 其他
|
||||||
|
'/contact': '联系我们',
|
||||||
|
'/privacy-policy': '隐私政策',
|
||||||
|
'/overseas': '海外风险',
|
||||||
|
'/login': '登录',
|
||||||
|
// Dashboard
|
||||||
|
'/dashboard': '工作台',
|
||||||
|
'/dashboard/project-quotes': '项目报价',
|
||||||
|
'/dashboard/projects': '项目列表',
|
||||||
|
'/dashboard/projects/:id': '项目详情',
|
||||||
|
'/dashboard/inquiries': '询价列表',
|
||||||
|
'/dashboard/inquiries/:id': '询价详情',
|
||||||
|
'/dashboard/claims': '理赔进度',
|
||||||
|
'/dashboard/claims/:id': '理赔详情',
|
||||||
|
'/dashboard/tools': '智能工具',
|
||||||
|
'/dashboard/tools/premium-calculator': '保费测算工具',
|
||||||
|
'/dashboard/tools/icf-editor': 'ICF智能修改',
|
||||||
|
'/dashboard/tools/risk-scoring': '方案风险评分',
|
||||||
|
'/dashboard/tools/protocol-risk': '方案风险评估',
|
||||||
|
'/dashboard/tools/drug-safety': '药安查',
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLabel(path: string): string {
|
||||||
|
// 精确匹配
|
||||||
|
if (pathLabels[path]) return pathLabels[path]
|
||||||
|
// 动态参数匹配
|
||||||
|
const idMatch = path.match(/^(\/dashboard\/projects\/)[^/]+$/)
|
||||||
|
if (idMatch) return '项目详情'
|
||||||
|
const inquiryMatch = path.match(/^(\/dashboard\/inquiries\/)[^/]+$/)
|
||||||
|
if (inquiryMatch) return '询价详情'
|
||||||
|
const claimMatch = path.match(/^(\/dashboard\/claims\/)[^/]+$/)
|
||||||
|
if (claimMatch) return '理赔详情'
|
||||||
|
// 按路径段匹配
|
||||||
|
const segments = path.split('/').filter(Boolean)
|
||||||
|
const lastSegment = segments[segments.length - 1]
|
||||||
|
const segmentLabels: Record<string, string> = {
|
||||||
|
overview: 'RMO概述',
|
||||||
|
insurers: '合作保司',
|
||||||
|
brokers: '专家经纪',
|
||||||
|
'third-party': '第三方机构',
|
||||||
|
pharmacovigilance: '药物警戒',
|
||||||
|
'clinical-insurance': '临床保险',
|
||||||
|
'product-insurance': '产品保险',
|
||||||
|
'fund-payment': '资金支付',
|
||||||
|
'smart-acquisition': '智能采集',
|
||||||
|
'pv-report': 'PV报告',
|
||||||
|
'drug-safety-dict': '药安词典',
|
||||||
|
'pv-service': 'PV服务',
|
||||||
|
'ai-tools': 'AI工具',
|
||||||
|
insurance: '保险方案',
|
||||||
|
guarantee: '保证方案',
|
||||||
|
'insurance-guarantee': '保险保证',
|
||||||
|
PVknowledge: 'PV知识',
|
||||||
|
'ai-app': 'AI应用',
|
||||||
|
overseas: '国外比较',
|
||||||
|
'group-standard': '条款标准',
|
||||||
|
'pv-insurance': 'PV保险知识',
|
||||||
|
cases: '案例学习',
|
||||||
|
videos: '培训视频',
|
||||||
|
exam: '考试中心',
|
||||||
|
laws: '法律法规',
|
||||||
|
'practice-guide': '实践指南',
|
||||||
|
training: '培训材料',
|
||||||
|
'duty-logic': '职责逻辑',
|
||||||
|
coverage: '保障范围',
|
||||||
|
'privacy-policy': '隐私政策',
|
||||||
|
'project-quotes': '项目报价',
|
||||||
|
projects: '项目列表',
|
||||||
|
inquiries: '询价列表',
|
||||||
|
claims: '理赔进度',
|
||||||
|
tools: '智能工具',
|
||||||
|
'premium-calculator': '保费测算工具',
|
||||||
|
'icf-editor': 'ICF智能修改',
|
||||||
|
'risk-scoring': '方案风险评分',
|
||||||
|
'protocol-risk': '方案风险评估',
|
||||||
|
'drug-safety': '药安查',
|
||||||
|
}
|
||||||
|
return segmentLabels[lastSegment] || lastSegment || '页面'
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildBreadcrumbItems(): { path: string; label: string }[] {
|
||||||
|
const path = route.path
|
||||||
|
if (!path || path === '/') return []
|
||||||
|
|
||||||
|
const items: { path: string; label: string }[] = [{ path: '/', label: '首页' }]
|
||||||
|
const segments = path.split('/').filter(Boolean)
|
||||||
|
|
||||||
|
let currentPath = ''
|
||||||
|
for (let i = 0; i < segments.length; i++) {
|
||||||
|
const seg = segments[i]
|
||||||
|
// 跳过动态参数,使用父级路径
|
||||||
|
if (seg === ':id' || /^\d+$/.test(seg) || /^[a-f0-9-]{36}$/i.test(seg)) {
|
||||||
|
currentPath += '/' + seg
|
||||||
|
items.push({ path: currentPath, label: getLabel(currentPath) })
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
currentPath += (currentPath ? '/' : '/') + seg
|
||||||
|
items.push({ path: currentPath, label: getLabel(currentPath) })
|
||||||
|
}
|
||||||
|
|
||||||
|
return items
|
||||||
|
}
|
||||||
|
|
||||||
|
const items = computed(() => buildBreadcrumbItems())
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.breadcrumb {
|
||||||
|
background: var(--breadcrumb-bg, #f8f9fa);
|
||||||
|
border-bottom: 1px solid var(--breadcrumb-border, #e9ecef);
|
||||||
|
padding: 0.5rem 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumb-list {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.25rem;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 1rem;
|
||||||
|
max-width: 1200px;
|
||||||
|
margin-inline: auto;
|
||||||
|
list-style: none;
|
||||||
|
font-size: 0.875rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumb-item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumb-link {
|
||||||
|
color: var(--breadcrumb-link, #0d6efd);
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumb-link:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumb-sep {
|
||||||
|
color: var(--breadcrumb-sep, #6c757d);
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.breadcrumb-current {
|
||||||
|
color: var(--breadcrumb-current, #212529);
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -350,6 +350,12 @@
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.dashboard-content > :deep(.breadcrumb) {
|
||||||
|
margin: calc(-1 * var(--padding-xl, 24px)) calc(-1 * var(--padding-xl, 24px)) var(--padding-xl, 24px);
|
||||||
|
padding-left: var(--padding-xl, 24px);
|
||||||
|
padding-right: var(--padding-xl, 24px);
|
||||||
|
}
|
||||||
|
|
||||||
/* 响应式设计 */
|
/* 响应式设计 */
|
||||||
@media (max-width: 1200px) {
|
@media (max-width: 1200px) {
|
||||||
.header-nav {
|
.header-nav {
|
||||||
|
|
|
||||||
|
|
@ -104,6 +104,7 @@
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<main class="dashboard-content">
|
<main class="dashboard-content">
|
||||||
|
<Breadcrumb />
|
||||||
<RouterView />
|
<RouterView />
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -114,6 +115,7 @@
|
||||||
import { ref, computed } from 'vue'
|
import { ref, computed } from 'vue'
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
import { useAuthStore } from '@/stores/auth'
|
import { useAuthStore } from '@/stores/auth'
|
||||||
|
import Breadcrumb from './Breadcrumb.vue'
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,7 @@ function Header() {
|
||||||
onMouseLeave={() => setKnowledgeOpen(false)}
|
onMouseLeave={() => setKnowledgeOpen(false)}
|
||||||
>
|
>
|
||||||
<Link
|
<Link
|
||||||
to="/knowledge/regulations"
|
to="/knowledge/PVknowledge"
|
||||||
className={isActiveParent(['/knowledge', '/system-management', '/faq']) ? 'active' : ''}
|
className={isActiveParent(['/knowledge', '/system-management', '/faq']) ? 'active' : ''}
|
||||||
>
|
>
|
||||||
知识资源
|
知识资源
|
||||||
|
|
@ -115,10 +115,10 @@ function Header() {
|
||||||
</Link>
|
</Link>
|
||||||
{knowledgeOpen && (
|
{knowledgeOpen && (
|
||||||
<div className="dropdown-menu dropdown-menu-level2">
|
<div className="dropdown-menu dropdown-menu-level2">
|
||||||
<Link to="/knowledge/regulations">法规指南</Link>
|
<Link to="/knowledge/PVknowledge">PV知识</Link>
|
||||||
<Link to="/knowledge/insurance">保险知识</Link>
|
<Link to="/knowledge/pv-insurance">保险知识</Link>
|
||||||
<Link to="/knowledge/pv-insurance">PV与保险</Link>
|
|
||||||
<Link to="/faq">常见问题</Link>
|
<Link to="/faq">常见问题</Link>
|
||||||
|
<Link to="/knowledge/insurance">学习中心</Link>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -73,7 +73,7 @@
|
||||||
@mouseleave="knowledgeOpen = false"
|
@mouseleave="knowledgeOpen = false"
|
||||||
>
|
>
|
||||||
<RouterLink
|
<RouterLink
|
||||||
to="/knowledge/regulations"
|
to="/knowledge/PVknowledge"
|
||||||
:class="{ active: isActiveParent(knowledgePaths) }"
|
:class="{ active: isActiveParent(knowledgePaths) }"
|
||||||
>
|
>
|
||||||
知识资源
|
知识资源
|
||||||
|
|
@ -81,13 +81,13 @@
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
<div v-show="knowledgeOpen" class="dropdown-menu dropdown-menu-level2 dropdown-menu-level3-wrapper dropdown-menu-knowledge">
|
<div v-show="knowledgeOpen" class="dropdown-menu dropdown-menu-level2 dropdown-menu-level3-wrapper dropdown-menu-knowledge">
|
||||||
<div class="dropdown-submenu">
|
<div class="dropdown-submenu">
|
||||||
<RouterLink to="/knowledge/regulations" class="dropdown-submenu-title-link">PV知识</RouterLink>
|
<RouterLink to="/knowledge/PVknowledge" class="dropdown-submenu-title-link">PV知识</RouterLink>
|
||||||
<RouterLink to="/knowledge/regulations">法规指南</RouterLink>
|
<RouterLink to="/knowledge/PVknowledge">法规指南</RouterLink>
|
||||||
<RouterLink to="/knowledge/ai-app">AI应用</RouterLink>
|
<RouterLink to="/knowledge/ai-app">AI应用</RouterLink>
|
||||||
</div>
|
</div>
|
||||||
<div class="dropdown-submenu">
|
<div class="dropdown-submenu">
|
||||||
<RouterLink to="/knowledge/insurance" class="dropdown-submenu-title-link">保险知识</RouterLink>
|
<RouterLink to="/knowledge/insurance" class="dropdown-submenu-title-link">保险知识</RouterLink>
|
||||||
<RouterLink to="/knowledge/insurance/regulations">基础知识</RouterLink>
|
<RouterLink to="/knowledge/insurance/PVknowledge">基础知识</RouterLink>
|
||||||
<RouterLink to="/knowledge/insurance/overseas">国外比较</RouterLink>
|
<RouterLink to="/knowledge/insurance/overseas">国外比较</RouterLink>
|
||||||
<RouterLink to="/knowledge/insurance/group-standard">条款标准</RouterLink>
|
<RouterLink to="/knowledge/insurance/group-standard">条款标准</RouterLink>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
<div class="layout">
|
<div class="layout">
|
||||||
<Header />
|
<Header />
|
||||||
<main class="main-content">
|
<main class="main-content">
|
||||||
|
<Breadcrumb v-if="route.path !== '/'" />
|
||||||
<RouterView />
|
<RouterView />
|
||||||
</main>
|
</main>
|
||||||
<Footer />
|
<Footer />
|
||||||
|
|
@ -10,9 +11,13 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { useRoute } from 'vue-router'
|
||||||
import Header from './Header.vue'
|
import Header from './Header.vue'
|
||||||
import Footer from './Footer.vue'
|
import Footer from './Footer.vue'
|
||||||
|
import Breadcrumb from './Breadcrumb.vue'
|
||||||
import CookieConsent from './CookieConsent.vue'
|
import CookieConsent from './CookieConsent.vue'
|
||||||
|
|
||||||
|
const route = useRoute()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ const flowSteps = [
|
||||||
{
|
{
|
||||||
title: 'RMO解决方案',
|
title: 'RMO解决方案',
|
||||||
points: [
|
points: [
|
||||||
'基于风险管理科学识别风险,采取措施',
|
'基于风险管理科学识别风险,设置保障方案',
|
||||||
'专业评估、24小时响应,一站式理赔支持',
|
'专业评估、24小时响应,一站式理赔支持',
|
||||||
'积极解纷,服务研究者与试验参与者'
|
'积极解纷,服务研究者与试验参与者'
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -129,20 +129,20 @@ function Home() {
|
||||||
<h2 className="section-title">核心能力</h2>
|
<h2 className="section-title">核心能力</h2>
|
||||||
<div className="capabilities-grid">
|
<div className="capabilities-grid">
|
||||||
<div className="capability-item">
|
<div className="capability-item">
|
||||||
<div className="capability-number">10,000+</div>
|
<div className="capability-number">10+</div>
|
||||||
<div className="capability-label">服务项目</div>
|
<div className="capability-label">可承保保司</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="capability-item">
|
<div className="capability-item">
|
||||||
<div className="capability-number">3,600+</div>
|
<div className="capability-number">50种以上+</div>
|
||||||
<div className="capability-label">合作客户</div>
|
<div className="capability-label">不同保障方案</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="capability-item">
|
<div className="capability-item">
|
||||||
<div className="capability-number">180+</div>
|
<div className="capability-number">Top 5</div>
|
||||||
<div className="capability-label">服务网络</div>
|
<div className="capability-label">创新药企业</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="capability-item">
|
<div className="capability-item">
|
||||||
<div className="capability-number">130+</div>
|
<div className="capability-number">7/15天</div>
|
||||||
<div className="capability-label">创新药项目</div>
|
<div className="capability-label">理赔结论时限承诺</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -155,9 +155,9 @@ function Home() {
|
||||||
>
|
>
|
||||||
<div className="section-content">
|
<div className="section-content">
|
||||||
<h2 className="section-title">知识资源</h2>
|
<h2 className="section-title">知识资源</h2>
|
||||||
<p className="section-subtitle">分享我们的行业洞见和研发咨询</p>
|
<p className="section-subtitle">分享我们对行业的洞见和风险资讯</p>
|
||||||
<div className="knowledge-grid">
|
<div className="knowledge-grid">
|
||||||
<Link to="/knowledge/regulations" className="knowledge-card">
|
<Link to="/knowledge/PVknowledge" className="knowledge-card">
|
||||||
<h3>法规指南</h3>
|
<h3>法规指南</h3>
|
||||||
<p>最新的法律法规与实践指南</p>
|
<p>最新的法律法规与实践指南</p>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ import PageContainer from '../components/PageContainer'
|
||||||
import PageHeader from '../components/PageHeader'
|
import PageHeader from '../components/PageHeader'
|
||||||
import './KnowledgeBase.css'
|
import './KnowledgeBase.css'
|
||||||
|
|
||||||
function KnowledgeRegulations() {
|
function KnowledgePVknowledge() {
|
||||||
return (
|
return (
|
||||||
<PageContainer>
|
<PageContainer>
|
||||||
<div className="knowledge-page">
|
<div className="knowledge-page">
|
||||||
|
|
@ -35,4 +35,4 @@ function KnowledgeRegulations() {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export default KnowledgeRegulations
|
export default KnowledgePVknowledge
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import PageHeader from '../components/PageHeader'
|
||||||
import './ResourceCenter.css'
|
import './ResourceCenter.css'
|
||||||
|
|
||||||
// 法律法规页面
|
// 法律法规页面
|
||||||
function LawsRegulations() {
|
function LawsPVknowledge() {
|
||||||
return (
|
return (
|
||||||
<PageContainer>
|
<PageContainer>
|
||||||
<div className="resource-center">
|
<div className="resource-center">
|
||||||
|
|
@ -189,7 +189,7 @@ function ResourceCenter() {
|
||||||
|
|
||||||
// 根据路径显示不同内容
|
// 根据路径显示不同内容
|
||||||
if (location.pathname.includes('/laws')) {
|
if (location.pathname.includes('/laws')) {
|
||||||
return <LawsRegulations />
|
return <LawsPVknowledge />
|
||||||
} else if (location.pathname.includes('/practice-guide')) {
|
} else if (location.pathname.includes('/practice-guide')) {
|
||||||
return <PracticeGuide />
|
return <PracticeGuide />
|
||||||
} else if (location.pathname.includes('/training')) {
|
} else if (location.pathname.includes('/training')) {
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ import PVReport from '@/views/PVReport.vue'
|
||||||
import DrugSafetyDict from '@/views/DrugSafetyDict.vue'
|
import DrugSafetyDict from '@/views/DrugSafetyDict.vue'
|
||||||
import RmoMode from '@/views/RmoMode.vue'
|
import RmoMode from '@/views/RmoMode.vue'
|
||||||
import PostMarket from '@/views/PostMarket.vue'
|
import PostMarket from '@/views/PostMarket.vue'
|
||||||
import KnowledgeRegulations from '@/views/KnowledgeRegulations.vue'
|
import KnowledgePVknowledge from '@/views/KnowledgePVknowledge.vue'
|
||||||
import KnowledgeInsurance from '@/views/KnowledgeInsurance.vue'
|
import KnowledgeInsurance from '@/views/KnowledgeInsurance.vue'
|
||||||
import KnowledgePvInsurance from '@/views/KnowledgePvInsurance.vue'
|
import KnowledgePvInsurance from '@/views/KnowledgePvInsurance.vue'
|
||||||
import ResourceCenter from '@/views/ResourceCenter.vue'
|
import ResourceCenter from '@/views/ResourceCenter.vue'
|
||||||
|
|
@ -86,10 +86,10 @@ const router = createRouter({
|
||||||
{ path: 'post-market', component: PostMarket },
|
{ path: 'post-market', component: PostMarket },
|
||||||
{ path: 'post-market/insurance', component: PostMarket },
|
{ path: 'post-market/insurance', component: PostMarket },
|
||||||
{ path: 'post-market/guarantee', component: PostMarket },
|
{ path: 'post-market/guarantee', component: PostMarket },
|
||||||
{ path: 'knowledge/regulations', component: KnowledgeRegulations },
|
{ path: 'knowledge/PVknowledge', component: KnowledgePVknowledge },
|
||||||
{ path: 'knowledge/ai-app', component: SmartAcquisition },
|
{ path: 'knowledge/ai-app', component: SmartAcquisition },
|
||||||
{ path: 'knowledge/insurance', component: KnowledgeInsurance },
|
{ path: 'knowledge/insurance', component: KnowledgeInsurance },
|
||||||
{ path: 'knowledge/insurance/regulations', component: KnowledgeRegulations },
|
{ path: 'knowledge/insurance/PVknowledge', component: KnowledgePVknowledge },
|
||||||
{ path: 'knowledge/insurance/overseas', component: Overseas },
|
{ path: 'knowledge/insurance/overseas', component: Overseas },
|
||||||
{ path: 'knowledge/insurance/group-standard', component: KnowledgeInsurance },
|
{ path: 'knowledge/insurance/group-standard', component: KnowledgeInsurance },
|
||||||
{ path: 'knowledge/pv-insurance', component: KnowledgePvInsurance },
|
{ path: 'knowledge/pv-insurance', component: KnowledgePvInsurance },
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else-if="i === 3" class="knowledge-grid">
|
<div v-else-if="i === 3" class="knowledge-grid">
|
||||||
<RouterLink to="/knowledge/regulations" class="knowledge-card">
|
<RouterLink to="/knowledge/PVknowledge" class="knowledge-card">
|
||||||
<h3>法规指南</h3>
|
<h3>法规指南</h3>
|
||||||
<p>最新的法律法规与实践指南</p>
|
<p>最新的法律法规与实践指南</p>
|
||||||
</RouterLink>
|
</RouterLink>
|
||||||
|
|
@ -97,15 +97,15 @@ const sections = [
|
||||||
{ class: 'hero-section', title: '', subtitle: '' },
|
{ class: 'hero-section', title: '', subtitle: '' },
|
||||||
{ class: 'solutions-section', title: '', subtitle: '' },
|
{ class: 'solutions-section', title: '', subtitle: '' },
|
||||||
{ class: 'capabilities-section', title: '核心能力', subtitle: '' },
|
{ class: 'capabilities-section', title: '核心能力', subtitle: '' },
|
||||||
{ class: 'knowledge-section', title: '知识资源', subtitle: '分享我们的行业洞见和研发咨询' },
|
{ class: 'knowledge-section', title: '知识资源', subtitle: '分享我们对行业的洞见和风险资讯' },
|
||||||
{ class: 'contact-section', title: '联系我们', subtitle: '获取RMO最新资讯,第一时间了解我们的企业动态' }
|
{ class: 'contact-section', title: '联系我们', subtitle: '获取RMO最新资讯,第一时间了解我们的企业动态' }
|
||||||
]
|
]
|
||||||
|
|
||||||
const capabilities = [
|
const capabilities = [
|
||||||
{ number: '10,000+', label: '服务项目' },
|
{ number: '100+', label: '患者安全专家' },
|
||||||
{ number: '3,600+', label: '合作客户' },
|
{ number: '10+', label: '合作保司' },
|
||||||
{ number: '180+', label: '服务网络' },
|
{ number: '1st', label: '第一个团标与数字化系统' },
|
||||||
{ number: '130+', label: '创新药项目' }
|
{ number: '7/15', label: '服务时限承诺' }
|
||||||
]
|
]
|
||||||
|
|
||||||
function goToSection(index: number) {
|
function goToSection(index: number) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
<template>
|
||||||
|
<PageContainer>
|
||||||
|
<div class="knowledge-page">
|
||||||
|
<PageHeader title="PV知识" description="药物警戒与风险管理相关知识" />
|
||||||
|
<div class="page-body">
|
||||||
|
<section class="section">
|
||||||
|
<div class="container">
|
||||||
|
<div class="knowledge-content">
|
||||||
|
<div class="knowledge-card">
|
||||||
|
<h3>药物警戒法规</h3>
|
||||||
|
<p>药物警戒相关的法律法规要求,包括GVP、药物管理法等。</p>
|
||||||
|
</div>
|
||||||
|
<div class="knowledge-card">
|
||||||
|
<h3>实践指南</h3>
|
||||||
|
<p>药物警戒行业最佳实践指南,协助风险管理,保障受试者安全。</p>
|
||||||
|
</div>
|
||||||
|
<div class="knowledge-card">
|
||||||
|
<h3>行业动态</h3>
|
||||||
|
<p>最新的药物警戒风险提示与行业信息,及时了解行业变化。</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</PageContainer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import PageContainer from '@/components/PageContainer.vue'
|
||||||
|
import PageHeader from '@/components/PageHeader.vue'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
@import '@/pages/KnowledgeBase.css';
|
||||||
|
</style>
|
||||||
Loading…
Reference in New Issue