miaofuhao %!s(int64=3) %!d(string=před) roky
rodič
revize
2e1896508e

+ 256 - 212
CallCenterWeb.UI/RMYY/src/components/context/Dialplate/index.vue

@@ -13,10 +13,18 @@
13 13
       <i v-show="isShowDelNum" class="del_num" @click="delNum" />
14 14
       <el-row v-for="(item, index) in dialNums" :gutter="20" :key="index">
15 15
         <el-col v-for="(tnum, index) in item" :span="8" :key="index">
16
-          <el-button class="btn_nums" type="info" circle @click="dialNumHandler(tnum)">{{ tnum }}</el-button>
16
+          <el-button
17
+            class="btn_nums"
18
+            type="info"
19
+            circle
20
+            @click="dialNumHandler(tnum)"
21
+            >{{ tnum }}</el-button
22
+          >
17 23
         </el-col>
18 24
       </el-row>
19
-      <el-button v-waves class="btn_call" type="success" round @click="callOut">拨打</el-button>
25
+      <el-button v-waves class="btn_call" type="success" round @click="callOut"
26
+        >拨打</el-button
27
+      >
20 28
       <!-- 右侧 通话记录和通讯录  -->
21 29
       <!-- <svg-icon v-popover:popover class="btn_yonghu" icon-class="yonghu" />
22 30
       <el-popover
@@ -29,346 +37,382 @@
29 37
         trigger="click"
30 38
         transition="fade-in-linear"
31 39
       > -->
32
-        <div class="popoverClass">
33
-           <el-tabs v-model="tabActiveName" stretch class="phnoe_tabs" @tab-click="handleClick">
34
-              <!-- <el-input v-model="s_keywords" size="mini" placeholder="搜索" prefix-icon="el-icon-search" @keyup.enter="serach_btn" /> -->
35
-              <el-tab-pane label="通讯录" name="first">
36
-                <el-scrollbar
37
-                  v-loading="loading2"
38
-                  element-loading-background="transparent"
39
-                  style="height: 320px;"
40
+      <div class="popoverClass">
41
+        <el-tabs
42
+          v-model="tabActiveName"
43
+          stretch
44
+          class="phnoe_tabs"
45
+          @tab-click="handleClick"
46
+        >
47
+          <!-- <el-input v-model="s_keywords" size="mini" placeholder="搜索" prefix-icon="el-icon-search" @keyup.enter="serach_btn" /> -->
48
+          <el-tab-pane label="通讯录" name="first">
49
+            <el-scrollbar
50
+              v-loading="loading2"
51
+              element-loading-background="transparent"
52
+              style="height: 320px"
53
+            >
54
+              <ul v-if="phoneLists.length" class="recent_calls_lists">
55
+                <li
56
+                  v-for="(item, index) in phoneLists"
57
+                  :key="index"
58
+                  class="recent_calls_item clearfix"
40 59
                 >
41
-                  <ul v-if="phoneLists.length" class="recent_calls_lists">
42
-                    <li
43
-                      v-for="(item, index) in phoneLists"
44
-                      :key="index"
45
-                      class="recent_calls_item clearfix"
46
-                    >
47
-                      <div class="recent_calls_item_left" @click="recentCallOut(item.tel)">
48
-                        <svg-icon icon-class="huchu" />
49
-                        <p class="recent_calls_item_name">{{ item.name }}</p>
50
-                        <p class="recent_calls_item_tel">{{ item.tel }}</p>
51
-                      </div>
52
-                    </li>
53
-                  </ul>
54
-                  <p v-else class="text_center">没有找到数据···</p>
55
-                </el-scrollbar>
56
-              </el-tab-pane>
57
-              <el-tab-pane label="历史记录" name="second">
58
-                <div class="h_list_title">
59
-                  <span>最近通话</span>
60
-                </div>
61
-                <el-scrollbar
62
-                  v-loading="loading1"
63
-                  element-loading-background="transparent"
64
-                  style="height: 300px;"
60
+                  <div
61
+                    class="recent_calls_item_left"
62
+                    @click="recentCallOut(item.tel)"
63
+                  >
64
+                    <svg-icon icon-class="huchu" />
65
+                    <p class="recent_calls_item_name">{{ item.name }}</p>
66
+                    <p class="recent_calls_item_tel">{{ item.tel }}</p>
67
+                  </div>
68
+                </li>
69
+              </ul>
70
+              <p v-else class="text_center">没有找到数据···</p>
71
+            </el-scrollbar>
72
+          </el-tab-pane>
73
+          <el-tab-pane label="历史记录" name="second">
74
+            <div class="h_list_title">
75
+              <span>最近通话</span>
76
+            </div>
77
+            <el-scrollbar
78
+              v-loading="loading1"
79
+              element-loading-background="transparent"
80
+              style="height: 300px"
81
+            >
82
+              <ul v-if="recentCalls.length" class="recent_calls_lists">
83
+                <li
84
+                  v-for="item in recentCalls"
85
+                  :key="item.id"
86
+                  class="recent_calls_item clearfix"
65 87
                 >
66
-                  <ul v-if="recentCalls.length" class="recent_calls_lists">
67
-                    <li v-for="item in recentCalls" :key="item.id" class="recent_calls_item clearfix">
68
-                      <div class="recent_calls_item_left" @click="recentCallOut(item.tel)">
69
-                        <svg-icon v-show="item.isCallOut" icon-class="huchu" />
70
-                        <p :class="{ name_state: !item.isConect }" class="recent_calls_item_name">
71
-                          <span v-if="item.isConect">{{ item.callTimes | secondToDuring }}</span>
72
-                        </p>
73
-                        <p class="recent_calls_item_tel">{{ item.tel }}</p>
74
-                      </div>
75
-                      <div class="recent_calls_item_right">
76
-                        <span class="recent_calls_item_time">{{ item.time | timesAgo }}</span>
77
-                        <el-tooltip
78
-                          v-show="isShowOrderIcon"
79
-                          v-if="item.isOrder"
80
-                          effect="dark"
81
-                          content="点击查看工单"
82
-                          placement="right"
83
-                        >
84
-                          <svg-icon icon-class="xiangmu1" @click.native="goOrderList(item.tel)" />
85
-                        </el-tooltip>
86
-                      </div>
87
-                    </li>
88
-                  </ul>
89
-                  <p v-else class="text_center">没有找到数据···</p>
90
-                </el-scrollbar>
91
-              </el-tab-pane>
88
+                  <div
89
+                    class="recent_calls_item_left"
90
+                    @click="recentCallOut(item.tel)"
91
+                  >
92
+                    <svg-icon v-show="item.isCallOut" icon-class="huchu" />
93
+                    <p
94
+                      :class="{ name_state: !item.isConect }"
95
+                      class="recent_calls_item_name"
96
+                    >
97
+                      <span v-if="item.isConect">{{
98
+                        item.callTimes | secondToDuring
99
+                      }}</span>
100
+                    </p>
101
+                    <p class="recent_calls_item_tel">{{ item.tel }}</p>
102
+                  </div>
103
+                  <div class="recent_calls_item_right">
104
+                    <span class="recent_calls_item_time">{{
105
+                      item.time | timesAgo
106
+                    }}</span>
107
+                    <el-tooltip
108
+                      v-show="isShowOrderIcon"
109
+                      v-if="item.isOrder"
110
+                      effect="dark"
111
+                      content="点击查看工单"
112
+                      placement="right"
113
+                    >
114
+                      <svg-icon
115
+                        icon-class="xiangmu1"
116
+                        @click.native="goOrderList(item.tel)"
117
+                      />
118
+                    </el-tooltip>
119
+                  </div>
120
+                </li>
121
+              </ul>
122
+              <p v-else class="text_center">没有找到数据···</p>
123
+            </el-scrollbar>
124
+          </el-tab-pane>
125
+        </el-tabs>
126
+      </div>
92 127
 
93
-            </el-tabs>
94
-        </div>
95
-       
96
-      
97 128
       <!-- </el-popover> -->
98 129
     </div>
99 130
   </div>
100 131
 </template>
101 132
 
102 133
 <script>
103
-import { mapGetters } from 'vuex'
134
+import { mapGetters } from "vuex";
104 135
 
105
-import store from '@/store'
106
-import router from '@/router'
107
-import { Send } from '@/utils/telWebsocket'
108
-import { secondToDuring, timesAgo } from '@/filters'
109
-import { getNowDate, getPreDate } from '@/utils'
136
+import store from "@/store";
137
+import router from "@/router";
138
+import { Send } from "@/utils/telWebsocket";
139
+import { secondToDuring, timesAgo } from "@/filters";
140
+import { getNowDate, getPreDate } from "@/utils";
110 141
 
111
-import { getCallOutprefix, getCurentCallRecords, getCusUserList } from '@/api/teloperation'
142
+import {
143
+  getCallOutprefix,
144
+  getCurentCallRecords,
145
+  getCusUserList,
146
+} from "@/api/teloperation";
112 147
 
113 148
 export default {
114
-  name: 'Dialplate',
149
+  name: "Dialplate",
115 150
   filters: {
116 151
     telFilter(val) {
117
-      if (!val.includes('-')) {
152
+      if (!val.includes("-")) {
118 153
         if (val.length === 12) {
119
-          val = val.substring(1, 4) + '-' + val.substring(4, 8) + '-' + val.substring(8, 12)
154
+          val =
155
+            val.substring(1, 4) +
156
+            "-" +
157
+            val.substring(4, 8) +
158
+            "-" +
159
+            val.substring(8, 12);
120 160
         } else if (val.length === 11) {
121
-          val = val.substring(0, 3) + '-' + val.substring(3, 7) + '-' + val.substring(7, 11)
161
+          val =
162
+            val.substring(0, 3) +
163
+            "-" +
164
+            val.substring(3, 7) +
165
+            "-" +
166
+            val.substring(7, 11);
122 167
         }
123 168
       }
124
-      return val
125
-    }
169
+      return val;
170
+    },
126 171
   },
127 172
   data() {
128 173
     return {
129 174
       loading1: false,
130 175
       loading2: false,
131
-      telNumber: '',
132
-      scoketDatas: '',
176
+      telNumber: "",
177
+      scoketDatas: "",
133 178
       isShowDelNum: false,
134 179
       dialNums: [
135
-        ['1', '2', '3'],
136
-        ['4', '5', '6'],
137
-        ['7', '8', '9'],
138
-        ['*', '0', '#']
180
+        ["1", "2", "3"],
181
+        ["4", "5", "6"],
182
+        ["7", "8", "9"],
183
+        ["*", "0", "#"],
139 184
       ],
140
-      tabActiveName: 'first',
185
+      tabActiveName: "first",
141 186
       pageParams: {
142 187
         pageindex: 1, // 当前第几页
143 188
         pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
144
-        total: 0 // 总共多少数据
189
+        total: 0, // 总共多少数据
145 190
       },
146 191
       isShowOrderIcon: false,
147 192
       phoneLists: [],
148
-      recentCalls: []
149
-    }
193
+      recentCalls: [],
194
+    };
150 195
   },
151 196
   computed: {
152 197
     ...mapGetters([
153
-      'usercode', // 工号
154
-      'extension', // 分机号
155
-      'sidebar',
156
-      'avatar',
157
-      'telCallType', // 通话类型
158
-      'telIsVisCallout' // 外呼面板是否显示
159
-    ])
198
+      "usercode", // 工号
199
+      "extension", // 分机号
200
+      "sidebar",
201
+      "avatar",
202
+      "telCallType", // 通话类型
203
+      "telIsVisCallout", // 外呼面板是否显示
204
+    ]),
160 205
   },
161 206
   watch: {
162
-    telIsVisCallout: function(newVal, oldVal) {
163
-      console.log(newVal)
207
+    telIsVisCallout: function (newVal, oldVal) {
208
+      console.log(newVal);
164 209
       if (newVal) {
165
-        this.readCardModel()
166
-        this.tabActiveName = 'first'
167
-        this.getMailList()
210
+        this.readCardModel();
211
+        this.tabActiveName = "first";
212
+        this.getMailList();
168 213
       } else {
169
-        this.tabActiveName = 'second'
170
-        this.getTelHisList()
214
+        this.tabActiveName = "second";
215
+        this.getTelHisList();
171 216
       }
172
-    }
217
+    },
173 218
   },
174 219
   created() {
175 220
     // this.tabActiveName = 'first' .$refs['mark']
176
-    
221
+
177 222
     document.onkeyup = (e) => {
178 223
       if (e.keyCode === 13) {
179
-        if (this.tabActiveName === 'first') {
180
-          this.getMailList()
181
-        } else if (this.tabActiveName === 'second') {
182
-          this.getTelHisList()
224
+        if (this.tabActiveName === "first") {
225
+          this.getMailList();
226
+        } else if (this.tabActiveName === "second") {
227
+          this.getTelHisList();
183 228
         }
184 229
       }
185
-    }
230
+    };
186 231
   },
