- 새 Hopyo_Check(확인 창 · 본 칸 · 모달) — 상태 색 · 체크 제안 · 우리 로직 여럿 · 배 · 몫 · 옵션 · 품 비교 · 뺌 · 원문 보기 · 캐시 m02-hopyo-check · 셈 중 3 초 다시 읽음 · 최신 응답만 - 새 Hopyo_Choose(고르기 창 · 후보 판정 · 여럿 고름 · 몫 · 찾기 글 미리 넣음) · 새 Hopyo_Ledger(장부 화면 · 고친 것 캐시 · [저장] 때만 PUT) - 고침 View(호표 하나 = 확인 창) · Sheet(펼침 뒤 한 번 · 하위 호표 먼저) · Pick(확인된 것 바로 참조 · 아니면 확인 창) · Api(3-3 꼴 · 만들기 몸 · 장부 길) · Side([별칭 장부]) · css · Labor_Pick(query) - 없앰 saveHopyoMemory · [확정] · [같음 모두 확정] · [근거 맞음 모두 확정] · 바로 만들기 - 시험 test_m02_hopyo_screen.py 새로 · helper_m02_hopyo_check.cjs 새 · pick · seam 도우미 손질 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XWh5wNNycMkbwMpACz1rte
66 lines
2.9 KiB
JavaScript
66 lines
2.9 KiB
JavaScript
/* M02 일위대가 실무자료 이음매(329 · 330) 헬퍼 — 실제 서버 응답(격자 · 호표 맞춤)을
|
|
* `M02_MasterTemplete_Hopyo_Sheet.ts`(행 → 호표 · 영역 A1) · `M02_MasterTemplete_Hopyo_Choose.ts`
|
|
* (근거 꼬리표 · 엑셀 근거 줄 · 근거 맞음)에 먹임 ·
|
|
* stdin = {grid, lines, all} · stdout = {at, span, rows, lines: [{이름, source, tag, ok}],
|
|
* count: {top}} JSON — count = 「후보」 줄 1순위 근거 맞음. */
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const ts = require(path.join(__dirname, "..", "..", "config", "node_modules", "typescript"));
|
|
|
|
const ROOT = path.join(__dirname, "..", "..");
|
|
const STUBS = { "@config/config_frontend": { API_BASE_URL: "/api" } };
|
|
const STUB_FILES = [
|
|
"M02_MasterTemplete_Labor_Pick",
|
|
"M02_Material_Pick",
|
|
"M02_MasterTemplete_Labor_Api",
|
|
"M02_MasterTemplete_Labor_Input",
|
|
"M01_MasterData_UI_LogicLab_Source",
|
|
];
|
|
const stub = new Proxy({}, { get: (_t, k) => (k === "currentLanguageIndex" ? () => 0 : () => {}) });
|
|
const cache = new Map();
|
|
function loadTs(file) {
|
|
const full = path.resolve(file);
|
|
if (cache.has(full)) return cache.get(full);
|
|
const js = ts.transpileModule(fs.readFileSync(full, "utf8"), {
|
|
compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2020 },
|
|
}).outputText;
|
|
const box = { exports: {} };
|
|
cache.set(full, box.exports);
|
|
const localRequire = (request) => {
|
|
if (STUBS[request]) return STUBS[request];
|
|
if (STUB_FILES.some((name) => request.endsWith(name))) return stub;
|
|
if (request.startsWith(".") && !request.endsWith(".css"))
|
|
return loadTs(`${path.resolve(path.dirname(full), request)}.ts`);
|
|
return stub;
|
|
};
|
|
new Function("exports", "module", "require", js)(box.exports, box, localRequire);
|
|
return box.exports;
|
|
}
|
|
|
|
const input = JSON.parse(fs.readFileSync(0, "utf8"));
|
|
const M02 = path.join(ROOT, "M02_MasterTemplete");
|
|
const sheet = loadTs(path.join(M02, "M02_MasterTemplete_Hopyo_Sheet.ts"));
|
|
const view = loadTs(path.join(M02, "M02_MasterTemplete_Hopyo_Choose.ts"));
|
|
const { grid } = input;
|
|
const ilwi = grid.책.시트.find((s) => s.이름 === "일위대가");
|
|
const three = grid.호표.find((h) => h.번 === 3);
|
|
const out = {
|
|
at: [19, 20, 22, 24, 25, 26].map((row) => sheet.hopyoAtRow(grid.호표, row)),
|
|
span: sheet.spanText(three.행, sheet.lastColumn(ilwi)),
|
|
rows: sheet.rowsText(grid.단산.find((b) => b.번 === 93).행),
|
|
lines: input.lines.map((line) => {
|
|
const top = (line.맞춤.후보 ?? [])[0];
|
|
return {
|
|
이름: line.이름,
|
|
source: view.sourceText(line.근거),
|
|
tag: view.basisTag(top?.근거),
|
|
ok: view.basisOk(top?.근거, line.근거),
|
|
};
|
|
}),
|
|
};
|
|
const open = (input.all ?? []).filter((line) => line.맞춤.상태 === "후보");
|
|
out.count = {
|
|
top: open.filter((line) => view.basisOk((line.맞춤.후보 ?? [])[0]?.근거, line.근거)).length,
|
|
};
|
|
process.stdout.write(JSON.stringify(out));
|