feat: 全量功能模块开发与集成测试修复
- 新增后端模块:Alert、APIAsset、Compliance、Lineage、Masking、Risk、SchemaChange、Unstructured、Watermark - 新增前端模块页面与API接口 - 新增Alembic迁移脚本(002-014)覆盖全量业务表 - 新增测试数据生成脚本与集成测试脚本 - 修复metadata模型JSON类型导入缺失导致启动失败的问题 - 修复前端Alert/APIAsset页面request模块路径错误 - 更新docker-compose与开发计划文档
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import json
|
||||
from app.tasks.worker import celery_app
|
||||
|
||||
|
||||
@@ -5,12 +6,10 @@ from app.tasks.worker import celery_app
|
||||
def auto_classify_task(self, project_id: int, source_ids: list = None):
|
||||
"""
|
||||
Async task to run automatic classification on metadata.
|
||||
Phase 1 placeholder.
|
||||
"""
|
||||
from app.core.database import SessionLocal
|
||||
from app.models.project import ClassificationProject, ClassificationResult, ResultStatus
|
||||
from app.models.classification import RecognitionRule
|
||||
from app.models.metadata import DataColumn
|
||||
from app.models.project import ClassificationProject
|
||||
from app.services.classification_engine import run_auto_classification
|
||||
|
||||
db = SessionLocal()
|
||||
try:
|
||||
@@ -18,15 +17,46 @@ def auto_classify_task(self, project_id: int, source_ids: list = None):
|
||||
if not project:
|
||||
return {"status": "failed", "reason": "project not found"}
|
||||
|
||||
# Update project status
|
||||
def progress_callback(scanned, matched, total):
|
||||
percent = int(scanned / total * 100) if total else 0
|
||||
meta = {
|
||||
"scanned": scanned,
|
||||
"matched": matched,
|
||||
"total": total,
|
||||
"percent": percent,
|
||||
}
|
||||
self.update_state(state="PROGRESS", meta=meta)
|
||||
# Persist lightweight progress to DB for UI polling
|
||||
project.scan_progress = json.dumps(meta)
|
||||
db.commit()
|
||||
|
||||
# Initialize
|
||||
project.status = "scanning"
|
||||
project.scan_progress = json.dumps({"scanned": 0, "matched": 0, "total": 0, "percent": 0})
|
||||
db.commit()
|
||||
|
||||
rules = db.query(RecognitionRule).filter(RecognitionRule.is_active == True).all()
|
||||
# TODO: implement rule matching logic in Phase 2
|
||||
result = run_auto_classification(
|
||||
db,
|
||||
project_id,
|
||||
source_ids=source_ids,
|
||||
progress_callback=progress_callback,
|
||||
)
|
||||
|
||||
project.status = "assigning"
|
||||
if result.get("success"):
|
||||
project.status = "assigning"
|
||||
else:
|
||||
project.status = "created"
|
||||
|
||||
project.celery_task_id = None
|
||||
db.commit()
|
||||
return {"status": "completed", "project_id": project_id, "matched": 0}
|
||||
return {"status": "completed", "project_id": project_id, "result": result}
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
project = db.query(ClassificationProject).filter(ClassificationProject.id == project_id).first()
|
||||
if project:
|
||||
project.status = "created"
|
||||
project.celery_task_id = None
|
||||
db.commit()
|
||||
return {"status": "failed", "reason": str(e)}
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
Reference in New Issue
Block a user