"""后台检测任务""" import logging from django.conf import settings from django.db import transaction from .checker import run_checks from .llm import ai_summarize from .models import Submission logger = logging.getLogger(__name__) def run_submission(submission_id: int): with transaction.atomic(): submission = Submission.objects.select_for_update().get(pk=submission_id) submission.status = "running" submission.save(update_fields=["status"]) file_path = submission.file.path from pathlib import Path archive = Path(file_path) root = archive.parent llm_override = submission.requirement.llm_config or {} spec = submission.requirement.spec try: report, root = run_checks(archive, spec) try: ai = ai_summarize(str(root), spec, llm_override) except Exception: logger.exception("AI 检测失败") ai = {"summary": "AI 检测执行失败", "issues": []} report["ai_inspection"] = ai report["overall"] = _overall(report) except Exception as exc: logger.exception("检测任务失败") report = {"error": str(exc), "ai_inspection": None} finally: import shutil shutil.rmtree(root, ignore_errors=True) if root != archive.parent: shutil.rmtree(archive.parent, ignore_errors=True) with transaction.atomic(): submission = Submission.objects.get(pk=submission_id) submission.status = "failed" if report.get("error") else "completed" submission.report = report submission.save(update_fields=["status", "report"]) def _overall(report: dict) -> dict: checks = [] stab = report.get("stability", {}) if stab.get("enabled"): checks.append({ "name": "稳定度", "pass": stab.get("pass"), "note": stab.get("reason") or ( f"基准错误率 {stab.get('base_error_rate')}, 加压崩溃率 {stab.get('rampup_crash_rate')}" ), }) perf = report.get("performance", {}) if perf.get("enabled"): checks.append({"name": "性能", "pass": None, "note": perf.get("note", "依赖稳定度数据")}) sec = report.get("security", {}) if sec.get("enabled"): checks.append({"name": "安全", "pass": None, "note": sec.get("note", "由 AI 检测覆盖")}) ai = report.get("ai_inspection") or {} if ai: fail_points = [i for i in ai.get("issues", []) if i.get("status") == "fail"] checks.append({ "name": "AI 检测", "pass": not fail_points if ai.get("issues") is not None else None, "note": ai.get("summary", ""), }) passed = sum(1 for c in checks if c.get("pass") is True) decided = sum(1 for c in checks if c.get("pass") is not None) return { "passed_checks": passed, "decided_checks": decided, "checks": checks, }