summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-10-03 14:36:04 +0900
committerjoonhoekim <26rote@gmail.com>2025-10-03 14:36:04 +0900
commit08e91ccdf68585c5f7499a33cffd19a04a7834aa (patch)
treefdb6f92b63b75c541e6214d34b1c7bd812602b9d
parentfca5e37d43543ed1e6e680a779d340b1cc4427cd (diff)
(김준회) 벤더데이터 입력 템플릿 보기 문제 처리
-rw-r--r--components/form-data/form-data-table.tsx13
-rw-r--r--components/form-data/spreadJS-dialog.tsx49
-rw-r--r--lib/forms/sedp-actions.ts79
3 files changed, 136 insertions, 5 deletions
diff --git a/components/form-data/form-data-table.tsx b/components/form-data/form-data-table.tsx
index 09745bb0..d5d79735 100644
--- a/components/form-data/form-data-table.tsx
+++ b/components/form-data/form-data-table.tsx
@@ -304,6 +304,19 @@ export default function DynamicTable({
const templateResult = await fetchTemplateFromSEDP(projectCode, formCode);
+ // 🔍 전달되는 템플릿 데이터 로깅
+ console.log('📊 Template data received from SEDP:', {
+ count: Array.isArray(templateResult) ? templateResult.length : 'not array',
+ isArray: Array.isArray(templateResult),
+ data: templateResult
+ });
+
+ if (Array.isArray(templateResult)) {
+ templateResult.forEach((tmpl, idx) => {
+ console.log(` [${idx}] TMPL_ID: ${tmpl?.TMPL_ID || 'MISSING'}, NAME: ${tmpl?.NAME || 'N/A'}, TYPE: ${tmpl?.TMPL_TYPE || 'N/A'}`);
+ });
+ }
+
setTemplateData(templateResult);
setTemplateDialogOpen(true);
diff --git a/components/form-data/spreadJS-dialog.tsx b/components/form-data/spreadJS-dialog.tsx
index 272d99be..8243566a 100644
--- a/components/form-data/spreadJS-dialog.tsx
+++ b/components/form-data/spreadJS-dialog.tsx
@@ -202,6 +202,15 @@ export function TemplateViewDialog({
}, []);
React.useEffect(() => {
+ // 🔍 받은 templateData 로깅 (디버깅용)
+ console.log('🎨 TemplateViewDialog received templateData:', {
+ isNull: templateData === null,
+ isUndefined: templateData === undefined,
+ isArray: Array.isArray(templateData),
+ length: Array.isArray(templateData) ? templateData.length : 'N/A',
+ data: templateData
+ });
+
// 템플릿 데이터가 없거나 빈 배열인 경우 기본 GRD_LIST 템플릿 생성
if (!templateData || (Array.isArray(templateData) && templateData.length === 0)) {
// columnsJSON이 있으면 기본 GRD_LIST 템플릿 생성
@@ -242,7 +251,17 @@ export function TemplateViewDialog({
templates = [templateData as TemplateItem];
}
+ // 🔍 각 템플릿의 TMPL_ID 확인
+ console.log('🔍 Processing templates:', templates.length);
+ templates.forEach((tmpl, idx) => {
+ console.log(` [${idx}] TMPL_ID: ${tmpl?.TMPL_ID || '❌ MISSING'}, NAME: ${tmpl?.NAME || 'N/A'}, TYPE: ${tmpl?.TMPL_TYPE || 'N/A'}`);
+ if (!tmpl?.TMPL_ID) {
+ console.error(`❌ Template at index ${idx} is missing TMPL_ID:`, tmpl);
+ }
+ });
+
const validTemplates = templates.filter(isValidTemplate);
+ console.log(`✅ Valid templates after filtering: ${validTemplates.length}`);
// 유효한 템플릿이 없지만 columnsJSON이 있으면 기본 GRD_LIST 추가
if (validTemplates.length === 0 && columnsJSON && columnsJSON.length > 0) {
@@ -272,17 +291,27 @@ export function TemplateViewDialog({
}
setAvailableTemplates(validTemplates);
+
+ // 🔍 최종 availableTemplates 로깅
+ console.log('📋 availableTemplates set:', validTemplates.map(t => ({
+ TMPL_ID: t.TMPL_ID,
+ NAME: t.NAME,
+ TYPE: t.TMPL_TYPE
+ })));
if (validTemplates.length > 0 && !selectedTemplateId) {
const firstTemplate = validTemplates[0];
// 🔍 TMPL_ID 검증 (isValidTemplate로 필터링했으므로 존재해야 하지만 안전장치)
if (firstTemplate?.TMPL_ID) {
const templateTypeToSet = determineTemplateType(firstTemplate);
+ console.log(`🎯 Auto-selecting first template: ${firstTemplate.TMPL_ID} (${templateTypeToSet})`);
setSelectedTemplateId(firstTemplate.TMPL_ID);
setTemplateType(templateTypeToSet);
} else {
console.error('❌ First valid template has no TMPL_ID:', firstTemplate);
}
+ } else if (selectedTemplateId) {
+ console.log(`ℹ️ Template already selected: ${selectedTemplateId}`);
}
}, [templateData, selectedTemplateId, isValidTemplate, determineTemplateType, columnsJSON]);
@@ -307,10 +336,28 @@ export function TemplateViewDialog({
};
const selectedTemplate = React.useMemo(() => {
+ console.log('🔍 Finding template:', {
+ selectedTemplateId,
+ availableCount: availableTemplates.length,
+ availableIds: availableTemplates.map(t => t?.TMPL_ID)
+ });
+
const found = availableTemplates.find(t => t?.TMPL_ID === selectedTemplateId);
+
if (!found && selectedTemplateId) {
- console.warn('⚠️ Selected template not found:', selectedTemplateId);
+ console.warn('⚠️ Selected template not found:', {
+ searching: selectedTemplateId,
+ available: availableTemplates.map(t => t?.TMPL_ID),
+ availableTemplates: availableTemplates
+ });
+ } else if (found) {
+ console.log('✅ Template found:', {
+ TMPL_ID: found.TMPL_ID,
+ NAME: found.NAME,
+ TYPE: found.TMPL_TYPE
+ });
}
+
return found;
}, [availableTemplates, selectedTemplateId]);
diff --git a/lib/forms/sedp-actions.ts b/lib/forms/sedp-actions.ts
index d20fb9fc..4883a33f 100644
--- a/lib/forms/sedp-actions.ts
+++ b/lib/forms/sedp-actions.ts
@@ -21,6 +21,45 @@ interface SEDPTemplateData {
[key: string]: any;
}
+// 🔍 실제 SEDP API 응답 구조 (대문자)
+interface SEDPTemplateResponse {
+ TMPL_ID: string;
+ NAME: string;
+ TMPL_TYPE: string;
+ SPR_LST_SETUP?: {
+ ACT_SHEET: string;
+ HIDN_SHEETS: string[];
+ CONTENT?: string;
+ DATA_SHEETS: Array<{
+ SHEET_NAME: string;
+ REG_TYPE_ID: string;
+ MAP_CELL_ATT: Array<{
+ ATT_ID: string;
+ IN: string;
+ }>;
+ }>;
+ };
+ GRD_LST_SETUP?: {
+ REG_TYPE_ID: string;
+ SPR_ITM_IDS: string[];
+ ATTS: any[];
+ };
+ SPR_ITM_LST_SETUP?: {
+ ACT_SHEET: string;
+ HIDN_SHEETS: string[];
+ CONTENT?: string;
+ DATA_SHEETS: Array<{
+ SHEET_NAME: string;
+ REG_TYPE_ID: string;
+ MAP_CELL_ATT: Array<{
+ ATT_ID: string;
+ IN: string;
+ }>;
+ }>;
+ };
+ [key: string]: any;
+}
+
/**
* SEDP에서 태그 데이터를 가져오는 서버 액션
*/
@@ -74,7 +113,7 @@ export async function fetchTagDataFromSEDP(
export async function fetchTemplateFromSEDP(
projectCode: string,
formCode: string
-): Promise<SEDPTemplateData[]> {
+): Promise<SEDPTemplateResponse[]> {
try {
// Get the token
const apiKey = await getSEDPToken();
@@ -132,14 +171,46 @@ export async function fetchTemplateFromSEDP(
}
const data = await response.json();
- return data as SEDPTemplateData;
+
+ // 🔍 API 응답 데이터 구조 확인 및 로깅
+ console.log('🔍 SEDP Template API Response for', tmplId, ':', {
+ hasTMPL_ID: !!data.TMPL_ID,
+ hasTemplateId: !!(data as any).templateId,
+ keys: Object.keys(data),
+ sample: data
+ });
+
+ // 🔍 TMPL_ID 필드 검증
+ if (!data.TMPL_ID) {
+ console.error('❌ Missing TMPL_ID in API response:', data);
+ // templateId가 있다면 변환 시도
+ if ((data as any).templateId) {
+ console.warn('⚠️ Found templateId instead of TMPL_ID, converting...');
+ data.TMPL_ID = (data as any).templateId;
+ }
+ }
+
+ return data as SEDPTemplateResponse;
});
// 모든 API 호출을 병렬로 실행하고 결과를 수집
const templates = await Promise.all(templatePromises);
- // null이나 undefined가 아닌 값들만 필터링 (응답이 없는 경우 제외)
- const validTemplates = templates.filter(template => template != null);
+ // 🔍 null이나 undefined가 아닌 값들만 필터링하고 TMPL_ID 검증
+ const validTemplates = templates.filter(template => {
+ if (!template) {
+ console.warn('⚠️ Null or undefined template received');
+ return false;
+ }
+ if (!template.TMPL_ID) {
+ console.error('❌ Template missing TMPL_ID:', template);
+ return false;
+ }
+ return true;
+ });
+
+ console.log(`✅ fetchTemplateFromSEDP completed: ${validTemplates.length} valid templates`);
+ validTemplates.forEach(t => console.log(` - ${t.TMPL_ID}: ${t.NAME} (${t.TMPL_TYPE})`));
return validTemplates;