feat: 课评生成技能新增API出勤数据获取步骤
在写课评之前先调用公司API获取橙子老师的出勤数据, 使用API返回的teaching_date作为课评文件名日期,确保日期准确性。
This commit is contained in:
@@ -49,17 +49,97 @@ type: skill
|
||||
|
||||
### 工作流程
|
||||
```
|
||||
读取笔记 → 匹配课程计划 → 读取学生画像 → 润色生成 → 确认 → 保存
|
||||
获取API出勤数据 → 读取笔记 → 匹配课程计划 → 读取学生画像 → 润色生成 → 确认 → 保存
|
||||
```
|
||||
|
||||
### 0. 获取API出勤数据(必须第一步执行)
|
||||
|
||||
**⚠️ 这是强制步骤,必须在读取笔记之前执行!**
|
||||
|
||||
在开始处理任何课评之前,**必须先调用公司API获取橙子老师近期的出勤数据**,用于:
|
||||
1. 确认橙子老师实际带了哪些班级
|
||||
2. 获取每个班级的**真实授课日期**(`teaching_date`),用于课评文件名
|
||||
|
||||
**执行命令**(Python):
|
||||
```python
|
||||
import urllib.request
|
||||
import json
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
API_BASE_URL = "https://api.qonnwolf.com/api/v1"
|
||||
AUTHORIZATION = "Bearer <从.env文件读取>"
|
||||
|
||||
# 计算最近7天的日期范围
|
||||
end_date = datetime.now()
|
||||
start_date = end_date - timedelta(days=7)
|
||||
|
||||
# 查询橙子老师的出勤数据
|
||||
dates_to_query = []
|
||||
current = start_date
|
||||
while current <= end_date:
|
||||
dates_to_query.append(current.strftime('%Y-%m-%d'))
|
||||
current += timedelta(days=1)
|
||||
|
||||
results = []
|
||||
for date in dates_to_query:
|
||||
url = f"{API_BASE_URL}/reports/teaching-schedule?teaching_date={date}"
|
||||
req = urllib.request.Request(url)
|
||||
req.add_header('Authorization', AUTHORIZATION)
|
||||
try:
|
||||
with urllib.request.urlopen(req) as response:
|
||||
data = json.loads(response.read().decode('utf-8'))
|
||||
for item in data['data']['items']:
|
||||
teacher = item.get('teacher_name', '')
|
||||
if '橙子' in teacher or '程城' in teacher:
|
||||
results.append({
|
||||
'teaching_date': item['teaching_date'], # API返回的真实授课日期
|
||||
'class_name': item['class_name'],
|
||||
'time': item['teaching_time_period'],
|
||||
'lesson': item['lesson_name'],
|
||||
'student_count': item['student_count'],
|
||||
'attendance': item['attendance'],
|
||||
'students': item.get('student_names', [])
|
||||
})
|
||||
except Exception as e:
|
||||
print(f"查询 {date} 失败: {e}")
|
||||
|
||||
# 输出结果
|
||||
for r in results:
|
||||
print(f"日期:{r['teaching_date']} 班级:{r['class_name']} 时间:{r['time']} 课程:{r['lesson']}")
|
||||
```
|
||||
|
||||
**返回数据说明**:
|
||||
| 字段 | 说明 | 用途 |
|
||||
|------|------|------|
|
||||
| `teaching_date` | API返回的真实授课日期 | **必须用此日期作为课评文件名中的YYYYMMDD** |
|
||||
| `class_name` | 班级名称 | 用于确认班级目录名 |
|
||||
| `time` | 上课时间段 | 用于确认班级(如19:00-20:30对应晚上班) |
|
||||
| `lesson_name` | 课程名称 | 用于匹配课程计划 |
|
||||
| `student_count` | 学生数 | 用于确认班级人数 |
|
||||
| `attendance` | 出勤统计 | 到课/请假/缺课人数 |
|
||||
| `students` | 学生名单 | 用于确认学生 |
|
||||
|
||||
**日期规则(重要)**:
|
||||
- ✅ **必须使用API返回的 `teaching_date`** 作为课评文件名中的日期
|
||||
- ✅ 如果笔记中的日期与API返回的 `teaching_date` 不一致,**以API为准**
|
||||
- ✅ 文件名格式:`{API返回的teaching_date}_课程编号-课次.md`
|
||||
|
||||
**班级匹配规则**:
|
||||
根据API返回的 `class_name` 和 `time` 匹配笔记中的班级:
|
||||
| API返回的class_name | 对应班级目录 | 识别依据 |
|
||||
|---------------------|-------------|----------|
|
||||
| AICODE03... | AICODE03橙子周六1900 / AICODE03橙子周日0845 / AICODE03橙子周日1400 | class_name含"AICODE03" + time判断 |
|
||||
| CSP03... | CSP03橙子周六0830 / CSP03橙子周六1400 / CSP03橙子周日1030 | class_name含"CSP03" + time判断 |
|
||||
| KITTEN04... | K4橙子周五1900 / K4橙子周日1900 | class_name含"KITTEN04" + time判断 |
|
||||
|
||||
### 1. 读取笔记文件
|
||||
解析 `E:\cc\3笔记\第N课.md`:
|
||||
- 从文件名提取**课次**(如"第11课")
|
||||
- 从文件头提取**日期**(如"2026年05月14日")
|
||||
- 从**API获取的teaching_date**确定日期(不使用笔记文件头的日期)
|
||||
- 按班级区块解析,提取每个学生:
|
||||
- 姓名、出勤状况、课评描述(用户写的简短描述)
|
||||
|
||||
> **日期规则**:笔记批量流程中,所有日期(文件名 `YYYYMMDD`、授课日期)**统一以笔记文件头中的日期为准**,不另行查询课程计划中的上课时间。
|
||||
> **日期规则**:笔记批量流程中,所有日期(文件名 `YYYYMMDD`、授课日期)**统一以API返回的teaching_date为准**,不使用笔记文件头中的日期。
|
||||
|
||||
### 2. 匹配课程计划
|
||||
根据班级标题中的关键词匹配对应课程计划:
|
||||
|
||||
Reference in New Issue
Block a user