187 232
   methods: {
188
-
189 233
     //
190 234
     serach_btn() {
191
-      if (this.tabActiveName === 'first') {
192
-        this.getMailList()
193
-      } else if (this.tabActiveName === 'second') {
194
-        this.getTelHisList()
235
+      if (this.tabActiveName === "first") {
236
+        this.getMailList();
237
+      } else if (this.tabActiveName === "second") {
238
+        this.getTelHisList();
195 239
       }
196 240
     },
197 241
 
198 242
     readCardModel() {
199
-      const _this = this
200
-      setTimeout(function() {
243
+      const _this = this;
244
+      setTimeout(function () {
201 245
         _this.$refs.inputFocus.focus();
202
-      }, 100)
246
+      }, 100);
203 247
     },
204 248
 
205 249
     getTelHisList() {
206
-      this.loading1 = true
207
-      const stime = getPreDate(3600 * 1000 * 24 * 7) // 不传参数是30天前
208
-      const etime = getNowDate()
250
+      this.loading1 = true;
251
+      const stime = getPreDate(3600 * 1000 * 24 * 7); // 不传参数是30天前
252
+      const etime = getNowDate();
209 253
       const params = {
210 254
         stime, // 开始时间
211 255
         etime, // 结束时间
212
-        phone: this.telNumber //	否	string	模糊查询(呼叫号码)
213
-      }
214
-      getCurentCallRecords(params).then(res => {
215
-        this.loading1 = false
216
-        this.recentCalls = []
217
-        if (res.state.toLowerCase() === 'success') {
218
-          const resItems = res.rows
256
+        phone: this.telNumber, //	否	string	模糊查询(呼叫号码)
257
+      };
258
+      getCurentCallRecords(params).then((res) => {
259
+        this.loading1 = false;
260
+        this.recentCalls = [];
261
+        if (res.state.toLowerCase() === "success") {
262
+          const resItems = res.rows;
219 263
           if (resItems && resItems.length) {
220
-            resItems.forEach(element => {
264
+            resItems.forEach((element) => {
221 265
               this.recentCalls.push({
222 266
                 id: element.id,
223 267
                 // name: element.name || '未知', // 姓名 默认 未知
224 268
                 tel: element.CallNumber, // '15235457489' 呼叫号码
225 269
                 time: element.TalkEndTime, // '16:00' 挂机时间
226 270
                 isCallOut: element.CallType === 1, // 是否是呼出  "calltype": 1,//呼叫类型:0呼入,1呼出
227
-                isOrder: element.existorder !== '无', // 是否有工单
271
+                isOrder: element.existorder !== "无", // 是否有工单
228 272
                 isConect: element.CallState === 1, // 是否正常接通 //呼叫状态:0未接通,1已接通
229
-                callTimes: element.TalkLongTime// 通话时长
230
-              })
231
-            })
273
+                callTimes: element.TalkLongTime, // 通话时长
274
+              });
275
+            });
232 276
           }
233 277
         }
234
-      })
278
+      });
235 279
     },
236 280
     // 获取通讯录
237 281
     getMailList() {
238
-      console.log(this.telNumber)
239
-      this.loading2 = true
282
+      console.log(this.telNumber);
283
+      this.loading2 = true;
240 284
       const params = {
241 285
         pageindex: this.pageParams.pageindex, // 第几页
242 286
         pagesize: this.pageParams.pagesize, // 每页几条信息
243
-        keyword: this.telNumber // 否	string	模糊查询(姓名,手机号码,固话)
244
-      }
245
-      getCusUserList(params).then(res => {
246
-        this.loading2 = false
247
-        this.phoneLists = []
248
-        if (res.state.toLowerCase() === 'success') {
287
+        keyword: this.telNumber, // 否	string	模糊查询(姓名,手机号码,固话)
288
+      };
289
+      getCusUserList(params).then((res) => {
290
+        this.loading2 = false;
291
+        this.phoneLists = [];
292
+        if (res.state.toLowerCase() === "success") {
249 293
           if (res.rows) {
250
-            this.pageParams.total = res.rows
251
-            res.rows.forEach(val => {
294
+            this.pageParams.total = res.rows;
295
+            res.rows.forEach((val) => {
252 296
               this.phoneLists.push({
253 297
                 name: val.F_Department,
254
-                tel: val.F_Telephone
255
-              })
256
-            })
298
+                tel: val.F_Telephone,
299
+              });
300
+            });
257 301
           }
258 302
         }
259
-      })
303
+      });
260 304
     },
261 305
     // 点击拨号键
262 306
     dialNumHandler(tnum) {
263
-      this.isShowDelNum = true
307
+      this.isShowDelNum = true;
264 308
       if (this.telNumber.length === 12) {
265 309
         this.$message({
266
-          message: '电话号码不能超过12位!',
267
-          type: 'warning'
268
-        })
269
-        return
310
+          message: "电话号码不能超过12位!",
311
+          type: "warning",
312
+        });
313
+        return;
270 314
       }
271
-      this.telNumber += tnum
272
-      store.dispatch('ChangeCallNum', this.telNumber)
315
+      this.telNumber += tnum;
316
+      store.dispatch("ChangeCallNum", this.telNumber);
273 317
     },
274 318
     callOutInput() {
275
-      this.isShowDelNum = true
319
+      this.isShowDelNum = true;
276 320
       if (this.telNumber.length === 0) {
277
-        this.isShowDelNum = false
321
+        this.isShowDelNum = false;
278 322
       }
279 323
       if (this.telNumber.length === 12) {
280 324
         this.$message({
281
-          message: '电话号码不能超过12位!',
282
-          type: 'warning'
283
-        })
284
-        return
325
+          message: "电话号码不能超过12位!",
326
+          type: "warning",
327
+        });
328
+        return;
285 329
       }
286
-      store.dispatch('ChangeCallNum', this.telNumber)
330
+      store.dispatch("ChangeCallNum", this.telNumber);
287 331
     },
288 332
     // 删除电话号码
289 333
     delNum() {
290
-      this.telNumber = this.telNumber.substr(0, this.telNumber.length - 1)
334
+      this.telNumber = this.telNumber.substr(0, this.telNumber.length - 1);
291 335
       if (this.telNumber.length === 0) {
292
-        this.isShowDelNum = false
336
+        this.isShowDelNum = false;
293 337
       }
294
-      store.dispatch('ChangeCallNum', this.telNumber)
338
+      store.dispatch("ChangeCallNum", this.telNumber);
295 339
     },
296 340
     // 外呼
297 341
     callOut() {
298 342
       if (this.telNumber) {
299
-        getCallOutprefix(this.telNumber).then(response => {
300
-          if (response.state.toLowerCase() === 'success') {
301
-            const res = response.data
343
+        getCallOutprefix(this.telNumber).then((response) => {
344
+          if (response.state.toLowerCase() === "success") {
345
+            const res = response.data;
302 346
             switch (this.telCallType) {
303
-              case 'MakeCall':
347
+              case "MakeCall":
304 348
                 this.scoketDatas = {
305
-                  'Type': this.telCallType,
306
-                  'AgentID': this.usercode,
307
-                  'AgentExten': this.extension,
308
-                  'Header': res.fix, // 号码前缀 用于截断前缀得到真实号码
309
-                  'DestinationNumber': res.phone //
310
-                }
311
-                break
312
-              case 'Meeting':
349
+                  Type: this.telCallType,
350
+                  AgentID: this.usercode,
351
+                  AgentExten: this.extension,
352
+                  Header: res.fix, // 号码前缀 用于截断前缀得到真实号码
353
+                  DestinationNumber: res.phone, //
354
+                };
355
+                break;
356
+              case "Meeting":
313 357
                 this.scoketDatas = {
314
-                  'Type': this.telCallType,
315
-                  'AgentID': this.usercode,
316
-                  'AgentExten': this.extension,
317
-                  'DestinationNumber': res.phone // 会议目标号码
318
-                }
319
-                break
320
-              case 'Transfer':
358
+                  Type: this.telCallType,
359
+                  AgentID: this.usercode,
360
+                  AgentExten: this.extension,
361
+                  DestinationNumber: res.phone, // 会议目标号码
362
+                };
363
+                break;
364
+              case "Transfer":
321 365
                 this.scoketDatas = {
322
-                  'Type': this.telCallType,
323
-                  'AgentID': this.usercode,
324
-                  'AgentExten': this.extension,
325
-                  'DestinationNumber': res.phone // 转移目标号码
326
-                }
327
-                break
366
+                  Type: this.telCallType,
367
+                  AgentID: this.usercode,
368
+                  AgentExten: this.extension,
369
+                  DestinationNumber: res.phone, // 转移目标号码
370
+                };
371
+                break;
328 372
               default:
329
-                break
373
+                break;
330 374
             }
331
-            store.dispatch('ChangeCallNum', this.telNumber)
332
-            Send(this.scoketDatas)
333
-            store.dispatch('UpdateCalloutScreen', !this.telIsVisCallout)// 关闭外呼面板
334
-            this.telNumber = ''
375
+            store.dispatch("ChangeCallNum", this.telNumber);
376
+            Send(this.scoketDatas);
377
+            store.dispatch("UpdateCalloutScreen", !this.telIsVisCallout); // 关闭外呼面板
378
+            this.telNumber = "";
335 379
           }
336
-        })
380
+        });
337 381
       } else {
338 382
         this.$message({
339
-          message: '请先输入电话号码!',
340
-          type: 'warning'
341
-        })
383
+          message: "请先输入电话号码!",
384
+          type: "warning",
385
+        });
342 386
       }
343 387
     },
344 388
     // tab切换
345 389
     handleClick(tab, event) {
346
-      if (tab.name === 'first') {
347
-        this.getMailList()
348
-      } else if (tab.name === 'second') {
349
-        this.getTelHisList()
390
+      if (tab.name === "first") {
391
+        this.getMailList();
392
+      } else if (tab.name === "second") {
393
+        this.getTelHisList();
350 394
       }
351 395
     },
352 396
     // 点击历史记录通讯录中的号码 外呼
353 397
     recentCallOut(tel) {
354 398
       if (tel.length === 12) {
355
-        tel = tel.substring(1)
399
+        tel = tel.substring(1);
356 400
       }
357
-      this.telNumber = tel
358
-      this.callOut()
401
+      this.telNumber = tel;
402
+      this.callOut();
359 403
     },
360 404
     // 展示隐藏工单图标
361 405
     showOrderIcon() {
362
-      this.isShowOrderIcon = !this.isShowOrderIcon
406
+      this.isShowOrderIcon = !this.isShowOrderIcon;
363 407
     },
364 408
     // 点击工单图标去 该工单详情页面
365 409
     goOrderList(tel) {
366
-      store.dispatch('UpdateCalloutScreen', !this.telIsVisCallout)// 关闭外呼面板
410
+      store.dispatch("UpdateCalloutScreen", !this.telIsVisCallout); // 关闭外呼面板
367 411
       // 带查询参数,变成 /order/orderSearchHY?tel=xxx
368
-      router.push({ path: '/order/orderSearchHY', query: { tel }})// 工单列表
369
-    }
370
-  }
371
-}
412
+      router.push({ path: "/order/orderSearchHY", query: { tel } }); // 工单列表
413
+    },
414
+  },
415
+};
372 416
 </script>
373 417
 
374 418
 <style rel="stylesheet/scss" lang="scss">
