Merge branch 'dev' of http://39.117.244.52:3000/kjs/ERP-node into feature/screen-management

This commit is contained in:
kjs
2025-09-16 18:02:52 +09:00
45 changed files with 3603 additions and 3405 deletions

View File

@@ -181,14 +181,6 @@ export class AuthController {
return;
}
// DB에서 조회한 원본 사용자 정보 로그
console.log("🔍 DB에서 조회한 사용자 정보:", {
userId: dbUserInfo.userId,
companyCode: dbUserInfo.companyCode,
deptCode: dbUserInfo.deptCode,
dbUserInfoKeys: Object.keys(dbUserInfo),
});
// 프론트엔드 호환성을 위해 더 많은 사용자 정보 반환
const userInfoResponse: any = {
userId: dbUserInfo.userId,
@@ -206,13 +198,6 @@ export class AuthController {
dbUserInfo.userType === "ADMIN" || dbUserInfo.userId === "plm_admin",
};
console.log("📤 프론트엔드로 전송할 사용자 정보:", {
companyCode: userInfoResponse.companyCode,
company_code: userInfoResponse.company_code,
deptCode: userInfoResponse.deptCode,
responseKeys: Object.keys(userInfoResponse),
});
res.status(200).json({
success: true,
message: "사용자 정보 조회 성공",

View File

@@ -414,10 +414,6 @@ class ComponentStandardController {
req.user?.companyCode
);
console.log(
`🔍 중복 체크 결과: component_code=${component_code}, company_code=${req.user?.companyCode}, isDuplicate=${isDuplicate}`
);
res.status(200).json({
success: true,
data: { isDuplicate, component_code },

View File

@@ -125,20 +125,6 @@ export const createDataflowDiagram = async (req: Request, res: Response) => {
});
}
// 🔍 백엔드에서 받은 실제 데이터 로깅
console.log(
"🔍 백엔드에서 받은 control 데이터:",
JSON.stringify(control, null, 2)
);
console.log(
"🔍 백엔드에서 받은 plan 데이터:",
JSON.stringify(plan, null, 2)
);
console.log(
"🔍 백엔드에서 받은 category 데이터:",
JSON.stringify(category, null, 2)
);
const newDiagram = await createDataflowDiagramService({
diagram_name,
relationships,

View File

@@ -11,14 +11,6 @@ export const saveFormData = async (
const { companyCode, userId } = req.user as any;
const { screenId, tableName, data } = req.body;
console.log("💾 폼 데이터 저장 요청:", {
userId,
companyCode,
screenId,
tableName,
data,
});
// 필수 필드 검증
if (!screenId || !tableName || !data) {
return res.status(400).json({
@@ -49,8 +41,6 @@ export const saveFormData = async (
formDataWithMeta
);
console.log("✅ 폼 데이터 저장 성공:", result);
res.json({
success: true,
data: result,
@@ -75,14 +65,6 @@ export const updateFormData = async (
const { companyCode, userId } = req.user as any;
const { tableName, data } = req.body;
console.log("🔄 폼 데이터 업데이트 요청:", {
id,
userId,
companyCode,
tableName,
data,
});
if (!tableName || !data) {
return res.status(400).json({
success: false,
@@ -103,8 +85,6 @@ export const updateFormData = async (
formDataWithMeta
);
console.log("✅ 폼 데이터 업데이트 성공:", result);
res.json({
success: true,
data: result,
@@ -129,8 +109,6 @@ export const deleteFormData = async (
const { companyCode } = req.user as any;
const { tableName } = req.body;
console.log("🗑️ 폼 데이터 삭제 요청:", { id, companyCode, tableName });
if (!tableName) {
return res.status(400).json({
success: false,
@@ -140,8 +118,6 @@ export const deleteFormData = async (
await dynamicFormService.deleteFormData(parseInt(id), tableName);
console.log("✅ 폼 데이터 삭제 성공");
res.json({
success: true,
message: "데이터가 성공적으로 삭제되었습니다.",
@@ -164,8 +140,6 @@ export const getFormData = async (
const { id } = req.params;
const { companyCode } = req.user as any;
console.log("📄 폼 데이터 단건 조회 요청:", { id, companyCode });
const data = await dynamicFormService.getFormData(parseInt(id));
if (!data) {
@@ -175,8 +149,6 @@ export const getFormData = async (
});
}
console.log("✅ 폼 데이터 단건 조회 성공");
res.json({
success: true,
data: data,
@@ -206,16 +178,6 @@ export const getFormDataList = async (
sortOrder = "desc",
} = req.query;
console.log("📋 폼 데이터 목록 조회 요청:", {
screenId,
companyCode,
page,
size,
search,
sortBy,
sortOrder,
});
const result = await dynamicFormService.getFormDataList(
parseInt(screenId as string),
{
@@ -227,8 +189,6 @@ export const getFormDataList = async (
}
);
console.log("✅ 폼 데이터 목록 조회 성공");
res.json({
success: true,
data: result,
@@ -250,8 +210,6 @@ export const validateFormData = async (
try {
const { tableName, data } = req.body;
console.log("✅ 폼 데이터 검증 요청:", { tableName, data });
if (!tableName || !data) {
return res.status(400).json({
success: false,
@@ -264,8 +222,6 @@ export const validateFormData = async (
data
);
console.log("✅ 폼 데이터 검증 성공:", validationResult);
res.json({
success: true,
data: validationResult,
@@ -287,12 +243,8 @@ export const getTableColumns = async (
try {
const { tableName } = req.params;
console.log("📊 테이블 컬럼 정보 조회 요청:", { tableName });
const columns = await dynamicFormService.getTableColumns(tableName);
console.log("✅ 테이블 컬럼 정보 조회 성공");
res.json({
success: true,
data: {

View File

@@ -43,7 +43,6 @@ const storage = multer.diskStorage({
if (!fs.existsSync(tempDir)) {
fs.mkdirSync(tempDir, { recursive: true });
}
console.log(`📁 임시 업로드 디렉토리: ${tempDir}`);
cb(null, tempDir);
},
filename: (req, file, cb) => {
@@ -51,7 +50,6 @@ const storage = multer.diskStorage({
const timestamp = Date.now();
const sanitizedName = file.originalname.replace(/[^a-zA-Z0-9.-]/g, "_");
const savedFileName = `${timestamp}_${sanitizedName}`;
console.log(`📄 저장 파일명: ${savedFileName}`);
cb(null, savedFileName);
},
});
@@ -64,18 +62,12 @@ const upload = multer({
fileFilter: (req, file, cb) => {
// 프론트엔드에서 전송된 accept 정보 확인
const acceptHeader = req.body?.accept;
console.log("🔍 파일 타입 검증:", {
fileName: file.originalname,
mimeType: file.mimetype,
acceptFromFrontend: acceptHeader,
});
// 프론트엔드에서 */* 또는 * 허용한 경우 모든 파일 허용
if (
acceptHeader &&
(acceptHeader.includes("*/*") || acceptHeader.includes("*"))
) {
console.log("✅ 와일드카드 허용: 모든 파일 타입 허용");
cb(null, true);
return;
}
@@ -97,10 +89,8 @@ const upload = multer({
];
if (defaultAllowedTypes.includes(file.mimetype)) {
console.log("✅ 기본 허용 파일 타입:", file.mimetype);
cb(null, true);
} else {
console.log("❌ 허용되지 않는 파일 타입:", file.mimetype);
cb(new Error("허용되지 않는 파일 타입입니다."));
}
},
@@ -114,23 +104,6 @@ export const uploadFiles = async (
res: Response
): Promise<void> => {
try {
console.log("📤 파일 업로드 요청 수신:", {
body: req.body,
companyCode: req.body.companyCode,
writer: req.body.writer,
docType: req.body.docType,
user: req.user
? {
userId: req.user.userId,
companyCode: req.user.companyCode,
deptCode: req.user.deptCode,
}
: "no user",
files: req.files
? (req.files as Express.Multer.File[]).map((f) => f.originalname)
: "none",
});
if (!req.files || (req.files as Express.Multer.File[]).length === 0) {
res.status(400).json({
success: false,
@@ -141,13 +114,6 @@ export const uploadFiles = async (
const files = req.files as Express.Multer.File[];
// 파라미터 확인 및 로깅
console.log("📤 파일 업로드 요청 수신:", {
filesCount: files?.length || 0,
bodyKeys: Object.keys(req.body),
fullBody: req.body, // 전체 body 내용 확인
});
const {
docType = "DOCUMENT",
docTypeName = "일반 문서",
@@ -177,26 +143,8 @@ export const uploadFiles = async (
} else {
finalTargetObjid = `${linkedTable}:${recordId}`;
}
console.log("🔗 자동 연결 활성화:", {
linkedTable,
linkedField,
recordId,
columnName,
isVirtualFileColumn,
generatedTargetObjid: finalTargetObjid,
});
}
console.log("🔍 사용자 정보 결정:", {
bodyCompanyCode: req.body.companyCode,
userCompanyCode: (req.user as any)?.companyCode,
finalCompanyCode: companyCode,
bodyWriter: req.body.writer,
userWriter: (req.user as any)?.userId,
finalWriter: writer,
});
const savedFiles = [];
for (const file of files) {
@@ -218,23 +166,11 @@ export const uploadFiles = async (
const relativePath = `/${actualCompanyCode}/${dateFolder}/${file.filename}`;
const fullFilePath = `/uploads${relativePath}`;
console.log("📂 파일 경로 설정:", {
companyCode,
filename: file.filename,
relativePath,
fullFilePath,
});
// 임시 파일을 최종 위치로 이동
const tempFilePath = file.path; // Multer가 저장한 임시 파일 경로
const finalUploadDir = getCompanyUploadDir(companyCode, dateFolder);
const finalFilePath = path.join(finalUploadDir, file.filename);
console.log("📦 파일 이동:", {
from: tempFilePath,
to: finalFilePath,
});
// 파일 이동
fs.renameSync(tempFilePath, finalFilePath);
@@ -261,13 +197,6 @@ export const uploadFiles = async (
},
});
console.log("💾 파일 정보 DB 저장 완료:", {
objid: fileRecord.objid.toString(),
saved_file_name: fileRecord.saved_file_name,
real_file_name: fileRecord.real_file_name,
file_size: fileRecord.file_size?.toString(),
});
savedFiles.push({
objid: fileRecord.objid.toString(),
savedFileName: fileRecord.saved_file_name,
@@ -284,13 +213,6 @@ export const uploadFiles = async (
regdate: fileRecord.regdate?.toISOString(),
status: fileRecord.status,
});
console.log("✅ 파일 저장 결과:", {
objid: fileRecord.objid.toString(),
company_code: companyCode,
file_path: fileRecord.file_path,
writer: fileRecord.writer,
});
}
res.json({
@@ -319,8 +241,6 @@ export const deleteFile = async (
const { objid } = req.params;
const { writer = "system" } = req.body;
console.log("🗑️ 파일 삭제 요청:", { objid, writer });
// 파일 상태를 DELETED로 변경 (논리적 삭제)
const deletedFile = await prisma.attach_file_info.update({
where: {
@@ -331,11 +251,6 @@ export const deleteFile = async (
},
});
console.log("✅ 파일 삭제 완료 (논리적):", {
objid: deletedFile.objid.toString(),
status: deletedFile.status,
});
res.json({
success: true,
message: "파일이 삭제되었습니다.",
@@ -360,21 +275,9 @@ export const getLinkedFiles = async (
try {
const { tableName, recordId } = req.params;
console.log("📎 연결된 파일 조회 요청:", {
tableName,
recordId,
});
// target_objid 생성 (테이블명:레코드ID 형식)
const baseTargetObjid = `${tableName}:${recordId}`;
console.log("🔍 파일 조회 쿼리:", {
tableName,
recordId,
baseTargetObjid,
queryPattern: `${baseTargetObjid}%`,
});
// 기본 target_objid와 파일 컬럼 패턴 모두 조회 (tableName:recordId% 패턴)
const files = await prisma.attach_file_info.findMany({
where: {
@@ -388,11 +291,6 @@ export const getLinkedFiles = async (
},
});
console.log("📁 조회된 파일 목록:", {
foundFiles: files.length,
targetObjids: files.map((f) => f.target_objid),
});
const fileList = files.map((file: any) => ({
objid: file.objid.toString(),
savedFileName: file.saved_file_name,
@@ -409,11 +307,6 @@ export const getLinkedFiles = async (
status: file.status,
}));
console.log("✅ 연결된 파일 조회 완료:", {
baseTargetObjid,
fileCount: fileList.length,
});
res.json({
success: true,
files: fileList,
@@ -440,12 +333,6 @@ export const getFileList = async (
try {
const { targetObjid, docType, companyCode } = req.query;
console.log("📋 파일 목록 조회 요청:", {
targetObjid,
docType,
companyCode,
});
const where: any = {
status: "ACTIVE",
};
@@ -506,8 +393,6 @@ export const previewFile = async (
const { objid } = req.params;
const { serverFilename } = req.query;
console.log("👁️ 파일 미리보기 요청:", { objid, serverFilename });
const fileRecord = await prisma.attach_file_info.findUnique({
where: {
objid: parseInt(objid),
@@ -539,13 +424,6 @@ export const previewFile = async (
);
const filePath = path.join(companyUploadDir, fileName);
console.log("👁️ 파일 미리보기 경로 확인:", {
stored_file_path: fileRecord.file_path,
company_code: companyCode,
company_upload_dir: companyUploadDir,
final_file_path: filePath,
});
if (!fs.existsSync(filePath)) {
console.error("❌ 파일 없음:", filePath);
res.status(404).json({
@@ -599,12 +477,6 @@ export const previewFile = async (
// 파일 스트림으로 전송
const fileStream = fs.createReadStream(filePath);
fileStream.pipe(res);
console.log("✅ 파일 미리보기 완료:", {
objid,
fileName: fileRecord.real_file_name,
mimeType,
});
} catch (error) {
console.error("파일 미리보기 오류:", error);
res.status(500).json({
@@ -624,8 +496,6 @@ export const downloadFile = async (
try {
const { objid } = req.params;
console.log("📥 파일 다운로드 요청:", { objid });
const fileRecord = await prisma.attach_file_info.findUnique({
where: {
objid: parseInt(objid),
@@ -658,13 +528,6 @@ export const downloadFile = async (
);
const filePath = path.join(companyUploadDir, fileName);
console.log("📥 파일 다운로드 경로 확인:", {
stored_file_path: fileRecord.file_path,
company_code: companyCode,
company_upload_dir: companyUploadDir,
final_file_path: filePath,
});
if (!fs.existsSync(filePath)) {
console.error("❌ 파일 없음:", filePath);
res.status(404).json({
@@ -684,11 +547,6 @@ export const downloadFile = async (
// 파일 스트림 전송
const fileStream = fs.createReadStream(filePath);
fileStream.pipe(res);
console.log("✅ 파일 다운로드 시작:", {
objid: fileRecord.objid.toString(),
real_file_name: fileRecord.real_file_name,
});
} catch (error) {
console.error("파일 다운로드 오류:", error);
res.status(500).json({

View File

@@ -344,7 +344,6 @@ export const getTableInfo = async (
return;
}
console.log(`=== 테이블 정보 조회 API 호출: ${tableName} ===`);
const tableInfo = await screenManagementService.getTableInfo(
tableName,
companyCode