集合:reports(周报与风控报告)
字数
1721 字
阅读时间
8 分钟
1. 集合概述
存储用户的护心周报、风险提示、运营播报等报告类数据。支持多场景使用:
- 用户端:我的页面周报查看、历史报告追溯
- 管理端:辅导员监控、运营数据分析
- 系统端:自动化报告生成、推送通知
2.1 字段定义
| 字段 | 类型 | 必填 | 默认值 | 约束条件 | 说明 | 隐私级别 |
|---|---|---|---|---|---|---|
_id | string | 是 | - | TCB 自动生成 | 主键 | P2 |
user_id | string | 是 | - | 关联 users._id | 报告所属用户 | P2 |
report_type | string | 是 | weekly | 枚举值 | 报告类型 | P2 |
period_start | date | 否 | - | ISO 8601 格式 | 统计周期开始时间 | P1 |
period_end | date | 否 | - | ISO 8601 格式 | 统计周期结束时间 | P1 |
headline | string | 否 | - | 长度 ≤ 80 字符 | 报告标题 | P1 |
mood_summary | object | 否 | - | JSON 格式 | 情绪概览数据 | P3 |
task_metrics | object | 否 | - | JSON 格式 | 任务执行指标 | P2 |
community_highlights | object | 否 | - | JSON 格式 | 社区活动亮点 | P2 |
recommendations | array | 否 | [] | 对象数组 | 下一步建议列表 | P2 |
risk_digest | object | 否 | - | JSON 格式 | 风险摘要信息 | P3 |
share_status | string | 否 | none | 枚举值 | 分享状态 | P2 |
delivered_channels | array | 否 | [] | 枚举值数组 | 推送渠道 | P1 |
read_at | date | 否 | - | ISO 8601 格式 | 用户阅读时间 | P1 |
generated_by | string | 否 | system | 枚举值 | 生成来源 | P1 |
version | string | 否 | v1.0.0 | 语义化版本 | 模板版本号 | P1 |
createdAt | date | 是 | - | 服务端自动 | 创建时间 | P1 |
updatedAt | date | 是 | - | 服务端自动 | 更新时间 | P1 |
2.2 枚举值定义
report_type
weekly- 护心周报risk_alert- 风险警报advisor_note- 辅导员笔记ops_digest- 运营摘要
share_status
none- 未分享share_to_guardian- 分享给监护人share_to_counselor- 分享给辅导员
delivered_channels
miniapp- 小程序内消息subscription- 订阅消息push- 推送通知email- 邮件通知
generated_by
system- 系统自动生成ops- 运营人员生成counselor- 辅导员生成
3. 索引设计
3.1 索引列表
单字段索引
user_id- 支持按用户查询report_type- 支持按报告类型筛选period_start- 支持按时间排序
复合索引
[user_id, report_type, period_start desc]- 用户报告查询[report_type, createdAt desc]- 最新报告查询
3.2 唯一约束
[user_id, report_type, period_start]- 同一用户同周期同类型报告唯一
3.3 设计考量
- 查询性能:复合索引优化了用户查看历史周报的常见场景
- 排序效率:按时间倒序确保最新报告优先展示
- 数据完整性:唯一约束防止重复生成报告
4. 权限控制
4.1 访问权限策略
json
{
"read": "user_id == auth.uid || auth.role in ['counselor', 'ops']",
"write": "auth.role in ['report_service', 'counselor', 'ops']"
}4.2 权限说明
- 读取权限:用户只能查看自己的报告,辅导员和运营人员可查看所有报告
- 写入权限:仅限报告服务、辅导员和运营人员可写入
- 审计要求:所有写入操作记录操作日志
5. 数据关系
5.1 关联关系
- 用户关联:
user_id→users._id - 任务关联:
recommendations.task_id→tasks._id - 风险关联:
risk_digest.signals→sos._id
5.2 数据策略
- 反范式设计:
mood_summary、task_metrics直接嵌入以提升读取效率 - 删除策略:
- 周报数据保留至少 1 年
- 风险报告若误报可软删并记录操作日志
- 数据一致性:通过应用层确保关联数据的完整性
6. 数据合规与生命周期
6.1 数据留存策略
- 周报数据:保留 2 年,支持用户心理健康趋势分析
- 风险报告:依据法规要求保留 3 年,便于追溯和审计
- 运营数据:保留 1 年,用于产品迭代和功能优化
6.2 隐私保护措施
- 数据匿名化:第三方数据导出时移除个人标识,仅保留统计指标
- 用户权利:支持用户查看、导出(PDF/JSON格式)和删除个人数据
- 数据最小化:仅收集必要的心理健康数据,避免过度采集
6.3 审计追踪
- 操作日志:
createdAt、updatedAt记录数据变更时间 - 来源追踪:
generated_by标识数据生成方式 - 分享记录:
share_status追踪数据分享状态
API/云函数契约映射 | 接口/函数 | 读/写 | 使用字段 | 过滤条件 | 排序/分页 | 备注 | |
/api/reports/weeklyGET | 读 | headline, mood_summary, task_metrics, recommendations, read_at |user_id = auth.uid,report_type='weekly'|period_start desc| 我的页周报 | |/api/reports/weeklyPATCH | 写 | share_status, read_at |_id匹配 | - | 标记已读/分享 | | 风险升级流程risk_signal_escalate| 写 | report_type='risk_alert', risk_digest, delivered_channels | - | - | 升级通知 | | 运营后台generateOpsDigest| 写 | report_type='ops_digest', headline, recommendations | - | - | 运营播报 |示例文档(≥3条)
json
{
"_id": "rep_week_2024w14_usr001",
"user_id": "usr_001",
"report_type": "weekly",
"period_start": "2024-04-01",
"period_end": "2024-04-07",
"headline": "情绪平稳,任务完成率 80%",
"mood_summary": {"average": 68, "peak": 80, "trough": 45, "tags": ["室友", "学习"]},
"task_metrics": {"completion": 0.8, "skipped": 0.1, "focus_minutes": 160},
"recommendations": [{"title": "保持固定自习节奏", "task_id": "task_305"}],
"delivered_channels": ["miniapp"],
"read_at": "2024-04-08T02:00:00Z",
"createdAt": "2024-04-07T23:00:00Z",
"updatedAt": "2024-04-08T02:00:00Z"
}
{
"_id": "rep_week_2024w14_usr002",
"user_id": "usr_002",
"report_type": "weekly",
"period_start": "2024-04-01",
"period_end": "2024-04-07",
"headline": "睡眠偏少,尝试晚安模式",
"mood_summary": {"average": 52, "peak": 70, "trough": 35, "tags": ["睡眠", "自习"]},
"task_metrics": {"completion": 0.55, "skipped": 0.3, "focus_minutes": 90},
"recommendations": [{"title": "晚安呼吸练习", "task_id": "task_401"}],
"share_status": "share_to_guardian",
"delivered_channels": ["miniapp", "subscription"],
"createdAt": "2024-04-07T23:05:00Z",
"updatedAt": "2024-04-07T23:10:00Z"
}
{
"_id": "rep_risk_20240406_usr002",
"user_id": "usr_002",
"report_type": "risk_alert",
"headline": "树洞帖子触发 R3 审核",
"risk_digest": {"level": "R3", "signals": ["sos_20240406_01"], "handler": "counselor_zhang"},
"delivered_channels": ["miniapp", "push"],
"generated_by": "counselor",
"createdAt": "2024-04-06T14:10:00Z",
"updatedAt": "2024-04-06T14:10:00Z"
}- 常用查询样例(≥3条)
javascript
// 获取最近三期周报
const weekly = await db.collection('reports').where({
user_id: auth.uid,
report_type: 'weekly'
}).orderBy('period_start', 'desc').limit(3).get();
// 未读周报数量
const unread = await db.collection('reports').where({
user_id: auth.uid,
report_type: 'weekly',
read_at: db.command.exists(false)
}).count();
// 风险值班查看近 24 小时风险警报
const riskAlerts = await db.collection('reports').where({
report_type: 'risk_alert',
createdAt: db.command.gte(new Date(Date.now() - 24 * 3600 * 1000).toISOString())
}).orderBy('createdAt', 'desc').get();- 边界与错误码
- 重复生成:同周期周报已存在返回
E_REPORT_DUPLICATE。 - 越权访问:非本人访问返回
E_FORBIDDEN,记录审计。 - 风险报告回写失败:缺少 handler 返回
E_REPORT_HANDLER_REQUIRED。
- 变更影响评估
- 字段调整需同步
/api/reports/weekly、周报推送模板、埋点weekly_report_view。 - 索引调整影响我的页加载与运营后台查询效率。
- 假设与待确认
- 假设风险警报也落库此集合;待确认是否需拆分单独
risk_signals集合。 - 待确认是否需要存储周报 PDF 链接(cos_url)。