From 50f07f007b8f6f2571ef58dd8f2886c03428a6fb Mon Sep 17 00:00:00 2001 From: umsangdon Date: Fri, 30 Oct 2026 06:28:06 +0900 Subject: [PATCH] =?UTF-8?q?chore(=EA=B3=84=ED=9A=8D):=20=EC=9A=94=EA=B5=AC?= =?UTF-8?q?=20451=20=EB=B6=84=EC=84=9D=20=E2=80=94=20=EC=98=88=EC=A0=95?= =?UTF-8?q?=EB=85=B8=EC=84=A0=20=EC=98=81=EA=B5=AC=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=ED=95=AD=EB=AA=A9=20=C2=B7=20=EB=88=88=EC=97=AC=EA=B2=A8?= =?UTF-8?q?=EB=B3=BC=20=EC=A0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../요구_1025/_분석_451_예정노선_영구저장.md | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 docs/raw/요구_1025/_분석_451_예정노선_영구저장.md diff --git a/docs/raw/요구_1025/_분석_451_예정노선_영구저장.md b/docs/raw/요구_1025/_분석_451_예정노선_영구저장.md new file mode 100644 index 000000000..e2d1db92c --- /dev/null +++ b/docs/raw/요구_1025/_분석_451_예정노선_영구저장.md @@ -0,0 +1,140 @@ +# 요구 451 — 예정노선(D 그룹) 영구 저장 항목 + +- 실측 = 검증_sub1_D `a317db7c-f33d-4c1c-954f-62dceec35b75`(`storage/1/3/…` · 61 MB) · DB 는 읽기만. +- sub1_D 에 없는 지도 겹 저장본은 검증_sub2_D `1b628fec-66a4-4a75-8935-6ba9b2639089`(82 MB) 실측으로 보탬. +- 성격 말 — **정본** = 사용자가 정한 값(다시 셀 수 없음) · **사본** = 정본에서 서버가 다시 센 값(DB 에 굳힘) · **받은 자료** = 외부(브이월드 · 행안부 등)에서 받은 것(지우면 다시 받음 · 외부가 바뀌면 값도 바뀜) · **파생** = `_derived` 지문 열쇠 저장본(지우면 다시 셈). + +## 0. 한눈에 + +- 사용자가 만든 값(정본)은 DB 에만 — 프로젝트 칸 · 지점 목록 · 노선 정본 · 지정 업체 · 확정 / 발송 시각. storage 정본은 올린 임도망도 파일 하나뿐. +- storage 의 나머지(sub1_D 61 MB)는 전부 받은 자료 · 파생 — 지형면 26 MB · 위성 한 장 10 MB · 도엽 겹 13 MB · 지적도 4 MB · 저장본 6 MB. +- 내보내기 zip · 확정 메일 첨부는 저장 안 함 — 누를 때마다 DB 노선으로 새로 만듦. + +## 1. 페이지별 영구 저장 + +### D01 등록 + +| 무엇 | 어디 | 언제 | 성격 | 크기(sub1_D) | +| --- | --- | --- | --- | --- | +| 이름 · 사업 지역 · 시작 연도 · 끝 연도(= 시작) · 설계속도 20 · 종류 PLAN | `projects.name` · `region` · `project_year` · `project_year_end` · `design_speed_kph` · `project_kind` | [등록] `POST /api/d01/project` | 정본 | 한 줄 | +| 저장 경로 · 좌표계 | `projects.storage_path` · `crs_epsg`(= 5178 고정) | 같음 | 틀 | — | +| 참여자 | `project_members` | 같음 | 정본 | 1 줄 | +| 단계 표 | `project_workflow_stages`(PLAN_BASE · PLAN_ANALYSIS · PLAN_CONFIRM) | 같음 | 틀 | 3 줄 | +| 작업 기록 | `system_audit_logs` PROJECT_CREATE | 같음 | 기록 | 한 줄(복제본은 없음) | +| 프로젝트 폴더 | `storage/<회사>/<사용자>//` 아래 `D02_PlanBase` · `D03_PlanAnalysis` · `D04_PlanConfirm` · `B04_PreProcess` 빈 폴더 | 같음 | 틀 | 0 | + +### D02 기준 지정 + +| 무엇 | 어디 | 언제 | 성격 | 크기 | +| --- | --- | --- | --- | --- | +| 지점 목록(점마다 TM x · y + 좌표계 하나) | `projects.plan_base_json` `{"epsg", "points": [{x, y}]}` | [저장] · [>] · 떠남 물음 [저장] = `PUT …/plan/points` | 정본 | 127 B(2 점) | + +- storage 쓰기 없음(`D02_PlanBase` 폴더는 늘 빔). +- 옛 꼴(`starts` · `ends` · `start` · `end`)은 읽을 때만 이어 붙임 · 칸이 비면 연도 행 시점 · 종점을 접어 보임. + +### D03 노선분석 — (가) 노선(DB) + +| 무엇 | 어디 | 언제 | 성격 | 크기 | +| --- | --- | --- | --- | --- | +| 노선 정본 — 그은 선 · 갈래 · 연도 마커 · 조각 연도 | `plan_networks.network_json` `{epsg, lines, marks, pieces}` | [저장] `PUT …/plan/network` · [초기화] = 빈 선으로 같은 PUT | 정본 | 1,033 B | +| 조각(구역 × 갈래) 한 줄씩 — 선 위 거리 · 길이 · 좌표 · 측점 · 지문 | `plan_route_pieces` | 같음(지우고 다시 넣음) | 사본 | 4 줄 · 270~381 B | +| 연도 행 — 그 연도 조각 묶음 · 첫 조각 시점 · 종점 · 지문 | `plan_route_years.route_json` · `fingerprint` · `start_x`~`end_y` · `epsg` | 같음(내용 바뀐 연도만 확정 풂) | 사본 | 4 줄(1 줄 빈 값) · 522~958 B | +| 사업연도 끝 | `projects.project_year_end` = 조각 최대 연도 | 같음 | 사본 | — | +| 지점 굳히기 | `projects.plan_base_json`(빌 때만) | 같음 | 정본 | — | + +- 길이 · 측점 · 높이는 정본에 안 넣음(늘 다시 셈) — 조각 · 연도 행에는 들어감. + +### D03 노선분석 — (나) 지형 받기(storage + DB) + +언제 = 들어올 때 받은 범위가 지점을 못 덮으면 자동 · [이 범위 받기] · [범위 밖 더 받기] = `POST …/plan/terrain`. + +| 무엇 | 어디(`B04_PreProcess/…`) | 성격 | 크기(sub1_D) | +| --- | --- | --- | --- | +| 수치지형도 도엽 원본 | `processed/map_sheets/*.zip` + `map_sheets_index.json` | 받은 자료 | 2 매 · 2.3 MB | +| 도엽 겹 병합본(등고선 · 하천 · 도로 …) | `processed/도엽_<겹>.geojson` + `sheet_merge.key.json` | 도엽에서 다시 셈(열쇠) | 7.9 MB | +| 도엽 겹 표시용 사본 | `processed/도엽_<겹>.display.geojson`(겹 켤 때 · B04 자리) | 다시 셈(수정시각) | 4.7 MB | +| 위성 한 장 | `processed/vworld_satellite.png` + `_meta.json` | 받은 자료 | 9.8 MB | +| 지적도 | `processed/연속지적도_bounds.geojson` + `.key.json`(지적 겹 켤 때도) | 받은 자료(범위 덮으면 그대로) | 4.1 MB | +| 사업 지형면(DEM) | `models_plan/dtm_sheet_laplace.npz` · `_smooth.npz` · `_preview.glb` ×2 · `_smooth_grid.bin`(3D · 높이 읽을 때) · `.key.json` | 도엽에서 다시 셈 | 21.7 MB | +| 받은 범위 | `models_plan/plan_terrain.json` `{box, margin_m}` | 기록(줄지 않음) | 0.1 KB | +| 작업 좌표계 | `B03_FileInput/input/prj/plan.prj` | 지점 좌표계 사본 | 0.4 KB | +| 지형면 행 | `surface_models` 1 줄 + `terrain_layers` | 파일 목록 | 1 줄 | + +### D03 노선분석 — (다) 지도 겹 저장본(겹 켤 때 `GET …/plan/layers/*` · 위성 조각 `GET …/plan/tile/…`) + +| 무엇 | 어디 | 성격 | 크기 | +| --- | --- | --- | --- | +| 보호 · 규제 구역(여덟 종) | `B04_PreProcess/processed/보호구역_bounds.geojson` + 열쇠 | 받은 자료(범위 덮으면 그대로) | sub2_D 18.5 KB | +| 산림입지도 | `…/산림입지도_bounds.geojson` + 열쇠 | 받은 자료 | sub2_D 260 KB | +| 단층 · 지질구조선 | `…/단층_bounds.geojson` · `…/지질구조선_bounds.geojson` + 열쇠 | 받은 자료 | 0.5 KB 씩 | +| 산사태위험지도 그림 | `…/산사태위험지도_bounds.json` | 받은 자료 | 실측 없음(어느 프로젝트에도 파일 없음) | +| 급경사 단계 그림 | `_derived/plan_slope/` | 파생(최근 2 벌) | sub1_D 2 벌 140 KB | +| 음영기복 | `_derived/plan_hillshade/` | 파생 | sub2_D 284 KB | +| 0차곡 | `_derived/plan_zero_order/` | 파생 | sub2_D 260 KB | +| 계류 100 m · 도로 300 m 띠 | `_derived/plan_band/` | 파생 | sub2_D 32 KB | +| 산사태취약지역 맞춤 | `_derived/plan_landslide_zone/` · 표 = `resources/data_landslide_zones/*.csv`(4 시도 · 1.5 MB · git 안) | 파생 | 0.5 KB | +| 올린 임도망도 자른 것 | `_derived/plan_forest_road/` | 파생 | 실측 없음 | +| 등고선 등 노선 띠 사본 | `_derived/sheet_route/`(B04 자리 · 최근 4 벌) | 파생 | sub1_D 3 벌 5.5 MB | +| 위성 조각(GL 바탕) | `_derived/plan_tile/Satellite/{z}/{x}_{y}.jpeg` | 받은 자료 · 정리 없음 | sub1_D 0 · sub2_D 208 장 4.2 MB | +| **올린 임도망도 원본** | `D03_PlanAnalysis/임도망도.zip` + `임도망도.json`(파일 이름 · 크기 · 올린 때) · [올리기] `POST …/layers/forest-roads` | **정본(사용자 파일)** | 실측 없음(올린 프로젝트 없음) · 한도 100 MB | + +### D04 확정 · 업체 · 내보내기 + +| 무엇 | 어디 | 언제 | 성격 | 크기 | +| --- | --- | --- | --- | --- | +| 지정 업체(조각마다 여럿 · 등록 회사 id 또는 업체명 + 메일) | `plan_route_assignees`(`piece_id` · `year` · `company_id` · `company_name` · `email`) | [저장] `PUT …/plan/assignees` · [확정] 전 캐시 있으면 먼저 저장 | 정본 | 4 줄 | +| 확정 시각 | `plan_route_years.confirmed_at` | [확정] `POST …/plan/finalize` | 정본 | 0(미확정) | +| 메일 보낸 시각 | `plan_route_assignees.notified_at` | [확정] — 보낸 곳만 | 기록 | 0 | +| 내보내기 zip · 메일 첨부 zip | 저장 안 함 — 누를 때 `plan_route_pieces` · `plan_route_years` 로 메모리에서 만듦 | [내보내기] `GET …/plan/export` | — | — | + +- storage 쓰기 없음(`D04_PlanConfirm` 폴더는 늘 빔). + +### 대시보드 「받은 예정노선」 [연결] — 업체 임도 프로젝트 쪽에 남음 + +| 무엇 | 어디 | 언제 | 성격 | +| --- | --- | --- | --- | +| 연결 표시 | `plan_route_assignees.linked_project_id` | `POST /api/dashboard/plan-routes/{id}/link` | 정본 | +| 원본 · 복사 시각 · 지문 | 업체 임도 `projects.source_project_id` · `source_copied_at` · `source_fingerprint` | 같음 | 기록 | +| 노선 shp 한 벌 | 업체 임도 프로젝트 storage `B03_FileInput/input/shp/*`(shp · shx · dbf · prj · cpg) + `input_files` 행 + B03 `metadata.json` | 같음 | 연결 때 복사(원본 바뀌면 알림만) | + +- D 프로젝트 storage 는 안 바뀜. + +## 2. 저장 안 되는 것 · 프로젝트 저장이 아닌 것 + +| 무엇 | 어디 | 사라지는 때 | +| --- | --- | --- | +| D02 끌기 · 입력 중 지점 | sessionStorage `aislo:draft:d02-points:` | [저장] · [폐기] · 탭 닫음 | +| D03 긋기 · 마커 · 연도 | sessionStorage `aislo:draft:d03-plan:`(되돌리기 스택은 화면 메모리) | [저장] · [초기화] · [폐기] · 탭 닫음 | +| D04 업체 고침 | sessionStorage `aislo:draft:d04-assignees:` | [저장] · [확정] · [폐기] | +| 지도 [일반][위성](D02) · 겹 켬끔 · GL / 옛 캔버스(D03) | localStorage `aislo:pref:d02.map.type` · `d03.layers` · `d03.canvas` → 계정 `user_ui_prefs`(DB · 사람마다 · 프로젝트와 무관) | 안 사라짐(계정 취향) | +| 등고선 등 큰 겹 | 브라우저 IndexedDB `aislo-asset-cache` | 프로젝트 바꿀 때 | +| 위성 조각 | 브라우저 HTTP 캐시 | 1 일 | +| 지형 받기 진행률 | 서버 메모리 | 서버 다시 켬 | +| 화면의 길이 · 측점 · 높이 | 늘 다시 셈 | — | +| 내보내기 zip · 메일 본문 | 안 남음 | — | + +## 3. 이상 · 겹침 + +1. 노선 한 벌이 DB 세 곳 — `network_json`(정본) · `plan_route_pieces` · `plan_route_years.route_json`(조각 목록 한 번 더) · [저장] 때 서버가 한꺼번에 다시 씀(어긋남 없음 · 크기 작음). +2. 좌표계 여섯 곳 — `plan_base_json.epsg` · `network_json.epsg` · `plan_route_pieces.epsg` · `plan_route_years.epsg` · `plan.prj` · `projects.crs_epsg` · 마지막 칸은 등록 때 5178 고정 · D 가 안 고침(sub1_D = 작업 5186 · 칸 5178). +3. 업체 행 연도 = 조각 연도 사본 — D03 에서 조각 연도를 바꿔 [저장]해도 `plan_route_assignees.year` 그대로 → [확정] 메일 고르기 · 대시보드 확정 표시가 옛 연도를 짚을 수 있음(코드 읽기 · 실행 확인 못 함). +4. 등록 회사 이름 · 메일 사본 — 지정 [저장] 때 회사 · 대표 사용자 값을 업체 행에 베낌 · 회사 정보가 바뀌어도 옛 값. +5. 빈 연도 행 남음 — 연도가 빠져도 `plan_route_years` 줄은 안 지우고 `route_json` 만 비움 · `start_x`~`end_y` 옛 좌표는 그대로(sub1_D 2030 줄 · DB 전체 36 줄 중 6 줄). +6. 위성 두 벌 — 한 장 `vworld_satellite.png`(9.8 MB · 지형 받기 때 · 옛 캔버스 바탕) + 조각 `plan_tile`(GL 바탕). +7. `plan_tile` 쌓이기만 — `_derived` 안이지만 최근 2 벌 정리 밖 · 지도를 넓게 움직일수록 늘어남 · 공용 GL 지도 부품이 같은 주소를 써서 B 프로젝트에도 쌓임(검증_sub2 B 120 장 1.9 MB). +8. 받은 범위 · 도엽 · 위성은 줄지 않음 — 지점을 옮겨도 옛 범위 ∪ 새 범위(설계대로) → 지형면 · 위성 그림은 커지기만. +9. 도엽 겹 두 벌 — 병합본 + 표시용 사본(`.display.geojson`) 같은 폴더. +10. 임도망도 지우는 길 없음 — 바꿔 올리기만. +11. [초기화] 뒤 남는 것 — `plan_networks` 줄(빈 선) · 연도 행 줄 · 지형 · 겹 파일 전부 · 업체가 지정된 조각이 있으면 [초기화] 자체가 막힘(409). +12. D 그룹엔 초기값 층(`initial_snapshot`) 없음 — [초기화] = 빈 선 저장(CLAUDE.md 5장 「초기값을 작업본에 덮어씀」과 다른 뜻). +13. 단계 표 3 줄은 늘 NOT_STARTED — D 화면이 고치지 않음. +14. 빈 폴더 — `D02_PlanBase` · `D04_PlanConfirm` 늘 빔 · `D03_PlanAnalysis` 는 임도망도 올릴 때만. +15. 복제 찌꺼기 — `copy_manifest.json` · `models_plan/contour_sheet_laplace_dtm_smooth_5.0m.json`(4 MB · 복제 원본 것 · D 화면은 안 씀 · 지형면보다 옛 날짜). +16. 프로젝트 지움 — 평소 = 소프트 삭제(`deleted_at` 만) → DB 행 · storage 폴더 전부 남음 · 하드 삭제(개발 PC 설정) 때만 DB 연쇄 지움 + 폴더 통째 지움 · 연결된 업체 임도 프로젝트의 원본 칸 · shp 사본은 남음(외래키 없음). + +## 4. 확인 못 함 + +- 산사태위험지도 저장본 · 임도망도 원본 · 자른 저장본 크기 — 어느 storage 에도 파일 없음. +- 3번(업체 연도 어긋남) 화면 재현. +- 메일 서버 쪽 발송 기록(본문 · 첨부) — 이 저장소 밖. +- 브라우저 IndexedDB · HTTP 캐시 실제 크기.