Explorar el Código

refactor(runData): 统一后端接口地址并新增运行数据大屏API

1.  新增runScreen.js封装大屏所有后端接口
2.  替换四个业务模块的API接口路径为统一的/item前缀接口
3.  调整导入导出接口的请求方式和参数格式
4.  重构runScreen页面,接入真实后端数据替代 mock 数据
huoyi hace 1 mes
padre
commit
a83409c64c

+ 19 - 19
src/api/runData/collectWaitingAreaData.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
3 3
 // 查询候检区数据列表
4 4
 export function listCollectWaitingAreaData(query) {
5 5
   return request({
6
-    url: '/runData/collectWaitingAreaData/list',
6
+    url: '/item/hkPendingConfiscate/list',
7 7
     method: 'get',
8 8
     params: query
9 9
   })
@@ -12,7 +12,7 @@ export function listCollectWaitingAreaData(query) {
12 12
 // 查询候检区数据详细
13 13
 export function getCollectWaitingAreaData(id) {
14 14
   return request({
15
-    url: '/runData/collectWaitingAreaData/' + id,
15
+    url: '/item/hkPendingConfiscate/' + id,
16 16
     method: 'get'
17 17
   })
18 18
 }
@@ -20,7 +20,7 @@ export function getCollectWaitingAreaData(id) {
20 20
 // 新增候检区数据
21 21
 export function addCollectWaitingAreaData(data) {
22 22
   return request({
23
-    url: '/runData/collectWaitingAreaData',
23
+    url: '/item/hkPendingConfiscate',
24 24
     method: 'post',
25 25
     data: data
26 26
   })
@@ -29,7 +29,7 @@ export function addCollectWaitingAreaData(data) {
29 29
 // 修改候检区数据
30 30
 export function updateCollectWaitingAreaData(data) {
31 31
   return request({
32
-    url: '/runData/collectWaitingAreaData',
32
+    url: '/item/hkPendingConfiscate',
33 33
     method: 'put',
34 34
     data: data
35 35
   })
@@ -38,35 +38,35 @@ export function updateCollectWaitingAreaData(data) {
38 38
 // 删除候检区数据
39 39
 export function delCollectWaitingAreaData(id) {
40 40
   return request({
41
-    url: '/runData/collectWaitingAreaData/' + id,
41
+    url: '/item/hkPendingConfiscate/' + id,
42 42
     method: 'delete'
43 43
   })
44 44
 }
45 45
 
46 46
 // 导出候检区数据
47
-export function exportCollectWaitingAreaData(query) {
47
+export function exportCollectWaitingAreaData(data) {
48 48
   return request({
49
-    url: '/runData/collectWaitingAreaData/export',
50
-    method: 'get',
51
-    params: query,
49
+    url: '/item/hkPendingConfiscate/export',
50
+    method: 'post',
51
+    data: data,
52 52
     responseType: 'blob'
53 53
   })
54 54
 }
55 55
 
56
-// 导入候检区数据
57
-export function importCollectWaitingAreaData(data) {
56
+// 下载导入模板
57
+export function importTemplate() {
58 58
   return request({
59
-    url: '/runData/collectWaitingAreaData/importData',
59
+    url: '/item/hkPendingConfiscate/importTemplate',
60 60
     method: 'post',
61
-    data: data
61
+    responseType: 'blob'
62 62
   })
63 63
 }
64 64
 
65
-// 下载导入模板
66
-export function importTemplate() {
65
+// 导入候检区数据
66
+export function importCollectWaitingAreaData(data) {
67 67
   return request({
68
-    url: '/runData/collectWaitingAreaData/importTemplate',
69
-    method: 'get',
70
-    responseType: 'blob'
68
+    url: '/item/hkPendingConfiscate/importData',
69
+    method: 'post',
70
+    data: data
71 71
   })
72
-}
72
+}

+ 19 - 19
src/api/runData/dailyRunData.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
3 3
 // 查询日常运行数据列表
4 4
 export function listDailyRunData(query) {
5 5
   return request({
6
-    url: '/runData/dailyRunData/list',
6
+    url: '/item/hkOperationData/list',
7 7
     method: 'get',
8 8
     params: query
9 9
   })
@@ -12,7 +12,7 @@ export function listDailyRunData(query) {
12 12
 // 查询日常运行数据详细
13 13
 export function getDailyRunData(id) {
14 14
   return request({
15
-    url: '/runData/dailyRunData/' + id,
15
+    url: '/item/hkOperationData/' + id,
16 16
     method: 'get'
17 17
   })
18 18
 }
@@ -20,7 +20,7 @@ export function getDailyRunData(id) {
20 20
 // 新增日常运行数据
21 21
 export function addDailyRunData(data) {
22 22
   return request({
23
-    url: '/runData/dailyRunData',
23
+    url: '/item/hkOperationData',
24 24
     method: 'post',
25 25
     data: data
26 26
   })
@@ -29,7 +29,7 @@ export function addDailyRunData(data) {
29 29
 // 修改日常运行数据
30 30
 export function updateDailyRunData(data) {
31 31
   return request({
32
-    url: '/runData/dailyRunData',
32
+    url: '/item/hkOperationData',
33 33
     method: 'put',
34 34
     data: data
35 35
   })
@@ -38,35 +38,35 @@ export function updateDailyRunData(data) {
38 38
 // 删除日常运行数据
39 39
 export function delDailyRunData(id) {
40 40
   return request({
41
-    url: '/runData/dailyRunData/' + id,
41
+    url: '/item/hkOperationData/' + id,
42 42
     method: 'delete'
43 43
   })
44 44
 }
45 45
 
46 46
 // 导出日常运行数据
47
-export function exportDailyRunData(query) {
47
+export function exportDailyRunData(data) {
48 48
   return request({
49
-    url: '/runData/dailyRunData/export',
50
-    method: 'get',
51
-    params: query,
49
+    url: '/item/hkOperationData/export',
50
+    method: 'post',
51
+    data: data,
52 52
     responseType: 'blob'
53 53
   })
54 54
 }
55 55
 
56
-// 导入日常运行数据
57
-export function importDailyRunData(data) {
56
+// 下载导入模板
57
+export function importTemplate() {
58 58
   return request({
59
-    url: '/runData/dailyRunData/importData',
59
+    url: '/item/hkOperationData/importTemplate',
60 60
     method: 'post',
61
-    data: data
61
+    responseType: 'blob'
62 62
   })
63 63
 }
64 64
 
65
-// 下载导入模板
66
-export function importTemplate() {
65
+// 导入日常运行数据
66
+export function importDailyRunData(data) {
67 67
   return request({
68
-    url: '/runData/dailyRunData/importTemplate',
69
-    method: 'get',
70
-    responseType: 'blob'
68
+    url: '/item/hkOperationData/importData',
69
+    method: 'post',
70
+    data: data
71 71
   })
72
-}
72
+}

+ 19 - 19
src/api/runData/discouragePowerBanksData.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
3 3
 // 查询劝阻充电宝数据列表
4 4
 export function listDiscouragePowerBanksData(query) {
5 5
   return request({
6
-    url: '/runData/discouragePowerBanksData/list',
6
+    url: '/item/hkPersuadePowerBank/list',
7 7
     method: 'get',
8 8
     params: query
9 9
   })
@@ -12,7 +12,7 @@ export function listDiscouragePowerBanksData(query) {
12 12
 // 查询劝阻充电宝数据详细
13 13
 export function getDiscouragePowerBanksData(id) {
14 14
   return request({
15
-    url: '/runData/discouragePowerBanksData/' + id,
15
+    url: '/item/hkPersuadePowerBank/' + id,
16 16
     method: 'get'
17 17
   })
18 18
 }
@@ -20,7 +20,7 @@ export function getDiscouragePowerBanksData(id) {
20 20
 // 新增劝阻充电宝数据
21 21
 export function addDiscouragePowerBanksData(data) {
22 22
   return request({
23
-    url: '/runData/discouragePowerBanksData',
23
+    url: '/item/hkPersuadePowerBank',
24 24
     method: 'post',
25 25
     data: data
26 26
   })
@@ -29,7 +29,7 @@ export function addDiscouragePowerBanksData(data) {
29 29
 // 修改劝阻充电宝数据
30 30
 export function updateDiscouragePowerBanksData(data) {
31 31
   return request({
32
-    url: '/runData/discouragePowerBanksData',
32
+    url: '/item/hkPersuadePowerBank',
33 33
     method: 'put',
34 34
     data: data
35 35
   })
@@ -38,35 +38,35 @@ export function updateDiscouragePowerBanksData(data) {
38 38
 // 删除劝阻充电宝数据
39 39
 export function delDiscouragePowerBanksData(id) {
40 40
   return request({
41
-    url: '/runData/discouragePowerBanksData/' + id,
41
+    url: '/item/hkPersuadePowerBank/' + id,
42 42
     method: 'delete'
43 43
   })
44 44
 }
45 45
 
46 46
 // 导出劝阻充电宝数据
47
-export function exportDiscouragePowerBanksData(query) {
47
+export function exportDiscouragePowerBanksData(data) {
48 48
   return request({
49
-    url: '/runData/discouragePowerBanksData/export',
50
-    method: 'get',
51
-    params: query,
49
+    url: '/item/hkPersuadePowerBank/export',
50
+    method: 'post',
51
+    data: data,
52 52
     responseType: 'blob'
53 53
   })
54 54
 }
55 55
 
56
-// 导入劝阻充电宝数据
57
-export function importDiscouragePowerBanksData(data) {
56
+// 下载导入模板
57
+export function importTemplate() {
58 58
   return request({
59
-    url: '/runData/discouragePowerBanksData/importData',
59
+    url: '/item/hkPersuadePowerBank/importTemplate',
60 60
     method: 'post',
61
-    data: data
61
+    responseType: 'blob'
62 62
   })
63 63
 }
64 64
 
65
-// 下载导入模板
66
-export function importTemplate() {
65
+// 导入劝阻充电宝数据
66
+export function importDiscouragePowerBanksData(data) {
67 67
   return request({
68
-    url: '/runData/discouragePowerBanksData/importTemplate',
69
-    method: 'get',
70
-    responseType: 'blob'
68
+    url: '/item/hkPersuadePowerBank/importData',
69
+    method: 'post',
70
+    data: data
71 71
   })
72
-}
72
+}

+ 95 - 0
src/api/runData/runScreen.js

@@ -0,0 +1,95 @@
1
+import request from '@/utils/request'
2
+
3
+// 模块一:运行数据
4
+
5
+// 运行数据汇总(5个数字卡片)
6
+export function getOperationSummary(query) {
7
+  return request({
8
+    url: '/hk/screen/operationSummary',
9
+    method: 'get',
10
+    params: query
11
+  })
12
+}
13
+
14
+// T1旅检过检人数趋势(A区/B区折线图)
15
+export function getT1PassengerTrend(query) {
16
+  return request({
17
+    url: '/hk/screen/t1PassengerTrend',
18
+    method: 'get',
19
+    params: query
20
+  })
21
+}
22
+
23
+// T2旅检过检人数趋势(国内/国际旅检折线图)
24
+export function getT2PassengerTrend(query) {
25
+  return request({
26
+    url: '/hk/screen/t2PassengerTrend',
27
+    method: 'get',
28
+    params: query
29
+  })
30
+}
31
+
32
+// 行检过检数趋势(T1/T2行检折线图)
33
+export function getLuggageCheckTrend(query) {
34
+  return request({
35
+    url: '/hk/screen/luggageCheckTrend',
36
+    method: 'get',
37
+    params: query
38
+  })
39
+}
40
+
41
+// 货物过检数趋势(国内/国际货站折线图)
42
+export function getCargoTrend(query) {
43
+  return request({
44
+    url: '/hk/screen/cargoTrend',
45
+    method: 'get',
46
+    params: query
47
+  })
48
+}
49
+
50
+// 车辆过检数趋势(南侧/北侧车检折线图)
51
+export function getVehicleCheckTrend(query) {
52
+  return request({
53
+    url: '/hk/screen/vehicleCheckTrend',
54
+    method: 'get',
55
+    params: query
56
+  })
57
+}
58
+
59
+// 模块二:查获/收缴数据
60
+
61
+// 查获数据分类(环形图)
62
+export function getSeizureCategory(query) {
63
+  return request({
64
+    url: '/hk/screen/seizureCategory',
65
+    method: 'get',
66
+    params: query
67
+  })
68
+}
69
+
70
+// 大队查获数对比(柱状图)
71
+export function getBrigadeSeizureCompare(query) {
72
+  return request({
73
+    url: '/hk/screen/brigadeSeizureCompare',
74
+    method: 'get',
75
+    params: query
76
+  })
77
+}
78
+
79
+// 不合规充电宝数据(环形图)
80
+export function getPowerBankSummary(query) {
81
+  return request({
82
+    url: '/hk/screen/powerBankSummary',
83
+    method: 'get',
84
+    params: query
85
+  })
86
+}
87
+
88
+// 待检区收缴物品数据(环形图)
89
+export function getPendingConfiscate(query) {
90
+  return request({
91
+    url: '/hk/screen/pendingConfiscate',
92
+    method: 'get',
93
+    params: query
94
+  })
95
+}

+ 19 - 19
src/api/runData/seizeData.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
3 3
 // 查询查获数据列表
4 4
 export function listSeizeData(query) {
5 5
   return request({
6
-    url: '/runData/seizeData/list',
6
+    url: '/item/hkSeizureStat/list',
7 7
     method: 'get',
8 8
     params: query
9 9
   })
@@ -12,7 +12,7 @@ export function listSeizeData(query) {
12 12
 // 查询查获数据详细
13 13
 export function getSeizeData(id) {
14 14
   return request({
15
-    url: '/runData/seizeData/' + id,
15
+    url: '/item/hkSeizureStat/' + id,
16 16
     method: 'get'
17 17
   })
18 18
 }
@@ -20,7 +20,7 @@ export function getSeizeData(id) {
20 20
 // 新增查获数据
21 21
 export function addSeizeData(data) {
22 22
   return request({
23
-    url: '/runData/seizeData',
23
+    url: '/item/hkSeizureStat',
24 24
     method: 'post',
25 25
     data: data
26 26
   })
@@ -29,7 +29,7 @@ export function addSeizeData(data) {
29 29
 // 修改查获数据
30 30
 export function updateSeizeData(data) {
31 31
   return request({
32
-    url: '/runData/seizeData',
32
+    url: '/item/hkSeizureStat',
33 33
     method: 'put',
34 34
     data: data
35 35
   })
@@ -38,35 +38,35 @@ export function updateSeizeData(data) {
38 38
 // 删除查获数据
39 39
 export function delSeizeData(id) {
40 40
   return request({
41
-    url: '/runData/seizeData/' + id,
41
+    url: '/item/hkSeizureStat/' + id,
42 42
     method: 'delete'
43 43
   })
44 44
 }
45 45
 
46 46
 // 导出查获数据
47
-export function exportSeizeData(query) {
47
+export function exportSeizeData(data) {
48 48
   return request({
49
-    url: '/runData/seizeData/export',
50
-    method: 'get',
51
-    params: query,
49
+    url: '/item/hkSeizureStat/export',
50
+    method: 'post',
51
+    data: data,
52 52
     responseType: 'blob'
53 53
   })
54 54
 }
55 55
 
56
-// 导入查获数据
57
-export function importSeizeData(data) {
56
+// 下载导入模板
57
+export function importTemplate() {
58 58
   return request({
59
-    url: '/runData/seizeData/importData',
59
+    url: '/item/hkSeizureStat/importTemplate',
60 60
     method: 'post',
61
-    data: data
61
+    responseType: 'blob'
62 62
   })
63 63
 }
64 64
 
65
-// 下载导入模板
66
-export function importTemplate() {
65
+// 导入查获数据
66
+export function importSeizeData(data) {
67 67
   return request({
68
-    url: '/runData/seizeData/importTemplate',
69
-    method: 'get',
70
-    responseType: 'blob'
68
+    url: '/item/hkSeizureStat/importData',
69
+    method: 'post',
70
+    data: data
71 71
   })
72
-}
72
+}

+ 256 - 78
src/views/runData/runScreen/index.vue

@@ -171,6 +171,18 @@
171 171
 <script setup name="RunScreen">
172 172
 import { ref, onMounted, onUnmounted, nextTick } from 'vue'
173 173
 import * as echarts from 'echarts'
174
+import {
175
+  getOperationSummary,
176
+  getT1PassengerTrend,
177
+  getT2PassengerTrend,
178
+  getLuggageCheckTrend,
179
+  getCargoTrend,
180
+  getVehicleCheckTrend,
181
+  getSeizureCategory,
182
+  getBrigadeSeizureCompare,
183
+  getPowerBankSummary,
184
+  getPendingConfiscate
185
+} from '@/api/runData/runScreen.js'
174 186
 
175 187
 // 图表引用
176 188
 const t1TravelChart = ref(null)
@@ -200,118 +212,265 @@ let waitingAreaPieChartInstance = null
200 212
 
201 213
 // 运行数据
202 214
 const runData = ref({
203
-  travelInspectionTotal: 12580,
204
-  luggageInspectionTotal: 8920,
205
-  domesticCargoTotal: 1560,
206
-  internationalCargoTotal: 980,
207
-  vehicleInspectionTotal: 450
215
+  travelInspectionTotal: 0,
216
+  luggageInspectionTotal: 0,
217
+  domesticCargoTotal: 0,
218
+  internationalCargoTotal: 0,
219
+  vehicleInspectionTotal: 0
208 220
 })
209 221
 
222
+const t1PassengerData = ref([])
223
+const t2PassengerData = ref([])
224
+const luggageCheckData = ref([])
225
+const cargoData = ref([])
226
+const vehicleCheckData = ref([])
227
+const seizureCategoryData = ref([])
228
+const brigadeSeizureData = ref([])
229
+const powerBankData = ref({})
230
+const pendingConfiscateData = ref({})
231
+
232
+async function loadData() {
233
+  try {
234
+    const query = {}
235
+    
236
+    const [
237
+      summaryRes,
238
+      t1PassengerRes,
239
+      t2PassengerRes,
240
+      luggageRes,
241
+      cargoRes,
242
+      vehicleRes,
243
+      seizureRes,
244
+      brigadeRes,
245
+      powerBankRes,
246
+      pendingRes
247
+    ] = await Promise.all([
248
+      getOperationSummary(query),
249
+      getT1PassengerTrend(query),
250
+      getT2PassengerTrend(query),
251
+      getLuggageCheckTrend(query),
252
+      getCargoTrend(query),
253
+      getVehicleCheckTrend(query),
254
+      getSeizureCategory(query),
255
+      getBrigadeSeizureCompare(query),
256
+      getPowerBankSummary(query),
257
+      getPendingConfiscate(query)
258
+    ])
259
+    
260
+    if (summaryRes.data) {
261
+      runData.value = summaryRes.data
262
+    }
263
+    
264
+    if (t1PassengerRes.data) {
265
+      t1PassengerData.value = t1PassengerRes.data
266
+    }
267
+    
268
+    if (t2PassengerRes.data) {
269
+      t2PassengerData.value = t2PassengerRes.data
270
+    }
271
+    
272
+    if (luggageRes.data) {
273
+      luggageCheckData.value = luggageRes.data
274
+    }
275
+    
276
+    if (cargoRes.data) {
277
+      cargoData.value = cargoRes.data
278
+    }
279
+    
280
+    if (vehicleRes.data) {
281
+      vehicleCheckData.value = vehicleRes.data
282
+    }
283
+    
284
+    if (seizureRes.data) {
285
+      seizureCategoryData.value = seizureRes.data
286
+    }
287
+    
288
+    if (brigadeRes.data) {
289
+      brigadeSeizureData.value = brigadeRes.data
290
+    }
291
+    
292
+    if (powerBankRes.data) {
293
+      powerBankData.value = powerBankRes.data
294
+    }
295
+    
296
+    if (pendingRes.data) {
297
+      pendingConfiscateData.value = pendingRes.data
298
+    }
299
+    
300
+    nextTick(() => {
301
+      initCharts()
302
+    })
303
+  } catch (error) {
304
+    console.error('加载数据失败:', error)
305
+  }
306
+}
307
+
210 308
 // 初始化所有图表
211 309
 function initCharts() {
212 310
   // T1旅检过检人数折线图
213 311
   if (t1TravelChart.value) {
214 312
     t1TravelChartInstance = echarts.init(t1TravelChart.value)
313
+    const t1Data = t1PassengerData.value || []
215 314
     t1TravelChartInstance.setOption({
216 315
       tooltip: { trigger: 'axis' },
217 316
       xAxis: {
218 317
         type: 'category',
219
-        data: ['08:00', '10:00', '12:00', '14:00', '16:00', '18:00', '20:00']
318
+        data: t1Data.map(item => item.recordDate || item.aZone || '')
220 319
       },
221 320
       yAxis: { type: 'value' },
222
-      series: [{
223
-        data: [820, 932, 901, 934, 1290, 1330, 1320],
224
-        type: 'line',
225
-        smooth: true,
226
-        lineStyle: { color: '#5470c6' },
227
-        areaStyle: { color: 'rgba(84, 112, 198, 0.2)' }
228
-      }]
321
+      series: [
322
+        {
323
+          name: 'A区',
324
+          data: t1Data.map(item => item.aZone || 0),
325
+          type: 'line',
326
+          smooth: true,
327
+          lineStyle: { color: '#E8B140' },
328
+          areaStyle: { color: 'rgba(232, 177, 64, 0.2)' }
329
+        },
330
+        {
331
+          name: 'B区',
332
+          data: t1Data.map(item => item.bZone || 0),
333
+          type: 'line',
334
+          smooth: true,
335
+          lineStyle: { color: '#5470c6' },
336
+          areaStyle: { color: 'rgba(84, 112, 198, 0.2)' }
337
+        }
338
+      ]
229 339
     })
230 340
   }
231 341
 
232 342
   // T2旅检过检人数折线图
233 343
   if (t2TravelChart.value) {
234 344
     t2TravelChartInstance = echarts.init(t2TravelChart.value)
345
+    const t2Data = t2PassengerData.value || []
235 346
     t2TravelChartInstance.setOption({
236 347
       tooltip: { trigger: 'axis' },
237 348
       xAxis: {
238 349
         type: 'category',
239
-        data: ['08:00', '10:00', '12:00', '14:00', '16:00', '18:00', '20:00']
350
+        data: t2Data.map(item => item.recordDate || '')
240 351
       },
241 352
       yAxis: { type: 'value' },
242
-      series: [{
243
-        data: [620, 732, 701, 734, 890, 930, 920],
244
-        type: 'line',
245
-        smooth: true,
246
-        lineStyle: { color: '#91cc75' },
247
-        areaStyle: { color: 'rgba(145, 204, 117, 0.2)' }
248
-      }]
353
+      series: [
354
+        {
355
+          name: '国内旅检',
356
+          data: t2Data.map(item => item.domesticPassenger || 0),
357
+          type: 'line',
358
+          smooth: true,
359
+          lineStyle: { color: '#91cc75' },
360
+          areaStyle: { color: 'rgba(145, 204, 117, 0.2)' }
361
+        },
362
+        {
363
+          name: '国际旅检',
364
+          data: t2Data.map(item => item.intlPassenger || 0),
365
+          type: 'line',
366
+          smooth: true,
367
+          lineStyle: { color: '#fac858' },
368
+          areaStyle: { color: 'rgba(250, 200, 88, 0.2)' }
369
+        }
370
+      ]
249 371
     })
250 372
   }
251 373
 
252 374
   // 行检过检数折线图
253 375
   if (luggageChart.value) {
254 376
     luggageChartInstance = echarts.init(luggageChart.value)
377
+    const luggageData = luggageCheckData.value || []
255 378
     luggageChartInstance.setOption({
256 379
       tooltip: { trigger: 'axis' },
257 380
       xAxis: {
258 381
         type: 'category',
259
-        data: ['08:00', '10:00', '12:00', '14:00', '16:00', '18:00', '20:00']
382
+        data: luggageData.map(item => item.recordDate || '')
260 383
       },
261 384
       yAxis: { type: 'value' },
262
-      series: [{
263
-        data: [620, 832, 701, 834, 1090, 1130, 1120],
264
-        type: 'line',
265
-        smooth: true,
266
-        lineStyle: { color: '#fac858' },
267
-        areaStyle: { color: 'rgba(250, 200, 88, 0.2)' }
268
-      }]
385
+      series: [
386
+        {
387
+          name: 'T1行检',
388
+          data: luggageData.map(item => item.t1LuggageCheck || 0),
389
+          type: 'line',
390
+          smooth: true,
391
+          lineStyle: { color: '#ee6666' },
392
+          areaStyle: { color: 'rgba(238, 102, 102, 0.2)' }
393
+        },
394
+        {
395
+          name: 'T2行检',
396
+          data: luggageData.map(item => item.t2LuggageCheck || 0),
397
+          type: 'line',
398
+          smooth: true,
399
+          lineStyle: { color: '#73c0de' },
400
+          areaStyle: { color: 'rgba(115, 192, 222, 0.2)' }
401
+        }
402
+      ]
269 403
     })
270 404
   }
271 405
 
272 406
   // 货物过检数折线图
273 407
   if (cargoChart.value) {
274 408
     cargoChartInstance = echarts.init(cargoChart.value)
409
+    const cargoTrendData = cargoData.value || []
275 410
     cargoChartInstance.setOption({
276 411
       tooltip: { trigger: 'axis' },
277 412
       xAxis: {
278 413
         type: 'category',
279
-        data: ['08:00', '10:00', '12:00', '14:00', '16:00', '18:00', '20:00']
414
+        data: cargoTrendData.map(item => item.recordDate || '')
280 415
       },
281 416
       yAxis: { type: 'value' },
282
-      series: [{
283
-        data: [120, 232, 201, 234, 290, 330, 320],
284
-        type: 'line',
285
-        smooth: true,
286
-        lineStyle: { color: '#ee6666' },
287
-        areaStyle: { color: 'rgba(238, 102, 102, 0.2)' }
288
-      }]
417
+      series: [
418
+        {
419
+          name: '国内货站',
420
+          data: cargoTrendData.map(item => item.domesticCargo || 0),
421
+          type: 'line',
422
+          smooth: true,
423
+          lineStyle: { color: '#E8B140' },
424
+          areaStyle: { color: 'rgba(232, 177, 64, 0.2)' }
425
+        },
426
+        {
427
+          name: '国际货站',
428
+          data: cargoTrendData.map(item => item.intlCargo || 0),
429
+          type: 'line',
430
+          smooth: true,
431
+          lineStyle: { color: '#26B6BE' },
432
+          areaStyle: { color: 'rgba(38, 182, 190, 0.2)' }
433
+        }
434
+      ]
289 435
     })
290 436
   }
291 437
 
292 438
   // 车辆过检数折线图
293 439
   if (vehicleChart.value) {
294 440
     vehicleChartInstance = echarts.init(vehicleChart.value)
441
+    const vehicleData = vehicleCheckData.value || []
295 442
     vehicleChartInstance.setOption({
296 443
       tooltip: { trigger: 'axis' },
297 444
       xAxis: {
298 445
         type: 'category',
299
-        data: ['08:00', '10:00', '12:00', '14:00', '16:00', '18:00', '20:00']
446
+        data: vehicleData.map(item => item.recordDate || '')
300 447
       },
301 448
       yAxis: { type: 'value' },
302
-      series: [{
303
-        data: [30, 52, 41, 54, 70, 83, 80],
304
-        type: 'line',
305
-        smooth: true,
306
-        lineStyle: { color: '#73c0de' },
307
-        areaStyle: { color: 'rgba(115, 192, 222, 0.2)' }
308
-      }]
449
+      series: [
450
+        {
451
+          name: '南侧车检',
452
+          data: vehicleData.map(item => item.southVehicleCheck || 0),
453
+          type: 'line',
454
+          smooth: true,
455
+          lineStyle: { color: '#E8B140' },
456
+          areaStyle: { color: 'rgba(232, 177, 64, 0.2)' }
457
+        },
458
+        {
459
+          name: '北侧车检',
460
+          data: vehicleData.map(item => item.northVehicleCheck || 0),
461
+          type: 'line',
462
+          smooth: true,
463
+          lineStyle: { color: '#5470c6' },
464
+          areaStyle: { color: 'rgba(84, 112, 198, 0.2)' }
465
+        }
466
+      ]
309 467
     })
310 468
   }
311 469
 
312 470
   // 查获数据环形图
313 471
   if (seizePieChart.value) {
314 472
     seizePieChartInstance = echarts.init(seizePieChart.value)
473
+    const seizureData = seizureCategoryData.value || []
315 474
     seizePieChartInstance.setOption({
316 475
       tooltip: { trigger: 'item' },
317 476
       legend: { orient: 'vertical', right: 10, top: 'center' },
@@ -320,13 +479,7 @@ function initCharts() {
320 479
         type: 'pie',
321 480
         radius: ['40%', '70%'],
322 481
         center: ['40%', '50%'],
323
-        data: [
324
-          { value: 1048, name: '火种' },
325
-          { value: 735, name: '刀具' },
326
-          { value: 580, name: '警械器具' },
327
-          { value: 484, name: '烟花爆竹' },
328
-          { value: 300, name: '其他' }
329
-        ],
482
+        data: seizureData.map(item => ({ name: item.name, value: item.total })),
330 483
         emphasis: {
331 484
           itemStyle: {
332 485
             shadowBlur: 10,
@@ -341,33 +494,49 @@ function initCharts() {
341 494
   // 大队查获数对比柱状图
342 495
   if (teamSeizeBarChart.value) {
343 496
     teamSeizeBarChartInstance = echarts.init(teamSeizeBarChart.value)
497
+    const brigadeData = brigadeSeizureData.value || []
344 498
     teamSeizeBarChartInstance.setOption({
345 499
       tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
500
+      legend: { data: ['T1区', 'T2区', '总量'] },
346 501
       xAxis: {
347 502
         type: 'category',
348
-        data: ['一大队', '二大队', '三大队', '四大队', '五大队', '六大队']
503
+        data: [...new Set(brigadeData.map(item => item.brigade))]
349 504
       },
350 505
       yAxis: { type: 'value' },
351
-      series: [{
352
-        data: [120, 200, 150, 80, 70, 110],
353
-        type: 'bar',
354
-        itemStyle: { color: '#5470c6' }
355
-      }]
506
+      series: [
507
+        {
508
+          name: 'T1区',
509
+          data: brigadeData.filter(item => item.shift === '白班').map(item => ({ value: item.t1Total, brigade: item.brigade })),
510
+          type: 'bar'
511
+        },
512
+        {
513
+          name: 'T2区',
514
+          data: brigadeData.filter(item => item.shift === '白班').map(item => ({ value: item.t2Total, brigade: item.brigade })),
515
+          type: 'bar'
516
+        },
517
+        {
518
+          name: '总量',
519
+          data: brigadeData.filter(item => item.shift === '白班').map(item => ({ value: item.grandTotal, brigade: item.brigade })),
520
+          type: 'bar'
521
+        }
522
+      ]
356 523
     })
357 524
   }
358 525
 
359 526
   // T1区域各大队查获数对比柱状图
360 527
   if (t1TeamBarChart.value) {
361 528
     t1TeamBarChartInstance = echarts.init(t1TeamBarChart.value)
529
+    const t1BrigadeData = (brigadeSeizureData.value || []).filter(item => item.shift === '白班')
362 530
     t1TeamBarChartInstance.setOption({
363 531
       tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
364 532
       xAxis: {
365 533
         type: 'category',
366
-        data: ['一大队', '二大队', '三大队', '四大队']
534
+        data: [...new Set(t1BrigadeData.map(item => item.brigade))]
367 535
       },
368 536
       yAxis: { type: 'value' },
369 537
       series: [{
370
-        data: [80, 120, 90, 60],
538
+        name: 'T1查获数',
539
+        data: t1BrigadeData.map(item => item.t1Total),
371 540
         type: 'bar',
372 541
         itemStyle: { color: '#91cc75' }
373 542
       }]
@@ -377,15 +546,17 @@ function initCharts() {
377 546
   // T2区域各大队查获数对比柱状图
378 547
   if (t2TeamBarChart.value) {
379 548
     t2TeamBarChartInstance = echarts.init(t2TeamBarChart.value)
549
+    const t2BrigadeData = (brigadeSeizureData.value || []).filter(item => item.shift === '夜班')
380 550
     t2TeamBarChartInstance.setOption({
381 551
       tooltip: { trigger: 'axis', axisPointer: { type: 'shadow' } },
382 552
       xAxis: {
383 553
         type: 'category',
384
-        data: ['五大队', '六大队', '七大队', '八大队']
554
+        data: [...new Set(t2BrigadeData.map(item => item.brigade))]
385 555
       },
386 556
       yAxis: { type: 'value' },
387 557
       series: [{
388
-        data: [70, 90, 80, 50],
558
+        name: 'T2查获数',
559
+        data: t2BrigadeData.map(item => item.t2Total),
389 560
         type: 'bar',
390 561
         itemStyle: { color: '#fac858' }
391 562
       }]
@@ -395,6 +566,18 @@ function initCharts() {
395 566
   // 不合格充电宝劝阻数组环形图
396 567
   if (powerBankPieChart.value) {
397 568
     powerBankPieChartInstance = echarts.init(powerBankPieChart.value)
569
+    const pbData = powerBankData.value || {}
570
+    const powerBankChartData = [
571
+      { name: '邮寄', value: pbData.mailTotal || 0 },
572
+      { name: '暂存', value: pbData.tempStoreTotal || 0 },
573
+      { name: '自弃', value: pbData.abandonTotal || 0 },
574
+      { name: '召回', value: pbData.recallTotal || 0 },
575
+      { name: '无3C标识', value: pbData.no3cTotal || 0 },
576
+      { name: '标识不清', value: pbData.unclearMarkTotal || 0 },
577
+      { name: '超规数量', value: pbData.excessQtyTotal || 0 },
578
+      { name: '其他', value: pbData.bothTotal || 0 }
579
+    ].filter(item => item.value > 0)
580
+    
398 581
     powerBankPieChartInstance.setOption({
399 582
       tooltip: { trigger: 'item' },
400 583
       legend: { orient: 'vertical', right: 10, top: 'center' },
@@ -403,12 +586,7 @@ function initCharts() {
403 586
         type: 'pie',
404 587
         radius: ['40%', '70%'],
405 588
         center: ['40%', '50%'],
406
-        data: [
407
-          { value: 320, name: '无3C标识' },
408
-          { value: 240, name: '标识不清' },
409
-          { value: 180, name: '超规数量' },
410
-          { value: 150, name: '其他' }
411
-        ],
589
+        data: powerBankChartData,
412 590
         emphasis: {
413 591
           itemStyle: {
414 592
             shadowBlur: 10,
@@ -423,6 +601,13 @@ function initCharts() {
423 601
   // 待检区收缴禁限带物品数据表环形图
424 602
   if (waitingAreaPieChart.value) {
425 603
     waitingAreaPieChartInstance = echarts.init(waitingAreaPieChart.value)
604
+    const pendingData = pendingConfiscateData.value || {}
605
+    const pendingChartData = [
606
+      { name: '火种', value: pendingData.fireSourceTotal || 0 },
607
+      { name: '液态物品', value: pendingData.liquidTotal || 0 },
608
+      { name: '其他', value: pendingData.otherTotal || 0 }
609
+    ].filter(item => item.value > 0)
610
+    
426 611
     waitingAreaPieChartInstance.setOption({
427 612
       tooltip: { trigger: 'item' },
428 613
       legend: { orient: 'vertical', right: 10, top: 'center' },
@@ -431,12 +616,7 @@ function initCharts() {
431 616
         type: 'pie',
432 617
         radius: ['40%', '70%'],
433 618
         center: ['40%', '50%'],
434
-        data: [
435
-          { value: 420, name: '火种' },
436
-          { value: 280, name: '液态物品' },
437
-          { value: 190, name: '其他物品' },
438
-          { value: 120, name: '其他' }
439
-        ],
619
+        data: pendingChartData,
440 620
         emphasis: {
441 621
           itemStyle: {
442 622
             shadowBlur: 10,
@@ -467,10 +647,8 @@ function handleResize() {
467 647
 
468 648
 // 组件挂载时初始化图表
469 649
 onMounted(() => {
470
-  nextTick(() => {
471
-    initCharts()
472
-    window.addEventListener('resize', handleResize)
473
-  })
650
+  loadData()
651
+  window.addEventListener('resize', handleResize)
474 652
 })
475 653
 
476 654
 // 组件卸载时销毁图表