feat(b08): 자재총괄 할증률 「이내」 칸 초안 연결 — 불러오기·저장 본문·표 옵션(랩탑_메인 87083c33)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq
This commit is contained in:
2026-09-14 10:54:37 +09:00
co-authored by Claude Opus 5
parent 87083c3341
commit afea225ae5
+7
View File
@@ -95,6 +95,7 @@ async function saveQuantitySettings(projectId: string, draft: DraftSettings): Pr
// 병합해 옛 값이 남아 되돌릴 길이 없다(화면에서 걸린 자리). 빈 값은 서버가 버린다.
rock_methods: draft.rock_methods,
material_supply: draft.material_supply,
material_surcharge: draft.material_surcharge,
concrete_placing_method: draft.concrete_placing_method,
// ⚠ `null` 도 그대로 보낸다 — 「안 정함」으로 되돌릴 길이 있어야 한다(시공법과 같은 규칙).
topsoil_thickness_m: draft.topsoil_thickness_m,
@@ -314,6 +315,8 @@ interface DraftSettings {
tree_waste_root_method: string;
// 자재별 관급/사급 — 표 안에서 줄마다 고른 값.
material_supply: Record<string, SupplyChoice>;
// 자재별 할증률(%) — 표값 이내에서 고른 값만 · `null` 은 표값.
material_surcharge: Record<string, number | null>;
// 갈래별 토량환산계수(다짐) — `compacted` 가 `null` 이면 「안 고름」이라 기본값이 선다.
conversion_factors: Record<string, FactorDraft>;
// 도쟈 한계거리(m) — `null` 은 기본값(서버 정본 60 m)이 선다.
@@ -925,6 +928,7 @@ function buildQuantityBody(
material.material,
{
choices: draft.material_supply,
surcharge: draft.material_surcharge,
onChange: () => {
draft.dirty = true;
},
@@ -1011,6 +1015,9 @@ export async function renderB08Quantity(root: HTMLElement): Promise<void> {
...((stored.ancillary_counts ?? {}) as Record<string, number | null>),
},
material_supply: { ...((stored.material_supply ?? {}) as Record<string, SupplyChoice>) },
material_surcharge: {
...((stored.material_surcharge ?? {}) as Record<string, number | null>),
},
// ⚠ 저장분에 있는 갈래만 담는다 — 기본값을 복사해 넣으면 「안 고름」이 사라진다.
conversion_factors: Object.fromEntries(
Object.entries(stored.conversion_factors_override ?? {}).map(([kind, entry]) => [