rewrited logic structure
This commit is contained in:
92
group_system/storage/export.py
Normal file
92
group_system/storage/export.py
Normal file
@@ -0,0 +1,92 @@
|
||||
"""分组数据导出。"""
|
||||
|
||||
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)
|
||||
Reference in New Issue
Block a user