ERP/frontend/index.html
2026-01-05 15:19:13 +08:00

341 lines
20 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>韬智生产管理系统</title>
<link rel="icon" type="image/svg+xml" href="./assets/favicon.svg" />
<!-- Modern Professional Typography -->
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;500;600;700&family=Poppins:wght@400;500;600;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="./assets/styles.css?v=20251122" />
<link rel="stylesheet" href="./assets/dashboard-enhancements.css" />
<link rel="stylesheet" href="./assets/mod.css" />
<link rel="stylesheet" href="./assets/meituan-test.css" />
</head>
<body>
<!-- 初始加载提示 -->
<div id="initial-loading" style="position:fixed;top:0;left:0;width:100%;height:100%;background:#f8f9fa;display:flex;align-items:center;justify-content:center;z-index:9999;">
<div style="text-align:center;">
<div style="width:40px;height:40px;border:3px solid #e9ecef;border-top:3px solid #007bff;border-radius:50%;animation:spin 1s linear infinite;margin:0 auto 20px;"></div>
<p style="color:#666;margin:0;">正在加载系统...</p>
</div>
</div>
<style>
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
<div id="app" class="trackit-layout" style="opacity:0;">
<!-- 顶部导航栏 -->
<header class="topbar sidebar" id="sidebar">
<div class="topbar-left">
<div class="brand">
<div class="coin-wrapper">
<div class="coin">
<div class="side heads">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4091.27 4091.73" width="100%" height="100%">
<path fill="#F7931A" d="M4030.06 2540.77c-273.24,1096.01 -1383.32,1763.02 -2479.46,1489.71 -1095.68,-273.24 -1762.69,-1383.39 -1489.33,-2479.31 273.12,-1096.13 1383.2,-1763.19 2479,-1489.95 1096.06,273.24 1763.03,1383.51 1489.76,2479.57l0.02 -0.02z"></path>
<path fill="white" d="M2947.77 1754.38c40.72,-272.26 -166.56,-418.61 -450,-516.24l91.95 -368.8 -224.5 -55.94 -89.51 359.09c-59.02,-14.72 -119.63,-28.59 -179.87,-42.34l90.16 -361.46 -224.36 -55.94 -92 368.68c-48.84,-11.12 -96.81,-22.11 -143.35,-33.69l0.26 -1.16 -309.59 -77.31 -59.72 239.78c0,0 166.56,38.18 163.05,40.53 90.91,22.69 107.35,82.87 104.62,130.57l-104.74 420.15c6.26,1.59 14.38,3.89 23.34,7.49 -7.49,-1.86 -15.46,-3.89 -23.73,-5.87l-146.81 588.57c-11.11,27.62 -39.31,69.07 -102.87,53.33 2.25,3.26 -163.17,-40.72 -163.17,-40.72l-111.46 256.98 292.15 72.83c54.35,13.63 107.61,27.89 160.06,41.3l-92.9 373.03 224.24 55.94 92 -369.07c61.26,16.63 120.71,31.97 178.91,46.43l-91.69 367.33 224.51 55.94 92.89 -372.33c382.82,72.45 670.67,43.24 791.83,-303.02 97.63,-278.78 -4.86,-439.58 -206.26,-544.44 146.69,-33.83 257.18,-130.31 286.64,-329.61l-0.07 -0.05zm-512.93 719.26c-69.38,278.78 -538.76,128.08 -690.94,90.29l123.28 -494.2c152.17,37.99 640.17,113.17 567.67,403.91zm69.43 -723.3c-63.29,253.58 -453.96,124.75 -580.69,93.16l111.77 -448.21c126.73,31.59 534.85,90.55 468.94,355.05l-0.02 0z"></path>
</svg>
</div>
<div class="side tails">
<svg xmlns="http://www.w3.org/2000/svg" class="svg_back" viewBox="0 0 4091.27 4091.73" width="100%" height="100%">
<path fill="#F7931A" d="M4030.06 2540.77c-273.24,1096.01 -1383.32,1763.02 -2479.46,1489.71 -1095.68,-273.24 -1762.69,-1383.39 -1489.33,-2479.31 273.12,-1096.13 1383.2,-1763.19 2479,-1489.95 1096.06,273.24 1763.03,1383.51 1489.76,2479.57l0.02 -0.02z"></path>
<path fill="white" d="M2947.77 1754.38c40.72,-272.26 -166.56,-418.61 -450,-516.24l91.95 -368.8 -224.5 -55.94 -89.51 359.09c-59.02,-14.72 -119.63,-28.59 -179.87,-42.34l90.16 -361.46 -224.36 -55.94 -92 368.68c-48.84,-11.12 -96.81,-22.11 -143.35,-33.69l0.26 -1.16 -309.59 -77.31 -59.72 239.78c0,0 166.56,38.18 163.05,40.53 90.91,22.69 107.35,82.87 104.62,130.57l-104.74 420.15c6.26,1.59 14.38,3.89 23.34,7.49 -7.49,-1.86 -15.46,-3.89 -23.73,-5.87l-146.81 588.57c-11.11,27.62 -39.31,69.07 -102.87,53.33 2.25,3.26 -163.17,-40.72 -163.17,-40.72l-111.46 256.98 292.15 72.83c54.35,13.63 107.61,27.89 160.06,41.3l-92.9 373.03 224.24 55.94 92 -369.07c61.26,16.63 120.71,31.97 178.91,46.43l-91.69 367.33 224.51 55.94 92.89 -372.33c382.82,72.45 670.67,43.24 791.83,-303.02 97.63,-278.78 -4.86,-439.58 -206.26,-544.44 146.69,-33.83 257.18,-130.31 286.64,-329.61l-0.07 -0.05zm-512.93 719.26c-69.38,278.78 -538.76,128.08 -690.94,90.29l123.28 -494.2c152.17,37.99 640.17,113.17 567.67,403.91zm69.43 -723.3c-63.29,253.58 -453.96,124.75 -580.69,93.16l111.77 -448.21c126.73,31.59 534.85,90.55 468.94,355.05l-0.02 0z"></path>
</svg>
</div>
</div>
</div>
<span class="brand-name">韬智生产管理</span>
<button id="sidebar-toggle" class="sidebar-toggle" type="button" aria-label="切换侧边栏">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M15 18l-6-6 6-6" />
</svg>
</button>
</div>
<div class="sidebar-search">
<span class="search-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="7" />
<path d="M20 20l-3.5-3.5" />
</svg>
</span>
<input class="sidebar-search-input" type="text" placeholder="搜索菜单 (Ctrl+K)" autocomplete="off" />
</div>
<nav class="topnav" id="topnav">
<a href="#/dashboard" class="topnav-item" data-route="dashboard">
<span class="nav-left">
<span class="nav-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="3" width="7" height="7" rx="2" />
<rect x="14" y="3" width="7" height="7" rx="2" />
<rect x="14" y="14" width="7" height="7" rx="2" />
<rect x="3" y="14" width="7" height="7" rx="2" />
</svg>
</span>
<span class="topnav-text">仪表盘</span>
</span>
</a>
<div class="topnav-item has-dropdown" data-menu="upload">
<span class="nav-left">
<span class="nav-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 16.5a4.5 4.5 0 0 0-1.8-8.7A6 6 0 0 0 6 9a4 4 0 0 0 0 8h14" />
<path d="M12 12v9" />
<path d="M8 16l4-4 4 4" />
</svg>
</span>
<span class="topnav-text">上传</span>
</span>
<span class="topnav-caret"></span>
<div class="topnav-dropdown">
<a href="#/upload/mac" class="dropdown-item" data-route="upload-mac">MAC与批次</a>
<a href="#/upload/stats" class="dropdown-item" data-route="upload-stats">良/不良统计</a>
<a href="#/upload/repairs" class="dropdown-item" data-route="upload-repairs">返修记录</a>
<a href="#/upload/shipments" class="dropdown-item" data-route="upload-shipments">发货记录</a>
<a href="#/upload/sop" class="dropdown-item" data-route="upload-sop">SOP</a>
</div>
</div>
<div class="topnav-item has-dropdown" data-menu="query">
<span class="nav-left">
<span class="nav-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="11" cy="11" r="7" />
<path d="M20 20l-3.5-3.5" />
</svg>
</span>
<span class="topnav-text">出货查询</span>
</span>
<span class="topnav-caret"></span>
<div class="topnav-dropdown">
<a href="#/shipments/query" class="dropdown-item" data-route="shipments-query">详细记录查询</a>
<a href="#/shipments/summary" class="dropdown-item" data-route="shipments-summary">汇总信息查询</a>
</div>
</div>
<div class="topnav-item has-dropdown" data-menu="production">
<span class="nav-left">
<span class="nav-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M3 21V9l6 3V9l6 3V9l6 3v9" />
<path d="M3 21h18" />
</svg>
</span>
<span class="topnav-text">生产管理</span>
</span>
<span class="topnav-caret"></span>
<div class="topnav-dropdown">
<a href="#/production-mgmt/work-order" class="dropdown-item" data-route="production-mgmt-work-order">生产工单下发中心</a>
</div>
</div>
<div class="topnav-item has-dropdown" data-menu="plan">
<span class="nav-left">
<span class="nav-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="3" y="4" width="18" height="18" rx="2" />
<path d="M16 2v4" />
<path d="M8 2v4" />
<path d="M3 10h18" />
</svg>
</span>
<span class="topnav-text">计划管理</span>
</span>
<span class="topnav-caret"></span>
<div class="topnav-dropdown">
<a href="#/plan-mgmt/bom" class="dropdown-item" data-route="plan-mgmt-bom">BOM物料清单</a>
<a href="#/plan-mgmt/initial-stock" class="dropdown-item" data-route="plan-mgmt-initial-stock">期初库存</a>
<a href="#/plan-mgmt/purchase-demand" class="dropdown-item" data-route="plan-mgmt-purchase-demand">采购需求清单</a>
<a href="#/plan-mgmt/customer-order" class="dropdown-item" data-route="plan-mgmt-customer-order">客户订单</a>
<a href="#/plan-mgmt/reconciliation" class="dropdown-item" data-route="plan-mgmt-reconciliation">对账单</a>
</div>
</div>
<div class="topnav-item has-dropdown" data-menu="collect">
<span class="nav-left">
<span class="nav-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M4 19V5" />
<path d="M4 15c2-2 4-3 8-3s6-1 8-3" />
<path d="M20 19V5" />
</svg>
</span>
<span class="topnav-text">采集</span>
</span>
<span class="topnav-caret"></span>
<div class="topnav-dropdown">
<a href="#/devices" class="dropdown-item" data-route="devices">设备状态</a>
<a href="#/environment" class="dropdown-item" data-route="environment">环境参数</a>
<a href="#/personnel" class="dropdown-item" data-route="personnel">人员信息</a>
<a href="#/qa" class="dropdown-item" data-route="qa">质检报告</a>
<a href="#/production" class="dropdown-item" data-route="production">时间记录</a>
</div>
</div>
<div class="topnav-item has-dropdown" data-menu="test">
<span class="nav-left">
<span class="nav-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
<polyline points="14,2 14,8 20,8" />
<line x1="16" y1="13" x2="8" y2="13" />
<line x1="16" y1="17" x2="8" y2="17" />
<polyline points="10,9 9,9 8,9" />
</svg>
</span>
<span class="topnav-text">基站测试</span>
</span>
<span class="topnav-caret"></span>
<div class="topnav-dropdown">
<a href="#/test/meituan" class="dropdown-item" data-route="test-meituan">美团基站测试</a>
</div>
</div>
<a href="#/export" class="topnav-item" data-route="export">
<span class="nav-left">
<span class="nav-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 3v10" />
<path d="M8 9l4 4 4-4" />
<path d="M4 17v3h16v-3" />
</svg>
</span>
<span class="topnav-text">导出</span>
</span>
</a>
<a href="#/product-intro" class="topnav-item" data-route="product-intro">
<span class="nav-left">
<span class="nav-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M21 16V8a2 2 0 0 0-1-1.7l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.7l7 4a2 2 0 0 0 2 0l7-4a2 2 0 0 0 1-1.7z" />
<path d="M3.3 7.5L12 12l8.7-4.5" />
<path d="M12 22V12" />
</svg>
</span>
<span class="topnav-text">产品</span>
</span>
</a>
<a href="#/system/operations-log" class="topnav-item superadmin-only" data-route="system-operations-log" style="display:none;">
<span class="nav-left">
<span class="nav-icon" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" />
<path d="M14 2v6h6" />
<path d="M16 13H8" />
<path d="M16 17H8" />
</svg>
</span>
<span class="topnav-text">操作日志</span>
</span>
</a>
</nav>
<div class="sidebar-footer">
<div id="sidebar-notification-card" class="sidebar-notification-card" style="display:none;">
<span id="notification-badge" class="notification-badge" style="display:none;">0</span>
<div class="sidebar-notification-header">
<div class="sidebar-notification-title"><svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"/></svg> </div>
<div class="sidebar-notification-actions">
<button id="mark-all-read" class="btn-text" type="button">全部已读</button>
<button id="delete-read" class="btn-text btn-danger" type="button">删除已读</button>
</div>
</div>
<div id="notification-list" class="sidebar-notification-list">
<div class="notification-empty">暂无消息通知</div>
</div>
</div>
<div class="sidebar-actions">
<!-- 主题切换按钮已隐藏 -->
<label class="switch" style="display: none;">
<input id="theme-toggle-checkbox" type="checkbox" />
<span class="slider">
<div class="star star_1"></div>
<div class="star star_2"></div>
<div class="star star_3"></div>
<svg viewBox="0 0 16 16" class="cloud_1 cloud">
<path
transform="matrix(.77976 0 0 .78395-299.99-418.63)"
fill="#fff"
d="m391.84 540.91c-.421-.329-.949-.524-1.523-.524-1.351 0-2.451 1.084-2.485 2.435-1.395.526-2.388 1.88-2.388 3.466 0 1.874 1.385 3.423 3.182 3.667v.034h12.73v-.006c1.775-.104 3.182-1.584 3.182-3.395 0-1.747-1.309-3.186-2.994-3.379.007-.106.011-.214.011-.322 0-2.707-2.271-4.901-5.072-4.901-2.073 0-3.856 1.202-4.643 2.925"
></path>
</svg>
</span>
</label>
<div class="user-menu-container">
<button id="user-avatar-btn" class="user-avatar-btn">
<img id="user-avatar-img" src="./assets/user-avatar.svg" alt="用户头像" class="user-avatar-img" />
<span id="user-name-display" class="user-name-display">未登录</span>
</button>
<div id="user-dropdown" class="user-dropdown" style="display:none;">
<a href="#/settings" class="user-dropdown-item" data-route="settings">
<span class="dropdown-icon">⚙️</span>
<span>设置</span>
</a>
<div class="user-dropdown-item" id="user-dropdown-logout">
<span class="dropdown-icon">🚪</span>
<span>退出登录</span>
</div>
</div>
</div>
</div>
</div>
</div>
</header>
<main class="content topbar-layout">
<section id="view" class="view"></section>
</main>
</div>
<div id="toast" class="toast"></div>
<div id="overlay" class="overlay hidden">
<div class="spinner">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
</div>
<div id="notification-modal" class="notification-modal" style="display:none;">
<div class="notification-modal-backdrop" data-close="1"></div>
<div class="notification-modal-content" role="dialog" aria-modal="true" aria-label="🔔">
<div class="notification-modal-header">
<div class="notification-modal-title">🔔</div>
<button id="notification-modal-close" class="notification-modal-close" type="button" aria-label="关闭">×</button>
</div>
<div id="notification-modal-list" class="notification-modal-list"></div>
</div>
</div>
<script src="./js/router.js" defer></script>
<script src="./js/api.js" defer></script>
<script src="./js/utils/memory-monitor.js" defer></script>
<script src="./js/components/sidebar.js" defer></script>
<script src="./js/components/menu-search.js" defer></script>
<script src="./js/components/dashboard.js" defer></script>
<script src="./js/components/ai-report.js" defer></script>
<script src="./js/components/upload.js" defer></script>
<script src="./js/components/shipments.js" defer></script>
<script src="./js/components/shipment-query.js" defer></script>
<script src="./js/components/shipment-summary.js" defer></script>
<script src="./js/components/defects.js" defer></script>
<script src="./js/components/devices.js" defer></script>
<script src="./js/components/environment.js" defer></script>
<script src="./js/components/personnel.js" defer></script>
<script src="./js/components/qa.js" defer></script>
<script src="./js/components/production.js" defer></script>
<script src="./js/components/work-order.js" defer></script>
<script src="./js/components/bom.js" defer></script>
<script src="./js/components/initial-stock.js" defer></script>
<script src="./js/components/purchase-demand.js" defer></script>
<script src="./js/components/customer-order.js" defer></script>
<script src="./js/components/reconciliation.js" defer></script>
<script src="./js/components/export.js" defer></script>
<script src="./js/components/settings.js" defer></script>
<script src="./js/components/notifications.js" defer></script>
<script src="./js/components/meituan-test.js" defer></script>
<script src="./js/components/operations-log.js" defer></script>
<script src="./js/components/product-intro.js" defer></script>
<script src="./js/app.js" defer></script>
</body>
</html>