import os import re # 수정할 파일들과 카테고리 files_categories = [ ('frontend/src/components/bom/materials/ValveMaterialsView.jsx', 'VALVE'), ('frontend/src/components/bom/materials/GasketMaterialsView.jsx', 'GASKET'), ('frontend/src/components/bom/materials/BoltMaterialsView.jsx', 'BOLT'), ('frontend/src/components/bom/materials/SupportMaterialsView.jsx', 'SUPPORT') ] for file_path, category in files_categories: if os.path.exists(file_path): with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 기존 try 블록을 새로운 방식으로 교체 old_pattern = r'try\s*\{\s*//\s*1\.\s*구매신청\s*생성.*?alert\(\'엑셀\s*파일은\s*다운로드되었지만\s*구매신청\s*생성에\s*실패했습니다\.\'\);\s*\}' new_code = f'''try {{ console.log('🔄 {category.lower()} 엑셀 내보내기 시작 - 새로운 방식'); // 1. 먼저 클라이언트에서 엑셀 파일 생성 console.log('📊 엑셀 Blob 생성 중...', dataWithRequirements.length, '개 자료'); const excelBlob = await createExcelBlob(dataWithRequirements, excelFileName, {{ category: '{category}', filename: excelFileName, uploadDate: new Date().toLocaleDateString() }}); console.log('✅ 엑셀 Blob 생성 완료:', excelBlob.size, 'bytes'); // 2. 구매신청 생성 const allMaterialIds = selectedMaterialsData.map(m => m.id); const response = await api.post('/purchase-request/create', {{ file_id: fileId, job_no: jobNo, category: '{category}', material_ids: allMaterialIds, materials_data: dataWithRequirements.map(m => ({{ material_id: m.id, description: m.original_description, category: m.classified_category, size: m.size_inch || m.size_spec, schedule: m.schedule, material_grade: m.material_grade || m.full_material_grade, quantity: m.quantity, unit: m.unit, user_requirement: userRequirements[m.id] || '' }})) }}); if (response.data.success) {{ console.log(`✅ 구매신청 완료: ${{response.data.request_no}}, request_id: ${{response.data.request_id}}`); // 3. 생성된 엑셀 파일을 서버에 업로드 console.log('📤 서버에 엑셀 파일 업로드 중...'); const formData = new FormData(); formData.append('excel_file', excelBlob, excelFileName); formData.append('request_id', response.data.request_id); formData.append('category', '{category}'); const uploadResponse = await api.post('/purchase-request/upload-excel', formData, {{ headers: {{ 'Content-Type': 'multipart/form-data', }}, }}); console.log('✅ 엑셀 업로드 완료:', uploadResponse.data); if (onPurchasedMaterialsUpdate) {{ onPurchasedMaterialsUpdate(allMaterialIds); }} }} // 4. 클라이언트 다운로드 const url = window.URL.createObjectURL(excelBlob); const link = document.createElement('a'); link.href = url; link.download = excelFileName; document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(url); alert(`구매신청 ${{response.data?.request_no || ''}}이 생성되고 엑셀 파일이 저장되었습니다.`); }} catch (error) {{ console.error('엑셀 저장 또는 구매신청 실패:', error); // 실패 시에도 클라이언트 다운로드는 진행 exportMaterialsToExcel(dataWithRequirements, excelFileName, {{ category: '{category}', filename: excelFileName, uploadDate: new Date().toLocaleDateString() }}); alert('엑셀 파일은 다운로드되었지만 구매신청 생성에 실패했습니다.'); }}''' # 간단한 패턴으로 기존 try 블록 찾기 try_pattern = r'try\s*\{[^}]*?구매신청\s*생성[^}]*?\}\s*catch[^}]*?\}' if re.search(try_pattern, content, re.DOTALL): content = re.sub(try_pattern, new_code, content, flags=re.DOTALL) with open(file_path, 'w', encoding='utf-8') as f: f.write(content) print(f"✅ Updated {file_path}") else: print(f"❌ Pattern not found in {file_path}") else: print(f"❌ File not found: {file_path}") print("✅ All files updated!")