refactor(B07,B08): 도면 코드 B08_DesignDetail 이동 + 수량 슬롯 B07_Quantity 확보

- B07_wf4_DesignDetail(8파일+openwebcad) -> B08_DesignDetail로 git mv (이력 보존)
- B08_wf5_Quantity -> B07_Quantity (구 수량 백업 zip 보관 폴더)
- 파생 문자열 일괄 전환: /b07-cad -> /b08-cad 정적 서빙, CAD 레이어 b07-* -> b08-*,
  postMessage aislo:b07:* -> aislo:b08:*, 패키지명 aislo-b08-cad, CSS .b08-*,
  라우트 키/슬러그(B08_DESIGN_DETAIL/b08-design-detail, B07_QUANTITY/b07-quantity)
- 상세설계 워크플로우 stage 4 -> 5 (확정/무효화 전이 3곳), 확정 완료 시 B09로 이동
- WORKFLOW_STEP_ROUTES 순서 재배열: index4=수량(B07), index5=상세설계(B08)
- [임시] B08 이동 테스트 버튼 제거, openwebcad dist 재빌드
- 주석 의미 정렬: 수량 인계 주석 B08->B07, 도면 참조 B07->B08

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-08 10:10:10 +09:00
co-authored by Claude Fable 5
parent 54954a05e5
commit 2a248ff742
198 changed files with 232 additions and 242 deletions
+5 -5
View File
@@ -3,14 +3,14 @@
* 유토곡선(Mass Haul Diagram) 계산 엔진 — 순수 함수, DOM 의존 없음.
*
* 구간 토량을 평균단면법으로 만들고 토량환산계수로 기준을 통일해 누가토량을 누적한다.
* 결과는 B08 수량산출·B09 견적이 그대로 재사용할 수 있도록 계산과 렌더링을 분리해
* 결과는 B07 수량산출·B09 견적이 그대로 재사용할 수 있도록 계산과 렌더링을 분리해
* 둔다(렌더러는 `common_util_mass_haul_view`).
*
* ── 계산 기준: 다짐상태 ──────────────────────────────────────────────
* "운반거리의 산정 시에 모든 수량은 다짐상태로 환산하여 계산하고, 내역서에 적용하는
* 수량은 자연상태로 한다." (2021년도 국도건설공사 설계실무 요령 / 표준품셈 계열)
* 유토곡선은 운반계획 도면이므로 다짐상태를 기준상태로 삼는다. 내역서용 자연상태
* 수량은 `cut_natural_m3`로 함께 보존해 B08이 되돌려 쓸 수 있게 한다.
* 수량은 `cut_natural_m3`로 함께 보존해 B07이 되돌려 쓸 수 있게 한다.
*
* ── 두 기준(종단/횡단)을 함께 내는 이유 ──────────────────────────────
* [임도의 설계 및 시설기준] 2.다.(3)(나)는 "시공계획고는 절토량과 성토량이 균형을
@@ -423,7 +423,7 @@ function longitudinalAreaSamples(
/**
* 측점별 설계 결과에서 유토곡선을 계산한다(횡단 기준·지반유형별 환산).
* 확정 저장과 B08 인계에 쓰는 **정식 곡선**이라 시그니처를 그대로 유지한다.
* 확정 저장과 B07 인계에 쓰는 **정식 곡선**이라 시그니처를 그대로 유지한다.
*/
export function computeMassHaul(
crossSections: MassHaulSection[],
@@ -461,7 +461,7 @@ export function computeMassHaulSeries(
/**
* 확정 시 DB(`longitudinal_sections.data.mass_haul`)에 넣을 직렬화 형태로 정리한다.
* 토량 분배(평형선)까지 냈으면 `haul_plan`으로 함께 실어 B08 수량·B09 견적이 되받게 한다.
* 토량 분배(평형선)까지 냈으면 `haul_plan`으로 함께 실어 B07 수량·B09 견적이 되받게 한다.
*/
export function massHaulPayload(
result: MassHaulResult,
@@ -490,7 +490,7 @@ export function massHaulPayload(
chainage_m: round(point.chainage_m),
net_volume_m3: round(point.net_volume_m3),
cumulative_volume_m3: round(point.cumulative_volume_m3),
// 구간 절토 내역(자연상태) — B08 내역서가 EA/RR/BR로 되받는 단위.
// 구간 절토 내역(자연상태) — B07 내역서가 EA/RR/BR로 되받는 단위.
cut_soil_m3: round(point.cut_soil_m3),
cut_rock_m3: round(point.cut_rock_m3),
cut_rr_m3: round(point.cut_rr_m3),
+3 -3
View File
@@ -169,7 +169,7 @@ export function settleResiduals(
return transfers;
}
/** 확정 저장·B08 인계용 직렬화. 값은 소수 둘째 자리에서 끊는다. */
/** 확정 저장·B07 인계용 직렬화. 값은 소수 둘째 자리에서 끊는다. */
export function haulPlanPayload(plan: HaulPlan): Record<string, unknown> {
const round = (value: number): number => Math.round(value * 100) / 100;
return {
@@ -179,7 +179,7 @@ export function haulPlanPayload(plan: HaulPlan): Record<string, unknown> {
hauled_m3: round(plan.hauled_m3),
transferred_m3: round(plan.transferred_m3),
fill_total_m3: round(plan.fill_total_m3),
// 떨어진 구간끼리의 장거리 운반 — B08 내역서가 별도 운반 항목으로 세운다.
// 떨어진 구간끼리의 장거리 운반 — B07 내역서가 별도 운반 항목으로 세운다.
transfers: plan.transfers.map((transfer) => ({
index: transfer.index,
from_m: round(transfer.from_m),
@@ -198,7 +198,7 @@ export function haulPlanPayload(plan: HaulPlan): Record<string, unknown> {
base_m3: round(block.base_m3),
volume_m3: round(block.volume_m3),
direction: block.direction,
// 장비 띠 — B08 내역서는 이 단위로 운반 항목을 세운다.
// 장비 띠 — B07 내역서는 이 단위로 운반 항목을 세운다.
bands: block.bands.map((band) => ({
index: band.index,
equipment: band.equipment,
+2 -2
View File
@@ -12,8 +12,8 @@ PROJECT_STORAGE_LAYOUT_V2 = (
("B05_Profile", "route"),
("B06_Section", "longitudinal"),
("B06_Section", "cross_sections"),
("B07_wf4_DesignDetail", "structures"),
("B08_wf5_Quantity", "quantities"),
("B08_DesignDetail", "structures"),
("B07_Quantity", "quantities"),
("B09_wf6_Estimation", "v1"),
)