@@ -455,7 +499,7 @@ export default {
455 499
 </style>
456 500
 
457 501
 <style rel="stylesheet/scss" lang="scss" scoped>
458
-.popoverClass{
502
+.popoverClass {
459 503
   width: 396px;
460 504
   position: fixed;
461 505
   top: 37px;
@@ -465,7 +509,7 @@ export default {
465 509
   margin-left: 13px;
466 510
   margin-top: 14px;
467 511
 }
468
-    
512
+
469 513
 .dialplate {
470 514
   .plate {
471 515
     width: 100%;

+ 3 - 3
CallCenterWeb.UI/RMYY/src/store/getters.js

@@ -48,6 +48,7 @@ const getters = {
48 48
   monitorExtenNo: state => state.telWebsocket.monitorExtenNo, // 监控的坐席分机号
49 49
   telIsVisTask: state => state.telWebsocket.telIsVisTask, // 任务信息是否显示
50 50
   telIsVisTaskFirst: state => state.telWebsocket.telIsVisTaskFirst, // 任务信息是否第一次显示
51
+  waitcountNumber: state => state.telWebsocket.waitcountNumber, // 是否刷新右上角外呼任务信息/自动外呼监控/外呼分配/我的呼叫任务
51 52
   telTaskIsRefresh: state => state.telWebsocket.telTaskIsRefresh, // 是否刷新右上角外呼任务信息/自动外呼监控/外呼分配/我的呼叫任务
52 53
 
53 54
   permission_routers: state => state.permission.routers,
@@ -67,6 +68,5 @@ const getters = {
67 68
   currentName: state => state.lineChatSocket.currentName, // 聊天成员会话name
68 69
   chatUserCode: state => state.lineChatSocket.chatUserCode, // 客服code
69 70
   collUserCode: state => state.lineChatSocket.collUserCode // 同事code
70
-
71
-}
72
-export default getters
71
+};
72
+export default getters;

+ 76 - 68
CallCenterWeb.UI/RMYY/src/store/modules/telWebsocket.js

@@ -1,204 +1,212 @@
1
-
2 1
 const telWebsocket = {
3 2
   state: {
4 3
     telIsConnected: false, // 链接是否建立
5 4
     telMessageData: null, // telWebsocket数据
6
-    telIsLogin: Number(window.sessionStorage.getItem('telIsLogin')), // 是否签入
5
+    telIsLogin: Number(window.sessionStorage.getItem("telIsLogin")), // 是否签入
7 6
     telSeatState: 2, // 坐席状态 1: 登陆中、2:空闲、3:通话中、4:话后处理、5:小休、6:被请求
8 7
     telLineState: 1, // 线路状态 1:空闲、2:摘机等待拨号、3:正在拨号、4:呼出振铃、5:来电振铃、6:通话中 10:通话保持
9
-    telTopRightState: '未签入', // 右上角 状态提示信息
8
+    telTopRightState: "未签入", // 右上角 状态提示信息
10 9
     telTopRightLamp: false, // 右上角 状态灯(默认 红色)
11
-    telCallNum: '', // 顶部电话号码
12
-    screenState: '',
13
-    telTrunkNumber: '', // 终极号
14
-    telCallType: 'MakeCall', // 发送的通话类型(默认是外呼)
10
+    telCallNum: "", // 顶部电话号码
11
+    waitcountNumber: 0, // 排队数量
12
+    screenState: "",
13
+    telTrunkNumber: "", // 终极号
14
+    telCallType: "MakeCall", // 发送的通话类型(默认是外呼)
15 15
     telIsVisCallout: false, // 外呼操作面板是否显示
16 16
     telOutboundScreen: true, // 是否显示外呼弹屏
17 17
     telIsVisTask: false, // 外呼任务信息是否显示
18 18
     telIsVisTaskFirst: true, // 外呼任务信息是否是第一次弹出
19 19
     telTaskIsRefresh: false, // 是否刷新右上角外呼任务信息/自动外呼监控/外呼分配/我的呼叫任务
20
-    telCallTime: { // 通话时间
21
-      hh: '00',
22
-      mm: '00',
23
-      ss: '00'
20
+    telCallTime: {
21
+      // 通话时间
22
+      hh: "00",
23
+      mm: "00",
24
+      ss: "00"
24 25
     },
25 26
     telMonitor: false, // 监听操作是否成功
26
-    monitorState: '', // 状态监控
27
-    monitorAgent: '', // 监控的坐席工号
28
-    monitorExtenNo: '', // 监控坐席分机号
29
-    monitorExten: ''
27
+    monitorState: "", // 状态监控
28
+    monitorAgent: "", // 监控的坐席工号
29
+    monitorExtenNo: "", // 监控坐席分机号
30
+    monitorExten: "",
31
+    waitcountNumber: 0
30 32
   },
31 33
   mutations: {
32 34
     SOCKET_CONNECT(state) {
33
-      state.telIsConnected = true
35
+      state.telIsConnected = true;
34 36
     },
35 37
     SOCKET_DISCONNECT(state) {
36
-      state.telIsConnected = false
38
+      state.telIsConnected = false;
37 39
     },
38 40
     SOCKET_LOGIN(state) {
39
-      window.sessionStorage.setItem('telIsLogin', 1)
40
-      state.telIsLogin = Number(window.sessionStorage.getItem('telIsLogin'))
41
-      state.telIsLogin = 1
41
+      window.sessionStorage.setItem("telIsLogin", 1);
42
+      state.telIsLogin = Number(window.sessionStorage.getItem("telIsLogin"));
43
+      state.telIsLogin = 1;
42 44
     },
43 45
     SOCKET_LOGOUT(state) {
44
-      window.sessionStorage.setItem('telIsLogin', 0)
45
-      state.telIsLogin = Number(window.sessionStorage.getItem('telIsLogin'))
46
+      window.sessionStorage.setItem("telIsLogin", 0);
47
+      state.telIsLogin = Number(window.sessionStorage.getItem("telIsLogin"));
46 48
     },
47 49
     SOCKET_SEATSTATE(state, message) {
48
-      state.telSeatState = message
50
+      state.telSeatState = message;
49 51
     },
50 52
     SOCKET_LINESTATE(state, message) {
51
-      state.telLineState = message
53
+      state.telLineState = message;
52 54
     },
53 55
     SOCKET_TOPRIGHTSTATE(state, message) {
54
-      state.telTopRightState = message
56
+      state.telTopRightState = message;
55 57
     },
56 58
     SOCKET_TOPRIGHTLAMP(state, message) {
57
-      state.telTopRightLamp = message
59
+      state.telTopRightLamp = message;
58 60
     },
59 61
     SOCKET_CALLNUM(state, message) {
60
-      state.telCallNum = message
62
+      state.telCallNum = message;
61 63
     },
62 64
     SOCKET_TRUNKNUMBER(state, message) {
63
-      state.telTrunkNumber = message
65
+      state.telTrunkNumber = message;
64 66
     },
65 67
     SOCKET_CALLTYPE(state, message) {
66
-      state.telCallType = message
68
+      state.telCallType = message;
67 69
     },
68 70
     SOCKET_CALLOUTSCREEN(state, message) {
69
-      state.telIsVisCallout = message
71
+      state.telIsVisCallout = message;
70 72
     },
71 73
     SOCKET_OUTBOUNDSCREEN(state, message) {
72
-      state.telOutboundScreen = message
74
+      state.telOutboundScreen = message;
73 75
     },
74 76
     SOCKET_CALLTELTIME(state, message) {
75
-      state.telCallTime = message
77
+      state.telCallTime = message;
76 78
     },
77 79
     SOCKET_MESSAGE(state, message) {
78
-      state.telMessageData = message
80
+      state.telMessageData = message;
79 81
     },
80 82
     SOCKET_TELMONITOR(state, message) {
81
-      state.telMonitor = message
83
+      state.telMonitor = message;
82 84
     },
83 85
     SOCKET_MONITORSTATE(state, message) {
84
-      state.monitorState = message
86
+      state.monitorState = message;
87
+    },
88
+    SOCKET_WAITCOUNTNUMBER(state, message) {
89
+      state.waitcountNumber = message;
85 90
     },
86 91
     SOCKET_MONITORAGENT(state, message) {
87
-      state.monitorAgent = message
92
+      state.monitorAgent = message;
88 93
     },
89 94
     SOCKET_MONITOREXTENNO(state, message) {
90
-      state.monitorExtenNo = message
95
+      state.monitorExtenNo = message;
91 96
     },
92 97
     SOCKET_MONITOREXTEN(state, message) {
93
-      state.monitorExten = message
98
+      state.monitorExten = message;
94 99
     },
95 100
     SOCKET_TELISVISTASK(state, message) {
96
-      state.telIsVisTask = message
101
+      state.telIsVisTask = message;
97 102
     },
98 103
     SOCKET_TELISVISTASKFIRST(state, message) {
99
-      state.telIsVisTaskFirst = message
104
+      state.telIsVisTaskFirst = message;
100 105
     },
101 106
     SOCKET_TELTASKISREFRESH(state, message) {
102
-      state.telTaskIsRefresh = message
107
+      state.telTaskIsRefresh = message;
103 108
     },
104 109
     SOCKET_SCREENPOPUP(state, message) {
105
-      state.screenState = message
110
+      state.screenState = message;
106 111
     }
107 112
   },
108 113
   actions: {
109 114
     // 建立连接
110 115
     ConnectWs({ commit }, msg) {
111
-      commit('SOCKET_CONNECT', msg)
116
+      commit("SOCKET_CONNECT", msg);
112 117
     },
113 118
     // 连接失败
114 119
     DisConnectWs({ commit }, msg) {
115
-      commit('SOCKET_DISCONNECT', msg)
120
+      commit("SOCKET_DISCONNECT", msg);
116 121
     },
117 122
     // 签入
118 123
     LoginWs({ commit }, msg) {
119
-      commit('SOCKET_LOGIN', msg)
124
+      commit("SOCKET_LOGIN", msg);
120 125
     },
121 126
     // 签出
122 127
     LogoutWs({ commit }, msg) {
123
-      commit('SOCKET_LOGOUT', msg)
128
+      commit("SOCKET_LOGOUT", msg);
124 129
     },
125 130
     // 坐席状态
126 131
     ChangeSeatState({ commit }, msg) {
127
-      commit('SOCKET_SEATSTATE', msg)
132
+      commit("SOCKET_SEATSTATE", msg);
128 133
     },
129 134
     // 线路状态
130 135
     ChangeLineState({ commit }, msg) {
131
-      commit('SOCKET_LINESTATE', msg)
136
+      commit("SOCKET_LINESTATE", msg);
132 137
     },
133 138
     // 右上角状态
134 139
     ChangeTopRightState({ commit }, msg) {
135
-      commit('SOCKET_TOPRIGHTSTATE', msg[0])
136
-      commit('SOCKET_TOPRIGHTLAMP', msg[1])
140
+      commit("SOCKET_TOPRIGHTSTATE", msg[0]);
141
+      commit("SOCKET_TOPRIGHTLAMP", msg[1]);
137 142
     },
138 143
     // 顶部电话号码
139 144
     ChangeCallNum({ commit }, msg) {
140
-      commit('SOCKET_CALLNUM', msg)
145
+      commit("SOCKET_CALLNUM", msg);
141 146
     },
142 147
     // 顶部电话号码
143 148
     screenPopUpBoole({ commit }, msg) {
144
-      commit('SOCKET_SCREENPOPUP', msg)
149
+      commit("SOCKET_SCREENPOPUP", msg);
145 150
     },
146 151
     // 终极好
147 152
     ChangeTrunkNumber({ commit }, msg) {
148
-      commit('SOCKET_TRUNKNUMBER', msg)
153
+      commit("SOCKET_TRUNKNUMBER", msg);
149 154
     },
150 155
     // 发送的通话类型
151 156
     ChangeCallType({ commit }, msg) {
152
-      commit('SOCKET_CALLTYPE', msg)
157
+      commit("SOCKET_CALLTYPE", msg);
153 158
     },
154 159
     // 外呼操作面板是否显示
155 160
     UpdateCalloutScreen({ commit }, msg) {
156
-      commit('SOCKET_CALLOUTSCREEN', msg)
161
+      commit("SOCKET_CALLOUTSCREEN", msg);
157 162
     },
158 163
     // 外呼是否显示外呼弹屏
159 164
     UpdateOutboundScreen({ commit }, msg) {
160
-      commit('SOCKET_OUTBOUNDSCREEN', msg)
165
+      commit("SOCKET_OUTBOUNDSCREEN", msg);
161 166
     },
162 167
     // 通话时间
163 168
     UpdateCallTime({ commit }, msg) {
164
-      commit('SOCKET_CALLTELTIME', msg)
169
+      commit("SOCKET_CALLTELTIME", msg);
165 170
     },
166 171
     // 修改telWebsocket数据
167 172
     ChangeTelWSMsg({ commit }, msg) {
168
-      commit('SOCKET_MESSAGE', msg)
173
+      commit("SOCKET_MESSAGE", msg);
169 174
     },
170 175
     // 修改监听操作是否成功
171 176
     ChangeMonitor({ commit }, msg) {
172
-      commit('SOCKET_TELMONITOR', msg)
177
+      commit("SOCKET_TELMONITOR", msg);
173 178
     },
174 179
     // 监控状态
175 180
     ChangeMonitorstate({ commit }, msg) {
176
-      commit('SOCKET_MONITORSTATE', msg)
181
+      commit("SOCKET_MONITORSTATE", msg);
182
+    },
183
+    ChangeWaitcountNumber({ commit }, msg) {
184
+      commit("SOCKET_WAITCOUNTNUMBER", msg);
177 185
     },
178 186
     // 监控坐席工号
179 187
     ChangeMonitoragent({ commit }, msg) {
180
-      commit('SOCKET_MONITORAGENT', msg)
188
+      commit("SOCKET_MONITORAGENT", msg);
181 189
     },
182 190
     // 监控坐席分机号
183 191
     ChangeMonitorExtenNo({ commit }, msg) {
184
-      commit('SOCKET_MONITOREXTENNO', msg)
192
+      commit("SOCKET_MONITOREXTENNO", msg);
185 193
     },
186 194
     ChangeMonitorexten({ commit }, msg) {
187
-      commit('SOCKET_MONITOREXTEN', msg)
195
+      commit("SOCKET_MONITOREXTEN", msg);
188 196
     },
189 197
     // 任务信息是否显示
190 198
     ChangeTask({ commit }, msg) {
191
-      commit('SOCKET_TELISVISTASK', msg)
199
+      commit("SOCKET_TELISVISTASK", msg);
192 200
     },
193 201
     // 任务信息是否是第一次弹出
194 202
     ChangeTaskFirst({ commit }, msg) {
195
-      commit('SOCKET_TELISVISTASKFIRST', msg)
203
+      commit("SOCKET_TELISVISTASKFIRST", msg);
196 204
     },
197 205
     // 是否刷新右上角外呼任务信息/自动外呼监控/外呼分配/我的呼叫任务
198 206
     ChangeTaskInfo({ commit }, msg) {
199
-      commit('SOCKET_TELTASKISREFRESH', msg)
207
+      commit("SOCKET_TELTASKISREFRESH", msg);
200 208
     }
201 209
   }
202
-}
210
+};
203 211
 
204
-export default telWebsocket
212
+export default telWebsocket;

+ 103 - 87
CallCenterWeb.UI/RMYY/src/utils/request.js

@@ -1,11 +1,11 @@
1
-import axios from 'axios'
2
-import qs from 'qs' // 引入axios时同时引入qs即可。
3
-import { Message, MessageBox } from 'element-ui'
4
-import store from '../store'
5
-import { getToken } from '@/utils/auth'
1
+import axios from "axios";
2
+import qs from "qs"; // 引入axios时同时引入qs即可。
3
+import { Message, MessageBox } from "element-ui";
4
+import store from "../store";
5
+import { getToken } from "@/utils/auth";
6 6
 
7 7
 // 正在进行中的请求列表
8
-const reqList = []
8
+const reqList = [];
9 9
 /**
10 10
  * 阻止重复请求
11 11
  * @param {array} reqList - 请求缓存列表
@@ -14,15 +14,15 @@ const reqList = []
14 14
  * @param {string} errorMessage - 请求中断时需要显示的错误信息
15 15
  */
16 16
 const stopRepeatRequest = function(reqList, url, cancel, errorMessage) {
17
-  const errorMsg = errorMessage || ''
17
+  const errorMsg = errorMessage || "";
18 18
   for (let i = 0; i < reqList.length; i++) {
19 19
     if (reqList[i] === url) {
20
-      cancel(errorMsg)
21
-      return
20
+      cancel(errorMsg);
21
+      return;
22 22
     }
23 23
   }
24
-  reqList.push(url)
25
-}
24
+  reqList.push(url);
25
+};
26 26
 
27 27
 /**
28 28
  * 允许某个请求可以继续进行
@@ -32,11 +32,12 @@ const stopRepeatRequest = function(reqList, url, cancel, errorMessage) {
32 32
 const allowRequest = function(reqList, url) {
33 33
   for (let i = 0; i < reqList.length; i++) {
34 34
     if (reqList[i] === url) {
35
-      reqList.splice(i, 1)
36
-      break
35
+      reqList.splice(i, 1);
36
+      break;
37 37
     }
38 38
   }
39
-}
39
+  console.log(reqList);
40
+};
40 41
 
41 42
 // const baseURL = process.env.BASE_API
42 43
 // 创建axios实例
@@ -44,7 +45,7 @@ const service = axios.create({
44 45
   // baseURL: baseURL, // api的base_url
45 46
   timeout: 30000, // 请求超时时间
46 47
   headers: {
47
-    'Content-Type': 'application/x-www-form-urlencoded'
48
+    "Content-Type": "application/x-www-form-urlencoded"
48 49
   },
49 50
   // `transformRequest` 允许在向服务器发送前,修改请求数据
50 51
   // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
@@ -53,7 +54,7 @@ const service = axios.create({
53 54
   transformRequest: [
54 55
     function(data) {
55 56
       // 对 data 进行任意转换处理
56
-      return qs.stringify(data)
57
+      return qs.stringify(data);
57 58
     }
58 59
   ],
59 60
 
@@ -64,33 +65,38 @@ const service = axios.create({
64 65
   // return qs.stringify({ids: [1, 2, 3]}, {arrayFormat: 'brackets'})  // 形式:ids[]=1&ids[]=2&ids[]=3
65 66
   // return qs.stringify({ids: [1, 2, 3]}, {arrayFormat: 'repeat'})  // 形式: ids=1&ids=2&id=3
66 67
   paramsSerializer: function(params) {
67
-    return qs.stringify(params, { arrayFormat: 'indices' }) // 形式:ids=1&ids=2&id=3
68
+    return qs.stringify(params, { arrayFormat: "indices" }); // 形式:ids=1&ids=2&id=3
68 69
   }
69
-})
70
+});
70 71
 // request拦截器
71 72
 service.interceptors.request.use(
72 73
   config => {
73 74
     if (store.getters.token) {
74
-      config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
75
+      config.headers["Authorization"] = getToken(); // 让每个请求携带自定义token 请根据实际情况自行修改
75 76
     }
76
-    let cancel
77
-    if (config.method === 'post') {
77
+    let cancel;
78
+    if (config.method === "post") {
78 79
       // 设置cancelToken对象
79 80
       config.cancelToken = new axios.CancelToken(function(c) {
80
-        cancel = c
81
-      })
81
+        cancel = c;
82
+      });
82 83
       // 阻止重复请求。当上个请求未完成时,相同的请求不会进行
83
-      stopRepeatRequest(reqList, config.url, cancel, `${config.url} 请求被中断`)
84
+      stopRepeatRequest(
85
+        reqList,
86
+        config.url,
87
+        cancel,
88
+        `${config.url} 请求被中断`
89
+      );
84 90
       // stopRepeatRequest(reqList, config.url, cancel, `请求被中断`)
85 91
     }
86 92
 
87
-    return config
93
+    return config;
88 94
   },
89 95
   error => {
90 96
     // Do something with request error
91
-    Promise.reject(error)
97
+    Promise.reject(error);
92 98
   }
93
-)
99
+);
94 100
 
95 101
 // respone拦截器
96 102
 service.interceptors.response.use(
@@ -99,120 +105,130 @@ service.interceptors.response.use(
99 105
      * state为非"success"时抛错
100 106
      */
101 107
     // 增加延迟,相同请求不得在短时间内重复发送
102
-    if (response.config.method === 'post') {
108
+    if (response.config.method === "post") {
103 109
       setTimeout(() => {
104
-        const replaceList = response.config.url.split('/')
110
+        const replaceList = response.config.url.split("/");
105 111
         const newUrl =
106 112
           replaceList[replaceList.length - 2] +
107
-          '/' +
108
-          replaceList[replaceList.length - 1]
109
-        allowRequest(reqList, newUrl)
110
-      }, 1000)
113
+          "/" +
114
+          replaceList[replaceList.length - 1];
115
+        allowRequest(reqList, newUrl);
116
+      }, 1000);
111 117
     }
112
-    const res = response.data
113
-    if (res.state && res.state.toLowerCase() !== 'success') {
118
+    const res = response.data;
119
+    if (res.state && res.state.toLowerCase() !== "success") {
114 120
       Message({
115 121
         message: res.message,
116
-        type: 'error',
122
+        type: "error",
117 123
         duration: 5 * 1000
118
-      })
124
+      });
119 125
       // 50008:非法的token; 50012:其他客户端登录了;  "notoken":Token 过期了
120 126
       if (
121 127
         res.state.toLowerCase() === 50008 ||
122 128
         res.state.toLowerCase() === 50012 ||
123
-        res.state.toLowerCase() === 'notoken'
129
+        res.state.toLowerCase() === "notoken"
124 130
       ) {
125 131
         MessageBox.confirm(
126
-          '你已被登出,可以取消继续留在该页面,或者重新登录',
127
-          '确定登出',
132
+          "你已被登出,可以取消继续留在该页面,或者重新登录",
133
+          "确定登出",
128 134
           {
129
-            confirmButtonText: '重新登录',
130
-            cancelButtonText: '取消',
131
-            type: 'warning'
135
+            confirmButtonText: "重新登录",
136
+            cancelButtonText: "取消",
137
+            type: "warning"
132 138
           }
133 139
         ).then(() => {
134
-          store.dispatch('FedLogOut').then(() => {
135
-            location.reload() // 为了重新实例化vue-router对象 避免bug
136
-          })
137
-        })
140
+          store.dispatch("FedLogOut").then(() => {
141
+            location.reload(); // 为了重新实例化vue-router对象 避免bug
142
+          });
143
+        });
138 144
       }
139
-      return Promise.reject('error')
145
+      return Promise.reject("error");
140 146
     } else {
141
-      if (response.config.responseType === 'blob') {
142
-        return response
147
+      if (response.config.responseType === "blob") {
148
+        return response;
143 149
       }
144
-      return response.data
150
+      return response.data;
145 151
     }
146 152
   },
