/** * 형질(Trait) 관련 상수 정의 * * @description * 유전체 분석에서 사용하는 35개 형질 목록 * 백엔드 TraitTypes.ts와 동기화 필요 */ /** 성장형질 (1개) */ export const GROWTH_TRAITS = ['12개월령체중'] as const; /** 경제형질 (4개) - 생산 카테고리 */ export const ECONOMIC_TRAITS = ['도체중', '등심단면적', '등지방두께', '근내지방도'] as const; /** 체형형질 (10개) */ export const BODY_TRAITS = [ '체고', '십자', '체장', '흉심', '흉폭', '고장', '요각폭', '좌골폭', '곤폭', '흉위', ] as const; /** 부위별 무게 (10개) */ export const WEIGHT_TRAITS = [ '안심weight', '등심weight', '채끝weight', '목심weight', '앞다리weight', '우둔weight', '설도weight', '사태weight', '양지weight', '갈비weight', ] as const; /** 부위별 비율 (10개) */ export const RATE_TRAITS = [ '안심rate', '등심rate', '채끝rate', '목심rate', '앞다리rate', '우둔rate', '설도rate', '사태rate', '양지rate', '갈비rate', ] as const; /** 전체 형질 (35개) */ export const ALL_TRAITS = [ ...GROWTH_TRAITS, ...ECONOMIC_TRAITS, ...BODY_TRAITS, ...WEIGHT_TRAITS, ...RATE_TRAITS, ] as const; /** 낮을수록 좋은 형질 (부호 반전 필요) */ export const NEGATIVE_TRAITS: string[] = ['등지방두께']; /** 기본 선택 형질 (7개) */ export const DEFAULT_TRAITS = ['도체중', '등심단면적', '등지방두께', '근내지방도', '체장', '체고', '등심weight'] as const; /** 형질 타입 */ export type TraitName = typeof ALL_TRAITS[number]; /** 카테고리 타입 */ export type TraitCategory = '성장' | '생산' | '체형' | '무게' | '비율'; /** * 카테고리별 형질 목록 */ export const TRAIT_CATEGORIES: Record = { '성장': GROWTH_TRAITS, '생산': ECONOMIC_TRAITS, '체형': BODY_TRAITS, '무게': WEIGHT_TRAITS, '비율': RATE_TRAITS, }; /** * UI용 카테고리 정보 (id, name, traits) */ export const TRAIT_CATEGORY_LIST = [ { id: 'growth', name: '성장형질', traits: [...GROWTH_TRAITS] }, { id: 'economic', name: '경제형질', traits: [...ECONOMIC_TRAITS] }, { id: 'body', name: '체형형질', traits: [...BODY_TRAITS] }, { id: 'weight', name: '부위별무게', traits: [...WEIGHT_TRAITS] }, { id: 'rate', name: '부위별비율', traits: [...RATE_TRAITS] }, ] as const; /** * 형질별 카테고리 매핑 */ export const TRAIT_CATEGORY_MAP: Record = { // 성장 '12개월령체중': '성장', // 생산 '도체중': '생산', '등심단면적': '생산', '등지방두께': '생산', '근내지방도': '생산', // 체형 '체고': '체형', '십자': '체형', '체장': '체형', '흉심': '체형', '흉폭': '체형', '고장': '체형', '요각폭': '체형', '좌골폭': '체형', '곤폭': '체형', '흉위': '체형', // 무게 '안심weight': '무게', '등심weight': '무게', '채끝weight': '무게', '목심weight': '무게', '앞다리weight': '무게', '우둔weight': '무게', '설도weight': '무게', '사태weight': '무게', '양지weight': '무게', '갈비weight': '무게', // 비율 '안심rate': '비율', '등심rate': '비율', '채끝rate': '비율', '목심rate': '비율', '앞다리rate': '비율', '우둔rate': '비율', '설도rate': '비율', '사태rate': '비율', '양지rate': '비율', '갈비rate': '비율', }; /** * 형질 설명 (툴팁용) */ export const TRAIT_DESCRIPTIONS: Record = { // 성장형질 '12개월령체중': '12개월 시점 체중', // 경제형질 '도체중': '도축 후 고기 무게', '등심단면적': '등심의 단면 크기', '등지방두께': '등 부위 지방 두께 (낮을수록 좋음)', '근내지방도': '마블링 정도 (높을수록 고급육)', // 체형형질 '체고': '어깨 높이', '십자': '십자부(엉덩이) 높이', '체장': '몸통 길이', '흉심': '가슴 깊이', '흉폭': '가슴 너비', '고장': '엉덩이 길이', '요각폭': '허리뼈 너비', '좌골폭': '좌골 너비', '곤폭': '좌골단 너비', '흉위': '가슴둘레', // 부위별 무게 '안심weight': '안심 부위 무게', '등심weight': '등심 부위 무게', '채끝weight': '채끝 부위 무게', '목심weight': '목심 부위 무게', '앞다리weight': '앞다리 부위 무게', '우둔weight': '우둔 부위 무게', '설도weight': '설도 부위 무게', '사태weight': '사태 부위 무게', '양지weight': '양지 부위 무게', '갈비weight': '갈비 부위 무게', // 부위별 비율 '안심rate': '전체 대비 안심 비율', '등심rate': '전체 대비 등심 비율', '채끝rate': '전체 대비 채끝 비율', '목심rate': '전체 대비 목심 비율', '앞다리rate': '전체 대비 앞다리 비율', '우둔rate': '전체 대비 우둔 비율', '설도rate': '전체 대비 설도 비율', '사태rate': '전체 대비 사태 비율', '양지rate': '전체 대비 양지 비율', '갈비rate': '전체 대비 갈비 비율', }; /** * 형질명으로 카테고리 조회 */ export function getTraitCategory(traitName: string): TraitCategory | '기타' { return TRAIT_CATEGORY_MAP[traitName] ?? '기타'; } /** * 형질명으로 설명 조회 */ export function getTraitDescription(traitName: string): string { return TRAIT_DESCRIPTIONS[traitName] ?? traitName; }