ai_meeting_minutes.py 4.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from io import BytesIO
  2. from fastapi import APIRouter, HTTPException
  3. from starlette.responses import StreamingResponse
  4. from app.apis.base import Response
  5. from app.models.ai_meeting_minutes import AIMeetingMinutesRecord, AIMeetingConversation, AIMeetingConversationModel, \
  6. AIMeetingMinutesRecordModel, AIMeetingSpeecher
  7. from app.services.ai_meeting_minutes import AIMeetingMinutesRecordService,AIMeetingConversationService
  8. from app.models.common import Page
  9. from app.utils.common import generate_word_document
  10. router = APIRouter()
  11. @router.get("/ai_conversation/{conversation_id}")
  12. async def get_ai_meeting_conversation(conversation_id: str):
  13. return await AIMeetingConversationService.get_ai_meeting_conversation(conversation_id)
  14. @router.post("/ai_conversation/{meeting_id}/list")
  15. async def list_ai_meeting_conversations(meeting_id:str, page: Page):
  16. return await AIMeetingConversationService.list_ai_meeting_conversations(meeting_id, page)
  17. @router.post("/ai_conversation/{meeting_id}")
  18. async def create_ai_meeting_conversation(meeting_id: str, ai_meeting_conversation: AIMeetingConversationModel):
  19. ai_meeting_conversation.meeting_id = meeting_id
  20. ai_meeting_conversation = ai_meeting_conversation.get_create()
  21. res_ai_meeting_conversation = await AIMeetingConversationService.create_ai_meeting_conversation(ai_meeting_conversation)
  22. return {"id": res_ai_meeting_conversation.id}
  23. @router.put("/ai_conversation/{meeting_id}")
  24. async def update_ai_meeting_conversation(meeting_id: int, ai_meeting_conversation: AIMeetingConversationModel):
  25. ai_meeting_conversation.id = meeting_id
  26. await AIMeetingConversationService.update_ai_meeting_conversation(ai_meeting_conversation)
  27. return {"id": ai_meeting_conversation.id}
  28. @router.post("/ai_minutes/{meeting_id}/list", response_model=Response)
  29. async def list_ai_meeting_minutes_records(meeting_id: str, page: Page):
  30. page.page_size = 1000
  31. data_list = await AIMeetingMinutesRecordService.list_ai_meeting_minutes_records(meeting_id, page)
  32. return Response(code=200, msg="success", data={"total": 0,
  33. "rows": [i.to_dict() for i in data_list]})
  34. @router.post("/ai_minutes/conversation", response_model=Response)
  35. async def ai_meeting_minutes_conversation(minutes_record: AIMeetingMinutesRecordModel):
  36. data = {}
  37. status_code = 200
  38. msg = "success"
  39. await AIMeetingMinutesRecordService.create_ai_meeting_minutes_record(
  40. AIMeetingMinutesRecordModel(meeting_id=minutes_record.meeting_id, content=minutes_record.message,
  41. speecher=AIMeetingSpeecher.USER))
  42. new_minutes_record = await AIMeetingMinutesRecordService.edit_meeting_summary(minutes_record.get_conversation())
  43. if new_minutes_record:
  44. print(new_minutes_record)
  45. minutes = await AIMeetingMinutesRecordService.create_ai_meeting_minutes_record(AIMeetingMinutesRecordModel(meeting_id=minutes_record.meeting_id, content=new_minutes_record.get("edited_summary"), speecher=AIMeetingSpeecher.AI))
  46. data = minutes.to_dict()
  47. else:
  48. status_code= 400
  49. msg = "会议纪要信息异常!"
  50. return Response(code=status_code, msg=msg, data=data)
  51. @router.post("/ai_minutes/regenerate", response_model=Response)
  52. async def ai_meeting_minutes_regenerate(minutes_record: AIMeetingMinutesRecordModel):
  53. data = {}
  54. status_code = 200
  55. msg = "success"
  56. # await AIMeetingMinutesRecordService.update_ai_meeting_minutes(minutes_record.get_update())
  57. new_minutes_record = await AIMeetingMinutesRecordService.edit_meeting_summary(minutes_record.get_regenerate())
  58. if new_minutes_record:
  59. print(new_minutes_record)
  60. minutes = await AIMeetingMinutesRecordService.update_ai_meeting_minutes(AIMeetingMinutesRecordModel(id=minutes_record.id, content=new_minutes_record.get("edited_summary")))
  61. data = minutes.to_dict()
  62. else:
  63. status_code= 400
  64. msg = "会议纪要信息异常!"
  65. return Response(code=status_code, msg=msg, data=data)
  66. @router.get("/ai_minutes/{meeting_id}/download", response_model=Response)
  67. async def ai_meeting_minutes_generate_docx(meeting_id: str):
  68. data_list = await AIMeetingMinutesRecordService.ai_meeting_minutes_new_record(meeting_id, Page(page_size=1))
  69. if data_list:
  70. # 创建 Word 文档
  71. doc = await generate_word_document(data_list[0].content)
  72. # 保存到内存缓冲区
  73. buffer = BytesIO()
  74. doc.save(buffer)
  75. buffer.seek(0)
  76. # 返回文件流
  77. return StreamingResponse(buffer,
  78. media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document",
  79. headers={"Content-Disposition": f"attachment; filename={data_list[0].id}.docx"})
  80. raise HTTPException(status_code=400, detail="Failed to generate Word document")