147 153
   error => {
148
-    console.log('err:' + error) // for debug
154
+    if (error.response.config.method === "post") {
155
+      setTimeout(() => {
156
+        const replaceList = error.response.config.url.split("/");
157
+        const newUrl =
158
+          replaceList[replaceList.length - 2] +
159
+          "/" +
160
+          replaceList[replaceList.length - 1];
161
+        allowRequest(reqList, newUrl);
162
+      }, 500);
163
+    }
164
+    console.log("err:" + error); // for debug
149 165
     if (error && error.response) {
150 166
       switch (
151 167
         error.response.status // 跨域存在获取不到状态码的情况
152 168
       ) {
153 169
         case 400:
154
-          error.message = `请求错误(400):${error.response.config.url}`
155
-          break
170
+          error.message = `请求错误(400):${error.response.config.url}`;
171
+          break;
156 172
 
157 173
         case 401:
158
-          error.message = `未授权,请登录(401):${error.response.config.url}`
159
-          store.dispatch('FedLogOut').then(() => {
160
-            location.reload() // 为了重新实例化vue-router对象 避免bug
161
-          })
162
-          break
174
+          error.message = `未授权,请登录(401):${error.response.config.url}`;
175
+          store.dispatch("FedLogOut").then(() => {
176
+            location.reload(); // 为了重新实例化vue-router对象 避免bug
177
+          });
178
+          break;
163 179
 
164 180
         case 403:
165
-          error.message = `拒绝访问(403):${error.response.config.url}`
166
-          break
181
+          error.message = `拒绝访问(403):${error.response.config.url}`;
182
+          break;
167 183
 
168 184
         case 404:
169
-          error.message = `请求地址出错(404): ${error.response.config.url}`
170
-          break
185
+          error.message = `请求地址出错(404): ${error.response.config.url}`;
186
+          break;
171 187
 
172 188
         case 408:
173
-          error.message = `请求超时(408):${error.response.config.url}`
174
-          break
189
+          error.message = `请求超时(408):${error.response.config.url}`;
190
+          break;
175 191
 
176 192
         case 500:
177
-          error.message = `服务器内部错误(500):${error.response.config.url}`
178
-          break
193
+          error.message = `服务器内部错误(500):${error.response.config.url}`;
194
+          break;
179 195
 
180 196
         case 501:
181
-          error.message = `服务未实现(501):${error.response.config.url}`
182
-          break
197
+          error.message = `服务未实现(501):${error.response.config.url}`;
198
+          break;
183 199
 
184 200
         case 502:
185
-          error.message = `网关错误(502):${error.response.config.url}`
186
-          break
201
+          error.message = `网关错误(502):${error.response.config.url}`;
202
+          break;
187 203
 
188 204
         case 503:
189
-          error.message = `服务不可用(503):${error.response.config.url}`
190
-          break
205
+          error.message = `服务不可用(503):${error.response.config.url}`;
206
+          break;
191 207
 
192 208
         case 504:
193
-          error.message = `网关超时(504):${error.response.config.url}`
194
-          break
209
+          error.message = `网关超时(504):${error.response.config.url}`;
210
+          break;
195 211
 
196 212
         case 505:
197
-          error.message = `HTTP版本不受支持(505):${error.response.config.url}`
198
-          break
213
+          error.message = `HTTP版本不受支持(505):${error.response.config.url}`;
214
+          break;
199 215
 
200 216
         default:
201
-          error.message = `连接错误:${error.response.status}`
202
-          break
217
+          error.message = `连接错误:${error.response.status}`;
218
+          break;
203 219
       }
204
-    } else if (error.message.indexOf('请求被中断') !== -1) {
205
-      error.message = '请勿重复请求!'
220
+    } else if (error.message.indexOf("请求被中断") !== -1) {
221
+      error.message = "请勿重复请求!";
206 222
     } else {
207
-      error.message = '网络出现问题,请稍后重试!'
223
+      error.message = "网络出现问题,请稍后重试!";
208 224
     }
209 225
     Message({
210 226
       message: error.message,
211
-      type: 'error',
227
+      type: "error",
212 228
       duration: 5 * 1000
213
-    })
214
-    return Promise.reject(error)
229
+    });
230
+    return Promise.reject(error);
215 231
   }
216
-)
232
+);
217 233
 
218
-export default service
234
+export default service;

+ 289 - 269
CallCenterWeb.UI/RMYY/src/utils/telWebsocket.js

@@ -3,32 +3,32 @@
3 3
  * 签入后心跳开始;签出后心跳结束;
4 4
  * 增加心跳 false 处理(签出)
5 5
  */
6
-import {
7
-  Message,
8
-  MessageBox,
9
-  Switch
10
-} from 'element-ui'
11
-import store from '@/store'
12
-import router from '@/router'
13
-import { Teljournal } from '@/api/commonAPI'
14
-let ws // websocket 实例
15
-let cls = 0
16
-let lockReconnect = false // 避免重复连接
17
-let websocktTimer // 定时器
18
-let wsUrl = null
6
+import { Message, MessageBox, Switch } from "element-ui";
7
+import store from "@/store";
8
+import router from "@/router";
9
+import { Teljournal } from "@/api/commonAPI";
10
+let ws; // websocket 实例
11
+let cls = 0;
12
+let lockReconnect = false; // 避免重复连接
13
+let websocktTimer; // 定时器
14
+let wsUrl = null;
19 15
 // const wsUrl = 'ws://' + process.env.SOCKET_IP + ':' + process.env.SOCKET_PORT
20 16
 // 创建scoket连接
