更新K4课程README,清理旧的班级记忆文件,调整目录结构
This commit is contained in:
117
scripts/query-attendance.js
Normal file
117
scripts/query-attendance.js
Normal file
@@ -0,0 +1,117 @@
|
||||
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();
|
||||
Reference in New Issue
Block a user