Files
ClassFeedback/data/query_0515_0517.js
chengzi 3b75170862 feat: 添加第12课课评、班级总结及学生画像更新
- K4周日1900班第12课《花朵随心画》课评(梁境城、钟嘉逸、王睿意补课)
- AICODE03/CSP03各班级第12课课评及班级总结
- 更新多班级学生画像
- 课评生成技能优化
2026-05-24 20:48:34 +08:00

152 lines
5.9 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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.
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();