fix: SplitPanelLayout 수정 버튼 클릭 시 그룹 레코드 조회 개선

- 수정 버튼 클릭 시 groupByColumns 기준으로 모든 관련 레코드 조회
- search 대신 dataFilter(equals) 사용하여 정확 매칭 조회
- deduplication 명시적 비활성화로 모든 레코드 반환
- supplier_mng, customer_mng 등 회사별 데이터 테이블 DB 조인 강제 (캐시 미사용)
- entityJoinController에 deduplication 파라미터 처리 추가
- ScreenModal에서 배열 형태 editData 처리 지원
This commit is contained in:
2026-01-09 14:11:51 +09:00
parent 0baffafac1
commit 48aa004a7f
5 changed files with 249 additions and 16 deletions

View File

@@ -953,11 +953,12 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
console.log("🔗 [분할패널] 복합키 조건:", searchConditions);
// 엔티티 조인 API로 데이터 조회
// 엔티티 조인 API로 데이터 조회 (🆕 deduplication 전달)
const result = await entityJoinApi.getTableDataWithJoins(rightTableName, {
search: searchConditions,
enableEntityJoin: true,
size: 1000,
deduplication: componentConfig.rightPanel?.deduplication, // 🆕 중복 제거 설정 전달
});
console.log("🔗 [분할패널] 복합키 조회 결과:", result);
@@ -1442,7 +1443,7 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
// 수정 버튼 핸들러
const handleEditClick = useCallback(
(panel: "left" | "right", item: any) => {
async (panel: "left" | "right", item: any) => {
// 🆕 우측 패널 수정 버튼 설정 확인
if (panel === "right" && componentConfig.rightPanel?.editButton?.mode === "modal") {
const modalScreenId = componentConfig.rightPanel?.editButton?.modalScreenId;
@@ -1465,11 +1466,86 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
// 🆕 groupByColumns 추출
const groupByColumns = componentConfig.rightPanel?.editButton?.groupByColumns || [];
console.log("🔧 [SplitPanel] 수정 버튼 클릭 - groupByColumns 확인:", {
groupByColumns,
editButtonConfig: componentConfig.rightPanel?.editButton,
hasGroupByColumns: groupByColumns.length > 0,
});
console.log("========================================");
console.log("🔧 [SplitPanel] 수정 버튼 클릭!");
console.log("🔧 groupByColumns:", groupByColumns);
console.log("🔧 item:", item);
console.log("🔧 rightData:", rightData);
console.log("🔧 rightData length:", rightData?.length);
console.log("========================================");
// 🆕 groupByColumns 기준으로 모든 관련 레코드 조회 (API 직접 호출)
let allRelatedRecords = [item]; // 기본값: 현재 아이템만
if (groupByColumns.length > 0) {
// groupByColumns 값으로 검색 조건 생성
const matchConditions: Record<string, any> = {};
groupByColumns.forEach((col: string) => {
if (item[col] !== undefined && item[col] !== null) {
matchConditions[col] = item[col];
}
});
console.log("🔍 [SplitPanel] 그룹 레코드 조회 시작:", {
테이블: rightTableName,
조건: matchConditions,
});
if (Object.keys(matchConditions).length > 0) {
// 🆕 deduplication 없이 원본 데이터 다시 조회 (API 직접 호출)
try {
const { entityJoinApi } = await import("@/lib/api/entityJoin");
// 🔧 dataFilter로 정확 매칭 조건 생성 (search는 LIKE 검색이라 부정확)
const exactMatchFilters = Object.entries(matchConditions).map(([key, value]) => ({
id: `exact-${key}`,
columnName: key,
operator: "equals",
value: value,
valueType: "text",
}));
console.log("🔍 [SplitPanel] 정확 매칭 필터:", exactMatchFilters);
const result = await entityJoinApi.getTableDataWithJoins(rightTableName, {
// search 대신 dataFilter 사용 (정확 매칭)
dataFilter: {
enabled: true,
matchType: "all",
filters: exactMatchFilters,
},
enableEntityJoin: true,
size: 1000,
// 🔧 명시적으로 deduplication 비활성화 (모든 레코드 가져오기)
deduplication: { enabled: false, groupByColumn: "", keepStrategy: "latest" },
});
// 🔍 디버깅: API 응답 구조 확인
console.log("🔍 [SplitPanel] API 응답 전체:", result);
console.log("🔍 [SplitPanel] result.data:", result.data);
console.log("🔍 [SplitPanel] result 타입:", typeof result);
// result 자체가 배열일 수도 있음 (entityJoinApi 응답 구조에 따라)
const dataArray = Array.isArray(result) ? result : (result.data || []);
if (dataArray.length > 0) {
allRelatedRecords = dataArray;
console.log("✅ [SplitPanel] 그룹 레코드 조회 완료:", {
조건: matchConditions,
결과수: allRelatedRecords.length,
레코드들: allRelatedRecords.map((r: any) => ({ id: r.id, supplier_item_code: r.supplier_item_code })),
});
} else {
console.warn("⚠️ [SplitPanel] 그룹 레코드 조회 결과 없음, 현재 아이템만 사용");
}
} catch (error) {
console.error("❌ [SplitPanel] 그룹 레코드 조회 실패:", error);
allRelatedRecords = [item];
}
} else {
console.warn("⚠️ [SplitPanel] groupByColumns 값이 없음, 현재 아이템만 사용");
}
}
// 🔧 수정: URL 파라미터 대신 editData로 직접 전달
// 이렇게 하면 테이블의 Primary Key가 무엇이든 상관없이 데이터가 정확히 전달됨
@@ -1477,19 +1553,21 @@ export const SplitPanelLayoutComponent: React.FC<SplitPanelLayoutComponentProps>
new CustomEvent("openScreenModal", {
detail: {
screenId: modalScreenId,
editData: item, // 전체 데이터를 직접 전달
...(groupByColumns.length > 0 && {
urlParams: {
editData: allRelatedRecords, // 🆕 모든 관련 레코드 전달 (배열)
urlParams: {
mode: "edit", // 🆕 수정 모드 표시
...(groupByColumns.length > 0 && {
groupByColumns: JSON.stringify(groupByColumns),
},
}),
}),
},
},
}),
);
console.log("✅ [SplitPanel] openScreenModal 이벤트 발생 (editData 직접 전달):", {
screenId: modalScreenId,
editData: item,
editData: allRelatedRecords,
recordCount: allRelatedRecords.length,
groupByColumns: groupByColumns.length > 0 ? JSON.stringify(groupByColumns) : "없음",
});