Selaa lähdekoodia

分机绑定、问题修改

liuyifan 5 vuotta sitten
vanhempi
commit
6dda3e8d8d

+ 46 - 0
CallCenterWeb.UI/src/api/telCall/extensionBind.js

@@ -0,0 +1,46 @@
1
+import request from '@/utils/request'
2
+
3
+// 获取分机绑定列表
4
+export function getExtensionBindList(params) {
5
+  return request({
6
+    url: 'api/ExtensionBind/getlist',
7
+    method: 'get',
8
+    params
9
+  })
10
+}
11
+
12
+// 获取分机绑定详情
13
+export function getExtensionBindDetail(params) {
14
+  return request({
15
+    url: 'api/ExtensionBind/getdetails',
16
+    method: 'get',
17
+    params
18
+  })
19
+}
20
+
21
+// 添加分机绑定
22
+export function addExtensionBind(params) {
23
+  return request({
24
+    url: 'api/ExtensionBind/add',
25
+    method: 'post',
26
+    params
27
+  })
28
+}
29
+
30
+// 编辑分机绑定
31
+export function editExtensionBind(params) {
32
+  return request({
33
+    url: 'api/ExtensionBind/update',
34
+    method: 'post',
35
+    params
36
+  })
37
+}
38
+
39
+// 删除分机绑定
40
+export function deleteExtensionBind(params) {
41
+  return request({
42
+    url: 'api/ExtensionBind/delete',
43
+    method: 'post',
44
+    params
45
+  })
46
+}

+ 562 - 0
CallCenterWeb.UI/src/views/CustomerServiceReport/salesDetailsProductionSheet/index.vue

@@ -0,0 +1,562 @@
1
+<template>
2
+  <div class="app-container">
3
+    <div class="filter-container">
4
+      <el-row :gutter="20">
5
+        <el-col :span="5">
6
+          <el-date-picker v-model="searchData.searchTime" :picker-options="pickerOptions" class="filter-item" type="daterange" format="yyyy年MM月dd日" value-format="yyyy-MM-dd" align="left" unlink-panels range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" />
7
+        </el-col>
8
+        <el-col :span="3">
9
+          <el-input v-model="searchData.adFrom" placeholder="请输入消息/广告媒体来源" class="filter-item" />
10
+        </el-col>
11
+        <el-col :span="3">
12
+          <el-select v-model="searchData.type" class="filter-item" filterable clearable placeholder="请选择订单类型">
13
+            <el-option v-for="item in orderType" :key="item.F_Value" :label="item.F_Value" :value="item.F_Value" />
14
+          </el-select>
15
+        </el-col>
16
+        <el-col :span="3">
17
+          <el-select v-model="searchData.payType" class="filter-item" filterable clearable placeholder="请选择支付方式">
18
+            <el-option v-for="item in payTypeList" :key="item.F_Value" :label="item.F_Value" :value="item.F_Value" />
19
+          </el-select>
20
+        </el-col>
21
+        <el-col :span="3">
22
+          <el-input v-model="searchData.id" placeholder="请输入订单号" class="filter-item" />
23
+        </el-col>
24
+        <el-col :span="3">
25
+          <el-input v-model="searchData.customer" placeholder="请输入客户姓名" class="filter-item" />
26
+        </el-col>
27
+        <el-col :span="3">
28
+          <el-input v-model="searchData.customerPhone" placeholder="请输入客户手机号" class="filter-item" />
29
+        </el-col>
30
+        <el-col :span="3">
31
+          <el-input v-model="searchData.trackingNo" placeholder="请输入运单号" class="filter-item" />
32
+        </el-col>
33
+        <el-col :span="3">
34
+          <el-input v-model="searchData.keywords" placeholder="请输入关键字" class="filter-item" />
35
+        </el-col>
36
+        <el-col :span="3">
37
+          <el-select v-if="activeName == 1" v-model="searchData.logisticsStatus" class="form_select" filterable clearable placeholder="请选择物流状态">
38
+            <el-option v-for="item in logisticsList" :key="item.F_Value" :label="item.F_Remark" :value="item.F_Value" />
39
+          </el-select>
40
+        </el-col>
41
+        <el-col :span="3">
42
+          <el-select v-if="activeName == 1" v-model="searchData.F_State" class="form_select" filterable clearable placeholder="请选择订单状态">
43
+            <el-option v-for="item in orderstate" :key="item.id" :label="item.value" :value="item.id" />
44
+          </el-select>
45
+        </el-col>
46
+        <el-col :span="10">
47
+          <el-button type="primary" class="filter-item" icon="el-icon-search" @click="btn_search">搜索</el-button>
48
+          <el-button v-permission="'HY_bulk_submit'" v-if="authority_submit()" type="primary" class="filter-item" @click="btn_bulk_submit">批量提交</el-button>
49
+        </el-col>
50
+      </el-row>
51
+    </div>
52
+    <el-tabs v-model="activeName" type="card" @tab-click="handleTabClick">
53
+      <el-tab-pane label="待提交" name="0" />
54
+      <el-tab-pane label="客服退回" name="2" />
55
+      <el-tab-pane label="已提交" name="1" />
56
+      <el-tab-pane label="物流未通过" name="9" />
57
+    </el-tabs>
58
+    <div>
59
+      <span>订单数量:{{ pageParams.total }}</span>
60
+    </div>
61
+    <el-table v-loading="loading" ref="multipleTable" :data="dataLists" border stripe row-key="F_Id" @selection-change="handleSelectionChange">
62
+      <el-table-column :reserve-selection="true" type="selection" />
63
+      <el-table-column type="index" label="编号" align="center" fixed width="80" />
64
+      <el-table-column prop="F_Id" label="订单编号" align="center" min-width="180">
65
+        <template slot-scope="scope">
66
+          <el-button type="text" size="small" @click="hadndleOrderCode(scope.row.F_Id)">{{ scope.row.F_Id }}</el-button>
67
+        </template>
68
+      </el-table-column>
69
+      <el-table-column prop="F_Customer" label="客户姓名" align="center" min-width />
70
+      <el-table-column prop="F_CustomerPhone" label="手机号码" align="center" min-width="140">
71
+        <template slot-scope="scope">
72
+          {{ scope.row.F_CustomerPhone }}
73
+          <i v-if="authority_call_out(scope.row.F_Status)" class="el-icon-phone phoneIcon" @click="clickCallOut(scope.row.F_CustomerPhone)" />
74
+        </template>
75
+      </el-table-column>
76
+      <el-table-column label="订购商品" align="center" min-width>
77
+        <template slot-scope="scope">{{ scope.row.OrderDetailList | judgmentOrderGoods }}</template>
78
+      </el-table-column>
79
+      <el-table-column prop="F_AddTime" label="下单日期" align="center" />
80
+      <el-table-column label="订单状态" align="center">
81
+        <template slot-scope="scope">{{ scope.row.F_State | judgmentStateName }}</template>
82
+      </el-table-column>
83
+      <el-table-column prop="F_CheckRemark" label="客服退回原因" align="center" />
84
+      <el-table-column prop="F_AddUserName" label="下单员工" align="center" />
85
+      <el-table-column prop="F_BelongName" label="归属员工" align="center" />
86
+      <el-table-column prop="F_Type" label="订单类型" align="center" />
87
+      <el-table-column prop="F_Express" label="快递公司" align="center" />
88
+      <el-table-column label="物流状态" align="center">
89
+        <template slot-scope="scope">{{ scope.row.F_Status | judgmentStatusName }}</template>
90
+      </el-table-column>
91
+      <el-table-column label="操作" width="240" align="center" class-name="oparate_btn" fixed="right">
92
+        <template slot-scope="scope">
93
+          <el-button v-permission="'HY_edit'" v-if="authority_edit(scope.row.F_State, scope.row.F_Type)" :disabled="isDisable" type="text" @click="btn_edit(scope.row.F_Id)">编辑</el-button>
94
+          <el-button v-permission="'HY_add_remark'" type="text" @click="btn_add_remark(scope.row.F_Id)">备注</el-button>
95
+          <el-button v-permission="'HY_submit'" v-if="authority_submit()" :disabled="isDisable" type="text" @click="btn_submit(scope.row.F_Id)">提交</el-button>
96
+        </template>
97
+      </el-table-column>
98
+    </el-table>
99
+    <!-- <pagination
100
+      v-show="pageParams.total > 0"
101
+      :total="pageParams.total"
102
+      :pageindex.sync="pageParams.pageindex"
103
+      :pagesize.sync="pageParams.pagesize"
104
+      class="pagination"
105
+      @pagination="getList"
106
+    /> -->
107
+  </div>
108
+</template>
109
+
110
+<script>
111
+import { getDictionaryValueList } from "@/api/commonAPI"
112
+import { getOrderLists, orderBulkSubmit } from "@/api/orderManagement/orderList"
113
+import { pickerOptions, formatterContent } from "@/utils"
114
+import { Send } from "@/utils/telWebsocket"
115
+import { getCallOutprefix } from "@/api/teloperation"
116
+import { mapGetters } from "vuex"
117
+// import store from "@/store"
118
+// import addOrEditRemark from "./addOrEditRemark"
119
+// import edit from "./edit"
120
+import detail from "@/views/orderManagement/orderList/detail"
121
+import Pagination from "@/components/Pagination" // 对el-pagination 二次封装
122
+
123
+export default {
124
+  name: "OrderList",
125
+  components: {
126
+    Pagination,
127
+  },
128
+  filters: {
129
+    judgmentStateName(status) {
130
+      const statusMap = {
131
+        0: "未提交",
132
+        1: "待分仓",
133
+        2: "已退回",
134
+        3: "已分仓",
135
+        4: "无货",
136
+        5: "仓库待审核",
137
+        6: "已发货",
138
+        7: "付款待审核",
139
+        8: "待分物流",
140
+        9: "物流未通过",
141
+      }
142
+      return statusMap[status]
143
+    },
144
+    judgmentStatusName(status) {
145
+      const statusMap = {
146
+        0: "未发出",
147
+        1: "未签收",
148
+        2: "签收",
149
+        3: "改代收",
150
+        4: "拒收",
151
+      }
152
+      return statusMap[status]
153
+    },
154
+    judgmentOrderGoods(status) {
155
+      let orderGoodsNameQuantity = ""
156
+      for (let i = 0; i < status.length; i++) {
157
+        orderGoodsNameQuantity = `${orderGoodsNameQuantity}${status[i].F_ProductName}*${status[i].F_Count},`
158
+      }
159
+      orderGoodsNameQuantity = orderGoodsNameQuantity.substring(0, orderGoodsNameQuantity.length - 1)
160
+      return orderGoodsNameQuantity
161
+    },
162
+  },
163
+  data() {
164
+    return {
165
+      isDisable: false, // 防止多次点击
166
+      loading: false,
167
+      searchData: {
168
+        adFrom: "", // 消息/广告媒体来源
169
+        type: "", // 订单类型
170
+        payType: "", // 支付方式
171
+        id: "", // 订单号
172
+        customer: "", // 客户姓名
173
+        customerPhone: "", // 客户手机号
174
+        trackingNo: "", // 运单号
175
+        keywords: "", // 关键字
176
+        searchTime: "", // 订单时间
177
+        logisticsStatus: "", // 物流状态
178
+        F_State: "0",
179
+        State: "",
180
+      },
181
+      activeName: "0", // 标签切换首页
182
+      pickerOptions, // 日期数据
183
+      pageParams: {
184
+        pageindex: 1, // 当前第几页
185
+        pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
186
+        total: 0, // 总共多少数据
187
+      },
188
+      dataLists: [], // 列表数据
189
+      payTypeList: [], // 支付方式列表
190
+      logisticsList: [], // 物流状态
191
+      multipleSelection: [], // 选中的数据
192
+      selectedId: [], // 选中的数据的id
193
+      orderType: [], // 订单类型
194
+      selectOrderId: [], // 合并订单id
195
+      orderstate: [
196
+        {
197
+          id: "1",
198
+          value: "待分仓",
199
+        },
200
+        // {
201
+        //   id: '2',
202
+        //   value: '客服退回'
203
+        // },
204
+        {
205
+          id: "3",
206
+          value: "已分仓",
207
+        },
208
+        {
209
+          id: "4",
210
+          value: "无货",
211
+        },
212
+        // {
213
+        //   id: '5',
214
+        //   value: '客服提交'
215
+        // },
216
+        {
217
+          id: "6",
218
+          value: "已发货",
219
+        },
220
+        {
221
+          id: "7",
222
+          value: "付款待审核",
223
+        },
224
+        {
225
+          id: "8",
226
+          value: "待分物流",
227
+        },
228
+        {
229
+          id: "9",
230
+          value: "物流未通过",
231
+        },
232
+      ],
233
+    }
234
+  },
235
+  created() {
236
+    if (this.$route.params.id) {
237
+      // this.activeName = this.$route.params.id
238
+    }
239
+    this.getOrderType()
240
+    this.getOrderF_State()
241
+    this.getList()
242
+    this.getPayType()
243
+    document.onkeyup = (e) => {
244
+      if (e.keyCode === 13) {
245
+        this.getList()
246
+      }
247
+    }
248
+  },
249
+  computed: {
250
+    ...mapGetters([
251
+      "usercode", // 工号
252
+      "extension", // 分机号
253
+      "sidebar",
254
+      "avatar",
255
+      "telCallType", // 通话类型
256
+      "telIsVisCallout", // 外呼面板是否显示
257
+    ]),
258
+  },
259
+  methods: {
260
+    getList() {
261
+      this.loading = true
262
+      return new Promise((resolve) => {
263
+        const params = {
264
+          F_State: this.searchData.F_State, // 订单状态
265
+          pageindex: 1, // int 第几页
266
+          pagesize: 1000000, // int 每页几条信息
267
+          F_ADFrom: this.searchData.adFrom, // 消息/广告来源
268
+          F_Type: this.searchData.type, // 订单类型
269
+          F_PayType: this.searchData.payType, // 支付方式
270
+          F_Id: this.searchData.id, // 订单号
271
+          F_Customer: this.searchData.customer, // 客户姓名
272
+          F_Status: this.searchData.logisticsStatus, // 物流状态
273
+          F_CustomerPhone: this.searchData.customerPhone, // 客户手机号
274
+          F_TrackingNo: this.searchData.trackingNo, // 运单号
275
+          keywords: this.searchData.keywords, // 关键字
276
+          SearchStartTime: this.searchData.searchTime && this.searchData.searchTime[0], // 添加开始时间
277
+          SearchEndTime: this.searchData.searchTime && this.searchData.searchTime[1], // 添加结束时间
278
+          F_PayState: -2,
279
+          State: this.searchData.State,
280
+        }
281
+        getOrderLists(params).then((response) => {
282
+          this.loading = false
283
+          if (response.state.toLowerCase() === "success") {
284
+            this.pageParams.total = response.data.Totals
285
+            this.dataLists = response.data.Rows
286
+          }
287
+        })
288
+        resolve()
289
+      })
290
+    },
291
+    // 获取订单类型
292
+    getOrderType() {
293
+      return new Promise((resolve) => {
294
+        const params = {
295
+          isleaf: true,
296
+          code: "ORDERTYPE",
297
+        }
298
+        getDictionaryValueList(params).then((response) => {
299
+          if (response.state.toLowerCase() === "success") {
300
+            this.orderType = response.data.Rows
301
+          }
302
+        })
303
+      })
304
+    },
305
+    // 获取支付方式
306
+    getPayType() {
307
+      return new Promise((resolve) => {
308
+        const params = {
309
+          isleaf: true,
310
+          code: "PayType",
311
+        }
312
+        getDictionaryValueList(params).then((response) => {
313
+          if (response.state.toLowerCase() === "success") {
314
+            this.payTypeList = response.data.Rows
315
+          }
316
+        })
317
+      })
318
+    },
319
+    // 获取物流状态
320
+    getOrderF_State() {
321
+      return new Promise((resolve) => {
322
+        const params = {
323
+          isleaf: true,
324
+          code: "OrderF_State",
325
+        }
326
+        getDictionaryValueList(params).then((response) => {
327
+          if (response.state.toLowerCase() === "success") {
328
+            const res = response.data.Rows
329
+            res.forEach((e, i) => {
330
+              if (e.F_Remark === "未签收") {
331
+                this.logisticsList.push(e)
332
+              } else if (e.F_Remark === "签收") {
333
+                this.logisticsList.push(e)
334
+              } else if (e.F_Remark === "拒收") {
335
+                this.logisticsList.push(e)
336
+              } else if (e.F_Remark === "未发出") {
337
+                this.logisticsList.push(e)
338
+              }
339
+            })
340
+          }
341
+        })
342
+      })
343
+    },
344
+    handleTabClick(tab, event) {
345
+      this.$refs.multipleTable.clearSelection()
346
+      this.pageParams.pageindex = 1
347
+      if (this.activeName == "1") {
348
+        this.searchData.State = this.activeName
349
+        this.searchData.F_State = ""
350
+      } else {
351
+        this.searchData.F_State = this.activeName
352
+        this.searchData.State = ""
353
+      }
354
+      this.getList()
355
+    },
356
+    handle(ordercode) {
357
+      this.$layer.iframe({
358
+        content: {
359
+          content: detail, // 传递的组件对象
360
+          parent: this, // 当前的vue对象
361
+          data: { rowid: ordercode }, // props
362
+        },
363
+        area: ["80%", "90%"],
364
+        title: "订单详情",
365
+      })
366
+    },
367
+    btn_search() {
368
+      this.pageParams.pageindex = 1
369
+      this.getList()
370
+    },
371
+    // 添加备注
372
+    btn_add_remark(id) {
373
+      this.$layer.iframe({
374
+        content: {
375
+          content: addOrEditRemark, // 传递的组件对象
376
+          parent: this, // 当前的vue对象
377
+          data: { rowid: id }, // props
378
+        },
379
+        area: ["40%", "50%"],
380
+        title: "添加备注",
381
+      })
382
+    },
383
+    // 编辑
384
+    btn_edit(editId) {
385
+      this.$layer.iframe({
386
+        content: {
387
+          content: edit, // 传递的组件对象
388
+          parent: this, // 当前的vue对象
389
+          data: { rowid: editId }, // props
390
+        },
391
+        area: ["80%", "90%"],
392
+        title: "编辑订单",
393
+      })
394
+    },
395
+    // 提交
396
+    btn_submit(orderId) {
397
+      this.isDisable = true
398
+      setTimeout(() => {
399
+        this.$confirm("您确定提交吗?", "提示", {
400
+          confirmButtonText: "确定",
401
+          cancelButtonText: "取消",
402
+          type: "warning",
403
+        })
404
+          .then(() => {
405
+            this.isDisable = false
406
+            const data = {
407
+              orderids: orderId,
408
+            }
409
+            orderBulkSubmit(data).then((response) => {
410
+              if (response.state.toLowerCase() === "success") {
411
+                this.getList()
412
+                this.$message.success("提交成功!")
413
+              }
414
+            })
415
+          })
416
+          .catch(() => {
417
+            this.$message({
418
+              type: "info",
419
+              message: "已取消提交",
420
+            })
421
+          })
422
+        this.isDisable = false
423
+      }, 300)
424
+    },
425
+    // 批量提交
426
+    btn_bulk_submit() {
427
+      if (this.selectOrderId.length < 1) {
428
+        this.$message({
429
+          message: "请选择订单!",
430
+          type: "warning",
431
+        })
432
+        return
433
+      }
434
+      this.isDisable = true
435
+      setTimeout(() => {
436
+        this.$confirm("您确定提交吗?", "提示", {
437
+          confirmButtonText: "确定",
438
+          cancelButtonText: "取消",
439
+          type: "warning",
440
+        })
441
+          .then(() => {
442
+            this.isDisable = false
443
+            const data = {
444
+              orderids: this.selectOrderId.join(",").replace(/\s+/g, ""),
445
+            }
446
+            orderBulkSubmit(data).then((response) => {
447
+              if (response.state.toLowerCase() === "success") {
448
+                this.getList()
449
+                this.$message.success("提交成功!")
450
+              }
451
+            })
452
+          })
453
+          .catch(() => {
454
+            this.$message({
455
+              type: "info",
456
+              message: "已取消提交",
457
+            })
458
+          })
459
+        this.isDisable = false
460
+      }, 300)
461
+    },
462
+    hadndleOrderCode(ordercode) {
463
+      this.$layer.iframe({
464
+        content: {
465
+          content: detail, // 传递的组件对象
466
+          parent: this, // 当前的vue对象
467
+          data: { rowid: ordercode }, // props
468
+        },
469
+        area: ["80%", "90%"],
470
+        title: "订单详情",
471
+      })
472
+    },
473
+    // 选择多个
474
+    handleSelectionChange(val) {
475
+      const ids = []
476
+      this.multipleSelection = val
477
+      for (let i = 0; i < this.multipleSelection.length; i++) {
478
+        ids.push(this.multipleSelection[i].F_Id)
479
+      }
480
+      this.selectOrderId = ids
481
+    },
482
+    // 撤回权限
483
+    authority_cancel(state) {
484
+      if (state == 1) {
485
+        return true
486
+      } else {
487
+        return false
488
+      }
489
+    },
490
+    authority_submit() {
491
+      if (this.activeName == 0 || this.activeName == 2 || this.activeName == 9) {
492
+        return true
493
+      } else {
494
+        return false
495
+      }
496
+    },
497
+    // 售后权限
498
+    // authority_afterSale(state) {
499
+    //   if (this.activeName == 1) {
500
+    //     return true
501
+    //   } else {
502
+    //     return false
503
+    //   }
504
+    // },
505
+    // 编辑权限
506
+    authority_edit(state, type) {
507
+      if (this.activeName == 0 || this.activeName == 2 || this.activeName == 9) {
508
+        return true
509
+      } else {
510
+        return false
511
+      }
512
+    },
513
+    // 外呼权限
514
+    authority_call_out(status) {
515
+      if (status == 0 || status == 1) {
516
+        return true
517
+      } else {
518
+        return false
519
+      }
520
+    },
521
+    // 外呼
522
+    clickCallOut(phoneNumber) {
523
+      this.callOut(phoneNumber)
524
+    },
525
+    // 外呼
526
+    callOut(phoneNumber) {
527
+      if (phoneNumber) {
528
+        getCallOutprefix(phoneNumber).then((response) => {
529
+          if (response.state.toLowerCase() === "success") {
530
+            const res = response.data
531
+            this.scoketDatas = {
532
+              Type: "MakeCall",
533
+              AgentID: this.usercode,
534
+              AgentExten: this.extension,
535
+              Header: res.fix, // 号码前缀 用于截断前缀得到真实号码
536
+              DestinationNumber: res.phone, //
537
+            }
538
+            store.dispatch("ChangeCallNum", phoneNumber)
539
+            Send(this.scoketDatas)
540
+            store.dispatch("UpdateCalloutScreen", false) // 关闭外呼面板
541
+            store.dispatch("UpdateOutboundScreen", false) // 关闭外呼弹屏
542
+          }
543
+        })
544
+      } else {
545
+        this.$message({
546
+          message: "请先输入电话号码!",
547
+          type: "warning",
548
+        })
549
+      }
550
+    },
551
+  },
552
+}
553
+</script>
554
+
555
+<style rel="stylesheet/scss" lang="scss" scoped>
556
+.el {
557
+  cursor: pointer;
558
+}
559
+.phoneIcon {
560
+  cursor: pointer;
561
+}
562
+</style>

