refactor(annotation): 简化文本标注编辑器的段落管理功能

- 移除段落统计相关的数据结构和缓存逻辑
- 删除段落切换确认对话框和自动保存选项
- 简化段落加载和状态管理流程
- 将段落列表视图替换为简单的进度显示
- 更新API接口以支持单段内容获取
- 重构后端服务实现单段内容查询功能
This commit is contained in:
2026-02-04 18:08:14 +08:00
parent 707e65b017
commit fa9e9d9f68
5 changed files with 98 additions and 421 deletions

View File

@@ -36,8 +36,9 @@ from app.module.annotation.schema.editor import (
EditorProjectInfo,
EditorTaskListItem,
EditorTaskListResponse,
EditorTaskSegmentResponse,
EditorTaskResponse,
EditorTaskSegmentsResponse,
SegmentDetail,
SegmentInfo,
UpsertAnnotationRequest,
UpsertAnnotationResponse,
@@ -713,18 +714,19 @@ class AnnotationEditorService:
return await self._build_text_task(project, file_record, file_id, segment_index)
async def get_task_segments(
async def get_task_segment(
self,
project_id: str,
file_id: str,
) -> EditorTaskSegmentsResponse:
segment_index: int,
) -> EditorTaskSegmentResponse:
project = await self._get_project_or_404(project_id)
dataset_type = self._normalize_dataset_type(await self._get_dataset_type(project.dataset_id))
if dataset_type != DATASET_TYPE_TEXT:
raise HTTPException(
status_code=400,
detail="当前仅支持 TEXT 项目的段落摘要",
detail="当前仅支持 TEXT 项目的段落内容",
)
file_result = await self.db.execute(
@@ -738,7 +740,12 @@ class AnnotationEditorService:
raise HTTPException(status_code=404, detail=f"文件不存在或不属于该项目: {file_id}")
if not self._resolve_segmentation_enabled(project):
return EditorTaskSegmentsResponse(segmented=False, segments=[], totalSegments=0)
return EditorTaskSegmentResponse(
segmented=False,
segment=None,
totalSegments=0,
currentSegmentIndex=0,
)
text_content = await self._fetch_text_content_via_download_api(project.dataset_id, file_id)
assert isinstance(text_content, str)
@@ -768,7 +775,12 @@ class AnnotationEditorService:
len(text or "") > self.SEGMENT_THRESHOLD for text in record_texts
)
if not needs_segmentation:
return EditorTaskSegmentsResponse(segmented=False, segments=[], totalSegments=0)
return EditorTaskSegmentResponse(
segmented=False,
segment=None,
totalSegments=0,
currentSegmentIndex=0,
)
ann_result = await self.db.execute(
select(AnnotationResult).where(
@@ -782,16 +794,42 @@ class AnnotationEditorService:
segment_annotations = self._extract_segment_annotations(ann.annotation)
segment_annotation_keys = set(segment_annotations.keys())
segments, _ = self._build_segment_contexts(
segments, segment_contexts = self._build_segment_contexts(
records,
record_texts,
segment_annotation_keys,
)
return EditorTaskSegmentsResponse(
total_segments = len(segment_contexts)
if total_segments == 0:
return EditorTaskSegmentResponse(
segmented=False,
segment=None,
totalSegments=0,
currentSegmentIndex=0,
)
if segment_index < 0 or segment_index >= total_segments:
raise HTTPException(
status_code=400,
detail=f"segmentIndex 超出范围: {segment_index}",
)
segment_info = segments[segment_index]
_, _, segment_text, line_index, chunk_index = segment_contexts[segment_index]
segment_detail = SegmentDetail(
idx=segment_info.idx,
text=segment_text,
hasAnnotation=segment_info.has_annotation,
lineIndex=line_index,
chunkIndex=chunk_index,
)
return EditorTaskSegmentResponse(
segmented=True,
segments=segments,
totalSegments=len(segments),
segment=segment_detail,
totalSegments=total_segments,
currentSegmentIndex=segment_index,
)
async def _build_text_task(