12 KiB
报表分析模块接口核验与后端接口需求
核验基准:MEDISIGN 患者电子签 API 文档(https://ipad.shenynet.com/doc.html#/home)。
本次核验时间:2026-09-01。接口文档当前为 v1,未提供独立的“报表分析”接口分组。
1. 核验结论
当前报表页面可以使用现有签署任务、模板和组织接口完成基础展示,但后端暂时没有报表聚合能力。页面真实模式目前采用以下临时方案:
- 查询当前用户有权查看的全部签署任务;
- 按接口允许的最大页大小 200 条循环请求所有分页;
- 使用模板接口补充文档名称和类别;
- 使用院区、科室接口补充筛选字典;
- 在前端按业务时间范围聚合指标、趋势和科室分布。
这个方案适合联调和小数据量验证,不适合作为长期报表架构。任务量增大后,首次打开页面会产生多次请求并占用浏览器内存;而且当前任务列表只支持按 createdAt 查询,无法让后端直接按签署完成时间或过期时间聚合。
2. 当前已接入接口
| 页面功能 | 接口 | 状态 | 说明 |
|---|---|---|---|
| 签署任务明细 | GET /api/v1/sign-tasks |
已接入 | 读取所有可见分页,使用 page、size,最大页大小为 200 |
| 任务状态 | GET /api/v1/sign-tasks |
已接入 | 使用 CREATED、WAITING_SIGN、GENERATING、SIGNED、EXPIRED、VOIDED、FAILED 映射页面状态 |
| 任务时间 | GET /api/v1/sign-tasks |
已接入 | 使用 createdAt、signedAt、expiredAt |
| 文档名称和类别 | GET /api/v1/templates/available-versions |
已接入 | 用 templateVersionId 关联模板版本;历史模板不可见时只能降级显示 |
| 院区筛选 | GET /api/v1/campuses |
已接入 | 动态生成院区选项,并用 campusId 映射任务院区 |
| 科室筛选 | GET /api/v1/departments |
已接入 | 动态生成科室选项;任务中出现的科室也会补入选项 |
| 明细查看 | 工作台任务详情路由 | 已接入 | 点击明细跳转签署工作台,由工作台查询任务详情和签署文件 |
| 当前筛选导出 | 浏览器生成 CSV | 已接入 | 导出当前已加载且按创建时间筛选的任务;不是后端审计型导出 |
GET /api/v1/sign-tasks 当前文档明确支持的筛选字段包括:
page、size;keyword、patientId、visitId、templateVersionId;status、signMethod、campusId、departmentId;createdFrom、createdTo。
响应中已经提供报表所需的基础字段:任务状态、签署方式、患者和就诊脱敏快照、院区/科室 ID、signedAt、expiredAt、createdAt 和 updatedAt。文档没有提供独立的聚合统计响应,也没有提供签署耗时字段。
3. 本轮前端修复
- 删除了原先指向不存在的
/management/reports/overview的报表 API;统一通过src/api/management/reports.ts聚合真实接口。 - 修复只读取第 1 页、最多 200 条导致的统计和导出不完整问题。
- 每日趋势改为按
signedAt统计,不再按任务创建时间冒充签署完成时间。 - “签署完成”按本期
signedAt统计;“累计发起任务”和明细仍按本期createdAt统计。 - “按时签署率”只统计有签署/过期时间的终态任务,并以
signedAt <= expiredAt判断签署是否按时;VOIDED、FAILED和未完成任务不进入分母。 - 平均用时不再默认填充 7 分钟;当前按
signedAt - createdAt计算任务完成耗时,没有可用数据时显示—。 month趋势按当月实际天数生成;custom增加起止日期并校验起始日期不能晚于结束日期。FAILED单独显示为“处理失败”,不再错误归类为“已作废”。- 导出增加签署完成时间和过期时间,文件名使用本地日期,且导出内容覆盖全部已加载分页。
- 任务院区优先使用
campusId对应的组织字典,避免字典顺序或默认值导致院区误归类。
4. 当前前端统计口径
当前临时聚合的时间范围使用医院浏览器本地时间。生产环境建议由后端统一按 Asia/Shanghai 计算。
4.1 指标卡
累计发起任务:createdAt在当前日期范围内,且符合院区、科室、文档类别筛选的任务数。签署完成:status=SIGNED且signedAt在当前日期范围内的任务数。按时签署率:本期已签署任务与本期已超时任务作为终态样本;分子为signedAt <= expiredAt的已签署任务,分母为两类终态任务之和。平均签署用时:当前使用signedAt - createdAt的平均分钟数。该值是“任务从创建到完成的总耗时”,不是患者实际落笔时长。
4.2 趋势和科室分布
- 每日趋势按
SIGNED任务的signedAt按自然日统计。 - 科室分布按本期完成签署的任务、使用任务科室名称统计。
- 明细表按
createdAt筛选,便于核对本期发起的任务;这意味着明细条数与“本期签署完成”可能不完全相等,后端聚合接口上线后建议在界面上明确两个时间维度。
5. 后端缺口与推荐接口
5.1 签署报表聚合接口(最高优先级)
建议新增:
GET /api/v1/reports/signing/overview
X-Token: {登录令牌}
建议请求参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
createdFrom / createdTo |
ISO-8601 | 否 | 发起任务统计和明细的时间范围 |
signedFrom / signedTo |
ISO-8601 | 否 | 签署完成、趋势和完成分布的时间范围 |
expiredFrom / expiredTo |
ISO-8601 | 否 | 超时任务统计的时间范围 |
campusId |
UUID | 否 | 院区筛选;不传表示当前权限范围内全部院区 |
departmentId |
UUID | 否 | 科室筛选 |
category |
string | 否 | 文档类别,建议使用模板的稳定分类编码 |
signMethod |
PAD / SMS |
否 | 签署方式筛选 |
timezone |
string | 否 | 默认 Asia/Shanghai;建议服务端固定或校验白名单 |
detailPage / detailSize |
integer | 否 | 明细分页,detailSize 最大 200 |
建议响应:
{
"code": 0,
"message": "OK",
"data": {
"timezone": "Asia/Shanghai",
"metrics": {
"initiatedCount": 128,
"signedCount": 112,
"onTimeSignedCount": 108,
"onTimeDenominator": 120,
"onTimeRate": 90.0,
"averageCompletionDurationSeconds": 382,
"durationSampleCount": 112
},
"trend": [
{
"date": "2026-09-01",
"signedCount": 32
}
],
"departments": [
{
"departmentId": "科室 UUID",
"departmentName": "消化内科",
"initiatedCount": 40,
"signedCount": 36,
"onTimeSignedCount": 35,
"onTimeRate": 87.5
}
],
"details": {
"records": [],
"page": 1,
"size": 200,
"total": 128,
"pages": 1
}
},
"traceId": "链路追踪 ID",
"timestamp": "2026-09-01T08:00:00Z"
}
后端应在 SQL 聚合前执行当前用户的数据范围、模板 ACL 和院区/科室权限过滤,不能让前端拉取无权数据后再过滤。onTimeRate 的分母、是否排除作废任务、过期任务的口径需要在接口契约中固定,不能由不同页面各自猜测。
5.2 稳定的模板快照信息
当前任务响应只有 templateVersionId 和模板版本信息;如果模板不再处于当前用户可见的可用版本列表,报表无法可靠获取名称和类别,只能显示版本号或根据文档名称猜测分类。
建议在签署任务响应中增加不可变的模板快照摘要,或由报表接口直接返回:
{
"templateId": "模板 UUID",
"templateVersionId": "模板版本 UUID",
"templateName": "胃镜检查知情同意书",
"templateCategory": "EXAM_CONSENT"
}
分类应使用稳定编码和展示字典,不建议前端继续通过“入院”“告知”等中文名称关键词推断。
5.3 可审计的签署耗时字段
createdAt 到 signedAt 只能表示任务生命周期耗时,短信等待和患者未操作时间会被计入。若产品要展示真正的签署用时,建议返回:
{
"signStartedAt": "2026-09-01T07:53:00Z",
"signedAt": "2026-09-01T08:00:02Z",
"signDurationSeconds": 422
}
其中 signStartedAt 应来自签署投递/签署事件,而不是前端打开页面时自行记录。聚合接口应同时返回有效样本数;没有有效耗时样本时返回 null,前端显示 —。
5.4 后端导出接口
当前 CSV 是浏览器导出,只适合已加载的少量明细,不能替代正式导出。建议提供异步导出:
POST /api/v1/reports/signing/export-jobs
GET /api/v1/reports/signing/export-jobs/{jobId}
GET /api/v1/reports/signing/export-jobs/{jobId}/download
导出任务请求复用报表筛选条件,响应返回任务状态、文件有效期和下载地址。导出的每一行都应在服务端按权限过滤,并记录操作人、筛选条件摘要、生成时间、文件过期时间和 traceId。文件中只返回当前角色允许查看的脱敏患者字段,不应包含明文身份证号、手机号或完整病历。
5.5 时间范围查询能力(没有聚合接口时的最低要求)
如果近期无法提供聚合接口,至少请扩展 GET /api/v1/sign-tasks:
- 增加
signedFrom、signedTo; - 增加
expiredFrom、expiredTo; - 明确多个状态、时间条件的组合语义;
- 保证
total、page、size、pages在权限过滤后保持一致; - 保证分页排序稳定,例如按
createdAt DESC, id DESC; - 如需前端核对总量,提供按条件返回的汇总字段,避免客户端循环读取全部历史任务。
6. 权限、错误和审计要求
推荐复用现有统一响应包和错误约定:
| HTTP 状态 | 场景 |
|---|---|
200 |
查询或导出任务创建成功 |
400 |
日期格式、范围、分页或筛选参数错误 |
401 |
未登录或令牌失效 |
403 |
无报表查询权限或超出院区/科室数据范围 |
404 |
导出任务不存在或已过期 |
409 |
导出条件版本或数据快照冲突 |
429 |
导出任务频率超限 |
500 |
服务端聚合或文件生成异常 |
报表查询、导出和下载都应记录审计信息;审计内容记录筛选条件摘要即可,不要记录明文患者证件号、手机号、签名原图或完整病历内容。
7. 前端联调验收标准
- 院区、科室、文档类别和签署方式筛选只返回当前用户有权查看的数据。
- 趋势按
signedAt统计;任务延迟签署时不会落入创建日。 - 超时按
expiredAt统计;跨自然日时按Asia/Shanghai计算。 - 签署耗时没有有效样本时返回空值并显示
—,不使用固定默认值。 - 明细支持服务端分页;导出结果不受浏览器已加载条数限制。
- 同一筛选条件的指标、趋势、科室汇总和明细使用明确且一致的时间口径。
- 返回
traceId,前端错误提示可以关联后端日志排查。