+ 13 - 2
CallCenterWeb.UI/src/views/afterSaleManagement/saleOrderList/index.vue

@@ -221,10 +221,21 @@ export default {
221 221
       date = date.toString().padStart(2, "0")
222 222
       let defaultDate = `${year}-${month}-${day} ${hour}`
223 223
 
224
+      //获取一个月前的时间
225
+      let oneMonthDate = new Date()
226
+      oneMonthDate.setMonth(oneMonthDate.getMonth() - 1)
227
+      const oneMonthYear = oneMonthDate.getFullYear()
228
+      let oneMonthMonth = oneMonthDate.getMonth() + 1
229
+      let oneMonthDay = oneMonthDate.getDate()
230
+      const oneMonthHour = "00:00:00"
231
+      oneMonthMonth = oneMonthMonth.toString().padStart(2, "0")
232
+      oneMonthDay = oneMonthDay.toString().padStart(2, "0")
233
+      const oneMonthTime = `${oneMonthYear}-${oneMonthMonth}-${oneMonthDay} ${oneMonthHour}`
234
+
224 235
       if (this.activeName == 2) {
225
-        this.searchDatas.lastholetime = ["", defaultDate]
236
+        this.searchDatas.lastholetime = ["", oneMonthTime]
226 237
       } else if (this.activeName == 1) {
227
-        this.searchDatas.lastholetime = [defaultDate, ""]
238
+        this.searchDatas.lastholetime = [oneMonthTime, ""]
228 239
       } else {
229 240
         this.searchDatas.lastholetime = []
230 241
       }

+ 65 - 65
CallCenterWeb.UI/src/views/commodityManagement/commodityList/components/importFile.vue

@@ -1,30 +1,29 @@
1 1
 <template>
2 2
   <div class="importFile">
3
-    <el-alert title="选取的EXCEL文件需要严格按照下载的EXCEL模板进行填写!选择好文件后点击导入即可!" type="warning" class="md" show-icon/>
3
+    <el-alert title="选取的EXCEL文件需要严格按照下载的EXCEL模板进行填写!选择好文件后点击导入即可!" type="warning" class="md" show-icon />
4 4
     <el-row>
5 5
       <el-col :lg="7" class="md">
6
-        <a :href="downloadUrl" download="商品导入模板.xlsx" class="download_btn" title="点击下载EXCEL模板" rel="nofollow">
7
-          下载EXCEL模板
8
-        </a>
6
+        <a :href="downloadUrl" download="商品导入模板.xlsx" class="download_btn" title="点击下载EXCEL模板" rel="nofollow"> 下载EXCEL模板 </a>
9 7
       </el-col>
10 8
       <el-col :lg="17" class="md">
11 9
         <el-upload
12 10
           ref="upload"
13 11
           :limit="1"
14 12
           :file-list="uploadData.fileList"
15
-          :action= "uploadData.uploadUrl"
16
-          :data = "uploadData.uploaderFiles"
13
+          :action="uploadData.uploadUrl"
14
+          :data="uploadData.uploaderFiles"
17 15
           :on-success="uploadSuccess"
18 16
           :on-error="uploadError"
19 17
           :on-exceed="uploadExceed"
20 18
           :auto-upload="false"
21
-          :headers = "uploadData.uploadHeader"
19
+          :headers="uploadData.uploadHeader"
22 20
           class="uploadFiles"
23 21
           list-type="text"
24 22
           name="upFile"
25
-          accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel">
23
+          accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel"
24
+        >
26 25
           <el-button slot="trigger" size="small" type="primary">选取EXCEL文件</el-button>
27
-          <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">导入</el-button>
26
+          <el-button style="margin-left: 10px" size="small" type="success" @click="submitUpload">导入</el-button>
28 27
           <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> -->
29 28
         </el-upload>
30 29
       </el-col>
@@ -33,96 +32,97 @@
33 32
 </template>
34 33
 
35 34
 <script>
36
-import { getToken } from '@/utils/auth'
35
+import { getToken } from "@/utils/auth"
37 36
 
38 37
 export default {
39
-  name: 'ImportFile',
38
+  name: "ImportFile",
40 39
   props: {
41 40
     rowid: {
42 41
       type: String,
43
-      default: ''
42
+      default: "",
44 43
     },
45 44
     layerid: {
46 45
       type: String,
47
-      default: ''
48
-    }
46
+      default: "",
47
+    },
49 48
   },
50 49
   data() {
51 50
     return {
52
-      downloadUrl: '/static/xls/importProducts.xlsx',
53
-      uploadData: {// 文件上传数据
51
+      downloadUrl: "/static/xls/importProducts.xlsx",
52
+      uploadData: {
53
+        // 文件上传数据
54 54
         uploadHeader: {
55
-          Authorization: getToken()
55
+          Authorization: getToken(),
56 56
         },
57
-        uploadUrl: this.$store.getters.serverConfig.BASE_API + 'api/Product/importProduct',
58
-        uploaderFiles: {// 上传文件的参数
57
+        uploadUrl: this.$store.getters.serverConfig.BASE_API + "api/Product/importProduct",
58
+        uploaderFiles: {
59
+          // 上传文件的参数
59 60
         },
60
-        fileList: [] // 展示文件的数据
61
-      }
61
+        fileList: [], // 展示文件的数据
62
+      },
62 63
     }
63 64
   },
64
-  created() {
65
-  },
65
+  created() {},
66 66
   methods: {
67 67
     submitUpload() {
68 68
       this.$refs.upload.submit()
69 69
     },
70 70
     // 文件上传
71 71
     uploadSuccess(response, file, fileList) {
72
-      if (response.state.toLowerCase() === 'success') {
72
+      if (response.state.toLowerCase() === "success") {
73 73
         this.$parent.$parent.$layer.close(this.layerid)
74 74
         this.$parent.$parent.getList() // 重新加载父级数据
75
-        this.$message.success('恭喜你,导入成功!')
75
+        this.$message.success("恭喜你,导入成功!")
76 76
       } else {
77 77
         this.$message.error(response.message)
78 78
       }
79 79
     },
80 80
     uploadExceed(file, fileList) {
81
-      this.$message.warning('只能选择一个文件!')
81
+      this.$message.warning("只能选择一个文件!")
82 82
     },
83 83
     uploadError(err, file, fileList) {
84 84
       this.$message.error(err)
85
-    }
86
-  }
85
+    },
86
+  },
87 87
 }
