Skip to content

集合:reports(周报与风控报告)

字数
1721 字
阅读时间
8 分钟

1. 集合概述

存储用户的护心周报、风险提示、运营播报等报告类数据。支持多场景使用:

  • 用户端:我的页面周报查看、历史报告追溯
  • 管理端:辅导员监控、运营数据分析
  • 系统端:自动化报告生成、推送通知

2.1 字段定义

字段类型必填默认值约束条件说明隐私级别
_idstring-TCB 自动生成主键P2
user_idstring-关联 users._id报告所属用户P2
report_typestringweekly枚举值报告类型P2
period_startdate-ISO 8601 格式统计周期开始时间P1
period_enddate-ISO 8601 格式统计周期结束时间P1
headlinestring-长度 ≤ 80 字符报告标题P1
mood_summaryobject-JSON 格式情绪概览数据P3
task_metricsobject-JSON 格式任务执行指标P2
community_highlightsobject-JSON 格式社区活动亮点P2
recommendationsarray[]对象数组下一步建议列表P2
risk_digestobject-JSON 格式风险摘要信息P3
share_statusstringnone枚举值分享状态P2
delivered_channelsarray[]枚举值数组推送渠道P1
read_atdate-ISO 8601 格式用户阅读时间P1
generated_bystringsystem枚举值生成来源P1
versionstringv1.0.0语义化版本模板版本号P1
createdAtdate-服务端自动创建时间P1
updatedAtdate-服务端自动更新时间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 索引列表

  1. 单字段索引

    • user_id - 支持按用户查询
    • report_type - 支持按报告类型筛选
    • period_start - 支持按时间排序
  2. 复合索引

    • [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_idusers._id
  • 任务关联recommendations.task_idtasks._id
  • 风险关联risk_digest.signalssos._id

5.2 数据策略

  • 反范式设计mood_summarytask_metrics 直接嵌入以提升读取效率
  • 删除策略
    • 周报数据保留至少 1 年
    • 风险报告若误报可软删并记录操作日志
  • 数据一致性:通过应用层确保关联数据的完整性

6. 数据合规与生命周期

6.1 数据留存策略

  • 周报数据:保留 2 年,支持用户心理健康趋势分析
  • 风险报告:依据法规要求保留 3 年,便于追溯和审计
  • 运营数据:保留 1 年,用于产品迭代和功能优化

6.2 隐私保护措施

  • 数据匿名化:第三方数据导出时移除个人标识,仅保留统计指标
  • 用户权利:支持用户查看、导出(PDF/JSON格式)和删除个人数据
  • 数据最小化:仅收集必要的心理健康数据,避免过度采集

6.3 审计追踪

  • 操作日志createdAtupdatedAt 记录数据变更时间
  • 来源追踪generated_by 标识数据生成方式
  • 分享记录share_status 追踪数据分享状态
  1. API/云函数契约映射 | 接口/函数 | 读/写 | 使用字段 | 过滤条件 | 排序/分页 | 备注 | | /api/reports/weekly GET | 读 | headline, mood_summary, task_metrics, recommendations, read_at | user_id = auth.uid, report_type='weekly' | period_start desc | 我的页周报 | | /api/reports/weekly PATCH | 写 | share_status, read_at | _id 匹配 | - | 标记已读/分享 | | 风险升级流程 risk_signal_escalate | 写 | report_type='risk_alert', risk_digest, delivered_channels | - | - | 升级通知 | | 运营后台 generateOpsDigest | 写 | report_type='ops_digest', headline, recommendations | - | - | 运营播报 |

  2. 示例文档(≥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"
}
  1. 常用查询样例(≥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();
  1. 边界与错误码
  • 重复生成:同周期周报已存在返回 E_REPORT_DUPLICATE
  • 越权访问:非本人访问返回 E_FORBIDDEN,记录审计。
  • 风险报告回写失败:缺少 handler 返回 E_REPORT_HANDLER_REQUIRED
  1. 变更影响评估
  • 字段调整需同步 /api/reports/weekly、周报推送模板、埋点 weekly_report_view
  • 索引调整影响我的页加载与运营后台查询效率。
  1. 假设与待确认
  • 假设风险警报也落库此集合;待确认是否需拆分单独 risk_signals 集合。
  • 待确认是否需要存储周报 PDF 链接(cos_url)。

贡献者

The avatar of contributor named as Cai Hongyu Cai Hongyu

文件历史

撰写