File size: 6,848 Bytes
5957456
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6cc56bb
 
 
 
 
 
5957456
 
 
 
6cc56bb
5957456
 
 
 
 
 
 
 
 
 
 
 
 
653c3a3
5957456
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
493d6ff
5957456
 
 
 
493d6ff
 
 
 
5957456
493d6ff
 
 
 
 
 
 
 
 
5957456
 
 
 
 
 
 
 
 
653c3a3
 
5957456
493d6ff
 
5957456
 
 
 
 
 
 
 
 
653c3a3
5957456
 
 
653c3a3
 
 
5957456
653c3a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5957456
 
 
653c3a3
5957456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
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"