| 
									
										
										
										
											2025-10-22 14:43:42 +08:00
										 |  |  | import { message } from "antd"; | 
					
						
							|  |  |  | import dayjs from "dayjs"; | 
					
						
							| 
									
										
										
										
											2025-10-28 08:48:18 +08:00
										 |  |  | import { useState } from "react"; | 
					
						
							| 
									
										
										
										
											2025-10-22 14:43:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * 下载Blob流文件 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2025-10-28 08:48:18 +08:00
										 |  |  | export default function useDownloadBlob() { | 
					
						
							|  |  |  |   // loading状态
 | 
					
						
							|  |  |  |   const [loading, setLoading] = useState(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // 下载Blob流文件
 | 
					
						
							|  |  |  |   const downloadBlob = (url, options = { name: "", type: "", params: {} }) => { | 
					
						
							|  |  |  |     setLoading(true); | 
					
						
							|  |  |  |     return new Promise((resolve, reject) => { | 
					
						
							| 
									
										
										
										
											2025-10-29 17:59:44 +08:00
										 |  |  |       const finalUrl = (process.env.app.API_HOST || window.__JJB_ENVIRONMENT__.API_HOST) + url; | 
					
						
							| 
									
										
										
										
											2025-10-28 08:48:18 +08:00
										 |  |  |       Object.entries(options.params).forEach(([key, value]) => { | 
					
						
							|  |  |  |         finalUrl.searchParams.append(key, value); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |       fetch(finalUrl, { | 
					
						
							|  |  |  |         method: "GET", | 
					
						
							|  |  |  |         mode: "cors", | 
					
						
							|  |  |  |         headers: { | 
					
						
							|  |  |  |           "Content-Type": "application/json", | 
					
						
							|  |  |  |         }, | 
					
						
							| 
									
										
										
										
											2025-10-22 14:43:42 +08:00
										 |  |  |       }) | 
					
						
							| 
									
										
										
										
											2025-10-28 08:48:18 +08:00
										 |  |  |         .then((response) => { | 
					
						
							|  |  |  |           if (!response.ok) { | 
					
						
							|  |  |  |             throw new Error("Network response was not ok"); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           return response.blob(); | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         .then((blob) => { | 
					
						
							|  |  |  |           const finalBlob = new Blob([blob], { | 
					
						
							|  |  |  |             type: options.type || "application/vnd.ms-excel", | 
					
						
							|  |  |  |           }); | 
					
						
							|  |  |  |           const downloadElement = document.createElement("a"); | 
					
						
							|  |  |  |           const href = window.URL.createObjectURL(finalBlob); | 
					
						
							|  |  |  |           downloadElement.style.display = "none"; | 
					
						
							|  |  |  |           downloadElement.href = href; | 
					
						
							|  |  |  |           downloadElement.download | 
					
						
							|  |  |  |             = options.name || dayjs().format("YYYY-MM-DD HH:mm:ss"); | 
					
						
							|  |  |  |           document.body.appendChild(downloadElement); | 
					
						
							|  |  |  |           downloadElement.click(); | 
					
						
							|  |  |  |           document.body.removeChild(downloadElement); | 
					
						
							|  |  |  |           window.URL.revokeObjectURL(href); | 
					
						
							|  |  |  |           resolve({ data: finalBlob }); | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         .catch((err) => { | 
					
						
							|  |  |  |           message.error("导出失败"); | 
					
						
							|  |  |  |           reject(err); | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         .finally(() => { | 
					
						
							|  |  |  |           setLoading(false); | 
					
						
							| 
									
										
										
										
											2025-10-22 14:43:42 +08:00
										 |  |  |         }); | 
					
						
							| 
									
										
										
										
											2025-10-28 08:48:18 +08:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return [loading, downloadBlob]; | 
					
						
							| 
									
										
										
										
											2025-10-22 14:43:42 +08:00
										 |  |  | } |