ERP/frontend/index.html
2026-03-13 10:48:38 +08:00

510 lines
26 KiB
HTML
Raw Permalink 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>
<a href="#/shipments/audit" class="dropdown-item" data-route="shipments-audit">审计查询</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/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="outsourcing">
<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="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
<circle cx="9" cy="7" r="4" />
<path d="M22 21v-2a4 4 0 0 0-3-3.87" />
<path d="M16 3.13a4 4 0 0 1 0 7.75" />
</svg>
</span>
<span class="topnav-text">委外管理</span>
</span>
<span class="topnav-caret"></span>
<div class="topnav-dropdown">
<a href="#/outsourcing-mgmt/orders" class="dropdown-item" data-route="outsourcing-mgmt-orders">委外工单</a>
<a href="#/outsourcing-mgmt/material-issue" class="dropdown-item" data-route="outsourcing-mgmt-material-issue">委外发料</a>
<a href="#/outsourcing-mgmt/finished-goods-receipt" class="dropdown-item" data-route="outsourcing-mgmt-finished-goods-receipt">成品入库</a>
<a href="#/outsourcing-mgmt/wip-stock" class="dropdown-item" data-route="outsourcing-mgmt-wip-stock">委外在制库存</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 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>
<button id="notification-bell-btn" class="notification-bell-btn" title="消息通知">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/>
<path d="M13.73 21a2 2 0 0 1-3.46 0"/>
</svg>
<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;">
<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="main-container">
<div class="loader">
<svg viewBox="0 0 800 500" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="chipGradient" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#2d2d2d"></stop>
<stop offset="100%" stop-color="#0f0f0f"></stop>
</linearGradient>
<linearGradient id="textGradient" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#eeeeee"></stop>
<stop offset="100%" stop-color="#888888"></stop>
</linearGradient>
<linearGradient id="pinGradient" x1="1" y1="0" x2="0" y2="0">
<stop offset="0%" stop-color="#bbbbbb"></stop>
<stop offset="50%" stop-color="#888888"></stop>
<stop offset="100%" stop-color="#555555"></stop>
</linearGradient>
</defs>
<g id="traces">
<path d="M100 100 H200 V210 H326" class="trace-bg"></path>
<path d="M100 100 H200 V210 H326" class="trace-flow purple"></path>
<path d="M80 180 H180 V230 H326" class="trace-bg"></path>
<path d="M80 180 H180 V230 H326" class="trace-flow blue"></path>
<path d="M60 260 H150 V250 H326" class="trace-bg"></path>
<path d="M60 260 H150 V250 H326" class="trace-flow yellow"></path>
<path d="M100 350 H200 V270 H326" class="trace-bg"></path>
<path d="M100 350 H200 V270 H326" class="trace-flow green"></path>
<path d="M700 90 H560 V210 H474" class="trace-bg"></path>
<path d="M700 90 H560 V210 H474" class="trace-flow blue"></path>
<path d="M740 160 H580 V230 H474" class="trace-bg"></path>
<path d="M740 160 H580 V230 H474" class="trace-flow green"></path>
<path d="M720 250 H590 V250 H474" class="trace-bg"></path>
<path d="M720 250 H590 V250 H474" class="trace-flow red"></path>
<path d="M680 340 H570 V270 H474" class="trace-bg"></path>
<path d="M680 340 H570 V270 H474" class="trace-flow yellow"></path>
</g>
<rect
x="330"
y="190"
width="140"
height="100"
rx="20"
ry="20"
fill="url(#chipGradient)"
stroke="#222"
stroke-width="3"
filter="drop-shadow(0 0 6px rgba(0,0,0,0.8))"
></rect>
<g>
<rect
x="322"
y="205"
width="8"
height="10"
fill="url(#pinGradient)"
rx="2"
></rect>
<rect
x="322"
y="225"
width="8"
height="10"
fill="url(#pinGradient)"
rx="2"
></rect>
<rect
x="322"
y="245"
width="8"
height="10"
fill="url(#pinGradient)"
rx="2"
></rect>
<rect
x="322"
y="265"
width="8"
height="10"
fill="url(#pinGradient)"
rx="2"
></rect>
</g>
<g>
<rect
x="470"
y="205"
width="8"
height="10"
fill="url(#pinGradient)"
rx="2"
></rect>
<rect
x="470"
y="225"
width="8"
height="10"
fill="url(#pinGradient)"
rx="2"
></rect>
<rect
x="470"
y="245"
width="8"
height="10"
fill="url(#pinGradient)"
rx="2"
></rect>
<rect
x="470"
y="265"
width="8"
height="10"
fill="url(#pinGradient)"
rx="2"
></rect>
</g>
<text
x="400"
y="240"
font-family="Arial, sans-serif"
font-size="22"
fill="url(#textGradient)"
text-anchor="middle"
alignment-baseline="middle"
>
Loading
</text>
<circle cx="100" cy="100" r="5" fill="black"></circle>
<circle cx="80" cy="180" r="5" fill="black"></circle>
<circle cx="60" cy="260" r="5" fill="black"></circle>
<circle cx="100" cy="350" r="5" fill="black"></circle>
<circle cx="700" cy="90" r="5" fill="black"></circle>
<circle cx="740" cy="160" r="5" fill="black"></circle>
<circle cx="720" cy="250" r="5" fill="black"></circle>
<circle cx="680" cy="340" r="5" fill="black"></circle>
</svg>
</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>
<div class="notification-modal-actions">
<button id="modal-mark-all-read" class="btn-text" type="button">全部已读</button>
<button id="modal-delete-read" class="btn-text btn-danger" type="button">删除已读</button>
</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="./assets/xlsx.min.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/shipment-audit.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?v=20260312" defer></script>
<script src="./js/components/customer-order.js" defer></script>
<script src="./js/components/reconciliation.js" defer></script>
<script src="./js/components/outsourcing-orders.js" defer></script>
<script src="./js/components/outsourcing-material-issue.js" defer></script>
<script src="./js/components/finished-goods-receipt.js" defer></script>
<script src="./js/components/outsourcing-wip-stock.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>