322 lines
10 KiB
TypeScript
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;
|
|
}[];
|
|
}
|