118 lines
3.7 KiB
JavaScript
118 lines
3.7 KiB
JavaScript
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();
|