From 8440ac29c7dcbef992039678ecc0fabff2fd04ec Mon Sep 17 00:00:00 2001 From: dujinkim Date: Mon, 1 Dec 2025 00:58:23 +0000 Subject: (대표님) S-EDP 관련 대표님 작업사항 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/vendor-data/services.ts | 93 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) (limited to 'lib/vendor-data') diff --git a/lib/vendor-data/services.ts b/lib/vendor-data/services.ts index 8c8b21d2..fe4e56ae 100644 --- a/lib/vendor-data/services.ts +++ b/lib/vendor-data/services.ts @@ -62,6 +62,8 @@ export async function getVendorProjectsAndContracts( itemId: contractItems.id, itemName: items.itemName, + packageCode: items.packageCode, + packageName: items.description, }) .from(contracts) .innerJoin(projects, eq(contracts.projectId, projects.id)) @@ -126,3 +128,94 @@ export async function getVendorProjectsAndContracts( return Array.from(projectMap.values()) } +interface ProjectWithPackages { + projectId: number + projectCode: string + projectName: string + projectType: "ship" | "plant" + packages: { + packageCode: string + packageName: string | null + }[] +} + +export async function getVendorProjectsWithPackages( + vendorId?: number, + projectType?: "ship" | "plant" +): Promise { + // 세션에서 도메인 정보 가져오기 + const session = await getServerSession(authOptions) + + // 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, + projectCode: projects.code, + projectName: projects.name, + projectType: projects.type, + + packageCode: items.packageCode, + packageName: items.description, + }) + .from(contracts) + .innerJoin(projects, eq(contracts.projectId, projects.id)) + .innerJoin(contractItems, eq(contractItems.contractId, contracts.id)) + .innerJoin(items, eq(contractItems.itemId, items.id)) + + // 조건이 있으면 where 절 추가 + if (whereConditions.length > 0) { + query.where(and(...whereConditions)) + } + + const rows = await query + + const projectMap = new Map() + + 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, + packages: [], + } + projectMap.set(row.projectId, projectEntry) + } + + // 2) 프로젝트의 packages 배열에 패키지 추가 (중복 체크) + // packageCode가 같은 항목이 이미 존재하는지 확인 + const existingPackage = projectEntry.packages.find( + (pkg) => pkg.packageCode === row.packageCode + ) + + // 같은 packageCode가 없는 경우에만 추가 + if (!existingPackage) { + projectEntry.packages.push({ + packageCode: row.packageCode, + packageName: row.packageName, + }) + } + } + + return Array.from(projectMap.values()) +} \ No newline at end of file -- cgit v1.2.3