Files
hzdyjs/docs/需求文档/奖惩补贴需求/奖学金申请管理v2.0重构总结.md
T
2025-08-07 18:40:25 +08:00

12 KiB

奖学金申请管理模块 v2.0 重构总结

版本: v2.0
重构时间: 2025-01-01
重构原因: 基于实际业务需求,从学生自主申请调整为班主任代申请模式


📋 1. 重构背景

1.1 原有模式的问题

问题类型 具体问题 影响
操作复杂 学生需要自己填写申请表、上传材料 学生操作负担重,容易出错
管理分散 每个学生单独申请,班主任难以统筹 申请质量参差不齐,管理效率低
条件过滤 系统自动过滤申请条件复杂 实施困难,容易误判
名额控制 按院系统计控制不够精确 名额分配不合理,存在争议

1.2 新模式的优势

优势类型 具体优势 价值
管理集中 班主任统一管理班级学生申请 提高申请质量,减少错误
操作简化 班主任代为操作,学生无需填表 降低学生负担,提高效率
名额精确 班级→学院两级名额控制 更公平合理的名额分配
时间可控 严格的时间窗口控制 确保申请在规定时间内进行

🔄 2. 核心变更对比

2.1 业务流程变更

原有流程

学生登录 → 查看奖学金信息 → 在线填写申请表 → 上传申请材料 → 提交申请 → 等待审核

新流程

班主任登录 → 选择申请批次和类型 → 从班级学生中选择推荐 → 为学生上传材料 → 批量提交申请 → 进入审核流程

2.2 角色权限变更

角色 原有权限 新权限 变更说明
学生 申请提交、材料上传、进度查看 仅进度查看 权限大幅缩减
班主任 无申请相关权限 学生选择、材料管理、申请提交 新增核心权限
学院管理员 申请审核、统计查看 申请审核、统计查看 权限不变
学生处管理员 全局管理、统计导出 全局管理、统计导出 权限不变

2.3 数据模型变更

新增表结构

  1. 班级名额分配表 (jcbt_scholarship_class_quota)

    • 支持班级级别的名额分配和管理
    • 实现班级→学院的两级名额控制
  2. 名额使用记录表 (jcbt_scholarship_quota_usage)

    • 追踪名额的使用和释放操作
    • 提供完整的名额使用审计记录

调整表结构

  1. 申请记录表 (jcbt_scholarship_application)

    • 新增申请人信息字段(班主任)
    • 调整申请类型枚举值
    • 增加相关索引
  2. 申请材料表 (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 数据库升级步骤

  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;
    
  2. 执行结构调整

    -- 执行升级脚本
    source docs/设计文档/database/奖学金申请管理v2.0数据库升级脚本.sql;
    
  3. 数据迁移处理

    -- 更新现有申请记录的申请人类型
    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 功能增强

  1. 申请条件自动过滤

    • 基于学生成绩、品德等条件自动过滤
    • 提供推荐学生排序功能
  2. 智能名额分配

    • 基于历史数据的名额分配建议
    • 动态名额调整机制
  3. 移动端支持

    • 班主任移动端申请管理
    • 学生移动端状态查看

9.2 系统优化

  1. 性能优化

    • 查询缓存机制
    • 批量操作优化
  2. 用户体验优化

    • 操作向导功能
    • 批量操作进度显示

📋 10. 总结

10.1 重构价值

通过本次重构,奖学金申请管理模块从学生自主申请模式调整为班主任代申请模式,实现了:

  1. 管理效率提升: 班主任统一管理,减少分散操作
  2. 名额控制精确: 班级→学院两级控制,更加合理
  3. 操作流程简化: 降低学生操作负担,提高申请质量
  4. 时间控制严格: 确保申请在规定时间窗口内进行

10.2 技术创新

  1. 层级名额算法: 智能的班级优先、学院兜底名额分配
  2. 批量操作优化: 高效的批量申请提交和状态管理
  3. 完整审计追踪: 名额使用的全程记录和监控
  4. 严格时间控制: 精确的申请时间窗口管理

10.3 下一步行动

  1. 立即执行: 数据库升级脚本和数据迁移
  2. 开始开发: 服务层和控制层重构
  3. 并行推进: 前端界面重构和测试验证
  4. 用户培训: 班主任操作培训和文档准备

文档维护: 本文档将随着重构进展持续更新
最后更新: 2025-01-01
文档版本: v2.0