summaryrefslogtreecommitdiff
path: root/lib/avl/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/avl/service.ts')
-rw-r--r--lib/avl/service.ts71
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);