Files
tuanwei-admin/.zcode/plans/plan-session_7ab6728b66664f295b2b7d1220f273d7.md
T
gxwebsoft 567e4aabdb feat(user): 支持修改当前用户资料接口并更新个人中心调用
- 新增 updateSelfUser 方法,用于修改当前登录用户的个人资料
- 个人中心调用接口由原 updateUser 切换为 updateSelfUser,避免学生账号权限不足导致的保存失败
- 更新了头像保存、个人信息保存等相关调用代码,添加异常捕获和提示
- 修正环境变量 .env.development 中 API URL 配置为生产地址
- 优化审核记录排序逻辑,新增获取最新审核记录和编辑入口显示判断函数
- 调整审核状态标签使用统一排序规则,防止显示和编辑状态不一致
- 新增社团活动、社团编辑、志愿时长录入、学分记录编辑、社会实践学分申报、青马学员编辑等多个新增组件及表单功能
- 各新增功能支持表单验证、操作反馈和数据加载优化
2026-11-05 19:03:40 +08:00

296 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 团委智能化平台二期实施方案
> 依据《副本二期功能--定稿0802.docx》(4 大模块 26 项功能),结合 tuanwei-admin(Vue3)与 tuanwei-java(Spring Boot)现有底座制定。文档中括号内的疑问已逐条对应到「待确认项」,未确认处按默认假设推进。
## 一、总体判断
二期不是从零建设。现有系统已经具备四项可复用底座:**申报+审核流引擎**(9 张申报表、三级审核、状态回写)、**学生/教师名册与认领体系**(`gxmu_student.user_id` 是身份主键)、**文件与 Word 导出**(S3 存储、XWPF 直绘、电子签名图片叠加)、**爬虫与异步任务**(jsoup + 定时 + 进度表)。
真正缺失的是三块能力,必须新建:
1. **站内消息中心**——后端完全没有 `oa_notice`,但前端顶栏铃铛和 `/user/notice` 页面已经在调 `/oa/notice/*`,属于「前端等后端」。
2. **业务域**——学分、志愿、社团、场地、青马培养档案、专家评审均无表、无接口。
3. **OCR / PDF 生成**——无 OCR 依赖;PDF 只能靠服务器 LibreOffice 转换。
**结论:全量规划、分三期实施。** 本期(P0)先打通「学生成长主页 + 学分 + 志愿 + 社团场地 + 青马档案 + 消息中心 + 团课库」这条主干,P1 补齐审核类与 AI 类,P2 做画像与数字人。
移动端:本机没有 uni-app 工程,`tuanwei-admin` 是纯 PC 后台。**本期只交付 PC,接口按可对外(`/api/open`)设计**,学生端后续独立建工程,不阻塞本期。
---
## 二、菜单规划
原则:**不动现有 12 个一级菜单、不迁移已有子菜单**,避免破坏已配置的角色授权。二期新增 2 个一级菜单,其余能力挂到语义最贴近的现有菜单下。
### 新增一级菜单
```
成长中心 /growth (menu_id 14500)
├ 我的成长 /growth/myHome 14501 学生个人成长主页
├ 学分明细 /growth/credit 14502 第二课堂学分 + 社会实践学分汇总
├ 社会实践学分 /growth/practiceCredit 14503 申报 + 四级审核 + 教务处模板导出
├ 学分预警 /growth/creditWarning 14504 缺口预测 + 补分建议
├ 学生画像 /growth/portrait 14505 多维雷达 + 标签
└ 推荐内容 /growth/recommend 14506 思政文章/活动推荐 + 后台发布
社团与志愿 /club (menu_id 14520)
├ 志愿服务时长 /club/volunteerHour 14521 个人录入 + 桂志愿导入
├ 志愿时长审核 /club/volunteerReview 14522 二级学院审核
├ 志愿证明 /club/volunteerCertificate 14523 年度证明生成下载
├ 社团管理 /club/club 14524 社团 + 成员 + 指导老师
├ 社团活动 /club/activity 14525 发起 + 材料
├ 活动审批 /club/activityReview 14526 四级审批 + 公章识别
├ 场地预约 /club/venue 14527 场地日历 + 预约
├ 场地审批 /club/venueReview 14528 指导老师 → 校团委
├ 社团年审 /club/annualReview 14529 指标 + 自评 + 自动取数 + 公示
└ 社团评优 /club/award 14530 评优申报 + 审核 + 公示
```
### 挂到现有菜单
| 现有菜单 | 新增子项 | path |
|---|---|---|
| 数字化团员 14342 | 青马学员档案 | `/gxmu/qmgcStudent` |
| | 培养任务 | `/gxmu/qmgcTask` |
| | 考核评分 | `/gxmu/qmgcScore` |
| | 主题团课库 | `/gxmu/thematicCourse` |
| AI内容创作与宣传助手 14365 | AI辅助教学设计 | `/gxmu/teachingDesign` |
| | AI主题团日设计 | `/gxmu/themeDayDesign` |
| 挑战杯 14372 | 专家评审 | `/gxmu/expertReview` |
| | 专家库 | `/gxmu/expertPool` |
| 系统设置 8574 | 消息模板 | `/system/messageTemplate` |
| | 推送记录 | `/system/messageLog` |
`青马工程`(14353)保留为**申报入口**,新增的学员档案管培养期,两者不合并。消息中心的用户侧直接复用已有的 `/user/notice`(已隐藏菜单)+ 顶栏铃铛,零改动即可生效。
### 不推荐但已备选
把「五四评优/学术之星/青马工程」从数字化团员迁到申报系统,结构更清晰,但会动 6 个菜单的 `parent_id` 和全部角色授权,回归风险高。如后续确需重组,单独出一个迁移脚本。
---
## 三、分期实施计划
### P0(本期,可上线的最小闭环)
| # | 功能 | 对应文档 | 交付物 |
|---|---|---|---|
| 1 | 站内消息中心 | 模块一·4 | `oa_notice` + 记录表 + `/oa/notice/*` 接口 + 审核钩子(提交/通过/驳回/待办)+ 顶栏铃铛生效 |
| 2 | 第二课堂学分 | 模块一·1 | 学分规则表 + 学分记录表 + Excel 导入(模板/校验/失败清单)+ 明细页 |
| 3 | 学生成长主页 | 模块一·3 | 聚合接口 + 简历式页面(基本信息/学分/志愿/活动/申报/荣誉) |
| 4 | 志愿时长 | 模块三·1·2 | 个人录入(盖章附件)+ 桂志愿导入 + 二级学院审核 |
| 5 | 社团管理 | 模块三·3·7 | 社团主档 + 成员 + 指导老师 + 活动发起 + 四级审批 |
| 6 | 场地预约 | 模块三·6 | 场地主档 + 日历视图 + 冲突校验 + 指导老师→校团委审批 |
| 7 | 青马培养档案 | 模块二·1 | 学员主档 + 培养材料提交 + 任务清单 + 任务完成度 |
| 8 | 主题团课库 | 模块二·6 | 爬虫(jsoup + 定时 + upsert)+ 列表/详情/下载 + 标签 |
| 9 | 工程配套 | — | 菜单/按钮/角色授权 SQL、字典、权限码、联调回归 |
估算 **53 人日**,2 人并行约 **5.5 周**。
### P1(第二批)
社会实践学分申报(四级审核 + 教务处模板导出)、学分预警(规则 + 定时 + 消息)、智能推荐(内容库 + 规则引擎 + 推送)、学生画像(维度聚合 + 雷达图)、社团年审(指标配置 + 自评 + 自动取数 + 公示)、社团评优、年度志愿证明(docx + 电子章 + PDF)、社团年度报告(聚合 + AI 小结 + 导出)、专家评审(专家库 + 任务 + 分配 + 打分 + 汇总)、AI 辅助教学设计与主题团日设计、**审核流并行审批改造**。
估算 **63 人日**,2 人并行约 **6.5 周**。
### P2(探索期)
AI 学员学习情况分析、AI 定制培养建议、OCR 公章识别接入、AI 数字人(形象 + 浮窗 + 知识库问答)、移动端接口整理。
估算 **23 人日**,约 **2.5 周**。
**合计约 139 人日,2 人并行约 14-15 周。**
---
## 四、数据模型(新表)
统一规范:`id BIGINT AUTO_INCREMENT`、`tenant_id`、`user_id`、`deleted`、`create_time`、`update_time`;附件用 `file_id + file_url` 或 JSON 数组;审批一律复用 `gxmu_review_list(module, pk)`。
### 学分 / 成长域
- `gxmu_credit_rule`:学分类别、项目、分值、认定方式(import/manual/practice)、适用年级
- `gxmu_credit_record`:`user_id, source(second_class|practice|activity), external_id, category, item_name, score, acquire_time, status, evidence`
- `gxmu_practice_credit_apply`:学年、活动名、类型、起止、角色、内容、附件 JSON
- `gxmu_graduate_requirement`:`year, college_id, major, category, required_score`
- `gxmu_credit_warning`:`user_id, category, gap, level, hit_time, notified`
- `gxmu_student_profile`:画像快照(维度分、标签 JSON、更新时间)
- `gxmu_recommend_content`:类型(article/activity)、标题、封面、关联 ID、标签
- `gxmu_recommend_delivery`:`user_id, content_id, channel, is_read`
### 志愿域
- `gxmu_volunteer_record`:`user_id, source(gz|self), project, hours, service_date, org_name, proof_files JSON, status`
- `gxmu_certificate_template`:模板标题、正文占位符、电子章图片、编号前缀
- `gxmu_volunteer_certificate`:`user_id, year, total_hours, serial_no, file_id`
### 社团 / 场地域
- `gxmu_club`:名称、类别、`college_id`、`advisor_user_id`、社长、等级、状态
- `gxmu_club_member`:`club_id, user_id, role, join_time, status`
- `gxmu_club_activity`:`club_id, title, start/end, place, scale, budget, attachments JSON, review_status, ocr_status, ocr_org`
- `gxmu_club_annual_metric`:指标名、权重、取数方式(auto/manual)、公式
- `gxmu_club_annual_review`:`club_id, year, self_score, auto_score, final_score, materials, status`
- `gxmu_club_award_apply`:`club_id, year, award_type, materials, status`
- `gxmu_club_report`:`club_id, year, summary JSON, file_id`
- `gxmu_venue`:名称、楼栋、容量、设备、开放时段、管理员、状态
- `gxmu_venue_booking`:`venue_id, user_id, club_id, booking_date, start_time, end_time, purpose, status`
### 青马域
- `gxmu_qmgc_student`:`user_id, form_id, batch, year, college_id, candidate_no, stage, result`
- `gxmu_qmgc_material`:`student_id, stage, type, title, content, file_id, score`
- `gxmu_qmgc_task`:批次、阶段、标题、类型(online/offline)、跳转方式、截止时间
- `gxmu_qmgc_task_assign`:`student_id, task_id, status, submit_time, score`
- `gxmu_qmgc_score`:`student_id, dimension, item, score, scorer, comment`
- `gxmu_qmgc_exam` / `gxmu_qmgc_exam_record`:题目 JSON、及格线、作答、得分
### 团课 / 专家 / 消息
- `gxmu_thematic_course`:`title, type(courseware|script|video|case|activity), source_site, source_url, source_key UNIQUE, file_id, content, tags, heat`
- `gxmu_expert`:`user_id, name, college, field_code, level, phone`
- `gxmu_expert_review_task`:`module, declare_id, round, start/end, quota`
- `gxmu_expert_review_assign`:`task_id, expert_id, status`
- `gxmu_expert_review_score`:`assign_id, dimensions JSON, total, comment, submit_time`
- `oa_notice` + `oa_notice_record`:从 `/Users/gxwebsoft/JAVA/com.gxwebsoft.open` 移植,字段对齐前端已有的 `noticeRecordId/type/files/channel/progress`
### 对现有表的改动(小步、可回滚)
1. `gxmu_review_flow` + `gxmu_review_list` 增加 `parallel_group INT NULL` —— 支持「二级学院团委与党委同时审核」。
2. `gxmu_review_list` 增加 `attachments TEXT` —— 审核节点上传盖章附件。
3. `gxmu_declare.module` 若新增「团委科研课题」,同步加枚举(见待确认项)。
---
## 五、后端设计
### 包结构(新增,不动现有 24 个 gxmu 控制器)
```
com.gxwebsoft.gxmu.credit/ 学分规则、记录、导入、预警
com.gxwebsoft.gxmu.qmgc/ 青马学员、任务、评分、考试
com.gxwebsoft.gxmu.club/ 社团、活动、年审、评优、年度报告
com.gxwebsoft.gxmu.venue/ 场地与预约
com.gxwebsoft.gxmu.volunteer/ 志愿时长与证明
com.gxwebsoft.gxmu.thematic/ 主题团课库与爬虫
com.gxwebsoft.gxmu.portrait/ 画像与推荐
com.gxwebsoft.gxmu.expert/ 专家评审
com.gxwebsoft.notice/ 消息中心(移植 + 渠道)
```
每个子包内 `controller/entity/mapper/service/param`,与现有 `gxmu.openplat` 的组织方式一致。
### 接口约定
- 管理端统一 `/api/gxmu/{domain}/page|list|{id}|save|update|remove|batch`,沿用 `BaseController` + `BaseParam`,前端继续传 `backendAccess=true`。
- 学生自助统一 `/api/gxmu/{domain}/my/*`,用 `hasOnlyStudentRole()` 收口,只返回本人数据。
- 审核类不在各域重复造轮子,统一走 `gxmu_review_list`,前端复用 `reviewStatusTag` / `reviewHistoryModal` / `reviewFlowModal`。
- 消息中心按前端**既有路径** `/api/oa/notice/*` 实现(`page`/`list`/`{id}`/`getUnReadNum`/`save`/`update`/`remove`),顶栏铃铛和 `/user/notice` 不需要改一行代码。
- 导出走现有模式:Controller 生成文件 → `FileStorageService.storeFile` → `FileRecord` → 返回下载地址。
### 关键改造:审核流支持并行节点
现状:`ReviewListController.update` 用 `sortNumber + 1` 取下一节点,隐含「一个节点一个人」。青马选拔要求团委与党委**同时审核**,因此:
- 模板按 `level` 分组,同 `level` 的多行属于同一并行组;
- 通过时先检查同组是否还有 `status=0` 的节点,有则不推进;
- 同组全部通过才进入下一 `level`;
- 组内任一驳回是否终止整条流,做成 `ReviewFlowConfig.rejectMode`(任一驳回 / 全部驳回后终止),默认前者。
- 该改造同时被社会实践学分、社团活动、场地预约复用。
### 关键改造:学分引擎
不引入规则引擎,用「配置表 + 计算服务」:
1. `CreditRuleService.resolve(userId, year)` 按学院/年级/专业匹配 `gxmu_graduate_requirement`,得到各类别应修学分。
2. `CreditSummaryService` 汇总 `gxmu_credit_record` 中 `status=有效` 的记录,按类别输出「已修/应修/差额/完成率」。
3. 预警任务每天跑一次:差额 > 0 且距毕业不足 N 学期 → 生成 `gxmu_credit_warning` + 发站内消息;同一学生同一类别本月只发一次。
4. 推荐:先做规则匹配(缺分 → 推荐可加分的活动/课程,按标签和学院过滤),AI 排序留到 P2。
### 关键技术点
- **志愿证明 PDF**:XWPF 直绘(复用 `WxxzxDocxExportUtil` 的 `addPicture` 叠电子章)→ `OpenOfficeUtil.converterToPDF` → 存 `FileRecord`。若服务器无 `soffice`,降级为前端打印(复用 `youthDataCenter.exportPdf` 模式),不阻塞上线。
- **团课库爬虫**:完全复用 `CrossSchoolActivityCrawlerServiceImpl` 范式(站点配置 + jsoup + `source_key` 唯一键 + `batchUpsert` + 定时任务 + 手动 `/sync`),新增文件下载入库。
- **AI 扩展**:`DifyProperties.AppKeys` 增加 4 个应用 key;`AiChatType` 增加 `teaching_design / theme_day_design / student_analysis / training_advice`;新增 `/api/ai/{xxx}` 与 `/stream`,沿用 `AiGenerationRecorder` 落历史。
- **OCR**:不引入本地推理。P1 通过阿里云 OCR HTTP 接口(需开通 + AK),字段预留 `ocr_status/ocr_org/ocr_raw`;未开通时走「人工核验 + 附件留痕」。
- **消息渠道**:站内信必做;企业微信在 `WxWorkUtil` 增加 `message/send`(token 逻辑已有);短信暂不做。
---
## 六、前端设计
### 目录与页面
```
src/views/growth/
myHome/ 我的成长(简历式:基本信息/学分/志愿/活动/申报/荣誉)
credit/ 学分明细(类别筛选 + 来源 + 明细表 + 导入)
practiceCredit/ 社会实践学分(申报表单 + 审核状态)
creditWarning/ 学分预警(雷达/进度条/建议)
portrait/ 学生画像
recommend/ 推荐内容
src/views/club/
volunteerHour/ 我的志愿时长(录入 + 导入 + 列表)
volunteerReview/ 志愿时长审核
volunteerCertificate/
club/ 社团管理(主档 + 成员抽屉)
activity/ 社团活动
activityReview/ 活动审批(复用 reviewFlowModal)
venue/ 场地预约(日历 + 预约弹窗)
venueReview/
annualReview/ 年审(指标 + 自评 + 打分)
award/
src/views/gxmu/
qmgcStudent/ qmgcTask/ qmgcScore/ thematicCourse/
teachingDesign/ themeDayDesign/
expertReview/ expertPool/
src/views/system/
messageTemplate/ messageLog/
```
### 复用清单(不要重写)
- 列表骨架:`ele-pro-table` + `.page/.ele-body/a-card`,照 `studentRoster`。
- 导入:`views/gxmu/components/common-import.vue`(模板下载、逐行校验、失败清单)。
- 附件:`components/attachmentList.vue` + `views/gxmu/utils/attachment.ts`;单文件用 `components/UploadFile`。
- 审核:`reviewStatusTag` / `reviewHistoryModal` / `reviewFlowModal` / `views/gxmu/utils/review.ts`。
- 图表:`utils/use-echarts.ts` + `vue-echarts`,照 `youthDataCenter`。
- 导出:Excel 用 `xlsx`;打印式 PDF 照 `youthDataCenter.exportPdf`;docx 用 `html-docx-js-typescript`。
- AI 页:复制 `activityOutlineGen` 壳 + `utils/ai-stream.ts` + `utils/ai-result.ts`。
- 权限:`hasPermission` / `v-permission`;角色用 `hasAnyRole`(`hasRole` 是「全部满足」语义)。
### 需要新建的公共件
1. `components/MultiFileUpload`:统一多附件上传(现有各表单各写了一套)。
2. `components/AiGenPageShell`:把「左侧表单 + 右侧流式输出 + 历史入口」抽出,避免再复制 4 个 800-1300 行的页面。
3. `utils/export.ts`:收敛 Excel/CSV/打印 PDF 的重复代码。
4. `src/constants/permissions.ts`:集中权限码。
### 顺带修的两个既有问题
- `views/user/profile` 保存走 `PUT /system/user`(要 `sys:user:update`),学生账号会失败。改为后端已有的 `PUT /system/user/self`,成长主页的「编辑资料」直接受益。
- `reviewStatusTag` 按 `id` 取最新,`utils/review.ts` 按 `createTime+id`,两处规则不一致。二期接入新审核模块前统一到 `utils/review.ts`。
---
## 七、实施顺序(建议按此推进)
1. **基建先行**:消息中心(表 + 移植 + 钩子)+ 菜单/权限 SQL + 字典 + `MultiFileUpload`。
2. **学历域**:学分规则/记录/导入 → 成长主页聚合 → 明细页。
3. **志愿域**:录入/导入 → 审核 → 证明(证明依赖 LibreOffice,放最后)。
4. **社团域**:社团主档/成员 → 活动 → 四级审批 → 场地日历 → 场地审批。
5. **青马域**:学员档案 → 任务 → 材料 → (P1)评分/考试。
6. **团课库**:建表 → 爬虫 → 列表/详情。
7. **P1**:学分预警/推荐/画像 → 社会实践 → 社团年审/评优/年报 → 专家评审 → AI 教学设计/团日设计 → 审核流并行改造(此改造需在青马选拔上线前完成,实际应提前到 P0 末尾)。
8. **P2**:AI 学员分析/培养建议 → OCR → 数字人。
每批交付都包含:建表 SQL(可重复执行)、菜单/按钮 SQL、后端接口、前端页面、联调、回归。第一步先在仓库落地 `docs/phase2-implementation-plan.md`(本方案)和 `docs/sql/phase2_*.sql`。
---
## 八、待你确认的业务细节(有默认值,确认前按默认推进)
| 事项 | 默认假设 | 影响 |
|---|---|---|
| 第二课堂 / 桂志愿 是否有 API | 先 Excel 导入,`source/external_id` 预留,后续换数据源 | P0 导入模板字段 |
| 学分规则与毕业要求 | 按「学院 + 年级 + 专业 + 类别」配应修学分,由管理员在后台维护 | 预警准确性 |
| 青马评分标准/任务清单 | 评分项和权重做成可配置表,任务分线上(可跳转)与线下(仅勾选) | P1 评分页 |
| 社团年审量化指标 | 做成指标配置表,活动数/参与人次/稿件数可自动取数,其余人工 | P1 年审 |
| 指导老师是单人还是多人 | 社团主档存 1 名主指导,审批节点支持多人并行 | 审批流 |
| 志愿证明模板与电子章 | 需要你提供模板文件与印章图片;未提供时用占位版 | P1 证明 |
| 「团委科研课题」是否新申报模块 | 视为新模块,新增 `gxmu_research_project` 表并加入申报枚举 | 专家评审范围 |
| 数字人形象 | 先用团委现有卡通形象,不做 3D | P2 |
其中前三项不确认就无法开工;其余可边做边定。**只要前三项给出结论,P0 可以立即启动。**