import { VersionStatus } from './version-status'; import type { Stage, Role } from './stage'; interface VersionMember { role: Role; name: string; } interface RoleProgress { role: Role; percent: number; daysSpent: number; } interface ProductOverviewLike { id: string; name: string; projects: { id: string; name: string; description: string; createdAt: string }[]; versions: { id: string; name: string; status?: string; releaseDate: string | null; createdAt: string; currentStage?: Stage; startDate?: string | null; expectedReleaseDate?: string | null; members?: VersionMember[]; progress?: RoleProgress[]; }[]; } export interface ProjectWithContext { id: string; name: string; description: string; createdAt: string; productId: string; productName: string; versions: VersionWithContext[]; } export interface VersionWithContext { id: string; name: string; status: VersionStatus; releaseDate: string | null; createdAt: string; productId: string; productName: string; projectName: string; currentStage?: Stage; startDate?: string | null; expectedReleaseDate?: string | null; members?: VersionMember[]; progress?: RoleProgress[]; } export function flattenProjects(overview: ProductOverviewLike[]): ProjectWithContext[] { const result: ProjectWithContext[] = []; for (const product of overview) { for (const project of product.projects) { const versions = product.versions .filter((v) => v.name.toLowerCase().startsWith(project.name.toLowerCase())) .map((v) => ({ ...v, status: (v.status || 'released') as VersionStatus, productId: product.id, productName: product.name, projectName: project.name, })); result.push({ ...project, productId: product.id, productName: product.name, versions, }); } } return result; } export function flattenVersions(overview: ProductOverviewLike[]): VersionWithContext[] { const result: VersionWithContext[] = []; for (const product of overview) { for (const version of product.versions) { const project = product.projects.find((p) => version.name.toLowerCase().startsWith(p.name.toLowerCase()), ); result.push({ ...version, status: (version.status || 'released') as VersionStatus, productId: product.id, productName: product.name, projectName: project?.name || '未关联', }); } } return result; } export function getProjectDetail(overview: ProductOverviewLike[], projectId: string): ProjectWithContext | null { const projects = flattenProjects(overview); return projects.find((p) => p.id === projectId) || null; }