You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
3.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

const cloud = require('wx-server-sdk')
cloud.init({ env: 'yz-7g23c92hf3223f1d' }) // 使用当前云环境
const xlsx = require('node-xlsx') //导入Excel类库
const db = cloud.database() //声明数据库对象
const _ = db.command
// 云函数入口函数
exports.main = async (event, context) => {
// 查询所有学生信息
let all_information = await db.collection('namelist').where({
filename: _.eq(event.filename)
}).orderBy('student_ID', 'asc').limit(500).get();
// 查询非出勤的学生信息
let call_information = await db.collection('namelist').where({
filename: _.eq(event.filename),
state: _.neq("present")
}).orderBy('state', 'asc').orderBy('student_ID', 'asc').limit(500).get();
// 准备 Excel 文件数据
var allData1 = []; // 第一张表格(所有学生)
var allData2 = []; // 第二张表格筛选状态不为present的学生
// 第一张表格的表头:学号、姓名、被点名次数、积分、状态
var arr = ["学号", "姓名", "被点名次数", "积分", "状态"];
allData1.push(arr);
// 遍历所有学生信息,填充到第一张表格
for (let i = 0; i < all_information.data.length; ++i) {
arr = [];
arr.push(all_information.data[i].student_ID);
arr.push(all_information.data[i].name);
arr.push(all_information.data[i].attendance_count || 0); // 被点名次数默认为0
arr.push(all_information.data[i].score || 0); // 积分默认为0
arr.push(all_information.data[i].state); // 状态
allData1.push(arr);
}
// 第二张表格的课程信息和表头
arr = ["课程名称", event.course];
allData2.push(arr);
arr = ["任课老师", event.teacher];
allData2.push(arr);
arr = ["日期", event.date];
allData2.push(arr);
arr = [event.weekday + ":" + event.start + "-" + event.end];
allData2.push(arr);
arr = ["学号", "姓名", "状态"];
allData2.push(arr);
// 遍历非出勤学生信息,填充到第二张表格
for (let i = 0; i < call_information.data.length; ++i) {
arr = [];
arr.push(call_information.data[i].student_ID);
arr.push(call_information.data[i].name);
if (call_information.data[i].state == "cut") arr.push("旷课");
else arr.push("请假");
allData2.push(arr);
}
// 生成 Excel 文件的两个工作表
var buffer = await xlsx.build([
{
name: "所有学生信息", // 第一张表名称
data: allData1
},
{
name: "本次学生到课情况", // 第二张表名称
data: allData2
}
]);
console.log("生成的Excel数据:", buffer);
// 删除旧文件
const result = await cloud.deleteFile({
fileList: [event.fileID],
});
console.log("文件删除结果:", result.fileList);
// 上传新生成的Excel文件
return await cloud.uploadFile({
cloudPath: event.filename + ".xlsx", // 上传的文件名
fileContent: buffer // 上传的文件内容
});
}