Files
flying-hero 53c3ac487a 📋 飞行侠添加:会议纪要生成
新增:
- meetings/utils.py: 纪要生成工具函数
  - generate_meeting_minutes(): 生成纪要数据
  - export_minutes_to_markdown(): 导出 Markdown
- meetings/views.py: minutes action
  - 支持 JSON 和 Markdown 两种格式
  - 自动统计参会者消息数
  - 提取待办事项
- test_minutes.py: 纪要测试脚本

使用:
- GET /api/v1/meetings/{id}/minutes/ → JSON
- GET /api/v1/meetings/{id}/minutes/?output=markdown → Markdown
2026-04-04 11:39:31 +08:00

101 lines
3.1 KiB
Python

#!/usr/bin/env python3
"""
龙虾议事厅 - 工具函数
"""
from .models import Meeting, Message, Participant
from datetime import datetime
from typing import List, Dict
def generate_meeting_minutes(meeting_id: str) -> Dict:
"""
生成会议纪要
Args:
meeting_id: 会议 ID
Returns:
会议纪要字典
"""
from django.db.models import Count
meeting = Meeting.objects.get(id=meeting_id)
messages = Message.objects.filter(meeting=meeting).select_related('sender').order_by('created_at')
participants = Participant.objects.filter(meeting=meeting, left_at__isnull=True)
# 统计消息数量
message_count = messages.count()
# 统计每个参会者的消息数
participant_stats = {}
for msg in messages:
name = msg.sender.nickname
participant_stats[name] = participant_stats.get(name, 0) + 1
# 生成摘要
if message_count == 0:
summary = "本次会议暂无消息记录。"
else:
# 提取第一条和最后一条消息
first_msg = messages.first()
last_msg = messages.last()
summary = f"会议于 {meeting.created_at.strftime('%Y-%m-%d %H:%M')} 开始,"
summary += f"{message_count} 条消息,{participants.count()} 位参会者。"
if message_count > 0:
summary += f" 第一条消息:\"{first_msg.content[:50]}...\""
summary += f" 最后一条消息:\"{last_msg.content[:50]}...\""
# 生成待办事项(标记为需要回复的消息)
todos = messages.filter(requires_response=True).values_list('content', flat=True)
return {
'meeting_id': meeting.id,
'topic': meeting.topic,
'status': meeting.status,
'created_at': meeting.created_at.isoformat(),
'duration_minutes': None, # 会议结束前无法计算
'participant_count': participants.count(),
'message_count': message_count,
'summary': summary,
'participant_stats': participant_stats,
'todos': list(todos),
'generated_at': datetime.now().isoformat()
}
def export_minutes_to_markdown(minutes: Dict) -> str:
"""
将会话纪要导出为 Markdown 格式
Args:
minutes: generate_meeting_minutes 返回的字典
Returns:
Markdown 格式的会议纪要
"""
md = f"# 📋 会议纪要\n\n"
md += f"**主题:** {minutes['topic']}\n\n"
md += f"**时间:** {minutes['created_at']}\n\n"
md += f"**状态:** {minutes['status']}\n\n"
md += f"**参会人数:** {minutes['participant_count']}\n\n"
md += f"**消息总数:** {minutes['message_count']}\n\n"
md += "## 📊 统计\n\n"
for name, count in minutes['participant_stats'].items():
md += f"- {name}: {count} 条消息\n"
md += "\n## 📝 摘要\n\n"
md += f"{minutes['summary']}\n\n"
if minutes['todos']:
md += "## ✅ 待办事项\n\n"
for todo in minutes['todos']:
md += f"- [ ] {todo}\n"
md += f"\n---\n*生成时间:{minutes['generated_at']}*\n"
return md