File size: 2,608 Bytes
b4f2238 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | from __future__ import annotations
import logging
from uuid import UUID
from apps.core.services.storage_service import normalize_to_media_rel
from apps.pdf_splitting.models import PdfSplitJob, PdfSplitJobStatus, PdfSplitMode
from apps.pdf_splitting.services import PdfSplitJobService, PdfSplitService
from apps.pdf_splitting.services.storage import PdfSplitStorage
logger = logging.getLogger("apps.pdf_splitting")
def execute_pdf_split_job(job_id: str) -> None:
job_service = PdfSplitJobService()
split_service = PdfSplitService()
job_uuid = UUID(job_id)
try:
job = job_service.get_job(job_uuid)
job.refresh_from_db(fields=["split_mode"])
# 手动拆分模式跳过后台分析,直接进入待复核状态
if job.split_mode == PdfSplitMode.MANUAL_SPLIT:
PdfSplitJob.objects.filter(id=job.id).update(
status=PdfSplitJobStatus.REVIEW_REQUIRED,
progress=100,
)
return
split_service.analyze_job(job)
job.refresh_from_db(fields=["split_mode", "status", "cancel_requested"])
if (
job.split_mode == PdfSplitMode.PAGE_SPLIT
and job.status == PdfSplitJobStatus.REVIEW_REQUIRED
and not job.cancel_requested
):
split_service.export_job(job)
storage = PdfSplitStorage(job.id)
job.refresh_from_db(fields=["status", "cancel_requested"])
if job.cancel_requested:
return
job_service.mark_completed(
job_id=job_uuid,
export_zip_relpath=normalize_to_media_rel(storage.export_zip_path.as_posix()),
)
except Exception as exc:
logger.exception("pdf_split_job_failed", extra={"job_id": job_id})
job_service.mark_failed(job_id=job_uuid, error_message=str(exc))
def export_pdf_split_job(job_id: str) -> None:
job_service = PdfSplitJobService()
split_service = PdfSplitService()
job_uuid = UUID(job_id)
try:
job = job_service.get_job(job_uuid)
split_service.export_job(job)
storage = PdfSplitStorage(job.id)
job.refresh_from_db(fields=["status", "cancel_requested"])
if job.cancel_requested:
return
job_service.mark_completed(
job_id=job_uuid, export_zip_relpath=normalize_to_media_rel(storage.export_zip_path.as_posix())
)
except Exception as exc:
logger.exception("pdf_split_export_failed", extra={"job_id": job_id})
job_service.mark_failed(job_id=job_uuid, error_message=str(exc))
|