Files
Aislo/ui_template/ui_template_logic_find.ts
T

54 lines
2.4 KiB
TypeScript

/* =============================================================================
* ui_template_logic_find.ts
* 단가산출 로직 찾기 맞춤(208-1) — 로직을 찾는 화면은 모두 이것 하나를 부름.
* 낱말(띄어 나눔)마다 키 · 원문번호 · 이름 · 구분 · 상세구분 · 별칭(쉼표로 여럿) 가운데 하나에 들면 맞음 ·
* 띄어쓰기 · 대소문자 무시. 별칭으로 맞았으면 그 별칭을 돌려줌(결과에 작게).
* 짝: `M01_MasterData_Store_Find.hit`(서버 찾기 — 키 · 원문번호 · 이름 · 별칭 · 낱말 규칙이 같음 ·
* 구분 · 상세구분은 화면만) · 거울 시험 `test_208_1_logic_alias.py`.
* ========================================================================== */
export interface LogicFindRow {
키?: string;
원문번호?: string;
이름?: string;
구분?: string;
상세구분?: string;
/** 쉼표로 여럿 · 없으면 빈칸 */
별칭?: string | null;
}
export interface LogicFindHit {
ok: boolean;
/** 별칭으로 맞았으면 맞은 별칭(쉼표로 이음) · 아니면 빈 글 */
alias: string;
}
const squash = (v: unknown): string =>
String(v ?? "")
.replace(/\s+/g, "")
.toLowerCase();
/** 별칭 칸 → 낱낱 별칭(쉼표로 나눔 · 빈 것 뺌) */
export const aliasesOf = (v: unknown): string[] =>
String(v ?? "")
.split(",")
.map((x) => x.trim())
.filter(Boolean);
/** 고친 별칭 글을 저장 꼴로 — 「a ,b,, c」 → 「a, b, c」 */
export const aliasText = (v: unknown): string => aliasesOf(v).join(", ");
/** 결과에 작게 붙이는 글 — 별칭으로 안 맞았으면 빈 글 */
export const aliasNote = (alias: string): string => (alias ? `별칭 ${alias}` : "");
export function matchLogic(q: string, row: LogicFindRow): LogicFindHit {
const words = q.split(/\s+/).map(squash).filter(Boolean);
const fields = [row.키, row.원문번호, row.이름, row.구분, row.상세구분].map(squash);
const missed = words.filter((w) => !fields.some((f) => f.includes(w)));
if (!missed.length) return { ok: true, alias: "" };
const aliases = aliasesOf(row.별칭);
const has = (a: string, w: string): boolean => squash(a).includes(w);
if (!missed.every((w) => aliases.some((a) => has(a, w)))) return { ok: false, alias: "" };
return { ok: true, alias: aliases.filter((a) => missed.some((w) => has(a, w))).join(", ") };
}