From 1d99ca92f223a8115f23dc296fb254f549c5af1e Mon Sep 17 00:00:00 2001 From: KenanZhu <3471685733@qq.com> Date: Tue, 17 Mar 2026 20:46:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(LibReserve):=20=E4=BF=AE=E5=A4=8D=E6=97=A5?= =?UTF-8?q?=E6=9C=9F=E6=AF=94=E8=BE=83=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E6=97=B6=E9=97=B4=E5=A4=84=E7=90=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复使用字符串直接比较日期导致的逻辑错误,改用时间戳比较 - 优化时间验证逻辑,支持 satisfy_duration 模式下的开始晚于结束时间时的交换时间处理 - 添加必要的注释说明 place 参数检查的跳过原因和边界情况处理 - 重构变量命名,提高代码可读性(cur_date -> cur_date_str) - 修正字符串引号风格,统一使用单引号 --- src/operators/LibReserve.py | 39 ++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/src/operators/LibReserve.py b/src/operators/LibReserve.py index f33c1e1..45749e0 100644 --- a/src/operators/LibReserve.py +++ b/src/operators/LibReserve.py @@ -107,6 +107,8 @@ class LibReserve(LibTimeSelector): try: # must contain the required infomation + # key 'place' is no need to check + # because 'place' is only has one possible value '1' or '图书馆' if reserve_info.get("floor") is None: # if existence ? raise ValueError("未指定楼层") if reserve_info["floor"] not in self.__floor_map: # if in the mao ? @@ -133,17 +135,19 @@ class LibReserve(LibTimeSelector): reserve_info: dict ) -> bool: - cur_date = time.strftime("%Y-%m-%d", time.localtime()) + cur_date_str = time.strftime("%Y-%m-%d", time.localtime()) + cur_timestamp = time.mktime(time.strptime(cur_date_str, "%Y-%m-%d")) if reserve_info.get("date") is None: - reserve_info["date"] = cur_date - self._showTrace(f"预约日期未指定, 自动设置为当前日期: {cur_date}") + reserve_info["date"] = cur_date_str + self._showTrace(f"预约日期未指定, 自动设置为当前日期: {cur_date_str}") else: - if reserve_info["date"] < cur_date: + res_timestamp = time.mktime(time.strptime(reserve_info["date"], "%Y-%m-%d")) + if res_timestamp < cur_timestamp: self._showTrace( f"预约日期错误 ! :"\ - f"{reserve_info['date']} 早于当前日期 {cur_date}, 自动设置为当前日期" + f"{reserve_info['date']} 早于当前日期 {cur_date_str}, 自动设置为当前日期" ) - reserve_info["date"] = cur_date + reserve_info["date"] = cur_date_str return True @@ -190,6 +194,9 @@ class LibReserve(LibTimeSelector): if reserve_info.get("end_time") is None: reserve_info["end_time"] = {} if "time" not in reserve_info["end_time"]: + # here we add the expect duration to the begin time first, + # the edge case that the end time is later than 23:30 will + # be handled in __finalCheck. so no need to concern about it. end_mins = self._timeStrToMins(reserve_info["begin_time"]["time"]) end_mins = end_mins + int(reserve_info["expect_duration"]*60) reserve_info["end_time"] = { @@ -217,23 +224,27 @@ class LibReserve(LibTimeSelector): begin_time, end_time = reserve_info["begin_time"], reserve_info["end_time"] begin_mins = self._timeStrToMins(begin_time["time"]) end_mins = self._timeStrToMins(end_time["time"]) + # if end time is earlier than begin_time, exchange them - if end_mins < begin_mins: + # except that the user has set the satisfy_duration to True + if end_mins < begin_mins and reserve_info["satisfy_duration"] is False: self._showTrace( f"结束时间 {end_time['time']} 早于开始时间 {begin_time['time']}, 尝试交换时间" ) - reserve_info["end_time"] = begin_time - reserve_info["begin_time"] = end_time - begin_time, end_time = reserve_info["begin_time"], reserve_info["end_time"] + reserve_info["end_time"], reserve_info["begin_time"] = begin_time, end_time + begin_time, end_time = end_time, begin_time begin_mins = self._timeStrToMins(begin_time["time"]) end_mins = self._timeStrToMins(end_time["time"]) + # ensure the end time is not later than 23:30 - if end_mins > self._timeStrToMins("23:30"): + max_end_mins = self._timeStrToMins("23:30") + if end_mins > max_end_mins: self._showTrace( f"结束时间 {end_time['time']} 晚于 23:30, 自动设置为 23:30" ) reserve_info["end_time"]["time"] = "23:30" - end_mins = self._timeStrToMins("23:30") + end_mins = max_end_mins + # ensure the duration is not longer than 8 hours if reserve_info["satisfy_duration"]: if reserve_info["expect_duration"] > 8: @@ -274,8 +285,8 @@ class LibReserve(LibTimeSelector): self._showTrace( f"预约信息检查完成, 准备预约 " f"{reserve_info['date']} " - f"{reserve_info['begin_time']["time"]} - " - f"{reserve_info['end_time']["time"]} " + f"{reserve_info['begin_time']['time']} - " + f"{reserve_info['end_time']['time']} " f"图书馆 " f"{self.__floor_map[reserve_info['floor']]} " f"{self.__room_map[reserve_info['room']]} "