summaryrefslogtreecommitdiff
path: root/components/common/ship-type/ship-type-service.ts
blob: 9a952478744d35124d03d7b77c78db0acc7e6035 (plain)
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
  }
}