summaryrefslogtreecommitdiff
path: root/lib/material-groups
diff options
context:
space:
mode:
Diffstat (limited to 'lib/material-groups')
-rw-r--r--lib/material-groups/services.ts67
-rw-r--r--lib/material-groups/table/material-group-table-columns.tsx23
-rw-r--r--lib/material-groups/table/material-group-table.tsx16
-rw-r--r--lib/material-groups/validations.ts4
4 files changed, 74 insertions, 36 deletions
diff --git a/lib/material-groups/services.ts b/lib/material-groups/services.ts
index be683077..3ee9886d 100644
--- a/lib/material-groups/services.ts
+++ b/lib/material-groups/services.ts
@@ -3,10 +3,10 @@
import { and, asc, desc, ilike, or, sql, eq } from 'drizzle-orm';
import db from '@/db/db';
import { filterColumns } from "@/lib/filter-columns";
-import { materialSearchView } from "@/db/schema/items";
+import { MATERIAL_GROUP_MASTER } from "@/db/schema/MDG/mdg";
-// 자재그룹 뷰의 컬럼 타입 정의
-type MaterialGroupColumn = keyof typeof materialSearchView.$inferSelect;
+// 자재그룹 테이블의 컬럼 타입 정의
+type MaterialGroupColumn = keyof typeof MATERIAL_GROUP_MASTER.$inferSelect;
export interface GetMaterialGroupsInput {
page: number;
@@ -16,13 +16,16 @@ export interface GetMaterialGroupsInput {
id: MaterialGroupColumn;
desc: boolean;
}>;
- filters?: any[];
+ filters?: Array<{
+ id: string;
+ value: unknown;
+ }>;
joinOperator: 'and' | 'or';
}
/**
- * 자재그룹 목록을 조회합니다.
- * materialSearchView를 사용하여 MATKL(자재그룹코드)와 ATWTB(자재그룹 설명)의 고유한 조합을 조회
+ * 자재그룹 목록을 조회
+ * 자재그룹코드/자재그룹명/UOM 조회
*/
export async function getMaterialGroups(input: GetMaterialGroupsInput) {
const safePerPage = Math.min(input.perPage, 100);
@@ -32,8 +35,8 @@ export async function getMaterialGroups(input: GetMaterialGroupsInput) {
// 고급 필터링
const advancedWhere = filterColumns({
- table: materialSearchView,
- filters: (input.filters || []) as any,
+ table: MATERIAL_GROUP_MASTER,
+ filters: input.filters || [],
joinOperator: input.joinOperator,
});
@@ -42,8 +45,9 @@ export async function getMaterialGroups(input: GetMaterialGroupsInput) {
if (input.search) {
const s = `%${input.search}%`;
globalWhere = or(
- ilike(materialSearchView.materialGroupCode, s), // 자재그룹코드
- ilike(materialSearchView.materialGroupDesc, s), // 자재그룹명
+ ilike(MATERIAL_GROUP_MASTER.materialGroupCode, s), // 자재그룹코드
+ ilike(MATERIAL_GROUP_MASTER.materialGroupDescription, s), // 자재그룹명
+ ilike(MATERIAL_GROUP_MASTER.materialGroupUom, s), // UOM
);
}
@@ -52,19 +56,20 @@ export async function getMaterialGroups(input: GetMaterialGroupsInput) {
// 정렬 처리 - 타입 안전하게 처리
const orderBy = input.sort.length > 0
? input.sort.map((item) => {
- const column = materialSearchView[item.id];
+ const column = MATERIAL_GROUP_MASTER[item.id];
return item.desc ? desc(column) : asc(column);
})
- : [asc(materialSearchView.materialGroupCode)];
+ : [asc(MATERIAL_GROUP_MASTER.materialGroupCode)];
// 데이터 조회
const { data, total } = await db.transaction(async (tx) => {
const data = await tx
.select({
- materialGroupCode: materialSearchView.materialGroupCode,
- materialGroupDesc: materialSearchView.materialGroupDesc,
+ materialGroupCode: MATERIAL_GROUP_MASTER.materialGroupCode,
+ materialGroupDescription: MATERIAL_GROUP_MASTER.materialGroupDescription,
+ materialGroupUom: MATERIAL_GROUP_MASTER.materialGroupUom,
})
- .from(materialSearchView)
+ .from(MATERIAL_GROUP_MASTER)
.where(finalWhere)
.orderBy(...orderBy)
.offset(offset)
@@ -74,7 +79,7 @@ export async function getMaterialGroups(input: GetMaterialGroupsInput) {
.select({
count: sql<number>`count(*)`
})
- .from(materialSearchView)
+ .from(MATERIAL_GROUP_MASTER)
.where(finalWhere);
const total = Number(totalResult[0]?.count) || 0;
@@ -100,8 +105,8 @@ export async function getMaterialGroupsInfinite(input: GetMaterialGroupsInfinite
try {
// 고급 필터링
const advancedWhere = filterColumns({
- table: materialSearchView,
- filters: (input.filters || []) as any,
+ table: MATERIAL_GROUP_MASTER,
+ filters: input.filters || [],
joinOperator: input.joinOperator || "and",
});
@@ -110,8 +115,9 @@ export async function getMaterialGroupsInfinite(input: GetMaterialGroupsInfinite
if (input.search) {
const s = `%${input.search}%`;
globalWhere = or(
- ilike(materialSearchView.materialGroupCode, s),
- ilike(materialSearchView.materialGroupDesc, s),
+ ilike(MATERIAL_GROUP_MASTER.materialGroupCode, s),
+ ilike(MATERIAL_GROUP_MASTER.materialGroupDescription, s),
+ ilike(MATERIAL_GROUP_MASTER.materialGroupUom, s),
);
}
@@ -120,18 +126,19 @@ export async function getMaterialGroupsInfinite(input: GetMaterialGroupsInfinite
// 정렬 처리 - 타입 안전하게 처리
const orderBy = input.sort.length > 0
? input.sort.map((item) => {
- const column = materialSearchView[item.id];
+ const column = MATERIAL_GROUP_MASTER[item.id];
return item.desc ? desc(column) : asc(column);
})
- : [asc(materialSearchView.materialGroupCode)];
+ : [asc(MATERIAL_GROUP_MASTER.materialGroupCode)];
// 전체 데이터 조회 (클라이언트에서 가상화 처리)
const data = await db
.select({
- materialGroupCode: materialSearchView.materialGroupCode,
- materialGroupDesc: materialSearchView.materialGroupDesc,
+ materialGroupCode: MATERIAL_GROUP_MASTER.materialGroupCode,
+ materialGroupDescription: MATERIAL_GROUP_MASTER.materialGroupDescription,
+ materialGroupUom: MATERIAL_GROUP_MASTER.materialGroupUom,
})
- .from(materialSearchView)
+ .from(MATERIAL_GROUP_MASTER)
.where(finalWhere)
.orderBy(...orderBy);
@@ -148,9 +155,13 @@ export async function getMaterialGroupsInfinite(input: GetMaterialGroupsInfinite
export async function getMaterialGroupDetail(materialGroupCode: string) {
try {
const materialGroup = await db
- .select()
- .from(materialSearchView)
- .where(eq(materialSearchView.materialGroupCode, materialGroupCode))
+ .select({
+ materialGroupCode: MATERIAL_GROUP_MASTER.materialGroupCode,
+ materialGroupDescription: MATERIAL_GROUP_MASTER.materialGroupDescription,
+ materialGroupUom: MATERIAL_GROUP_MASTER.materialGroupUom,
+ })
+ .from(MATERIAL_GROUP_MASTER)
+ .where(eq(MATERIAL_GROUP_MASTER.materialGroupCode, materialGroupCode))
.limit(1);
return materialGroup.length > 0 ? materialGroup[0] : null;
diff --git a/lib/material-groups/table/material-group-table-columns.tsx b/lib/material-groups/table/material-group-table-columns.tsx
index 08e730e3..f41ed887 100644
--- a/lib/material-groups/table/material-group-table-columns.tsx
+++ b/lib/material-groups/table/material-group-table-columns.tsx
@@ -8,7 +8,8 @@ import { DataTableColumnHeaderSimple } from "@/components/data-table/data-table-
// MaterialGroup 타입 정의 (서비스에서 반환되는 타입과 일치)
type MaterialGroup = {
materialGroupCode: string | null;
- materialGroupDesc: string | null;
+ materialGroupDescription: string | null;
+ materialGroupUom?: string | null;
}
/**
@@ -36,12 +37,12 @@ export function getColumns(): ColumnDef<MaterialGroup>[] {
enableHiding: false,
},
{
- accessorKey: "materialGroupDesc",
+ accessorKey: "materialGroupDescription",
header: ({ column }) => (
<DataTableColumnHeaderSimple column={column} title="자재그룹명" />
),
cell: ({ row }) => {
- const value = row.getValue("materialGroupDesc") as string | null
+ const value = row.getValue("materialGroupDescription") as string | null
return (
<div className="max-w-[400px] truncate">
{value || "-"}
@@ -51,6 +52,22 @@ export function getColumns(): ColumnDef<MaterialGroup>[] {
enableSorting: true,
enableHiding: false,
},
+ {
+ accessorKey: "materialGroupUom",
+ header: ({ column }) => (
+ <DataTableColumnHeaderSimple column={column} title="UOM" />
+ ),
+ cell: ({ row }) => {
+ const value = row.getValue("materialGroupUom") as string | null
+ return (
+ <div className="max-w-[80px] truncate">
+ {value || "-"}
+ </div>
+ )
+ },
+ enableSorting: true,
+ enableHiding: false,
+ },
]
// ----------------------------------------------------------------
diff --git a/lib/material-groups/table/material-group-table.tsx b/lib/material-groups/table/material-group-table.tsx
index 766b5054..a5617e9b 100644
--- a/lib/material-groups/table/material-group-table.tsx
+++ b/lib/material-groups/table/material-group-table.tsx
@@ -20,7 +20,8 @@ import { ViewModeToggle } from "@/components/data-table/view-mode-toggle"
// MaterialGroup 타입 정의 (서비스에서 반환되는 타입과 일치)
type MaterialGroup = {
materialGroupCode: string | null;
- materialGroupDesc: string | null;
+ materialGroupDescription: string | null;
+ materialGroupUom?: string | null;
}
interface MaterialGroupTableProps {
@@ -50,9 +51,13 @@ export function MaterialGroupTable({ promises }: MaterialGroupTableProps) {
label: "자재그룹코드",
},
{
- id: "materialGroupDesc",
+ id: "materialGroupDescription",
label: "자재그룹명",
},
+ {
+ id: "materialGroupUom",
+ label: "UOM",
+ },
]
const advancedFilterFields: DataTableAdvancedFilterField<MaterialGroup>[] = [
@@ -62,10 +67,15 @@ export function MaterialGroupTable({ promises }: MaterialGroupTableProps) {
type: "text",
},
{
- id: "materialGroupDesc",
+ id: "materialGroupDescription",
label: "자재그룹명",
type: "text",
},
+ {
+ id: "materialGroupUom",
+ label: "UOM",
+ type: "text",
+ },
]
// 확장된 useDataTable 훅 사용 (pageSize 기반 자동 전환)
diff --git a/lib/material-groups/validations.ts b/lib/material-groups/validations.ts
index c379c833..f2acfaee 100644
--- a/lib/material-groups/validations.ts
+++ b/lib/material-groups/validations.ts
@@ -8,7 +8,7 @@ import {
import * as z from "zod"
import { getFiltersStateParser, getSortingStateParser } from "@/lib/parsers"
-import { materialSearchView } from "@/db/schema/items"
+import { MATERIAL_GROUP_MASTER } from "@/db/schema/MDG/mdg"
// MaterialGroup 검색 파라미터 캐시 정의
export const searchParamsCache = createSearchParamsCache({
@@ -17,7 +17,7 @@ export const searchParamsCache = createSearchParamsCache({
perPage: parseAsInteger.withDefault(10),
// 확장된 타입으로 정렬 파서 사용
- sort: getSortingStateParser<typeof materialSearchView>().withDefault([
+ sort: getSortingStateParser<typeof MATERIAL_GROUP_MASTER>().withDefault([
{ id: "materialGroupCode", desc: false },
]),