- 옛 B08 식 풀이기(git 8472fc9f)의 분수 · 파서를 ui_template/sheet/ 로 되살림 — 필요한 함수만
- 열 참조 [열id] · 셀 참조 [열id@줄id] · 변수 [$이름] · SUM · INT · ROUND · ROUNDUP · ROUNDDOWN · MIN · MAX · IF
- 한 칸만 다른 식(줄.식) · 합계 줄 열마다 다른 식 · 끝수(반올림 · 올림 · 버림) · 순환은 그 칸만 오류
- 서버 껍데기 common_util_sheet_recalc.py · build:formula 가 새 진입점을 가리킴(깨진 B08 경로 고침)
- 시험 — 실무 울진 2공구 구조물집계표 합계 캐시값 · 파이썬 Decimal 거울 40문서
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Tjoit7rxvpLMM7cafeVTo1
40 lines
1.6 KiB
Python
40 lines
1.6 KiB
Python
"""표 문서(마스터 템플릿 표 양식) 서버 재계산 — 화면과 같은 TS 를 Node 로 돌리는 껍데기.
|
|
|
|
CLAUDE.md 5장 ② — 계산은 `ui_template/sheet/ui_template_sheet_recalc.ts` 한 벌.
|
|
여기는 번들을 부르기만 함(`npm run build:formula` → `config/formula_node/`).
|
|
[저장] 때 브라우저 값을 받아 적지 않고 이 결과를 정본으로 씀.
|
|
|
|
결과 = `{계산: {줄: {열: 값}}, 합계: {합계줄: {열: 값}}, 오류: [{줄, 열, 까닭}]}` · 값은 십진 글.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from common_util.common_util_node_bundle import ROOT, build_bundle, run_bundle_json
|
|
|
|
BUNDLE = ROOT / "config" / "formula_node" / "ui_template_sheet_node.js"
|
|
NPM_SCRIPT = "build:formula"
|
|
SOURCE_DIR = ROOT / "ui_template" / "sheet"
|
|
|
|
|
|
def _stale() -> bool:
|
|
"""번들이 없거나 표 TS 원본보다 오래됐으면 참 — 낡으면 화면과 서버가 다른 값을 냄."""
|
|
if not BUNDLE.is_file():
|
|
return True
|
|
built_at = BUNDLE.stat().st_mtime
|
|
return any(p.stat().st_mtime > built_at for p in SOURCE_DIR.glob("*.ts"))
|
|
|
|
|
|
def recalc_sheets(docs: list[dict[str, Any]]) -> list[dict[str, Any]] | None:
|
|
"""표 문서 여럿을 한 번에 — 입력 차례 그대로 결과. 번들 빌드·실행 실패는 None."""
|
|
if _stale() and not build_bundle(NPM_SCRIPT):
|
|
return None
|
|
out = run_bundle_json(BUNDLE, NPM_SCRIPT, {"docs": docs})
|
|
return None if out is None else out["results"]
|
|
|
|
|
|
def recalc_sheet(doc: dict[str, Any]) -> dict[str, Any] | None:
|
|
results = recalc_sheets([doc])
|
|
return None if results is None else results[0]
|