修复进度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):
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

View File

@ -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()

View File

@ -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(

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):
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,

View File

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

View File

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

View File

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