Files
ClassFeedback/scripts/query-attendance.js

118 lines
3.7 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();
const API_BASE_URL = process.env.API_BASE_URL;
const AUTHORIZATION = process.env.AUTHORIZATION;
// 查询橙子老师上周整体出勤率
async function getTeacherAttendanceRate() {
try {
console.log('🔍 正在查询橙子老师上周整体出勤率...');
const response = await axios.get(`${API_BASE_URL}/reports/teacher-attendance-rates`, {
headers: {
'Authorization': AUTHORIZATION
},
params: {
teacher_name: '橙子(程城)',
begin_date: '2026-04-21',
end_date: '2026-04-27'
}
});
console.log('✅ 整体出勤率数据获取成功:');
console.log(JSON.stringify(response.data, null, 2));
return response.data;
} catch (error) {
console.error('❌ 查询失败:', error.response ? error.response.data : error.message);
return null;
}
}
// 查询上周每天的详细课程和学生出勤明细
async function getDailyTeachingSchedule() {
const dates = [
'2026-04-21', '2026-04-22', '2026-04-23', '2026-04-24',
'2026-04-25', '2026-04-26', '2026-04-27'
];
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} 节课`);
} else {
console.log(` ${date} 没有课程安排`);
}
} catch (error) {
console.error(`❌ 查询 ${date} 失败:`, error.response ? error.response.data : error.message);
}
}
return allData;
}
// 主函数
async function main() {
// 1. 获取整体出勤率
const overallRate = await getTeacherAttendanceRate();
// 2. 获取每日明细
const dailyDetails = await getDailyTeachingSchedule();
// 3. 汇总数据并保存
const result = {
query_range: '2026-04-21 至 2026-04-27',
teacher_name: '橙子(程城)',
overall_attendance_rate: overallRate,
daily_course_details: dailyDetails
};
// 保存到文件
const fs = require('fs');
const outputPath = '上周学生出勤原始数据.json';
fs.writeFileSync(outputPath, JSON.stringify(result, null, 2));
console.log(`\n🎉 所有数据查询完成,已保存到:${outputPath}`);
console.log('\n📊 数据摘要:');
// 统计总出勤情况
let totalStudents = 0;
let attendedStudents = 0;
let leaveStudents = 0;
let absentStudents = 0;
dailyDetails.forEach(day => {
day.courses.forEach(course => {
course.students.forEach(student => {
totalStudents++;
if (student.attendance_status === '✅ 出勤') attendedStudents++;
else if (student.attendance_status === '⏸ 请假') leaveStudents++;
else if (student.attendance_status === '❌ 缺勤') absentStudents++;
});
});
});
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}%`);
}
main();