const WeatherReport = (function () {
const BASE_WIND_COUNT = 10;
const SPOT_CHECK_COUNT = 5;
const AREA_TYPE_MAP = {
urban: "城市",
rural: "农村",
};
const SUITABILITY_MAP = {
a: "不利于污染物的扩散和稀释,适宜于进行无组织排放监测",
b: "较不利于污染物的扩散和稀释,较适宜于进行无组织排放监测",
c: "有利于污染物的扩散和稀释,较不适宜于进行无组织排放监测",
d: "很有利于污染物的扩散和稀释,不适宜于进行无组织排放监测",
wind0: "静风",
overall0: "取消监测或改期",
};
function formatDate(dateStr) {
const d = new Date(dateStr);
const y = d.getFullYear();
const m = String(d.getMonth() + 1).padStart(2, "0");
const day = String(d.getDate()).padStart(2, "0");
return `${y}-${m}-${day}`;
}
function getSuitabilityText(value, type) {
const normalized = String(value).toLowerCase();
if (type === "wind" && normalized === "0") return SUITABILITY_MAP.wind0;
if (type === "overall" && normalized === "0") return SUITABILITY_MAP.overall0;
return SUITABILITY_MAP[normalized] || value;
}
function formatTime(hours, min) {
return `${hours}:${String(min).padStart(2, "0")}`;
}
function joinWithComma(arr, start, end) {
return arr.slice(start, end).map((v) => v ?? "").join(",");
}
function buildReportHTML(data) {
const staticPrefix = window.staticPrefix || '/static';
const timeStr = `${formatDate(data.date)} ${formatTime(data.hours, data.min)}`;
const version = data.version || "unknown";
let html = `
总体适宜度测量报表
总体适宜度测量报表
项目名称:
${data.title || "-"}
检测类型:
${data.inspectionType || "-"}
委托单号:
${data.assignmentNumber || "-"}
经度:
E ${data.longitude || "-"}
纬度:
N ${data.latitude || "-"}
日期序数:
${data.daySinceJanFirst}
太阳倾角:
${Number(data.solarDeclination).toFixed(2)}°
太阳高度角:
${Number(data.sunAltitude).toFixed(2)}°
总云量:
${data.overallCloudiness}
低云量:
${data.lowCloudiness}
辐射等级:
${data.solarRadiationLevel}
平均风速:
${data.averageWindSpeed} m/s
风速适宜度:
${data.windSpeedSuitability}
`;
if (data.hasMeasuredWindSpeed === true) {
html += `
实测风速:
${data.measuredWindSpeed} m/s
转换风速:
${data.convertedWindSpeed} m/s
`;
} else {
html += `
区域类型:
${AREA_TYPE_MAP[data.areaType] || data.areaType || "-"}
测点高度:
${data.pointHeight} m
点位风速:
${data.pointWindSpeed} m/s
推算风速:
${data.calculatedWindSpeed} m/s
`;
}
html += `
平均风向:
${data.averageWindDirection}°
风向标准差:
${data.windDirectionStandardDeviation}°
风向适宜度:
${data.windDirectionSuitability}
大气稳定度:
${data.atmosphericStability}
稳定度适宜度:
${data.suitabilityDegree}
总体适宜度:
${getSuitabilityText(data.overallSuitability, "overall")}
十次风速值:
${joinWithComma(data.windSpeed, 0, BASE_WIND_COUNT)}
十次风向值:
${joinWithComma(data.windDirection, 0, BASE_WIND_COUNT)}
`;
if (data.hasSpotCheckWindSpeed) {
html += `
抽测风速值:
${joinWithComma(data.windSpeed, BASE_WIND_COUNT, BASE_WIND_COUNT + SPOT_CHECK_COUNT)}
抽测风向值:
${joinWithComma(data.windDirection, BASE_WIND_COUNT, BASE_WIND_COUNT + SPOT_CHECK_COUNT)}
`;
}
html += `
`;
return html;
}
function downloadPDF(htmlContent, filename) {
const options = {
margin: 10,
filename: filename,
image: { type: "jpeg", quality: 0.99 },
html2canvas: { scale: 2 },
jsPDF: { unit: "mm", format: "a4", orientation: "portrait" },
};
html2pdf().set(options).from(htmlContent).save();
}
// 下载状态管理(供重试使用)
let downloadState = {
ready: false,
html: null,
filename: null,
};
// 下载提示浮层
function showDownloadPrompt(type, message) {
let overlay = document.getElementById("download-overlay");
if (!overlay) {
overlay = document.createElement("div");
overlay.id = "download-overlay";
overlay.innerHTML = `
重新下载
`;
document.body.appendChild(overlay);
}
const msgEl = document.getElementById("dl-msg");
const retryEl = document.getElementById("dl-retry");
if (msgEl) msgEl.textContent = message;
if (retryEl) {
if (type === "loading" || type === "success") {
retryEl.style.display = "none";
} else {
retryEl.style.display = "inline-block";
}
}
}
function hideDownloadPrompt() {
const overlay = document.getElementById("download-overlay");
if (overlay) {
overlay.style.opacity = "0";
setTimeout(() => { if (overlay) overlay.remove(); }, 300);
}
}
function retryDownload() {
if (!downloadState.ready || !downloadState.html || !downloadState.filename) {
showDownloadPrompt("error", "数据未准备好,请刷新页面重试");
return;
}
downloadPDF(downloadState.html, downloadState.filename);
showDownloadPrompt("success", "正在重新下载,请稍候...");
}
function init() {
if (typeof window.weatherData === "undefined") {
console.error("错误:window.weatherData 未定义");
showDownloadPrompt("error", "数据加载失败,请刷新页面重试");
return;
}
const data = window.weatherData;
console.log("【调试】从后端获取的 weatherData:", data);
const versionEl = document.querySelector(".version");
if (versionEl) {
versionEl.textContent = `版本号: ${data.version || "default"}`;
}
const html = buildReportHTML(data);
const filename = `${data.id}-${data.version || "unknown"}.pdf`;
// 保存下载状态,供重试使用
downloadState.ready = true;
downloadState.html = html;
downloadState.filename = filename;
// 显示下载中提示
showDownloadPrompt("loading", "正在生成 PDF,请稍候...");
// 延迟执行下载,让用户看到提示
setTimeout(() => {
downloadPDF(html, filename);
// 显示成功提示,3秒后消失
showDownloadPrompt("success", "PDF 开始下载...");
setTimeout(() => hideDownloadPrompt(), 3000);
// 额外等3秒,如果提示已消失(下载成功)则不再显示重试
// 如果提示还在(下载失败),则替换为重试按钮
setTimeout(() => {
const overlay = document.getElementById("download-overlay");
if (overlay) {
showDownloadPrompt("retry", "下载未开始,请点击重试");
}
}, 3300);
}, 300);
}
document.addEventListener("DOMContentLoaded", function () {
if (typeof renderMathInElement === "function") {
renderMathInElement(document.body, {
delimiters: [
{ left: "$$", right: "$$", display: true },
{ left: "$", right: "$", display: false },
],
throwOnError: false,
});
}
init();
});
function toggleFormula(element) {
const content = element.nextElementSibling;
const isHidden = content.style.display === "none";
content.style.display = isHidden ? "block" : "none";
element.textContent = element.textContent.includes("▶")
? element.textContent.replace("▶", "▼")
: element.textContent.replace("▼", "▶");
}
function showNotification(message, type = "success") {
const notification = document.getElementById("notification");
if (!notification) return;
notification.textContent = message;
notification.className = `notification ${type}`;
notification.style.display = "block";
setTimeout(() => {
notification.style.display = "none";
}, 3000);
}
return {
buildReportHTML,
downloadPDF,
init,
toggleFormula,
showNotification,
retryDownload,
};
})();