369 lines
11 KiB
Markdown
369 lines
11 KiB
Markdown
# 奖学金管理模块 - 数据模型设计总览
|
||
|
||
**模块名称**: 奖惩补贴系统 - 奖学金管理模块
|
||
**设计时间**: 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开发和前端页面实现。 |