파일업로드 로직 중간저장(다듬기하면됨)

This commit is contained in:
leeheejin
2025-12-11 13:48:34 +09:00
parent d09c8e0787
commit c486a31787
4 changed files with 46 additions and 3 deletions

View File

@@ -343,6 +343,20 @@ export const uploadFiles = async (
// 🆕 레코드 모드: 해당 행의 attachments 컬럼 자동 업데이트
const isRecordMode = req.body.isRecordMode === "true" || req.body.isRecordMode === true;
// 🔍 디버깅: 레코드 모드 조건 확인
console.log("🔍 [파일 업로드] 레코드 모드 조건 확인:", {
isRecordMode,
linkedTable,
recordId,
columnName,
finalTargetObjid,
"req.body.isRecordMode": req.body.isRecordMode,
"req.body.linkedTable": req.body.linkedTable,
"req.body.recordId": req.body.recordId,
"req.body.columnName": req.body.columnName,
});
if (isRecordMode && linkedTable && recordId && columnName) {
try {
// 해당 레코드의 모든 첨부파일 조회

View File

@@ -865,6 +865,9 @@ export class DynamicFormService {
return `${key} = $${index + 1}::numeric`;
} else if (dataType === 'boolean') {
return `${key} = $${index + 1}::boolean`;
} else if (dataType === 'jsonb' || dataType === 'json') {
// 🆕 JSONB/JSON 타입은 명시적 캐스팅
return `${key} = $${index + 1}::jsonb`;
} else {
// 문자열 타입은 캐스팅 불필요
return `${key} = $${index + 1}`;
@@ -872,7 +875,17 @@ export class DynamicFormService {
})
.join(", ");
const values: any[] = Object.values(changedFields);
// 🆕 JSONB 타입 값은 JSON 문자열로 변환
const values: any[] = Object.keys(changedFields).map((key) => {
const value = changedFields[key];
const dataType = columnTypes[key];
// JSONB/JSON 타입이고 배열/객체인 경우 JSON 문자열로 변환
if ((dataType === 'jsonb' || dataType === 'json') && (Array.isArray(value) || (typeof value === 'object' && value !== null))) {
return JSON.stringify(value);
}
return value;
});
values.push(id); // WHERE 조건용 ID 추가
// 🔑 Primary Key 타입에 맞게 캐스팅

View File

@@ -767,6 +767,14 @@ export const EditModal: React.FC<EditModalProps> = ({ className }) => {
tableName: screenData.screenInfo?.tableName, // 테이블명 추가
screenId: modalState.screenId, // 화면 ID 추가
};
// 🔍 디버깅: enrichedFormData 확인
console.log("🔑 [EditModal] enrichedFormData 생성:", {
"screenData.screenInfo": screenData.screenInfo,
"screenData.screenInfo?.tableName": screenData.screenInfo?.tableName,
"enrichedFormData.tableName": enrichedFormData.tableName,
"enrichedFormData.id": enrichedFormData.id,
});
return (
<InteractiveScreenViewerDynamic

View File

@@ -110,7 +110,10 @@ const FileUploadComponent: React.FC<FileUploadComponentProps> = ({
const isRecordMode = !!(formData?.id && !String(formData.id).startsWith('temp_'));
const recordTableName = formData?.tableName || component.tableName;
const recordId = formData?.id;
const columnName = component.columnName || component.id || 'attachments';
// 🔑 컬럼명 결정: 레코드 모드에서는 무조건 'attachments' 사용
// component.columnName이나 component.id는 '파일_업로드' 같은 한글 라벨일 수 있어서 DB 컬럼명으로 부적합
// 레코드 모드가 아닐 때만 component.columnName 또는 component.id 사용
const columnName = isRecordMode ? 'attachments' : (component.columnName || component.id || 'attachments');
// 🔑 레코드 모드용 targetObjid 생성
const getRecordTargetObjid = useCallback(() => {
@@ -140,8 +143,13 @@ const FileUploadComponent: React.FC<FileUploadComponentProps> = ({
targetObjid: getRecordTargetObjid(),
uniqueKey: getUniqueKey(),
formDataKeys: formData ? Object.keys(formData) : [],
// 🔍 추가 디버깅: 어디서 tableName이 오는지 확인
"formData.tableName": formData?.tableName,
"component.tableName": component.tableName,
"component.columnName": component.columnName,
"component.id": component.id,
});
}, [isRecordMode, recordTableName, recordId, columnName, getRecordTargetObjid, getUniqueKey, formData]);
}, [isRecordMode, recordTableName, recordId, columnName, getRecordTargetObjid, getUniqueKey, formData, component.tableName, component.columnName, component.id]);
// 🆕 레코드 ID 변경 시 파일 목록 초기화 및 새로 로드
const prevRecordIdRef = useRef<any>(null);