feat: add AI school recommendation foundation

This commit is contained in:
Codex
2026-06-29 21:22:53 +08:00
parent 8d4428214a
commit aeca84b260
16 changed files with 1003 additions and 12 deletions

View File

@@ -2055,7 +2055,9 @@ ACTIVATION_CODE_REGION_MISMATCH
- 手册目录和阅读。
9. `pages/scoreline/index`
- 动态字段筛选和趋势。
10. `pages/profile/index`
10. `pages/ai-school/index`
- SVIP AI 择校推荐、报告历史和 JSON 报告渲染。
11. `pages/profile/index`
- 会员、订单、激活码、学习数据、勋章。
## 当前 Taro 实现进度
@@ -2076,6 +2078,7 @@ pages/student/order-detail/index
pages/student/vocabulary/index
pages/student/handbook/index
pages/student/scoreline/index
pages/student/ai-school/index
pages/student/assets/index
pages/student/profile/index
```
@@ -2088,6 +2091,7 @@ src/services/learning.ts 练习 session、答题、收藏、错题/收藏复
src/services/commerce.ts 套餐、优惠券、下单、支付参数、订单详情、权益、激活码
src/services/profile.ts 个人中心、地区目标、签到、反馈、勋章、倒计时
src/services/video.ts 题目视频列表、播放签名
src/services/ai.ts AI 择校推荐生成、报告列表、报告详情
src/services/tenantAdmin.ts 租户后台看板、权限矩阵、成员、学生创建/批量导入/分班/备注/跟进、内容、营销、设置、角色模板写操作、公共题库采纳/同步/单条和批量冲突处理、导入详情/复检、CRM 配置/队列、分佣规则/成员比例/订单/结算
src/services/platformAdmin.ts 平台后台租户、套餐账单、用量、公共题库授权
```
@@ -2110,6 +2114,87 @@ npm run build:taro:h5:platform
- 平台后台:租户创建、状态变更、订阅开通、账单生成、人工收款确认、用量录入、公共题库授权编辑已接第一版;继续补租户详情/编辑、平台审计、自动计费和批量账单操作。
- 小程序:验证 `Taro.login`、微信支付、分享 scene/referral、Supabase client 兼容性;如不稳定,保留 `apps/api/auth/*` 作为小程序登录适配层。
## AI 择校推荐接入
AI 择校推荐是学生端 SVIP 功能,前端只调用 `apps/api`,不要在 H5/小程序内保存任何 AI provider key、prompt secret 或服务端模型配置。当前后端默认使用 deterministic `local_rules` provider基于学生目标地区和 `scoreline_records` 生成稳定 JSON 报告;后续真实 AI provider 仍保持同一接口和 JSON schema。
生成报告:
```http
POST /api/ai/school-recommendations/generate
```
请求体:
```json
{
"regionId": "<regionId>",
"estimatedScore": 210,
"riskPreference": "balanced",
"constraints": "优先考虑计算机相关专业",
"recommendationLimit": 5
}
```
`riskPreference` 支持 `safe``balanced``sprint``regionId` 不传时后端会使用 `/api/profile/me` 中学生档案的目标地区。后端会校验该地区属于当前租户,并要求当前学生有有效 SVIP无权限时返回 `AI_SVIP_REQUIRED`
响应核心结构:
```json
{
"item": {
"id": "<reportId>",
"status": "generated",
"provider": "local_rules",
"model": "local-scoreline-rules-v1",
"promptVersion": "school-recommendation-v1",
"resultPayload": {
"schemaVersion": "school-recommendation-report-v1",
"summary": "基于当前地区历年分数线...",
"riskLevel": "balanced",
"recommendedSchools": [
{
"schoolId": "<schoolId>",
"schoolName": "烟测学院",
"majorId": "<majorId>",
"majorName": "计算机科学与技术",
"latestYear": 2026,
"latestScore": 188,
"scoreGap": 22,
"riskLevel": "safe",
"confidence": 0.9,
"reason": "预估分与最新参考线差值约 22 分...",
"scorelineTrend": {
"years": [2026],
"scores": [188],
"direction": "unknown"
},
"tags": ["稳妥", "趋势不足", "样本较少"]
}
],
"actionPlan": [],
"disclaimers": [],
"dataCoverage": {}
}
}
}
```
报告历史:
```http
GET /api/ai/school-recommendations?regionId=<regionId>&limit=20
GET /api/ai/school-recommendations/detail?reportId=<reportId>
```
前端渲染建议:
- `resultPayload.schemaVersion` 必须等于 `school-recommendation-report-v1`,未知版本先降级为只展示 summary 和原始 JSON。
- `recommendedSchools` 是服务端已排序结果,前端不要重新按分数线做业务排序。
- `disclaimers` 必须展示在报告底部或导出 PDF 中。
- 报告详情只能展示当前登录学生自己的报告,遇到 `AI_REPORT_NOT_FOUND` 按“报告不存在或无权访问”处理。
- 当前 Taro 基础页在 `pages/student/ai-school/index`service 在 `src/services/ai.ts`
## 租户后台前端建议
租户后台可以先做 H5 管理台,也可以后续使用 Taro H5 复用部分组件。优先页面: