From b82e005b7ce7bfba1c95f8461440361a47018c52 Mon Sep 17 00:00:00 2001 From: chengkai3 Date: Sun, 28 Jun 2026 10:27:46 +0800 Subject: [PATCH] =?UTF-8?q?[feat]:[FL-205][ATP=E6=A8=A1=E5=9E=8B=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=AD=98=E5=82=A8=E6=94=B9=E9=80=A0]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 releases 层级 - 新增 voltage_level(电压等级)和 tower_type(塔型)作为目录层级 - 修改存储路径结构:/atp-library/{voltage_level}/{tower_type}/{asset_code}/r{release_no} - 更新相关测试用例 Co-Authored-By: Claude Sonnet 4.6 Co-authored-by: multica-agent --- api/app/services/atp_asset_service.py | 10 ++++++---- api/tests/test_atp_asset_service.py | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/api/app/services/atp_asset_service.py b/api/app/services/atp_asset_service.py index 5c443df..6bcfd0e 100644 --- a/api/app/services/atp_asset_service.py +++ b/api/app/services/atp_asset_service.py @@ -64,7 +64,7 @@ VALID_RELEASE_STATUS = {"draft", "released", "archived"} VALID_RUNNER_KIND = {"atp", "egm", "hybrid"} VALID_RUN_STATUS = {"pending", "running", "success", "failed"} LOG_MAX_CHARS = 200_000 -ATP_ASSET_RELEASES_ROOT = "/atp-library/releases" +ATP_ASSET_RELEASES_ROOT = "/atp-library" @dataclass(slots=True) @@ -349,9 +349,11 @@ def _sanitize_storage_segment(value: str, *, fallback: str) -> str: return normalized or fallback -def _build_release_storage_root(asset_code: str, release_no: int) -> str: +def _build_release_storage_root(asset_code: str, release_no: int, voltage_level: str, tower_type: str) -> str: asset_segment = _sanitize_storage_segment(asset_code, fallback="asset") - return normalize_virtual_path(f"{ATP_ASSET_RELEASES_ROOT}/{asset_segment}/r{release_no}") + voltage_segment = _sanitize_storage_segment(voltage_level, fallback="unknown-voltage") + tower_segment = _sanitize_storage_segment(tower_type, fallback="unknown-tower") + return normalize_virtual_path(f"{ATP_ASSET_RELEASES_ROOT}/{voltage_segment}/{tower_segment}/{asset_segment}/r{release_no}") def _write_archive_to_storage( @@ -1045,7 +1047,7 @@ def create_release_from_archive( next_release_no = int( db.scalar(select(func.max(AtpAssetRelease.release_no)).where(AtpAssetRelease.asset_id == asset_id)) or 0 ) + 1 - storage_root_path = _build_release_storage_root(asset.code, next_release_no) + storage_root_path = _build_release_storage_root(asset.code, next_release_no, voltage_level, tower_type) mount = _resolve_mount(db, "main") driver = _build_driver_or_400(mount) diff --git a/api/tests/test_atp_asset_service.py b/api/tests/test_atp_asset_service.py index 1003b8a..de83b7f 100644 --- a/api/tests/test_atp_asset_service.py +++ b/api/tests/test_atp_asset_service.py @@ -140,14 +140,14 @@ def test_create_release_from_archive_extracts_zip_and_inherits_asset_dimensions( assert created.release_no == 1 assert created.release_tag == "首版" - assert created.storage_root_path == "/atp-library/releases/ATP-ASSET-UPLOAD/r1" + assert created.storage_root_path == "/atp-library/220/sihuita/ATP-ASSET-UPLOAD/r1" assert created.entry_file == "work.atp" assert created.runner_kind == "hybrid" assert created.voltage_level == "220" assert created.tower_type == "sihuita" assert created.scene_type == "raoji3" - assert (tmp_path / "vfs" / "atp-library" / "releases" / "ATP-ASSET-UPLOAD" / "r1" / "work.atp").exists() - assert (tmp_path / "vfs" / "atp-library" / "releases" / "ATP-ASSET-UPLOAD" / "r1" / "EGM" / "config.txt").exists() + assert (tmp_path / "vfs" / "atp-library" / "220" / "sihuita" / "ATP-ASSET-UPLOAD" / "r1" / "work.atp").exists() + assert (tmp_path / "vfs" / "atp-library" / "220" / "sihuita" / "ATP-ASSET-UPLOAD" / "r1" / "EGM" / "config.txt").exists() finally: session.close()