Files
wucaixing-backend/docs/TrainingProgressLogic.md
2026-05-13 16:14:53 +08:00

120 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 培训计划学员进度计算逻辑说明
本文档说明了在生成“在线教育培训月度统计表”时,学员完成培训进度的计算逻辑及相关数据库表关联关系。
## 1. 总体进度计算逻辑
学员的培训进度取决于 `hot_training_participant` 表中的状态。
### 1.1 已完成学员
如果学员在 `hot_training_participant` 表中的 `is_completed` 字段为 `1`(或 `complete_time` 不为空),则该学员的进度直接记为 **100%**
这意味着学员已经完成了所有的课程学习以及综合检测(如果有)。
### 1.2 未完成学员
如果学员尚未完成(`is_completed = 0`),则进度计算公式如下:
$$
\text{总进度} = \frac{\sum \text{各课程进度} + \text{综合检测进度}}{\text{课程数量} + 1}
$$
* **课程数量**:当前培训计划包含的课程总数(来自 `hot_training_course_config`)。
* **综合检测进度**:对于未完成学员,综合检测部分默认记为 **0%**
* **各课程进度**:见下文详细计算。
---
## 2. 单门课程进度计算逻辑
对于培训计划中的每一门课程,其进度计算取决于该课程是否包含**随堂练习**(题目)。
### 2.1 判断课程是否有随堂练习
1. 通过 `hot_training_course_config` 表找到对应的 `course_id`
2. 查询 `hot_course_resource` 表,条件为 `course_id``resource_type = 3`(题目)。
3. 如果存在记录,则认为该课程包含随堂练习;否则认为不包含。
### 2.2 课程进度计算公式
#### 情况 A无随堂练习
$$
\text{课程进度} = \text{视频播放进度}
$$
* **视频播放进度**:取 `hot_training_course_record` 表中该用户该课程的 `progress_rate`百分比值最大100
#### 情况 B有随堂练习
$$
\text{课程进度} = (\text{视频播放进度} \times 90\%) + (\text{随堂练习得分} \times 10\%)
$$
* **视频播放进度**:同上。
* **随堂练习得分**
* 检查 `hot_training_course_record` 表中的 `check_status` 字段。
* 如果 `check_status = 1`(已完成),则得分为 **100**
* 否则,得分为 **0**
---
## 3. 课程时长计算逻辑(分钟)
“教育培训内容”区域除展示课程名称外,同时展示每门课程的视频总时长(分钟)。
### 3.1 计算步骤
1. 通过 `hot_training_course_config` 获取当前培训计划的课程列表(按 `sort_no` 排序),得到每门课的 `course_id`
2. 查询 `hot_course_resource` 表中该 `course_id` 下的视频资源:
- 条件:`course_id = ? AND resource_type = 1`(视频)
- 得到视频资源 ID 列表:`resource_id`(对应 `hot_media_resource.id`
3. 查询 `hot_media_resource` 表,按资源 ID 集合汇总视频时长:
- 汇总字段:`SUM(duration_seconds)`
4. 将秒数转换为分钟并向上取整:
- `duration_min = ceil(duration_seconds / 60)`
### 3.2 展示规则
- 若课程无视频资源或汇总时长为空,则时长列显示空白。
- 否则显示 `X分钟`
---
## 4. 学习记录表 - 学习时长计算逻辑
在“学习记录表”中,会显示“学习分钟数/计划分钟数”。
### 4.1 计划分钟数
逻辑同第3节“课程时长计算逻辑”为该培训计划下所有课程视频时长的总和分钟向上取整
### 4.2 学习分钟数
`hot_training_course_record` 表中的 `learn_duration_min` 字段。
**注意**:尽管字段名为 `min`,但在实际业务中存储的是**秒**。
因此计算逻辑为:
1. 获取该用户在该培训计划下所有课程的学习记录。
2. 若同一课程有多条记录,取 `learn_duration_min` 最大值。
3. **对于每一门课程,将其学习时长与该课程的计划视频时长进行比较,取较小值(即学习时长不大于课程时长)。**
4. 累加所有课程的**处理后时长**(秒)。
5. 将总秒数除以 60 并向上取整,得到最终的学习分钟数。
---
## 5. 数据库表关联关系
以下是涉及的关键数据库表及其关联方式:
1. **hot_training (培训计划主表)**
* `id`: 培训计划ID
2. **hot_training_participant (培训参与人员表)**
* `training_id`: 关联 `hot_training.id`
* `user_id`: 学员ID
* `is_completed`: 是否完成培训 (1=是, 0=否)
* `complete_time`: 完成时间
3. **hot_training_course_config (培训课程配置表)**
* `training_id`: 关联 `hot_training.id`
* `course_id`: 关联 `hot_course.id` (实际课程ID)
* `id`: 培训课程配置ID (用于关联学习记录)
4. **hot_course_resource (课程资源关联表)**
* `course_id`: 关联 `hot_course.id`
* `resource_type`: 资源类型 (1=视频 2=音频 3=题目)
* 用于判断课程是否有随堂练习。
5. **hot_training_course_record (培训课程学习记录表)**