Skip to content

Proposal:成就系统分级设计 #32

Description

@suerzzh

成就系统分级设计

1. 文档目标

本文档定义 UniSpeaking 第一版动态成就系统。设计只使用当前数据库已经持久化、能够按用户可靠归属的数据,不把前端静态进度视为真实业务数据,也不在第一版引入成就解锁表。

第一版保留当前可实现的 8 个成就,并将相同指标组织为可持续晋升的成就系列;当前缺少数据依据的成就和依赖其他成就的派生成就从范围中移除。

2. 统一计算口径

  • 业务时区统一使用 Asia/Shanghai

  • 有效对话必须来自 practice_session,状态为 COMPLETED,且单次持续时间不少于 30 秒。

  • 打卡日期由已经持久化的 session_evaluation.created_at 转换为业务日期,同一天存在多份报告时只计算一次。

  • 连续学习使用“历史最长连续打卡天数”,不能因为当前连续记录中断而撤销已经获得的成就。

  • 月度打卡使用“历史任意自然月的最高打卡天数”,已经完成的月度成就不得因月份切换而失效。

  • 分数类成就使用历史最佳值或历史达标次数,不使用最近一次成绩覆盖历史最好成绩。

  • 资产类成就统计用户历史上曾经拥有的学习资产。场景软删除后不撤销已经获得的成就。

  • 所有成就进度只能保持或增长,不能因为删除资产、连续记录中断或进入新月份而倒退。

  • 第一版动态计算成就状态,不记录独立的解锁时间;如果后续需要首次解锁弹窗、奖励发放或精确解锁时间,再单独设计成就记录表。

3. 第一版成就总表

第一版包含 10 个成就系列、48 个晋升节点。前端建议展示 10 张系列卡片,每张卡片展示当前称号、当前进度、下一等级目标和该系列全部里程碑,不直接平铺 48 张独立卡片。

系列 ID 分类 成就系列 等级 称号 解锁条件 核心数据来源 备注
conversation 开口 对话历程 1 初次开口 累计完成 1 次有效对话 practice_session 保留原有成就
conversation 开口 对话历程 2 渐入佳境 累计完成 5 次有效对话 practice_session 计入所有场景类型
conversation 开口 对话历程 3 对话常客 累计完成 20 次有效对话 practice_session 保留原有成就
conversation 开口 对话历程 4 对话达人 累计完成 50 次有效对话 practice_session 长期晋升节点
conversation 开口 对话历程 5 百炼成章 累计完成 100 次有效对话 practice_session 长期晋升节点
streak 连续 连续学习 1 三日启程 历史最长连续打卡达到 3 天 session_evaluation 使用历史最长记录
streak 连续 连续学习 2 七日同行 历史最长连续打卡达到 7 天 session_evaluation 保留原有成就
streak 连续 连续学习 3 两周不辍 历史最长连续打卡达到 14 天 session_evaluation 使用自然日连续性
streak 连续 连续学习 4 月度坚守 历史最长连续打卡达到 30 天 session_evaluation 不限定自然月
streak 连续 连续学习 5 百日如一 历史最长连续打卡达到 100 天 session_evaluation 长期晋升节点
scene-exploration 场景 场景探索 1 场景初探 完成过 1 个不同场景 practice_session.scene_id 只统计有效对话中的非空场景 ID
scene-exploration 场景 场景探索 2 场景探索者 完成过 5 个不同场景 practice_session.scene_id 保留原有成就
scene-exploration 场景 场景探索 3 场景行者 完成过 10 个不同场景 practice_session.scene_id 按不同 scene_id 去重
scene-exploration 场景 场景探索 4 场景达人 完成过 20 个不同场景 practice_session.scene_id 按不同 scene_id 去重
scene-exploration 场景 场景探索 5 世界漫游者 完成过 50 个不同场景 practice_session.scene_id 长期晋升节点
expression-score 成长 表达质量 1 表达进阶 单轮表达历史最高分达到 80 turn_evaluation.overall_score 使用历史最高分
expression-score 成长 表达质量 2 表达新星 单轮表达历史最高分达到 90 turn_evaluation.overall_score 保留原有成就
expression-score 成长 表达质量 3 高光表达 单轮表达历史最高分达到 95 turn_evaluation.overall_score 分数允许包含小数
expression-score 成长 表达质量 4 满分时刻 单轮表达历史最高分达到 100 turn_evaluation.overall_score 最高等级
pronunciation-attempt 成长 跟读训练 1 发音初试 累计完成 1 次句子跟读评分 sentence_evaluation 每条评分记录计算一次
pronunciation-attempt 成长 跟读训练 2 找准节奏 累计完成 10 次句子跟读评分 sentence_evaluation 允许重复练习同一句子
pronunciation-attempt 成长 跟读训练 3 发音校准师 累计完成 30 次句子跟读评分 sentence_evaluation 保留原有成就
pronunciation-attempt 成长 跟读训练 4 百次精练 累计完成 100 次句子跟读评分 sentence_evaluation 长期晋升节点
pronunciation-attempt 成长 跟读训练 5 千锤百炼 累计完成 300 次句子跟读评分 sentence_evaluation 长期晋升节点
asset-collection 场景 资产积累 1 初藏一景 历史累计拥有 1 项学习资产 scene 包含已经软删除的历史场景
asset-collection 场景 资产积累 2 素材积累者 历史累计拥有 5 项学习资产 scene 一项场景视为一项学习资产
asset-collection 场景 资产积累 3 资产收藏家 历史累计拥有 20 项学习资产 scene 保留原有成就
asset-collection 场景 资产积累 4 学习馆主 历史累计拥有 50 项学习资产 scene 删除资产不撤销成就
asset-collection 场景 资产积累 5 知识典藏家 历史累计拥有 100 项学习资产 scene 长期晋升节点
monthly-checkin 连续 月度打卡 1 月初蓄力 任意自然月累计打卡 5 天 session_evaluation 使用历史最佳月份
monthly-checkin 连续 月度打卡 2 稳步前行 任意自然月累计打卡 10 天 session_evaluation 同一天去重
monthly-checkin 连续 月度打卡 3 月度全勤 任意自然月累计打卡 20 天 session_evaluation 保留原有成就
monthly-checkin 连续 月度打卡 4 超级全勤 任意自然月累计打卡 25 天 session_evaluation 最高等级
practice-duration 开口 累计学习时长 1 初心投入 有效学习时长累计达到 1 小时 practice_session 只累计有效对话时长
practice-duration 开口 累计学习时长 2 渐深之境 有效学习时长累计达到 10 小时 practice_session 跨场景类型累计
practice-duration 开口 累计学习时长 3 熟能生巧 有效学习时长累计达到 50 小时 practice_session 跨场景类型累计
practice-duration 开口 累计学习时长 4 长期主义 有效学习时长累计达到 100 小时 practice_session 长期晋升节点
practice-duration 开口 累计学习时长 5 长路耕耘 有效学习时长累计达到 500 小时 practice_session 长期晋升节点
active-days 连续 累计学习天数 1 留下足迹 累计打卡达到 1 天 session_evaluation 不要求日期连续
active-days 连续 累计学习天数 2 习惯养成 累计打卡达到 10 天 session_evaluation 按业务日期去重
active-days 连续 累计学习天数 3 日积月累 累计打卡达到 30 天 session_evaluation 中断后仍继续累计
active-days 连续 累计学习天数 4 百日积累者 累计打卡达到 100 天 session_evaluation 长期晋升节点
active-days 连续 累计学习天数 5 年度学习者 累计打卡达到 365 天 session_evaluation 不要求在同一自然年完成
quality-sessions 成长 稳定高质量输出 1 初见锋芒 累计 1 场最终评分达到 80 session_evaluation.final_score 使用整场最终评分
quality-sessions 成长 稳定高质量输出 2 稳定发挥 累计 5 场最终评分达到 80 session_evaluation.final_score 每场最多计算一次
quality-sessions 成长 稳定高质量输出 3 优质输出 累计 20 场最终评分达到 80 session_evaluation.final_score 降级或零分报告不计入
quality-sessions 成长 稳定高质量输出 4 表达强者 累计 50 场最终评分达到 80 session_evaluation.final_score 长期晋升节点
quality-sessions 成长 稳定高质量输出 5 稳定卓越 累计 100 场最终评分达到 80 session_evaluation.final_score 最高等级

