|
|
@@ -99,7 +99,7 @@ import {
|
|
99
|
99
|
securityTestItemClassification,
|
|
100
|
100
|
securityTestPassingStatus,
|
|
101
|
101
|
securityTestRegion,
|
|
102
|
|
-
|
|
|
102
|
+countStationHourlyThroughput
|
|
103
|
103
|
} from '@/api/portraitManagement/portraitManagement'
|
|
104
|
104
|
|
|
105
|
105
|
const props = defineProps({
|
|
|
@@ -155,9 +155,19 @@ const seizedInfoData = [
|
|
155
|
155
|
]
|
|
156
|
156
|
|
|
157
|
157
|
|
|
|
158
|
+const channelCheckData = ref([])
|
|
|
159
|
+const invokerCountStationHourlyThroughput = (params) => {
|
|
|
160
|
+ countStationHourlyThroughput(params).then(res => {
|
|
|
161
|
+ if (res.code === 200 && res.data) {
|
|
|
162
|
+ channelCheckData.value = res.data || []
|
|
|
163
|
+ nextTick(() => initHourlyPassChart())
|
|
|
164
|
+ }
|
|
|
165
|
+ })
|
|
|
166
|
+}
|
|
|
167
|
+
|
|
158
|
168
|
const countSeizureInfoItemData = ref({ totalSeizeNum: 0, itemList: [] })
|
|
159
|
|
-const invokerCountSeizureInfoItem = () => {
|
|
160
|
|
- countSeizureInfoItem(props.queryParams).then(res => {
|
|
|
169
|
+const invokerCountSeizureInfoItem = (params) => {
|
|
|
170
|
+ countSeizureInfoItem(params).then(res => {
|
|
161
|
171
|
if (res.code === 200 && res.data) {
|
|
162
|
172
|
countSeizureInfoItemData.value = res.data || { totalSeizeNum: 0, itemList: [] }
|
|
163
|
173
|
}
|
|
|
@@ -165,8 +175,8 @@ const invokerCountSeizureInfoItem = () => {
|
|
165
|
175
|
}
|
|
166
|
176
|
|
|
167
|
177
|
const countSeizeSubjectCategoryQuantityData = ref([])
|
|
168
|
|
-const invokerCountSeizeSubjectCategoryQuantity = () => {
|
|
169
|
|
- countSeizeSubjectCategoryQuantity(props.queryParams).then(res => {
|
|
|
178
|
+const invokerCountSeizeSubjectCategoryQuantity = (params) => {
|
|
|
179
|
+ countSeizeSubjectCategoryQuantity(params).then(res => {
|
|
170
|
180
|
if (res.code === 200 && res.data) {
|
|
171
|
181
|
countSeizeSubjectCategoryQuantityData.value = res.data || []
|
|
172
|
182
|
}
|
|
|
@@ -174,8 +184,8 @@ const invokerCountSeizeSubjectCategoryQuantity = () => {
|
|
174
|
184
|
}
|
|
175
|
185
|
|
|
176
|
186
|
const countSeizureTotalQuantityData = ref([])
|
|
177
|
|
-const invokerCountSeizureTotalQuantity = () => {
|
|
178
|
|
- countSeizureTotalQuantity(props.queryParams).then(res => {
|
|
|
187
|
+const invokerCountSeizureTotalQuantity = (params) => {
|
|
|
188
|
+ countSeizureTotalQuantity(params).then(res => {
|
|
179
|
189
|
if (res.code === 200 && res.data) {
|
|
180
|
190
|
countSeizureTotalQuantityData.value = res.data || []
|
|
181
|
191
|
}
|
|
|
@@ -183,8 +193,8 @@ const invokerCountSeizureTotalQuantity = () => {
|
|
183
|
193
|
}
|
|
184
|
194
|
|
|
185
|
195
|
const countSeizureSingleQuantityData = ref([])
|
|
186
|
|
-const invokerCountSeizureSingleQuantity = () => {
|
|
187
|
|
- countSeizureSingleQuantity(props.queryParams).then(res => {
|
|
|
196
|
+const invokerCountSeizureSingleQuantity = (params) => {
|
|
|
197
|
+ countSeizureSingleQuantity(params).then(res => {
|
|
188
|
198
|
if (res.code === 200 && res.data) {
|
|
189
|
199
|
countSeizureSingleQuantityData.value = res.data || []
|
|
190
|
200
|
}
|
|
|
@@ -192,8 +202,8 @@ const invokerCountSeizureSingleQuantity = () => {
|
|
192
|
202
|
}
|
|
193
|
203
|
|
|
194
|
204
|
const countSeizeAreaQuantityData = ref([])
|
|
195
|
|
-const invokerCountSeizeAreaQuantity = () => {
|
|
196
|
|
- countSeizeAreaQuantity(props.queryParams).then(res => {
|
|
|
205
|
+const invokerCountSeizeAreaQuantity = (params) => {
|
|
|
206
|
+ countSeizeAreaQuantity(params).then(res => {
|
|
197
|
207
|
if (res.code === 200 && res.data) {
|
|
198
|
208
|
countSeizeAreaQuantityData.value = res.data || []
|
|
199
|
209
|
}
|
|
|
@@ -201,24 +211,24 @@ const invokerCountSeizeAreaQuantity = () => {
|
|
201
|
211
|
}
|
|
202
|
212
|
|
|
203
|
213
|
const countSeizureStatsItemData = ref([])
|
|
204
|
|
-const invokerCountSeizureStatsItem = () => {
|
|
205
|
|
- countSeizureStatsItem(props.queryParams).then(res => {
|
|
|
214
|
+const invokerCountSeizureStatsItem = (params) => {
|
|
|
215
|
+ countSeizureStatsItem(params).then(res => {
|
|
206
|
216
|
if (res.code === 200 && res.data) {
|
|
207
|
217
|
countSeizureStatsItemData.value = res.data || []
|
|
208
|
218
|
}
|
|
209
|
219
|
})
|
|
210
|
220
|
}
|
|
211
|
221
|
const countSeizureStatsTypeData = ref([])
|
|
212
|
|
-const invokerCountSeizureStatsType = () => {
|
|
213
|
|
- countSeizureStatsType(props.queryParams).then(res => {
|
|
|
222
|
+const invokerCountSeizureStatsType = (params) => {
|
|
|
223
|
+ countSeizureStatsType(params).then(res => {
|
|
214
|
224
|
if (res.code === 200 && res.data) {
|
|
215
|
225
|
countSeizureStatsTypeData.value = res.data || []
|
|
216
|
226
|
}
|
|
217
|
227
|
})
|
|
218
|
228
|
}
|
|
219
|
229
|
const countSeizureStatsPostData = ref([])
|
|
220
|
|
-const invokerCountSeizureStatsPost = () => {
|
|
221
|
|
- countSeizureStatsPost(props.queryParams).then(res => {
|
|
|
230
|
+const invokerCountSeizureStatsPost = (params) => {
|
|
|
231
|
+ countSeizureStatsPost(params).then(res => {
|
|
222
|
232
|
if (res.code === 200 && res.data) {
|
|
223
|
233
|
countSeizureStatsPostData.value = res.data || []
|
|
224
|
234
|
}
|
|
|
@@ -226,8 +236,8 @@ const invokerCountSeizureStatsPost = () => {
|
|
226
|
236
|
}
|
|
227
|
237
|
|
|
228
|
238
|
const securityTestItemClassificationData = ref([])
|
|
229
|
|
-const invokerSecurityTestItemClassification = () => {
|
|
230
|
|
- securityTestItemClassification(props.queryParams).then(res => {
|
|
|
239
|
+const invokerSecurityTestItemClassification = (params) => {
|
|
|
240
|
+ securityTestItemClassification(params).then(res => {
|
|
231
|
241
|
if (res.code === 200 && res.data) {
|
|
232
|
242
|
securityTestItemClassificationData.value = res.data || []
|
|
233
|
243
|
}
|
|
|
@@ -235,16 +245,16 @@ const invokerSecurityTestItemClassification = () => {
|
|
235
|
245
|
}
|
|
236
|
246
|
|
|
237
|
247
|
const securityTestPassingStatusData = ref([])
|
|
238
|
|
-const invokerSecurityTestPassingStatus = () => {
|
|
239
|
|
- securityTestPassingStatus(props.queryParams).then(res => {
|
|
|
248
|
+const invokerSecurityTestPassingStatus = (params) => {
|
|
|
249
|
+ securityTestPassingStatus(params).then(res => {
|
|
240
|
250
|
if (res.code === 200 && res.data) {
|
|
241
|
251
|
securityTestPassingStatusData.value = res.data || []
|
|
242
|
252
|
}
|
|
243
|
253
|
})
|
|
244
|
254
|
}
|
|
245
|
255
|
const securityTestRegionData = ref([])
|
|
246
|
|
-const invokerSecurityTestRegion = () => {
|
|
247
|
|
- securityTestRegion(props.queryParams).then(res => {
|
|
|
256
|
+const invokerSecurityTestRegion = (params) => {
|
|
|
257
|
+ securityTestRegion(params).then(res => {
|
|
248
|
258
|
if (res.code === 200 && res.data) {
|
|
249
|
259
|
securityTestRegionData.value = res.data || []
|
|
250
|
260
|
}
|
|
|
@@ -254,70 +264,33 @@ const invokerSecurityTestRegion = () => {
|
|
254
|
264
|
|
|
255
|
265
|
|
|
256
|
266
|
const fetchData = () => {
|
|
257
|
|
- invokerCountSeizureInfoItem()
|
|
258
|
|
- invokerCountSeizeSubjectCategoryQuantity()
|
|
259
|
|
- invokerCountSeizureTotalQuantity()
|
|
260
|
|
- invokerCountSeizureSingleQuantity()
|
|
261
|
|
- invokerCountSeizeAreaQuantity()
|
|
262
|
|
- invokerCountSeizureStatsItem()
|
|
263
|
|
- invokerCountSeizureStatsType()
|
|
264
|
|
- invokerCountSeizureStatsPost()
|
|
265
|
|
- invokerSecurityTestItemClassification()
|
|
266
|
|
- invokerSecurityTestPassingStatus()
|
|
267
|
|
- invokerSecurityTestRegion()
|
|
|
267
|
+ const params = {}
|
|
|
268
|
+ Object.keys(props.queryParams).forEach(key => {
|
|
|
269
|
+ const val = props.queryParams[key]
|
|
|
270
|
+ if (val !== null && val !== undefined && val !== '') {
|
|
|
271
|
+ params[key] = val
|
|
|
272
|
+ }
|
|
|
273
|
+ })
|
|
|
274
|
+
|
|
|
275
|
+ invokerCountStationHourlyThroughput(params)
|
|
|
276
|
+ invokerCountSeizureInfoItem(params)
|
|
|
277
|
+ invokerCountSeizeSubjectCategoryQuantity(params)
|
|
|
278
|
+ invokerCountSeizureTotalQuantity(params)
|
|
|
279
|
+ invokerCountSeizureSingleQuantity(params)
|
|
|
280
|
+ invokerCountSeizeAreaQuantity(params)
|
|
|
281
|
+ invokerCountSeizureStatsItem(params)
|
|
|
282
|
+ invokerCountSeizureStatsType(params)
|
|
|
283
|
+ invokerCountSeizureStatsPost(params)
|
|
|
284
|
+ invokerSecurityTestItemClassification(params)
|
|
|
285
|
+ invokerSecurityTestPassingStatus(params)
|
|
|
286
|
+ invokerSecurityTestRegion(params)
|
|
268
|
287
|
}
|
|
269
|
288
|
|
|
270
|
289
|
watch(() => props.queryParams, () => {
|
|
271
|
|
-
|
|
272
|
290
|
fetchData()
|
|
273
|
291
|
}, { deep: true, immediate: true })
|
|
274
|
292
|
|
|
275
|
|
-const seizedNumAllData = [
|
|
276
|
|
- { num: 150 }, { num: 160 }, { num: 145 }, { num: 180 }, { num: 170 },
|
|
277
|
|
- { num: 190 }, { num: 155 }, { num: 140 }, { num: 165 }, { num: 185 },
|
|
278
|
|
- { num: 175 }, { num: 200 }, { num: 180 }, { num: 195 }, { num: 170 },
|
|
279
|
|
- { num: 160 }, { num: 185 }, { num: 175 }, { num: 190 }
|
|
280
|
|
-]
|
|
281
|
293
|
|
|
282
|
|
-const workAreaDistData = [
|
|
283
|
|
- { num: 287, name: 'T3国内出发(4层)' },
|
|
284
|
|
- { num: 250, name: 'T3(8层出发)' },
|
|
285
|
|
- { num: 300, name: 'T3国际出发' },
|
|
286
|
|
- { num: 290, name: 'T3国际转国内' },
|
|
287
|
|
- { num: 240, name: '旅检A区' },
|
|
288
|
|
- { num: 250, name: 'T3要客服务区东' },
|
|
289
|
|
- { num: 260, name: 'T3要客服务区西' },
|
|
290
|
|
- { num: 255, name: 'T1要客服务区东' },
|
|
291
|
|
- { num: 245, name: 'T2要客服务区东' },
|
|
292
|
|
- { num: 260, name: '旅检B区' },
|
|
293
|
|
- { num: 280, name: '重检C区' }
|
|
294
|
|
-]
|
|
295
|
|
-
|
|
296
|
|
-const unsafeItemDistData = [
|
|
297
|
|
- { num: 66, name: '打火机' },
|
|
298
|
|
- { num: 174, name: '火柴' },
|
|
299
|
|
- { num: 65, name: '其他' },
|
|
300
|
|
- { num: 106, name: '危险物品' },
|
|
301
|
|
- { num: 173, name: '危险品' },
|
|
302
|
|
- { num: 48, name: '其他/危险品' }
|
|
303
|
|
-]
|
|
304
|
|
-
|
|
305
|
|
-const unsafeTypeDistData = [
|
|
306
|
|
- { num: 6, name: '一般' },
|
|
307
|
|
- { num: 6, name: '二级' },
|
|
308
|
|
- { num: 174, name: '三级' },
|
|
309
|
|
- { num: 48, name: '四级' },
|
|
310
|
|
- { num: 454, name: '五级' }
|
|
311
|
|
-]
|
|
312
|
|
-
|
|
313
|
|
-const unsafePostDistData = [
|
|
314
|
|
- { num: 100, name: '境外/非通道' },
|
|
315
|
|
- { num: 213, name: '值机柜台' },
|
|
316
|
|
- { num: 150, name: '验证/通道' },
|
|
317
|
|
- { num: 300, name: '人身检查' },
|
|
318
|
|
- { num: 187, name: 'X光/行李/开检' },
|
|
319
|
|
- { num: 387, name: '开箱/货检' }
|
|
320
|
|
-]
|
|
321
|
294
|
|
|
322
|
295
|
|
|
323
|
296
|
|
|
|
@@ -331,11 +304,53 @@ let dailySeizedArea = null
|
|
331
|
304
|
const initHourlyPassChart = () => {
|
|
332
|
305
|
if (!hourlyPassChartRef.value) return
|
|
333
|
306
|
hourlyPassChart = echarts.init(hourlyPassChartRef.value)
|
|
334
|
|
- const hours = Array.from({ length: 24 }, (_, i) => `${i.toString().padStart(2, '0')}:00`)
|
|
335
|
|
- const data1 = [450, 420, 380, 390, 410, 430, 460, 480, 520, 560, 600, 620, 650, 680, 700, 680, 650, 620, 580, 540, 500, 480, 450, 420]
|
|
336
|
|
- const data2 = [320, 310, 290, 300, 310, 330, 350, 370, 400, 430, 460, 480, 500, 520, 530, 510, 490, 470, 440, 410, 380, 360, 340, 320]
|
|
337
|
|
- const data3 = [250, 240, 220, 230, 240, 260, 280, 300, 330, 360, 390, 410, 430, 450, 460, 440, 420, 400, 370, 340, 310, 290, 270, 250]
|
|
338
|
|
- const lineData = [5.2, 4.8, 4.5, 4.7, 5.0, 5.3, 5.6, 5.8, 6.2, 6.5, 6.8, 7.0, 7.2, 7.5, 7.3, 7.1, 6.8, 6.5, 6.2, 5.8, 5.5, 5.2, 5.0, 4.8]
|
|
|
307
|
+
|
|
|
308
|
+ const rawData = channelCheckData.value
|
|
|
309
|
+ if (!rawData || rawData.length === 0) return
|
|
|
310
|
+
|
|
|
311
|
+ const hours = rawData.map(item => item.hour)
|
|
|
312
|
+
|
|
|
313
|
+ const areaNameMap = {}
|
|
|
314
|
+ rawData.forEach(item => {
|
|
|
315
|
+ item.areaList.forEach(area => {
|
|
|
316
|
+ if (!areaNameMap[area.areaName]) {
|
|
|
317
|
+ areaNameMap[area.areaName] = []
|
|
|
318
|
+ }
|
|
|
319
|
+ areaNameMap[area.areaName].push(area.areaFlow)
|
|
|
320
|
+ })
|
|
|
321
|
+ })
|
|
|
322
|
+
|
|
|
323
|
+ const legendList = Object.keys(areaNameMap)
|
|
|
324
|
+ const areaNames = legendList
|
|
|
325
|
+
|
|
|
326
|
+ const seriesBars = areaNames.map((areaName, idx) => {
|
|
|
327
|
+ const colors = [
|
|
|
328
|
+ ['#4da6ff', '#0f46fa'],
|
|
|
329
|
+ ['#7eff7e', '#2ecc71'],
|
|
|
330
|
+ ['#bd03fb', '#8a06e8'],
|
|
|
331
|
+ ['#ffa500', '#ff6600'],
|
|
|
332
|
+ ['#00bfff', '#0077be']
|
|
|
333
|
+ ]
|
|
|
334
|
+ const [c1, c2] = colors[idx % colors.length]
|
|
|
335
|
+ return {
|
|
|
336
|
+ name: areaName,
|
|
|
337
|
+ type: 'bar',
|
|
|
338
|
+ yAxisIndex: 0,
|
|
|
339
|
+ data: areaNameMap[areaName],
|
|
|
340
|
+ itemStyle: {
|
|
|
341
|
+ color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
|
342
|
+ { offset: 0, color: c1 },
|
|
|
343
|
+ { offset: 1, color: c2 }
|
|
|
344
|
+ ])
|
|
|
345
|
+ },
|
|
|
346
|
+ barWidth: '20%'
|
|
|
347
|
+ }
|
|
|
348
|
+ })
|
|
|
349
|
+
|
|
|
350
|
+ const lineData = rawData.map(item => item.totalHourFlow)
|
|
|
351
|
+ const maxBar = Math.max(...Object.values(areaNameMap).flat())
|
|
|
352
|
+ const maxLine = Math.max(...lineData)
|
|
|
353
|
+ const maxVal = Math.max(maxBar, maxLine)
|
|
339
|
354
|
|
|
340
|
355
|
const option = {
|
|
341
|
356
|
tooltip: {
|
|
|
@@ -345,7 +360,7 @@ const initHourlyPassChart = () => {
|
|
345
|
360
|
textStyle: { color: '#fff' }
|
|
346
|
361
|
},
|
|
347
|
362
|
legend: {
|
|
348
|
|
- data: ['T3国内出发(4层)', 'T3(8层出发)', 'T3国际出发', '人数均值'],
|
|
|
363
|
+ data: [...legendList, '人流总数'],
|
|
349
|
364
|
textStyle: { color: '#a0c4ff' },
|
|
350
|
365
|
top: 0
|
|
351
|
366
|
},
|
|
|
@@ -366,63 +381,25 @@ const initHourlyPassChart = () => {
|
|
366
|
381
|
type: 'value',
|
|
367
|
382
|
name: '人数',
|
|
368
|
383
|
position: 'left',
|
|
369
|
|
- max: 800,
|
|
|
384
|
+ max: Math.ceil(maxVal * 1.2),
|
|
370
|
385
|
axisLabel: { color: '#a0c4ff' },
|
|
371
|
386
|
axisLine: { lineStyle: { color: 'rgba(15,70,250,0.3)' } },
|
|
372
|
387
|
splitLine: { lineStyle: { color: 'rgba(15,70,250,0.2)' } }
|
|
373
|
388
|
},
|
|
374
|
389
|
{
|
|
375
|
390
|
type: 'value',
|
|
376
|
|
- name: '均值',
|
|
|
391
|
+ name: '人流总数',
|
|
377
|
392
|
position: 'right',
|
|
378
|
|
- max: 10,
|
|
|
393
|
+ max: Math.ceil(maxVal * 1.2),
|
|
379
|
394
|
axisLabel: { color: '#a0c4ff' },
|
|
380
|
395
|
axisLine: { lineStyle: { color: 'rgba(15,70,250,0.3)' } },
|
|
381
|
396
|
splitLine: { show: false }
|
|
382
|
397
|
}
|
|
383
|
398
|
],
|
|
384
|
399
|
series: [
|
|
|
400
|
+ ...seriesBars,
|
|
385
|
401
|
{
|
|
386
|
|
- name: 'T3国内出发(4层)',
|
|
387
|
|
- type: 'bar',
|
|
388
|
|
- yAxisIndex: 0,
|
|
389
|
|
- data: data1,
|
|
390
|
|
- itemStyle: {
|
|
391
|
|
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
392
|
|
- { offset: 0, color: '#4da6ff' },
|
|
393
|
|
- { offset: 1, color: '#0f46fa' }
|
|
394
|
|
- ])
|
|
395
|
|
- },
|
|
396
|
|
- barWidth: '20%'
|
|
397
|
|
- },
|
|
398
|
|
- {
|
|
399
|
|
- name: 'T3(8层出发)',
|
|
400
|
|
- type: 'bar',
|
|
401
|
|
- yAxisIndex: 0,
|
|
402
|
|
- data: data2,
|
|
403
|
|
- itemStyle: {
|
|
404
|
|
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
405
|
|
- { offset: 0, color: '#7eff7e' },
|
|
406
|
|
- { offset: 1, color: '#2ecc71' }
|
|
407
|
|
- ])
|
|
408
|
|
- },
|
|
409
|
|
- barWidth: '20%'
|
|
410
|
|
- },
|
|
411
|
|
- {
|
|
412
|
|
- name: 'T3国际出发',
|
|
413
|
|
- type: 'bar',
|
|
414
|
|
- yAxisIndex: 0,
|
|
415
|
|
- data: data3,
|
|
416
|
|
- itemStyle: {
|
|
417
|
|
- color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
|
418
|
|
- { offset: 0, color: '#bd03fb' },
|
|
419
|
|
- { offset: 1, color: '#8a06e8' }
|
|
420
|
|
- ])
|
|
421
|
|
- },
|
|
422
|
|
- barWidth: '20%'
|
|
423
|
|
- },
|
|
424
|
|
- {
|
|
425
|
|
- name: '人数均值',
|
|
|
402
|
+ name: '人流总数',
|
|
426
|
403
|
type: 'line',
|
|
427
|
404
|
yAxisIndex: 1,
|
|
428
|
405
|
data: lineData,
|