21 17
 export function createWebSocket() {
22
-  wsUrl = 'ws://' + store.getters.serverConfig.SOCKET_IP + ':' + store.getters.serverConfig.SOCKET_PORT // 请求地址
18
+  wsUrl =
19
+    "ws://" +
20
+    store.getters.serverConfig.SOCKET_IP +
21
+    ":" +
22
+    store.getters.serverConfig.SOCKET_PORT; // 请求地址
23 23
   try {
24
-    if ('WebSocket' in window) {
25
-      ws = new WebSocket(wsUrl) // 创建一个websocket实例
26
-      init()
24
+    if ("WebSocket" in window) {
25
+      ws = new WebSocket(wsUrl); // 创建一个websocket实例
26
+      init();
27 27
     } else {
28
-      Message.error('当前浏览器不支持Websocket!')
28
+      Message.error("当前浏览器不支持Websocket!");
29 29
     }
30 30
   } catch (e) {
31
-    reconnect()
31
+    reconnect();
32 32
   }
33 33
 }
34 34
 
@@ -36,55 +36,66 @@ export function createWebSocket() {
36 36
 function init() {
37 37
   ws.onopen = function() {
38 38
     // console.groupCollapsed(`telWebsocket:`)
39
-    console.log(new Date() + '  telWebsocket  ' + '建立连接:' + wsUrl)
39
+    console.log(new Date() + "  telWebsocket  " + "建立连接:" + wsUrl);
40 40
     // signIn()
41 41
     // 修改store 中连接状态
42
-    store.dispatch('ConnectWs', true)
42
+    store.dispatch("ConnectWs", true);
43 43
     // 修改 store 中telwebsocket的数据
44
-    store.dispatch('ChangeTelWSMsg', {
45
-      'wsUrl': wsUrl,
46
-      'operationType': '建立连接'
47
-    })
48
-    if (Number(window.sessionStorage.getItem('storageSeatState'))) {
49
-      signIn()
44
+    store.dispatch("ChangeTelWSMsg", {
45
+      wsUrl: wsUrl,
46
+      operationType: "建立连接"
47
+    });
48
+    if (Number(window.sessionStorage.getItem("storageSeatState"))) {
49
+      signIn();
50 50
     }
51
-    if (Number(window.sessionStorage.getItem('telIsLogin'))) {
51
+    if (Number(window.sessionStorage.getItem("telIsLogin"))) {
52 52
       // heartCheck.reset().start()
53 53
       // heartCheck.sendHeart()
54 54
     }
55
-  }
55
+  };
56 56
 
57 57
   // 接收到消息的回调方法
58 58
   ws.onmessage = function(evt) {
59 59
     // 如果获取到消息,心跳检测重置
60 60
     // 拿到任何消息都说明当前连接是正常的
61 61
     // heartCheck.reset().start()
62
-    console.log('%c' + new Date() + '%c receive%c telWebsocket %ctype:' + JSON.parse(evt.data)[0].Type + '%c ' + evt
63
-      .data, 'color: #111', 'color: #67C23A', 'color: #111', 'color: #67C23A', 'color: #111')
64
-    dealMsg(JSON.parse(evt.data)[0])
62
+    console.log(
63
+      "%c" +
64
+        new Date() +
65
+        "%c receive%c telWebsocket %ctype:" +
66
+        JSON.parse(evt.data)[0].Type +
67
+        "%c " +
68
+        evt.data,
69
+      "color: #111",
70
+      "color: #67C23A",
71
+      "color: #111",
72
+      "color: #67C23A",
73
+      "color: #111"
74
+    );
75
+    dealMsg(JSON.parse(evt.data)[0]);
65 76
     // 修改 store 中telwebsocket的数据
66
-    const telWSData = JSON.parse(evt.data)
67
-    telWSData.operationType = '接收'
68
-    store.dispatch('ChangeTelWSMsg', telWSData)
69
-  }
77
+    const telWSData = JSON.parse(evt.data);
78
+    telWSData.operationType = "接收";
79
+    store.dispatch("ChangeTelWSMsg", telWSData);
80
+  };
70 81
 
71 82
   // 连接关闭的回调方法
72 83
   ws.onclose = function(evt) {
73 84
     if (cls === 0) {
74
-      cls = 1
75
-      console.log('telWebsocket连接关闭')
85
+      cls = 1;
86
+      console.log("telWebsocket连接关闭");
76 87
       // console.groupEnd()
77 88
       // 修改store 中连接状态
78
-      store.dispatch('ConnectWs', false)
79
-      store.dispatch('ChangeLineState', 1)
89
+      store.dispatch("ConnectWs", false);
90
+      store.dispatch("ChangeLineState", 1);
80 91
       // 修改 store 中telwebsocket的数据
81
-      store.dispatch('ChangeTelWSMsg', {
82
-        'wsUrl': wsUrl,
83
-        'operationType': '连接关闭'
84
-      })
85
-      reconnect()
92
+      store.dispatch("ChangeTelWSMsg", {
93
+        wsUrl: wsUrl,
94
+        operationType: "连接关闭"
95
+      });
96
+      reconnect();
86 97
     }
87
-  }
98
+  };
88 99
 
89 100
   // 连接发生错误的回调方法
90 101
   ws.onerror = function(evt) {
@@ -99,40 +110,40 @@ function init() {
99 110
     // })
100 111
     // console.warn('telWebsocket连接出现异常!')
101 112
     // 修改 store 中telwebsocket的数据
102
-    store.dispatch('ChangeTelWSMsg', {
103
-      'wsUrl': wsUrl,
104
-      'operationType': '连接异常'
105
-    })
113
+    store.dispatch("ChangeTelWSMsg", {
114
+      wsUrl: wsUrl,
115
+      operationType: "连接异常"
116
+    });
106 117
     if (ws == null || ws.readyState !== ws.OPEN) {
107
-      console.log(new Date() + 'telWebsocket开始重连')
118
+      console.log(new Date() + "telWebsocket开始重连");
108 119
       // 修改 store 中telwebsocket的数据
109
-      store.dispatch('ChangeTelWSMsg', {
110
-        'wsUrl': wsUrl,
111
-        'operationType': '开始重连'
112
-      })
113
-      reconnect()
120
+      store.dispatch("ChangeTelWSMsg", {
121
+        wsUrl: wsUrl,
122
+        operationType: "开始重连"
123
+      });
124
+      reconnect();
114 125
     }
115
-  }
126
+  };
116 127
 }
117 128
 
118 129
 /**
119 130
  * 重新连接
120 131
  */
121 132
 function reconnect() {
122
-  if (lockReconnect) return
123
-  lockReconnect = true
133
+  if (lockReconnect) return;
134
+  lockReconnect = true;
124 135
   // 没连接上会一直重连,设置延迟避免请求过多
125
-  websocktTimer && clearTimeout(websocktTimer)
136
+  websocktTimer && clearTimeout(websocktTimer);
126 137
   websocktTimer = setTimeout(function() {
127
-    console.log(new Date() + '    ' + 'telWebsocket重连中……')
138
+    console.log(new Date() + "    " + "telWebsocket重连中……");
128 139
     // 修改 store 中telwebsocket的数据
129
-    store.dispatch('ChangeTelWSMsg', {
130
-      'wsUrl': wsUrl,
131
-      'operationType': '重连中……'
132
-    })
133
-    createWebSocket()
134
-    lockReconnect = false
135
-  }, 2000)
140
+    store.dispatch("ChangeTelWSMsg", {
141
+      wsUrl: wsUrl,
142
+      operationType: "重连中……"
143
+    });
144
+    createWebSocket();
145
+    lockReconnect = false;
146
+  }, 2000);
136 147
 }
137 148
 
138 149
 /**
@@ -141,15 +152,22 @@ function reconnect() {
141 152
  */
142 153
 export function Send(scoketDatas) {
143 154
   if (ws.readyState !== ws.OPEN) {
144
-    reconnect()
155
+    reconnect();
145 156
   }
146 157
   if (ws.readyState === ws.OPEN) {
147
-    console.log('%c' + new Date() + '%c  send %c telWebsocket  ' + JSON.stringify(scoketDatas), 'color: #111',
148
-      'color: #409EFF', 'color: #111')
149
-    ws.send(JSON.stringify(scoketDatas))
150
-    scoketDatas.operationType = '发送'
158
+    console.log(
159
+      "%c" +
160
+        new Date() +
161
+        "%c  send %c telWebsocket  " +
162
+        JSON.stringify(scoketDatas),
163
+      "color: #111",
164
+      "color: #409EFF",
165
+      "color: #111"
166
+    );
167
+    ws.send(JSON.stringify(scoketDatas));
168
+    scoketDatas.operationType = "发送";
151 169
     // 修改 store 中telwebsocket的数据
152
-    store.dispatch('ChangeTelWSMsg', scoketDatas)
170
+    store.dispatch("ChangeTelWSMsg", scoketDatas);
153 171
   }
154 172
 }
155 173
 
@@ -159,32 +177,31 @@ const heartCheck = {
159 177
   timeoutObj: null,
160 178
   serverTimeoutObj: null,
161 179
   reset: function() {
162
-    clearTimeout(this.timeoutObj)
163
-    clearTimeout(this.serverTimeoutObj)
164
-    return this
180
+    clearTimeout(this.timeoutObj);
181
+    clearTimeout(this.serverTimeoutObj);
182
+    return this;
165 183
   },
166 184
 
167 185
   start: function() {
168
-    const _self = this
186
+    const _self = this;
169 187
     this.timeoutObj = setTimeout(function() {
170 188
       // 这里发送一个心跳,后端收到后,返回一个心跳消息,
171 189
       // onmessage拿到返回的心跳就说明连接正常
172
-      _self.sendHeart()
173
-      _self.aa()
174
-    }, this.timeout)
190
+      _self.sendHeart();
191
+      _self.aa();
192
+    }, this.timeout);
175 193
   },
176 194
   sendHeart: function() {
177 195
     const scoketDatas = {
178
-      'Type': 'Heart',
179
-      'Result': true,
180
-      'AgentID': store.getters.usercode, // 工号
181
-      'AgentExten': store.getters.extension, // 分机号
182
-      'AgentGroup': store.getters.groupcode // 坐席组id
183
-    }
184
-    Send(scoketDatas)
196
+      Type: "Heart",
197
+      Result: true,
198
+      AgentID: store.getters.usercode, // 工号
199
+      AgentExten: store.getters.extension, // 分机号
200
+      AgentGroup: store.getters.groupcode // 坐席组id
201
+    };
202
+    Send(scoketDatas);
185 203
   }
186
-
187
-}
204
+};
188 205
 // 迁入
189 206
 function signIn() {
190 207
   // if(!this.groupcode){
@@ -205,14 +222,14 @@ function signIn() {
205 222
   //   return
206 223
   // }
207 224
   const scoketDatas = {
208
-    'Type': 'Login',
209
-    'AgentID': store.getters.usercode,
210
-    'AgentExten': store.getters.extension,
211
-    'AgentGroup': window.localStorage.getItem('groupCode'), // 坐席组id window.localStorage.getItem('groupCode')
212
-    'AgentType': '0',
213
-    'DisposeTime': '0' // 话后处理时长设置,0代表一致话后处理,除非发送置闲 (按照历史习惯,字符串形式)
214
-  }
215
-  Send(scoketDatas)
225
+    Type: "Login",
226
+    AgentID: store.getters.usercode,
227
+    AgentExten: store.getters.extension,
228
+    AgentGroup: window.localStorage.getItem("groupCode"), // 坐席组id window.localStorage.getItem('groupCode')
229
+    AgentType: "0",
230
+    DisposeTime: "0" // 话后处理时长设置,0代表一致话后处理,除非发送置闲 (按照历史习惯,字符串形式)
231
+  };
232
+  Send(scoketDatas);
216 233
 }
217 234
 /**
218 235
  * 处理接收的消息
@@ -220,118 +237,123 @@ function signIn() {
220 237
  */
221 238
 function dealMsg(msgData) {
222 239
   if (msgData) {
223
-    const rlt = msgData.Result
240
+    const rlt = msgData.Result;
224 241
     if (rlt === true) {
225 242
       switch (msgData.Type.toLowerCase()) {
226
-        case 'login': // 签入
227
-          LoginBack()
228
-          break
229
-        case 'logout': // 签出
230
-          LogoutBack()
231
-          break
232
-        case 'dropcall': // 挂断
233
-          DropCallBack()
234
-          break
235
-        case 'makecall': // 外呼
236
-          MakeCallBack(msgData)
237
-          break
238
-        case 'setstate': // 置忙 置闲
239
-          SetState(msgData)
240
-          break // 置忙置闲
241
-        case 'meeting': // 会议
242
-          MeetingBack()
243
-          break
244
-        case 'transfer': // 转移
245
-          TransferBack()
246
-          break
247
-          // case 'consult': // 协商呼叫
248
-          //   ConsultBack()
249
-          //   break
250
-        case 'hold': // 保持
251
-          HoldBack(msgData)
252
-          break
253
-        case 'retrieve': // 接回
254
-          RetrieveBack()
255
-          break
256
-        case 'incoming': // 来电
257
-          IncomingBack(msgData)
258
-          break
259
-        case 'linestateagent': // 线路状态
260
-          LineStateAgentBack(msgData)
261
-          break
262
-        case 'agentstate': // 线路状态
263
-          updateSeatMonitorlists(msgData)
264
-          break
265
-        case 'getagentlist':
266
-          getAgentList(msgData)
267
-          break
243
+        case "login": // 签入
244
+          LoginBack();
245
+          break;
246
+        case "logout": // 签出
247
+          LogoutBack();
248
+          break;
249
+        case "dropcall": // 挂断
250
+          DropCallBack();
251
+          break;
252
+        case "makecall": // 外呼
253
+          MakeCallBack(msgData);
254
+          break;
255
+        case "setstate": // 置忙 置闲
256
+          SetState(msgData);
257
+          break; // 置忙置闲
258
+        case "meeting": // 会议
259
+          MeetingBack();
260
+          break;
261
+        case "transfer": // 转移
262
+          TransferBack();
263
+          break;
264
+        // case 'consult': // 协商呼叫
265
+        //   ConsultBack()
266
+        //   break
267
+        case "hold": // 保持
268
+          HoldBack(msgData);
269
+          break;
270
+        case "retrieve": // 接回
271
+          RetrieveBack();
272
+          break;
273
+        case "incoming": // 来电
274
+          IncomingBack(msgData);
275
+          break;
276
+        case "linestateagent": // 线路状态
277
+          LineStateAgentBack(msgData);
278
+          break;
279
+        case "agentstate": // 线路状态
280
+          updateSeatMonitorlists(msgData);
281
+          break;
282
+        case "getagentlist":
283
+          getAgentList(msgData);
284
+          break;
268 285
       }
269 286
     } else if (rlt === false) {
270 287
       // const errCode = msgData.Error % 10000
271 288
       Message({
272 289
         dangerouslyUseHTMLString: true,
273
-        message: '<div style="font-size:42px;font-weight: 700;text-align: center; width:80%;margin: 0 auto;">' +
274
-          msgData.Type + '</div>',
290
+        message:
291
+          '<div style="font-size:42px;font-weight: 700;text-align: center; width:80%;margin: 0 auto;">' +
292
+          msgData.Type +
293
+          "</div>",
275 294
         offset: 400,
276 295
         center: true,
277
-        type: 'error',
296
+        type: "error",
278 297
         duration: 2 * 1000
279
-      })
298
+      });
280 299
     } else {
281
-      if (msgData.Type.toLowerCase() === 'linestateagent') {
282
-        LineStateAgentBack(msgData)
283
-      } else if (msgData.Type.toLowerCase() === 'monitor') {
284
-        updateSeatMonitorlists(msgData)
285
-      } else if (msgData.Type.toLowerCase() === 'waitcount') {
286
-        console.log(msgData.Type)
300
+      if (msgData.Type.toLowerCase() === "linestateagent") {
301
+        LineStateAgentBack(msgData);
302
+      } else if (msgData.Type.toLowerCase() === "monitor") {
303
+        updateSeatMonitorlists(msgData);
304
+      } else if (msgData.Type.toLowerCase() === "waitcount") {
305
+        console.log(msgData.Type);
306
+        store.dispatch("ChangeWaitcountNumber", msgData.WaitCount);
287 307
       } else {
288 308
         // Message.error(`${rlt} !`)
289 309
         Message({
290 310
           dangerouslyUseHTMLString: true,
291
-          message: '<div style="font-size:42px;font-weight: 700;text-align: center; width:80%;margin: 0 auto;">' +
292
-            rlt + '</div>',
311
+          message:
312
+            '<div style="font-size:42px;font-weight: 700;text-align: center; width:80%;margin: 0 auto;">' +
313
+            rlt +
314
+            "</div>",
293 315
           offset: 400,
294 316
           center: true,
295
-          type: 'error',
317
+          type: "error",
296 318
           duration: 2 * 1000
297
-        })
319
+        });
298 320
       }
