kcg-ai-monitoring/frontend/src/data/commonCodes.ts
htlee e6319a571c refactor: 모노레포 구조로 전환 (frontend/ + backend/ + database/)
Phase 1: 모노레포 디렉토리 구조 구축

- 기존 React 프로젝트를 frontend/ 디렉토리로 이동 (git mv)
- backend/ 디렉토리 생성 (Phase 2에서 Spring Boot 초기화)
- database/migration/ 디렉토리 생성 (Phase 2에서 Flyway 마이그레이션)
- 루트 .gitignore에 frontend/, backend/ 경로 반영
- 루트 CLAUDE.md를 모노레포 가이드로 갱신
- Makefile 추가 (dev/build/lint 통합 명령)
- frontend/vite.config.ts에 /api → :8080 백엔드 proxy 설정
- .githooks/pre-commit을 모노레포 구조에 맞게 갱신
  (frontend/ 변경 시 frontend/ 내부에서 검증)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 08:47:24 +09:00

139 lines
5.0 KiB
TypeScript

/*
* SFR-02: 시스템 기본 환경설정 및 공통 기능
* 공통코드 기준정보 통합 관리 모듈
*
* 4개 분류 | 875개 코드
* - 해역분류 52개 (해양경찰청 관할 기준)
* - 어종 578개 (국립수산과학원 공식 어종코드)
* - 어업유형 59개 (수산업법 허가·면허 구분)
* - 선박유형 186개 (MDA 5개 출처 통합)
*/
import areaData from './areasCodes.json';
import speciesData from './speciesCodes.json';
import fisheryData from './fisheryCodes.json';
import vesselTypeData from './vesselTypeCodes.json';
// ─── 타입 정의 ──────────────────────────
export interface AreaCode {
code: string; // HA-101 ~ HA-501
major: string; // 서해, 남해, 동해, 제주, 광역(원해)
mid: string; // 광역구역, 특별경비수역, 연안구역, 내해구역
name: string; // 소분류(해역명)
authority: string; // 관할기관
note: string;
}
export interface SpeciesCode {
code: string; // 10000 ~ 90000 계열
major: string; // 대분류: 어류, 패류, 갑각류, 연체류, 해조류 등
mid: string; // 중분류(상위)
name: string; // 어종명
nameEn: string; // 영문명
scientific: string; // 학명
area: string; // 주요 서식해역
active: boolean; // 사용여부
fishing: boolean; // 낚시연계 여부
}
export interface FisheryCode {
code: string; // FV-101 / FT-xxx
major: string; // 근해어업, 연안어업, 구획어업, 마을어업, 양식어업, 원양어업, 기타어업
mid: string; // 트롤, 선망, 연승, 자망 등
name: string; // 어업유형명
target: string; // 주요 어획대상
permit: string; // 허가/면허
law: string; // 수산업법 근거
}
export interface VesselTypeCode {
code: string; // VT-100 ~ VT-905
srcCode: string; // 원본코드 (ship_ty_cd)
srcDetail: string; // 원본세부코드 (src_ty_cd)
major: string; // 어선, 여객선, 화물선, 유조선, 관공선, 함정, 항공기, 기타선
mid: string; // 중분류
name: string; // 선박유형명
source: string; // 데이터출처: RRA, GIC, PMS, AIS, KSU
tonnage: string; // 톤수기준
purpose: string; // 주요용도
aisCode: string; // AIS/IMO 코드
note: string;
}
// ─── 코드 데이터 ─────────────────────────
export const AREA_CODES: AreaCode[] = areaData as AreaCode[];
export const SPECIES_CODES: SpeciesCode[] = speciesData as SpeciesCode[];
export const FISHERY_CODES: FisheryCode[] = fisheryData as FisheryCode[];
export const VESSEL_TYPE_CODES: VesselTypeCode[] = vesselTypeData as VesselTypeCode[];
// ─── 조회 유틸리티 ──────────────────────
/** 코드번호로 해역 조회 */
export function getArea(code: string): AreaCode | undefined {
return AREA_CODES.find((a) => a.code === code);
}
/** 코드번호로 어종 조회 */
export function getSpecies(code: string): SpeciesCode | undefined {
return SPECIES_CODES.find((s) => s.code === code);
}
/** 코드번호로 어업유형 조회 */
export function getFishery(code: string): FisheryCode | undefined {
return FISHERY_CODES.find((f) => f.code === code);
}
/** 코드번호로 선박유형 조회 */
export function getVesselType(code: string): VesselTypeCode | undefined {
return VESSEL_TYPE_CODES.find((v) => v.code === code);
}
/** 해역 대분류 목록 (중복 제거) */
export function getAreaMajors(): string[] {
return [...new Set(AREA_CODES.map((a) => a.major))];
}
/** 어종 대분류 목록 (중복 제거) */
export function getSpeciesMajors(): string[] {
return [...new Set(SPECIES_CODES.map((s) => s.major).filter(Boolean))];
}
/** 어업유형 대분류 목록 (중복 제거) */
export function getFisheryMajors(): string[] {
return [...new Set(FISHERY_CODES.map((f) => f.major))];
}
/** 선박유형 대분류 목록 (중복 제거) */
export function getVesselTypeMajors(): string[] {
return [...new Set(VESSEL_TYPE_CODES.map((v) => v.major))];
}
/** 대분류로 필터링 */
export function filterByMajor<T extends { major: string }>(items: T[], major: string): T[] {
if (!major) return items;
return items.filter((i) => i.major === major);
}
/** 이름 또는 코드로 검색 */
export function searchCodes<T extends { code: string; name: string }>(
items: T[], query: string
): T[] {
if (!query) return items;
const q = query.toLowerCase();
return items.filter(
(i) => i.code.toLowerCase().includes(q) || i.name.toLowerCase().includes(q)
);
}
// ─── 코드 분류별 통계 ───────────────────
export const CODE_STATS = {
areas: AREA_CODES.length,
species: SPECIES_CODES.length,
fishery: FISHERY_CODES.length,
vesselTypes: VESSEL_TYPE_CODES.length,
total: AREA_CODES.length + SPECIES_CODES.length + FISHERY_CODES.length + VESSEL_TYPE_CODES.length,
};