ERP/frontend/index.html

321 lines
16 KiB
HTML

<!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" />
<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=Inter:wght@400;500;600;700&family=Poppins:wght@600&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="./assets/styles.css?v=20251122" />
<link rel="stylesheet" href="./assets/mod.css" />
</head>
<body>
<div id="app">
<aside class="sidebar" id="sidebar">
<div class="brand-container">
<div class="loader-wrapper">
<div class="coin-wrapper">
<div class="coin">
<div class="side heads">
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" width="100%" height="100%" version="1.1" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 4091.27 4091.73">
<g id="Layer_x0020_1">
<path fill="#F7931A" fill-rule="nonzero" 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" fill-rule="nonzero" 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>
</g>
</svg>
</div>
<div class="side tails">
<svg xmlns="http://www.w3.org/2000/svg" class="svg_back" xml:space="preserve" width="100%" height="100%" version="1.1" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 4091.27 4091.73">
<g id="Layer_x0020_1">
<path fill="#F7931A" fill-rule="nonzero" 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" fill-rule="nonzero" 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>
</g>
</svg>
</div>
</div>
</div>
<div class="brand-text">
<span class="brand-title">韬智生产管理</span>
<span class="brand-subtitle">Production System</span>
</div>
</div>
<button id="sidebar-toggle" class="sidebar-toggle" title="收起菜单">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<polyline points="11 17 6 12 11 7"></polyline>
<polyline points="18 17 13 12 18 7"></polyline>
</svg>
</button>
</div>
<nav class="nav">
<div class="nav-group">
<div class="nav-group-title">概览</div>
<a href="#/dashboard" class="nav-item" data-route="dashboard">
<span class="icon icon-dashboard"></span>
<span class="text">仪表盘</span>
</a>
</div>
<div class="nav-group">
<div class="nav-group-title">数据上传</div>
<div class="nav-item has-children" data-expand="upload">
<button class="nav-item-btn">
<span class="icon">⬆️</span>
<span class="text">上传</span>
<span class="caret"></span>
</button>
<div class="nav-children" data-parent="upload">
<a href="#/upload/mac" class="nav-child" data-route="upload-mac">
<span class="child-icon">📱</span>
<span>MAC与批次</span>
</a>
<a href="#/upload/stats" class="nav-child" data-route="upload-stats">
<span class="child-icon">📈</span>
<span>良/不良统计</span>
</a>
<a href="#/upload/repairs" class="nav-child" data-route="upload-repairs">
<span class="child-icon">🔧</span>
<span>返修记录</span>
</a>
<a href="#/upload/shipments" class="nav-child" data-route="upload-shipments">
<span class="child-icon">📦</span>
<span>发货记录</span>
</a>
<a href="#/upload/sop" class="nav-child" data-route="upload-sop">
<span class="child-icon">📄</span>
<span>SOP</span>
</a>
</div>
</div>
</div>
<div class="nav-group">
<div class="nav-group-title">查询</div>
<div class="nav-item has-children" data-expand="query">
<button class="nav-item-btn">
<span class="icon">🔍</span>
<span class="text">出货查询</span>
<span class="caret"></span>
</button>
<div class="nav-children" data-parent="query">
<a href="#/shipments/query" class="nav-child" data-route="shipments-query">
<span class="child-icon">📋</span>
<span>详细记录查询</span>
</a>
<a href="#/shipments/summary" class="nav-child" data-route="shipments-summary">
<span class="child-icon">📊</span>
<span>汇总信息查询</span>
</a>
</div>
</div>
</div>
<div class="nav-group">
<div class="nav-group-title">生产管理</div>
<div class="nav-item has-children" data-expand="production-mgmt">
<button class="nav-item-btn">
<span class="icon">📋</span>
<span class="text">生产管理</span>
<span class="caret"></span>
</button>
<div class="nav-children" data-parent="production-mgmt">
<a href="#/production-mgmt/work-order" class="nav-child" data-route="production-mgmt-work-order">
<span class="child-icon">📝</span>
<span>生产工单下发中心</span>
</a>
</div>
</div>
</div>
<div class="nav-group">
<div class="nav-group-title">计划管理</div>
<div class="nav-item has-children" data-expand="plan-mgmt">
<button class="nav-item-btn">
<span class="icon">📅</span>
<span class="text">计划管理</span>
<span class="caret"></span>
</button>
<div class="nav-children" data-parent="plan-mgmt">
<a href="#/plan-mgmt/bom" class="nav-child" data-route="plan-mgmt-bom">
<span class="child-icon">📦</span>
<span>BOM物料清单</span>
</a>
<a href="#/plan-mgmt/initial-stock" class="nav-child" data-route="plan-mgmt-initial-stock">
<span class="child-icon">🏭</span>
<span>期初库存</span>
</a>
<a href="#/plan-mgmt/purchase-demand" class="nav-child" data-route="plan-mgmt-purchase-demand">
<span class="child-icon">🛒</span>
<span>采购需求清单</span>
</a>
<a href="#/plan-mgmt/customer-order" class="nav-child" data-route="plan-mgmt-customer-order">
<span class="child-icon">📋</span>
<span>客户订单</span>
</a>
<a href="#/plan-mgmt/reconciliation" class="nav-child" data-route="plan-mgmt-reconciliation">
<span class="child-icon">💰</span>
<span>对账单</span>
</a>
</div>
</div>
</div>
<div class="nav-group">
<div class="nav-group-title">扩展采集</div>
<div class="nav-item has-children" data-expand="collect">
<button class="nav-item-btn">
<span class="icon">🛠️</span>
<span class="text">采集</span>
<span class="caret"></span>
</button>
<div class="nav-children" data-parent="collect">
<a href="#/devices" class="nav-child" data-route="devices">
<span class="child-icon">💻</span>
<span>设备状态</span>
</a>
<a href="#/environment" class="nav-child" data-route="environment">
<span class="child-icon">🌡️</span>
<span>环境参数</span>
</a>
<a href="#/personnel" class="nav-child" data-route="personnel">
<span class="child-icon">👥</span>
<span>人员信息</span>
</a>
<a href="#/qa" class="nav-child" data-route="qa">
<span class="child-icon"></span>
<span>质检报告</span>
</a>
<a href="#/production" class="nav-child" data-route="production">
<span class="child-icon">⏱️</span>
<span>时间记录</span>
</a>
</div>
</div>
</div>
<div class="nav-group">
<div class="nav-group-title">导出与设置</div>
<a href="#/export" class="nav-item" data-route="export">
<span class="icon">📤</span>
<span class="text">导出</span>
</a>
<a href="#/settings" class="nav-item" data-route="settings">
<span class="icon">⚙️</span>
<span class="text">设置</span>
</a>
</div>
<div class="nav-group superadmin-only" style="display:none;">
<div class="nav-group-title">系统管理</div>
<a href="#/system/operations-log" class="nav-item" data-route="system-operations-log">
<span class="icon">📜</span>
<span class="text">操作日志</span>
</a>
</div>
</nav>
<div class="theme-toggle-container">
<label class="bb8-toggle">
<input id="theme-toggle-checkbox" class="bb8-toggle__checkbox" type="checkbox">
<div class="bb8-toggle__container">
<div class="bb8-toggle__scenery">
<div class="bb8-toggle__star"></div>
<div class="bb8-toggle__star"></div>
<div class="bb8-toggle__star"></div>
<div class="bb8-toggle__star"></div>
<div class="bb8-toggle__star"></div>
<div class="bb8-toggle__star"></div>
<div class="bb8-toggle__star"></div>
<div class="tatto-1"></div>
<div class="tatto-2"></div>
<div class="gomrassen"></div>
<div class="hermes"></div>
<div class="chenini"></div>
<div class="bb8-toggle__cloud"></div>
<div class="bb8-toggle__cloud"></div>
<div class="bb8-toggle__cloud"></div>
</div>
<div class="bb8">
<div class="bb8__head-container">
<div class="bb8__antenna"></div>
<div class="bb8__antenna"></div>
<div class="bb8__head"></div>
</div>
<div class="bb8__body"></div>
</div>
<div class="artificial__hidden">
<div class="bb8__shadow"></div>
</div>
</div>
</label>
</div>
</aside>
<main class="content">
<header class="content-header" style="background: var(--bg) !important;">
<div id="breadcrumb"></div>
<div id="actions">
<button id="notification-bell" class="notification-bell" style="display:none;">
<span class="bell-icon">🔔</span>
<span id="notification-badge" class="notification-badge" style="display:none;">0</span>
</button>
<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;">
<div class="user-dropdown-item" id="user-dropdown-logout">
<span class="dropdown-icon">🚪</span>
<span>退出登录</span>
</div>
</div>
</div>
<button id="menu-toggle" class="menu-toggle">菜单</button>
</div>
</header>
<section id="view" class="view"></section>
</main>
<!-- 通知面板 -->
<div id="notification-panel" class="notification-panel" style="display:none;">
<div class="notification-header">
<h3>消息通知</h3>
<div class="notification-actions">
<button id="mark-all-read" class="btn-text">全部已读</button>
<button id="delete-read" class="btn-text btn-danger">删除已读</button>
</div>
</div>
<div id="notification-list" class="notification-list">
<!-- 通知列表将在这里动态生成 -->
</div>
</div>
</div>
<div id="toast" class="toast"></div>
<div id="overlay" class="overlay hidden">
<div class="loader">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
</div>
<script src="./js/router.js"></script>
<script src="./js/api.js"></script>
<script src="./js/utils/memory-monitor.js"></script>
<script src="./js/components/sidebar.js"></script>
<script src="./js/components/dashboard.js"></script>
<script src="./js/components/upload.js"></script>
<script src="./js/components/shipments.js"></script>
<script src="./js/components/shipment-query.js"></script>
<script src="./js/components/shipment-summary.js"></script>
<script src="./js/components/defects.js"></script>
<script src="./js/components/devices.js"></script>
<script src="./js/components/environment.js"></script>
<script src="./js/components/personnel.js"></script>
<script src="./js/components/qa.js"></script>
<script src="./js/components/production.js"></script>
<script src="./js/components/work-order.js"></script>
<script src="./js/components/bom.js"></script>
<script src="./js/components/initial-stock.js"></script>
<script src="./js/components/purchase-demand.js"></script>
<script src="./js/components/customer-order.js"></script>
<script src="./js/components/reconciliation.js"></script>
<script src="./js/components/export.js"></script>
<script src="./js/components/settings.js"></script>
<script src="./js/components/notifications.js"></script>
<script src="./js/components/operations-log.js"></script>
<script src="./js/app.js"></script>
</body>
</html>