"use server" import db from '@/db/db' import { cmctbCd } from '@/db/schema/NONSAP/nonsap' import { eq, or, ilike, and } from 'drizzle-orm' // 설계공종코드 타입 정의 export interface DisciplineCode { CD: string // 설계공종코드 USR_DF_CHAR_18: string // 설계공종명 } // 설계공종코드 검색 옵션 export interface DisciplineSearchOptions { searchTerm?: string limit?: number } /** * 설계공종코드 목록 조회 * 내부 PostgreSQL DB의 cmctbCd 테이블에서 CD_CLF = 'PLJP43' 조건으로 조회 */ export async function getDisciplineCodes(options: DisciplineSearchOptions = {}): Promise<{ success: boolean data: DisciplineCode[] error?: string }> { try { const { searchTerm, limit = 100 } = options // 검색어가 있는 경우와 없는 경우를 분리해서 처리 let result; if (searchTerm && searchTerm.trim()) { const term = `%${searchTerm.trim().toUpperCase()}%` result = await db .select({ CD: cmctbCd.CD, USR_DF_CHAR_18: cmctbCd.USR_DF_CHAR_18 }) .from(cmctbCd) .where( and( eq(cmctbCd.CD_CLF, 'PLJP43'), or( ilike(cmctbCd.CD, term), ilike(cmctbCd.USR_DF_CHAR_18, term) ) ) ) .orderBy(cmctbCd.CD) .limit(limit > 0 ? limit : 100) } else { result = await db .select({ CD: cmctbCd.CD, USR_DF_CHAR_18: cmctbCd.USR_DF_CHAR_18 }) .from(cmctbCd) .where(eq(cmctbCd.CD_CLF, 'PLJP43')) .orderBy(cmctbCd.CD) .limit(limit > 0 ? limit : 100) } // null 값 처리 const cleanedResult = result .filter(item => item.CD && item.USR_DF_CHAR_18) .map(item => ({ CD: item.CD!, USR_DF_CHAR_18: item.USR_DF_CHAR_18! })) return { success: true, data: cleanedResult } } catch (error) { console.error('Error fetching discipline codes:', error) return { success: false, data: [], error: '설계공종코드를 조회하는 중 오류가 발생했습니다.' } } } /** * 특정 설계공종코드 조회 * 내부 PostgreSQL DB의 cmctbCd 테이블에서 조회 */ export async function getDisciplineCodeByCode(code: string): Promise { if (!code.trim()) { return null } try { const result = await db .select({ CD: cmctbCd.CD, USR_DF_CHAR_18: cmctbCd.USR_DF_CHAR_18 }) .from(cmctbCd) .where( and( eq(cmctbCd.CD_CLF, 'PLJP43'), eq(cmctbCd.CD, code.trim().toUpperCase()) ) ) .limit(1) if (result.length > 0 && result[0].CD && result[0].USR_DF_CHAR_18) { return { CD: result[0].CD, USR_DF_CHAR_18: result[0].USR_DF_CHAR_18 } } return null } catch (error) { console.error('Error fetching discipline code by code:', error) return null } }