/* ============================================================================= * 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(", ") }; }