You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

804 lines
28 KiB

3 days ago
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <title>中山智能立体仓库可视化监控中心</title>
  8. <!-- ECharts -->
  9. <script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
  10. <script src="/jeasyui/jquery.min.js"></script>
  11. <style>
  12. * {
  13. margin: 0;
  14. padding: 0;
  15. box-sizing: border-box;
  16. }
  17. body {
  18. font-family: 'Microsoft YaHei', Arial, sans-serif;
  19. background: linear-gradient(135deg, #0a1628 0%, #1e3a5f 50%, #0a1628 100%);
  20. color: #fff;
  21. overflow: hidden;
  22. height: 100vh;
  23. }
  24. .dashboard-container {
  25. width: 100%;
  26. height: 100vh;
  27. padding: 20px;
  28. display: flex;
  29. flex-direction: column;
  30. }
  31. /* 头部标题 */
  32. .header {
  33. text-align: center;
  34. padding: 15px 0;
  35. background: linear-gradient(90deg, rgba(14, 116, 144, 0.2) 0%, rgba(14, 116, 144, 0.6) 50%, rgba(14, 116, 144, 0.2) 100%);
  36. border-bottom: 2px solid rgba(0, 204, 255, 0.5);
  37. margin-bottom: 20px;
  38. position: relative;
  39. }
  40. .header h1 {
  41. font-size: 32px;
  42. font-weight: bold;
  43. letter-spacing: 3px;
  44. background: linear-gradient(to right, #00d4ff, #00ffff);
  45. -webkit-background-clip: text;
  46. -webkit-text-fill-color: transparent;
  47. text-shadow: 0 0 30px rgba(0, 212, 255, 0.5);
  48. }
  49. .header .subtitle {
  50. font-size: 14px;
  51. color: #7dd3fc;
  52. letter-spacing: 8px;
  53. margin-top: 5px;
  54. }
  55. .header .datetime {
  56. position: absolute;
  57. right: 30px;
  58. top: 50%;
  59. transform: translateY(-50%);
  60. color: #7dd3fc;
  61. font-size: 14px;
  62. }
  63. /* 主内容区域 */
  64. .main-content {
  65. flex: 1;
  66. display: grid;
  67. grid-template-columns: 1fr 1fr 1fr;
  68. grid-template-rows: 300px 1fr;
  69. gap: 20px;
  70. height: calc(100vh - 140px);
  71. }
  72. /* 卡片样式 */
  73. .card {
  74. background: rgba(13, 35, 58, 0.7);
  75. border: 1px solid rgba(0, 204, 255, 0.3);
  76. border-radius: 8px;
  77. padding: 15px;
  78. backdrop-filter: blur(10px);
  79. box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
  80. position: relative;
  81. overflow: hidden;
  82. }
  83. .card::before {
  84. content: '';
  85. position: absolute;
  86. top: 0;
  87. left: 0;
  88. right: 0;
  89. height: 2px;
  90. background: linear-gradient(90deg, transparent, #00d4ff, transparent);
  91. }
  92. .card-title {
  93. font-size: 16px;
  94. color: #00d4ff;
  95. margin-bottom: 15px;
  96. padding-bottom: 10px;
  97. border-bottom: 1px solid rgba(0, 204, 255, 0.2);
  98. display: flex;
  99. justify-content: space-between;
  100. align-items: center;
  101. }
  102. .card-title .en {
  103. font-size: 11px;
  104. color: #7dd3fc;
  105. font-weight: normal;
  106. letter-spacing: 1px;
  107. }
  108. /* 任务统计总览 */
  109. .task-overview {
  110. grid-column: 1;
  111. grid-row: 1;
  112. }
  113. .stats-grid {
  114. display: grid;
  115. grid-template-columns: 1fr 1fr;
  116. gap: 10px;
  117. margin-bottom: 15px;
  118. }
  119. .stat-item {
  120. background: rgba(0, 100, 150, 0.2);
  121. padding: 15px;
  122. border-radius: 5px;
  123. border: 1px solid rgba(0, 204, 255, 0.3);
  124. text-align: center;
  125. }
  126. .stat-icon {
  127. font-size: 28px;
  128. margin-bottom: 8px;
  129. }
  130. .stat-label {
  131. font-size: 12px;
  132. color: #7dd3fc;
  133. margin-bottom: 5px;
  134. }
  135. .stat-value {
  136. font-size: 28px;
  137. font-weight: bold;
  138. color: #00d4ff;
  139. }
  140. .stat-percent {
  141. font-size: 14px;
  142. color: #4ade80;
  143. margin-top: 5px;
  144. }
  145. .status-row {
  146. display: flex;
  147. justify-content: space-around;
  148. margin-top: 10px;
  149. }
  150. .status-item {
  151. text-align: center;
  152. padding: 10px;
  153. background: rgba(0, 100, 150, 0.2);
  154. border-radius: 5px;
  155. flex: 1;
  156. margin: 0 5px;
  157. }
  158. .status-item .label {
  159. font-size: 11px;
  160. color: #7dd3fc;
  161. }
  162. .status-item .value {
  163. font-size: 22px;
  164. font-weight: bold;
  165. color: #fff;
  166. margin-top: 5px;
  167. }
  168. /* 库位利用率分析 */
  169. .storage-utilization {
  170. grid-column: 2;
  171. grid-row: 1;
  172. }
  173. .util-header {
  174. display: flex;
  175. justify-content: space-around;
  176. margin-bottom: 15px;
  177. }
  178. .util-item {
  179. text-align: center;
  180. }
  181. .util-item .label {
  182. font-size: 12px;
  183. color: #7dd3fc;
  184. }
  185. .util-item .value {
  186. font-size: 24px;
  187. font-weight: bold;
  188. color: #00d4ff;
  189. margin-top: 5px;
  190. }
  191. .util-item .percent {
  192. font-size: 28px;
  193. color: #4ade80;
  194. }
  195. #storageChart {
  196. width: 100%;
  197. height: 180px;
  198. }
  199. /* 设备运行状态 */
  200. .device-status {
  201. grid-column: 3;
  202. grid-row: 1;
  203. }
  204. .device-group {
  205. margin-bottom: 15px;
  206. }
  207. .device-group-title {
  208. font-size: 13px;
  209. color: #7dd3fc;
  210. margin-bottom: 8px;
  211. display: flex;
  212. align-items: center;
  213. }
  214. .device-group-title::before {
  215. content: '●';
  216. margin-right: 5px;
  217. color: #00d4ff;
  218. }
  219. .device-item {
  220. display: flex;
  221. justify-content: space-between;
  222. align-items: center;
  223. padding: 8px 12px;
  224. margin-bottom: 5px;
  225. background: rgba(0, 100, 150, 0.2);
  226. border-radius: 4px;
  227. border-left: 3px solid transparent;
  228. }
  229. .device-item.working {
  230. border-left-color: #4ade80;
  231. }
  232. .device-item.idle {
  233. border-left-color: #fbbf24;
  234. }
  235. .device-item.charging {
  236. border-left-color: #3b82f6;
  237. }
  238. .device-name {
  239. font-size: 13px;
  240. color: #fff;
  241. }
  242. .device-info {
  243. display: flex;
  244. align-items: center;
  245. gap: 15px;
  246. }
  247. .device-status-badge {
  248. font-size: 11px;
  249. padding: 3px 8px;
  250. border-radius: 3px;
  251. display: flex;
  252. align-items: center;
  253. }
  254. .device-status-badge::before {
  255. content: '●';
  256. margin-right: 4px;
  257. }
  258. .device-status-badge.working {
  259. background: rgba(74, 222, 128, 0.2);
  260. color: #4ade80;
  261. }
  262. .device-status-badge.idle {
  263. background: rgba(251, 191, 36, 0.2);
  264. color: #fbbf24;
  265. }
  266. .device-status-badge.charging {
  267. background: rgba(59, 130, 246, 0.2);
  268. color: #3b82f6;
  269. }
  270. .device-battery {
  271. font-size: 11px;
  272. color: #7dd3fc;
  273. }
  274. .device-tasks {
  275. font-size: 11px;
  276. color: #7dd3fc;
  277. }
  278. /* 趋势图表 */
  279. .trend-chart {
  280. height: 100%;
  281. }
  282. #rawMaterialChart,
  283. #specifiedMaterialChart,
  284. #finishedGoodsChart {
  285. width: 100%;
  286. height: calc(100% - 45px);
  287. min-height: 250px;
  288. }
  289. /* 返回按钮 */
  290. .back-btn {
  291. position: absolute;
  292. top: 20px;
  293. left: 20px;
  294. padding: 10px 20px;
  295. background: rgba(0, 100, 150, 0.5);
  296. border: 1px solid rgba(0, 204, 255, 0.5);
  297. border-radius: 5px;
  298. color: #00d4ff;
  299. text-decoration: none;
  300. font-size: 14px;
  301. transition: all 0.3s;
  302. z-index: 1000;
  303. }
  304. .back-btn:hover {
  305. background: rgba(0, 150, 200, 0.8);
  306. box-shadow: 0 0 15px rgba(0, 204, 255, 0.5);
  307. }
  308. </style>
  309. </head>
  310. <body>
  311. <a href="/" class="back-btn">← 返回主页</a>
  312. <div class="dashboard-container">
  313. <!-- 头部 -->
  314. <div class="header">
  315. <h1>中山智能立体仓库可视化监控中心</h1>
  316. <div class="subtitle">ZHONGSHAN INTELLIGENT 3D WAREHOUSE VISUALIZATION & MONITORING CENTER</div>
  317. <div class="datetime" id="datetime"></div>
  318. </div>
  319. <!-- 主内容 -->
  320. <div class="main-content">
  321. <!-- 任务统计总览 -->
  322. <div class="card task-overview">
  323. <div class="card-title">
  324. <span>任务统计总览</span>
  325. <span class="en">TASK OVERVIEW</span>
  326. </div>
  327. <div class="stats-grid">
  328. <div class="stat-item">
  329. <div class="stat-icon">📋</div>
  330. <div class="stat-label">月度作业数</div>
  331. <div class="stat-value">2969</div>
  332. </div>
  333. <div class="stat-item">
  334. <div class="stat-icon">📊</div>
  335. <div class="stat-label">当日作业数</div>
  336. <div class="stat-value">770</div>
  337. </div>
  338. </div>
  339. <div class="stats-grid">
  340. <div class="stat-item">
  341. <div class="stat-icon">📦</div>
  342. <div class="stat-label">出库作业</div>
  343. <div class="stat-value">1023</div>
  344. <div class="stat-percent">34%</div>
  345. </div>
  346. <div class="stat-item">
  347. <div class="stat-icon">📥</div>
  348. <div class="stat-label">入库作业</div>
  349. <div class="stat-value">1946</div>
  350. <div class="stat-percent">65%</div>
  351. </div>
  352. </div>
  353. <div style="margin-top: 10px; padding: 10px; background: rgba(0, 100, 150, 0.2); border-radius: 5px;">
  354. <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 5px;">
  355. <span style="font-size: 12px; color: #7dd3fc;">空托盘总数</span>
  356. <span style="font-size: 18px; font-weight: bold; color: #fbbf24;">148</span>
  357. </div>
  358. <div class="status-row">
  359. <div class="status-item">
  360. <div class="label">平托盘</div>
  361. <div class="value" style="color: #4ade80;">40</div>
  362. </div>
  363. <div class="status-item">
  364. <div class="label">圆框托盘</div>
  365. <div class="value" style="color: #a78bfa;">59</div>
  366. </div>
  367. <div class="status-item">
  368. <div class="label">钢托盘</div>
  369. <div class="value" style="color: #fb923c;">49</div>
  370. </div>
  371. </div>
  372. </div>
  373. </div>
  374. <!-- 库位利用率分析 -->
  375. <div class="card storage-utilization">
  376. <div class="card-title">
  377. <span>库位利用率分析</span>
  378. <span class="en">STORAGE UTILIZATION</span>
  379. </div>
  380. <div class="util-header">
  381. <div class="util-item">
  382. <div class="label">总库位数</div>
  383. <div class="value">1960</div>
  384. </div>
  385. <div class="util-item">
  386. <div class="label">已使用</div>
  387. <div class="value">708</div>
  388. </div>
  389. <div class="util-item">
  390. <div class="label">利用率</div>
  391. <div class="percent">36.1%</div>
  392. </div>
  393. </div>
  394. <div id="storageChart"></div>
  395. </div>
  396. <!-- 设备运行状态 -->
  397. <div class="card device-status">
  398. <div class="card-title">
  399. <span>设备运行状态</span>
  400. <span class="en">DEVICE STATUS</span>
  401. </div>
  402. <div class="device-group">
  403. <div class="device-group-title">🤖 拣选机器人</div>
  404. <div class="device-item working">
  405. <div class="device-name">机器人#1</div>
  406. <div class="device-info">
  407. <div class="device-status-badge working">工作中</div>
  408. <div class="device-tasks">任务:2</div>
  409. </div>
  410. </div>
  411. <div class="device-item working">
  412. <div class="device-name">机器人#2</div>
  413. <div class="device-info">
  414. <div class="device-status-badge working">工作中</div>
  415. <div class="device-tasks">任务:4</div>
  416. </div>
  417. </div>
  418. </div>
  419. <div class="device-group">
  420. <div class="device-group-title">🚗 AGV搬运车</div>
  421. <div class="device-item idle">
  422. <div class="device-name">AGV#34703</div>
  423. <div class="device-info">
  424. <div class="device-status-badge idle">空闲</div>
  425. <div class="device-battery">电量:84%</div>
  426. </div>
  427. </div>
  428. <div class="device-item working">
  429. <div class="device-name">AGV#34705</div>
  430. <div class="device-info">
  431. <div class="device-status-badge working">运行中</div>
  432. <div class="device-battery">电量:68%</div>
  433. <div class="device-tasks">任务:1</div>
  434. </div>
  435. </div>
  436. <div class="device-item working">
  437. <div class="device-name">AGV#34706</div>
  438. <div class="device-info">
  439. <div class="device-status-badge working">运行中</div>
  440. <div class="device-battery">电量:73%</div>
  441. <div class="device-tasks">任务:1</div>
  442. </div>
  443. </div>
  444. <div class="device-item charging">
  445. <div class="device-name">AGV#34704</div>
  446. <div class="device-info">
  447. <div class="device-status-badge charging">充电中</div>
  448. <div class="device-battery">电量:71%</div>
  449. <div class="device-tasks">任务:0</div>
  450. </div>
  451. </div>
  452. </div>
  453. </div>
  454. <!-- 原材料库存量趋势 -->
  455. <div class="card trend-chart">
  456. <div class="card-title">
  457. <span>原材料库存量趋势</span>
  458. <span class="en">RAW MATERIAL INVENTORY TREND</span>
  459. </div>
  460. <div id="rawMaterialChart"></div>
  461. </div>
  462. <!-- 规格料库存量趋势 -->
  463. <div class="card trend-chart">
  464. <div class="card-title">
  465. <span>规格料库存量趋势</span>
  466. <span class="en">SPECIFIED MATERIALS INVENTORY TREND</span>
  467. </div>
  468. <div id="specifiedMaterialChart"></div>
  469. </div>
  470. <!-- 产成品库存趋势 -->
  471. <div class="card trend-chart">
  472. <div class="card-title">
  473. <span>产成品库存趋势</span>
  474. <span class="en">FINISHED GOODS INVENTORY TREND</span>
  475. </div>
  476. <div id="finishedGoodsChart"></div>
  477. </div>
  478. </div>
  479. </div>
  480. <script>
  481. // 更新时间
  482. function updateDateTime() {
  483. var now = new Date();
  484. var year = now.getFullYear();
  485. var month = String(now.getMonth() + 1).padStart(2, '0');
  486. var day = String(now.getDate()).padStart(2, '0');
  487. var hours = String(now.getHours()).padStart(2, '0');
  488. var minutes = String(now.getMinutes()).padStart(2, '0');
  489. var seconds = String(now.getSeconds()).padStart(2, '0');
  490. var weekdays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
  491. var weekday = weekdays[now.getDay()];
  492. document.getElementById('datetime').innerHTML =
  493. '● ' + year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds + ' ' + weekday;
  494. }
  495. updateDateTime();
  496. setInterval(updateDateTime, 1000);
  497. // 等待页面加载完成后初始化图表
  498. var storageChart, rawMaterialChart, specifiedMaterialChart, finishedGoodsChart;
  499. window.addEventListener('load', function() {
  500. initCharts();
  501. });
  502. function initCharts() {
  503. // 库位利用率饼图
  504. storageChart = echarts.init(document.getElementById('storageChart'));
  505. var storageOption = {
  506. tooltip: {
  507. trigger: 'item',
  508. backgroundColor: 'rgba(0, 20, 40, 0.9)',
  509. borderColor: '#00d4ff',
  510. borderWidth: 1,
  511. textStyle: {
  512. color: '#fff'
  513. }
  514. },
  515. legend: {
  516. orient: 'vertical',
  517. right: '10%',
  518. top: 'center',
  519. textStyle: {
  520. color: '#7dd3fc',
  521. fontSize: 11
  522. },
  523. itemWidth: 10,
  524. itemHeight: 10
  525. },
  526. series: [
  527. {
  528. type: 'pie',
  529. radius: ['45%', '70%'],
  530. center: ['35%', '50%'],
  531. avoidLabelOverlap: false,
  532. label: {
  533. show: false
  534. },
  535. labelLine: {
  536. show: false
  537. },
  538. data: [
  539. { value: 1252, name: '用库位数 (1252)', itemStyle: { color: '#1e3a5f' } },
  540. { value: 268, name: '钢托盘 (268)', itemStyle: { color: '#00d4ff' } },
  541. { value: 156, name: '圆框托盘 (156)', itemStyle: { color: '#a855f7' } },
  542. { value: 284, name: '平托盘 (284)', itemStyle: { color: '#4ade80' } }
  543. ]
  544. }
  545. ]
  546. };
  547. storageChart.setOption(storageOption);
  548. // 原材料库存量趋势
  549. rawMaterialChart = echarts.init(document.getElementById('rawMaterialChart'));
  550. var rawMaterialOption = {
  551. grid: {
  552. left: '8%',
  553. right: '5%',
  554. bottom: '12%',
  555. top: '5%'
  556. },
  557. xAxis: {
  558. type: 'category',
  559. data: ['1日', '3日', '5日', '7日', '9日', '11日', '13日', '15日', '17日', '19日', '21日', '23日', '25日', '27日', '29日', '31日'],
  560. axisLine: {
  561. lineStyle: { color: 'rgba(0, 204, 255, 0.3)' }
  562. },
  563. axisLabel: {
  564. color: '#7dd3fc',
  565. fontSize: 10
  566. }
  567. },
  568. yAxis: {
  569. type: 'value',
  570. axisLine: {
  571. lineStyle: { color: 'rgba(0, 204, 255, 0.3)' }
  572. },
  573. splitLine: {
  574. lineStyle: { color: 'rgba(0, 204, 255, 0.1)' }
  575. },
  576. axisLabel: {
  577. color: '#7dd3fc',
  578. fontSize: 10
  579. }
  580. },
  581. series: [{
  582. data: [10000, 50000, 100000, 200000, 300000, 400000, 500000, 600000, 650000, 700000, 750000, 800000, 850000, 900000, 920000, 950000],
  583. type: 'line',
  584. smooth: true,
  585. lineStyle: {
  586. color: '#00d4ff',
  587. width: 2
  588. },
  589. areaStyle: {
  590. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  591. { offset: 0, color: 'rgba(0, 212, 255, 0.3)' },
  592. { offset: 1, color: 'rgba(0, 212, 255, 0.05)' }
  593. ])
  594. },
  595. symbol: 'circle',
  596. symbolSize: 6,
  597. itemStyle: {
  598. color: '#00d4ff',
  599. borderColor: '#fff',
  600. borderWidth: 2
  601. }
  602. }]
  603. };
  604. rawMaterialChart.setOption(rawMaterialOption);
  605. // 规格料库存量趋势
  606. specifiedMaterialChart = echarts.init(document.getElementById('specifiedMaterialChart'));
  607. var specifiedMaterialOption = {
  608. grid: {
  609. left: '8%',
  610. right: '5%',
  611. bottom: '12%',
  612. top: '5%'
  613. },
  614. xAxis: {
  615. type: 'category',
  616. data: ['1日', '3日', '5日', '7日', '9日', '11日', '13日', '15日', '17日', '19日', '21日', '23日', '25日', '27日', '29日', '31日'],
  617. axisLine: {
  618. lineStyle: { color: 'rgba(0, 204, 255, 0.3)' }
  619. },
  620. axisLabel: {
  621. color: '#7dd3fc',
  622. fontSize: 10
  623. }
  624. },
  625. yAxis: {
  626. type: 'value',
  627. axisLine: {
  628. lineStyle: { color: 'rgba(0, 204, 255, 0.3)' }
  629. },
  630. splitLine: {
  631. lineStyle: { color: 'rgba(0, 204, 255, 0.1)' }
  632. },
  633. axisLabel: {
  634. color: '#7dd3fc',
  635. fontSize: 10
  636. }
  637. },
  638. series: [{
  639. data: [10000, 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000, 100000, 120000, 140000, 150000, 270000, 280000, 275000],
  640. type: 'line',
  641. smooth: true,
  642. lineStyle: {
  643. color: '#4ade80',
  644. width: 2
  645. },
  646. areaStyle: {
  647. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  648. { offset: 0, color: 'rgba(74, 222, 128, 0.3)' },
  649. { offset: 1, color: 'rgba(74, 222, 128, 0.05)' }
  650. ])
  651. },
  652. symbol: 'circle',
  653. symbolSize: 6,
  654. itemStyle: {
  655. color: '#4ade80',
  656. borderColor: '#fff',
  657. borderWidth: 2
  658. }
  659. }]
  660. };
  661. specifiedMaterialChart.setOption(specifiedMaterialOption);
  662. // 产成品库存趋势
  663. finishedGoodsChart = echarts.init(document.getElementById('finishedGoodsChart'));
  664. var finishedGoodsOption = {
  665. grid: {
  666. left: '8%',
  667. right: '5%',
  668. bottom: '12%',
  669. top: '5%'
  670. },
  671. xAxis: {
  672. type: 'category',
  673. data: ['1日', '3日', '5日', '7日', '9日', '11日', '13日', '15日', '17日', '19日', '21日', '23日', '25日', '27日', '29日', '31日'],
  674. axisLine: {
  675. lineStyle: { color: 'rgba(0, 204, 255, 0.3)' }
  676. },
  677. axisLabel: {
  678. color: '#7dd3fc',
  679. fontSize: 10
  680. }
  681. },
  682. yAxis: {
  683. type: 'value',
  684. axisLine: {
  685. lineStyle: { color: 'rgba(0, 204, 255, 0.3)' }
  686. },
  687. splitLine: {
  688. lineStyle: { color: 'rgba(0, 204, 255, 0.1)' }
  689. },
  690. axisLabel: {
  691. color: '#7dd3fc',
  692. fontSize: 10
  693. }
  694. },
  695. series: [{
  696. data: [500000, 1000000, 2000000, 3000000, 3500000, 4000000, 4500000, 5000000, 5500000, 6000000, 7000000, 10000000, 15000000, 20000000, 22000000, 24000000],
  697. type: 'line',
  698. smooth: true,
  699. lineStyle: {
  700. color: '#a855f7',
  701. width: 2
  702. },
  703. areaStyle: {
  704. color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
  705. { offset: 0, color: 'rgba(168, 85, 247, 0.3)' },
  706. { offset: 1, color: 'rgba(168, 85, 247, 0.05)' }
  707. ])
  708. },
  709. symbol: 'circle',
  710. symbolSize: 6,
  711. itemStyle: {
  712. color: '#a855f7',
  713. borderColor: '#fff',
  714. borderWidth: 2
  715. }
  716. }]
  717. };
  718. finishedGoodsChart.setOption(finishedGoodsOption);
  719. // 响应式调整
  720. window.addEventListener('resize', function() {
  721. storageChart.resize();
  722. rawMaterialChart.resize();
  723. specifiedMaterialChart.resize();
  724. finishedGoodsChart.resize();
  725. });
  726. // 定时刷新数据(模拟实时更新)
  727. setInterval(function() {
  728. // 这里可以添加AJAX请求获取实时数据
  729. // 目前使用静态数据展示
  730. }, 5000);
  731. }
  732. </script>
  733. </body>
  734. </html>