diff --git a/data/KSP_data/log_book.xlsx b/data/KSP_data/log_book.xlsx index 91659d3..1f24825 100644 Binary files a/data/KSP_data/log_book.xlsx and b/data/KSP_data/log_book.xlsx differ diff --git a/src/KSP_tools/KSP_wiki/utils/sync_to_overview.py b/src/KSP_tools/KSP_wiki/utils/sync_to_overview.py index ef13a36..eeb2341 100644 --- a/src/KSP_tools/KSP_wiki/utils/sync_to_overview.py +++ b/src/KSP_tools/KSP_wiki/utils/sync_to_overview.py @@ -27,8 +27,8 @@ from openpyxl.worksheet.worksheet import Worksheet from openpyxl.cell.cell import Cell, MergedCell # Paths and constants -PROJECT_ROOT = Path(__file__).resolve().parents[2] -LOG_BOOK_PATH = PROJECT_ROOT / "local_content_dir" / "log_book.xlsx" +PROJECT_ROOT = Path(__file__).resolve().parents[4] +LOG_BOOK_PATH = PROJECT_ROOT / "data" / "KSP_data" / "log_book.xlsx" OVERVIEW_SHEET_NAME = "Overview" HEADER_ROW_INDEX = 1 @@ -695,6 +695,6 @@ def main(sheet: str, workbook: Optional[str] = None) -> None: if __name__ == "__main__": # Configure these values here and call main directly. # Edit these lines to change which sheet / workbook are processed. - sheet_name = "XH-01" + sheet_name = "ST-01" workbook_path = str(LOG_BOOK_PATH) main(sheet_name, workbook_path) diff --git a/src/KSP_tools/KSP_wiki/vessel_log/Stellaria_history.py b/src/KSP_tools/KSP_wiki/vessel_log/Stellaria_history.py index 25f1600..dc2bf82 100644 --- a/src/KSP_tools/KSP_wiki/vessel_log/Stellaria_history.py +++ b/src/KSP_tools/KSP_wiki/vessel_log/Stellaria_history.py @@ -13,7 +13,7 @@ operating_history_raw = """ Uncrewed mission to Earth-Sun Lagrange Point 2 to test long-duration operations 2054-11-28 Test Mission Complete, all systems nominal. Returning to LEO. -2055-12-01 Start maintenance +2054-12-01 Start maintenance 2055-02-28 Maintenance complete, all systems operational, ready for commissioning. 2055-03-20 Picking up crew for Inner Solar System Exploration Mission 1 @@ -37,7 +37,7 @@ operating_history_raw = """ 2056-04-12 Earth Arrival 2056-04-15 Start maintenance -2056-06-01 Maintenance complete. +2056-05-31 Maintenance complete. 2056-06-02 Picking up crew for Mars One Construction Mission 2 2056-06-04 Picking up Mars One construction cargo @@ -205,7 +205,7 @@ operating_history = [ { 'log_name': "Maintenance", 'start_time': "2056-04-15", - 'end_time': "2056-06-01", + 'end_time': "2056-05-31", 'mission_detail': "", 'sub_log': [] }, @@ -312,4 +312,34 @@ operating_history = [ 'sub_log': [ "2059-05-31 Parked into Iapetus orbit, orbital science completed", "2059-06-15 Start Iapetus Surface operation", + ] + }, + { + 'log_name': "Saturn Exploration Mission 1 return to Earth", + 'start_time': "2059-07-01", + 'end_time': "2059-11-24", + 'mission_detail': "Saturn-Earth transfer, using standard trajectory with 162km/s of departure burn", + 'sub_log': [ + "2059-07-01 Wrapping up Saturn Exploration Mission. Saturn Departure for Earth", + "2059-11-24 Back from Saturn, Earth Arrival", + ] + }, + { + 'log_name': "Upgrades at Star Port", + 'start_time': "2059-11-25", + 'end_time': "2060-02-10", + 'mission_detail': "Upgrades complete, ST-01 now fully meets Stellaria specifications.", + 'sub_log': [] + }, + { + 'log_name': "Outer Solar System Exploration Mission 1 outbound to Neptune", + 'start_time': "2060-02-11", + 'end_time': None, + 'mission_detail': "Earth-Neptune transfer, using 160km/s departure burn", + 'sub_log': [ + "2060-02-11 Out of Star Port, config for Outer Solar System Exploration", + "2060-02-12 Pick up Outer Solar System Exploration Crew 1 and supply", + "2060-02-12 Earth Departure for Neptune", + ] + }, ] \ No newline at end of file diff --git a/src/log_tool/analysis_via_history_message.py b/src/log_tool/analysis_via_history_message.py index 4481cdd..707b66a 100644 --- a/src/log_tool/analysis_via_history_message.py +++ b/src/log_tool/analysis_via_history_message.py @@ -1,6 +1,7 @@ from typing import Optional import pandas as pd from langchain_openai import ChatOpenAI +import warnings from src.PostgresSQL.db_handler import PgHandler from src.config.load_config import project_config @@ -15,12 +16,14 @@ LLM = ChatOpenAI( def load_history_by_year_month(year: int, month: Optional[int] = None, table_name: str = '王适意_personal_chat', schema: str = 'public', - db_config: Optional[dict] = None) -> pd.DataFrame: - """从 Postgres 中读取历史消息并按年/月过滤。 + db_config: Optional[dict] = None, + week: Optional[int] = None) -> pd.DataFrame: + """从 Postgres 中读取历史消息并按年/月或年/周过滤。 参数: - year: 年份(四位数) - month: 可选的月份(1-12),若提供则只返回该月的数据 + - week: 可选的每年的第几周(ISO week)。如果提供则优先按周过滤,会 bypass month,但会发出警告。 - table_name: 数据库表名,默认 '王适意_personal_chat' - schema: schema,默认 'public' - db_config: 可选的数据库连接参数字典(含 host, port, user, password, database) @@ -33,7 +36,7 @@ def load_history_by_year_month(year: int, month: Optional[int] = None, port = int(cfg.get('port') or cfg.get('db_port') or 5432) user = cfg.get('user') or cfg.get('db_user') password = cfg.get('password') or cfg.get('db_password') - database = cfg.get('database') or cfg.get('db_name') + database = cfg.get('tg_message_db_name') pg = PgHandler(host=host, port=port, user=user, password=password, database=database) try: @@ -66,21 +69,39 @@ def load_history_by_year_month(year: int, month: Optional[int] = None, df = df.copy() df['dt'] = dt - # 过滤年份和可选月份 - df = df[df['dt'].dt.year == int(year)] - if month is not None: - df = df[df['dt'].dt.month == int(month)] + + # 如果同时提供 month 和 week,警告并以 week 为准(week 优先) + if week is not None and month is not None: + warnings.warn('Both "month" and "week" provided; "week" will take precedence and "month" will be ignored.', UserWarning) + + # 过滤年份和可选月份/周 + # 当提供 week 时,按 ISO week 过滤,并且考虑 ISO week 的 year(isocalendar year)以确保正确匹配 + if week is not None: + # Pandas >= 1.1 提供 dt.isocalendar() + try: + iso = df['dt'].dt.isocalendar() + # iso is a DataFrame-like with 'year' and 'week' columns + df = df[(iso['year'] == int(year)) & (iso['week'] == int(week))] + except Exception: + # 备选:使用 datetime.isocalendar() per-row(较慢) + df = df[df['dt'].apply(lambda x: x.isocalendar()[0] == int(year) and x.isocalendar()[1] == int(week))] + else: + # 默认按 calendar 年过滤 + df = df[df['dt'].dt.year == int(year)] + if month is not None: + df = df[df['dt'].dt.month == int(month)] df = df.sort_values('dt').reset_index(drop=True) return df + def do_analysis_on_history_messages(df: pd.DataFrame): data = df.to_dict(orient='records') to_model_data = [ { - 'message_datetime': item.get('message_datetime'), - 'message_from': item.get('message_from'), - 'message_text': item.get('message_text'), + 'msg_time': item.get('message_datetime'), + 'msg_from': item.get('message_from'), + 'msg_text': f"转发来自{item['forward_from']}的消息: {item.get('message_text')}" if item.get('forward_from') else item.get('message_text'), 'file_type': item.get('file_type'), } for item in data @@ -89,8 +110,8 @@ def do_analysis_on_history_messages(df: pd.DataFrame): prompt = f""" 你是一个聊天记录分析专家,擅长根据用户的聊天记录,分析用户的行为,然后撰写报告。 你的报告应当包含以下内容: -1. 以天为单位,分析用户在这一天内的主要活动和重大事件。每一天的总结应当独立成段。 -2. 按照月时间维度,输出总结。 +1. 以天为单位,分析用户在这一天内的主要活动和重大事件。每一天的总结应当独立成段。每一天的重大事件应当按照时间顺序排列。 +2. 输出总结报告。 你的总结应当包括但不限于以下内容: - 用户在这个月内的主要活动和重大事件。 @@ -113,7 +134,7 @@ def do_analysis_on_history_messages(df: pd.DataFrame): if __name__ == "__main__": - df_month = load_history_by_year_month(2025, month=1) - summary = do_analysis_on_history_messages(df_month) - print(f"Loaded {len(df_month)} messages for May 2023") - + # df = load_history_by_year_month(2025, month=1) + df = load_history_by_year_month(2025, week=2) + summary = do_analysis_on_history_messages(df) + print(f"done") diff --git a/src/model_manager/__init__.py b/src/model_manager/__init__.py new file mode 100644 index 0000000..e69de29