From c657ef972feeafff16ab0e07cb4771f7dd141ba0 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Thu, 10 Jul 2025 09:55:45 +0000 Subject: (대표님) 20250710 작업사항 - 평가 첨부, 로그인, SEDP 변경 요구사항 반영 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/vendor-data/services copy.ts | 99 ++++++++++++++++++++++++++++++++++++++++ lib/vendor-data/services.ts | 35 +++++++------- 2 files changed, 117 insertions(+), 17 deletions(-) create mode 100644 lib/vendor-data/services copy.ts (limited to 'lib/vendor-data') diff --git a/lib/vendor-data/services copy.ts b/lib/vendor-data/services copy.ts new file mode 100644 index 00000000..7f0c47c1 --- /dev/null +++ b/lib/vendor-data/services copy.ts @@ -0,0 +1,99 @@ +"use server"; + +import db from "@/db/db" +import { items } from "@/db/schema/items" +import { projects } from "@/db/schema/projects" +import { Tag, tags } from "@/db/schema/vendorData" +import { eq } from "drizzle-orm" +import { revalidateTag, unstable_noStore } from "next/cache"; +import { unstable_cache } from "@/lib/unstable-cache"; +import { contractItems, contracts } from "@/db/schema/contract"; + +// 스키마 import + +export interface ProjectWithContracts { + projectId: number + projectCode: string + projectName: string + projectType: string + + contracts: { + contractId: number + contractNo: string + contractName: string + // contractName 등 필요한 필드 추가 + packages: { + itemId: number + itemName: string + }[] + }[] +} + + +export async function getVendorProjectsAndContracts( + vendorId: number +): Promise { + const rows = await 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)) + .where(eq(contracts.vendorId, vendorId)) + + 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, + 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 배열에 아이템 추가 + contractEntry.packages.push({ + itemId: row.itemId, + itemName: row.itemName, + }) + } + + return Array.from(projectMap.values()) +} + + +// 1) 태그 조회 diff --git a/lib/vendor-data/services.ts b/lib/vendor-data/services.ts index 7f0c47c1..0ec935b9 100644 --- a/lib/vendor-data/services.ts +++ b/lib/vendor-data/services.ts @@ -3,25 +3,22 @@ import db from "@/db/db" import { items } from "@/db/schema/items" import { projects } from "@/db/schema/projects" -import { Tag, tags } from "@/db/schema/vendorData" +import { Tag, tags } from "@/db/schema/vendorData" import { eq } from "drizzle-orm" import { revalidateTag, unstable_noStore } from "next/cache"; import { unstable_cache } from "@/lib/unstable-cache"; import { contractItems, contracts } from "@/db/schema/contract"; -// 스키마 import - export interface ProjectWithContracts { projectId: number projectCode: string projectName: string projectType: string - + contracts: { contractId: number contractNo: string contractName: string - // contractName 등 필요한 필드 추가 packages: { itemId: number itemName: string @@ -29,7 +26,6 @@ export interface ProjectWithContracts { }[] } - export async function getVendorProjectsAndContracts( vendorId: number ): Promise { @@ -39,11 +35,11 @@ export async function getVendorProjectsAndContracts( projectCode: projects.code, projectName: projects.name, projectType: projects.type, - + contractId: contracts.id, contractNo: contracts.contractNo, contractName: contracts.contractName, - + itemId: contractItems.id, itemName: items.itemName, }) @@ -85,15 +81,20 @@ export async function getVendorProjectsAndContracts( projectEntry.contracts.push(contractEntry) } - // 3) 계약의 packages 배열에 아이템 추가 - contractEntry.packages.push({ - itemId: row.itemId, - itemName: row.itemName, - }) + // 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()) -} - - -// 1) 태그 조회 +} \ No newline at end of file -- cgit v1.2.3