闪电 преди 10 месеца
родител
ревизия
c7f8094849
променени са 3 файла, в които са добавени 653 реда и са изтрити 20 реда
  1. 49 0
      src/assets/style.css
  2. 557 0
      src/views/main/report/connectionVolumes/bulletin.vue
  3. 47 20
      src/views/main/report/connectionVolumes/connectionVolumes.vue

+ 49 - 0
src/assets/style.css

@@ -782,6 +782,10 @@ video {
782 782
   margin-top: auto;
783 783
 }
784 784
 
785
+.mb-3 {
786
+  margin-bottom: 0.75rem;
787
+}
788
+
785 789
 .line-clamp-2 {
786 790
   overflow: hidden;
787 791
   display: -webkit-box;
@@ -869,6 +873,10 @@ video {
869 873
   height: 100%;
870 874
 }
871 875
 
876
+.h-\[160px\] {
877
+  height: 160px;
878
+}
879
+
872 880
 .max-h-96 {
873 881
   max-height: 24rem;
874 882
 }
@@ -889,6 +897,10 @@ video {
889 897
   min-height: calc(100vh - 120px);
890 898
 }
891 899
 
900
+.\!w-\[400px\] {
901
+  width: 400px !important;
902
+}
903
+
892 904
 .w-1 {
893 905
   width: 0.25rem;
894 906
 }
@@ -945,6 +957,10 @@ video {
945 957
   width: 100%;
946 958
 }
947 959
 
960
+.w-\[300px\] {
961
+  width: 300px;
962
+}
963
+
948 964
 .w-\[320px\] {
949 965
   width: 320px;
950 966
 }
@@ -965,10 +981,22 @@ video {
965 981
   width: 1px;
966 982
 }
967 983
 
984
+.w-\[330px\] {
985
+  width: 330px;
986
+}
987
+
988
+.w-\[350px\] {
989
+  width: 350px;
990
+}
991
+
968 992
 .max-w-7xl {
969 993
   max-width: 80rem;
970 994
 }
971 995
 
996
+.max-w-3xl {
997
+  max-width: 48rem;
998
+}
999
+
972 1000
 .flex-1 {
973 1001
   flex: 1 1 0%;
974 1002
 }
@@ -1003,6 +1031,10 @@ video {
1003 1031
   resize: both;
1004 1032
 }
1005 1033
 
1034
+.grid-cols-1 {
1035
+  grid-template-columns: repeat(1, minmax(0, 1fr));
1036
+}
1037
+
1006 1038
 .grid-cols-2 {
1007 1039
   grid-template-columns: repeat(2, minmax(0, 1fr));
1008 1040
 }
@@ -1162,6 +1194,10 @@ video {
1162 1194
   border-top-width: 1px;
1163 1195
 }
1164 1196
 
1197
+.border-l-4 {
1198
+  border-left-width: 4px;
1199
+}
1200
+
1165 1201
 .border-blue-200 {
1166 1202
   --tw-border-opacity: 1;
1167 1203
   border-color: rgb(191 219 254 / var(--tw-border-opacity, 1));
@@ -1354,6 +1390,10 @@ video {
1354 1390
   padding: 1.5rem;
1355 1391
 }
1356 1392
 
1393
+.p-8 {
1394
+  padding: 2rem;
1395
+}
1396
+
1357 1397
 .px-2 {
1358 1398
   padding-left: 0.5rem;
1359 1399
   padding-right: 0.5rem;
@@ -1417,6 +1457,10 @@ video {
1417 1457
   padding-top: 1.75rem;
1418 1458
 }
1419 1459
 
1460
+.pl-3 {
1461
+  padding-left: 0.75rem;
1462
+}
1463
+
1420 1464
 .text-center {
1421 1465
   text-align: center;
1422 1466
 }
@@ -1546,6 +1590,11 @@ video {
1546 1590
   color: rgb(31 41 55 / var(--tw-text-opacity, 1));
1547 1591
 }
1548 1592
 
1593
+.text-gray-900 {
1594
+  --tw-text-opacity: 1;
1595
+  color: rgb(17 24 39 / var(--tw-text-opacity, 1));
1596
+}
1597
+
1549 1598
 .text-green-500 {
1550 1599
   --tw-text-opacity: 1;
1551 1600
   color: rgb(34 197 94 / var(--tw-text-opacity, 1));

+ 557 - 0
src/views/main/report/connectionVolumes/bulletin.vue

@@ -0,0 +1,557 @@
1
+<template>
2
+  <div class="min-h-screen bg-gray-50 p-4">
3
+    <div class="mx-auto max-w-8xl">
4
+      <!-- 查询区域 -->
5
+      <div class="bg-white rounded-lg shadow-sm p-4 mb-4">
6
+        <div class="flex items-center gap-4">
7
+          <div class="flex items-center gap-2">
8
+            <span class="text-gray-600">时间范围</span>
9
+            <el-date-picker
10
+              v-model="dateRange"
11
+              type="daterange"
12
+              range-separator="至"
13
+              start-placeholder="开始日期"
14
+              end-placeholder="结束日期"
15
+              :shortcuts="dateShortcuts"
16
+              value-format="YYYY-MM-DD"
17
+              class="!w-[400px]"
18
+            />
19
+          </div>
20
+          <el-button
21
+            type="primary"
22
+            :loading="loading"
23
+            class="!rounded-button whitespace-nowrap"
24
+            @click="handleSearch"
25
+          >
26
+            <el-icon class="mr-1"><search /></el-icon>查询
27
+          </el-button>
28
+          <el-button
29
+            class="!rounded-button whitespace-nowrap"
30
+            @click="handleReset"
31
+          >
32
+            <el-icon class="mr-1"><Refresh /></el-icon>重置
33
+          </el-button>
34
+          <el-button
35
+            class="!rounded-button whitespace-nowrap"
36
+            @click="handleDownload"
37
+          >
38
+            <el-icon class="mr-1"><Download /></el-icon>导出
39
+          </el-button>
40
+        </div>
41
+      </div>
42
+      <!-- 数据展示区域 -->
43
+      <div class="grid grid-cols-1 gap-4">
44
+        <!-- 基础话务数据 -->
45
+        <div class="bg-white rounded-lg shadow-sm p-4">
46
+          <h3
47
+            class="text-lg font-semibold mb-4 text-gray-900 border-l-4 border-blue-500 pl-3"
48
+          >
49
+            话务数据
50
+          </h3>
51
+          <div class="flex">
52
+            <dl class="grid grid-cols-4 gap-4 flex-1">
53
+              <div class="stat-item">
54
+                <dt class="text-gray-600">话务总量</dt>
55
+                <dd class="text-xl font-semibold text-gray-900">
56
+                  {{ stats.totalCalls }}
57
+                </dd>
58
+              </div>
59
+              <div class="stat-item">
60
+                <dt class="text-gray-600">平均话务量</dt>
61
+                <dd class="text-2xl font-semibold text-gray-900">
62
+                  {{ stats.averageCalls }}
63
+                </dd>
64
+              </div>
65
+              <div class="stat-item">
66
+                <dt class="text-gray-600">平均接通率</dt>
67
+                <dd class="text-2xl font-semibold text-blue-600">
68
+                  {{ stats.averageConnectedRate }}
69
+                </dd>
70
+              </div>
71
+            </dl>
72
+            <div ref="basicChart" class="w-[350px] h-[160px]"></div>
73
+          </div>
74
+        </div>
75
+        <!-- 呼入数据 -->
76
+        <div class="bg-white rounded-lg shadow-sm p-4">
77
+          <h3
78
+            class="text-lg font-semibold mb-4 text-gray-900 border-l-4 border-blue-500 pl-3"
79
+          >
80
+            呼入数据
81
+          </h3>
82
+          <div class="flex">
83
+            <dl class="grid grid-cols-4 gap-4 flex-1">
84
+              <div class="stat-item">
85
+                <dt class="text-gray-600">呼入总量</dt>
86
+                <dd class="text-2xl font-semibold text-gray-900">
87
+                  {{ stats.inboundTotal }}
88
+                </dd>
89
+              </div>
90
+              <div class="stat-item">
91
+                <dt class="text-gray-600">呼入接通量</dt>
92
+                <dd class="text-2xl font-semibold text-green-600">
93
+                  {{ stats.inboundConnected }}
94
+                </dd>
95
+              </div>
96
+              <div class="stat-item">
97
+                <dt class="text-gray-600">呼入未接通量</dt>
98
+                <dd class="text-2xl font-semibold text-red-600">
99
+                  {{ stats.inboundNotConnected }}
100
+                </dd>
101
+              </div>
102
+              <div class="stat-item">
103
+                <dt class="text-gray-600">呼入接通率</dt>
104
+                <dd class="text-2xl font-semibold text-green-600">
105
+                  {{ stats.inboundConnectedRate }}
106
+                </dd>
107
+              </div>
108
+              <div class="stat-item">
109
+                <dt class="text-gray-600">呼入未接通率</dt>
110
+                <dd class="text-2xl font-semibold text-red-600">
111
+                  {{ stats.inboundNotConnectedRate }}
112
+                </dd>
113
+              </div>
114
+              <div class="stat-item">
115
+                <dt class="text-gray-600">呼入总时长</dt>
116
+                <dd class="text-2xl font-semibold text-gray-900">
117
+                  {{ stats.callDurations }}
118
+                </dd>
119
+              </div>
120
+              <div class="stat-item">
121
+                <dt class="text-gray-600">呼入平均时长</dt>
122
+                <dd class="text-2xl font-semibold text-gray-900">
123
+                  {{ stats.averageCallDuration }}
124
+                </dd>
125
+              </div>
126
+            </dl>
127
+            <div ref="inboundChart" class="w-[350px] h-[160px]"></div>
128
+          </div>
129
+        </div>
130
+        <!-- 呼出数据 -->
131
+        <div class="bg-white rounded-lg shadow-sm p-4">
132
+          <h3
133
+            class="text-lg font-semibold mb-4 text-gray-900 border-l-4 border-blue-500 pl-3"
134
+          >
135
+            呼出数据
136
+          </h3>
137
+          <div class="flex">
138
+            <dl class="grid grid-cols-4 gap-4 flex-1">
139
+              <div class="stat-item">
140
+                <dt class="text-gray-600">呼出总量</dt>
141
+                <dd class="text-2xl font-semibold text-gray-900">
142
+                  {{ stats.outboundTotal }}
143
+                </dd>
144
+              </div>
145
+              <div class="stat-item">
146
+                <dt class="text-gray-600">呼出接通量</dt>
147
+                <dd class="text-2xl font-semibold text-green-600">
148
+                  {{ stats.outboundConnected }}
149
+                </dd>
150
+              </div>
151
+              <div class="stat-item">
152
+                <dt class="text-gray-600">呼出未接通量</dt>
153
+                <dd class="text-2xl font-semibold text-red-600">
154
+                  {{ stats.outboundNotConnected }}
155
+                </dd>
156
+              </div>
157
+              <div class="stat-item">
158
+                <dt class="text-gray-600">呼出接通率</dt>
159
+                <dd class="text-2xl font-semibold text-green-600">
160
+                  {{ stats.outboundConnectedRate }}
161
+                </dd>
162
+              </div>
163
+              <div class="stat-item">
164
+                <dt class="text-gray-600">呼出未接通率</dt>
165
+                <dd class="text-2xl font-semibold text-red-600">
166
+                  {{ stats.outboundNotConnectedRate }}
167
+                </dd>
168
+              </div>
169
+              <!-- <div class="stat-item">
170
+                <dt class="text-gray-600">呼出总时长</dt>
171
+                <dd class="text-2xl font-semibold text-gray-900">1,890小时</dd>
172
+              </div>
173
+              <div class="stat-item">
174
+                <dt class="text-gray-600">呼出平均时长</dt>
175
+                <dd class="text-2xl font-semibold text-gray-900">12分钟</dd>
176
+              </div> -->
177
+            </dl>
178
+            <div ref="outboundChart" class="w-[350px] h-[160px]"></div>
179
+          </div>
180
+        </div>
181
+        <!-- 满意度数据 -->
182
+        <div class="bg-white rounded-lg shadow-sm p-4">
183
+          <h3
184
+            class="text-lg font-semibold mb-4 text-gray-900 border-l-4 border-blue-500 pl-3"
185
+          >
186
+            满意度评价
187
+          </h3>
188
+          <div class="flex">
189
+            <dl class="grid grid-cols-4 gap-4 flex-1">
190
+              <div class="stat-item">
191
+                <dt class="text-gray-600">评价总量</dt>
192
+                <dd class="text-2xl font-semibold text-gray-900">
193
+                  {{ stats.mydTotal }}
194
+                </dd>
195
+              </div>
196
+              <div class="stat-item">
197
+                <dt class="text-gray-600">
198
+                  满意量
199
+                </dt>
200
+                <dd class="text-2xl font-semibold text-green-600">
201
+                  {{ stats.satisfied }}
202
+                </dd>
203
+              </div>
204
+              <div class="stat-item">
205
+                <dt class="text-gray-600">
206
+                  基本满意量
207
+                </dt>
208
+                <dd class="text-2xl font-semibold text-blue-600">
209
+                  {{ stats.basically }}
210
+                </dd>
211
+              </div>
212
+              <div class="stat-item">
213
+                <dt class="text-gray-600">
214
+                  不满意量
215
+                </dt>
216
+                <dd class="text-2xl font-semibold text-red-600">
217
+                  {{ stats.dissatisfied }}
218
+                </dd>
219
+              </div>
220
+              <div class="stat-item">
221
+                <dt class="text-gray-600">评价占比</dt>
222
+                <dd class="text-2xl font-semibold text-gray-900">
223
+                  {{ stats.mydRate }}
224
+                </dd>
225
+              </div>
226
+              <div class="stat-item">
227
+                <dt class="text-gray-600">
228
+                  满意率
229
+                </dt>
230
+                <dd class="text-2xl font-semibold text-green-600">
231
+                  {{ stats.satisfiedRate }}
232
+                </dd>
233
+              </div>
234
+              <div class="stat-item">
235
+                <dt class="text-gray-600">
236
+                  基本满意率
237
+                </dt>
238
+                <dd class="text-2xl font-semibold text-blue-600">
239
+                  {{ stats.basicallyRate }}
240
+                </dd>
241
+              </div>
242
+              <div class="stat-item">
243
+                <dt class="text-gray-600">
244
+                  不满意率
245
+                </dt>
246
+                <dd class="text-2xl font-semibold text-red-600">
247
+                  {{ stats.dissatisfiedRate }}
248
+                </dd>
249
+              </div>
250
+              <!-- <div class="stat-item">
251
+                <dt class="text-gray-600">评价参与率</dt>
252
+                <dd class="text-2xl font-semibold text-gray-900">85.6%</dd>
253
+              </div>
254
+              <div class="stat-item">
255
+                <dt class="text-gray-600">平均评分</dt>
256
+                <dd class="text-2xl font-semibold text-blue-600">4.5分</dd>
257
+              </div> -->
258
+            </dl>
259
+            <div ref="satisfactionChart" class="w-[350px] h-[160px]"></div>
260
+          </div>
261
+        </div>
262
+      </div>
263
+    </div>
264
+  </div>
265
+</template>
266
+
267
+<script lang="ts" setup>
268
+import { ref, onMounted } from "vue";
269
+import { Search, Refresh, Download } from "@element-plus/icons-vue";
270
+import * as echarts from "echarts";
271
+import moment from "moment";
272
+import { getPageListData } from '@/api/main/system/system';
273
+const loading = ref(false);
274
+const dateRange = ref<[string, string]>(['', '']);
275
+const dateShortcuts = [
276
+  {
277
+    text: "最近一周",
278
+    value: () => {
279
+      const end = new Date();
280
+      const start = new Date();
281
+      start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
282
+      return [start, end];
283
+    },
284
+  },
285
+  {
286
+    text: "最近一个月",
287
+    value: () => {
288
+      const end = new Date();
289
+      const start = new Date();
290
+      start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
291
+      return [start, end];
292
+    },
293
+  },
294
+  {
295
+    text: "最近三个月",
296
+    value: () => {
297
+      const end = new Date();
298
+      const start = new Date();
299
+      start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
300
+      return [start, end];
301
+    },
302
+  },
303
+];
304
+const stats = ref({
305
+  mydRate: '',
306
+  averageConnectedRate: "0.00%",
307
+  "totalCalls": 0,
308
+  "averageCalls": 0,
309
+  "inboundTotal": 0,
310
+  "inboundConnected": 0,
311
+  "inboundNotConnected": 0,
312
+  "inboundConnectedRate": "0.00%",
313
+  "inboundNotConnectedRate": "0.00%",
314
+  "outboundTotal": 0,
315
+  "outboundConnected": 0,
316
+  "outboundNotConnected": 0,
317
+  "outboundConnectedRate": "0.00%",
318
+  "outboundNotConnectedRate": "0.00%",
319
+  "callDuration": 0,
320
+  "callDurations": "0分钟",
321
+  "averageCallDuration": "0分钟",
322
+  "mydTotal": 0,
323
+  "basically": 0,
324
+  "satisfied": 0,
325
+  "dissatisfied": 0,
326
+  "basicallyRate": "0.00%",
327
+  "satisfiedRate": "0.00%",
328
+  "dissatisfiedRate": "0.00%"
329
+});
330
+const handleSearch = () => {
331
+  loading.value = true;
332
+  getBulletingData();
333
+};
334
+const handleReset = () => {
335
+  const startTime = moment().subtract(7, "days").format("YYYY-MM-DD");
336
+  const endTime = moment().format("YYYY-MM-DD");
337
+  dateRange.value = [startTime, endTime];
338
+  getBulletingData();
339
+};
340
+const basicChart: any = ref<HTMLElement | null>(null);
341
+const inboundChart: any = ref<HTMLElement | null>(null);
342
+const outboundChart: any = ref<HTMLElement | null>(null);
343
+const satisfactionChart: any = ref<HTMLElement | null>(null);
344
+const { proxy } = getCurrentInstance()
345
+
346
+const handleDownload = () => {
347
+  proxy.download(
348
+        '/WorkReport/exportExcelTelephoneBriefing',
349
+        {
350
+    startTime: dateRange.value[0],
351
+    endTime: dateRange.value[1],
352
+  },
353
+        `话务简报.xlsx`
354
+      )
355
+}
356
+
357
+const getBulletingData = () => {
358
+  loading.value = true;
359
+  const params = {
360
+    startTime: dateRange.value[0],
361
+    endTime: dateRange.value[1],
362
+  };
363
+  getPageListData('/WorkReport/selectTelephoneBriefing', params).then(res => {
364
+    console.log(res);
365
+    loading.value = false;
366
+    const data = res.data || {};
367
+    const averageConnectedRate = data.totalCalls === 0 ? '0.00%' : `${((data.inboundConnected + data.outboundConnected) / data.totalCalls * 100).toFixed(2)}%`;
368
+    const mydRate = data.mydTotal === 0 ? '0.00%' : `${((data.satisfied || 0 + data.basically || 0) / data.mydTotal * 100).toFixed(2)}%`;
369
+    stats.value = { 
370
+      mydRate,
371
+      averageConnectedRate,
372
+      ...data,
373
+    }
374
+    initCharts();
375
+  }).catch(err => {
376
+    loading.value = false;
377
+  })
378
+}
379
+
380
+const initCharts = () => {
381
+  // 基础话务数据图表
382
+  const basicChartInstance = echarts.init(basicChart.value!);
383
+  basicChartInstance.setOption({
384
+    animation: false,
385
+    tooltip: {
386
+      trigger: "item",
387
+    },
388
+    legend: {
389
+      orient: "vertical",
390
+      right: 30,
391
+      top: "center",
392
+    },
393
+    series: [
394
+      {
395
+        name: "话务分布",
396
+        type: "pie",
397
+        radius: ["40%", "70%"],
398
+        avoidLabelOverlap: false,
399
+        itemStyle: {
400
+          borderRadius: 10,
401
+          borderColor: "#fff",
402
+          borderWidth: 2,
403
+        },
404
+        label: {
405
+          show: false,
406
+        },
407
+        emphasis: {
408
+          label: {
409
+            show: true,
410
+            fontSize: 14,
411
+            fontWeight: "bold",
412
+          },
413
+        },
414
+        data: [
415
+          { value: stats.value.inboundTotal || 0, name: "呼入" },
416
+          { value: stats.value.outboundTotal || 0, name: "呼出" },
417
+        ],
418
+      },
419
+    ],
420
+  });
421
+  // 呼入数据图表
422
+  const inboundChartInstance = echarts.init(inboundChart.value!);
423
+  inboundChartInstance.setOption({
424
+    animation: false,
425
+    tooltip: {
426
+      trigger: "item",
427
+    },
428
+    legend: {
429
+      orient: "vertical",
430
+      right: 30,
431
+      top: "center",
432
+    },
433
+    series: [
434
+      {
435
+        name: "呼入情况",
436
+        type: "pie",
437
+        radius: ["40%", "70%"],
438
+        avoidLabelOverlap: false,
439
+        itemStyle: {
440
+          borderRadius: 10,
441
+          borderColor: "#fff",
442
+          borderWidth: 2,
443
+        },
444
+        label: {
445
+          show: false,
446
+        },
447
+        emphasis: {
448
+          label: {
449
+            show: true,
450
+            fontSize: 14,
451
+            fontWeight: "bold",
452
+          },
453
+        },
454
+        data: [
455
+          { value: stats.value.inboundConnected || 0, name: "接通", itemStyle: { color: "#10B981" } },
456
+          { value: stats.value.inboundNotConnected || 0, name: "未接通", itemStyle: { color: "#EF4444" } },
457
+        ],
458
+      },
459
+    ],
460
+  });
461
+  // 呼出数据图表
462
+  const outboundChartInstance = echarts.init(outboundChart.value!);
463
+  outboundChartInstance.setOption({
464
+    animation: false,
465
+    tooltip: {
466
+      trigger: "item",
467
+    },
468
+    legend: {
469
+      orient: "vertical",
470
+      right: 30,
471
+      top: "center",
472
+    },
473
+    series: [
474
+      {
475
+        name: "呼出情况",
476
+        type: "pie",
477
+        radius: ["40%", "70%"],
478
+        avoidLabelOverlap: false,
479
+        itemStyle: {
480
+          borderRadius: 10,
481
+          borderColor: "#fff",
482
+          borderWidth: 2,
483
+        },
484
+        label: {
485
+          show: false,
486
+        },
487
+        emphasis: {
488
+          label: {
489
+            show: true,
490
+            fontSize: 14,
491
+            fontWeight: "bold",
492
+          },
493
+        },
494
+        data: [
495
+          { value: stats.value.outboundConnected || 0, name: "接通", itemStyle: { color: "#10B981" } },
496
+          { value: stats.value.outboundNotConnected || 0, name: "未接通", itemStyle: { color: "#EF4444" } },
497
+        ],
498
+      },
499
+    ],
500
+  });
501
+  // 满意度数据图表
502
+  const satisfactionChartInstance = echarts.init(satisfactionChart.value!);
503
+  satisfactionChartInstance.setOption({
504
+    animation: false,
505
+    tooltip: {
506
+      trigger: "item",
507
+    },
508
+    legend: {
509
+      orient: "vertical",
510
+      right: 30,
511
+      top: "center",
512
+    },
513
+    series: [
514
+      {
515
+        name: "满意度评价",
516
+        type: "pie",
517
+        radius: ["40%", "70%"],
518
+        avoidLabelOverlap: false,
519
+        itemStyle: {
520
+          borderRadius: 10,
521
+          borderColor: "#fff",
522
+          borderWidth: 2,
523
+        },
524
+        label: {
525
+          show: false,
526
+        },
527
+        emphasis: {
528
+          label: {
529
+            show: true,
530
+            fontSize: 14,
531
+            fontWeight: "bold",
532
+          },
533
+        },
534
+        data: [
535
+          { value: stats.value.satisfied || 0, name: "满意", itemStyle: { color: "#10B981" } },
536
+          { value: stats.value.basically || 0, name: "基本满意", itemStyle: { color: "#3B82F6" } },
537
+          { value: stats.value.dissatisfied || 0, name: "不满意", itemStyle: { color: "#EF4444" } },
538
+        ],
539
+      },
540
+    ],
541
+  });
542
+};
543
+onMounted(() => {
544
+  handleReset();
545
+  // getBulletingData();
546
+  // initCharts();
547
+});
548
+</script>
549
+
550
+<style scoped>
551
+.stat-item {
552
+  @apply p-3 rounded-lg bg-gray-50;
553
+}
554
+.stat-item dt {
555
+  @apply mb-2;
556
+}
557
+</style>

+ 47 - 20
src/views/main/report/connectionVolumes/connectionVolumes.vue

@@ -2,7 +2,7 @@
2 2
 
3 3
 <template>
4 4
     <div class="min-h-screen bg-gray-50 p-6">
5
-      <div class="mx-auto">
5
+      <div class="mx-auto max-w-7xl">
6 6
         <!-- 顶部搜索区域 -->
7 7
         <div class="mb-6 flex items-center justify-between bg-white p-4 shadow-sm">
8 8
           <div class="flex gap-4">
@@ -29,10 +29,10 @@
29 29
               :size="'default'"
30 30
               @change="handleDateChange"
31 31
             />
32
-            <button class="!rounded-button whitespace-nowrap bg-blue-500 px-4 py-2 text-white hover:bg-blue-600">
32
+            <!-- <button class="!rounded-button whitespace-nowrap bg-blue-500 px-4 py-2 text-white hover:bg-blue-600" >
33 33
               <el-icon class="mr-1"><Search /></el-icon>
34 34
               查询
35
-            </button>
35
+            </button> -->
36 36
           </div>
37 37
         </div>
38 38
   
@@ -40,10 +40,10 @@
40 40
         <div class="mb-6 bg-white p-6 shadow-sm">
41 41
           <div class="mb-4 flex items-center justify-between">
42 42
             <h2 class="text-xl font-bold">通话接通量统计</h2>
43
-            <button class="!rounded-button whitespace-nowrap bg-green-500 px-4 py-2 text-white hover:bg-green-600">
43
+            <!-- <button class="!rounded-button whitespace-nowrap bg-green-500 px-4 py-2 text-white hover:bg-green-600">
44 44
               <el-icon class="mr-1"><Download /></el-icon>
45 45
               导出数据
46
-            </button>
46
+            </button> -->
47 47
           </div>
48 48
           <div class="h-[400px]">
49 49
             <div ref="dailyFlowChart" class="h-full w-full"></div>
@@ -59,11 +59,12 @@
59 59
   import { Search, Download } from '@element-plus/icons-vue';
60 60
   import * as echarts from 'echarts';
61 61
   import { getPageListData } from '@/api/main/system/system';
62
+  import moment from 'moment';
62 63
 
63 64
   import type { EChartsOption } from 'echarts';
64 65
   
65 66
   const dateRange = ref([]);
66
-  const selectedQuickBtn = ref('30days');
67
+  const selectedQuickBtn = ref('today');
67 68
   
68 69
   const quickButtons = [
69 70
     { label: '今天', value: 'today' },
@@ -72,32 +73,58 @@
72 73
     { label: '近30天', value: '30days' },
73 74
   ];
74 75
   
75
-  const callVolumeChart = ref<HTMLElement | null>(null);
76
-  const dailyFlowChart = ref<HTMLElement | null>(null);
77
-  const monthlyFlowChart = ref<HTMLElement | null>(null);
78
-  
79
-  const totalYearlyFlow = ref(2456789);
76
+  const dailyFlowChart: any = ref<HTMLElement | null>(null);
80 77
   
81 78
   const handleQuickSelect = (value: string) => {
82 79
     selectedQuickBtn.value = value;
83 80
     // 处理快速选择逻辑
81
+    if (value === 'today') {
82
+      startTime.value = moment().format('YYYY-MM-DD');
83
+      endTime.value = moment().format('YYYY-MM-DD');
84
+    } else if (value === 'yesterday') {
85
+      startTime.value = moment().subtract(1, 'days').startOf('day').format('YYYY-MM-DD');
86
+      endTime.value = moment().subtract(1, 'days').endOf('day').format('YYYY-MM-DD');
87
+    } else if (value === '7days') {
88
+      startTime.value = moment().subtract(7, 'days').startOf('day').format('YYYY-MM-DD');
89
+      endTime.value = moment().endOf('day').format('YYYY-MM-DD');
90
+    } else if (value === '30days') {
91
+      startTime.value = moment().subtract(30, 'days').startOf('day').format('YYYY-MM-DD');
92
+      endTime.value = moment().endOf('day').format('YYYY-MM-DD');
93
+    }
94
+
95
+    getDailyFlow();
84 96
   };
85 97
   
86
-  const handleDateChange = () => {
98
+  const handleDateChange = (val) => {
87 99
     // 处理日期变化逻辑
100
+    console.log(val);
101
+    selectedQuickBtn.value = '';
102
+    startTime.value = moment(val[0]).format('YYYY-MM-DD');
103
+    endTime.value = moment(val[1]).format('YYYY-MM-DD');
104
+    getDailyFlow();
105
+
88 106
   };
107
+  const startTime = ref();
108
+  const endTime = ref();
89 109
   
90 110
   onMounted(() => {
111
+    selectedQuickBtn.value = 'today';
112
+    startTime.value = moment().startOf('day').format('YYYY-MM-DD');
113
+    endTime.value = moment().format('YYYY-MM-DD');
91 114
     getDailyFlow()  // 日流量统计图表
92 115
   
93 116
   });
117
+
118
+  
94 119
   
95 120
   // 日流量统计图表
96 121
   function getDailyFlow(){
97
-
98
-    // getPageListData('/WorkReport/selectConnection').then(res => {
99
-        // console.log(res);
100
-        const dailyFlow = echarts.init(dailyFlowChart.value!);
122
+    const params = {
123
+      startTime: startTime.value,
124
+      endTime: endTime.value,
125
+    };
126
+    getPageListData('/WorkReport/selectConnection', params).then(res => {
127
+        const dailyFlow = echarts.init(dailyFlowChart.value);
101 128
         const dailyFlowOption: EChartsOption = {
102 129
             animation: false,
103 130
             tooltip: {
@@ -111,16 +138,16 @@
111 138
             },
112 139
             xAxis: {
113 140
                 type: 'category',
114
-                data: Array.from({length: 24}, (_, i) => `${i}:00`)
141
+                data: res.data?.map(item => item.date),
115 142
             },
116 143
             yAxis: {
117 144
                 type: 'value'
118 145
             },
119 146
             series: [{
120
-                name: '量',
147
+                name: '接通量',
121 148
                 type: 'line',
122 149
                 smooth: true,
123
-                data: Array.from({length: 24}, () => Math.floor(Math.random() * 200 + 100)),
150
+                data: res.data?.map(item => item.number),
124 151
                 itemStyle: {
125 152
                 color: '#10B981'
126 153
                 },
@@ -146,7 +173,7 @@
146 173
         window.addEventListener('resize', () => {
147 174
             dailyFlow.resize();
148 175
         });
149
-    // });
176
+    });
150 177
   }
151 178
 
152 179
   </script>