Merge remote-tracking branches 'origin/sub_desktop_1' and 'origin/sub_laptop_1' into sub_laptop_2

This commit is contained in:
2026-09-20 23:19:42 +09:00
11 changed files with 161 additions and 33 deletions
+22 -1
View File
@@ -27,6 +27,7 @@ import {
type ElementBrief,
type LogicFile,
type LogicRow,
type LogicSummary,
type SaveFile,
} from "./M01_MasterData_UI_Logic_Api";
import { buildCalc } from "./M01_MasterData_UI_Logic_Calc";
@@ -68,7 +69,16 @@ function loadDrafts(): Record<string, Draft> {
}
}
export async function mountM01Logic(host: HTMLElement, side: SideHandle): Promise<void> {
export interface LogicHandle {
/** 밖(요소 화면)에서 이 키를 바로 엶 — 소요량·계수 표의 「쓰는 로직」 눌렀을 때. */
openKey: (key: string) => Promise<void>;
}
export async function mountM01Logic(
host: HTMLElement,
side: SideHandle,
openKey?: string,
): Promise<LogicHandle> {
let drafts = loadDrafts();
let files: LogicFile[] = [];
let opened: Opened | null = null;
@@ -220,6 +230,8 @@ export async function mountM01Logic(host: HTMLElement, side: SideHandle): Promis
}
};
let allLogics: LogicSummary[] = [];
const reload = async (): Promise<void> => {
const [logics, logicFiles, subs] = await Promise.all([
fetchLogics(),
@@ -227,6 +239,7 @@ export async function mountM01Logic(host: HTMLElement, side: SideHandle): Promis
fetchLogicSubs(),
]);
files = logicFiles;
allLogics = logics;
list.setItems(logics);
// 왼쪽 「전체」 + 구분 → 상세구분 거름 — 고르면 목록으로 돌아와 그 범위만
filterHost.replaceChildren(
@@ -390,11 +403,19 @@ export async function mountM01Logic(host: HTMLElement, side: SideHandle): Promis
side.logicHost.replaceChildren(filterHost);
show(null);
showLoadingOverlay();
const openKeyOn = async (key: string): Promise<void> => {
const found = allLogics.find((x) => x. === key);
if (found) await open(logicId(found., found.), found., found.);
else showToast(tx("Load_Failed"), "error");
};
try {
await reload();
if (openKey) await openKeyOn(openKey);
} catch (error) {
showToast(error instanceof Error ? error.message : tx("Load_Failed"), "error");
} finally {
hideLoadingOverlay();
}
return { openKey: openKeyOn };
}
+7 -10
View File
@@ -33,6 +33,7 @@ import {
type Pick,
} from "./M01_MasterData_UI_Side";
import { renderTables } from "./M01_MasterData_UI_Tables";
import type { LogicHandle } from "./M01_MasterData_UI_Logic_Page";
import "./M01_MasterData_UI_Style.css";
const TABLE_GROUPS = ["소요량", "계수"];
@@ -174,13 +175,9 @@ function buildPage(): HTMLElement {
return [L("M01_Stale").replace("{value}", stale.map(fileLabel).join(", ")), again];
};
/** 로직 탭으로 전환 — `key` 가 있으면 들고 가서 로직 목록 찾기 칸에 넣으라고 안내
* (로직 목록이 직접 그 키를 열지는 못함 — 로직 부분은 sub1 담당 파일). */
const notifyLogicKey = (key: string): void => {
navigator.clipboard?.writeText(key).catch(() => undefined);
showToast(L("M01_LogicKeyCopy").replace("{value}", key), "success");
};
let logicHandle: LogicHandle | null = null;
/** 로직 탭으로 전환 — `key` 가 있으면 그 로직을 바로 엶. */
const openLogicTab = (key?: string): void => {
if (key) setPendingLogicKey(key);
dispose();
@@ -188,14 +185,14 @@ function buildPage(): HTMLElement {
current = null;
showMode("logic");
if (logicMounted) {
if (key) notifyLogicKey(key);
const pending = takePendingLogicKey();
if (pending) void logicHandle?.openKey(pending);
return;
}
logicMounted = true;
void import("./M01_MasterData_UI_Logic_Page").then((m) => {
void m.mountM01Logic(logicHost, side);
void import("./M01_MasterData_UI_Logic_Page").then(async (m) => {
const pending = takePendingLogicKey();
if (pending) notifyLogicKey(pending);
logicHandle = await m.mountM01Logic(logicHost, side, pending ?? undefined);
});
};
+12 -2
View File
@@ -182,8 +182,13 @@
"출처": "산림품셈 13-4-1",
"소유": "공용",
"입력": [
{ "이름": "뒷길이", "단위": "㎝" },
{ "이름": "돌", "고르기": ["견치돌", "깬돌", "깬잡석", "호박돌 및 야면석"] }
{ "이름": "뒷길이", "설명": "쌓을 돌의 뒤쪽 길이", "단위": "㎝" },
{
"이름": "돌",
"설명": "쌓을 돌 종류",
"고르기": ["견치돌", "깬돌", "깬잡석", "호박돌 및 야면석"],
"출처": "산림품셈 13-4-1"
}
],
"중간": [{ "이름": "증가율", "식": "…" }],
"호표": [{ "종류": "인력", "요소": "LB000002", "단위": "인", "수량": "…", "비목": "노무비" }],
@@ -217,13 +222,18 @@
- 구분·상세구분 = 자재품목 줄의 같은 이름 칸과 똑같이 적음(묶음 목록은 `ref/_묶음_자재품목.md`).
- 규격 조건 = 원문이 규격을 밝힌 것만 좁힘 — 낱말이 **모두** 든 줄이 후보(「D300」 · 「D300 B종」) · 대소문자·빈칸·`φ` 는 안 가림. 원문이 규격을 안 밝히면 칸을 두지 않음.
- 대표 줄 = 관리자가 고른 자재품목 키 — 시험 계산이 그 줄의 값을 씀. 조건 밖 키는 검사가 잡음.
- 후보는 **호표 줄 단위와 같은 자재품목 줄만** — 단위가 다르면 다른 물건(우드칩 ㎥ · 원목후로링 ㎡). 조건 안 줄이 모두 다른 단위면 `check_master 단위` 가 알림.
- 조건 값에 `{입력}` 을 넣을 수 있음 — `"규격": "{관경}"` 은 계산 때 입력값으로 채워짐(검사에서는 그 칸을 뺌).
- 대표가 없으면 시험 계산은 **조건 안 값 있는 첫 줄** · 로직 입력 `자재지역` 이 있으면 이름에 그 지역이 든 줄부터(레미콘·골재처럼 지역이 갈리는 품목).
- 실제 줄 고르기는 프로젝트 몫 — 후보 목록은 `GET /api/m01/materials`(화면·테스트 컨테이너가 같이 씀).
- 옛 방식(품셈재료 키 `MP…` · 자재품목 키 `MT…`)도 그대로 돎 — 품셈재료 `고르기` 칸이 빈 줄(연결이 이미 있는 줄 · 짝 못 찾은 줄)과 `{이름}` 이 낀 원문번호 줄은 계속 옛 방식.
- 근거가 덜 선 줄은 `비고` 칸에 적음 — 「환산 근거 미확인」.
- 입력 칸 = `이름`(반드시) · `설명` · `단위` · `고르기`·`범위`(둘 중 하나까지) · `출처`(원문 절) · `비고` · `시험입력`은 줄 머리에 따로.
- `설명` = 설계자에게 보일 **쉬운 말 한 줄** — 무엇을 넣는 칸인지만(명사형 · 계산 방법·근거는 `비고`·`출처` 로). 화면은 이름 옆 도움말로 씀.
- 입력에 원문 범위가 있으면 `범위: [아래, 위]` · 기본값 두지 않음.
- `소유` = 공용 · 개인(뒤 단계 자리).
- `시험입력` = 일괄 시험 계산 전용 칸(`check_master 계산전부`) — 설계 입력이 없으면 못 도는 로직에 원문 표 첫 규격·자재지역을 한 벌 둠. 정본 계산은 화면이 준 값만 씀.
## 8. 변수 · 식
@@ -3,7 +3,6 @@
"원문": "건설품셈",
"부문": "건축",
"차례": 37,
"부문": "건축",
"판": "2026",
"줄": [
{
@@ -528,12 +528,13 @@
"비고": "해석: 건설기계조종원·운전기사 = 건설노임 건설기계운전사(1048) · 해석: 할증을 인력 · 연료 · 손료(가동일)에 함께 곱함 · 해석: 우드그래플 소모성경비(2-1-3) = Q × (트랙 보강 + 블레이드·실린더) 원/ha ÷ 집재재적 · 기계손료 못 넣음 — 기계 열쇠 「2-2-3 동력상하차기, 임업용 굴착기(우드그래플)」 에 쉼표(식이 열쇠를 끊음) · 경계값(아래 끝 수 그대로)은 못 찾음 — 범위규칙 「이하 · 이상 · 두 수는 양 끝 포함」 을 엔진이 「이하」로만 읽음 · 할인·할증 못 넣음 — 1-4-5 경사도(값 칸 「할인·할증률」) · 1-4-13 주행 장애물 상태(조건 빈칸) — 칸 이름 · 범위규칙 문법",
"시험입력": {"최대집재거리": 40.0, "집재재적": 60.0},
"입력": [
{ "이름": "최대집재거리", "단위": "m" },
{ "이름": "집재재적", "단위": "㎥/ha" },
{ "이름": "원목길이", "단위": "m", "고르기": [1.2, 1.8, 2.1, 2.7, 3.6] },
{ "이름": "잔존목", "고르기": ["잔존목 100본 이상 130본 이하", "잔존목 71본 이상 100본 미만", "해당 없음"] },
{ "이름": "최대집재거리", "설명": "집재 장비에서 가장 먼 원목까지의 거리", "단위": "m" },
{ "이름": "집재재적", "설명": "1ha 에서 집재할 통나무 부피", "단위": "㎥/ha" },
{ "이름": "원목길이", "설명": "한 토막 통나무 길이", "단위": "m", "고르기": [1.2, 1.8, 2.1, 2.7, 3.6] },
{ "이름": "잔존목", "설명": "베지 않고 남긴 나무가 있는지", "고르기": ["잔존목 100본 이상 130본 이하", "잔존목 71본 이상 100본 미만", "해당 없음"] },
{
"이름": "지역",
"설명": "기계 경비를 셈할 노임 지역",
"고르기": [
"전국평균",
"전국",
@@ -1200,6 +1200,7 @@
"입력": [
{
"이름": "지역",
"설명": "기계 경비를 셈할 노임 지역",
"고르기": [
"전국평균",
"전국",
@@ -1221,7 +1222,7 @@
"전남광주"
]
},
{ "이름": "보정작업", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"] }
{ "이름": "보정작업", "설명": "흙이 무르거나 좁아 능률이 떨어지는 작업인지", "고르기": ["해당 없음", "암석작업(연암・보통암・경암)", "전석섞인토사"] }
],
"중간": [{ "이름": "작업량", "식": "로직(GF000118)" }],
"호표": [
@@ -156,9 +156,10 @@
"소유": "공용",
"비고": "해석: N = 시간당 운반 횟수 · 1회 = 기계 1/N 시간 · t2 는 「운반시간 참조」 — 설계자 입력(분) · To=㎝-(t1+t3) 쓰는 곳 원문에 없음 · 자주식은 제외(주)",
"입력": [
{ "이름": "t2", "단위": "분" },
{ "이름": "t2", "설명": "한 번 싣고 내리는 데 드는 시간", "단위": "분" },
{
"이름": "지역",
"설명": "기계 경비를 셈할 노임 지역",
"고르기": [
"전국평균",
"전국",
@@ -183,6 +184,7 @@
},
{
"이름": "운반수단",
"설명": "장비를 실어 나르는 차 종류",
"고르기": [
"트레일러운반(20TON)",
"트럭운반(10.5TON)"
@@ -430,6 +430,7 @@
"입력": [
{
"이름": "횟수",
"설명": "거푸집 합판을 몇 번 돌려 쓰는지",
"고르기": [
"1회사용시",
"2회사용시",
@@ -441,12 +442,14 @@
},
{
"이름": "합판",
"설명": "거푸집에 쓸 합판 품목",
"고르기": [
"MT000018"
]
},
{
"이름": "각재",
"설명": "거푸집을 받치는 나무 품목",
"고르기": [
"MT000339",
"MT000338"
@@ -454,6 +457,7 @@
},
{
"이름": "철선",
"설명": "거푸집을 묶는 철선 품목",
"고르기": [
"MT000199",
"MT000204",
@@ -463,6 +467,7 @@
},
{
"이름": "못",
"설명": "거푸집에 쓸 못 품목",
"고르기": [
"MT000246",
"MT000247",
@@ -472,17 +477,20 @@
},
{
"이름": "박리제",
"설명": "거푸집을 떼기 쉽게 바르는 기름 품목",
"고르기": [
"MT000447"
]
},
{
"이름": "높이할증",
"설명": "높은 곳 작업이라 더 드는 품 비율",
"단위": "%",
"출처": "산림품셈 12-4 주"
},
{
"이름": "소형할증",
"설명": "규모가 작아 더 드는 품 비율",
"단위": "%",
"범위": [
0,
@@ -492,6 +500,7 @@
},
{
"이름": "폼타이",
"설명": "거푸집을 마주 당겨 묶는 폼타이를 쓰는지",
"고르기": [
"아님",
"사용"
@@ -1683,6 +1692,7 @@
"입력": [
{
"이름": "관경",
"설명": "묻을 관의 안지름",
"단위": "㎜",
"고르기": [
800,
@@ -1692,14 +1702,17 @@
},
{
"이름": "기초콘크리트량",
"설명": "관 1m 를 받치는 콘크리트 부피",
"단위": "㎥/m"
},
{
"이름": "거푸집면적",
"설명": "거푸집을 대는 넓이",
"단위": "㎡/m"
},
{
"이름": "지역",
"설명": "기계 경비를 셈할 노임 지역",
"고르기": [
"전국평균",
"전국",
@@ -1724,12 +1737,14 @@
},
{
"이름": "합판",
"설명": "거푸집에 쓸 합판 품목",
"고르기": [
"MT000018"
]
},
{
"이름": "각재",
"설명": "거푸집을 받치는 나무 품목",
"고르기": [
"MT000339",
"MT000338"
@@ -1737,6 +1752,7 @@
},
{
"이름": "철선",
"설명": "거푸집을 묶는 철선 품목",
"고르기": [
"MT000199",
"MT000204",
@@ -1746,6 +1762,7 @@
},
{
"이름": "못",
"설명": "거푸집에 쓸 못 품목",
"고르기": [
"MT000246",
"MT000247",
@@ -1755,17 +1772,20 @@
},
{
"이름": "박리제",
"설명": "거푸집을 떼기 쉽게 바르는 기름 품목",
"고르기": [
"MT000447"
]
},
{
"이름": "높이할증",
"설명": "높은 곳 작업이라 더 드는 품 비율",
"단위": "%",
"출처": "산림품셈 12-4 주"
},
{
"이름": "소형할증",
"설명": "규모가 작아 더 드는 품 비율",
"단위": "%",
"범위": [
0,
@@ -1775,13 +1795,14 @@
},
{
"이름": "폼타이",
"설명": "거푸집을 마주 당겨 묶는 폼타이를 쓰는지",
"고르기": [
"아님",
"사용"
],
"출처": "산림품셈 12-4 주⑦"
},
{"이름": "자재지역", "비고": "시·군 이름 — 레미콘·골재 시중물가 후보를 고름"}
{"이름": "자재지역", "설명": "레미콘·골재 값을 가져올 시·군", "비고": "시·군 이름 — 레미콘·골재 시중물가 후보를 고름"}
],
"중간": [],
"호표": [
@@ -1869,6 +1890,7 @@
"입력": [
{
"이름": "관경",
"설명": "묻을 관의 안지름",
"단위": "㎜",
"고르기": [
800,
@@ -1878,14 +1900,17 @@
},
{
"이름": "기초콘크리트량",
"설명": "관 1m 를 받치는 콘크리트 부피",
"단위": "㎥/m"
},
{
"이름": "거푸집면적",
"설명": "거푸집을 대는 넓이",
"단위": "㎡/m"
},
{
"이름": "지역",
"설명": "기계 경비를 셈할 노임 지역",
"고르기": [
"전국평균",
"전국",
@@ -1910,12 +1935,14 @@
},
{
"이름": "합판",
"설명": "거푸집에 쓸 합판 품목",
"고르기": [
"MT000018"
]
},
{
"이름": "각재",
"설명": "거푸집을 받치는 나무 품목",
"고르기": [
"MT000339",
"MT000338"
@@ -1923,6 +1950,7 @@
},
{
"이름": "철선",
"설명": "거푸집을 묶는 철선 품목",
"고르기": [
"MT000199",
"MT000204",
@@ -1932,6 +1960,7 @@
},
{
"이름": "못",
"설명": "거푸집에 쓸 못 품목",
"고르기": [
"MT000246",
"MT000247",
@@ -1941,17 +1970,20 @@
},
{
"이름": "박리제",
"설명": "거푸집을 떼기 쉽게 바르는 기름 품목",
"고르기": [
"MT000447"
]
},
{
"이름": "높이할증",
"설명": "높은 곳 작업이라 더 드는 품 비율",
"단위": "%",
"출처": "산림품셈 12-4 주"
},
{
"이름": "소형할증",
"설명": "규모가 작아 더 드는 품 비율",
"단위": "%",
"범위": [
0,
@@ -1961,13 +1993,14 @@
},
{
"이름": "폼타이",
"설명": "거푸집을 마주 당겨 묶는 폼타이를 쓰는지",
"고르기": [
"아님",
"사용"
],
"출처": "산림품셈 12-4 주⑦"
},
{"이름": "자재지역", "비고": "시·군 이름 — 레미콘·골재 시중물가 후보를 고름"}
{"이름": "자재지역", "설명": "레미콘·골재 값을 가져올 시·군", "비고": "시·군 이름 — 레미콘·골재 시중물가 후보를 고름"}
],
"중간": [],
"호표": [
@@ -2204,22 +2237,27 @@
"입력": [
{
"이름": "콘크리트량",
"설명": "부어 넣을 콘크리트 부피",
"단위": "㎥"
},
{
"이름": "거푸집면적",
"설명": "거푸집을 대는 넓이",
"단위": "㎡"
},
{
"이름": "기초잡석량",
"설명": "바닥에 까는 잡석 부피",
"단위": "㎥"
},
{
"이름": "철근량",
"설명": "넣을 철근 무게",
"단위": "ton"
},
{
"이름": "성토부",
"설명": "흙을 쌓아 올린 자리인지",
"고르기": [
"아님",
"성토부 날개벽"
@@ -2228,12 +2266,14 @@
},
{
"이름": "합판",
"설명": "거푸집에 쓸 합판 품목",
"고르기": [
"MT000018"
]
},
{
"이름": "각재",
"설명": "거푸집을 받치는 나무 품목",
"고르기": [
"MT000339",
"MT000338"
@@ -2241,6 +2281,7 @@
},
{
"이름": "철선",
"설명": "거푸집을 묶는 철선 품목",
"고르기": [
"MT000199",
"MT000204",
@@ -2250,6 +2291,7 @@
},
{
"이름": "못",
"설명": "거푸집에 쓸 못 품목",
"고르기": [
"MT000246",
"MT000247",
@@ -2259,17 +2301,20 @@
},
{
"이름": "박리제",
"설명": "거푸집을 떼기 쉽게 바르는 기름 품목",
"고르기": [
"MT000447"
]
},
{
"이름": "높이할증",
"설명": "높은 곳 작업이라 더 드는 품 비율",
"단위": "%",
"출처": "산림품셈 12-4 주"
},
{
"이름": "소형할증",
"설명": "규모가 작아 더 드는 품 비율",
"단위": "%",
"범위": [
0,
@@ -2279,6 +2324,7 @@
},
{
"이름": "폼타이",
"설명": "거푸집을 마주 당겨 묶는 폼타이를 쓰는지",
"고르기": [
"아님",
"사용"
@@ -2287,6 +2333,7 @@
},
{
"이름": "소형가산",
"설명": "규모가 작아 더 드는 철근 품 비율",
"단위": "%",
"범위": [
0,
@@ -2296,6 +2343,7 @@
},
{
"이름": "결속선",
"설명": "철근을 묶는 철선 품목",
"고르기": [
"MT000209",
"MT000174"
@@ -2303,6 +2351,7 @@
},
{
"이름": "브레이커",
"설명": "굳은 땅을 깨는 장비 규격",
"고르기": [
"아님",
"브레이커 사용"
@@ -2311,6 +2360,7 @@
},
{
"이름": "지역",
"설명": "기계 경비를 셈할 노임 지역",
"고르기": [
"전국평균",
"전국",
@@ -2335,6 +2385,7 @@
},
{
"이름": "보정작업",
"설명": "흙이 무르거나 좁아 능률이 떨어지는 작업인지",
"고르기": [
"해당 없음",
"암석작업(연암・보통암・경암)",
@@ -2342,7 +2393,7 @@
],
"출처": "건설품셈 공통 8-1-7 1"
},
{"이름": "자재지역", "비고": "시·군 이름 — 레미콘·골재 시중물가 후보를 고름"}
{"이름": "자재지역", "설명": "레미콘·골재 값을 가져올 시·군", "비고": "시·군 이름 — 레미콘·골재 시중물가 후보를 고름"}
],
"중간": [],
"호표": [
@@ -2926,34 +2977,42 @@
"입력": [
{
"이름": "구체콘크리트량",
"설명": "맨홀 몸통 콘크리트 부피",
"단위": "㎥"
},
{
"이름": "버림콘크리트량",
"설명": "바닥 고르기용 얇은 콘크리트 부피",
"단위": "㎥"
},
{
"이름": "원형거푸집_기초및슬라브면적",
"설명": "둥근 맨홀 바닥·뚜껑 거푸집 넓이",
"단위": "㎡"
},
{
"이름": "원형거푸집_벽체면적",
"설명": "둥근 맨홀 벽 거푸집 넓이",
"단위": "㎡"
},
{
"이름": "거푸집면적",
"설명": "거푸집을 대는 넓이",
"단위": "㎡"
},
{
"이름": "철근량",
"설명": "넣을 철근 무게",
"단위": "ton"
},
{
"이름": "사다리량",
"설명": "맨홀 안 사다리 무게",
"단위": "ton"
},
{
"이름": "지역",
"설명": "기계 경비를 셈할 노임 지역",
"고르기": [
"전국평균",
"전국",
@@ -2978,12 +3037,14 @@
},
{
"이름": "합판",
"설명": "거푸집에 쓸 합판 품목",
"고르기": [
"MT000018"
]
},
{
"이름": "각재",
"설명": "거푸집을 받치는 나무 품목",
"고르기": [
"MT000339",
"MT000338"
@@ -2991,6 +3052,7 @@
},
{
"이름": "철선",
"설명": "거푸집을 묶는 철선 품목",
"고르기": [
"MT000199",
"MT000204",
@@ -3000,6 +3062,7 @@
},
{
"이름": "못",
"설명": "거푸집에 쓸 못 품목",
"고르기": [
"MT000246",
"MT000247",
@@ -3009,17 +3072,20 @@
},
{
"이름": "박리제",
"설명": "거푸집을 떼기 쉽게 바르는 기름 품목",
"고르기": [
"MT000447"
]
},
{
"이름": "높이할증",
"설명": "높은 곳 작업이라 더 드는 품 비율",
"단위": "%",
"출처": "산림품셈 12-4 주"
},
{
"이름": "소형할증",
"설명": "규모가 작아 더 드는 품 비율",
"단위": "%",
"범위": [
0,
@@ -3029,6 +3095,7 @@
},
{
"이름": "폼타이",
"설명": "거푸집을 마주 당겨 묶는 폼타이를 쓰는지",
"고르기": [
"아님",
"사용"
@@ -3037,6 +3104,7 @@
},
{
"이름": "소형가산",
"설명": "규모가 작아 더 드는 철근 품 비율",
"단위": "%",
"범위": [
0,
@@ -3046,12 +3114,13 @@
},
{
"이름": "결속선",
"설명": "철근을 묶는 철선 품목",
"고르기": [
"MT000209",
"MT000174"
]
},
{"이름": "자재지역", "비고": "시·군 이름 — 레미콘·골재 시중물가 후보를 고름"}
{"이름": "자재지역", "설명": "레미콘·골재 값을 가져올 시·군", "비고": "시·군 이름 — 레미콘·골재 시중물가 후보를 고름"}
],
"중간": [],
"호표": [
@@ -3205,6 +3274,7 @@
"입력": [
{
"이름": "작업조",
"설명": "한 조에 몇 사람이 붙는지",
"고르기": [
"무근콘크리트",
"철근콘크리트"
@@ -3212,6 +3282,7 @@
},
{
"이름": "슬럼프",
"설명": "콘크리트가 묽은 정도",
"고르기": [
"8~12cm",
"15cm",
@@ -3220,6 +3291,7 @@
},
{
"이름": "시설유형",
"설명": "타설할 구조물 종류",
"고르기": [
"Type-",
"Type-Ⅱ",
@@ -3230,6 +3302,7 @@
},
{
"이름": "현장조건",
"설명": "차가 대기 좋은 자리인지",
"고르기": [
"Type-",
"Type-Ⅱ",
@@ -3239,6 +3312,7 @@
},
{
"이름": "재세팅",
"설명": "펌프차를 자리 옮겨 다시 세우는 횟수",
"고르기": [
"아님",
"펌프차 이동 및 재세팅"
@@ -3247,6 +3321,7 @@
},
{
"이름": "진동기",
"설명": "콘크리트를 다지는 진동기 종류",
"고르기": [
"사용",
"미사용"
@@ -3255,6 +3330,7 @@
},
{
"이름": "타설방법",
"설명": "콘크리트를 붓는 방법",
"고르기": [
"붐 타설",
"배관 타설"
@@ -3263,6 +3339,7 @@
},
{
"이름": "펌프차",
"설명": "쓸 펌프차 규격",
"고르기": [
"4504-0032",
"4504-0036",
@@ -3275,6 +3352,7 @@
},
{
"이름": "지역",
"설명": "기계 경비를 셈할 노임 지역",
"고르기": [
"전국평균",
"전국",
@@ -291,11 +291,11 @@
"비고": "「원문에 없는 조합: 뒷길이=25 · 돌=견치돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=견치돌 · 쌓기=켜쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=골쌓기 / 뒷길이=25 · 돌=깬돌 · 쌓기=켜쌓기 / 뒷길이=30 · 돌=견치돌 · 쌓기=골쌓기 외 5」",
"시험입력": {"높이": 4.0, "돌": "깬잡석"},
"입력": [
{ "이름": "뒷길이", "단위": "㎝", "고르기": [25, 30, 35, 45, 55, 60, 75] },
{ "이름": "돌", "고르기": ["견치돌", "깬돌", "깬잡석", "호박돌 및 야면석"] },
{ "이름": "쌓기", "고르기": ["골쌓기", "켜쌓기"] },
{ "이름": "높이", "단위": "m" },
{ "이름": "초과증가율", "단위": "%", "범위": [80, 100] }
{ "이름": "뒷길이", "설명": "쌓을 돌의 뒤쪽 길이", "단위": "㎝", "고르기": [25, 30, 35, 45, 55, 60, 75] },
{ "이름": "돌", "설명": "쌓을 돌 종류", "고르기": ["견치돌", "깬돌", "깬잡석", "호박돌 및 야면석"] },
{ "이름": "쌓기", "설명": "돌을 어긋나게 쌓는지 줄 맞춰 쌓는지", "고르기": ["골쌓기", "켜쌓기"] },
{ "이름": "높이", "설명": "쌓는 벽 높이", "단위": "m" },
{ "이름": "초과증가율", "설명": "기준 높이를 넘어 더 드는 품 비율", "단위": "%", "범위": [80, 100] }
],
"중간": [
{
+23
View File
@@ -961,3 +961,26 @@ def test_고르기_조건의_입력_자리_채움(whole):
assert mf.check_pick(whole, "시험", cond) == []
채움 = {k: mf.fill(v, {"관경": Decimal(800)}) for k, v in cond.items()}
assert mm.candidates(whole, 채움, None, "m")
TEST_KEYS = (
"GF000181",
"GF000177",
"GF000173",
"GF000174",
"GF000160",
"GF000182",
"GF000069",
"GF000219",
"GF000119",
"GF000137",
)
def test_테스트_대상_로직_입력에_설명(whole):
"""화면 도움말 — 테스트 컨테이너 대상 10 개는 입력마다 쉬운 말 한 줄."""
for key in TEST_KEYS:
specs = whole.logic(key).get("입력") or []
assert specs, key
빈칸 = [s["이름"] for s in specs if not str(s.get("설명") or "").strip()]
assert 빈칸 == [], (key, 빈칸)
-4
View File
@@ -64,10 +64,6 @@ export const ui_locales_m1 = {
M01_TableUsage: ["용도", "Usage"],
M01_TableUsageLogicCount: ["로직 {value}개", "{value} logic rules"],
M01_OpenLogic: ["눌러 로직 탭으로", "Click to jump to the Logic tab"],
M01_LogicKeyCopy: [
"로직 탭으로 이동 — 키 {value} 복사함(찾기에 붙여넣을 것)",
"Switched to Logic tab — copied key {value} (paste it into the search box)",
],
M01_GroupLabor: ["인력", "Labor"],
M01_GroupMaterial: ["재료", "Materials"],
M01_GroupMachine: ["기계", "Machines"],