wuzhen update

This commit is contained in:
wuzhen committed 2025-08-10 00:24:31 +08:00
1 parent bab7b53074
commit a2222f63cb
284 files changed
+48629 -3473

No files matched your search

@@ -0,0 +1,369 @@
# 奖学金管理模块 - 数据模型设计总览
**模块名称**: 奖惩补贴系统 - 奖学金管理模块
**设计时间**: 2025-01-27
**设计人员**: AI Assistant
---
## 📋 1. 模块概述
### 1.1 业务背景
奖学金管理模块是校园管理系统的核心业务模块之一,负责处理奖学金的全生命周期管理,包括奖项设立、规则配置、评定批次、名额分配、学生申请、审核管理、获奖记录等核心业务场景。
### 1.2 设计目标
- **🎯 高度灵活**: 支持复杂的评定规则配置
- **🚀 高性能**: 优化查询性能,支持大数据量
- **🔒 安全可靠**: 多租户隔离,逻辑删除
- **📈 易扩展**: 模块化设计,便于功能扩展
- **🎨 易维护**: 标准化开发,完整文档
---
## 🗂️ 2. 文档结构
### 2.1 核心文档
| 文档名称 | 文件路径 | 说明 |
|---------|---------|-----|
| **产品需求设计** | `奖学金管理模块产品需求设计.md` | 完整的业务需求和功能设计 |
| **数据模型设计** | `奖学金管理数据模型设计.md` | 详细的数据库设计和规则引擎 |
| **建表脚本** | `奖学金管理建表脚本.sql` | MySQL数据库建表SQL |
| **基础数据** | `奖学金管理基础数据.sql` | 字典数据和示例配置 |
| **模块说明** | `README.md` | 本文档,总览和使用指南 |
### 2.2 文档关系
```mermaid
graph TB
A[产品需求设计] --> B[数据模型设计]
B --> C[建表脚本]
B --> D[基础数据]
C --> E[后端开发]
D --> E
E --> F[前端开发]
A --> G[测试用例]
```
---
## 🏗️ 3. 数据模型核心特性
### 3.1 核心表结构 (11张表)
#### 3.1.1 基础配置表 (3张)
- **`jcbt_scholarship_type`** - 奖学金类型表
- **`jcbt_scholarship_compatibility`** - 兼得关系表
- **`jcbt_scholarship_batch`** - 评定批次表
#### 3.1.2 灵活规则引擎 (3张)
- **`jcbt_scholarship_rule`** - 评定规则主表
- **`jcbt_scholarship_rule_condition`** - 规则条件表 ⭐
- **`jcbt_scholarship_rule_action`** - 规则动作表
#### 3.1.3 业务管理表 (5张)
- **`jcbt_scholarship_quota`** - 名额分配表
- **`jcbt_scholarship_application`** - 申请记录表
- **`jcbt_scholarship_attachment`** - 申请材料表
- **`jcbt_scholarship_review`** - 审核记录表
- **`jcbt_scholarship_award`** - 获奖记录表
### 3.2 规则引擎设计亮点 ⭐
#### 3.2.1 灵活的条件配置
```json
{
"field_name": "gpa", // 字段名
"field_type": "NUMBER", // 字段类型
"operator_type": "GTE", // 操作符
"condition_value": "3.5", // 条件值
"weight": 0.4, // 权重
"condition_group": "MAIN" // 条件组
}
```
#### 3.2.2 复杂逻辑关系支持
- **组内关系**: 同一`condition_group`内为AND关系
- **组间关系**: 不同`condition_group`为OR关系
- **权重计算**: 支持加权分数计算
- **动态校验**: 实时条件校验和提示
### 3.3 数据库规范遵循
- ✅ **雪花ID主键**: 统一使用`bigint(20)`
- ✅ **统一基础字段**: `create_by`, `create_time`, `update_by`, `update_time`
- ✅ **逻辑删除**: `deleted`字段,禁止物理删除
- ✅ **多租户支持**: `tenant_id`字段隔离
- ✅ **性能优化**: 合理索引设计
---
## 🚀 4. 快速开始
### 4.1 数据库初始化
#### Step 1: 执行建表脚本
```bash
# 连接数据库
mysql -u root -p
# 选择数据库
use hzdyjs_xg;
# 执行建表脚本
source docs/需求文档/奖惩补贴需求/奖学金管理建表脚本.sql;
```
#### Step 2: 初始化基础数据
```bash
# 执行基础数据脚本
source docs/需求文档/奖惩补贴需求/奖学金管理基础数据.sql;
```
#### Step 3: 验证安装
```sql
-- 检查表结构
SHOW TABLES LIKE 'jcbt_%';
-- 检查字典数据
SELECT * FROM sys_dict_data WHERE dict_type LIKE 'jcbt_%';
-- 检查示例奖学金类型
SELECT * FROM jcbt_scholarship_type;
```
### 4.2 开发环境配置
#### 后端模块结构
```
backend/ruoyi-modules/ruoyi-jcbt/
├── src/main/java/org/dromara/jcbt/
│ ├── controller/ # 控制器层
│ ├── service/ # 服务层
│ ├── mapper/ # 数据访问层
│ ├── domain/
│ │ ├── entity/ # 实体类
│ │ ├── vo/ # 视图对象
│ │ └── bo/ # 业务对象
│ ├── event/ # 事件定义
│ └── listener/ # 事件监听器
└── src/main/resources/
└── mapper/ # MyBatis映射文件
```
#### 前端页面结构
```
web/src/views/jcbt/
├── type/ # 奖项管理
├── rule/ # 规则配置
├── batch/ # 批次管理
├── quota/ # 名额分配
├── application/ # 申请管理
├── review/ # 审核管理
├── award/ # 获奖记录
└── statistics/ # 统计报表
```
---
## ⚡ 5. 核心功能实现
### 5.1 规则引擎核心算法
#### 5.1.1 条件校验算法
```java
public boolean evaluateConditions(List<RuleCondition> conditions, StudentData student) {
Map<String, List<RuleCondition>> groupedConditions =
conditions.stream().collect(Collectors.groupingBy(RuleCondition::getConditionGroup));
// 组间OR关系,组内AND关系
return groupedConditions.entrySet().stream()
.anyMatch(entry -> entry.getValue().stream()
.allMatch(condition -> evaluateSingleCondition(condition, student))
);
}
```
#### 5.1.2 分数计算算法
```java
public BigDecimal calculateScore(List<RuleCondition> conditions, StudentData student) {
return conditions.stream()
.filter(condition -> evaluateSingleCondition(condition, student))
.map(condition -> getFieldValue(student, condition.getFieldName())
.multiply(condition.getWeight()))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
```
### 5.2 兼得关系检查
#### 5.2.1 互斥关系检查
```java
public boolean checkCompatibility(Long studentId, Long scholarshipTypeId) {
List<Long> existingTypes = getStudentScholarships(studentId);
return existingTypes.stream()
.noneMatch(typeId -> isExclusive(typeId, scholarshipTypeId));
}
```
### 5.3 名额管理机制
#### 5.3.1 名额使用统计
```java
public QuotaUsageVo calculateQuotaUsage(Long batchId, Long deptId) {
List<ScholarshipQuota> quotas = quotaMapper.selectByBatchAndDept(batchId, deptId);
return quotas.stream()
.collect(Collectors.groupingBy(
ScholarshipQuota::getScholarshipTypeId,
Collectors.summingInt(q -> q.getTotalQuota() - q.getUsedQuota())
));
}
```
---
## 📊 6. 性能优化方案
### 6.1 索引策略
```sql
-- 申请查询优化
CREATE INDEX idx_app_batch_status_score ON jcbt_scholarship_application
(batch_id, current_status, final_score DESC);
-- 规则条件查询优化
CREATE INDEX idx_rule_condition_field ON jcbt_scholarship_rule_condition
(rule_id, field_name, operator_type);
```
### 6.2 缓存策略
- **奖学金类型**: Redis缓存,TTL=24小时
- **评定规则**: Redis缓存,TTL=12小时
- **名额统计**: Redis缓存,TTL=30分钟
### 6.3 分页优化
```java
// 避免深度分页,使用游标分页
public PageResult<ApplicationVo> getApplications(String lastId, int pageSize) {
return applicationMapper.selectByLastId(lastId, pageSize);
}
```
---
## 🧪 7. 测试验证
### 7.1 数据完整性测试
```sql
-- 外键关系检查
SELECT COUNT(*) FROM jcbt_scholarship_rule_condition
WHERE rule_id NOT IN (SELECT id FROM jcbt_scholarship_rule);
-- 数据一致性检查
SELECT * FROM jcbt_scholarship_quota
WHERE used_quota > total_quota;
```
### 7.2 规则引擎测试
```java
@Test
public void testRuleEngine() {
// 测试GPA条件
RuleCondition gpaCondition = new RuleCondition();
gpaCondition.setFieldName("gpa");
gpaCondition.setOperatorType("GTE");
gpaCondition.setConditionValue("3.5");
StudentData student = new StudentData();
student.setGpa(new BigDecimal("3.7"));
assertTrue(ruleEngine.evaluateCondition(gpaCondition, student));
}
```
### 7.3 性能压力测试
```java
@Test
public void testPerformance() {
// 模拟1000个学生同时申请
List<Long> studentIds = IntStream.range(1, 1001)
.mapToObj(i -> (long) i)
.collect(Collectors.toList());
long startTime = System.currentTimeMillis();
studentIds.parallelStream()
.forEach(id -> scholarshipService.autoEvaluate(id, 1L));
long endTime = System.currentTimeMillis();
assertTrue("性能测试失败", (endTime - startTime) < 10000); // 10秒内完成
}
```
---
## 📈 8. 扩展规划
### 8.1 功能扩展
- **工作流集成**: 集成Warm-Flow工作流引擎
- **AI评定**: 引入机器学习辅助评定
- **移动端支持**: 开发移动端申请功能
- **数据分析**: 增加更丰富的统计分析
### 8.2 技术升级
- **分布式**: 支持微服务架构
- **消息队列**: 异步处理评定任务
- **大数据**: 支持海量历史数据分析
- **云原生**: 支持容器化部署
### 8.3 业务拓展
- **助学金管理**: 扩展至助学金业务
- **荣誉管理**: 支持各类荣誉奖项
- **综合评定**: 集成综合素质评定
- **多校区**: 支持多校区管理
---
## 🛠️ 9. 开发注意事项
### 9.1 代码规范
- **VO类规范**: 必须包含四个基础字段(`createBy`, `createTime`, `updateBy`, `updateTime`)
- **异常处理**: 统一异常处理和错误码
- **参数校验**: 使用Bean Validation进行参数校验
- **权限控制**: 每个接口必须有`@SaCheckPermission`注解
### 9.2 数据安全
- **敏感数据**: 学生信息等敏感数据加密存储
- **操作日志**: 关键操作必须记录日志
- **权限边界**: 严格控制数据访问权限
- **审计跟踪**: 完整的操作审计链
### 9.3 性能考虑
- **批量操作**: 大数据量操作使用批量处理
- **索引使用**: 查询条件必须能够使用索引
- **缓存更新**: 及时更新相关缓存数据
- **连接池**: 合理配置数据库连接池
---
## 📞 10. 技术支持
### 10.1 问题反馈
- **GitHub Issues**: 在项目仓库提交Issue
- **技术文档**: 查看项目文档库
- **开发群组**: 加入技术讨论群
### 10.2 更新日志
- **v1.0**: 2025-01-27 - 初始数据模型设计完成
- **下一版本**: 计划添加工作流集成和移动端支持
### 10.3 相关链接
- [项目主页](../../../README.md)
- [开发规范](.cursor/cursorrules.md)
- [API文档](../开发文档/API/)
- [测试指南](../测试文档/)
---
**🎯 总结**: 奖学金管理模块的数据模型设计充分考虑了业务的复杂性和灵活性需求,通过规则引擎设计实现了高度可配置的评定逻辑,同时遵循项目的技术规范,为后续的功能开发奠定了坚实的基础。
**📝 下一步**: 基于此数据模型,开始后端API开发和前端页面实现。
@@ -0,0 +1,37 @@
助学金管理主要有以下需求模块
1、贫困生认定:
--班主任根据收集到的学生线下填写的申请单上报认定申请,班主任填入学号或者姓名可以匹配出本班相关联的学生,选择之后,可以自动带出学号,姓名等等必要信息;
--班主任要手动选取认定类型
**认定类型包括(页面上最好把每个群体的说明也带上)**
**(一)特殊群体**
低保家庭学生、特困供养学生、孤儿、烈士子女、残疾学生、低保边缘家庭学生、脱贫家庭学生(原建档立卡)、其他经济困难农户、其他群体(临时救助)。
需提供相应政府部门出具的证明。
**(二)其他群体**
因遭受自然灾害、意外事件、重大疾病等情况导致家庭经济困难的学生。
需提供学生所在街道(乡镇)级以上政府部门出具的相关证明,属于重大疾病导致家庭经济困难的还需要提供当年度医药费相关凭证。
--申请自助类型也有两个:1、浙江省学生资助;2、杭州第一技师学院学生资助;
--上传附件必须是两个,一个是申请表,一个调查表,主要是指学生提交纸质版文件的照片,附件的大小不能超过10M
2、贫困生认定审核
审核人员根据老师提交的认定申请在线进行审核,除了查看详细信息之外,还要可以在线预览附件,审核通过则贫困生认定成功,如果不通过打回,则需要老师重新修改后,再次提交。或者老师主动取消申请。
3、统计查询
根据不同条件,包括但是不限于学院,专业,班级,性别,认定类型,认定时间等等信息进行查询和统计,并且要支持查询结果的导出。
@@ -0,0 +1,390 @@
# 奖学金申请管理模块 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 名额控制算法
#### 层级名额检查逻辑
```java
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 时间窗口控制
#### 申请时间验证
```java
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 批量操作处理
#### 批量申请提交
```java
@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. **备份现有数据**
```sql
-- 备份相关表数据
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. **执行结构调整**
```sql
-- 执行升级脚本
source docs/设计文档/database/奖学金申请管理v2.0数据库升级脚本.sql;
```
3. **数据迁移处理**
```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 数据一致性检查
```sql
-- 检查申请记录数据完整性
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
@@ -0,0 +1,687 @@
# 奖学金申请管理模块需求设计 v2.0
**版本**: v2.0
**更新时间**: 2025-01-01
**文档说明**: 基于班主任代学生申请模式的重新设计
---
## 📋 1. 需求概述
### 1.1 背景说明
基于实际业务需求调研,奖学金申请流程需要调整为:
- **班主任代申请模式**:不再是学生自主申请,而是由班主任从班级学生中选择推荐
- **材料上传管理**:班主任可以为每个推荐学生上传申请材料(非必填)
- **名额控制机制**:严格按照班级或学院分配的名额进行申请限制
- **时间窗口控制**:只能在批次开放的时间段内进行申请操作
### 1.2 核心变更点
| 变更点 | 原设计 | 新设计 |
|--------|--------|--------|
| **申请主体** | 学生自主申请 | 班主任代学生申请 |
| **申请方式** | 学生在线填写申请表 | 班主任从班级学生中选择 |
| **材料上传** | 学生自行上传 | 班主任统一管理上传 |
| **条件过滤** | 系统自动过滤 | 暂时不做申请条件过滤 |
| **名额控制** | 按院系统计控制 | 按班级→学院层级控制 |
---
## 👥 2. 角色权限设计
### 2.1 角色定义
| 角色 | 申请管理权限 | 主要操作 |
|------|-------------|----------|
| **班主任** | 本班级学生申请管理 | 选择学生、上传材料、提交申请 |
| **学院管理员** | 本学院申请审核管理 | 查看申请、审核、统计 |
| **学生处管理员** | 全校申请统计管理 | 全局统计、结果确认 |
| **学生** | 查看自己申请状态 | 查看申请进度、结果 |
### 2.2 权限矩阵
| 功能模块 | 班主任 | 学院管理员 | 学生处管理员 | 学生 |
|----------|--------|------------|-------------|------|
| 学生选择推荐 | ✏️ | 🔍 | 🔍 | ❌ |
| 材料上传管理 | ✏️ | 🔍 | 🔍 | ❌ |
| 申请提交 | ✏️ | ❌ | ❌ | ❌ |
| 申请审核 | 🔍 | ✏️ | ✏️ | ❌ |
| 申请状态查看 | ✅ | ✅ | ✅ | 🔍 |
| 统计报表 | 🔍 | ✏️ | ✅ | ❌ |
**图例**: ✅全部权限 ✏️编辑权限 🔍查看权限 ❌无权限
---
## 🔧 3. 功能模块设计
### 3.1 班主任申请管理
#### 3.1.1 学生选择功能
**功能描述**: 班主任从本班级学生中选择推荐申请奖学金的学生
**核心逻辑**:
```
1. 获取班级学生列表(显示基本信息:学号、姓名、专业)
2. 支持多选学生(暂不做申请条件自动过滤)
3. 实时显示已选择学生数量 vs 可申请名额
4. 名额控制:优先使用班级分配名额,无班级名额时使用学院名额
5. 提供学生基本信息预览(便于班主任选择判断)
```
**界面要求**:
- 学生列表表格:学号、姓名、专业、在校状态
- 批量选择操作:全选、反选、清空
- 名额提示:`已选择 X 人,可申请名额 Y 人`
- 学生详情弹窗:点击学生姓名显示详细信息
#### 3.1.2 材料上传管理
**功能描述**: 班主任为每个推荐学生上传申请材料
**核心逻辑**:
```
1. 已选择学生的材料管理列表
2. 支持每个学生上传多个材料文件
3. 材料分类管理:成绩单、获奖证书、其他证明
4. 文件格式限制:PDF、JPG、PNG,单文件不超过10MB
5. 材料状态标识:已上传、未上传(材料上传为非必填)
```
**界面要求**:
- 学生材料管理表格:学生信息、材料数量、上传状态、操作
- 材料上传弹窗:支持拖拽上传、批量上传
- 材料预览功能:支持在线预览已上传材料
- 进度提示:`X 人已上传材料,Y 人未上传`
#### 3.1.3 申请提交控制
**功能描述**: 班主任统一提交本班级所有推荐学生的申请
**核心逻辑**:
```
1. 时间窗口检查:必须在批次申请开放时间内
2. 名额数量检查:推荐学生数不能超过分配名额
3. 名额分配检查:班级有名额优先使用,无班级名额时使用学院名额
4. 批量生成申请记录:每个学生生成一条申请记录
5. 状态更新:申请提交后不能修改,除非撤回
```
**提交前验证**:
- ✅ 批次申请时间有效性
- ✅ 推荐学生数量 ≤ 可用名额
- ✅ 学生信息完整性
- ⚠️ 材料上传完整性(提示但不强制)
### 3.2 名额控制机制
#### 3.2.1 层级名额分配
```
全校总名额
├── 学院A名额
│ ├── 班级A1名额 (优先使用)
│ ├── 班级A2名额
│ └── 学院A机动名额 (班级无名额时使用)
└── 学院B名额
├── 班级B1名额
└── 学院B机动名额
```
#### 3.2.2 名额使用逻辑
**申请时名额检查顺序**:
1. **班级名额优先**: 如果班级有分配名额,优先使用班级名额
2. **学院名额兜底**: 如果班级无名额,使用学院级别名额
3. **名额不足提示**: 超过可用名额时给出明确提示
4. **实时名额更新**: 申请提交后立即更新已用名额
**名额计算公式**:
```sql
-- 班级可用名额计算
班级可用名额 = 班级总名额 - 班级已用名额 - 班级预留名额
-- 学院可用名额计算(当班级无名额时)
学院可用名额 = 学院总名额 - 学院已用名额 - 学院预留名额
```
### 3.3 时间窗口控制
#### 3.3.1 申请时间控制
```java
// 申请时间检查逻辑
public boolean checkApplicationTimeWindow(Long batchId) {
ScholarshipBatch batch = batchService.getById(batchId);
Date now = new Date();
// 检查批次状态
if (!"ACTIVE".equals(batch.getStatus())) {
return false;
}
// 检查申请时间窗口
return now.after(batch.getApplicationStartTime())
&& now.before(batch.getApplicationEndTime());
}
```
#### 3.3.2 操作权限控制
| 操作 | 申请开始前 | 申请期间 | 申请结束后 |
|------|------------|----------|------------|
| 选择学生 | ❌ | ✅ | ❌ |
| 上传材料 | ❌ | ✅ | 🔍(仅查看) |
| 提交申请 | ❌ | ✅ | ❌ |
| 撤回申请 | ❌ | ✅ | ❌ |
| 查看状态 | ✅ | ✅ | ✅ |
---
## 📊 4. 数据模型设计
### 4.1 申请记录表调整
基于新需求,需要调整现有的申请记录表结构:
```sql
-- 修改申请记录表
ALTER TABLE jcbt_scholarship_application
ADD COLUMN `applicant_type` VARCHAR(20) DEFAULT 'TEACHER' COMMENT '申请人类型:STUDENT-学生申请,TEACHER-教师代申请';
ALTER TABLE jcbt_scholarship_application
ADD COLUMN `applicant_id` BIGINT(20) DEFAULT NULL COMMENT '申请人ID(班主任ID)';
ALTER TABLE jcbt_scholarship_application
ADD COLUMN `applicant_name` VARCHAR(100) DEFAULT NULL COMMENT '申请人姓名(班主任姓名)';
-- 修改申请类型枚举值
ALTER TABLE jcbt_scholarship_application
MODIFY COLUMN `application_type` VARCHAR(20) NOT NULL
COMMENT '申请类型:TEACHER_RECOMMEND-教师推荐,AUTO-自动评定,DIRECT-直接指定';
-- 添加班级信息索引
CREATE INDEX idx_class_batch ON jcbt_scholarship_application(class_id, batch_id);
CREATE INDEX idx_applicant_batch ON jcbt_scholarship_application(applicant_id, batch_id);
```
### 4.2 班级名额分配表
新增班级级别的名额分配管理:
```sql
-- 班级名额分配表
CREATE TABLE jcbt_scholarship_class_quota (
id BIGINT(20) NOT NULL COMMENT '主键ID',
batch_id BIGINT(20) NOT NULL COMMENT '批次ID',
scholarship_type_id BIGINT(20) NOT NULL COMMENT '奖学金类型ID',
dept_id BIGINT(20) NOT NULL COMMENT '学院ID',
class_id BIGINT(20) NOT NULL COMMENT '班级ID',
class_name VARCHAR(100) NOT NULL COMMENT '班级名称',
total_quota INT DEFAULT 0 COMMENT '总名额',
used_quota INT DEFAULT 0 COMMENT '已用名额',
reserved_quota INT DEFAULT 0 COMMENT '预留名额',
available_quota INT DEFAULT 0 COMMENT '可用名额',
allocation_method VARCHAR(20) DEFAULT 'MANUAL' COMMENT '分配方式:MANUAL-手动分配,AUTO-自动分配',
is_locked TINYINT(1) DEFAULT 0 COMMENT '是否锁定:0-否,1-是',
status VARCHAR(20) DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE-有效,INACTIVE-无效',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
UNIQUE KEY uk_batch_type_class (batch_id, scholarship_type_id, class_id, deleted),
INDEX idx_dept_class (dept_id, class_id),
INDEX idx_batch_dept (batch_id, dept_id),
INDEX idx_quota_status (total_quota, status),
INDEX idx_tenant (tenant_id, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='班级名额分配表';
```
### 4.3 申请材料表调整
调整材料表以支持班主任上传:
```sql
-- 添加上传者信息
ALTER TABLE jcbt_scholarship_attachment
ADD COLUMN `uploader_type` VARCHAR(20) DEFAULT 'TEACHER' COMMENT '上传者类型:STUDENT-学生,TEACHER-教师';
ALTER TABLE jcbt_scholarship_attachment
ADD COLUMN `uploader_id` BIGINT(20) DEFAULT NULL COMMENT '上传者ID';
ALTER TABLE jcbt_scholarship_attachment
ADD COLUMN `uploader_name` VARCHAR(100) DEFAULT NULL COMMENT '上传者姓名';
-- 修改必需字段逻辑
ALTER TABLE jcbt_scholarship_attachment
MODIFY COLUMN `is_required` TINYINT(1) DEFAULT 0 COMMENT '是否必需:0-否,1-是(新需求中材料非必填)';
```
### 4.4 名额使用记录表
新增名额使用记录表,用于追踪名额使用情况:
```sql
-- 名额使用记录表
CREATE TABLE jcbt_scholarship_quota_usage (
id BIGINT(20) NOT NULL COMMENT '主键ID',
batch_id BIGINT(20) NOT NULL COMMENT '批次ID',
scholarship_type_id BIGINT(20) NOT NULL COMMENT '奖学金类型ID',
quota_type VARCHAR(20) NOT NULL COMMENT '名额类型:CLASS-班级名额,DEPT-学院名额',
target_id BIGINT(20) NOT NULL COMMENT '目标ID(班级ID或学院ID)',
application_id BIGINT(20) NOT NULL COMMENT '申请ID',
student_id BIGINT(20) NOT NULL COMMENT '学生ID',
operation_type VARCHAR(20) NOT NULL COMMENT '操作类型:USE-使用,RELEASE-释放',
operation_time DATETIME NOT NULL COMMENT '操作时间',
operator_id BIGINT(20) NOT NULL COMMENT '操作人ID',
operator_name VARCHAR(100) NOT NULL COMMENT '操作人姓名',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
INDEX idx_batch_type_target (batch_id, scholarship_type_id, target_id),
INDEX idx_application_student (application_id, student_id),
INDEX idx_operation_time (operation_type, operation_time),
INDEX idx_tenant (tenant_id, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='名额使用记录表';
```
---
## 🔄 5. 业务流程设计
### 5.1 申请提交流程
```mermaid
graph TD
A[班主任登录] --> B[选择申请批次]
B --> C[检查申请时间窗口]
C --> D{时间窗口有效?}
D -->|否| E[提示申请时间未开放]
D -->|是| F[获取班级学生列表]
F --> G[选择推荐学生]
G --> H[检查名额限制]
H --> I{名额足够?}
I -->|否| J[提示名额不足]
I -->|是| K[上传学生材料]
K --> L[确认提交申请]
L --> M[生成申请记录]
M --> N[更新名额使用]
N --> O[发送提交通知]
```
### 5.2 名额检查流程
```mermaid
graph TD
A[开始名额检查] --> B[获取班级分配名额]
B --> C{班级有分配名额?}
C -->|是| D[计算班级可用名额]
C -->|否| E[获取学院分配名额]
D --> F{班级名额足够?}
F -->|是| G[使用班级名额]
F -->|否| E
E --> H[计算学院可用名额]
H --> I{学院名额足够?}
I -->|是| J[使用学院名额]
I -->|否| K[提示名额不足]
G --> L[允许申请]
J --> L
K --> M[拒绝申请]
```
### 5.3 材料管理流程
```mermaid
graph TD
A[进入材料管理] --> B[显示已选学生列表]
B --> C[选择学生上传材料]
C --> D[检查文件格式]
D --> E{格式有效?}
E -->|否| F[提示格式错误]
E -->|是| G[上传文件到服务器]
G --> H[保存材料记录]
H --> I[更新材料状态]
I --> J[显示上传成功]
J --> K{还有其他学生?}
K -->|是| C
K -->|否| L[完成材料上传]
```
---
## 📋 6. 接口设计
### 6.1 学生选择接口
```java
/**
* 获取班级学生列表(供选择推荐)
*/
@GetMapping("/class-students")
public R<List<StudentSelectVo>> getClassStudents(
@RequestParam Long classId,
@RequestParam Long batchId,
@RequestParam Long scholarshipTypeId) {
// 返回班级学生列表,包含基本信息和是否已申请状态
}
/**
* 检查申请名额限制
*/
@PostMapping("/check-quota")
public R<QuotaCheckVo> checkQuota(
@RequestBody QuotaCheckBo quotaCheckBo) {
// 检查选择的学生数量是否超过可用名额
}
```
### 6.2 申请提交接口
```java
/**
* 批量提交学生申请
*/
@PostMapping("/batch-submit")
public R<BatchSubmitVo> batchSubmitApplications(
@RequestBody BatchApplicationBo batchApplicationBo) {
// 批量创建申请记录,更新名额使用情况
}
/**
* 撤回班级申请
*/
@PostMapping("/withdraw-batch")
public R<Void> withdrawBatchApplications(
@RequestParam Long classId,
@RequestParam Long batchId,
@RequestParam Long scholarshipTypeId) {
// 撤回班级所有申请,释放名额
}
```
### 6.3 材料管理接口
```java
/**
* 上传学生申请材料
*/
@PostMapping("/upload-material")
public R<MaterialUploadVo> uploadStudentMaterial(
@RequestParam Long applicationId,
@RequestParam MultipartFile file,
@RequestParam String materialType) {
// 上传单个学生的申请材料
}
/**
* 获取学生材料列表
*/
@GetMapping("/student-materials")
public R<List<MaterialVo>> getStudentMaterials(
@RequestParam Long applicationId) {
// 获取指定申请的所有材料
}
```
---
## 📊 7. 前端页面设计
### 7.1 申请管理主页面
**页面结构**:
```
[批次选择] [奖学金类型选择]
==========================================
申请状态: [时间窗口状态] [名额统计]
==========================================
学生选择区域:
┌─────────────────────────────────────┐
│ [全选] [反选] [清空] 已选择X人/可申请Y人 │
├─────────────────────────────────────┤
│ ☐ 张三 (2021001) 计算机科学与技术 │
│ ☑ 李四 (2021002) 软件工程 │
│ ☐ 王五 (2021003) 信息安全 │
└─────────────────────────────────────┘
==========================================
[上传材料] [提交申请] [撤回申请]
```
### 7.2 材料管理页面
**页面结构**:
```
材料上传管理
==========================================
┌─学生─┬─材料数量─┬─上传状态─┬─操作─┐
│ 张三 │ 2 │ 已完成 │ 查看 │
│ 李四 │ 0 │ 未上传 │ 上传 │
│ 王五 │ 1 │ 部分 │ 管理 │
└─────┴────────┴────────┴──────┘
==========================================
进度: 2人已上传材料,1人未上传
```
### 7.3 申请状态查看页面
**页面结构**:
```
申请状态总览
==========================================
批次: 2024年春季学期 | 类型: 国家奖学金
申请时间: 2024-03-01 ~ 2024-03-31
名额情况: 班级名额 2/3,学院名额 15/20
==========================================
申请学生列表:
┌─学号───┬─姓名─┬─状态───┬─材料─┬─操作─┐
│2021001 │ 张三 │ 待审核 │ 2 │ 查看 │
│2021002 │ 李四 │ 已通过 │ 0 │ 查看 │
└────────┴─────┴────────┴──────┴──────┘
```
---
## 🔧 8. 技术实现要点
### 8.1 名额控制实现
```java
@Service
public class QuotaControlService {
/**
* 检查并分配名额
*/
public QuotaAllocationResult allocateQuota(QuotaAllocationBo request) {
// 1. 检查班级名额
QuotaVo classQuota = getClassQuota(request.getClassId(),
request.getBatchId(), request.getScholarshipTypeId());
if (classQuota != null && classQuota.getAvailableQuota() >= request.getStudentCount()) {
// 使用班级名额
return allocateClassQuota(request, classQuota);
}
// 2. 检查学院名额
QuotaVo deptQuota = getDeptQuota(request.getDeptId(),
request.getBatchId(), request.getScholarshipTypeId());
if (deptQuota != null && deptQuota.getAvailableQuota() >= request.getStudentCount()) {
// 使用学院名额
return allocateDeptQuota(request, deptQuota);
}
// 3. 名额不足
throw new BusinessException("可用名额不足");
}
}
```
### 8.2 时间窗口控制
```java
@Component
public class ApplicationTimeValidator {
@Autowired
private ScholarshipBatchService batchService;
/**
* 验证申请时间窗口
*/
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())) {
throw new BusinessException("申请尚未开始,开始时间:" +
DateUtils.formatDate(batch.getApplicationStartTime()));
}
// 检查申请结束时间
if (now.after(batch.getApplicationEndTime())) {
throw new BusinessException("申请已结束,结束时间:" +
DateUtils.formatDate(batch.getApplicationEndTime()));
}
}
}
```
### 8.3 批量申请提交
```java
@Service
@Transactional(rollbackFor = Exception.class)
public class BatchApplicationService {
/**
* 批量提交申请
*/
public BatchSubmitResult batchSubmitApplications(BatchApplicationBo request) {
// 1. 验证申请时间
applicationTimeValidator.validateApplicationTime(request.getBatchId());
// 2. 分配名额
QuotaAllocationResult quotaResult = quotaControlService.allocateQuota(request);
// 3. 批量创建申请记录
List<ScholarshipApplication> applications = request.getStudentIds().stream()
.map(studentId -> buildApplication(request, studentId, quotaResult))
.collect(Collectors.toList());
scholarshipApplicationService.saveBatch(applications);
// 4. 更新名额使用情况
updateQuotaUsage(quotaResult);
// 5. 记录操作日志
logBatchOperation(request, applications);
return BatchSubmitResult.success(applications.size());
}
}
```
---
## 📝 9. 测试用例设计
### 9.1 功能测试用例
| 测试场景 | 测试步骤 | 预期结果 |
|----------|----------|----------|
| 正常申请流程 | 1.选择学生 2.上传材料 3.提交申请 | 申请成功,名额正确扣减 |
| 名额不足 | 选择学生数量超过可用名额 | 提示名额不足,禁止提交 |
| 时间窗口外申请 | 在申请时间外进行操作 | 提示时间窗口错误 |
| 材料上传 | 上传各种格式文件 | 正确文件上传成功,错误格式拒绝 |
| 申请撤回 | 提交后撤回申请 | 申请状态更新,名额释放 |
### 9.2 性能测试用例
| 测试场景 | 并发数 | 数据量 | 性能要求 |
|----------|--------|--------|----------|
| 批量申请提交 | 50 | 100人/班 | 响应时间<3秒 |
| 学生列表查询 | 100 | 10000学生 | 响应时间<1秒 |
| 材料上传 | 20 | 10MB文件 | 上传成功率>99% |
---
## 📚 10. 部署说明
### 10.1 数据库升级脚本
1. 执行申请表结构调整脚本
2. 创建班级名额分配表
3. 创建名额使用记录表
4. 更新相关索引
### 10.2 配置项调整
```yaml
# application.yml
scholarship:
application:
# 材料上传配置
material:
max-file-size: 10MB
allowed-types: pdf,jpg,jpeg,png
upload-path: /data/scholarship/materials/
# 名额控制配置
quota:
check-enabled: true
auto-allocation: true
# 时间窗口配置
time-window:
strict-check: true
buffer-minutes: 30
```
---
## 📋 11. 总结
### 11.1 主要改进点
1. **申请模式优化**: 从学生自申请改为班主任代申请,提高管理效率
2. **名额控制增强**: 实现班级→学院两级名额管理,更精确的控制
3. **材料管理简化**: 班主任统一管理,降低学生操作复杂度
4. **时间窗口严格控制**: 确保申请在规定时间内进行
### 11.2 技术创新点
1. **层级名额算法**: 智能的班级→学院名额分配算法
2. **批量操作优化**: 高效的批量申请提交和撤回机制
3. **实时状态同步**: 名额使用情况实时更新
4. **操作日志完整**: 完整的操作追踪和审计功能
### 11.3 下一步计划
1. **Phase 1**: 完成核心申请管理功能开发
2. **Phase 2**: 增加申请条件自动过滤功能
3. **Phase 3**: 完善统计报表和数据导出
4. **Phase 4**: 优化用户体验和性能调优
---
**文档维护**: 本文档将随着需求变更和系统开发进展持续更新
**最后更新**: 2025-01-01
**文档版本**: v2.0
@@ -0,0 +1,138 @@
-- =====================================================
-- 奖学金管理模块 - 兼得关系增强数据增量升级脚本
-- 版本: v1.1-增量版
-- 创建时间: 2025-01-27
-- 说明: 只执行还未完成的增量更新部分
-- =====================================================
-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- =====================================================
-- 1. 检查并新增关系类型字典 (如果不存在)
-- =====================================================
-- 1.1 查找可用的dict_id
SET @next_dict_id = (SELECT MAX(dict_id) + 1 FROM sys_dict_type WHERE dict_id < 3000000000000000000);
-- 1.2 新增关系类型字典 (如果不存在)
INSERT IGNORE INTO `sys_dict_type` (`dict_id`, `dict_name`, `dict_type`, `create_by`, `create_time`, `remark`)
SELECT @next_dict_id, '兼得关系细分类型', 'jcbt_relation_type', 1, NOW(), '奖学金兼得关系的具体类型'
WHERE NOT EXISTS (SELECT 1 FROM `sys_dict_type` WHERE `dict_type` = 'jcbt_relation_type');
-- 1.3 新增关系类型字典数据 (如果不存在)
INSERT IGNORE INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
((SELECT MAX(dict_code) + 1 FROM sys_dict_data WHERE dict_code < 3000000000000000000), 1, '兼容', 'COMPATIBLE', 'jcbt_relation_type', '', 'success', 'N', 1, NOW(), '可以同时获得'),
((SELECT MAX(dict_code) + 2 FROM sys_dict_data WHERE dict_code < 3000000000000000000), 2, '互斥', 'EXCLUSIVE', 'jcbt_relation_type', '', 'danger', 'N', 1, NOW(), '不能同时获得'),
((SELECT MAX(dict_code) + 3 FROM sys_dict_data WHERE dict_code < 3000000000000000000), 3, '优先级', 'PRIORITY', 'jcbt_relation_type', '', 'warning', 'N', 1, NOW(), '有优先级关系');
-- =====================================================
-- 2. 更新现有奖学金类型的兼得类型为CUSTOM
-- =====================================================
-- 更新现有已设置兼得关系的奖学金类型
UPDATE `jcbt_scholarship_type`
SET `compatibility_type` = 'CUSTOM',
`update_time` = NOW(),
`update_by` = 1
WHERE `id` IN (1, 2, 3, 4, 5, 6, 7)
AND `deleted` = 0
AND `compatibility_type` != 'CUSTOM';
-- =====================================================
-- 3. 新增权限配置 (如果不存在)
-- =====================================================
-- 3.1 奖学金类型管理权限细化
INSERT IGNORE INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `remark`) VALUES
-- 奖学金类型管理按钮权限
(9000000000000001101, '奖学金类型查询', 9000000000000001001, 1, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:query', '#', 1, NOW(), ''),
(9000000000000001102, '奖学金类型新增', 9000000000000001001, 2, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:add', '#', 1, NOW(), ''),
(9000000000000001103, '奖学金类型修改', 9000000000000001001, 3, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:edit', '#', 1, NOW(), ''),
(9000000000000001104, '奖学金类型删除', 9000000000000001001, 4, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:remove', '#', 1, NOW(), ''),
(9000000000000001105, '奖学金类型导出', 9000000000000001001, 5, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:export', '#', 1, NOW(), ''),
(9000000000000001106, '兼得关系配置', 9000000000000001001, 6, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:compatibility', '#', 1, NOW(), '兼得关系配置权限');
-- =====================================================
-- 4. 示例数据:带自定义兼得关系的新奖学金类型 (如果不存在)
-- =====================================================
-- 4.1 新增一个示例专项奖学金 (如果不存在)
INSERT IGNORE INTO `jcbt_scholarship_type` (`id`, `type_code`, `type_name`, `type_category`, `level_type`, `award_amount`, `description`, `application_guide`, `compatibility_type`, `status`, `sort_order`, `is_system`, `tenant_id`, `create_by`, `create_time`) VALUES
(8, 'ZX_EXCELLENT', '卓越学子奖学金', 'SPECIAL', 'SPECIAL', 8000.00, '表彰在学业、创新、社会工作等方面全面发展的优秀学生', '需同时满足学业、创新、社会工作等多项要求', 'CUSTOM', 1, 1, 0, 1, 1, NOW());
-- 4.2 配置卓越学子奖学金的兼得关系(与所有其他奖学金互斥)- 使用动态ID
SET @scholarship_8_exists = (SELECT COUNT(*) FROM jcbt_scholarship_type WHERE id = 8);
SET @max_compatibility_id = (SELECT COALESCE(MAX(id), 0) FROM jcbt_scholarship_compatibility);
INSERT INTO `jcbt_scholarship_compatibility` (`id`, `type_id_1`, `type_id_2`, `relation_type`, `priority_level`, `description`, `tenant_id`, `create_by`, `create_time`)
SELECT
@max_compatibility_id + ROW_NUMBER() OVER (ORDER BY temp.type_id_2),
8,
temp.type_id_2,
'EXCLUSIVE',
0,
CONCAT('卓越学子奖学金与', temp.type_name, '互斥'),
1,
1,
NOW()
FROM (
SELECT 1 as type_id_2, '一等学业奖学金' as type_name
UNION ALL SELECT 2, '二等学业奖学金'
UNION ALL SELECT 3, '三等学业奖学金'
UNION ALL SELECT 4, '创新特等奖学金'
UNION ALL SELECT 5, '创新一等奖学金'
UNION ALL SELECT 6, '社会工作一等奖学金'
UNION ALL SELECT 7, '社会工作二等奖学金'
) temp
WHERE @scholarship_8_exists > 0
AND NOT EXISTS (
SELECT 1 FROM jcbt_scholarship_compatibility
WHERE type_id_1 = 8 AND type_id_2 = temp.type_id_2 AND deleted = 0
);
-- =====================================================
-- 5. 验证升级结果
-- =====================================================
-- 5.1 显示升级后的状态
SELECT '=== 升级完成!当前状态统计 ===' AS status;
SELECT
'兼得关系类型字典' AS item,
COUNT(*) AS count
FROM sys_dict_data
WHERE dict_type = 'jcbt_compatibility_type'
UNION ALL
SELECT
'关系细分类型字典' AS item,
COUNT(*) AS count
FROM sys_dict_data
WHERE dict_type = 'jcbt_relation_type'
UNION ALL
SELECT
'兼得关系记录' AS item,
COUNT(*) AS count
FROM jcbt_scholarship_compatibility
WHERE deleted = 0
UNION ALL
SELECT
'CUSTOM类型奖学金' AS item,
COUNT(*) AS count
FROM jcbt_scholarship_type
WHERE compatibility_type = 'CUSTOM' AND deleted = 0;
-- =====================================================
-- 结束
-- =====================================================
SET FOREIGN_KEY_CHECKS = 1;
SELECT '奖学金兼得关系增强功能增量升级完成!' AS result;
@@ -0,0 +1,107 @@
-- =====================================================
-- 奖学金管理模块 - 兼得关系增强数据安全升级脚本
-- 版本: v1.1-安全版
-- 创建时间: 2025-01-27
-- 说明: 避免MySQL子查询限制的安全版本
-- =====================================================
-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- =====================================================
-- 1. 新增关系类型字典 (如果不存在)
-- =====================================================
-- 1.1 新增关系类型字典主类型
INSERT IGNORE INTO `sys_dict_type` (`dict_id`, `dict_name`, `dict_type`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000000015, '兼得关系细分类型', 'jcbt_relation_type', 1, NOW(), '奖学金兼得关系的具体类型');
-- 1.2 新增关系类型字典数据
INSERT IGNORE INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000015001, 1, '兼容', 'COMPATIBLE', 'jcbt_relation_type', '', 'success', 'N', 1, NOW(), '可以同时获得'),
(2000000000000015002, 2, '互斥', 'EXCLUSIVE', 'jcbt_relation_type', '', 'danger', 'N', 1, NOW(), '不能同时获得'),
(2000000000000015003, 3, '优先级', 'PRIORITY', 'jcbt_relation_type', '', 'warning', 'N', 1, NOW(), '有优先级关系');
-- =====================================================
-- 2. 更新现有奖学金类型的兼得类型为CUSTOM
-- =====================================================
-- 更新现有已设置兼得关系的奖学金类型
UPDATE `jcbt_scholarship_type`
SET `compatibility_type` = 'CUSTOM',
`update_time` = NOW(),
`update_by` = 1
WHERE `id` IN (1, 2, 3, 4, 5, 6, 7)
AND `deleted` = 0
AND `compatibility_type` != 'CUSTOM';
-- =====================================================
-- 3. 新增权限配置 (如果不存在)
-- =====================================================
-- 3.1 奖学金类型管理权限细化
INSERT IGNORE INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `remark`) VALUES
(9000000000000001101, '奖学金类型查询', 9000000000000001001, 1, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:query', '#', 1, NOW(), ''),
(9000000000000001102, '奖学金类型新增', 9000000000000001001, 2, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:add', '#', 1, NOW(), ''),
(9000000000000001103, '奖学金类型修改', 9000000000000001001, 3, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:edit', '#', 1, NOW(), ''),
(9000000000000001104, '奖学金类型删除', 9000000000000001001, 4, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:remove', '#', 1, NOW(), ''),
(9000000000000001105, '奖学金类型导出', 9000000000000001001, 5, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:export', '#', 1, NOW(), ''),
(9000000000000001106, '兼得关系配置', 9000000000000001001, 6, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:compatibility', '#', 1, NOW(), '兼得关系配置权限');
-- =====================================================
-- 4. 示例数据:带自定义兼得关系的新奖学金类型 (如果不存在)
-- =====================================================
-- 4.1 新增一个示例专项奖学金 (如果不存在)
INSERT IGNORE INTO `jcbt_scholarship_type` (`id`, `type_code`, `type_name`, `type_category`, `level_type`, `award_amount`, `description`, `application_guide`, `compatibility_type`, `status`, `sort_order`, `is_system`, `tenant_id`, `create_by`, `create_time`) VALUES
(8, 'ZX_EXCELLENT', '卓越学子奖学金', 'SPECIAL', 'SPECIAL', 8000.00, '表彰在学业、创新、社会工作等方面全面发展的优秀学生', '需同时满足学业、创新、社会工作等多项要求', 'CUSTOM', 1, 1, 0, 1, 1, NOW());
-- 4.2 配置卓越学子奖学金的兼得关系(与所有其他奖学金互斥)
INSERT IGNORE INTO `jcbt_scholarship_compatibility` (`id`, `type_id_1`, `type_id_2`, `relation_type`, `priority_level`, `description`, `tenant_id`, `create_by`, `create_time`) VALUES
(15, 8, 1, 'EXCLUSIVE', 0, '卓越学子奖学金与一等学业奖学金互斥', 1, 1, NOW()),
(16, 8, 2, 'EXCLUSIVE', 0, '卓越学子奖学金与二等学业奖学金互斥', 1, 1, NOW()),
(17, 8, 3, 'EXCLUSIVE', 0, '卓越学子奖学金与三等学业奖学金互斥', 1, 1, NOW()),
(18, 8, 4, 'EXCLUSIVE', 0, '卓越学子奖学金与创新特等奖学金互斥', 1, 1, NOW()),
(19, 8, 5, 'EXCLUSIVE', 0, '卓越学子奖学金与创新一等奖学金互斥', 1, 1, NOW()),
(20, 8, 6, 'EXCLUSIVE', 0, '卓越学子奖学金与社会工作一等奖学金互斥', 1, 1, NOW()),
(21, 8, 7, 'EXCLUSIVE', 0, '卓越学子奖学金与社会工作二等奖学金互斥', 1, 1, NOW());
-- =====================================================
-- 5. 验证升级结果
-- =====================================================
-- 5.1 显示升级后的状态
SELECT '=== 升级完成!当前状态统计 ===' AS status;
SELECT
'兼得关系类型字典' AS item,
COUNT(*) AS count
FROM sys_dict_data
WHERE dict_type = 'jcbt_compatibility_type';
SELECT
'关系细分类型字典' AS item,
COUNT(*) AS count
FROM sys_dict_data
WHERE dict_type = 'jcbt_relation_type';
SELECT
'兼得关系记录' AS item,
COUNT(*) AS count
FROM jcbt_scholarship_compatibility
WHERE deleted = 0;
SELECT
'CUSTOM类型奖学金' AS item,
COUNT(*) AS count
FROM jcbt_scholarship_type
WHERE compatibility_type = 'CUSTOM' AND deleted = 0;
-- =====================================================
-- 结束
-- =====================================================
SET FOREIGN_KEY_CHECKS = 1;
SELECT '奖学金兼得关系增强功能升级完成!' AS result;
@@ -0,0 +1,134 @@
-- =====================================================
-- 奖学金管理模块 - 兼得关系增强数据升级脚本
-- 版本: v1.1
-- 创建时间: 2025-01-27
-- 说明: 增强兼得关系配置功能,新增自定义配置选项
-- =====================================================
-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- =====================================================
-- 1. 新增兼得关系类型字典数据
-- =====================================================
-- 1.1 在现有兼得关系类型基础上新增CUSTOM选项
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000005004, 4, '自定义配置', 'CUSTOM', 'jcbt_compatibility_type', '', 'primary', 'N', 1, NOW(), '可自定义具体的兼得关系');
-- 1.2 新增关系类型字典 (用于关系表)
INSERT INTO `sys_dict_type` (`dict_id`, `dict_name`, `dict_type`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000000010, '兼得关系细分类型', 'jcbt_relation_type', 1, NOW(), '奖学金兼得关系的具体类型');
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000010001, 1, '兼容', 'COMPATIBLE', 'jcbt_relation_type', '', 'success', 'N', 1, NOW(), '可以同时获得'),
(2000000000000010002, 2, '互斥', 'EXCLUSIVE', 'jcbt_relation_type', '', 'danger', 'N', 1, NOW(), '不能同时获得'),
(2000000000000010003, 3, '优先级', 'PRIORITY', 'jcbt_relation_type', '', 'warning', 'N', 1, NOW(), '有优先级关系');
-- =====================================================
-- 2. 创建兼得关系表 (如果不存在)
-- =====================================================
CREATE TABLE IF NOT EXISTS `jcbt_scholarship_compatibility` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`type_id_1` BIGINT(20) NOT NULL COMMENT '奖学金类型1',
`type_id_2` BIGINT(20) NOT NULL COMMENT '奖学金类型2',
`relation_type` VARCHAR(20) NOT NULL COMMENT '关系类型:COMPATIBLE-兼容,EXCLUSIVE-互斥,PRIORITY-优先级关系',
`priority_level` INT DEFAULT 0 COMMENT '优先级(relation_type为PRIORITY时有效)',
`description` VARCHAR(500) DEFAULT NULL COMMENT '关系描述',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_types_tenant` (`type_id_1`, `type_id_2`, `tenant_id`, `deleted`),
INDEX `idx_type1_relation` (`type_id_1`, `relation_type`),
INDEX `idx_type2_relation` (`type_id_2`, `relation_type`),
INDEX `idx_tenant` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金兼得关系表';
-- =====================================================
-- 3. 更新现有奖学金类型的兼得类型为CUSTOM
-- =====================================================
-- 3.1 更新现有已设置兼得关系的奖学金类型
UPDATE `jcbt_scholarship_type`
SET `compatibility_type` = 'CUSTOM',
`update_time` = NOW(),
`update_by` = 1
WHERE `id` IN (1, 2, 3, 4, 5, 6, 7)
AND `deleted` = 0;
-- =====================================================
-- 4. 迁移现有兼得关系数据到关系表 (如果表中没有数据)
-- =====================================================
-- 4.1 检查关系表是否为空,如果为空则插入基础关系数据
INSERT INTO `jcbt_scholarship_compatibility` (`id`, `type_id_1`, `type_id_2`, `relation_type`, `priority_level`, `description`, `tenant_id`, `create_by`, `create_time`)
SELECT * FROM (
SELECT 1 as id, 1 as type_id_1, 2 as type_id_2, 'EXCLUSIVE' as relation_type, 0 as priority_level, '一等与二等学业奖学金互斥' as description, 1 as tenant_id, 1 as create_by, NOW() as create_time
UNION ALL
SELECT 2, 1, 3, 'EXCLUSIVE', 0, '一等与三等学业奖学金互斥', 1, 1, NOW()
UNION ALL
SELECT 3, 2, 3, 'EXCLUSIVE', 0, '二等与三等学业奖学金互斥', 1, 1, NOW()
UNION ALL
SELECT 4, 1, 4, 'COMPATIBLE', 0, '学业奖学金与创新奖学金可兼得', 1, 1, NOW()
UNION ALL
SELECT 5, 1, 6, 'COMPATIBLE', 0, '学业奖学金与社会工作奖学金可兼得', 1, 1, NOW()
UNION ALL
SELECT 6, 4, 6, 'COMPATIBLE', 0, '创新奖学金与社会工作奖学金可兼得', 1, 1, NOW()
UNION ALL
SELECT 7, 4, 5, 'PRIORITY', 1, '创新特等奖学金优先于一等奖学金', 1, 1, NOW()
) AS temp_data
WHERE NOT EXISTS (SELECT 1 FROM `jcbt_scholarship_compatibility` WHERE `deleted` = 0);
-- =====================================================
-- 5. 新增权限配置
-- =====================================================
-- 5.1 奖学金类型管理权限细化
INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `remark`) VALUES
-- 奖学金类型管理按钮权限
(9000000000000001101, '奖学金类型查询', 9000000000000001001, 1, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:query', '#', 1, NOW(), ''),
(9000000000000001102, '奖学金类型新增', 9000000000000001001, 2, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:add', '#', 1, NOW(), ''),
(9000000000000001103, '奖学金类型修改', 9000000000000001001, 3, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:edit', '#', 1, NOW(), ''),
(9000000000000001104, '奖学金类型删除', 9000000000000001001, 4, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:remove', '#', 1, NOW(), ''),
(9000000000000001105, '奖学金类型导出', 9000000000000001001, 5, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:export', '#', 1, NOW(), ''),
(9000000000000001106, '兼得关系配置', 9000000000000001001, 6, '', '', '', 1, 0, 'F', '0', '0', 'jcbt:scholarshipType:compatibility', '#', 1, NOW(), '兼得关系配置权限');
-- =====================================================
-- 6. 示例数据:带自定义兼得关系的新奖学金类型
-- =====================================================
-- 6.1 新增一个示例专项奖学金
INSERT INTO `jcbt_scholarship_type` (`id`, `type_code`, `type_name`, `type_category`, `level_type`, `award_amount`, `description`, `application_guide`, `compatibility_type`, `status`, `sort_order`, `is_system`, `tenant_id`, `create_by`, `create_time`) VALUES
(8, 'ZX_EXCELLENT', '卓越学子奖学金', 'SPECIAL', 'SPECIAL', 8000.00, '表彰在学业、创新、社会工作等方面全面发展的优秀学生', '需同时满足学业、创新、社会工作等多项要求', 'CUSTOM', 1, 1, 0, 1, 1, NOW());
-- 6.2 配置卓越学子奖学金的兼得关系(与所有其他奖学金互斥)
INSERT INTO `jcbt_scholarship_compatibility` (`id`, `type_id_1`, `type_id_2`, `relation_type`, `priority_level`, `description`, `tenant_id`, `create_by`, `create_time`) VALUES
(8, 8, 1, 'EXCLUSIVE', 0, '卓越学子奖学金与一等学业奖学金互斥', 1, 1, NOW()),
(9, 8, 2, 'EXCLUSIVE', 0, '卓越学子奖学金与二等学业奖学金互斥', 1, 1, NOW()),
(10, 8, 3, 'EXCLUSIVE', 0, '卓越学子奖学金与三等学业奖学金互斥', 1, 1, NOW()),
(11, 8, 4, 'EXCLUSIVE', 0, '卓越学子奖学金与创新特等奖学金互斥', 1, 1, NOW()),
(12, 8, 5, 'EXCLUSIVE', 0, '卓越学子奖学金与创新一等奖学金互斥', 1, 1, NOW()),
(13, 8, 6, 'EXCLUSIVE', 0, '卓越学子奖学金与社会工作一等奖学金互斥', 1, 1, NOW()),
(14, 8, 7, 'EXCLUSIVE', 0, '卓越学子奖学金与社会工作二等奖学金互斥', 1, 1, NOW());
-- =====================================================
-- 7. 操作日志记录
-- =====================================================
INSERT INTO `sys_oper_log` (`oper_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES
(9000000000000002001, '奖学金兼得关系增强', 1, '数据升级', 'POST', 1, 'admin', '系统部门', '/jcbt/compatibility/upgrade', '127.0.0.1', '内网IP', '升级兼得关系配置功能', '{"code":200,"msg":"升级成功"}', 0, NULL, NOW(), 0);
-- =====================================================
-- 结束
-- =====================================================
SET FOREIGN_KEY_CHECKS = 1;
-- 兼得关系增强数据升级完成
SELECT '奖学金兼得关系增强功能升级完成!新增CUSTOM自定义配置选项' AS result;
@@ -0,0 +1,212 @@
-- =====================================================
-- 奖学金管理模块 - 基础数据初始化脚本
-- 版本: v1.0
-- 创建时间: 2025-01-27
-- 说明: 包含字典数据、示例奖学金类型和基础规则配置
-- =====================================================
-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- =====================================================
-- 1. 系统字典数据
-- =====================================================
-- 1.1 奖学金类别字典
INSERT INTO `sys_dict_type` (`dict_id`, `dict_name`, `dict_type`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000000001, '奖学金类别', 'jcbt_scholarship_category', 1, NOW(), '奖学金类别分类'),
(2000000000000000002, '奖学金等级', 'jcbt_scholarship_level', 1, NOW(), '奖学金等级分类'),
(2000000000000000003, '申请状态', 'jcbt_application_status', 1, NOW(), '奖学金申请状态'),
(2000000000000000004, '批次状态', 'jcbt_batch_status', 1, NOW(), '评定批次状态'),
(2000000000000000005, '兼得关系类型', 'jcbt_compatibility_type', 1, NOW(), '奖学金兼得关系类型'),
(2000000000000000006, '规则类型', 'jcbt_rule_type', 1, NOW(), '评定规则类型'),
(2000000000000000007, '评定方法', 'jcbt_evaluation_method', 1, NOW(), '评定方法类型'),
(2000000000000000008, '审核结果', 'jcbt_review_result', 1, NOW(), '审核结果类型'),
(2000000000000000009, '附件类型', 'jcbt_attachment_type', 1, NOW(), '申请材料附件类型');
-- 1.2 奖学金类别数据
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000001001, 1, '学业奖学金', 'ACADEMIC', 'jcbt_scholarship_category', '', 'primary', 'N', 1, NOW(), '基于学业成绩的奖学金'),
(2000000000000001002, 2, '创新奖学金', 'INNOVATION', 'jcbt_scholarship_category', '', 'success', 'N', 1, NOW(), '基于创新能力的奖学金'),
(2000000000000001003, 3, '社会工作奖学金', 'SOCIAL', 'jcbt_scholarship_category', '', 'info', 'N', 1, NOW(), '基于社会工作的奖学金'),
(2000000000000001004, 4, '专项奖学金', 'SPECIAL', 'jcbt_scholarship_category', '', 'warning', 'N', 1, NOW(), '特定条件的专项奖学金');
-- 1.3 奖学金等级数据
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000002001, 1, '特等奖学金', 'SPECIAL', 'jcbt_scholarship_level', '', 'danger', 'N', 1, NOW(), '最高等级奖学金'),
(2000000000000002002, 2, '一等奖学金', 'FIRST', 'jcbt_scholarship_level', '', 'primary', 'N', 1, NOW(), '一等奖学金'),
(2000000000000002003, 3, '二等奖学金', 'SECOND', 'jcbt_scholarship_level', '', 'success', 'N', 1, NOW(), '二等奖学金'),
(2000000000000002004, 4, '三等奖学金', 'THIRD', 'jcbt_scholarship_level', '', 'info', 'N', 1, NOW(), '三等奖学金');
-- 1.4 申请状态数据
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000003001, 1, '待审核', 'PENDING', 'jcbt_application_status', '', 'warning', 'N', 1, NOW(), '申请待审核状态'),
(2000000000000003002, 2, '已通过', 'APPROVED', 'jcbt_application_status', '', 'success', 'N', 1, NOW(), '申请已通过'),
(2000000000000003003, 3, '已拒绝', 'REJECTED', 'jcbt_application_status', '', 'danger', 'N', 1, NOW(), '申请已拒绝'),
(2000000000000003004, 4, '已撤回', 'WITHDRAWN', 'jcbt_application_status', '', 'info', 'N', 1, NOW(), '申请已撤回');
-- 1.5 批次状态数据
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000004001, 1, '草稿', 'DRAFT', 'jcbt_batch_status', '', 'info', 'N', 1, NOW(), '批次草稿状态'),
(2000000000000004002, 2, '进行中', 'ACTIVE', 'jcbt_batch_status', '', 'primary', 'N', 1, NOW(), '批次进行中'),
(2000000000000004003, 3, '已完成', 'COMPLETED', 'jcbt_batch_status', '', 'success', 'N', 1, NOW(), '批次已完成'),
(2000000000000004004, 4, '已取消', 'CANCELLED', 'jcbt_batch_status', '', 'danger', 'N', 1, NOW(), '批次已取消');
-- 1.6 兼得关系类型数据
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000005001, 1, '兼容', 'COMPATIBLE', 'jcbt_compatibility_type', '', 'success', 'N', 1, NOW(), '可以同时获得'),
(2000000000000005002, 2, '互斥', 'EXCLUSIVE', 'jcbt_compatibility_type', '', 'danger', 'N', 1, NOW(), '不能同时获得'),
(2000000000000005003, 3, '优先级', 'PRIORITY', 'jcbt_compatibility_type', '', 'warning', 'N', 1, NOW(), '有优先级关系');
-- 1.7 规则类型数据
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000006001, 1, '自动评定', 'AUTO', 'jcbt_rule_type', '', 'primary', 'N', 1, NOW(), '系统自动评定'),
(2000000000000006002, 2, '手动申请', 'MANUAL', 'jcbt_rule_type', '', 'info', 'N', 1, NOW(), '学生手动申请'),
(2000000000000006003, 3, '混合模式', 'HYBRID', 'jcbt_rule_type', '', 'warning', 'N', 1, NOW(), '自动+手动混合');
-- 1.8 评定方法数据
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000007001, 1, '积分制', 'SCORE', 'jcbt_evaluation_method', '', 'primary', 'N', 1, NOW(), '按积分高低评定'),
(2000000000000007002, 2, '排名制', 'RANKING', 'jcbt_evaluation_method', '', 'success', 'N', 1, NOW(), '按排名先后评定'),
(2000000000000007003, 3, '阈值制', 'THRESHOLD', 'jcbt_evaluation_method', '', 'info', 'N', 1, NOW(), '达到阈值即可');
-- 1.9 审核结果数据
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000008001, 1, '通过', 'APPROVED', 'jcbt_review_result', '', 'success', 'N', 1, NOW(), '审核通过'),
(2000000000000008002, 2, '拒绝', 'REJECTED', 'jcbt_review_result', '', 'danger', 'N', 1, NOW(), '审核拒绝'),
(2000000000000008003, 3, '退回修改', 'RETURNED', 'jcbt_review_result', '', 'warning', 'N', 1, NOW(), '退回修改');
-- 1.10 附件类型数据
INSERT INTO `sys_dict_data` (`dict_code`, `dict_sort`, `dict_label`, `dict_value`, `dict_type`, `css_class`, `list_class`, `is_default`, `create_by`, `create_time`, `remark`) VALUES
(2000000000000009001, 1, '成绩单', 'TRANSCRIPT', 'jcbt_attachment_type', '', 'primary', 'N', 1, NOW(), '学业成绩单'),
(2000000000000009002, 2, '证书', 'CERTIFICATE', 'jcbt_attachment_type', '', 'success', 'N', 1, NOW(), '获奖证书'),
(2000000000000009003, 3, '证明材料', 'PROOF', 'jcbt_attachment_type', '', 'info', 'N', 1, NOW(), '相关证明材料'),
(2000000000000009004, 4, '其他', 'OTHER', 'jcbt_attachment_type', '', 'default', 'N', 1, NOW(), '其他材料');
-- =====================================================
-- 2. 基础奖学金类型数据
-- =====================================================
-- 2.1 学业奖学金类型
INSERT INTO `jcbt_scholarship_type` (`id`, `type_code`, `type_name`, `type_category`, `level_type`, `award_amount`, `description`, `application_guide`, `status`, `sort_order`, `is_system`, `tenant_id`, `create_by`, `create_time`) VALUES
(1, 'XY_FIRST', '一等学业奖学金', 'ACADEMIC', 'FIRST', 5000.00, '面向综合成绩排名前5%的优秀学生', '需提交成绩单、综合素质评价等材料', 1, 1, 1, 1, 1, NOW()),
(2, 'XY_SECOND', '二等学业奖学金', 'ACADEMIC', 'SECOND', 3000.00, '面向综合成绩排名前15%的优良学生', '需提交成绩单、综合素质评价等材料', 1, 2, 1, 1, 1, NOW()),
(3, 'XY_THIRD', '三等学业奖学金', 'ACADEMIC', 'THIRD', 1500.00, '面向综合成绩排名前30%的合格学生', '需提交成绩单、综合素质评价等材料', 1, 3, 1, 1, 1, NOW());
-- 2.2 创新奖学金类型
INSERT INTO `jcbt_scholarship_type` (`id`, `type_code`, `type_name`, `type_category`, `level_type`, `award_amount`, `description`, `application_guide`, `status`, `sort_order`, `is_system`, `tenant_id`, `create_by`, `create_time`) VALUES
(4, 'CX_SPECIAL', '创新创业特等奖学金', 'INNOVATION', 'SPECIAL', 10000.00, '在创新创业方面有突出表现的学生', '需提交创新创业项目材料、获奖证书等', 1, 1, 1, 1, 1, NOW()),
(5, 'CX_FIRST', '创新创业一等奖学金', 'INNOVATION', 'FIRST', 6000.00, '在创新创业方面表现优秀的学生', '需提交创新创业项目材料、获奖证书等', 1, 2, 1, 1, 1, NOW());
-- 2.3 社会工作奖学金类型
INSERT INTO `jcbt_scholarship_type` (`id`, `type_code`, `type_name`, `type_category`, `level_type`, `award_amount`, `description`, `application_guide`, `status`, `sort_order`, `is_system`, `tenant_id`, `create_by`, `create_time`) VALUES
(6, 'SH_FIRST', '社会工作一等奖学金', 'SOCIAL', 'FIRST', 4000.00, '在社会工作和志愿服务方面表现突出', '需提交社会工作证明、志愿服务记录等', 1, 1, 1, 1, 1, NOW()),
(7, 'SH_SECOND', '社会工作二等奖学金', 'SOCIAL', 'SECOND', 2500.00, '在社会工作和志愿服务方面表现良好', '需提交社会工作证明、志愿服务记录等', 1, 2, 1, 1, 1, NOW());
-- =====================================================
-- 3. 奖学金兼得关系配置
-- =====================================================
-- 3.1 学业奖学金内部互斥关系
INSERT INTO `jcbt_scholarship_compatibility` (`id`, `type_id_1`, `type_id_2`, `relation_type`, `priority_level`, `description`, `tenant_id`, `create_by`, `create_time`) VALUES
(1, 1, 2, 'EXCLUSIVE', 0, '一等与二等学业奖学金互斥', 1, 1, NOW()),
(2, 1, 3, 'EXCLUSIVE', 0, '一等与三等学业奖学金互斥', 1, 1, NOW()),
(3, 2, 3, 'EXCLUSIVE', 0, '二等与三等学业奖学金互斥', 1, 1, NOW());
-- 3.2 不同类别奖学金兼容关系
INSERT INTO `jcbt_scholarship_compatibility` (`id`, `type_id_1`, `type_id_2`, `relation_type`, `priority_level`, `description`, `tenant_id`, `create_by`, `create_time`) VALUES
(4, 1, 4, 'COMPATIBLE', 0, '学业奖学金与创新奖学金可兼得', 1, 1, NOW()),
(5, 1, 6, 'COMPATIBLE', 0, '学业奖学金与社会工作奖学金可兼得', 1, 1, NOW()),
(6, 4, 6, 'COMPATIBLE', 0, '创新奖学金与社会工作奖学金可兼得', 1, 1, NOW());
-- 3.3 创新奖学金内部优先级关系
INSERT INTO `jcbt_scholarship_compatibility` (`id`, `type_id_1`, `type_id_2`, `relation_type`, `priority_level`, `description`, `tenant_id`, `create_by`, `create_time`) VALUES
(7, 4, 5, 'PRIORITY', 1, '创新特等奖学金优先于一等奖学金', 1, 1, NOW());
-- =====================================================
-- 4. 基础评定规则配置
-- =====================================================
-- 4.1 一等学业奖学金评定规则
INSERT INTO `jcbt_scholarship_rule` (`id`, `rule_code`, `rule_name`, `scholarship_type_id`, `rule_type`, `evaluation_method`, `min_score`, `is_active`, `priority_level`, `description`, `tenant_id`, `create_by`, `create_time`) VALUES
(1, 'XY_FIRST_RULE', '一等学业奖学金评定规则', 1, 'AUTO', 'SCORE', 90.00, 1, 1, '自动评定一等学业奖学金的标准规则', 1, 1, NOW());
-- 4.2 一等学业奖学金规则条件
INSERT INTO `jcbt_scholarship_rule_condition` (`id`, `rule_id`, `condition_group`, `field_name`, `field_type`, `operator_type`, `condition_value`, `weight`, `is_required`, `error_message`, `sort_order`, `tenant_id`, `create_by`, `create_time`) VALUES
(1, 1, 'MAIN_GROUP', 'gpa', 'NUMBER', 'GTE', '3.7', 0.50, 1, 'GPA需≥3.7', 1, 1, 1, NOW()),
(2, 1, 'MAIN_GROUP', 'moral_score', 'NUMBER', 'GTE', '85', 0.30, 1, '德育分需≥85分', 2, 1, 1, NOW()),
(3, 1, 'MAIN_GROUP', 'credit_completed', 'NUMBER', 'GTE', '30', 0.10, 1, '已修学分需≥30', 3, 1, 1, NOW()),
(4, 1, 'MAIN_GROUP', 'disciplinary_action', 'BOOLEAN', 'EQ', 'false', 0.10, 1, '不能有违纪记录', 4, 1, 1, NOW());
-- 4.3 二等学业奖学金评定规则
INSERT INTO `jcbt_scholarship_rule` (`id`, `rule_code`, `rule_name`, `scholarship_type_id`, `rule_type`, `evaluation_method`, `min_score`, `is_active`, `priority_level`, `description`, `tenant_id`, `create_by`, `create_time`) VALUES
(2, 'XY_SECOND_RULE', '二等学业奖学金评定规则', 2, 'AUTO', 'SCORE', 80.00, 1, 2, '自动评定二等学业奖学金的标准规则', 1, 1, NOW());
-- 4.4 二等学业奖学金规则条件
INSERT INTO `jcbt_scholarship_rule_condition` (`id`, `rule_id`, `condition_group`, `field_name`, `field_type`, `operator_type`, `condition_value`, `weight`, `is_required`, `error_message`, `sort_order`, `tenant_id`, `create_by`, `create_time`) VALUES
(5, 2, 'MAIN_GROUP', 'gpa', 'NUMBER', 'GTE', '3.3', 0.50, 1, 'GPA需≥3.3', 1, 1, 1, NOW()),
(6, 2, 'MAIN_GROUP', 'moral_score', 'NUMBER', 'GTE', '80', 0.30, 1, '德育分需≥80分', 2, 1, 1, NOW()),
(7, 2, 'MAIN_GROUP', 'credit_completed', 'NUMBER', 'GTE', '30', 0.10, 1, '已修学分需≥30', 3, 1, 1, NOW()),
(8, 2, 'MAIN_GROUP', 'disciplinary_action', 'BOOLEAN', 'EQ', 'false', 0.10, 1, '不能有违纪记录', 4, 1, 1, NOW());
-- 4.5 创新奖学金评定规则
INSERT INTO `jcbt_scholarship_rule` (`id`, `rule_code`, `rule_name`, `scholarship_type_id`, `rule_type`, `evaluation_method`, `min_score`, `is_active`, `priority_level`, `description`, `tenant_id`, `create_by`, `create_time`) VALUES
(3, 'CX_SPECIAL_RULE', '创新创业特等奖学金评定规则', 4, 'MANUAL', 'THRESHOLD', 85.00, 1, 1, '创新创业特等奖学金手动申请评定规则', 1, 1, NOW());
-- 4.6 创新特等奖学金规则条件
INSERT INTO `jcbt_scholarship_rule_condition` (`id`, `rule_id`, `condition_group`, `field_name`, `field_type`, `operator_type`, `condition_value`, `weight`, `is_required`, `error_message`, `sort_order`, `tenant_id`, `create_by`, `create_time`) VALUES
(9, 3, 'ACADEMIC_GROUP', 'gpa', 'NUMBER', 'GTE', '3.0', 0.30, 1, 'GPA需≥3.0', 1, 1, 1, NOW()),
(10, 3, 'INNOVATION_GROUP', 'innovation_projects', 'NUMBER', 'GTE', '1', 0.40, 1, '需有创新项目≥1项', 2, 1, 1, NOW()),
(11, 3, 'INNOVATION_GROUP', 'competition_awards', 'NUMBER', 'GTE', '1', 0.30, 1, '需有竞赛获奖≥1项', 3, 1, 1, NOW());
-- =====================================================
-- 5. 示例评定批次
-- =====================================================
-- 5.1 创建2024-2025学年第一学期批次
INSERT INTO `jcbt_scholarship_batch` (`id`, `batch_code`, `batch_name`, `academic_year`, `semester`, `batch_type`, `start_time`, `end_time`, `apply_start_time`, `apply_end_time`, `review_start_time`, `review_end_time`, `status`, `description`, `tenant_id`, `create_by`, `create_time`) VALUES
(1, 'BATCH_2024_1', '2024-2025学年第一学期奖学金评定', '2024-2025', 1, 'REGULAR', '2024-09-01 00:00:00', '2024-12-31 23:59:59', '2024-10-01 00:00:00', '2024-10-31 23:59:59', '2024-11-01 00:00:00', '2024-11-30 23:59:59', 'ACTIVE', '2024-2025学年第一学期常规奖学金评定批次', 1, 1, NOW());
-- =====================================================
-- 6. 菜单权限配置
-- =====================================================
-- 6.1 奖学金管理主菜单
INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `remark`) VALUES
(9000000000000001000, '奖学金管理', 2000, 6, 'jcbt', NULL, NULL, 1, 0, 'M', '0', '0', NULL, 'money', 1, NOW(), '奖学金管理主菜单');
-- 6.2 奖学金管理子菜单
INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `remark`) VALUES
-- 奖项管理
(9000000000000001001, '奖项管理', 9000000000000001000, 1, 'type', 'jcbt/type/index', NULL, 1, 0, 'C', '0', '0', 'jcbt:type:list', 'education', 1, NOW(), '奖学金类型管理'),
-- 规则配置
(9000000000000001002, '规则配置', 9000000000000001000, 2, 'rule', 'jcbt/rule/index', NULL, 1, 0, 'C', '0', '0', 'jcbt:rule:list', 'tool', 1, NOW(), '评定规则配置'),
-- 批次管理
(9000000000000001003, '批次管理', 9000000000000001000, 3, 'batch', 'jcbt/batch/index', NULL, 1, 0, 'C', '0', '0', 'jcbt:batch:list', 'date-range', 1, NOW(), '评定批次管理'),
-- 名额分配
(9000000000000001004, '名额分配', 9000000000000001000, 4, 'quota', 'jcbt/quota/index', NULL, 1, 0, 'C', '0', '0', 'jcbt:quota:list', 'number', 1, NOW(), '名额分配管理'),
-- 申请管理
(9000000000000001005, '申请管理', 9000000000000001000, 5, 'application', 'jcbt/application/index', NULL, 1, 0, 'C', '0', '0', 'jcbt:application:list', 'form', 1, NOW(), '申请记录管理'),
-- 审核管理
(9000000000000001006, '审核管理', 9000000000000001000, 6, 'review', 'jcbt/review/index', NULL, 1, 0, 'C', '0', '0', 'jcbt:review:list', 'check', 1, NOW(), '审核记录管理'),
-- 获奖记录
(9000000000000001007, '获奖记录', 9000000000000001000, 7, 'award', 'jcbt/award/index', NULL, 1, 0, 'C', '0', '0', 'jcbt:award:list', 'trophy', 1, NOW(), '获奖记录管理'),
-- 统计报表
(9000000000000001008, '统计报表', 9000000000000001000, 8, 'statistics', 'jcbt/statistics/index', NULL, 1, 0, 'C', '0', '0', 'jcbt:statistics:list', 'chart', 1, NOW(), '统计报表查看');
-- =====================================================
-- 7. 操作日志
-- =====================================================
INSERT INTO `sys_oper_log` (`oper_id`, `title`, `business_type`, `method`, `request_method`, `operator_type`, `oper_name`, `dept_name`, `oper_url`, `oper_ip`, `oper_location`, `oper_param`, `json_result`, `status`, `error_msg`, `oper_time`, `cost_time`) VALUES
(9000000000000002000, '奖学金管理模块', 0, '数据初始化', 'POST', 1, 'admin', '系统部门', '/jcbt/init', '127.0.0.1', '内网IP', '初始化奖学金管理基础数据', '{"code":200,"msg":"初始化成功"}', 0, NULL, NOW(), 0);
-- =====================================================
-- 结束
-- =====================================================
SET FOREIGN_KEY_CHECKS = 1;
-- 基础数据初始化完成
SELECT '奖学金管理模块基础数据初始化完成!' AS result;
@@ -0,0 +1,366 @@
-- =====================================================
-- 奖学金管理模块 - 数据库建表脚本
-- 版本: v1.0
-- 创建时间: 2025-01-27
-- 说明: 遵循项目统一的数据库规范,支持多租户和逻辑删除
-- =====================================================
-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- =====================================================
-- 1. 奖学金类型管理表
-- =====================================================
-- 1.1 奖学金类型表
DROP TABLE IF EXISTS `jcbt_scholarship_type`;
CREATE TABLE `jcbt_scholarship_type` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`type_code` VARCHAR(50) NOT NULL COMMENT '奖学金类型编码',
`type_name` VARCHAR(100) NOT NULL COMMENT '奖学金名称',
`type_category` VARCHAR(20) NOT NULL COMMENT '奖学金类别:ACADEMIC-学业奖学金,INNOVATION-创新奖学金,SOCIAL-社会工作奖学金,SPECIAL-专项奖学金',
`level_type` VARCHAR(20) DEFAULT NULL COMMENT '等级类型:FIRST-一等,SECOND-二等,THIRD-三等,SPECIAL-特等',
`award_amount` DECIMAL(10,2) DEFAULT NULL COMMENT '奖励金额',
`description` TEXT DEFAULT NULL COMMENT '奖学金描述',
`application_guide` TEXT DEFAULT NULL COMMENT '申请指南',
`status` TINYINT(1) DEFAULT 1 COMMENT '状态:0-禁用,1-启用',
`sort_order` INT DEFAULT 0 COMMENT '排序号',
`is_system` TINYINT(1) DEFAULT 0 COMMENT '是否系统内置:0-否,1-是',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_type_code_tenant` (`type_code`, `tenant_id`, `deleted`),
INDEX `idx_category_status` (`type_category`, `status`),
INDEX `idx_tenant_status` (`tenant_id`, `status`, `deleted`),
INDEX `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金类型表';
-- 1.2 奖学金兼得关系表
DROP TABLE IF EXISTS `jcbt_scholarship_compatibility`;
CREATE TABLE `jcbt_scholarship_compatibility` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`type_id_1` BIGINT(20) NOT NULL COMMENT '奖学金类型1',
`type_id_2` BIGINT(20) NOT NULL COMMENT '奖学金类型2',
`relation_type` VARCHAR(20) NOT NULL COMMENT '关系类型:COMPATIBLE-兼容,EXCLUSIVE-互斥,PRIORITY-优先级关系',
`priority_level` INT DEFAULT 0 COMMENT '优先级(relation_type为PRIORITY时有效)',
`description` VARCHAR(500) DEFAULT NULL COMMENT '关系描述',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_types_tenant` (`type_id_1`, `type_id_2`, `tenant_id`, `deleted`),
INDEX `idx_type1_relation` (`type_id_1`, `relation_type`),
INDEX `idx_type2_relation` (`type_id_2`, `relation_type`),
INDEX `idx_tenant` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金兼得关系表';
-- =====================================================
-- 2. 灵活规则引擎表
-- =====================================================
-- 2.1 评定规则主表
DROP TABLE IF EXISTS `jcbt_scholarship_rule`;
CREATE TABLE `jcbt_scholarship_rule` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`rule_code` VARCHAR(50) NOT NULL COMMENT '规则编码',
`rule_name` VARCHAR(100) NOT NULL COMMENT '规则名称',
`scholarship_type_id` BIGINT(20) NOT NULL COMMENT '关联奖学金类型ID',
`rule_type` VARCHAR(20) NOT NULL COMMENT '规则类型:AUTO-自动评定,MANUAL-手动申请,HYBRID-混合模式',
`evaluation_method` VARCHAR(20) NOT NULL COMMENT '评定方法:SCORE-积分制,RANKING-排名制,THRESHOLD-阈值制',
`min_score` DECIMAL(8,2) DEFAULT NULL COMMENT '最低分数要求',
`is_active` TINYINT(1) DEFAULT 1 COMMENT '是否激活:0-否,1-是',
`priority_level` INT DEFAULT 0 COMMENT '规则优先级',
`description` TEXT DEFAULT NULL COMMENT '规则描述',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_rule_code_tenant` (`rule_code`, `tenant_id`, `deleted`),
INDEX `idx_scholarship_type` (`scholarship_type_id`),
INDEX `idx_rule_type_active` (`rule_type`, `is_active`),
INDEX `idx_tenant_active` (`tenant_id`, `is_active`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金评定规则主表';
-- 2.2 规则条件表
DROP TABLE IF EXISTS `jcbt_scholarship_rule_condition`;
CREATE TABLE `jcbt_scholarship_rule_condition` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`rule_id` BIGINT(20) NOT NULL COMMENT '规则ID',
`condition_group` VARCHAR(50) NOT NULL COMMENT '条件组标识(同组内为AND关系,不同组为OR关系)',
`field_name` VARCHAR(100) NOT NULL COMMENT '字段名称',
`field_type` VARCHAR(20) NOT NULL COMMENT '字段类型:NUMBER-数字,STRING-字符串,DATE-日期,BOOLEAN-布尔',
`operator_type` VARCHAR(20) NOT NULL COMMENT '操作符:EQ-等于,GT-大于,GTE-大于等于,LT-小于,LTE-小于等于,IN-包含,NOT_IN-不包含,LIKE-模糊匹配,BETWEEN-区间',
`condition_value` TEXT NOT NULL COMMENT '条件值(JSON格式存储复杂数据)',
`weight` DECIMAL(5,2) DEFAULT 1.00 COMMENT '权重',
`is_required` TINYINT(1) DEFAULT 1 COMMENT '是否必要条件:0-否,1-是',
`error_message` VARCHAR(200) DEFAULT NULL COMMENT '不满足条件时的提示信息',
`sort_order` INT DEFAULT 0 COMMENT '排序号',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
INDEX `idx_rule_group` (`rule_id`, `condition_group`),
INDEX `idx_field_operator` (`field_name`, `operator_type`),
INDEX `idx_tenant` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='规则条件表';
-- 2.3 规则动作表
DROP TABLE IF EXISTS `jcbt_scholarship_rule_action`;
CREATE TABLE `jcbt_scholarship_rule_action` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`rule_id` BIGINT(20) NOT NULL COMMENT '规则ID',
`action_type` VARCHAR(20) NOT NULL COMMENT '动作类型:CALCULATE-计算分数,NOTIFY-通知,LOG-记录日志,EXECUTE-执行方法',
`action_config` TEXT NOT NULL COMMENT '动作配置(JSON格式)',
`execution_order` INT DEFAULT 0 COMMENT '执行顺序',
`is_enabled` TINYINT(1) DEFAULT 1 COMMENT '是否启用:0-否,1-是',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
INDEX `idx_rule_order` (`rule_id`, `execution_order`),
INDEX `idx_action_type` (`action_type`),
INDEX `idx_tenant` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='规则动作表';
-- =====================================================
-- 3. 批次与名额管理表
-- =====================================================
-- 3.1 评定批次表
DROP TABLE IF EXISTS `jcbt_scholarship_batch`;
CREATE TABLE `jcbt_scholarship_batch` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`batch_code` VARCHAR(50) NOT NULL COMMENT '批次编码',
`batch_name` VARCHAR(100) NOT NULL COMMENT '批次名称',
`academic_year` VARCHAR(20) NOT NULL COMMENT '学年',
`semester` TINYINT(1) NOT NULL COMMENT '学期:1-第一学期,2-第二学期,3-全年',
`batch_type` VARCHAR(20) NOT NULL COMMENT '批次类型:REGULAR-常规批次,SPECIAL-专项批次,SUPPLEMENTARY-补充批次',
`start_time` DATETIME NOT NULL COMMENT '开始时间',
`end_time` DATETIME NOT NULL COMMENT '结束时间',
`apply_start_time` DATETIME DEFAULT NULL COMMENT '申请开始时间',
`apply_end_time` DATETIME DEFAULT NULL COMMENT '申请结束时间',
`review_start_time` DATETIME DEFAULT NULL COMMENT '审核开始时间',
`review_end_time` DATETIME DEFAULT NULL COMMENT '审核结束时间',
`status` VARCHAR(20) DEFAULT 'DRAFT' COMMENT '状态:DRAFT-草稿,ACTIVE-进行中,COMPLETED-已完成,CANCELLED-已取消',
`description` TEXT DEFAULT NULL COMMENT '批次描述',
`notice_content` TEXT DEFAULT NULL COMMENT '通知内容',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_batch_code_tenant` (`batch_code`, `tenant_id`, `deleted`),
INDEX `idx_academic_year` (`academic_year`, `semester`),
INDEX `idx_status_time` (`status`, `start_time`, `end_time`),
INDEX `idx_tenant_status` (`tenant_id`, `status`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评定批次表';
-- 3.2 名额分配表
DROP TABLE IF EXISTS `jcbt_scholarship_quota`;
CREATE TABLE `jcbt_scholarship_quota` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`batch_id` BIGINT(20) NOT NULL COMMENT '批次ID',
`scholarship_type_id` BIGINT(20) NOT NULL COMMENT '奖学金类型ID',
`allocation_level` VARCHAR(20) NOT NULL COMMENT '分配级别:UNIVERSITY-全校,COLLEGE-学院,MAJOR-专业,CLASS-班级',
`target_dept_id` BIGINT(20) DEFAULT NULL COMMENT '目标部门ID(学院/专业/班级)',
`total_quota` INT NOT NULL DEFAULT 0 COMMENT '总名额',
`used_quota` INT NOT NULL DEFAULT 0 COMMENT '已使用名额',
`reserved_quota` INT NOT NULL DEFAULT 0 COMMENT '预留名额',
`allocation_rule` TEXT DEFAULT NULL COMMENT '分配规则(JSON格式)',
`allocation_basis` VARCHAR(500) DEFAULT NULL COMMENT '分配依据说明',
`is_adjustable` TINYINT(1) DEFAULT 1 COMMENT '是否可调整:0-否,1-是',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_batch_type_dept` (`batch_id`, `scholarship_type_id`, `target_dept_id`, `deleted`),
INDEX `idx_batch_level` (`batch_id`, `allocation_level`),
INDEX `idx_dept_quota` (`target_dept_id`, `total_quota`),
INDEX `idx_tenant` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='名额分配表';
-- =====================================================
-- 4. 申请与审核管理表
-- =====================================================
-- 4.1 申请记录表
DROP TABLE IF EXISTS `jcbt_scholarship_application`;
CREATE TABLE `jcbt_scholarship_application` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`application_no` VARCHAR(50) NOT NULL COMMENT '申请编号',
`batch_id` BIGINT(20) NOT NULL COMMENT '批次ID',
`scholarship_type_id` BIGINT(20) NOT NULL COMMENT '奖学金类型ID',
`student_id` BIGINT(20) NOT NULL COMMENT '学生ID',
`student_no` VARCHAR(50) NOT NULL COMMENT '学号',
`student_name` VARCHAR(100) NOT NULL COMMENT '学生姓名',
`dept_id` BIGINT(20) NOT NULL COMMENT '所属部门ID',
`major_id` BIGINT(20) DEFAULT NULL COMMENT '专业ID',
`class_id` BIGINT(20) DEFAULT NULL COMMENT '班级ID',
`application_type` VARCHAR(20) NOT NULL COMMENT '申请类型:STUDENT-学生申请,AUTO-自动评定,DIRECT-直接指定',
`current_status` VARCHAR(20) DEFAULT 'PENDING' COMMENT '当前状态:PENDING-待审核,APPROVED-已通过,REJECTED-已拒绝,WITHDRAWN-已撤回',
`apply_reason` TEXT DEFAULT NULL COMMENT '申请理由',
`self_evaluation` TEXT DEFAULT NULL COMMENT '自我评价',
`calculated_score` DECIMAL(8,2) DEFAULT NULL COMMENT '系统计算分数',
`final_score` DECIMAL(8,2) DEFAULT NULL COMMENT '最终评定分数',
`ranking_in_dept` INT DEFAULT NULL COMMENT '在院系的排名',
`ranking_in_major` INT DEFAULT NULL COMMENT '在专业的排名',
`submit_time` DATETIME DEFAULT NULL COMMENT '提交时间',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_application_no` (`application_no`),
INDEX `idx_batch_type_student` (`batch_id`, `scholarship_type_id`, `student_id`),
INDEX `idx_student_status` (`student_id`, `current_status`),
INDEX `idx_dept_batch` (`dept_id`, `batch_id`),
INDEX `idx_status_score` (`current_status`, `final_score`),
INDEX `idx_tenant` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金申请记录表';
-- 4.2 申请材料表
DROP TABLE IF EXISTS `jcbt_scholarship_attachment`;
CREATE TABLE `jcbt_scholarship_attachment` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`application_id` BIGINT(20) NOT NULL COMMENT '申请ID',
`attachment_type` VARCHAR(20) NOT NULL COMMENT '附件类型:TRANSCRIPT-成绩单,CERTIFICATE-证书,PROOF-证明材料,OTHER-其他',
`file_name` VARCHAR(200) NOT NULL COMMENT '文件名称',
`file_path` VARCHAR(500) NOT NULL COMMENT '文件路径',
`file_size` BIGINT DEFAULT NULL COMMENT '文件大小(字节)',
`file_type` VARCHAR(50) DEFAULT NULL COMMENT '文件类型',
`upload_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
`is_required` TINYINT(1) DEFAULT 0 COMMENT '是否必需:0-否,1-是',
`description` VARCHAR(500) DEFAULT NULL COMMENT '附件描述',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
INDEX `idx_application_type` (`application_id`, `attachment_type`),
INDEX `idx_upload_time` (`upload_time`),
INDEX `idx_tenant` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='申请材料附件表';
-- 4.3 审核记录表
DROP TABLE IF EXISTS `jcbt_scholarship_review`;
CREATE TABLE `jcbt_scholarship_review` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`application_id` BIGINT(20) NOT NULL COMMENT '申请ID',
`review_level` VARCHAR(20) NOT NULL COMMENT '审核级别:DEPT-院系审核,UNIVERSITY-校级审核',
`reviewer_id` BIGINT(20) NOT NULL COMMENT '审核人ID',
`reviewer_name` VARCHAR(100) NOT NULL COMMENT '审核人姓名',
`review_result` VARCHAR(20) NOT NULL COMMENT '审核结果:APPROVED-通过,REJECTED-拒绝,RETURNED-退回修改',
`review_score` DECIMAL(8,2) DEFAULT NULL COMMENT '审核评分',
`review_opinion` TEXT DEFAULT NULL COMMENT '审核意见',
`review_time` DATETIME NOT NULL COMMENT '审核时间',
`next_reviewer_id` BIGINT(20) DEFAULT NULL COMMENT '下一审核人ID',
`is_final_review` TINYINT(1) DEFAULT 0 COMMENT '是否最终审核:0-否,1-是',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
INDEX `idx_application_level` (`application_id`, `review_level`),
INDEX `idx_reviewer_time` (`reviewer_id`, `review_time`),
INDEX `idx_result_time` (`review_result`, `review_time`),
INDEX `idx_tenant` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审核记录表';
-- =====================================================
-- 5. 获奖记录与统计表
-- =====================================================
-- 5.1 获奖记录表
DROP TABLE IF EXISTS `jcbt_scholarship_award`;
CREATE TABLE `jcbt_scholarship_award` (
`id` BIGINT(20) NOT NULL COMMENT '主键ID',
`award_no` VARCHAR(50) NOT NULL COMMENT '获奖编号',
`application_id` BIGINT(20) NOT NULL COMMENT '申请ID',
`batch_id` BIGINT(20) NOT NULL COMMENT '批次ID',
`scholarship_type_id` BIGINT(20) NOT NULL COMMENT '奖学金类型ID',
`student_id` BIGINT(20) NOT NULL COMMENT '学生ID',
`student_no` VARCHAR(50) NOT NULL COMMENT '学号',
`student_name` VARCHAR(100) NOT NULL COMMENT '学生姓名',
`dept_id` BIGINT(20) NOT NULL COMMENT '所属部门ID',
`award_amount` DECIMAL(10,2) NOT NULL COMMENT '奖励金额',
`award_level` VARCHAR(20) DEFAULT NULL COMMENT '获奖等级',
`final_score` DECIMAL(8,2) DEFAULT NULL COMMENT '最终得分',
`ranking_in_dept` INT DEFAULT NULL COMMENT '院系排名',
`award_date` DATE NOT NULL COMMENT '获奖日期',
`certificate_no` VARCHAR(100) DEFAULT NULL COMMENT '证书编号',
`is_published` TINYINT(1) DEFAULT 0 COMMENT '是否公示:0-否,1-是',
`publish_date` DATE DEFAULT NULL COMMENT '公示日期',
`is_paid` TINYINT(1) DEFAULT 0 COMMENT '是否已发放:0-否,1-是',
`pay_date` DATE DEFAULT NULL COMMENT '发放日期',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`tenant_id` BIGINT(20) NOT NULL COMMENT '租户ID',
`create_by` BIGINT(20) DEFAULT NULL COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` BIGINT(20) DEFAULT NULL COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_award_no` (`award_no`),
INDEX `idx_batch_type` (`batch_id`, `scholarship_type_id`),
INDEX `idx_student_award` (`student_id`, `award_date`),
INDEX `idx_dept_batch` (`dept_id`, `batch_id`),
INDEX `idx_publish_pay` (`is_published`, `is_paid`),
INDEX `idx_tenant` (`tenant_id`, `deleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金获奖记录表';
-- =====================================================
-- 6. 性能优化索引
-- =====================================================
-- 申请查询优化索引
CREATE INDEX `idx_app_batch_status_score` ON `jcbt_scholarship_application`
(`batch_id`, `current_status`, `final_score` DESC);
-- 获奖记录查询优化索引
CREATE INDEX `idx_award_student_date` ON `jcbt_scholarship_award`
(`student_id`, `award_date` DESC);
-- 规则条件查询优化索引
CREATE INDEX `idx_rule_condition_field` ON `jcbt_scholarship_rule_condition`
(`rule_id`, `field_name`, `operator_type`);
-- 名额统计查询优化索引
CREATE INDEX `idx_quota_batch_dept_usage` ON `jcbt_scholarship_quota`
(`batch_id`, `target_dept_id`, `used_quota`, `total_quota`);
-- =====================================================
-- 结束
-- =====================================================
SET FOREIGN_KEY_CHECKS = 1;
-- 建表脚本执行完成
SELECT '奖学金管理模块建表脚本执行完成!' AS result;
@@ -0,0 +1,581 @@
# 奖学金管理模块数据模型设计
**文档版本**: v1.0
**创建时间**: 2025-01-27
**创建人**: AI Assistant
**最后更新**: 2025-01-27
---
## 📋 1. 设计概述
### 1.1 设计原则
- **标准化**: 遵循项目统一的数据库规范
- **灵活性**: 规则引擎支持复杂业务规则配置
- **扩展性**: 支持新增奖学金类型和评定规则
- **性能优化**: 合理设计索引,支持高并发查询
- **数据安全**: 逻辑删除,多租户隔离
### 1.2 技术规范
- **主键**: 统一使用雪花ID (`bigint(20)`)
- **基础字段**: 所有表包含统一的基础字段
- **逻辑删除**: 使用 `deleted` 字段,禁止物理删除
- **多租户**: 包含 `tenant_id` 字段
- **字符编码**: UTF8MB4,支持emoji等特殊字符
---
## 🗃️ 2. 核心表结构设计
### 2.1 奖学金类型管理
#### 2.1.1 奖学金类型表 (jcbt_scholarship_type)
```sql
CREATE TABLE jcbt_scholarship_type (
id BIGINT(20) NOT NULL COMMENT '主键ID',
type_code VARCHAR(50) NOT NULL COMMENT '奖学金类型编码',
type_name VARCHAR(100) NOT NULL COMMENT '奖学金名称',
type_category VARCHAR(20) NOT NULL COMMENT '奖学金类别:ACADEMIC-学业奖学金,INNOVATION-创新奖学金,SOCIAL-社会工作奖学金,SPECIAL-专项奖学金',
level_type VARCHAR(20) DEFAULT NULL COMMENT '等级类型:FIRST-一等,SECOND-二等,THIRD-三等,SPECIAL-特等',
award_amount DECIMAL(10,2) DEFAULT NULL COMMENT '奖励金额',
description TEXT DEFAULT NULL COMMENT '奖学金描述',
application_guide TEXT DEFAULT NULL COMMENT '申请指南',
status TINYINT(1) DEFAULT 1 COMMENT '状态:0-禁用,1-启用',
sort_order INT DEFAULT 0 COMMENT '排序号',
is_system TINYINT(1) DEFAULT 0 COMMENT '是否系统内置:0-否,1-是',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
UNIQUE KEY uk_type_code_tenant (type_code, tenant_id, deleted),
INDEX idx_category_status (type_category, status),
INDEX idx_tenant_status (tenant_id, status, deleted),
INDEX idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金类型表';
```
#### 2.1.2 奖学金兼得关系表 (jcbt_scholarship_compatibility)
```sql
CREATE TABLE jcbt_scholarship_compatibility (
id BIGINT(20) NOT NULL COMMENT '主键ID',
type_id_1 BIGINT(20) NOT NULL COMMENT '奖学金类型1',
type_id_2 BIGINT(20) NOT NULL COMMENT '奖学金类型2',
relation_type VARCHAR(20) NOT NULL COMMENT '关系类型:COMPATIBLE-兼容,EXCLUSIVE-互斥,PRIORITY-优先级关系',
priority_level INT DEFAULT 0 COMMENT '优先级(relation_type为PRIORITY时有效)',
description VARCHAR(500) DEFAULT NULL COMMENT '关系描述',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
UNIQUE KEY uk_types_tenant (type_id_1, type_id_2, tenant_id, deleted),
INDEX idx_type1_relation (type_id_1, relation_type),
INDEX idx_type2_relation (type_id_2, relation_type),
INDEX idx_tenant (tenant_id, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金兼得关系表';
```
### 2.2 灵活规则引擎设计
#### 2.2.1 评定规则主表 (jcbt_scholarship_rule)
```sql
CREATE TABLE jcbt_scholarship_rule (
id BIGINT(20) NOT NULL COMMENT '主键ID',
rule_code VARCHAR(50) NOT NULL COMMENT '规则编码',
rule_name VARCHAR(100) NOT NULL COMMENT '规则名称',
scholarship_type_id BIGINT(20) NOT NULL COMMENT '关联奖学金类型ID',
rule_type VARCHAR(20) NOT NULL COMMENT '规则类型:AUTO-自动评定,MANUAL-手动申请,HYBRID-混合模式',
evaluation_method VARCHAR(20) NOT NULL COMMENT '评定方法:SCORE-积分制,RANKING-排名制,THRESHOLD-阈值制',
min_score DECIMAL(8,2) DEFAULT NULL COMMENT '最低分数要求',
is_active TINYINT(1) DEFAULT 1 COMMENT '是否激活:0-否,1-是',
priority_level INT DEFAULT 0 COMMENT '规则优先级',
description TEXT DEFAULT NULL COMMENT '规则描述',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
UNIQUE KEY uk_rule_code_tenant (rule_code, tenant_id, deleted),
INDEX idx_scholarship_type (scholarship_type_id),
INDEX idx_rule_type_active (rule_type, is_active),
INDEX idx_tenant_active (tenant_id, is_active, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金评定规则主表';
```
#### 2.2.2 规则条件表 (jcbt_scholarship_rule_condition)
```sql
CREATE TABLE jcbt_scholarship_rule_condition (
id BIGINT(20) NOT NULL COMMENT '主键ID',
rule_id BIGINT(20) NOT NULL COMMENT '规则ID',
condition_group VARCHAR(50) NOT NULL COMMENT '条件组标识(同组内为AND关系,不同组为OR关系)',
field_name VARCHAR(100) NOT NULL COMMENT '字段名称',
field_type VARCHAR(20) NOT NULL COMMENT '字段类型:NUMBER-数字,STRING-字符串,DATE-日期,BOOLEAN-布尔',
operator_type VARCHAR(20) NOT NULL COMMENT '操作符:EQ-等于,GT-大于,GTE-大于等于,LT-小于,LTE-小于等于,IN-包含,NOT_IN-不包含,LIKE-模糊匹配,BETWEEN-区间',
condition_value TEXT NOT NULL COMMENT '条件值(JSON格式存储复杂数据)',
weight DECIMAL(5,2) DEFAULT 1.00 COMMENT '权重',
is_required TINYINT(1) DEFAULT 1 COMMENT '是否必要条件:0-否,1-是',
error_message VARCHAR(200) DEFAULT NULL COMMENT '不满足条件时的提示信息',
sort_order INT DEFAULT 0 COMMENT '排序号',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
INDEX idx_rule_group (rule_id, condition_group),
INDEX idx_field_operator (field_name, operator_type),
INDEX idx_tenant (tenant_id, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='规则条件表';
```
#### 2.2.3 规则动作表 (jcbt_scholarship_rule_action)
```sql
CREATE TABLE jcbt_scholarship_rule_action (
id BIGINT(20) NOT NULL COMMENT '主键ID',
rule_id BIGINT(20) NOT NULL COMMENT '规则ID',
action_type VARCHAR(20) NOT NULL COMMENT '动作类型:CALCULATE-计算分数,NOTIFY-通知,LOG-记录日志,EXECUTE-执行方法',
action_config TEXT NOT NULL COMMENT '动作配置(JSON格式)',
execution_order INT DEFAULT 0 COMMENT '执行顺序',
is_enabled TINYINT(1) DEFAULT 1 COMMENT '是否启用:0-否,1-是',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
INDEX idx_rule_order (rule_id, execution_order),
INDEX idx_action_type (action_type),
INDEX idx_tenant (tenant_id, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='规则动作表';
```
### 2.3 批次与名额管理
#### 2.3.1 评定批次表 (jcbt_scholarship_batch)
```sql
CREATE TABLE jcbt_scholarship_batch (
id BIGINT(20) NOT NULL COMMENT '主键ID',
batch_code VARCHAR(50) NOT NULL COMMENT '批次编码',
batch_name VARCHAR(100) NOT NULL COMMENT '批次名称',
academic_year VARCHAR(20) NOT NULL COMMENT '学年',
semester TINYINT(1) NOT NULL COMMENT '学期:1-第一学期,2-第二学期,3-全年',
batch_type VARCHAR(20) NOT NULL COMMENT '批次类型:REGULAR-常规批次,SPECIAL-专项批次,SUPPLEMENTARY-补充批次',
start_time DATETIME NOT NULL COMMENT '开始时间',
end_time DATETIME NOT NULL COMMENT '结束时间',
apply_start_time DATETIME DEFAULT NULL COMMENT '申请开始时间',
apply_end_time DATETIME DEFAULT NULL COMMENT '申请结束时间',
review_start_time DATETIME DEFAULT NULL COMMENT '审核开始时间',
review_end_time DATETIME DEFAULT NULL COMMENT '审核结束时间',
status VARCHAR(20) DEFAULT 'DRAFT' COMMENT '状态:DRAFT-草稿,ACTIVE-进行中,COMPLETED-已完成,CANCELLED-已取消',
description TEXT DEFAULT NULL COMMENT '批次描述',
notice_content TEXT DEFAULT NULL COMMENT '通知内容',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
UNIQUE KEY uk_batch_code_tenant (batch_code, tenant_id, deleted),
INDEX idx_academic_year (academic_year, semester),
INDEX idx_status_time (status, start_time, end_time),
INDEX idx_tenant_status (tenant_id, status, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评定批次表';
```
#### 2.3.2 名额分配表 (jcbt_scholarship_quota)
```sql
CREATE TABLE jcbt_scholarship_quota (
id BIGINT(20) NOT NULL COMMENT '主键ID',
batch_id BIGINT(20) NOT NULL COMMENT '批次ID',
scholarship_type_id BIGINT(20) NOT NULL COMMENT '奖学金类型ID',
allocation_level VARCHAR(20) NOT NULL COMMENT '分配级别:UNIVERSITY-全校,COLLEGE-学院,MAJOR-专业,CLASS-班级',
target_dept_id BIGINT(20) DEFAULT NULL COMMENT '目标部门ID(学院/专业/班级)',
total_quota INT NOT NULL DEFAULT 0 COMMENT '总名额',
used_quota INT NOT NULL DEFAULT 0 COMMENT '已使用名额',
reserved_quota INT NOT NULL DEFAULT 0 COMMENT '预留名额',
allocation_rule TEXT DEFAULT NULL COMMENT '分配规则(JSON格式)',
allocation_basis VARCHAR(500) DEFAULT NULL COMMENT '分配依据说明',
is_adjustable TINYINT(1) DEFAULT 1 COMMENT '是否可调整:0-否,1-是',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
UNIQUE KEY uk_batch_type_dept (batch_id, scholarship_type_id, target_dept_id, deleted),
INDEX idx_batch_level (batch_id, allocation_level),
INDEX idx_dept_quota (target_dept_id, total_quota),
INDEX idx_tenant (tenant_id, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='名额分配表';
```
### 2.4 申请与审核管理
#### 2.4.1 申请记录表 (jcbt_scholarship_application)
```sql
CREATE TABLE jcbt_scholarship_application (
id BIGINT(20) NOT NULL COMMENT '主键ID',
application_no VARCHAR(50) NOT NULL COMMENT '申请编号',
batch_id BIGINT(20) NOT NULL COMMENT '批次ID',
scholarship_type_id BIGINT(20) NOT NULL COMMENT '奖学金类型ID',
student_id BIGINT(20) NOT NULL COMMENT '学生ID',
student_no VARCHAR(50) NOT NULL COMMENT '学号',
student_name VARCHAR(100) NOT NULL COMMENT '学生姓名',
dept_id BIGINT(20) NOT NULL COMMENT '所属部门ID',
major_id BIGINT(20) DEFAULT NULL COMMENT '专业ID',
class_id BIGINT(20) DEFAULT NULL COMMENT '班级ID',
application_type VARCHAR(20) NOT NULL COMMENT '申请类型:STUDENT-学生申请,AUTO-自动评定,DIRECT-直接指定',
current_status VARCHAR(20) DEFAULT 'PENDING' COMMENT '当前状态:PENDING-待审核,APPROVED-已通过,REJECTED-已拒绝,WITHDRAWN-已撤回',
apply_reason TEXT DEFAULT NULL COMMENT '申请理由',
self_evaluation TEXT DEFAULT NULL COMMENT '自我评价',
calculated_score DECIMAL(8,2) DEFAULT NULL COMMENT '系统计算分数',
final_score DECIMAL(8,2) DEFAULT NULL COMMENT '最终评定分数',
ranking_in_dept INT DEFAULT NULL COMMENT '在院系的排名',
ranking_in_major INT DEFAULT NULL COMMENT '在专业的排名',
submit_time DATETIME DEFAULT NULL COMMENT '提交时间',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
UNIQUE KEY uk_application_no (application_no),
INDEX idx_batch_type_student (batch_id, scholarship_type_id, student_id),
INDEX idx_student_status (student_id, current_status),
INDEX idx_dept_batch (dept_id, batch_id),
INDEX idx_status_score (current_status, final_score),
INDEX idx_tenant (tenant_id, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金申请记录表';
```
#### 2.4.2 申请材料表 (jcbt_scholarship_attachment)
```sql
CREATE TABLE jcbt_scholarship_attachment (
id BIGINT(20) NOT NULL COMMENT '主键ID',
application_id BIGINT(20) NOT NULL COMMENT '申请ID',
attachment_type VARCHAR(20) NOT NULL COMMENT '附件类型:TRANSCRIPT-成绩单,CERTIFICATE-证书,PROOF-证明材料,OTHER-其他',
file_name VARCHAR(200) NOT NULL COMMENT '文件名称',
file_path VARCHAR(500) NOT NULL COMMENT '文件路径',
file_size BIGINT DEFAULT NULL COMMENT '文件大小(字节)',
file_type VARCHAR(50) DEFAULT NULL COMMENT '文件类型',
upload_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '上传时间',
is_required TINYINT(1) DEFAULT 0 COMMENT '是否必需:0-否,1-是',
description VARCHAR(500) DEFAULT NULL COMMENT '附件描述',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
INDEX idx_application_type (application_id, attachment_type),
INDEX idx_upload_time (upload_time),
INDEX idx_tenant (tenant_id, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='申请材料附件表';
```
#### 2.4.3 审核记录表 (jcbt_scholarship_review)
```sql
CREATE TABLE jcbt_scholarship_review (
id BIGINT(20) NOT NULL COMMENT '主键ID',
application_id BIGINT(20) NOT NULL COMMENT '申请ID',
review_level VARCHAR(20) NOT NULL COMMENT '审核级别:DEPT-院系审核,UNIVERSITY-校级审核',
reviewer_id BIGINT(20) NOT NULL COMMENT '审核人ID',
reviewer_name VARCHAR(100) NOT NULL COMMENT '审核人姓名',
review_result VARCHAR(20) NOT NULL COMMENT '审核结果:APPROVED-通过,REJECTED-拒绝,RETURNED-退回修改',
review_score DECIMAL(8,2) DEFAULT NULL COMMENT '审核评分',
review_opinion TEXT DEFAULT NULL COMMENT '审核意见',
review_time DATETIME NOT NULL COMMENT '审核时间',
next_reviewer_id BIGINT(20) DEFAULT NULL COMMENT '下一审核人ID',
is_final_review TINYINT(1) DEFAULT 0 COMMENT '是否最终审核:0-否,1-是',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
INDEX idx_application_level (application_id, review_level),
INDEX idx_reviewer_time (reviewer_id, review_time),
INDEX idx_result_time (review_result, review_time),
INDEX idx_tenant (tenant_id, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='审核记录表';
```
### 2.5 获奖记录与统计
#### 2.5.1 获奖记录表 (jcbt_scholarship_award)
```sql
CREATE TABLE jcbt_scholarship_award (
id BIGINT(20) NOT NULL COMMENT '主键ID',
award_no VARCHAR(50) NOT NULL COMMENT '获奖编号',
application_id BIGINT(20) NOT NULL COMMENT '申请ID',
batch_id BIGINT(20) NOT NULL COMMENT '批次ID',
scholarship_type_id BIGINT(20) NOT NULL COMMENT '奖学金类型ID',
student_id BIGINT(20) NOT NULL COMMENT '学生ID',
student_no VARCHAR(50) NOT NULL COMMENT '学号',
student_name VARCHAR(100) NOT NULL COMMENT '学生姓名',
dept_id BIGINT(20) NOT NULL COMMENT '所属部门ID',
award_amount DECIMAL(10,2) NOT NULL COMMENT '奖励金额',
award_level VARCHAR(20) DEFAULT NULL COMMENT '获奖等级',
final_score DECIMAL(8,2) DEFAULT NULL COMMENT '最终得分',
ranking_in_dept INT DEFAULT NULL COMMENT '院系排名',
award_date DATE NOT NULL COMMENT '获奖日期',
certificate_no VARCHAR(100) DEFAULT NULL COMMENT '证书编号',
is_published TINYINT(1) DEFAULT 0 COMMENT '是否公示:0-否,1-是',
publish_date DATE DEFAULT NULL COMMENT '公示日期',
is_paid TINYINT(1) DEFAULT 0 COMMENT '是否已发放:0-否,1-是',
pay_date DATE DEFAULT NULL COMMENT '发放日期',
remark VARCHAR(500) DEFAULT NULL COMMENT '备注',
tenant_id BIGINT(20) NOT NULL COMMENT '租户ID',
create_by BIGINT(20) DEFAULT NULL COMMENT '创建者',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by BIGINT(20) DEFAULT NULL COMMENT '更新者',
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
deleted TINYINT(1) DEFAULT 0 COMMENT '删除标记:0-正常,1-删除',
PRIMARY KEY (id),
UNIQUE KEY uk_award_no (award_no),
INDEX idx_batch_type (batch_id, scholarship_type_id),
INDEX idx_student_award (student_id, award_date),
INDEX idx_dept_batch (dept_id, batch_id),
INDEX idx_publish_pay (is_published, is_paid),
INDEX idx_tenant (tenant_id, deleted)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='奖学金获奖记录表';
```
---
## 📊 3. 字典表设计
### 3.1 系统字典表 (sys_dict_data)
```sql
-- 奖学金相关字典数据
INSERT INTO sys_dict_data (dict_type, dict_label, dict_value, dict_sort, status, remark) VALUES
-- 奖学金类别
('jcbt_scholarship_category', '学业奖学金', 'ACADEMIC', 1, '0', '基于学业成绩的奖学金'),
('jcbt_scholarship_category', '创新奖学金', 'INNOVATION', 2, '0', '基于创新能力的奖学金'),
('jcbt_scholarship_category', '社会工作奖学金', 'SOCIAL', 3, '0', '基于社会工作的奖学金'),
('jcbt_scholarship_category', '专项奖学金', 'SPECIAL', 4, '0', '特定条件的专项奖学金'),
-- 奖学金等级
('jcbt_scholarship_level', '特等奖学金', 'SPECIAL', 1, '0', '最高等级奖学金'),
('jcbt_scholarship_level', '一等奖学金', 'FIRST', 2, '0', '一等奖学金'),
('jcbt_scholarship_level', '二等奖学金', 'SECOND', 3, '0', '二等奖学金'),
('jcbt_scholarship_level', '三等奖学金', 'THIRD', 4, '0', '三等奖学金'),
-- 申请状态
('jcbt_application_status', '待审核', 'PENDING', 1, '0', '申请待审核状态'),
('jcbt_application_status', '已通过', 'APPROVED', 2, '0', '申请已通过'),
('jcbt_application_status', '已拒绝', 'REJECTED', 3, '0', '申请已拒绝'),
('jcbt_application_status', '已撤回', 'WITHDRAWN', 4, '0', '申请已撤回'),
-- 批次状态
('jcbt_batch_status', '草稿', 'DRAFT', 1, '0', '批次草稿状态'),
('jcbt_batch_status', '进行中', 'ACTIVE', 2, '0', '批次进行中'),
('jcbt_batch_status', '已完成', 'COMPLETED', 3, '0', '批次已完成'),
('jcbt_batch_status', '已取消', 'CANCELLED', 4, '0', '批次已取消');
```
---
## 🔧 4. 规则引擎设计详解
### 4.1 规则配置灵活性设计
#### 4.1.1 条件配置示例
```json
{
"field_name": "gpa",
"field_type": "NUMBER",
"operator_type": "GTE",
"condition_value": "3.5",
"weight": 0.4,
"error_message": "学业成绩绩点需≥3.5"
}
{
"field_name": "moral_score",
"field_type": "NUMBER",
"operator_type": "BETWEEN",
"condition_value": "[80, 100]",
"weight": 0.3,
"error_message": "德育分需在80-100分之间"
}
{
"field_name": "disciplinary_records",
"field_type": "BOOLEAN",
"operator_type": "EQ",
"condition_value": "false",
"weight": 0.1,
"error_message": "不能有违纪记录"
}
```
#### 4.1.2 复杂规则组合
```json
{
"rule_id": 1,
"conditions": [
{
"condition_group": "GROUP_A",
"field_name": "gpa",
"operator_type": "GTE",
"condition_value": "3.5"
},
{
"condition_group": "GROUP_A",
"field_name": "credit_completed",
"operator_type": "GTE",
"condition_value": "120"
},
{
"condition_group": "GROUP_B",
"field_name": "competition_awards",
"operator_type": "GTE",
"condition_value": "1"
}
]
}
```
**逻辑关系**: (GROUP_A的所有条件) OR (GROUP_B的所有条件)
### 4.2 支持的字段类型与操作符
| 字段类型 | 支持的操作符 | 示例值 |
|---------|-------------|--------|
| NUMBER | EQ, GT, GTE, LT, LTE, BETWEEN | "3.5", "[80, 90]" |
| STRING | EQ, LIKE, IN, NOT_IN | "优秀", "['优秀','良好']" |
| DATE | EQ, GT, GTE, LT, LTE, BETWEEN | "2024-01-01", "['2024-01-01','2024-12-31']" |
| BOOLEAN | EQ | "true", "false" |
---
## 📋 5. 索引优化方案
### 5.1 核心查询索引
```sql
-- 奖学金申请查询优化
CREATE INDEX idx_app_batch_status_score ON jcbt_scholarship_application
(batch_id, current_status, final_score DESC);
-- 获奖记录查询优化
CREATE INDEX idx_award_student_date ON jcbt_scholarship_award
(student_id, award_date DESC);
-- 规则条件查询优化
CREATE INDEX idx_rule_condition_field ON jcbt_scholarship_rule_condition
(rule_id, field_name, operator_type);
-- 名额统计查询优化
CREATE INDEX idx_quota_batch_dept_usage ON jcbt_scholarship_quota
(batch_id, target_dept_id, used_quota, total_quota);
```
### 5.2 分区表设计(可选)
```sql
-- 对于数据量大的申请记录表,可考虑按批次分区
ALTER TABLE jcbt_scholarship_application
PARTITION BY RANGE (batch_id) (
PARTITION p2024_1 VALUES LESS THAN (202401),
PARTITION p2024_2 VALUES LESS THAN (202402),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
```
---
## 🎯 6. 数据初始化脚本
### 6.1 奖学金类型基础数据
```sql
-- 插入基础奖学金类型
INSERT INTO jcbt_scholarship_type (id, type_code, type_name, type_category, level_type, award_amount, description, status, tenant_id, create_by, create_time) VALUES
(1, 'ACADEMIC_FIRST', '一等学业奖学金', 'ACADEMIC', 'FIRST', 5000.00, '综合成绩排名前5%的学生', 1, 1, 1, NOW()),
(2, 'ACADEMIC_SECOND', '二等学业奖学金', 'ACADEMIC', 'SECOND', 3000.00, '综合成绩排名前15%的学生', 1, 1, 1, NOW()),
(3, 'ACADEMIC_THIRD', '三等学业奖学金', 'ACADEMIC', 'THIRD', 1500.00, '综合成绩排名前30%的学生', 1, 1, 1, NOW()),
(4, 'INNOVATION_SPECIAL', '创新创业特等奖学金', 'INNOVATION', 'SPECIAL', 10000.00, '在创新创业方面有突出表现', 1, 1, 1, NOW());
-- 插入兼得关系配置
INSERT INTO jcbt_scholarship_compatibility (id, type_id_1, type_id_2, relation_type, priority_level, tenant_id, create_by, create_time) VALUES
(1, 1, 2, 'EXCLUSIVE', 0, 1, 1, NOW()),
(2, 1, 3, 'EXCLUSIVE', 0, 1, 1, NOW()),
(3, 2, 3, 'EXCLUSIVE', 0, 1, 1, NOW()),
(4, 1, 4, 'COMPATIBLE', 0, 1, 1, NOW());
```
### 6.2 评定规则示例数据
```sql
-- 一等学业奖学金评定规则
INSERT INTO jcbt_scholarship_rule (id, rule_code, rule_name, scholarship_type_id, rule_type, evaluation_method, min_score, tenant_id, create_by, create_time) VALUES
(1, 'ACADEMIC_FIRST_RULE', '一等学业奖学金评定规则', 1, 'AUTO', 'SCORE', 90.00, 1, 1, NOW());
-- 规则条件配置
INSERT INTO jcbt_scholarship_rule_condition (id, rule_id, condition_group, field_name, field_type, operator_type, condition_value, weight, error_message, tenant_id, create_by, create_time) VALUES
(1, 1, 'GROUP_MAIN', 'gpa', 'NUMBER', 'GTE', '3.7', 0.50, 'GPA需≥3.7', 1, 1, NOW()),
(2, 1, 'GROUP_MAIN', 'moral_score', 'NUMBER', 'GTE', '85', 0.30, '德育分需≥85分', 1, 1, NOW()),
(3, 1, 'GROUP_MAIN', 'credit_completed', 'NUMBER', 'GTE', '30', 0.10, '已修学分需≥30', 1, 1, NOW()),
(4, 1, 'GROUP_MAIN', 'disciplinary_action', 'BOOLEAN', 'EQ', 'false', 0.10, '不能有违纪记录', 1, 1, NOW());
```
---
## ⚡ 7. 性能优化建议
### 7.1 查询优化
- **分页查询**: 使用LIMIT和OFFSET,避免深度分页
- **索引覆盖**: 设计覆盖索引减少回表查询
- **条件筛选**: 优先使用选择性高的条件
- **统计查询**: 使用Redis缓存统计结果
### 7.2 数据归档
```sql
-- 历史数据归档策略
CREATE TABLE jcbt_scholarship_application_archive LIKE jcbt_scholarship_application;
-- 定期归档3年前的数据
INSERT INTO jcbt_scholarship_application_archive
SELECT * FROM jcbt_scholarship_application
WHERE create_time < DATE_SUB(NOW(), INTERVAL 3 YEAR);
```
### 7.3 缓存策略
- **奖学金类型**: Redis缓存,TTL=24小时
- **评定规则**: Redis缓存,TTL=12小时
- **名额统计**: Redis缓存,TTL=30分钟
- **学生申请数**: Redis缓存,TTL=10分钟
---
## 📋 8. 扩展性考虑
### 8.1 字段扩展
- 所有表预留`ext_fields` JSON字段用于业务扩展
- 规则条件支持自定义字段类型
- 审核流程支持多级审核配置
### 8.2 多租户支持
- 所有表包含`tenant_id`字段
- 数据查询强制添加租户过滤条件
- 支持租户级别的配置隔离
### 8.3 国际化支持
- 字典数据支持多语言
- 错误提示信息支持国际化
- 日期时间支持时区配置
---
**设计说明**: 本数据模型设计充分考虑了奖学金管理的复杂业务场景,通过灵活的规则引擎设计支持各种评定条件,同时遵循项目的技术规范,确保系统的可扩展性和可维护性。
@@ -0,0 +1,573 @@
# 奖学金管理模块产品需求设计
**文档版本**: v1.0
**创建时间**: 2025-01-27
**创建人**: AI Assistant
**最后更新**: 2025-01-27
---
## 📋 1. 需求概述
### 1.1 业务背景
奖学金管理是高校学生工作的重要组成部分,涉及奖项设立、名额分配、学生申请、审核评定、结果公示等多个环节。传统的人工管理方式效率低下,容易出错,急需信息化系统支撑。
### 1.2 目标用户
- **学生处管理员**: 奖项设立、规则配置、全校统筹管理
- **二级学院管理员**: 名额分配、学生审核、结果上报
- **学生**: 在线申请、进度查询、结果查看
### 1.3 核心价值
- **提升效率**: 自动化评定,减少人工工作量
- **规范流程**: 标准化管理流程,减少人为错误
- **透明公正**: 全程留痕,公开透明
- **数据准确**: 系统化管理,数据准确可靠
---
## 🎯 2. 核心需求分析
### 2.1 用户原始需求拆解
| 序号 | 原始需求描述 | 核心功能点 | 涉及角色 |
| ---- | ------------------------------------------------ | ---------------- | -------------- |
| 1 | 支持自动评定规则设置,系统自动评定满足条件的学生 | 自动评定规则引擎 | 学生处管理员 |
| 2 | 维护各个奖种之间兼得关系的功能 | 奖种兼得关系配置 | 学生处管理员 |
| 3 | 奖学金评定批次管理功能 | 评定批次管理 | 学生处管理员 |
| 4 | 二级学院查看名额分配情况,按班级或专业二次分配 | 名额分配管理 | 二级学院管理员 |
| 5 | 学生查看奖学金种类,自动化条件校验,在线申请 | 学生申请系统 | 学生 |
| 6 | 学生处设立奖项,分配名额,设置负责人 | 奖项设立管理 | 学生处管理员 |
| 7 | 二级学院直接指定符合条件的学生名单 | 直接指定功能 | 二级学院管理员 |
| 8 | 学生在线申请,查看审核进度 | 申请进度跟踪 | 学生 |
| 9 | 二级学院审核学生申请 | 申请审核功能 | 二级学院管理员 |
| 10 | 支持将评定结果导出 | 数据导出功能 | 学生处管理员 |
### 2.2 业务流程分析
```mermaid
graph TD
A[学生处设立奖项] --> B[配置评定规则]
B --> C[分配名额给二级学院]
C --> D[二级学院二次分配]
D --> E{评定方式}
E -->|自动评定| F[系统自动筛选]
E -->|学生申请| G[学生在线申请]
E -->|直接指定| H[学院直接指定]
F --> I[二级学院审核]
G --> I
H --> I
I --> J[结果公示]
J --> K[数据导出]
```
---
## 🏗️ 3. 功能模块设计
### 3.1 系统架构
```mermaid
graph TB
subgraph "奖学金管理系统"
A[奖项管理模块<br/>scholarship-type]
B[规则引擎模块<br/>scholarship-rule]
C[批次管理模块<br/>scholarship-batch]
D[名额分配模块<br/>scholarship-quota]
E[申请管理模块<br/>scholarship-application]
F[审核管理模块<br/>scholarship-review]
G[数据导出模块<br/>scholarship-export]
H[统计报表模块<br/>scholarship-statistics]
end
subgraph "外部系统"
I[学生信息系统]
J[教务管理系统]
end
A --> B
B --> E
C --> D
D --> E
E --> F
F --> G
B --> I
B --> J
```
### 3.2 核心功能模块
#### 3.2.1 奖项管理模块 (scholarship-type)
**功能描述**: 奖学金种类的设立、维护和管理
**主要功能**:
- ✅ 奖项信息维护(奖项名称、等级、金额、条件等)
- ✅ 奖种兼得关系配置(互斥、兼容关系设置)
- ✅ 奖项状态管理(启用、停用、归档)
- ✅ 奖项模板管理(常用奖项模板)
**数据模型**:
```sql
-- 奖项基本信息表
scholarship_type (
id, name, level, amount, description,
status, create_time, update_time
)
-- 奖种兼得关系表
scholarship_compatibility (
id, type_id_1, type_id_2, relation_type,
create_time, update_time
)
```
#### 3.2.2 规则引擎模块 (scholarship-rule)
**功能描述**: 自动评定规则的配置和执行
**主要功能**:
- ✅ 评定条件配置(成绩、综合素质、特殊条件等)
- ✅ 规则优先级设置
- ✅ 自动评定执行
- ✅ 评定结果预览和确认
**规则配置示例**:
```json
{
"scholarship_type_id": 1,
"rules": [
{
"condition": "gpa >= 3.5",
"weight": 0.6
},
{
"condition": "moral_score >= 85",
"weight": 0.3
},
{
"condition": "no_disciplinary_action = true",
"weight": 0.1
}
],
"min_score": 80
}
```
#### 3.2.3 批次管理模块 (scholarship-batch)
**功能描述**: 评定批次的创建和管理
**主要功能**:
- ✅ 评定批次创建(学年、学期、批次名称)
- ✅ 批次状态管理(准备、进行中、已结束)
- ✅ 批次时间节点控制(申请开始/结束时间等)
- ✅ 批次数据统计
#### 3.2.4 名额分配模块 (scholarship-quota)
**功能描述**: 奖学金名额的分配和管理
**主要功能**:
- ✅ 总名额设置
- ✅ 按学院分配名额
- ✅ 学院内二次分配(按专业、班级)
- ✅ 名额使用情况统计
- ✅ 名额调整记录
#### 3.2.5 申请管理模块 (scholarship-application)
**功能描述**: 学生申请的提交和管理
**主要功能**:
- ✅ 学生在线申请
- ✅ 申请条件自动校验
- ✅ 申请材料上传
- ✅ 申请进度跟踪
- ✅ 申请记录查询
#### 3.2.6 审核管理模块 (scholarship-review)
**功能描述**: 申请的审核和评定
**主要功能**:
- ✅ 申请审核界面
- ✅ 批量审核操作
- ✅ 审核意见记录
- ✅ 审核结果统计
- ✅ 直接指定功能
#### 3.2.7 数据导出模块 (scholarship-export)
**功能描述**: 评定结果的导出和管理
**主要功能**:
- ✅ 获奖名单导出(Excel、PDF格式)
- ✅ 统计报表导出
- ✅ 申请数据导出
- ✅ 审核记录导出
- ✅ 自定义导出模板
---
## 👥 4. 用户角色与权限
### 4.1 角色定义
| 角色 | 权限范围 | 主要功能 |
| ------------------------ | ---------- | -------------------------------------- |
| **超级管理员** | 全系统 | 系统配置、用户管理、数据维护 |
| **学生处管理员** | 全校范围 | 奖项设立、规则配置、批次管理、名额分配 |
| **二级学院管理员** | 本学院范围 | 名额二次分配、学生审核、结果上报 |
| **学生** | 个人数据 | 在线申请、进度查询、结果查看 |
### 4.2 权限矩阵
| 功能模块 | 超级管理员 | 学生处管理员 | 二级学院管理员 | 学生 |
| -------- | ---------- | ------------ | -------------- | ---- |
| 奖项管理 | ✅ | ✅ | 🔍 | 🔍 |
| 规则配置 | ✅ | ✅ | 🔍 | ❌ |
| 批次管理 | ✅ | ✅ | 🔍 | 🔍 |
| 名额分配 | ✅ | ✅ | ✏️ | 🔍 |
| 申请管理 | ✅ | 🔍 | ✏️ | ✏️ |
| 审核管理 | ✅ | ✅ | ✏️ | 🔍 |
| 数据导出 | ✅ | ✅ | ✏️ | 🔍 |
**图例**: ✅全部权限 ✏️编辑权限 🔍查看权限 ❌无权限
---
## 🔧 5. 技术实现方案
### 5.1 技术架构
- **后端框架**: Spring Boot 3.4.6 + MyBatis-Plus
- **前端框架**: Vue 3 + Element Plus
- **数据库**: MySQL 8.0
- **缓存**: Redis
- **消息队列**: RabbitMQ(异步处理)
- **文件存储**: MinIO(申请材料)
### 5.2 核心技术点
#### 5.2.1 规则引擎实现
```java
@Component
public class ScholarshipRuleEngine {
public List<StudentVo> autoEvaluate(Long scholarshipTypeId, Long batchId) {
// 1. 获取评定规则
ScholarshipRule rule = ruleService.getByScholarshipType(scholarshipTypeId);
// 2. 获取候选学生
List<StudentVo> candidates = studentService.getCandidates(batchId);
// 3. 执行规则评定
return candidates.stream()
.filter(student -> evaluateStudent(student, rule))
.sorted((s1, s2) -> compareByRule(s1, s2, rule))
.collect(Collectors.toList());
}
}
```
#### 5.2.2 兼得关系检查
```java
@Service
public class CompatibilityService {
public boolean checkCompatibility(Long studentId, Long scholarshipTypeId) {
// 1. 获取学生已获得的奖学金
List<Long> existingTypes = getStudentScholarships(studentId);
// 2. 检查兼得关系
return existingTypes.stream()
.noneMatch(typeId -> isIncompatible(typeId, scholarshipTypeId));
}
}
```
### 5.3 数据库设计
#### 5.3.1 核心表结构
```sql
-- 奖学金类型表
CREATE TABLE scholarship_type (
id BIGINT PRIMARY KEY,
name VARCHAR(100) NOT NULL COMMENT '奖学金名称',
level VARCHAR(20) COMMENT '等级',
amount DECIMAL(10,2) COMMENT '金额',
description TEXT COMMENT '描述',
status TINYINT DEFAULT 1 COMMENT '状态',
tenant_id BIGINT COMMENT '租户ID',
create_by BIGINT COMMENT '创建人',
create_time DATETIME COMMENT '创建时间',
update_by BIGINT COMMENT '更新人',
update_time DATETIME COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '删除标记'
);
-- 评定批次表
CREATE TABLE scholarship_batch (
id BIGINT PRIMARY KEY,
name VARCHAR(100) NOT NULL COMMENT '批次名称',
academic_year VARCHAR(20) COMMENT '学年',
semester TINYINT COMMENT '学期',
start_time DATETIME COMMENT '开始时间',
end_time DATETIME COMMENT '结束时间',
status TINYINT DEFAULT 1 COMMENT '状态',
tenant_id BIGINT COMMENT '租户ID',
create_by BIGINT COMMENT '创建人',
create_time DATETIME COMMENT '创建时间',
update_by BIGINT COMMENT '更新人',
update_time DATETIME COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '删除标记'
);
-- 名额分配表
CREATE TABLE scholarship_quota (
id BIGINT PRIMARY KEY,
batch_id BIGINT NOT NULL COMMENT '批次ID',
scholarship_type_id BIGINT NOT NULL COMMENT '奖学金类型ID',
dept_id BIGINT COMMENT '部门ID',
major_id BIGINT COMMENT '专业ID',
class_id BIGINT COMMENT '班级ID',
total_quota INT COMMENT '总名额',
used_quota INT DEFAULT 0 COMMENT '已用名额',
tenant_id BIGINT COMMENT '租户ID',
create_by BIGINT COMMENT '创建人',
create_time DATETIME COMMENT '创建时间',
update_by BIGINT COMMENT '更新人',
update_time DATETIME COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '删除标记'
);
-- 申请记录表
CREATE TABLE scholarship_application (
id BIGINT PRIMARY KEY,
batch_id BIGINT NOT NULL COMMENT '批次ID',
scholarship_type_id BIGINT NOT NULL COMMENT '奖学金类型ID',
student_id BIGINT NOT NULL COMMENT '学生ID',
application_type TINYINT COMMENT '申请类型:1-学生申请,2-自动评定,3-直接指定',
status TINYINT DEFAULT 1 COMMENT '状态:1-待审核,2-通过,3-拒绝',
apply_reason TEXT COMMENT '申请理由',
review_opinion TEXT COMMENT '审核意见',
tenant_id BIGINT COMMENT '租户ID',
create_by BIGINT COMMENT '创建人',
create_time DATETIME COMMENT '创建时间',
update_by BIGINT COMMENT '更新人',
update_time DATETIME COMMENT '更新时间',
deleted TINYINT DEFAULT 0 COMMENT '删除标记'
);
```
---
## 📊 6. 业务流程设计
### 6.1 奖学金评定完整流程
```mermaid
sequenceDiagram
participant SP as 学生处管理员
participant CA as 二级学院管理员
participant S as 学生
participant SYS as 系统
SP->>SYS: 1. 创建评定批次
SP->>SYS: 2. 设置奖学金类型和规则
SP->>SYS: 3. 分配名额给各学院
CA->>SYS: 4. 学院内二次分配名额
alt 自动评定
SYS->>SYS: 5a. 执行自动评定规则
SYS->>CA: 5b. 推送评定结果
else 学生申请
S->>SYS: 5a. 在线提交申请
SYS->>S: 5b. 条件校验反馈
else 直接指定
CA->>SYS: 5a. 直接指定学生
end
CA->>SYS: 6. 审核申请/确认结果
SYS->>S: 7. 通知审核结果
SP->>SYS: 8. 生成获奖名单
SYS->>SP: 9. 导出评定结果
```
### 6.2 关键业务规则
#### 6.2.1 申请条件校验
- ✅ 学籍状态检查(在校、正常)
- ✅ 成绩要求检查(GPA、单科成绩)
- ✅ 综合素质检查(德育分、违纪记录)
- ✅ 兼得关系检查(已获奖项冲突)
- ✅ 申请时间检查(批次有效期内)
#### 6.2.2 名额分配规则
- ✅ 按学院学生数比例分配
- ✅ 支持手动调整分配比例
- ✅ 学院内可按专业/班级再分配
- ✅ 名额使用实时统计
#### 6.2.3 审核流程规则
- ✅ 二级学院初审
- ✅ 学生处终审(可选)
- ✅ 支持批量审核操作
- ✅ 审核意见必填
---
## 📈 7. 系统集成方案
### 7.1 学生信息系统集成
**集成目的**: 获取学生基本信息、学籍状态、成绩数据
**集成方式**:
- 数据库直连(推荐)
- API接口调用
- 数据文件导入
**数据同步**:
```java
@Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点同步
public void syncStudentData() {
// 1. 获取学生基本信息
List<StudentInfo> students = studentInfoService.getAllStudents();
// 2. 获取成绩数据
List<GradeInfo> grades = gradeService.getLatestGrades();
// 3. 更新本地数据
scholarshipStudentService.updateStudentData(students, grades);
}
```
---
## 🧪 8. 测试方案
### 8.1 功能测试
- ✅ 奖项管理功能测试
- ✅ 规则引擎准确性测试
- ✅ 申请流程完整性测试
- ✅ 审核功能正确性测试
- ✅ 权限控制有效性测试
### 8.2 性能测试
- ✅ 自动评定性能测试(1万学生数据)
- ✅ 并发申请压力测试(500并发)
- ✅ 大数据量查询性能测试
- ✅ 数据导出性能测试
### 8.3 安全测试
- ✅ 用户权限边界测试
- ✅ 数据访问安全测试
- ✅ SQL注入防护测试
- ✅ 敏感数据加密测试
---
## 📅 9. 实施计划
### 9.1 开发阶段规划
| 阶段 | 时间周期 | 主要任务 | 交付物 |
| ------------------ | -------- | --------------------- | ------------------ |
| **需求分析** | 1周 | 需求调研、原型设计 | 需求文档、原型图 |
| **系统设计** | 1周 | 架构设计、数据库设计 | 设计文档、建表脚本 |
| **核心开发** | 4周 | 后端API、前端页面开发 | 核心功能模块 |
| **集成测试** | 1周 | 系统集成、功能测试 | 测试报告 |
| **用户验收** | 1周 | 用户培训、验收测试 | 验收报告 |
| **上线部署** | 0.5周 | 生产环境部署 | 部署文档 |
### 9.2 里程碑节点
- **M1**: 完成需求分析和系统设计(第2周)
- **M2**: 完成核心功能开发(第6周)
- **M3**: 完成系统测试和集成(第7周)
- **M4**: 完成用户验收和上线部署(第8.5周)
---
## 📋 10. 风险评估与应对
### 10.1 技术风险
| 风险项 | 风险等级 | 影响 | 应对措施 |
| ---------------- | -------- | ------------ | ---------------------- |
| 规则引擎复杂度高 | 中 | 开发周期延长 | 采用成熟的规则引擎框架 |
| 系统集成难度大 | 中 | 数据同步异常 | 提前进行接口联调测试 |
| 性能要求高 | 低 | 用户体验差 | 优化查询SQL,使用缓存 |
### 10.2 业务风险
| 风险项 | 风险等级 | 影响 | 应对措施 |
| ---------------- | -------- | -------------- | ---------------------- |
| 业务规则变更频繁 | 高 | 系统维护成本高 | 设计灵活的配置化规则 |
| 用户接受度低 | 中 | 系统推广困难 | 加强用户培训和支持 |
| 数据安全要求高 | 高 | 合规风险 | 严格权限控制,数据加密 |
### 10.3 项目风险
| 风险项 | 风险等级 | 影响 | 应对措施 |
| ------------ | -------- | -------- | ------------------------------ |
| 需求理解偏差 | 中 | 返工重做 | 加强需求沟通确认 |
| 人员变动 | 低 | 进度延期 | 做好知识传承和文档 |
| 时间紧张 | 中 | 质量下降 | 合理安排进度,重点保证核心功能 |
---
## 📚 11. 附录
### 11.1 相关文档
- 《高校奖学金管理办法》
- 《学生信息系统接口文档》
- 《数据安全管理规定》
### 11.2 参考资料
- Spring Boot官方文档
- Vue.js开发指南
- MySQL性能优化手册
- 系统集成最佳实践
### 11.3 联系方式
- **产品经理**: 张经理 (zhang@university.edu.cn)
- **技术负责人**: 李工程师 (li@university.edu.cn)
- **测试负责人**: 王测试 (wang@university.edu.cn)
---
**文档状态**: ✅ 已完成
**审核状态**: 🔄 待审核
**版本控制**: Git管理,版本标签v1.0
---
*本文档为奖学金管理模块的产品需求设计,涵盖了从需求分析到实施计划的完整内容。后续将根据实际开发过程中的反馈进行持续更新和完善。*
@@ -0,0 +1,23 @@
需要支持对于满足自动评定规则的情况,设置好相关规则后, 系统对满足条件的学生可进行自动评定,并支持将评定结果导出。
需要支持为学校管理人员提供维护各个奖种之间兼得关系的功能,可根据学校具体奖学金兼得要求进行灵活的设置。
需要支持单独的奖学金评定批次管理功能,与每学年的评奖工作开展相对应;
需要支持二级学院负责人可查看本二级学院分配的奖种名额情况以及可按班级或专业进行二次分配。
需要支持学生在线查看当前学校开放的所有奖学金种类; 提供自动化条件校验的功能,不符合条件的学生无法在线申请相关奖种。申请提交后,学生可查看申请的处理进度。
需要支持学生处设立奖项功能。管理老师对评奖二级学院进行维护管理,可设置二级学院奖项评定负责人,可按奖项给二级学院分配获奖名额等。
需要支持根据学校分配的名额,二级学院可以直接指定符合奖学金申请条件的学生名单。
需要支持符合申请条件的学生可在线提交奖学金申请,并可查看审核处理的进度。
需要支持二级学院有审核权限的管理老师可对学生提交的申请进行审核。提供奖学金发放数据维护的功能,需要支持与校财务系统对接。
需要支持为学生处提供维护各个奖种之间兼得关系的功能,可根据学校具体助学金兼得要求进行灵活的设置;
需要支持为学生处提供维护所有助学金的公共评定条件的功能,可根据学校对于学生助学金申请的条件做统一的设置。"
需要提供单独的助学金评定批次管理功能,与每学年的评奖工作开展相对应;
需要支持学生在线查看当前学校开放的所有助学金种类,须提供自动化条件校验的功能,不符合条件的学生无法在线申请相关助学金。申请提交后,学生可查看申请的处理进度
需要支持在线维护有勤工助学用工需求的部门的信息,可指定学生处的业务负责人维护每个岗位的每月勤工助学款项的发放上限,为二级学院负责老师提供在线申报本单位的勤工助学岗位需求的功能,学生处的业务负责人对二级学院申报的勤工助学岗位进行审核和确认。
需要支持学生针对学校开放的岗位进行申请,学生申请时,受到岗位上设定的条件限制,学生申请后二级学院和学生处可在线进行审核,最终确定学生的上岗信息。二级学院和学生处也可自行终止或添加上岗的学生信息。
需要支持二级学院提供在线申报本部门当月各岗位的报酬发放预算的功能。
对二级学院申报的薪酬发放预算进行审核及调整,并导出审核通过的薪酬发放明细,支持与校财务系统对接,学生可查询个人的报酬发放情况。
需要支持学生在移动端查看开放申请的勤工助学岗位详细信息并进行申请。
需要支持在移动端查看已申请的岗位的申请进度。