- K4周日1900班第12课《花朵随心画》课评(梁境城、钟嘉逸、王睿意补课) - AICODE03/CSP03各班级第12课课评及班级总结 - 更新多班级学生画像 - 课评生成技能优化
152 lines
5.9 KiB
JavaScript
152 lines
5.9 KiB
JavaScript
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();
|