feat(volunteer): 新增志愿服务证明材料识别及年度证明功能

- 新增志愿证明材料识别功能,支持自动识别材料并回填关键信息
- 在志愿时长编辑页面添加材料识别按钮及识别结果展示
- 新增志愿服务证明模块,支持查询、生成及下载年度志愿服务证明PDF
- 志愿时长列表及审核详情中新增“服务地点”字段显示
- 志愿时长导入功能支持“服务地点”字段,完善导入表头与数据映射
- 志愿时长详情、审核流程等界面优化,增加识别材料公章状态及流程节点提示
- 志愿时长待审核项支持用户撤回操作,撤回后记录被删除需重新录入
- 社团年度报告相关接口新增,实现社团年度报告生成及分页查询
- 调整相关样式与界面布局,提升用户体验与信息展示完整性
This commit is contained in:
2026-11-06 12:04:32 +08:00
parent d82a3b5426
commit d8e7e2a2a8
21 changed files with 1980 additions and 103 deletions
+68
View File
@@ -0,0 +1,68 @@
# AI 学情分析接口契约(前端已接入,后端待实现)
青马学员档案里的「AI 学情分析」入口复用现有 AI 流式链路(`utils/ai-stream.ts`),
后端需要新增一个与 `activityOutlineGen` / `manuscriptGen` 同构的端点。
## 1. 端点
| 用途 | 方法 | 路径 |
| --- | --- | --- |
| 流式分析(页面实际调用) | POST | `/api/ai/qmgcStudentAnalysis/stream` |
| 一次性返回(调试/他端) | POST | `/api/ai/qmgcStudentAnalysis` |
响应格式与现有 AI 链路一致:
- `/stream` 返回 `text/event-stream`,每帧一个 `data:` 行,帧内容为 JSON;
- 正文帧:`{ "answer": "<markdown 片段>" }`,也兼容 `{ "notice": "<片段>" }`;
- 心跳/占位帧:`{ "loading": "true" }`,前端忽略;
- 结束帧:`{ "answer": "__END__" }`;
- 失败时可用 `{ "answer": "<片段>", "reset": "true" }` 覆盖已推内容,
末帧 `status: "failed"`,前端会显示统一失败文案。
## 2. 入参
```json
{
"studentId": 123,
"focus": "thought | difficulty | advice | undefined",
"context": {
"studentName": "张三",
"studentNo": "20230001",
"collegeName": "第一临床医学院",
"className": "临床医学 2023 级 1 班",
"batch": "2026 年第 1 期",
"stage": "study",
"totalScore": 86,
"materialCount": 5,
"scoredMaterialCount": 4,
"taskDoneCount": 6,
"taskTotal": 8,
"materialTexts": ["【学习心得】……"],
"taskTexts": ["完成线上团课(已完成)"],
"scoreTexts": ["理论/课堂表现:90 分"]
}
}
```
`context` 是前端已加载数据的摘要,后端实现了按 `studentId` 自行取数后可以忽略它;
保留它是为了后端聚合尚未覆盖某类数据时,AI 仍能拿到培养材料正文。
`focus` 为空表示综合维度;调度到 Dify 时可映射成不同的提示词变量。
## 3. 数据口径
第一期可用的输入只有青马域已有数据:
- `gxmu_qmgc_material`:培养材料标题与正文、评分与评语;
- 学员任务分配记录:任务标题、完成状态;
- `gxmu_qmgc_score`:考核维度、评分项、得分与评语。
**系统目前没有考勤、签到、课堂互动类数据。** 需求原文提到的「课堂互动数据」
在采集入口落地前不参与分析,前端弹窗里已明确向教师提示这一点。后续若新增采集,
在 `context` 中补充对应摘要字段即可,无需改动流式协议。
## 4. 历史记录
如果要把分析结果写入 `ai_chat_list`,`chat_type` 需要新增一个取值
(如 `student_analysis`),并同步前端 `utils/ai-chat-type.ts` 的类型与中文名;
本次前端改动未接入历史记录,属于可选增强。