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>
139 lines
5.0 KiB
TypeScript
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,
|
|
};
|