feat(831-1): 단가산출 기초 목록 책 차례 = 건설품셈 → 산림품셈 → 자체

- 정본 = 장 파일 머리 「차례」(order_chapters) — 건설 공통·토목·건축·기계설비·유지관리 → 산림 → 자체 로 다시 매김(소요량 · 계수 · 로직 144 파일 머리 한 줄씩)
- 「차례」 없는 파일(자체)은 맨 뒤 — chapter_order 한 곳 · M01 목록 · 로직 목록 · M02 기준 목록 셈 순서가 같이 따름
- 낡은 시험 test_m01_api 의 산림 먼저 단정 2 줄 고침 · 지킴 시험 test_843_book_order 추가
- 로직 내용 · 키 · 금액 그대로

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-15 09:43:23 +09:00
co-authored by Claude Sonnet 5.5
parent 4aba3bfe53
commit e4580ecf09
146 changed files with 183 additions and 150 deletions
+7 -2
View File
@@ -115,6 +115,11 @@ def groups() -> list[dict]:
return list(out.values())
def chapter_order(data: dict) -> int:
"""장 파일 머리 「차례」 — 없으면(자체 등) 맨 뒤."""
return data.get("차례") or 9999
def files_of(group: str) -> list[dict]:
if group not in cm.mf.GROUPS:
raise StoreError(404, f"없는 그룹 「{group}」")
@@ -131,7 +136,7 @@ def files_of(group: str) -> list[dict]:
"edition": data.get("판"),
"rows": len(data.get(items_key(data)) or []),
"version": version,
"order": data.get("차례") or 0,
"order": chapter_order(data),
}
)
return sorted(out, key=lambda f: (f["order"], f["file"]))
@@ -349,7 +354,7 @@ def logics(sub: str, detail: str, q: str, blocked: int | None, owner: str = "")
files, _ = loaded()
why_of = blocks()
out = []
for name, data in sorted(_logic_files(files), key=lambda f: f[1].get("차례") or 0):
for name, data in sorted(_logic_files(files), key=lambda f: chapter_order(f[1])):
for row in data.get("줄") or []:
if (sub and row.get("구분") != sub) or (detail and row.get("상세구분") != detail):
continue
+1 -1
View File
@@ -249,7 +249,7 @@ def build(files: dict, workers: int = 1) -> dict:
blocked = {k for k, why in why_of.items() if why}
keys = [
str(logic.get("키"))
for _, data in sorted(m01._logic_files(files), key=lambda f: f[1].get("차례") or 0)
for _, data in sorted(m01._logic_files(files), key=lambda f: m01.chapter_order(f[1]))
for logic in data.get("줄") or []
]
size = max(1, len(keys) // (workers * 8))
+9 -2
View File
@@ -341,15 +341,22 @@ def _strings(v):
yield from _strings(x)
BOOK_ORDER = ("건설품셈", "산림품셈", "자체") # 목록 책 차례
def order_chapters(folder: Path = MASTER) -> None:
"""장 파일 머리 「차례」 — 그룹마다 산림 1~14장 → 건설 공통 · 토목 · 건축 · 기계설비 · 유지관리."""
"""장 파일 머리 「차례」 — 그룹마다 건설 공통 · 토목 · 건축 · 기계설비 · 유지관리 → 산림 1~14장 → 자체."""
found = {}
for path in folder.glob("*.json"):
m = CHAPTER.match(path.name)
if m:
data = _read(path)
division = data.get("부문") or ""
rank = (m[2] != "산림품셈", DIVISIONS.index(division) if division else -1, int(m[3]))
rank = (
BOOK_ORDER.index(m[2]),
DIVISIONS.index(division) if division else -1,
int(m[3]),
)
found.setdefault(m[1], []).append((rank, path.name, data.get("차례")))
for items in found.values():
for i, (_, name, had) in enumerate(sorted(items), start=1):
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 22,
"차례": 17,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "공통",
"차례": 6,
"차례": 1,
"부문": "공통",
"판": "2026",
"표": [
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 11,
"차례": 6,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 23,
"차례": 18,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 12,
"차례": 7,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 24,
"차례": 19,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 13,
"차례": 8,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "토목",
"차례": 8,
"차례": 3,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "토목",
"차례": 9,
"차례": 4,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 14,
"차례": 9,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 25,
"차례": 20,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "토목",
"차례": 10,
"차례": 5,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 26,
"차례": 21,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 15,
"차례": 10,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 16,
"차례": 11,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 27,
"차례": 22,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 17,
"차례": 12,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "공통",
"차례": 7,
"차례": 2,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 18,
"차례": 13,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 19,
"차례": 14,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 20,
"차례": 15,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "계수",
"원문": "건설품셈",
"부문": "건축",
"차례": 21,
"차례": 16,
"판": "2026",
"표": [
{
@@ -1,7 +1,7 @@
{
"그룹": "계수",
"원문": "산림품셈",
"차례": 1,
"차례": 23,
"판": "산림청고시 제2025-82호",
"표": [
{
@@ -1,7 +1,7 @@
{
"그룹": "계수",
"원문": "산림품셈",
"차례": 2,
"차례": 24,
"판": "2026-01-01",
"표": [
{
@@ -1,7 +1,7 @@
{
"그룹": "계수",
"원문": "산림품셈",
"차례": 3,
"차례": 25,
"판": "2026-01-01",
"표": [
{
@@ -1,7 +1,7 @@
{
"그룹": "계수",
"원문": "산림품셈",
"차례": 4,
"차례": 26,
"판": "2026-01-01",
"표": [
{
@@ -1,7 +1,7 @@
{
"그룹": "계수",
"원문": "산림품셈",
"차례": 5,
"차례": 27,
"판": "2026-01-01",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "유지관리",
"차례": 53,
"차례": 42,
"부문": "유지관리",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "토목",
"차례": 20,
"차례": 9,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 40,
"차례": 29,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "공통",
"차례": 13,
"차례": 1,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 29,
"차례": 18,
"부문": "건축",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "공통",
"차례": 13,
"차례": 2,
"부문": "공통",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 41,
"차례": 30,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 30,
"차례": 19,
"부문": "건축",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "유지관리",
"차례": 54,
"차례": 43,
"부문": "유지관리",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "토목",
"차례": 21,
"차례": 10,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "유지관리",
"차례": 55,
"차례": 44,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 42,
"차례": 31,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 31,
"차례": 20,
"부문": "건축",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "토목",
"차례": 22,
"차례": 11,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "공통",
"차례": 14,
"차례": 3,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "토목",
"차례": 23,
"차례": 12,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "유지관리",
"차례": 56,
"차례": 45,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 32,
"차례": 21,
"부문": "건축",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "공통",
"차례": 15,
"차례": 4,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 43,
"차례": 32,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "토목",
"차례": 24,
"차례": 13,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "공통",
"차례": 16,
"차례": 5,
"부문": "공통",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 44,
"차례": 33,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 33,
"차례": 22,
"부문": "건축",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "토목",
"차례": 25,
"차례": 14,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 34,
"차례": 23,
"부문": "건축",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "공통",
"차례": 17,
"차례": 6,
"부문": "공통",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 45,
"차례": 34,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "공통",
"차례": 18,
"차례": 7,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 46,
"차례": 35,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 35,
"차례": 24,
"부문": "건축",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "토목",
"차례": 26,
"차례": 15,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "공통",
"차례": 19,
"차례": 8,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 47,
"차례": 36,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 36,
"차례": 25,
"부문": "건축",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "토목",
"차례": 27,
"차례": 16,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 48,
"차례": 37,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 37,
"차례": 26,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "토목",
"차례": 28,
"차례": 17,
"판": "2026",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 49,
"차례": 38,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 38,
"차례": 27,
"부문": "건축",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 50,
"차례": 39,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "건축",
"차례": 39,
"차례": 28,
"부문": "건축",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 51,
"차례": 40,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -2,7 +2,7 @@
"그룹": "로직",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 52,
"차례": 41,
"부문": "기계설비",
"판": "2026",
"줄": [
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 0,
"차례": 46,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 1,
"차례": 47,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 2,
"차례": 48,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 3,
"차례": 49,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 4,
"차례": 50,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 5,
"차례": 51,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 6,
"차례": 52,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 7,
"차례": 53,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 8,
"차례": 54,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 9,
"차례": 55,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 10,
"차례": 56,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 11,
"차례": 57,
"판": "2026-01-01",
"줄": [
{
@@ -1,7 +1,7 @@
{
"그룹": "로직",
"원문": "산림품셈",
"차례": 12,
"차례": 58,
"판": "2026-01-01",
"줄": [
{
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "유지관리",
"차례": 53,
"차례": 40,
"부문": "유지관리",
"판": "2026",
"표": [
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "토목",
"차례": 20,
"차례": 7,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 40,
"차례": 27,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "건축",
"차례": 29,
"차례": 16,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "공통",
"차례": 14,
"차례": 1,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 41,
"차례": 28,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "건축",
"차례": 30,
"차례": 17,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "유지관리",
"차례": 54,
"차례": 41,
"부문": "유지관리",
"판": "2026",
"표": [
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "토목",
"차례": 21,
"차례": 8,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "유지관리",
"차례": 55,
"차례": 42,
"부문": "유지관리",
"판": "2026",
"표": [
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "기계설비",
"차례": 42,
"차례": 29,
"판": "2026",
"표": [
{
@@ -2,7 +2,7 @@
"그룹": "소요량",
"원문": "건설품셈",
"부문": "건축",
"차례": 31,
"차례": 18,
"판": "2026",
"표": [
{

Some files were not shown because too many files have changed in this diff Show More