心理测评在源码中的领域名是 testreport。它把项目配置、答题过程、评分算法、订单和结果报告放在同一条可追踪链路中,重点不是“展示一份问卷”,而是保证用户回答、评分规则和最终解释来自同一版本语义。
代码与入口
| 层次 | 源码位置 | 主要职责 |
|---|---|---|
| PC 用户端 | pc/pages/test-report、pc/api/testreport.ts |
项目检索、答题、订单和报告查看 |
| 移动端适配 | uniapp/src/api/testreport.ts |
已有 API 封装,独立移动页面仍需补齐 |
| 租户后台 | tenant/src/views/testreport |
项目、订单和应用设置 |
| 用户 API | server/app/api/*/testreport |
项目详情、题目、答案校验、下单与报告查询 |
| 领域服务 | server/app/common/service/testreport |
数据适配、测评引擎、支付回调与安装同步 |
当前源码中 PC 流程和租户后台已经形成页面,uni-app 只有接口层。因此文档把“移动端可接入”和“移动端页面已完整交付”区分开,不能仅凭存在 API 文件就宣称多端体验已经完成。
核心领域对象
| 对象 | 作用 | 关键约束 |
|---|---|---|
TestReportProject |
保存项目编码、分类、题目来源、价格和报告展示配置 | 项目编码稳定;题目来源与评分规则需要版本化 |
| 题目与选项 | 描述题型、最少/最多选择、适用人群、分值和跳题关系 | 只接受当前项目允许的题目与选项 |
TestReportOrder |
保存用户资料、答案、支付状态和计算结果 | 原始答案与结果同时留存,未支付时隐藏完整报告 |
| 维度与等级 | 聚合选项分数并映射解释区间或标签 | 同一套报告必须使用同一规则版本 |
答题与报告流程
flowchart LR
Project[选择测评项目] --> Profile[填写必要资料]
Profile --> Questions[加载适用题目]
Questions --> Answers[逐题作答]
Answers --> Validate[校验题目 / 选项 / 分支]
Validate --> Order[保存答案并创建订单]
Order --> Paid{是否需要支付}
Paid -- 免费 --> Score[评分引擎]
Paid -- 付费 --> Pay[统一支付回调]
Pay --> Score
Score --> Report[维度结果与报告快照]
Report --> View[用户查看报告]
服务端会根据用户资料筛选适用题目,并校验单选、多选、最少和最多选择数量以及跳题关系。评分引擎再把已选选项转换为维度分数、总分或标签,支持单维区间、多个维度、MBTI 类标签组合等不同报告方式。
付费项目在创建订单时先保存经过校验的资料和答案。支付回调通过独立的 TestReportPaymentService 查找业务订单,重复回调只返回已处理状态;首次确认支付时才调用评分引擎,并把报告写回订单。这样支付渠道重试不会生成多份互相矛盾的结果。
隐私与版本边界
- 答卷、人格倾向和报告可能包含敏感个人信息,后台默认只显示业务必需字段,并限制批量导出;
- 项目调整题目、分值、维度或解释文案时应发布新版本,已经开始或完成的订单继续使用旧版本;
- 付费只控制完整报告访问权,不能删除用户原始答卷,也不能伪造基础分数;
- 报告页面需要明确说明用途和局限,不能替代临床诊断或专业心理咨询;
- 统计时优先使用匿名汇总,不把单个用户答案作为运营人员的普通筛选字段。
后续完善
目前 TestReportProject 和 TestReportOrder 已形成核心闭环,但题目来源仍带有数据适配性质。后续应显式保存题库版本、评分规则版本和报告模板版本,并补齐 uni-app 页面、断点续答、结果访问审计和数据保留期限。