wing-ops/database/migration/008_assets.sql
htlee 793abb8fe2 feat(assets): 방제자산 탭 mock → DB/API 전환
- DB 스키마: ASSET_ORG, ASSET_EQUIP, ASSET_CONTACT, ASSET_UPLOAD_LOG 4개 테이블
- 초기 데이터: 84개 기관, 469개 장비, 86개 담당자 시드
- 백엔드: assetsService + assetsRouter (기관 목록/상세/업로드이력 3개 API)
- 프론트: AssetManagement, AssetMap, AssetUpload mock → API 호출 전환
- ShipInsurance: 외부 API 의존 데모 데이터 컴포넌트 내부 상수로 이동
- assetMockData.ts 의존성 완전 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 21:36:56 +09:00

84 lines
4.4 KiB
SQL

-- ============================================================
-- 008_assets.sql — 방제자산 테이블 (기관 + 장비 + 담당자)
-- ============================================================
SET search_path TO wing;
-- ============================================================
-- 1. 기관/조직 마스터
-- ============================================================
CREATE TABLE IF NOT EXISTS ASSET_ORG (
ORG_SN SERIAL PRIMARY KEY,
ORG_TP VARCHAR(30) NOT NULL, -- 유형: 해경관할, 해경경찰서, 파출소, 관련기관, 해양환경공단, 업체, 지자체, 기름저장시설, 정유사, 해군, 기타
JRSD_NM VARCHAR(50) NOT NULL, -- 관할청명: 중부지방해양경찰청, 서해지방해양경찰청 등
AREA_NM VARCHAR(30) NOT NULL, -- 지역명: 인천, 여수, 부산 등
ORG_NM VARCHAR(100) NOT NULL, -- 기관명
ADDR VARCHAR(300), -- 주소
TEL VARCHAR(30), -- 대표 전화
LAT NUMERIC(9,6), -- 위도
LNG NUMERIC(10,6), -- 경도
PIN_SIZE VARCHAR(5) DEFAULT 'md', -- 지도 핀 크기: hq, lg, md
VESSEL_CNT SMALLINT DEFAULT 0, -- 방제선 수
SKIMMER_CNT SMALLINT DEFAULT 0, -- 유회수기 수
PUMP_CNT SMALLINT DEFAULT 0, -- 이송펌프 수
VEHICLE_CNT SMALLINT DEFAULT 0, -- 방제차량 수
SPRAYER_CNT SMALLINT DEFAULT 0, -- 살포장치 수
TOTAL_ASSETS SMALLINT DEFAULT 0, -- 총 자산 수
USE_YN CHAR(1) DEFAULT 'Y',
REG_DTM TIMESTAMPTZ DEFAULT NOW(),
MDFCN_DTM TIMESTAMPTZ,
CONSTRAINT CK_ASSET_ORG_PIN CHECK (PIN_SIZE IN ('hq','lg','md'))
);
-- ============================================================
-- 2. 장비 상세
-- ============================================================
CREATE TABLE IF NOT EXISTS ASSET_EQUIP (
EQUIP_SN SERIAL PRIMARY KEY,
ORG_SN INTEGER NOT NULL REFERENCES ASSET_ORG(ORG_SN) ON DELETE CASCADE,
CTGR_NM VARCHAR(50) NOT NULL, -- 장비 카테고리: 방제선, 유회수기, 비치크리너, ...
ICON VARCHAR(10), -- 이모지 아이콘
QTY SMALLINT DEFAULT 0, -- 수량
SORT_ORD SMALLINT DEFAULT 0,
UNIQUE(ORG_SN, CTGR_NM)
);
-- ============================================================
-- 3. 담당자
-- ============================================================
CREATE TABLE IF NOT EXISTS ASSET_CONTACT (
CONTACT_SN SERIAL PRIMARY KEY,
ORG_SN INTEGER NOT NULL REFERENCES ASSET_ORG(ORG_SN) ON DELETE CASCADE,
ROLE_NM VARCHAR(50), -- 역할: 방제과장, 방제담당, 담당 등
CONTACT_NM VARCHAR(50), -- 이름
TEL VARCHAR(30), -- 전화번호
SORT_ORD SMALLINT DEFAULT 0
);
-- ============================================================
-- 4. 업로드 이력
-- ============================================================
CREATE TABLE IF NOT EXISTS ASSET_UPLOAD_LOG (
LOG_SN SERIAL PRIMARY KEY,
FILE_NM VARCHAR(200) NOT NULL, -- 파일명
UPLOADER_NM VARCHAR(50), -- 업로더 이름/부서
UPLOAD_CNT INTEGER DEFAULT 0, -- 처리 건수
REG_DTM TIMESTAMPTZ DEFAULT NOW()
);
-- ============================================================
-- 인덱스
-- ============================================================
CREATE INDEX IF NOT EXISTS IDX_ASSET_ORG_JRSD ON ASSET_ORG(JRSD_NM);
CREATE INDEX IF NOT EXISTS IDX_ASSET_ORG_TP ON ASSET_ORG(ORG_TP);
CREATE INDEX IF NOT EXISTS IDX_ASSET_EQUIP_ORG ON ASSET_EQUIP(ORG_SN);
CREATE INDEX IF NOT EXISTS IDX_ASSET_CONTACT_ORG ON ASSET_CONTACT(ORG_SN);
-- ============================================================
-- 초기 데이터: 업로드 이력 샘플
-- ============================================================
INSERT INTO ASSET_UPLOAD_LOG (FILE_NM, UPLOADER_NM, UPLOAD_CNT, REG_DTM) VALUES
('여수서_장비자재_2601.xlsx', '남해청_방제과', 45, '2026-01-25 14:30:00+09'),
('인천서_오일펜스현황.xlsx', '중부청_방제과', 12, '2026-01-22 10:15:00+09'),
('전체_방제정_현황.xlsx', '본청_방제과', 18, '2026-01-20 09:00:00+09');