341 lines
20 KiB
HTML
341 lines
20 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" />
|
||
<!-- 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> |