diff options
Diffstat (limited to 'components/common/selectors/wbs-code')
3 files changed, 33 insertions, 92 deletions
diff --git a/components/common/selectors/wbs-code/wbs-code-selector.tsx b/components/common/selectors/wbs-code/wbs-code-selector.tsx index aa5a6a64..5356c723 100644 --- a/components/common/selectors/wbs-code/wbs-code-selector.tsx +++ b/components/common/selectors/wbs-code/wbs-code-selector.tsx @@ -5,10 +5,8 @@ *
* @description
* - 오라클에서 WBS 코드들을 조회
- * - PROJ_NO: 프로젝트 번호
* - WBS_ELMT: WBS 요소
* - WBS_ELMT_NM: WBS 요소명
- * - WBS_LVL: WBS 레벨
*/
import { useState, useCallback, useMemo, useTransition } from 'react'
@@ -49,7 +47,6 @@ export interface WbsCodeSelectorProps { disabled?: boolean
placeholder?: string
className?: string
- projNo?: string // 프로젝트 번호 필터
}
export interface WbsCodeItem {
@@ -66,8 +63,7 @@ export function WbsCodeSelector({ onCodeSelect,
disabled,
placeholder = "WBS 코드를 선택하세요",
- className,
- projNo
+ className
}: WbsCodeSelectorProps) {
const [open, setOpen] = useState(false)
const [codes, setCodes] = useState<WbsCode[]>([])
@@ -81,7 +77,7 @@ export function WbsCodeSelector({ // WBS 코드 선택 핸들러
const handleCodeSelect = useCallback(async (code: WbsCode) => {
// 이미 선택된 코드를 다시 선택하면 선택 해제
- if (selectedCode && selectedCode.PROJ_NO === code.PROJ_NO && selectedCode.WBS_ELMT === code.WBS_ELMT) {
+ if (selectedCode && selectedCode.WBS_ELMT === code.WBS_ELMT) {
onCodeSelect(undefined as any) // 선택 해제를 위해 undefined 전달
setOpen(false)
return
@@ -99,34 +95,20 @@ export function WbsCodeSelector({ // 테이블 컬럼 정의
const columns: ColumnDef<WbsCode>[] = useMemo(() => [
{
- accessorKey: 'PROJ_NO',
- header: '프로젝트 번호',
- cell: ({ row }) => (
- <div className="font-mono text-sm">{row.getValue('PROJ_NO')}</div>
- ),
- },
- {
accessorKey: 'WBS_ELMT',
- header: 'WBS 요소',
+ header: 'WBS_ELMT',
cell: ({ row }) => (
<div className="font-mono text-sm">{row.getValue('WBS_ELMT')}</div>
),
},
{
accessorKey: 'WBS_ELMT_NM',
- header: 'WBS 요소명',
+ header: 'WBS_ELMT_NM',
cell: ({ row }) => (
<div>{row.getValue('WBS_ELMT_NM')}</div>
),
},
{
- accessorKey: 'WBS_LVL',
- header: '레벨',
- cell: ({ row }) => (
- <div className="text-center">{row.getValue('WBS_LVL')}</div>
- ),
- },
- {
id: 'actions',
header: '선택',
cell: ({ row }) => (
@@ -170,7 +152,7 @@ export function WbsCodeSelector({ const loadCodes = useCallback(async () => {
startTransition(async () => {
try {
- const result = await getWbsCodes(projNo)
+ const result = await getWbsCodes()
if (result.success) {
setCodes(result.data)
@@ -192,7 +174,7 @@ export function WbsCodeSelector({ setCodes([])
}
})
- }, [projNo])
+ }, [])
// 다이얼로그 열기 핸들러
const handleDialogOpenChange = useCallback((newOpen: boolean) => {
@@ -217,8 +199,7 @@ export function WbsCodeSelector({ >
{selectedCode ? (
<div className="flex items-center gap-2 w-full">
- <span className="font-mono text-sm">[{selectedCode.PROJ_NO}]</span>
- <span className="font-mono text-sm">{selectedCode.WBS_ELMT}</span>
+ <span className="font-mono text-sm">[{selectedCode.WBS_ELMT}]</span>
<span className="truncate flex-1 text-left">{selectedCode.WBS_ELMT_NM}</span>
<Button
variant="ghost"
@@ -249,7 +230,7 @@ export function WbsCodeSelector({ <div className="flex items-center space-x-2">
<Search className="h-4 w-4" />
<Input
- placeholder="프로젝트 번호, WBS 요소, WBS 요소명으로 검색..."
+ placeholder="WBS 요소, WBS 요소명으로 검색..."
value={globalFilter}
onChange={(e) => handleSearchChange(e.target.value)}
className="flex-1"
@@ -296,7 +277,7 @@ export function WbsCodeSelector({ )}
</TableCell>
))}
- {selectedCode && selectedCode.PROJ_NO === row.original.PROJ_NO && selectedCode.WBS_ELMT === row.original.WBS_ELMT && (
+ {selectedCode && selectedCode.WBS_ELMT === row.original.WBS_ELMT && (
<TableCell className="text-right">
<span className="text-xs text-muted-foreground">(선택됨)</span>
</TableCell>
diff --git a/components/common/selectors/wbs-code/wbs-code-service.ts b/components/common/selectors/wbs-code/wbs-code-service.ts index 7d9c17b1..6ceedcb7 100644 --- a/components/common/selectors/wbs-code/wbs-code-service.ts +++ b/components/common/selectors/wbs-code/wbs-code-service.ts @@ -4,54 +4,35 @@ 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_ELMT: 'WBS001', WBS_ELMT_NM: 'WBS 항목 1' },
+ { WBS_ELMT: 'WBS002', WBS_ELMT_NM: 'WBS 항목 2' },
+ { WBS_ELMT: 'WBS003', WBS_ELMT_NM: 'WBS 항목 3' },
+ { WBS_ELMT: 'WBS004', WBS_ELMT_NM: 'WBS 항목 4' },
+ { WBS_ELMT: 'WBS005', WBS_ELMT_NM: 'WBS 항목 5' },
]
/**
* WBS 코드 목록 조회 (Oracle에서 전체 조회, 실패 시 폴백 데이터 사용)
* CMCTB_PROJ_WBS 테이블에서 조회
- * @param projNo - 프로젝트 번호 (선택적, 없으면 전체 조회)
*/
-export async function getWbsCodes(projNo?: string): Promise<{
+export async function getWbsCodes(): Promise<{
success: boolean
data: WbsCode[]
error?: string
isUsingFallback?: boolean
}> {
try {
- console.log('📋 [getWbsCodes] Oracle 쿼리 시작...', projNo ? `프로젝트: ${projNo}` : '전체')
+ console.log('📋 [getWbsCodes] Oracle 쿼리 시작...')
- 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)
+ const result = await oracleKnex.raw(`
+ SELECT WBS_ELMT,WBS_ELMT_NM FROM CMCTB_PROJ_WBS WHERE ROWNUM < 30 AND PROJ_NO = 'SN2673'
+ `)
// Oracle raw query의 결과는 rows 배열에 들어있음
const rows = (result.rows || result) as Array<Record<string, unknown>>
@@ -60,16 +41,13 @@ export async function getWbsCodes(projNo?: string): Promise<{ // null 값 필터링
const cleanedResult = rows
- .filter((item) =>
- item.PROJ_NO &&
- item.WBS_ELMT &&
+ .filter((item) =>
+ 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 || '')
+ WBS_ELMT_NM: String(item.WBS_ELMT_NM)
}))
console.log(`✅ [getWbsCodes] 필터링 후 ${cleanedResult.length}건`)
diff --git a/components/common/selectors/wbs-code/wbs-code-single-selector.tsx b/components/common/selectors/wbs-code/wbs-code-single-selector.tsx index 77a32afe..5c84b8c2 100644 --- a/components/common/selectors/wbs-code/wbs-code-single-selector.tsx +++ b/components/common/selectors/wbs-code/wbs-code-single-selector.tsx @@ -49,7 +49,6 @@ export interface WbsCodeSingleSelectorProps { title?: string description?: string showConfirmButtons?: boolean - projNo?: string // 프로젝트 번호 필터 } export function WbsCodeSingleSelector({ @@ -61,8 +60,7 @@ export function WbsCodeSingleSelector({ onCancel, title = "WBS 코드 선택", description = "WBS 코드를 선택하세요", - showConfirmButtons = false, - projNo + showConfirmButtons = false }: WbsCodeSingleSelectorProps) { const [codes, setCodes] = useState<WbsCode[]>([]) const [sorting, setSorting] = useState<SortingState>([]) @@ -77,7 +75,7 @@ export function WbsCodeSingleSelector({ const handleCodeSelect = useCallback((code: WbsCode) => { // 이미 선택된 코드를 다시 선택하면 선택 해제 const currentSelected = showConfirmButtons ? tempSelectedCode : selectedCode - if (currentSelected && currentSelected.WBS_ELMT === code.WBS_ELMT && currentSelected.PROJ_NO === code.PROJ_NO) { + if (currentSelected && currentSelected.WBS_ELMT === code.WBS_ELMT) { if (showConfirmButtons) { setTempSelectedCode(undefined) } else { @@ -114,40 +112,26 @@ export function WbsCodeSingleSelector({ // 테이블 컬럼 정의 const columns: ColumnDef<WbsCode>[] = useMemo(() => [ { - accessorKey: 'PROJ_NO', - header: '프로젝트 번호', - cell: ({ row }) => ( - <div className="font-mono text-sm">{row.getValue('PROJ_NO')}</div> - ), - }, - { accessorKey: 'WBS_ELMT', - header: 'WBS 요소', + header: 'WBS_ELMT', cell: ({ row }) => ( <div className="font-mono text-sm">{row.getValue('WBS_ELMT')}</div> ), }, { accessorKey: 'WBS_ELMT_NM', - header: 'WBS 요소명', + header: 'WBS_ELMT_NM', cell: ({ row }) => ( <div>{row.getValue('WBS_ELMT_NM')}</div> ), }, { - accessorKey: 'WBS_LVL', - header: '레벨', - cell: ({ row }) => ( - <div className="text-center">{row.getValue('WBS_LVL')}</div> - ), - }, - { id: 'actions', header: '선택', cell: ({ row }) => { const isSelected = showConfirmButtons - ? tempSelectedCode?.WBS_ELMT === row.original.WBS_ELMT && tempSelectedCode?.PROJ_NO === row.original.PROJ_NO - : selectedCode?.WBS_ELMT === row.original.WBS_ELMT && selectedCode?.PROJ_NO === row.original.PROJ_NO + ? tempSelectedCode?.WBS_ELMT === row.original.WBS_ELMT + : selectedCode?.WBS_ELMT === row.original.WBS_ELMT return ( <Button @@ -191,7 +175,7 @@ export function WbsCodeSingleSelector({ const loadCodes = useCallback(async () => { startTransition(async () => { try { - const result = await getWbsCodes(projNo) + const result = await getWbsCodes() if (result.success) { setCodes(result.data) @@ -213,7 +197,7 @@ export function WbsCodeSingleSelector({ setCodes([]) } }) - }, [projNo]) + }, []) // 다이얼로그 열릴 때 코드 로드 (open prop 변화 감지) useEffect(() => { @@ -268,8 +252,7 @@ export function WbsCodeSingleSelector({ </Button> </div> <div className="flex items-center gap-2 mt-1"> - <span className="font-mono text-sm">[{currentSelectedCode.PROJ_NO}]</span> - <span className="font-mono text-sm">{currentSelectedCode.WBS_ELMT}</span> + <span className="font-mono text-sm">[{currentSelectedCode.WBS_ELMT}]</span> <span>{currentSelectedCode.WBS_ELMT_NM}</span> </div> </div> @@ -278,7 +261,7 @@ export function WbsCodeSingleSelector({ <div className="flex items-center space-x-2"> <Search className="h-4 w-4" /> <Input - placeholder="프로젝트 번호, WBS 요소, WBS 요소명으로 검색..." + placeholder="WBS 요소, WBS 요소명으로 검색..." value={globalFilter} onChange={(e) => handleSearchChange(e.target.value)} className="flex-1" @@ -311,8 +294,7 @@ export function WbsCodeSingleSelector({ <TableBody> {table.getRowModel().rows?.length ? ( table.getRowModel().rows.map((row) => { - const isRowSelected = currentSelectedCode?.WBS_ELMT === row.original.WBS_ELMT && - currentSelectedCode?.PROJ_NO === row.original.PROJ_NO + const isRowSelected = currentSelectedCode?.WBS_ELMT === row.original.WBS_ELMT return ( <TableRow key={row.id} |
