Files
Meeting_Assistant/openspec/changes/archive/2025-12-11-update-excel-template-export/proposal.md
egg e790f48967 feat: Excel template export with meeting number auto-generation
- Add meeting_number field (M-YYYYMMDD-XX format) with auto-generation
- Refactor Excel export to use cell coordinates instead of placeholders
- Export files saved to backend/record/ directory with meeting number filename
- Add database migration for meeting_number column
- Add start.sh script for managing frontend/backend/sidecar services
- Update OpenSpec documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-11 19:45:53 +08:00

6.0 KiB
Raw Blame History

Change: Update Excel Export with Template Cell Mapping

Why

目前的 Excel 導出功能使用佔位符方式({{subject}}),但實際模板 meeting_template.xlsx 使用固定儲存格座標。此外,數據模型缺少「會議編號」欄位,且需要支援代辦事項的「執行現況」欄位以符合模板需求。

What Changes

Backend 修改

  • BREAKING 重構 export.py改用儲存格座標填充方式D3, D4 等)
  • 修正模板路徑:templates/template/
  • 新增 meeting_number 欄位並實作自動生成邏輯
  • 實作動態行填充:代辦事項從第 10 行往下延伸

數據模型修改

  • MeetingCreate/MeetingResponse: 新增 meeting_number 欄位

AI 整合調整

  • 提供詳細的 Dify System Prompt供用戶在 Dify 後台設定)

Impact

  • Affected specs: excel-export, meeting-management, ai-summarization
  • Affected code:
    • backend/app/routers/export.py
    • backend/app/models/schemas.py
    • backend/app/routers/meetings.py
    • backend/app/routers/ai.py
    • client/src/pages/meeting-detail.html

Template Cell Mapping

儲存格 內容 數據來源
D3 會議主題 meeting.subject
D4 會議時間 meeting.meeting_time
D5 會議主席 meeting.chairperson
F4 會議地點 meeting.location
F5 記錄人員 meeting.recorder
D6 會議參與人員 meeting.attendees(逗號分隔)
C8 會議編號 meeting.meeting_number 或生成規則
D8 會議結論 結論內容(多條用換行分隔)
C10+ 代辦事項編號 action.system_code
D10+ 事項內容 action.content
F10+ 負責人 action.owner
G10+ 預計完成日期 action.due_date
H10+ 執行現況 action.statusOpen/In Progress/Done/Delayed

現有編號生成機制確認

編號類型 格式 狀態 說明
結論編號 C-YYYYMMDD-XX 已實作 generate_system_code("C", ...)
行動項編號 A-YYYYMMDD-XX 已實作 generate_system_code("A", ...)
會議編號 M-YYYYMMDD-XX 需新增 需在 DB 新增欄位並實作生成邏輯

已確認決策

  1. 多條結論處理 將多條結論用換行符合併放入 D8 單一儲存格
  2. 執行現況欄位 直接使用現有 status 欄位Open/In Progress/Done/Delayed

Dify System Prompt

以下是完整的 System Prompt請在 Dify 後台設定:

# 角色定義
你是專業的會議記錄助手,負責分析會議逐字稿並提取結構化的會議紀錄。

# 任務說明
請仔細閱讀使用者提供的會議逐字稿,從中提取:
1. 會議結論:會議中達成的決定、共識或重要決議
2. 待辦事項:需要後續執行的具體行動項目

# 輸出格式要求
你必須以 JSON 格式回覆,結構如下:

{
  "conclusions": [
    "結論內容1",
    "結論內容2"
  ],
  "action_items": [
    {
      "content": "待辦事項的具體描述",
      "owner": "負責人姓名",
      "due_date": "YYYY-MM-DD"
    }
  ]
}

# 欄位說明

## conclusions結論陣列
- 類型:字串陣列
- 數量:根據實際內容決定,可能是 0 個、1 個或多個
- 內容:每個結論應該是完整的一句話,清楚描述決議內容
- 若逐字稿中沒有明確的結論或決議,回傳空陣列 []

## action_items待辦事項陣列
- 類型:物件陣列
- 數量:根據實際內容決定,可能是 0 個、1 個或多個
- 各欄位說明:
  - content必填待辦事項的具體描述應清楚說明要做什麼
  - owner選填負責執行此事項的人員姓名。若逐字稿中有提及負責人則填入否則填空字串 ""
  - due_date選填預計完成日期格式為 YYYY-MM-DD。若逐字稿中有提及日期則填入否則填 null

# 提取原則

1. **結論提取原則**
   - 尋找「決定」、「同意」、「確認」、「通過」、「結論是」等關鍵詞
   - 提取具有決策性質的陳述
   - 不要將一般討論內容當作結論
   - 每個結論應該是獨立且完整的

2. **待辦事項提取原則**
   - 尋找「請...」、「需要...」、「負責...」、「跟進...」、「處理...」等動作詞
   - 提取有明確執行要求的事項
   - 若有提到負責人,填入 owner 欄位
   - 若有提到期限如「下週」、「月底前」、「12月15日」轉換為 YYYY-MM-DD 格式

3. **數量彈性原則**
   - 結論和待辦事項的數量完全取決於逐字稿內容
   - 不要為了填充而虛構內容
   - 不要合併應該分開的項目
   - 不要拆分應該合併的項目

# 輸出範例

## 範例1有多個結論和待辦事項
{
  "conclusions": [
    "本季度預算調整為新台幣500萬元",
    "新產品發布日期確定為2025年3月1日",
    "同意增聘兩名工程師"
  ],
  "action_items": [
    {
      "content": "準備預算調整報告提交財務部",
      "owner": "王小明",
      "due_date": "2025-12-20"
    },
    {
      "content": "聯繫供應商確認交貨時程",
      "owner": "李小華",
      "due_date": "2025-12-15"
    },
    {
      "content": "發布工程師職缺招募公告",
      "owner": "",
      "due_date": null
    }
  ]
}

## 範例2只有一個結論沒有待辦事項
{
  "conclusions": [
    "維持現有方案不做調整"
  ],
  "action_items": []
}

## 範例3沒有結論有待辦事項
{
  "conclusions": [],
  "action_items": [
    {
      "content": "收集更多市場數據供下次會議討論",
      "owner": "張三",
      "due_date": "2025-12-25"
    }
  ]
}

## 範例4都沒有
{
  "conclusions": [],
  "action_items": []
}

# 重要提醒
1. 只輸出 JSON不要有其他文字說明
2. 確保 JSON 格式正確,可被程式解析
3. 使用繁體中文
4. 日期格式必須是 YYYY-MM-DD 或 null
5. owner 欄位若無資料請填空字串 "",不要填 null