import { relations } from "drizzle-orm"; import { pgTable, varchar, text, timestamp ,serial, integer, pgEnum} from "drizzle-orm/pg-core" // 자재 아이템 정보 테이블 (items) - 기존 CMCTB_MAT_CLAS 테이블 매핑 (SOAP 연결 시 컬럼이 추가/삭제될 수 있음) export const items = pgTable("items", { id: serial("id").primaryKey(), // 고유 식별자 (신규 추가) ProjectNo: varchar("project_no", { length: 100 }).notNull(), // CLAS_CD - 아이템 코드 (자재 클래스 코드) itemCode: varchar("item_code", { length: 100 }).unique(), // CLAS_CD - 아이템 코드 (자재 클래스 코드) itemName: varchar("item_name", { length: 255 }).notNull(), // CLAS_NM - 아이템명 (자재 클래스명) packageCode: varchar("package_code", { length: 255 }).notNull(), // CLAS_NM - 아이템명 (자재 클래스명) smCode: varchar("sm_code", { length: 255 }), // CLAS_NM - 아이템명 (자재 클래스명) description: text("description"), // CLAS_DTL - 아이템 상세 설명 (클래스 내역) parentItemCode: varchar("parent_item_code", { length: 18 }), // PRNT_CLAS_CD - 부모 아이템 코드 (부모 클래스 코드) itemLevel: integer("item_level"), // CLAS_LVL - 아이템 레벨 (클래스 레벨) deleteFlag: varchar("delete_flag", { length: 1 }), // DEL_ORDR - 삭제 지시자 (Y/N) unitOfMeasure: varchar("unit_of_measure", { length: 3 }), // UOM - 단위 (UOM) steelType: varchar("steel_type", { length: 2 }), // STYPE - 강종 (Steel Type) gradeMaterial: varchar("grade_material", { length: 50 }), // GRD_MATL - 등급 재질 (Grade Material) changeDate: varchar("change_date", { length: 8 }), // CHG_DT - 수정일자 (YYYYMMDD) baseUnitOfMeasure: varchar("base_unit_of_measure", { length: 3 }), // BSE_UOM - 기준 단위 (Base UOM) createdAt: timestamp("created_at").defaultNow().notNull(), // 생성일시 (신규 추가) updatedAt: timestamp("updated_at").defaultNow().notNull(), // 수정일시 (신규 추가) }); export const materials = pgTable("materials", { id: serial("id").primaryKey(), // 고유 식별자 (신규 추가) itemCode: varchar("item_code", { length: 100 }).unique(), // CLAS_CD - 아이템 코드 (자재 클래스 코드) itemName: varchar("item_name", { length: 255 }).notNull(), // CLAS_NM - 아이템명 (자재 클래스명) description: text("description"), // CLAS_DTL - 아이템 상세 설명 (클래스 내역) parentItemCode: varchar("parent_item_code", { length: 18 }), // PRNT_CLAS_CD - 부모 아이템 코드 (부모 클래스 코드) itemLevel: integer("item_level"), // CLAS_LVL - 아이템 레벨 (클래스 레벨) deleteFlag: varchar("delete_flag", { length: 1 }), // DEL_ORDR - 삭제 지시자 (Y/N) unitOfMeasure: varchar("unit_of_measure", { length: 3 }), // UOM - 단위 (UOM) steelType: varchar("steel_type", { length: 2 }), // STYPE - 강종 (Steel Type) gradeMaterial: varchar("grade_material", { length: 50 }), // GRD_MATL - 등급 재질 (Grade Material) changeDate: varchar("change_date", { length: 8 }), // CHG_DT - 수정일자 (YYYYMMDD) baseUnitOfMeasure: varchar("base_unit_of_measure", { length: 3 }), // BSE_UOM - 기준 단위 (Base UOM) createdAt: timestamp("created_at").defaultNow().notNull(), // 생성일시 (신규 추가) updatedAt: timestamp("updated_at").defaultNow().notNull(), // 수정일시 (신규 추가) }); export type Item = typeof items.$inferSelect export type Materials = typeof materials.$inferSelect export const itemsRelations = relations(items, ({ many }) => ({ shipbuilding: many(itemShipbuilding), })); // 조선 기능(공종) 유형 enum 정의 export const workTypeEnum = pgEnum('work_type', ['기장', '전장', '선실', '배관', '철의']); // 해양 TOP 기능(공종) 유형 enum 정의 export const offshoreTopWorkTypeEnum = pgEnum('offshore_top_work_type', ['TM', 'TS', 'TE', 'TP']); // 해양 HULL 기능(공종) 유형 enum 정의 export const offshoreHullWorkTypeEnum = pgEnum('offshore_hull_work_type', ['HA', 'HE', 'HH', 'HM', 'NC']); //조선 아이템 테이블 //아이템코드(:자재그룹코드), 아이템이름(:아이템리스트), 공종(:workType), 선종, createdAt(:생성일), updatedAt(:수정일) export const itemShipbuilding = pgTable("item_shipbuilding", { id: serial("id").primaryKey(), itemCode: varchar("item_code", { length: 100 }).notNull().references(() => items.itemCode, { onDelete: 'cascade' }), workType: workTypeEnum("work_type").notNull(), itemList: text("item_list"), shipTypes: text("ship_types").notNull().default('OPTION'), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), }); //조선 아이템 관계 정의 export const itemShipbuildingRelations = relations(itemShipbuilding, ({ one }) => ({ item: one(items, { fields: [itemShipbuilding.itemCode], references: [items.itemCode], }), })); export type ItemShipbuilding = typeof itemShipbuilding.$inferSelect; export type ItemWithShipbuilding = Item & ItemShipbuilding; //해양 TOP 아이템 테이블 export const itemOffshoreTop = pgTable("item_offshore_top", { id: serial("id").primaryKey(), itemCode: varchar("item_code", { length: 100 }).notNull().references(() => items.itemCode, { onDelete: 'cascade' }), workType: offshoreTopWorkTypeEnum("work_type").notNull(), itemList: text("item_list"), subItemList: text("sub_item_list"), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), }); //해양 HULL 아이템 테이블 export const itemOffshoreHull = pgTable("item_offshore_hull", { id: serial("id").primaryKey(), itemCode: varchar("item_code", { length: 100 }).notNull().references(() => items.itemCode, { onDelete: 'cascade' }), workType: offshoreHullWorkTypeEnum("work_type").notNull(), itemList: text("item_list"), subItemList: text("sub_item_list"), createdAt: timestamp("created_at").defaultNow().notNull(), updatedAt: timestamp("updated_at").defaultNow().notNull(), }); //해양 TOP 아이템 관계 정의 export const itemOffshoreTopRelations = relations(itemOffshoreTop, ({ one }) => ({ item: one(items, { fields: [itemOffshoreTop.itemCode], references: [items.itemCode], }), })); //해양 HULL 아이템 관계 정의 export const itemOffshoreHullRelations = relations(itemOffshoreHull, ({ one }) => ({ item: one(items, { fields: [itemOffshoreHull.itemCode], references: [items.itemCode], }), })); export type ItemOffshoreTop = typeof itemOffshoreTop.$inferSelect; export type ItemOffshoreHull = typeof itemOffshoreHull.$inferSelect; export type ItemWithOffshoreTop = Item & ItemOffshoreTop; export type ItemWithOffshoreHull = Item & ItemOffshoreHull; //각 테이블별 컬럼 변경(itemid -> itemCode)