[feat]:[FL-84][ATP模型管理改造11]

1. 为AtpAsset模型增加避雷器装设组合配置项(arrester_config)
2. 将release zip上传改为异步处理

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
chengkai3
2026-06-12 12:48:33 +08:00
parent c6d547a985
commit da9fd1cd3a
7 changed files with 64 additions and 4 deletions
+6 -3
View File
@@ -159,7 +159,9 @@ def upload_atp_asset_release_endpoint(
archive: UploadFile = File(...),
current_user: CurrentUser = Depends(require_permission("atp.manage")),
db: Session = Depends(get_db),
) -> AtpAssetReleaseDetail:
) -> dict:
from ...tasks.atp_asset_tasks import process_release_archive_upload_task
try:
archive_content = archive.file.read()
finally:
@@ -168,8 +170,7 @@ def upload_atp_asset_release_endpoint(
except Exception:
pass
return create_release_from_archive(
db,
task = process_release_archive_upload_task.delay(
asset_id=asset_id,
release_tag=release_tag,
archive_filename=archive.filename or "release.zip",
@@ -177,6 +178,8 @@ def upload_atp_asset_release_endpoint(
actor_user_id=current_user.user.id,
)
return {"task_id": task.id, "status": "processing"}
@router.get("/releases", response_model=AtpAssetReleaseListResponse)
def get_atp_release_list(
+2
View File
@@ -19,6 +19,7 @@ class AtpAsset(Base):
Index("idx_atp_asset_voltage_level", "voltage_level"),
Index("idx_atp_asset_tower_type", "tower_type"),
Index("idx_atp_asset_scene_type", "scene_type"),
Index("idx_atp_asset_arrester_config", "arrester_config"),
)
id: Mapped[str] = mapped_column(String(32), primary_key=True, default=lambda: uuid4().hex)
@@ -29,6 +30,7 @@ class AtpAsset(Base):
voltage_level: Mapped[str | None] = mapped_column(String(16), index=True)
tower_type: Mapped[str | None] = mapped_column(String(64), index=True)
scene_type: Mapped[str | None] = mapped_column(String(32), index=True)
arrester_config: Mapped[str | None] = mapped_column(String(64), index=True)
tags_json: Mapped[list[str]] = mapped_column(JSON, default=list)
latest_release_no: Mapped[int] = mapped_column(Integer, default=0)
active_release_no: Mapped[int | None] = mapped_column(Integer)
+3
View File
@@ -21,6 +21,7 @@ class AtpAssetSummary(BaseModel):
voltage_level: str | None = None
tower_type: str | None = None
scene_type: str | None = None
arrester_config: str | None = None
latest_release_no: int = 0
active_release_no: int | None = None
active_release_id: str | None = None
@@ -52,6 +53,7 @@ class AtpAssetCreateRequest(BaseModel):
voltage_level: str | None = Field(default=None, max_length=16)
tower_type: str | None = Field(default=None, max_length=64)
scene_type: str | None = Field(default=None, max_length=32)
arrester_config: str | None = Field(default=None, max_length=64)
class AtpAssetUpdateRequest(BaseModel):
@@ -61,6 +63,7 @@ class AtpAssetUpdateRequest(BaseModel):
voltage_level: str | None = Field(default=None, max_length=16)
tower_type: str | None = Field(default=None, max_length=64)
scene_type: str | None = Field(default=None, max_length=32)
arrester_config: str | None = Field(default=None, max_length=64)
class AtpAssetReleaseSummary(BaseModel):
+24
View File
@@ -981,6 +981,30 @@ def create_release_from_archive(
raise
def process_release_archive_upload(
asset_id: str,
release_tag: str | None,
archive_filename: str,
archive_content: bytes,
actor_user_id: str,
) -> dict:
from ..core.database import SessionLocal
db = SessionLocal()
try:
result = create_release_from_archive(
db,
asset_id=asset_id,
release_tag=release_tag,
archive_filename=archive_filename,
archive_content=archive_content,
actor_user_id=actor_user_id,
)
return result.model_dump()
finally:
db.close()
def update_release(
db: Session,
*,
+18 -1
View File
@@ -1,7 +1,7 @@
from __future__ import annotations
from ..core.celery_app import celery_app
from ..services.atp_asset_service import execute_asset_run_job
from ..services.atp_asset_service import execute_asset_run_job, process_release_archive_upload
@celery_app.task(name="app.tasks.atp_asset_tasks.execute_atp_asset_run_job")
@@ -11,3 +11,20 @@ def execute_atp_asset_run_job(
actor_user_id: str | None,
) -> None:
execute_asset_run_job(run_id=run_id, payload_data=payload_data, actor_user_id=actor_user_id)
@celery_app.task(name="app.tasks.atp_asset_tasks.process_release_archive_upload")
def process_release_archive_upload_task(
asset_id: str,
release_tag: str | None,
archive_filename: str,
archive_content: bytes,
actor_user_id: str,
) -> dict:
return process_release_archive_upload(
asset_id=asset_id,
release_tag=release_tag,
archive_filename=archive_filename,
archive_content=archive_content,
actor_user_id=actor_user_id,
)