perf(m02): 구조물 조합 고르기 모달 로딩 — 목록 그 폴더만 · 후보 찾기 기억 · 사본 읽기 · 셈 한 번(156-2)

- 까닭: 복사본 목록이 사본마다 원본 단가 묶음을 다시 모음(자재 후보 찾기 같은 조건 되풀이 · m01.logic 검사)
- 목록 ?folder= = 그 복사본 하나만 원본 대조 · 모달은 고르는 구조물 폴더만
- 재료 후보 찾기 = 마스터 색인 하나에 같은 조건 한 번 · 로직 파일 이름만 찾음
- 모달 한 번 보이는 동안 사본 부분 · 셈 한 번만(카드 · 일위대가 · 상태 줄 공유)
- 사본 7개 모달 열기 13.4초 → 처음 0.43초 · 다시 0.06초 · 원본판 · 단가 묶음 전후 같음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JywHxQuWPk6UYXTebyrBoU
This commit is contained in:
2026-10-09 20:51:44 +09:00
co-authored by Claude Opus 5.5
parent 6b0c1a889f
commit bd963e383e
8 changed files with 207 additions and 29 deletions
@@ -1,7 +1,8 @@
"""프로젝트 구조물 집계 항목 복사본 길 — `/api/projects/{id}/items…` (PLAN 25-1b · 26-1 · 26-2b).
폴더 = 구조물 id(`structure_id` · 관 지점은 `pipe@측점`) — 같은 항목을 고른 구조물도 복사본은 따로.
GET …/items 목록(원본 · 가져온날 · 마스터바뀜 · 원본없음)
GET …/items[?folder=] 목록(원본 · 가져온날 · 마스터바뀜 · 원본없음) ·
folder = 그 폴더 하나만(고르기 모달)
POST …/items {structure, layer, owner, key} 미리 가져오기 → {폴더, 만듦, 가져온날}
POST …/items/new {structure, 경로, 이름, 단위} 새 항목(개인 층에도) · 회사 없음 409
GET …/items/{폴더}/{종류} {종류, 판, 내용}
@@ -103,9 +104,12 @@ async def _run(fn, *args):
@router.get("/{project_id}/items")
async def list_items(
project_id: str, session: dict[str, Any] = Depends(verify_session)
project_id: str,
folder: str | None = None,
session: dict[str, Any] = Depends(verify_session),
) -> dict[str, Any]:
return {"항목": await _run(copies.list_items, await _root(session, project_id))}
root = await _root(session, project_id)
return {"항목": await _run(copies.list_items, root, folder)}
@router.post("/{project_id}/items")