1. 系統架構圖 (System Architecture) Plaintext [Client: Electron App] | |-- (1. Auth API) --> [Ext: PJ-Auth API (Vercel)] | |-- (2. Meeting Data) --> [Middleware Server (Python FastAPI)] | |-- (3. SQL Query) --> [DB: MySQL (Shared)] | |-- (4. Summarize) --> [Ext: Dify LLM] 注意: 為了安全,資料庫連線資訊與 Dify API Key 嚴禁打包在 Electron Client 端,必須放在 Middleware Server。 2. 資料庫設計 (Database Schema) Host: mysql.theaken.com (Port 33306) User/Pass: A060 / WLeSCi0yhtc7 DB Name: db_A060 Prefix: meeting_ SQL -- 1. 使用者表 (與 Auth API 對應,本地快取用) CREATE TABLE meeting_users ( user_id INT PRIMARY KEY AUTO_INCREMENT, email VARCHAR(100) UNIQUE NOT NULL, -- 對應 ymirliu@panjit.com.tw display_name VARCHAR(50), role ENUM('admin', 'user') DEFAULT 'user', created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 2. 會議主表 CREATE TABLE meeting_records ( meeting_id INT PRIMARY KEY AUTO_INCREMENT, uuid VARCHAR(64) UNIQUE, -- 系統唯一識別碼 subject VARCHAR(200) NOT NULL, -- 會議主題 meeting_time DATETIME NOT NULL, -- 會議時間 location VARCHAR(100), -- 會議地點 chairperson VARCHAR(50), -- 會議主席 recorder VARCHAR(50), -- 會議記錄人 attendees TEXT, -- 參與人員 (逗號分隔或 JSON) transcript_blob LONGTEXT, -- AI 原始逐字稿 created_by VARCHAR(100), -- 建立者 Email created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 3. 會議結論表 (Conclusions) CREATE TABLE meeting_conclusions ( conclusion_id INT PRIMARY KEY AUTO_INCREMENT, meeting_id INT, content TEXT, system_code VARCHAR(20), -- 會議結論編號 (如: C-20251210-01) FOREIGN KEY (meeting_id) REFERENCES meeting_records(meeting_id) ); -- 4. 待辦追蹤表 (Action Items) CREATE TABLE meeting_action_items ( action_id INT PRIMARY KEY AUTO_INCREMENT, meeting_id INT, content TEXT, -- 追蹤事項內容 owner VARCHAR(50), -- 負責人 due_date DATE, -- 預計完成日期 status ENUM('Open', 'In Progress', 'Done', 'Delayed') DEFAULT 'Open', -- 執行現況 system_code VARCHAR(20), -- 會議事項編號 (如: A-20251210-01) FOREIGN KEY (meeting_id) REFERENCES meeting_records(meeting_id) ); 3. Middleware Server 配置 (FastAPI 範例) Client 端不直接連 MySQL,而是呼叫此 Middleware。 3.1 環境變數 (.env) Ini, TOML DB_HOST=mysql.theaken.com DB_PORT=33306 DB_USER=A060 DB_PASS=WLeSCi0yhtc7 DB_NAME=db_A060 AUTH_API_URL=https://pj-auth-api.vercel.app/api/auth/login DIFY_API_URL=https://dify.theaken.com/v1 DIFY_API_KEY=app-xxxxxxxxxxx # 需至 Dify 後台取得 ADMIN_EMAIL=ymirliu@panjit.com.tw 3.2 API 介面規格 A. 登入代理 (Proxy) Endpoint: POST /api/login Logic: Middleware 轉發請求至 pj-auth-api.vercel.app。成功後,若該 Email 為 ymirliu@panjit.com.tw,則在回傳的 JWT Payload 中標記 { "role": "admin" }。 B. 上傳/同步會議 Endpoint: POST /api/meetings Payload: JSON { "meta": { "subject": "...", "chairperson": "...", ... }, "transcript": "...", "conclusions": [ { "content": "..." } ], "actions": [ { "content": "...", "owner": "...", "due_date": "..." } ] } Logic: Insert into meeting_records. Loop insert meeting_conclusions (自動生成 ID: C-{YYYYMMDD}-{Seq}). Loop insert meeting_action_items (自動生成 ID: A-{YYYYMMDD}-{Seq}). C. Dify 摘要請求 Endpoint: POST /api/ai/summarize Payload: { "transcript": "..." } Logic: 呼叫 Dify API。 Dify Prompt 設定 (System): Plaintext 你是一個會議記錄助手。請根據逐字稿,回傳 JSON 格式。 必要欄位: 1. conclusions (Array): 結論內容 2. action_items (Array): { content, owner, due_date } 若逐字稿未提及日期或負責人,該欄位請留空字串。 D. Excel 匯出 Endpoint: POST /api/meetings/{id}/export Logic: SQL Join 查詢 records, conclusions, action_items。 Load template.xlsx. Replace Placeholders: {{subject}}, {{time}}, {{chair}}... Table Filling: 動態插入 Rows 填寫結論與待辦事項。 Return File Stream.