교대 이름을 전체 명칭으로 해석하고, 엑셀 가져오기 문제를 목록으로 모은다. 교각 이름과의 중복을 저장 파일 검사에서도 막는다(checkStoredAbutments). 검사 스크립트 verify-abut-names · verify-abut-workflow 포함. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
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 };
|
|
});
|
|
}
|