Files
genome2025/frontend/src/lib/api/genome.api.ts
2025-12-24 08:25:44 +09:00

322 lines
10 KiB
TypeScript

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<GenomeRequestDto | null> => {
return await apiClient.get(`/genome/request/${cowNo}`);
},
/**
* GET /genome/:cowNo - 특정 개체의 유전체 데이터 조회
*
* @param cowNo - 개체 번호
*/
findByCowNo: async (cowNo: string | number): Promise<GenomeTrait[]> => {
return await apiClient.get(`/genome/${cowNo}`);
},
/**
* GET /genome/comparison-averages/:cowNo - 전국/지역/농장 카테고리별 평균 비교
*
* @param cowNo - 개체 번호 (KOR...)
*/
getComparisonAverages: async (
cowNo: string | number
): Promise<ComparisonAveragesDto> => {
return await apiClient.get(`/genome/comparison-averages/${cowNo}`);
},
/**
* GET /genome/trait-comparison-averages/:cowNo - 전국/지역/농장 형질별 평균 비교
* (폴리곤 차트용 - 형질 단위 비교)
*
* @param cowNo - 개체 번호 (KOR...)
*/
getTraitComparisonAverages: async (
cowNo: string | number
): Promise<TraitComparisonAveragesDto> => {
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<DashboardStatsDto> => {
return await apiClient.get(`/genome/dashboard-stats/${farmNo}`);
},
/**
* GET /genome/farm-region-ranking/:farmNo - 농가의 보은군 내 순위 조회 (대시보드용)
*/
getFarmRegionRanking: async (
farmNo: number,
traitConditions?: { traitNm: string; weight?: number }[]
): Promise<FarmRegionRankingDto> => {
return await apiClient.post(`/genome/farm-region-ranking/${farmNo}`, { traitConditions });
},
/**
* GET /genome/trait-rank/:cowId/:traitName - 개별 형질 기준 순위 조회
*/
getTraitRank: async (cowId: string, traitName: string): Promise<TraitRankDto> => {
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<YearlyTraitTrendDto> => {
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;
}[];
}