// types/evaluation-form.ts export interface AttachmentInfo { id: number originalFileName: string storedFileName: string publicPath: string fileSize: number mimeType?: string fileExtension?: string description?: string uploadedBy: number uploadedByName?: string createdAt: Date updatedAt: Date } export interface EvaluationQuestionItem { criteriaId: number category: string category2: string item: string classification: string range: string scoreType: 'fixed' | 'variable' remarks: string | null availableOptions: { detailId: number detail: string score: number orderIndex: number }[] // 현재 응답 정보 responseId: number | null selectedDetailId: number | null currentScore: string | null currentComment: string | null // 📎 첨부파일 정보 추가 attachments: AttachmentInfo[] attachmentCount: number attachmentTotalSize: number } export interface EvaluationFormData { evaluationInfo: { id: number periodicEvaluationId: number evaluationTargetReviewerId: number isCompleted: boolean departmentCode: string division: string materialType: string vendorName: string vendorCode: string reviewerType: string } questions: EvaluationQuestionItem[] // 📎 전체 첨부파일 통계 attachmentStats: { totalFiles: number totalSize: number questionsWithAttachments: number filesByCategory: Record } } // types/evaluation-detail.ts export interface AttachmentDetail { id: number originalFileName: string storedFileName: string publicPath: string fileSize: number mimeType?: string fileExtension?: string description?: string uploadedBy: number uploadedByName?: string createdAt: Date } export interface EvaluationDetailItem { criteriaId: number category: string category2: string item: string classification: string range?: string remarks?: string scoreType: string selectedDetailId?: number | null selectedDetail?: string | null score: number | null comment?: string | null // 📎 첨부파일 정보 추가 attachments: AttachmentDetail[] attachmentCount: number attachmentTotalSize: number } export interface EvaluationDetailData { reviewerEvaluationId: number reviewerName: string reviewerEmail: string departmentCode: string departmentName: string isCompleted: boolean completedAt?: Date | null reviewerComment?: string | null evaluationItems: EvaluationDetailItem[] // 📎 리뷰어별 첨부파일 통계 totalAttachments: number totalAttachmentSize: number questionsWithAttachments: number } export interface EvaluationDetailResponse { evaluationInfo: { id: number vendorName: string vendorCode: string evaluationYear: number division: string status: string } reviewerDetails: EvaluationDetailData[] // 📎 전체 첨부파일 통계 attachmentStats: { totalFiles: number totalSize: number reviewersWithAttachments: number questionsWithAttachments: number } // 🔄 조선/해양 취합 정보 (동시 평가인 경우) consolidatedInfo?: { shipbuildingScore: number | null shipbuildingGrade: string | null offshoreScore: number | null offshoreGrade: string | null consolidatedScore: number | null // 50% 반영 취합 점수 consolidatedGrade: string | null // 취합 등급 } }