88 88
 </script>
89 89
 
90 90
 <style rel="stylesheet/scss" lang="scss" scoped>
91
-	.importFile{
92
-		.md{
93
-			margin-bottom: 20px;
94
-		}
95
-		.download_btn{
96
-			display: inline-block;
97
-			line-height: 1;
98
-			white-space: nowrap;
99
-			cursor: pointer;
100
-			border: 1px solid #dcdfe6;
101
-			-webkit-appearance: none;
102
-			text-align: center;
103
-			-webkit-box-sizing: border-box;
104
-			box-sizing: border-box;
105
-			outline: 0;
106
-			margin: 0;
107
-			-webkit-transition: .1s;
108
-			transition: .1s;
109
-			font-weight: 500;
110
-			padding: 9px 15px;
111
-			font-size: 12px;
112
-			border-radius: 4px;
113
-			color: #fff;
114
-			background-color: #409EFF;
115
-			border-color: #409EFF;
116
-			&:hover{
117
-				background: #66b1ff;
118
-				border-color: #66b1ff;
119
-				color: #fff;
120
-			}
121
-			&:active{
122
-				background: #66b1ff;
123
-				border-color: #66b1ff;
124
-				color: #fff;
125
-			}
126
-		}
127
-	}
91
+.importFile {
92
+  .md {
93
+    margin-bottom: 20px;
94
+  }
95
+  .download_btn {
96
+    display: inline-block;
97
+    line-height: 1;
98
+    white-space: nowrap;
99
+    cursor: pointer;
100
+    border: 1px solid #dcdfe6;
101
+    -webkit-appearance: none;
102
+    text-align: center;
103
+    -webkit-box-sizing: border-box;
104
+    box-sizing: border-box;
105
+    outline: 0;
106
+    margin: 0;
107
+    -webkit-transition: 0.1s;
108
+    transition: 0.1s;
109
+    font-weight: 500;
110
+    padding: 9px 15px;
111
+    font-size: 12px;
112
+    border-radius: 4px;
113
+    color: #fff;
114
+    background-color: #409eff;
115
+    border-color: #409eff;
116
+    &:hover {
117
+      background: #66b1ff;
118
+      border-color: #66b1ff;
119
+      color: #fff;
120
+    }
121
+    &:active {
122
+      background: #66b1ff;
123
+      border-color: #66b1ff;
124
+      color: #fff;
125
+    }
126
+  }
127
+}
128 128
 </style>

+ 1 - 1
CallCenterWeb.UI/src/views/commodityManagement/commodityStock/components/transfer.vue

