From 3f96c9c6502243b06efd4bb34a189e72e3a5557c Mon Sep 17 00:00:00 2001
From: yearning <10538594+wangweifeng1999@user.noreply.gitee.com>
Date: 星期一, 28 九月 2026 19:24:55 +0800
Subject: [PATCH] 复制项目
---
backend/app/routers/admin_import_router.py | 74 +++++++++++++++++++++++++++++++++++++
1 files changed, 74 insertions(+), 0 deletions(-)
diff --git a/backend/app/routers/admin_import_router.py b/backend/app/routers/admin_import_router.py
new file mode 100644
index 0000000..065e247
--- /dev/null
+++ b/backend/app/routers/admin_import_router.py
@@ -0,0 +1,74 @@
+import json
+from datetime import datetime
+
+from fastapi import APIRouter, Depends, File, Form, UploadFile
+from sqlalchemy import func, select
+from sqlalchemy.orm import Session
+
+from app.auth import require_admin
+from app.database import get_db
+from app.import_service import parse_batch_exam_ids, purge_batch, run_import
+from app.models import ExaminationExamExaminee, ExaminationPaperSource, ImportBatch, User
+
+router = APIRouter(prefix="/api/admin/import", tags=["admin-import"])
+
+
+@router.get("/batches")
+def list_batches(
+ db: Session = Depends(get_db),
+ admin: User = Depends(require_admin),
+):
+ batches = db.scalars(select(ImportBatch).order_by(ImportBatch.imported_at.desc())).all()
+ out = []
+ for b in batches:
+ cnt = db.scalar(
+ select(func.count())
+ .select_from(ExaminationExamExaminee)
+ .where(ExaminationExamExaminee.import_batch_id == b.id)
+ )
+ paper_name = None
+ if b.paper_source_id:
+ ps = db.get(ExaminationPaperSource, b.paper_source_id)
+ paper_name = ps.paper_name if ps else None
+ out.append(
+ {
+ "id": b.id,
+ "subject_name": b.subject_name,
+ "exam_id": b.exam_id,
+ "exam_ids": parse_batch_exam_ids(b),
+ "zip_filename": b.zip_filename,
+ "imported_at": b.imported_at.isoformat() if b.imported_at else "",
+ "status": b.status,
+ "attempt_count": cnt or 0,
+ "paper_name": paper_name,
+ "report": json.loads(b.report_json or "{}"),
+ }
+ )
+ return {"items": out}
+
+
+@router.post("")
+async def import_zip(
+ subject_name: str = Form(...),
+ file: UploadFile = File(...),
+ db: Session = Depends(get_db),
+ admin: User = Depends(require_admin),
+):
+ data = await file.read()
+ return run_import(
+ db,
+ subject_name=subject_name,
+ zip_filename=file.filename or "upload.zip",
+ file_bytes=data,
+ user_id=admin.id,
+ )
+
+
+@router.delete("/batches/{batch_id}")
+def delete_batch(
+ batch_id: int,
+ db: Session = Depends(get_db),
+ admin: User = Depends(require_admin),
+):
+ counts = purge_batch(db, batch_id)
+ return {"deleted_counts": counts}
--
Gitblit v1.8.0