@bwg-ui/core 1.1.22 → 1.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/BwgSwitch-B79pseQM.js +269 -0
- package/dist/chunks/BwgSwitch-B79pseQM.js.map +1 -0
- package/dist/chunks/BwgSwitch-CAI-kEaM.cjs +2 -0
- package/dist/chunks/BwgSwitch-CAI-kEaM.cjs.map +1 -0
- package/dist/chunks/{BwgDownload-COsACbpJ.js → BwgUploader-BcVlE61B.js} +2933 -2982
- package/dist/chunks/BwgUploader-BcVlE61B.js.map +1 -0
- package/dist/chunks/BwgUploader-DaNV2URT.cjs +3 -0
- package/dist/chunks/BwgUploader-DaNV2URT.cjs.map +1 -0
- package/dist/chunks/LoadingOverlay-DAZJF5wg.js +19 -0
- package/dist/chunks/LoadingOverlay-DAZJF5wg.js.map +1 -0
- package/dist/chunks/LoadingOverlay-DcmKvoZA.cjs +2 -0
- package/dist/chunks/LoadingOverlay-DcmKvoZA.cjs.map +1 -0
- package/dist/chunks/{SSOHandler-B15Ssd5g.js → SSOHandler-CkPcSHIm.js} +12161 -11034
- package/dist/chunks/SSOHandler-CkPcSHIm.js.map +1 -0
- package/dist/chunks/SSOHandler-DiW4Ft9i.cjs +237 -0
- package/dist/chunks/SSOHandler-DiW4Ft9i.cjs.map +1 -0
- package/dist/chunks/{SearchBoxContext-BxJN-x3-.js → SearchBoxContext-BCvEYyFk.js} +7 -7
- package/dist/chunks/{SearchBoxContext-BxJN-x3-.js.map → SearchBoxContext-BCvEYyFk.js.map} +1 -1
- package/dist/chunks/{SearchBoxContext-DnQGaRgo.cjs → SearchBoxContext-DwFDOyYG.cjs} +2 -2
- package/dist/chunks/{SearchBoxContext-DnQGaRgo.cjs.map → SearchBoxContext-DwFDOyYG.cjs.map} +1 -1
- package/dist/chunks/{ViewContainer-HSyLfryI.cjs → ViewContainer-Bhq22_B3.cjs} +2 -2
- package/dist/chunks/{ViewContainer-HSyLfryI.cjs.map → ViewContainer-Bhq22_B3.cjs.map} +1 -1
- package/dist/chunks/{ViewContainer-x2yzKkIG.js → ViewContainer-CjpJqoGG.js} +2 -2
- package/dist/chunks/{ViewContainer-x2yzKkIG.js.map → ViewContainer-CjpJqoGG.js.map} +1 -1
- package/dist/chunks/apiUtils-BZ6s0_NI.cjs +3 -0
- package/dist/chunks/apiUtils-BZ6s0_NI.cjs.map +1 -0
- package/dist/chunks/apiUtils-DxzLqPhU.js +1441 -0
- package/dist/chunks/apiUtils-DxzLqPhU.js.map +1 -0
- package/dist/chunks/{codeStore-DefmZVgs.js → codeStore-CfI4Wh5M.js} +4 -4
- package/dist/chunks/{codeStore-DefmZVgs.js.map → codeStore-CfI4Wh5M.js.map} +1 -1
- package/dist/chunks/{codeStore-pQbDqWkZ.cjs → codeStore-il4-kZPe.cjs} +2 -2
- package/dist/chunks/{codeStore-pQbDqWkZ.cjs.map → codeStore-il4-kZPe.cjs.map} +1 -1
- package/dist/chunks/core-BHejg5iS.cjs +2 -0
- package/dist/chunks/core-BHejg5iS.cjs.map +1 -0
- package/dist/chunks/core-bHd8azE6.js +514 -0
- package/dist/chunks/core-bHd8azE6.js.map +1 -0
- package/dist/chunks/enc-base64-BQYwLKgk.js +102 -0
- package/dist/chunks/enc-base64-BQYwLKgk.js.map +1 -0
- package/dist/chunks/enc-base64-BkBtNBQV.cjs +2 -0
- package/dist/chunks/enc-base64-BkBtNBQV.cjs.map +1 -0
- package/dist/chunks/{favoriteStore-BXBziAgB.cjs → favoriteStore-CcKg_nEH.cjs} +2 -2
- package/dist/chunks/{favoriteStore-BXBziAgB.cjs.map → favoriteStore-CcKg_nEH.cjs.map} +1 -1
- package/dist/chunks/{favoriteStore-DAPC01iF.js → favoriteStore-Cemc-26t.js} +2 -2
- package/dist/chunks/{favoriteStore-DAPC01iF.js.map → favoriteStore-Cemc-26t.js.map} +1 -1
- package/dist/chunks/{popupStore-CcQg9AvK.js → popupStore-Bi6o78lP.js} +2 -2
- package/dist/chunks/{popupStore-CcQg9AvK.js.map → popupStore-Bi6o78lP.js.map} +1 -1
- package/dist/chunks/{popupStore-BV632k5p.cjs → popupStore-DUApUBF2.cjs} +2 -2
- package/dist/chunks/{popupStore-BV632k5p.cjs.map → popupStore-DUApUBF2.cjs.map} +1 -1
- package/dist/chunks/sha256-BZfJs28k.js +79 -0
- package/dist/chunks/sha256-BZfJs28k.js.map +1 -0
- package/dist/chunks/sha256-DiIRoCQ8.cjs +2 -0
- package/dist/chunks/sha256-DiIRoCQ8.cjs.map +1 -0
- package/dist/chunks/{usePopup-Cw5xsOaH.js → usePopup-BSqsnSz7.js} +3 -3
- package/dist/chunks/{usePopup-Cw5xsOaH.js.map → usePopup-BSqsnSz7.js.map} +1 -1
- package/dist/chunks/{usePopup-DoVGuobp.cjs → usePopup-D2JEuDrO.cjs} +2 -2
- package/dist/chunks/{usePopup-DoVGuobp.cjs.map → usePopup-D2JEuDrO.cjs.map} +1 -1
- package/dist/components/common/BwgDraggable.d.ts +1 -1
- package/dist/components/common/BwgDraggable.d.ts.map +1 -1
- package/dist/components/common/BwgEditor.d.ts +43 -36
- package/dist/components/common/BwgEditor.d.ts.map +1 -1
- package/dist/components/common/BwgGrid.d.ts +13 -5
- package/dist/components/common/BwgGrid.d.ts.map +1 -1
- package/dist/components/common/BwgPagination.d.ts +25 -5
- package/dist/components/common/BwgPagination.d.ts.map +1 -1
- package/dist/components/common/BwgView.d.ts.map +1 -1
- package/dist/components/common/index.cjs +1 -1
- package/dist/components/common/index.js +1 -1
- package/dist/components/core/BwgCheck.d.ts +11 -0
- package/dist/components/core/BwgCheck.d.ts.map +1 -1
- package/dist/components/core/BwgDownload.d.ts.map +1 -1
- package/dist/components/core/BwgSelect.d.ts +2 -2
- package/dist/components/core/BwgSelect.d.ts.map +1 -1
- package/dist/components/core/BwgSwitch.d.ts +24 -0
- package/dist/components/core/BwgSwitch.d.ts.map +1 -0
- package/dist/components/core/index.cjs +1 -1
- package/dist/components/core/index.d.ts +20 -19
- package/dist/components/core/index.d.ts.map +1 -1
- package/dist/components/core/index.js +22 -21
- package/dist/components/layout/LoadingOverlay.d.ts +3 -3
- package/dist/components/layout/LoadingOverlay.d.ts.map +1 -1
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +2 -2
- package/dist/components/popup/MenuReport.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +116 -115
- package/dist/provider/index.cjs +1 -1
- package/dist/provider/index.js +2 -2
- package/dist/stores/index.cjs +1 -1
- package/dist/stores/index.cjs.map +1 -1
- package/dist/stores/index.d.ts +7 -7
- package/dist/stores/index.d.ts.map +1 -1
- package/dist/stores/index.js +16 -15
- package/dist/stores/index.js.map +1 -1
- package/dist/stores/loadingStore.d.ts +1 -0
- package/dist/stores/loadingStore.d.ts.map +1 -1
- package/dist/stores/menuModelStore.d.ts.map +1 -1
- package/dist/styles/assets/images/header/icon/ico-bell.svg +3 -3
- package/dist/styles/assets/images/header/icon/ico-logout.svg +10 -10
- package/dist/styles/assets/images/header/icon/ico-setting.svg +4 -4
- package/dist/styles/assets/images/header/icon/ico-sidebar-arrow.svg +3 -3
- package/dist/styles/layout.css +14 -1
- package/dist/utils/apiUtils.d.ts +4 -8
- package/dist/utils/apiUtils.d.ts.map +1 -1
- package/dist/utils/commonUtils.d.ts +6 -0
- package/dist/utils/commonUtils.d.ts.map +1 -1
- package/dist/utils/index.cjs +1 -1
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.ts +0 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +53 -54
- package/dist/utils/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/chunks/BwgCheck-BDt8r0gn.js +0 -200
- package/dist/chunks/BwgCheck-BDt8r0gn.js.map +0 -1
- package/dist/chunks/BwgCheck-Dtzr-6rg.cjs +0 -2
- package/dist/chunks/BwgCheck-Dtzr-6rg.cjs.map +0 -1
- package/dist/chunks/BwgDownload-COsACbpJ.js.map +0 -1
- package/dist/chunks/BwgDownload-i6w7ZD-i.cjs +0 -3
- package/dist/chunks/BwgDownload-i6w7ZD-i.cjs.map +0 -1
- package/dist/chunks/LoadingOverlay-CAO6_FuF.js +0 -29
- package/dist/chunks/LoadingOverlay-CAO6_FuF.js.map +0 -1
- package/dist/chunks/LoadingOverlay-NX9Mo_6n.cjs +0 -2
- package/dist/chunks/LoadingOverlay-NX9Mo_6n.cjs.map +0 -1
- package/dist/chunks/SSOHandler-B15Ssd5g.js.map +0 -1
- package/dist/chunks/SSOHandler-oJlon6rn.cjs +0 -236
- package/dist/chunks/SSOHandler-oJlon6rn.cjs.map +0 -1
- package/dist/chunks/apiUtils-CudW_FKE.cjs +0 -3
- package/dist/chunks/apiUtils-CudW_FKE.cjs.map +0 -1
- package/dist/chunks/apiUtils-DfPv_gmI.js +0 -2064
- package/dist/chunks/apiUtils-DfPv_gmI.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeStore-DefmZVgs.js","sources":["../../src/stores/codeStore.ts"],"sourcesContent":["import { create } from 'zustand';\r\nimport { persist } from 'zustand/middleware';\r\nimport { callService } from '../utils/apiUtils';\r\nimport { getServiceCode } from '../utils/serviceConfig';\r\n\r\n// 공통코드 관련 타입 정의\r\n\r\n// 서버 응답의 개별 코드 아이템 (실제 SCMSIGN00301 서비스 응답 구조)\r\nexport interface ServerCodeItem {\r\n cmmnCdGrp: string; // 그룹 코드\r\n cmmnCd: string; // 공통 코드\r\n cmmnCdNm: string; // 공통 코드명\r\n cmmnCdClr: string | null; // 공통 코드 컬러\r\n syscdYn: string; // 시스템 코드 여부\r\n sortOrd: string | null; // 정렬 순서\r\n enblYn: string; // 사용 여부\r\n}\r\n\r\n// 서버 응답의 개별 옵션 아이템 (실제 SCMSIGN00301 서비스 응답 구조)\r\nexport interface ServerOptionItem {\r\n cmmnCdGrp: string; // 그룹 코드\r\n cmmnCd: string; // 공통 코드\r\n cmmnCdClr: string | null; // 공통 코드 컬러\r\n optnCd: string; // 옵션 코드\r\n optnNm: string; // 옵션명\r\n syscdYn: string; // 시스템 코드 여부\r\n sortOrd: string | null; // 정렬 순서\r\n enblYn: string; // 사용 여부\r\n}\r\n\r\n// SCMSIGN00301 서비스 응답 구조\r\nexport interface ServerCommonCodeResponse {\r\n code: ServerCodeItem[]; // 공통코드 목록\r\n opt: ServerOptionItem[]; // 옵션 목록\r\n}\r\n\r\n// 클라이언트에서 사용할 코드 아이템 (실제 응답 구조 반영)\r\nexport interface CodeItem {\r\n codeValue: string; // 공통 코드 (cmmnCd)\r\n codeNm: string; // 공통 코드명 (cmmnCdNm)\r\n groupCode: string; // 그룹 코드 (cmmnCdGrp)\r\n commonCode: string; // 공통 코드 (cmmnCd)\r\n labelColor: string | null; // 라벨 컬러 (cmmnCdClr)\r\n systemCodeYn: string; // 시스템 코드 여부 (syscdYn)\r\n sortOrder: number; // 정렬 순서 (sortOrd)\r\n enabled: boolean; // 사용 여부 (enblYn === 'Y')\r\n options: Record<string, any> | null; // 옵션 (optnCd: optnNm 형태)\r\n originalData: ServerCodeItem; // 원본 데이터\r\n}\r\n\r\n// 코드 그룹 (그룹코드별로 정리된 상세코드들)\r\nexport interface CodeGroup {\r\n [codeValue: string]: CodeItem;\r\n}\r\n\r\n// 전체 공통코드 구조\r\nexport interface CommonCodeData {\r\n [groupCode: string]: CodeGroup;\r\n}\r\n\r\n// 단순화된 코드 아이템 (getCodeList용)\r\nexport interface SimpleCodeItem {\r\n label: string; // codeNm\r\n value: string; // codeValue\r\n tagColor?: string | null; // labelColor\r\n}\r\n\r\n// 공통코드 응답 타입\r\nexport interface CommonCodeResponse {\r\n codeList: CommonCodeData;\r\n}\r\n\r\n// 기본 스토어 상태 (공통 속성)\r\nexport interface BaseStoreState {\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n fetchCommonCodes: () => Promise<void>;\r\n clearCodes: () => void;\r\n}\r\n\r\n// 1. CODE 스토어 - 그룹코드별 상세코드 목록과 코드명 관리\r\nexport interface CodeStoreState extends BaseStoreState {\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 2. 코드를 던졌을 때 코드명을 리턴\r\n getCodeName: (codeValue: string) => string | null;\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴\r\n getCodeColor: (codeValue: string) => string | null;\r\n // 3. 옵션값으로 코드를 조회\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ) => CodeItem[];\r\n // 4. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 5. 그룹코드 목록 조회\r\n getAvailableGroupCodes: () => string[];\r\n // 6. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (groupCode: string) => {\r\n labels: string[];\r\n values: string[];\r\n lookupDisplay: boolean;\r\n };\r\n}\r\n\r\n// 2. OPTION 스토어 - 옵션값 관리\r\nexport interface OptionStoreState extends BaseStoreState {\r\n // 그룹코드와 옵션코드를 던졌을 때 상세코드의 옵션값을 리턴\r\n getOptionValue: (groupCode: string, optionCode: string) => any;\r\n // 특정 옵션 키의 값 가져오기\r\n getOptionByKey: (\r\n groupCode: string,\r\n optionCode: string,\r\n optionKey: string\r\n ) => any;\r\n}\r\n\r\n// 3. COLOR 스토어 - 코드/컬러 매핑 관리\r\nexport interface ColorStoreState extends BaseStoreState {\r\n // 코드를 던졌을 때 컬러코드를 리턴\r\n getColorCode: (codeValue: string) => string | null;\r\n // 코드/컬러 매핑 배열 가져오기\r\n getColorMapping: () => Array<{ code: string; color: string }>;\r\n}\r\n\r\n// 기존 CommonCodeState (하위 호환성을 위해 유지)\r\nexport interface CommonCodeState {\r\n // 데이터\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n\r\n // 액션들\r\n fetchCommonCodes: () => Promise<void>;\r\n getCodeGroup: (codeGroup: string) => CodeGroup | null;\r\n getCodeItem: (codeGroup: string, codeValue: string) => CodeItem | null;\r\n getCodeList: (codeGroup: string) => CodeItem[];\r\n getCodeListByOption: (\r\n codeGroup: string,\r\n optionKey: string,\r\n optionValue: any\r\n ) => CodeItem[];\r\n getCodeListWithColor: (codeGroup: string) => CodeItem[];\r\n getAvailableGroupCodes: () => string[];\r\n getDetailCodeList: (groupCode: string, enabledOnly?: boolean) => CodeItem[];\r\n getDetailCodeName: (detailCode: string) => string | null;\r\n getDetailCodeColor: (detailCode: string) => string | null;\r\n clearCodes: () => void;\r\n}\r\n\r\n// 공통코드 컨텍스트 타입\r\nexport interface CommonCodeContextType {\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 2. 코드를 던졌을 때 코드명을 리턴\r\n getCodeName: (codeValue: string) => string | null;\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴\r\n getCodeColor: (codeValue: string) => string | null;\r\n // 4. 옵션값으로 코드를 조회\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ) => CodeItem[];\r\n // 5. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 6. 그룹코드 목록 조회\r\n getAvailableGroupCodes: () => string[];\r\n // 7. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (groupCode: string) => {\r\n labels: string[];\r\n values: string[];\r\n lookupDisplay: boolean;\r\n };\r\n refreshCodes: () => Promise<void>;\r\n}\r\n\r\n// 대규모 데이터셋 최적화를 위한 설정\r\nconst LARGE_DATASET_CONFIG = {\r\n CACHE_SIZE_LIMIT: 1000, // 캐시 크기 제한\r\n BATCH_SIZE: 100, // 배치 처리 크기\r\n DEBOUNCE_DELAY: 300, // 디바운스 지연시간\r\n MEMORY_THRESHOLD: 50 * 1024 * 1024, // 50MB 메모리 임계값\r\n};\r\n\r\n// 성능 최적화를 위한 캐시 관리 (대규모 데이터셋용)\r\ninterface OptimizedCacheManager {\r\n codeCache: Map<string, any>;\r\n nameCache: Map<string, string>;\r\n optionCache: Map<string, any>;\r\n colorCache: Map<string, string>;\r\n loadedGroups: Set<string>;\r\n cacheHits: Map<string, number>;\r\n clearCache: () => void;\r\n cleanupCache: () => void;\r\n isGroupLoaded: (groupCode: string) => boolean;\r\n markGroupLoaded: (groupCode: string) => void;\r\n}\r\n\r\nconst optimizedCacheManager: OptimizedCacheManager = {\r\n codeCache: new Map(),\r\n nameCache: new Map(),\r\n optionCache: new Map(),\r\n colorCache: new Map(),\r\n loadedGroups: new Set(),\r\n cacheHits: new Map(),\r\n\r\n clearCache() {\r\n this.codeCache.clear();\r\n this.nameCache.clear();\r\n this.optionCache.clear();\r\n this.colorCache.clear();\r\n this.loadedGroups.clear();\r\n this.cacheHits.clear();\r\n },\r\n\r\n cleanupCache() {\r\n // LRU 방식으로 캐시 정리\r\n const entries = Array.from(this.cacheHits.entries());\r\n entries.sort((a, b) => a[1] - b[1]);\r\n\r\n // 가장 적게 사용된 캐시 항목들 제거\r\n const toRemove = entries.slice(0, Math.floor(entries.length * 0.3));\r\n toRemove.forEach(([key]) => {\r\n this.codeCache.delete(key);\r\n this.nameCache.delete(key);\r\n this.optionCache.delete(key);\r\n this.colorCache.delete(key);\r\n this.cacheHits.delete(key);\r\n });\r\n },\r\n\r\n isGroupLoaded(groupCode: string) {\r\n return this.loadedGroups.has(groupCode);\r\n },\r\n\r\n markGroupLoaded(groupCode: string) {\r\n this.loadedGroups.add(groupCode);\r\n },\r\n};\r\n\r\n// 서버 응답을 클라이언트 형식으로 변환하는 함수 (실제 SCMSIGN00301 서비스 응답 구조 반영)\r\nconst transformServerResponse = (response: any): CommonCodeData => {\r\n console.log('대규모 데이터 변환 시작:', response);\r\n\r\n const codeData: CommonCodeData = {};\r\n\r\n // 실제 서비스 응답 구조: { code: [...], opt: [...] }\r\n if (response && response.code && Array.isArray(response.code)) {\r\n const codeList = response.code;\r\n const optionList = response.opt || [];\r\n\r\n // 옵션 데이터를 공통코드별로 그룹화\r\n const optionMap = new Map<string, any[]>();\r\n optionList.forEach((opt: any) => {\r\n if (opt.cmmnCd && opt.enblYn === 'Y') {\r\n if (!optionMap.has(opt.cmmnCd)) {\r\n optionMap.set(opt.cmmnCd, []);\r\n }\r\n optionMap.get(opt.cmmnCd)!.push(opt);\r\n }\r\n });\r\n\r\n // 공통코드 데이터를 그룹별로 정리\r\n codeList.forEach((item: any) => {\r\n if (item && item.cmmnCdGrp && item.cmmnCd && item.enblYn === 'Y') {\r\n const groupCode = item.cmmnCdGrp;\r\n\r\n // 그룹이 없으면 생성\r\n if (!codeData[groupCode]) {\r\n codeData[groupCode] = {};\r\n }\r\n\r\n // 해당 코드의 옵션들 찾기\r\n const codeOptions = optionMap.get(item.cmmnCd) || [];\r\n const options = codeOptions.reduce((acc: any, opt: any) => {\r\n if (opt.optnCd && opt.optnNm) {\r\n acc[opt.optnCd] = opt.optnNm;\r\n }\r\n return acc;\r\n }, {});\r\n\r\n // 코드 아이템 생성\r\n codeData[groupCode][item.cmmnCd] = {\r\n codeValue: item.cmmnCd,\r\n codeNm: item.cmmnCdNm,\r\n groupCode: item.cmmnCdGrp,\r\n commonCode: item.cmmnCd,\r\n labelColor: item.cmmnCdClr,\r\n systemCodeYn: item.syscdYn,\r\n sortOrder: parseInt(item.sortOrd) || 1,\r\n enabled: item.enblYn === 'Y',\r\n options: Object.keys(options).length > 0 ? options : null,\r\n originalData: item,\r\n };\r\n }\r\n });\r\n }\r\n\r\n console.log('대규모 데이터 변환 완료:', codeData);\r\n return codeData;\r\n};\r\n\r\n// 대규모 데이터를 관리하는 중앙 스토어\r\nconst useLargeDataStore = create<{\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n loadedGroups: Set<string>;\r\n fetchData: () => Promise<void>;\r\n loadSpecificGroup: (groupCode: string) => Promise<void>;\r\n setData: (data: CommonCodeData) => void;\r\n clearData: () => void;\r\n getLoadedGroups: () => string[];\r\n}>()(\r\n persist(\r\n (set, get) => ({\r\n codeData: null,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: null,\r\n loadedGroups: new Set(),\r\n\r\n fetchData: async () => {\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n console.log('대규모 공통코드 데이터 가져오기 시작: SCMSIGN00301');\r\n\r\n const response = await callService(getServiceCode('SRCH_CODE'), {\r\n crprCd: '100',\r\n });\r\n\r\n console.log('대규모 공통코드 응답:', response);\r\n console.log('대규모 공통코드목록:', response.code);\r\n console.log('대규모 공통코드옵션션목록:', response.opt);\r\n\r\n const codeData = transformServerResponse(response);\r\n\r\n // 캐시 초기화\r\n optimizedCacheManager.clearCache();\r\n\r\n // 로드된 그룹들을 optimizedCacheManager에도 설정\r\n const loadedGroups = new Set(Object.keys(codeData));\r\n loadedGroups.forEach(groupCode => {\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n });\r\n\r\n set({\r\n codeData,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: new Date(),\r\n loadedGroups,\r\n });\r\n\r\n console.log('대규모 공통코드 데이터 가져오기 완료');\r\n } catch (error) {\r\n console.error('대규모 공통코드 데이터 가져오기 실패:', error);\r\n set({\r\n isLoading: false,\r\n error:\r\n error instanceof Error\r\n ? error.message\r\n : '대규모 공통코드 데이터 가져오기 실패',\r\n });\r\n }\r\n },\r\n\r\n loadSpecificGroup: async (groupCode: string) => {\r\n const { codeData, loadedGroups } = get();\r\n if (!codeData || loadedGroups.has(groupCode)) return;\r\n\r\n // 특정 그룹만 로드 (필요시 서버에서 개별 요청)\r\n const newLoadedGroups = new Set(loadedGroups).add(groupCode);\r\n set({ loadedGroups: newLoadedGroups });\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n },\r\n\r\n setData: (data: CommonCodeData) => {\r\n optimizedCacheManager.clearCache();\r\n\r\n // 로드된 그룹들을 optimizedCacheManager에도 설정\r\n const loadedGroups = new Set(Object.keys(data));\r\n loadedGroups.forEach(groupCode => {\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n });\r\n\r\n set({\r\n codeData: data,\r\n lastUpdated: new Date(),\r\n loadedGroups,\r\n });\r\n },\r\n\r\n clearData: () => {\r\n optimizedCacheManager.clearCache();\r\n set({\r\n codeData: null,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: null,\r\n loadedGroups: new Set(),\r\n });\r\n },\r\n\r\n getLoadedGroups: () => {\r\n return Array.from(get().loadedGroups);\r\n },\r\n }),\r\n {\r\n name: 'large-data-storage',\r\n partialize: state => ({\r\n codeData: state.codeData,\r\n lastUpdated: state.lastUpdated,\r\n loadedGroups: Array.from(state.loadedGroups),\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 1. CODE 스토어 - 대규모 데이터 최적화\r\nexport const useCodeStore = create<CodeStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ): SimpleCodeItem[] => {\r\n const {\r\n enabledOnly = true,\r\n systemCodeOnly = false,\r\n sortByOrder = false,\r\n excludeParentCode = false,\r\n } = options || {};\r\n\r\n // 캐시 키 생성 (옵션 포함)\r\n const cacheKey = `simpleCodeList_${groupCode}_${enabledOnly}_${systemCodeOnly}_${sortByOrder}_${excludeParentCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n // 그룹이 로드되었는지 확인 (데이터가 있으면 로드된 것으로 간주)\r\n if (\r\n !optimizedCacheManager.isGroupLoaded(groupCode) &&\r\n !codeData[groupCode]\r\n ) {\r\n console.warn(`그룹 ${groupCode}가 아직 로드되지 않았습니다.`);\r\n return [];\r\n }\r\n\r\n const detailCodes: CodeItem[] = [];\r\n\r\n // 해당 그룹만 처리하여 성능 최적화\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n // 사용여부 필터링\r\n if (enabledOnly && !item.enabled) return;\r\n\r\n // 시스템코드 필터링\r\n if (systemCodeOnly && item.systemCodeYn !== 'Y') return;\r\n\r\n // 부모코드 제외 옵션 처리\r\n if (excludeParentCode) {\r\n // 부모코드 길이 계산 (예: CMPRGR = 6자)\r\n const parentCodeLength = groupCode.length;\r\n\r\n // 자식코드만 추출 (부모코드 제외)\r\n const childCode = item.codeValue.substring(parentCodeLength);\r\n\r\n // 자식코드가 있는 경우만 추가\r\n if (childCode.length > 0) {\r\n detailCodes.push({\r\n ...item,\r\n codeValue: childCode, // 자식코드만 사용\r\n });\r\n }\r\n } else {\r\n detailCodes.push(item);\r\n }\r\n });\r\n }\r\n\r\n // 정렬\r\n let sortedCodes: CodeItem[];\r\n if (sortByOrder) {\r\n // 정렬순서로 정렬, 동일한 경우 코드값으로 정렬\r\n sortedCodes = detailCodes.sort((a, b) => {\r\n if (a.sortOrder !== b.sortOrder) {\r\n return a.sortOrder - b.sortOrder;\r\n }\r\n return a.codeValue.localeCompare(b.codeValue);\r\n });\r\n } else {\r\n // 코드값으로 정렬\r\n sortedCodes = detailCodes.sort((a, b) =>\r\n a.codeValue.localeCompare(b.codeValue)\r\n );\r\n }\r\n\r\n // SimpleCodeItem으로 변환\r\n const simpleCodes: SimpleCodeItem[] = sortedCodes.map(item => ({\r\n label: item.codeNm,\r\n value: item.codeValue,\r\n tagColor: item.labelColor,\r\n }));\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.optionCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, simpleCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return simpleCodes;\r\n },\r\n\r\n // 2. 코드를 던졌을 때 코드명을 리턴 (대규모 최적화)\r\n getCodeName: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.nameCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`name_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`name_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.nameCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 대신 인덱스 활용 (실제 구현에서는 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.nameCache.set(codeValue, item.codeNm);\r\n optimizedCacheManager.cacheHits.set(`name_${codeValue}`, 1);\r\n return item.codeNm;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴 (대규모 최적화)\r\n getCodeColor: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.colorCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`color_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.colorCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 대신 인덱스 활용 (실제 구현에서는 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.colorCache.set(\r\n codeValue,\r\n item.labelColor || ''\r\n );\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, 1);\r\n return item.labelColor;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 4. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (\r\n groupCode: string\r\n ): { labels: string[]; values: string[]; lookupDisplay: boolean } => {\r\n // 캐시 확인\r\n const cacheKey = `gridLookup_${groupCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return { labels: [], values: [], lookupDisplay: true };\r\n\r\n const group = codeData[groupCode];\r\n if (!group) return { labels: [], values: [], lookupDisplay: true };\r\n\r\n const labels: string[] = [];\r\n const values: string[] = [];\r\n\r\n // 활성화된 코드만 필터링하여 순서대로 추가\r\n Object.values(group)\r\n .filter(item => item.enabled)\r\n .sort((a, b) => a.sortOrder - b.sortOrder)\r\n .forEach(item => {\r\n labels.push(item.codeNm);\r\n values.push(item.codeValue);\r\n });\r\n\r\n const result = { labels, values, lookupDisplay: true };\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, result);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return result;\r\n },\r\n\r\n // 3. 옵션값으로 코드를 조회하는 새로운 메서드\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ): CodeItem[] => {\r\n // 캐시 확인\r\n const cacheKey = `codeByOption_${groupCode}_${optionKey}_${optionValue}`;\r\n if (optimizedCacheManager.codeCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.codeCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const matchedCodes: CodeItem[] = [];\r\n\r\n // 해당 그룹에서 옵션값이 일치하는 코드들 찾기\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n if (\r\n item.enabled &&\r\n item.options &&\r\n item.options[optionKey] === optionValue\r\n ) {\r\n // 옵션값을 코드명으로 대체하여 반환\r\n matchedCodes.push({\r\n ...item,\r\n codeNm: item.options[optionKey] || item.codeNm, // 옵션값을 코드명으로 사용\r\n });\r\n }\r\n });\r\n }\r\n\r\n const sortedCodes = matchedCodes.sort((a, b) =>\r\n a.codeValue.localeCompare(b.codeValue)\r\n );\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.codeCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.codeCache.set(cacheKey, sortedCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return sortedCodes;\r\n },\r\n\r\n // 6. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ): SimpleCodeItem[] => {\r\n const {\r\n enabledOnly = true,\r\n systemCodeOnly = false,\r\n sortByOrder = false,\r\n } = options || {};\r\n\r\n // 캐시 키 생성 (옵션 포함)\r\n const cacheKey = `codeListByOption_${groupCode}_${optionCode}_${enabledOnly}_${systemCodeOnly}_${sortByOrder}`;\r\n if (optimizedCacheManager.codeCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.codeCache.get(\r\n cacheKey\r\n ) as SimpleCodeItem[];\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n // 그룹이 로드되었는지 확인 (데이터가 있으면 로드된 것으로 간주)\r\n if (\r\n !optimizedCacheManager.isGroupLoaded(groupCode) &&\r\n !codeData[groupCode]\r\n ) {\r\n console.warn(`그룹 ${groupCode}가 아직 로드되지 않았습니다.`);\r\n return [];\r\n }\r\n\r\n const matchedCodes: SimpleCodeItem[] = [];\r\n\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n // 사용여부 필터링\r\n if (enabledOnly && !item.enabled) return;\r\n\r\n // 시스템코드 필터링\r\n if (systemCodeOnly && item.systemCodeYn !== 'Y') return;\r\n\r\n // 해당 옵션코드가 있는지 확인\r\n if (item.options && item.options[optionCode]) {\r\n // SimpleCodeItem 형태로 변환\r\n matchedCodes.push({\r\n label: item.options[optionCode], // optnNm 값\r\n value: item.commonCode, // 공통코드값\r\n tagColor: item.labelColor, // 라벨 컬러\r\n });\r\n }\r\n });\r\n }\r\n\r\n // 정렬\r\n let sortedCodes: SimpleCodeItem[];\r\n if (sortByOrder) {\r\n // 정렬순서로 정렬, 동일한 경우 코드값으로 정렬\r\n sortedCodes = matchedCodes.sort((a, b) => {\r\n // sortOrder는 원본 item에서 가져와야 하므로 임시로 코드값으로 정렬\r\n return a.value.localeCompare(b.value);\r\n });\r\n } else {\r\n // 코드값으로 정렬\r\n sortedCodes = matchedCodes.sort((a, b) =>\r\n a.value.localeCompare(b.value)\r\n );\r\n }\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.codeCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.codeCache.set(cacheKey, sortedCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return sortedCodes;\r\n },\r\n\r\n // 7. 그룹코드 목록 조회\r\n getAvailableGroupCodes: (): string[] => {\r\n const cacheKey = 'available_group_codes';\r\n if (optimizedCacheManager.nameCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return JSON.parse(optimizedCacheManager.nameCache.get(cacheKey)!);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const groupCodes = Object.keys(codeData).sort();\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.nameCache.set(\r\n cacheKey,\r\n JSON.stringify(groupCodes)\r\n );\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return groupCodes;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'code-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 2. OPTION 스토어 - 대규모 데이터 최적화\r\nexport const useOptionStore = create<OptionStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 그룹코드와 옵션코드를 던졌을 때 상세코드의 옵션값을 리턴 (대규모 최적화)\r\n getOptionValue: (groupCode: string, optionCode: string): any => {\r\n // 캐시 확인\r\n const cacheKey = `option_${groupCode}_${optionCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 해당 그룹만 검색\r\n const group = codeData[groupCode];\r\n if (group && group[optionCode]) {\r\n const options = group[optionCode].options;\r\n optimizedCacheManager.optionCache.set(cacheKey, options);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n return options;\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 특정 옵션 키의 값 가져오기 (대규모 최적화)\r\n getOptionByKey: (\r\n groupCode: string,\r\n optionCode: string,\r\n optionKey: string\r\n ): any => {\r\n const cacheKey = `option_${groupCode}_${optionCode}_${optionKey}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const options = get().getOptionValue(groupCode, optionCode);\r\n const result = options ? options[optionKey] : null;\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, result);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return result;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'option-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 3. COLOR 스토어 - 대규모 데이터 최적화\r\nexport const useColorStore = create<ColorStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 코드를 던졌을 때 컬러코드를 리턴 (대규모 최적화)\r\n getColorCode: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.colorCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`color_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.colorCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 (실제 구현에서는 컬러 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.colorCache.set(\r\n codeValue,\r\n item.labelColor || ''\r\n );\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, 1);\r\n return item.labelColor;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 코드/컬러 매핑 배열 가져오기 (대규모 최적화)\r\n getColorMapping: (): Array<{ code: string; color: string }> => {\r\n const cacheKey = 'color_mapping';\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const colorMapping: Array<{ code: string; color: string }> = [];\r\n\r\n // 배치 처리로 메모리 사용량 최적화\r\n Object.values(codeData).forEach(group => {\r\n Object.values(group).forEach(item => {\r\n if (item.labelColor) {\r\n colorMapping.push({\r\n code: item.codeValue,\r\n color: item.labelColor,\r\n });\r\n }\r\n });\r\n });\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, colorMapping);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return colorMapping;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'color-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n"],"names":["LARGE_DATASET_CONFIG","optimizedCacheManager","entries","a","b","key","groupCode","transformServerResponse","response","codeData","codeList","optionList","optionMap","opt","item","options","acc","useLargeDataStore","create","persist","set","get","callService","getServiceCode","loadedGroups","error","newLoadedGroups","data","state","useCodeStore","enabledOnly","systemCodeOnly","sortByOrder","excludeParentCode","cacheKey","hits","detailCodes","group","parentCodeLength","childCode","sortedCodes","simpleCodes","codeValue","labels","values","result","optionKey","optionValue","matchedCodes","optionCode","groupCodes","useOptionStore","useColorStore","colorMapping"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"codeStore-CfI4Wh5M.js","sources":["../../src/stores/codeStore.ts"],"sourcesContent":["import { create } from 'zustand';\r\nimport { persist } from 'zustand/middleware';\r\nimport { callService } from '../utils/apiUtils';\r\nimport { getServiceCode } from '../utils/serviceConfig';\r\n\r\n// 공통코드 관련 타입 정의\r\n\r\n// 서버 응답의 개별 코드 아이템 (실제 SCMSIGN00301 서비스 응답 구조)\r\nexport interface ServerCodeItem {\r\n cmmnCdGrp: string; // 그룹 코드\r\n cmmnCd: string; // 공통 코드\r\n cmmnCdNm: string; // 공통 코드명\r\n cmmnCdClr: string | null; // 공통 코드 컬러\r\n syscdYn: string; // 시스템 코드 여부\r\n sortOrd: string | null; // 정렬 순서\r\n enblYn: string; // 사용 여부\r\n}\r\n\r\n// 서버 응답의 개별 옵션 아이템 (실제 SCMSIGN00301 서비스 응답 구조)\r\nexport interface ServerOptionItem {\r\n cmmnCdGrp: string; // 그룹 코드\r\n cmmnCd: string; // 공통 코드\r\n cmmnCdClr: string | null; // 공통 코드 컬러\r\n optnCd: string; // 옵션 코드\r\n optnNm: string; // 옵션명\r\n syscdYn: string; // 시스템 코드 여부\r\n sortOrd: string | null; // 정렬 순서\r\n enblYn: string; // 사용 여부\r\n}\r\n\r\n// SCMSIGN00301 서비스 응답 구조\r\nexport interface ServerCommonCodeResponse {\r\n code: ServerCodeItem[]; // 공통코드 목록\r\n opt: ServerOptionItem[]; // 옵션 목록\r\n}\r\n\r\n// 클라이언트에서 사용할 코드 아이템 (실제 응답 구조 반영)\r\nexport interface CodeItem {\r\n codeValue: string; // 공통 코드 (cmmnCd)\r\n codeNm: string; // 공통 코드명 (cmmnCdNm)\r\n groupCode: string; // 그룹 코드 (cmmnCdGrp)\r\n commonCode: string; // 공통 코드 (cmmnCd)\r\n labelColor: string | null; // 라벨 컬러 (cmmnCdClr)\r\n systemCodeYn: string; // 시스템 코드 여부 (syscdYn)\r\n sortOrder: number; // 정렬 순서 (sortOrd)\r\n enabled: boolean; // 사용 여부 (enblYn === 'Y')\r\n options: Record<string, any> | null; // 옵션 (optnCd: optnNm 형태)\r\n originalData: ServerCodeItem; // 원본 데이터\r\n}\r\n\r\n// 코드 그룹 (그룹코드별로 정리된 상세코드들)\r\nexport interface CodeGroup {\r\n [codeValue: string]: CodeItem;\r\n}\r\n\r\n// 전체 공통코드 구조\r\nexport interface CommonCodeData {\r\n [groupCode: string]: CodeGroup;\r\n}\r\n\r\n// 단순화된 코드 아이템 (getCodeList용)\r\nexport interface SimpleCodeItem {\r\n label: string; // codeNm\r\n value: string; // codeValue\r\n tagColor?: string | null; // labelColor\r\n}\r\n\r\n// 공통코드 응답 타입\r\nexport interface CommonCodeResponse {\r\n codeList: CommonCodeData;\r\n}\r\n\r\n// 기본 스토어 상태 (공통 속성)\r\nexport interface BaseStoreState {\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n fetchCommonCodes: () => Promise<void>;\r\n clearCodes: () => void;\r\n}\r\n\r\n// 1. CODE 스토어 - 그룹코드별 상세코드 목록과 코드명 관리\r\nexport interface CodeStoreState extends BaseStoreState {\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 2. 코드를 던졌을 때 코드명을 리턴\r\n getCodeName: (codeValue: string) => string | null;\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴\r\n getCodeColor: (codeValue: string) => string | null;\r\n // 3. 옵션값으로 코드를 조회\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ) => CodeItem[];\r\n // 4. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 5. 그룹코드 목록 조회\r\n getAvailableGroupCodes: () => string[];\r\n // 6. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (groupCode: string) => {\r\n labels: string[];\r\n values: string[];\r\n lookupDisplay: boolean;\r\n };\r\n}\r\n\r\n// 2. OPTION 스토어 - 옵션값 관리\r\nexport interface OptionStoreState extends BaseStoreState {\r\n // 그룹코드와 옵션코드를 던졌을 때 상세코드의 옵션값을 리턴\r\n getOptionValue: (groupCode: string, optionCode: string) => any;\r\n // 특정 옵션 키의 값 가져오기\r\n getOptionByKey: (\r\n groupCode: string,\r\n optionCode: string,\r\n optionKey: string\r\n ) => any;\r\n}\r\n\r\n// 3. COLOR 스토어 - 코드/컬러 매핑 관리\r\nexport interface ColorStoreState extends BaseStoreState {\r\n // 코드를 던졌을 때 컬러코드를 리턴\r\n getColorCode: (codeValue: string) => string | null;\r\n // 코드/컬러 매핑 배열 가져오기\r\n getColorMapping: () => Array<{ code: string; color: string }>;\r\n}\r\n\r\n// 기존 CommonCodeState (하위 호환성을 위해 유지)\r\nexport interface CommonCodeState {\r\n // 데이터\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n\r\n // 액션들\r\n fetchCommonCodes: () => Promise<void>;\r\n getCodeGroup: (codeGroup: string) => CodeGroup | null;\r\n getCodeItem: (codeGroup: string, codeValue: string) => CodeItem | null;\r\n getCodeList: (codeGroup: string) => CodeItem[];\r\n getCodeListByOption: (\r\n codeGroup: string,\r\n optionKey: string,\r\n optionValue: any\r\n ) => CodeItem[];\r\n getCodeListWithColor: (codeGroup: string) => CodeItem[];\r\n getAvailableGroupCodes: () => string[];\r\n getDetailCodeList: (groupCode: string, enabledOnly?: boolean) => CodeItem[];\r\n getDetailCodeName: (detailCode: string) => string | null;\r\n getDetailCodeColor: (detailCode: string) => string | null;\r\n clearCodes: () => void;\r\n}\r\n\r\n// 공통코드 컨텍스트 타입\r\nexport interface CommonCodeContextType {\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 2. 코드를 던졌을 때 코드명을 리턴\r\n getCodeName: (codeValue: string) => string | null;\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴\r\n getCodeColor: (codeValue: string) => string | null;\r\n // 4. 옵션값으로 코드를 조회\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ) => CodeItem[];\r\n // 5. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 6. 그룹코드 목록 조회\r\n getAvailableGroupCodes: () => string[];\r\n // 7. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (groupCode: string) => {\r\n labels: string[];\r\n values: string[];\r\n lookupDisplay: boolean;\r\n };\r\n refreshCodes: () => Promise<void>;\r\n}\r\n\r\n// 대규모 데이터셋 최적화를 위한 설정\r\nconst LARGE_DATASET_CONFIG = {\r\n CACHE_SIZE_LIMIT: 1000, // 캐시 크기 제한\r\n BATCH_SIZE: 100, // 배치 처리 크기\r\n DEBOUNCE_DELAY: 300, // 디바운스 지연시간\r\n MEMORY_THRESHOLD: 50 * 1024 * 1024, // 50MB 메모리 임계값\r\n};\r\n\r\n// 성능 최적화를 위한 캐시 관리 (대규모 데이터셋용)\r\ninterface OptimizedCacheManager {\r\n codeCache: Map<string, any>;\r\n nameCache: Map<string, string>;\r\n optionCache: Map<string, any>;\r\n colorCache: Map<string, string>;\r\n loadedGroups: Set<string>;\r\n cacheHits: Map<string, number>;\r\n clearCache: () => void;\r\n cleanupCache: () => void;\r\n isGroupLoaded: (groupCode: string) => boolean;\r\n markGroupLoaded: (groupCode: string) => void;\r\n}\r\n\r\nconst optimizedCacheManager: OptimizedCacheManager = {\r\n codeCache: new Map(),\r\n nameCache: new Map(),\r\n optionCache: new Map(),\r\n colorCache: new Map(),\r\n loadedGroups: new Set(),\r\n cacheHits: new Map(),\r\n\r\n clearCache() {\r\n this.codeCache.clear();\r\n this.nameCache.clear();\r\n this.optionCache.clear();\r\n this.colorCache.clear();\r\n this.loadedGroups.clear();\r\n this.cacheHits.clear();\r\n },\r\n\r\n cleanupCache() {\r\n // LRU 방식으로 캐시 정리\r\n const entries = Array.from(this.cacheHits.entries());\r\n entries.sort((a, b) => a[1] - b[1]);\r\n\r\n // 가장 적게 사용된 캐시 항목들 제거\r\n const toRemove = entries.slice(0, Math.floor(entries.length * 0.3));\r\n toRemove.forEach(([key]) => {\r\n this.codeCache.delete(key);\r\n this.nameCache.delete(key);\r\n this.optionCache.delete(key);\r\n this.colorCache.delete(key);\r\n this.cacheHits.delete(key);\r\n });\r\n },\r\n\r\n isGroupLoaded(groupCode: string) {\r\n return this.loadedGroups.has(groupCode);\r\n },\r\n\r\n markGroupLoaded(groupCode: string) {\r\n this.loadedGroups.add(groupCode);\r\n },\r\n};\r\n\r\n// 서버 응답을 클라이언트 형식으로 변환하는 함수 (실제 SCMSIGN00301 서비스 응답 구조 반영)\r\nconst transformServerResponse = (response: any): CommonCodeData => {\r\n console.log('대규모 데이터 변환 시작:', response);\r\n\r\n const codeData: CommonCodeData = {};\r\n\r\n // 실제 서비스 응답 구조: { code: [...], opt: [...] }\r\n if (response && response.code && Array.isArray(response.code)) {\r\n const codeList = response.code;\r\n const optionList = response.opt || [];\r\n\r\n // 옵션 데이터를 공통코드별로 그룹화\r\n const optionMap = new Map<string, any[]>();\r\n optionList.forEach((opt: any) => {\r\n if (opt.cmmnCd && opt.enblYn === 'Y') {\r\n if (!optionMap.has(opt.cmmnCd)) {\r\n optionMap.set(opt.cmmnCd, []);\r\n }\r\n optionMap.get(opt.cmmnCd)!.push(opt);\r\n }\r\n });\r\n\r\n // 공통코드 데이터를 그룹별로 정리\r\n codeList.forEach((item: any) => {\r\n if (item && item.cmmnCdGrp && item.cmmnCd && item.enblYn === 'Y') {\r\n const groupCode = item.cmmnCdGrp;\r\n\r\n // 그룹이 없으면 생성\r\n if (!codeData[groupCode]) {\r\n codeData[groupCode] = {};\r\n }\r\n\r\n // 해당 코드의 옵션들 찾기\r\n const codeOptions = optionMap.get(item.cmmnCd) || [];\r\n const options = codeOptions.reduce((acc: any, opt: any) => {\r\n if (opt.optnCd && opt.optnNm) {\r\n acc[opt.optnCd] = opt.optnNm;\r\n }\r\n return acc;\r\n }, {});\r\n\r\n // 코드 아이템 생성\r\n codeData[groupCode][item.cmmnCd] = {\r\n codeValue: item.cmmnCd,\r\n codeNm: item.cmmnCdNm,\r\n groupCode: item.cmmnCdGrp,\r\n commonCode: item.cmmnCd,\r\n labelColor: item.cmmnCdClr,\r\n systemCodeYn: item.syscdYn,\r\n sortOrder: parseInt(item.sortOrd) || 1,\r\n enabled: item.enblYn === 'Y',\r\n options: Object.keys(options).length > 0 ? options : null,\r\n originalData: item,\r\n };\r\n }\r\n });\r\n }\r\n\r\n console.log('대규모 데이터 변환 완료:', codeData);\r\n return codeData;\r\n};\r\n\r\n// 대규모 데이터를 관리하는 중앙 스토어\r\nconst useLargeDataStore = create<{\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n loadedGroups: Set<string>;\r\n fetchData: () => Promise<void>;\r\n loadSpecificGroup: (groupCode: string) => Promise<void>;\r\n setData: (data: CommonCodeData) => void;\r\n clearData: () => void;\r\n getLoadedGroups: () => string[];\r\n}>()(\r\n persist(\r\n (set, get) => ({\r\n codeData: null,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: null,\r\n loadedGroups: new Set(),\r\n\r\n fetchData: async () => {\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n console.log('대규모 공통코드 데이터 가져오기 시작: SCMSIGN00301');\r\n\r\n const response = await callService(getServiceCode('SRCH_CODE'), {\r\n crprCd: '100',\r\n });\r\n\r\n console.log('대규모 공통코드 응답:', response);\r\n console.log('대규모 공통코드목록:', response.code);\r\n console.log('대규모 공통코드옵션션목록:', response.opt);\r\n\r\n const codeData = transformServerResponse(response);\r\n\r\n // 캐시 초기화\r\n optimizedCacheManager.clearCache();\r\n\r\n // 로드된 그룹들을 optimizedCacheManager에도 설정\r\n const loadedGroups = new Set(Object.keys(codeData));\r\n loadedGroups.forEach(groupCode => {\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n });\r\n\r\n set({\r\n codeData,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: new Date(),\r\n loadedGroups,\r\n });\r\n\r\n console.log('대규모 공통코드 데이터 가져오기 완료');\r\n } catch (error) {\r\n console.error('대규모 공통코드 데이터 가져오기 실패:', error);\r\n set({\r\n isLoading: false,\r\n error:\r\n error instanceof Error\r\n ? error.message\r\n : '대규모 공통코드 데이터 가져오기 실패',\r\n });\r\n }\r\n },\r\n\r\n loadSpecificGroup: async (groupCode: string) => {\r\n const { codeData, loadedGroups } = get();\r\n if (!codeData || loadedGroups.has(groupCode)) return;\r\n\r\n // 특정 그룹만 로드 (필요시 서버에서 개별 요청)\r\n const newLoadedGroups = new Set(loadedGroups).add(groupCode);\r\n set({ loadedGroups: newLoadedGroups });\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n },\r\n\r\n setData: (data: CommonCodeData) => {\r\n optimizedCacheManager.clearCache();\r\n\r\n // 로드된 그룹들을 optimizedCacheManager에도 설정\r\n const loadedGroups = new Set(Object.keys(data));\r\n loadedGroups.forEach(groupCode => {\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n });\r\n\r\n set({\r\n codeData: data,\r\n lastUpdated: new Date(),\r\n loadedGroups,\r\n });\r\n },\r\n\r\n clearData: () => {\r\n optimizedCacheManager.clearCache();\r\n set({\r\n codeData: null,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: null,\r\n loadedGroups: new Set(),\r\n });\r\n },\r\n\r\n getLoadedGroups: () => {\r\n return Array.from(get().loadedGroups);\r\n },\r\n }),\r\n {\r\n name: 'large-data-storage',\r\n partialize: state => ({\r\n codeData: state.codeData,\r\n lastUpdated: state.lastUpdated,\r\n loadedGroups: Array.from(state.loadedGroups),\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 1. CODE 스토어 - 대규모 데이터 최적화\r\nexport const useCodeStore = create<CodeStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ): SimpleCodeItem[] => {\r\n const {\r\n enabledOnly = true,\r\n systemCodeOnly = false,\r\n sortByOrder = false,\r\n excludeParentCode = false,\r\n } = options || {};\r\n\r\n // 캐시 키 생성 (옵션 포함)\r\n const cacheKey = `simpleCodeList_${groupCode}_${enabledOnly}_${systemCodeOnly}_${sortByOrder}_${excludeParentCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n // 그룹이 로드되었는지 확인 (데이터가 있으면 로드된 것으로 간주)\r\n if (\r\n !optimizedCacheManager.isGroupLoaded(groupCode) &&\r\n !codeData[groupCode]\r\n ) {\r\n console.warn(`그룹 ${groupCode}가 아직 로드되지 않았습니다.`);\r\n return [];\r\n }\r\n\r\n const detailCodes: CodeItem[] = [];\r\n\r\n // 해당 그룹만 처리하여 성능 최적화\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n // 사용여부 필터링\r\n if (enabledOnly && !item.enabled) return;\r\n\r\n // 시스템코드 필터링\r\n if (systemCodeOnly && item.systemCodeYn !== 'Y') return;\r\n\r\n // 부모코드 제외 옵션 처리\r\n if (excludeParentCode) {\r\n // 부모코드 길이 계산 (예: CMPRGR = 6자)\r\n const parentCodeLength = groupCode.length;\r\n\r\n // 자식코드만 추출 (부모코드 제외)\r\n const childCode = item.codeValue.substring(parentCodeLength);\r\n\r\n // 자식코드가 있는 경우만 추가\r\n if (childCode.length > 0) {\r\n detailCodes.push({\r\n ...item,\r\n codeValue: childCode, // 자식코드만 사용\r\n });\r\n }\r\n } else {\r\n detailCodes.push(item);\r\n }\r\n });\r\n }\r\n\r\n // 정렬\r\n let sortedCodes: CodeItem[];\r\n if (sortByOrder) {\r\n // 정렬순서로 정렬, 동일한 경우 코드값으로 정렬\r\n sortedCodes = detailCodes.sort((a, b) => {\r\n if (a.sortOrder !== b.sortOrder) {\r\n return a.sortOrder - b.sortOrder;\r\n }\r\n return a.codeValue.localeCompare(b.codeValue);\r\n });\r\n } else {\r\n // 코드값으로 정렬\r\n sortedCodes = detailCodes.sort((a, b) =>\r\n a.codeValue.localeCompare(b.codeValue)\r\n );\r\n }\r\n\r\n // SimpleCodeItem으로 변환\r\n const simpleCodes: SimpleCodeItem[] = sortedCodes.map(item => ({\r\n label: item.codeNm,\r\n value: item.codeValue,\r\n tagColor: item.labelColor,\r\n }));\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.optionCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, simpleCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return simpleCodes;\r\n },\r\n\r\n // 2. 코드를 던졌을 때 코드명을 리턴 (대규모 최적화)\r\n getCodeName: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.nameCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`name_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`name_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.nameCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 대신 인덱스 활용 (실제 구현에서는 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.nameCache.set(codeValue, item.codeNm);\r\n optimizedCacheManager.cacheHits.set(`name_${codeValue}`, 1);\r\n return item.codeNm;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴 (대규모 최적화)\r\n getCodeColor: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.colorCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`color_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.colorCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 대신 인덱스 활용 (실제 구현에서는 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.colorCache.set(\r\n codeValue,\r\n item.labelColor || ''\r\n );\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, 1);\r\n return item.labelColor;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 4. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (\r\n groupCode: string\r\n ): { labels: string[]; values: string[]; lookupDisplay: boolean } => {\r\n // 캐시 확인\r\n const cacheKey = `gridLookup_${groupCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return { labels: [], values: [], lookupDisplay: true };\r\n\r\n const group = codeData[groupCode];\r\n if (!group) return { labels: [], values: [], lookupDisplay: true };\r\n\r\n const labels: string[] = [];\r\n const values: string[] = [];\r\n\r\n // 활성화된 코드만 필터링하여 순서대로 추가\r\n Object.values(group)\r\n .filter(item => item.enabled)\r\n .sort((a, b) => a.sortOrder - b.sortOrder)\r\n .forEach(item => {\r\n labels.push(item.codeNm);\r\n values.push(item.codeValue);\r\n });\r\n\r\n const result = { labels, values, lookupDisplay: true };\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, result);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return result;\r\n },\r\n\r\n // 3. 옵션값으로 코드를 조회하는 새로운 메서드\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ): CodeItem[] => {\r\n // 캐시 확인\r\n const cacheKey = `codeByOption_${groupCode}_${optionKey}_${optionValue}`;\r\n if (optimizedCacheManager.codeCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.codeCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const matchedCodes: CodeItem[] = [];\r\n\r\n // 해당 그룹에서 옵션값이 일치하는 코드들 찾기\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n if (\r\n item.enabled &&\r\n item.options &&\r\n item.options[optionKey] === optionValue\r\n ) {\r\n // 옵션값을 코드명으로 대체하여 반환\r\n matchedCodes.push({\r\n ...item,\r\n codeNm: item.options[optionKey] || item.codeNm, // 옵션값을 코드명으로 사용\r\n });\r\n }\r\n });\r\n }\r\n\r\n const sortedCodes = matchedCodes.sort((a, b) =>\r\n a.codeValue.localeCompare(b.codeValue)\r\n );\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.codeCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.codeCache.set(cacheKey, sortedCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return sortedCodes;\r\n },\r\n\r\n // 6. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ): SimpleCodeItem[] => {\r\n const {\r\n enabledOnly = true,\r\n systemCodeOnly = false,\r\n sortByOrder = false,\r\n } = options || {};\r\n\r\n // 캐시 키 생성 (옵션 포함)\r\n const cacheKey = `codeListByOption_${groupCode}_${optionCode}_${enabledOnly}_${systemCodeOnly}_${sortByOrder}`;\r\n if (optimizedCacheManager.codeCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.codeCache.get(\r\n cacheKey\r\n ) as SimpleCodeItem[];\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n // 그룹이 로드되었는지 확인 (데이터가 있으면 로드된 것으로 간주)\r\n if (\r\n !optimizedCacheManager.isGroupLoaded(groupCode) &&\r\n !codeData[groupCode]\r\n ) {\r\n console.warn(`그룹 ${groupCode}가 아직 로드되지 않았습니다.`);\r\n return [];\r\n }\r\n\r\n const matchedCodes: SimpleCodeItem[] = [];\r\n\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n // 사용여부 필터링\r\n if (enabledOnly && !item.enabled) return;\r\n\r\n // 시스템코드 필터링\r\n if (systemCodeOnly && item.systemCodeYn !== 'Y') return;\r\n\r\n // 해당 옵션코드가 있는지 확인\r\n if (item.options && item.options[optionCode]) {\r\n // SimpleCodeItem 형태로 변환\r\n matchedCodes.push({\r\n label: item.options[optionCode], // optnNm 값\r\n value: item.commonCode, // 공통코드값\r\n tagColor: item.labelColor, // 라벨 컬러\r\n });\r\n }\r\n });\r\n }\r\n\r\n // 정렬\r\n let sortedCodes: SimpleCodeItem[];\r\n if (sortByOrder) {\r\n // 정렬순서로 정렬, 동일한 경우 코드값으로 정렬\r\n sortedCodes = matchedCodes.sort((a, b) => {\r\n // sortOrder는 원본 item에서 가져와야 하므로 임시로 코드값으로 정렬\r\n return a.value.localeCompare(b.value);\r\n });\r\n } else {\r\n // 코드값으로 정렬\r\n sortedCodes = matchedCodes.sort((a, b) =>\r\n a.value.localeCompare(b.value)\r\n );\r\n }\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.codeCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.codeCache.set(cacheKey, sortedCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return sortedCodes;\r\n },\r\n\r\n // 7. 그룹코드 목록 조회\r\n getAvailableGroupCodes: (): string[] => {\r\n const cacheKey = 'available_group_codes';\r\n if (optimizedCacheManager.nameCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return JSON.parse(optimizedCacheManager.nameCache.get(cacheKey)!);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const groupCodes = Object.keys(codeData).sort();\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.nameCache.set(\r\n cacheKey,\r\n JSON.stringify(groupCodes)\r\n );\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return groupCodes;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'code-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 2. OPTION 스토어 - 대규모 데이터 최적화\r\nexport const useOptionStore = create<OptionStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 그룹코드와 옵션코드를 던졌을 때 상세코드의 옵션값을 리턴 (대규모 최적화)\r\n getOptionValue: (groupCode: string, optionCode: string): any => {\r\n // 캐시 확인\r\n const cacheKey = `option_${groupCode}_${optionCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 해당 그룹만 검색\r\n const group = codeData[groupCode];\r\n if (group && group[optionCode]) {\r\n const options = group[optionCode].options;\r\n optimizedCacheManager.optionCache.set(cacheKey, options);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n return options;\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 특정 옵션 키의 값 가져오기 (대규모 최적화)\r\n getOptionByKey: (\r\n groupCode: string,\r\n optionCode: string,\r\n optionKey: string\r\n ): any => {\r\n const cacheKey = `option_${groupCode}_${optionCode}_${optionKey}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const options = get().getOptionValue(groupCode, optionCode);\r\n const result = options ? options[optionKey] : null;\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, result);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return result;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'option-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 3. COLOR 스토어 - 대규모 데이터 최적화\r\nexport const useColorStore = create<ColorStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 코드를 던졌을 때 컬러코드를 리턴 (대규모 최적화)\r\n getColorCode: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.colorCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`color_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.colorCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 (실제 구현에서는 컬러 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.colorCache.set(\r\n codeValue,\r\n item.labelColor || ''\r\n );\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, 1);\r\n return item.labelColor;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 코드/컬러 매핑 배열 가져오기 (대규모 최적화)\r\n getColorMapping: (): Array<{ code: string; color: string }> => {\r\n const cacheKey = 'color_mapping';\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const colorMapping: Array<{ code: string; color: string }> = [];\r\n\r\n // 배치 처리로 메모리 사용량 최적화\r\n Object.values(codeData).forEach(group => {\r\n Object.values(group).forEach(item => {\r\n if (item.labelColor) {\r\n colorMapping.push({\r\n code: item.codeValue,\r\n color: item.labelColor,\r\n });\r\n }\r\n });\r\n });\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, colorMapping);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return colorMapping;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'color-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n"],"names":["LARGE_DATASET_CONFIG","optimizedCacheManager","entries","a","b","key","groupCode","transformServerResponse","response","codeData","codeList","optionList","optionMap","opt","item","options","acc","useLargeDataStore","create","persist","set","get","callService","getServiceCode","loadedGroups","error","newLoadedGroups","data","state","useCodeStore","enabledOnly","systemCodeOnly","sortByOrder","excludeParentCode","cacheKey","hits","detailCodes","group","parentCodeLength","childCode","sortedCodes","simpleCodes","codeValue","labels","values","result","optionKey","optionValue","matchedCodes","optionCode","groupCodes","useOptionStore","useColorStore","colorMapping"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const D=require("zustand"),S=require("./apiUtils-
|
|
2
|
-
//# sourceMappingURL=codeStore-
|
|
1
|
+
"use strict";const D=require("zustand"),S=require("./apiUtils-BZ6s0_NI.cjs"),O={CACHE_SIZE_LIMIT:1e3},t={codeCache:new Map,nameCache:new Map,optionCache:new Map,colorCache:new Map,loadedGroups:new Set,cacheHits:new Map,clearCache(){this.codeCache.clear(),this.nameCache.clear(),this.optionCache.clear(),this.colorCache.clear(),this.loadedGroups.clear(),this.cacheHits.clear()},cleanupCache(){const s=Array.from(this.cacheHits.entries());s.sort((e,c)=>e[1]-c[1]),s.slice(0,Math.floor(s.length*.3)).forEach(([e])=>{this.codeCache.delete(e),this.nameCache.delete(e),this.optionCache.delete(e),this.colorCache.delete(e),this.cacheHits.delete(e)})},isGroupLoaded(s){return this.loadedGroups.has(s)},markGroupLoaded(s){this.loadedGroups.add(s)}},_=s=>{console.log("대규모 데이터 변환 시작:",s);const p={};if(s&&s.code&&Array.isArray(s.code)){const e=s.code,c=s.opt||[],o=new Map;c.forEach(a=>{a.cmmnCd&&a.enblYn==="Y"&&(o.has(a.cmmnCd)||o.set(a.cmmnCd,[]),o.get(a.cmmnCd).push(a))}),e.forEach(a=>{if(a&&a.cmmnCdGrp&&a.cmmnCd&&a.enblYn==="Y"){const n=a.cmmnCdGrp;p[n]||(p[n]={});const d=(o.get(a.cmmnCd)||[]).reduce((i,l)=>(l.optnCd&&l.optnNm&&(i[l.optnCd]=l.optnNm),i),{});p[n][a.cmmnCd]={codeValue:a.cmmnCd,codeNm:a.cmmnCdNm,groupCode:a.cmmnCdGrp,commonCode:a.cmmnCd,labelColor:a.cmmnCdClr,systemCodeYn:a.syscdYn,sortOrder:parseInt(a.sortOrd)||1,enabled:a.enblYn==="Y",options:Object.keys(d).length>0?d:null,originalData:a}}})}return console.log("대규모 데이터 변환 완료:",p),p},r=D.create()(S.persist((s,p)=>({codeData:null,isLoading:!1,error:null,lastUpdated:null,loadedGroups:new Set,fetchData:async()=>{s({isLoading:!0,error:null});try{console.log("대규모 공통코드 데이터 가져오기 시작: SCMSIGN00301");const e=await S.callService(S.getServiceCode("SRCH_CODE"),{crprCd:"100"});console.log("대규모 공통코드 응답:",e),console.log("대규모 공통코드목록:",e.code),console.log("대규모 공통코드옵션션목록:",e.opt);const c=_(e);t.clearCache();const o=new Set(Object.keys(c));o.forEach(a=>{t.markGroupLoaded(a)}),s({codeData:c,isLoading:!1,error:null,lastUpdated:new Date,loadedGroups:o}),console.log("대규모 공통코드 데이터 가져오기 완료")}catch(e){console.error("대규모 공통코드 데이터 가져오기 실패:",e),s({isLoading:!1,error:e instanceof Error?e.message:"대규모 공통코드 데이터 가져오기 실패"})}},loadSpecificGroup:async e=>{const{codeData:c,loadedGroups:o}=p();if(!c||o.has(e))return;const a=new Set(o).add(e);s({loadedGroups:a}),t.markGroupLoaded(e)},setData:e=>{t.clearCache();const c=new Set(Object.keys(e));c.forEach(o=>{t.markGroupLoaded(o)}),s({codeData:e,lastUpdated:new Date,loadedGroups:c})},clearData:()=>{t.clearCache(),s({codeData:null,isLoading:!1,error:null,lastUpdated:null,loadedGroups:new Set})},getLoadedGroups:()=>Array.from(p().loadedGroups)}),{name:"large-data-storage",partialize:s=>({codeData:s.codeData,lastUpdated:s.lastUpdated,loadedGroups:Array.from(s.loadedGroups)})})),b=D.create()(S.persist((s,p)=>({get codeData(){return r.getState().codeData},get isLoading(){return r.getState().isLoading},get error(){return r.getState().error},get lastUpdated(){return r.getState().lastUpdated},fetchCommonCodes:async()=>{await r.getState().fetchData()},getCodeList:(e,c)=>{const{enabledOnly:o=!0,systemCodeOnly:a=!1,sortByOrder:n=!1,excludeParentCode:u=!1}=c||{},d=`simpleCodeList_${e}_${o}_${a}_${n}_${u}`;if(t.optionCache.has(d)){const h=t.cacheHits.get(d)||0;return t.cacheHits.set(d,h+1),t.optionCache.get(d)}const i=r.getState().codeData;if(!i)return[];if(!t.isGroupLoaded(e)&&!i[e])return console.warn(`그룹 ${e}가 아직 로드되지 않았습니다.`),[];const l=[],f=i[e];f&&Object.values(f).forEach(h=>{if(!(o&&!h.enabled)&&!(a&&h.systemCodeYn!=="Y"))if(u){const m=e.length,H=h.codeValue.substring(m);H.length>0&&l.push({...h,codeValue:H})}else l.push(h)});let g;n?g=l.sort((h,m)=>h.sortOrder!==m.sortOrder?h.sortOrder-m.sortOrder:h.codeValue.localeCompare(m.codeValue)):g=l.sort((h,m)=>h.codeValue.localeCompare(m.codeValue));const C=g.map(h=>({label:h.codeNm,value:h.codeValue,tagColor:h.labelColor}));return t.optionCache.size>=O.CACHE_SIZE_LIMIT&&t.cleanupCache(),t.optionCache.set(d,C),t.cacheHits.set(d,1),C},getCodeName:e=>{if(t.nameCache.has(e)){const o=t.cacheHits.get(`name_${e}`)||0;return t.cacheHits.set(`name_${e}`,o+1),t.nameCache.get(e)}const c=r.getState().codeData;if(!c)return null;for(const o of Object.values(c))for(const a of Object.values(o))if(a.codeValue===e)return t.nameCache.set(e,a.codeNm),t.cacheHits.set(`name_${e}`,1),a.codeNm;return null},getCodeColor:e=>{if(t.colorCache.has(e)){const o=t.cacheHits.get(`color_${e}`)||0;return t.cacheHits.set(`color_${e}`,o+1),t.colorCache.get(e)}const c=r.getState().codeData;if(!c)return null;for(const o of Object.values(c))for(const a of Object.values(o))if(a.codeValue===e)return t.colorCache.set(e,a.labelColor||""),t.cacheHits.set(`color_${e}`,1),a.labelColor;return null},getGridLookup:e=>{const c=`gridLookup_${e}`;if(t.optionCache.has(c)){const i=t.cacheHits.get(c)||0;return t.cacheHits.set(c,i+1),t.optionCache.get(c)}const o=r.getState().codeData;if(!o)return{labels:[],values:[],lookupDisplay:!0};const a=o[e];if(!a)return{labels:[],values:[],lookupDisplay:!0};const n=[],u=[];Object.values(a).filter(i=>i.enabled).sort((i,l)=>i.sortOrder-l.sortOrder).forEach(i=>{n.push(i.codeNm),u.push(i.codeValue)});const d={labels:n,values:u,lookupDisplay:!0};return t.optionCache.set(c,d),t.cacheHits.set(c,1),d},getCodeByOption:(e,c,o)=>{const a=`codeByOption_${e}_${c}_${o}`;if(t.codeCache.has(a)){const l=t.cacheHits.get(a)||0;return t.cacheHits.set(a,l+1),t.codeCache.get(a)}const n=r.getState().codeData;if(!n)return[];const u=[],d=n[e];d&&Object.values(d).forEach(l=>{l.enabled&&l.options&&l.options[c]===o&&u.push({...l,codeNm:l.options[c]||l.codeNm})});const i=u.sort((l,f)=>l.codeValue.localeCompare(f.codeValue));return t.codeCache.size>=O.CACHE_SIZE_LIMIT&&t.cleanupCache(),t.codeCache.set(a,i),t.cacheHits.set(a,1),i},getCodeListByOption:(e,c,o)=>{const{enabledOnly:a=!0,systemCodeOnly:n=!1,sortByOrder:u=!1}=o||{},d=`codeListByOption_${e}_${c}_${a}_${n}_${u}`;if(t.codeCache.has(d)){const C=t.cacheHits.get(d)||0;return t.cacheHits.set(d,C+1),t.codeCache.get(d)}const i=r.getState().codeData;if(!i)return[];if(!t.isGroupLoaded(e)&&!i[e])return console.warn(`그룹 ${e}가 아직 로드되지 않았습니다.`),[];const l=[],f=i[e];f&&Object.values(f).forEach(C=>{a&&!C.enabled||n&&C.systemCodeYn!=="Y"||C.options&&C.options[c]&&l.push({label:C.options[c],value:C.commonCode,tagColor:C.labelColor})});let g;return u?g=l.sort((C,h)=>C.value.localeCompare(h.value)):g=l.sort((C,h)=>C.value.localeCompare(h.value)),t.codeCache.size>=O.CACHE_SIZE_LIMIT&&t.cleanupCache(),t.codeCache.set(d,g),t.cacheHits.set(d,1),g},getAvailableGroupCodes:()=>{const e="available_group_codes";if(t.nameCache.has(e)){const a=t.cacheHits.get(e)||0;return t.cacheHits.set(e,a+1),JSON.parse(t.nameCache.get(e))}const c=r.getState().codeData;if(!c)return[];const o=Object.keys(c).sort();return t.nameCache.set(e,JSON.stringify(o)),t.cacheHits.set(e,1),o},clearCodes:()=>{r.getState().clearData()}}),{name:"code-storage",partialize:s=>({})})),y=D.create()(S.persist((s,p)=>({get codeData(){return r.getState().codeData},get isLoading(){return r.getState().isLoading},get error(){return r.getState().error},get lastUpdated(){return r.getState().lastUpdated},fetchCommonCodes:async()=>{await r.getState().fetchData()},getOptionValue:(e,c)=>{const o=`option_${e}_${c}`;if(t.optionCache.has(o)){const u=t.cacheHits.get(o)||0;return t.cacheHits.set(o,u+1),t.optionCache.get(o)}const a=r.getState().codeData;if(!a)return null;const n=a[e];if(n&&n[c]){const u=n[c].options;return t.optionCache.set(o,u),t.cacheHits.set(o,1),u}return null},getOptionByKey:(e,c,o)=>{const a=`option_${e}_${c}_${o}`;if(t.optionCache.has(a)){const d=t.cacheHits.get(a)||0;return t.cacheHits.set(a,d+1),t.optionCache.get(a)}const n=p().getOptionValue(e,c),u=n?n[o]:null;return t.optionCache.set(a,u),t.cacheHits.set(a,1),u},clearCodes:()=>{r.getState().clearData()}}),{name:"option-storage",partialize:s=>({})})),L=D.create()(S.persist((s,p)=>({get codeData(){return r.getState().codeData},get isLoading(){return r.getState().isLoading},get error(){return r.getState().error},get lastUpdated(){return r.getState().lastUpdated},fetchCommonCodes:async()=>{await r.getState().fetchData()},getColorCode:e=>{if(t.colorCache.has(e)){const o=t.cacheHits.get(`color_${e}`)||0;return t.cacheHits.set(`color_${e}`,o+1),t.colorCache.get(e)}const c=r.getState().codeData;if(!c)return null;for(const o of Object.values(c))for(const a of Object.values(o))if(a.codeValue===e)return t.colorCache.set(e,a.labelColor||""),t.cacheHits.set(`color_${e}`,1),a.labelColor;return null},getColorMapping:()=>{const e="color_mapping";if(t.optionCache.has(e)){const a=t.cacheHits.get(e)||0;return t.cacheHits.set(e,a+1),t.optionCache.get(e)}const c=r.getState().codeData;if(!c)return[];const o=[];return Object.values(c).forEach(a=>{Object.values(a).forEach(n=>{n.labelColor&&o.push({code:n.codeValue,color:n.labelColor})})}),t.optionCache.set(e,o),t.cacheHits.set(e,1),o},clearCodes:()=>{r.getState().clearData()}}),{name:"color-storage",partialize:s=>({})}));exports.useCodeStore=b;exports.useColorStore=L;exports.useOptionStore=y;
|
|
2
|
+
//# sourceMappingURL=codeStore-il4-kZPe.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codeStore-pQbDqWkZ.cjs","sources":["../../src/stores/codeStore.ts"],"sourcesContent":["import { create } from 'zustand';\r\nimport { persist } from 'zustand/middleware';\r\nimport { callService } from '../utils/apiUtils';\r\nimport { getServiceCode } from '../utils/serviceConfig';\r\n\r\n// 공통코드 관련 타입 정의\r\n\r\n// 서버 응답의 개별 코드 아이템 (실제 SCMSIGN00301 서비스 응답 구조)\r\nexport interface ServerCodeItem {\r\n cmmnCdGrp: string; // 그룹 코드\r\n cmmnCd: string; // 공통 코드\r\n cmmnCdNm: string; // 공통 코드명\r\n cmmnCdClr: string | null; // 공통 코드 컬러\r\n syscdYn: string; // 시스템 코드 여부\r\n sortOrd: string | null; // 정렬 순서\r\n enblYn: string; // 사용 여부\r\n}\r\n\r\n// 서버 응답의 개별 옵션 아이템 (실제 SCMSIGN00301 서비스 응답 구조)\r\nexport interface ServerOptionItem {\r\n cmmnCdGrp: string; // 그룹 코드\r\n cmmnCd: string; // 공통 코드\r\n cmmnCdClr: string | null; // 공통 코드 컬러\r\n optnCd: string; // 옵션 코드\r\n optnNm: string; // 옵션명\r\n syscdYn: string; // 시스템 코드 여부\r\n sortOrd: string | null; // 정렬 순서\r\n enblYn: string; // 사용 여부\r\n}\r\n\r\n// SCMSIGN00301 서비스 응답 구조\r\nexport interface ServerCommonCodeResponse {\r\n code: ServerCodeItem[]; // 공통코드 목록\r\n opt: ServerOptionItem[]; // 옵션 목록\r\n}\r\n\r\n// 클라이언트에서 사용할 코드 아이템 (실제 응답 구조 반영)\r\nexport interface CodeItem {\r\n codeValue: string; // 공통 코드 (cmmnCd)\r\n codeNm: string; // 공통 코드명 (cmmnCdNm)\r\n groupCode: string; // 그룹 코드 (cmmnCdGrp)\r\n commonCode: string; // 공통 코드 (cmmnCd)\r\n labelColor: string | null; // 라벨 컬러 (cmmnCdClr)\r\n systemCodeYn: string; // 시스템 코드 여부 (syscdYn)\r\n sortOrder: number; // 정렬 순서 (sortOrd)\r\n enabled: boolean; // 사용 여부 (enblYn === 'Y')\r\n options: Record<string, any> | null; // 옵션 (optnCd: optnNm 형태)\r\n originalData: ServerCodeItem; // 원본 데이터\r\n}\r\n\r\n// 코드 그룹 (그룹코드별로 정리된 상세코드들)\r\nexport interface CodeGroup {\r\n [codeValue: string]: CodeItem;\r\n}\r\n\r\n// 전체 공통코드 구조\r\nexport interface CommonCodeData {\r\n [groupCode: string]: CodeGroup;\r\n}\r\n\r\n// 단순화된 코드 아이템 (getCodeList용)\r\nexport interface SimpleCodeItem {\r\n label: string; // codeNm\r\n value: string; // codeValue\r\n tagColor?: string | null; // labelColor\r\n}\r\n\r\n// 공통코드 응답 타입\r\nexport interface CommonCodeResponse {\r\n codeList: CommonCodeData;\r\n}\r\n\r\n// 기본 스토어 상태 (공통 속성)\r\nexport interface BaseStoreState {\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n fetchCommonCodes: () => Promise<void>;\r\n clearCodes: () => void;\r\n}\r\n\r\n// 1. CODE 스토어 - 그룹코드별 상세코드 목록과 코드명 관리\r\nexport interface CodeStoreState extends BaseStoreState {\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 2. 코드를 던졌을 때 코드명을 리턴\r\n getCodeName: (codeValue: string) => string | null;\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴\r\n getCodeColor: (codeValue: string) => string | null;\r\n // 3. 옵션값으로 코드를 조회\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ) => CodeItem[];\r\n // 4. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 5. 그룹코드 목록 조회\r\n getAvailableGroupCodes: () => string[];\r\n // 6. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (groupCode: string) => {\r\n labels: string[];\r\n values: string[];\r\n lookupDisplay: boolean;\r\n };\r\n}\r\n\r\n// 2. OPTION 스토어 - 옵션값 관리\r\nexport interface OptionStoreState extends BaseStoreState {\r\n // 그룹코드와 옵션코드를 던졌을 때 상세코드의 옵션값을 리턴\r\n getOptionValue: (groupCode: string, optionCode: string) => any;\r\n // 특정 옵션 키의 값 가져오기\r\n getOptionByKey: (\r\n groupCode: string,\r\n optionCode: string,\r\n optionKey: string\r\n ) => any;\r\n}\r\n\r\n// 3. COLOR 스토어 - 코드/컬러 매핑 관리\r\nexport interface ColorStoreState extends BaseStoreState {\r\n // 코드를 던졌을 때 컬러코드를 리턴\r\n getColorCode: (codeValue: string) => string | null;\r\n // 코드/컬러 매핑 배열 가져오기\r\n getColorMapping: () => Array<{ code: string; color: string }>;\r\n}\r\n\r\n// 기존 CommonCodeState (하위 호환성을 위해 유지)\r\nexport interface CommonCodeState {\r\n // 데이터\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n\r\n // 액션들\r\n fetchCommonCodes: () => Promise<void>;\r\n getCodeGroup: (codeGroup: string) => CodeGroup | null;\r\n getCodeItem: (codeGroup: string, codeValue: string) => CodeItem | null;\r\n getCodeList: (codeGroup: string) => CodeItem[];\r\n getCodeListByOption: (\r\n codeGroup: string,\r\n optionKey: string,\r\n optionValue: any\r\n ) => CodeItem[];\r\n getCodeListWithColor: (codeGroup: string) => CodeItem[];\r\n getAvailableGroupCodes: () => string[];\r\n getDetailCodeList: (groupCode: string, enabledOnly?: boolean) => CodeItem[];\r\n getDetailCodeName: (detailCode: string) => string | null;\r\n getDetailCodeColor: (detailCode: string) => string | null;\r\n clearCodes: () => void;\r\n}\r\n\r\n// 공통코드 컨텍스트 타입\r\nexport interface CommonCodeContextType {\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 2. 코드를 던졌을 때 코드명을 리턴\r\n getCodeName: (codeValue: string) => string | null;\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴\r\n getCodeColor: (codeValue: string) => string | null;\r\n // 4. 옵션값으로 코드를 조회\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ) => CodeItem[];\r\n // 5. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 6. 그룹코드 목록 조회\r\n getAvailableGroupCodes: () => string[];\r\n // 7. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (groupCode: string) => {\r\n labels: string[];\r\n values: string[];\r\n lookupDisplay: boolean;\r\n };\r\n refreshCodes: () => Promise<void>;\r\n}\r\n\r\n// 대규모 데이터셋 최적화를 위한 설정\r\nconst LARGE_DATASET_CONFIG = {\r\n CACHE_SIZE_LIMIT: 1000, // 캐시 크기 제한\r\n BATCH_SIZE: 100, // 배치 처리 크기\r\n DEBOUNCE_DELAY: 300, // 디바운스 지연시간\r\n MEMORY_THRESHOLD: 50 * 1024 * 1024, // 50MB 메모리 임계값\r\n};\r\n\r\n// 성능 최적화를 위한 캐시 관리 (대규모 데이터셋용)\r\ninterface OptimizedCacheManager {\r\n codeCache: Map<string, any>;\r\n nameCache: Map<string, string>;\r\n optionCache: Map<string, any>;\r\n colorCache: Map<string, string>;\r\n loadedGroups: Set<string>;\r\n cacheHits: Map<string, number>;\r\n clearCache: () => void;\r\n cleanupCache: () => void;\r\n isGroupLoaded: (groupCode: string) => boolean;\r\n markGroupLoaded: (groupCode: string) => void;\r\n}\r\n\r\nconst optimizedCacheManager: OptimizedCacheManager = {\r\n codeCache: new Map(),\r\n nameCache: new Map(),\r\n optionCache: new Map(),\r\n colorCache: new Map(),\r\n loadedGroups: new Set(),\r\n cacheHits: new Map(),\r\n\r\n clearCache() {\r\n this.codeCache.clear();\r\n this.nameCache.clear();\r\n this.optionCache.clear();\r\n this.colorCache.clear();\r\n this.loadedGroups.clear();\r\n this.cacheHits.clear();\r\n },\r\n\r\n cleanupCache() {\r\n // LRU 방식으로 캐시 정리\r\n const entries = Array.from(this.cacheHits.entries());\r\n entries.sort((a, b) => a[1] - b[1]);\r\n\r\n // 가장 적게 사용된 캐시 항목들 제거\r\n const toRemove = entries.slice(0, Math.floor(entries.length * 0.3));\r\n toRemove.forEach(([key]) => {\r\n this.codeCache.delete(key);\r\n this.nameCache.delete(key);\r\n this.optionCache.delete(key);\r\n this.colorCache.delete(key);\r\n this.cacheHits.delete(key);\r\n });\r\n },\r\n\r\n isGroupLoaded(groupCode: string) {\r\n return this.loadedGroups.has(groupCode);\r\n },\r\n\r\n markGroupLoaded(groupCode: string) {\r\n this.loadedGroups.add(groupCode);\r\n },\r\n};\r\n\r\n// 서버 응답을 클라이언트 형식으로 변환하는 함수 (실제 SCMSIGN00301 서비스 응답 구조 반영)\r\nconst transformServerResponse = (response: any): CommonCodeData => {\r\n console.log('대규모 데이터 변환 시작:', response);\r\n\r\n const codeData: CommonCodeData = {};\r\n\r\n // 실제 서비스 응답 구조: { code: [...], opt: [...] }\r\n if (response && response.code && Array.isArray(response.code)) {\r\n const codeList = response.code;\r\n const optionList = response.opt || [];\r\n\r\n // 옵션 데이터를 공통코드별로 그룹화\r\n const optionMap = new Map<string, any[]>();\r\n optionList.forEach((opt: any) => {\r\n if (opt.cmmnCd && opt.enblYn === 'Y') {\r\n if (!optionMap.has(opt.cmmnCd)) {\r\n optionMap.set(opt.cmmnCd, []);\r\n }\r\n optionMap.get(opt.cmmnCd)!.push(opt);\r\n }\r\n });\r\n\r\n // 공통코드 데이터를 그룹별로 정리\r\n codeList.forEach((item: any) => {\r\n if (item && item.cmmnCdGrp && item.cmmnCd && item.enblYn === 'Y') {\r\n const groupCode = item.cmmnCdGrp;\r\n\r\n // 그룹이 없으면 생성\r\n if (!codeData[groupCode]) {\r\n codeData[groupCode] = {};\r\n }\r\n\r\n // 해당 코드의 옵션들 찾기\r\n const codeOptions = optionMap.get(item.cmmnCd) || [];\r\n const options = codeOptions.reduce((acc: any, opt: any) => {\r\n if (opt.optnCd && opt.optnNm) {\r\n acc[opt.optnCd] = opt.optnNm;\r\n }\r\n return acc;\r\n }, {});\r\n\r\n // 코드 아이템 생성\r\n codeData[groupCode][item.cmmnCd] = {\r\n codeValue: item.cmmnCd,\r\n codeNm: item.cmmnCdNm,\r\n groupCode: item.cmmnCdGrp,\r\n commonCode: item.cmmnCd,\r\n labelColor: item.cmmnCdClr,\r\n systemCodeYn: item.syscdYn,\r\n sortOrder: parseInt(item.sortOrd) || 1,\r\n enabled: item.enblYn === 'Y',\r\n options: Object.keys(options).length > 0 ? options : null,\r\n originalData: item,\r\n };\r\n }\r\n });\r\n }\r\n\r\n console.log('대규모 데이터 변환 완료:', codeData);\r\n return codeData;\r\n};\r\n\r\n// 대규모 데이터를 관리하는 중앙 스토어\r\nconst useLargeDataStore = create<{\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n loadedGroups: Set<string>;\r\n fetchData: () => Promise<void>;\r\n loadSpecificGroup: (groupCode: string) => Promise<void>;\r\n setData: (data: CommonCodeData) => void;\r\n clearData: () => void;\r\n getLoadedGroups: () => string[];\r\n}>()(\r\n persist(\r\n (set, get) => ({\r\n codeData: null,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: null,\r\n loadedGroups: new Set(),\r\n\r\n fetchData: async () => {\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n console.log('대규모 공통코드 데이터 가져오기 시작: SCMSIGN00301');\r\n\r\n const response = await callService(getServiceCode('SRCH_CODE'), {\r\n crprCd: '100',\r\n });\r\n\r\n console.log('대규모 공통코드 응답:', response);\r\n console.log('대규모 공통코드목록:', response.code);\r\n console.log('대규모 공통코드옵션션목록:', response.opt);\r\n\r\n const codeData = transformServerResponse(response);\r\n\r\n // 캐시 초기화\r\n optimizedCacheManager.clearCache();\r\n\r\n // 로드된 그룹들을 optimizedCacheManager에도 설정\r\n const loadedGroups = new Set(Object.keys(codeData));\r\n loadedGroups.forEach(groupCode => {\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n });\r\n\r\n set({\r\n codeData,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: new Date(),\r\n loadedGroups,\r\n });\r\n\r\n console.log('대규모 공통코드 데이터 가져오기 완료');\r\n } catch (error) {\r\n console.error('대규모 공통코드 데이터 가져오기 실패:', error);\r\n set({\r\n isLoading: false,\r\n error:\r\n error instanceof Error\r\n ? error.message\r\n : '대규모 공통코드 데이터 가져오기 실패',\r\n });\r\n }\r\n },\r\n\r\n loadSpecificGroup: async (groupCode: string) => {\r\n const { codeData, loadedGroups } = get();\r\n if (!codeData || loadedGroups.has(groupCode)) return;\r\n\r\n // 특정 그룹만 로드 (필요시 서버에서 개별 요청)\r\n const newLoadedGroups = new Set(loadedGroups).add(groupCode);\r\n set({ loadedGroups: newLoadedGroups });\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n },\r\n\r\n setData: (data: CommonCodeData) => {\r\n optimizedCacheManager.clearCache();\r\n\r\n // 로드된 그룹들을 optimizedCacheManager에도 설정\r\n const loadedGroups = new Set(Object.keys(data));\r\n loadedGroups.forEach(groupCode => {\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n });\r\n\r\n set({\r\n codeData: data,\r\n lastUpdated: new Date(),\r\n loadedGroups,\r\n });\r\n },\r\n\r\n clearData: () => {\r\n optimizedCacheManager.clearCache();\r\n set({\r\n codeData: null,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: null,\r\n loadedGroups: new Set(),\r\n });\r\n },\r\n\r\n getLoadedGroups: () => {\r\n return Array.from(get().loadedGroups);\r\n },\r\n }),\r\n {\r\n name: 'large-data-storage',\r\n partialize: state => ({\r\n codeData: state.codeData,\r\n lastUpdated: state.lastUpdated,\r\n loadedGroups: Array.from(state.loadedGroups),\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 1. CODE 스토어 - 대규모 데이터 최적화\r\nexport const useCodeStore = create<CodeStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ): SimpleCodeItem[] => {\r\n const {\r\n enabledOnly = true,\r\n systemCodeOnly = false,\r\n sortByOrder = false,\r\n excludeParentCode = false,\r\n } = options || {};\r\n\r\n // 캐시 키 생성 (옵션 포함)\r\n const cacheKey = `simpleCodeList_${groupCode}_${enabledOnly}_${systemCodeOnly}_${sortByOrder}_${excludeParentCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n // 그룹이 로드되었는지 확인 (데이터가 있으면 로드된 것으로 간주)\r\n if (\r\n !optimizedCacheManager.isGroupLoaded(groupCode) &&\r\n !codeData[groupCode]\r\n ) {\r\n console.warn(`그룹 ${groupCode}가 아직 로드되지 않았습니다.`);\r\n return [];\r\n }\r\n\r\n const detailCodes: CodeItem[] = [];\r\n\r\n // 해당 그룹만 처리하여 성능 최적화\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n // 사용여부 필터링\r\n if (enabledOnly && !item.enabled) return;\r\n\r\n // 시스템코드 필터링\r\n if (systemCodeOnly && item.systemCodeYn !== 'Y') return;\r\n\r\n // 부모코드 제외 옵션 처리\r\n if (excludeParentCode) {\r\n // 부모코드 길이 계산 (예: CMPRGR = 6자)\r\n const parentCodeLength = groupCode.length;\r\n\r\n // 자식코드만 추출 (부모코드 제외)\r\n const childCode = item.codeValue.substring(parentCodeLength);\r\n\r\n // 자식코드가 있는 경우만 추가\r\n if (childCode.length > 0) {\r\n detailCodes.push({\r\n ...item,\r\n codeValue: childCode, // 자식코드만 사용\r\n });\r\n }\r\n } else {\r\n detailCodes.push(item);\r\n }\r\n });\r\n }\r\n\r\n // 정렬\r\n let sortedCodes: CodeItem[];\r\n if (sortByOrder) {\r\n // 정렬순서로 정렬, 동일한 경우 코드값으로 정렬\r\n sortedCodes = detailCodes.sort((a, b) => {\r\n if (a.sortOrder !== b.sortOrder) {\r\n return a.sortOrder - b.sortOrder;\r\n }\r\n return a.codeValue.localeCompare(b.codeValue);\r\n });\r\n } else {\r\n // 코드값으로 정렬\r\n sortedCodes = detailCodes.sort((a, b) =>\r\n a.codeValue.localeCompare(b.codeValue)\r\n );\r\n }\r\n\r\n // SimpleCodeItem으로 변환\r\n const simpleCodes: SimpleCodeItem[] = sortedCodes.map(item => ({\r\n label: item.codeNm,\r\n value: item.codeValue,\r\n tagColor: item.labelColor,\r\n }));\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.optionCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, simpleCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return simpleCodes;\r\n },\r\n\r\n // 2. 코드를 던졌을 때 코드명을 리턴 (대규모 최적화)\r\n getCodeName: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.nameCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`name_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`name_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.nameCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 대신 인덱스 활용 (실제 구현에서는 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.nameCache.set(codeValue, item.codeNm);\r\n optimizedCacheManager.cacheHits.set(`name_${codeValue}`, 1);\r\n return item.codeNm;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴 (대규모 최적화)\r\n getCodeColor: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.colorCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`color_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.colorCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 대신 인덱스 활용 (실제 구현에서는 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.colorCache.set(\r\n codeValue,\r\n item.labelColor || ''\r\n );\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, 1);\r\n return item.labelColor;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 4. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (\r\n groupCode: string\r\n ): { labels: string[]; values: string[]; lookupDisplay: boolean } => {\r\n // 캐시 확인\r\n const cacheKey = `gridLookup_${groupCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return { labels: [], values: [], lookupDisplay: true };\r\n\r\n const group = codeData[groupCode];\r\n if (!group) return { labels: [], values: [], lookupDisplay: true };\r\n\r\n const labels: string[] = [];\r\n const values: string[] = [];\r\n\r\n // 활성화된 코드만 필터링하여 순서대로 추가\r\n Object.values(group)\r\n .filter(item => item.enabled)\r\n .sort((a, b) => a.sortOrder - b.sortOrder)\r\n .forEach(item => {\r\n labels.push(item.codeNm);\r\n values.push(item.codeValue);\r\n });\r\n\r\n const result = { labels, values, lookupDisplay: true };\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, result);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return result;\r\n },\r\n\r\n // 3. 옵션값으로 코드를 조회하는 새로운 메서드\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ): CodeItem[] => {\r\n // 캐시 확인\r\n const cacheKey = `codeByOption_${groupCode}_${optionKey}_${optionValue}`;\r\n if (optimizedCacheManager.codeCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.codeCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const matchedCodes: CodeItem[] = [];\r\n\r\n // 해당 그룹에서 옵션값이 일치하는 코드들 찾기\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n if (\r\n item.enabled &&\r\n item.options &&\r\n item.options[optionKey] === optionValue\r\n ) {\r\n // 옵션값을 코드명으로 대체하여 반환\r\n matchedCodes.push({\r\n ...item,\r\n codeNm: item.options[optionKey] || item.codeNm, // 옵션값을 코드명으로 사용\r\n });\r\n }\r\n });\r\n }\r\n\r\n const sortedCodes = matchedCodes.sort((a, b) =>\r\n a.codeValue.localeCompare(b.codeValue)\r\n );\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.codeCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.codeCache.set(cacheKey, sortedCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return sortedCodes;\r\n },\r\n\r\n // 6. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ): SimpleCodeItem[] => {\r\n const {\r\n enabledOnly = true,\r\n systemCodeOnly = false,\r\n sortByOrder = false,\r\n } = options || {};\r\n\r\n // 캐시 키 생성 (옵션 포함)\r\n const cacheKey = `codeListByOption_${groupCode}_${optionCode}_${enabledOnly}_${systemCodeOnly}_${sortByOrder}`;\r\n if (optimizedCacheManager.codeCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.codeCache.get(\r\n cacheKey\r\n ) as SimpleCodeItem[];\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n // 그룹이 로드되었는지 확인 (데이터가 있으면 로드된 것으로 간주)\r\n if (\r\n !optimizedCacheManager.isGroupLoaded(groupCode) &&\r\n !codeData[groupCode]\r\n ) {\r\n console.warn(`그룹 ${groupCode}가 아직 로드되지 않았습니다.`);\r\n return [];\r\n }\r\n\r\n const matchedCodes: SimpleCodeItem[] = [];\r\n\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n // 사용여부 필터링\r\n if (enabledOnly && !item.enabled) return;\r\n\r\n // 시스템코드 필터링\r\n if (systemCodeOnly && item.systemCodeYn !== 'Y') return;\r\n\r\n // 해당 옵션코드가 있는지 확인\r\n if (item.options && item.options[optionCode]) {\r\n // SimpleCodeItem 형태로 변환\r\n matchedCodes.push({\r\n label: item.options[optionCode], // optnNm 값\r\n value: item.commonCode, // 공통코드값\r\n tagColor: item.labelColor, // 라벨 컬러\r\n });\r\n }\r\n });\r\n }\r\n\r\n // 정렬\r\n let sortedCodes: SimpleCodeItem[];\r\n if (sortByOrder) {\r\n // 정렬순서로 정렬, 동일한 경우 코드값으로 정렬\r\n sortedCodes = matchedCodes.sort((a, b) => {\r\n // sortOrder는 원본 item에서 가져와야 하므로 임시로 코드값으로 정렬\r\n return a.value.localeCompare(b.value);\r\n });\r\n } else {\r\n // 코드값으로 정렬\r\n sortedCodes = matchedCodes.sort((a, b) =>\r\n a.value.localeCompare(b.value)\r\n );\r\n }\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.codeCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.codeCache.set(cacheKey, sortedCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return sortedCodes;\r\n },\r\n\r\n // 7. 그룹코드 목록 조회\r\n getAvailableGroupCodes: (): string[] => {\r\n const cacheKey = 'available_group_codes';\r\n if (optimizedCacheManager.nameCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return JSON.parse(optimizedCacheManager.nameCache.get(cacheKey)!);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const groupCodes = Object.keys(codeData).sort();\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.nameCache.set(\r\n cacheKey,\r\n JSON.stringify(groupCodes)\r\n );\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return groupCodes;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'code-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 2. OPTION 스토어 - 대규모 데이터 최적화\r\nexport const useOptionStore = create<OptionStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 그룹코드와 옵션코드를 던졌을 때 상세코드의 옵션값을 리턴 (대규모 최적화)\r\n getOptionValue: (groupCode: string, optionCode: string): any => {\r\n // 캐시 확인\r\n const cacheKey = `option_${groupCode}_${optionCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 해당 그룹만 검색\r\n const group = codeData[groupCode];\r\n if (group && group[optionCode]) {\r\n const options = group[optionCode].options;\r\n optimizedCacheManager.optionCache.set(cacheKey, options);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n return options;\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 특정 옵션 키의 값 가져오기 (대규모 최적화)\r\n getOptionByKey: (\r\n groupCode: string,\r\n optionCode: string,\r\n optionKey: string\r\n ): any => {\r\n const cacheKey = `option_${groupCode}_${optionCode}_${optionKey}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const options = get().getOptionValue(groupCode, optionCode);\r\n const result = options ? options[optionKey] : null;\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, result);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return result;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'option-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 3. COLOR 스토어 - 대규모 데이터 최적화\r\nexport const useColorStore = create<ColorStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 코드를 던졌을 때 컬러코드를 리턴 (대규모 최적화)\r\n getColorCode: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.colorCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`color_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.colorCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 (실제 구현에서는 컬러 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.colorCache.set(\r\n codeValue,\r\n item.labelColor || ''\r\n );\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, 1);\r\n return item.labelColor;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 코드/컬러 매핑 배열 가져오기 (대규모 최적화)\r\n getColorMapping: (): Array<{ code: string; color: string }> => {\r\n const cacheKey = 'color_mapping';\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const colorMapping: Array<{ code: string; color: string }> = [];\r\n\r\n // 배치 처리로 메모리 사용량 최적화\r\n Object.values(codeData).forEach(group => {\r\n Object.values(group).forEach(item => {\r\n if (item.labelColor) {\r\n colorMapping.push({\r\n code: item.codeValue,\r\n color: item.labelColor,\r\n });\r\n }\r\n });\r\n });\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, colorMapping);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return colorMapping;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'color-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n"],"names":["LARGE_DATASET_CONFIG","optimizedCacheManager","entries","a","b","key","groupCode","transformServerResponse","response","codeData","codeList","optionList","optionMap","opt","item","options","acc","useLargeDataStore","create","persist","set","get","callService","getServiceCode","loadedGroups","error","newLoadedGroups","data","state","useCodeStore","enabledOnly","systemCodeOnly","sortByOrder","excludeParentCode","cacheKey","hits","detailCodes","group","parentCodeLength","childCode","sortedCodes","simpleCodes","codeValue","labels","values","result","optionKey","optionValue","matchedCodes","optionCode","groupCodes","useOptionStore","useColorStore","colorMapping"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"codeStore-il4-kZPe.cjs","sources":["../../src/stores/codeStore.ts"],"sourcesContent":["import { create } from 'zustand';\r\nimport { persist } from 'zustand/middleware';\r\nimport { callService } from '../utils/apiUtils';\r\nimport { getServiceCode } from '../utils/serviceConfig';\r\n\r\n// 공통코드 관련 타입 정의\r\n\r\n// 서버 응답의 개별 코드 아이템 (실제 SCMSIGN00301 서비스 응답 구조)\r\nexport interface ServerCodeItem {\r\n cmmnCdGrp: string; // 그룹 코드\r\n cmmnCd: string; // 공통 코드\r\n cmmnCdNm: string; // 공통 코드명\r\n cmmnCdClr: string | null; // 공통 코드 컬러\r\n syscdYn: string; // 시스템 코드 여부\r\n sortOrd: string | null; // 정렬 순서\r\n enblYn: string; // 사용 여부\r\n}\r\n\r\n// 서버 응답의 개별 옵션 아이템 (실제 SCMSIGN00301 서비스 응답 구조)\r\nexport interface ServerOptionItem {\r\n cmmnCdGrp: string; // 그룹 코드\r\n cmmnCd: string; // 공통 코드\r\n cmmnCdClr: string | null; // 공통 코드 컬러\r\n optnCd: string; // 옵션 코드\r\n optnNm: string; // 옵션명\r\n syscdYn: string; // 시스템 코드 여부\r\n sortOrd: string | null; // 정렬 순서\r\n enblYn: string; // 사용 여부\r\n}\r\n\r\n// SCMSIGN00301 서비스 응답 구조\r\nexport interface ServerCommonCodeResponse {\r\n code: ServerCodeItem[]; // 공통코드 목록\r\n opt: ServerOptionItem[]; // 옵션 목록\r\n}\r\n\r\n// 클라이언트에서 사용할 코드 아이템 (실제 응답 구조 반영)\r\nexport interface CodeItem {\r\n codeValue: string; // 공통 코드 (cmmnCd)\r\n codeNm: string; // 공통 코드명 (cmmnCdNm)\r\n groupCode: string; // 그룹 코드 (cmmnCdGrp)\r\n commonCode: string; // 공통 코드 (cmmnCd)\r\n labelColor: string | null; // 라벨 컬러 (cmmnCdClr)\r\n systemCodeYn: string; // 시스템 코드 여부 (syscdYn)\r\n sortOrder: number; // 정렬 순서 (sortOrd)\r\n enabled: boolean; // 사용 여부 (enblYn === 'Y')\r\n options: Record<string, any> | null; // 옵션 (optnCd: optnNm 형태)\r\n originalData: ServerCodeItem; // 원본 데이터\r\n}\r\n\r\n// 코드 그룹 (그룹코드별로 정리된 상세코드들)\r\nexport interface CodeGroup {\r\n [codeValue: string]: CodeItem;\r\n}\r\n\r\n// 전체 공통코드 구조\r\nexport interface CommonCodeData {\r\n [groupCode: string]: CodeGroup;\r\n}\r\n\r\n// 단순화된 코드 아이템 (getCodeList용)\r\nexport interface SimpleCodeItem {\r\n label: string; // codeNm\r\n value: string; // codeValue\r\n tagColor?: string | null; // labelColor\r\n}\r\n\r\n// 공통코드 응답 타입\r\nexport interface CommonCodeResponse {\r\n codeList: CommonCodeData;\r\n}\r\n\r\n// 기본 스토어 상태 (공통 속성)\r\nexport interface BaseStoreState {\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n fetchCommonCodes: () => Promise<void>;\r\n clearCodes: () => void;\r\n}\r\n\r\n// 1. CODE 스토어 - 그룹코드별 상세코드 목록과 코드명 관리\r\nexport interface CodeStoreState extends BaseStoreState {\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 2. 코드를 던졌을 때 코드명을 리턴\r\n getCodeName: (codeValue: string) => string | null;\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴\r\n getCodeColor: (codeValue: string) => string | null;\r\n // 3. 옵션값으로 코드를 조회\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ) => CodeItem[];\r\n // 4. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 5. 그룹코드 목록 조회\r\n getAvailableGroupCodes: () => string[];\r\n // 6. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (groupCode: string) => {\r\n labels: string[];\r\n values: string[];\r\n lookupDisplay: boolean;\r\n };\r\n}\r\n\r\n// 2. OPTION 스토어 - 옵션값 관리\r\nexport interface OptionStoreState extends BaseStoreState {\r\n // 그룹코드와 옵션코드를 던졌을 때 상세코드의 옵션값을 리턴\r\n getOptionValue: (groupCode: string, optionCode: string) => any;\r\n // 특정 옵션 키의 값 가져오기\r\n getOptionByKey: (\r\n groupCode: string,\r\n optionCode: string,\r\n optionKey: string\r\n ) => any;\r\n}\r\n\r\n// 3. COLOR 스토어 - 코드/컬러 매핑 관리\r\nexport interface ColorStoreState extends BaseStoreState {\r\n // 코드를 던졌을 때 컬러코드를 리턴\r\n getColorCode: (codeValue: string) => string | null;\r\n // 코드/컬러 매핑 배열 가져오기\r\n getColorMapping: () => Array<{ code: string; color: string }>;\r\n}\r\n\r\n// 기존 CommonCodeState (하위 호환성을 위해 유지)\r\nexport interface CommonCodeState {\r\n // 데이터\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n\r\n // 액션들\r\n fetchCommonCodes: () => Promise<void>;\r\n getCodeGroup: (codeGroup: string) => CodeGroup | null;\r\n getCodeItem: (codeGroup: string, codeValue: string) => CodeItem | null;\r\n getCodeList: (codeGroup: string) => CodeItem[];\r\n getCodeListByOption: (\r\n codeGroup: string,\r\n optionKey: string,\r\n optionValue: any\r\n ) => CodeItem[];\r\n getCodeListWithColor: (codeGroup: string) => CodeItem[];\r\n getAvailableGroupCodes: () => string[];\r\n getDetailCodeList: (groupCode: string, enabledOnly?: boolean) => CodeItem[];\r\n getDetailCodeName: (detailCode: string) => string | null;\r\n getDetailCodeColor: (detailCode: string) => string | null;\r\n clearCodes: () => void;\r\n}\r\n\r\n// 공통코드 컨텍스트 타입\r\nexport interface CommonCodeContextType {\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 2. 코드를 던졌을 때 코드명을 리턴\r\n getCodeName: (codeValue: string) => string | null;\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴\r\n getCodeColor: (codeValue: string) => string | null;\r\n // 4. 옵션값으로 코드를 조회\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ) => CodeItem[];\r\n // 5. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ) => SimpleCodeItem[];\r\n // 6. 그룹코드 목록 조회\r\n getAvailableGroupCodes: () => string[];\r\n // 7. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (groupCode: string) => {\r\n labels: string[];\r\n values: string[];\r\n lookupDisplay: boolean;\r\n };\r\n refreshCodes: () => Promise<void>;\r\n}\r\n\r\n// 대규모 데이터셋 최적화를 위한 설정\r\nconst LARGE_DATASET_CONFIG = {\r\n CACHE_SIZE_LIMIT: 1000, // 캐시 크기 제한\r\n BATCH_SIZE: 100, // 배치 처리 크기\r\n DEBOUNCE_DELAY: 300, // 디바운스 지연시간\r\n MEMORY_THRESHOLD: 50 * 1024 * 1024, // 50MB 메모리 임계값\r\n};\r\n\r\n// 성능 최적화를 위한 캐시 관리 (대규모 데이터셋용)\r\ninterface OptimizedCacheManager {\r\n codeCache: Map<string, any>;\r\n nameCache: Map<string, string>;\r\n optionCache: Map<string, any>;\r\n colorCache: Map<string, string>;\r\n loadedGroups: Set<string>;\r\n cacheHits: Map<string, number>;\r\n clearCache: () => void;\r\n cleanupCache: () => void;\r\n isGroupLoaded: (groupCode: string) => boolean;\r\n markGroupLoaded: (groupCode: string) => void;\r\n}\r\n\r\nconst optimizedCacheManager: OptimizedCacheManager = {\r\n codeCache: new Map(),\r\n nameCache: new Map(),\r\n optionCache: new Map(),\r\n colorCache: new Map(),\r\n loadedGroups: new Set(),\r\n cacheHits: new Map(),\r\n\r\n clearCache() {\r\n this.codeCache.clear();\r\n this.nameCache.clear();\r\n this.optionCache.clear();\r\n this.colorCache.clear();\r\n this.loadedGroups.clear();\r\n this.cacheHits.clear();\r\n },\r\n\r\n cleanupCache() {\r\n // LRU 방식으로 캐시 정리\r\n const entries = Array.from(this.cacheHits.entries());\r\n entries.sort((a, b) => a[1] - b[1]);\r\n\r\n // 가장 적게 사용된 캐시 항목들 제거\r\n const toRemove = entries.slice(0, Math.floor(entries.length * 0.3));\r\n toRemove.forEach(([key]) => {\r\n this.codeCache.delete(key);\r\n this.nameCache.delete(key);\r\n this.optionCache.delete(key);\r\n this.colorCache.delete(key);\r\n this.cacheHits.delete(key);\r\n });\r\n },\r\n\r\n isGroupLoaded(groupCode: string) {\r\n return this.loadedGroups.has(groupCode);\r\n },\r\n\r\n markGroupLoaded(groupCode: string) {\r\n this.loadedGroups.add(groupCode);\r\n },\r\n};\r\n\r\n// 서버 응답을 클라이언트 형식으로 변환하는 함수 (실제 SCMSIGN00301 서비스 응답 구조 반영)\r\nconst transformServerResponse = (response: any): CommonCodeData => {\r\n console.log('대규모 데이터 변환 시작:', response);\r\n\r\n const codeData: CommonCodeData = {};\r\n\r\n // 실제 서비스 응답 구조: { code: [...], opt: [...] }\r\n if (response && response.code && Array.isArray(response.code)) {\r\n const codeList = response.code;\r\n const optionList = response.opt || [];\r\n\r\n // 옵션 데이터를 공통코드별로 그룹화\r\n const optionMap = new Map<string, any[]>();\r\n optionList.forEach((opt: any) => {\r\n if (opt.cmmnCd && opt.enblYn === 'Y') {\r\n if (!optionMap.has(opt.cmmnCd)) {\r\n optionMap.set(opt.cmmnCd, []);\r\n }\r\n optionMap.get(opt.cmmnCd)!.push(opt);\r\n }\r\n });\r\n\r\n // 공통코드 데이터를 그룹별로 정리\r\n codeList.forEach((item: any) => {\r\n if (item && item.cmmnCdGrp && item.cmmnCd && item.enblYn === 'Y') {\r\n const groupCode = item.cmmnCdGrp;\r\n\r\n // 그룹이 없으면 생성\r\n if (!codeData[groupCode]) {\r\n codeData[groupCode] = {};\r\n }\r\n\r\n // 해당 코드의 옵션들 찾기\r\n const codeOptions = optionMap.get(item.cmmnCd) || [];\r\n const options = codeOptions.reduce((acc: any, opt: any) => {\r\n if (opt.optnCd && opt.optnNm) {\r\n acc[opt.optnCd] = opt.optnNm;\r\n }\r\n return acc;\r\n }, {});\r\n\r\n // 코드 아이템 생성\r\n codeData[groupCode][item.cmmnCd] = {\r\n codeValue: item.cmmnCd,\r\n codeNm: item.cmmnCdNm,\r\n groupCode: item.cmmnCdGrp,\r\n commonCode: item.cmmnCd,\r\n labelColor: item.cmmnCdClr,\r\n systemCodeYn: item.syscdYn,\r\n sortOrder: parseInt(item.sortOrd) || 1,\r\n enabled: item.enblYn === 'Y',\r\n options: Object.keys(options).length > 0 ? options : null,\r\n originalData: item,\r\n };\r\n }\r\n });\r\n }\r\n\r\n console.log('대규모 데이터 변환 완료:', codeData);\r\n return codeData;\r\n};\r\n\r\n// 대규모 데이터를 관리하는 중앙 스토어\r\nconst useLargeDataStore = create<{\r\n codeData: CommonCodeData | null;\r\n isLoading: boolean;\r\n error: string | null;\r\n lastUpdated: Date | null;\r\n loadedGroups: Set<string>;\r\n fetchData: () => Promise<void>;\r\n loadSpecificGroup: (groupCode: string) => Promise<void>;\r\n setData: (data: CommonCodeData) => void;\r\n clearData: () => void;\r\n getLoadedGroups: () => string[];\r\n}>()(\r\n persist(\r\n (set, get) => ({\r\n codeData: null,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: null,\r\n loadedGroups: new Set(),\r\n\r\n fetchData: async () => {\r\n set({ isLoading: true, error: null });\r\n\r\n try {\r\n console.log('대규모 공통코드 데이터 가져오기 시작: SCMSIGN00301');\r\n\r\n const response = await callService(getServiceCode('SRCH_CODE'), {\r\n crprCd: '100',\r\n });\r\n\r\n console.log('대규모 공통코드 응답:', response);\r\n console.log('대규모 공통코드목록:', response.code);\r\n console.log('대규모 공통코드옵션션목록:', response.opt);\r\n\r\n const codeData = transformServerResponse(response);\r\n\r\n // 캐시 초기화\r\n optimizedCacheManager.clearCache();\r\n\r\n // 로드된 그룹들을 optimizedCacheManager에도 설정\r\n const loadedGroups = new Set(Object.keys(codeData));\r\n loadedGroups.forEach(groupCode => {\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n });\r\n\r\n set({\r\n codeData,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: new Date(),\r\n loadedGroups,\r\n });\r\n\r\n console.log('대규모 공통코드 데이터 가져오기 완료');\r\n } catch (error) {\r\n console.error('대규모 공통코드 데이터 가져오기 실패:', error);\r\n set({\r\n isLoading: false,\r\n error:\r\n error instanceof Error\r\n ? error.message\r\n : '대규모 공통코드 데이터 가져오기 실패',\r\n });\r\n }\r\n },\r\n\r\n loadSpecificGroup: async (groupCode: string) => {\r\n const { codeData, loadedGroups } = get();\r\n if (!codeData || loadedGroups.has(groupCode)) return;\r\n\r\n // 특정 그룹만 로드 (필요시 서버에서 개별 요청)\r\n const newLoadedGroups = new Set(loadedGroups).add(groupCode);\r\n set({ loadedGroups: newLoadedGroups });\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n },\r\n\r\n setData: (data: CommonCodeData) => {\r\n optimizedCacheManager.clearCache();\r\n\r\n // 로드된 그룹들을 optimizedCacheManager에도 설정\r\n const loadedGroups = new Set(Object.keys(data));\r\n loadedGroups.forEach(groupCode => {\r\n optimizedCacheManager.markGroupLoaded(groupCode);\r\n });\r\n\r\n set({\r\n codeData: data,\r\n lastUpdated: new Date(),\r\n loadedGroups,\r\n });\r\n },\r\n\r\n clearData: () => {\r\n optimizedCacheManager.clearCache();\r\n set({\r\n codeData: null,\r\n isLoading: false,\r\n error: null,\r\n lastUpdated: null,\r\n loadedGroups: new Set(),\r\n });\r\n },\r\n\r\n getLoadedGroups: () => {\r\n return Array.from(get().loadedGroups);\r\n },\r\n }),\r\n {\r\n name: 'large-data-storage',\r\n partialize: state => ({\r\n codeData: state.codeData,\r\n lastUpdated: state.lastUpdated,\r\n loadedGroups: Array.from(state.loadedGroups),\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 1. CODE 스토어 - 대규모 데이터 최적화\r\nexport const useCodeStore = create<CodeStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 1. 통합된 코드 목록 조회 (그룹코드 필수, 옵션으로 필터링)\r\n getCodeList: (\r\n groupCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n excludeParentCode?: boolean;\r\n }\r\n ): SimpleCodeItem[] => {\r\n const {\r\n enabledOnly = true,\r\n systemCodeOnly = false,\r\n sortByOrder = false,\r\n excludeParentCode = false,\r\n } = options || {};\r\n\r\n // 캐시 키 생성 (옵션 포함)\r\n const cacheKey = `simpleCodeList_${groupCode}_${enabledOnly}_${systemCodeOnly}_${sortByOrder}_${excludeParentCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n // 그룹이 로드되었는지 확인 (데이터가 있으면 로드된 것으로 간주)\r\n if (\r\n !optimizedCacheManager.isGroupLoaded(groupCode) &&\r\n !codeData[groupCode]\r\n ) {\r\n console.warn(`그룹 ${groupCode}가 아직 로드되지 않았습니다.`);\r\n return [];\r\n }\r\n\r\n const detailCodes: CodeItem[] = [];\r\n\r\n // 해당 그룹만 처리하여 성능 최적화\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n // 사용여부 필터링\r\n if (enabledOnly && !item.enabled) return;\r\n\r\n // 시스템코드 필터링\r\n if (systemCodeOnly && item.systemCodeYn !== 'Y') return;\r\n\r\n // 부모코드 제외 옵션 처리\r\n if (excludeParentCode) {\r\n // 부모코드 길이 계산 (예: CMPRGR = 6자)\r\n const parentCodeLength = groupCode.length;\r\n\r\n // 자식코드만 추출 (부모코드 제외)\r\n const childCode = item.codeValue.substring(parentCodeLength);\r\n\r\n // 자식코드가 있는 경우만 추가\r\n if (childCode.length > 0) {\r\n detailCodes.push({\r\n ...item,\r\n codeValue: childCode, // 자식코드만 사용\r\n });\r\n }\r\n } else {\r\n detailCodes.push(item);\r\n }\r\n });\r\n }\r\n\r\n // 정렬\r\n let sortedCodes: CodeItem[];\r\n if (sortByOrder) {\r\n // 정렬순서로 정렬, 동일한 경우 코드값으로 정렬\r\n sortedCodes = detailCodes.sort((a, b) => {\r\n if (a.sortOrder !== b.sortOrder) {\r\n return a.sortOrder - b.sortOrder;\r\n }\r\n return a.codeValue.localeCompare(b.codeValue);\r\n });\r\n } else {\r\n // 코드값으로 정렬\r\n sortedCodes = detailCodes.sort((a, b) =>\r\n a.codeValue.localeCompare(b.codeValue)\r\n );\r\n }\r\n\r\n // SimpleCodeItem으로 변환\r\n const simpleCodes: SimpleCodeItem[] = sortedCodes.map(item => ({\r\n label: item.codeNm,\r\n value: item.codeValue,\r\n tagColor: item.labelColor,\r\n }));\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.optionCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, simpleCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return simpleCodes;\r\n },\r\n\r\n // 2. 코드를 던졌을 때 코드명을 리턴 (대규모 최적화)\r\n getCodeName: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.nameCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`name_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`name_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.nameCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 대신 인덱스 활용 (실제 구현에서는 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.nameCache.set(codeValue, item.codeNm);\r\n optimizedCacheManager.cacheHits.set(`name_${codeValue}`, 1);\r\n return item.codeNm;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 3. 코드를 던졌을 때 라벨 컬러를 리턴 (대규모 최적화)\r\n getCodeColor: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.colorCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`color_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.colorCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 대신 인덱스 활용 (실제 구현에서는 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.colorCache.set(\r\n codeValue,\r\n item.labelColor || ''\r\n );\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, 1);\r\n return item.labelColor;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 4. 그리드 lookup용 데이터 반환 (labels, values 배열, lookupDisplay 포함)\r\n getGridLookup: (\r\n groupCode: string\r\n ): { labels: string[]; values: string[]; lookupDisplay: boolean } => {\r\n // 캐시 확인\r\n const cacheKey = `gridLookup_${groupCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return { labels: [], values: [], lookupDisplay: true };\r\n\r\n const group = codeData[groupCode];\r\n if (!group) return { labels: [], values: [], lookupDisplay: true };\r\n\r\n const labels: string[] = [];\r\n const values: string[] = [];\r\n\r\n // 활성화된 코드만 필터링하여 순서대로 추가\r\n Object.values(group)\r\n .filter(item => item.enabled)\r\n .sort((a, b) => a.sortOrder - b.sortOrder)\r\n .forEach(item => {\r\n labels.push(item.codeNm);\r\n values.push(item.codeValue);\r\n });\r\n\r\n const result = { labels, values, lookupDisplay: true };\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, result);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return result;\r\n },\r\n\r\n // 3. 옵션값으로 코드를 조회하는 새로운 메서드\r\n getCodeByOption: (\r\n groupCode: string,\r\n optionKey: string,\r\n optionValue: string\r\n ): CodeItem[] => {\r\n // 캐시 확인\r\n const cacheKey = `codeByOption_${groupCode}_${optionKey}_${optionValue}`;\r\n if (optimizedCacheManager.codeCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.codeCache.get(cacheKey)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const matchedCodes: CodeItem[] = [];\r\n\r\n // 해당 그룹에서 옵션값이 일치하는 코드들 찾기\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n if (\r\n item.enabled &&\r\n item.options &&\r\n item.options[optionKey] === optionValue\r\n ) {\r\n // 옵션값을 코드명으로 대체하여 반환\r\n matchedCodes.push({\r\n ...item,\r\n codeNm: item.options[optionKey] || item.codeNm, // 옵션값을 코드명으로 사용\r\n });\r\n }\r\n });\r\n }\r\n\r\n const sortedCodes = matchedCodes.sort((a, b) =>\r\n a.codeValue.localeCompare(b.codeValue)\r\n );\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.codeCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.codeCache.set(cacheKey, sortedCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return sortedCodes;\r\n },\r\n\r\n // 6. 옵션코드별로 코드 목록 조회 (SimpleCodeItem 형태로 반환)\r\n getCodeListByOption: (\r\n groupCode: string,\r\n optionCode: string,\r\n options?: {\r\n enabledOnly?: boolean;\r\n systemCodeOnly?: boolean;\r\n sortByOrder?: boolean;\r\n }\r\n ): SimpleCodeItem[] => {\r\n const {\r\n enabledOnly = true,\r\n systemCodeOnly = false,\r\n sortByOrder = false,\r\n } = options || {};\r\n\r\n // 캐시 키 생성 (옵션 포함)\r\n const cacheKey = `codeListByOption_${groupCode}_${optionCode}_${enabledOnly}_${systemCodeOnly}_${sortByOrder}`;\r\n if (optimizedCacheManager.codeCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.codeCache.get(\r\n cacheKey\r\n ) as SimpleCodeItem[];\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n // 그룹이 로드되었는지 확인 (데이터가 있으면 로드된 것으로 간주)\r\n if (\r\n !optimizedCacheManager.isGroupLoaded(groupCode) &&\r\n !codeData[groupCode]\r\n ) {\r\n console.warn(`그룹 ${groupCode}가 아직 로드되지 않았습니다.`);\r\n return [];\r\n }\r\n\r\n const matchedCodes: SimpleCodeItem[] = [];\r\n\r\n const group = codeData[groupCode];\r\n if (group) {\r\n Object.values(group).forEach(item => {\r\n // 사용여부 필터링\r\n if (enabledOnly && !item.enabled) return;\r\n\r\n // 시스템코드 필터링\r\n if (systemCodeOnly && item.systemCodeYn !== 'Y') return;\r\n\r\n // 해당 옵션코드가 있는지 확인\r\n if (item.options && item.options[optionCode]) {\r\n // SimpleCodeItem 형태로 변환\r\n matchedCodes.push({\r\n label: item.options[optionCode], // optnNm 값\r\n value: item.commonCode, // 공통코드값\r\n tagColor: item.labelColor, // 라벨 컬러\r\n });\r\n }\r\n });\r\n }\r\n\r\n // 정렬\r\n let sortedCodes: SimpleCodeItem[];\r\n if (sortByOrder) {\r\n // 정렬순서로 정렬, 동일한 경우 코드값으로 정렬\r\n sortedCodes = matchedCodes.sort((a, b) => {\r\n // sortOrder는 원본 item에서 가져와야 하므로 임시로 코드값으로 정렬\r\n return a.value.localeCompare(b.value);\r\n });\r\n } else {\r\n // 코드값으로 정렬\r\n sortedCodes = matchedCodes.sort((a, b) =>\r\n a.value.localeCompare(b.value)\r\n );\r\n }\r\n\r\n // 캐시 크기 제한 확인\r\n if (\r\n optimizedCacheManager.codeCache.size >=\r\n LARGE_DATASET_CONFIG.CACHE_SIZE_LIMIT\r\n ) {\r\n optimizedCacheManager.cleanupCache();\r\n }\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.codeCache.set(cacheKey, sortedCodes);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return sortedCodes;\r\n },\r\n\r\n // 7. 그룹코드 목록 조회\r\n getAvailableGroupCodes: (): string[] => {\r\n const cacheKey = 'available_group_codes';\r\n if (optimizedCacheManager.nameCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return JSON.parse(optimizedCacheManager.nameCache.get(cacheKey)!);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const groupCodes = Object.keys(codeData).sort();\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.nameCache.set(\r\n cacheKey,\r\n JSON.stringify(groupCodes)\r\n );\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return groupCodes;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'code-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 2. OPTION 스토어 - 대규모 데이터 최적화\r\nexport const useOptionStore = create<OptionStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 그룹코드와 옵션코드를 던졌을 때 상세코드의 옵션값을 리턴 (대규모 최적화)\r\n getOptionValue: (groupCode: string, optionCode: string): any => {\r\n // 캐시 확인\r\n const cacheKey = `option_${groupCode}_${optionCode}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 해당 그룹만 검색\r\n const group = codeData[groupCode];\r\n if (group && group[optionCode]) {\r\n const options = group[optionCode].options;\r\n optimizedCacheManager.optionCache.set(cacheKey, options);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n return options;\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 특정 옵션 키의 값 가져오기 (대규모 최적화)\r\n getOptionByKey: (\r\n groupCode: string,\r\n optionCode: string,\r\n optionKey: string\r\n ): any => {\r\n const cacheKey = `option_${groupCode}_${optionCode}_${optionKey}`;\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const options = get().getOptionValue(groupCode, optionCode);\r\n const result = options ? options[optionKey] : null;\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, result);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return result;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'option-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n\r\n// 3. COLOR 스토어 - 대규모 데이터 최적화\r\nexport const useColorStore = create<ColorStoreState>()(\r\n persist(\r\n (set, get) => ({\r\n // 공통 데이터 스토어에서 상태 가져오기\r\n get codeData() {\r\n return useLargeDataStore.getState().codeData;\r\n },\r\n get isLoading() {\r\n return useLargeDataStore.getState().isLoading;\r\n },\r\n get error() {\r\n return useLargeDataStore.getState().error;\r\n },\r\n get lastUpdated() {\r\n return useLargeDataStore.getState().lastUpdated;\r\n },\r\n\r\n // 공통코드 가져오기 (중앙 스토어 사용)\r\n fetchCommonCodes: async () => {\r\n await useLargeDataStore.getState().fetchData();\r\n },\r\n\r\n // 코드를 던졌을 때 컬러코드를 리턴 (대규모 최적화)\r\n getColorCode: (codeValue: string): string | null => {\r\n // 캐시 확인\r\n if (optimizedCacheManager.colorCache.has(codeValue)) {\r\n const hits =\r\n optimizedCacheManager.cacheHits.get(`color_${codeValue}`) || 0;\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, hits + 1);\r\n return optimizedCacheManager.colorCache.get(codeValue)!;\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return null;\r\n\r\n // 전체 검색 (실제 구현에서는 컬러 인덱스 테이블 사용)\r\n for (const group of Object.values(codeData)) {\r\n for (const item of Object.values(group)) {\r\n if (item.codeValue === codeValue) {\r\n // 캐시에 저장\r\n optimizedCacheManager.colorCache.set(\r\n codeValue,\r\n item.labelColor || ''\r\n );\r\n optimizedCacheManager.cacheHits.set(`color_${codeValue}`, 1);\r\n return item.labelColor;\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n },\r\n\r\n // 코드/컬러 매핑 배열 가져오기 (대규모 최적화)\r\n getColorMapping: (): Array<{ code: string; color: string }> => {\r\n const cacheKey = 'color_mapping';\r\n if (optimizedCacheManager.optionCache.has(cacheKey)) {\r\n const hits = optimizedCacheManager.cacheHits.get(cacheKey) || 0;\r\n optimizedCacheManager.cacheHits.set(cacheKey, hits + 1);\r\n return optimizedCacheManager.optionCache.get(cacheKey);\r\n }\r\n\r\n const codeData = useLargeDataStore.getState().codeData;\r\n if (!codeData) return [];\r\n\r\n const colorMapping: Array<{ code: string; color: string }> = [];\r\n\r\n // 배치 처리로 메모리 사용량 최적화\r\n Object.values(codeData).forEach(group => {\r\n Object.values(group).forEach(item => {\r\n if (item.labelColor) {\r\n colorMapping.push({\r\n code: item.codeValue,\r\n color: item.labelColor,\r\n });\r\n }\r\n });\r\n });\r\n\r\n // 캐시에 저장\r\n optimizedCacheManager.optionCache.set(cacheKey, colorMapping);\r\n optimizedCacheManager.cacheHits.set(cacheKey, 1);\r\n\r\n return colorMapping;\r\n },\r\n\r\n // 공통코드 초기화\r\n clearCodes: () => {\r\n useLargeDataStore.getState().clearData();\r\n },\r\n }),\r\n {\r\n name: 'color-storage',\r\n partialize: state => ({\r\n // 상태는 중앙 스토어에서 관리하므로 여기서는 저장하지 않음\r\n }),\r\n }\r\n )\r\n);\r\n"],"names":["LARGE_DATASET_CONFIG","optimizedCacheManager","entries","a","b","key","groupCode","transformServerResponse","response","codeData","codeList","optionList","optionMap","opt","item","options","acc","useLargeDataStore","create","persist","set","get","callService","getServiceCode","loadedGroups","error","newLoadedGroups","data","state","useCodeStore","enabledOnly","systemCodeOnly","sortByOrder","excludeParentCode","cacheKey","hits","detailCodes","group","parentCodeLength","childCode","sortedCodes","simpleCodes","codeValue","labels","values","result","optionKey","optionValue","matchedCodes","optionCode","groupCodes","useOptionStore","useColorStore","colorMapping"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const p=require("./apiUtils-BZ6s0_NI.cjs");function H(v){throw new Error('Could not dynamically require "'+v+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var y={exports:{}};const I={},W=Object.freeze(Object.defineProperty({__proto__:null,default:I},Symbol.toStringTag,{value:"Module"})),E=p.getAugmentedNamespace(W);var O=y.exports,S;function P(){return S||(S=1,(function(v,T){(function(g,c){v.exports=c()})(O,function(){var g=g||(function(c,C){var s;if(typeof window<"u"&&window.crypto&&(s=window.crypto),typeof self<"u"&&self.crypto&&(s=self.crypto),typeof globalThis<"u"&&globalThis.crypto&&(s=globalThis.crypto),!s&&typeof window<"u"&&window.msCrypto&&(s=window.msCrypto),!s&&typeof p.commonjsGlobal<"u"&&p.commonjsGlobal.crypto&&(s=p.commonjsGlobal.crypto),!s&&typeof H=="function")try{s=E}catch{}var R=function(){if(s){if(typeof s.getRandomValues=="function")try{return s.getRandomValues(new Uint32Array(1))[0]}catch{}if(typeof s.randomBytes=="function")try{return s.randomBytes(4).readInt32LE()}catch{}}throw new Error("Native crypto module could not be used to get secure random number.")},z=Object.create||(function(){function t(){}return function(r){var e;return t.prototype=r,e=new t,t.prototype=null,e}})(),l={},d=l.lib={},f=d.Base=(function(){return{extend:function(t){var r=z(this);return t&&r.mixIn(t),(!r.hasOwnProperty("init")||this.init===r.init)&&(r.init=function(){r.$super.init.apply(this,arguments)}),r.init.prototype=r,r.$super=this,r},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var r in t)t.hasOwnProperty(r)&&(this[r]=t[r]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}}})(),u=d.WordArray=f.extend({init:function(t,r){t=this.words=t||[],r!=C?this.sigBytes=r:this.sigBytes=t.length*4},toString:function(t){return(t||q).stringify(this)},concat:function(t){var r=this.words,e=t.words,n=this.sigBytes,i=t.sigBytes;if(this.clamp(),n%4)for(var o=0;o<i;o++){var m=e[o>>>2]>>>24-o%4*8&255;r[n+o>>>2]|=m<<24-(n+o)%4*8}else for(var a=0;a<i;a+=4)r[n+a>>>2]=e[a>>>2];return this.sigBytes+=i,this},clamp:function(){var t=this.words,r=this.sigBytes;t[r>>>2]&=4294967295<<32-r%4*8,t.length=c.ceil(r/4)},clone:function(){var t=f.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var r=[],e=0;e<t;e+=4)r.push(R());return new u.init(r,t)}}),w=l.enc={},q=w.Hex={stringify:function(t){for(var r=t.words,e=t.sigBytes,n=[],i=0;i<e;i++){var o=r[i>>>2]>>>24-i%4*8&255;n.push((o>>>4).toString(16)),n.push((o&15).toString(16))}return n.join("")},parse:function(t){for(var r=t.length,e=[],n=0;n<r;n+=2)e[n>>>3]|=parseInt(t.substr(n,2),16)<<24-n%8*4;return new u.init(e,r/2)}},_=w.Latin1={stringify:function(t){for(var r=t.words,e=t.sigBytes,n=[],i=0;i<e;i++){var o=r[i>>>2]>>>24-i%4*8&255;n.push(String.fromCharCode(o))}return n.join("")},parse:function(t){for(var r=t.length,e=[],n=0;n<r;n++)e[n>>>2]|=(t.charCodeAt(n)&255)<<24-n%4*8;return new u.init(e,r)}},k=w.Utf8={stringify:function(t){try{return decodeURIComponent(escape(_.stringify(t)))}catch{throw new Error("Malformed UTF-8 data")}},parse:function(t){return _.parse(unescape(encodeURIComponent(t)))}},x=d.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new u.init,this._nDataBytes=0},_append:function(t){typeof t=="string"&&(t=k.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var r,e=this._data,n=e.words,i=e.sigBytes,o=this.blockSize,m=o*4,a=i/m;t?a=c.ceil(a):a=c.max((a|0)-this._minBufferSize,0);var h=a*o,b=c.min(h*4,i);if(h){for(var B=0;B<h;B+=o)this._doProcessBlock(n,B);r=n.splice(0,h),e.sigBytes-=b}return new u.init(r,b)},clone:function(){var t=f.clone.call(this);return t._data=this._data.clone(),t},_minBufferSize:0});d.Hasher=x.extend({cfg:f.extend(),init:function(t){this.cfg=this.cfg.extend(t),this.reset()},reset:function(){x.reset.call(this),this._doReset()},update:function(t){return this._append(t),this._process(),this},finalize:function(t){t&&this._append(t);var r=this._doFinalize();return r},blockSize:16,_createHelper:function(t){return function(r,e){return new t.init(e).finalize(r)}},_createHmacHelper:function(t){return function(r,e){return new j.HMAC.init(t,e).finalize(r)}}});var j=l.algo={};return l})(Math);return g})})(y)),y.exports}exports.requireCore=P;
|
|
2
|
+
//# sourceMappingURL=core-BHejg5iS.cjs.map
|