@@ -39,7 +39,7 @@ export default {
39 39
       rules: {
40 40
         type: [
41 41
           {
42
-            required: true,
42
+            required: true, 
43 43
             trigger: "change",
44 44
             message: "请选择调拨",
45 45
           },

+ 1 - 1
CallCenterWeb.UI/src/views/customerServiceManagement/customerServiceChangeCollection/index.vue

@@ -65,7 +65,7 @@
65 65
             v-permission="'HY_agree'"
66 66
             v-if="authority_agree()"
67 67
             type="text"
68
-            @click="btn_agree(scope.row.F_OrderId)"
68
+            @click="btn_agree(scope.row.F_Id)"
69 69
           >同意</el-button>
70 70
           <el-button
71 71
             v-permission="'HY_signfor'"

+ 126 - 26
CallCenterWeb.UI/src/views/memberManagement/memberList/components/addOrEdit.vue

@@ -5,17 +5,17 @@
5 5
         <el-input v-model="ruleForm.F_VIPCode" placeholder="请输入会员卡编号"></el-input>
6 6
       </el-form-item> -->
7 7
       <el-form-item label="客户姓名" prop="F_Name">
8
-        <el-input v-model="ruleForm.F_Name" placeholder="请输入客户姓名" />
8
+        <el-input v-model="ruleForm.F_Name" placeholder="请输入客户姓名" :disabled="settingDisabled.disabledName"/>
9 9
       </el-form-item>
10
-      <el-form-item label="客户性别" prop="F_Sex">
11
-        <el-radio v-model="ruleForm.F_Sex" label="男">男</el-radio>
12
-        <el-radio v-model="ruleForm.F_Sex" label="女">女</el-radio>
10
+      <el-form-item label="客户性别" prop="F_Sex" >
11
+        <el-radio v-model="ruleForm.F_Sex" label="男" :disabled="settingDisabled.disabledSex">男</el-radio>
12
+        <el-radio v-model="ruleForm.F_Sex" label="女" :disabled="settingDisabled.disabledSex">女</el-radio>
13 13
       </el-form-item>
14 14
       <el-form-item label="客户年龄" prop="F_Age">
15
-        <el-input v-model="ruleForm.F_Age" placeholder="请输入客户年龄" onkeyup="value=value.replace(/[^\d.]/g,'')" />
15
+        <el-input v-model="ruleForm.F_Age" placeholder="请输入客户年龄" onkeyup="value=value.replace(/[^\d.]/g,'')" :disabled="settingDisabled.disabledAge" />
16 16
       </el-form-item>
17
-      <el-form-item label="主号码" prop="F_Phone">
18
-        <el-input v-model="ruleForm.F_Phone" placeholder="请输入主号码" />
17
+      <el-form-item label="主号码" prop="F_Phone" >
18
+        <el-input v-model="ruleForm.F_Phone" placeholder="请输入主号码" :disabled="settingDisabled.disabledPhone" />
19 19
       </el-form-item>
20 20
       <el-row>
21 21
         <el-col :span="16">
@@ -59,45 +59,45 @@
59 59
         </el-select>
60 60
       </el-form-item>
61 61
       <el-form-item label="默认地区" prop="provinceCity">
62
-        <el-cascader ref="myCascader" v-model="provinceCity" :options="provinceCityDatas" :props="props" :placeholder="placeholderArea" :class="{ placeholderAreaClass: isPlaceholderAreaClass }" class="form_select" clearable change-on-select @change="handleItemChange" />
62
+        <el-cascader ref="myCascader" v-model="provinceCity" :options="provinceCityDatas" :props="props" :placeholder="placeholderArea" :class="{ placeholderAreaClass: isPlaceholderAreaClass }" class="form_select" clearable change-on-select @change="handleItemChange" :disabled="settingDisabled.disabledProvinceCity"/>
63 63
       </el-form-item>
64 64
       <el-form-item label="默认详细地址" prop="F_Address">
65
-        <el-input v-model="ruleForm.F_Address" placeholder="请输入默认详细地址" />
65
+        <el-input v-model="ruleForm.F_Address" placeholder="请输入默认详细地址" :disabled="settingDisabled.disabledAddress" />
66 66
       </el-form-item>
67 67
       <el-form-item label="备用地区1" prop="provinceCity1">
68
-        <el-cascader ref="myCascader1" v-model="provinceCity1" :options="provinceCityDatas1" :props="props" :placeholder="placeholderArea1" :class="{ placeholderAreaClass: isPlaceholderAreaClass }" class="form_select" clearable change-on-select @change="handleItemChange1" />
68
+        <el-cascader ref="myCascader1" v-model="provinceCity1" :options="provinceCityDatas1" :props="props" :placeholder="placeholderArea1" :class="{ placeholderAreaClass: isPlaceholderAreaClass }" class="form_select" clearable change-on-select @change="handleItemChange1"  :disabled="settingDisabled.disabledProvinceCity1"/>
69 69
       </el-form-item>
70 70
       <el-form-item label="备用详细地址1" prop="F_Address1">
71
-        <el-input v-model="ruleForm.F_Address1" placeholder="请输入备用详细地址" />
71
+        <el-input v-model="ruleForm.F_Address1" placeholder="请输入备用详细地址" :disabled="settingDisabled.disabledAddress1" />
72 72
       </el-form-item>
73 73
       <el-form-item label="备用地区2" prop="provinceCity2">
74
-        <el-cascader ref="myCascader2" v-model="provinceCity2" :options="provinceCityDatas2" :props="props" :placeholder="placeholderArea2" :class="{ placeholderAreaClass: isPlaceholderAreaClass }" class="form_select" clearable change-on-select @change="handleItemChange2" />
74
+        <el-cascader ref="myCascader2" v-model="provinceCity2" :options="provinceCityDatas2" :props="props" :placeholder="placeholderArea2" :class="{ placeholderAreaClass: isPlaceholderAreaClass }" class="form_select" clearable change-on-select @change="handleItemChange2" :disabled="settingDisabled.disabledProvinceCity2" />
75 75
       </el-form-item>
76 76
       <el-form-item label="备用详细地址2" prop="F_Address2">
77
-        <el-input v-model="ruleForm.F_Address2" placeholder="请输入备用详细地址" />
77
+        <el-input v-model="ruleForm.F_Address2" placeholder="请输入备用详细地址" :disabled="settingDisabled.disabledAddress2" />
78 78
       </el-form-item>
79 79
       <!-- <el-form-item label="邮编" prop="F_Postcode">
80 80
         <el-input v-model="ruleForm.F_Postcode" placeholder="请输入邮编"/>
81 81
       </el-form-item> -->
82 82
       <el-form-item label="鞋码" prop="F_ShoeSize">
83
-        <el-input v-model="ruleForm.F_ShoeSize" placeholder="请输入鞋码" onkeyup="value=value.replace(/[^\d.]/g,'')" />
83
+        <el-input v-model="ruleForm.F_ShoeSize" placeholder="请输入鞋码" onkeyup="value=value.replace(/[^\d.]/g,'')" :disabled="settingDisabled.disabledShoeSize"/>
84 84
       </el-form-item>
85 85
       <el-form-item label="会员生日" prop="F_Birthday">
86
-        <el-date-picker v-model="ruleForm.F_Birthday" :picker-options="pickerOptions2" value-format="yyyy-MM-dd" type="date" placeholder="请选择会员生日" class="form_date" />
86
+        <el-date-picker v-model="ruleForm.F_Birthday" :picker-options="pickerOptions2" value-format="yyyy-MM-dd" type="date" placeholder="请选择会员生日" class="form_date" :disabled="settingDisabled.disabledBirthday" />
87 87
       </el-form-item>
88 88
       <!-- <el-form-item label="会员积分" prop="F_Score" >
89 89
         <el-input v-model="ruleForm.F_Score" placeholder="请输入会员积分" onkeyup="value=value.replace(/[^\d.]/g,'')" />
90 90
       </el-form-item> -->
91 91
       <el-form-item label="推荐人" prop="F_RecommendName">
92
-        <el-select v-model="ruleForm.F_RecommendName" :placeholder="recommendNameRemind1" :remote-method="remoteMethodRecommend" :loading="loading" class="form_select" filterable remote reserve-keyword value-key="F_ID" @change="recommendChangeSelect">
92
+        <el-select v-model="ruleForm.F_RecommendName" :placeholder="recommendNameRemind1" :remote-method="remoteMethodRecommend" :loading="loading" class="form_select" filterable remote reserve-keyword value-key="F_ID" @change="recommendChangeSelect" :disabled="settingDisabled.disabledRecommendName">
93 93
           <el-option v-for="item in recommendListOptions" :key="item.F_ID" :label="item.F_Name" :value="item" />
94 94
         </el-select>
95 95
       </el-form-item>
96 96
       <el-form-item label="累计消费金额" prop="F_Money">
97
-        <el-input v-model="ruleForm.F_Money" placeholder="请输入累计消费金额" onkeyup="value=value.replace(/[^\d.]/g,'')" />
97
+        <el-input v-model="ruleForm.F_Money" placeholder="请输入累计消费金额" onkeyup="value=value.replace(/[^\d.]/g,'')" :disabled="settingDisabled.disabledMoney" />
98 98
       </el-form-item>
99 99
       <el-form-item label="累计积分" prop="F_TotalScore">
100
-        <el-input v-model="ruleForm.F_TotalScore" placeholder="请输入累计积分" onkeyup="value=value.replace(/[^\d.]/g,'')" />
100
+        <el-input v-model="ruleForm.F_TotalScore" placeholder="请输入累计积分" onkeyup="value=value.replace(/[^\d.]/g,'')" :disabled="settingDisabled.disabledTotalScore" />
101 101
       </el-form-item>
102 102
       <el-form-item>
103 103
         <el-button type="primary" @click="submitForm">保存</el-button>
@@ -113,6 +113,7 @@ import { getMemberInfo, addOrder, editOrder, getLabelLists, getbyphone } from "@
113 113
 import { validateTel } from "@/utils/validate"
114 114
 import { filterContent, pickerOptions } from "@/utils"
115 115
 import { getOrderLists } from "@/api/memberManagement/memberList"
116
+import { mapGetters } from "vuex"
116 117
 
117 118
 export default {
118 119
   name: "AddOrEdit",
@@ -127,10 +128,6 @@ export default {
127 128
       type: String,
128 129
       default: "",
129 130
     },
130
-    callid: {
131
-      type: Number,
132
-      default: 0,
133
-    },
134 131
     layerid: {
135 132
       type: String,
136 133
       default: "",
@@ -179,7 +176,6 @@ export default {
179 176
       pickerOptions, // 日期数据
180 177
       recommendNameRemind1: "请输入推荐人",
181 178
       ruleForm: {
182
-        unique_id: "", //		否	string	callid
183 179
         id: "", // 编辑会员信息id
184 180
         // F_VIPCode: "", //会员卡编号
185 181
         F_Name: "", // 客户姓名
@@ -225,9 +221,38 @@ export default {
225 221
         ],
226 222
       },
227 223
       loading: false,
224
+      settingDisabled: {
225
+        disabledName: false,
226
+        disabledSex: false,
227
+        disabledAge: false,
228
+        disabledPhone: false,
229
+        disabledProvinceCity: false,
230
+        disabledAddress: false,
231
+        disabledProvinceCity1: false,
232
+        disabledAddress1: false,
233
+        disabledProvinceCity2: false,
234
+        disabledAddress2: false,
235
+        disabledShoeSize: false,
236
+        disabledBirthday: false,
237
+        disabledRecommendName: false,
238
+        disabledMoney: false,
239
+        disabledTotalScore: false,
240
+      }
228 241
     }
229 242
   },
230 243
   computed: {
244
+    ...mapGetters([
245
+      "avatar", // 头像
246
+      "username", // 用户名
247
+      "usercode", // 工号
248
+      "seatflag", // 坐席标识
249
+      "extension", // 分机号
250
+      "telCallTime", // 来电通话时间
251
+      "telLineState", // 线路状态
252
+      "telCallNum", // 顶部显示号码
253
+      "rolecode", // 角色的code
254
+      "telTrunkNumber", // 中继号
255
+    ]),
231 256
     F_Phone: {
232 257
       get: function () {
233 258
         return this.ruleForm.F_Phone // 获取的时候直接获取值
@@ -240,9 +265,6 @@ export default {
240 265
   created() {
241 266
     this.getProCity()
242 267
     this.getRecommendList()
243
-    if (this.callid) {
244
-      this.ruleForm.unique_id = this.callid
245
-    }
246 268
     Promise.all([]).then(() => {
247 269
       this.getType()
248 270
       this.getClass()
@@ -440,6 +462,7 @@ export default {
440 462
           this.placeholderArea2 = "请选择备用地区2"
441 463
           this.isPlaceholderAreaClass = false
442 464
         }
465
+        this.rolePermissions(res)
443 466
       })
444 467
     },
445 468
     // 获取会员类型
@@ -666,6 +689,83 @@ export default {
666 689
       }
667 690
       return data
668 691
     },
692
+    rolePermissions(data) {
693
+      const storageGroupCode = window.localStorage.getItem("roleCode")
694
+      console.log(storageGroupCode)
695
+      if (storageGroupCode === "XS") {
696
+        if (data) {
697
+          if (data.F_Name) {
698
+            this.settingDisabled.disabledName = true
699
+          }
700
+          if (data.F_Sex) {
701
+            this.settingDisabled.disabledSex = true
702
+          }
703
+          if (data.F_Age) {
704
+            this.settingDisabled.disabledAge = true
705
+          }
706
+          if (data.F_Phone) {
707
+            this.settingDisabled.disabledPhone = true
708
+          }
709
+          if (data.F_Province) {
710
+            this.settingDisabled.disabledProvinceCity = true
711
+            // if (data.F_City) {
712
+            // }
713
+            // if (data.F_City && data.F_Area) {
714
+            // }
715
+            // if (data.F_Area && data.F_Town) {
716
+            // }
717
+            // if (data.F_Town) {
718
+            // }
719
+          }
720
+          if (data.F_Address) {
721
+            this.settingDisabled.disabledAddress = true
722
+          }
723
+          if (data.F_Province1) {
724
+            this.settingDisabled.disabledProvinceCity1 = true
725
+            // if (data.F_City1) {
726
+            // }
727
+            // if (data.F_City1 && data.F_Area1) {
728
+            // }
729
+            // if (data.F_Area1 && data.F_Town1) {
730
+            // }
731
+            // if (data.F_Town1) {
732
+            // }
733
+          }
734
+          if (data.F_Address1) {
735
+            this.settingDisabled.disabledAddress1 = true
736
+          }
737
+          if (data.F_Province2) {
738
+            this.settingDisabled.disabledProvinceCity2 = true
739
+            // if (data.F_City2) {
740
+            // }
741
+            // if (data.F_City2 && data.F_Area2) {
742
+            // }
743
+            // if (data.F_Area2 && data.F_Town2) {
744
+            // }
745
+            // if (data.F_Town2) {
746
+            // }
747
+          }
748
+          if (data.F_Address2) {
749
+            this.settingDisabled.disabledAddress2 = true
750
+          }
751
+          if (data.F_ShoeSize) {
752
+            this.settingDisabled.disabledShoeSize = true
753
+          }
754
+          if (data.F_Birthday) {
755
+            this.settingDisabled.disabledBirthday = true
756
+          }
757
+          if (data.F_Recommender) {
758
+            this.settingDisabled.disabledRecommendName = true
759
+          }
760
+          if (data.F_Money) {
761
+            this.settingDisabled.disabledMoney = true
762
+          }
763
+          if (data.F_TotalScore) {
764
+            this.settingDisabled.disabledTotalScore = true
765
+          }
766
+        }
767
+      }
768
+    },
669 769
   },
670 770
 }
671 771
 </script>

+ 16 - 5
CallCenterWeb.UI/src/views/memberManagement/memberList/index.vue

@@ -225,19 +225,30 @@ export default {
225 225
     handleTabClick() {
226 226
       this.pageParams.pageindex = 1
227 227
       let date = new Date()
228
-      date.setTime(date.getTime() - 24 * 60 * 60 * 1000)
228
+      date.setTime(date.getTime())
229 229
       const year = date.getFullYear()
230 230
       let month = date.getMonth() + 1
231
-      const day = date.getDate()
231
+      let day = date.getDate()
232 232
       const hour = "00:00:00"
233 233
       month = month.toString().padStart(2, "0")
234
-      date = date.toString().padStart(2, "0")
234
+      day = day.toString().padStart(2, "0")
235 235
       const defaultDate = `${year}-${month}-${day} ${hour}`
236 236
 
237
+      //获取一个月前的时间
238
+      let oneMonthDate = new Date()
239
+      oneMonthDate.setMonth(oneMonthDate.getMonth() - 1)
240
+      const oneMonthYear = oneMonthDate.getFullYear()
241
+      let oneMonthMonth = oneMonthDate.getMonth() + 1
242
+      let oneMonthDay = oneMonthDate.getDate()
243
+      const oneMonthHour = "00:00:00"
244
+      oneMonthMonth = oneMonthMonth.toString().padStart(2, "0")
245
+      oneMonthDay = oneMonthDay.toString().padStart(2, "0")
246
+      const oneMonthTime = `${oneMonthYear}-${oneMonthMonth}-${oneMonthDay} ${oneMonthHour}`
247
+
237 248
       if (this.activeName == 2) {
238
-        this.searchDatas.lastholetime = ["", defaultDate]
249
+        this.searchDatas.lastholetime = ["", oneMonthTime]
239 250
       } else if (this.activeName == 1) {
240
-        this.searchDatas.lastholetime = [defaultDate, ""]
251
+        this.searchDatas.lastholetime = [oneMonthTime, ""]
241 252
       } else {
242 253
         this.searchDatas.lastholetime = []
243 254
       }

+ 62 - 63
CallCenterWeb.UI/src/views/telCall/blackList/addOrEditBlackList.vue

@@ -2,22 +2,13 @@
2 2
   <div v-loading="loading">
3 3
     <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="100px">
4 4
       <el-form-item label="电话号码" prop="phone">
5
-        <el-input v-model="ruleForm.phone" placeholder="请输入电话号码"/>
5
+        <el-input v-model="ruleForm.phone" placeholder="请输入电话号码" />
6 6
       </el-form-item>
7 7
       <el-form-item label="设置时间段" prop="rangTimes">
8
-        <el-date-picker
9
-          v-model="ruleForm.rangTimes"
10
-          class="date_picker"
11
-          type="datetimerange"
12
-          range-separator="至"
13
-          start-placeholder="开始时间"
14
-          end-placeholder="结束时间"
15
-          value-format="yyyy-MM-dd HH:mm:ss"
16
-          align="left"
17
-          unlink-panels/>
8
+        <el-date-picker v-model="ruleForm.rangTimes" class="date_picker" type="datetimerange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" value-format="yyyy-MM-dd HH:mm:ss" align="left" unlink-panels />
18 9
       </el-form-item>
19 10
       <el-form-item label="屏蔽说明" prop="des">
20
-        <el-input v-model="ruleForm.des" type="textarea" autosize placeholder="请输入屏蔽说明"/>
11
+        <el-input v-model="ruleForm.des" type="textarea" autosize placeholder="请输入屏蔽说明" />
21 12
       </el-form-item>
22 13
       <el-form-item>
23 14
         <el-button type="primary" @click="submitForm">保存</el-button>
@@ -28,51 +19,55 @@
28 19
 </template>
29 20
 
30 21
 <script>
31
-import { getBlack, addBlack, editBlack } from '@/api/telCall/blackList'
32
-import { validateTel } from '@/utils/validate'
33
-import { filterContent } from '@/utils'
22
+import { getBlack, addBlack, editBlack } from "@/api/telCall/blackList"
23
+import { validateTel } from "@/utils/validate"
24
+import { filterContent } from "@/utils"
34 25
 
35 26
 const validateTelRule = (rule, value, callback) => {
36 27
   if (!validateTel(value)) {
37
-    callback(new Error('请输入有效的电话号码!'))
28
+    callback(new Error("请输入有效的电话号码!"))
38 29
   } else {
39 30
     callback()
40 31
   }
41 32
 }
42 33
 
43 34
 export default {
44
-  name: 'AddOrEditBlackList',
35
+  name: "AddOrEditBlackList",
45 36
   props: {
46 37
     rowid: {
47 38
       type: Number,
48
-      default: 0
39
+      default: 0,
49 40
     },
50 41
     layerid: {
51 42
       type: String,
52
-      default: ''
53
-    }
43
+      default: "",
44
+    },
54 45
   },
55 46
   data() {
56 47
     return {
57 48
       ruleForm: {
58
-        id: '',
59
-        phone: '',
49
+        id: "",
50
+        phone: "",
60 51
         rangTimes: [],
61
-        des: ''
52
+        des: "",
62 53
       },
63 54
       rules: {
64
-        phone: [{
65
-          required: true,
66
-          trigger: 'blur',
67
-          validator: validateTelRule
68
-        }],
69
-        rangTimes: [{
70
-          required: true,
71
-          message: '请设置时间段!',
72
-          trigger: 'blur'
73
-        }]
55
+        phone: [
56
+          {
57
+            required: true,
58
+            trigger: "blur",
59
+            validator: validateTelRule,
60
+          },
61
+        ],
62
+        rangTimes: [
63
+          {
64
+            required: true,
65
+            message: "请设置时间段!",
66
+            trigger: "blur",
67
+          },
68
+        ],
74 69
       },
75
-      loading: false
70
+      loading: false,
76 71
     }
77 72
   },
78 73
   created() {
@@ -91,36 +86,40 @@ export default {
91 86
             telphone: this.ruleForm.phone,
92 87
             settime: this.ruleForm.rangTimes && this.ruleForm.rangTimes[0],
93 88
             removetime: this.ruleForm.rangTimes && this.ruleForm.rangTimes[1],
94
-            describe: filterContent.delHtmlTag(this.ruleForm.des)
89
+            describe: filterContent.delHtmlTag(this.ruleForm.des),
95 90
           }
96 91
 
97 92
           // 添加
98 93
           if (!this.rowid) {
99
-            addBlack(datas).then(response => {
94
+            addBlack(datas)
95
+              .then((response) => {
96
+                this.loading = false
97
+                if (response.state.toLowerCase() === "success") {
98
+                  this.$parent.$layer.close(this.layerid)
99
+                  this.$parent.getList() // 重新加载父级数据
100
+                  this.$message.success("恭喜你,黑名单信息添加成功!")
101
+                }
102
+              })
103
+              .catch(() => {
104
+                this.loading = false
105
+              })
106
+            return
107
+          }
108
+          // 编辑
109
+          editBlack(datas)
110
+            .then((response) => {
100 111
               this.loading = false
101
-              if (response.state.toLowerCase() === 'success') {
112
+              if (response.state.toLowerCase() === "success") {
102 113
                 this.$parent.$layer.close(this.layerid)
103 114
                 this.$parent.getList() // 重新加载父级数据
104
-                this.$message.success('恭喜你,黑名单信息添加成功!')
115
+                this.$message.success("恭喜你,黑名单信息编辑成功!")
105 116
               }
106
-            }).catch(() => {
117
+            })
118
+            .catch(() => {
107 119
               this.loading = false
108 120
             })
109
-            return
110
-          }
111
-          // 编辑
112
-          editBlack(datas).then(response => {
113
-            this.loading = false
114
-            if (response.state.toLowerCase() === 'success') {
115
-              this.$parent.$layer.close(this.layerid)
116
-              this.$parent.getList() // 重新加载父级数据
117
-              this.$message.success('恭喜你,黑名单信息编辑成功!')
118
-            }
119
-          }).catch(() => {
120
-            this.loading = false
121
-          })
122 121
         } else {
123
-          this.$message.error('请输入有效的必填项信息!')
122
+          this.$message.error("请输入有效的必填项信息!")
124 123
           return false
125 124
         }
126 125
       })
@@ -130,24 +129,24 @@ export default {
130 129
     },
131 130
     // 获取详情
132 131
     getDetail(rid) {
133
-      getBlack(rid).then(response => {
134
-        if (response.state.toLowerCase() === 'success') {
132
+      getBlack(rid).then((response) => {
133
+        if (response.state.toLowerCase() === "success") {
135 134
           const res = response.data
136 135
           this.ruleForm.phone = res.F_TelPhone
137 136
           this.ruleForm.rangTimes = [res.F_SetTime, res.F_RemoveTime]
138 137
           this.ruleForm.des = res.F_Describe
139 138
         }
140 139
       })
141
-    }
142
-  }
140
+    },
141
+  },
143 142
 }
144 143
 </script>
145 144
 
146 145
 <style rel="stylesheet/scss" lang="scss" scoped>
147
-	.date_picker{
148
-		width: 100%;
149
-	}
150
-	div.date_picker input.el-range-input{
151
-		width: 46%;
152
-	}
146
+.date_picker {
147
+  width: 100%;
148
+}
149
+div.date_picker input.el-range-input {
150
+  width: 46%;
151
+}
153 152
 </style>

+ 53 - 59
CallCenterWeb.UI/src/views/telCall/blackList/index.vue

@@ -13,20 +13,20 @@
13 13
         range-separator="至"
14 14
         start-placeholder="开始日期"
15 15
         end-placeholder="结束日期"/> -->
16
-      <el-input v-model="keyword" placeholder="请输入关键字" class="filter-item"/>
16
+      <el-input v-model="keyword" placeholder="请输入关键字" class="filter-item" />
17 17
       <el-button type="primary" class="filter-item" icon="el-icon-search" @click="btn_search">搜索</el-button>
18 18
       <el-button v-permission="'HY_add'" type="primary" class="filter-item" icon="el-icon-plus" @click="btn_add">添加</el-button>
19 19
     </div>
20 20
 
21 21
     <el-table v-loading="loading" :data="dataLists" border stripe>
22
-      <el-table-column type="index" label="编号" align="center" fixed width="80"/>
23
-      <el-table-column prop="F_TelPhone" label="来电号码" align="center" min-width=""/>
24
-      <el-table-column prop="F_SetTime" label="设置时间" align="center" min-width=""/>
25
-      <el-table-column prop="F_RemoveTime" label="解除时间" align="center" min-width=""/>
26
-      <el-table-column prop="F_InterceptNum" label="拦截次数" align="center" min-width=""/>
27
-      <el-table-column prop="F_CreateBy" label="创建人" align="center" min-width=""/>
28
-      <el-table-column prop="F_CreateOn" label="创建时间" align="center" min-width=""/>
29
-      <el-table-column prop="F_Describe" label="备注" align="center" min-width=""/>
22
+      <el-table-column type="index" label="编号" align="center" fixed width="80" />
23
+      <el-table-column prop="F_TelPhone" label="来电号码" align="center" min-width="" />
24
+      <el-table-column prop="F_SetTime" label="设置时间" align="center" min-width="" />
25
+      <el-table-column prop="F_RemoveTime" label="解除时间" align="center" min-width="" />
26
+      <el-table-column prop="F_InterceptNum" label="拦截次数" align="center" min-width="" />
27
+      <el-table-column prop="F_CreateBy" label="创建人" align="center" min-width="" />
28
+      <el-table-column prop="F_CreateOn" label="创建时间" align="center" min-width="" />
29
+      <el-table-column prop="F_Describe" label="备注" align="center" min-width="" />
30 30
       <el-table-column label="操作" width="160" align="center" class-name="oparate_btn" fixed="right">
31 31
         <template slot-scope="scope">
32 32
           <el-button v-permission="'HY_edit'" size="mini" plain type="primary" @click="btn_edit(scope.row.F_Id)">编辑</el-button>
@@ -34,58 +34,51 @@
34 34
         </template>
35 35
       </el-table-column>
36 36
     </el-table>
37
-    <pagination
38
-      v-show="pageParams.total > 0"
39
-      :total="pageParams.total"
40
-      :pageindex.sync="pageParams.pageindex"
41
-      :pagesize.sync="pageParams.pagesize"
42
-      class="pagination"
43
-      @pagination="getList" />
37
+    <pagination v-show="pageParams.total > 0" :total="pageParams.total" :pageindex.sync="pageParams.pageindex" :pagesize.sync="pageParams.pagesize" class="pagination" @pagination="getList" />
44 38
   </div>
45 39
 </template>
46 40
 
47 41
 <script>
48
-
49
-import { getBlackLists, deleteBlack } from '@/api/telCall/blackList'
50
-import addOrEditBlackList from './addOrEditBlackList'
51
-import { pickerOptions } from '@/utils'
52
-import Pagination from '@/components/Pagination' // 对el-pagination 二次封装
42
+import { getBlackLists, deleteBlack } from "@/api/telCall/blackList"
43
+import addOrEditBlackList from "./addOrEditBlackList"
44
+import { pickerOptions } from "@/utils"
45
+import Pagination from "@/components/Pagination" // 对el-pagination 二次封装
53 46
 
54 47
 export default {
55
-  name: 'BlackList',
48
+  name: "BlackList",
56 49
   components: {
57
-    Pagination
50
+    Pagination,
58 51
   },
59 52
   filters: {
60 53
     blackTextFilter(status) {
61 54
       const statusMap = {
62
-        0: '暂时',
63
-        1: '永久',
64
-        2: '已取消'
55
+        0: "暂时",
56
+        1: "永久",
57
+        2: "已取消",
65 58
       }
66 59
       return statusMap[status]
67 60
     },
68 61
     blackTypeFilter(status) {
69 62
       const statusMap = {
70
-        0: '',
71
-        1: 'danger',
72
-        2: 'warning'
63
+        0: "",
64
+        1: "danger",
65
+        2: "warning",
73 66
       }
74 67
       return statusMap[status]
75
-    }
68
+    },
76 69
   },
77 70
   data() {
78 71
     return {
79 72
       loading: false,
80
-      keyword: '',
81
-      searchDate: '',
73
+      keyword: "",
74
+      searchDate: "",
82 75
       pickerOptions,
83 76
       pageParams: {
84 77
         pageindex: 1, // 当前第几页
85 78
         pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
86
-        total: 0 // 总共多少数据
79
+        total: 0, // 总共多少数据
87 80
       },
88
-      dataLists: [] // 列表数据
81
+      dataLists: [], // 列表数据
89 82
     }
90 83
   },
91 84
   created() {
@@ -99,7 +92,7 @@ export default {
99 92
   methods: {
100 93
     getList() {
101 94
       this.loading = true
102
-      return new Promise(resolve => {
95
+      return new Promise((resolve) => {
103 96
         const params = {
104 97
           pageindex: this.pageParams.pageindex, // 第几页
105 98
           pagesize: this.pageParams.pagesize, // 每页几条信息
@@ -107,9 +100,9 @@ export default {
107 100
           // stime: this.searchDate && this.searchDate[0],
108 101
           // etime: this.searchDate && this.searchDate[1]
109 102
         }
110
-        getBlackLists(params).then(response => {
103
+        getBlackLists(params).then((response) => {
111 104
           this.loading = false
112
-          if (response.state.toLowerCase() === 'success') {
105
+          if (response.state.toLowerCase() === "success") {
113 106
             this.pageParams.total = response.data.Totals
114 107
             this.dataLists = response.data.Rows
115 108
           }
@@ -126,10 +119,10 @@ export default {
126 119
         content: {
127 120
           content: addOrEditBlackList, // 传递的组件对象
128 121
           parent: this, // 当前的vue对象
129
-          data: { 'rowid': '' }// props//该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
122
+          data: { rowid: "" }, // props//该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
130 123
         },
131
-        area: ['40%', '320px'],
132
-        title: '添加黑名单'
124
+        area: ["40%", "320px"],
125
+        title: "添加黑名单",
133 126
       })
134 127
     },
135 128
     btn_edit(editId) {
@@ -137,32 +130,33 @@ export default {
137 130
         content: {
138 131
           content: addOrEditBlackList, // 传递的组件对象
139 132
           parent: this, // 当前的vue对象
140
-          data: { 'rowid': editId }// props
133
+          data: { rowid: editId }, // props
141 134
         },
142
-        area: ['40%', '320px'],
143
-        title: '编辑黑名单'
135
+        area: ["40%", "320px"],
136
+        title: "编辑黑名单",
144 137
       })
145 138
     },
146 139
     btn_delete(editId) {
147
-      this.$confirm('您确定要将此电话从黑名单中删除吗?', '提示', {
148
-        confirmButtonText: '确定',
149
-        cancelButtonText: '取消',
150
-        type: 'warning'
151
-      }).then(() => {
152
-        deleteBlack(editId).then(response => {
153
-          if (response.state.toLowerCase() === 'success') {
154
-            this.getList()
155
-            this.$message.success('删除成功!')
156
-          }
157
-        })
158
-      }).catch(() => {
159
-        this.$message.info('已取消删除')
140
+      this.$confirm("您确定要将此电话从黑名单中删除吗?", "提示", {
141
+        confirmButtonText: "确定",
142
+        cancelButtonText: "取消",
143
+        type: "warning",
160 144
       })
161
-    }
162
-  }
145
+        .then(() => {
146
+          deleteBlack(editId).then((response) => {
147
+            if (response.state.toLowerCase() === "success") {
148
+              this.getList()
149
+              this.$message.success("删除成功!")
150
+            }
151
+          })
152
+        })
153
+        .catch(() => {
154
+          this.$message.info("已取消删除")
155
+        })
156
+    },
157
+  },
163 158
 }
164 159
 </script>
165 160
 
166 161
 <style rel="stylesheet/scss" lang="scss" scoped>
167
-
168 162
 </style>

+ 54 - 71
CallCenterWeb.UI/src/views/telCall/duty/index.vue

@@ -13,32 +13,23 @@
13 13
         range-separator="至"
14 14
         start-placeholder="开始日期"
15 15
         end-placeholder="结束日期"/> -->
16
-      <el-select
17
-        v-model="groupid"
18
-        class="filter-item"
19
-        filterable
20
-        clearable
21
-        placeholder="请选择所属坐席组">
22
-        <el-option
23
-          v-for="item in seatOptions"
24
-          :key="item.F_ZXZID"
25
-          :label="item.F_ZXZName"
26
-          :value="item.F_ZXZID"/>
16
+      <el-select v-model="groupid" class="filter-item" filterable clearable placeholder="请选择所属坐席组">
17
+        <el-option v-for="item in seatOptions" :key="item.F_ZXZID" :label="item.F_ZXZName" :value="item.F_ZXZID" />
27 18
       </el-select>
28
-      <el-input v-model="keyword" placeholder="请输入关键字" class="filter-item"/>
19
+      <el-input v-model="keyword" placeholder="请输入关键字" class="filter-item" />
29 20
       <el-button type="primary" class="filter-item" icon="el-icon-search" @click="btn_search">搜索</el-button>
30 21
       <el-button v-permission="'HY_add'" type="primary" class="filter-item" icon="el-icon-plus" @click="btn_add">添加</el-button>
31 22
     </div>
32 23
 
33 24
     <el-table v-loading="loading" :data="dataLists" border stripe>
34
-      <el-table-column type="index" label="编号" align="center" fixed width="80"/>
35
-      <el-table-column prop="F_DutyNumber" label="值班电话" align="center" min-width=""/>
36
-      <el-table-column prop="F_Group" label="组别" align="center" min-width=""/>
37
-      <el-table-column prop="F_Remark" label="说明" align="center" min-width=""/>
38
-      <el-table-column prop="F_ZBTime" label="值班时间" align="center" min-width=""/>
39
-      <el-table-column prop="F_LastModifyOn" label="最后修改时间" align="center" min-width=""/>
40
-      <el-table-column prop="F_CreateBy" label="创建人" align="center" min-width=""/>
41
-      <el-table-column prop="F_CreateOn" label="创建时间" align="center" min-width=""/>
25
+      <el-table-column type="index" label="编号" align="center" fixed width="80" />
26
+      <el-table-column prop="F_DutyNumber" label="值班电话" align="center" min-width="" />
27
+      <el-table-column prop="F_Group" label="组别" align="center" min-width="" />
28
+      <el-table-column prop="F_Remark" label="说明" align="center" min-width="" />
29
+      <el-table-column prop="F_ZBTime" label="值班时间" align="center" min-width="" />
30
+      <el-table-column prop="F_LastModifyOn" label="最后修改时间" align="center" min-width="" />
31
+      <el-table-column prop="F_CreateBy" label="创建人" align="center" min-width="" />
32
+      <el-table-column prop="F_CreateOn" label="创建时间" align="center" min-width="" />
42 33
       <el-table-column label="操作" width="160" align="center" class-name="oparate_btn" fixed="right">
43 34
         <template slot-scope="scope">
44 35
           <el-button v-permission="'HY_edit'" size="mini" plain type="primary" @click="btn_edit(scope.row.F_ID)">编辑</el-button>
@@ -46,47 +37,38 @@
46 37
         </template>
47 38
       </el-table-column>
48 39
     </el-table>
49
-    <pagination
50
-      v-show="pageParams.total > 0"
51
-      :total="pageParams.total"
52
-      :pageindex.sync="pageParams.pageindex"
53
-      :pagesize.sync="pageParams.pagesize"
54
-      class="pagination"
55
-      @pagination="getList" />
40
+    <pagination v-show="pageParams.total > 0" :total="pageParams.total" :pageindex.sync="pageParams.pageindex" :pagesize.sync="pageParams.pagesize" class="pagination" @pagination="getList" />
56 41
   </div>
57 42
 </template>
58 43
 
59 44
 <script>
60
-
61
-import { getSeatGroupLists } from '@/api/systemSetup/roleSetting/seatGroup'
62
-import { getDutyLists, deleteDuty } from '@/api/telCall/duty'
63
-import addOrEditDuty from './addOrEditDuty'
64
-import { pickerOptions } from '@/utils'
65
-import { getSeatGroup } from '@/api/commonAPI'
66
-import Pagination from '@/components/Pagination' // 对el-pagination 二次封装
45
+import { getSeatGroupLists } from "@/api/systemSetup/roleSetting/seatGroup"
46
+import { getDutyLists, deleteDuty } from "@/api/telCall/duty"
47
+import addOrEditDuty from "./addOrEditDuty"
48
+import { pickerOptions } from "@/utils"
49
+import { getSeatGroup } from "@/api/commonAPI"
50
+import Pagination from "@/components/Pagination" // 对el-pagination 二次封装
67 51
 
68 52
 export default {
69
-  name: 'Duty',
53
+  name: "Duty",
70 54
   components: {
71
-    Pagination
72
-  },
73
-  filters: {
74
-
55
+    Pagination,
75 56
   },
57
+  filters: {},
76 58
   data() {
77 59
     return {
78 60
       loading: false,
79
-      keyword: '',
80
-      searchDate: '',
61
+      keyword: "",
62
+      searchDate: "",
81 63
       pickerOptions,
82 64
       pageParams: {
83 65
         pageindex: 1, // 当前第几页
84 66
         pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
85
-        total: 0 // 总共多少数据
67
+        total: 0, // 总共多少数据
86 68
       },
87 69
       dataLists: [], // 列表数据
88 70
       seatOptions: [],
89
-      groupid: ''
71
+      groupid: "",
90 72
     }
91 73
   },
92 74
   created() {
@@ -101,16 +83,16 @@ export default {
101 83
   methods: {
102 84
     getList() {
103 85
       this.loading = true
104
-      return new Promise(resolve => {
86
+      return new Promise((resolve) => {
105 87
         const params = {
106 88
           pageindex: this.pageParams.pageindex, // 第几页
107 89
           pagesize: this.pageParams.pagesize, // 每页几条信息
108 90
           key: this.keyword.trim(),
109 91
           groupid: this.groupid,
110 92
         }
111
-        getDutyLists(params).then(response => {
93
+        getDutyLists(params).then((response) => {
112 94
           this.loading = false
113
-          if (response.state.toLowerCase() === 'success') {
95
+          if (response.state.toLowerCase() === "success") {
114 96
             this.pageParams.total = response.data.Totals
115 97
             this.dataLists = response.data.Rows
116 98
           }
@@ -127,10 +109,10 @@ export default {
127 109
         content: {
128 110
           content: addOrEditDuty, // 传递的组件对象
129 111
           parent: this, // 当前的vue对象
130
-          data: { 'rowid': ''}// props//该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
112
+          data: { rowid: "" }, // props//该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
131 113
         },
132
-        area: ['40%', '40%'],
133
-        title: '添加值班电话号码'
114
+        area: ["40%", "40%"],
115
+        title: "添加值班电话号码",
134 116
       })
135 117
     },
136 118
     btn_edit(editId) {
@@ -138,43 +120,44 @@ export default {
138 120
         content: {
139 121
           content: addOrEditDuty, // 传递的组件对象
140 122
           parent: this, // 当前的vue对象
141
-          data: { 'rowid': editId }// props
123
+          data: { rowid: editId }, // props
142 124
         },
143
-        area: ['40%', '40%'],
144
-        title: '编辑值班电话号码'
125
+        area: ["40%", "40%"],
126
+        title: "编辑值班电话号码",
145 127
       })
146 128
     },
147 129
     btn_delete(editId) {
148
-      this.$confirm('您确定要删除此值班电话号码吗?', '提示', {
149
-        confirmButtonText: '确定',
150
-        cancelButtonText: '取消',
151
-        type: 'warning'
152
-      }).then(() => {
153
-        deleteDuty(editId).then(response => {
154
-          if (response.state.toLowerCase() === 'success') {
155
-            this.getList()
156
-            this.$message.success('删除成功!')
157
-          }
158
-        })
159
-      }).catch(() => {
160
-        this.$message.info('已取消删除')
130
+      this.$confirm("您确定要删除此值班电话号码吗?", "提示", {
131
+        confirmButtonText: "确定",
132
+        cancelButtonText: "取消",
133
+        type: "warning",
161 134
       })
135
+        .then(() => {
136
+          deleteDuty(editId).then((response) => {
137
+            if (response.state.toLowerCase() === "success") {
138
+              this.getList()
139
+              this.$message.success("删除成功!")
140
+            }
141
+          })
142
+        })
143
+        .catch(() => {
144
+          this.$message.info("已取消删除")
145
+        })
162 146
     },
163 147
     // 获取坐席组下拉数据
164 148
     getSeatGroupSelects() {
165
-      return new Promise(resolve => {
166
-        getSeatGroupLists().then(response => {
167
-          if (response.state.toLowerCase() === 'success') {
149
+      return new Promise((resolve) => {
150
+        getSeatGroupLists().then((response) => {
151
+          if (response.state.toLowerCase() === "success") {
168 152
             this.seatOptions = response.data.Rows
169 153
           }
170 154
         })
171 155
         resolve()
172 156
       })
173
-    }
174
-  }
157
+    },
158
+  },
175 159
 }
176 160
 </script>
177 161
 
178 162
 <style rel="stylesheet/scss" lang="scss" scoped>
179
-
180 163
 </style>

+ 135 - 0
CallCenterWeb.UI/src/views/telCall/extensionBind/addOrEdit.vue

@@ -0,0 +1,135 @@
1
+<template>
2
+  <div v-loading="loading">
3
+    <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="100px">
4
+      <el-form-item label="分机号" prop="F_Extension">
5
+        <el-input v-model="ruleForm.F_Extension" placeholder="请输入分机号" />
6
+      </el-form-item>
7
+      <el-form-item label="固化号" prop="F_Telephone">
8
+        <el-input v-model="ruleForm.F_Telephone" autosize placeholder="请输入固话号" />
9
+      </el-form-item>
10
+      <el-form-item>
11
+        <el-button type="primary" @click="submitForm">保存</el-button>
12
+      </el-form-item>
13
+    </el-form>
14
+  </div>
15
+</template>
16
+
17
+<script>
18
+import { getExtensionBindDetail, addExtensionBind, editExtensionBind } from "@/api/telCall/extensionBind"
19
+import { filterContent } from "@/utils"
20
+
21
+export default {
22
+  name: "AddOrEdit",
23
+  props: {
24
+    rowid: {
25
+      type: Number,
26
+      default: 0,
27
+    },
28
+    layerid: {
29
+      type: String,
30
+      default: "",
31
+    },
32
+  },
33
+  data() {
34
+    return {
35
+      ruleForm: {
36
+        F_ID: "",
37
+        rangTimes: [],
38
+        F_Extension: "", // 分机号
39
+        F_Telephone: "", // 固化号
40
+      },
41
+      rules: {
42
+        F_Extension: [
43
+          {
44
+            required: true,
45
+            trigger: "blur",
46
+            message: "请输入分机号!",
47
+          },
48
+        ],
49
+        F_Telephone: [
50
+          {
51
+            required: true,
52
+            trigger: "blur",
53
+            message: "请输入固化号!",
54
+          },
55
+        ],
56
+      },
57
+      loading: false,
58
+    }
59
+  },
60
+  created() {
61
+    if (this.rowid) {
62
+      this.ruleForm.F_ID = this.rowid
63
+      this.getDetail(this.rowid)
64
+    }
65
+  },
66
+  methods: {
67
+    submitForm() {
68
+      this.$refs.ruleForm.validate((valid) => {
69
+        if (valid) {
70
+          this.loading = true
71
+          const datas = {
72
+            F_ID: this.ruleForm.F_ID,
73
+            F_Extension: this.ruleForm.F_Extension,
74
+            F_Telephone: this.ruleForm.F_Telephone,
75
+          }
76
+          // 添加
77
+          if (!this.rowid) {
78
+            addExtensionBind(datas)
79
+              .then((response) => {
80
+                this.loading = false
81
+                if (response.state.toLowerCase() === "success") {
82
+                  this.$parent.$layer.close(this.layerid)
83
+                  this.$parent.getList() // 重新加载父级数据
84
+                  this.$message.success("恭喜你,黑名单信息添加成功!")
85
+                }
86
+              })
87
+              .catch(() => {
88
+                this.loading = false
89
+              })
90
+            return
91
+          }
92
+          // 编辑
93
+          editExtensionBind(datas)
94
+            .then((response) => {
95
+              this.loading = false
96
+              if (response.state.toLowerCase() === "success") {
97
+                this.$parent.$layer.close(this.layerid)
98
+                this.$parent.getList() // 重新加载父级数据
99
+                this.$message.success("恭喜你,黑名单信息编辑成功!")
100
+              }
101
+            })
102
+            .catch(() => {
103
+              this.loading = false
104
+            })
105
+        } else {
106
+          this.$message.error("请输入有效的必填项信息!")
107
+          return false
108
+        }
109
+      })
110
+    },
111
+    // 获取详情
112
+    getDetail(rid) {
113
+      const params = {
114
+        id: rid
115
+      }
116
+      getExtensionBindDetail(params).then((response) => {
117
+        if (response.state.toLowerCase() === "success") {
118
+          const res = response.data
119
+          this.ruleForm.F_Extension = res.F_Extension
120
+          this.ruleForm.F_Telephone = res.F_Telephone
121
+        }
122
+      })
123
+    },
124
+  },
125
+}
126
+</script>
127
+
128
+<style rel="stylesheet/scss" lang="scss" scoped>
129
+.date_picker {
130
+  width: 100%;
131
+}
132
+div.date_picker input.el-range-input {
133
+  width: 46%;
134
+}
135
+</style>

+ 164 - 0
CallCenterWeb.UI/src/views/telCall/extensionBind/index.vue

@@ -0,0 +1,164 @@
1
+<template>
2
+  <div class="app-container">
3
+    <div class="filter-container">
4
+      <el-input v-model="extension" placeholder="请输入分机号" class="filter-item" />
5
+      <el-input v-model="telephone" placeholder="请输入固话" class="filter-item" />
6
+      <el-button type="primary" class="filter-item" icon="el-icon-search" @click="btn_search">搜索</el-button>
7
+      <el-button v-permission="'HY_add'" type="primary" class="filter-item" icon="el-icon-plus" @click="btn_add">添加</el-button>
8
+    </div>
9
+    <el-table v-loading="loading" :data="dataLists" border stripe>
10
+      <el-table-column type="index" label="编号" align="center" fixed width="80" />
11
+      <el-table-column prop="F_TelPhone" label="来电号码" align="center" min-width="" />
12
+      <el-table-column prop="F_SetTime" label="设置时间" align="center" min-width="" />
13
+      <el-table-column prop="F_RemoveTime" label="解除时间" align="center" min-width="" />
14
+      <el-table-column prop="F_InterceptNum" label="拦截次数" align="center" min-width="" />
15
+      <el-table-column prop="F_CreateBy" label="创建人" align="center" min-width="" />
16
+      <el-table-column prop="F_CreateOn" label="创建时间" align="center" min-width="" />
17
+      <el-table-column prop="F_Describe" label="备注" align="center" min-width="" />
18
+      <el-table-column label="操作" width="160" align="center" class-name="oparate_btn" fixed="right">
19
+        <template slot-scope="scope">
20
+          <el-button v-permission="'HY_edit'" size="mini" plain type="primary" @click="btn_edit(scope.row.F_Id)">编辑</el-button>
21
+          <el-button v-permission="'HY_delete'" size="mini" plain type="danger" @click="btn_delete(scope.row.F_Id)">删除</el-button>
22
+        </template>
23
+      </el-table-column>
24
+    </el-table>
25
+    <pagination v-show="pageParams.total > 0" :total="pageParams.total" :pageindex.sync="pageParams.pageindex" :pagesize.sync="pageParams.pagesize" class="pagination" @pagination="getList" />
26
+  </div>
27
+</template>
28
+
29
+<script>
30
+import { getExtensionBindList, deleteExtensionBind } from "@/api/telCall/extensionBind"
31
+import addOrEdit from "./addOrEdit"
32
+import { pickerOptions } from "@/utils"
33
+import Pagination from "@/components/Pagination" // 对el-pagination 二次封装
34
+
35
+export default {
36
+  name: "ExtensionBind",
37
+  components: {
38
+    Pagination,
39
+  },
40
+  filters: {
41
+    blackTextFilter(status) {
42
+      const statusMap = {
43
+        0: "暂时",
44
+        1: "永久",
45
+        2: "已取消",
46
+      }
47
+      return statusMap[status]
48
+    },
49
+    blackTypeFilter(status) {
50
+      const statusMap = {
51
+        0: "",
52
+        1: "danger",
53
+        2: "warning",
54
+      }
55
+      return statusMap[status]
56
+    },
57
+  },
58
+  data() {
59
+    return {
60
+      loading: false,
61
+      keyword: "",
62
+      extension: "", // 分机号
63
+      telephone: "", // 固话
64
+      pickerOptions,
65
+      pageParams: {
66
+        pageindex: 1, // 当前第几页
67
+        pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
68
+        total: 0, // 总共多少数据
69
+      },
70
+      dataLists: [], // 列表数据
71
+    }
72
+  },
73
+  created() {
74
+    this.getList()
75
+    document.onkeyup = (e) => {
76
+      if (e.keyCode === 13) {
77
+        this.getList()
78
+      }
79
+    }
80
+  },
81
+  methods: {
82
+    getList() {
83
+      this.loading = true
84
+      return new Promise((resolve) => {
85
+        const params = {
86
+          pageindex: this.pageParams.pageindex, // 第几页
87
+          pagesize: this.pageParams.pagesize, // 每页几条信息
88
+          extension: this.extension.replace(/\s+/g, ""), // 分机号
89
+          telephone: this.telephone.replace(/\s+/g, ""), // 固话
90
+        }
91
+        getExtensionBindList(params).then((response) => {
92
+          this.loading = false
93
+          if (response.state.toLowerCase() === "success") {
94
+            this.pageParams.total = response.data.Totals
95
+            this.dataLists = response.data.Rows
96
+          }
97
+        })
98
+        resolve()
99
+      })
100
+    },
101
+    btn_search() {
102
+      this.pageParams.pageindex = 1
103
+      this.getList()
104
+    },
105
+    btn_add() {
106
+      this.$layer.iframe({
107
+        content: {
108
+          content: addOrEdit, // 传递的组件对象
109
+          parent: this, // 当前的vue对象
110
+          data: { rowid: "" }, // props//该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
111
+        },
112
+        area: ["40%", "40%"],
113
+        title: "添加",
114
+      })
115
+    },
116
+    btn_edit(editId) {
117
+      this.$layer.iframe({
118
+        content: {
119
+          content: addOrEdit, // 传递的组件对象
120
+          parent: this, // 当前的vue对象
121
+          data: { rowid: editId }, // props
122
+        },
123
+        area: ["40%", "40%"],
124
+        title: "编辑",
125
+      })
126
+    },
127
+    btn_delete(editId) {
128
+      this.$confirm("您确定删除吗?", "提示", {
129
+        confirmButtonText: "确定",
130
+        cancelButtonText: "取消",
131
+        type: "warning",
132
+      })
133
+        .then(() => {
134
+          deleteExtensionBind(editId).then((response) => {
135
+            if (response.state.toLowerCase() === "success") {
136
+              this.getList()
137
+              this.$message.success("删除成功!")
138
+            }
139
+          })
140
+        })
141
+        .catch(() => {
142
+          this.$message.info("已取消删除")
143
+        })
144
+    },
145
+  },
146
+}
147
+</script>
148
+
149
+<style rel="stylesheet/scss" lang="scss" scoped>
150
+.filter-container {
151
+  .el-select {
152
+    margin-right: 10px;
153
+  }
154
+  .el-date-editor {
155
+    margin-right: 10px;
156
+  }
157
+  .el-cascader {
158
+    margin-right: 10px;
159
+  }
160
+  .filter-item {
161
+    vertical-align: top;
162
+  }
163
+}
164
+</style>

+ 127 - 255
CallCenterWeb.UI/src/views/telCall/seatMonitor/index.vue

@@ -7,78 +7,43 @@
7 7
           <div class="clearfix">
8 8
             <el-col :md="4" class="seat_sts_col">
9 9
               <div class="seat_sts_items">
10
-                <count-to
11
-                  :start-val="0"
12
-                  :end-val="count.totalCount"
13
-                  :duration="2600"
14
-                  class="seat_total_count total_count_color"
15
-                />
10
+                <count-to :start-val="0" :end-val="count.totalCount" :duration="2600" class="seat_total_count total_count_color" />
16 11
                 <p class="seat_state_sts">全部坐席</p>
17 12
               </div>
18 13
             </el-col>
19 14
             <el-col :md="3" class="seat_sts_col">
20 15
               <div class="seat_sts_items">
21
-                <count-to
22
-                  :start-val="0"
23
-                  :end-val="count.onlineCount"
24
-                  :duration="2600"
25
-                  class="seat_total_count online_count_color"
26
-                />
16
+                <count-to :start-val="0" :end-val="count.onlineCount" :duration="2600" class="seat_total_count online_count_color" />
27 17
                 <p class="seat_state_sts">在线</p>
28 18
               </div>
29 19
             </el-col>
30 20
             <el-col :md="3" class="seat_sts_col">
31 21
               <div class="seat_sts_items">
32
-                <count-to
33
-                  :start-val="0"
34
-                  :end-val="count.offlineCount"
35
-                  :duration="2600"
36
-                  class="seat_total_count outline_count_color"
37
-                />
22
+                <count-to :start-val="0" :end-val="count.offlineCount" :duration="2600" class="seat_total_count outline_count_color" />
38 23
                 <p class="seat_state_sts">离线</p>
39 24
               </div>
40 25
             </el-col>
41 26
             <el-col :md="4" class="seat_sts_col">
42 27
               <div class="seat_sts_items">
43
-                <count-to
44
-                  :start-val="0"
45
-                  :end-val="count.freeCount"
46
-                  :duration="2600"
47
-                  class="seat_total_count free_count_color"
48
-                />
28
+                <count-to :start-val="0" :end-val="count.freeCount" :duration="2600" class="seat_total_count free_count_color" />
49 29
                 <p class="seat_state_sts">空闲</p>
50 30
               </div>
51 31
             </el-col>
52 32
             <el-col :md="4" class="seat_sts_col">
53 33
               <div class="seat_sts_items">
54
-                <count-to
55
-                  :start-val="0"
56
-                  :end-val="count.callingCount"
57
-                  :duration="2600"
58
-                  class="seat_total_count calling_count_color"
59
-                />
34
+                <count-to :start-val="0" :end-val="count.callingCount" :duration="2600" class="seat_total_count calling_count_color" />
60 35
                 <p class="seat_state_sts">通话中</p>
61 36
               </div>
62 37
             </el-col>
63 38
             <el-col :md="3" class="seat_sts_col">
64 39
               <div class="seat_sts_items">
65
-                <count-to
66
-                  :start-val="0"
67
-                  :end-val="count.busyCount"
68
-                  :duration="2600"
69
-                  class="seat_total_count callbusy_count_color"
70
-                />
40
+                <count-to :start-val="0" :end-val="count.busyCount" :duration="2600" class="seat_total_count callbusy_count_color" />
71 41
                 <p class="seat_state_sts">忙碌</p>
72 42
               </div>
73 43
             </el-col>
74 44
             <el-col :md="3" class="seat_sts_col">
75 45
               <div class="seat_sts_items">
76
-                <count-to
77
-                  :start-val="0"
78
-                  :end-val="count.afterCallCount"
79
-                  :duration="2600"
80
-                  class="seat_total_count callafter_count_color"
81
-                />
46
+                <count-to :start-val="0" :end-val="count.afterCallCount" :duration="2600" class="seat_total_count callafter_count_color" />
82 47
                 <p class="seat_state_sts">话后处理</p>
83 48
               </div>
84 49
             </el-col>
@@ -94,133 +59,51 @@
94 59
             <!-- <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col">
95 60
               <i class="state_icon state_icon_color1" />已签入
96 61
             </el-col>-->
97
-            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col">
98
-              <i class="state_icon state_icon_color2" />离线
99
-            </el-col>
100
-            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col">
101
-              <i class="state_icon state_icon_color3" />未知
102
-            </el-col>
103
-            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col">
104
-              <i class="state_icon state_icon_color4" />空闲
105
-            </el-col>
106
-            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col">
107
-              <i class="state_icon state_icon_color5" />小休
108
-            </el-col>
109
-            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col">
110
-              <i class="state_icon state_icon_color6" />通话中
111
-            </el-col>
62
+            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col"> <i class="state_icon state_icon_color2" />离线 </el-col>
63
+            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col"> <i class="state_icon state_icon_color3" />未知 </el-col>
64
+            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col"> <i class="state_icon state_icon_color4" />空闲 </el-col>
65
+            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col"> <i class="state_icon state_icon_color5" />小休 </el-col>
66
+            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col"> <i class="state_icon state_icon_color6" />通话中 </el-col>
112 67
             <!-- <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col">
113 68
               <i class="state_icon state_icon_color7" />被请求
114 69
             </el-col>-->
115
-            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col">
116
-              <i class="state_icon state_icon_color8" />话后处理
117
-            </el-col>
70
+            <el-col :xl="8" :lg="12" :md="8" :sm="8" :xs="12" class="state_col"> <i class="state_icon state_icon_color8" />话后处理 </el-col>
118 71
           </div>
119 72
         </el-card>
120 73
       </el-col>
121 74
       <!-- 全部坐席 列表展示 -->
122 75
       <el-col :lg="24">
123 76
         <el-card shadow="hover" class="tab_card">
124
-          <el-button
125
-            v-show="!isStartMonitor"
126
-            type="primary"
127
-            plain
128
-            class="monitor_btn"
129
-            @click="startMonitor"
130
-          >开始监控</el-button>
131
-          <el-button
132
-            v-show="isStartMonitor"
133
-            type="primary"
134
-            plain
135
-            class="monitor_btn"
136
-            @click="cancelMonitor"
137
-          >取消监控</el-button>
77
+          <el-button v-show="!isStartMonitor" type="primary" plain class="monitor_btn" @click="startMonitor">开始监控</el-button>
78
+          <el-button v-show="isStartMonitor" type="primary" plain class="monitor_btn" @click="cancelMonitor">取消监控</el-button>
138 79
           <el-tabs v-model="activeName">
139 80
             <el-tab-pane label="全部坐席" name="first">
140 81
               <div class="tab_body seat_card">
141 82
                 <el-row :gutter="10" class="clearfix">
142
-                  <el-col
143
-                    v-for="item in seatCardLists"
144
-                    :xl="4"
145
-                    :lg="6"
146
-                    :md="8"
147
-                    :sm="12"
148
-                    :key="item.id"
149
-                    :class="{seat_card_item: !isStartMonitor}"
150
-                    class="seat_cards"
151
-                  >
83
+                  <el-col v-for="item in seatCardLists" :xl="4" :lg="6" :md="8" :sm="12" :key="item.id" :class="{ seat_card_item: !isStartMonitor }" class="seat_cards">
152 84
                     <div class="seat_col" @click="oparateBtnShow(item)">
153 85
                       <el-col :md="10" :sm="10" :xs="10" class="text_center">
154 86
                         <img :src="item.head_small_img" alt="头像" class="seat_avatar" />
155
-                        <p
156
-                          :class="item.ext_state | seatStateClassFilter"
157
-                          class="seat_state"
158
-                        >{{ item.ext_state}}</p>
87
+                        <p :class="item.ext_state | seatStateClassFilter" class="seat_state">{{ item.ext_state }}</p>
159 88
                       </el-col>
160 89
                       <el-col :md="14" :sm="14" :xs="14" class="seat_detail_right">
161 90
                         <h5>{{ item.username }}</h5>
162 91
                         <p>工号:{{ item.usercode }}</p>
163 92
                         <p>分机号:{{ item.seat_ext }}</p>
164 93
                         <p v-show="item.isCalling">
165
-                          <b
166
-                            :class="[{call_out: item.isCallout, call_in: !item.isCallout }]"
167
-                            class="call_direction"
168
-                          >{{ item.call_type }}</b>
94
+                          <b :class="[{ call_out: item.isCallout, call_in: !item.isCallout }]" class="call_direction">{{ item.call_type }}</b>
169 95
                           <span class="call_num">{{ item.call_num }}</span>
170 96
                         </p>
171
-                        <svg-icon
172
-                          v-show="item.isListen"
173
-                          icon-class="weibiaoti3"
174
-                          class="seat_listen el-icon-view"
175
-                        />
97
+                        <svg-icon v-show="item.isListen" icon-class="weibiaoti3" class="seat_listen el-icon-view" />
176 98
                       </el-col>
177 99
                     </div>
178
-                    <ul
179
-                      v-show="item.visible && ((item.ext_state === '小休')|| (item.ext_state === '通话中') || (item.ext_state === '来电振铃'))"
180
-                      class="oparate_btn_lists"
181
-                    >
182
-                      <li
183
-                        v-show="item.ext_state === '小休'"
184
-                        class="oparate_btn"
185
-                        @click="oparateSeats(item, 'ForceAgentState')"
186
-                      >
187
-                        <svg-icon class="oparate_icon" icon-class="icon-test" />置闲
188
-                      </li>
189
-                      <li
190
-                        v-show="item.ext_state === '通话中'"
191
-                        class="oparate_btn"
192
-                        @click="oparateSeats(item, 'Listen')"
193
-                      >
194
-                        <svg-icon class="oparate_icon" icon-class="erji" />监听
195
-                      </li>
196
-                      <li
197
-                        v-show="item.ext_state === '来电振铃'"
198
-                        class="oparate_btn"
199
-                        @click="oparateSeats(item, 'Instead')"
200
-                      >
201
-                        <svg-icon class="oparate_icon" icon-class="zhuanjie" />代接
202
-                      </li>
203
-                      <li
204
-                        v-show="item.ext_state ===  '通话中'"
205
-                        class="oparate_btn oparate_divider"
206
-                        @click="oparateSeats(item, 'Insert')"
207
-                      >
208
-                        <svg-icon class="oparate_icon" icon-class="qiangzhixiaxian" />强插
209
-                      </li>
210
-                      <li
211
-                        v-show="item.ext_state ===  '通话中'"
212
-                        class="oparate_btn"
213
-                        @click="oparateSeats(item, 'Intercept')"
214
-                      >
215
-                        <svg-icon class="oparate_icon" icon-class="saoraolanjie" />拦截
216
-                      </li>
217
-                      <li
218
-                        v-show="item.ext_state ===  '通话中'"
219
-                        class="oparate_btn"
220
-                        @click="oparateSeats(item, 'Break')"
221
-                      >
222
-                        <svg-icon class="oparate_icon" icon-class="chexiaochaifen" />强拆
223
-                      </li>
100
+                    <ul v-show="item.visible && (item.ext_state === '小休' || item.ext_state === '通话中' || item.ext_state === '来电振铃')" class="oparate_btn_lists">
101
+                      <li v-show="item.ext_state === '小休'" class="oparate_btn" @click="oparateSeats(item, 'ForceAgentState')"><svg-icon class="oparate_icon" icon-class="icon-test" />置闲</li>
102
+                      <li v-show="item.ext_state === '通话中'" class="oparate_btn" @click="oparateSeats(item, 'Listen')"><svg-icon class="oparate_icon" icon-class="erji" />监听</li>
103
+                      <li v-show="item.ext_state === '来电振铃'" class="oparate_btn" @click="oparateSeats(item, 'Instead')"><svg-icon class="oparate_icon" icon-class="zhuanjie" />代接</li>
104
+                      <li v-show="item.ext_state === '通话中'" class="oparate_btn oparate_divider" @click="oparateSeats(item, 'Insert')"><svg-icon class="oparate_icon" icon-class="qiangzhixiaxian" />强插</li>
105
+                      <li v-show="item.ext_state === '通话中'" class="oparate_btn" @click="oparateSeats(item, 'Intercept')"><svg-icon class="oparate_icon" icon-class="saoraolanjie" />拦截</li>
106
+                      <li v-show="item.ext_state === '通话中'" class="oparate_btn" @click="oparateSeats(item, 'Break')"><svg-icon class="oparate_icon" icon-class="chexiaochaifen" />强拆</li>
224 107
                     </ul>
225 108
                   </el-col>
226 109
                 </el-row>
@@ -234,43 +117,43 @@
234 117
 </template>
235 118
 
236 119
 <script>
237
-import CountTo from 'vue-count-to'
238
-import { Send } from '@/utils/telWebsocket'
239
-import { getSeatGroup } from '@/api/commonAPI'
240
-import { getSeatLists, getSeatRealStates } from '@/api/telCall/seatMonitor'
241
-import { mapGetters } from 'vuex'
242
-import store from '@/store'
243
-import { timestampToTime } from '@/utils'
120
+import CountTo from "vue-count-to"
121
+import { Send } from "@/utils/telWebsocket"
122
+import { getSeatGroup } from "@/api/commonAPI"
123
+import { getSeatLists, getSeatRealStates } from "@/api/telCall/seatMonitor"
124
+import { mapGetters } from "vuex"
125
+import store from "@/store"
126
+import { timestampToTime } from "@/utils"
244 127
 
245 128
 export default {
246
-  name: 'SeatMonitor',
129
+  name: "SeatMonitor",
247 130
   components: {
248
-    CountTo
131
+    CountTo,
249 132
   },
250 133
   filters: {
251
-    seatStateFilter (status) {
134
+    seatStateFilter(status) {
252 135
       const statusMap = {
253
-        0x00: '未知',
254
-        0x01: '已签入',
255
-        0x02: '空闲',
256
-        0x03: '通话中',
257
-        0x04: '话后处理',
258
-        0x05: '小休',
259
-        0x06: '被请求',
260
-        0x07: '离线'
136
+        0x00: "未知",
137
+        0x01: "已签入",
138
+        0x02: "空闲",
139
+        0x03: "通话中",
140
+        0x04: "话后处理",
141
+        0x05: "小休",
142
+        0x06: "被请求",
143
+        0x07: "离线",
261 144
       }
262 145
       return statusMap[status]
263 146
     },
264
-    seatStateClassFilter (status) {
147
+    seatStateClassFilter(status) {
265 148
       const statusMap = {
266
-        '未知': 'seat_state_color0',
267
-        '已签入': 'seat_state_color1',
268
-        '空闲': 'seat_state_color2',
269
-        '通话中': 'seat_state_color3',
270
-        '话后处理': 'seat_state_color4',
271
-        '小休': 'seat_state_color5',
272
-        '被请求': 'seat_state_color6',
273
-        '离线': 'seat_state_color7'
149
+        未知: "seat_state_color0",
150
+        已签入: "seat_state_color1",
151
+        空闲: "seat_state_color2",
152
+        通话中: "seat_state_color3",
153
+        话后处理: "seat_state_color4",
154
+        小休: "seat_state_color5",
155
+        被请求: "seat_state_color6",
156
+        离线: "seat_state_color7",
274 157
       }
275 158
       return statusMap[status]
276 159
       // console.log()
@@ -279,16 +162,15 @@ export default {
279 162
       // }
280 163
     },
281 164
     // 坐席类型
282
-    agentTypeFilter (status) {
165
+    agentTypeFilter(status) {
283 166
       const statusMap = {
284
-        0: '班长坐席',
285
-        1: '普通坐席'
167
+        0: "班长坐席",
168
+        1: "普通坐席",
286 169
       }
287 170
       return statusMap[status]
288
-    }
289
-
171
+    },
290 172
   },
291
-  data () {
173
+  data() {
292 174
     return {
293 175
       seatRealSateTimer: null, // 定时器
294 176
       monitorListBoole: false,
@@ -307,23 +189,23 @@ export default {
307 189
         freeCount: 0, // 空闲数量
308 190
         callingCount: 0, // 通话中数量
309 191
         busyCount: 0, // 忙碌数量
310
-        afterCallCount: 0 // 话后处理数量
192
+        afterCallCount: 0, // 话后处理数量
311 193
       },
312
-      activeName: 'first',
313
-      scoketDatas: {} // 发送的 websocket数据
194
+      activeName: "first",
195
+      scoketDatas: {}, // 发送的 websocket数据
314 196
     }
315 197
   },
316 198
   computed: {
317 199
     ...mapGetters([
318
-      'telIsLogin', // 是否签入
319
-      'usercode', // 坐席工号
320
-      'extension', // 分机号
321
-      'telLineState', // 线路状态
322
-      'telMonitor', // 监控操作是否成功
323
-      'monitorState', //坐席状态
324
-      'monitorAgent' //坐席工号
200
+      "telIsLogin", // 是否签入
201
+      "usercode", // 坐席工号
202
+      "extension", // 分机号
203
+      "telLineState", // 线路状态
204
+      "telMonitor", // 监控操作是否成功
205
+      "monitorState", //坐席状态
206
+      "monitorAgent", //坐席工号
325 207
     ]),
326
-    groupFilter () {
208
+    groupFilter() {
327 209
       return function (id) {
328 210
         for (let i = 0; i < this.seatGroups.length; i++) {
329 211
           if (this.seatGroups[i].id === id) {
@@ -331,7 +213,7 @@ export default {
331 213
           }
332 214
         }
333 215
       }
334
-    }
216
+    },
335 217
   },
336 218
   watch: {
337 219
     // 如果 `telMonitor` 发生改变,这个函数就会运行
@@ -339,20 +221,18 @@ export default {
339 221
       if (newT) {
340 222
         this.monitorSeatState()
341 223
       }
342
-    }
343
-
224
+    },
344 225
   },
345
-  created () {
346
-    this.getSeatGroupList()
347
-      .then(() => {
348
-        this.getLists()
349
-      })
226
+  created() {
227
+    this.getSeatGroupList().then(() => {
228
+      this.getLists()
229
+    })
350 230
   },
351 231
   methods: {
352 232
     // 初始化 坐席card 和 表格 列表
353
-    getLists () {
354
-      getSeatLists().then(response => {
355
-        if (response.state.toLowerCase() === 'success') {
233
+    getLists() {
234
+      getSeatLists().then((response) => {
235
+        if (response.state.toLowerCase() === "success") {
356 236
           this.seatCardLists = []
357 237
           this.postSeatsLists = []
358 238
           this.dataLists = []
@@ -365,17 +245,17 @@ export default {
365 245
               // 初始化 card 数据
366 246
               this.seatCardLists.push({
367 247
                 id: v.id,
368
-                head_small_img: !v.head_small_img ? '/static/img/user.png' : v.head_small_img,
369
-                ext_state: '未知', // 线路状态
248
+                head_small_img: !v.head_small_img ? "/static/img/user.png" : v.head_small_img,
249
+                ext_state: "未知", // 线路状态
370 250
                 username: v.F_UserName,
371 251
                 usercode: v.F_UserCode,
372
-                seat_ext: '未知', // 分机号
252
+                seat_ext: "未知", // 分机号
373 253
                 isListen: false, // 是否监听
374 254
                 isCalling: false, // 是否通话中
375 255
                 isCallout: null, // 是否是呼出(初始是这类 !isCallout 为false 的值)
376 256
                 call_type: null, // 通话类型
377 257
                 call_num: null, // 通话号码
378
-                visible: false // 是否可以操作
258
+                visible: false, // 是否可以操作
379 259
               })
380 260
             })
381 261
           }
@@ -383,37 +263,33 @@ export default {
383 263
       })
384 264
     },
385 265
     // 开始监控
386
-    startMonitor () {
387
-
266
+    startMonitor() {
388 267
       // this.monitorList = []
389 268
       this.isStartMonitor = true // 是否开始监控
390 269
       this.scoketDatas = {
391
-        'AgentID': this.usercode,
392
-        'AgentExten': this.extension,
393
-        'Type': 'Monitor'
270
+        AgentID: this.usercode,
271
+        AgentExten: this.extension,
272
+        Type: "Monitor",
394 273
       }
395 274
       Send(this.scoketDatas)
396
-
397
-
398 275
     },
399 276
     // 取消监控
400
-    cancelMonitor () {
277
+    cancelMonitor() {
401 278
       this.isStartMonitor = false // 是否开始监控
402 279
       this.scoketDatas = {
403
-        'AgentID': this.usercode,
404
-        'AgentExten': this.extension,
405
-        'Type': 'MonitorCancel'
280
+        AgentID: this.usercode,
281
+        AgentExten: this.extension,
282
+        Type: "MonitorCancel",
406 283
       }
407 284
       Send(this.scoketDatas)
408 285
       this.initCalCount() // 初始化 实时状态数量
409 286
       this.getLists()
410
-
411 287
     },
412 288
     // 监测坐席状态 坐席实时状态
413
-    monitorSeatState () {
289
+    monitorSeatState() {
414 290
       this.initCalCount() // 初始化 实时状态数量
415
-      store.dispatch('ChangeMonitor', false)// 修改监听操作的返回值
416
-      this.isStartMonitor = true // 是否开始监控      
291
+      store.dispatch("ChangeMonitor", false) // 修改监听操作的返回值
292
+      this.isStartMonitor = true // 是否开始监控
417 293
       if (this.monitorList.length > 0) {
418 294
         this.monitorList.forEach((v, i) => {
419 295
           if (Number(v.agent_id) === Number(this.monitorAgent)) {
@@ -424,13 +300,13 @@ export default {
424 300
         if (!this.monitorListBoole) {
425 301
           this.monitorList.push({
426 302
             agent_id: this.monitorAgent,
427
-            ext_state: this.monitorState
303
+            ext_state: this.monitorState,
428 304
           })
429 305
         }
430 306
       } else {
431 307
         this.monitorList.push({
432 308
           agent_id: this.monitorAgent,
433
-          ext_state: this.monitorState
309
+          ext_state: this.monitorState,
434 310
         })
435 311
       }
436 312
       console.log(this.monitorAgent)
@@ -460,11 +336,11 @@ export default {
460 336
       this.count.offlineCount = this.count.totalCount - this.count.onlineCount
461 337
     },
462 338
     /**
463
-       * 获取 card表格数据
464
-       * @m 当前坐席数据
465
-       * @v 获取的数据 this.getCardList(m, this.monitorAgent, this.monitorState)
466
-       */
467
-    getCardList (m, v) {
339
+     * 获取 card表格数据
340
+     * @m 当前坐席数据
341
+     * @v 获取的数据 this.getCardList(m, this.monitorAgent, this.monitorState)
342
+     */
343
+    getCardList(m, v) {
468 344
       if (Number(m.usercode) === Number(this.monitorAgent)) {
469 345
         m.ext_state = this.monitorState // 线路状态
470 346
         // 通话中,获取电话号码
@@ -479,7 +355,7 @@ export default {
479 355
       }
480 356
     },
481 357
     // 初始化 实时状态数量
482
-    initCalCount () {
358
+    initCalCount() {
483 359
       this.count.offlineCount = 0 // 离线数量
484 360
       this.count.freeCount = 0 // 空闲数量
485 361
       this.count.callingCount = 0 // 通话中数量
@@ -488,41 +364,40 @@ export default {
488 364
       this.count.onlineCount = 0
489 365
     },
490 366
     // 计算 实时状态的数量
491
-    calculatCount (stateCode) {
367
+    calculatCount(stateCode) {
492 368
       switch (stateCode) {
493
-        case '离线':
369
+        case "离线":
494 370
           this.count.offlineCount++ // 离线数量
495 371
           break
496
-        case '空闲':
372
+        case "空闲":
497 373
           this.count.freeCount++ // 空闲数量
498 374
           break
499
-        case '通话中':
375
+        case "通话中":
500 376
           this.count.callingCount++ // 通话中数量
501 377
           break
502
-        case '话后处理':
378
+        case "话后处理":
503 379
           this.count.afterCallCount++ // 话后处理
504 380
           break
505
-        case '小休': // 小休
381
+        case "小休": // 小休
506 382
           this.count.busyCount++
507 383
           break
508 384
         default:
509 385
           break
510 386
       }
511 387
       this.count.onlineCount = this.count.freeCount + this.count.callingCount + this.count.afterCallCount + this.count.busyCount // 在线数量
512
-
513 388
     },
514 389
 
515 390
     // 获取坐席组数据
516
-    getSeatGroupList () {
517
-      return new Promise(resolve => {
518
-        getSeatGroup().then(response => {
519
-          if (response.state.toLowerCase() === 'success') {
391
+    getSeatGroupList() {
392
+      return new Promise((resolve) => {
393
+        getSeatGroup().then((response) => {
394
+          if (response.state.toLowerCase() === "success") {
520 395
             const res = response.data
521 396
             if (res && res.length > 0) {
522 397
               for (let i = 0; i < res.length; i++) {
523 398
                 this.seatGroups.push({
524 399
                   id: res[i].id,
525
-                  name: res[i].zxzname
400
+                  name: res[i].zxzname,
526 401
                 })
527 402
               }
528 403
             }
@@ -533,29 +408,27 @@ export default {
533 408
     },
534 409
 
535 410
     // 操作坐席
536
-    oparateBtnShow (item) {
411
+    oparateBtnShow(item) {
537 412
       if (!this.isStartMonitor) {
538
-        this.$message.warning('您还没有开始监测,请点击开始监测后再操作!')
413
+        this.$message.warning("您还没有开始监测,请点击开始监测后再操作!")
539 414
         return
540 415
       }
541 416
 
542 417
       if (!this.telIsLogin) {
543
-        this.$message.warning('您还没有签入,请签入后再操作!')
418
+        this.$message.warning("您还没有签入,请签入后再操作!")
544 419
         return
545 420
       }
546 421
 
547 422
       if (item.usercode === this.usercode) {
548
-        this.$message.warning('您不能在坐席监控中对自己进行操作!')
423
+        this.$message.warning("您不能在坐席监控中对自己进行操作!")
549 424
         return
550 425
       }
551 426
       if (this.telLineState === 6) {
552
-        this.$message.warning('您当前在通话中不能对坐席进行操作!')
427
+        this.$message.warning("您当前在通话中不能对坐席进行操作!")
553 428
         return
554 429
       }
555 430
       console.log(item.ext_state)
556
-      if ((item.ext_state === '小休') ||
557
-        (item.ext_state === '通话中') ||
558
-        (item.ext_state === '来电振铃')) {
431
+      if (item.ext_state === "小休" || item.ext_state === "通话中" || item.ext_state === "来电振铃") {
559 432
         item.visible = !item.visible
560 433
         this.seatCardLists.forEach((v, i) => {
561 434
           if (item.id !== v.id) {
@@ -563,36 +436,35 @@ export default {
563 436
           }
564 437
         })
565 438
       } else {
566
-        this.$message.warning('当前坐席无需操作!')
439
+        this.$message.warning("当前坐席无需操作!")
567 440
       }
568 441
     },
569 442
 
570 443
     // 置闲 监听 代接 强插 拦截 强拆
571
-    oparateSeats (item, angenttype) {
444
+    oparateSeats(item, angenttype) {
572 445
       // if (angenttype === 'Instead') {
573 446
       //   item.usercode = '8001'
574 447
       // }
575 448
 
576 449
       this.scoketDatas = {
577
-        'AgentID': this.usercode,
578
-        'AgentExten': this.extension,
579
-        'Type': angenttype,
580
-        'TargetAgentID': item.usercode // 目标座席工号
450
+        AgentID: this.usercode,
451
+        AgentExten: this.extension,
452
+        Type: angenttype,
453
+        TargetAgentID: item.usercode, // 目标座席工号
581 454
       }
582 455
       Send(this.scoketDatas)
583 456
       item.visible = !item.visible
584
-    }
457
+    },
585 458
   },
586
-  beforeRouteLeave (to, from, next) {
459
+  beforeRouteLeave(to, from, next) {
587 460
     // 导航离开该组件的对应路由时调用
588 461
     // 可以访问组件实例 `this`
589 462
     if (this.isStartMonitor) {
590 463
       this.cancelMonitor()
591 464
     }
592 465
     next()
593
-  }
466
+  },
594 467
 }
595
-
596 468
 </script>
597 469
 
598 470
 <style rel="stylesheet/scss" lang="scss">