6. 数据归属与历史边界

6.1 用户归属

  • practice_session 可以直接使用 user_id 归属用户。

  • scene 可以直接使用 user_id 归属用户。

  • turn_evaluationsession_evaluation 优先通过 session_id 关联 practice_session 确认用户归属。

  • sentence_evaluation 通过 scene_id 关联 scene.user_id 确认用户归属。

  • 不信任客户端传入的 userId,成就查询必须使用 JWT 对应的当前用户。

6.2 历史数据限制

practice_session 是后续增加的全场景会话事实表。若上线迁移时没有对旧会话进行回填,则以下指标只能覆盖该表启用后的行为:

  • 有效对话次数。

  • 累计学习时长。

  • 已完成的不同场景数量。

  • 练习类型覆盖数量。

评分、打卡和跟读类成就可以继续利用已经存在的历史评分记录,但必须确保能够可靠关联到所属用户。

7. 进度与解锁规则

每个成就系列至少需要输出以下信息:

  • 稳定的系列 ID。

  • 系列名称和分类。

  • 当前统计值与展示单位。

  • 当前已经达到的最高等级。

  • 下一等级的阈值、称号和剩余进度。

  • 全部晋升节点及各节点是否已经解锁。

建议的进度规则如下:

  1. 未达到第 1 级时,进度条目标为第 1 级阈值。

  2. 达到某一级后,进度条自动切换到下一等级阈值。

  3. 达到最高等级后显示“已完成”,不再显示下一等级。

  4. 系列进度百分比按“当前值 / 下一等级阈值”计算,最大为 100%。

  5. 分数类指标最高值限制为 100,次数、天数和时长类指标不设置展示上限。

  6. 某一节点一旦满足,在没有独立解锁表的第一版中,也必须通过历史最大值或历史累计值保证其不会重新锁定。

8. 第一版实施边界

第一版实现范围:

  • 返回 10 个成就系列及其 48 个晋升节点。

  • 使用真实数据库数据计算当前用户进度。

  • 保留“开口、连续、场景、成长”四个现有分类。

  • 前端展示系列当前等级、下一等级和完整里程碑。

  • 不新增手动领奖、奖励发放、经验值、积分或排行榜。

  • 不新增补签、管理员修改进度或客户端上报成就进度接口。

  • 不新增用户自定义周目标。

  • 不新增独立成就解锁表。

后续只有在需要解锁时间、首次弹窗幂等、奖励发放或运营配置时,才评估增加成就定义表、用户成就记录表或事件事实表。

Metadata

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions