PCB 대시보드 페이지 목록 및 기능 분석 문서. 각 페이지의 URL, 접근 권한, 렌더링 방식, 핵심 기능을 정리한 레퍼런스.
—
—
Does it follow best practices?
Impact
—
No eval scenarios have been run
—
The risk profile of this skill
| 구분 | 설명 |
|---|---|
| 공개 | 로그인 없이 접근 가능 |
| 일반 사용자 | 로그인 필요 (operator 역할) |
| 관리자 | admin 역할 전용 |
| 공용 | 일반 사용자 + 관리자 모두 접근 |
세션 관리: 로그인 후
SESSION_DURATION_MS = 5분타이머 시작. 만료 1분 전 경고 모달(SessionGuard) 표시 → "연장" 클릭 시refreshSessionAction()으로 Supabase 세션 갱신 + localStorage 타이머 리셋. 미연장 시 자동 로그아웃.
/login — 로그인app/login/page.tsx → components/login/LoginForm.tsxloginAction(email, password) (Server Action)LoginRepository.login() → Supabase signInWithPassword()setSessionDeadline() localStorage 저장, toggleUserStore에 role/userId 저장, role에 따라 /dashboard 또는 /admin/dashboard로 이동/link — PCB 시뮬레이션 연동파일: app/link/page.tsx → components/link-component/LinkPageContent.tsx
권한: 공개
섹션별 세부 동작
2D 히트맵 (Heatmap2DSection)
heatMapColor 유틸)createDefault10x10ThicknessValues() 생성simulationResponse.currentDensityGrid로 교체COMSOL 외부 시뮬레이션 (ExternalSimSection + useExternalSim)
POST /api/external-sim → Zod 검증 → Job 생성(jobId 반환, 202)simulationService.run(jobId): SIM_TRACK=api면 ExternalApiAdapter, 기본은 ExternalWebAdapter(Playwright로 COMSOL 웹 자동화)GET /api/external-sim/[jobId]/status 폴링completed → GET /api/external-sim/[jobId]/result → 히트맵 업데이트MAX_CONCURRENT_JOBS, 기본 2) 초과 시 429idle → submitting → polling → done | error3D 워피지 뷰 (ThreeDLink)
smile / frown / twist / customcustom이 아니면 createWarpageShapeValues2D(type)으로 2D 값 생성, custom이면 COMSOL 결과 사용변형 프로파일 차트 (DeformationProfileChart)
/ — 루트app/page.tsx → redirect('/dashboard') 즉시 리다이렉트/dashboard — 사용자 대시보드app/dashboard/page.tsx → components/dashboard/getLatestPositionMonitor() + alarmPositionMonitor() 병렬 실행 → sidepc_position_monitor 조회| 카드 | 데이터 소스 | 표시 내용 |
|---|---|---|
PlatingStatusCard | SSR | A/B라인 투입 헹거 수 (count_line_a, count_line_b) |
SectionStatusCard | CSR (마운트 후 병렬 fetch) | 5개 구간 토글 상태 |
HangerStatusCard | SSR | 헹거 위치 현황 |
NotificationsCard | SSR | 최신 알람 목록 |
PretreatHangersRepository → sidepc_pretreat_hangers. 토글 상태는 로컬 state만 (DB 반영 없음)/debriefing — 디브리핑 (일반 사용자)app/debriefing/page.tsx → components/defriefing/getSettingLotOptions() → sidepc_setting_lot distinct unit + recipe_id 목록getSettingLotIdsByRecipeId() → lot_id 목록getDebriefingLots() + getDebriefingChartData() + getDebriefingUnloadHist() 병렬 조회ssr: false dynamic import, lot1=파란색·lot2=빨간색/debriefing-error — 디브리핑 오류app/debriefing-error/page.tsxgetDebriefingErrorByDateRange(startDate, endDate, recipeId?) → UnloadHistRepository.getByDateRange() → 오류 상태 행 표시/recipe-setting — 레시피 현황app/recipe-setting/page.tsxgetSettingLotOptions() → 호기/레시피 드롭다운 로드getSettingLotWithRecipe(recipeId): SettingLotRepository + SettingRecipeRepository 병렬 조회 (sidepc_setting_lot.recipe_id → sidepc_setting_recipe.RecipeID 조인)RecipeInfoCard: 기판 크기(H×W), 기판 면적(전/후), 수량(제품/전단미/후단미/합계/제외)RecipeDashboard: 정류기 1~10번의 전류밀도(den)/효율(asp)/전류(cur) × 전면/후면 값 테이블/notifications — 알림app/notifications/page.tsxgetAlarmTablesForNotifications() (service role — RLS 우회)event_time 내림차순): loader_alarm, main_alarm, unloader_alarm
app/(3d)/layout.tsx에FactorySimV2Canvas가 고정 마운트. 페이지 전환 시 Canvas 재생성 없이useCanvasStore뷰 모드(mainView / detailView)만 교체.
/monitoring — 공장 3D 모니터링app/(3d)/monitoring/page.tsx → components/3d-engine/FactorySimV2.tsxswitchToMainView() → 전체 공장 라인 렌더링sys.signals 이벤트로 좌표 업데이트/detail/[nodeId]로 라우팅/detail/[nodeId] — 노드 상세app/(3d)/detail/[nodeId]/page.tsxuse(params)로 nodeId 추출 → nameMapper(nodeId)로 표시명 변환 (정규식 처리)switchToDetailView(nodeId) → 해당 노드로 카메라 포커스NodeDetailHeader + NodeDetailTable: 노드 이름 및 실시간 데이터 테이블/admin/dashboard — 관리자 대시보드 (로그인 후 기본 진입점)app/admin/dashboard/page.tsxgetNotices() → AdminDashboardService.getNotices() → 공지사항 조회SubstrateOutputCard / ProductionChart(dynamic) / OperationTimeChart(dynamic) / NoticeTable + NoticeModal(detail·edit 뷰)/admin/lot-search — LOT 검색 (공용 — 일반 사용자도 접근 가능)app/admin/lot-search/page.tsxsearchLotIds(keyword) → sidepc_setting_lot 부분 일치 검색 → 중복 제거getLotsByLotId(lotId) → 전체 매칭 LOT DataTablesidepc_setting_lot insert/admin/lot-compare-search — LOT 비교 검색app/admin/lot-compare-search/page.tsx?lotId= 쿼리 파라미터로 초기 LOT ID 주입 (useSearchParams)LeftTableData): 레시피 기준 — 레시피 ID / 제품·전단미·후단미·합계 수량RightTableData): 실적 기준 — 투입·재외·배출·합계TablePagination, 각 테이블 독립 엑셀 다운로드/admin/debriefing — 관리자 디브리핑app/admin/debriefing/page.tsx → components/admin-debrefing/DebriefingSearchParams 기반 언로드 이력 조회 및 테이블 표시, 인쇄 지원/admin/hardware-status — 데이터레이크 연결app/admin/hardware-status/page.tsxforce-dynamic SSRgetSystemStatus()(os 모듈) + getDatalakeSelectorValue()(파일시스템) 병렬 실행GET /api/system → CPU/메모리 갱신SystemInfoCard(OS/호스트명/코어/아키텍처) / CpuCard / MemoryCard / UptimeCard / DatalakeConnectionCard / ServiceStatusCard(Node-RED, COMSOL 등 서비스 상태 배지)/admin/server-status — 서버 상태app/admin/server-status/page.tsxLineChart / AreaChartReferenceLine으로 경고(70%)/위험(90%) 임계치 표시Badge로 현재 상태(정상·경고·위험) 표시, 로딩 시 Skeleton/admin/table-manager — 데이터 관리app/admin/table-manager/page.tsx → components/data-manage/| 카드 | 동작 |
|---|---|
FullBackupCard | 전체 테이블 → CSV → ZIP 다운로드 |
BackupDownloadCard | 개별 테이블 CSV 다운로드 |
ZipUploadCard | ZIP 업로드 → ZipPreviewModal 미리보기 → DB 복원 |
CsvUploadCard | CSV 업로드 → 컬럼 매핑 → DB insert |
DeleteOldDataCard | 기준 날짜 이전 데이터 삭제 |
POST /api/table-manager/admin/system-controll — 시스템 제어app/admin/system-controll/page.tsx| URL | 파일 | 설명 |
|---|---|---|
/* (404) | app/not-found.tsx | 존재하지 않는 경로 처리 |
/* (500) | app/error.tsx | 런타임 에러 바운더리 |