feat(804-1): 시험 페이지 「줄 쌓기 단가산출」 tools/line-stack-test + M01 왼쪽 패널 단추

- 왼쪽 줄 쌓기(항목 · 줄 일곱 종류 · 공식 틀 셋 · 식으로 풀기 · 틀로 저장 · 표에서 고르기 · 끌어 순서) · 오른쪽 경쟁사 꼴 산출근거(분수 기호식 = 값식 = 결과 · 소계 · 합계) · 아래 비목 상자 · 엑셀 글 붙여넣기 · 저장 = localStorage
- 견본 셋 금액 = 거창 파일 원 단위(5,323 · 52,796 · 94,215 비목 넷) · 확인 = node tools/line-stack-test/check.mjs
- 접근 = main.py 정적 마운트 /tools/line-stack-test · vite 프록시 한 줄(개발 포트에서 열림) · M01 왼쪽 패널 맨 아래 「시험: 줄 쌓기」 새 탭
- 라이브러리 0(분수 = CSS) · 지우기 = 폴더 + 표시 주석 셋 덩이

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-07 23:19:38 +09:00
co-authored by Claude Opus 5.5
parent d59874d4b4
commit 3e64aa2a79
12 changed files with 1633 additions and 1 deletions
+221
View File
@@ -0,0 +1,221 @@
// 줄 쌓기 단가산출 시험 — 견본 자원 · 공식 틀 · 견본 표 · 견본 단가산출(거창 산불 출력 「단가산출」 시트 1 · 41 · 15 번)
export const LABOR = [
{ name: "보통인부", price: 172068 },
{ name: "형틀목공", price: 275790 },
{ name: "석공", price: 268908 },
];
export const MATERIAL = [
{ name: "합판(내수),대전 (12t×1220×2440mm)", price: 11455 },
{ name: "외송각재,대전 (30×30×3600mm)", price: 586824 },
{ name: "치즐(0.7㎥)", price: 223000 },
];
/** 기계 = 시간당 기계경비 노무 · 재료 · 경비 */
export const MACHINE = [
{ name: "굴삭기(무한궤도) (0.7㎥)", l: 59020, m: 19473, e: 24554 },
{ name: "굴삭기(무한궤도) (0.6㎥+부착용집게)", l: 59020, m: 16280, e: 29209 },
{ name: "덤프트럭 (15Ton)", l: 59020, m: 30192, e: 20659 },
];
/** 다른 단가산출 = 그 단산의 노무 · 재료 · 경비 */
export const SANGEUN = [
{ no: 13, name: "뒷채움돌 기초잡석 채집운반(Φ150m/m) [㎡]", l: 9889, m: 2262, e: 3858 },
{ no: 28, name: "기초다짐및뒷채움(소형장비사용) [㎥]", l: 11206, m: 1077, e: 1259 },
{ no: 1, name: "측구터파기(토사) [㎥]", l: 3442, m: 832, e: 1049 },
];
const row = (n, x, u = "", d) => (d === undefined ? { n, x, u } : { n, x, u, d });
/** 공식 틀 — 「이름 = 값」 · 「이름 = 식」 줄 묶음 */
export const TEMPLATES = [
{
id: "excavator",
name: "굴삭기 Q (품셈 8-2-3)",
rows: [
row("q", "0.7", "㎥"),
row("K", "0.55"),
row("f", "1 / 1.325"),
row("E", "0.45"),
row("Cm", "20", "sec ( 135 ˚ )"),
row("Q", "3600 × q × K × f × E / Cm", "㎥ / hr"),
],
},
{
id: "dump",
name: "덤프 Q (q · K 는 위 굴삭기 것)",
rows: [
row("L", "0.1", "km"),
row("V1", "7", "km / hr"),
row("V2", "8", "km / hr"),
row("T", "15", "ton"),
row("rt", "1.9", "ton / ㎥"),
row("E", "0.9"),
row("qt", "T ÷ rt", "㎥"),
row("f", "0.89"),
row("Cms", "22"),
row("Es", "0.35"),
row("n", "qt / (q × K)"),
row("t1", "Cms × n / (60 × Es)"),
row("t2", "(L / V1 + L / V2) × 60", "분 ( 왕복 )"),
row("t3", "1.1", "분 ( 적하 )"),
row("t4", "0.7", "분 ( 대기 )"),
row("Cm", "t1 + t2 + t3 + t4", "분"),
row("QH", "(Cm - t1) / Cm"),
row("Q", "60 × qt × f × E / Cm", "㎥ / hr"),
],
},
{ id: "directQ", name: "직접 Q", rows: [row("Q", "0.35")] },
];
/** 견본 표 하나 — [표에서 고르기] (표준품셈 8-2-3 굴착기 2. 작업효율 E) */
export const TABLE_E = {
title: "굴착기 작업효율 E (표준품셈 8-2-3)",
head: ["토질", "자연 양호", "자연 보통", "자연 불량", "흐트 양호", "흐트 보통", "흐트 불량"],
rows: [
["모래, 사질토", 0.85, 0.7, 0.55, 0.9, 0.75, 0.6],
["자갈섞인 흙, 점성토", 0.75, 0.6, 0.45, 0.8, 0.65, 0.5],
["파쇄암", null, null, null, null, 0.45, 0.35],
],
};
const op = (o, v, u = "") => ({ op: o, v, u });
const tplRows = (id) => structuredClone(TEMPLATES.find((t) => t.id === id).rows);
export const SAMPLES = [
{
key: "s1",
label: "① 측구터파기(토사)",
expect: { l: 3442, m: 832, e: 1049, sum: 5323 },
doc: {
name: "측구터파기(토사)",
unit: "㎥",
items: [
{
title: "기 계 ( 100 % ) : 굴삭기(무한궤도) (0.7㎥)",
lines: [
{ k: "formula", tpl: "excavator", rows: tplRows("excavator") },
{ k: "mach", res: { ...MACHINE[0] }, ops: [op("÷", "Q")] },
],
},
{
title: "보조인부 ( 1 일당 1 인 )",
lines: [{ k: "labor", res: { ...LABOR[0] }, ops: [op("÷", "8"), op("÷", "Q")] }],
},
],
},
},
{
key: "s41",
label: "② 합판거푸집(4회)",
expect: { l: 38290, m: 14506, e: 0, sum: 52796 },
doc: {
name: "합판거푸집(4회)",
unit: "㎡",
items: [
{
title: "",
lines: [
{ k: "text", text: "< 토목품셈 6-3-1 합판거푸집(2022개정) >" },
{ k: "text", text: "※ 사용횟수 4 회 : 보통" },
],
},
{
title: "재료비",
lines: [
{
k: "mat",
col: "m",
res: { ...MATERIAL[0] },
ops: [op("×", "1.03", "㎡"), op("×", "38", "%")],
},
{
k: "mat",
col: "m",
res: { ...MATERIAL[1] },
ops: [op("×", "0.038", "㎥"), op("×", "38", "%")],
},
{
k: "rate",
name: "소모자재 ( 박리재등 )",
of: "주자재비",
baseName: "주자재",
baseCol: "m",
scope: "item",
rate: "9",
col: "m",
},
],
},
{
title: "인건비 ( 24 년 품셈 개정 )",
lines: [
{ k: "labor", res: { ...LABOR[1] }, ops: [op("×", "5", "인"), op("/", "45", "㎡")] },
{ k: "labor", res: { ...LABOR[0] }, ops: [op("×", "2", "인"), op("/", "45", "㎡")] },
{
k: "rate",
name: "공구손료 및 경장비 기계경비",
of: "노무비",
baseName: "인부",
baseCol: "l",
scope: "item",
rate: "1",
col: "m",
},
],
},
],
},
},
{
key: "s15",
label: "③ 전석 메쌓기",
expect: { l: 74880, m: 7029, e: 12306, sum: 94215 },
doc: {
name: "전석 메쌓기",
unit: "㎡",
items: [
{ title: "전석 구입운반 : 별산", lines: [] },
{
title: "뒷채움돌 운반 및 채집 : 뒷채움돌기초잡석채집운반 (Φ150m/m) [㎡] * 단산 13 참조 *",
lines: [
{ k: "formula", tpl: "directQ", rows: [row("Q", "0.35")] },
{ k: "ref", res: { ...SANGEUN[0] }, ops: [op("×", "Q")] },
],
},
{
title: "뒤채움돌 다짐 기초다짐및뒷채움 (소형장비사용) [㎥] * 단산 28 참조 *",
lines: [
{ k: "formula", tpl: "directQ", rows: [row("Q", "0.35")] },
{ k: "ref", res: { ...SANGEUN[1] }, ops: [op("×", "Q")] },
],
},
{
title: "전석쌓기 기계: 굴삭기(무한궤도) (0.6㎥+부착용집게)",
lines: [
{ k: "formula", tpl: "directQ", rows: [row("Q", "0.36", "㎥ / hr")] },
{ k: "mach", res: { ...MACHINE[1] }, ops: [op("×", "Q")] },
],
},
{
title: "전석쌓기 인부",
lines: [
{ k: "labor", res: { ...LABOR[2] }, ops: [op("×", "0.14", "인")] },
{ k: "labor", res: { ...LABOR[0] }, ops: [op("×", "0.05", "인")] },
],
},
],
},
},
{
key: "new",
label: "④ 새 공식",
expect: null,
doc: {
name: "새 단가산출",
unit: "",
items: [{ title: "", lines: [{ k: "formula", tpl: null, rows: [row("", "")] }] }],
},
},
];