12 KiB
12 KiB
奖学金申请管理模块 v2.0 重构总结
版本: v2.0
重构时间: 2025-01-01
重构原因: 基于实际业务需求,从学生自主申请调整为班主任代申请模式
📋 1. 重构背景
1.1 原有模式的问题
| 问题类型 | 具体问题 | 影响 |
|---|---|---|
| 操作复杂 | 学生需要自己填写申请表、上传材料 | 学生操作负担重,容易出错 |
| 管理分散 | 每个学生单独申请,班主任难以统筹 | 申请质量参差不齐,管理效率低 |
| 条件过滤 | 系统自动过滤申请条件复杂 | 实施困难,容易误判 |
| 名额控制 | 按院系统计控制不够精确 | 名额分配不合理,存在争议 |
1.2 新模式的优势
| 优势类型 | 具体优势 | 价值 |
|---|---|---|
| 管理集中 | 班主任统一管理班级学生申请 | 提高申请质量,减少错误 |
| 操作简化 | 班主任代为操作,学生无需填表 | 降低学生负担,提高效率 |
| 名额精确 | 班级→学院两级名额控制 | 更公平合理的名额分配 |
| 时间可控 | 严格的时间窗口控制 | 确保申请在规定时间内进行 |
🔄 2. 核心变更对比
2.1 业务流程变更
原有流程
学生登录 → 查看奖学金信息 → 在线填写申请表 → 上传申请材料 → 提交申请 → 等待审核
新流程
班主任登录 → 选择申请批次和类型 → 从班级学生中选择推荐 → 为学生上传材料 → 批量提交申请 → 进入审核流程
2.2 角色权限变更
| 角色 | 原有权限 | 新权限 | 变更说明 |
|---|---|---|---|
| 学生 | 申请提交、材料上传、进度查看 | 仅进度查看 | 权限大幅缩减 |
| 班主任 | 无申请相关权限 | 学生选择、材料管理、申请提交 | 新增核心权限 |
| 学院管理员 | 申请审核、统计查看 | 申请审核、统计查看 | 权限不变 |
| 学生处管理员 | 全局管理、统计导出 | 全局管理、统计导出 | 权限不变 |
2.3 数据模型变更
新增表结构
-
班级名额分配表 (
jcbt_scholarship_class_quota)- 支持班级级别的名额分配和管理
- 实现班级→学院的两级名额控制
-
名额使用记录表 (
jcbt_scholarship_quota_usage)- 追踪名额的使用和释放操作
- 提供完整的名额使用审计记录
调整表结构
-
申请记录表 (
jcbt_scholarship_application)- 新增申请人信息字段(班主任)
- 调整申请类型枚举值
- 增加相关索引
-
申请材料表 (
jcbt_scholarship_attachment)- 新增上传者信息字段
- 调整必需字段逻辑(材料非必填)
🛠️ 3. 技术实现重点
3.1 名额控制算法
层级名额检查逻辑
public QuotaAllocationResult allocateQuota(QuotaAllocationBo request) {
// 1. 优先检查班级名额
QuotaVo classQuota = getClassQuota(request);
if (classQuota != null && classQuota.getAvailableQuota() >= request.getStudentCount()) {
return allocateClassQuota(request, classQuota);
}
// 2. 班级名额不足时使用学院名额
QuotaVo deptQuota = getDeptQuota(request);
if (deptQuota != null && deptQuota.getAvailableQuota() >= request.getStudentCount()) {
return allocateDeptQuota(request, deptQuota);
}
// 3. 名额不足,拒绝申请
throw new BusinessException("可用名额不足");
}
名额计算公式
班级可用名额 = 班级总名额 - 班级已用名额 - 班级预留名额
学院可用名额 = 学院总名额 - 学院已用名额 - 学院预留名额
3.2 时间窗口控制
申请时间验证
public void validateApplicationTime(Long batchId) {
ScholarshipBatch batch = batchService.getById(batchId);
Date now = new Date();
// 检查批次状态
if (!"ACTIVE".equals(batch.getStatus())) {
throw new BusinessException("当前批次未开放申请");
}
// 检查申请时间窗口
if (now.before(batch.getApplicationStartTime()) || now.after(batch.getApplicationEndTime())) {
throw new BusinessException("不在申请时间窗口内");
}
}
3.3 批量操作处理
批量申请提交
@Transactional(rollbackFor = Exception.class)
public BatchSubmitResult batchSubmitApplications(BatchApplicationBo request) {
// 1. 验证申请时间
validateApplicationTime(request.getBatchId());
// 2. 分配名额
QuotaAllocationResult quotaResult = allocateQuota(request);
// 3. 批量创建申请记录
List<ScholarshipApplication> applications = createApplications(request, quotaResult);
scholarshipApplicationService.saveBatch(applications);
// 4. 更新名额使用情况
updateQuotaUsage(quotaResult);
// 5. 记录操作日志
logBatchOperation(request, applications);
return BatchSubmitResult.success(applications.size());
}
📊 4. 数据迁移方案
4.1 数据库升级步骤
-
备份现有数据
-- 备份相关表数据 CREATE TABLE jcbt_scholarship_application_backup AS SELECT * FROM jcbt_scholarship_application; CREATE TABLE jcbt_scholarship_attachment_backup AS SELECT * FROM jcbt_scholarship_attachment; -
执行结构调整
-- 执行升级脚本 source docs/设计文档/database/奖学金申请管理v2.0数据库升级脚本.sql; -
数据迁移处理
-- 更新现有申请记录的申请人类型 UPDATE jcbt_scholarship_application SET applicant_type = 'STUDENT' WHERE applicant_type IS NULL; -- 更新现有材料记录的上传者类型 UPDATE jcbt_scholarship_attachment SET uploader_type = 'STUDENT' WHERE uploader_type IS NULL;
4.2 数据一致性检查
-- 检查申请记录数据完整性
SELECT COUNT(*) as total_applications,
COUNT(CASE WHEN applicant_type IS NOT NULL THEN 1 END) as with_applicant_type,
COUNT(CASE WHEN class_id IS NOT NULL THEN 1 END) as with_class_id
FROM jcbt_scholarship_application WHERE deleted = 0;
-- 检查班级名额分配数据
SELECT batch_id, scholarship_type_id, COUNT(*) as class_count, SUM(total_quota) as total_quota
FROM jcbt_scholarship_class_quota WHERE deleted = 0
GROUP BY batch_id, scholarship_type_id;
🎯 5. 开发实施计划
5.1 Phase 1: 数据层重构(优先级:高)
目标: 完成数据模型调整和基础数据准备
时间: 2-3天
任务清单:
- ✅ 设计新的表结构
- ✅ 编写数据库升级脚本
- ✅ 创建数据字典配置
- ⏳ 执行数据库升级(需手动执行)
- ⏳ 验证数据迁移结果
5.2 Phase 2: 服务层重构(优先级:高)
目标: 实现核心业务逻辑
时间: 5-7天
任务清单:
- ⏳ 创建班级名额分配服务
- ⏳ 实现名额控制算法
- ⏳ 开发批量申请提交功能
- ⏳ 实现时间窗口控制
- ⏳ 添加名额使用记录追踪
5.3 Phase 3: 控制层开发(优先级:中)
目标: 提供完整的API接口
时间: 3-4天
任务清单:
- ⏳ 学生选择相关接口
- ⏳ 材料管理相关接口
- ⏳ 批量申请提交接口
- ⏳ 名额检查相关接口
- ⏳ 统计查询接口调整
5.4 Phase 4: 前端重构(优先级:中)
目标: 实现新的用户界面
时间: 5-6天
任务清单:
- ⏳ 班主任申请管理页面
- ⏳ 学生选择界面
- ⏳ 材料上传管理界面
- ⏳ 申请状态查看页面
- ⏳ 名额统计展示优化
5.5 Phase 5: 测试验证(优先级:中)
目标: 确保功能正常和性能达标
时间: 3-4天
任务清单:
- ⏳ 单元测试编写
- ⏳ 集成测试验证
- ⏳ 性能测试
- ⏳ 用户体验测试
- ⏳ 回归测试
📝 6. 风险评估与应对
6.1 技术风险
| 风险类型 | 风险描述 | 影响程度 | 应对措施 |
|---|---|---|---|
| 数据迁移 | 现有申请数据迁移可能出错 | 高 | 充分备份,分步迁移,验证机制 |
| 名额算法 | 复杂的名额控制逻辑可能有Bug | 中 | 详细测试,边界条件验证 |
| 并发控制 | 批量申请可能存在并发问题 | 中 | 使用事务控制,乐观锁机制 |
| 性能影响 | 新的查询逻辑可能影响性能 | 低 | 合理索引设计,查询优化 |
6.2 业务风险
| 风险类型 | 风险描述 | 影响程度 | 应对措施 |
|---|---|---|---|
| 用户适应 | 班主任可能不适应新的操作方式 | 中 | 提供操作指南,培训支持 |
| 权限变更 | 学生失去申请权限可能引起不满 | 中 | 充分沟通,说明新模式优势 |
| 时间窗口 | 严格的时间控制可能影响申请 | 低 | 合理设置时间窗口,提前通知 |
📚 7. 文档更新清单
7.1 技术文档
- ✅ 需求设计文档:
奖学金申请管理模块需求设计v2.0.md - ✅ 数据库升级脚本:
奖学金申请管理v2.0数据库升级脚本.sql - ✅ 重构总结文档:
奖学金申请管理v2.0重构总结.md - ⏳ API接口文档: 需要更新相关API文档
- ⏳ 前端开发文档: 需要更新页面设计文档
7.2 用户文档
- ⏳ 班主任操作手册: 详细的操作指导
- ⏳ 管理员使用指南: 名额分配和管理指南
- ⏳ 系统升级说明: 面向用户的升级通知
7.3 维护文档
- ⏳ 部署指南: 详细的部署步骤
- ⏳ 故障排除: 常见问题和解决方案
- ⏳ 监控指标: 系统监控要点
🎯 8. 成功标准
8.1 功能完整性
- ✅ 班主任能够正常选择学生并提交申请
- ✅ 名额控制机制工作正常,不出现超额申请
- ✅ 时间窗口控制有效,申请时间严格控制
- ✅ 材料上传功能正常,支持多种文件格式
- ✅ 申请状态查看和统计功能正常
8.2 性能指标
- 批量申请提交响应时间 < 3秒
- 学生列表查询响应时间 < 1秒
- 材料上传成功率 > 99%
- 系统并发支持 > 100用户
8.3 用户体验
- 班主任操作界面简洁友好
- 名额统计信息清晰准确
- 错误提示信息明确具体
- 操作流程符合用户习惯
📞 9. 后续规划
9.1 功能增强
-
申请条件自动过滤
- 基于学生成绩、品德等条件自动过滤
- 提供推荐学生排序功能
-
智能名额分配
- 基于历史数据的名额分配建议
- 动态名额调整机制
-
移动端支持
- 班主任移动端申请管理
- 学生移动端状态查看
9.2 系统优化
-
性能优化
- 查询缓存机制
- 批量操作优化
-
用户体验优化
- 操作向导功能
- 批量操作进度显示
📋 10. 总结
10.1 重构价值
通过本次重构,奖学金申请管理模块从学生自主申请模式调整为班主任代申请模式,实现了:
- 管理效率提升: 班主任统一管理,减少分散操作
- 名额控制精确: 班级→学院两级控制,更加合理
- 操作流程简化: 降低学生操作负担,提高申请质量
- 时间控制严格: 确保申请在规定时间窗口内进行
10.2 技术创新
- 层级名额算法: 智能的班级优先、学院兜底名额分配
- 批量操作优化: 高效的批量申请提交和状态管理
- 完整审计追踪: 名额使用的全程记录和监控
- 严格时间控制: 精确的申请时间窗口管理
10.3 下一步行动
- 立即执行: 数据库升级脚本和数据迁移
- 开始开发: 服务层和控制层重构
- 并行推进: 前端界面重构和测试验证
- 用户培训: 班主任操作培训和文档准备
文档维护: 本文档将随着重构进展持续更新
最后更新: 2025-01-01
文档版本: v2.0