"""分组数据导出。""" 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)