diff --git a/backend/app/models/models.py b/backend/app/models/models.py index d7eeb42..53cda0d 100644 --- a/backend/app/models/models.py +++ b/backend/app/models/models.py @@ -104,7 +104,7 @@ class TranscriptSegment(BaseModel): class CreateMeetingRequest(BaseModel): title: str meeting_time: datetime.datetime - attendee_ids: List[int] + attendee_ids: List[int] = Field(default_factory=list) description: Optional[str] = None tags: Optional[str] = None # 逗号分隔 prompt_id: Optional[int] = None diff --git a/backend/app/services/async_transcription_service.py b/backend/app/services/async_transcription_service.py index 6b22815..c6870f5 100644 --- a/backend/app/services/async_transcription_service.py +++ b/backend/app/services/async_transcription_service.py @@ -29,6 +29,9 @@ class _DefaultTimeoutSession(requests.Session): class AsyncTranscriptionService: """异步转录服务类""" + + PREPROCESS_COMPLETED_PROGRESS = 50 + TRANSCRIPTION_COMPLETED_PROGRESS = 100 def __init__(self): self.redis_client = redis.Redis(**REDIS_CONFIG) @@ -230,7 +233,7 @@ class AsyncTranscriptionService: 'meeting_id': str(meeting_id), 'file_url': file_url, 'status': 'pending', - 'progress': '0', + 'progress': str(self.PREPROCESS_COMPLETED_PROGRESS), 'created_at': current_time, 'updated_at': current_time } @@ -528,9 +531,10 @@ class AsyncTranscriptionService: def _calculate_progress(self, paraformer_status: str) -> int: """根据Paraformer状态计算进度""" progress_mapping = { - 'PENDING': 10, - 'RUNNING': 50, - 'SUCCEEDED': 100, + # 预处理完成后,转录任务进入云侧排队/执行阶段,统一展示为 50。 + 'PENDING': self.PREPROCESS_COMPLETED_PROGRESS, + 'RUNNING': self.PREPROCESS_COMPLETED_PROGRESS, + 'SUCCEEDED': self.TRANSCRIPTION_COMPLETED_PROGRESS, 'FAILED': 0 } return progress_mapping.get(paraformer_status, 0) @@ -547,18 +551,31 @@ class AsyncTranscriptionService: cursor.execute( """ UPDATE transcript_tasks - SET paraformer_task_id = %s, meeting_id = %s, status = 'pending', progress = 0, + SET paraformer_task_id = %s, meeting_id = %s, status = 'pending', progress = %s, completed_at = NULL, error_message = NULL WHERE task_id = %s """, - (paraformer_task_id, meeting_id, business_task_id), + ( + paraformer_task_id, + meeting_id, + self.PREPROCESS_COMPLETED_PROGRESS, + business_task_id, + ), ) else: insert_task_query = """ INSERT INTO transcript_tasks (task_id, paraformer_task_id, meeting_id, status, progress, created_at) - VALUES (%s, %s, %s, 'pending', 0, NOW()) + VALUES (%s, %s, %s, 'pending', %s, NOW()) """ - cursor.execute(insert_task_query, (business_task_id, paraformer_task_id, meeting_id)) + cursor.execute( + insert_task_query, + ( + business_task_id, + paraformer_task_id, + meeting_id, + self.PREPROCESS_COMPLETED_PROGRESS, + ), + ) connection.commit() cursor.close() diff --git a/backend/app/services/audio_upload_task_service.py b/backend/app/services/audio_upload_task_service.py index b1aeb58..c5d35d1 100644 --- a/backend/app/services/audio_upload_task_service.py +++ b/backend/app/services/audio_upload_task_service.py @@ -87,7 +87,12 @@ class AudioUploadTaskService: f"applied={preprocess_result.applied}" ) - self.transcription_service.update_local_processing_task(task_id, "processing", 40, None) + self.transcription_service.update_local_processing_task( + task_id, + "processing", + self.transcription_service.PREPROCESS_COMPLETED_PROGRESS, + None, + ) handoff_to_audio_service = True result = handle_audio_upload( diff --git a/backend/app/services/meeting_service.py b/backend/app/services/meeting_service.py index 53cdddb..5ceaeb0 100644 --- a/backend/app/services/meeting_service.py +++ b/backend/app/services/meeting_service.py @@ -570,7 +570,7 @@ def create_meeting(meeting_request: CreateMeetingRequest, current_user: dict): def update_meeting(meeting_id: int, meeting_request: UpdateMeetingRequest, current_user: dict): with get_db_connection() as connection: cursor = connection.cursor(dictionary=True) - cursor.execute("SELECT user_id, prompt_id FROM meetings WHERE meeting_id = %s", (meeting_id,)) + cursor.execute("SELECT user_id, prompt_id, summary FROM meetings WHERE meeting_id = %s", (meeting_id,)) meeting = cursor.fetchone() if not meeting: return create_api_response(code="404", message="Meeting not found") @@ -585,7 +585,7 @@ def update_meeting(meeting_id: int, meeting_request: UpdateMeetingRequest, curre ( meeting_request.title, meeting_request.meeting_time, - meeting_request.summary, + meeting_request.summary if meeting_request.summary is not None else meeting['summary'], meeting_request.tags, meeting_request.prompt_id if meeting_request.prompt_id is not None else meeting['prompt_id'], meeting_id, diff --git a/frontend/src/components/MeetingFormDrawer.jsx b/frontend/src/components/MeetingFormDrawer.jsx index f05d46b..8bbe5be 100644 --- a/frontend/src/components/MeetingFormDrawer.jsx +++ b/frontend/src/components/MeetingFormDrawer.jsx @@ -57,8 +57,8 @@ const MeetingFormDrawer = ({ open, onClose, onSuccess, meetingId = null }) => { -