90 lines
2.5 KiB
Python
90 lines
2.5 KiB
Python
"""
|
|
任务命令服务 - 负责任务的创建操作
|
|
"""
|
|
import uuid
|
|
from typing import List
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.core.exception import transaction
|
|
from app.db.models.data_synthesis import (
|
|
DataSynthInstance,
|
|
DataSynthesisFileInstance,
|
|
save_synthesis_task,
|
|
)
|
|
from app.db.models.dataset_management import DatasetFiles
|
|
from app.module.generation.schema.generation import CreateSynthesisTaskRequest
|
|
|
|
|
|
class TaskCreateService:
|
|
"""任务创建服务 - 负责任务的创建操作"""
|
|
|
|
def __init__(self, db: AsyncSession):
|
|
self.db = db
|
|
|
|
async def create(self, request: CreateSynthesisTaskRequest) -> DataSynthInstance:
|
|
"""
|
|
创建数据合成任务
|
|
|
|
Args:
|
|
request: 创建任务请求
|
|
|
|
Returns:
|
|
创建的任务实例
|
|
"""
|
|
dataset_files = await self._query_source_files(request.source_file_id)
|
|
request.source_file_id = [str(f.id) for f in dataset_files]
|
|
|
|
async with transaction(self.db):
|
|
task = await save_synthesis_task(self.db, request)
|
|
await self._create_file_instances(task.id, dataset_files)
|
|
|
|
return task
|
|
|
|
async def _query_source_files(self, file_ids: List[str]) -> List[DatasetFiles]:
|
|
"""
|
|
查询源文件列表
|
|
|
|
Args:
|
|
file_ids: 文件 ID 列表
|
|
|
|
Returns:
|
|
源文件列表
|
|
"""
|
|
if not file_ids:
|
|
return []
|
|
result = await self.db.execute(
|
|
select(DatasetFiles).where(DatasetFiles.id.in_(file_ids))
|
|
)
|
|
return list(result.scalars().all())
|
|
|
|
async def _create_file_instances(
|
|
self, task_id: str, dataset_files: List[DatasetFiles]
|
|
) -> None:
|
|
"""
|
|
创建文件任务实例
|
|
|
|
Args:
|
|
task_id: 任务 ID
|
|
dataset_files: 源文件列表
|
|
"""
|
|
if not dataset_files:
|
|
return
|
|
|
|
file_instances = [
|
|
DataSynthesisFileInstance(
|
|
id=str(uuid.uuid4()),
|
|
synthesis_instance_id=task_id,
|
|
file_name=f.file_name,
|
|
source_file_id=str(f.id),
|
|
status="pending",
|
|
total_chunks=0,
|
|
processed_chunks=0,
|
|
created_by="system",
|
|
updated_by="system",
|
|
)
|
|
for f in dataset_files
|
|
]
|
|
self.db.add_all(file_instances)
|