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 --- .../common/selectors/wbs-code/wbs-code-service.ts | 92 ++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 components/common/selectors/wbs-code/wbs-code-service.ts (limited to 'components/common/selectors/wbs-code/wbs-code-service.ts') diff --git a/components/common/selectors/wbs-code/wbs-code-service.ts b/components/common/selectors/wbs-code/wbs-code-service.ts new file mode 100644 index 00000000..7d9c17b1 --- /dev/null +++ b/components/common/selectors/wbs-code/wbs-code-service.ts @@ -0,0 +1,92 @@ +"use server" + +import { oracleKnex } from '@/lib/oracle-db/db' + +// WBS 코드 타입 정의 +export interface WbsCode { + PROJ_NO: string // 프로젝트 번호 + WBS_ELMT: string // WBS 요소 + WBS_ELMT_NM: string // WBS 요소명 + WBS_LVL: string // WBS 레벨 +} + +// 테스트 환경용 폴백 데이터 +const FALLBACK_TEST_DATA: WbsCode[] = [ + { PROJ_NO: 'SN2661', WBS_ELMT: 'WBS001', WBS_ELMT_NM: 'WBS 항목 1(테스트데이터 - 오라클 페칭 실패시)', WBS_LVL: '1' }, + { PROJ_NO: 'SN2661', WBS_ELMT: 'WBS002', WBS_ELMT_NM: 'WBS 항목 2(테스트데이터 - 오라클 페칭 실패시)', WBS_LVL: '2' }, + { PROJ_NO: 'SN2661', WBS_ELMT: 'WBS003', WBS_ELMT_NM: 'WBS 항목 3(테스트데이터 - 오라클 페칭 실패시)', WBS_LVL: '1' }, + { PROJ_NO: 'SN2661', WBS_ELMT: 'WBS004', WBS_ELMT_NM: 'WBS 항목 4(테스트데이터 - 오라클 페칭 실패시)', WBS_LVL: '2' }, + { PROJ_NO: 'SN2661', WBS_ELMT: 'WBS005', WBS_ELMT_NM: 'WBS 항목 5(테스트데이터 - 오라클 페칭 실패시)', WBS_LVL: '3' }, +] + +/** + * WBS 코드 목록 조회 (Oracle에서 전체 조회, 실패 시 폴백 데이터 사용) + * CMCTB_PROJ_WBS 테이블에서 조회 + * @param projNo - 프로젝트 번호 (선택적, 없으면 전체 조회) + */ +export async function getWbsCodes(projNo?: string): Promise<{ + success: boolean + data: WbsCode[] + error?: string + isUsingFallback?: boolean +}> { + try { + console.log('📋 [getWbsCodes] Oracle 쿼리 시작...', projNo ? `프로젝트: ${projNo}` : '전체') + + let query = ` + SELECT + PROJ_NO, + WBS_ELMT, + WBS_ELMT_NM, + WBS_LVL + FROM CMCTB_PROJ_WBS + WHERE ROWNUM < 100 + ` + + if (projNo) { + query += ` AND PROJ_NO = :projNo` + } + + query += ` ORDER BY PROJ_NO, WBS_ELMT` + + const result = projNo + ? await oracleKnex.raw(query, { projNo }) + : await oracleKnex.raw(query) + + // Oracle raw query의 결과는 rows 배열에 들어있음 + const rows = (result.rows || result) as Array> + + console.log(`✅ [getWbsCodes] Oracle 쿼리 성공 - ${rows.length}건 조회`) + + // null 값 필터링 + const cleanedResult = rows + .filter((item) => + item.PROJ_NO && + item.WBS_ELMT && + item.WBS_ELMT_NM + ) + .map((item) => ({ + PROJ_NO: String(item.PROJ_NO), + WBS_ELMT: String(item.WBS_ELMT), + WBS_ELMT_NM: String(item.WBS_ELMT_NM), + WBS_LVL: String(item.WBS_LVL || '') + })) + + console.log(`✅ [getWbsCodes] 필터링 후 ${cleanedResult.length}건`) + + return { + success: true, + data: cleanedResult, + isUsingFallback: false + } + } catch (error) { + console.error('❌ [getWbsCodes] Oracle 오류:', error) + console.log('🔄 [getWbsCodes] 폴백 테스트 데이터 사용 (' + FALLBACK_TEST_DATA.length + '건)') + return { + success: true, + data: FALLBACK_TEST_DATA, + isUsingFallback: true + } + } +} + -- cgit v1.2.3