feat: 添加第12课课评、班级总结及学生画像更新
- K4周日1900班第12课《花朵随心画》课评(梁境城、钟嘉逸、王睿意补课) - AICODE03/CSP03各班级第12课课评及班级总结 - 更新多班级学生画像 - 课评生成技能优化
This commit is contained in:
151
data/query_0515_0517.js
Normal file
151
data/query_0515_0517.js
Normal file
@@ -0,0 +1,151 @@
|
||||
const axios = require('axios');
|
||||
require('dotenv').config({ path: 'E:/cc/4work_project/ClassFeedback/.env' });
|
||||
|
||||
const API_BASE_URL = process.env.API_BASE_URL;
|
||||
const AUTHORIZATION = process.env.AUTHORIZATION;
|
||||
|
||||
// 查询整体出勤率
|
||||
async function getTeacherAttendanceRate(beginDate, endDate) {
|
||||
try {
|
||||
console.log(`🔍 正在查询橙子老师 ${beginDate} 至 ${endDate} 整体出勤率...`);
|
||||
const response = await axios.get(`${API_BASE_URL}/reports/teacher-attendance-rates`, {
|
||||
headers: { 'Authorization': AUTHORIZATION },
|
||||
params: {
|
||||
teacher_name: '橙子(程城)',
|
||||
begin_date: beginDate,
|
||||
end_date: endDate
|
||||
}
|
||||
});
|
||||
console.log('✅ 整体出勤率数据获取成功');
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
console.error('❌ 整体出勤率查询失败:', error.response ? error.response.data : error.message);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// 查询每日详细课程和学生出勤明细
|
||||
async function getDailyTeachingSchedule(dates) {
|
||||
const allData = [];
|
||||
|
||||
for (const date of dates) {
|
||||
try {
|
||||
console.log(`\n🔍 正在查询 ${date} 的课程明细...`);
|
||||
const response = await axios.get(`${API_BASE_URL}/reports/teaching-schedule`, {
|
||||
headers: { 'Authorization': AUTHORIZATION },
|
||||
params: {
|
||||
teacher_name: '橙子(程城)',
|
||||
teaching_date: date
|
||||
}
|
||||
});
|
||||
|
||||
if (response.data.code === 0 && response.data.data.items.length > 0) {
|
||||
allData.push({
|
||||
date: date,
|
||||
courses: response.data.data.items
|
||||
});
|
||||
console.log(`✅ ${date} 找到 ${response.data.data.items.length} 节课`);
|
||||
|
||||
// 打印每节课的学生出勤情况
|
||||
response.data.data.items.forEach((course, idx) => {
|
||||
console.log(`\n 📚 课程 ${idx + 1}: ${course.class_name || '未命名班级'}`);
|
||||
console.log(` 时间: ${course.teaching_begin_time} - ${course.teaching_end_time}`);
|
||||
console.log(` 学生明细:`);
|
||||
if (course.students && course.students.length > 0) {
|
||||
course.students.forEach(student => {
|
||||
const status = student.attendance_status || '❓ 未知';
|
||||
const remark = student.attendance_remark ? ` (${student.attendance_remark})` : '';
|
||||
console.log(` - ${student.student_name}: ${status}${remark}`);
|
||||
});
|
||||
} else {
|
||||
console.log(` (无学生数据)`);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
console.log(`ℹ️ ${date} 没有课程安排`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`❌ 查询 ${date} 失败:`, error.response ? error.response.data : error.message);
|
||||
}
|
||||
}
|
||||
|
||||
return allData;
|
||||
}
|
||||
|
||||
// 主函数
|
||||
async function main() {
|
||||
const dates = ['2026-05-15', '2026-05-16', '2026-05-17'];
|
||||
const beginDate = '2026-05-15';
|
||||
const endDate = '2026-05-17';
|
||||
|
||||
console.log('========================================');
|
||||
console.log(' 橙子老师 5月15日-5月17日 出勤查询');
|
||||
console.log('========================================\n');
|
||||
|
||||
// 1. 获取整体出勤率
|
||||
const overallRate = await getTeacherAttendanceRate(beginDate, endDate);
|
||||
if (overallRate && overallRate.data && overallRate.data.数据) {
|
||||
const data = overallRate.data.数据[0];
|
||||
if (data) {
|
||||
console.log('\n📊 整体出勤率摘要:');
|
||||
console.log(` 校区: ${data.校区名称}`);
|
||||
console.log(` 综合出勤率: ${(data.综合.一次出勤率 * 100).toFixed(2)}%`);
|
||||
console.log(` 固定班应消耗课时: ${data.综合.固定班应消耗课时}`);
|
||||
console.log(` 固定班实际到课课时: ${data.综合.固定班实际到课课时}`);
|
||||
console.log(` 固定班请假课时: ${data.综合.固定班请假课时}`);
|
||||
console.log(` 固定班旷课课时: ${data.综合.固定班旷课课时}`);
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 获取每日明细
|
||||
console.log('\n----------------------------------------');
|
||||
console.log(' 每日课程及学生出勤明细');
|
||||
console.log('----------------------------------------');
|
||||
const dailyDetails = await getDailyTeachingSchedule(dates);
|
||||
|
||||
// 3. 汇总统计
|
||||
console.log('\n========================================');
|
||||
console.log(' 汇总统计');
|
||||
console.log('========================================');
|
||||
|
||||
let totalStudents = 0;
|
||||
let attendedStudents = 0;
|
||||
let leaveStudents = 0;
|
||||
let absentStudents = 0;
|
||||
let makeupStudents = 0;
|
||||
|
||||
dailyDetails.forEach(day => {
|
||||
day.courses.forEach(course => {
|
||||
if (course.students) {
|
||||
course.students.forEach(student => {
|
||||
totalStudents++;
|
||||
const status = student.attendance_status || '';
|
||||
if (status.includes('出勤')) attendedStudents++;
|
||||
else if (status.includes('请假')) leaveStudents++;
|
||||
else if (status.includes('缺勤') || status.includes('旷课')) absentStudents++;
|
||||
else if (status.includes('补课')) makeupStudents++;
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
console.log(`- 总学生人次: ${totalStudents}`);
|
||||
console.log(`- 正常出勤: ${attendedStudents} 人次 (${totalStudents > 0 ? ((attendedStudents / totalStudents) * 100).toFixed(2) : 0}%)`);
|
||||
console.log(`- 请假: ${leaveStudents} 人次 (${totalStudents > 0 ? ((leaveStudents / totalStudents) * 100).toFixed(2) : 0}%)`);
|
||||
console.log(`- 旷课/缺勤: ${absentStudents} 人次 (${totalStudents > 0 ? ((absentStudents / totalStudents) * 100).toFixed(2) : 0}%)`);
|
||||
console.log(`- 补课: ${makeupStudents} 人次 (${totalStudents > 0 ? ((makeupStudents / totalStudents) * 100).toFixed(2) : 0}%)`);
|
||||
|
||||
// 保存到文件
|
||||
const fs = require('fs');
|
||||
const result = {
|
||||
query_range: '2026-05-15 至 2026-05-17',
|
||||
teacher_name: '橙子(程城)',
|
||||
overall_attendance_rate: overallRate,
|
||||
daily_course_details: dailyDetails
|
||||
};
|
||||
const outputPath = 'E:/cc/4work_project/ClassFeedback/data/orange_attendance_0515_0517.json';
|
||||
fs.writeFileSync(outputPath, JSON.stringify(result, null, 2));
|
||||
console.log(`\n🎉 数据已保存到: ${outputPath}`);
|
||||
}
|
||||
|
||||
main();
|
||||
Reference in New Issue
Block a user