dy-dashboard/templates/contract_preview.html
2026-10-28 11:14:17 +08:00

88 lines
4.3 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>{{TITLE}}</title>
<script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script>
<style>
*{margin:0;padding:0;box-sizing:border-box;}
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;background:#f0f2f5;color:#333;}
.header{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;padding:14px 24px;display:flex;justify-content:space-between;align-items:center;position:sticky;top:0;z-index:100;box-shadow:0 2px 8px rgba(0,0,0,0.15);}
.header h1{font-size:17px;font-weight:600;}
.header .sub{font-size:13px;opacity:0.85;}
.header .close-btn{display:inline-block;padding:6px 16px;background:rgba(255,255,255,0.2);color:#fff;border-radius:6px;text-decoration:none;font-size:13px;cursor:pointer;}
.header .close-btn:hover{background:rgba(255,255,255,0.3);}
.container{max-width:1400px;margin:0 auto;padding:16px;}
.info-bar{background:#fff;border-radius:8px;padding:10px 16px;margin-bottom:14px;box-shadow:0 1px 3px rgba(0,0,0,0.06);font-size:13px;color:#666;display:flex;gap:20px;flex-wrap:wrap;}
.table-wrap{background:#fff;border-radius:8px;overflow:auto;box-shadow:0 1px 3px rgba(0,0,0,0.06);padding:4px;}
.table-wrap table{border-collapse:collapse;width:100%;font-size:13px;min-width:600px;}
.table-wrap td,.table-wrap th{padding:6px 10px;border:1px solid #e0e0e0;white-space:pre-wrap;word-break:break-word;vertical-align:top;}
.table-wrap tr:hover td{background:#fafafa;}
.loading{text-align:center;padding:60px 20px;color:#999;font-size:15px;}
.error{text-align:center;padding:60px 20px;font-size:16px;color:#f5222d;}
.footer{text-align:center;padding:14px;color:#999;font-size:12px;}
.sheet-tabs{display:flex;gap:4px;padding:8px 0;flex-wrap:wrap;}
.sheet-tab{padding:4px 14px;border-radius:4px 4px 0 0;font-size:12px;cursor:pointer;border:1px solid #e0e0e0;border-bottom:none;background:#f5f5f5;color:#666;}
.sheet-tab.active{background:#667eea;color:#fff;border-color:#667eea;}
</style>
</head>
<body>
<div class="header">
<h1>{{TITLE}}</h1>
<div>
<span class="sub" id="sheetInfo">加载中...</span>
<a href="javascript:window.close()" class="close-btn">✕ 关闭</a>
</div>
</div>
<div class="container">
<div class="info-bar">
<span>📄 {{FILENAME}}</span>
<span>⏰ {{UPLOAD_TIME}}</span>
</div>
<div id="sheetTabs" class="sheet-tabs"></div>
<div id="tableWrap" class="table-wrap">
<div class="loading">⏳ 正在加载 Excel 文件...</div>
</div>
</div>
<div class="footer">蝶雅采购智能体平台</div>
<script>
var dlUrl = "{{DOWNLOAD_URL}}";
var wb = null;
function switchSheet(el) {
var name = el.getAttribute("data-sheet");
if (!wb || !name) return;
var ws = wb.Sheets[name];
if (!ws) return;
var html = XLSX.utils.sheet_to_html(ws, {editable: false});
// 修复 Excel 特殊字体符号显示(如 Wingdings 的 þ → ☑)
html = html.replace(/\u00fe/g, "\u2611");
document.getElementById("tableWrap").innerHTML = html;
var ref = ws["!ref"];
var info = name + " | ";
if (ref) { var r = XLSX.utils.decode_range(ref); info += (r.e_r - r.s_r + 1) + "行 x " + (r.e_c - r.s_c + 1) + "列"; }
document.getElementById("sheetInfo").textContent = info;
document.querySelectorAll(".sheet-tab").forEach(function(e) { e.classList.remove("active"); });
el.classList.add("active");
}
fetch(dlUrl).then(function(r) {
if (!r.ok) throw new Error("下载失败 (" + r.status + ")");
return r.arrayBuffer();
}).then(function(buf) {
wb = XLSX.read(buf, {type: "array", cellStyles: true});
var names = wb.SheetNames;
if (names.length === 0) { document.getElementById("tableWrap").innerHTML = '<div class="error">Excel文件为空</div>'; return; }
var tabsHtml = "";
names.forEach(function(name, i) {
tabsHtml += '<div class="sheet-tab' + (i === 0 ? " active" : "") + '" data-sheet="' + name.replace(/"/g, "&quot;") + '" onclick="switchSheet(this)">' + name + '</div>';
});
document.getElementById("sheetTabs").innerHTML = tabsHtml;
switchSheet(document.querySelector(".sheet-tab"));
}).catch(function(e) {
document.getElementById("tableWrap").innerHTML = '<div class="error">✖ 加载失败: ' + e.message + '</div>';
document.getElementById("sheetInfo").textContent = "加载失败";
});
</script>
</body>
</html>