This commit is contained in:
zlwu committed 2025-12-25 09:46:53 +08:00
1 parent 8c0a2d904c
commit a514c26f83
11 files changed
+8406 -120

No files matched your search

@@ -0,0 +1,774 @@
# 03-经济资助处理
## 📋 概述
本分文档详细说明学生退学、休学、毕业处理中的经济资助业务处理内容,包括奖学金申请、获奖记录、勤工俭学和贫困生认定的变更逻辑。
## 💰 经济资助处理
### 1. 奖学金申请处理
#### 📊 数据库表结构
**表名**: `jcbt_scholarship_application`
**主键**: `id` (bigint(20))
**核心关联字段**:
- `batch_id`: 批次ID
- `scholarship_type_id`: 奖学金类型ID
- `student_id`: 学生ID
- `student_no`: 学号
- `student_name`: 学生姓名
#### 🎯 核心业务字段
基于数据库表 `jcbt_scholarship_application` 的实际结构:
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `current_status` | varchar(20) | 当前状态 | PENDING |
| `application_type` | varchar(20) | 申请类型(TEACHER_RECOMMEND/AUTO/DIRECT) | - |
| `calculated_score` | decimal(8,2) | 系统计算分数 | NULL |
| `final_score` | decimal(8,2) | 最终评定分数 | NULL |
| `ranking_in_dept` | int(11) | 院系排名 | NULL |
| `ranking_in_major` | int(11) | 专业排名 | NULL |
| `submit_time` | datetime | 提交时间 | NULL |
| `applicant_type` | varchar(20) | 申请人类型(STUDENT/TEACHER) | TEACHER |
#### 🎯 申请状态字典
系统使用 `jcbt_status` 字典类型(奖学金申请状态),具体定义如下:
| 状态值 | 状态名称 | 说明 | 样式类 |
|--------|----------|------|--------|
| `PENDING` | 待审核 | 申请已提交,等待审核 | warning |
| `APPROVED` | 已通过 | 审核通过,获得奖学金资格 | success |
| `REJECTED` | 已拒绝 | 审核未通过 | danger |
| `WITHDRAWN` | 已撤回 | 申请人主动撤回或系统自动撤回 | info |
**关键字段说明** (基于实体类代码分析):
- `currentStatus`: 当前状态 (PENDING/APPROVED/REJECTED/WITHDRAWN)
- `applicationType`: 申请类型 (RECOMMEND-教师推荐,AUTO-自动评定,DIRECT-直接指定)
- `calculatedScore`: 系统计算分数
- `finalScore`: 最终评定分数
- `rankingInDept`: 院系排名
- `rankingInMajor`: 专业排名
- `submitTime`: 提交时间
#### 🔄 奖学金评选流程
##### 📋 完整评选流程
```
1. 奖学金批次发布 → 学生申请提交
2. 学院初审 → 系统评分计算
3. 学生处终审 → 排名确定
4. 获奖公示 → 证书生成
5. 资金发放 → 档案归档
6. 学生状态变更 → 相应流程调整
```
##### 💻 后端实现逻辑
**实体类**: `JcbtScholarshipApplication.java`
**控制器**: `JcbtScholarshipApplicationController.java`
**服务类**: `JcbtScholarshipApplicationServiceImpl.java`
```java
// 奖学金申请实体类关键字段
@Data
@TableName("jcbt_scholarship_application")
public class JcbtScholarshipApplication extends BaseEntity {
private Long batchId; // 批次ID
private Long scholarshipTypeId; // 奖学金类型ID
private Long studentId; // 学生ID
private String studentNo; // 学号
private String studentName; // 学生姓名
private String currentStatus; // 当前状态
private String applicationType; // 申请类型
private Double calculatedScore; // 系统计算分数
private Double finalScore; // 最终评定分数
private Integer rankingInDept; // 院系排名
private Integer rankingInMajor; // 专业排名
private Date submitTime; // 提交时间
}
```
##### 🎨 前端界面展示
**管理界面**: `jcbt/scholarship/application/index.vue`
**状态显示**: 使用字典标签显示申请状态
```vue
<!-- 申请状态列 -->
<el-table-column label="申请状态" align="center" prop="currentStatus" width="120">
<template #default="scope">
<dict-tag :options="jcbt_application_status" :value="scope.row.currentStatus" />
</template>
</el-table-column>
<!-- 评分页数列 -->
<el-table-column label="最终得分" align="center" prop="finalScore" width="100">
<template #default="scope">
<span v-if="scope.row.finalScore">{{ scope.row.finalScore }}</span>
<span v-else class="text-muted">-</span>
</template>
</el-table-column>
<!-- 排名列 -->
<el-table-column label="院系排名" align="center" prop="rankingInDept" width="100">
<template #default="scope">
<span v-if="scope.row.rankingInDept">第{{ scope.row.rankingInDept }}名</span>
<span v-else class="text-muted">-</span>
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的奖学金申请处理逻辑
- **休学**: `current_status = 'WITHDRAWN'`(撤回),保留重新申请可能
- **退学**: `current_status = 'REJECTED'`(拒绝),终止评选资格
- **毕业**: 保持 `APPROVED` 状态,保留获奖资格;其他状态设为 `WITHDRAWN`
#### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 更新奖学金申请状态
UPDATE jcbt_scholarship_application
SET current_status = CASE
WHEN @change_type = 'XIU_XUE' THEN 'WITHDRAWN' -- 休学:撤回,可重新申请
WHEN @change_type = 'TUI_XUE' THEN 'REJECTED' -- 退学:拒绝,终止评选资格
WHEN @change_type = 'BI_YE' THEN
CASE WHEN current_status = 'APPROVED' THEN 'APPROVED' -- 毕业:保持已通过状态
ELSE 'WITHDRAWN' -- 其他状态设为撤回
END
ELSE current_status
END,
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND current_status NOT IN ('REJECTED') -- 已拒绝的不重复处理
AND deleted = 0;
```
### 2. 奖学金获奖记录处理
#### 📊 数据库表结构
**表名**: `jcbt_scholarship_award`
**主键**: `id` (bigint(20))
**核心关联字段**:
- `application_id`: 申请ID
- `batch_id`: 批次ID
- `scholarship_type_id`: 奖学金类型ID
- `student_id`: 学生ID
- `student_no`: 学号
- `student_name`: 学生姓名
#### 🎯 核心业务字段
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `award_no` | varchar(50) | 获奖编号 | - |
| `award_amount` | decimal(10,2) | 奖励金额 | - |
| `award_level` | varchar(20) | 获奖等级 | NULL |
| `final_score` | decimal(8,2) | 最终得分 | NULL |
| `ranking_in_dept` | int(11) | 院系排名 | NULL |
| `award_date` | date | 获奖日期 | - |
| `certificate_no` | varchar(100) | 证书编号 | NULL |
| `is_published` | tinyint(1) | 是否公示 | 0 |
| `publish_date` | date | 公示日期 | NULL |
| `is_paid` | tinyint(1) | 是否已发放 | 0 |
| `pay_date` | date | 发放日期 | NULL |
#### 🔄 奖学金发放流程
##### 📋 完整发放流程
```
1. 申请审核通过 → 生成获奖记录 (jcbt_scholarship_award)
2. 获奖信息确认 → 分配获奖编号和证书编号
3. 公示期开始 → 更新公示状态 (is_published = 1)
4. 公示期结束 → 如无异议,准备发放
5. 资金拨付 → 更新发放状态 (is_paid = 1)
6. 学生状态变更 → 根据情况调整发放流程
```
##### 💻 后端实现逻辑
虽然没有找到对应的实体类,但从数据库表结构可以推断业务逻辑:
```java
// 奖学金获奖记录关键业务逻辑(推断)
public class ScholarshipAwardService {
// 证书生成
public void generateCertificate(Long awardId) {
// 生成证书编号
// 更新 certificate_no 字段
}
// 公示处理
public void publishAward(Long awardId, Date publishDate) {
// 更新 is_published = 1
// 设置 publish_date
}
// 资金发放
public void payAward(Long awardId, Date payDate) {
// 更新 is_paid = 1
// 设置 pay_date
}
}
```
##### 🎨 前端界面展示
**管理界面**: `jcbt/scholarship/award/index.vue`
**状态显示**: 公示和发放状态的展示
```vue
<!-- 公示状态列 -->
<el-table-column label="公示状态" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.isPublished" type="success">已公示</el-tag>
<el-tag v-else type="warning">未公示</el-tag>
</template>
</el-table-column>
<!-- 发放状态列 -->
<el-table-column label="发放状态" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.isPaid" type="success">已发放</el-tag>
<el-tag v-else type="info">未发放</el-tag>
</template>
</el-table-column>
<!-- 证书编号列 -->
<el-table-column label="证书编号" align="center" prop="certificateNo" width="150">
<template #default="scope">
<span v-if="scope.row.certificateNo">{{ scope.row.certificateNo }}</span>
<span v-else class="text-muted">待生成</span>
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的获奖记录处理逻辑
##### 📋 处理策略说明
- **休学**: 获奖记录保留,暂停发放流程,保留恢复发放的可能
- **退学**: 获奖记录保留作为档案,但取消发放资格,记录撤销原因
- **毕业**: 确保完成发放流程,确保证书和资金发放完整
##### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @student_no: 学生学号
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- @change_date: 状态变更日期 (默认为当前日期)
SET @change_date = COALESCE(@change_date, CURDATE());
-- 1. 休学处理:暂停发放流程,保留获奖记录
UPDATE jcbt_scholarship_award
SET remark = CONCAT(COALESCE(remark, ''), ' | 学生休学(', @change_date, '),获奖记录保留,发放流程暂停'),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND deleted = 0
AND @change_type = 'XIU_XUE';
-- 2. 退学处理:取消发放资格,保留获奖记录作为档案
UPDATE jcbt_scholarship_award
SET is_paid = CASE
WHEN is_paid = 0 THEN 0 -- 标记为不发放,保留记录作为档案
ELSE is_paid -- 已发放的不变
END,
pay_date = CASE
WHEN is_paid = 0 AND certificate_no IS NOT NULL THEN NULL -- 取消发放
ELSE pay_date
END,
remark = CONCAT(COALESCE(remark, ''), ' | 学生退学(', @change_date, '),取消发放资格,获奖记录作为档案保留'),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND deleted = 0
AND @change_type = 'TUI_XUE';
-- 3. 毕业处理:确保完成发放流程,归档获奖记录
UPDATE jcbt_scholarship_award
SET is_paid = CASE
WHEN is_paid = 0 AND certificate_no IS NOT NULL THEN 1 -- 确保证书发放
ELSE is_paid
END,
pay_date = CASE
WHEN is_paid = 0 AND certificate_no IS NOT NULL THEN @change_date -- 确保证书发放
ELSE pay_date
END,
remark = CONCAT(COALESCE(remark, ''), ' | 学生毕业(', @change_date, '),获奖记录正式归档'),
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND deleted = 0
AND @change_type = 'BI_YE';
-- 统计处理结果
SELECT
@change_type as change_type,
COUNT(CASE WHEN @change_type = 'XIU_XUE' THEN 1 END) as leave_records,
COUNT(CASE WHEN @change_type = 'TUI_XUE' THEN 1 END) as drop_records,
COUNT(CASE WHEN @change_type = 'BI_YE' THEN 1 END) as graduate_records,
COUNT(*) as total_processed,
CONCAT('学生', @student_no, '状态变更,奖学金获奖记录处理完成') as operation_note
FROM jcbt_scholarship_award
WHERE student_id = @student_id
AND deleted = 0
AND (
(@change_type = 'XIU_XUE' AND remark LIKE CONCAT('%学生休学(', @change_date, ')%'))
OR (@change_type = 'TUI_XUE' AND remark LIKE CONCAT('%学生退学(', @change_date, ')%'))
OR (@change_type = 'BI_YE' AND remark LIKE CONCAT('%学生毕业(', @change_date, ')%'))
);
```
### 3. 勤工俭学申请处理
#### 📊 数据库表结构
**表名**: `jcbt_work_study_application`
**主键**: `id` (bigint(20), 雪花ID)
**核心关联字段**:
- `position_id`: 岗位ID
- `student_id`: 学生ID
- `student_number`: 学号
- `college_id`: 学院ID
#### 🎯 核心业务字段
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `status` | varchar(20) | 申请状态 | DRAFT |
| `application_date` | datetime | 申请提交时间 | - |
| `college_review_status` | varchar(20) | 学院审核状态 | NULL |
| `college_review_time` | datetime | 学院审核时间 | NULL |
| `final_review_status` | varchar(20) | 学生处审核状态 | NULL |
| `final_review_time` | datetime | 学生处审核时间 | NULL |
| `work_start_date` | date | 工作开始时间 | NULL |
| `work_end_date` | date | 工作结束时间 | NULL |
| `planned_work_hours` | int(11) | 计划工作时长 | NULL |
#### 🎯 申请状态字典
勤工俭学申请状态基于数据库字段定义,包含两级审核状态:
| 状态值 | 状态名称 | 说明 | 样式类 |
|--------|----------|------|--------|
| `DRAFT` | 草稿 | 申请草稿,尚未提交 | info |
| `SUBMITTED` | 已提交 | 已提交,等待审核 | warning |
| `COLLEGE_REVIEWING` | 学院审核中 | 学院正在审核 | primary |
| `COLLEGE_PASSED` | 学院审核通过 | 学院审核通过 | success |
| `COLLEGE_REJECTED` | 学院审核拒绝 | 学院审核拒绝 | danger |
| `FINAL_REVIEWING` | 学生处审核中 | 学生处正在审核 | primary |
| `APPROVED` | 审核通过 | 最终审核通过 | success |
| `REJECTED` | 审核拒绝 | 最终审核拒绝 | danger |
| `WITHDRAWN` | 已撤回 | 申请人撤回 | info |
**审核状态字段说明**:
- `college_review_status`: 学院审核状态(APPROVED/REJECTED)
- `final_review_status`: 学生处审核状态(APPROVED/REJECTED)
#### 🔄 勤工俭学审核流程
##### 📋 完整审核流程
```
1. 学生申请提交 → 状态: SUBMITTED
2. 学院审核 → 状态: COLLEGE_REVIEWING → COLLEGE_PASSED/COLLEGE_REJECTED
3. 学生处终审 → 状态: FINAL_REVIEWING → APPROVED/REJECTED
4. 工作安排 → 设置工作时间 (work_start_date, work_end_date)
5. 学生状态变更 → 相应流程调整
```
##### 💻 后端实现逻辑
**实体类**: `JcbtWorkStudyApplication.java`
**控制器**: `JcbtWorkStudyApplicationController.java`
**服务类**: `JcbtWorkStudyApplicationServiceImpl.java`
```java
// 勤工俭学申请实体类关键字段
@Data
@TableName("jcbt_work_study_application")
public class JcbtWorkStudyApplication extends BaseEntity {
private Long positionId; // 岗位ID
private String positionName; // 岗位名称
private Long studentId; // 学生ID
private String studentName; // 学生姓名
private String studentNumber; // 学号
private String status; // 申请状态
private String collegeReviewStatus; // 学院审核状态
private String finalReviewStatus; // 学生处审核状态
private Date workStartDate; // 工作开始时间
private Date workEndDate; // 工作结束时间
private Integer plannedWorkHours; // 计划工作时长
}
```
##### 🎨 前端界面展示
**管理界面**: `jcbt/workStudy/application/index.vue`
**状态显示**: 两级审核状态的展示
```vue
<!-- 申请状态列 -->
<el-table-column label="申请状态" align="center" prop="status" width="120">
<template #default="scope">
<dict-tag :options="work_study_application_status" :value="scope.row.status" />
</template>
</el-table-column>
<!-- 学院审核状态列 -->
<el-table-column label="学院审核" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.collegeReviewStatus === 'APPROVED'" type="success">通过</el-tag>
<el-tag v-else-if="scope.row.collegeReviewStatus === 'REJECTED'" type="danger">拒绝</el-tag>
<el-tag v-else type="warning">审核中</el-tag>
</template>
</el-table-column>
<!-- 学生处审核状态列 -->
<el-table-column label="学生处审核" align="center" width="100">
<template #default="scope">
<el-tag v-if="scope.row.finalReviewStatus === 'APPROVED'" type="success">通过</el-tag>
<el-tag v-else-if="scope.row.finalReviewStatus === 'REJECTED'" type="danger">拒绝</el-tag>
<el-tag v-else type="warning">审核中</el-tag>
</template>
</el-table-column>
<!-- 工作时间列 -->
<el-table-column label="工作时间" align="center" width="200">
<template #default="scope">
<span v-if="scope.row.workStartDate && scope.row.workEndDate">
{{ parseTime(scope.row.workStartDate, '{y}-{m}-{d}') }} 至
{{ parseTime(scope.row.workEndDate, '{y}-{m}-{d}') }}
</span>
<span v-else class="text-muted">未安排</span>
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的勤工俭学申请处理逻辑
- **休学**: `status = 'WITHDRAWN'`(撤回),终止当前工作,保留重新申请可能
- **退学**: `status = 'REJECTED'`(拒绝),终止所有相关安排
- **毕业**: 保持 `APPROVED` 状态,其他状态设为 `WITHDRAWN`
#### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 更新勤工俭学申请状态
UPDATE jcbt_work_study_application
SET status = CASE
WHEN @change_type = 'XIU_XUE' THEN 'WITHDRAWN' -- 休学:撤回,可重新申请
WHEN @change_type = 'TUI_XUE' THEN 'REJECTED' -- 退学:拒绝,终止资格
WHEN @change_type = 'BI_YE' THEN
CASE WHEN status = 'APPROVED' THEN 'APPROVED' -- 毕业:保持已通过状态
ELSE 'WITHDRAWN' -- 其他状态设为撤回
END
ELSE status
END,
-- 更新审核状态
college_review_status = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') AND college_review_status IS NOT NULL THEN 'REJECTED'
ELSE college_review_status
END,
final_review_status = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') AND final_review_status IS NOT NULL THEN 'REJECTED'
ELSE final_review_status
END,
final_review_time = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') THEN NOW()
ELSE final_review_time
END,
final_reviewer_id = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') THEN @operator_id
ELSE final_reviewer_id
END,
final_reviewer_name = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') THEN '系统'
ELSE final_reviewer_name
END,
final_review_comment = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') THEN CONCAT('学生', @change_type, ',岗位申请自动终止')
ELSE final_review_comment
END,
-- 如果是进行中的工作,设置结束时间
work_end_date = CASE
WHEN @change_type IN ('XIU_XUE', 'TUI_XUE') AND status = 'APPROVED' THEN CURDATE()
ELSE work_end_date
END,
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND status NOT IN ('REJECTED', 'COLLEGE_REJECTED') -- 已拒绝的不重复处理
AND deleted = 0;
```
### 4. 贫困生认定申请处理
#### 📊 数据库表结构
**表名**: `jcbt_poverty_application`
**主键**: `id` (bigint(20))
**核心关联字段**:
- `student_id`: 学生ID
- `student_no`: 学号
- `college_id`: 学院ID
- `major_id`: 专业ID
- `class_id`: 班级ID
#### 🎯 核心业务字段
| 字段名 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `application_no` | varchar(32) | 申请编号 | - |
| `academic_year` | varchar(20) | 学年 | - |
| `term` | tinyint(1) | 学期 | - |
| `status` | varchar(20) | 申请状态 | DRAFT |
| `recognition_group` | varchar(20) | 认定群体 | - |
| `recognition_type_id` | bigint(20) | 认定类型ID | - |
| `submit_time` | datetime | 提交时间 | NULL |
| `audit_time` | datetime | 审核时间 | NULL |
#### 🎯 申请状态字典
贫困生认定申请状态基于数据库表定义:
| 状态值 | 状态名称 | 说明 | 样式类 |
|--------|----------|------|--------|
| `DRAFT` | 草稿 | 申请草稿,尚未提交 | info |
| `SUBMITTED` | 已提交 | 已提交,等待审核 | warning |
| `REVIEWING` | 审核中 | 正在审核中 | primary |
| `APPROVED` | 已通过 | 审核通过,获得贫困生资格 | success |
| `REJECTED` | 已拒绝 | 审核未通过 | danger |
| `WITHDRAWN` | 已撤回 | 申请人主动撤回 | info |
| `REVOKED` | 已撤销 | 资格被撤销 | danger |
**特殊状态说明**:
- `SUSPENDED`: 暂停状态(文档中提到但数据库中未定义,可能需要扩展)
- `COMPLETED`: 完成状态(毕业时的最终状态)
#### 🔄 贫困生认定流程
##### 📋 完整认定流程
```
1. 学生申请提交 → 状态: SUBMITTED
2. 班主任审核 → 学院评审小组审核
3. 学校认定委员会终审 → 状态: APPROVED/REJECTED
4. 资格确认 → 发放相关资助
5. 学生状态变更 → 根据情况调整认定资格
```
##### 💻 后端实现逻辑
**实体类**: `JcbtPovertyApplication.java`
**控制器**: `JcbtPovertyApplicationController.java`
**服务类**: `JcbtPovertyApplicationServiceImpl.java`
```java
// 贫困生认定申请实体类关键字段
@Data
@TableName("jcbt_poverty_application")
public class JcbtPovertyApplication extends BaseEntity {
private String applicationNo; // 申请编号
private String academicYear; // 学年
private Integer term; // 学期
private Long studentId; // 学生ID
private String studentNo; // 学号
private String studentName; // 学生姓名
private String status; // 申请状态
private String recognitionGroup; // 认定群体
private Long recognitionTypeId; // 认定类型ID
private Date submitTime; // 提交时间
private Date auditTime; // 审核时间
}
```
##### 🎨 前端界面展示
**管理界面**: `jcbt/poverty/application/index.vue`
**状态显示**: 认定状态的展示
```vue
<!-- 申请状态列 -->
<el-table-column label="申请状态" align="center" prop="status" width="120">
<template #default="scope">
<dict-tag :options="poverty_application_status" :value="scope.row.status" />
</template>
</el-table-column>
<!-- 认定群体列 -->
<el-table-column label="认定群体" align="center" prop="recognitionGroup" width="120">
<template #default="scope">
<span>{{ scope.row.recognitionGroup }}</span>
</template>
</el-table-column>
<!-- 认定类型列 -->
<el-table-column label="认定类型" align="center" prop="recognitionTypeName" width="150">
<template #default="scope">
<span>{{ scope.row.recognitionTypeName }}</span>
</template>
</el-table-column>
```
#### 🔄 学生状态变更时的贫困生认定处理逻辑
- **休学**: 认定记录保留,资格暂时维持(可根据业务需求调整为WITHDRAWN)
- **退学**: 认定资格撤销(REVOKED),终止贫困生资格
- **毕业**: 认定流程完成,记录保持APPROVED状态
#### 💾 SQL批量处理脚本
```sql
-- 参数说明:
-- @student_id: 学生ID
-- @change_type: 变更类型 (XIU_XUE-休学, TUI_XUE-退学, BI_YE-毕业)
-- @operator_id: 操作员ID
-- 更新贫困生认定状态
UPDATE jcbt_poverty_application
SET status = CASE
WHEN @change_type = 'XIU_XUE' THEN
CASE WHEN status = 'APPROVED' THEN 'APPROVED' -- 休学:保持认定资格
ELSE status
END
WHEN @change_type = 'TUI_XUE' THEN 'REVOKED' -- 退学:撤销认定
WHEN @change_type = 'BI_YE' THEN status -- 毕业:保持现有状态
ELSE status
END,
-- 更新审核信息(仅退学时更新)
audit_time = CASE
WHEN @change_type = 'TUI_XUE' THEN NOW()
ELSE audit_time
END,
auditor_id = CASE
WHEN @change_type = 'TUI_XUE' THEN @operator_id
ELSE auditor_id
END,
auditor_name = CASE
WHEN @change_type = 'TUI_XUE' THEN '系统'
ELSE auditor_name
END,
audit_opinion = CASE
WHEN @change_type = 'TUI_XUE' THEN '学生退学,贫困生认定撤销'
ELSE audit_opinion
END,
update_by = @operator_id,
update_time = NOW()
WHERE student_id = @student_id
AND status NOT IN ('REVOKED') -- 已撤销的不重复处理
AND deleted = 0;
```
## 🔗 经济资助业务关联处理
### 1. 业务数据一致性保证
#### 🛡️ 事务处理要求
```sql
-- 建议在学生状态变更的大事务中包含所有经济资助处理
START TRANSACTION;
-- 1. 更新学生学籍状态
UPDATE xg_student_msg SET student_status = ? WHERE id = ?;
-- 2. 处理奖学金申请
UPDATE jcbt_scholarship_application SET current_status = ? WHERE student_id = ?;
-- 3. 处理奖学金获奖记录
UPDATE jcbt_scholarship_award SET remark = CONCAT(remark, ?) WHERE student_id = ?;
-- 4. 处理勤工俭学申请
UPDATE jcbt_work_study_application SET status = ? WHERE student_id = ?;
-- 5. 处理贫困生认定
UPDATE jcbt_poverty_application SET status = ? WHERE student_id = ?;
COMMIT;
```
#### 📊 处理统计表
| 业务模块 | 涉及表数量 | 处理类型 | 重要程度 |
|----------|------------|----------|----------|
| 奖学金申请 | 1 (jcbt_scholarship_application) | 状态更新 | ⭐⭐⭐⭐ |
| 奖学金获奖 | 1 (jcbt_scholarship_award) | 发放调整 | ⭐⭐⭐⭐⭐ |
| 勤工俭学 | 1 (jcbt_work_study_application) | 审核终止 | ⭐⭐⭐⭐ |
| 贫困生认定 | 1 (jcbt_poverty_application) | 资格调整 | ⭐⭐⭐⭐ |
| **总计** | **4个表** | **状态更新+流程调整** | **⭐⭐⭐⭐⭐** |
### 2. 业务规则和约束
#### 📋 状态变更矩阵
| 当前状态 | 休学处理 | 退学处理 | 毕业处理 |
|----------|----------|----------|----------|
| 奖学金申请中 | 撤回(WITHDRAWN) | 拒绝(REJECTED) | 保持通过/撤回 |
| 奖学金已通过 | 记录保留 | 取消发放 | 确保证书发放 |
| 勤工俭学进行中 | 撤回(WITHDRAWN) | 拒绝(REJECTED) | 保持通过/撤回 |
| 贫困生已认定 | 保持认定资格 | 撤销(REVOKED) | 保持认定状态 |
#### ⚠️ 重要业务约束
- **资金安全**: 奖学金获奖记录涉及实际资金,不得随意删除
- **证书管理**: 已发放证书的记录必须保留发放状态
- **公示流程**: 已公示的奖学金变更可能需要重新公示
- **档案完整性**: 所有经济资助记录作为学生档案的重要组成部分
### 3. 监控和审计要求
#### 📊 数据完整性检查
```sql
-- 检查处理结果的完整性
SELECT
'奖学金申请' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN current_status IN ('WITHDRAWN', 'REJECTED', 'APPROVED') THEN 1 END) as processed_count
FROM jcbt_scholarship_application
WHERE student_id = @student_id AND deleted = 0
UNION ALL
SELECT
'奖学金获奖' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN remark LIKE '%学生%' THEN 1 END) as processed_count
FROM jcbt_scholarship_award
WHERE student_id = @student_id AND deleted = 0
UNION ALL
SELECT
'勤工俭学' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN status IN ('WITHDRAWN', 'REJECTED', 'APPROVED') THEN 1 END) as processed_count
FROM jcbt_work_study_application
WHERE student_id = @student_id AND deleted = 0
UNION ALL
SELECT
'贫困生认定' as module,
COUNT(*) as total_count,
COUNT(CASE WHEN status IN ('SUSPENDED', 'REVOKED', 'COMPLETED') THEN 1 END) as processed_count
FROM jcbt_poverty_application
WHERE student_id = @student_id AND deleted = 0;
```
#### 📝 审计日志记录
```sql
-- 记录经济资助处理的审计日志
INSERT INTO sys_oper_log (
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
) VALUES (
'经济资助业务处理', 'UPDATE', 'processEconomicSupport', 'PROCEDURE', 'MANAGE',
@operator_name, @dept_name, '/economic/support/process', @client_ip, @location,
CONCAT('学生ID:', @student_id, ',学号:', @student_no, ',变更类型:', @change_type),
@process_result_json, 0, NULL, NOW()
);
```
---
## 📅 更新记录
- **2025-12-XX**: 分文档创建,包含经济资助处理逻辑
- **2025-12-XX**: 基于代码分析完善技术实现细节和业务逻辑
- **后续更新**: 根据实际业务需求持续完善
---
*本分文档详细说明学生状态变更时的经济资助业务处理逻辑和技术实现,包括奖学金、勤工俭学和贫困生认定的完整处理方案。*