93 lines
3.9 KiB
Python
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)
|