feat(master_data): 로직 재료 줄 고르기 조건 — 구분·상세구분·규격 후보 · 대표 줄 · 후보 목록 API
- `_틀.md` 7장에 재료 고르기 문법 — 호표 `요소` 를 조건 묶음으로 · 규격 낱말 조건 · 대표 줄 지정 - 엔진 `candidates`·`pick`·`check_pick` — 조건 안 후보 목록(화면·테스트 컨테이너 공용) · 시험 계산은 대표 줄, 없으면 값 있는 첫 줄(자재지역 우선) - 로직 검사에 고르기 조건 검사 — 칸 이름 · 자재품목에 없는 구분·상세구분 · 조건 밖 대표 · 후보 0 - M01 서버 `GET /api/m01/materials` — 구분·상세구분·규격·자재지역으로 좁힌 후보와 기본 줄 - 옛 방식 재료 줄(`MP…`·`MT…` 키)은 그대로 돎 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
@@ -412,6 +412,29 @@ def pick(kind: str, q: str, limit: int) -> dict:
|
||||
return {"total": len(hits), "items": hits[: min(max(limit, 1), 200)]}
|
||||
|
||||
|
||||
def _market_brief(row: dict) -> dict:
|
||||
return {
|
||||
"ref": str(row.get("키")),
|
||||
**{k: row.get(k) for k in ("구분", "상세구분", "이름", "규격", "단위")},
|
||||
"값": _lowest(row),
|
||||
"관급": row.get("관급") is not None,
|
||||
}
|
||||
|
||||
|
||||
def materials(sub: str, detail: str, spec: str, region: str, limit: int) -> dict:
|
||||
"""재료 고르기 조건 안 후보 목록 — 화면·테스트 컨테이너가 같이 씀.
|
||||
`기본` = 시험 계산이 쓸 줄(대표 줄이 없을 때의 첫 줄)."""
|
||||
whole = cm.master(folder=FOLDER)
|
||||
cond = {"구분": sub, "상세구분": detail or None, "규격": spec or None}
|
||||
env = {cm.mf.REGION: region} if region else {}
|
||||
keys = cm.mf.candidates(whole, cond, env)
|
||||
return {
|
||||
"total": len(keys),
|
||||
"기본": cm.mf.pick(whole, cond, env) if keys else None,
|
||||
"items": [_market_brief(whole.get(k)) for k in keys[: min(max(limit, 1), 200)]],
|
||||
}
|
||||
|
||||
|
||||
# ── 시험 계산 ──────────────────────────────────────────────────────────
|
||||
def _swap(files: dict, key: str, row: dict, file: str | None) -> str:
|
||||
"""저장 전 시험 — 메모리 사본에서 그 로직을 고친 줄로 바꿈(없으면 `file` 에 더함) · 돌려받는 것 = 계산할 키."""
|
||||
|
||||
Reference in New Issue
Block a user