import puppeteer from "puppeteer"; import fs from "fs-extra"; import path from "path"; import FormData from "form-data"; import { colorSchemes } from "../colors.js"; import axios from "axios"; // 获取 plotly.js 的绝对路径 const plotlyPath = path.join( process.cwd(), "src", "public", "js", "echarts.min.js" ); const plotlyContent = await fs.readFile(plotlyPath, "utf-8"); // HTML 模板 const getHtmlContent = () => ` Radar Chart
`; export const getRadarCharts = async ( chartData, itemCsvData, bucketName, objectName ) => { const browser = await puppeteer.launch(); const page = await browser.newPage(); // 创建临时目录 const tempDir = path.join(process.cwd(), "images"); await fs.ensureDir(tempDir); const tempFilePath = path.join( tempDir, `temp_scatter_chart_${Date.now()}.png` ); await page.setContent(getHtmlContent(), { waitUntil: "load" }); // 等待 renderChart 被定义 await page.waitForFunction(() => typeof window.renderChart === "function"); // 调用渲染函数 await page.evaluate( (chartData, itemCsvData) => { window.renderChart(chartData, itemCsvData); }, chartData, itemCsvData ); // 再等待图表渲染完成(给 ECharts 时间) (await page.waitForTimeout) ? page.waitForTimeout(1000) : new Promise((res) => setTimeout(res, 1000)); // 上传逻辑 // 截图并保存到临时文件 const chartElement = await page.$("#chart"); await chartElement.screenshot({ path: tempFilePath, type: "png", }); try { const newUrl = objectName.substring(0, objectName.lastIndexOf("/")); // 上传图片到服务器 const formData = new FormData(); formData.append("file", fs.createReadStream(tempFilePath)); // 发送上传请求 const response = await axios.post( `${process.env.API_BASE_URL}/examples/upload`, { filePath: tempFilePath, bucketName, objectName: newUrl + "/" + chartData.wind_turbine_name + ".jpg", } ); return response?.data?.url; } catch (error) { console.error("❌ 上传失败:", error.message); } };