@@ -57,21 +57,21 @@ def _validate_schedule(self) -> bool:
5757 return False
5858
5959 # 基本结构验证
60- if "schedule" not in self .schedule_data :
60+ schedule = self .schedule_data .get ("schedule" )
61+ if not schedule :
6162 logger .error ("缺少'schedule'字段" )
6263 return False
6364
64- schedule = self .schedule_data ["schedule" ]
6565 if not isinstance (schedule , dict ):
6666 logger .error ("'schedule'字段必须是字典类型" )
6767 return False
6868
6969 # 验证时间段配置
70- if "timeslots" not in schedule :
70+ timeslots = schedule .get ("timeslots" )
71+ if timeslots is None :
7172 logger .error ("缺少'timeslots'字段" )
7273 return False
7374
74- timeslots = schedule ["timeslots" ]
7575 if not isinstance (timeslots , list ):
7676 logger .error ("'timeslots'字段必须是列表类型" )
7777 return False
@@ -93,6 +93,11 @@ def _validate_timeslot(self, timeslot: dict, index: int) -> bool:
9393 Returns:
9494 bool: 有效返回True,否则返回False
9595 """
96+ # 检查timeslot是否为字典类型
97+ if not isinstance (timeslot , dict ):
98+ logger .error (f"时间段{ index } 必须是字典类型" )
99+ return False
100+
96101 required_fields = ["name" , "start_time" , "end_time" ]
97102 for field in required_fields :
98103 if field not in timeslot :
@@ -150,17 +155,26 @@ def get_non_class_times(self) -> Dict[str, str]:
150155 return {}
151156
152157 non_class_times = {}
153- schedule = self .schedule_data [ "schedule" ]
154- timeslots = schedule [ "timeslots" ]
158+ schedule = self .schedule_data . get ( "schedule" , {})
159+ timeslots = schedule . get ( "timeslots" , [])
155160
156- # 按开始时间排序
157- sorted_timeslots = sorted (timeslots , key = lambda x : x ["start_time" ])
161+ # 过滤并排序有效的时间段
162+ valid_timeslots = [
163+ slot
164+ for slot in timeslots
165+ if isinstance (slot , dict )
166+ and slot .get ("start_time" )
167+ and slot .get ("end_time" )
168+ ]
169+ sorted_timeslots = sorted (
170+ valid_timeslots , key = lambda x : x .get ("start_time" , "" )
171+ )
158172
159173 # 构建上课时间段列表
160174 class_periods = []
161175 for timeslot in sorted_timeslots :
162- start_time = self ._format_time_for_secrandom (timeslot [ "start_time" ] )
163- end_time = self ._format_time_for_secrandom (timeslot [ "end_time" ] )
176+ start_time = self ._format_time_for_secrandom (timeslot . get ( "start_time" , "" ) )
177+ end_time = self ._format_time_for_secrandom (timeslot . get ( "end_time" , "" ) )
164178 class_periods .append ((start_time , end_time ))
165179
166180 # 生成非上课时间段
@@ -209,20 +223,21 @@ def get_class_info(self) -> List[Dict]:
209223 if not self .schedule_data :
210224 return []
211225
212- schedule = self .schedule_data [ "schedule" ]
226+ schedule = self .schedule_data . get ( "schedule" , {})
213227 timeslots = schedule .get ("timeslots" , [])
214228
215229 class_info = []
216230 for timeslot in timeslots :
217- info = {
218- "name" : timeslot .get ("name" , "" ),
219- "start_time" : timeslot .get ("start_time" , "" ),
220- "end_time" : timeslot .get ("end_time" , "" ),
221- "teacher" : timeslot .get ("teacher" , "" ),
222- "location" : timeslot .get ("location" , "" ),
223- "day_of_week" : timeslot .get ("day_of_week" , "" ),
224- }
225- class_info .append (info )
231+ if isinstance (timeslot , dict ):
232+ info = {
233+ "name" : timeslot .get ("name" , "" ),
234+ "start_time" : timeslot .get ("start_time" , "" ),
235+ "end_time" : timeslot .get ("end_time" , "" ),
236+ "teacher" : timeslot .get ("teacher" , "" ),
237+ "location" : timeslot .get ("location" , "" ),
238+ "day_of_week" : timeslot .get ("day_of_week" , "" ),
239+ }
240+ class_info .append (info )
226241
227242 return class_info
228243
@@ -235,15 +250,26 @@ def get_summary(self) -> str:
235250 if not self .schedule_data :
236251 return "未加载课程表"
237252
238- schedule = self .schedule_data [ "schedule" ]
253+ schedule = self .schedule_data . get ( "schedule" , {})
239254 timeslots = schedule .get ("timeslots" , [])
240255
241256 if not timeslots :
242257 return "课程表为空"
243258
244259 # 获取最早和最晚时间
245- start_times = [slot ["start_time" ] for slot in timeslots ]
246- end_times = [slot ["end_time" ] for slot in timeslots ]
260+ start_times = [
261+ slot .get ("start_time" , "" )
262+ for slot in timeslots
263+ if isinstance (slot , dict ) and slot .get ("start_time" )
264+ ]
265+ end_times = [
266+ slot .get ("end_time" , "" )
267+ for slot in timeslots
268+ if isinstance (slot , dict ) and slot .get ("end_time" )
269+ ]
270+
271+ if not start_times or not end_times :
272+ return f"课程表包含{ len (timeslots )} 个时间段"
247273
248274 summary = f"课程表包含{ len (timeslots )} 个时间段,"
249275 summary += f"最早开始时间:{ min (start_times )} ,"
0 commit comments