From ba8cd44a0ed2c613a5f2cee06bfc9bd0f61f21c7 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Fri, 7 Nov 2025 08:39:04 +0000 Subject: (최겸) 입찰/견적 수정사항 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../selectors/cost-center/cost-center-service.ts | 89 ++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 components/common/selectors/cost-center/cost-center-service.ts (limited to 'components/common/selectors/cost-center/cost-center-service.ts') diff --git a/components/common/selectors/cost-center/cost-center-service.ts b/components/common/selectors/cost-center/cost-center-service.ts new file mode 100644 index 00000000..844215f0 --- /dev/null +++ b/components/common/selectors/cost-center/cost-center-service.ts @@ -0,0 +1,89 @@ +"use server" + +import { oracleKnex } from '@/lib/oracle-db/db' + +// Cost Center 타입 정의 +export interface CostCenter { + KOSTL: string // Cost Center 코드 + DATAB: string // 시작일 + DATBI: string // 종료일 + KTEXT: string // 단축 텍스트 + LTEXT: string // 긴 텍스트 +} + +// 테스트 환경용 폴백 데이터 +const FALLBACK_TEST_DATA: CostCenter[] = [ + { KOSTL: 'D6023930', DATAB: '20230101', DATBI: '99991231', KTEXT: '구매팀', LTEXT: '구매팀 Cost Center(테스트데이터 - 오라클 페칭 실패시)' }, + { KOSTL: 'D6023931', DATAB: '20230101', DATBI: '99991231', KTEXT: '자재팀', LTEXT: '자재팀 Cost Center(테스트데이터 - 오라클 페칭 실패시)' }, + { KOSTL: 'D6023932', DATAB: '20230101', DATBI: '99991231', KTEXT: '조달팀', LTEXT: '조달팀 Cost Center(테스트데이터 - 오라클 페칭 실패시)' }, + { KOSTL: 'D6023933', DATAB: '20230101', DATBI: '99991231', KTEXT: '구매1팀', LTEXT: '구매1팀 Cost Center(테스트데이터 - 오라클 페칭 실패시)' }, + { KOSTL: 'D6023934', DATAB: '20230101', DATBI: '99991231', KTEXT: '구매2팀', LTEXT: '구매2팀 Cost Center(테스트데이터 - 오라클 페칭 실패시)' }, +] + +/** + * Cost Center 목록 조회 (Oracle에서 전체 조회, 실패 시 폴백 데이터 사용) + * CMCTB_COSTCENTER 테이블에서 조회 + * 현재 유효한(SYSDATE BETWEEN DATAB AND DATBI) Cost Center만 조회 + */ +export async function getCostCenters(): Promise<{ + success: boolean + data: CostCenter[] + error?: string + isUsingFallback?: boolean +}> { + try { + console.log('📋 [getCostCenters] Oracle 쿼리 시작...') + + const result = await oracleKnex.raw(` + SELECT + KOSTL, + DATAB, + DATBI, + KTEXT, + LTEXT + FROM CMCTB_COSTCENTER + WHERE ROWNUM < 100 + AND NVL(BKZKP,' ') = ' ' + AND TO_CHAR(SYSDATE,'YYYYMMDD') BETWEEN DATAB AND DATBI + AND KOKRS = 'H100' + ORDER BY KOSTL + `) + + // Oracle raw query의 결과는 rows 배열에 들어있음 + const rows = (result.rows || result) as Array> + + console.log(`✅ [getCostCenters] Oracle 쿼리 성공 - ${rows.length}건 조회`) + + // null 값 필터링 + const cleanedResult = rows + .filter((item) => + item.KOSTL && + item.DATAB && + item.DATBI + ) + .map((item) => ({ + KOSTL: String(item.KOSTL), + DATAB: String(item.DATAB), + DATBI: String(item.DATBI), + KTEXT: String(item.KTEXT || ''), + LTEXT: String(item.LTEXT || '') + })) + + console.log(`✅ [getCostCenters] 필터링 후 ${cleanedResult.length}건`) + + return { + success: true, + data: cleanedResult, + isUsingFallback: false + } + } catch (error) { + console.error('❌ [getCostCenters] Oracle 오류:', error) + console.log('🔄 [getCostCenters] 폴백 테스트 데이터 사용 (' + FALLBACK_TEST_DATA.length + '건)') + return { + success: true, + data: FALLBACK_TEST_DATA, + isUsingFallback: true + } + } +} + -- cgit v1.2.3