Merge remote-tracking branch 'origin/dev' into sub_laptop_3

This commit is contained in:
2026-11-09 21:04:22 +09:00
119 changed files with 3668 additions and 1126 deletions
+2 -1
View File
@@ -33,7 +33,8 @@ def index() -> dm.Index:
"""M01 수식 문서 색인 — 폴더가 바뀌면(M01 관리자 고침) 다시."""
docs = dc.folder()
if _INDEX["문서"] is not docs:
_INDEX["문서"], _INDEX["색인"] = docs, dm.Index(docs)
aims = {k: d for k, d in docs.items() if not d.get("부품")} # 부품 문서 = 과녁 아님(813-2)
_INDEX["문서"], _INDEX["색인"] = docs, dm.Index(aims)
return _INDEX["색인"]
+7
View File
@@ -10,6 +10,7 @@ from __future__ import annotations
from fastapi import APIRouter, HTTPException
from M01_MasterData import M01_MasterData_Parts as parts
from M01_MasterData import M01_MasterData_Router as m01
from M02_MasterTemplete import M02_Machine_Hourly as machine
@@ -72,3 +73,9 @@ def post_text(body: m01.CalcBody) -> dict:
def get_machine_hourly(key: str) -> dict:
"""기계(EQ) 한 시간 값 노 · 재 · 경(736-3 · [항목 추가] 기계 고정 줄 단가)."""
return machine.hourly(key)
@router.get("/machine-parts")
def get_machine_parts(no: str) -> dict:
"""줄 쌓기 기계 넣기(813-2) — 기계 원문번호 → 그 기종 작업량 틀(문서째)."""
return m01._call(parts.of_machine, no)
+8 -3
View File
@@ -41,6 +41,12 @@ def _rank(row: dict) -> tuple:
return (attach, loss, loss and "보정작업" in names, len(_codes(row)), str(row.get("키")))
def logic_of(code: str) -> dict | None:
"""기계 원문번호 → 그 기계 시간당 경비 로직(짝 차례 첫째) · 없으면 None(813-2 M01 화면도 씀)."""
fit = [r for r in _family() if code in [str(c) for c in _codes(r)]]
return min(fit, key=_rank) if fit else None
def hourly(key: str) -> dict[str, Any]:
"""`{ok, 이름, 규격, 로직, 원문번호, 노무비, 재료비, 경비, 계}` · 못 셈 = `{ok: False, reason}`."""
if not key.startswith("EQ"):
@@ -50,10 +56,9 @@ def hourly(key: str) -> dict[str, Any]:
except cm.mf.FormulaError as e:
return {"ok": False, "reason": str(e)}
code = str(row.get("원문번호") or "")
fit = [r for r in _family() if code in [str(c) for c in _codes(r)]]
if not fit:
logic = logic_of(code)
if not logic:
return {"ok": False, "reason": f"「{row.get('이름')}」 은 시간당 경비를 셀 자료가 없음"}
logic = min(fit, key=_rank)
args = "".join(
f", {i['이름']}='{(i.get('고르기') or [''])[0]}'"
for i in logic.get("입력") or []
@@ -19,6 +19,7 @@ from pydantic import BaseModel
from common_util.common_util_auth import verify_session
from common_util.common_util_http_cache import cached_file_response
from M01_MasterData import M01_MasterData_Parts as parts
from M01_MasterData import M01_MasterData_Store as m01
from M01_MasterData import M01_MasterData_Store_Make as make
from M02_MasterTemplete import M02_Labor_Inputs as labor_inputs
@@ -40,7 +41,7 @@ def _read(fn, *args):
@router.get("/logic-lib/logics", dependencies=[Depends(verify_session)])
def get_logics() -> dict:
return {"logics": _read(m01.logics, "", "", "", None)}
return {"logics": parts.strip(_read(m01.logics, "", "", "", None))} # 부품 문서 뺌(813-2)
@router.get("/logic-lib/subs", dependencies=[Depends(verify_session)])