修复进度bug

codex/dev
mula.liu 2026-04-15 14:25:46 +08:00
parent f19b70f1d0
commit d2ae4b63c6
7 changed files with 42 additions and 20 deletions

View File

@ -104,7 +104,7 @@ class TranscriptSegment(BaseModel):
class CreateMeetingRequest(BaseModel): class CreateMeetingRequest(BaseModel):
title: str title: str
meeting_time: datetime.datetime meeting_time: datetime.datetime
attendee_ids: List[int] attendee_ids: List[int] = Field(default_factory=list)
description: Optional[str] = None description: Optional[str] = None
tags: Optional[str] = None # 逗号分隔 tags: Optional[str] = None # 逗号分隔
prompt_id: Optional[int] = None prompt_id: Optional[int] = None

View File

@ -29,6 +29,9 @@ class _DefaultTimeoutSession(requests.Session):
class AsyncTranscriptionService: class AsyncTranscriptionService:
"""异步转录服务类""" """异步转录服务类"""
PREPROCESS_COMPLETED_PROGRESS = 50
TRANSCRIPTION_COMPLETED_PROGRESS = 100
def __init__(self): def __init__(self):
self.redis_client = redis.Redis(**REDIS_CONFIG) self.redis_client = redis.Redis(**REDIS_CONFIG)
@ -230,7 +233,7 @@ class AsyncTranscriptionService:
'meeting_id': str(meeting_id), 'meeting_id': str(meeting_id),
'file_url': file_url, 'file_url': file_url,
'status': 'pending', 'status': 'pending',
'progress': '0', 'progress': str(self.PREPROCESS_COMPLETED_PROGRESS),
'created_at': current_time, 'created_at': current_time,
'updated_at': current_time 'updated_at': current_time
} }
@ -528,9 +531,10 @@ class AsyncTranscriptionService:
def _calculate_progress(self, paraformer_status: str) -> int: def _calculate_progress(self, paraformer_status: str) -> int:
"""根据Paraformer状态计算进度""" """根据Paraformer状态计算进度"""
progress_mapping = { progress_mapping = {
'PENDING': 10, # 预处理完成后,转录任务进入云侧排队/执行阶段,统一展示为 50。
'RUNNING': 50, 'PENDING': self.PREPROCESS_COMPLETED_PROGRESS,
'SUCCEEDED': 100, 'RUNNING': self.PREPROCESS_COMPLETED_PROGRESS,
'SUCCEEDED': self.TRANSCRIPTION_COMPLETED_PROGRESS,
'FAILED': 0 'FAILED': 0
} }
return progress_mapping.get(paraformer_status, 0) return progress_mapping.get(paraformer_status, 0)
@ -547,18 +551,31 @@ class AsyncTranscriptionService:
cursor.execute( cursor.execute(
""" """
UPDATE transcript_tasks 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 completed_at = NULL, error_message = NULL
WHERE task_id = %s 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: else:
insert_task_query = """ insert_task_query = """
INSERT INTO transcript_tasks (task_id, paraformer_task_id, meeting_id, status, progress, created_at) 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() connection.commit()
cursor.close() cursor.close()

View File

@ -87,7 +87,12 @@ class AudioUploadTaskService:
f"applied={preprocess_result.applied}" 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 handoff_to_audio_service = True
result = handle_audio_upload( result = handle_audio_upload(

View File

@ -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): def update_meeting(meeting_id: int, meeting_request: UpdateMeetingRequest, current_user: dict):
with get_db_connection() as connection: with get_db_connection() as connection:
cursor = connection.cursor(dictionary=True) 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() meeting = cursor.fetchone()
if not meeting: if not meeting:
return create_api_response(code="404", message="Meeting not found") 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.title,
meeting_request.meeting_time, 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.tags,
meeting_request.prompt_id if meeting_request.prompt_id is not None else meeting['prompt_id'], meeting_request.prompt_id if meeting_request.prompt_id is not None else meeting['prompt_id'],
meeting_id, meeting_id,

View File

@ -57,8 +57,8 @@ const MeetingFormDrawer = ({ open, onClose, onSuccess, meetingId = null }) => {
</Select> </Select>
</Form.Item> </Form.Item>
<Form.Item label="参会人员" name="attendee_ids" rules={[{ required: true, message: '请选择参会人员' }]}> <Form.Item label="参会人员" name="attendee_ids">
<Select mode="multiple" placeholder="参会人"> <Select mode="multiple" placeholder="可不选参会人">
{users.map((u) => ( {users.map((u) => (
<Select.Option key={u.user_id} value={u.user_id}>{u.caption}</Select.Option> <Select.Option key={u.user_id} value={u.user_id}>{u.caption}</Select.Option>
))} ))}

View File

@ -90,7 +90,7 @@ const CreateMeeting = () => {
const payload = { const payload = {
...values, ...values,
meeting_time: values.meeting_time.format('YYYY-MM-DD HH:mm:ss'), meeting_time: values.meeting_time.format('YYYY-MM-DD HH:mm:ss'),
attendee_ids: values.attendee_ids, attendee_ids: values.attendee_ids || [],
tags: values.tags?.join(',') || '' tags: values.tags?.join(',') || ''
}; };
const res = await httpService.post(buildApiUrl(API_ENDPOINTS.MEETINGS.CREATE), payload); const res = await httpService.post(buildApiUrl(API_ENDPOINTS.MEETINGS.CREATE), payload);
@ -162,8 +162,8 @@ const CreateMeeting = () => {
</Col> </Col>
</Row> </Row>
<Form.Item label="参会人员" name="attendee_ids" rules={[{ required: true, message: '请选择参会人员' }]}> <Form.Item label="参会人员" name="attendee_ids">
<Select mode="multiple" size="large" placeholder="参会人"> <Select mode="multiple" size="large" placeholder="可不选参会人">
{users.map(u => <Select.Option key={u.user_id} value={u.user_id}>{u.caption}</Select.Option>)} {users.map(u => <Select.Option key={u.user_id} value={u.user_id}>{u.caption}</Select.Option>)}
</Select> </Select>
</Form.Item> </Form.Item>

View File

@ -58,7 +58,7 @@ const EditMeeting = () => {
const payload = { const payload = {
...values, ...values,
meeting_time: values.meeting_time.format('YYYY-MM-DD HH:mm:ss'), meeting_time: values.meeting_time.format('YYYY-MM-DD HH:mm:ss'),
attendee_ids: values.attendee_ids, attendee_ids: values.attendee_ids || [],
tags: values.tags?.join(',') || '' tags: values.tags?.join(',') || ''
}; };
await httpService.put(buildApiUrl(API_ENDPOINTS.MEETINGS.UPDATE(meeting_id)), payload); await httpService.put(buildApiUrl(API_ENDPOINTS.MEETINGS.UPDATE(meeting_id)), payload);
@ -99,8 +99,8 @@ const EditMeeting = () => {
</Col> </Col>
</Row> </Row>
<Form.Item label="参会人员" name="attendee_ids" rules={[{ required: true, message: '请选择参会人员' }]}> <Form.Item label="参会人员" name="attendee_ids">
<Select mode="multiple" size="large" placeholder="参会人"> <Select mode="multiple" size="large" placeholder="可不选参会人">
{users.map(u => <Select.Option key={u.user_id} value={u.user_id}>{u.caption}</Select.Option>)} {users.map(u => <Select.Option key={u.user_id} value={u.user_id}>{u.caption}</Select.Option>)}
</Select> </Select>
</Form.Item> </Form.Item>