diff options
| author | joonhoekim <26rote@gmail.com> | 2025-11-04 16:28:49 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-11-04 16:28:49 +0900 |
| commit | 153502b67da990c92973f1f8af416f9a81ec3abb (patch) | |
| tree | 825d207df95a68113b084d8392c3cf208f6449f5 | |
| parent | 7bf90e71ee98abe2d65e18eaf20a449cd1bd097c (diff) | |
(김준회) 데이터입력(EDP): 조선/해양 프로젝트 목록 필터링해 구분
| -rw-r--r-- | app/[lng]/partners/(partners)/vendor-data-plant/layout.tsx | 4 | ||||
| -rw-r--r-- | app/[lng]/partners/(partners)/vendor-data/layout.tsx | 4 | ||||
| -rw-r--r-- | lib/vendor-data-plant/services.ts | 114 | ||||
| -rw-r--r-- | lib/vendor-data/services.ts | 24 |
4 files changed, 27 insertions, 119 deletions
diff --git a/app/[lng]/partners/(partners)/vendor-data-plant/layout.tsx b/app/[lng]/partners/(partners)/vendor-data-plant/layout.tsx index d2d63c28..8a9c43e9 100644 --- a/app/[lng]/partners/(partners)/vendor-data-plant/layout.tsx +++ b/app/[lng]/partners/(partners)/vendor-data-plant/layout.tsx @@ -29,8 +29,8 @@ export default async function VendorDataLayout({ // const vendorId = "17" const idAsNumber = Number(vendorId) - // 프로젝트 데이터 가져오기 - const projects = await getVendorProjectsAndContracts(idAsNumber) + // 프로젝트 데이터 가져오기 (type=plant만) + const projects = await getVendorProjectsAndContracts(idAsNumber, "plant") // 레이아웃 설정 쿠키 가져오기 // Next.js 15에서는 cookies()가 Promise를 반환하므로 await 사용 diff --git a/app/[lng]/partners/(partners)/vendor-data/layout.tsx b/app/[lng]/partners/(partners)/vendor-data/layout.tsx index c37a983a..3b298f15 100644 --- a/app/[lng]/partners/(partners)/vendor-data/layout.tsx +++ b/app/[lng]/partners/(partners)/vendor-data/layout.tsx @@ -29,8 +29,8 @@ export default async function VendorDataLayout({ // const vendorId = "17" const idAsNumber = Number(vendorId) - // 프로젝트 데이터 가져오기 - const projects = await getVendorProjectsAndContracts(idAsNumber) + // 프로젝트 데이터 가져오기 (type=ship만) + const projects = await getVendorProjectsAndContracts(idAsNumber, "ship") // 레이아웃 설정 쿠키 가져오기 // Next.js 15에서는 cookies()가 Promise를 반환하므로 await 사용 diff --git a/lib/vendor-data-plant/services.ts b/lib/vendor-data-plant/services.ts index e8ecd01c..51bd62ec 100644 --- a/lib/vendor-data-plant/services.ts +++ b/lib/vendor-data-plant/services.ts @@ -1,112 +1,4 @@ -"use server"; - -import db from "@/db/db" -import { items } from "@/db/schema/items" -import { projects } from "@/db/schema/projects" -import { eq } from "drizzle-orm" -import { contractItems, contracts } from "@/db/schema/contract"; -import { getServerSession } from "next-auth"; -import { authOptions } from "@/app/api/auth/[...nextauth]/route"; - -export interface ProjectWithContracts { - projectId: number - projectCode: string - projectName: string - projectType: string - - contracts: { - contractId: number - contractNo: string - contractName: string - packages: { - itemId: number // contract_items.id - itemName: string - }[] - }[] -} - -export async function getVendorProjectsAndContracts( - vendorId?: number -): Promise<ProjectWithContracts[]> { - // 세션에서 도메인 정보 가져오기 - const session = await getServerSession(authOptions) - - // EVCP 도메인일 때만 전체 조회 - const isEvcpDomain = session?.user?.domain === "evcp" - - const query = db - .select({ - projectId: projects.id, - projectCode: projects.code, - projectName: projects.name, - projectType: projects.type, - - contractId: contracts.id, - contractNo: contracts.contractNo, - contractName: contracts.contractName, - - itemId: contractItems.id, - itemName: items.itemName, - }) - .from(contracts) - .innerJoin(projects, eq(contracts.projectId, projects.id)) - .innerJoin(contractItems, eq(contractItems.contractId, contracts.id)) - .innerJoin(items, eq(contractItems.itemId, items.id)) - - if (!isEvcpDomain && vendorId) { - query.where(eq(contracts.vendorId, vendorId)) - } - - const rows = await query - - const projectMap = new Map<number, ProjectWithContracts>() - - for (const row of rows) { - // 1) 프로젝트 그룹 찾기 - let projectEntry = projectMap.get(row.projectId) - if (!projectEntry) { - // 새 프로젝트 항목 생성 - projectEntry = { - projectId: row.projectId, - projectCode: row.projectCode, - projectName: row.projectName, - projectType: row.projectType, - contracts: [], - } - projectMap.set(row.projectId, projectEntry) - } - - // 2) 프로젝트 안에서 계약(contractId) 찾기 - let contractEntry = projectEntry.contracts.find( - (c) => c.contractId === row.contractId - ) - if (!contractEntry) { - - // 새 계약 항목 - contractEntry = { - contractId: row.contractId, - contractNo: row.contractNo, - contractName: row.contractName, - packages: [], - } - projectEntry.contracts.push(contractEntry) - } - - // 3) 계약의 packages 배열에 아이템 추가 (중복 체크) - // itemName이 같은 항목이 이미 존재하는지 확인 - const existingItem = contractEntry.packages.find( - (pkg) => pkg.itemName === row.itemName - ) - - // 같은 itemName이 없는 경우에만 추가 - if (!existingItem) { - contractEntry.packages.push({ - itemId: row.itemId, - itemName: row.itemName, - }) - } - } - - return Array.from(projectMap.values()) -} +// vendor-data-plant/services.ts +// vendor-data/services.ts의 통합 함수를 re-export +export { getVendorProjectsAndContracts, type ProjectWithContracts } from "@/lib/vendor-data/services" diff --git a/lib/vendor-data/services.ts b/lib/vendor-data/services.ts index e8ecd01c..8c8b21d2 100644 --- a/lib/vendor-data/services.ts +++ b/lib/vendor-data/services.ts @@ -3,7 +3,7 @@ import db from "@/db/db" import { items } from "@/db/schema/items" import { projects } from "@/db/schema/projects" -import { eq } from "drizzle-orm" +import { eq, and } from "drizzle-orm" import { contractItems, contracts } from "@/db/schema/contract"; import { getServerSession } from "next-auth"; import { authOptions } from "@/app/api/auth/[...nextauth]/route"; @@ -26,7 +26,8 @@ export interface ProjectWithContracts { } export async function getVendorProjectsAndContracts( - vendorId?: number + vendorId?: number, + projectType?: "ship" | "plant" ): Promise<ProjectWithContracts[]> { // 세션에서 도메인 정보 가져오기 const session = await getServerSession(authOptions) @@ -34,6 +35,20 @@ export async function getVendorProjectsAndContracts( // EVCP 도메인일 때만 전체 조회 const isEvcpDomain = session?.user?.domain === "evcp" + // where 조건들을 배열로 관리 + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const whereConditions: any[] = [] + + // vendorId 조건 추가 + if (!isEvcpDomain && vendorId) { + whereConditions.push(eq(contracts.vendorId, vendorId)) + } + + // projectType 조건 추가 + if (projectType) { + whereConditions.push(eq(projects.type, projectType)) + } + const query = db .select({ projectId: projects.id, @@ -53,8 +68,9 @@ export async function getVendorProjectsAndContracts( .innerJoin(contractItems, eq(contractItems.contractId, contracts.id)) .innerJoin(items, eq(contractItems.itemId, items.id)) - if (!isEvcpDomain && vendorId) { - query.where(eq(contracts.vendorId, vendorId)) + // 조건이 있으면 where 절 추가 + if (whereConditions.length > 0) { + query.where(and(...whereConditions)) } const rows = await query |
