feat(abut): 교대 복합명(A1-완도 등)과 가져오기 문제 목록

교대 이름을 전체 명칭으로 해석하고, 엑셀 가져오기 문제를 목록으로 모은다.
교각 이름과의 중복을 저장 파일 검사에서도 막는다(checkStoredAbutments).
검사 스크립트 verify-abut-names · verify-abut-workflow 포함.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-11-06 13:14:53 +09:00
1 parent 0c23173a1a
commit 3922b330d5
8 files changed
+610 -13

No files matched your search

+35
View File
@@ -0,0 +1,35 @@
import type { Issue } from '../types';
export interface AbutImportIssueGroup {
name?: string;
primary: Issue[];
related: Issue[];
}
/** Keep root errors visible while retaining every dependent row in a disclosure. */
export function groupAbutImportIssues(issues: readonly Issue[]): AbutImportIssueGroup[] {
const groups: { name?: string; issues: Issue[] }[] = [];
const byName = new Map<string, { name: string; issues: Issue[] }>();
for (const issue of issues) {
if (issue.pier === undefined) {
groups.push({ issues: [issue] });
continue;
}
let group = byName.get(issue.pier);
if (!group) {
group = { name: issue.pier, issues: [] };
byName.set(issue.pier, group);
groups.push(group);
}
group.issues.push(issue);
}
return groups.map(({ name, issues: items }) => {
const primary = items.filter((issue) => issue.code !== 'AP04');
const related = items.filter((issue) => issue.code === 'AP04');
if (!primary.length && related.length) primary.push({
...related[0],
message: `교대 ${name ?? ''}: 교대 정보 행이 없어 IP·받침 ${related.length}개 행을 연결하지 못했습니다. 전체 교대명을 확인하세요.`,
});
return { name, primary, related };
});
}