Browse Source

mod:话务简报

闪电 10 months ago
parent
commit
c7f8094849

+ 49 - 0
src/assets/style.css

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

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

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
 
2
 
3
 <template>
3
 <template>
4
     <div class="min-h-screen bg-gray-50 p-6">
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
         <div class="mb-6 flex items-center justify-between bg-white p-4 shadow-sm">
7
         <div class="mb-6 flex items-center justify-between bg-white p-4 shadow-sm">
8
           <div class="flex gap-4">
8
           <div class="flex gap-4">
29
               :size="'default'"
29
               :size="'default'"
30
               @change="handleDateChange"
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
               <el-icon class="mr-1"><Search /></el-icon>
33
               <el-icon class="mr-1"><Search /></el-icon>
34
               查询
34
               查询
35
-            </button>
35
+            </button> -->
36
           </div>
36
           </div>
37
         </div>
37
         </div>
38
   
38
   
40
         <div class="mb-6 bg-white p-6 shadow-sm">
40
         <div class="mb-6 bg-white p-6 shadow-sm">
41
           <div class="mb-4 flex items-center justify-between">
41
           <div class="mb-4 flex items-center justify-between">
42
             <h2 class="text-xl font-bold">通话接通量统计</h2>
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
               <el-icon class="mr-1"><Download /></el-icon>
44
               <el-icon class="mr-1"><Download /></el-icon>
45
               导出数据
45
               导出数据
46
-            </button>
46
+            </button> -->
47
           </div>
47
           </div>
48
           <div class="h-[400px]">
48
           <div class="h-[400px]">
49
             <div ref="dailyFlowChart" class="h-full w-full"></div>
49
             <div ref="dailyFlowChart" class="h-full w-full"></div>
59
   import { Search, Download } from '@element-plus/icons-vue';
59
   import { Search, Download } from '@element-plus/icons-vue';
60
   import * as echarts from 'echarts';
60
   import * as echarts from 'echarts';
61
   import { getPageListData } from '@/api/main/system/system';
61
   import { getPageListData } from '@/api/main/system/system';
62
+  import moment from 'moment';
62
 
63
 
63
   import type { EChartsOption } from 'echarts';
64
   import type { EChartsOption } from 'echarts';
64
   
65
   
65
   const dateRange = ref([]);
66
   const dateRange = ref([]);
66
-  const selectedQuickBtn = ref('30days');
67
+  const selectedQuickBtn = ref('today');
67
   
68
   
68
   const quickButtons = [
69
   const quickButtons = [
69
     { label: '今天', value: 'today' },
70
     { label: '今天', value: 'today' },
72
     { label: '近30天', value: '30days' },
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
   const handleQuickSelect = (value: string) => {
78
   const handleQuickSelect = (value: string) => {
82
     selectedQuickBtn.value = value;
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
   onMounted(() => {
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
     getDailyFlow()  // 日流量统计图表
114
     getDailyFlow()  // 日流量统计图表
92
   
115
   
93
   });
116
   });
117
+
118
+  
94
   
119
   
95
   // 日流量统计图表
120
   // 日流量统计图表
96
   function getDailyFlow(){
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
         const dailyFlowOption: EChartsOption = {
128
         const dailyFlowOption: EChartsOption = {
102
             animation: false,
129
             animation: false,
103
             tooltip: {
130
             tooltip: {
111
             },
138
             },
112
             xAxis: {
139
             xAxis: {
113
                 type: 'category',
140
                 type: 'category',
114
-                data: Array.from({length: 24}, (_, i) => `${i}:00`)
141
+                data: res.data?.map(item => item.date),
115
             },
142
             },
116
             yAxis: {
143
             yAxis: {
117
                 type: 'value'
144
                 type: 'value'
118
             },
145
             },
119
             series: [{
146
             series: [{
120
-                name: '量',
147
+                name: '接通量',
121
                 type: 'line',
148
                 type: 'line',
122
                 smooth: true,
149
                 smooth: true,
123
-                data: Array.from({length: 24}, () => Math.floor(Math.random() * 200 + 100)),
150
+                data: res.data?.map(item => item.number),
124
                 itemStyle: {
151
                 itemStyle: {
125
                 color: '#10B981'
152
                 color: '#10B981'
126
                 },
153
                 },
146
         window.addEventListener('resize', () => {
173
         window.addEventListener('resize', () => {
147
             dailyFlow.resize();
174
             dailyFlow.resize();
148
         });
175
         });
149
-    // });
176
+    });
150
   }
177
   }
151
 
178
 
152
   </script>
179
   </script>