diff options
| author | joonhoekim <26rote@gmail.com> | 2025-09-15 23:42:46 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-09-15 23:42:46 +0900 |
| commit | 7b0c7c8e56fb027c729c953b0b87dab72156f661 (patch) | |
| tree | c0d968b7157af1e63e3cb083b2872c308b4b3061 /lib/avl/service.ts | |
| parent | 4ee8b24cfadf47452807fa2af801385ed60ab47c (diff) | |
(김준회) 임시 견적요청 및 AVL detail 관련 수정사항 처리
Diffstat (limited to 'lib/avl/service.ts')
| -rw-r--r-- | lib/avl/service.ts | 71 |
1 files changed, 45 insertions, 26 deletions
diff --git a/lib/avl/service.ts b/lib/avl/service.ts index 535a0169..3d188f85 100644 --- a/lib/avl/service.ts +++ b/lib/avl/service.ts @@ -5,7 +5,7 @@ import { AvlListItem, AvlDetailItem, CreateAvlListInput, UpdateAvlListInput, Act import type { NewAvlVendorInfo } from "@/db/schema/avl/avl"; import type { NewVendorPool } from "@/db/schema/avl/vendor-pool"; import db from "@/db/db"; -import { avlList, avlVendorInfo } from "@/db/schema/avl/avl"; +import { avlList, avlVendorInfo, avlListSummaryView } from "@/db/schema/avl/avl"; import { vendorPool } from "@/db/schema/avl/vendor-pool"; import { eq, and, or, ilike, count, desc, asc, sql, inArray } from "drizzle-orm"; import { debugLog, debugError, debugSuccess, debugWarn } from "@/lib/debug-utils"; @@ -14,7 +14,7 @@ import { createVendorInfoSnapshot } from "./snapshot-utils"; /** * AVL 리스트 조회 - * avl_list 테이블에서 실제 데이터를 조회합니다. + * avlListSummaryView에서 최신 revision별로 집계된 데이터를 조회합니다. */ export const getAvlLists = async (input: GetAvlListSchema) => { try { @@ -30,69 +30,69 @@ export const getAvlLists = async (input: GetAvlListSchema) => { const searchTerm = `%${input.search}%`; whereConditions.push( or( - ilike(avlList.constructionSector, searchTerm), - ilike(avlList.projectCode, searchTerm), - ilike(avlList.shipType, searchTerm), - ilike(avlList.avlKind, searchTerm) + ilike(avlListSummaryView.constructionSector, searchTerm), + ilike(avlListSummaryView.projectCode, searchTerm), + ilike(avlListSummaryView.shipType, searchTerm), + ilike(avlListSummaryView.avlKind, searchTerm) ) ); } // 필터 조건 추가 if (input.isTemplate === "true") { - whereConditions.push(eq(avlList.isTemplate, true)); + whereConditions.push(eq(avlListSummaryView.isTemplate, true)); } else if (input.isTemplate === "false") { - whereConditions.push(eq(avlList.isTemplate, false)); + whereConditions.push(eq(avlListSummaryView.isTemplate, false)); } if (input.constructionSector) { - whereConditions.push(ilike(avlList.constructionSector, `%${input.constructionSector}%`)); + whereConditions.push(ilike(avlListSummaryView.constructionSector, `%${input.constructionSector}%`)); } if (input.projectCode) { - whereConditions.push(ilike(avlList.projectCode, `%${input.projectCode}%`)); + whereConditions.push(ilike(avlListSummaryView.projectCode, `%${input.projectCode}%`)); } if (input.shipType) { - whereConditions.push(ilike(avlList.shipType, `%${input.shipType}%`)); + whereConditions.push(ilike(avlListSummaryView.shipType, `%${input.shipType}%`)); } if (input.avlKind) { - whereConditions.push(ilike(avlList.avlKind, `%${input.avlKind}%`)); + whereConditions.push(ilike(avlListSummaryView.avlKind, `%${input.avlKind}%`)); } if (input.htDivision) { - whereConditions.push(eq(avlList.htDivision, input.htDivision)); + whereConditions.push(eq(avlListSummaryView.htDivision, input.htDivision)); } if (input.rev) { - whereConditions.push(eq(avlList.rev, parseInt(input.rev))); + whereConditions.push(eq(avlListSummaryView.rev, parseInt(input.rev))); } // 정렬 조건 구성 const orderByConditions: any[] = []; input.sort.forEach((sortItem) => { - const column = sortItem.id as keyof typeof avlList; + const column = sortItem.id as keyof typeof avlListSummaryView; - if (column && avlList[column]) { + if (column && avlListSummaryView[column]) { if (sortItem.desc) { - orderByConditions.push(sql`${avlList[column]} desc`); + orderByConditions.push(sql`${avlListSummaryView[column]} desc`); } else { - orderByConditions.push(sql`${avlList[column]} asc`); + orderByConditions.push(sql`${avlListSummaryView[column]} asc`); } } }); // 기본 정렬 (등재일 내림차순) if (orderByConditions.length === 0) { - orderByConditions.push(desc(avlList.createdAt)); + orderByConditions.push(desc(avlListSummaryView.createdAt)); } // 총 개수 조회 const totalCount = await db .select({ count: count() }) - .from(avlList) + .from(avlListSummaryView) .where(and(...whereConditions)); // 데이터 조회 const data = await db .select() - .from(avlList) + .from(avlListSummaryView) .where(and(...whereConditions)) .orderBy(...orderByConditions) .limit(input.perPage) @@ -100,17 +100,36 @@ export const getAvlLists = async (input: GetAvlListSchema) => { // 데이터 변환 (timestamp -> string) const transformedData: AvlListItem[] = data.map((item, index) => ({ - ...item, + // 기본 필드들 + id: item.id!, + isTemplate: item.isTemplate || false, + constructionSector: item.constructionSector || '', + projectCode: item.projectCode || null, + shipType: item.shipType || '', + avlKind: item.avlKind || '', + htDivision: item.htDivision || '', + rev: item.rev || 1, + vendorInfoSnapshot: undefined, // 뷰에서는 제공하지 않음 + createdBy: item.createdBy || null, + updatedBy: item.updatedBy || null, + + // UI 전용 필드들 no: offset + index + 1, selected: false, createdAt: ((item as any).createdAt as Date)?.toISOString().split('T')[0] || '', updatedAt: ((item as any).updatedAt as Date)?.toISOString().split('T')[0] || '', - // 추가 필드들 (실제로는 JOIN이나 별도 쿼리로 가져와야 함) + + // 기존 필드 매핑 projectInfo: item.projectCode || '', - shipType: item.shipType || '', avlType: item.avlKind || '', - htDivision: item.htDivision || '', - rev: item.rev || 1, + + // 뷰에서 제공하는 집계 필드들 추가 + PKG: item.pkgCount || 0, + materialGroup: item.materialGroupCount || 0, + vendor: item.vendorCount || 0, + Tier: item.tierCount || 0, + ownerSuggestion: item.ownerSuggestionCount || 0, + shiSuggestion: item.shiSuggestionCount || 0, })); const pageCount = Math.ceil(totalCount[0].count / input.perPage); |
