동기화

This commit is contained in:
GA Pro
2026-05-12 22:16:29 +09:00
parent e0eaf5a24b
commit 6356213e86
18 changed files with 1519 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
import { lazy, Suspense } from 'react';
import { Spin } from 'antd';
import { Route } from 'react-router-dom';
/**
* 메뉴 코드 → React 컴포넌트 매핑.
* 백엔드 menu 테이블의 component_path 와 1:1 대응.
* 새 화면 추가 시 이 맵에만 등록하면 자동 라우팅된다.
*/
const componentMap: Record<string, React.LazyExoticComponent<React.ComponentType<any>>> = {
// 조직/인사
'org/AgentList': lazy(() => import('@/pages/org/AgentList')),
'org/AgentDetail': lazy(() => import('@/pages/org/AgentDetail')),
'org/AgentForm': lazy(() => import('@/pages/org/AgentForm')),
// 계약
'product/ContractList': lazy(() => import('@/pages/product/ContractList')),
// 수수료규정
'rule/CommissionRateList': lazy(() => import('@/pages/rule/CommissionRateList')),
'rule/PayoutRuleList': lazy(() => import('@/pages/rule/PayoutRuleList')),
// 데이터수신
'receive/ProfileList': lazy(() => import('@/pages/receive/ProfileList')),
'receive/ErrorList': lazy(() => import('@/pages/receive/ErrorList')),
// 원장
'ledger/RecruitLedger': lazy(() => import('@/pages/ledger/RecruitLedger')),
'ledger/ExceptionLedger': lazy(() => import('@/pages/ledger/ExceptionLedger')),
// 정산/지급/배치
'settle/SettleList': lazy(() => import('@/pages/settle/SettleList')),
'settle/PaymentList': lazy(() => import('@/pages/settle/PaymentList')),
'settle/BatchRun': lazy(() => import('@/pages/settle/BatchRun')),
// 시스템관리
'system/UserList': lazy(() => import('@/pages/system/UserList')),
'system/RoleList': lazy(() => import('@/pages/system/RoleList')),
'system/CodeList': lazy(() => import('@/pages/system/CodeList')),
};
export interface MenuRoute {
menuPath: string; // 라우트 경로 (예: 'rule/commission-rates')
componentPath: string; // componentMap 키 (예: 'rule/CommissionRateList')
}
/** 메뉴 목록을 받아 React Route 배열로 변환. */
export function buildDynamicRoutes(menus: MenuRoute[]) {
return menus
.map((m) => {
const Cmp = componentMap[m.componentPath];
if (!Cmp) {
console.warn(`[router] component not found: ${m.componentPath}`);
return null;
}
const path = m.menuPath.replace(/^\//, '');
return (
<Route
key={path}
path={path}
element={
<Suspense fallback={<Spin />}>
<Cmp />
</Suspense>
}
/>
);
})
.filter(Boolean);
}