Files
Aislo/resources/tester/helper_stmate_std.cjs
T
eomsangdonandClaude Opus 5.5 4ff96a6771 feat(stmate-test): REA MCP(Ghidra) 계산 엔진 — 표준시장단가(A 코드 COSTA) 내역 연결 · EXRNM 켜짐 경로 · 손료 반올림 MROUNDUD · 적용기준 콤보 값
- A 코드 = COSTA · S_JDA 참 = 저장 단가 · 거짓 = AAMTn 노무비율 나눔 · ACTTYP·ACTOPT = PRJLST · calcBoq·api_load 연결
- EXRNM 참 = S 줄만 단가×율/1000 · ECD 자리 버림 · 천원 · 전각 $
- 손료 계수 반올림 = 첫 버림 자리 5 이상 올림
- 적용기준 국가 2·지방 0·행자부 1 · 행자부 RATE_M 조회 rateMLookup
- 지식DB 36번

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-14 15:44:22 +09:00

49 lines
1.9 KiB
JavaScript

// STMATE 재현 앱 — 표준시장단가(A) 내역·구성 · 외화 환산(EXRNM) · 행자부 RATE_M 조회 · stdin {mode, ...} → 결과
// boq: calc.calculateAll 내역 줄 · comp: smt_engine 단가 읽기(costnLookup) + 구성 조립 · ratem: kanjub_parts.NATIVE.rateMLookup
globalThis.window = globalThis;
const C = require("../../tools/stmate-test/calc.js");
const Parts = require("../../tools/stmate-test/kanjub_parts.js");
require("../../tools/stmate-test/smt_eval.js");
require("../../tools/stmate-test/smt_engine.js");
const E = window.STMATE_ENGINE;
const V = window.STMATE_SMT_EVAL;
const MODES = {
boq({ items, rows, std, slot }) {
const st = C.createDefaultState();
Object.assign(st, { stdMarketItems: items, boqItems: rows });
st.sysConfig.stdMarket = std;
const res = C.calculateAll(st);
const boq = slot === 2 ? res.boqRev : res.boqOrig;
const pick = (r) => ({ M: r.M, L: r.L, S: r.S, A: r.A, T: r.T, uL: r.lUnit, uM: r.mUnit });
return { rows: boq.rows.map(pick), directA: boq.directA, directT: boq.directT };
},
comp({ cases }) {
return cases.map((c) => {
const ctx = {
dbfData: Object.assign({ start_ini: {}, costn_rows: [], costa_rows: [] }, c.data),
state: { sysConfig: {} },
};
const code = c.code || "B00001";
const opts = E.compositionOptions(ctx, code, {});
const { lookup } = E.costnLookup(ctx);
const ev = V.evaluateComposition(c.rows, lookup, opts);
return { M: ev.M, L: ev.L, S: ev.S, unit: c.peek ? lookup(c.peek) : null };
});
},
ratem({ rows, cases }) {
return {
setBase: Parts.NATIVE.SET_BASE,
out: cases.map((o) => Parts.NATIVE.rateMLookup(rows, o)),
};
},
};
let buf = "";
process.stdin.setEncoding("utf8");
process.stdin.on("data", (d) => (buf += d));
process.stdin.on("end", () => {
const req = JSON.parse(buf);
process.stdout.write(JSON.stringify(MODES[req.mode](req)));
});