3. 电子知情同意平台的整体架构设计

电子知情同意(eConsent)平台不是把纸质同意书搬到屏幕上那么简单。它要在受试者阅读、提问、签署、留存、稽查的全过程中,同时满足法规可追溯、数据不可篡改、与临床系统实时协同三重要求。因此,架构设计的核心任务是:把"人机交互""业务规则""证据留存""系统协同"这四类关注点分离到不同层,并明确层与层之间的契约。本节采用四层架构——前端交互层、业务逻辑层、数据持久层、外部系统集成层,并给出系统上下文图与部署图的落地画法。

一、四层架构的职责边界

前端交互层面向受试者、研究者、监查员三类角色,负责知情材料呈现、多媒体播放、理解度测验、电子签名采集与离线缓存。关键约束是:所有签署动作必须在客户端完成"身份再确认+意愿勾选+签名笔迹"三要素采集,且本地只做暂存,不做最终生效判定。

业务逻辑层是平台的"规则中枢",承载版本管理、签署流程编排、理解度测验判分、签署有效性校验、审计事件生成。它必须回答一个核心问题:这次签署是否构成一次合法有效的知情同意? 判定依据包括:受试者是否已阅读当前生效版本、测验是否达标、签名时间是否落在访视窗口内、是否存在重复签署。

数据持久层负责同意书版本、签署记录、审计日志、签名图像与哈希值的存储。设计要点是签署记录只追加不修改,任何更正以"补充记录+原因"方式实现;同时保存原文哈希,用于事后完整性校验。

外部系统集成层对接EDC、CTMS、IWRS、ePRO与身份认证服务,实现受试者状态同步、访视触发、随机化前置校验等。集成层应统一封装协议差异,向上提供稳定的领域接口。

eConsent 平台四层架构与系统上下文 前端交互层 受试者端 阅读/视频/测验/签名 研究者端 知情过程记录/答疑 监查/稽查端 审计追溯/导出 离线缓存 暂存待同步 业务逻辑层 版本管理 生效/失效/冻结 签署流程编排 阅读→测验→签名 有效性校验 窗口/重复/达标 审计事件生成 谁/何时/何操作 通知服务 待办/提醒 数据持久层 同意书版本库 正文+哈希+生效期 签署记录库 只追加不可改 审计日志库 时间戳+操作者 签名与附件 图像/PDF/视频 外部系统集成层 EDC 数据采集 CTMS 试验管理 IWRS 随机化 ePRO 受试者报告 身份认证服务 OAuth2 / SSO / 短信 API 请求 / 签署指令 持久化 / 审计写入 领域接口调用

二、系统上下文图:谁与平台交互

系统上下文图回答"平台边界在哪里"。以某III期肿瘤试验为例,平台外部实体包括:受试者(阅读与签署)、研究者/授权护士(发起知情、答疑、确认)、监查员(核查签署完整性)、EDC(接收同意状态与日期)、IWRS(随机化前校验同意是否有效)、身份认证服务(短信验证码或SSO)。平台与EDC之间传递的是"受试者编号—同意版本—签署日期—有效性标志"四元组;与IWRS之间是同步校验接口,若同意无效则拒绝发放随机号。这种上下文关系决定了集成层必须提供幂等接口,避免重复推送导致状态错乱。

三、部署图:从逻辑层到物理节点

部署图把逻辑层映射到真实运行环境。推荐的最小生产部署为:Web/应用服务器承载前端静态资源与业务逻辑服务(可容器化,双实例负载均衡);数据库服务器部署PostgreSQL主从,签署记录库启用WAL归档;对象存储存放签名图像、PDF与视频,开启版本控制与合规锁定;审计日志单独落库并每日生成哈希链摘要,摘要文件异地备份。受试者端通过HTTPS访问,研究者端可走院内网+双因素认证。若试验涉及多中心,集成层以"中心编号"作为路由键,确保数据隔离。

四、关键设计决策与示例参数

以下给出一份可直接参考的签署有效性校验规则表(示例参数,实际项目需按方案调整):

校验项规则不通过时的处理
版本一致性签署版本 = 当前生效版本阻断签署,提示重新阅读
理解度测验得分 ≥ 80 分(满分100)允许重测,最多3次
访视窗口签署时间在访视窗口 ±3 天内标记超窗,需研究者备注
重复签署同一受试者同一版本仅一条有效记录拒绝写入,返回已有记录ID
签名完整性签名图像非空且哈希可校验要求重新签名

在实现层面,业务逻辑层可用如下伪代码表达签署提交的核心判定顺序:

function submitConsent(subjectId, versionId, quizScore, signTime, signatureHash):
    version = versionRepo.getEffective(versionId)
    if version == null: return REJECT("版本未生效")
    if quizScore < 80: return REJECT("测验未达标")
    if not inVisitWindow(subjectId, signTime, ±3d): markFlag("超窗")
    if consentRepo.existsValid(subjectId, versionId): return REJECT("重复签署")
    record = consentRepo.append(subjectId, versionId, signTime, signatureHash)
    auditLog.write("SIGN", subjectId, versionId, signTime)
    integration.pushToEDC(subjectId, versionId, signTime, "VALID")
    return ACCEPT(record.id)
部署时建议把"审计日志写入"与"签署记录写入"放在同一数据库事务中,确保任何一次签署都能被完整追溯;若使用消息队列异步推送EDC,需在集成层实现重试与死信队列,避免同意状态丢失。

五、架构落地检查要点

  • 层间契约清晰:前端不直接访问数据库,集成层不承载业务规则。
  • 签署记录不可变:任何更正以追加记录实现,保留原记录与原因。
  • 哈希可验证:同意书正文、签名图像均保存哈希,支持事后完整性校验。
  • 集成幂等:向EDC/IWRS推送使用唯一业务键,重复调用不产生副作用。
  • 部署可扩展:应用无状态化,会话与缓存外置,便于多中心横向扩容。

四层架构的价值不在于画得漂亮,而在于让每个团队知道自己的边界:前端只管采集与呈现,业务层只管判定与编排,持久层只管不可篡改地留存,集成层只管稳定地对外协同。把这四条边界守住,eConsent平台才能在稽查、核查与多系统联动中站得住。