summaryrefslogtreecommitdiff
path: root/components/common/discipline/discipline-service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'components/common/discipline/discipline-service.ts')
-rw-r--r--components/common/discipline/discipline-service.ts123
1 files changed, 123 insertions, 0 deletions
diff --git a/components/common/discipline/discipline-service.ts b/components/common/discipline/discipline-service.ts
new file mode 100644
index 00000000..cb6edb0e
--- /dev/null
+++ b/components/common/discipline/discipline-service.ts
@@ -0,0 +1,123 @@
+"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<DisciplineCode | null> {
+ 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
+ }
+}