summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-09-17 18:04:10 +0900
committerjoonhoekim <26rote@gmail.com>2025-09-17 18:04:10 +0900
commit7433eea5b4bbc0899e255b88e1a7e91f26e9d95b (patch)
treecad02c119fd41545e24a98734488962c78ed895d /app
parent6c11fccc84f4c84fa72ee01f9caad9f76f35cea2 (diff)
(김준회) 자재그룹 선택기 오류수정, 공용사용을 위한 다이얼로그 컴포넌트 구현, data-table 오류 수정
Diffstat (limited to 'app')
-rw-r--r--app/[lng]/evcp/(evcp)/material-groups/page.tsx8
-rw-r--r--app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART/route.ts49
2 files changed, 8 insertions, 49 deletions
diff --git a/app/[lng]/evcp/(evcp)/material-groups/page.tsx b/app/[lng]/evcp/(evcp)/material-groups/page.tsx
index 468e3412..3d019182 100644
--- a/app/[lng]/evcp/(evcp)/material-groups/page.tsx
+++ b/app/[lng]/evcp/(evcp)/material-groups/page.tsx
@@ -1,6 +1,6 @@
/**
* 자재그룹 테이블
- * materialSearchView를 사용하여 MDG 자재마스터의 고유한 자재그룹 조회
+ * MATERIAL_GROUP_MASTER 테이블을 직접 사용하여 MDG 자재마스터의 자재그룹 조회
* 수정/추가 기능은 불필요 (읽기 전용)
*/
@@ -63,10 +63,10 @@ export default async function MaterialGroupPage(props: MaterialGroupPageProps) {
<React.Suspense
fallback={
<DataTableSkeleton
- columnCount={2}
+ columnCount={3}
searchableColumnCount={1}
- filterableColumnCount={2}
- cellWidths={["15rem", "25rem"]}
+ filterableColumnCount={3}
+ cellWidths={["15rem", "25rem", "10rem"]}
shrinkZero
/>
}
diff --git a/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART/route.ts b/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART/route.ts
index 80bc85d3..cea8d40b 100644
--- a/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART/route.ts
+++ b/app/api/(S-ERP)/(MDG)/IF_MDZ_EVCP_MATERIAL_MASTER_PART/route.ts
@@ -6,8 +6,7 @@ import {
MATERIAL_MASTER_PART_MATL_PLNT,
MATERIAL_MASTER_PART_MATL_UNIT,
MATERIAL_MASTER_PART_MATL_CLASSASGN,
- MATERIAL_MASTER_PART_MATL_CHARASGN,
- MATERIAL_GROUP_MASTER
+ MATERIAL_MASTER_PART_MATL_CHARASGN
} from "@/db/schema/MDG/mdg";
import {
@@ -33,7 +32,6 @@ type MatlPlntData = typeof MATERIAL_MASTER_PART_MATL_PLNT.$inferInsert;
type MatlUnitData = typeof MATERIAL_MASTER_PART_MATL_UNIT.$inferInsert;
type MatlClassAsgnData = typeof MATERIAL_MASTER_PART_MATL_CLASSASGN.$inferInsert;
type MatlCharAsgnData = typeof MATERIAL_MASTER_PART_MATL_CHARASGN.$inferInsert;
-type MaterialGroupData = typeof MATERIAL_GROUP_MASTER.$inferInsert;
// XML에서 받는 데이터 구조 (스키마와 동일한 구조, string 타입)
type MatlXML = ToXMLFields<Omit<MatlData, 'id' | 'createdAt' | 'updatedAt'>> & {
@@ -58,7 +56,6 @@ interface ProcessedMaterialData {
units: MatlUnitData[];
classAssignments: MatlClassAsgnData[];
characteristicAssignments: MatlCharAsgnData[];
- materialGroup?: MaterialGroupData; // 자재그룹코드 데이터 (옵셔널)
}
export async function GET(request: NextRequest) {
@@ -141,12 +138,6 @@ export async function POST(request: NextRequest) {
* - 별도 필수 필드 없음 (스키마에서 notNull() 제거 예정)
* - 전체 데이터셋 기반 삭제 후 재삽입 처리
*
- * 3. 자재그룹코드 마스터 (MATERIAL_GROUP_MASTER) - 신규 추가
- * - MATKL(자재그룹코드), MAKTX(자재그룹명) 분리 저장
- * - MATKL이 unique 필드로 충돌 시 upsert 처리
- * - DESC 테이블에서 SPRAS='E'인 MAKTX만 매칭
- * - 중복 제거를 통한 성능 최적화
- *
* XML 패턴:
* - MATERIAL 인터페이스는 XML에 MATNR이 이미 포함된 패턴
* - 하위 테이블에도 MATNR 필드가 있어서 XML 값 우선 사용됨
@@ -200,29 +191,13 @@ function transformMatlData(matlData: MatlXML[]): ProcessedMaterialData[] {
fkData
);
- // 3단계: 자재그룹코드 마스터 데이터 생성 (MATKL 존재 시)
- let materialGroup: MaterialGroupData | undefined;
-
- if (material.MATKL) {
- // DESC 테이블에서 SPRAS='E'인 MAKTX 찾기
- const englishDescription = descriptions.find(desc => desc.SPRAS === 'E');
-
- if (englishDescription && englishDescription.MAKTX) {
- materialGroup = {
- MATKL: material.MATKL,
- MAKTX: englishDescription.MAKTX
- };
- }
- }
-
return {
material,
descriptions,
plants,
units,
classAssignments,
- characteristicAssignments,
- materialGroup
+ characteristicAssignments
};
});
}
@@ -233,10 +208,7 @@ function transformMatlData(matlData: MatlXML[]): ProcessedMaterialData[] {
*
* 저장 전략:
* 1. 최상위 테이블: MATNR 기준 upsert (충돌 시 업데이트)
- * 2. 자재그룹코드 마스터: MATKL 기준 upsert (충돌 시 업데이트)
- * - 중복된 MATKL 제거하여 성능 최적화
- * - 영어(SPRAS='E') DESC만 처리
- * 3. 하위 테이블들: FK(MATNR) 기준 전체 삭제 후 재삽입
+ * 2. 하위 테이블들: FK(MATNR) 기준 전체 삭제 후 재삽입
* - 송신 XML이 전체 데이터셋을 포함하므로 부분 업데이트 불필요
* - 데이터 일관성과 단순성 확보
*
@@ -260,24 +232,11 @@ async function saveToDatabase(processedMaterials: ProcessedMaterialData[]) {
const classAssignments = processedMaterials.flatMap((m) => m.classAssignments);
const characteristicAssignments = processedMaterials.flatMap((m) => m.characteristicAssignments);
- // 3) 자재그룹코드 데이터 수집 (중복 제거)
- const materialGroups = processedMaterials
- .filter((m) => m.materialGroup)
- .map((m) => m.materialGroup!)
- .filter((group, index, self) =>
- self.findIndex(g => g.MATKL === group.MATKL) === index // MATKL 기준 중복 제거
- );
// 3) 부모 테이블 UPSERT (배치)
await bulkUpsert(tx, MATERIAL_MASTER_PART_MATL, materialRows, 'MATNR');
- // 4) 자재그룹코드 마스터 UPSERT (별도 처리)
- if (materialGroups.length > 0) {
- console.log(`자재그룹코드 마스터 저장: ${materialGroups.length}개 그룹`);
- await bulkUpsert(tx, MATERIAL_GROUP_MASTER, materialGroups, 'MATKL');
- }
-
- // 5) 하위 테이블 교체 (배치)
+ // 4) 하위 테이블 교체 (배치)
await Promise.all([
bulkReplaceSubTableData(tx, MATERIAL_MASTER_PART_MATL_DESC, descriptions, MATERIAL_MASTER_PART_MATL_DESC.MATNR, matnrs),
bulkReplaceSubTableData(tx, MATERIAL_MASTER_PART_MATL_PLNT, plants, MATERIAL_MASTER_PART_MATL_PLNT.MATNR, matnrs),