feat:[FL-158][ATP模型管理页面一致性优化]

Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
chengkai3
2026-06-20 08:01:54 +08:00
parent 90309ee0e4
commit b2dd07d8e8
6 changed files with 364 additions and 144 deletions
+4
View File
@@ -59,6 +59,8 @@ def get_atp_asset_list(
voltage_level: str | None = Query(default=None),
tower_type: str | None = Query(default=None),
scene_type: str | None = Query(default=None),
limit: int = Query(default=50, ge=1, le=200),
offset: int = Query(default=0, ge=0),
_: CurrentUser = Depends(require_any_permission("atp.read", "atp.run", "atp.manage")),
db: Session = Depends(get_db),
) -> AtpAssetListResponse:
@@ -69,6 +71,8 @@ def get_atp_asset_list(
voltage_level=voltage_level,
tower_type=tower_type,
scene_type=scene_type,
limit=limit,
offset=offset,
)
+11 -1
View File
@@ -496,6 +496,7 @@ def serialize_asset(
voltage_level=item.voltage_level,
tower_type=item.tower_type,
scene_type=item.scene_type,
arrester_config=item.arrester_config,
latest_release_no=item.latest_release_no,
active_release_no=item.active_release_no,
active_release_id=active_release.id if active_release else None,
@@ -653,6 +654,8 @@ def list_assets(
voltage_level: str | None,
tower_type: str | None,
scene_type: str | None,
limit: int = 50,
offset: int = 0,
) -> AtpAssetListResponse:
stmt = select(AtpAsset)
total_stmt = select(func.count()).select_from(AtpAsset)
@@ -681,7 +684,11 @@ def list_assets(
stmt = stmt.where(AtpAsset.scene_type == scene_type.strip())
total_stmt = total_stmt.where(AtpAsset.scene_type == scene_type.strip())
items = db.execute(stmt.order_by(AtpAsset.update_date.desc(), AtpAsset.code.asc())).scalars().all()
items = db.execute(
stmt.order_by(AtpAsset.update_date.desc(), AtpAsset.code.asc())
.limit(limit)
.offset(offset)
).scalars().all()
total = int(db.scalar(total_stmt) or 0)
asset_ids = [item.id for item in items]
release_count_map = _load_asset_release_count_map(db, asset_ids)
@@ -729,6 +736,7 @@ def create_asset(db: Session, payload: AtpAssetCreateRequest, *, actor_user_id:
voltage_level=_normalize_optional_str(payload.voltage_level),
tower_type=_normalize_optional_str(payload.tower_type),
scene_type=_normalize_optional_str(payload.scene_type),
arrester_config=_normalize_optional_str(payload.arrester_config),
latest_release_no=0,
active_release_no=None,
create_user=actor_user_id,
@@ -771,6 +779,8 @@ def update_asset(
item.tower_type = _normalize_optional_str(update_data["tower_type"])
if "scene_type" in update_data:
item.scene_type = _normalize_optional_str(update_data["scene_type"])
if "arrester_config" in update_data:
item.arrester_config = _normalize_optional_str(update_data["arrester_config"])
item.update_user = actor_user_id
item.update_date = utcnow()
+40
View File
@@ -177,6 +177,46 @@ def test_create_release_from_archive_requires_asset_dimensions(tmp_path) -> None
session.close()
def test_list_assets_paginates_after_filtering(tmp_path) -> None:
testing_session = _build_sessionmaker()
session: Session = testing_session()
try:
_seed_vfs_mount(session, root_dir=tmp_path / "vfs")
for index in range(4):
created = atp_asset_service.create_asset(
session,
AtpAssetCreateRequest(
code=f"ATP-ASSET-PAGE-{index}",
name=f"分页模型 {index}",
voltage_level="220",
tower_type="sihuita",
scene_type="fanji",
arrester_config="M123",
),
actor_user_id="tester",
)
assert created is not None
assert created.arrester_config == "M123"
result = atp_asset_service.list_assets(
session,
keyword="分页模型",
status_filter=None,
voltage_level=None,
tower_type=None,
scene_type=None,
limit=2,
offset=1,
)
assert result.total == 4
assert len(result.items) == 2
assert [item.code for item in result.items] == ["ATP-ASSET-PAGE-2", "ATP-ASSET-PAGE-1"]
assert [item.arrester_config for item in result.items] == ["M123", "M123"]
finally:
session.close()
def test_run_release_dry_run_materializes_directory(tmp_path, monkeypatch) -> None:
testing_session = _build_sessionmaker()
monkeypatch.setattr(core_database, "SessionLocal", testing_session)