You've already forked DataMate
refactor(annotation): 简化文本标注编辑器的段落管理功能
- 移除段落统计相关的数据结构和缓存逻辑 - 删除段落切换确认对话框和自动保存选项 - 简化段落加载和状态管理流程 - 将段落列表视图替换为简单的进度显示 - 更新API接口以支持单段内容获取 - 重构后端服务实现单段内容查询功能
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user