import json from datetime import datetime, timezone import pytz class DashboardService: def __init__(self, assignment_service, submission_service): self.assignment_service = assignment_service self.submission_service = submission_service def get_dashboard_data(self, user_id): assignments = self.assignment_service.get_user_assignments(user_id) dashboard_data = [] for assignment_id, assignment_info in assignments.items(): assignment_data = self.assignment_service.get_assignment(assignment_id) submission_ids = assignment_data.get("submission_ids", []) submission_count = len(submission_ids) dashboard_item = { # "assignment_id": assignment_id, "作業題目": assignment_data["metadata"]["topic"], "類型": assignment_data["assignment_type"], "回傳數量": submission_count, "建立時間": assignment_data["timestamp"], "截止時間": assignment_data["metadata"].get("submission_deadline") } dashboard_data.append(dashboard_item) # 按創建日期降序排序 dashboard_data.sort(key=lambda x: x["建立時間"], reverse=True) return dashboard_data def get_assignment_details(self, assignment_id): assignment_data = self.assignment_service.get_assignment(assignment_id) submission_ids = assignment_data.get("submission_ids", []) submissions = [] for submission_id in submission_ids: submission_data = self.submission_service.get_submission_from_gcs(submission_id) if submission_data: submissions.append({ "submission_id": submission_id, "student_id": submission_data["student_id"], "student_email": submission_data.get("student_email", "未提供"), "student_name": submission_data["student_name"], "submission_date": submission_data["timestamp"] }) return { "assignment_data": assignment_data, "submissions": submissions } def get_submission_details(self, submission_id): submission_data = self.submission_service.get_submission_from_gcs(submission_id) if not submission_data: return {"error": "找不到提交記錄"} assignment_data = self.assignment_service.get_assignment(submission_data["assignment_id"]) return { "submission_data": submission_data, "assignment_data": assignment_data } def get_all_submissions(self, user_id, user_email, user_nickname): assignments = self.assignment_service.get_user_assignments(user_id) all_submissions = [] for assignment_id, assignment_info in assignments.items(): # 20251016 新增 # 確認 assignment_data 是否包含 "assigner_email" and "assigner_nickname" 欄位 # 如果沒有,且 user_id 是 admin,則給 value = 空值 # 如果不是 admin 則給 value from user_email, user_nickname assignment_data = self.assignment_service.get_assignment(assignment_id) if "assigner_email" not in assignment_data["metadata"] or "assigner_nickname" not in assignment_data["metadata"]: if user_id == "admin": assignment_data["metadata"]["assigner_email"] = f"""查無email - {assignment_data["metadata"]["assigner_data"]["email"]}""" assignment_data["metadata"]["assigner_nickname"] = f"""查無名稱 - {assignment_data["metadata"]["assigner_data"]["nickname"]}""" else: assignment_data["metadata"]["assigner_email"] = user_email assignment_data["metadata"]["assigner_nickname"] = user_nickname self.assignment_service.update_assignment(assignment_id, assignment_data) submission_ids = assignment_data.get("submission_ids", []) for submission_id in submission_ids: submission_data = self.submission_service.get_submission_from_gcs(submission_id) if submission_data: score = self.extract_score(submission_data) all_submissions.append({ "作業名稱": assignment_data["metadata"]["topic"], "作業類型": assignment_data["assignment_type"], # "學生_id": submission_data["student_id"], "學生Email": submission_data.get("student_email", "未提供"), "學生姓名": submission_data["student_name"], "老師Email": assignment_data["metadata"]["assigner_email"], "老師姓名": assignment_data["metadata"]["assigner_nickname"], "繳交日期": submission_data["timestamp"], "分數": score }) all_submissions.sort(key=lambda x: x["繳交日期"], reverse=True) return all_submissions def extract_score(self, submission_data): try: content = submission_data.get("submission_data", {}) if isinstance(content, str): content = json.loads(content) if not isinstance(content, dict): print(f"內容格式不正確:{type(content)}") return "N/A" content = content.get("content", {}) if isinstance(content, str): content = json.loads(content) output_tables = content.get("chinese_full_paragraph_refine_output_table", []) print(f"output_tables: {output_tables}") # 調試輸出 last_score = "N/A" # 只取最後一個「綜合評分」 for table in reversed(output_tables): print(f"檢查 table: {table}") # 調試輸出 if isinstance(table, str): try: table = json.loads(table) except json.JSONDecodeError: continue if isinstance(table, dict) and table.get("架構") == "綜合評分": last_score = table.get("評分", "N/A") print(f"找到最後的評分: {last_score}") # 調試輸出 break return last_score except json.JSONDecodeError as e: print(f"JSON 解析錯誤:{str(e)}") except Exception as e: print(f"提取分數時出錯:{str(e)}") print(f"提交數據:{submission_data}") return "N/A"