# 培训计划学员进度计算逻辑说明

本文档说明了在生成“在线教育培训月度统计表”时，学员完成培训进度的计算逻辑及相关数据库表关联关系。

## 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 (培训课程学习记录表)**
