From bf2db28586569499e44b58999f2e0f33ed4cdeb5 Mon Sep 17 00:00:00 2001
From: joonhoekim <26rote@gmail.com>
Date: Wed, 24 Sep 2025 17:36:08 +0900
Subject: (김준회) 구매 요청사항 반영 - vendor-pool 및 avl detail (이진용 프로)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
lib/avl/table/avl-detail-table.tsx | 70 +--------------------------------
lib/avl/table/avl-registration-area.tsx | 10 -----
lib/avl/table/avl-table-columns.tsx | 16 ++++----
lib/avl/table/avl-table.tsx | 26 ++++++------
lib/avl/table/project-avl-table.tsx | 33 +++++++++++++++-
lib/avl/table/standard-avl-table.tsx | 11 ++----
lib/avl/table/vendor-pool-table.tsx | 3 +-
7 files changed, 56 insertions(+), 113 deletions(-)
(limited to 'lib/avl/table')
diff --git a/lib/avl/table/avl-detail-table.tsx b/lib/avl/table/avl-detail-table.tsx
index 4408340a..22c503ff 100644
--- a/lib/avl/table/avl-detail-table.tsx
+++ b/lib/avl/table/avl-detail-table.tsx
@@ -6,12 +6,10 @@ import { useDataTable } from "@/hooks/use-data-table"
import { DataTable } from "@/components/data-table/data-table"
import { Button } from "@/components/ui/button"
import { toast } from "sonner"
-import { createAvlRfqItbAction, prepareAvlRfqItbInput } from "../avl-itb-rfq-service"
import { columns } from "./columns-detail"
import type { AvlDetailItem } from "../types"
import { BackButton } from "@/components/ui/back-button"
-import { useSession } from "next-auth/react"
interface AvlDetailTableProps {
data: AvlDetailItem[]
@@ -33,63 +31,11 @@ export function AvlDetailTable({
projectInfo,
businessType,
}: AvlDetailTableProps) {
- // 견적요청 처리 상태 관리
- const [isProcessingQuote, setIsProcessingQuote] = React.useState(false)
- const { data: session } = useSession()
-
- // 견적요청 처리 함수
- const handleQuoteRequest = React.useCallback(async () => {
- if (!businessType || !['조선', '해양'].includes(businessType)) {
- toast.error("공사구분이 올바르지 않습니다. 견적요청 처리 불가.")
- return
- }
- if (data.length === 0) {
- toast.error("견적요청할 AVL 데이터가 없습니다.")
- return
- }
-
- setIsProcessingQuote(true)
-
- try {
- // 현재 사용자 세션에서 ID 가져오기
- const currentUserId = session?.user?.id ? Number(session.user.id) : undefined
-
- // 견적요청 입력 데이터 준비 (전체 데이터를 사용)
- const quoteInput = await prepareAvlRfqItbInput(
- data, // 전체 데이터를 사용
- businessType as '조선' | '해양',
- {
- picUserId: currentUserId,
- rfqTitle: `${businessType} AVL 견적요청 - ${data[0]?.materialNameCustomerSide || 'AVL 아이템'}${data.length > 1 ? ` 외 ${data.length - 1}건` : ''}`
- }
- )
-
- // 견적요청 실행
- const result = await createAvlRfqItbAction(quoteInput)
-
- if (result.success) {
- toast.success(`${result.data?.type}가 성공적으로 생성되었습니다. (코드: ${result.data?.rfqCode})`)
- } else {
- toast.error(result.error || "견적요청 처리 중 오류가 발생했습니다.")
- }
-
- } catch (error) {
- console.error('견적요청 처리 오류:', error)
- toast.error("견적요청 처리 중 오류가 발생했습니다.")
- } finally {
- setIsProcessingQuote(false)
- }
- }, [businessType, data, session?.user?.id])
// 액션 핸들러
const handleAction = React.useCallback(async (action: string) => {
switch (action) {
-
- case 'quote-request':
- await handleQuoteRequest()
- break
-
case 'vendor-pool':
window.open('/evcp/vendor-pool', '_blank')
break
@@ -107,7 +53,7 @@ export function AvlDetailTable({
default:
toast.error(`알 수 없는 액션: ${action}`)
}
- }, [handleQuoteRequest])
+ }, [])
// 테이블 메타 설정
@@ -153,24 +99,10 @@ export function AvlDetailTable({
{/* 상단 버튼 영역 */}
- {
- // 표준AVL로는 견적요청하지 않으며, 프로젝트 AVL로만 견적요청처리
- avlType === '프로젝트AVL' && businessType && ['조선', '해양'].includes(businessType) &&
-
- }
-
{/* 단순 이동 버튼 */}
-
{/* 데이터 테이블 */}
diff --git a/lib/avl/table/avl-registration-area.tsx b/lib/avl/table/avl-registration-area.tsx
index ba1c76d4..6c7eba9d 100644
--- a/lib/avl/table/avl-registration-area.tsx
+++ b/lib/avl/table/avl-registration-area.tsx
@@ -15,16 +15,6 @@ import { toast } from "sonner"
// 선택된 테이블 타입
type SelectedTable = 'project' | 'standard' | 'vendor' | null
-// TODO: 나머지 테이블들도 ref 지원 추가 시 인터페이스 추가 필요
-// interface StandardAvlTableRef {
-// getSelectedIds?: () => number[]
-// }
-//
-// interface VendorPoolTableRef {
-// getSelectedIds?: () => number[]
-// }
-
-
// 선택 상태 액션 타입
type SelectionAction =
| { type: 'SELECT_PROJECT'; count: number }
diff --git a/lib/avl/table/avl-table-columns.tsx b/lib/avl/table/avl-table-columns.tsx
index 6ec2c3db..06005d3d 100644
--- a/lib/avl/table/avl-table-columns.tsx
+++ b/lib/avl/table/avl-table-columns.tsx
@@ -45,9 +45,7 @@ export function getColumns({ selectedRows = [], onRowSelect }: GetColumnsProps):
enableSorting: false,
enableHiding: false,
enableResizing: false,
- size: 10,
- minSize: 10,
- maxSize: 10,
+ size: 50,
},
// No 컬럼
{
@@ -57,7 +55,7 @@ export function getColumns({ selectedRows = [], onRowSelect }: GetColumnsProps):
),
cell: ({ getValue }) => {getValue() as number}
,
enableResizing: true,
- size: 60,
+ size: 100,
},
// AVL 분류 컬럼
{
@@ -148,7 +146,7 @@ export function getColumns({ selectedRows = [], onRowSelect }: GetColumnsProps):
{
accessorKey: "htDivision",
header: ({ column }) => (
-
+
),
cell: ({ getValue }) => {
const value = getValue() as string
@@ -205,7 +203,7 @@ export function getColumns({ selectedRows = [], onRowSelect }: GetColumnsProps):
),
enableResizing: true,
- size: 120,
+ size: 100,
},
// 협력업체 컬럼
{
@@ -214,7 +212,7 @@ export function getColumns({ selectedRows = [], onRowSelect }: GetColumnsProps):
),
enableResizing: true,
- size: 150,
+ size: 100,
},
// Tier 컬럼
{
@@ -280,7 +278,7 @@ export function getColumns({ selectedRows = [], onRowSelect }: GetColumnsProps):
return {date}
},
enableResizing: true,
- size: 100,
+ size: 120,
},
// 최종변경자 컬럼
{
@@ -293,7 +291,7 @@ export function getColumns({ selectedRows = [], onRowSelect }: GetColumnsProps):
return {value}
},
enableResizing: true,
- size: 100,
+ size: 120,
},
// 액션 컬럼
{
diff --git a/lib/avl/table/avl-table.tsx b/lib/avl/table/avl-table.tsx
index 61db658d..9b6ac90b 100644
--- a/lib/avl/table/avl-table.tsx
+++ b/lib/avl/table/avl-table.tsx
@@ -100,9 +100,9 @@ export function AvlTable({ data, pageCount, isLoading, onRegistrationModeChange,
const handleAction = React.useCallback(async (action: string, data?: Partial) => {
try {
switch (action) {
- case 'standard-registration':
- // 표준 AVL 등록
- const result = await handleAvlActionAction('standard-registration')
+ case 'avl-registration':
+ // AVL 등록 (통합된 기능)
+ const result = await handleAvlActionAction('avl-registration')
if (result.success) {
toast.success(result.message)
onRegistrationModeChange?.('standard') // 등록 모드 변경 콜백 호출
@@ -112,9 +112,10 @@ export function AvlTable({ data, pageCount, isLoading, onRegistrationModeChange,
break
case 'view-detail':
- // 상세 조회 (페이지 이동)
+ // 상세 조회 (페이지 이동) - 원래 방식으로 복원
if (data?.id && !String(data.id).startsWith('temp-')) {
- window.location.href = `/evcp/avl/${data.id}`
+ console.log('AVL 상세보기 이동:', data.id) // 디버깅용
+ window.location.href = `/ko/evcp/avl/${data.id}`
}
break
@@ -177,6 +178,9 @@ export function AvlTable({ data, pageCount, isLoading, onRegistrationModeChange,
columnSizing: {},
},
getRowId: (row) => String(row.id),
+ meta: {
+ onAction: handleAction,
+ },
})
return (
@@ -191,17 +195,9 @@ export function AvlTable({ data, pageCount, isLoading, onRegistrationModeChange,
-
-
diff --git a/lib/avl/table/project-avl-table.tsx b/lib/avl/table/project-avl-table.tsx
index 9584c6f9..ad72b221 100644
--- a/lib/avl/table/project-avl-table.tsx
+++ b/lib/avl/table/project-avl-table.tsx
@@ -177,12 +177,40 @@ export const ProjectAvlTable = forwardRef {
setSearchConstructionSector(value)
- // 공사부문이 변경되면 선종을 빈 값으로 초기화
- setSelectedShipType(undefined)
}, [])
// 검색 상태 변경 시 부모 컴포넌트에 전달
@@ -506,7 +504,7 @@ export const StandardAvlTable = forwardRef