From 766f95945a7ca0fdb258d6a83229593e4fcccfa6 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Thu, 3 Jul 2025 02:50:02 +0000 Subject: (최겸) 기술영업 RFQ 견적 프로젝트별 생성 기능 추가 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/items-tech/service.ts | 59 +++++++++++++++------------- lib/items-tech/table/import-excel-button.tsx | 6 +-- 2 files changed, 35 insertions(+), 30 deletions(-) (limited to 'lib/items-tech') diff --git a/lib/items-tech/service.ts b/lib/items-tech/service.ts index be65f5dd..0cc08d23 100644 --- a/lib/items-tech/service.ts +++ b/lib/items-tech/service.ts @@ -13,21 +13,21 @@ import { GetShipbuildingSchema, GetOffshoreTopSchema, GetOffshoreHullSchema, Shi import { itemShipbuilding, itemOffshoreTop, itemOffshoreHull } from "@/db/schema/items"; // 타입 정의 추가 -type WorkType = '기장' | '전장' | '선실' | '배관' | '철의'; -type OffshoreTopWorkType = 'TM' | 'TS' | 'TE' | 'TP'; -type OffshoreHullWorkType = 'HA' | 'HE' | 'HH' | 'HM' | 'NC'; +export type ShipbuildingWorkType = '기장' | '전장' | '선실' | '배관' | '철의'; +export type OffshoreTopWorkType = 'TM' | 'TS' | 'TE' | 'TP'; +export type OffshoreHullWorkType = 'HA' | 'HE' | 'HH' | 'HM' | 'NC'; -interface ShipbuildingItem { +export interface ShipbuildingItem { id: number; itemCode: string; - workType: WorkType; + workType: ShipbuildingWorkType; itemList: string; shipTypes: string; createdAt: Date; updatedAt: Date; } -interface OffshoreTopTechItem { +export interface OffshoreTopTechItem { id: number; itemCode: string; workType: OffshoreTopWorkType; @@ -37,7 +37,7 @@ interface OffshoreTopTechItem { updatedAt: Date; } -interface OffshoreHullTechItem { +export interface OffshoreHullTechItem { id: number; itemCode: string; workType: OffshoreHullWorkType; @@ -409,14 +409,19 @@ export async function createShipbuildingImportItem(input: { } } - // 기존 아이템 확인 + // 기존 아이템 및 선종 확인 const existingItem = await db.select().from(itemShipbuilding) - .where(eq(itemShipbuilding.itemCode, input.itemCode)); + .where( + and( + eq(itemShipbuilding.itemCode, input.itemCode), + eq(itemShipbuilding.shipTypes, input.shipTypes || '') + ) + ); if (existingItem.length > 0) { return { success: false, - message: "이미 존재하는 아이템 코드입니다", + message: "이미 존재하는 아이템 코드 및 선종입니다", data: null, error: "중복 키 오류" } @@ -444,7 +449,7 @@ export async function createShipbuildingImportItem(input: { if (err instanceof Error && err.message.includes("unique constraint")) { return { success: false, - message: "이미 존재하는 아이템 코드입니다", + message: "이미 존재하는 아이템 코드 및 선종입니다", data: null, error: "중복 키 오류" } @@ -845,7 +850,7 @@ export async function removeOffshoreHullItems(input: DeleteItemsInput) { ----------------------------------------------------- */ // 조선 공종별 아이템 조회 -export async function getShipbuildingItemsByWorkType(workType?: WorkType, shipType?: string) { +export async function getShipbuildingItemsByWorkType(workType?: ShipbuildingWorkType, shipType?: string) { try { const query = db .select({ @@ -955,7 +960,7 @@ export async function getOffshoreHullItemsByWorkType(workType?: OffshoreHullWork } // 아이템 검색 -export async function searchShipbuildingItems(searchQuery: string, workType?: WorkType, shipType?: string) { +export async function searchShipbuildingItems(searchQuery: string, workType?: ShipbuildingWorkType, shipType?: string) { try { const searchConditions = [ ilike(itemShipbuilding.itemCode, `%${searchQuery}%`), @@ -1096,32 +1101,32 @@ export async function searchOffshoreHullItems(searchQuery: string, workType?: Of // 모든 공종 목록 조회 export async function getWorkTypes() { return [ - { code: '기장' as WorkType, name: '기장', description: '기계 장치' }, - { code: '전장' as WorkType, name: '전장', description: '전기 장치' }, - { code: '선실' as WorkType, name: '선실', description: '선실' }, - { code: '배관' as WorkType, name: '배관', description: '배관' }, - { code: '철의' as WorkType, name: '철의', description: '선체 강재' }, + { code: '기장' as ShipbuildingWorkType, name: '기장'}, + { code: '전장' as ShipbuildingWorkType, name: '전장'}, + { code: '선실' as ShipbuildingWorkType, name: '선실'}, + { code: '배관' as ShipbuildingWorkType, name: '배관'}, + { code: '철의' as ShipbuildingWorkType, name: '철의'}, ] } // 해양 TOP 공종 목록 조회 export async function getOffshoreTopWorkTypes() { return [ - { code: 'TM' as OffshoreTopWorkType, name: 'TM', description: 'Topside Manufacturing' }, - { code: 'TS' as OffshoreTopWorkType, name: 'TS', description: 'Topside Steel' }, - { code: 'TE' as OffshoreTopWorkType, name: 'TE', description: 'Topside Equipment' }, - { code: 'TP' as OffshoreTopWorkType, name: 'TP', description: 'Topside Piping' }, + { code: 'TM' as OffshoreTopWorkType, name: 'TM'}, + { code: 'TS' as OffshoreTopWorkType, name: 'TS'}, + { code: 'TE' as OffshoreTopWorkType, name: 'TE'}, + { code: 'TP' as OffshoreTopWorkType, name: 'TP'}, ] } // 해양 HULL 공종 목록 조회 export async function getOffshoreHullWorkTypes() { return [ - { code: 'HA' as OffshoreHullWorkType, name: 'HA', description: 'Hull Assembly' }, - { code: 'HE' as OffshoreHullWorkType, name: 'HE', description: 'Hull Equipment' }, - { code: 'HH' as OffshoreHullWorkType, name: 'HH', description: 'Hull Heating' }, - { code: 'HM' as OffshoreHullWorkType, name: 'HM', description: 'Hull Manufacturing' }, - { code: 'NC' as OffshoreHullWorkType, name: 'NC', description: 'No Category' }, + { code: 'HA' as OffshoreHullWorkType, name: 'HA'}, + { code: 'HE' as OffshoreHullWorkType, name: 'HE'}, + { code: 'HH' as OffshoreHullWorkType, name: 'HH'}, + { code: 'HM' as OffshoreHullWorkType, name: 'HM'}, + { code: 'NC' as OffshoreHullWorkType, name: 'NC'}, ] } diff --git a/lib/items-tech/table/import-excel-button.tsx b/lib/items-tech/table/import-excel-button.tsx index 3281823c..02736664 100644 --- a/lib/items-tech/table/import-excel-button.tsx +++ b/lib/items-tech/table/import-excel-button.tsx @@ -102,7 +102,7 @@ export function ImportItemButton({ itemType, onSuccess }: ImportItemButtonProps) worksheet.eachRow((row, rowNumber) => { const values = row.values as (string | null)[]; - if (!headerRow && values.some(v => v === "아이템 코드" || v === "itemCode" || v === "item_code")) { + if (!headerRow && values.some(v => v === "자재 그룹" || v === "itemCode" || v === "item_code")) { headerRowIndex = rowNumber; headerRow = row; headerValues = [...values]; @@ -122,10 +122,10 @@ export function ImportItemButton({ itemType, onSuccess }: ImportItemButtonProps) }); // 필수 헤더 확인 (타입별 구분) - const requiredHeaders: string[] = ["아이템 코드", "기능(공종)"]; + const requiredHeaders: string[] = ["자재 그룹", "기능(공종)"]; const alternativeHeaders = { - "아이템 코드": ["itemCode", "item_code"], + "자재 그룹": ["itemCode", "item_code"], "기능(공종)": ["workType"], "자재명": ["itemList"], "자재명(상세)": ["subItemList"] -- cgit v1.2.3