summaryrefslogtreecommitdiff
path: root/lib/vendor-data
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-07-10 09:55:45 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-07-10 09:55:45 +0000
commitc657ef972feeafff16ab0e07cb4771f7dd141ba0 (patch)
treebefabd884b00d3cc632c628b3e3810f61cc9f38d /lib/vendor-data
parentb8a03c9d130435a71c5d6217d06ccb0beb9697e5 (diff)
(대표님) 20250710 작업사항 - 평가 첨부, 로그인, SEDP 변경 요구사항 반영
Diffstat (limited to 'lib/vendor-data')
-rw-r--r--lib/vendor-data/services copy.ts99
-rw-r--r--lib/vendor-data/services.ts35
2 files changed, 117 insertions, 17 deletions
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<ProjectWithContracts[]> {
+ 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<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 배열에 아이템 추가
+ 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<ProjectWithContracts[]> {
@@ -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