Files
2026-09-09 16:43:57 +08:00

93 lines
3.9 KiB
Python

"""分组数据导出。"""
from __future__ import annotations
from group_system.xlsx_io import export_filename, write_xlsx
class ExportStoreMixin:
def export_groups(self, class_name: str | None = None) -> tuple[bytes, str]:
with self.lock:
if class_name:
class_filter = "WHERE g.class_name=?"
params: tuple[Any, ...] = (class_name,)
else:
class_filter = ""
params = ()
class_name = None
group_rows = self.connection.execute(
f"""SELECT g.id,g.class_name,g.name,s1.student_no leader_no,s1.name leader_name
FROM groups g LEFT JOIN students s1 ON s1.id=g.leader_student_id
{class_filter} ORDER BY g.class_name,g.id""",
params,
).fetchall()
member_rows = self.connection.execute(
f"""SELECT m.group_id,s.student_no,s.name,s.gender,s.class_name
FROM group_members m JOIN groups g ON g.id=m.group_id
JOIN students s ON s.id=m.student_id
{class_filter}
ORDER BY g.class_name,g.id,CASE WHEN s.id=g.leader_student_id THEN 0 ELSE 1 END,s.student_no""",
params,
).fetchall()
ungrouped_rows = self.connection.execute(
f"""SELECT s.class_name,s.student_no,s.name,s.gender
FROM students s WHERE s.id NOT IN (SELECT student_id FROM group_members)
{'AND s.class_name=?' if class_name else ''}
ORDER BY s.class_name,s.student_no""",
((class_name,) if class_name else ()),
).fetchall()
by_group: dict[int, list[sqlite3.Row]] = {}
for row in member_rows:
by_group.setdefault(row["group_id"], []).append(row)
summary_headers = ["序号", "班级", "组名", "组内序号", "学号", "姓名", "性别", "是否组长"]
summary_records = []
row_number = 0
for group in group_rows:
for member_number, member in enumerate(by_group.get(group["id"], []), 1):
row_number += 1
summary_records.append(
{
"序号": row_number,
"班级": member["class_name"],
"组名": group["name"],
"组内序号": member_number,
"学号": member["student_no"],
"姓名": member["name"],
"性别": member["gender"],
"是否组长": "是" if member["student_no"] == group["leader_no"] else "否",
}
)
if not summary_records:
summary_records.append({
"序号": "", "班级": "", "组名": "暂无分组", "组内序号": "",
"学号": "", "姓名": "", "性别": "", "是否组长": "",
})
ungrouped_headers = ["序号", "班级", "学号", "姓名", "性别", "说明"]
ungrouped_records = [
{
"序号": index,
"班级": row["class_name"],
"学号": row["student_no"],
"姓名": row["name"],
"性别": row["gender"],
"说明": "未分组",
}
for index, row in enumerate(ungrouped_rows, 1)
]
if not ungrouped_records:
ungrouped_records.append({
"序号": "", "班级": "", "学号": "", "姓名": "", "性别": "", "说明": "全部学生均已分组"
})
title = f"{class_name}班" if class_name else "全部班级"
xlsx = write_xlsx(
[
(f"{title}分组", summary_headers, summary_records),
("未分组学生", ungrouped_headers, ungrouped_records),
]
)
return xlsx, export_filename("学生分组", class_name)