1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
"use server"
import db from '@/db/db'
import { cmctbCdnm } from '@/db/schema/NONSAP/nonsap'
import { eq, or, ilike, and, asc } from 'drizzle-orm'
// 선종 타입 정의
export interface ShipTypeItem {
CD: string // 선종코드
CDNM: string // 선종명
displayText: string // 표시용 텍스트 (CD + " - " + CDNM)
}
// 선종 검색 옵션
export interface ShipTypeSearchOptions {
searchTerm?: string
limit?: number
}
/**
* 선종 목록 조회
* cmctbCdnm 테이블에서 CD_CLF = 'PSA330' AND DEL_YN = 'N' 조건으로 조회
*/
export async function getShipTypes(options: ShipTypeSearchOptions = {}): Promise<{
success: boolean
data: ShipTypeItem[]
error?: string
}> {
try {
const { searchTerm, limit = 100 } = options
// WHERE 조건 구성
let whereClause = and(
eq(cmctbCdnm.CD_CLF, 'PSA330'),
eq(cmctbCdnm.DEL_YN, 'N')
)
// 검색어가 있는 경우 추가 조건
if (searchTerm && searchTerm.trim()) {
const term = `%${searchTerm.trim().toUpperCase()}%`
whereClause = and(
whereClause,
or(
ilike(cmctbCdnm.CD, term),
ilike(cmctbCdnm.CDNM, term)
)
)
}
const result = await db
.select({
CD: cmctbCdnm.CD,
CDNM: cmctbCdnm.CDNM
})
.from(cmctbCdnm)
.where(whereClause)
.orderBy(asc(cmctbCdnm.CD))
.limit(limit > 0 ? limit : 100)
// null 값 처리 및 displayText 추가
const cleanedResult = result
.filter(item => item.CD && item.CDNM)
.map(item => ({
CD: item.CD!,
CDNM: item.CDNM!,
displayText: `${item.CD} - ${item.CDNM}`
}))
return {
success: true,
data: cleanedResult
}
} catch (error) {
console.error('Error fetching ship types:', error)
return {
success: false,
data: [],
error: '선종을 조회하는 중 오류가 발생했습니다.'
}
}
}
/**
* 특정 선종 조회 (코드로)
*/
export async function getShipTypeByCode(code: string): Promise<ShipTypeItem | null> {
if (!code.trim()) {
return null
}
try {
const result = await db
.select({
CD: cmctbCdnm.CD,
CDNM: cmctbCdnm.CDNM
})
.from(cmctbCdnm)
.where(
and(
eq(cmctbCdnm.CD_CLF, 'PSA330'),
eq(cmctbCdnm.DEL_YN, 'N'),
eq(cmctbCdnm.CD, code.trim().toUpperCase())
)
)
.limit(1)
if (result.length > 0 && result[0].CD && result[0].CDNM) {
return {
CD: result[0].CD,
CDNM: result[0].CDNM,
displayText: `${result[0].CD} - ${result[0].CDNM}`
}
}
return null
} catch (error) {
console.error('Error fetching ship type by code:', error)
return null
}
}
|