summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-11-04 16:28:49 +0900
committerjoonhoekim <26rote@gmail.com>2025-11-04 16:28:49 +0900
commit153502b67da990c92973f1f8af416f9a81ec3abb (patch)
tree825d207df95a68113b084d8392c3cf208f6449f5
parent7bf90e71ee98abe2d65e18eaf20a449cd1bd097c (diff)
(김준회) 데이터입력(EDP): 조선/해양 프로젝트 목록 필터링해 구분
-rw-r--r--app/[lng]/partners/(partners)/vendor-data-plant/layout.tsx4
-rw-r--r--app/[lng]/partners/(partners)/vendor-data/layout.tsx4
-rw-r--r--lib/vendor-data-plant/services.ts114
-rw-r--r--lib/vendor-data/services.ts24
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