"""评查服务实现。 编排 LeAudit 引擎执行链路: 文档 → OCR → Extract → Evaluate → Rescue → Persist """ from fastapi_common.fastapi_common_logger import logger from fastapi_common.fastapi_common_sqlalchemy.database import GetAsyncSession from fastapi_common.fastapi_common_web.domain.responses import StatusCodeEnum from fastapi_common.fastapi_common_web.exception.LeauditException import LeauditException from fastapi_modules.fastapi_leaudit.domian.vo.auditVo import AuditRunVO, AuditResultVO from fastapi_modules.fastapi_leaudit.models import LeauditAuditRun from fastapi_modules.fastapi_leaudit.services import IAuditService class AuditServiceImpl(IAuditService): """评查服务实现。""" async def Run(self, DocumentId: int, RuleType: str | None = None, Force: bool = False) -> AuditRunVO: """触发文档评查。 实际执行流程由 Celery 任务异步处理。 """ async with GetAsyncSession() as session: # TODO: 从 bridge 层获取 pipeline,提交 Celery 任务 logger.info(f"触发评查: documentId={DocumentId}, ruleType={RuleType}") raise LeauditException(StatusCodeEnum.HTTP_500_INTERNAL_SERVER_ERROR, "Celery 任务集成待实现") async def GetRunStatus(self, RunId: int) -> AuditRunVO: """查询评查运行状态。""" async with GetAsyncSession() as session: run = await session.get(LeauditAuditRun, RunId) if not run: raise LeauditException(StatusCodeEnum.HTTP_404_NOT_FOUND, "评查运行记录不存在") return AuditRunVO( runId=run.Id, documentId=run.documentId, runNo=run.runNo, status=run.status, phase=run.phase, totalScore=float(run.totalScore) if run.totalScore else None, passedCount=run.passedCount, failedCount=run.failedCount, startedAt=run.startedAt, finishedAt=run.finishedAt, ) async def GetResult(self, RunId: int) -> AuditResultVO: """获取评查结果。""" async with GetAsyncSession() as session: run = await session.get(LeauditAuditRun, RunId) if not run: raise LeauditException(StatusCodeEnum.HTTP_404_NOT_FOUND, "评查运行记录不存在") # TODO: 从 leaudit_rule_results 表查询规则级结果 return AuditResultVO( runId=run.Id, totalScore=float(run.totalScore) if run.totalScore else None, passedCount=run.passedCount or 0, failedCount=run.failedCount or 0, skippedCount=run.skippedCount or 0, phase=run.phase, rescueApplied=run.rescueApplied or False, rules=[], )