summaryrefslogtreecommitdiff
path: root/lib/items-tech/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/items-tech/service.ts')
-rw-r--r--lib/items-tech/service.ts317
1 files changed, 99 insertions, 218 deletions
diff --git a/lib/items-tech/service.ts b/lib/items-tech/service.ts
index 97aacfba..02a5a901 100644
--- a/lib/items-tech/service.ts
+++ b/lib/items-tech/service.ts
@@ -11,7 +11,7 @@ import { getErrorMessage } from "@/lib/handle-error";
import { asc, desc, ilike, and, or, eq, count, inArray, sql } from "drizzle-orm";
import { GetItemsSchema, UpdateItemSchema, ShipbuildingItemCreateData, TypedItemCreateData, OffshoreTopItemCreateData, OffshoreHullItemCreateData } from "./validations";
import { Item, items, itemShipbuilding, itemOffshoreTop, itemOffshoreHull } from "@/db/schema/items";
-import { findAllItems, insertItem, updateItem } from "./repository";
+import { findAllItems } from "./repository";
/* -----------------------------------------------------
1) 조회 관련
@@ -65,6 +65,7 @@ export async function getShipbuildingItems(input: GetItemsSchema) {
itemId: itemShipbuilding.itemId,
workType: itemShipbuilding.workType,
shipTypes: itemShipbuilding.shipTypes,
+ itemList: itemShipbuilding.itemList,
itemCode: items.itemCode,
itemName: items.itemName,
description: items.description,
@@ -144,10 +145,8 @@ export async function getOffshoreTopItems(input: GetItemsSchema) {
id: itemOffshoreTop.id,
itemId: itemOffshoreTop.itemId,
workType: itemOffshoreTop.workType,
- itemList1: itemOffshoreTop.itemList1,
- itemList2: itemOffshoreTop.itemList2,
- itemList3: itemOffshoreTop.itemList3,
- itemList4: itemOffshoreTop.itemList4,
+ itemList: itemOffshoreTop.itemList,
+ subItemList: itemOffshoreTop.subItemList,
itemCode: items.itemCode,
itemName: items.itemName,
description: items.description,
@@ -227,10 +226,8 @@ export async function getOffshoreHullItems(input: GetItemsSchema) {
id: itemOffshoreHull.id,
itemId: itemOffshoreHull.itemId,
workType: itemOffshoreHull.workType,
- itemList1: itemOffshoreHull.itemList1,
- itemList2: itemOffshoreHull.itemList2,
- itemList3: itemOffshoreHull.itemList3,
- itemList4: itemOffshoreHull.itemList4,
+ itemList: itemOffshoreHull.itemList,
+ subItemList: itemOffshoreHull.subItemList,
itemCode: items.itemCode,
itemName: items.itemName,
description: items.description,
@@ -279,14 +276,20 @@ export async function createShipbuildingItem(input: TypedItemCreateData) {
unstable_noStore()
try {
- if (!input.itemCode || !input.itemName) {
+ if (!input.itemCode) {
return {
success: false,
- message: "아이템 코드와 아이템 명은 필수입니다",
+ message: "아이템 코드는 필수입니다",
data: null,
error: "필수 필드 누락"
}
}
+
+ // itemName이 없으면 "기술영업"으로 설정
+ if (!input.itemName) {
+ input.itemName = "기술영업"
+ }
+
const result = await db.transaction(async (tx) => {
// 1. itemCode 정규화해서 직접 쿼리
const existRows = await tx.select().from(items)
@@ -294,15 +297,12 @@ export async function createShipbuildingItem(input: TypedItemCreateData) {
const existingItem = existRows[0];
let itemId: number;
- let itemResult;
+ let itemResult: any;
if (existingItem) {
- // 이미 있으면 업데이트
- itemResult = await updateItem(tx, existingItem.id, {
- itemName: input.itemName,
- description: input.description,
- });
+ // 기존 아이템이 있으면 업데이트하지 않고 그대로 사용
itemId = existingItem.id;
+ itemResult = [existingItem]; // 배열 형태로 반환
} else {
// 없으면 새로 생성
// 현재 가장 큰 ID 값 가져오기
@@ -326,6 +326,7 @@ export async function createShipbuildingItem(input: TypedItemCreateData) {
itemId: itemId,
workType: shipData.workType ? (shipData.workType as '기장' | '전장' | '선실' | '배관' | '철의') : '기장',
shipTypes: shipData.shipTypes || '',
+ itemList: shipData.itemList || null,
createdAt: new Date(),
updatedAt: new Date()
}).returning();
@@ -370,20 +371,27 @@ export async function createShipbuildingImportItem(input: {
itemName: string;
workType: '기장' | '전장' | '선실' | '배관' | '철의';
description?: string | null;
+ itemList?: string | null;
shipTypes: Record<string, boolean>;
}) {
unstable_noStore();
try {
- if (!input.itemCode || !input.itemName) {
+ if (!input.itemCode) {
return {
success: false,
- message: "아이템 코드와 아이템 명은 필수입니다",
+ message: "아이템 코드는 필수입니다",
data: null,
error: "필수 필드 누락"
}
}
+
+ // itemName이 없을 경우 "기술영업"으로 설정
+ if (!input.itemName) {
+ input.itemName = "기술영업";
+ }
+
const results = await db.transaction(async (tx) => {
// 1. itemCode 정규화해서 직접 쿼리
const existRows = await tx.select().from(items)
@@ -395,13 +403,9 @@ export async function createShipbuildingImportItem(input: {
let itemId: number;
if (existingItem) {
- // 이미 있으면 업데이트
- await updateItem(tx, existingItem.id, {
- itemName: input.itemName,
- description: input.description,
- });
+ // 기존 아이템이 있으면 업데이트하지 않고 그대로 사용
itemId = existingItem.id;
- console.log('기존 아이템 업데이트, id:', itemId);
+ console.log('기존 아이템 사용, id:', itemId);
} else {
// 없으면 새로 생성
// 현재 가장 큰 ID 값 가져오기
@@ -437,6 +441,7 @@ export async function createShipbuildingImportItem(input: {
itemId: itemId,
workType: input.workType,
shipTypes: shipType,
+ itemList: input.itemList || null,
createdAt: new Date(),
updatedAt: new Date()
}).returning();
@@ -473,14 +478,19 @@ export async function createOffshoreTopItem(data: OffshoreTopItemCreateData) {
unstable_noStore()
try {
- if (!data.itemCode || !data.itemName) {
+ if (!data.itemCode) {
return {
success: false,
- message: "아이템 코드와 아이템 명은 필수입니다",
+ message: "아이템 코드는 필수입니다",
data: null,
error: "필수 필드 누락"
}
}
+
+ // itemName이 없으면 "기술영업"으로 설정
+ if (!data.itemName) {
+ data.itemName = "기술영업"
+ }
// 트랜잭션 내에서 처리
const result = await db.transaction(async (tx) => {
@@ -490,15 +500,12 @@ export async function createOffshoreTopItem(data: OffshoreTopItemCreateData) {
const existingItem = existRows[0];
let itemId: number;
- let itemResult;
+ let itemResult: any;
if (existingItem) {
- // 이미 있으면 업데이트
- itemResult = await updateItem(tx, existingItem.id, {
- itemName: data.itemName,
- description: data.description,
- });
+ // 기존 아이템이 있으면 업데이트하지 않고 그대로 사용
itemId = existingItem.id;
+ itemResult = [existingItem]; // 배열 형태로 반환
} else {
// 없으면 새로 생성
// 현재 가장 큰 ID 값 가져오기
@@ -522,10 +529,8 @@ export async function createOffshoreTopItem(data: OffshoreTopItemCreateData) {
.values({
itemId: itemId,
workType: data.workType,
- itemList1: data.itemList1 || null,
- itemList2: data.itemList2 || null,
- itemList3: data.itemList3 || null,
- itemList4: data.itemList4 || null,
+ itemList: data.itemList,
+ subItemList: data.subItemList,
createdAt: new Date(),
updatedAt: new Date()
})
@@ -566,14 +571,19 @@ export async function createOffshoreHullItem(data: OffshoreHullItemCreateData) {
unstable_noStore()
try {
- if (!data.itemCode || !data.itemName) {
+ if (!data.itemCode) {
return {
success: false,
- message: "아이템 코드와 아이템 명은 필수입니다",
+ message: "아이템 코드는 필수입니다",
data: null,
error: "필수 필드 누락"
}
}
+
+ // itemName이 없으면 "기술영업"으로 설정
+ if (!data.itemName) {
+ data.itemName = "기술영업"
+ }
// 트랜잭션 내에서 처리
const result = await db.transaction(async (tx) => {
@@ -583,15 +593,12 @@ export async function createOffshoreHullItem(data: OffshoreHullItemCreateData) {
const existingItem = existRows[0];
let itemId: number;
- let itemResult;
+ let itemResult: any;
if (existingItem) {
- // 이미 있으면 업데이트
- itemResult = await updateItem(tx, existingItem.id, {
- itemName: data.itemName,
- description: data.description,
- });
+ // 기존 아이템이 있으면 업데이트하지 않고 그대로 사용
itemId = existingItem.id;
+ itemResult = [existingItem]; // 배열 형태로 반환
} else {
// 없으면 새로 생성
// 현재 가장 큰 ID 값 가져오기
@@ -615,10 +622,8 @@ export async function createOffshoreHullItem(data: OffshoreHullItemCreateData) {
.values({
itemId: itemId,
workType: data.workType,
- itemList1: data.itemList1 || null,
- itemList2: data.itemList2 || null,
- itemList3: data.itemList3 || null,
- itemList4: data.itemList4 || null,
+ itemList: data.itemList,
+ subItemList: data.subItemList,
createdAt: new Date(),
updatedAt: new Date()
})
@@ -664,6 +669,7 @@ interface UpdateShipbuildingItemInput extends UpdateItemSchema {
id: number;
workType?: string;
shipTypes?: string;
+ itemList?: string;
itemCode?: string;
itemName?: string;
description?: string;
@@ -686,58 +692,25 @@ export async function modifyShipbuildingItem(input: UpdateShipbuildingItemInput)
throw new Error("아이템을 찾을 수 없습니다.");
}
- const existingItem = existingShipbuilding.item;
+ // 세부 아이템 테이블만 업데이트 (items 테이블은 변경하지 않음)
+ const updateData: Record<string, unknown> = {};
- // 아이템 테이블 정보가 변경되었는지 확인
- const isItemChanged =
- (input.itemCode && input.itemCode !== existingItem.itemCode) ||
- (input.itemName && input.itemName !== existingItem.itemName) ||
- (input.description !== undefined && input.description !== existingItem.description);
+ if (input.workType) updateData.workType = input.workType as '기장' | '전장' | '선실' | '배관' | '철의';
+ if (input.shipTypes) updateData.shipTypes = input.shipTypes;
+ if (input.itemList !== undefined) updateData.itemList = input.itemList;
- // 세부 아이템 정보만 변경된 경우
- if (!isItemChanged) {
- // 조선 아이템 테이블 업데이트
- if (input.workType || input.shipTypes) {
- await tx.update(itemShipbuilding)
- .set({
- workType: input.workType as '기장' | '전장' | '선실' | '배관' | '철의',
- shipTypes: input.shipTypes
- })
- .where(eq(itemShipbuilding.id, input.id));
- }
-
- return {
- data: { id: input.id },
- error: null,
- success: true,
- message: "아이템이 성공적으로 업데이트되었습니다."
- };
- }
- // 아이템 테이블 정보가 변경된 경우 - 새 아이템 생성하고 세부 아이템 연결
- else {
- // 새 아이템 생성
- const [newItem] = await insertItem(tx, {
- itemCode: input.itemCode || existingItem.itemCode,
- itemName: input.itemName || existingItem.itemName,
- description: input.description !== undefined ? input.description : existingItem.description,
- });
-
- // 세부 아이템 테이블 정보를 새 아이템에 연결
+ if (Object.keys(updateData).length > 0) {
await tx.update(itemShipbuilding)
- .set({
- itemId: newItem.id,
- workType: input.workType ? (input.workType as '기장' | '전장' | '선실' | '배관' | '철의') : existingShipbuilding.workType,
- shipTypes: input.shipTypes || existingShipbuilding.shipTypes
- })
+ .set(updateData)
.where(eq(itemShipbuilding.id, input.id));
-
- return {
- data: { id: input.id },
- error: null,
- success: true,
- message: "새 아이템이 생성되고 세부 정보가 업데이트되었습니다."
- };
}
+
+ return {
+ data: { id: input.id },
+ error: null,
+ success: true,
+ message: "아이템이 성공적으로 업데이트되었습니다."
+ };
});
// 캐시 무효화
@@ -758,10 +731,8 @@ export async function modifyShipbuildingItem(input: UpdateShipbuildingItemInput)
interface UpdateOffshoreTopItemInput extends UpdateItemSchema {
id: number;
workType?: string;
- itemList1?: string;
- itemList2?: string;
- itemList3?: string;
- itemList4?: string;
+ itemList?: string;
+ subItemList?: string;
itemCode?: string;
itemName?: string;
description?: string;
@@ -784,69 +755,25 @@ export async function modifyOffshoreTopItem(input: UpdateOffshoreTopItemInput) {
throw new Error("아이템을 찾을 수 없습니다.");
}
- const existingItem = existingOffshoreTop.item;
+ // 세부 아이템 테이블만 업데이트 (items 테이블은 변경하지 않음)
+ const updateData: Record<string, unknown> = {};
- // 아이템 테이블 정보가 변경되었는지 확인
- const isItemChanged =
- (input.itemCode && input.itemCode !== existingItem.itemCode) ||
- (input.itemName && input.itemName !== existingItem.itemName) ||
- (input.description !== undefined && input.description !== existingItem.description);
+ if (input.workType) updateData.workType = input.workType as 'TM' | 'TS' | 'TE' | 'TP';
+ if (input.itemList !== undefined) updateData.itemList = input.itemList;
+ if (input.subItemList !== undefined) updateData.subItemList = input.subItemList;
- // 세부 아이템 정보만 변경된 경우
- if (!isItemChanged) {
- // Offshore TOP 아이템 테이블 업데이트
- const updateData: Record<string, unknown> = {};
-
- if (input.workType) updateData.workType = input.workType as 'TM' | 'TS' | 'TE' | 'TP';
- if (input.itemList1 !== undefined) updateData.itemList1 = input.itemList1;
- if (input.itemList2 !== undefined) updateData.itemList2 = input.itemList2;
- if (input.itemList3 !== undefined) updateData.itemList3 = input.itemList3;
- if (input.itemList4 !== undefined) updateData.itemList4 = input.itemList4;
-
- if (Object.keys(updateData).length > 0) {
- await tx.update(itemOffshoreTop)
- .set(updateData)
- .where(eq(itemOffshoreTop.id, input.id));
- }
-
- return {
- data: { id: input.id },
- error: null,
- success: true,
- message: "아이템이 성공적으로 업데이트되었습니다."
- };
- }
- // 아이템 테이블 정보가 변경된 경우 - 새 아이템 생성하고 세부 아이템 연결
- else {
- // 새 아이템 생성
- const [newItem] = await insertItem(tx, {
- itemCode: input.itemCode || existingItem.itemCode,
- itemName: input.itemName || existingItem.itemName,
- description: input.description !== undefined ? input.description : existingItem.description,
- });
-
- // 세부 아이템 테이블 정보를 새 아이템에 연결
- const updateData: Record<string, unknown> = {
- itemId: newItem.id
- };
-
- if (input.workType) updateData.workType = input.workType as 'TM' | 'TS' | 'TE' | 'TP';
- if (input.itemList1 !== undefined) updateData.itemList1 = input.itemList1;
- if (input.itemList2 !== undefined) updateData.itemList2 = input.itemList2;
- if (input.itemList3 !== undefined) updateData.itemList3 = input.itemList3;
- if (input.itemList4 !== undefined) updateData.itemList4 = input.itemList4;
-
+ if (Object.keys(updateData).length > 0) {
await tx.update(itemOffshoreTop)
.set(updateData)
.where(eq(itemOffshoreTop.id, input.id));
-
- return {
- data: { id: input.id },
- error: null,
- success: true,
- message: "새 아이템이 생성되고 세부 정보가 업데이트되었습니다."
- };
}
+
+ return {
+ data: { id: input.id },
+ error: null,
+ success: true,
+ message: "아이템이 성공적으로 업데이트되었습니다."
+ };
});
// 캐시 무효화
@@ -867,10 +794,8 @@ export async function modifyOffshoreTopItem(input: UpdateOffshoreTopItemInput) {
interface UpdateOffshoreHullItemInput extends UpdateItemSchema {
id: number;
workType?: string;
- itemList1?: string;
- itemList2?: string;
- itemList3?: string;
- itemList4?: string;
+ itemList?: string;
+ subItemList?: string;
itemCode?: string;
itemName?: string;
description?: string;
@@ -893,69 +818,25 @@ export async function modifyOffshoreHullItem(input: UpdateOffshoreHullItemInput)
throw new Error("아이템을 찾을 수 없습니다.");
}
- const existingItem = existingOffshoreHull.item;
+ // 세부 아이템 테이블만 업데이트 (items 테이블은 변경하지 않음)
+ const updateData: Record<string, unknown> = {};
- // 아이템 테이블 정보가 변경되었는지 확인
- const isItemChanged =
- (input.itemCode && input.itemCode !== existingItem.itemCode) ||
- (input.itemName && input.itemName !== existingItem.itemName) ||
- (input.description !== undefined && input.description !== existingItem.description);
+ if (input.workType) updateData.workType = input.workType as 'HA' | 'HE' | 'HH' | 'HM' | 'NC';
+ if (input.itemList !== undefined) updateData.itemList = input.itemList;
+ if (input.subItemList !== undefined) updateData.subItemList = input.subItemList;
- // 세부 아이템 정보만 변경된 경우
- if (!isItemChanged) {
- // Offshore HULL 아이템 테이블 업데이트
- const updateData: Record<string, unknown> = {};
-
- if (input.workType) updateData.workType = input.workType as 'HA' | 'HE' | 'HH' | 'HM' | 'NC';
- if (input.itemList1 !== undefined) updateData.itemList1 = input.itemList1;
- if (input.itemList2 !== undefined) updateData.itemList2 = input.itemList2;
- if (input.itemList3 !== undefined) updateData.itemList3 = input.itemList3;
- if (input.itemList4 !== undefined) updateData.itemList4 = input.itemList4;
-
- if (Object.keys(updateData).length > 0) {
- await tx.update(itemOffshoreHull)
- .set(updateData)
- .where(eq(itemOffshoreHull.id, input.id));
- }
-
- return {
- data: { id: input.id },
- error: null,
- success: true,
- message: "아이템이 성공적으로 업데이트되었습니다."
- };
- }
- // 아이템 테이블 정보가 변경된 경우 - 새 아이템 생성하고 세부 아이템 연결
- else {
- // 새 아이템 생성
- const [newItem] = await insertItem(tx, {
- itemCode: input.itemCode || existingItem.itemCode,
- itemName: input.itemName || existingItem.itemName,
- description: input.description !== undefined ? input.description : existingItem.description,
- });
-
- // 세부 아이템 테이블 정보를 새 아이템에 연결
- const updateData: Record<string, unknown> = {
- itemId: newItem.id
- };
-
- if (input.workType) updateData.workType = input.workType as 'HA' | 'HE' | 'HH' | 'HM' | 'NC';
- if (input.itemList1 !== undefined) updateData.itemList1 = input.itemList1;
- if (input.itemList2 !== undefined) updateData.itemList2 = input.itemList2;
- if (input.itemList3 !== undefined) updateData.itemList3 = input.itemList3;
- if (input.itemList4 !== undefined) updateData.itemList4 = input.itemList4;
-
+ if (Object.keys(updateData).length > 0) {
await tx.update(itemOffshoreHull)
.set(updateData)
.where(eq(itemOffshoreHull.id, input.id));
-
- return {
- data: { id: input.id },
- error: null,
- success: true,
- message: "새 아이템이 생성되고 세부 정보가 업데이트되었습니다."
- };
}
+
+ return {
+ data: { id: input.id },
+ error: null,
+ success: true,
+ message: "아이템이 성공적으로 업데이트되었습니다."
+ };
});
// 캐시 무효화