feat(credit): 增加社会实践学分及学分预警模块

- 实现社会实践学分的提交、撤回、作废、删除、汇总及导出功能
- 审核通过后自动发放学分,确保幂等性
- 新增学分预警功能,支持缺口计算、级别判定和月度去重推送
- 设计四级审核流程,审核状态变更后自动回调处理
- 支持教务处模板导出,输出标准xls格式文件
- 提供前端页面替换原占位页,提升用户体验
- 补充每日定时任务执行学分预警重算,支持配置开关
- 修复审核回写逻辑,避免误更新不存在的表数据
This commit is contained in:
2026-11-05 22:29:01 +08:00
parent 9c45ff79f4
commit d82a3b5426
+141
View File
@@ -249,3 +249,144 @@ src/views/system/{messageTemplate,messageLog}/
### 9.4 修复记录
初版曾把 `gxmu_practice_credit` 加进 `DeclareGuardServiceImpl` 的模块列表,导致审核回写时按「模块名=表名」去更新不存在的表。已移除——社会实践用独立表 `gxmu_practice_credit_apply`,状态回写由自己的 service 负责。
## 十、部署排查:部署后看不到新功能
### 症状
前端已是最新版本,侧栏没有「成长中心」「社团与志愿」;访问新接口报错:
```
Table 'tuanwei.gxmu_credit_record' doesn't exist
```
### 原因
三个部分必须同时到位,缺一项都会表现为「没有新功能」:
| 部分 | 状态判断 | 缺失表现 |
| --- | --- | --- |
| 前端 dist | 已确认包含新页面(`index.0475cb90.js` 内有 21 个新路由) | 页面 404 |
| 后端 jar | 已确认新接口可达(返回业务错误而非 404) | 接口 404 |
| **数据库** | **未执行二期 SQL** | **接口报表不存在、侧栏无菜单** |
菜单是**动态从 `sys_menu` 读取的**(`GET /auth/user` → `formatMenus` → `addRoute`),
库里没有菜单记录,前端代码再全也不会显示。
### 部署步骤
在服务器的 `tuanwei-java` 目录执行:
```bash
# 方式一:一键脚本(自动备份 + 执行 9 个脚本 + 验证)
sh sql/deploy_phase2.sh ./sql
# 方式二:合并脚本(单文件,等价于依次执行 01~09)
docker exec -i 1Panel-mariadb-ZOpD \
mysql -utuanwei -p'TytQZsSW5m4wGh38' tuanwei < sql/phase2_all_in_one.sql
# 方式三:逐个执行(便于定位问题)
for f in sql/20261105_phase2_0*.sql; do
docker exec -i 1Panel-mariadb-ZOpD \
mysql -utuanwei -p'TytQZsSW5m4wGh38' tuanwei < "$f"
done
```
执行完重启后端(Docker 里通常已配置 `restart: unless-stopped`,只需
`docker restart tuanwei-api`),然后浏览器强制刷新并**重新登录**。
### 脚本安全性
- 全部可重复执行,实测连续执行两遍:146 条语句零报错,菜单/授权/模板/字典数量完全不变
- `07` 会 ALTER 三张审核表,**只新增列并回填**存量数据,不改原有字段
- 脚本建议先备份;`deploy_phase2.sh` 已内置自动备份并校验备份非空
### 执行后的验证
```sql
SELECT COUNT(*) FROM sys_menu WHERE menu_id BETWEEN 14500 AND 14663; -- 应为 62
SELECT COUNT(*) FROM oa_notice_template; -- 应为 10
SELECT COUNT(*) FROM gxmu_graduate_requirement; -- 应为 6
```
接口验证:
```bash
curl -H "Authorization: <token>" https://twai-api.gxmu.edu.cn/api/gxmu/credit/page
# 应返回 {"code":0,...} 而不是 Table doesn't exist
```
### 若菜单仍未出现
脚本 08 只给 `superAdmin` 和 `student` 授了权。若你当前账号是其他角色
(校团委、二级学院团委、指导老师等),需在「系统设置 → 角色管理」里
手动勾选二期菜单。
## 十一、导入报错 ERROR 1273 Unknown collation
### 症状
导入 SQL 时在第 271 行报:
```
ERROR 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'
```
出错语句是 `CREATE TABLE gxmu_certificate_template`,结尾带
`COLLATE=utf8mb4_0900_ai_ci`。
### 原因
**导错了文件**:这条语句来自从**开发库导出的整库 dump**,不是二期的迁移脚本。
- 开发库是 **MySQL 8.0.44**,建表时 `DEFAULT CHARSET=utf8mb4` 会隐式采用
MySQL 8 专有的 `utf8mb4_0900_ai_ci`
- 生产是 **MariaDB**,不识别这个 collation,直接报错
经核查,`sql/20261105_phase2_*.sql` 里 `COLLATE=` 出现 **0 次**,
不是迁移脚本的问题。mysqldump 导出时会把隐式默认值显式写出来,于是把
MySQL 8 的特性带进了 dump。
### 解决方案
**方案 A(推荐):用迁移脚本,不要导整库 dump**
```bash
docker exec -i 1Panel-mariadb-ZOpD \
mysql -utuanwei -p'密码' tuanwei < sql/phase2_all_in_one.sql
```
迁移脚本的建表语句现在已显式锁定 `COLLATE=utf8mb4_general_ci`
(30 处建表全部处理),在 MySQL 8 / MariaDB 上都能安全执行。
**方案 B:确实要导整库 dump 时,先做兼容转换**
```bash
python3 sql/fix_mysql8_dump_for_mariadb.py dev_dump.sql
# 生成 dev_dump.mariadb.sql,再导入
docker exec -i 1Panel-mariadb-ZOpD \
mysql -utuanwei -p'密码' tuanwei < dev_dump.mariadb.sql
```
转换器会处理:
| 转换项 | 说明 |
| --- | --- |
| `utf8mb4_0900_*` → `utf8mb4_general_ci` / `utf8mb4_bin` | 核心问题 |
| `utf8mb3_*` → `utf8mb4_*` | MySQL 8 的新叫法,MariaDB 不认 |
| `CHARACTER SET utf8mb3` / `CHARSET=utf8mb3` | 裸写声明 |
| 删除 `SET @@GLOBAL.GTID_PURGED` 等 | MariaDB 不支持或会报错 |
| 处理 `/*!80000 ... */` 版本条件注释 | 仅 MySQL 8 执行的内容 |
### 当前开发库情况
开发库 88 张表中有 **61 张**是 `utf8mb4_0900_ai_ci`(`sys_user`、`gxmu_club`
等),如果整库同步到生产,这 61 张都会失败。**建议只同步二期新增的数据,
或先跑转换器**。
### 防呆
`deploy_phase2.sh` 新增了预检:执行前扫描脚本中是否含
`utf8mb4_0900_ai_ci`,命中则直接中止并提示「不要导入 MySQL 8 的整库 dump」。