fix(frontend): 메뉴 중복 해소 + system-flow 노드 동기화 + V019 권한 트리

- /map-control labelKey nav.riskMap → nav.mapControl (위험도 지도 중복 해소)
- i18n nav.mapControl 키 추가 (ko: 해역 관리, en: Map Control)
- V019 마이그레이션: ai-operations:llm-ops 권한 트리 항목 추가 (PR #22 누락분)
- system-flow 08-frontend.json: 누락 노드 14개 추가
  - ui.map_control, ui.risk_map, ui.patrol_route, ui.fleet_optimization
  - ui.report_management, ui.external_service
  - ui.ai_model, ui.mlops, ui.llm_ops
  - ui.mobile_service, ui.ship_agent
  - ui.admin_panel, ui.permissions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
htlee 2026-04-09 12:05:35 +09:00
부모 e401c07dd3
커밋 d08d614b5f
5개의 변경된 파일162개의 추가작업 그리고 1개의 파일을 삭제

파일 보기

@ -0,0 +1,16 @@
-- ============================================================
-- V019: LLM 운영 페이지 권한 트리 항목 추가
-- PR #22에서 추가된 /llm-ops 페이지에 대응하는 권한 리소스
-- ============================================================
INSERT INTO kcg.auth_perm_tree(rsrc_cd, parent_cd, rsrc_nm, rsrc_level, sort_ord)
VALUES ('ai-operations:llm-ops', 'ai-operations', 'LLM 운영', 1, 35)
ON CONFLICT (rsrc_cd) DO NOTHING;
-- ADMIN 역할에 자동 부여
INSERT INTO kcg.auth_perm(role_sn, rsrc_cd, oper_cd, grant_yn)
SELECT r.role_sn, 'ai-operations:llm-ops', op.oper_cd, 'Y'
FROM kcg.auth_role r
CROSS JOIN (VALUES ('READ'), ('CREATE'), ('UPDATE'), ('DELETE'), ('EXPORT')) AS op(oper_cd)
WHERE r.role_cd = 'ADMIN'
ON CONFLICT (role_sn, rsrc_cd, oper_cd) DO NOTHING;

파일 보기

@ -47,7 +47,7 @@ const NAV_ENTRIES: NavEntry[] = [
{ to: '/dashboard', icon: LayoutDashboard, labelKey: 'nav.dashboard' }, { to: '/dashboard', icon: LayoutDashboard, labelKey: 'nav.dashboard' },
{ to: '/monitoring', icon: Activity, labelKey: 'nav.monitoring' }, { to: '/monitoring', icon: Activity, labelKey: 'nav.monitoring' },
{ to: '/events', icon: Radar, labelKey: 'nav.realtimeEvent' }, { to: '/events', icon: Radar, labelKey: 'nav.realtimeEvent' },
{ to: '/map-control', icon: Map, labelKey: 'nav.riskMap' }, { to: '/map-control', icon: Map, labelKey: 'nav.mapControl' },
// ── 위험도·단속 ── // ── 위험도·단속 ──
{ to: '/risk-map', icon: Layers, labelKey: 'nav.riskMap' }, { to: '/risk-map', icon: Layers, labelKey: 'nav.riskMap' },
{ to: '/enforcement-plan', icon: Shield, labelKey: 'nav.enforcementPlan' }, { to: '/enforcement-plan', icon: Shield, labelKey: 'nav.enforcementPlan' },

파일 보기

@ -153,6 +153,50 @@
"status": "implemented", "status": "implemented",
"file": "frontend/src/features/parent-inference/LabelSession.tsx" "file": "frontend/src/features/parent-inference/LabelSession.tsx"
}, },
{
"id": "ui.map_control",
"label": "해역 관리",
"shortDescription": "해역 구역 설정/관리 화면",
"stage": "UI",
"menu": "감시",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/surveillance/MapControl.tsx"
},
{
"id": "ui.risk_map",
"label": "위험도 지도",
"shortDescription": "해역별 위험도 히트맵",
"stage": "UI",
"menu": "위험평가",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/risk-assessment/RiskMap.tsx"
},
{
"id": "ui.patrol_route",
"label": "순찰경로 추천",
"shortDescription": "AI 기반 순찰 경로 최적화",
"stage": "UI",
"menu": "순찰",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/patrol/PatrolRoute.tsx"
},
{
"id": "ui.fleet_optimization",
"label": "다함정 최적화",
"shortDescription": "다수 함정 배치 최적화",
"stage": "UI",
"menu": "순찰",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/patrol/FleetOptimization.tsx"
},
{ {
"id": "ui.statistics", "id": "ui.statistics",
"label": "통계", "label": "통계",
@ -164,6 +208,28 @@
"status": "implemented", "status": "implemented",
"file": "frontend/src/features/statistics/Statistics.tsx" "file": "frontend/src/features/statistics/Statistics.tsx"
}, },
{
"id": "ui.report_management",
"label": "보고서 관리",
"shortDescription": "보고서 생성/조회",
"stage": "UI",
"menu": "통계",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/statistics/ReportManagement.tsx"
},
{
"id": "ui.external_service",
"label": "외부 서비스",
"shortDescription": "외부 연동 서비스 설정",
"stage": "UI",
"menu": "통계",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/statistics/ExternalService.tsx"
},
{ {
"id": "ui.ai_alert", "id": "ui.ai_alert",
"label": "현장 AI 경보", "label": "현장 AI 경보",
@ -185,5 +251,82 @@
"trigger": "on_demand", "trigger": "on_demand",
"status": "implemented", "status": "implemented",
"file": "frontend/src/features/ai-operations/AIAssistant.tsx" "file": "frontend/src/features/ai-operations/AIAssistant.tsx"
},
{
"id": "ui.ai_model",
"label": "AI 모델관리",
"shortDescription": "AI 모델 배포/모니터링",
"stage": "UI",
"menu": "AI",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/ai-operations/AIModelManagement.tsx"
},
{
"id": "ui.mlops",
"label": "MLOps",
"shortDescription": "ML 파이프라인 운영",
"stage": "UI",
"menu": "AI",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/ai-operations/MLOpsPage.tsx"
},
{
"id": "ui.llm_ops",
"label": "LLM 운영",
"shortDescription": "LLM 모델 운영 관리",
"stage": "UI",
"menu": "AI",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/ai-operations/LLMOpsPage.tsx"
},
{
"id": "ui.mobile_service",
"label": "모바일 서비스",
"shortDescription": "현장 모바일 서비스",
"stage": "UI",
"menu": "현장",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/field-ops/MobileService.tsx"
},
{
"id": "ui.ship_agent",
"label": "함정 Agent",
"shortDescription": "함정 단말 에이전트",
"stage": "UI",
"menu": "현장",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/field-ops/ShipAgent.tsx"
},
{
"id": "ui.admin_panel",
"label": "시스템 관리",
"shortDescription": "사용자/역할/권한 관리",
"stage": "UI",
"menu": "관리",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/admin/AdminPanel.tsx"
},
{
"id": "ui.permissions",
"label": "권한 관리",
"shortDescription": "RBAC 트리 권한 매트릭스",
"stage": "UI",
"menu": "관리",
"kind": "ui",
"trigger": "on_demand",
"status": "implemented",
"file": "frontend/src/features/admin/AccessControl.tsx"
} }
] ]

파일 보기

@ -3,6 +3,7 @@
"dashboard": "Dashboard", "dashboard": "Dashboard",
"monitoring": "Alert Monitor", "monitoring": "Alert Monitor",
"riskMap": "Risk Map", "riskMap": "Risk Map",
"mapControl": "Map Control",
"enforcementPlan": "Enforcement Plan", "enforcementPlan": "Enforcement Plan",
"darkVessel": "Dark Vessel", "darkVessel": "Dark Vessel",
"gearDetection": "Gear Detection", "gearDetection": "Gear Detection",

파일 보기

@ -3,6 +3,7 @@
"dashboard": "종합 상황판", "dashboard": "종합 상황판",
"monitoring": "경보 현황판", "monitoring": "경보 현황판",
"riskMap": "위험도 지도", "riskMap": "위험도 지도",
"mapControl": "해역 관리",
"enforcementPlan": "단속 계획", "enforcementPlan": "단속 계획",
"darkVessel": "다크베셀 탐지", "darkVessel": "다크베셀 탐지",
"gearDetection": "어구 탐지", "gearDetection": "어구 탐지",