299 321
     }
300 322
   }
301 323
 }
302 324
 
303 325
 function updateSeatMonitorlists(msgData) {
304
-  store.dispatch('ChangeMonitor', true) // 修改监听操作的返回值
305
-  store.dispatch('ChangeMonitorstate', msgData.State) // 监控状态
306
-  store.dispatch('ChangeMonitoragent', msgData.AgentID) // 监控坐席
307
-  store.dispatch('ChangeMonitorexten', msgData.ExtenID) // 监控坐席
326
+  store.dispatch("ChangeMonitor", true); // 修改监听操作的返回值
327
+  store.dispatch("ChangeMonitorstate", msgData.State); // 监控状态
328
+  store.dispatch("ChangeMonitoragent", msgData.AgentID); // 监控坐席
329
+  store.dispatch("ChangeMonitorexten", msgData.ExtenID); // 监控坐席
308 330
 }
309 331
 // 签入
310 332
 function LoginBack(reState) {
311 333
   // 心跳检测开始
312 334
   // heartCheck.reset().start()
313
-  cls = 0
314
-  store.dispatch('LoginWs')
315
-  store.dispatch('ChangeTopRightState', ['空闲', true])
335
+  cls = 0;
336
+  store.dispatch("LoginWs");
337
+  store.dispatch("ChangeTopRightState", ["空闲", true]);
316 338
   // 弹出任务信息
317
-  store.dispatch('ChangeTask', true)
318
-  let scoketDatas = {}
319
-  if (Number(window.sessionStorage.getItem('storageSeatState')) === 2) {
339
+  store.dispatch("ChangeTask", true);
340
+  let scoketDatas = {};
341
+  if (Number(window.sessionStorage.getItem("storageSeatState")) === 2) {
320 342
     scoketDatas = {
321
-      Type: 'SayFree',
322
-      AgentID: window.localStorage.getItem('storageUsercode'),
323
-      AgentExten: window.localStorage.getItem('ext')
324
-    }
325
-    Send(scoketDatas)
326
-  } else if (Number(window.sessionStorage.getItem('storageSeatState')) === 5) {
343
+      Type: "SayFree",
344
+      AgentID: window.localStorage.getItem("storageUsercode"),
345
+      AgentExten: window.localStorage.getItem("ext")
346
+    };
347
+    Send(scoketDatas);
348
+  } else if (Number(window.sessionStorage.getItem("storageSeatState")) === 5) {
327 349
     scoketDatas = {
328
-      Type: 'SayBusy',
329
-      AgentID: window.localStorage.getItem('storageUsercode'),
330
-      AgentExten: window.localStorage.getItem('ext')
331
-    }
332
-    Send(scoketDatas)
350
+      Type: "SayBusy",
351
+      AgentID: window.localStorage.getItem("storageUsercode"),
352
+      AgentExten: window.localStorage.getItem("ext")
353
+    };
354
+    Send(scoketDatas);
333 355
   } else {
334
-    window.sessionStorage.setItem('storageSeatState', 2)
356
+    window.sessionStorage.setItem("storageSeatState", 2);
335 357
   }
336 358
 }
337 359
 
