- 토적표 32칸 · 측점 고정 · 묶음 머리 석 줄 · 합계 줄 / 토공집계표 · 운반 시트도 같은 표 · 카드 안 - 옛 토적표 전용 CSS 걷어냄 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UoSr2sqvYtBf1dtQdus88s
118 lines
4.6 KiB
TypeScript
118 lines
4.6 KiB
TypeScript
/* =============================================================================
|
||
* B08_Quantity_UI_Earthwork_Sheets.ts
|
||
* 토공 보조 탭 셋(PLAN 69-2) — 토공집계표 · 평균운반거리 · 종방향 무대운반거리.
|
||
*
|
||
* 칸 · 식 = 거창 실무 워크북 같은 이름 시트 그대로 · 값은 서버가 셈(`…_Engine_Earthwork_Summary`).
|
||
* 운반 Q · L = 저장된 유토곡선 배분(B07 토적도와 같은 정본) — 없으면 그 사유만 보임.
|
||
* 표 = 공용 많은 자료 표(`ui_template_data_table`).
|
||
* ========================================================================== */
|
||
|
||
import { createDataTable, type DataColumn, type DataRow } from "@ui/ui_template_data_table";
|
||
import { note, tableCard, type EarthworkTable, type HaulList } from "./B08_Quantity_UI_Earthwork";
|
||
|
||
const fmt = (value: number | null | undefined): string =>
|
||
value == null || !Number.isFinite(value)
|
||
? "—"
|
||
: value.toLocaleString("ko-KR", { maximumFractionDigits: 2 });
|
||
|
||
const SUMMARY_COLUMNS: DataColumn[] = [
|
||
{ key: "group", label: "구분", width: 120 },
|
||
{ key: "kind", label: "공종", width: 72 },
|
||
{ key: "spec", label: "규격", width: 128 },
|
||
{ key: "unit", label: "단위", width: 56 },
|
||
{ key: "value", label: "계", kind: "number", decimals: 2, width: 112 },
|
||
{ key: "note", label: "비고", width: 200 },
|
||
];
|
||
|
||
/** 토공집계표 — 구분 · 공종 · 규격 · 단위 · 계 · 비고 */
|
||
export function renderEarthworkSummary(host: HTMLElement, table: EarthworkTable): void {
|
||
const info = note(
|
||
"토적표 합계 · 평균운반거리 · 종방향 무대운반거리를 실무 토공집계표 식대로 묶음 · " +
|
||
"리핑암 = 연암 · 발파암 = 경암 · 구조물 쪽 줄은 구조물 수량에서(— = 아직 값 없음)",
|
||
);
|
||
const grid = createDataTable({
|
||
columns: SUMMARY_COLUMNS,
|
||
// 칸이 없는 글(공종 · 규격 · 비고)은 빈칸 — 공용 표는 "" 를 「—」(값 없음)로 그림
|
||
rows: table.summary.map((row) => ({
|
||
...row,
|
||
kind: row.kind || " ",
|
||
spec: row.spec || " ",
|
||
note: row.note || " ",
|
||
})),
|
||
frozen: 1,
|
||
caption: "토공집계표",
|
||
});
|
||
host.replaceChildren(tableCard([info], grid.root));
|
||
}
|
||
|
||
function haulNote(table: EarthworkTable): HTMLElement[] {
|
||
return table.haul_saved
|
||
? []
|
||
: [note("유토곡선 배분이 저장되지 않았습니다 — 횡단 설계 [확정] 뒤에 채워집니다.")];
|
||
}
|
||
|
||
/** 운반 시트 한 장 — 묶음마다 토량(Q) · 거리(L) · Q×L · 맨 아래 합계 · 아래 평균운반거리 줄 */
|
||
function haulSheet(
|
||
host: HTMLElement,
|
||
table: EarthworkTable,
|
||
groups: Array<[string, HaulList]>,
|
||
info: string,
|
||
): void {
|
||
const columns: DataColumn[] = [
|
||
{ key: "no", label: "번호", width: 56 },
|
||
...groups.flatMap(([label], g) =>
|
||
[
|
||
["q", "토량(Q)"],
|
||
["l", "거리(L)"],
|
||
["ql", "Q×L"],
|
||
].map(([key, text]) => ({
|
||
key: `${key}${g}`,
|
||
label: text,
|
||
group: [label],
|
||
kind: "number" as const,
|
||
decimals: 2,
|
||
width: 104,
|
||
})),
|
||
),
|
||
];
|
||
const count = Math.max(0, ...groups.map(([, list]) => list.rows.length));
|
||
const rows: DataRow[] = Array.from({ length: count }, (_, i) => {
|
||
const out: DataRow = { no: String(i + 1) };
|
||
groups.forEach(([, list], g) => {
|
||
const item = list.rows[i];
|
||
if (item) Object.assign(out, { [`q${g}`]: item.q, [`l${g}`]: item.l, [`ql${g}`]: item.ql });
|
||
});
|
||
return out;
|
||
});
|
||
const total: DataRow = { no: "합계" };
|
||
groups.forEach(([, list], g) => Object.assign(total, { [`q${g}`]: list.q, [`ql${g}`]: list.ql }));
|
||
const averages = groups.map(([label, list], i) =>
|
||
note(
|
||
`${i + 1}) ${label} 평균운반거리: ${fmt(list.ql)} ÷ ${fmt(list.q)} = ${fmt(list.average_m)} M`,
|
||
),
|
||
);
|
||
const grid = createDataTable({ columns, rows, frozen: 1, total, caption: info });
|
||
host.replaceChildren(tableCard([note(info), ...haulNote(table)], grid.root, averages));
|
||
}
|
||
|
||
export function renderHaulDistance(host: HTMLElement, table: EarthworkTable): void {
|
||
haulSheet(
|
||
host,
|
||
table,
|
||
[
|
||
["덤프트럭", table.haul.dump_truck],
|
||
["불도우저", table.haul.dozer],
|
||
],
|
||
"유토곡선 배분의 덤프 · 도저 띠와 떨어진 구간 운반 · 평균 = ΣQ×L ÷ ΣQ (소수 둘째 자리) · 단위 ㎥ · m",
|
||
);
|
||
}
|
||
|
||
export function renderFreeHaul(host: HTMLElement, table: EarthworkTable): void {
|
||
haulSheet(
|
||
host,
|
||
table,
|
||
[["종방향무대", table.haul.free_haul]],
|
||
"유토곡선 배분의 무대(20 m 안) 띠 · 평균 = ΣQ×L ÷ ΣQ (소수 둘째 자리) · 단위 ㎥ · m",
|
||
);
|
||
}
|