import apiClient from "../api-client"; import { GenomeTrait } from "@/types/genome.types"; export interface CategoryAverageDto { category: string; avgEbv: number; // 표준화 육종가 평균 avgEpd: number; // EPD (원래 육종가) 평균 count: number; } export interface ComparisonAveragesDto { nationwide: CategoryAverageDto[]; region: CategoryAverageDto[]; farm: CategoryAverageDto[]; } export interface TraitAverageDto { traitName: string; // 형질명 category: string; // 카테고리 avgEbv: number; // 평균 EBV (표준화 육종가) avgEpd: number; // 평균 EPD (육종가 원본값) count: number; // 데이터 개수 } export interface TraitComparisonAveragesDto { nationwide: TraitAverageDto[]; region: TraitAverageDto[]; farm: TraitAverageDto[]; } /** * 유전체(Genome) 관련 API */ /** * 유전체 분석 의뢰 정보 타입 */ export interface GenomeRequestDto { pkRequestNo: number; fkFarmNo: number | null; fkCowNo: number | null; cowRemarks: string | null; requestDt: string | null; // 접수일자 snpTest: string | null; // SNP 검사 msTest: string | null; // MS 검사 sampleAmount: string | null; // 모근량 sampleRemarks: string | null; // 모근 비고 chipNo: string | null; // 분석 Chip 번호 chipType: string | null; // 분석 칩 종류 chipInfo: string | null; // 칩정보 chipRemarks: string | null; // 칩 비고 chipSireName: string | null; // 칩분석 아비명 (친자감별 결과) chipDamName: string | null; // 칩분석 어미명 chipReportDt: string | null; // 칩분석 보고일자 msResultStatus: string | null; // MS 감정결과 msFatherEstimate: string | null; // MS 추정부 msReportDt: string | null; // MS 보고일자 regDt?: string; modDt?: string; } export const genomeApi = { /** * GET /genome/request/:cowNo - 개체식별번호로 유전체 분석 의뢰 정보 조회 * * @param cowNo - 개체식별번호 (예: KOR002115897818) */ getRequest: async (cowNo: string | number): Promise => { return await apiClient.get(`/genome/request/${cowNo}`); }, /** * GET /genome/:cowNo - 특정 개체의 유전체 데이터 조회 * * @param cowNo - 개체 번호 */ findByCowNo: async (cowNo: string | number): Promise => { return await apiClient.get(`/genome/${cowNo}`); }, /** * GET /genome/comparison-averages/:cowNo - 전국/지역/농장 카테고리별 평균 비교 * * @param cowNo - 개체 번호 (KOR...) */ getComparisonAverages: async ( cowNo: string | number ): Promise => { return await apiClient.get(`/genome/comparison-averages/${cowNo}`); }, /** * GET /genome/trait-comparison-averages/:cowNo - 전국/지역/농장 형질별 평균 비교 * (폴리곤 차트용 - 형질 단위 비교) * * @param cowNo - 개체 번호 (KOR...) */ getTraitComparisonAverages: async ( cowNo: string | number ): Promise => { return await apiClient.get(`/genome/trait-comparison-averages/${cowNo}`); }, /** * POST /genome/selection-index/:cowId - 선발지수(가중 평균) 계산 */ getSelectionIndex: async ( cowId: string, traitConditions: { traitNm: string; weight?: number }[] ): Promise<{ score: number | null; percentile: number | null; farmRank: number | null; // 농가 순위 farmTotal: number; // 농가 전체 수 regionRank: number | null; // 지역(보은군) 순위 regionTotal: number; // 지역 전체 수 regionName: string | null; // 지역명 farmerName: string | null; // 농가명 (농장주명) farmAvgScore: number | null; // 농가 평균 선발지수 regionAvgScore: number | null; // 보은군(지역) 평균 선발지수 details: { traitNm: string; ebv: number; weight: number; contribution: number }[]; message?: string; }> => { return await apiClient.post(`/genome/selection-index/${cowId}`, { traitConditions }); }, /** * GET /genome/dashboard-stats/:farmNo - 대시보드용 유전체 통계 */ getDashboardStats: async (farmNo: number): Promise => { return await apiClient.get(`/genome/dashboard-stats/${farmNo}`); }, /** * GET /genome/farm-region-ranking/:farmNo - 농가의 보은군 내 순위 조회 (대시보드용) */ getFarmRegionRanking: async ( farmNo: number, traitConditions?: { traitNm: string; weight?: number }[] ): Promise => { return await apiClient.post(`/genome/farm-region-ranking/${farmNo}`, { traitConditions }); }, /** * GET /genome/trait-rank/:cowId/:traitName - 개별 형질 기준 순위 조회 */ getTraitRank: async (cowId: string, traitName: string): Promise => { return await apiClient.get(`/genome/trait-rank/${cowId}/${encodeURIComponent(traitName)}`); }, /** * GET /genome/yearly-trait-trend/:farmNo - 연도별 유전능력 추이 (형질별/카테고리별) * @param farmNo - 농장 번호 * @param category - 카테고리명 (성장/생산/체형/무게/비율) * @param traitName - 형질명 (선택, 없으면 카테고리 전체 평균) */ getYearlyTraitTrend: async ( farmNo: number, category: string, traitName?: string ): Promise => { const params = new URLSearchParams({ category }); if (traitName) params.append('traitName', traitName); return await apiClient.get(`/genome/yearly-trait-trend/${farmNo}?${params.toString()}`); }, }; /** * 연도별 유전능력 추이 데이터 타입 */ export interface YearlyTraitTrendDto { category: string; traitName: string | null; // null이면 카테고리 전체 평균 yearlyData: { year: number; farmAvgEbv: number; regionAvgEbv: number; farmCount: number; regionCount: number; }[]; traitList: string[]; // 해당 카테고리 내 형질 목록 // 농가 순위 정보 farmRank: { rank: number | null; // 보은군 내 순위 totalFarms: number; // 전체 농가 수 percentile: number | null; // 상위 백분위 farmAvgEbv: number | null; // 농가 평균 EBV regionAvgEbv: number; // 보은군 평균 EBV }; } /** * 개별 형질 기준 순위 데이터 타입 */ export interface TraitRankDto { traitName: string; cowEbv: number | null; cowEpd: number | null; // 개체 육종가(EPD) farmRank: number | null; farmTotal: number; regionRank: number | null; regionTotal: number; farmAvgEbv: number | null; regionAvgEbv: number | null; farmAvgEpd: number | null; // 농가 평균 육종가(EPD) regionAvgEpd: number | null; // 보은군 평균 육종가(EPD) } /** * 농가의 보은군 내 순위 데이터 타입 */ export interface FarmRegionRankingDto { farmNo: number; farmerName: string | null; farmAvgScore: number | null; regionAvgScore: number | null; farmRankInRegion: number | null; totalFarmsInRegion: number; percentile: number | null; farmCowCount: number; regionCowCount: number; } /** * 대시보드 통계 데이터 타입 */ export interface DashboardStatsDto { // 연도별 분석 현황 yearlyStats: { year: number; totalRequests: number; analyzedCount: number; pendingCount: number; sireMatchCount: number; // 친자 일치 수 analyzeRate: number; // 분석 완료율 (%) sireMatchRate: number; // 친자 일치율 (%) }[]; // 형질별 농장 평균 traitAverages: { traitName: string; category: string; avgEbv: number; avgEpd: number; // 농가 육종가(EPD) 평균 regionAvgEpd: number; // 보은군 육종가(EPD) 평균 avgPercentile: number; count: number; rank: number | null; // 보은군 내 농가 순위 totalFarms: number; // 보은군 내 총 농가 수 percentile: number | null; // 상위 백분율 }[]; // 접수 내역 목록 requestHistory: { pkRequestNo: number; cowId: string; cowRemarks: string | null; requestDt: string | null; chipSireName: string | null; chipReportDt: string | null; status: string; }[]; // 요약 summary: { totalCows: number; // 검사 받은 전체 개체 수 (합집합, 중복 제외) genomeCowCount: number; // 유전체 분석 개체 수 geneCowCount: number; // 유전자검사 개체 수 mptCowCount: number; // 번식능력검사 개체 수 totalRequests: number; // 유전체 의뢰 건수 (기존 호환성) analyzedCount: number; pendingCount: number; mismatchCount: number; maleCount: number; // 수컷 수 femaleCount: number; // 암컷 수 }; // 검사 종류별 현황 testTypeStats: { snp: { total: number; completed: number }; ms: { total: number; completed: number }; }; // 친자감별 결과 현황 (상호 배타적 분류) paternityStats: { analysisComplete: number; // 분석 완료 (부 일치 + 모 일치/null/정보없음) sireMismatch: number; // 부 불일치 damMismatch: number; // 모 불일치 (부 일치 + 모 불일치) damNoRecord: number; // 모 이력제부재 (부 일치 + 모 이력제부재) pending: number; // 대기 }; // 월별 접수 현황 monthlyStats: { month: number; count: number; }[]; // 칩 종류별 분포 chipTypeStats: { chipType: string; count: number; }[]; // 모근량별 분포 sampleAmountStats: { sampleAmount: string; count: number; }[]; // 연도별 주요 형질 평균 (차트용) yearlyTraitAverages: { year: number; traits: { traitName: string; avgEbv: number | null }[]; }[]; // 연도별 평균 표준화육종가 (농가 vs 보은군 비교) yearlyAvgEbv: { year: number; farmAvgEbv: number; // 농가 평균 regionAvgEbv: number; // 보은군 평균 traitCount: number; }[]; // 우수 개체 TOP 5 (옵션) topAnimals?: { animalId?: string; identNo?: string; birthDt?: string; avgEbv?: number; }[]; }