@@ -339,23 +361,23 @@ function LoginBack(reState) {
339 361
 function LogoutBack(reState) {
340 362
   // 心跳检测关闭
341 363
   // heartCheck.reset()
342
-  store.dispatch('LogoutWs')
343
-  store.dispatch('ChangeTopRightState', ['已签出', false])
364
+  store.dispatch("LogoutWs");
365
+  store.dispatch("ChangeTopRightState", ["已签出", false]);
344 366
   // 重置初始化状态
345
-  resetInitState()
346
-  window.sessionStorage.setItem('storageSeatState', 0)
347
-  getOperatonTime('2')
348
-  console.log('签出2')
367
+  resetInitState();
368
+  window.sessionStorage.setItem("storageSeatState", 0);
369
+  getOperatonTime("2");
370
+  console.log("签出2");
349 371
 }
350 372
 
351 373
 // 重置初始化状态
352 374
 function resetInitState() {
353
-  store.dispatch('ChangeSeatState', 2) // 坐席状态(空闲)
354
-  store.dispatch('ChangeLineState', 1) // 线路状态(空闲)
355
-  store.dispatch('ChangeCallNum', '') // 顶部电话号码('')
356
-  store.dispatch('ChangeCallType', 'MakeCall') // 发送的通话类型(默认是外呼)
357
-  store.dispatch('ChangeTask', false) // 外呼任务信息是否显示
358
-  store.dispatch('ChangeTaskFirst', true) // 外呼任务信息是否是第一次弹出
375
+  store.dispatch("ChangeSeatState", 2); // 坐席状态(空闲)
376
+  store.dispatch("ChangeLineState", 1); // 线路状态(空闲)
377
+  store.dispatch("ChangeCallNum", ""); // 顶部电话号码('')
378
+  store.dispatch("ChangeCallType", "MakeCall"); // 发送的通话类型(默认是外呼)
379
+  store.dispatch("ChangeTask", false); // 外呼任务信息是否显示
380
+  store.dispatch("ChangeTaskFirst", true); // 外呼任务信息是否是第一次弹出
359 381
 }
360 382
 
361 383
 /**
@@ -364,17 +386,17 @@ function resetInitState() {
364 386
  * */
365 387
 function SetState(sayOption) {
366 388
   if (sayOption.State === 5) {
367
-    store.dispatch('ChangeSeatState', 5)
368
-    window.sessionStorage.setItem('storageSeatState', 5)
369
-    store.dispatch('ChangeTopRightState', ['忙碌', false])
370
-    getOperatonTime('3')
371
-    console.log('置忙3')
389
+    store.dispatch("ChangeSeatState", 5);
390
+    window.sessionStorage.setItem("storageSeatState", 5);
391
+    store.dispatch("ChangeTopRightState", ["忙碌", false]);
392
+    getOperatonTime("3");
393
+    console.log("置忙3");
372 394
   } else if (sayOption.State === 2) {
373
-    store.dispatch('ChangeSeatState', 2)
374
-    window.sessionStorage.setItem('storageSeatState', 2)
375
-    store.dispatch('ChangeTopRightState', ['空闲', true])
376
-    getOperatonTime('4')
377
-    console.log('置闲4')
395
+    store.dispatch("ChangeSeatState", 2);
396
+    window.sessionStorage.setItem("storageSeatState", 2);
397
+    store.dispatch("ChangeTopRightState", ["空闲", true]);
398
+    getOperatonTime("4");
399
+    console.log("置闲4");
378 400
   }
379 401
 }
380 402
 
@@ -383,9 +405,9 @@ function SetState(sayOption) {
383 405
  * sayOption (点击置忙置闲后的返回值)
384 406
  * */
385 407
 function SayBusyBack(sayOption) {
386
-  store.dispatch('ChangeSeatState', 5)
387
-  if (sayOption.Type === 'SayBusy') {
388
-    store.dispatch('ChangeTopRightState', ['忙碌', false])
408
+  store.dispatch("ChangeSeatState", 5);
409
+  if (sayOption.Type === "SayBusy") {
410
+    store.dispatch("ChangeTopRightState", ["忙碌", false]);
389 411
   }
390 412
 }
391 413
 /**
@@ -393,9 +415,9 @@ function SayBusyBack(sayOption) {
393 415
  * sayOption (点击置忙置闲后的返回值)
394 416
  * */
395 417
 function SayFreeBack(sayOption) {
396
-  store.dispatch('ChangeSeatState', 2)
397
-  if (sayOption.Type === 'SayFree') {
398
-    store.dispatch('ChangeTopRightState', ['空闲', true])
418
+  store.dispatch("ChangeSeatState", 2);
419
+  if (sayOption.Type === "SayFree") {
420
+    store.dispatch("ChangeTopRightState", ["空闲", true]);
399 421
   }
400 422
 }
401 423
 
@@ -406,100 +428,100 @@ function LineStateAgentBack(linedata) {
406 428
   switch (linedata.State) {
407 429
     // case '空闲':
408 430
     case 1:
409
-      store.dispatch('ChangeLineState', 1)
410
-      store.dispatch('ChangeCallNum', '') // 顶部电话号码('')
411
-      store.dispatch('ChangeTopRightState', ['空闲', true])
412
-      break
413
-      // case '摘机等待拨号':
431
+      store.dispatch("ChangeLineState", 1);
432
+      store.dispatch("ChangeCallNum", ""); // 顶部电话号码('')
433
+      store.dispatch("ChangeTopRightState", ["空闲", true]);
434
+      break;
435
+    // case '摘机等待拨号':
414 436
     case 2:
415
-      store.dispatch('ChangeLineState', 2)
416
-      store.dispatch('ChangeTopRightState', ['摘机等待拨号', true])
417
-      break
418
-      // case '正在拨号':
437
+      store.dispatch("ChangeLineState", 2);
438
+      store.dispatch("ChangeTopRightState", ["摘机等待拨号", true]);
439
+      break;
440
+    // case '正在拨号':
419 441
     case 3:
420
-      store.dispatch('ChangeLineState', 3)
421
-      store.dispatch('ChangeTopRightState', ['正在拨号', true])
422
-      break
423
-      // case '呼出振铃':
442
+      store.dispatch("ChangeLineState", 3);
443
+      store.dispatch("ChangeTopRightState", ["正在拨号", true]);
444
+      break;
445
+    // case '呼出振铃':
424 446
     case 4:
425
-      store.dispatch('ChangeLineState', 4)
426
-      store.dispatch('ChangeTopRightState', ['呼出振铃', true])
427
-      break
428
-      // case '来电振铃':
447
+      store.dispatch("ChangeLineState", 4);
448
+      store.dispatch("ChangeTopRightState", ["呼出振铃", true]);
449
+      break;
450
+    // case '来电振铃':
429 451
     case 5:
430
-      store.dispatch('ChangeLineState', 5)
431
-      store.dispatch('ChangeTopRightState', ['来电振铃', true])
432
-      break
433
-      // case '通话中':
452
+      store.dispatch("ChangeLineState", 5);
453
+      store.dispatch("ChangeTopRightState", ["来电振铃", true]);
454
+      break;
455
+    // case '通话中':
434 456
     case 6:
435
-      store.dispatch('ChangeLineState', 6)
436
-      store.dispatch('ChangeTopRightState', ['通话中', true])
437
-      break
438
-      // case '播放忙音中':
457
+      store.dispatch("ChangeLineState", 6);
458
+      store.dispatch("ChangeTopRightState", ["通话中", true]);
459
+      break;
460
+    // case '播放忙音中':
439 461
     case 7:
440
-      store.dispatch('ChangeLineState', 7)
441
-      store.dispatch('ChangeTopRightState', ['播放忙音中', true])
442
-      break
443
-      // case '移除IP分机':
462
+      store.dispatch("ChangeLineState", 7);
463
+      store.dispatch("ChangeTopRightState", ["播放忙音中", true]);
464
+      break;
465
+    // case '移除IP分机':
444 466
     case 8:
445
-      store.dispatch('ChangeLineState', 8)
446
-      store.dispatch('ChangeTopRightState', ['移除IP分机', true])
447
-      break
448
-      // case '通话保持中':
467
+      store.dispatch("ChangeLineState", 8);
468
+      store.dispatch("ChangeTopRightState", ["移除IP分机", true]);
469
+      break;
470
+    // case '通话保持中':
449 471
     case 10:
450
-      store.dispatch('ChangeLineState', 10)
451
-      store.dispatch('ChangeTopRightState', ['通话保持中', true])
452
-      break
472
+      store.dispatch("ChangeLineState", 10);
473
+      store.dispatch("ChangeTopRightState", ["通话保持中", true]);
474
+      break;
453 475
   }
454 476
 }
455 477
 
456 478
 // 来电
457 479
 function IncomingBack(inComingData) {
458
-  const inComingCallId = inComingData.CallID
459
-  let inComingNumber = inComingData.Number
460
-  store.dispatch('screenPopUpBoole', 1)
480
+  const inComingCallId = inComingData.CallID;
481
+  let inComingNumber = inComingData.Number;
482
+  store.dispatch("screenPopUpBoole", 1);
461 483
   if (inComingNumber.length > 11) {
462
-    inComingNumber = inComingNumber.substr(1)
484
+    inComingNumber = inComingNumber.substr(1);
463 485
     // console.log(inComingNumber)
464 486
   }
465
-  window.localStorage.setItem('callidSave', inComingData.CallID) // 用户的坐席组code
487
+  window.localStorage.setItem("callidSave", inComingData.CallID); // 用户的坐席组code
466 488
   router.push({
467
-    name: 'CallScreen',
468
-    path: '/callScreen',
469
-    fullPath: '/callScreen',
489
+    name: "CallScreen",
490
+    path: "/callScreen",
491
+    fullPath: "/callScreen",
470 492
     params: {
471 493
       callid: inComingCallId,
472 494
       telInNumber: inComingNumber
473 495
     }
474
-  })
475
-  store.dispatch('ChangeCallNum', inComingNumber)
496
+  });
497
+  store.dispatch("ChangeCallNum", inComingNumber);
476 498
 }
477 499
 
478 500
 // 挂断
479 501
 function DropCallBack() {
480
-  store.dispatch('ChangeCallNum', '') // 顶部电话号码('')
481
-  store.dispatch('ChangeCallType', 'MakeCall') // 发送的通话类型(默认是外呼)
482
-  store.dispatch('screenPopUpBoole', 0)
502
+  store.dispatch("ChangeCallNum", ""); // 顶部电话号码('')
503
+  store.dispatch("ChangeCallType", "MakeCall"); // 发送的通话类型(默认是外呼)
504
+  store.dispatch("screenPopUpBoole", 0);
483 505
   // 当前在坐席监控中需要 更新坐席监控内坐席的状态
484
-  const curentViews = store.state.tagsView.visitedViews
506
+  const curentViews = store.state.tagsView.visitedViews;
485 507
   for (let i = 0, len = curentViews.length; i < len; i++) {
486
-    if (curentViews[i].name === 'seatMonitor') {
508
+    if (curentViews[i].name === "seatMonitor") {
487 509
       // updateSeatMonitorlists()
488
-      return
510
+      return;
489 511
     }
490 512
   }
491 513
 }
492 514
 
493 515
 // 转接
494 516
 function TransferBack() {
495
-  store.dispatch('ChangeCallNum', '') // 顶部电话号码('')
496
-  store.dispatch('ChangeCallType', 'MakeCall') // 发送的通话类型(默认是外呼)
517
+  store.dispatch("ChangeCallNum", ""); // 顶部电话号码('')
518
+  store.dispatch("ChangeCallType", "MakeCall"); // 发送的通话类型(默认是外呼)
497 519
 }
498 520
 
499 521
 // 外呼 结果 弹出来电弹屏
500 522
 function MakeCallBack(callBackData) {
501
-  const inComingNumber = store.getters.telCallNum
502
-  const inComingCallId = callBackData.CallID
523
+  const inComingNumber = store.getters.telCallNum;
524
+  const inComingCallId = callBackData.CallID;
503 525
 }
504 526
 
505 527
 // 多方通话
@@ -511,7 +533,7 @@ function RecordPathBack() {}
511 533
 // 保持
512 534
 function HoldBack(holdData) {
513 535
   if (holdData.Result === true) {
514
-    store.dispatch('ChangeLineState', 10)
536
+    store.dispatch("ChangeLineState", 10);
515 537
   }
516 538
 }
517 539
 
@@ -530,17 +552,15 @@ function RetrieveBack(RetrieveData) {
530 552
 
531 553
 // 获取当前在线坐席
532 554
 function getAgentList(data) {
533
-  store.dispatch('GetOnlineSeatList', data.AgentList) // 监控坐席
555
+  store.dispatch("GetOnlineSeatList", data.AgentList); // 监控坐席
534 556
 }
535 557
 
536 558
 function getOperatonTime(state) {
537 559
   const params = {
538 560
     state: state,
539
-    token: localStorage.getItem('Admin-Token').split(' ')[1]
540
-  }
561
+    token: localStorage.getItem("Admin-Token").split(" ")[1]
562
+  };
541 563
   Teljournal(params)
542
-    .then((response) => {
543
-
544
-    })
545
-    .catch((result) => {})
564
+    .then(response => {})
565
+    .catch(result => {});
546 566
 }

+ 355 - 336
CallCenterWeb.UI/RMYY/src/views/dashboard/index.vue

@@ -1,11 +1,11 @@
1 1
 <template>
2 2
   <!-- 首页 -->
3 3
   <div class="dashboard app-container">
4
-    <el-row style="margin-bottom:10px;">
4
+    <el-row style="margin-bottom: 10px">
5 5
       <div class="zx">坐席</div>
6 6
       <button class="initBtn" @click="initInfor">刷新</button>
7 7
     </el-row>
8
-    <el-row :gutter="20" style="margin-bottom:30px;">
8
+    <el-row :gutter="20" style="margin-bottom: 30px">
9 9
       <el-col :span="14">
10 10
         <div class="bottomLine">
11 11
           <span class="line" />
@@ -19,7 +19,7 @@
19 19
                 <span>呼入总数:{{ callInTotal }}</span>
20 20
               </div>
21 21
               <div>
22
-                <label class="answer">{{ answersNum }}<br>接听数</label>
22
+                <label class="answer">{{ answersNum }}<br />接听数</label>
23 23
               </div>
24 24
             </div>
25 25
             <div class="telTime">
@@ -34,7 +34,7 @@
34 34
                 <span>外呼总数:{{ calOutTotal }}</span>
35 35
               </div>
36 36
               <div>
37
-                <label class="answer">{{ ConnectNum }}<br>接通数</label>
37
+                <label class="answer">{{ ConnectNum }}<br />接通数</label>
38 38
               </div>
39 39
             </div>
40 40
             <div class="telTime">
@@ -50,13 +50,13 @@
50 50
           <span>实时统计</span>
51 51
         </div>
52 52
         <div class="pending">
53
-          <img src="../../assets/imgs/cl.png" alt="" class="cl">
54
-          <span>后台排队:10</span>
53
+          <img src="../../assets/imgs/cl.png" alt="" class="cl" />
54
+          <span>后台排队:{{ waitcountNumber }}</span>
55 55
         </div>
56 56
       </el-col>
57 57
     </el-row>
58 58
 
59
-    <el-row :gutter="20" style="margin-bottom:30px">
59
+    <el-row :gutter="20" style="margin-bottom: 30px">
60 60
       <el-col :span="14">
61 61
         <div class="bLine">
62 62
           <span class="line" />
@@ -64,23 +64,23 @@
64 64
         </div>
65 65
         <ul class="centerPart">
66 66
           <li>
67
-            <img src="../../assets/imgs/pd.png" alt="">
68
-            <div style="margin:8px 0">待处理</div>
67
+            <img src="../../assets/imgs/pd.png" alt="" />
68
+            <div style="margin: 8px 0">待处理</div>
69 69
             <div>{{ dealOrder }}</div>
70 70
           </li>
71 71
           <li>
72
-            <img src="../../assets/imgs/pd.png" alt="">
73
-            <div style="margin:8px 0">待派工</div>
72
+            <img src="../../assets/imgs/pd.png" alt="" />
73
+            <div style="margin: 8px 0">待派工</div>
74 74
             <div>{{ dispatch }}</div>
75 75
           </li>
76 76
           <li>
77
-            <img src="../../assets/imgs/pd.png" alt="">
78
-            <div style="margin:8px 0">待完工</div>
77
+            <img src="../../assets/imgs/pd.png" alt="" />
78
+            <div style="margin: 8px 0">待完工</div>
79 79
             <div>{{ finish }}</div>
80 80
           </li>
81 81
           <li>
82
-            <img src="../../assets/imgs/pd.png" alt="">
83
-            <div style="margin:8px 0">待评价</div>
82
+            <img src="../../assets/imgs/pd.png" alt="" />
83
+            <div style="margin: 8px 0">待评价</div>
84 84
             <div>{{ evaluate }}</div>
85 85
           </li>
86 86
         </ul>
@@ -89,18 +89,28 @@
89 89
         <div class="bottomLine">
90 90
           <span class="line" />
91 91
           <span>公告管理</span>
92
-          <span style="float: right;color: #4A5064;cursor: pointer;" @click="goseeMore()">查看更多>></span>
92
+          <span
93
+            style="float: right; color: #4a5064; cursor: pointer"
94
+            @click="goseeMore()"
95
+            >查看更多>></span
96
+          >
93 97
         </div>
94 98
         <div class="notices">
95
-          <p v-for="(item,index) in noticeData" :key="index">
96
-            <span class="circle"></span><a
97
-              @click="btn_see(item.F_NoticeId)">{{item.F_Title.length>20?item.F_Title.substring(0,20)+'...':item.F_Title}}</a>
98
-            <span style="color: #555;font-size: 15px;">{{item.F_CreateOn}}</span>
99
+          <p v-for="(item, index) in noticeData" :key="index">
100
+            <span class="circle"></span
101
+            ><a @click="btn_see(item.F_NoticeId)">{{
102
+              item.F_Title.length > 20
103
+                ? item.F_Title.substring(0, 20) + "..."
104
+                : item.F_Title
105
+            }}</a>
106
+            <span style="color: #555; font-size: 15px">{{
107
+              item.F_CreateOn
108
+            }}</span>
99 109
           </p>
100 110
         </div>
101 111
       </el-col>
102 112
     </el-row>
103
-    <el-row style="position: relative;">
113
+    <el-row style="position: relative">
104 114
       <div class="bLine">
105 115
         <span class="line" />
106 116
         <span>完成工单</span>
@@ -118,334 +128,343 @@
118 128
       </el-tabs>
119 129
       <div class="block">
120 130
         <span class="demonstration">选择日期</span>
121
-        <el-date-picker v-model="timeDate" type="daterange" range-separator="至" start-placeholder="开始日期"
122
-          end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd" @change="initTime" />
131
+        <el-date-picker
132
+          v-model="timeDate"
133
+          type="daterange"
134
+          range-separator="至"
135
+          start-placeholder="开始日期"
136
+          end-placeholder="结束日期"
137
+          format="yyyy-MM-dd"
138
+          value-format="yyyy-MM-dd"
139
+          @change="initTime"
140
+        />
123 141
       </div>
124 142
     </el-row>
125 143
   </div>
126 144
 </template>
127 145
 
128 146
 <script>
129
-  import {
130
-    getOneIndex,
131
-    getTelCount,
132
-    GetListTop
133
-  } from '@/api/dashboard'
134
-  import FinishOrder from './finishOrder'
135
-  import NoticeDetail from '../AnnounceManagement/Notice/components/detail.vue'
136
-  export default {
137
-    name: 'Dashboard',
138
-    components: {
139
-      FinishOrder
147
+import { mapGetters } from "vuex";
148
+import { getOneIndex, getTelCount, GetListTop } from "@/api/dashboard";
149
+import FinishOrder from "./finishOrder";
150
+import NoticeDetail from "../AnnounceManagement/Notice/components/detail.vue";
151
+export default {
152
+  name: "Dashboard",
153
+  components: {
154
+    FinishOrder,
155
+  },
156
+  data() {
157
+    return {
158
+      finishOrder: {
159
+        jkzxfinishcount: "",
160
+        wpzjzxcount: "",
161
+        jtyysmcount: "",
162
+        jmzgwhcount: "",
163
+        zhallcount: "",
164
+        wobxcount: "",
165
+        sbzldevcount: "",
166
+        clddcarcount: "",
167
+      },
168
+      activeName: "0",
169
+      timeDate: "",
170
+      callInTotal: "",
171
+      answersNum: "",
172
+      totalCallInTime: "",
173
+      averageCallInTime: "",
174
+      calOutTotal: "",
175
+      ConnectNum: "",
176
+      totalCallOutTime: "",
177
+      averageCallOutTime: "",
178
+      dealOrder: "",
179
+      dispatch: "",
180
+      finish: "",
181
+      evaluate: "",
182
+      noticeData: [],
183
+      isNotice: "1",
184
+    };
185
+  },
186
+  computed: {},
187
+  computed: {
188
+    ...mapGetters([
189
+      "waitcountNumber", // 工号
190
+    ]),
191
+  },
192
+  created() {
193
+    this.getTelInfor();
194
+    this.getInfor();
195
+    this.getNotice();
196
+  },
197
+  mounted() {},
198
+  methods: {
199
+    getNotice() {
200
+      return new Promise((resolve) => {
201
+        const params = {
202
+          top: 4,
203
+        };
204
+        GetListTop(params).then((response) => {
205
+          this.noticeData = response.rows;
206
+        });
207
+        resolve();
208
+      });
140 209
     },
141
-    data() {
142
-      return {
143
-        finishOrder: {
144
-          jkzxfinishcount: '',
145
-          wpzjzxcount: '',
146
-          jtyysmcount: '',
147
-          jmzgwhcount: '',
148
-          zhallcount: '',
149
-          wobxcount: '',
150
-          sbzldevcount: '',
151
-          clddcarcount: ''
210
+    btn_see(rowdata) {
211
+      this.$layer.iframe({
212
+        content: {
213
+          content: NoticeDetail, // 传递的组件对象
214
+          parent: this, // 当前的vue对象
215
+          data: {
216
+            rowdata: rowdata.toString(),
217
+          }, // props
152 218
         },
153
-        activeName: '0',
154
-        timeDate: '',
155
-        callInTotal: '',
156
-        answersNum: '',
157
-        totalCallInTime: '',
158
-        averageCallInTime: '',
159
-        calOutTotal: '',
160
-        ConnectNum: '',
161
-        totalCallOutTime: '',
162
-        averageCallOutTime: '',
163
-        dealOrder: '',
164
-        dispatch: '',
165
-        finish: '',
166
-        evaluate: '',
167
-        noticeData: [],
168
-        isNotice:'1'
169
-      }
219
+        area: ["70%", "70%"],
220
+        title: "公告详情",
221
+      });
170 222
     },
171
-    computed: {},
172
-    created() {
173
-      this.getTelInfor()
174
-      this.getInfor()
175
-      this.getNotice()
223
+    goseeMore() {
224
+      this.$router.push({
225
+        name: "Notice",
226
+        params: {
227
+          isNotice: this.isNotice,
228
+        },
229
+      });
176 230
     },
177
-    mounted() {
178
-
231
+    initInfor() {
232
+      this.getTelInfor();
233
+      this.getInfor();
179 234
     },
180
-    methods: {
181
-      getNotice() {
182
-        return new Promise((resolve) => {
183
-          const params = {
184
-            top: 4
185
-          }
186
-          GetListTop(params).then((response) => {
187
-            this.noticeData = response.rows
188
-          })
189
-          resolve()
190
-        })
191
-      },
192
-      btn_see(rowdata) {
193
-        this.$layer.iframe({
194
-          content: {
195
-            content: NoticeDetail, // 传递的组件对象
196
-            parent: this, // 当前的vue对象
197
-            data: {
198
-              rowdata: rowdata.toString()
199
-            } // props
200
-          },
201
-          area: ['70%', '70%'],
202
-          title: '公告详情'
203
-        })
204
-      },
205
-      goseeMore() {
206
-        this.$router.push({
207
-          name: 'Notice',
208
-          params: {
209
-            isNotice: this.isNotice
210
-          }
211
-        })
212
-      },
213
-      initInfor() {
214
-        this.getTelInfor()
215
-        this.getInfor()
216
-      },
217
-      initTime() {
218
-        console.log(11)
219
-        this.getInfor()
220
-      },
221
-      handleClick(tab) {
222
-        this.activeName = tab.name
223
-        this.getInfor()
224
-      },
225
-      getInfor() {
226
-        return new Promise((resolve) => {
227
-          const params = {
228
-            isweek: this.activeName,
229
-            stime: this.timeDate && this.timeDate[0],
230
-            etime: this.timeDate && this.timeDate[1]
231
-          }
232
-          getOneIndex(params).then((response) => {
233
-            this.dealOrder = response.data.dclallcount
234
-            this.dispatch = response.data.dpgallcount
235
-            this.finish = response.data.dwgallcount
236
-            this.evaluate = response.data.dpjallcount
237
-            this.finishOrder.jkzxfinishcount = response.data.jkzxfinishcount
238
-            this.finishOrder.wpzjzxcount = response.data.wpzjzxcount
239
-            this.finishOrder.jtyysmcount = response.data.jtyysmcount
240
-            this.finishOrder.jmzgwhcount = response.data.jmzgwhcount
241
-            this.finishOrder.zhallcount = response.data.zhallcount
242
-            this.finishOrder.wobxcount = response.data.wobxcount
243
-            this.finishOrder.sbzldevcount = response.data.sbzldevcount
244
-            this.finishOrder.clddcarcount = response.data.clddcarcount
245
-          })
246
-          resolve()
247
-        })
248
-      },
249
-      getTelInfor() {
250
-        return new Promise((resolve) => {
251
-          const params = {}
252
-          getTelCount(params).then((response) => {
253
-            this.callInTotal = response.dayin.count
254
-            this.answersNum = response.jtconin
255
-            this.totalCallInTime = response.thtimesin
256
-            this.averageCallInTime = response.pjthtimesin
257
-            this.calOutTotal = response.dayout.count
258
-            this.ConnectNum = response.jtconout
259
-            this.totalCallOutTime = response.thtimesout
260
-            this.averageCallOutTime = response.pjthtimesout
261
-          })
262
-          resolve()
263
-        })
264
-      }
265
-    }
266
-  }
235
+    initTime() {
236
+      console.log(11);
237
+      this.getInfor();
238
+    },
239
+    handleClick(tab) {
240
+      this.activeName = tab.name;
241
+      this.getInfor();
242
+    },
243
+    getInfor() {
244
+      return new Promise((resolve) => {
245
+        const params = {
246
+          isweek: this.activeName,
247
+          stime: this.timeDate && this.timeDate[0],
248
+          etime: this.timeDate && this.timeDate[1],
249
+        };
250
+        getOneIndex(params).then((response) => {
251
+          this.dealOrder = response.data.dclallcount;
252
+          this.dispatch = response.data.dpgallcount;
253
+          this.finish = response.data.dwgallcount;
254
+          this.evaluate = response.data.dpjallcount;
255
+          this.finishOrder.jkzxfinishcount = response.data.jkzxfinishcount;
256
+          this.finishOrder.wpzjzxcount = response.data.wpzjzxcount;
257
+          this.finishOrder.jtyysmcount = response.data.jtyysmcount;
258
+          this.finishOrder.jmzgwhcount = response.data.jmzgwhcount;
259
+          this.finishOrder.zhallcount = response.data.zhallcount;
260
+          this.finishOrder.wobxcount = response.data.wobxcount;
261
+          this.finishOrder.sbzldevcount = response.data.sbzldevcount;
262
+          this.finishOrder.clddcarcount = response.data.clddcarcount;
263
+        });
264
+        resolve();
265
+      });
266
+    },
267
+    getTelInfor() {
268
+      return new Promise((resolve) => {
269
+        const params = {};
270
+        getTelCount(params).then((response) => {
271
+          this.callInTotal = response.dayin.count;
272
+          this.answersNum = response.jtconin;
273
+          this.totalCallInTime = response.thtimesin;
274
+          this.averageCallInTime = response.pjthtimesin;
275
+          this.calOutTotal = response.dayout.count;
276
+          this.ConnectNum = response.jtconout;
277
+          this.totalCallOutTime = response.thtimesout;
278
+          this.averageCallOutTime = response.pjthtimesout;
279
+        });
280
+        resolve();
281
+      });
282
+    },
283
+  },
284
+};
267 285
 </script>
268 286
 
269 287
 <style rel="stylesheet/scss" lang="scss" scoped>
270
-  .dashboard {
271
-    width: 99%;
272
-    height: 100%;
273
-    padding: 20px 40px;
274
-    box-sizing: border-box;
275
-    background-color: #fff;
276
-
277
-    .mb {
278
-      margin-bottom: 6px;
279
-    }
280
-  }
281
-
282
-  .block {
283
-    position: absolute;
284
-    top: -3px;
285
-    right: -5px;
288
+.dashboard {
289
+  width: 99%;
290
+  height: 100%;
291
+  padding: 20px 40px;
292
+  box-sizing: border-box;
293
+  background-color: #fff;
294
+
295
+  .mb {
296
+    margin-bottom: 6px;
286 297
   }
287
-
288
-  .initBtn {
289
-    float: right;
290
-    background-color: #fff;
291
-    border: 1px solid rgb(64, 158, 255);
292
-    padding: 7px 25px;
293
-    outline: none;
294
-    color: rgb(64, 158, 255);
295
-    border-radius: 5px;
296
-  }
297
-
298
-  .initBtn:hover {
299
-    background-color: rgb(64, 158, 255);
300
-    color: #fff;
301
-  }
302
-
303
-  .bg-.bg-purple[data-v-106c86ed] {
304
-    background-color: chocolate !important;
305
-  }
306
-
307
-  .zx {
308
-    float: left;
309
-    color: rgb(102, 102, 102);
310
-  }
311
-
312
-  .line {
313
-    display: inline-block;
314
-    width: 5px;
315
-    height: 18px;
316
-    background-color: rgb(64, 158, 255);
317
-    vertical-align: middle;
318
-    margin-right: 10px;
319
-  }
320
-
321
-  .bottomLine,
322
-  .bLine {
323
-    border-bottom: 1px solid rgb(215, 215, 215);
324
-    padding-bottom: 10px;
325
-  }
326
-
327
-  li {
328
-    list-style: none;
329
-    float: left;
330
-  }
331
-
332
-  .topPart li {
333
-    width: 47%;
334
-    margin-right: 21px;
335
-    height: 200px;
336
-  }
337
-
338
-  .callIn {
339
-    height: 160px;
340
-    background-color: rgb(40, 155, 217);
341
-    border-radius: 15px 15px 0 0;
342
-    font-size: 22px;
343
-    color: #fff;
344
-    font-weight: bold;
345
-  }
346
-
347
-  .telTime {
348
-    height: 40px;
349
-    background-color: rgb(242, 242, 242);
350
-    border-radius: 0 0 15px 15px;
351
-  }
352
-
353
-  .callIn div {
354
-    float: left;
355
-    width: 50%;
356
-    padding: 10px 20px;
357
-  }
358
-
359
-  .callIn div span {
360
-    display: block;
361
-    height: 70px;
362
-    line-height: 70px;
363
-  }
364
-
365
-  .answer {
366
-    width: 89px;
367
-    display: inline-block;
368
-    text-align: center;
369
-    padding: 0 10px;
370
-    margin-top: 33px;
371
-    line-height: 29px;
372
-    margin-left: 57px;
373
-  }
374
-
375
-  .telTime div {
376
-    float: left;
377
-    width: 48%;
378
-    line-height: 40px;
379
-    padding-left: 20px;
380
-    font-size: 14px;
381
-    color: rgb(102, 102, 102);
382
-  }
383
-
384
-  .pending {
385
-    margin-top: 20px;
386
-    width: 200px;
387
-    border: 1px solid rgb(215, 215, 215);
388
-    padding: 10px;
389
-    color: rgb(102, 102, 102);
390
-    margin-left: 20px;
391
-  }
392
-
393
-  .cl {
394
-    border-style: none;
395
-    width: 21px;
396
-    vertical-align: middle;
397
-    margin-right: 30px;
398
-  }
399
-
400
-  .bLine {
401
-    width: 150px;
402
-  }
403
-
404
-  .centerPart li {
405
-    width: 10%;
406
-    text-align: center;
407
-    padding: 10px;
408
-    background-color: rgb(242, 242, 242);
409
-    margin-right: 10px;
410
-  }
411
-
412
-  .tabs {
413
-    position: absolute;
414
-    top: -9px;
415
-    left: 148px;
416
-  }
417
-
418
-  .circle {
419
-    display: inline-block;
420
-    width: 10px;
421
-    height: 10px;
422
-    border-radius: 50%;
423
-    border: 1px solid #FF0000;
424
-    margin-right: 10px;
425
-  }
426
-
427
-  .notices {
428
-    margin-left: 15px;
429
-  }
430
-
431
-  .notices a {
432
-    margin-right: 15px;
433
-  }
434
-
435
-  .notices p a:hover {
436
-    text-decoration: underline;
437
-    color: rgb(85, 170, 255);
438
-  }
439
-
440
-  /deep/.el-tabs__content {
441
-    left: -158px !important;
442
-    width: 152%;
443
-  }
444
-
445
-  /deep/.el-tabs__item {
446
-    padding: 0 107px !important;
447
-    font-size: 15px;
448
-  }
449
-
450
-  @media only screen and (min-width: 992px) {}
298
+}
299
+
300
+.block {
301
+  position: absolute;
302
+  top: -3px;
303
+  right: -5px;
304
+}
305
+
306
+.initBtn {
307
+  float: right;
308
+  background-color: #fff;
309
+  border: 1px solid rgb(64, 158, 255);
310
+  padding: 7px 25px;
311
+  outline: none;
312
+  color: rgb(64, 158, 255);
313
+  border-radius: 5px;
314
+}
315
+
316
+.initBtn:hover {
317
+  background-color: rgb(64, 158, 255);
318
+  color: #fff;
319
+}
320
+
321
+.bg-.bg-purple[data-v-106c86ed] {
322
+  background-color: chocolate !important;
323
+}
324
+
325
+.zx {
326
+  float: left;
327
+  color: rgb(102, 102, 102);
328
+}
329
+
330
+.line {
331
+  display: inline-block;
332
+  width: 5px;
333
+  height: 18px;
334
+  background-color: rgb(64, 158, 255);
335
+  vertical-align: middle;
336
+  margin-right: 10px;
337
+}
338
+
339
+.bottomLine,
340
+.bLine {
341
+  border-bottom: 1px solid rgb(215, 215, 215);
342
+  padding-bottom: 10px;
343
+}
344
+
345
+li {
346
+  list-style: none;
347
+  float: left;
348
+}
349
+
350
+.topPart li {
351
+  width: 47%;
352
+  margin-right: 21px;
353
+  height: 200px;
354
+}
355
+
356
+.callIn {
357
+  height: 160px;
358
+  background-color: rgb(40, 155, 217);
359
+  border-radius: 15px 15px 0 0;
360
+  font-size: 22px;
361
+  color: #fff;
362
+  font-weight: bold;
363
+}
364
+
365
+.telTime {
366
+  height: 40px;
367
+  background-color: rgb(242, 242, 242);
368
+  border-radius: 0 0 15px 15px;
369
+}
370
+
371
+.callIn div {
372
+  float: left;
373
+  width: 50%;
374
+  padding: 10px 20px;
375
+}
376
+
377
+.callIn div span {
378
+  display: block;
379
+  height: 70px;
380
+  line-height: 70px;
381
+}
382
+
383
+.answer {
384
+  width: 89px;
385
+  display: inline-block;
386
+  text-align: center;
387
+  padding: 0 10px;
388
+  margin-top: 33px;
389
+  line-height: 29px;
390
+  margin-left: 57px;
391
+}
392
+
393
+.telTime div {
394
+  float: left;
395
+  width: 48%;
396
+  line-height: 40px;
397
+  padding-left: 20px;
398
+  font-size: 14px;
399
+  color: rgb(102, 102, 102);
400
+}
401
+
402
+.pending {
403
+  margin-top: 20px;
404
+  width: 200px;
405
+  border: 1px solid rgb(215, 215, 215);
406
+  padding: 10px;
407
+  color: rgb(102, 102, 102);
408
+  margin-left: 20px;
409
+}
410
+
411
+.cl {
412
+  border-style: none;
413
+  width: 21px;
414
+  vertical-align: middle;
415
+  margin-right: 30px;
416
+}
417
+
418
+.bLine {
419
+  width: 150px;
420
+}
421
+
422
+.centerPart li {
423
+  width: 10%;
424
+  text-align: center;
425
+  padding: 10px;
426
+  background-color: rgb(242, 242, 242);
427
+  margin-right: 10px;
428
+}
429
+
430
+.tabs {
431
+  position: absolute;
432
+  top: -9px;
433
+  left: 148px;
434
+}
435
+
436
+.circle {
437
+  display: inline-block;
438
+  width: 10px;
439
+  height: 10px;
440
+  border-radius: 50%;
441
+  border: 1px solid #ff0000;
442
+  margin-right: 10px;
443
+}
444
+
445
+.notices {
446
+  margin-left: 15px;
447
+}
448
+
449
+.notices a {
450
+  margin-right: 15px;
451
+}
452
+
453
+.notices p a:hover {
454
+  text-decoration: underline;
455
+  color: rgb(85, 170, 255);
456
+}
457
+
458
+/deep/.el-tabs__content {
459
+  left: -158px !important;
460
+  width: 152%;
461
+}
462
+
463
+/deep/.el-tabs__item {
464
+  padding: 0 107px !important;
465
+  font-size: 15px;
466
+}
467
+
468
+@media only screen and (min-width: 992px) {
469
+}
451 470
 </style>