miaofuhao лет назад: 4
Родитель
Сommit
57139375cf
39 измененных файлов с 3575 добавлено и 967 удалено
  1. BIN
      CallCenterWeb.UI/RMYY/0909dist.zip
  2. 0 2
      CallCenterWeb.UI/RMYY/config/dev.env.js
  3. 3 5
      CallCenterWeb.UI/RMYY/config/prod.env.js
  4. 1 3
      CallCenterWeb.UI/RMYY/config/sit.env.js
  5. 43 0
      CallCenterWeb.UI/RMYY/src/api/callScreen/callScreen.js
  6. 4 3
      CallCenterWeb.UI/RMYY/src/api/commonAPI.js
  7. 36 0
      CallCenterWeb.UI/RMYY/src/api/customerManagement/customerList.js
  8. 12 11
      CallCenterWeb.UI/RMYY/src/api/systemSetup/roleSetting/department.js
  9. 2 4
      CallCenterWeb.UI/RMYY/src/api/systemSetup/roleSetting/userManage.js
  10. 6 6
      CallCenterWeb.UI/RMYY/src/api/systemSetup/sysSetting/teamManagement.js
  11. 91 0
      CallCenterWeb.UI/RMYY/src/api/trafficData/trafficData.js
  12. 1 1
      CallCenterWeb.UI/RMYY/src/components/Teloperation/index.vue
  13. 102 0
      CallCenterWeb.UI/RMYY/src/components/audioPlayer/index.vue
  14. 12 0
      CallCenterWeb.UI/RMYY/src/router/index.js
  15. 1 0
      CallCenterWeb.UI/RMYY/src/store/getters.js
  16. 0 2
      CallCenterWeb.UI/RMYY/src/store/index.js
  17. 0 114
      CallCenterWeb.UI/RMYY/src/store/modules/lineChatSocket.js
  18. 7 6
      CallCenterWeb.UI/RMYY/src/store/modules/permission.js
  19. 4 0
      CallCenterWeb.UI/RMYY/src/store/modules/telWebsocket.js
  20. 1 1
      CallCenterWeb.UI/RMYY/src/styles/sidebar.scss
  21. 3 3
      CallCenterWeb.UI/RMYY/src/utils/telWebsocket.js
  22. 306 0
      CallCenterWeb.UI/RMYY/src/views/callScreen/components/AddOrEditCustomer.vue
  23. 165 0
      CallCenterWeb.UI/RMYY/src/views/callScreen/components/CustomerList.vue
  24. 111 0
      CallCenterWeb.UI/RMYY/src/views/callScreen/components/OrderList.vue
  25. 416 0
      CallCenterWeb.UI/RMYY/src/views/callScreen/components/callScreen.vue
  26. 117 0
      CallCenterWeb.UI/RMYY/src/views/callScreen/index.vue
  27. 279 0
      CallCenterWeb.UI/RMYY/src/views/customerManagement/customerList/components/addOrEdit.vue
  28. 295 0
      CallCenterWeb.UI/RMYY/src/views/customerManagement/customerList/components/detail.vue
  29. 361 0
      CallCenterWeb.UI/RMYY/src/views/customerManagement/customerList/index.vue
  30. 1 1
      CallCenterWeb.UI/RMYY/src/views/layout/components/Navbar.vue
  31. 148 0
      CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/department/component/addOrEdit.vue
  32. 281 0
      CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/department/index.vue
  33. 1 1
      CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/roleSetup/index.vue
  34. 147 403
      CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/userManage/addOrEdit.vue
  35. 25 248
      CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/userManage/index.vue
  36. 0 151
      CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/userManage/modifyPass.vue
  37. 308 0
      CallCenterWeb.UI/RMYY/src/views/trafficData/callRecord/add.vue
  38. 285 0
      CallCenterWeb.UI/RMYY/src/views/trafficData/callRecord/index.vue
  39. 0 2
      CallCenterWeb.UI/RMYY/static/config/serverConfig.json

BIN
CallCenterWeb.UI/RMYY/0909dist.zip


+ 0 - 2
CallCenterWeb.UI/RMYY/config/dev.env.js

@@ -6,8 +6,6 @@ module.exports = {
6 6
   BASE_API: '"http://192.168.8.20:1028/"', // 这里放测试API
7 7
   SOCKET_IP: '"192.168.5.41"', // WebSocket通讯ip
8 8
   SOCKET_PORT: '"28822"', // WebSocket通讯端口
9
-  LineChat_SOCKET_IP: '"192.168.5.42"', // 在线客服WebSocket通讯ip
10
-  LineChat_SOCKET_PORT: '"28300"', // 在线客服WebSocket通讯端口
11 9
   PAGESIZES: '[10, 20, 50, 100]', // number[] 表格每页显示个数选择器的选项设置
12 10
   PAGESIZE: '10', // number 表格每页显示条目个数
13 11
   monitorPlatformTime: '5000', // 自动外呼监控  坐席监控  数据刷新间隔

+ 3 - 5
CallCenterWeb.UI/RMYY/config/prod.env.js

@@ -3,11 +3,9 @@
3 3
 module.exports = {
4 4
   NODE_ENV: '"production"',
5 5
   ENV_CONFIG: '"prod"',
6
-  BASE_API: '"http://192.168.1.37:8000/"', // 生产环境API
7
-  SOCKET_IP: '"36.99.169.138"', // WebSocket通讯ip
8
-  SOCKET_PORT: '"9000"', // WebSocket通讯端口
9
-  LineChat_SOCKET_IP: '"192.168.5.42"', // 在线客服WebSocket通讯ip
10
-  LineChat_SOCKET_PORT: '"28300"', // 在线客服WebSocket通讯端口
6
+  BASE_API: '"http://172.16.10.21:8889/"', // 生产环境API
7
+  SOCKET_IP: '"172.16.10.21"', // WebSocket通讯ip
8
+  SOCKET_PORT: '"8081"', // WebSocket通讯端口
11 9
   PAGESIZES: '[10, 20, 50, 100]', // number[] 表格每页显示个数选择器的选项设置
12 10
   PAGESIZE: '10', // number 表格每页显示条目个数
13 11
   monitorPlatformTime: '5000', // 自动外呼监控  坐席监控  数据刷新间隔

+ 1 - 3
CallCenterWeb.UI/RMYY/config/sit.env.js

@@ -4,11 +4,9 @@ module.exports = {
4 4
   NODE_ENV: '"production"',
5 5
   ENV_CONFIG: '"sit"',
6 6
   // BASE_API: '"http://192.168.8.20:1028/"', // API地址
7
-  BASE_API: '"http://117.160.241.16:1028/"', // API地址
7
+  BASE_API: '"http://192.168.1.37:8000/"', // API地址
8 8
   SOCKET_IP: '"36.99.169.138"', // WebSocket通讯ip
9 9
   SOCKET_PORT: '"9000"', // WebSocket通讯端口
10
-  LineChat_SOCKET_IP: '"192.168.5.42"', // 在线客服WebSocket通讯ip
11
-  LineChat_SOCKET_PORT: '"28300"', // 在线客服WebSocket通讯端口
12 10
   PAGESIZES: '[10, 20, 50, 100]', // number[] 表格每页显示个数选择器的选项设置
13 11
   PAGESIZE: '10', // number 表格每页显示条目个数
14 12
   monitorPlatformTime: '5000', // 自动外呼监控  坐席监控  数据刷新间隔

+ 43 - 0
CallCenterWeb.UI/RMYY/src/api/callScreen/callScreen.js

@@ -0,0 +1,43 @@
1
+import request from '@/utils/request'
2
+
3
+// 获取客户数据
4
+export function getCusUser(phoneNum) {
5
+  return request({
6
+    url: 'api/customer/getcusbyphonenum',
7
+    method: 'get',
8
+    params: {
9
+      phoneNum
10
+    }
11
+  })
12
+}
13
+
14
+// 获取来电归属地数据
15
+export function getPhoneLocation(tel) {
16
+  return request({
17
+    url: 'api/CallFunction/GetTelLocation',
18
+    method: 'post',
19
+    params: {
20
+      tel
21
+    }
22
+  })
23
+}
24
+
25
+// 拉黑
26
+export function addBlack(data) {
27
+  return request({
28
+    url: 'callcenterapi/api/callinscreen/addblack',
29
+    method: 'post',
30
+    data
31
+  })
32
+}
33
+
34
+// 取消拉黑
35
+export function cancelBlack(phone) {
36
+  return request({
37
+    url: 'callcenterapi/api/callinscreen/delblack',
38
+    method: 'post',
39
+    data: {
40
+      phone
41
+    }
42
+  })
43
+}

+ 4 - 3
CallCenterWeb.UI/RMYY/src/api/commonAPI.js

@@ -59,10 +59,11 @@ export function getSeatGroup() {
59 59
 }
60 60
 
61 61
 // 获取角色
62
-export function getRoleSelect() {
62
+export function getRoleSelect(params) {
63 63
   return request({
64
-    url: 'api/roleinfo/getlistdrop',
65
-    method: 'get'
64
+    url: 'Role/GetList',
65
+    method: 'get',
66
+    params
66 67
   })
67 68
 }
68 69
 

+ 36 - 0
CallCenterWeb.UI/RMYY/src/api/customerManagement/customerList.js

@@ -0,0 +1,36 @@
1
+import request from '@/utils/request'
2
+// 客户列表
3
+export function getCustomerList(params) {
4
+  return request({
5
+    url: 'Customer/GetList',
6
+    method: 'post',
7
+    params
8
+  })
9
+}
10
+// 客户新增修改
11
+export function addOrEditCustomerList(data) {
12
+  return request({
13
+    url: 'Customer/AddCustomer',
14
+    method: 'post',
15
+    data
16
+  })
17
+}
18
+// 客户详情
19
+export function getCusDetail(data) {
20
+  return request({
21
+    url: 'Customer/GetCustomer',
22
+    method: 'post',
23
+    data
24
+  })
25
+}
26
+// 客户删除
27
+export function deleteCustomerList(ids) {
28
+  return request({
29
+    url: 'Customer/DelCustomer',
30
+    method: 'post',
31
+    data: {
32
+      ids
33
+    }
34
+  })
35
+}
36
+

+ 12 - 11
CallCenterWeb.UI/RMYY/src/api/systemSetup/roleSetting/department.js

@@ -2,14 +2,14 @@ import request from '@/utils/request'
2 2
 // 获取分类树
3 3
 export function getTreeList() {
4 4
   return request({
5
-    url: 'api/deptment/getall',
5
+    url: 'Department/GetTreeList',
6 6
     method: 'get'
7 7
   })
8 8
 }
9 9
 // 添加
10 10
 export function addType(data) {
11 11
   return request({
12
-    url: 'api/deptment/adddept',
12
+    url: 'Department/Insert',
13 13
     method: 'post',
14 14
     data
15 15
   })
@@ -17,36 +17,37 @@ export function addType(data) {
17 17
 // 编辑
18 18
 export function editType(data) {
19 19
   return request({
20
-    url: 'api/deptment/editdept',
20
+    url: 'Department/Update',
21 21
     method: 'post',
22 22
     data
23 23
   })
24 24
 }
25 25
 // 删除分类
26
-export function deleteType(ids) {
26
+export function deleteType(id) {
27 27
   return request({
28
-    url: 'api/deptment/deldept',
28
+    url: 'Department/Delete',
29 29
     method: 'post',
30 30
     data: {
31
-      ids
31
+      id
32 32
     }
33 33
   })
34 34
 }
35 35
 // 获取详情
36 36
 export function getTypeDetail(deptid) {
37 37
   return request({
38
-    url: 'api/deptment/getdeptsingle',
38
+    url: 'Department/GetModel',
39 39
     method: 'get',
40 40
     params: {
41 41
       deptid
42 42
     }
43 43
   })
44 44
 }
45
-// 获取分类树
46
-export function getDepartmentList() {
45
+// 获取列表数据
46
+export function getDepartmentList(params) {
47 47
   return request({
48
-    url: 'api/deptment/getallloop',
49
-    method: 'get'
48
+    url: 'Department/GetList',
49
+    method: 'get',
50
+    params
50 51
   })
51 52
 }
52 53
 

+ 2 - 4
CallCenterWeb.UI/RMYY/src/api/systemSetup/roleSetting/userManage.js

@@ -12,13 +12,11 @@ export function getUserAccountLists(params) {
12 12
 }
13 13
 
14 14
 // 获取用户数据
15
-export function getUserAccount(id) {
15
+export function getUserAccount(params) {
16 16
   return request({
17 17
     url: 'UserAccount/GetModel',
18 18
     method: 'get',
19
-    params: {
20
-      id
21
-    }
19
+    params
22 20
   })
23 21
 }
24 22
 

+ 6 - 6
CallCenterWeb.UI/RMYY/src/api/systemSetup/sysSetting/teamManagement.js

@@ -50,9 +50,9 @@ export function deleteTeam(ids) {
50 50
 }
51 51
 // 获取职位数据
52 52
 export function getPositionData(params) {
53
-  return request({
54
-    url: 'api/position/getlistdrop',
55
-    method: 'get',
56
-    params
57
-  })
58
-}
53
+    return request({
54
+      url: 'api/position/getlistdrop',
55
+      method: 'get',
56
+      params
57
+    })
58
+  }

+ 91 - 0
CallCenterWeb.UI/RMYY/src/api/trafficData/trafficData.js

@@ -0,0 +1,91 @@
1
+import request from '@/utils/request'
2
+
3
+// 获取坐席外呼列表数据
4
+export function getCallOutList(params) {
5
+  return request({
6
+    url: 'callcenterapi/api/MWAgentCalloutRecord/getlistbypage',
7
+    method: 'get',
8
+    params
9
+  })
10
+}
11
+
12
+// 获取坐席三方通话列表数据
13
+export function getThreeCallList(params) {
14
+  return request({
15
+    url: 'callcenterapi/api/MWAgentConferenceRecord/getlistbypage',
16
+    method: 'get',
17
+    params
18
+  })
19
+}
20
+
21
+// 获取坐席状态列表数据
22
+export function getCallStateList(params) {
23
+  return request({
24
+    url: 'callcenterapi/api/MWAgentStateRecord/getlistbypage',
25
+    method: 'get',
26
+    params
27
+  })
28
+}
29
+
30
+// 获取坐席转移列表数据
31
+export function getCallTransferList(params) {
32
+  return request({
33
+    url: 'callcenterapi/api/MWAgentTransferRecord/getlistbypage',
34
+    method: 'get',
35
+    params
36
+  })
37
+}
38
+
39
+// 获取分机呼入列表数据
40
+export function getExtCallinList(params) {
41
+  return request({
42
+    url: 'callcenterapi/api/MWExtCallinRecord/getlistbypage',
43
+    method: 'get',
44
+    params
45
+  })
46
+}
47
+
48
+// 获取中继呼入列表数据
49
+export function getMwtCallinList(params) {
50
+  return request({
51
+    url: 'callcenterapi/api/MWTrunkCallinRecord/getlistbypage',
52
+    method: 'get',
53
+    params
54
+  })
55
+}
56
+
57
+// 获取自动外呼列表数据
58
+export function getAutoCallOutList(params) {
59
+  return request({
60
+    url: 'callcenterapi/api/MWAutocallCallRecord/getlistbypage',
61
+    method: 'get',
62
+    params
63
+  })
64
+}
65
+
66
+// 获取坐席小休列表数据
67
+export function getSeatRestList(params) {
68
+  return request({
69
+    url: 'callcenterapi/api/MWAgentReposeRecord/getlistbypage',
70
+    method: 'get',
71
+    params
72
+  })
73
+}
74
+
75
+// 获取通话记录数据
76
+export function getCallRecords(params) {
77
+  return request({
78
+    url: 'Callrecords/GetList',
79
+    method: 'post',
80
+    params
81
+  })
82
+}
83
+
84
+// 获取IVR呼出数据
85
+export function getIVRCalloutRecord(params) {
86
+  return request({
87
+    url: 'callcenterapi/api/MWIVRCalloutRecord/getlistbypage',
88
+    method: 'get',
89
+    params
90
+  })
91
+}

+ 1 - 1
CallCenterWeb.UI/RMYY/src/components/Teloperation/index.vue

@@ -138,7 +138,7 @@ export default {
138 138
         Type: 'Login',
139 139
         AgentID: this.usercode,
140 140
         AgentExten: this.extension,
141
-        AgentGroup: window.localStorage.getItem('groupCode'), // 坐席组id
141
+        AgentGroup: '364', // 坐席组id window.localStorage.getItem('groupCode')
142 142
         AgentType: '0',
143 143
         DisposeTime: '0' // 话后处理时长设置,0代表一致话后处理,除非发送置闲 (按照历史习惯,字符串形式)
144 144
       }

+ 102 - 0
CallCenterWeb.UI/RMYY/src/components/audioPlayer/index.vue

@@ -0,0 +1,102 @@
1
+
2
+<template>
3
+  <div>
4
+    <div class="audio_player">
5
+      <!-- <audio style="width: 100%;" :src='recFiles'
6
+			controls="controls"></audio> -->
7
+      <aplayer
8
+        :music="musicList"
9
+        autoplay
10
+        theme="#41b883"
11
+      />
12
+      <el-button class="audio_btn" size="mini" plain type="primary" @click="btn_downlaod()">下载</el-button>
13
+    </div>
14
+  </div>
15
+</template>
16
+
17
+<script>
18
+
19
+import { mapGetters } from 'vuex'
20
+import VueAplayer from 'vue-aplayer'
21
+import download from 'downloadjs'
22
+
23
+export default {
24
+  name: 'AudioPlayer',
25
+  components: {
26
+    // 别忘了引入组件
27
+    'aplayer': VueAplayer
28
+  },
29
+  props: {
30
+    recFiles: {
31
+      type: String,
32
+      default: ''
33
+    },
34
+    artists: {
35
+      type: String,
36
+      default: ''
37
+    },
38
+    layerid: {
39
+      type: String,
40
+      default: ''
41
+    }
42
+  },
43
+  data() {
44
+    return {
45
+      musicList: {
46
+        title: '坐席', // 歌曲名称
47
+        artist: ' ', // 演唱者
48
+        src: '', // 音频文件的 URL
49
+        pic: 'https://moeplayer.b0.upaiyun.com/aplayer/secretbase.jpg'// 封面图片 URL
50
+      }
51
+    }
52
+  },
53
+  computed: {
54
+    ...mapGetters([
55
+      'avatar'
56
+    ])
57
+  },
58
+  beforeCreate() {
59
+    // 禁用在控制台打印出当前的版本标识
60
+    const vaplayer = VueAplayer
61
+    vaplayer.disableVersionBadge = true
62
+  },
63
+  created() {
64
+    this.musicList.artist = this.artists == "" ? "未知坐席" : this.artists
65
+    this.musicList.src = this.recFiles
66
+    this.musicList.pic = this.avatar
67
+    console.log(this.musicList.src)
68
+    console.log("musicList", this.musicList)
69
+  },
70
+  methods: {
71
+    btn_downlaod() {
72
+      window.location.href = this.recFiles
73
+      // const strFileName = this.recFiles.substring((this.recFiles.lastIndexOf('/') + 1))
74
+      // this.downloadUrl(this.recFiles, strFileName)
75
+    },
76
+    // 下载文件
77
+    downloadUrl(audioUrl, strFileName) {
78
+      const x = new XMLHttpRequest()
79
+      x.open('GET', audioUrl, true)
80
+      x.responseType = 'blob'
81
+      x.onload = function(e) {
82
+        download(x.response, strFileName)
83
+      }
84
+      x.send()
85
+    }
86
+  }
87
+}
88
+</script>
89
+
90
+<style rel="stylesheet/scss" lang="scss">
91
+	.audio_player{
92
+		padding:10px 0;
93
+		text-align: center;
94
+		.audio_btn{
95
+			margin-top: 16px;
96
+			width: 120px;
97
+		}
98
+		.aplayer-controller .aplayer-time .aplayer-volume-wrap+.aplayer-icon{
99
+			display: none;
100
+		}
101
+	}
102
+</style>

+ 12 - 0
CallCenterWeb.UI/RMYY/src/router/index.js

@@ -49,6 +49,18 @@ export const constantRouterMap = [
49 49
   {
50 50
     path: '',
51 51
     component: Layout,
52
+    name: '来电弹屏',
53
+    children: [{
54
+      path: 'callScreen',
55
+      component: () => import('@/views/callScreen/index'),
56
+      name: 'callScreen',
57
+      meta: { title: '来电弹屏', noCache: true }
58
+    }],
59
+    hidden: true
60
+  },
61
+  {
62
+    path: '',
63
+    component: Layout,
52 64
     redirect: 'dashboard', // 重定向地址,在面包屑中点击会重定向去的地址
53 65
     name: '首页',
54 66
     children: [{

+ 1 - 0
CallCenterWeb.UI/RMYY/src/store/getters.js

@@ -30,6 +30,7 @@ const getters = {
30 30
   telTopRightState: state => state.telWebsocket.telTopRightState, // 右上角状态信息
31 31
   telTopRightLamp: state => state.telWebsocket.telTopRightLamp, // 右上角指示灯状态
32 32
   telCallNum: state => state.telWebsocket.telCallNum, // 电话号码
33
+  screenState: state => state.telWebsocket.screenState, // 电话号码
33 34
   telTrunkNumber: state => state.telWebsocket.telTrunkNumber, // 中继号
34 35
   telCallType: state => state.telWebsocket.telCallType, // 通话类型
35 36
   telIsVisCallout: state => state.telWebsocket.telIsVisCallout, // 外呼操作面板是否显示

+ 0 - 2
CallCenterWeb.UI/RMYY/src/store/index.js

@@ -6,7 +6,6 @@ import user from './modules/user'
6 6
 import telWebsocket from './modules/telWebsocket'
7 7
 import tagsView from './modules/tagsView'
8 8
 import permission from './modules/permission'
9
-import lineChatSocket from './modules/lineChatSocket'
10 9
 import getters from './getters'
11 10
 
12 11
 Vue.use(Vuex)
@@ -18,7 +17,6 @@ const store = new Vuex.Store({
18 17
     user,
19 18
     telWebsocket,
20 19
     tagsView,
21
-    lineChatSocket,
22 20
     permission
23 21
   },
24 22
   getters

+ 0 - 114
CallCenterWeb.UI/RMYY/src/store/modules/lineChatSocket.js

@@ -1,114 +0,0 @@
1
-const lineChatSocket = {
2
-  state: {
3
-    linesConnected: false, // 是否连接
4
-    errorMsg: '', // 错误信息
5
-    messageCon: '', // 消息内容
6
-    isActive: false, // 聊天列表是否选中
7
-    noticeMsg: '', // 注意提示信息
8
-    listCode: '', // 客户code
9
-    userList: [], // 聊天成员信息
10
-    currentSessionId: null, // 当前选中的会话id
11
-    collUserCode: '', // 当前同事code
12
-    chatUserCode: '', // 客服code
13
-    currentName: '' // 当前选中的会话name
14
-  },
15
-  mutations: {
16
-    lineChatSOCKET_CONNECT(state) {
17
-      state.linesConnected = true
18
-    },
19
-    lineChatSOCKET_ERRORMSG(state, message) {
20
-      state.errorMsg = message
21
-    },
22
-
23
-    lineChatSOCKET_MESSAGECON(state, message) {
24
-      state.messageCon = message
25
-    },
26
-    lineChatSOCKET_LISTCODE(state, message) {
27
-      state.listCode = message
28
-    },
29
-    lineChatSOCKET_NOTICEMSG(state, message) {
30
-      state.noticeMsg = message
31
-    },
32
-    lineChatSOCKET_USERLIST(state, message) {
33
-      let ishasuser = false
34
-      for (const i of state.userList) {
35
-        if (i.sessionid === message.sessionid) {
36
-          ishasuser = true
37
-        }
38
-      }
39
-      if (!ishasuser) {
40
-        state.userList.push(message)
41
-      }
42
-      if (state.userList.length > 0) {
43
-        state.currentSessionId = state.userList[0].sessionid
44
-        state.currentName = state.userList[0].user.name
45
-        state.messageCon = state.userList[0]
46
-      }
47
-    },
48
-    lineChatSOCKET_CURRENTSESSIONID(state, message) {
49
-      state.currentSessionId = message.id
50
-      state.currentName = message.name
51
-    },
52
-    lineChatSOCKET_CHATUSERCODE(state, message) {
53
-      state.chatUserCode = message
54
-    },
55
-    lineChatSOCKET_COLLUSERCODE(state, message) {
56
-      state.collUserCode = message.code
57
-      state.currentName = message.name
58
-    }
59
-  },
60
-  actions: {
61
-    // 连接
62
-    IsConnectWs({
63
-      commit
64
-    }, msg) {
65
-      commit('lineChatSOCKET_CONNECT', msg)
66
-    },
67
-    // 错误消息
68
-    errorMsg({
69
-      commit
70
-    }, msg) {
71
-      commit('lineChatSOCKET_ERRORMSG', msg)
72
-    },
73
-    // 消息记录
74
-    appendMsg({
75
-      commit
76
-    }, msg) {
77
-      // commit('lineChatSOCKET_SELF',msg[0]);
78
-      commit('lineChatSOCKET_MESSAGECON', msg)
79
-      // commit('lineChatSOCKET_LISTCODE',msg[2]);
80
-    },
81
-    getNoticeMsg({
82
-      commit
83
-    }, msg) { // 返回提示信息
84
-      commit('lineChatSOCKET_NOTICEMSG', msg)
85
-    },
86
-    // 获取聊天成员信息
87
-    getUserList({
88
-      commit
89
-    }, msg) {
90
-      commit('lineChatSOCKET_USERLIST', msg)
91
-    },
92
-    // 获取选择的会话id
93
-    getSelectSessionId({
94
-      commit
95
-    }, msg) {
96
-      commit('lineChatSOCKET_CURRENTSESSIONID', msg)
97
-    },
98
-    // 获取客服code
99
-    getChatUserCode({
100
-      commit
101
-    }, msg) {
102
-      commit('lineChatSOCKET_CHATUSERCODE', msg)
103
-    },
104
-    // 获取同事code
105
-    getCollUsercode({
106
-      commit
107
-    }, msg) {
108
-      commit('lineChatSOCKET_COLLUSERCODE', msg)
109
-    }
110
-
111
-  }
112
-}
113
-
114
-export default lineChatSocket

+ 7 - 6
CallCenterWeb.UI/RMYY/src/store/modules/permission.js

@@ -39,13 +39,14 @@ function filterAsyncRouter(menudatas) {
39 39
       mflag = menudatas[i].F_MenuCode
40 40
       if (cpath && mflag) {
41 41
         if (menudatas[i].children && menudatas[i].children.length > 0 && cpath) {
42
-          // redirect = 'noredirect'
43
-          // fpath = ''
44
-          // furl = 'layout/Layout'
42
+          redirect = 'noredirect'
43
+          fpath = ''
44
+          furl = cpath
45 45
           accessedRouters.push({
46
-            path: '',
47
-            redirect: 'noredirect',
46
+            path: `${fpath}`,
47
+            redirect: redirect,
48 48
             name: firstToUpper(menudatas[i].F_MenuCode),
49
+            // component: () => import(`@/views/${furl}/index`),
49 50
             component: () => import('@/views/layout/Layout'),
50 51
             id: menudatas[i].F_Id,
51 52
             meta: {
@@ -123,7 +124,7 @@ const permission = {
123 124
         buttonDatas = data.buttonDatas
124 125
         const accessedRouters = filterAsyncRouter(menuDatas)
125 126
         accessedRouters.push({ path: '*', redirect: '/404', hidden: true })
126
-        console.log(accessedRouters[0])
127
+        console.log(accessedRouters)
127 128
         commit('SET_ROUTERS', accessedRouters)
128 129
         resolve()
129 130
       })

+ 4 - 0
CallCenterWeb.UI/RMYY/src/store/modules/telWebsocket.js

@@ -9,6 +9,7 @@ const telWebsocket = {
9 9
     telTopRightState: '未签入', // 右上角 状态提示信息
10 10
     telTopRightLamp: false, // 右上角 状态灯(默认 红色)
11 11
     telCallNum: '', // 顶部电话号码
12
+    screenState: '',
12 13
     telTrunkNumber: '', // 终极号
13 14
     telCallType: 'MakeCall', // 发送的通话类型(默认是外呼)
14 15
     telIsVisCallout: false, // 外呼操作面板是否显示
@@ -95,6 +96,9 @@ const telWebsocket = {
95 96
     },
96 97
     SOCKET_TELTASKISREFRESH(state, message) {
97 98
       state.telTaskIsRefresh = message
99
+    },
100
+    SOCKET_SCREENPOPUP(state, message) {
101
+      state.screenState = message
98 102
     }
99 103
   },
100 104
   actions: {

+ 1 - 1
CallCenterWeb.UI/RMYY/src/styles/sidebar.scss

@@ -4,7 +4,7 @@
4 4
     height: 100%;
5 5
     transition: margin-left .28s;
6 6
 
7
-    margin-left: 85px;
7
+    margin-left: 170px;
8 8
   }
9 9
   // 侧边栏
10 10
   .sidebar-container {

+ 3 - 3
CallCenterWeb.UI/RMYY/src/utils/telWebsocket.js

@@ -194,7 +194,7 @@ function signIn() {
194 194
     'Type': 'Login',
195 195
     'AgentID': store.getters.usercode,
196 196
     'AgentExten': store.getters.extension,
197
-    'AgentGroup': window.localStorage.getItem('groupCode'), // 坐席组id
197
+    'AgentGroup': '364', // 坐席组id window.localStorage.getItem('groupCode')
198 198
     'AgentType': '0',
199 199
     'DisposeTime': '0' // 话后处理时长设置,0代表一致话后处理,除非发送置闲 (按照历史习惯,字符串形式)
200 200
   }
@@ -399,7 +399,7 @@ function LineStateAgentBack(linedata) {
399 399
 function IncomingBack(inComingData) {
400 400
   const inComingCallId = inComingData.CallID
401 401
   let inComingNumber = inComingData.Number
402
-  // store.dispatch('screenPopUpBoole', 1)
402
+  store.dispatch('screenPopUpBoole', 1)
403 403
   // inComingNumber = inComingData.Number
404 404
   // console.log('xxxx', inComingNumber)
405 405
   if (inComingNumber.length > 11) {
@@ -431,7 +431,7 @@ function IncomingBack(inComingData) {
431 431
 function DropCallBack() {
432 432
   store.dispatch('ChangeCallNum', '') // 顶部电话号码('')
433 433
   store.dispatch('ChangeCallType', 'MakeCall') // 发送的通话类型(默认是外呼)
434
-  // store.dispatch('screenPopUpBoole', 0)
434
+  store.dispatch('screenPopUpBoole', 0)
435 435
   // 当前在坐席监控中需要 更新坐席监控内坐席的状态
436 436
   const curentViews = store.state.tagsView.visitedViews
437 437
   for (let i = 0, len = curentViews.length; i < len; i++) {

+ 306 - 0
CallCenterWeb.UI/RMYY/src/views/callScreen/components/AddOrEditCustomer.vue

@@ -0,0 +1,306 @@
1
+<template>
2
+  <div v-loading="loading">
3
+    <el-row :gutter="5">
4
+      <el-col :span="20">
5
+
6
+        <el-form
7
+          ref="ruleForm"
8
+          :model="ruleForm"
9
+          label-width="100px"
10
+          style="font-size: 14px"
11
+          class="order_form">
12
+          <el-row>
13
+            <el-col :span="6">
14
+              <el-form-item label="客户代码" prop="code">
15
+                <el-input v-model="ruleForm.code" placeholder="请输入客户代码" />
16
+              </el-form-item>
17
+            </el-col>
18
+            <el-col :span="6">
19
+              <el-form-item label="客户名称" prop="name">
20
+                <el-input v-model="ruleForm.name" placeholder="请输入客户名称" />
21
+              </el-form-item>
22
+            </el-col>
23
+            <el-col :span="6">
24
+              <el-form-item label="级别" prop="layer">
25
+                <el-input v-model="ruleForm.layer" type="number" placeholder="请输入客户级别" />
26
+              </el-form-item>
27
+            </el-col>
28
+            <el-col :span="6">
29
+              <el-form-item label="手机" prop="mobile">
30
+                <el-input v-model="ruleForm.mobile" placeholder="请输入手机号码" />
31
+              </el-form-item>
32
+            </el-col>
33
+          </el-row>
34
+          <el-row>
35
+            <el-col :span="6">
36
+              <el-form-item label="电话" prop="telphone">
37
+                <el-input v-model="ruleForm.telphone" placeholder="请输入客户电话" />
38
+              </el-form-item>
39
+            </el-col>
40
+            <el-col :span="6">
41
+              <el-form-item label="传真" prop="fax">
42
+                <el-input v-model="ruleForm.fax" placeholder="请输入客户传真" />
43
+              </el-form-item>
44
+            </el-col>
45
+            <el-col :span="6">
46
+              <el-form-item label="邮编" prop="postcode">
47
+                <el-input v-model="ruleForm.postcode" placeholder="请输入客户邮编" />
48
+              </el-form-item>
49
+            </el-col>
50
+            <el-col :span="6">
51
+              <el-form-item label="邮件" prop="email">
52
+                <el-input v-model="ruleForm.email" placeholder="请输入客户邮件" />
53
+              </el-form-item>
54
+            </el-col>
55
+          </el-row>
56
+          <el-row>
57
+            <el-col :span="6">
58
+              <el-form-item label="性别" prop="sex">
59
+                <el-input v-model="ruleForm.sex" placeholder="请输入性别" />
60
+              </el-form-item>
61
+            </el-col>
62
+            <el-col :span="6">
63
+
64
+              <el-form-item label="省" prop="province">
65
+                <el-input v-model="ruleForm.province" placeholder="请输入省" />
66
+              </el-form-item>
67
+            </el-col>
68
+            <el-col :span="6">
69
+              <el-form-item label="市" prop="city">
70
+                <el-input v-model="ruleForm.city" placeholder="请输入市" />
71
+              </el-form-item>
72
+            </el-col>
73
+            <el-col :span="6">
74
+              <el-form-item label="区县" prop="county">
75
+                <el-input v-model="ruleForm.county" placeholder="请输入区县" />
76
+              </el-form-item>
77
+            </el-col>
78
+          </el-row>
79
+          <el-row>
80
+            <el-col :span="6">
81
+              <el-form-item label="客户住址" prop="adddress">
82
+                <el-input v-model="ruleForm.adddress" placeholder="请输入客户住址" />
83
+              </el-form-item>
84
+            </el-col>
85
+          </el-row>
86
+          <el-form-item>
87
+            <el-button type="primary" @click="submitForm">保存</el-button>
88
+          </el-form-item>
89
+        </el-form>
90
+      </el-col>
91
+    </el-row>
92
+  </div>
93
+</template>
94
+
95
+<script>
96
+import { addOrEditCustomerList, getCustomerList } from '@/api/customerManagement/customerList'
97
+import { validateTel } from '@/utils/validate'
98
+import { mapGetters } from 'vuex'
99
+export default {
100
+  name: 'AddOrEdit',
101
+  props: {
102
+    callinNum: {
103
+      type: String,
104
+      default: ''
105
+    }
106
+  },
107
+
108
+  data() {
109
+    var phoneNumbersinput = (rule, value, callback) => {
110
+      if (value !== '') { // 不为空的时候进行验证
111
+        validateTel(value) ? callback() : callback(new Error('联系电话格式错误'))
112
+      } else { // 为空的时候就直接放过去(这里一定要写,不然既不报错也不会往下走【应该和router的next()相同】)
113
+        callback()
114
+      }
115
+    }
116
+    return {
117
+      rowid: 0,
118
+      ruleForm: {
119
+        id: 0, // 客户id
120
+        code: '', // 客户代码
121
+        name: '', // 客户名称
122
+        layer: '', // 客户等级
123
+        mobile: '', // 客户手机
124
+        telphone: '', // 客户电话
125
+        fax: '', // 客户传真
126
+        postcode: '', // 客户邮编
127
+        email: '', // 客户邮件
128
+        sex: '', // 性别
129
+        province: '', // 省
130
+        city: '', // 市
131
+        county: '', // 区县
132
+        adddress: '' // 客户住址
133
+      },
134
+      rules: {
135
+        name: [
136
+          {
137
+            required: true,
138
+            trigger: 'blur',
139
+            message: '请输入客户名称!'
140
+          }
141
+        ],
142
+        code: [{
143
+          required: true,
144
+          trigger: 'blur',
145
+          message: '请输入客户代码!'
146
+        }],
147
+        mobile: [
148
+          {
149
+            required: false,
150
+            validator: phoneNumbersinput,
151
+            trigger: 'blur'
152
+
153
+          }
154
+        ]
155
+      },
156
+      loading: false,
157
+      isButton: true
158
+    }
159
+  },
160
+  computed: {
161
+    ...mapGetters(['screenState'])
162
+  },
163
+  watch: {
164
+    screenState: function() {
165
+      console.log('watch---' + this.screenState)
166
+      console.log('watch---' + this.callinNum)
167
+      // if (this.callinNum.length === 4) {
168
+      //   return
169
+      // }
170
+      if (this.screenState && this.callinNum) {
171
+        this.getList()
172
+      }
173
+    }
174
+  },
175
+  created() {
176
+    // if (this.callinNum.length === 4) {
177
+    //   return
178
+    // }
179
+    console.log(this.callinNum + '--121212121212')
180
+    if (this.callinNum) {
181
+      this.getList()
182
+    }
183
+  },
184
+
185
+  methods: {
186
+    submitForm() {
187
+      this.$emit('fromChild', this.ruleForm.cusName)
188
+      console.log(this.rowid)
189
+      this.$refs.ruleForm.validate((valid) => {
190
+        if (valid) {
191
+          this.loading = true
192
+          const data = {
193
+            id: this.rowid,
194
+            code: this.ruleForm.code, // 客户代码 string
195
+            name: this.ruleForm.name, // 客户名称 string
196
+            layer: this.ruleForm.layer, // 客户级别 string
197
+            mobile: this.ruleForm.mobile, // 客户手机 string
198
+            telphone: this.ruleForm.telphone, // 客户电话 string
199
+            fax: this.ruleForm.fax, // 客户传真 string
200
+            postcode: this.ruleForm.postcode, // 客户邮编 string
201
+            email: this.ruleForm.email, // 客户邮件 string
202
+            sex: this.ruleForm.sex, // 客户性别 string
203
+            province: this.ruleForm.province, // 省 string
204
+            city: this.ruleForm.city, // 市 string
205
+            county: this.ruleForm.county, // 区 string
206
+            adddress: this.ruleForm.adddress // 客户住址 string
207
+          }
208
+          // 添加
209
+          if (!this.rowid) {
210
+            addOrEditCustomerList(data)
211
+              .then((response) => {
212
+                this.loading = false
213
+                if (response.state.toLowerCase() === 'success') {
214
+                  this.$message({
215
+                    message: '恭喜你,添加成功!',
216
+                    type: 'success',
217
+                    duration: 1000
218
+                  })
219
+                  // this.$emit('cus-info-list', res)
220
+                } else {
221
+                  this.$message({
222
+                    message: '添加失败,该客户已存在!',
223
+                    type: 'success',
224
+                    duration: 1000
225
+                  })
226
+                }
227
+              })
228
+              .catch((response) => {
229
+                this.loading = false
230
+              })
231
+            return
232
+          }
233
+          // 编辑
234
+          addOrEditCustomerList(data)
235
+            .then((response) => {
236
+              this.loading = false
237
+              if (response.state.toLowerCase() === 'success') {
238
+                this.$message({
239
+                  message: '恭喜你,客户信息编辑成功!',
240
+                  type: 'success',
241
+                  duration: 1000
242
+                })
243
+              }
244
+            })
245
+            .catch(() => {
246
+              this.loading = false
247
+            })
248
+        } else {
249
+          this.$message({
250
+            type: 'error',
251
+            message: '请输入有效的必填项信息!',
252
+            offset: 50,
253
+            duration: 1000
254
+          })
255
+          return false
256
+        }
257
+      })
258
+    },
259
+    // 获取详情
260
+    getList() {
261
+      return new Promise((resolve) => {
262
+        const params = {
263
+          pageindex: 1, // int 第几页
264
+          pagesize: 99, // int 每页几条信息
265
+          telephone: this.callinNum.toString() // 联系电话
266
+        }
267
+        getCustomerList(params).then((response) => {
268
+          this.loading = false
269
+          if (response.state.toLowerCase() === 'success') {
270
+            const res = response.rows[0]
271
+            console.log(res)
272
+            this.rowid = res.F_CustomerId
273
+            this.ruleForm.code = res.F_CustomerCode // 客户代码
274
+            this.ruleForm.name = res.F_CustomerName // 客户名称
275
+            this.ruleForm.layer = res.F_Layer // 客户级别
276
+            this.ruleForm.mobile = res.F_Mobile // 客户手机
277
+            this.ruleForm.telphone = res.F_Telephone // 客户电话
278
+            this.ruleForm.fax = res.F_Fax // 客户传真
279
+            this.ruleForm.postcode = res.F_PostCode // 客户邮编
280
+            this.ruleForm.email = res.F_Email // 客户邮件
281
+            this.ruleForm.sex = res.F_Sex // 性别
282
+            this.ruleForm.province = res.F_Province // 省
283
+            this.ruleForm.city = res.F_City // 市
284
+            this.ruleForm.county = res.F_County // 区
285
+            this.ruleForm.adddress = res.F_Address // 客户住址
286
+            this.$emit('cus-info-list', res)
287
+          }
288
+        })
289
+        resolve()
290
+      })
291
+    }
292
+  }
293
+}
294
+</script>
295
+
296
+<style rel="stylesheet/scss" lang="scss">
297
+	.order_form {
298
+		.form_select {
299
+			width: 100%;
300
+		}
301
+
302
+		.form_date {
303
+			width: 100%;
304
+		}
305
+	}
306
+</style>

+ 165 - 0
CallCenterWeb.UI/RMYY/src/views/callScreen/components/CustomerList.vue

@@ -0,0 +1,165 @@
1
+<template>
2
+  <div v-loading="loading">
3
+    <el-table :data="dataLists" border stripe>
4
+      <el-table-column prop="callSerialNo" label="流水号" align="center" min-width />
5
+      <el-table-column prop="customerName" label="来电人" align="center" min-width />
6
+      <el-table-column prop="callerNumber" label="来电号码" align="center" min-width />
7
+      <el-table-column prop="ringStartTime" label="来电时间" align="center" min-width />
8
+      <el-table-column prop="periodTalking" label="通话时长" align="center" min-width />
9
+      <el-table-column prop="employeeName" label="坐席名称" align="center" min-width />
10
+      <!-- <el-table-column label="录音" align="center" min-width>
11
+        <template slot-scope="scope">
12
+          <svg-icon
13
+            v-if="scope.row.FilePath"
14
+            class="rec_file"
15
+            icon-class="bofangluyin"
16
+            @click.native="playSound(scope.row.FilePath, scope.row.agent_code)"
17
+          />
18
+          <span v-else>-</span>
19
+        </template>
20
+      </el-table-column> -->
21
+    </el-table>
22
+    <pagination
23
+      v-show="pageParams.total > 0"
24
+      :total="pageParams.total"
25
+      :pageindex.sync="pageParams.pageindex"
26
+      :pagesize.sync="pageParams.pagesize"
27
+      :auto-scroll="false"
28
+      class="pagination"
29
+      @pagination="getList"
30
+    />
31
+    <!-- @pagination="getList" -->
32
+  </div>
33
+</template>
34
+
35
+<script>
36
+
37
+import { getCallRecords } from '@/api/trafficData/trafficData'
38
+import audioPlayer from '@/components/audioPlayer'
39
+import Pagination from '@/components/Pagination' // 对el-pagination 二次封装
40
+export default {
41
+  name: 'CallRecordList',
42
+  components: {
43
+    Pagination
44
+  },
45
+  filters: {
46
+    // 呼叫类型
47
+    calltypeFilter(status) {
48
+      const statusMap = {
49
+        0: '呼入',
50
+        1: '呼出'
51
+      }
52
+      return statusMap[status]
53
+    },
54
+    // 呼叫状态
55
+    statusFilter(status) {
56
+      const statusMap = {
57
+        0: '未接通',
58
+        1: '已接通'
59
+      }
60
+      return statusMap[status]
61
+    },
62
+    // 外呼类型
63
+    callopttypeFilter(status) {
64
+      const statusMap = {
65
+        0: '拨号外呼',
66
+        1: '回访外呼'
67
+      }
68
+      return statusMap[status]
69
+    },
70
+    // 处理方式
71
+    dealtypeFilter(status) {
72
+      const statusMap = {
73
+        0: 'IVR处理',
74
+        1: '骚扰电话',
75
+        2: '自助服务',
76
+        3: '转值班电话',
77
+        4: '留言',
78
+        5: '呼损',
79
+        6: '人工处理'
80
+      }
81
+      return statusMap[status]
82
+    },
83
+    // 时间格式化
84
+    timesFilter(tm) {
85
+      if (tm === '1970-01-01 08:00:00') {
86
+        return '-'
87
+      } else {
88
+        return tm
89
+      }
90
+    }
91
+  },
92
+  props: {
93
+    callinNum: {
94
+      type: String,
95
+      default: ''
96
+    }
97
+  },
98
+  data() {
99
+    return {
100
+      callNum: '', // 来电号码
101
+      loading: false,
102
+      recordpath: '', // 录音的路径
103
+      pageParams: {
104
+        pageindex: 1, // 当前第几页
105
+        pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
106
+        total: 0 // 总共多少数据
107
+      },
108
+      dataLists: [] // 列表数据
109
+    }
110
+  },
111
+  created() {
112
+    if (this.callinNum === '') {
113
+      this.callNum = '-1'
114
+    } else {
115
+      this.callNum = this.callinNum
116
+    }
117
+    this.getList()
118
+  },
119
+  methods: {
120
+    getList() {
121
+      this.loading = true
122
+      return new Promise(resolve => {
123
+        const params = {
124
+          pageindex: this.pageParams.pageindex, // 第几页
125
+          pagesize: this.pageParams.pagesize, // 每页几条信息
126
+          callerNumber: this.callNum, //	否	string	模糊查询(呼叫号码)
127
+          employeeName: '', //	否	string	模糊查询(呼叫号码) CallNumber
128
+          callType: '', // 呼叫类型
129
+          beginTime: '',
130
+          endTime: ''
131
+        }
132
+        getCallRecords(params).then(response => {
133
+          this.loading = false
134
+          if (response.state.toLowerCase() === 'success') {
135
+            this.recordpath = response.data.recordpath
136
+            if (response.total == null) {
137
+              this.pageParams.total = 0
138
+            } else {
139
+              this.pageParams.total = response.total
140
+            }
141
+            this.dataLists = response.data
142
+          }
143
+        })
144
+        resolve()
145
+      })
146
+    },
147
+    // 播放录音
148
+    playSound(rec_file, artist) {
149
+      this.$layer.iframe({
150
+        content: {
151
+          content: audioPlayer, // 传递的组件对象
152
+          parent: this, // 当前的vue对象
153
+          data: { 'recFiles': rec_file, 'artists': artist }// props//该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
154
+        },
155
+        area: ['600px', '230px'],
156
+        shadeClose: true,
157
+        title: '录音详情'
158
+      })
159
+    }
160
+  }
161
+}
162
+</script>
163
+
164
+<style rel="stylesheet/scss" lang="scss" scoped>
165
+</style>

+ 111 - 0
CallCenterWeb.UI/RMYY/src/views/callScreen/components/OrderList.vue

@@ -0,0 +1,111 @@
1
+<template>
2
+  <div v-loading="loading">
3
+    <el-table :data="dataLists" border stripe>
4
+      <el-table-column prop="CallNumber" label="电话号码" align="center" min-width />
5
+      <el-table-column label="呼叫状态" align="center" min-width>
6
+        <template slot-scope="scope">
7
+          <el-tag :type="scope.row.CallState === 1 ? 'success' : 'danger'" size="mini" disable-transitions>{{ scope.row.CallState | statusFilter }}</el-tag>
8
+        </template>
9
+      </el-table-column>
10
+      <el-table-column prop="UserCode" label="坐席工号" align="center" min-width />
11
+      <el-table-column prop="UserName" label="坐席姓名" align="center" min-width />
12
+      <el-table-column prop="TalkStartTime" label="通话开始时间" align="center" min-width />
13
+      <el-table-column prop="TalkEndTime" label="通话结束时间" align="center" min-width />
14
+    </el-table>
15
+    <pagination
16
+      v-show="pageParams.total > 0"
17
+      :total="pageParams.total"
18
+      :pageindex.sync="pageParams.pageindex"
19
+      :pagesize.sync="pageParams.pagesize"
20
+      :auto-scroll="false"
21
+      class="pagination"
22
+      @pagination="getList"
23
+    />
24
+  </div>
25
+</template>
26
+
27
+<script>
28
+
29
+import { getCallRecords } from '@/api/trafficData/trafficData'
30
+import Pagination from '@/components/Pagination' // 对el-pagination 二次封装
31
+export default {
32
+  name: 'CallRecordList',
33
+  components: {
34
+    Pagination
35
+  },
36
+  filters: {
37
+    // 呼叫状态
38
+    statusFilter(status) {
39
+      const statusMap = {
40
+        0: '未接通',
41
+        1: '已接通'
42
+      }
43
+      return statusMap[status]
44
+    },
45
+    // 时间格式化
46
+    timesFilter(tm) {
47
+      if (tm === '1970-01-01 08:00:00') {
48
+        return '-'
49
+      } else {
50
+        return tm
51
+      }
52
+    }
53
+  },
54
+  props: {
55
+    callinNum: {
56
+      type: String,
57
+      default: ''
58
+    }
59
+  },
60
+
61
+  data() {
62
+    return {
63
+      callNum: '', // 来电号码
64
+      loading: false,
65
+      pageParams: {
66
+        pageindex: 1, // 当前第几页
67
+        pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
68
+        total: 0 // 总共多少数据
69
+      },
70
+      dataLists: [] // 列表数据
71
+    }
72
+  },
73
+  created() {
74
+    if (this.callinNum === '') {
75
+      this.callNum = '-1'
76
+    } else {
77
+      this.callNum = this.callinNum
78
+    }
79
+    console.log(this.callinNum)
80
+    this.getList()
81
+  },
82
+  methods: {
83
+    getList() {
84
+      this.loading = true
85
+      return new Promise(resolve => {
86
+        const params = {
87
+          pageindex: this.pageParams.pageindex, // 第几页
88
+          pagesize: this.pageParams.pagesize, // 每页几条信息
89
+          callerNumber: this.callNum, //	否	string	模糊查询(呼叫号码)
90
+          callType: 1 // 呼叫类型
91
+        }
92
+        getCallRecords(params).then(response => {
93
+          this.loading = false
94
+          if (response.state.toLowerCase() === 'success') {
95
+            if (response.total == null) {
96
+              this.pageParams.total = 0
97
+            } else {
98
+              this.pageParams.total = response.total
99
+            }
100
+            this.dataLists = response.rows
101
+          }
102
+        })
103
+        resolve()
104
+      })
105
+    }
106
+  }
107
+}
108
+</script>
109
+
110
+<style rel="stylesheet/scss" lang="scss" scoped>
111
+</style>

+ 416 - 0
CallCenterWeb.UI/RMYY/src/views/callScreen/components/callScreen.vue

@@ -0,0 +1,416 @@
1
+<template>
2
+  <div>
3
+    <el-col :md="24" class="right_wrap">
4
+      <el-card shadow="hover" class="callin_header">
5
+        <el-row style="padding: 8px 0 !important; ">
6
+
7
+          <el-col style="width:110px">
8
+            <p class="callin_con">
9
+              <span class="callin_num">{{ callinNum }}</span>
10
+            </p>
11
+          </el-col>
12
+          <!-- <el-col :span="5">
13
+            <p class="callin_con">
14
+              <span class="callin_address">归属地:{{ phoneData }}</span>
15
+            </p>
16
+          </el-col> -->
17
+          <el-col :span="6">
18
+            <h5 class="callin_name">
19
+              {{ cusInfo.cusname }}
20
+            </h5>
21
+          </el-col>
22
+          <el-col :span="4">
23
+            <p class="callin_con callin_time">
24
+              <time v-show="!dropoff">当前通话时长:{{ telCallTime.hh }}:{{ telCallTime.mm }}:{{
25
+                telCallTime.ss
26
+              }}</time>
27
+              <time v-show="dropoff">当前通话时长:{{ callinTime }}</time>
28
+            </p>
29
+          </el-col>
30
+        </el-row>
31
+      </el-card>
32
+    </el-col>
33
+    <!-- 客户信息 -->
34
+    <el-col :span="24">
35
+      <div class="msgbox">客户信息</div>
36
+      <el-card class="customer_info">
37
+        <AddOrEditCustomer
38
+          :callin-num="callinNum"
39
+          @cus-info-list="getCusInfos"
40
+          @fromChild="getChild"/>
41
+      </el-card>
42
+    </el-col>
43
+    <!-- tab切换 -->
44
+    <el-col :span="24">
45
+      <el-card shadow="hover" class="records">
46
+        <el-tabs v-model="activeName" @tab-click="handleClick">
47
+          <el-tab-pane label="历史通话记录" name="first">
48
+            <div class="tab_body">
49
+              <OrderList ref="callListEl" :callin-num="callinNum" :callid="callinCallid" />
50
+            </div>
51
+          </el-tab-pane>
52
+        </el-tabs>
53
+      </el-card>
54
+    </el-col>
55
+  </div>
56
+</template>
57
+
58
+<script>
59
+import OrderList from './OrderList'
60
+import AddOrEditCustomer from './AddOrEditCustomer'
61
+import { mapGetters } from 'vuex'
62
+export default {
63
+  name: 'CallScreenComponent',
64
+  components: {
65
+    OrderList,
66
+    AddOrEditCustomer
67
+  },
68
+  data() {
69
+    return {
70
+      phoneData: '', // 归属地
71
+      // 咨询类型级联
72
+      activeName: 'first', // tab切换默认显示来电历史工单
73
+      callinNum: '', // 来电号码
74
+      callinTime: '00:00:00', // 通话时长
75
+      telTimer: null, // 时间定时器
76
+      callinCallid: '', // 来电id
77
+      dropoff: false, // 是否挂断
78
+      cusInfo: {
79
+        // 客户信息
80
+        cusname: '未知', // 客户姓名
81
+        customertype: '潜在客户', // 客户类型
82
+        customerCode: '' // 客户代码
83
+      }
84
+    }
85
+  },
86
+
87
+  computed: {
88
+    ...mapGetters([
89
+      'zxbh',
90
+      'telCallNum', // 顶部显示号码
91
+      'telCallTime',
92
+      'telLineState'
93
+    ])
94
+  },
95
+  watch: {
96
+    telLineState: function(newT, oldT) {
97
+      this.watchTelLineState(newT, oldT)
98
+    }
99
+  },
100
+  created() {
101
+    this.callinNum = this.telCallNum // 来电号码  $route.params.telInNumber
102
+    this.callinCallid = this.inComingCallId
103
+
104
+    if (this.callinNum) {
105
+      this.calladdress()
106
+    }
107
+  },
108
+  methods: {
109
+    // 同步客户信息
110
+    getChild(v) { },
111
+    // 归属地
112
+    calladdress() {
113
+      // getCallOutprefix(this.callinNum).then((response) => {
114
+      //   if (response.state.toLowerCase() === 'success') {
115
+      //     const res = response.data
116
+
117
+      //     if (res && res.mobileData) {
118
+      //       this.phoneData = res.mobileData.cityDes
119
+      //     }
120
+      //   }
121
+      // })
122
+    },
123
+    // 通话时间
124
+    callTimeFun() {
125
+      // 通话时间重置为00:00:00
126
+      // 时间 计时
127
+      let _n = 0
128
+      if (this.telTimer) {
129
+        clearInterval(this.telTimer)
130
+      }
131
+      this.telTimer = setInterval(() => {
132
+        _n++
133
+        this.callTime = {
134
+          hh: this.toDub(parseInt((_n / 60 / 60) % 60)), // 小时
135
+          mm: this.toDub(parseInt((_n / 60) % 60)), // 分钟
136
+          ss: this.toDub(parseInt(_n % 60)) // 秒
137
+        }
138
+      }, 1000)
139
+    },
140
+    toDub(i) {
141
+      return i < 10 ? '0' + i : '' + i
142
+    },
143
+
144
+    // 清除定时器
145
+    clearInter() {
146
+      clearInterval(this.telTimer)
147
+    },
148
+    // 监听 线路状态
149
+    watchTelLineState(newT, oldT) {
150
+      if (newT === 1) {
151
+        if (this.telTimer) {
152
+          clearInterval(this.telTimer)
153
+          this.telTimer = null
154
+        }
155
+        this.dropoff = true // 是否挂断
156
+        this.callinTime = `${this.telCallTime.hh}:${this.telCallTime.mm}:${this.telCallTime.ss}`
157
+      }
158
+    },
159
+    changeGateway(data) {
160
+    },
161
+    // tab 切换
162
+    handleClick(tab, event) {
163
+      if (tab.name === 'first') {
164
+        this.getHistoryList(tab.name)
165
+      } else if (tab.name === 'second') {
166
+        this.getOrderList(tab.name)
167
+      } else if (tab.name === 'third') {
168
+        this.getCusProList(tab.name)
169
+      }
170
+    },
171
+    // 获取历史工单列表
172
+    getHistoryList(acname) {
173
+      if (!acname) {
174
+        this.activeName = 'first'
175
+      }
176
+      this.$refs.callListEl.getList()
177
+    },
178
+    // 获取历史通话记录
179
+    getOrderList(acname) {
180
+      if (!acname) {
181
+        this.activeName = 'second'
182
+      }
183
+      this.$refs.orderListEl.getList()
184
+    },
185
+    // 获取客户历史通话记录
186
+    getCusProList(acname) {
187
+      if (!acname) {
188
+        this.activeName = 'third'
189
+      }
190
+      this.$refs.cutomerListEl.getList()
191
+    },
192
+    // 获取毫秒数
193
+    getTime() {
194
+      const timer = new Date()
195
+      const timer2 = timer.getTime()
196
+      return timer2
197
+    },
198
+    // 获取客户信息
199
+    getCusInfos(data) {
200
+      console.log(data)
201
+      if (data) {
202
+        this.cusInfo.cusname = data.F_CustomerName
203
+      }
204
+    }
205
+  }
206
+}
207
+</script>
208
+
209
+<style scoped>
210
+	.order_form .el-form-item--mini.el-form-item,
211
+	.el-form-item--small.el-form-item {
212
+		margin-bottom: 5px !important;
213
+	}
214
+</style>
215
+<style rel="stylesheet/scss" lang="scss" scoped="scoped">
216
+	.el-tabs__header {
217
+		margin: 0;
218
+	}
219
+
220
+	.te .el-textarea__inner {
221
+		line-height: 1 !important;
222
+	}
223
+</style>
224
+<style rel="stylesheet/scss" lang="scss" scoped>
225
+	.app-container {
226
+		margin: 0;
227
+		padding: 0;
228
+	}
229
+
230
+	.msgbox {
231
+		width: 100%;
232
+		height: 25px;
233
+		line-height: 25px;
234
+		border-radius: 5px;
235
+		padding-left: 5px;
236
+		color: #f5f5f6;
237
+		background-color: #409eff;
238
+	}
239
+
240
+	.text {
241
+		font-size: 14px;
242
+	}
243
+
244
+	.callin_custype {
245
+		color: red;
246
+		font-size: 14px;
247
+	}
248
+
249
+	.callin_btn {
250
+		width: 36px;
251
+		height: 36px;
252
+		display: inline-block;
253
+		margin-left: 10px;
254
+		cursor: pointer;
255
+	}
256
+
257
+	.callin_header {
258
+		margin-top: 15px;
259
+
260
+		.incall_avatar {
261
+			width: 106px;
262
+			height: 106px;
263
+			vertical-align: middle;
264
+			border-radius: 50%;
265
+		}
266
+
267
+		.callin_name {
268
+			font-size: 16px;
269
+			color: #333333;
270
+			margin: 0;
271
+			font-weight: 400;
272
+
273
+			.callin_custype {
274
+				color: #5092e1;
275
+				font-size: 14px;
276
+			}
277
+		}
278
+
279
+		.callin_con {
280
+			margin: 0;
281
+			padding: 0;
282
+			font-size: 14px;
283
+			color: #4c4c4c;
284
+		}
285
+
286
+		.callin_num {
287
+			font-size: 16px;
288
+			color: #5092e1;
289
+		}
290
+
291
+		.callin_address {
292
+			color: rgb(214, 113, 18);
293
+		}
294
+
295
+		.callin_time {
296
+			color: #808080;
297
+		}
298
+
299
+		.callin_btns {
300
+			position: absolute;
301
+			right: 0;
302
+			top: 0;
303
+		}
304
+
305
+		.callin_btn {
306
+			width: 36px;
307
+			height: 36px;
308
+			display: inline-block;
309
+			margin-left: 10px;
310
+			cursor: pointer;
311
+		}
312
+
313
+		.callinorder {
314
+			background: url(../../../assets/imgs/callinorder.png) center center no-repeat;
315
+		}
316
+
317
+		.callinuser {
318
+			background: url(../../../assets/imgs/callinuser.png) center center no-repeat;
319
+		}
320
+
321
+		.callinpro {
322
+			background: url(../../../assets/imgs/xiangmu.png) center center no-repeat;
323
+		}
324
+
325
+		.callinblack {
326
+			background: url(../../../assets/imgs/callinblack.png) center center no-repeat;
327
+		}
328
+
329
+		.callincelblack {
330
+			background: url(../../../assets/imgs/callincelblack.png) center center no-repeat;
331
+		}
332
+
333
+		.callinivr {
334
+			background: url(../../../assets/imgs/callinivr.png) center center no-repeat;
335
+		}
336
+	}
337
+
338
+	.customer_info {
339
+		margin-top: 15px;
340
+
341
+		.customer_title {
342
+			font-size: 14px;
343
+			color: #333333;
344
+			font-weight: 400;
345
+			margin-top: 0;
346
+			margin-bottom: 20px;
347
+		}
348
+
349
+		.customer_cons {
350
+			background-color: #f5f5f6;
351
+			padding: 15px;
352
+			font-size: 12px;
353
+			color: #666666;
354
+
355
+			.customer_item {
356
+				line-height: 12px;
357
+				margin-bottom: 20px;
358
+			}
359
+		}
360
+	}
361
+
362
+	.customer_info {
363
+		width: 99%;
364
+		margin: 15px auto 0 auto;
365
+		border-radius: 4px;
366
+
367
+		.makeOrder {
368
+			margin-bottom: 15px;
369
+			line-height: 40px;
370
+			height: 40px;
371
+			font-size: 12px;
372
+			border-bottom: 1px solid #8a8686;
373
+		}
374
+
375
+		.customer_title {
376
+			font-size: 14px;
377
+			color: #333333;
378
+			font-weight: 400;
379
+			margin-top: 0;
380
+			margin-bottom: 20px;
381
+		}
382
+
383
+		.customer_cons {
384
+			background-color: #f5f5f6;
385
+			padding: 15px;
386
+			font-size: 12px;
387
+			color: #666666;
388
+
389
+			.customer_item {
390
+				line-height: 12px;
391
+				margin-bottom: 20px;
392
+			}
393
+		}
394
+	}
395
+
396
+	.records {
397
+		width: 99%;
398
+		margin: 15px auto 0 auto;
399
+		border-radius: 4px;
400
+	}
401
+
402
+	.order_form {
403
+		.form_select {
404
+			width: 100%;
405
+		}
406
+
407
+		.form_date {
408
+			width: 100%;
409
+		}
410
+
411
+		.col_select_text {
412
+			text-align: right;
413
+			padding-right: 15px;
414
+		}
415
+	}
416
+</style>

+ 117 - 0
CallCenterWeb.UI/RMYY/src/views/callScreen/index.vue

@@ -0,0 +1,117 @@
1
+<template>
2
+  <keep-alive>
3
+    <div class="app-container tanping">
4
+      <el-tabs v-model="editableTabsValue" type="card" closable @tab-remove="removeTab">
5
+        <el-tab-pane v-for="item in editableTabs" :key="item.name" :label="item.title" :name="item.name">
6
+          <CallScreenComponent @childByValue="childByValue" />
7
+        </el-tab-pane>
8
+      </el-tabs>
9
+    </div>
10
+  </keep-alive>
11
+</template>
12
+
13
+<script>
14
+import CallScreenComponent from './components/callScreen'
15
+import {
16
+  mapGetters
17
+} from 'vuex'
18
+export default {
19
+  name: 'CallScreen',
20
+  components: {
21
+    CallScreenComponent
22
+  },
23
+  data() {
24
+    return {
25
+      editableTabsValue: '1',
26
+      editableTabs: [{
27
+        title: '来电弹屏',
28
+        name: '1'
29
+      }],
30
+      editableTabs2: [],
31
+      callinNum: '',
32
+      chulidval: ''
33
+    }
34
+  },
35
+  computed: {
36
+    ...mapGetters([
37
+      'zxbh',
38
+      'telCallNum', // 顶部显示号码
39
+      'screenState',
40
+      'telCallTime'
41
+    ])
42
+  },
43
+  watch: {
44
+    telCallNum: function() {
45
+      console.log(this.screenState)
46
+      if (this.telCallNum && this.screenState) {
47
+        this.addTab()
48
+      }
49
+    }
50
+  },
51
+  created() {
52
+    if (this.telCallNum) {
53
+      this.editableTabs[0].title = this.telCallNum
54
+      this.editableTabs[0].name = this.telCallNum
55
+      this.editableTabsValue = this.telCallNum
56
+      this.callinNum = this.telCallNum
57
+    }
58
+  },
59
+  mounted() {},
60
+  methods: {
61
+    // 获取值
62
+
63
+    childByValue(childValue) {
64
+      this.chulidval = childValue
65
+      console.log('6.7', this.chulidval)
66
+      this.removeTab(this.chulidval)
67
+    },
68
+    addTab() {
69
+      if (this.editableTabs.some(v => v.name === this.telCallNum)) return
70
+      const newTabName = this.telCallNum
71
+      this.editableTabs.push({
72
+        title: newTabName,
73
+        name: newTabName
74
+        // content: newTabName%2 == 0 ? 'test' : 'test2'
75
+      })
76
+      this.editableTabsValue = newTabName
77
+    },
78
+    removeTab(targetName) {
79
+      if (this.chulidval) {
80
+        targetName = this.chulidval
81
+      }
82
+      const tabs = this.editableTabs
83
+      let activeName = this.editableTabsValue
84
+      console.log(1, activeName)
85
+      if (activeName === targetName) {
86
+        tabs.forEach((tab, index) => {
87
+          if (tab.name === targetName) {
88
+            const nextTab = tabs[index + 1] || tabs[index - 1]
89
+            if (nextTab) {
90
+              activeName = nextTab.name
91
+            }
92
+          }
93
+        })
94
+      }
95
+      this.editableTabsValue = activeName
96
+      this.editableTabs = tabs.filter(tab => tab.name !== targetName)
97
+    }
98
+  }
99
+}
100
+</script>
101
+
102
+<!-- 需要注意的是,修改elementUI的默认样式的css不能使用scoped. -->
103
+<style rel="stylesheet/scss" lang="scss">
104
+	.el-form-item--mini.el-form-item,
105
+	.el-form-item--small.el-form-item {
106
+		margin-bottom: 18px;
107
+	}
108
+
109
+	.tanping .el-card__body {
110
+		padding: 5px;
111
+	}
112
+</style>
113
+<style>
114
+	.app-container {
115
+		padding: 0px;
116
+	}
117
+</style>

+ 279 - 0
CallCenterWeb.UI/RMYY/src/views/customerManagement/customerList/components/addOrEdit.vue

@@ -0,0 +1,279 @@
1
+<template>
2
+  <div v-loading="loading">
3
+    <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="85px" class="order_form">
4
+      <el-row>
5
+        <el-col :span="12">
6
+          <el-form-item label="客户代码" prop="code">
7
+            <el-input v-model="ruleForm.code" placeholder="请输入客户代码" />
8
+          </el-form-item>
9
+        </el-col>
10
+        <el-col :span="12">
11
+          <el-form-item label="客户名称" prop="name">
12
+            <el-input v-model="ruleForm.name" placeholder="请输入客户名称" />
13
+          </el-form-item>
14
+        </el-col>
15
+      </el-row>
16
+      <el-row>
17
+        <el-col :span="12">
18
+          <el-form-item label="级别" prop="layer">
19
+            <el-input v-model="ruleForm.layer" type="number" placeholder="请输入客户级别" />
20
+          </el-form-item>
21
+        </el-col>
22
+        <el-col :span="12">
23
+          <el-form-item label="手机" prop="mobile">
24
+            <el-input v-model="ruleForm.mobile" placeholder="请输入手机号码" />
25
+          </el-form-item>
26
+        </el-col>
27
+      </el-row>
28
+      <el-row>
29
+        <el-col :span="12">
30
+          <el-form-item label="电话" prop="telphone">
31
+            <el-input v-model="ruleForm.telphone" placeholder="请输入客户电话" />
32
+          </el-form-item>
33
+        </el-col>
34
+        <el-col :span="12">
35
+          <el-form-item label="传真" prop="fax">
36
+            <el-input v-model="ruleForm.fax" placeholder="请输入客户传真" />
37
+          </el-form-item>
38
+        </el-col>
39
+      </el-row>
40
+      <el-row>
41
+        <el-col :span="12">
42
+          <el-form-item label="邮编" prop="postcode">
43
+            <el-input v-model="ruleForm.postcode" placeholder="请输入客户邮编" />
44
+          </el-form-item>
45
+        </el-col>
46
+        <el-col :span="12">
47
+          <el-form-item label="邮件" prop="email">
48
+            <el-input v-model="ruleForm.email" placeholder="请输入客户邮件" />
49
+          </el-form-item>
50
+        </el-col>
51
+      </el-row>
52
+      <el-row>
53
+        <el-col :span="12">
54
+          <el-form-item label="性别" prop="sex">
55
+            <el-input v-model="ruleForm.sex" placeholder="请输入性别" />
56
+          </el-form-item>
57
+        </el-col>
58
+        <el-col :span="12">
59
+
60
+          <el-form-item label="省" prop="province">
61
+            <el-input v-model="ruleForm.province" placeholder="请输入省" />
62
+          </el-form-item>
63
+        </el-col>
64
+      </el-row>
65
+      <el-row>
66
+        <el-col :span="12">
67
+          <el-form-item label="市" prop="city">
68
+            <el-input v-model="ruleForm.city" placeholder="请输入市" />
69
+          </el-form-item>
70
+        </el-col>
71
+        <el-col :span="12">
72
+          <el-form-item label="区县" prop="county">
73
+            <el-input v-model="ruleForm.county" placeholder="请输入区县" />
74
+          </el-form-item>
75
+        </el-col>
76
+      </el-row>
77
+      <el-row>
78
+        <el-col :span="12">
79
+          <el-form-item label="客户住址" prop="adddress">
80
+            <el-input v-model="ruleForm.adddress" placeholder="请输入客户住址" />
81
+          </el-form-item>
82
+        </el-col>
83
+      </el-row>
84
+      <el-form-item>
85
+        <el-button type="primary" @click="submitForm">保存</el-button>
86
+      </el-form-item>
87
+    </el-form>
88
+  </div>
89
+</template>
90
+
91
+<script>
92
+import { addOrEditCustomerList, getCusDetail } from '@/api/customerManagement/customerList'
93
+import { validateTel } from '@/utils/validate'
94
+import { mapGetters } from 'vuex'
95
+export default {
96
+  name: 'AddOrEdit',
97
+  props: {
98
+    rowid: {
99
+      type: Number,
100
+      default: 0
101
+    },
102
+    layerid: {
103
+      type: String,
104
+      default: ''
105
+    }
106
+  },
107
+  data() {
108
+    var phoneNumbersinput = (rule, value, callback) => {
109
+      if (value !== '') { // 不为空的时候进行验证
110
+        validateTel(value) ? callback() : callback(new Error('联系电话格式错误'))
111
+      } else { // 为空的时候就直接放过去(这里一定要写,不然既不报错也不会往下走【应该和router的next()相同】)
112
+        callback()
113
+      }
114
+    }
115
+    return {
116
+      ruleForm: {
117
+        id: '', // 客户id
118
+        code: '', // 客户代码
119
+        name: '', // 客户名称
120
+        layer: '', // 客户等级
121
+        mobile: '', // 客户手机
122
+        telphone: '', // 客户电话
123
+        fax: '', // 客户传真
124
+        postcode: '', // 客户邮编
125
+        email: '', // 客户邮件
126
+        sex: '', // 性别
127
+        province: '', // 省
128
+        city: '', // 市
129
+        county: '', // 区县
130
+        adddress: '' // 客户住址
131
+      },
132
+      rules: {
133
+        name: [
134
+          {
135
+            required: true,
136
+            trigger: 'blur',
137
+            message: '请输入客户名称!'
138
+          }
139
+        ],
140
+        code: [{
141
+          required: true,
142
+          trigger: 'blur',
143
+          message: '请输入客户代码!'
144
+        }],
145
+        mobile: [
146
+          {
147
+            required: false,
148
+            validator: phoneNumbersinput,
149
+            trigger: 'blur'
150
+
151
+          }
152
+        ]
153
+      },
154
+      loading: false
155
+    }
156
+  },
157
+  created() {
158
+    if (this.rowid) {
159
+      this.ruleForm.id = this.rowid
160
+      const data = {
161
+        id: this.rowid
162
+      }
163
+      this.getDetail(data)
164
+    }
165
+  },
166
+  methods: {
167
+    submitForm() {
168
+      // if (this.ruleForm.mobile) {
169
+      //   if (!validateTel(this.ruleForm.mobile)) {
170
+      //     this.$message.error('请输入正确的手机号码格式')
171
+      //   }
172
+      // }
173
+
174
+      this.$refs.ruleForm.validate((valid) => {
175
+        if (valid) {
176
+          this.loading = true
177
+          const data = {
178
+            id: this.rowid,
179
+            code: this.ruleForm.code, // 客户代码 string
180
+            name: this.ruleForm.name, // 客户名称 string
181
+            layer: this.ruleForm.layer, // 客户级别 string
182
+            mobile: this.ruleForm.mobile, // 客户手机 string
183
+            telphone: this.ruleForm.telphone, // 客户电话 string
184
+            fax: this.ruleForm.fax, // 客户传真 string
185
+            postcode: this.ruleForm.postcode, // 客户邮编 string
186
+            email: this.ruleForm.email, // 客户邮件 string
187
+            sex: this.ruleForm.sex, // 客户性别 string
188
+            province: this.ruleForm.province, // 省 string
189
+            city: this.ruleForm.city, // 市 string
190
+            county: this.ruleForm.county, // 区 string
191
+            adddress: this.ruleForm.adddress // 客户住址 string
192
+          }
193
+          // 添加
194
+          if (!this.rowid) {
195
+            addOrEditCustomerList(data)
196
+              .then((response) => {
197
+                this.loading = false
198
+                if (response.state.toLowerCase() === 'success') {
199
+                  this.$parent.$layer.close(this.layerid)
200
+                  this.$parent.getListTask() // 重新加载父级数据
201
+                  this.$message({
202
+                    message: '恭喜你,添加成功!',
203
+                    type: 'success',
204
+                    duration: 1000
205
+                  })
206
+                } else {
207
+                  this.$message({
208
+                    message: '添加失败,该客户已存在!',
209
+                    type: 'success',
210
+                    duration: 1000
211
+                  })
212
+                }
213
+              })
214
+              .catch((response) => {
215
+                this.loading = false
216
+              })
217
+            return
218
+          }
219
+          // 编辑
220
+          addOrEditCustomerList(data)
221
+            .then((response) => {
222
+              this.loading = false
223
+              if (response.state.toLowerCase() === 'success') {
224
+                this.$parent.$layer.close(this.layerid)
225
+                this.$parent.getListTask() // 重新加载父级数据
226
+                this.$message({
227
+                  message: '恭喜你,客户信息编辑成功!',
228
+                  type: 'success',
229
+                  duration: 1000
230
+                })
231
+              }
232
+            })
233
+            .catch(() => {
234
+              this.loading = false
235
+            })
236
+        } else {
237
+          // this.$message.error('请输入有效的必填项信息!')
238
+          return false
239
+        }
240
+      })
241
+    },
242
+    // 获取详情
243
+    getDetail(data) {
244
+      getCusDetail(data).then(response => {
245
+        if (response.state.toLowerCase() === 'success') {
246
+          const res = response.data
247
+          console.log(res)
248
+          this.ruleForm.code = res.F_CustomerCode // 客户代码
249
+          this.ruleForm.name = res.F_CustomerName // 客户名称
250
+          this.ruleForm.layer = res.F_Layer // 客户级别
251
+          this.ruleForm.mobile = res.F_Mobile // 客户手机
252
+          this.ruleForm.telphone = res.F_Telephone // 客户电话
253
+          this.ruleForm.fax = res.F_Fax // 客户传真
254
+          this.ruleForm.postcode = res.F_PostCode // 客户邮编
255
+          this.ruleForm.email = res.F_Email // 客户邮件
256
+          this.ruleForm.sex = res.F_Sex // 性别
257
+          this.ruleForm.province = res.F_Province // 省
258
+          this.ruleForm.city = res.F_City // 市
259
+          this.ruleForm.county = res.F_County // 区
260
+          this.ruleForm.adddress = res.F_Address // 客户住址
261
+        }
262
+      })
263
+    }
264
+
265
+  }
266
+}
267
+</script>
268
+
269
+<style rel="stylesheet/scss" lang="scss">
270
+	.order_form {
271
+		.form_select {
272
+			width: 100%;
273
+		}
274
+
275
+		.form_date {
276
+			width: 100%;
277
+		}
278
+	}
279
+</style>

+ 295 - 0
CallCenterWeb.UI/RMYY/src/views/customerManagement/customerList/components/detail.vue

@@ -0,0 +1,295 @@
1
+<template>
2
+  <div class="order_detail">
3
+    <el-card shadow="hover">
4
+      <el-row :gutter="20">
5
+        <el-col :md="24" class="order_detail_body">
6
+
7
+          <el-col :md="24" class="order_detail_content">
8
+            <el-col :md="12" class="order_detail_item">
9
+              客户代码:{{ ruleForm.code }}
10
+            </el-col>
11
+            <el-col :md="12" class="order_detail_item">
12
+              客户名称:{{ ruleForm.name }}
13
+            </el-col>
14
+            <el-col :md="12" class="order_detail_item">
15
+              客户等级:{{ ruleForm.layer }}
16
+            </el-col>
17
+            <el-col :md="12" class="order_detail_item">
18
+              客户手机:{{ ruleForm.mobile }}
19
+
20
+            </el-col>
21
+            <el-col :md="12" class="order_detail_item">
22
+              客户电话:{{ ruleForm.telphone }}
23
+            </el-col>
24
+            <el-col :md="12" class="order_detail_item">
25
+              客户传真:{{ ruleForm.fax }}
26
+            </el-col>
27
+            <el-col :md="12" class="order_detail_item">
28
+              客户邮编:{{ ruleForm.postcode }}
29
+
30
+            </el-col>
31
+            <el-col :md="12" class="order_detail_item">
32
+              客户邮件:{{ ruleForm.email }}
33
+            </el-col>
34
+            <el-col :md="12" class="order_detail_item">
35
+              性别:{{ ruleForm.sex }}
36
+            </el-col>
37
+            <el-col :md="12" class="order_detail_item">
38
+              省:{{ ruleForm.province }}
39
+            </el-col>
40
+            <el-col :md="12" class="order_detail_item">
41
+              市:{{ ruleForm.city }}
42
+            </el-col>
43
+            <el-col :md="12" class="order_detail_item">
44
+              区县:{{ ruleForm.county }}
45
+            </el-col>
46
+            <el-col :md="12" class="order_detail_item">
47
+              客户住址:{{ ruleForm.adddress }}
48
+            </el-col>
49
+          </el-col>
50
+
51
+        </el-col>
52
+      </el-row>
53
+    </el-card>
54
+  </div>
55
+</template>
56
+
57
+<script>
58
+import { getCusDetail } from '@/api/customerManagement/customerList'
59
+import { mapGetters } from 'vuex'
60
+export default {
61
+  name: 'Detail',
62
+  filters: {
63
+    cusSignFilter(status) {
64
+      const statusMap = {
65
+        101: '军品业务',
66
+        102: '民品业务',
67
+        103: '新能源业务',
68
+        104: '外贸业务',
69
+        105: '华亿业务'
70
+      }
71
+      return statusMap[status]
72
+    },
73
+    CusCcFilter(status) {
74
+      const statusMap = {
75
+        A: '按固定比例定期结算',
76
+        B: '货到验收合格后,较好催收',
77
+        C: '货到验收合格后,较难催收',
78
+        D: '款到发货',
79
+        E: '款到后合同生效'
80
+      }
81
+      return statusMap[status]
82
+    }
83
+  },
84
+  props: {
85
+    rowid: {
86
+      type: Number,
87
+      default: 0
88
+    }
89
+  },
90
+  data() {
91
+    return {
92
+      checked: false, // 是否关闭
93
+      activeName: 'first',
94
+      ruleForm: {
95
+        id: '', // 客户id
96
+        code: '', // 客户代码
97
+        name: '', // 客户名称
98
+        layer: '', // 客户登记
99
+        mobile: '', // 客户手机
100
+        telphone: '', // 客户电话
101
+        fax: '', // 客户传真
102
+        postcode: '', // 客户邮编
103
+        email: '', // 客户邮件
104
+        sex: '', // 性别
105
+        province: '', // 省
106
+        city: '', // 市
107
+        county: '', // 区县
108
+        adddress: '' // 客户住址
109
+      }
110
+    }
111
+  },
112
+  created() {
113
+    if (this.rowid) {
114
+      this.ruleForm.id = this.rowid
115
+      const data = {
116
+        id: this.rowid
117
+      }
118
+      this.getDetail(data)
119
+    }
120
+  },
121
+  methods: {
122
+
123
+    // 详情
124
+    getDetail(data) {
125
+      getCusDetail(data).then(response => {
126
+        if (response.state.toLowerCase() === 'success') {
127
+          const res = response.data
128
+          console.log(res)
129
+          this.ruleForm.code = res.F_CustomerCode // 客户代码
130
+          this.ruleForm.name = res.F_CustomerName // 客户名称
131
+          this.ruleForm.layer = res.F_Layer // 客户级别
132
+          this.ruleForm.mobile = res.F_Mobile // 客户手机
133
+          this.ruleForm.telphone = res.F_Telephone // 客户电话
134
+          this.ruleForm.fax = res.F_Fax // 客户传真
135
+          this.ruleForm.postcode = res.F_PostCode // 客户邮编
136
+          this.ruleForm.email = res.F_Email // 客户邮件
137
+          this.ruleForm.sex = res.F_Sex // 性别
138
+          this.ruleForm.province = res.F_Province // 省
139
+          this.ruleForm.city = res.F_City // 市
140
+          this.ruleForm.county = res.F_County // 区
141
+          this.ruleForm.adddress = res.F_Address // 客户住址
142
+        }
143
+      })
144
+    }
145
+
146
+  }
147
+}
148
+</script>
149
+
150
+<style rel="stylesheet/scss" lang="scss">
151
+.order_detail {
152
+  .el-col {
153
+    margin-bottom: 20px;
154
+  }
155
+  .el-icon-time {
156
+    color: #d81e06;
157
+  }
158
+  .el-card__header {
159
+    padding-top: 14px;
160
+    padding-bottom: 14px;
161
+    background-color: #f5f5f6;
162
+  }
163
+  .order_file {
164
+    .el-card__body {
165
+      padding: 22px 0 0 0;
166
+      text-align: center;
167
+    }
168
+  }
169
+  .order_steps {
170
+    .el-step__icon-inner {
171
+      display: none;
172
+    }
173
+  }
174
+  .order_record {
175
+    .el-card__body {
176
+      padding: 0;
177
+    }
178
+    .el-tabs__header {
179
+      padding: 0px 20px;
180
+      background-color: #f5f5f6;
181
+      .el-tabs__item {
182
+        font-size: 16px;
183
+        height: 47px;
184
+        line-height: 47px;
185
+      }
186
+    }
187
+  }
188
+}
189
+</style>
190
+
191
+<style rel="stylesheet/scss" lang="scss" scoped>
192
+.order_detail {
193
+  .order_detail_body {
194
+    margin-bottom: 20px;
195
+    .round_img {
196
+      width: 90px;
197
+      height: 90px;
198
+      border-radius: 50%;
199
+      overflow: hidden;
200
+      margin: 14px;
201
+      img {
202
+        width: 100%;
203
+        height: 100%;
204
+      }
205
+    }
206
+    .title {
207
+      font-size: 20px;
208
+      .title_icon {
209
+        color: #d81e06;
210
+        font-size: 18px;
211
+        margin-right: 20px;
212
+      }
213
+    }
214
+    .title_sub {
215
+      font-size: 16px;
216
+      color: #666666;
217
+    }
218
+    .order_detail_content {
219
+      background-color: #f5f5f6;
220
+      padding-top: 20px;
221
+      color: #4c4c4c;
222
+      font-size: 16px;
223
+      .order_detail_item {
224
+        margin-bottom: 10px;
225
+        .order_content {
226
+          margin-top: 10px;
227
+        }
228
+        .order_file {
229
+          position: relative;
230
+          cursor: pointer;
231
+          .img_mask {
232
+            display: none;
233
+            position: absolute;
234
+            left: 0px;
235
+            top: 0px;
236
+            background-color: rgba(0, 0, 0, 0.3);
237
+            width: 100%;
238
+            height: 22px;
239
+            text-align: right;
240
+            z-index: 1;
241
+            i {
242
+              font-size: 20px;
243
+              line-height: 22px;
244
+              display: inline-block;
245
+              margin-right: 15px;
246
+              color: #fff;
247
+            }
248
+          }
249
+          p {
250
+            margin-top: 8px;
251
+            padding-left: 14px;
252
+            padding-right: 14px;
253
+            white-space: nowrap;
254
+            overflow: hidden;
255
+            text-overflow: ellipsis;
256
+          }
257
+          .file_icon {
258
+            height: 68px;
259
+            line-height: 68px;
260
+            font-size: 68px;
261
+            color: #409eff;
262
+          }
263
+        }
264
+        .order_file:hover .img_mask {
265
+          display: block;
266
+        }
267
+      }
268
+    }
269
+  }
270
+  .green {
271
+    color: #00c1de;
272
+  }
273
+  .done {
274
+    color: #198120;
275
+  }
276
+  .red {
277
+    color: #d81e06;
278
+  }
279
+  .yellow {
280
+    color: #e6a23c;
281
+  }
282
+  .order_steps {
283
+    // height: 240px;
284
+    .el-step__icon-inner {
285
+      display: none;
286
+    }
287
+  }
288
+  .tab_body {
289
+    padding: 0 20px 20px 20px;
290
+  }
291
+  .phoneIcon {
292
+    cursor: pointer;
293
+  }
294
+}
295
+</style>

+ 361 - 0
CallCenterWeb.UI/RMYY/src/views/customerManagement/customerList/index.vue

@@ -0,0 +1,361 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-row :gutter="20">
4
+      <el-col :md="24">
5
+        <el-row :gutter="5">
6
+          <el-col :span="3">
7
+            <el-input
8
+              v-model="searchData.cusName"
9
+              placeholder="请输入客户名称"
10
+              class="filter-item"
11
+            />
12
+          </el-col>
13
+          <el-col :span="3">
14
+            <el-input
15
+              v-model="searchData.cusTel"
16
+              placeholder="请输入联系电话"
17
+              class="filter-item"
18
+            />
19
+          </el-col>
20
+          <el-col :span="4">
21
+            <el-button
22
+              type="primary"
23
+              class="filter-item"
24
+              size="mini"
25
+              icon="el-icon-search"
26
+              @click="btn_search_task"
27
+            >搜索</el-button
28
+            >
29
+            <el-button
30
+              type="primary"
31
+              class="filter-item"
32
+              size="mini"
33
+              @click="btn_add"
34
+            >添加</el-button
35
+            >
36
+          </el-col>
37
+        </el-row>
38
+
39
+        <el-table
40
+          v-loading="loading"
41
+          :data="taskDataLists"
42
+          border
43
+          stripe
44
+          highlight-current-row
45
+        >
46
+          <el-table-column
47
+            :show-overflow-tooltip="true"
48
+            fixed
49
+            prop="F_CustomerCode"
50
+            label="客户代码"
51
+            align="center"
52
+            min-width="200"
53
+          />
54
+          <el-table-column
55
+            :show-overflow-tooltip="true"
56
+            fixed
57
+            prop="F_CustomerName"
58
+            label="客户名称"
59
+            align="center"
60
+            min-width="200"
61
+          />
62
+          <el-table-column
63
+            prop="F_Layer"
64
+            label="级别"
65
+            align="center"
66
+            min-width="140"
67
+          />
68
+          <el-table-column
69
+            :show-overflow-tooltip="true"
70
+            prop="F_Telephone"
71
+            label="电话"
72
+            align="center"
73
+            min-width="140"
74
+          />
75
+          <el-table-column
76
+            :show-overflow-tooltip="true"
77
+            prop="F_Mobile"
78
+            label="手机"
79
+            align="center"
80
+            min-width="140"
81
+          />
82
+          <el-table-column
83
+            :show-overflow-tooltip="true"
84
+            prop="F_Fax"
85
+            label="传真"
86
+            align="center"
87
+            min-width="140"
88
+          />
89
+          <el-table-column
90
+            :show-overflow-tooltip="true"
91
+            prop="F_PostCode"
92
+            label="邮编"
93
+            align="center"
94
+            min-width="140"
95
+          />
96
+          <el-table-column
97
+            :show-overflow-tooltip="true"
98
+            prop="F_Email"
99
+            label="邮件"
100
+            align="center"
101
+            min-width="140"
102
+          />
103
+          <el-table-column
104
+            :show-overflow-tooltip="true"
105
+            prop="F_Sex"
106
+            label="性别"
107
+            align="center"
108
+            min-width="140"
109
+          />
110
+          <el-table-column
111
+            :show-overflow-tooltip="true"
112
+            prop="F_Province"
113
+            label="省"
114
+            align="center"
115
+            min-width="140"
116
+          />
117
+          <el-table-column
118
+            :show-overflow-tooltip="true"
119
+            prop="F_City"
120
+            label="市"
121
+            align="center"
122
+            min-width="140"
123
+          />
124
+          <el-table-column
125
+            :show-overflow-tooltip="true"
126
+            prop="F_County"
127
+            label="区县"
128
+            align="center"
129
+            min-width="140"
130
+          />
131
+          <el-table-column
132
+            :show-overflow-tooltip="true"
133
+            prop="F_Address"
134
+            label="客户住址"
135
+            align="center"
136
+            min-width="140"
137
+          />
138
+          <el-table-column
139
+            :show-overflow-tooltip="true"
140
+            prop="F_CreateBy"
141
+            label="创建人"
142
+            align="center"
143
+            min-width="140"
144
+          />
145
+          <el-table-column
146
+            :show-overflow-tooltip="true"
147
+            prop="F_CreatedOn"
148
+            label="创建时间"
149
+            align="center"
150
+            min-width="140"
151
+          />
152
+
153
+          <el-table-column
154
+            label="操作"
155
+            width="240"
156
+            align="center"
157
+            class-name="oparate_btn"
158
+            fixed="right"
159
+          >
160
+            <template slot-scope="scope">
161
+              <el-button
162
+                size="mini"
163
+                plain
164
+                type="primary"
165
+                @click.stop="btn_edit(scope.row.F_CustomerId)"
166
+              >编辑</el-button
167
+              >
168
+              <el-button
169
+                size="mini"
170
+                plain
171
+                type="primary"
172
+                @click.stop="btn_detail(scope.row.F_CustomerId)"
173
+              >详情</el-button
174
+              >
175
+              <el-button
176
+                size="mini"
177
+                plain
178
+                type="danger"
179
+                @click.stop="btn_delete_task(scope.row.F_CustomerId)"
180
+              >删除</el-button
181
+              >
182
+            </template>
183
+          </el-table-column>
184
+        </el-table>
185
+        <pagination
186
+          v-show="pageParams.total > 0"
187
+          :total="pageParams.total"
188
+          :pageindex.sync="pageParams.pageindex"
189
+          :pagesize.sync="pageParams.pagesize"
190
+          class="pagination"
191
+          @pagination="getListTask"
192
+        />
193
+      </el-col>
194
+    </el-row>
195
+  </div>
196
+</template>
197
+
198
+<script>
199
+import { getCustomerList, deleteCustomerList } from '@/api/customerManagement/customerList'
200
+import addOrEdit from './components/addOrEdit'
201
+import detail from './components/detail'
202
+import Pagination from '@/components/Pagination' // 对el-pagination 二次封装
203
+import { pickerOptions, formatterContent } from '@/utils'
204
+export default {
205
+  name: 'MyTask',
206
+  components: {
207
+    Pagination
208
+  },
209
+  filters: {
210
+    CusCcFilter(status) {
211
+      const statusMap = {
212
+        A: '按固定比例定期结算',
213
+        B: '货到验收合格后,较好催收',
214
+        C: '货到验收合格后,较难催收',
215
+        D: '款到发货',
216
+        E: '款到后合同生效'
217
+      }
218
+      return statusMap[status]
219
+    },
220
+    isFilter(status) {
221
+      const statusMap = {
222
+        1: '是',
223
+        0: '否'
224
+      }
225
+      return statusMap[status]
226
+    }
227
+  },
228
+  data() {
229
+    return {
230
+      pickerOptions,
231
+      keyword: '', // 联系人模糊查询关键字
232
+      loading: false,
233
+      searchData: {
234
+        cusName: '', // 客户名称
235
+        cusTel: ''// 联系电话
236
+      },
237
+      pageParams: {
238
+        pageindex: 1, // 当前第几页
239
+        pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
240
+        total: 0 // 总共多少数据
241
+      },
242
+      taskDataLists: [] // 客户信息列表数据
243
+    }
244
+  },
245
+  computed: {},
246
+  created() {
247
+    this.getListTask()
248
+    document.onkeyup = (e) => {
249
+      if (e.keyCode === 13) {
250
+        this.getListTask()
251
+      }
252
+    }
253
+  },
254
+  methods: {
255
+    getListTask() {
256
+      this.loading = true
257
+      return new Promise((resolve) => {
258
+        const params = {
259
+          pageindex: this.pageParams.pageindex, // int 第几页
260
+          pagesize: this.pageParams.pagesize, // int 每页几条信息
261
+          name: this.searchData.cusName, // 客户名称
262
+          telephone: this.searchData.cusTel.toString() // 联系电话
263
+        }
264
+        getCustomerList(params).then((response) => {
265
+          this.loading = false
266
+          if (response.state.toLowerCase() === 'success') {
267
+            if (response.total == null) {
268
+              this.pageParams.total = 0
269
+            } else {
270
+              this.pageParams.total = response.total
271
+            }
272
+            this.taskDataLists = response.rows
273
+          }
274
+        })
275
+        resolve()
276
+      })
277
+    },
278
+    btn_search_task() {
279
+      this.getListTask()
280
+    },
281
+    btn_add() {
282
+      this.$layer.iframe({
283
+        content: {
284
+          content: addOrEdit, // 传递的组件对象
285
+          parent: this, // 当前的vue对象
286
+          data: { rowid: 0 } // props
287
+        },
288
+        area: ['50%', '65%'],
289
+        title: '添加客户信息'
290
+      })
291
+    },
292
+    //  编辑客户信息
293
+    btn_edit(F_CustomerId) {
294
+      this.$layer.iframe({
295
+        content: {
296
+          content: addOrEdit, // 传递的组件对象
297
+          parent: this, // 当前的vue对象
298
+          data: { rowid: Number(F_CustomerId) } // props
299
+        },
300
+        area: ['50%', '65%'],
301
+        title: '编辑客户信息'
302
+      })
303
+    },
304
+    // 客户详情信息
305
+    btn_detail(F_CustomerId) {
306
+      this.$layer.iframe({
307
+        content: {
308
+          content: detail, // 传递的组件对象
309
+          parent: this, // 当前的vue对象
310
+          data: { rowid: Number(F_CustomerId) } // props
311
+        },
312
+        area: ['40%', '40%'],
313
+        title: '客户详情信息'
314
+      })
315
+    },
316
+    // 删除
317
+    btn_delete_task(F_CustomerId) {
318
+      this.$confirm('确定要删除吗?', '提示', {
319
+        confirmButtonText: '确定',
320
+        cancelButtonText: '取消',
321
+        type: 'warning'
322
+      })
323
+        .then(() => {
324
+          deleteCustomerList(F_CustomerId).then((response) => {
325
+            if (response.state.toLowerCase() === 'success') {
326
+              this.getListTask()
327
+              this.$message({ message: '删除成功!', type: 'success', duration: 1000 })
328
+            }
329
+          })
330
+        })
331
+        .catch(() => {
332
+          this.$message.info('已取消删除')
333
+        })
334
+    }
335
+  }
336
+}
337
+</script>
338
+
339
+<style >
340
+.el {
341
+  cursor: pointer;
342
+}
343
+.filter-container {
344
+  padding-top: 15px;
345
+}
346
+.el-table--mini,
347
+.el-table--small,
348
+.el-table__expand-icon {
349
+  font-size: 14px;
350
+}
351
+.el-table--small td,
352
+.el-table--small th {
353
+  padding: 2px 0 !important;
354
+}
355
+.filter-date {
356
+  width: 388px !important;
357
+}
358
+.el-table {
359
+  color: #000;
360
+}
361
+</style>

+ 1 - 1
CallCenterWeb.UI/RMYY/src/views/layout/components/Navbar.vue

@@ -8,7 +8,7 @@
8 8
         <span class="personalInfoText">姓名:{{ username }}</span>
9 9
       </div>
10 10
       <div class="personalInfoLine">
11
-        <span class="personalInfoText">小组:{{ groupName }}</span>
11
+        <!-- <span class="personalInfoText">小组:{{ groupName }}</span> -->
12 12
         <span class="personalInfoText">分机号:{{ extension }}</span>
13 13
       </div>
14 14
     </div>

+ 148 - 0
CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/department/component/addOrEdit.vue

@@ -0,0 +1,148 @@
1
+<template>
2
+  <div v-loading="loading">
3
+    <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="150px" class>
4
+      <el-form-item label="父级分类" prop="parentids">
5
+        <el-cascader
6
+          v-model="parentids"
7
+          :options="typeDropDatas"
8
+          :props="props"
9
+          :disabled="addEditJudgment"
10
+          placeholder="请选择父级分类,默认是顶级分类"
11
+          clearable
12
+          filterable
13
+          change-on-select
14
+          style="width: 100%;"
15
+        />
16
+      </el-form-item>
17
+      <el-form-item label="分类名称" prop="name">
18
+        <el-input v-model="ruleForm.name" placeholder="请输入分类名称" />
19
+      </el-form-item>
20
+      <el-form-item label="分类编码" prop="code">
21
+        <el-input v-model="ruleForm.code" placeholder="请输入分类编码" />
22
+      </el-form-item>
23
+      <el-form-item label="排列序号" prop="sort">
24
+        <el-input v-model.number="ruleForm.sort" maxlength="20" placeholder="请输入排列序号"/>
25
+      </el-form-item>
26
+      <el-form-item>
27
+        <el-button type="primary" @click="submitForm">保存</el-button>
28
+      </el-form-item>
29
+    </el-form>
30
+  </div>
31
+</template>
32
+
33
+<script>
34
+import { getTreeList, addType, editType, getTypeDetail } from '@/api/systemSetup/roleSetting/department'
35
+export default {
36
+  name: 'AddOrEditKnowledge',
37
+  props: {
38
+    rowid: {
39
+      type: String,
40
+      default: ''
41
+    },
42
+    layerid: {
43
+      type: String,
44
+      default: ''
45
+    },
46
+    listPid: {
47
+      type: Number,
48
+      default: 0
49
+    },
50
+    addPid: {
51
+      type: Number,
52
+      default: 0
53
+    }
54
+  },
55
+  data() {
56
+    return {
57
+      loading: false,
58
+      parentids: [],
59
+      ruleForm: {
60
+        pid: 0, // 父节点id
61
+        id: '', // 当前节点id
62
+        code: '',
63
+        sort: '', // 序号
64
+        name: '' // 分类名称 name
65
+      },
66
+      rules: {
67
+        sort: [
68
+          { required: true, message: '排列序号不能为空' },
69
+          { type: 'number', message: '排列序号必须为数字' }
70
+        ],
71
+        name: [
72
+          { required: true, message: '分类名称不能为空' }
73
+        ]
74
+      },
75
+      typeDropDatas: [], // 下拉分类
76
+      // 自定义菜单下拉数据的key值
77
+      props: {
78
+        value: 'id',
79
+        label: 'text'
80
+      },
81
+      addEditJudgment: true, // 添加flase 编辑true
82
+      addEditLock: true // 添加true 编辑false
83
+    }
84
+  },
85
+  created() {
86
+    if (this.rowid) {
87
+      this.addEditJudgment = true
88
+      this.addEditLock = false
89
+      this.ruleForm.id = this.rowid
90
+      this.getTypeDetails(this.rowid)
91
+    }
92
+  },
93
+  methods: {
94
+    // 获取菜单详情
95
+    getTypeDetails(rid) {
96
+      getTypeDetail(rid).then(response => {
97
+        if (response.state.toLowerCase() === 'success') {
98
+          const res = response.data
99
+          this.ruleForm.name = res.F_DeptName // 分类名称
100
+          this.ruleForm.pid = res.F_ParentId // 父节点id
101
+          this.ruleForm.sort = res.F_Sort // 排序
102
+          this.ruleForm.code = res.F_DeptCode
103
+          const levelid = response.data.F_ParentId
104
+        }
105
+      })
106
+    },
107
+    submitForm() {
108
+      this.$refs.ruleForm.validate((valid) => {
109
+        if (valid) {
110
+          this.loading = true
111
+          if (!this.rowid) {
112
+            // 添加
113
+            if (this.addPid) { this.ruleForm.pid = this.addPid }
114
+            addType(this.ruleForm).then(response => {
115
+              this.loading = false
116
+              if (response.state.toLowerCase() === 'success') {
117
+                this.$parent.$layer.close(this.layerid)
118
+                this.$parent.getDepList() // 重新加载父级数据
119
+                this.$message.success('恭喜你,添加成功!')
120
+              }
121
+            }).catch(() => {
122
+              this.loading = false
123
+            })
124
+            return
125
+          }
126
+          // 编辑
127
+          editType(this.ruleForm).then(response => {
128
+            this.loading = false
129
+            if (response.state.toLowerCase() === 'success') {
130
+              this.$parent.$layer.close(this.layerid)
131
+              this.$parent.getDepList(this.listPid) // 重新加载父级数据this.listPid
132
+              this.$message.success('恭喜你,编辑成功!')
133
+            }
134
+          }).catch(() => {
135
+            this.loading = false
136
+          })
137
+        } else {
138
+          this.$message.error('请输入有效的必填项信息!')
139
+          return false
140
+        }
141
+      })
142
+    }
143
+  }
144
+}
145
+</script>
146
+
147
+<style lang="scss" scoped></style>
148
+

+ 281 - 0
CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/department/index.vue

@@ -0,0 +1,281 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-row :gutter="24">
4
+      <el-col :span="24">
5
+        <div class="filter-container">
6
+          <el-button type="primary" class="filter-item" icon="el-icon-plus" @click="btn_add()">添加</el-button>
7
+        </div>
8
+        <el-alert :closable="false" title="部门分类" type="success" />
9
+        <!-- @current-change="handleCurrentChange" -->
10
+        <el-table v-loading="loading" :data="departmentDataLists" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" highlight-current-row border row-key="F_DeptId" default-expand-all >
11
+          <el-table-column prop="F_DeptName" label="部门名称" align="center" min-width />
12
+          <el-table-column prop="F_DeptCode" label="部门编码" align="center" min-width />
13
+          <el-table-column prop="F_Sort" label="序号" align="center" min-width />
14
+          <el-table-column label="操作" width="160" align="center" class-name="oparate_btn" fixed="right">
15
+            <template slot-scope="scope">
16
+              <el-button size="mini" plain type="primary" @click="btn_edit(scope.row.F_DeptId.toString())">编辑</el-button>
17
+              <el-button size="mini" plain type="danger" @click="btn_delete(scope.row.F_DeptId.toString())">删除</el-button>
18
+            </template>
19
+          </el-table-column>
20
+        </el-table>
21
+        <pagination v-show="pageParams.total > 0" :total="pageParams.total" :pageindex.sync="pageParams.pageindex" :pagesize.sync="pageParams.pagesize" class="pagination" @pagination="getDepList" />
22
+      </el-col>
23
+      <!-- <el-col :span="8">
24
+        <div>
25
+          <div class="filter-container search">
26
+            <el-input v-model="keyword" placeholder="请输入关键字" class="filter-item" />
27
+            <el-button type="primary" class="filter-item" icon="el-icon-search" @click="btn_search">搜索</el-button>
28
+            <el-button type="primary" class="filter-item" icon="el-icon-plus" @click="btn_add()">添加</el-button>
29
+          </div>
30
+          <el-alert :closable="false" title="中心分类" type="success" />
31
+          <el-table v-loading="loading" :data="dataLists" border stripe highlight-current-row @row-click="handleTableClick">
32
+            <el-table-column type="index" label="编号" align="center" fixed width="60" />
33
+            <el-table-column prop="F_DeptName" label="部门名称" align="center" min-width />
34
+            <el-table-column prop="F_Name" label="中心名称" align="center" min-width />
35
+            <el-table-column prop="F_Des" label="描述说明" align="center" min-width />
36
+            <el-table-column label="操作" width="160" align="center" class-name="oparate_btn" fixed="right">
37
+              <template slot-scope="scope">
38
+                <el-button size="mini" plain type="primary" @click="btn_edit(scope.row.F_DeptId.toString())">编辑</el-button>
39
+                <el-button size="mini" plain type="danger" @click="btn_delete(scope.row.F_DeptId.toString())">删除</el-button>
40
+              </template>
41
+            </el-table-column>
42
+          </el-table>
43
+          <pagination v-show="pageParamsSecond.total > 0" :total="pageParamsSecond.total" :pageindex.sync="pageParamsSecond.pageindex" :pagesize.sync="pageParamsSecond.pagesize" class="pagination" @pagination="getDepList" />
44
+        </div>
45
+      </el-col> -->
46
+      <!-- <el-col :span="8">
47
+        <div>
48
+          <div class="filter-container search">
49
+            <el-input v-model="teamkeyword" placeholder="请输入关键字" class="filter-item" />
50
+            <el-button type="primary" class="filter-item" icon="el-icon-search" @click="btn_search">搜索</el-button>
51
+            <el-button type="primary" class="filter-item" icon="el-icon-plus" @click="btn_add">添加</el-button>
52
+          </div>
53
+          <el-alert :closable="false" title="小组分类" type="success" />
54
+          <el-table v-loading="loading" :data="teamLists" border stripe highlight-current-row>
55
+            <el-table-column type="index" label="编号" align="center" fixed width="50" />
56
+            <el-table-column prop="F_DeptName" label="部门名称" align="center" min-width />
57
+            <el-table-column prop="F_Name" label="小组名称" align="center" min-width />
58
+            <el-table-column prop="F_Des" label="描述说明" align="center" min-width />
59
+            <el-table-column label="操作" width="160" align="center" class-name="oparate_btn" fixed="right">
60
+              <template slot-scope="scope">
61
+                <el-button size="mini" plain type="primary" @click="btn_edit(scope.row.F_DeptId.toString())">编辑</el-button>
62
+                <el-button size="mini" plain type="danger" @click="btn_delete(scope.row.F_DeptId.toString())">删除</el-button>
63
+              </template>
64
+            </el-table-column>
65
+          </el-table>
66
+          <pagination v-show="pageParamsThird.total > 0" :total="pageParamsThird.total" :pageindex.sync="pageParamsThird.pageindex" :pagesize.sync="pageParamsThird.pagesize" class="pagination" @pagination="getDepList" />
67
+        </div>
68
+      </el-col> -->
69
+    </el-row>
70
+  </div>
71
+</template>
72
+<script>
73
+import { getScoreList, deleteType, deleteScore, getDepartmentList } from '@/api/systemSetup/roleSetting/department'
74
+import addOrEditDepartment from './component/addOrEdit'
75
+import Pagination from '@/components/Pagination' // 对el-pagination 二次封装
76
+export default {
77
+  name: 'Department',
78
+  components: {
79
+    Pagination
80
+  },
81
+  filters: {
82
+    judgmentLockName(status) {
83
+      const statusMap = {
84
+        0: '未锁定',
85
+        1: '锁定'
86
+      }
87
+      return statusMap[status]
88
+    },
89
+    judgmentTargetMoney(status) {
90
+      if (status === 0) {
91
+        return ''
92
+      } else {
93
+        return status
94
+      }
95
+    }
96
+  },
97
+  data() {
98
+    return {
99
+      keyword: '',
100
+      teamkeyword: '',
101
+      selectedId: '',
102
+      listGrade: 1,
103
+      listPid: 0,
104
+      addPid: 0,
105
+      depId: 0, // 最后一级部门id
106
+      loading: false,
107
+      clickId: '', // 中心点击id
108
+      pageParams: {
109
+        pageindex: 1, // 当前第几页
110
+        pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
111
+        total: 0 // 总共多少数据
112
+      },
113
+      pageParamsSecond: {
114
+        pageindex: 1, // 当前第几页
115
+        pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
116
+        total: 0 // 总共多少数据
117
+      },
118
+      pageParamsThird: {
119
+        pageindex: 1, // 当前第几页
120
+        pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
121
+        total: 0 // 总共多少数据
122
+      },
123
+      dataLists: [], // 中心管理列表数据
124
+      teamLists: [], // 小组列表数据
125
+      departmentDataLists: [] // 部门列表数据
126
+    }
127
+  },
128
+  created() {
129
+    this.getDepList() // 部门列表
130
+    document.onkeyup = (e) => {
131
+      if (e.keyCode === 13) {
132
+        // this.getList()
133
+      }
134
+    }
135
+  },
136
+  mounted: function() {},
137
+  methods: {
138
+    // 部门分类
139
+    getDepList(listPid) {
140
+      if (listPid != null) {
141
+        this.depId = listPid
142
+        this.listGrade--
143
+      }
144
+      this.loading = true
145
+      return new Promise((resolve) => {
146
+        const params = {
147
+          pageindex: this.pageParams.pageindex, // 第几页
148
+          pagesize: this.pageParams.pagesize, // 每页几条信息
149
+          pid: this.depId,
150
+          keyword: this.keyword.trim()
151
+        }
152
+        getDepartmentList(params)
153
+          .then((response) => {
154
+            this.loading = false
155
+            this.departmentDataLists = response.rows
156
+            this.pageParams.total = response.total
157
+
158
+            // if (this.listGrade === 1) {
159
+            //   this.departmentDataLists = response.rows
160
+            //   this.pageParams.total = response.total
161
+            // } else if (this.listGrade === 1) {
162
+            //   this.dataLists = response.rows
163
+            //   this.pageParamsSecond.total = response.total
164
+            // } else if (this.listGrade === 3) {
165
+            //   this.teamLists = response.rows
166
+            //   this.pageParamsSecond.total = response.total
167
+            // }
168
+          })
169
+          .catch((result) => {
170
+            this.loading = false
171
+            this.departmentDataLists = []
172
+          })
173
+        resolve()
174
+      })
175
+    },
176
+    // 添加
177
+    btn_add() {
178
+      this.$layer.iframe({
179
+        content: {
180
+          content: addOrEditDepartment, // 传递的组件对象
181
+          parent: this, // 当前的vue对象
182
+          data: { rowid: '', addPid: this.addPid } // props//该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
183
+        },
184
+        area: ['80%', '90%'],
185
+        shadeClose: false,
186
+        title: '添加部门分类'
187
+      })
188
+    },
189
+
190
+    btn_edit(F_DeptId) {
191
+      this.F_DeptId = F_DeptId
192
+      if (F_DeptId === '') {
193
+        this.$message({
194
+          message: '请选择一行编辑!',
195
+          type: 'warning'
196
+        })
197
+        return
198
+      }
199
+      this.$layer.iframe({
200
+        content: {
201
+          content: addOrEditDepartment, // 传递的组件对象
202
+          parent: this, // 当前的vue对象
203
+          data: { rowid: F_DeptId, listPid: this.listPid } // props//该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
204
+        },
205
+        area: ['80%', '90%'],
206
+        shadeClose: false,
207
+        title: '编辑部门分类'
208
+      })
209
+      this.F_DeptId = ''
210
+    },
211
+    // 删除
212
+    btn_delete(F_DeptId) {
213
+      this.F_DeptId = F_DeptId
214
+      if (this.F_DeptId === '') {
215
+        this.$message({
216
+          message: '没有可删除的选项!',
217
+          type: 'warning'
218
+        })
219
+      } else {
220
+        const id = F_DeptId
221
+        this.deleteType(F_DeptId)
222
+      }
223
+      this.F_DeptId = ''
224
+    },
225
+    // 删除
226
+    deleteType(id) {
227
+      this.$confirm('您确定要删除吗?', '提示', {
228
+        confirmButtonText: '确定',
229
+        cancelButtonText: '取消',
230
+        type: 'warning'
231
+      })
232
+        .then(() => {
233
+          deleteType(id).then((response) => {
234
+            if (response.state.toLowerCase() === 'success') {
235
+              this.listGrade = 1
236
+              this.depId = 0
237
+              this.getDepList()
238
+              this.$message.success('删除成功!')
239
+            }
240
+          })
241
+        })
242
+        .catch(() => {
243
+          this.$message.info('已取消删除')
244
+        })
245
+    },
246
+    // handleCurrentChange(data) {
247
+    //   if (data.F_DeptId !== 0) {
248
+    //     this.depId = data.F_DeptId
249
+    //     this.listGrade = 2
250
+    //     this.addPid = this.depId
251
+    //     this.getDepList()
252
+    //   } else {
253
+    //     this.depId = 0
254
+    //   }
255
+    //   this.teamLists = []
256
+    // },
257
+    // 搜索
258
+    btn_search() {
259
+      this.pageParams.pageindex = 1
260
+      // this.getList()
261
+    }
262
+    //  点击某一行中心
263
+    // handleTableClick(row, event, column) {
264
+    //   if (row.F_DeptId !== 0) {
265
+    //     this.teamLists = []
266
+    //     this.clickId = row.F_Id
267
+    //     this.listGrade = 3
268
+    //     this.getDepList()
269
+    //   } else {
270
+    //     this.depId = 0
271
+    //   }
272
+    // }
273
+
274
+  }
275
+}
276
+</script>
277
+<style lang="scss" scoped>
278
+.search {
279
+  text-align: right !important;
280
+}
281
+</style>

+ 1 - 1
CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/roleSetup/index.vue

@@ -15,7 +15,7 @@
15 15
           <el-table-column type="index" label="编号" align="center" fixed width="80" />
16 16
           <el-table-column prop="F_RoleName" label="用户角色" align="center" min-width="" />
17 17
           <el-table-column prop="F_RoleCode" label="角色代码" align="center" min-width="" />
18
-          <el-table-column prop="F_CreateTime" label="创建时间" align="center" min-width="" />
18
+          <el-table-column prop="F_CreateTime" label="创建时间" align="center" width="200" />
19 19
           <el-table-column prop="F_CreateUser" label="创建人" align="center" min-width="" />
20 20
           <el-table-column prop="F_Remark" label="备注" align="center" min-width="" />
21 21
         </el-table>

+ 147 - 403
CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/userManage/addOrEdit.vue

@@ -3,18 +3,19 @@
3 3
     <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="120px" class="userAccount_form">
4 4
       <el-row :gutter="20">
5 5
         <el-col :md="12" class="col_item">
6
-          <el-form-item label="工号" prop="usercode">
7
-            <el-input v-model="ruleForm.usercode" auto-complete="off" placeholder="请输入工号" />
6
+          <el-form-item label="姓名" prop="Username">
7
+            <el-input v-model="ruleForm.Username" auto-complete="off" placeholder="请输入姓名" />
8 8
           </el-form-item>
9 9
         </el-col>
10 10
         <el-col :md="12" class="col_item">
11
-          <el-form-item label="姓名" prop="username">
12
-            <el-input v-model="ruleForm.username" auto-complete="off" placeholder="请输入姓名" />
11
+          <el-form-item label="工号" prop="Usercode">
12
+            <el-input v-model="ruleForm.Usercode" auto-complete="off" placeholder="请输入工号" />
13 13
           </el-form-item>
14 14
         </el-col>
15
+        <!-- v-if="!rowid" -->
15 16
         <el-col v-if="!rowid" :md="12" class="col_item">
16
-          <el-form-item label="密码" prop="passwordEnter">
17
-            <el-input v-model="ruleForm.passwordEnter" type="password" auto-complete="off" placeholder="请输入密码" />
17
+          <el-form-item label="密码" prop="Password">
18
+            <el-input v-model="ruleForm.Password" type="password" auto-complete="off" placeholder="请输入密码" />
18 19
           </el-form-item>
19 20
         </el-col>
20 21
         <el-col v-if="!rowid" :md="12" class="col_item">
@@ -23,66 +24,41 @@
23 24
           </el-form-item>
24 25
         </el-col>
25 26
         <el-col :md="12" class="col_item">
26
-          <el-form-item label="分机号" prop="extensionnumber">
27
-            <el-input v-model="ruleForm.extensionnumber" placeholder="请输入分机号" />
27
+          <el-form-item label="分机号" prop="Extno">
28
+            <el-input v-model="ruleForm.Extno" placeholder="请输入分机号" />
28 29
           </el-form-item>
29 30
         </el-col>
30 31
         <el-col :md="12" class="col_item">
31
-          <el-form-item label="所属部门" prop="deptid">
32
-            <el-cascader ref="myCascader" v-model="parentids" :options="departmentDropDatas" :props="props" :placeholder="departmentPlaceholder" :class="{ form_cascader: is_form_cascader }" clearable filterable change-on-select style="width: 100%" @change="handledepartment" />
32
+          <el-form-item label="所属部门" prop="DeptId">
33
+            <el-cascader
34
+              ref="myCascader"
35
+              v-model="parentids"
36
+              :options="departmentDropDatas"
37
+              :props="props"
38
+              :placeholder="departmentPlaceholder"
39
+              :class="{ form_cascader: is_form_cascader }"
40
+              clearable
41
+              filterable
42
+              change-on-select
43
+              style="width: 100%"
44
+              @change="handledepartment" />
33 45
           </el-form-item>
34 46
         </el-col>
35 47
         <el-col :md="12" class="col_item">
36
-          <el-form-item label="中心" prop="deptteam">
37
-            <el-select v-model="ruleForm.deptteam" class="form_select" filterable clearable placeholder="请选择中心" @change="handleteam">
38
-              <el-option v-for="item in teamData" :key="item.F_Id" :label="item.F_Name" :value="item.F_Id" />
39
-            </el-select>
40
-          </el-form-item>
41
-        </el-col>
42
-        <el-col :md="12" class="col_item">
43
-          <el-form-item label="小组" prop="group ">
44
-            <el-select v-model="ruleForm.group" class="form_select" filterable clearable placeholder="请选择小组" @change="handlegrop">
45
-              <el-option v-for="item in gropData" :key="item.F_Id" :label="item.F_Name" :value="item.F_Id" />
46
-            </el-select>
47
-          </el-form-item>
48
-        </el-col>
49
-        <el-col :md="12" class="col_item">
50
-          <el-form-item label="职位" prop="dutyid">
51
-            <el-select v-model="ruleForm.dutyid" class="form_select" filterable clearable placeholder="请选择职位">
52
-              <el-option v-for="item in positoinData" :key="item.F_Id" :label="item.F_Name" :value="item.F_Id" />
53
-            </el-select>
54
-          </el-form-item>
55
-        </el-col>
56
-        <el-col :md="12" class="col_item">
57
-          <el-form-item label="入职日期" prop="entrydate">
58
-            <el-date-picker v-model="ruleForm.entrydate" type="date" value-format="yyyy-MM-dd" class="form_date" placeholder="请选择入职日期" />
59
-          </el-form-item>
60
-        </el-col>
61
-        <el-col :md="12" class="col_item">
62
-          <el-form-item label="转正日期" prop="fulldate">
63
-            <el-date-picker v-model="ruleForm.fulldate" type="date" value-format="yyyy-MM-dd" class="form_date" placeholder="请选择转正日期" />
64
-          </el-form-item>
65
-        </el-col>
66
-        <el-col :md="12" class="col_item">
67
-          <el-form-item label="离职日期" prop="termdate">
68
-            <el-date-picker v-model="ruleForm.termdate" type="date" value-format="yyyy-MM-dd" class="form_date" placeholder="请选择离职日期" />
69
-          </el-form-item>
70
-        </el-col>
71
-        <el-col :md="12" class="col_item">
72
-          <el-form-item label="用户角色" prop="roleid">
73
-            <el-select v-model="ruleForm.roleid" class="form_select" filterable clearable placeholder="请选择用户角色">
48
+          <el-form-item label="用户角色" prop="RoleId">
49
+            <el-select v-model="ruleForm.RoleId" class="form_select" filterable clearable placeholder="请选择用户角色">
74 50
               <el-option v-for="item in roleOptions" :key="item.F_RoleId" :label="item.F_RoleName" :value="item.F_RoleId" />
75 51
             </el-select>
76 52
           </el-form-item>
77 53
         </el-col>
78 54
         <el-col :md="12" class="col_item">
79
-          <el-form-item label="坐席等级" prop="seatlevel">
80
-            <el-input v-model="ruleForm.seatlevel" placeholder="请输入坐席等级" />
55
+          <el-form-item label="电话" prop="Phon">
56
+            <el-input v-model="ruleForm.Phon" placeholder="请输入电话" />
81 57
           </el-form-item>
82 58
         </el-col>
83 59
         <el-col :md="12" class="col_item">
84
-          <el-form-item label="性别" prop="sexflag">
85
-            <el-radio-group v-model="ruleForm.sexflag">
60
+          <el-form-item label="性别" prop="sex">
61
+            <el-radio-group v-model="ruleForm.sex">
86 62
               <el-radio label="男">男</el-radio>
87 63
               <el-radio label="女">女</el-radio>
88 64
               <el-radio label="未知">未知</el-radio>
@@ -90,68 +66,13 @@
90 66
           </el-form-item>
91 67
         </el-col>
92 68
         <el-col :md="12" class="col_item">
93
-          <el-form-item label="电话" prop="telephone">
94
-            <el-input v-model="ruleForm.telephone" placeholder="请输入电话" />
95
-          </el-form-item>
96
-        </el-col>
97
-        <el-col :md="12" class="col_item">
98
-          <el-form-item label="手机" prop="mobile">
99
-            <el-input v-model="ruleForm.mobile" placeholder="请输入手机" />
100
-          </el-form-item>
101
-        </el-col>
102
-        <el-col :md="12" class="col_item">
103
-          <el-form-item label="家庭电话" prop="homephone">
104
-            <el-input v-model="ruleForm.homephone" placeholder="请输入家庭电话" />
69
+          <el-form-item label="备注" prop="Remark">
70
+            <el-input v-model="ruleForm.Remark" placeholder="备注" />
105 71
           </el-form-item>
106 72
         </el-col>
107 73
         <el-col :md="12" class="col_item">
108
-          <el-form-item label="外线号码" prop="wxno">
109
-            <el-input v-model="ruleForm.wxno" placeholder="请输入外线号码" />
110
-          </el-form-item>
111
-        </el-col>
112
-        <el-col :md="12" class="col_item">
113
-          <el-form-item label="备注" prop="remark">
114
-            <el-input v-model="ruleForm.remark" placeholder="备注" />
115
-          </el-form-item>
116
-        </el-col>
117
-        <!-- <el-col :md="12" class="col_item">
118
-          <el-form-item label="提醒标志" prop="remindflag">
119
-            <el-switch v-model="ruleForm.remindflag" active-value="true" inactive-value="false" @change="changeRemindFlag"/>
120
-          </el-form-item>
121
-        </el-col> -->
122
-        <el-col :md="12" class="col_item">
123
-          <el-form-item label="话务标志" prop="seatflag">
124
-            <el-switch v-model="ruleForm.seatflag" active-value="true" inactive-value="false" @change="changeSeatFlag" />
125
-          </el-form-item>
126
-        </el-col>
127
-        <el-col v-show="seatFlag" :md="12" class="col_item">
128
-          <el-form-item label="坐席组" prop="seartgroupiD">
129
-            <el-select v-model="ruleForm.seartgroupiD" class="form_select" filterable clearable placeholder="请选择坐席组">
130
-              <el-option v-for="item in seatOptions" :key="item.F_ZXZID" :label="item.F_ZXZName" :value="item.F_ZXZID" />
131
-            </el-select>
132
-          </el-form-item>
133
-        </el-col>
134
-        <el-col v-show="seatFlag" :md="12" class="col_item">
135
-          <el-form-item label="坐席组权限" prop="seatright">
136
-            <el-radio-group v-model="ruleForm.seatright">
137
-              <el-radio label="0">普通坐席</el-radio>
138
-              <el-radio label="1">班长坐席</el-radio>
139
-            </el-radio-group>
140
-          </el-form-item>
141
-        </el-col>
142
-        <el-col :md="24">
143
-          <el-form-item label="头像">
144
-            <el-col :md="8">
145
-              <el-button type="primary" plain @click="toggleShow">点击上传头像</el-button>
146
-              <p class="tips">提示:预览头像见右侧(上传成功后记得保存)</p>
147
-              <avatar-upload v-model="uploadAvatar.show" :url="uploadUrl" :params="uploadAvatar.params" :width="200" :height="200" :no-rotate="false" :headers="uploadData.uploadHeader" img-format="png" @crop-success="cropSuccess" @crop-upload-success="cropUploadSuccess" />
148
-            </el-col>
149
-            <el-col v-show="uploadAvatar.imgDataUrl" :md="8">
150
-              <img :src="uploadAvatar.imgDataUrl" alt="头像预览图" class="avatar_img_square" />
151
-            </el-col>
152
-            <el-col v-show="uploadAvatar.imgDataUrl" :md="8">
153
-              <img :src="uploadAvatar.imgDataUrl" alt="头像预览图" class="avatar_img_round" />
154
-            </el-col>
74
+          <el-form-item label="话务标志" prop="IsSeat">
75
+            <el-switch v-model="ruleForm.IsSeat" active-value="1" inactive-value="0" @change="changeSeatFlag" />
155 76
           </el-form-item>
156 77
         </el-col>
157 78
         <el-col :md="24">
@@ -165,34 +86,36 @@
165 86
 </template>
166 87
 
167 88
 <script>
168
-import md5 from "js-md5"
169
-import avatarUpload from "vue-image-crop-upload"
170
-import { mapGetters } from "vuex"
171
-import { getRoleSelect, getDictionary, getSeatGroup, getPro } from "@/api/commonAPI"
172
-import { getUserAccount, addUserAccount, editUserAccount, getPositionData, getTeamData } from "@/api/systemSetup/roleSetting/userManage"
173
-import { validUsername, validName, validPassword, validateTel, validIdCard, validEmail, validExtension } from "@/utils/validate"
174
-import { getTreeList } from "@/api/systemSetup/roleSetting/department"
175
-import { delFiles } from "@/utils"
176
-import { getTeamLists } from "@/api/systemSetup/sysSetting/teamManagement"
89
+import md5 from 'js-md5'
90
+import avatarUpload from 'vue-image-crop-upload'
91
+import { mapGetters } from 'vuex'
92
+import { getRoleSelect } from '@/api/commonAPI'
93
+import { getUserAccount, addUserAccount, editUserAccount } from '@/api/systemSetup/roleSetting/userManage'
94
+import { validUsername, validName, validPassword, validateTel, validExtension } from '@/utils/validate'
95
+import { getTreeList } from '@/api/systemSetup/roleSetting/department'
177 96
 export default {
178
-  name: "AddOrEdit",
97
+  name: 'AddOrEdit',
179 98
   components: {
180
-    "avatar-upload": avatarUpload,
99
+    'avatar-upload': avatarUpload
181 100
   },
182 101
   props: {
183 102
     rowid: {
184 103
       type: String,
185
-      default: "",
104
+      default: ''
186 105
     },
187
-    layerid: {
106
+    usercodeList: {
188 107
       type: String,
189
-      default: "",
108
+      default: ''
190 109
     },
110
+    layerid: {
111
+      type: String,
112
+      default: ''
113
+    }
191 114
   },
192 115
   data() {
193 116
     const validUsernameRule = (rule, value, callback) => {
194 117
       if (!validUsername(value)) {
195
-        callback(new Error("请输入有效的账号(4-20个字符只能是字母、下划线、数字)!"))
118
+        callback(new Error('请输入有效的账号(4-20个字符只能是字母、下划线、数字)!'))
196 119
       } else {
197 120
         callback()
198 121
       }
@@ -200,7 +123,7 @@ export default {
200 123
 
201 124
     const validNameRule = (rule, value, callback) => {
202 125
       if (!validName(value)) {
203
-        callback(new Error("请输入有效的姓名(2-20位汉字和·•的组合)!"))
126
+        callback(new Error('请输入有效的姓名(2-20位汉字和·•的组合)!'))
204 127
       } else {
205 128
         callback()
206 129
       }
@@ -208,10 +131,10 @@ export default {
208 131
 
209 132
     const validatePass = (rule, value, callback) => {
210 133
       if (!validPassword(value)) {
211
-        callback(new Error("请输入有效的密码(6-32个字符只能是字母、下划线、数字)!"))
134
+        callback(new Error('请输入有效的密码(6-32个字符只能是字母、下划线、数字)!'))
212 135
       } else {
213
-        if (this.checkPass !== "") {
214
-          this.$refs.ruleForm.validateField("checkPass")
136
+        if (this.checkPass !== '') {
137
+          this.$refs.ruleForm.validateField('checkPass')
215 138
         }
216 139
         callback()
217 140
       }
@@ -219,10 +142,10 @@ export default {
219 142
 
220 143
     const validatePass2 = (rule, value, callback) => {
221 144
       if (!validPassword(this.checkPass)) {
222
-        callback(new Error("请输入有效的确认密码(6-32个字符只能是字母、下划线、数字)!"))
145
+        callback(new Error('请输入有效的确认密码(6-32个字符只能是字母、下划线、数字)!'))
223 146
       } else {
224
-        if (this.checkPass !== this.ruleForm.passwordEnter) {
225
-          callback(new Error("两次输入密码不一致!"))
147
+        if (this.checkPass !== this.ruleForm.Password) {
148
+          callback(new Error('两次输入密码不一致!'))
226 149
         }
227 150
         callback()
228 151
       }
@@ -230,7 +153,7 @@ export default {
230 153
 
231 154
     const validateTelRule = (rule, value, callback) => {
232 155
       if (!validateTel(value)) {
233
-        callback(new Error("请输入有效的手机号码!"))
156
+        callback(new Error('请输入有效的手机号码!'))
234 157
       } else {
235 158
         callback()
236 159
       }
@@ -239,7 +162,7 @@ export default {
239 162
     const validGroupRule = (rule, value, callback) => {
240 163
       if (this.seatFlag) {
241 164
         if (!value) {
242
-          callback(new Error("请选择坐席组!"))
165
+          callback(new Error('请选择坐席组!'))
243 166
         } else {
244 167
           callback()
245 168
         }
@@ -249,9 +172,9 @@ export default {
249 172
     }
250 173
 
251 174
     const validateExt = (rule, value, callback) => {
252
-      if (value != "") {
175
+      if (value !== '') {
253 176
         if (!validExtension(value)) {
254
-          callback(new Error("分机号格式(4-20个字符只能是数字)!"))
177
+          callback(new Error('分机号格式(4-20个字符只能是数字)!'))
255 178
         } else {
256 179
           callback()
257 180
         }
@@ -261,144 +184,92 @@ export default {
261 184
     }
262 185
 
263 186
     return {
264
-      uploadUrl: this.$store.getters.serverConfig.BASE_API + "Api/Upload",
265
-      uploadData: {
266
-        uploadHeader: {
267
-          Authorization: "",
268
-        },
269
-      },
270
-      uploadAvatar: {
271
-        show: false,
272
-        params: {
273
-          uploadtype: "avatar",
274
-        },
275
-        imgDataUrl: "", // 头像剪切后生成的 datebase64格式的url
276
-      },
277 187
       roleOptions: [], // 角色下拉数据
278 188
       parentids: [], // 部门下拉数据
279
-      seatOptions: [], // 坐席组下拉数据
280
-      positoinData: [], // 职位下拉数据
281
-      teamData: [], // 中心下拉数据
282
-      gropData: [], // 小组下拉数据
283 189
       seatFlag: false, // 话务标识
284
-      checkPass: "", // 确认密码
285
-      departmentteamid: "", // 中心的部门id
286
-      deptteamid: "", // 中心的部门id(详情)
190
+      checkPass: '', // 确认密码
287 191
       ruleForm: {
288
-        userid: "",
289
-        usercode: "",
290
-        username: "",
291
-        password: "",
292
-        passwordEnter: "",
293
-        extensionnumber: "", // 分机号
294
-        deptid: "", // 所属部门id
295
-        dept: "", // 部门名称
296
-        roleid: "", // 角色
297
-        dutyid: "", // 职位信息
298
-        deptteamid: "", // 中心id
299
-        deptteam: "", // 中心姓名
300
-        groupid: "", // 小组信息
301
-        group: "", // 小组名称
302
-        entrydate: "", // 入职日期
303
-        fulldate: "", // 转正日期
304
-        termdate: "", // 离职日期
305
-        seatlevel: "", // 坐席等级
306
-        sexflag: "男", // 性别
307
-        remindflag: false, // 提醒标志
308
-        telephone: "", // 电话
309
-        mobile: "", // 手机号码
310
-        homephone: "", // 家庭电话
311
-        wxno: "", // 外线电话
312
-        headimg: "", // 头像大图
313
-        head_small_img: "", // 头像缩略图
314
-        remark: "",
192
+        userid: '',
193
+        Usercode: '',
194
+        Username: '',
195
+        // password: '',
196
+        Password: '',
197
+        Extno: '', // 分机号
198
+        sex: '男', // 性别
199
+        DeptId: '', // 所属部门id
200
+        RoleId: '', // 角色
201
+        Phon: '', // 电话
202
+        Remark: '',
203
+        SeatGroup: 1,
315 204
         // 话务相关
316
-        seatflag: "false", // 标志
317
-        seartgroupiD: "", // 坐席组id
318
-        seatright: "0", // 坐席组权限
205
+        IsSeat: 0 // 标志
319 206
       },
320 207
       rules: {
321
-        usercode: [
208
+        Usercode: [
322 209
           {
323 210
             required: true,
324
-            trigger: "blur",
325
-            validator: validUsernameRule,
326
-          },
211
+            trigger: 'blur',
212
+            validator: validUsernameRule
213
+          }
327 214
         ],
328
-        username: [
215
+        Username: [
329 216
           {
330 217
             required: true,
331
-            trigger: "blur",
332
-            validator: validNameRule,
333
-          },
218
+            trigger: 'blur',
219
+            validator: validNameRule
220
+          }
334 221
         ],
335
-        passwordEnter: [
222
+        Password: [
336 223
           {
337 224
             required: true,
338
-            trigger: "blur",
339
-            validator: validatePass,
340
-          },
225
+            trigger: 'blur',
226
+            validator: validatePass
227
+          }
341 228
         ],
342 229
         checkPass: [
343 230
           {
344 231
             required: true,
345
-            trigger: "blur",
346
-            validator: validatePass2,
347
-          },
232
+            trigger: 'blur',
233
+            validator: validatePass2
234
+          }
348 235
         ],
349 236
         type: [
350 237
           {
351 238
             required: true,
352
-            message: "请选择用户类型",
353
-            trigger: "change",
354
-          },
355
-        ],
356
-        roleid: [
357
-          {
358
-            required: true,
359
-            message: "请选择用户角色",
360
-            trigger: "change",
361
-          },
239
+            message: '请选择用户类型',
240
+            trigger: 'change'
241
+          }
362 242
         ],
363
-        // mobile: [{
364
-        //   required: true,
365
-        //   trigger: 'blur',
366
-        //   validator: validateTelRule
367
-        // }],
368
-        seartgroupiD: [
243
+        RoleId: [
369 244
           {
370 245
             required: true,
371
-            trigger: "change",
372
-            validator: validGroupRule,
373
-          },
374
-        ],
375
-        // extensionnumber: [{
376
-        //   required: false,
377
-        //   trigger: 'blur',
378
-        //   validator: validateExt
379
-        // }]
246
+            message: '请选择用户角色',
247
+            trigger: 'change'
248
+          }
249
+        ]
380 250
       },
381 251
       loading: false,
382 252
       departmentDropDatas: [], // 下拉分类
383 253
       // 自定义菜单下拉数据的key值
384 254
       props: {
385
-        value: "id",
386
-        label: "text",
255
+        value: 'id',
256
+        label: 'text'
387 257
       },
388
-      departmentPlaceholder: "请选择部门", // 部门提示
389
-      is_form_cascader: false,
258
+      departmentPlaceholder: '请选择部门', // 部门提示
259
+      is_form_cascader: false
390 260
     }
391 261
   },
392 262
   computed: {
393
-    ...mapGetters(["token", "avatar", "usercode"]),
263
+    ...mapGetters(['token', 'avatar', 'usercode'])
394 264
   },
395 265
   created() {
396
-    this.uploadData.uploadHeader.Authorization = this.token
397
-    Promise.all([this.getRoleSelects(), this.getTypeDrop(), this.getPosition(), this.getSeatGroupSelects()]).then(() => {
266
+    // , this.getTypeDrop()
267
+    Promise.all([this.getRoleSelects(), this.getTypeDrop()]).then(() => {
398 268
       if (this.rowid) {
399 269
         this.ruleForm.userid = this.rowid
270
+        this.ruleForm.Usercode = this.usercodeList
400 271
         this.is_form_cascader = true
401
-        this.getDetail(this.rowid)
272
+        this.getDetail(this.rowid, this.usercodeList)
402 273
       }
403 274
     })
404 275
   },
@@ -408,16 +279,17 @@ export default {
408 279
       this.$refs.ruleForm.validate((valid) => {
409 280
         if (valid) {
410 281
           this.loading = true
282
+          // this.ruleForm.Password = md5(this.ruleForm.Password)
411 283
           // 添加
412 284
           if (!this.rowid) {
413
-            this.ruleForm.password = md5(this.ruleForm.passwordEnter)
285
+            this.ruleForm.Password = md5(this.ruleForm.Password)
414 286
             addUserAccount(this.ruleForm)
415 287
               .then((response) => {
416 288
                 this.loading = false
417
-                if (response.state.toLowerCase() === "success") {
289
+                if (response.state.toLowerCase() === 'success') {
418 290
                   this.$parent.$layer.close(this.layerid)
419 291
                   this.$parent.getList() // 重新加载父级数据
420
-                  this.$message.success("恭喜你,用户信息添加成功!")
292
+                  this.$message.success('恭喜你,用户信息添加成功!')
421 293
                 }
422 294
               })
423 295
               .catch(() => {
@@ -426,78 +298,50 @@ export default {
426 298
             return
427 299
           }
428 300
           // 编辑
429
-          this.ruleForm.password = null
430 301
           editUserAccount(this.ruleForm)
431 302
             .then((response) => {
432
-              // 更新头像
433
-              if (this.ruleForm.usercode === this.usercode && this.ruleForm.head_small_img) {
434
-                this.$store.dispatch("SetAvatar", this.ruleForm.head_small_img)
435
-              }
436 303
               this.loading = false
437
-              if (response.state.toLowerCase() === "success") {
304
+              if (response.state.toLowerCase() === 'success') {
438 305
                 this.$parent.$layer.close(this.layerid)
439 306
                 this.$parent.getList() // 重新加载父级数据
440
-                this.$message.success("恭喜你,用户信息编辑成功!")
307
+                this.$message.success('恭喜你,用户信息编辑成功!')
441 308
               }
442 309
             })
443 310
             .catch(() => {
444 311
               this.loading = false
445 312
             })
446 313
         } else {
447
-          this.$message.error("请输入有效的必填项信息!")
314
+          this.$message.error('请输入有效的必填项信息!')
448 315
           return false
449 316
         }
450 317
       })
451 318
     },
452 319
     // 详情
453
-    getDetail(rid) {
454
-      getUserAccount(rid).then((response) => {
455
-        if (response.state.toLowerCase() === "success") {
320
+    getDetail() {
321
+      const params = {
322
+        userid: this.rowid, // 第几页 Usercode
323
+        usercode: this.usercodeList
324
+
325
+      }
326
+      getUserAccount(params).then((response) => {
327
+        if (response.state.toLowerCase() === 'success') {
456 328
           const res = response.data
457
-          // headimg: '', // 头像大图
458
-          // head_small_img: '', // 头像缩略图
459
-          this.ruleForm.usercode = res.F_UserCode // 工号
460
-          this.ruleForm.username = res.F_UserName // 姓名
461
-          this.ruleForm.extensionnumber = res.F_ExtensionNumber // 分机号
462
-          this.ruleForm.roleid = res.F_RoleId // 角色
463
-          this.ruleForm.dutyid = res.F_DutyId && res.F_DutyId + "" // 职位
464
-          this.ruleForm.deptid = res.F_DeptId // 所属部门
465
-          this.ruleForm.dept = res.F_Dept
466
-          this.ruleForm.deptteamid = res.F_DeptTeamId // 中心
467
-          this.ruleForm.deptteam = res.F_Team
468
-          this.ruleForm.groupid = res.F_GroupId // 小组信息
469
-          this.ruleForm.group = res.F_Group
470
-          this.ruleForm.entrydate = res.F_EntryDate // 入职日期
471
-          this.ruleForm.fulldate = res.F_FullDate // 转正日期
472
-          this.ruleForm.termdate = res.F_TermDate // 离职日期
473
-          this.ruleForm.seatlevel = res.F_SeatLevel // 坐席等级
474
-          this.ruleForm.sexflag = res.F_SexFlag && res.F_SexFlag + "" //
475
-          this.ruleForm.remindflag = res.F_RemindFlag && res.F_RemindFlag + "" // 提醒标志
476
-          this.ruleForm.telephone = res.F_Telephone // 电话
477
-          this.ruleForm.mobile = res.F_Mobile // 手机号码
478
-          this.ruleForm.homephone = res.F_HomePhone // 家庭电话
479
-          this.ruleForm.wxno = res.F_WXNo // 外线电话
480
-          this.uploadAvatar.imgDataUrl = res.head_small_img // 头像预览图
481
-          this.ruleForm.headimg = res.F_HeadImg // 头像大图
482
-          // this.ruleForm.head_small_img = res.head_small_img // 头像缩略图
483
-          this.ruleForm.remark = res.F_Remark
484
-          this.departmentPlaceholder = res.F_Dept
485
-          // 话务相关
486
-          this.ruleForm.seatflag = res.F_SeatFlag && res.F_SeatFlag + "" // 话务标志
487
-          this.seatFlag = res.F_SeatFlag
488
-          this.ruleForm.seartgroupiD = res.F_SeartGroupID // 坐席组id
489
-          this.ruleForm.seatright = res.F_SeatRight === null ? res.F_SeatRight : res.F_SeatRight + "" // 坐席类型 默认普通坐席
329
+          this.ruleForm.Usercode = res.F_UserCode // 工号
330
+          this.ruleForm.Username = res.F_UserName // 姓名 Phon
331
+          this.ruleForm.Extno = res.F_ExtensionNumber // 分机号
332
+          this.ruleForm.RoleId = res.F_RoleId // 角色
333
+          this.ruleForm.DeptId = res.F_DeptId // 所属部门
334
+          // this.ruleForm.Password = res.F_Password // 密码
335
+          // this.checkPass = res.F_Password // 密码
336
+          // this.ruleForm.dept = res.F_Dept
337
+          this.ruleForm.Phon = res.F_Telephone // 电话
338
+          this.ruleForm.sex = res.F_Sex && res.F_Sex + '' //
339
+          this.ruleForm.Remark = res.F_Remark
340
+          this.departmentPlaceholder = res.F_DeptName
341
+          this.ruleForm.IsSeat = res.F_SeatFlag.toString()
490 342
         }
491
-        // if (this.ruleForm.deptid) {
492
-        //   this.getTeam(this.ruleForm.deptid)
493
-        //   this.ruleForm.deptteamid = this.deptteamid
494
-        // }
495 343
       })
496 344
     },
497
-    // 话务提醒标识切换
498
-    changeRemindFlag() {
499
-      this.remindflag = !this.remindflag
500
-    },
501 345
     // 话务标识切换
502 346
     changeSeatFlag() {
503 347
       this.seatFlag = !this.seatFlag
@@ -505,135 +349,35 @@ export default {
505 349
     // 获取角色下拉数据
506 350
     getRoleSelects() {
507 351
       return new Promise((resolve) => {
508
-        getRoleSelect().then((response) => {
509
-          if (response.state.toLowerCase() === "success") {
510
-            this.roleOptions = response.data
352
+        const params = {
353
+          pageindex: 1, // 第几页
354
+          pagesize: 9999 // 每页几条信息
355
+        }
356
+        getRoleSelect(params).then((response) => {
357
+          console.log(response.rows)
358
+          if (response.rows.length > 0) {
359
+            this.roleOptions = response.rows
511 360
           }
512 361
         })
513 362
         resolve()
514 363
       })
515 364
     },
516
-    // 获取部门下拉数据
365
+    // 获取部门下拉数据  getTreeList
517 366
     getTypeDrop() {
518 367
       return new Promise((resolve) => {
519 368
         getTreeList().then((response) => {
520
-          if (response.state.toLowerCase() === "success") {
369
+          if (response.state.toLowerCase() === 'success') {
521 370
             this.departmentDropDatas = response.data
522 371
           }
523 372
         })
524 373
         resolve()
525 374
       })
526 375
     },
527
-    // 获取职位数据
528
-    getPosition() {
529
-      getPositionData().then((response) => {
530
-        if (response.state.toLowerCase() == "success") {
531
-          this.positoinData = response.data
532
-        }
533
-      })
534
-    },
535 376
     // 部门选择信息
536 377
     handledepartment(e) {
537
-      this.ruleForm.deptid = e[e.length - 1]
538
-      console.log(this.ruleForm.deptid)
539
-      this.ruleForm.deptteamid = ""
540
-      this.ruleForm.dept = this.$refs["myCascader"].currentLabels[this.$refs["myCascader"].currentLabels.length - 1] // label
541
-      this.getTeam()
542
-    },
543
-    // 获取中心数据
544
-    getTeam() {
545
-      const params = {
546
-        pageindex: 1, // 第几页
547
-        pagesize: 500, // 每页几条信息
548
-        deptid: this.ruleForm.deptid, // 部门id
549
-        type: 0,
550
-      }
551
-      getTeamLists(params).then((response) => {
552
-        if (response.state.toLowerCase() === "success") {
553
-          this.teamData = response.data.Rows
554
-        }
555
-      })
556
-    },
557
-    // 中心选择
558
-    handleteam(e) {
559
-      this.ruleForm.deptteamid = e
560
-      console.log(e)
561
-      var obj = {}
562
-      obj = this.teamData.find((item) => {
563
-        // 这里的teamData就是上面遍历的数据源
564
-        return item.F_Id === e // 筛选出匹配数据,这里的value是你遍历数组每一项的value,如果没有对后台返回的数据做处理,一般为id
565
-      })
566
-      this.ruleForm.deptteam = obj.F_Name //  这里的label就是对应label的
567
-      this.getteamList()
568
-      this.ruleForm.groupid = ""
569
-    },
570
-    // 获取小组列表数据
571
-    getteamList() {
572
-      this.loading = true
573
-      return new Promise((resolve) => {
574
-        const params = {
575
-          pageindex: 1, // 第几页
576
-          pagesize: 500, // 每页几条信息
577
-          type: 1,
578
-          deptid: this.ruleForm.deptid, // 部门id
579
-          parentid: this.ruleForm.deptteamid,
580
-        }
581
-        getTeamLists(params).then((response) => {
582
-          this.loading = false
583
-          if (response.state.toLowerCase() === "success") {
584
-            this.gropData = response.data.Rows
585
-          }
586
-        })
587
-        resolve()
588
-      })
589
-    },
590
-    // 小组选择
591
-    handlegrop(e) {
592
-      this.ruleForm.groupid = e
593
-      var obj = {}
594
-      obj = this.gropData.find((item) => {
595
-        // 这里的teamData就是上面遍历的数据源
596
-        return item.F_Id === e // 筛选出匹配数据,这里的value是你遍历数组每一项的value,如果没有对后台返回的数据做处理,一般为id
597
-      })
598
-
599
-      this.ruleForm.group = obj.F_Name //  这里的label就是对应label的
600
-    },
601
-    // 获取坐席组下拉数据
602
-    getSeatGroupSelects() {
603
-      return new Promise((resolve) => {
604
-        getSeatGroup().then((response) => {
605
-          if (response.state.toLowerCase() === "success") {
606
-            this.seatOptions = response.data
607
-          }
608
-        })
609
-        resolve()
610
-      })
611
-    },
612
-
613
-    // 头像
614
-    toggleShow() {
615
-      this.uploadAvatar.show = !this.uploadAvatar.show
616
-    },
617
-    cropSuccess(imgDataUrl, field) {
618
-      this.uploadAvatar.imgDataUrl = imgDataUrl
619
-    },
620
-    cropUploadSuccess(jsonData, field) {
621
-      if (jsonData.state.toLowerCase() === "success") {
622
-        this.ruleForm.headimg = jsonData.data[0].fileurl
623
-        // this.ruleForm.head_small_img = jsonData.data[0].filesmallurl// 头像缩略图
624
-      }
625
-    },
626
-    // 重置 上传文件
627
-    resetUploads(rEl, pEl) {
628
-      if (this.ruleForm[rEl].length > 0) {
629
-        for (let i = this.ruleForm[rEl].length - 1; i >= 0; i--) {
630
-          delFiles(this.ruleForm[rEl][i].filesmallurl, this.ruleForm[rEl][i].fileurl)
631
-          this.ruleForm[rEl].splice(i, 1)
632
-        }
633
-      }
634
-      this.$refs[pEl].clearFiles() // 清空已上传的文件列表(该方法不支持在 before-upload 中调用)
635
-    },
636
-  },
378
+      this.ruleForm.DeptId = e[e.length - 1]
379
+    }
380
+  }
637 381
 }
638 382
 </script>
639 383
 

+ 25 - 248
CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/userManage/index.vue

@@ -1,60 +1,34 @@
1 1
 <template>
2 2
   <div class="app-container usermanage">
3 3
     <div class="filter-container">
4
-      <el-cascader ref="myCascader" v-model="parentids" :options="departmentDropDatas" :props="props" class="filter-item" placeholder="请选择部门" clearable filterable change-on-select @change="handledepartment" />
5
-      <el-select v-model="deptteam" class="filter-item form_select" filterable clearable placeholder="请选择中心" @change="handleteam" @clear="clearTeam">
6
-        <el-option v-for="item in teamData" :key="item.F_Id" :label="item.F_Name" :value="item.F_Id" />
7
-      </el-select>
8
-      <el-select v-model="group" class="filter-item form_select" filterable clearable placeholder="请选择小组" @change="handlegrop" @clear="clearGroup">
9
-        <el-option v-for="item in gropData" :key="item.F_Id" :label="item.F_Name" :value="item.F_Id" />
10
-      </el-select>
11
-      <el-select v-model="roleId" class="filter-item" filterable clearable placeholder="请选择角色">
12
-        <el-option v-for="item in roleOptions" :key="item.F_RoleId" :label="item.F_RoleName" :value="item.F_RoleId" />
13
-      </el-select>
14 4
       <el-input v-model="keyword" placeholder="请输入工号,姓名,电话,手机" class="filter-item" />
15 5
       <el-button type="primary" class="filter-item" icon="el-icon-search" @click="btn_search">搜索</el-button>
16
-      <el-button v-permission="'HY_add'" type="primary" class="filter-item" icon="el-icon-plus" @click="btn_add">添加</el-button>
17
-      <el-button v-permission="'HY_import'" type="primary" class="filter-item" @click="btn_import">导入</el-button>
18
-      <el-button v-permission="'HY_deletes'" type="primary" class="filter-item" icon="el-icon-delete" @click="btn_deletes">批量删除</el-button>
6
+      <el-button type="primary" class="filter-item" icon="el-icon-plus" @click="btn_add">添加</el-button>
7
+      <!-- <el-button type="primary" class="filter-item" icon="el-icon-delete" @click="btn_deletes">批量删除</el-button> -->
19 8
     </div>
20
-
21 9
     <el-table v-loading="loading" :data="dataLists" border stripe @selection-change="changeSelects">
22 10
       <el-table-column type="selection" width="40" />
23
-      <el-table-column prop="F_UserCode" label="工号" align="center" min-width="" />
24 11
       <el-table-column prop="F_UserName" label="姓名" align="center" min-width="" />
25
-      <el-table-column prop="F_Dept" label="部门" align="center" min-width="" />
26
-      <el-table-column prop="F_Group" label="小组" align="center" min-width="" />
27
-      <el-table-column prop="F_Role" label="角色" align="center" min-width="" />
28
-      <el-table-column prop="F_SeartGroup" label="坐席组" align="center" min-width="" />
12
+      <el-table-column prop="F_UserCode" label="工号" align="center" min-width="" />
13
+      <el-table-column prop="F_ExtensionNumber" label="工号" align="center" min-width="" />
14
+      <el-table-column prop="F_DeptName" label="部门" align="center" min-width="" />
15
+      <el-table-column prop="F_RoleName" label="角色" align="center" min-width="" />
16
+      <el-table-column prop="F_Sex" label="性别" align="center" min-width="" />
29 17
       <el-table-column label="标志" align="center" min-width="">
30 18
         <template slot-scope="scope">
31 19
           {{ scope.row.F_SeatFlag | userSeatFlagFilter }}
32 20
         </template>
33 21
       </el-table-column>
34
-      <el-table-column label="坐席权限组" align="center" min-width="">
35
-        <template slot-scope="scope">
36
-          {{ scope.row.F_SeatRight | userSeatRightFilter }}
37
-        </template>
38
-      </el-table-column>
39 22
       <el-table-column prop="F_Telephone" label="电话" align="center" min-width="" />
40
-      <el-table-column prop="F_Mobile" label="手机" align="center" min-width="" />
41 23
       <el-table-column label="启用禁用状态" align="center" min-width="">
42 24
         <template slot-scope="scope">
43 25
           {{ scope.row.F_DeleteFlag | userDeleteFlagFilter }}
44 26
         </template>
45 27
       </el-table-column>
46
-      <el-table-column prop="F_Duty" label="职位" align="center" min-width="" />
47
-      <el-table-column prop="F_EntryDate" label="入职日期" align="center" min-width="" />
48
-      <el-table-column prop="F_FullDate" label="转正日期" align="center" min-width="" />
49
-      <el-table-column prop="F_TermDate" label="离职日期" align="center" min-width="" />
50 28
       <el-table-column prop="F_CreateOn" label="添加日期" align="center" min-width="" />
51
-      <el-table-column prop="F_LastActiveTime" label="最后活跃时间" align="center" min-width="" />
52 29
       <el-table-column label="操作" width="320" align="center" class-name="oparate_btn" fixed="right">
53 30
         <template slot-scope="scope">
54
-          <el-button size="mini" plain type="primary" @click="btn_modifyPass(scope.row.F_UserId)">修改密码</el-button>
55
-          <el-button size="mini" plain type="primary" @click="btn_edit(scope.row.F_UserId.toString())">编辑</el-button>
56
-          <!-- <el-button v-if="scope.row.F_DeleteFlag == 2" size="mini" type="primary" @click="btn_start(scope.row.F_UserId)">启用</el-button>
57
-          <el-button v-else size="mini" type="danger" @click="btn_end(scope.row.F_UserId)">禁用</el-button> -->
31
+          <el-button size="mini" plain type="primary" @click="btn_edit(scope.row.F_UserId.toString(),scope.row.F_UserCode.toString())">编辑</el-button>
58 32
           <el-button size="mini" plain type="danger" @click="btn_delete(scope.row.F_UserId)">删除</el-button>
59 33
         </template>
60 34
       </el-table-column>
@@ -69,8 +43,6 @@ import { getUserAccountLists, deleteUserAccount } from '@/api/systemSetup/roleSe
69 43
 // import { getTreeList } from '@/api/systemSetup/roleSetting/department'
70 44
 // import { getTeamLists } from '@/api/systemSetup/sysSetting/teamManagement'
71 45
 import addOrEdit from './addOrEdit'
72
-import modifyPass from './modifyPass'
73
-import importUser from './importUser'
74 46
 import Pagination from '@/components/Pagination' // 对el-pagination 二次封装
75 47
 
76 48
 export default {
@@ -86,13 +58,6 @@ export default {
86 58
       }
87 59
       return statusMap[status]
88 60
     },
89
-    userSeatRightFilter(status) {
90
-      const statusMap = {
91
-        0: '普通坐席',
92
-        1: '班长坐席'
93
-      }
94
-      return statusMap[status]
95
-    },
96 61
     userDeleteFlagFilter(status) {
97 62
       const statusMap = {
98 63
         0: '启用',
@@ -105,17 +70,7 @@ export default {
105 70
     return {
106 71
       loading: false,
107 72
       roleId: '',
108
-      parentids: [],
109
-      roleOptions: [],
110 73
       keyword: '',
111
-      deptid: '', // 所属部门id
112
-      dept: '', // 部门名称
113
-      deptteamid: '', // 中心id
114
-      deptteam: '', // 中心姓名
115
-      groupid: '', // 小组信息
116
-      group: '', // 小组名称
117
-      teamData: [], // 中心下拉数据
118
-      gropData: [], // 小组下拉数据
119 74
       pageParams: {
120 75
         pageindex: 1, // 当前第几页
121 76
         pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
@@ -123,7 +78,6 @@ export default {
123 78
       },
124 79
       multipleSelection: [], // 选中的数据
125 80
       dataLists: [], // 列表数据
126
-      departmentDropDatas: [], // 下拉分类
127 81
       // 自定义菜单下拉数据的key值
128 82
       props: {
129 83
         value: 'id',
@@ -132,9 +86,7 @@ export default {
132 86
     }
133 87
   },
134 88
   created() {
135
-    this.getRoleSelects()
136 89
     this.getList()
137
-    this.getTypeDrop()
138 90
     document.onkeyup = (e) => {
139 91
       if (e.keyCode === 13) {
140 92
         this.getList()
@@ -146,35 +98,20 @@ export default {
146 98
       this.loading = true
147 99
       return new Promise((resolve) => {
148 100
         const params = {
149
-          pageindex: this.pageParams.pageindex, // 第几页
101
+          page: this.pageParams.pageindex, // 第几页
150 102
           pagesize: this.pageParams.pagesize, // 每页几条信息
151
-          keyword: this.keyword.replace(/\s+/g, ''), // 否	string	模糊查询
152
-          roleid: this.roleId, // 否	string	角色id
153
-          deptid: this.parentids[this.parentids.length - 1], // array  部门id
154
-          groupid: this.groupid, // 中心
155
-          teamId: this.deptteamid // 小组
103
+          keyword: this.keyword.replace(/\s+/g, '') // 否	string	模糊查询
156 104
         }
157 105
         getUserAccountLists(params).then((response) => {
158 106
           this.loading = false
159 107
           if (response.rows.length > 0) {
160
-            this.pageParams.total = response.Totals
108
+            this.pageParams.total = response.total
161 109
             this.dataLists = response.rows
162 110
           }
163 111
         })
164 112
         resolve()
165 113
       })
166 114
     },
167
-    // 获取部门下拉
168
-    getTypeDrop() {
169
-      // return new Promise((resolve) => {
170
-      //   getTreeList().then((response) => {
171
-      //     if (response.state.toLowerCase() === 'success') {
172
-      //       this.departmentDropDatas = response.data
173
-      //     }
174
-      //   })
175
-      //   resolve()
176
-      // })
177
-    },
178 115
     // 复选框状态改变
179 116
     changeSelects(val) {
180 117
       this.multipleSelection = val
@@ -194,28 +131,17 @@ export default {
194 131
         title: '添加用户信息'
195 132
       })
196 133
     },
197
-    btn_edit(editId) {
134
+    btn_edit(editId, usercode) {
198 135
       this.$layer.iframe({
199 136
         content: {
200 137
           content: addOrEdit, // 传递的组件对象
201 138
           parent: this, // 当前的vue对象
202
-          data: { rowid: editId } // props
139
+          data: { rowid: editId, usercodeList: usercode } // props
203 140
         },
204 141
         area: ['60%', '90%'],
205 142
         title: '编辑用户信息'
206 143
       })
207 144
     },
208
-    btn_modifyPass(editId) {
209
-      this.$layer.iframe({
210
-        content: {
211
-          content: modifyPass, // 传递的组件对象
212
-          parent: this, // 当前的vue对象
213
-          data: { rowid: editId } // props
214
-        },
215
-        area: ['40%', '360px'],
216
-        title: '修改密码'
217
-      })
218
-    },
219 145
     btn_delete(id) {
220 146
       this.$confirm('您确定要将此用户信息删除吗?', '提示', {
221 147
         confirmButtonText: '确定',
@@ -237,168 +163,19 @@ export default {
237 163
         .catch(() => {
238 164
           this.$message.info('已取消删除')
239 165
         })
240
-    },
241
-    btn_deletes() {
242
-      const ids = []
243
-      for (let i = 0, len = this.multipleSelection.length; i < len; i++) {
244
-        ids.push(this.multipleSelection[i].F_UserId)
245
-      }
246
-      if (ids.length <= 0) {
247
-        this.$message.warning('没有可删除的选项')
248
-        return
249
-      }
250
-      this.btn_delete(ids)
251
-    },
252
-    // 导入
253
-    btn_import() {
254
-      this.$layer.iframe({
255
-        content: {
256
-          content: importUser, // 传递的组件对象
257
-          parent: this, // 当前的vue对象
258
-          data: { rowid: '' } // props
259
-        },
260
-        area: ['30%', '30%'],
261
-        title: '导入'
262
-      })
263
-    },
264
-    // 获取角色下拉
265
-    getRoleSelects() {
266
-      // getRoleSelect().then((response) => {
267
-      //   if (response.state.toLowerCase() === 'success') {
268
-      //     this.roleOptions = response.data
269
-      //   }
270
-      // })
271
-    },
272
-    // 部门选择信息
273
-    handledepartment(e) {
274
-      this.deptid = e[e.length - 1]
275
-      this.deptteamid = ''
276
-      this.dept = this.$refs['myCascader'].currentLabels[this.$refs['myCascader'].currentLabels.length - 1] // label
277
-      this.getTeam()
278
-    },
279
-    // 获取中心数据
280
-    getTeam() {
281
-      // const params = {
282
-      //   pageindex: 1, // 第几页
283
-      //   pagesize: 500, // 每页几条信息
284
-      //   deptid: this.deptid, // 部门id
285
-      //   type: 0
286
-      // }
287
-      // getTeamLists(params).then((response) => {
288
-      //   if (response.state.toLowerCase() === 'success') {
289
-      //     this.teamData = response.data.Rows
290
-      //   }
291
-      // })
292
-    },
293
-    // 中心选择
294
-    handleteam(e) {
295
-      this.deptteamid = e
296
-      console.log(e)
297
-      var obj = {}
298
-      obj = this.teamData.find((item) => {
299
-        // 这里的teamData就是上面遍历的数据源
300
-        return item.F_Id === e // 筛选出匹配数据,这里的value是你遍历数组每一项的value,如果没有对后台返回的数据做处理,一般为id
301
-      })
302
-      this.deptteam = obj.F_Name //  这里的label就是对应label的
303
-      this.getteamList()
304
-      this.groupid = ''
305
-    },
306
-    // 获取小组列表数据
307
-    getteamList() {
308
-      // this.loading = true
309
-      // return new Promise((resolve) => {
310
-      //   const params = {
311
-      //     pageindex: 1, // 第几页
312
-      //     pagesize: 500, // 每页几条信息
313
-      //     type: 1,
314
-      //     deptid: this.deptid, // 部门id
315
-      //     parentid: this.deptteamid
316
-      //   }
317
-      //   getTeamLists(params).then((response) => {
318
-      //     this.loading = false
319
-      //     if (response.state.toLowerCase() === 'success') {
320
-      //       this.gropData = response.data.Rows
321
-      //     }
322
-      //   })
323
-      //   resolve()
324
-      // })
325
-    },
326
-    // 启用
327
-    btn_start(id) {
328
-      this.$confirm('您确定启用吗?', '提示', {
329
-        confirmButtonText: '确定',
330
-        cancelButtonText: '取消',
331
-        type: 'warning'
332
-      })
333
-        .then(() => {
334
-          return new Promise((resolve) => {
335
-            const params = {
336
-              ids: id,
337
-              state: 0 // 0启用1删除2禁用
338
-            }
339
-            deleteUserAccount(params).then((response) => {
340
-              this.loading = false
341
-              if (response.state.toLowerCase() === 'success') {
342
-                this.getList()
343
-                this.$message.success('启用成功!')
344
-              }
345
-            })
346
-            resolve()
347
-          })
348
-        })
349
-        .catch(() => {
350
-          this.$message.info('已取消启用')
351
-        })
352
-    },
353
-    // 禁用
354
-    btn_end(id) {
355
-      this.$confirm('您确定禁用吗?', '提示', {
356
-        confirmButtonText: '确定',
357
-        cancelButtonText: '取消',
358
-        type: 'warning'
359
-      })
360
-        .then(() => {
361
-          return new Promise((resolve) => {
362
-            const params = {
363
-              ids: id, //
364
-              state: 2 // 0启用1删除2禁用
365
-            }
366
-            deleteUserAccount(params).then((response) => {
367
-              this.loading = false
368
-              if (response.state.toLowerCase() === 'success') {
369
-                this.getList()
370
-                this.$message.success('禁用成功!')
371
-              }
372
-            })
373
-            resolve()
374
-          })
375
-        })
376
-        .catch(() => {
377
-          this.$message.info('已取消禁用')
378
-        })
379
-    },
380
-    // 小组选择
381
-    handlegrop(e) {
382
-      this.groupid = e
383
-      var obj = {}
384
-      obj = this.gropData.find((item) => {
385
-        // 这里的teamData就是上面遍历的数据源
386
-        return item.F_Id === e // 筛选出匹配数据,这里的value是你遍历数组每一项的value,如果没有对后台返回的数据做处理,一般为id
387
-      })
388
-      this.group = obj.F_Name //  这里的label就是对应label的
389
-    },
390
-    // 中心清空
391
-    clearTeam() {
392
-      this.teamData = []
393
-      this.deptteamid = '' // 中心id
394
-      this.deptteam = '' // 中心姓名
395
-    },
396
-    // 小组清空
397
-    clearGroup() {
398
-      this.gropData = []
399
-      this.groupid = '' // 小组信息
400
-      this.group = '' // 小组名称
401 166
     }
167
+    // btn_deletes() {
168
+    //   const ids = []
169
+    //   for (let i = 0, len = this.multipleSelection.length; i < len; i++) {
170
+    //     ids.push(this.multipleSelection[i].F_UserId)
171
+    //   }
172
+    //   if (ids.length <= 0) {
173
+    //     this.$message.warning('没有可删除的选项')
174
+    //     return
175
+    //   }
176
+    //   this.btn_delete(ids)
177
+    // }
178
+
402 179
   }
403 180
 }
404 181
 </script>

+ 0 - 151
CallCenterWeb.UI/RMYY/src/views/systemSetup/roleSetting/userManage/modifyPass.vue

@@ -1,151 +0,0 @@
1
-<template>
2
-  <div v-loading="loading">
3
-    <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="120px" class="modifyPass_form">
4
-      <el-form-item label="账号">
5
-        <el-alert
6
-          :title="ruleForm.usercode"
7
-          :closable="false"
8
-          class="user_item"
9
-          type="success"/>
10
-      </el-form-item>
11
-      <el-form-item label="姓名">
12
-        <el-alert
13
-          :title="username"
14
-          :closable="false"
15
-          class="user_item"
16
-          type="success"/>
17
-      </el-form-item>
18
-      <el-form-item label="新密码" prop="password">
19
-        <el-input v-model="ruleForm.password" type="password" auto-complete="off" placeholder="请输入新密码"/>
20
-      </el-form-item>
21
-      <el-form-item label="确认密码" prop="surepassword">
22
-        <el-input v-model="ruleForm.surepassword" type="password" auto-complete="off" placeholder="请再次输入密码" @keyup.enter.native="submitForm"/>
23
-      </el-form-item>
24
-      <el-form-item>
25
-        <el-button type="primary" @click="submitForm">保存</el-button>
26
-        <el-button @click="resetForm">重置</el-button>
27
-      </el-form-item>
28
-    </el-form>
29
-  </div>
30
-</template>
31
-
32
-<script>
33
-import md5 from 'js-md5'
34
-import { getUserAccount, updatePassword } from '@/api/systemSetup/roleSetting/userManage'
35
-import { validPassword } from '@/utils/validate'
36
-
37
-export default {
38
-  name: 'ModifyPass',
39
-  props: {
40
-    rowid: {
41
-      type: Number,
42
-      default: 0
43
-    },
44
-    ispersonal: {
45
-      type: Boolean,
46
-      default: false
47
-    },
48
-    layerid: {
49
-      type: String,
50
-      default: ''
51
-    }
52
-  },
53
-  data() {
54
-    const validatePass = (rule, value, callback) => {
55
-      if (!validPassword(value)) {
56
-        callback(new Error('请输入有效的密码(6-32个字符只能是字母、下划线、数字)!'))
57
-      } else {
58
-        if (this.ruleForm.surepassword !== '') {
59
-          this.$refs.ruleForm.validateField('surepassword')
60
-        }
61
-        callback()
62
-      }
63
-    }
64
-
65
-    const validatePass2 = (rule, value, callback) => {
66
-      if (!validPassword(value)) {
67
-        callback(new Error('请输入有效的确认密码(6-32个字符只能是字母、下划线、数字)!'))
68
-      } else {
69
-        if (value !== this.ruleForm.password) {
70
-          callback(new Error('两次输入密码不一致!'))
71
-        }
72
-        callback()
73
-      }
74
-    }
75
-
76
-    return {
77
-      username: '', //	string	姓名
78
-      ruleForm: {
79
-        usercode: '', //	string	工号
80
-        password: '', //	string	密码
81
-        surepassword: '' //	string	确认密码
82
-      },
83
-      rules: {
84
-        password: [{
85
-          required: true,
86
-          trigger: 'change',
87
-          validator: validatePass
88
-        }],
89
-        surepassword: [{
90
-          required: true,
91
-          trigger: 'change',
92
-          validator: validatePass2
93
-        }]
94
-      },
95
-      loading: false
96
-    }
97
-  },
98
-  created() {
99
-    if (this.rowid) {
100
-      this.getDetail(this.rowid)
101
-    }
102
-  },
103
-  methods: {
104
-    submitForm() {
105
-      this.$refs.ruleForm.validate(valid => {
106
-        if (valid) {
107
-          this.loading = true
108
-          this.ruleForm.password = md5(this.ruleForm.password)
109
-          this.ruleForm.surepassword = md5(this.ruleForm.surepassword)
110
-          updatePassword(this.ruleForm).then(response => {
111
-            this.loading = false
112
-            if (response.state.toLowerCase() === 'success') {
113
-              this.$parent.$layer.close(this.layerid)
114
-              if (!this.ispersonal) {
115
-                this.$parent.getList() // 重新加载父级数据
116
-              }
117
-              this.$message.success(`恭喜你,密码修改成功!`)
118
-            }
119
-          }).catch(() => {
120
-            this.loading = false
121
-          })
122
-        } else {
123
-          this.$message.error('请输入有效的必填项信息!')
124
-          return false
125
-        }
126
-      })
127
-    },
128
-    resetForm() {
129
-      this.$refs.ruleForm.resetFields()
130
-    },
131
-    // 详情
132
-    getDetail(rid) {
133
-      getUserAccount(rid).then(response => {
134
-        if (response.state.toLowerCase() === 'success') {
135
-          const res = response.data
136
-          this.ruleForm.usercode = res.F_UserCode
137
-          this.username = res.F_UserName
138
-        }
139
-      })
140
-    }
141
-  }
142
-}
143
-</script>
144
-
145
-<style rel="stylesheet/scss" lang="scss" scoped>
146
-	.modifyPass_form{
147
-		.user_item{
148
-			height: 32px;
149
-		}
150
-	}
151
-</style>

+ 308 - 0
CallCenterWeb.UI/RMYY/src/views/trafficData/callRecord/add.vue

@@ -0,0 +1,308 @@
1
+<template>
2
+  <div v-loading="loading">
3
+    <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="150px" class="order_form">
4
+      <el-form-item label="外呼任务">
5
+        <el-radio-group v-model="outboundTaskRadio" @change="radioChangeTask">
6
+          <el-radio :label="1">已有任务</el-radio>
7
+          <el-radio :label="2">新建任务</el-radio>
8
+        </el-radio-group>
9
+      </el-form-item>
10
+      <el-form-item label="任务人" prop="F_TaskUser">
11
+        <el-select v-model="ruleForm.F_TaskUser" class="form_select" clearable filterable>
12
+          <el-option v-for="item in roleOptions" :key="item.F_UserCode" :label="item.F_UserCode" :value="item.F_UserCode"/>
13
+        </el-select>
14
+      </el-form-item>
15
+      <el-form-item label="任务状态" prop="F_State">
16
+        <el-select v-model="ruleForm.F_State" class="form_select" clearable filterable>
17
+          <el-option label="未启动" value="0"/>
18
+          <el-option label="启动" value="1"/>
19
+          <el-option label="暂停" value="2"/>
20
+          <el-option label="终止" value="3"/>
21
+        </el-select>
22
+      </el-form-item>
23
+      <el-form-item label="任务名称" prop="F_Name">
24
+        <el-input v-model="ruleForm.F_Name" placeholder="请输入任务名称" />
25
+      </el-form-item>
26
+      <el-form-item label="任务时间" prop="F_Time">
27
+        <el-date-picker v-model="ruleForm.F_Time" type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" class="form_date"/>
28
+      </el-form-item>
29
+      <el-form-item label="外呼类型" prop="F_Type">
30
+        <el-select v-model="ruleForm.F_Type" class="form_select" clearable filterable @change="handleChangeType">
31
+          <el-option label="语音外呼" value="1"/>
32
+          <el-option label="坐席外呼" value="2"/>
33
+        </el-select>
34
+      </el-form-item>
35
+      <el-form-item v-show="displayContent" label="外呼内容" prop="F_Content">
36
+        <el-input v-model="ruleForm.F_Content" placeholder="请输入外呼内容" />
37
+      </el-form-item>
38
+      <el-form-item label="任务说明" prop="F_Remarks">
39
+        <el-input v-model="ruleForm.F_Remarks" placeholder="请输入任务说明" />
40
+      </el-form-item>
41
+      <el-form-item v-show="displayOutboundTask" label="外呼任务" prop="productName">
42
+        <el-table v-loading="loading" :data="taskDataLists" border stripe highlight-current-row @current-change="handleCurrentChangeTask">
43
+          <el-table-column type="index" label="编号" align="center" fixed width="80" />
44
+          <el-table-column prop="F_TaskUser" label="任务人" align="center" min-width />
45
+          <el-table-column prop="F_State" label="任务状态" align="center">
46
+            <template slot-scope="scope">{{ scope.row.F_State | judgmentState }}</template>
47
+          </el-table-column>
48
+          <el-table-column prop="F_Name" label="任务名称" align="center" />
49
+          <el-table-column prop="F_StartTime" label="任务开始时间" align="center" />
50
+          <el-table-column prop="F_EndTime" label="任务结束时间" align="center" />
51
+          <el-table-column prop="F_Type" label="外呼类型" align="center">
52
+            <template slot-scope="scope">
53
+              {{ scope.row.F_Type | judgmentType }}
54
+            </template>
55
+          </el-table-column>
56
+          <el-table-column prop="F_Content" label="外呼内容" align="center" />
57
+          <el-table-column prop="F_Remarks" label="任务说明" align="center" />
58
+        </el-table>
59
+        <pagination v-show="pageParams.total > 0" :total="pageParams.total" :pageindex.sync="pageParams.pageindex" :pagesize.sync="pageParams.pagesize" class="pagination" @pagination="getListTask" />
60
+      </el-form-item>
61
+      <el-form-item>
62
+        <el-button type="primary" @click="submitForm">保存</el-button>
63
+      </el-form-item>
64
+    </el-form>
65
+  </div>
66
+</template>
67
+
68
+<script>
69
+// import { getTaskLists, addOutboundNumberLists } from '@/api/outbound/automaticOutbound'
70
+// import { validateTel } from '@/utils/validate'
71
+// import { filterContent, pickerOptions } from '@/utils'
72
+// import { getUserAccountLists } from '@/api/systemSetup/roleSetting/userManage'
73
+import Pagination from '@/components/Pagination' // 对el-pagination 二次封装
74
+
75
+export default {
76
+  name: 'Add',
77
+  components: {
78
+    Pagination
79
+  },
80
+  filters: {
81
+    judgmentState(status) {
82
+      const statusMap = {
83
+        0: '未启动',
84
+        1: '启动',
85
+        2: '暂停',
86
+        3: '终止'
87
+      }
88
+      return statusMap[status]
89
+    },
90
+    judgmentType(status) {
91
+      const statusMap = {
92
+        1: '语音外呼',
93
+        2: '坐席外呼'
94
+      }
95
+      return statusMap[status]
96
+    }
97
+  },
98
+  props: {
99
+    rowid: {
100
+      type: String,
101
+      default: ''
102
+    },
103
+    layerid: {
104
+      type: String,
105
+      default: ''
106
+    }
107
+    // rowData: {
108
+    //   type: Array,
109
+    //   default: []
110
+    // }
111
+  },
112
+  data() {
113
+    return {
114
+      roleOptions: [], // 任务人
115
+      displayContent: true,
116
+      props: {
117
+        // 自定义省市下拉数据的key值
118
+        value: 'code',
119
+        label: 'name',
120
+        children: 'entityJson'
121
+      },
122
+      pageParams: {
123
+        pageindex: 1, // 当前第几页
124
+        pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
125
+        total: 0 // 总共多少数据
126
+      },
127
+      outboundTaskRadio: 1, // 外呼任务单选
128
+      sourceOptions: [], // 工单来源下拉数据
129
+      taskDataLists: [], // 外呼任务列表
130
+      displayOutboundTask: true, // 是否显示外呼任务
131
+      handleTaskId: '', // 选中行id
132
+      autoDialsList: [], // 外呼号码
133
+      ruleForm: {
134
+        F_ID: 0, // 任务id
135
+        F_TaskUser: '', // 任务人
136
+        F_Name: '', // 任务名称
137
+        F_Remarks: '', // 任务说明
138
+        F_Time: [], // 时间
139
+        F_StartTime: '', // 开始时间
140
+        F_EndTime: '', // 结束时间
141
+        F_State: '', // 任务状态
142
+        F_Type: '', // 外呼类型
143
+        F_Content: '' // 外呼内容
144
+      },
145
+      rules: {
146
+        F_TaskUser: [
147
+          {
148
+            required: true,
149
+            trigger: 'change',
150
+            message: '请选择任务人'
151
+          }
152
+        ],
153
+        F_State: [
154
+          {
155
+            required: true,
156
+            trigger: 'change',
157
+            message: '请选择任务状态'
158
+          }
159
+        ],
160
+        F_Name: [
161
+          {
162
+            required: true,
163
+            trigger: 'blur',
164
+            message: '请输入任务名称'
165
+          }
166
+        ],
167
+        F_Type: [
168
+          {
169
+            required: true,
170
+            trigger: 'change',
171
+            message: '请选择外呼类型'
172
+          }
173
+        ]
174
+      },
175
+      loading: false
176
+    }
177
+  },
178
+  created() {
179
+    this.getRoleSelects()
180
+    this.getListTask()
181
+  },
182
+  methods: {
183
+    submitForm() {
184
+      // this.$refs.ruleForm.validate((valid) => {
185
+      //   if (valid) {
186
+      //     this.ruleForm.F_StartTime = this.ruleForm.F_Time[0]
187
+      //     this.ruleForm.F_EndTime = this.ruleForm.F_Time[1]
188
+      //     this.autoDialsList = []
189
+      //     for (let i = 0; i < this.rowData.length; i++) {
190
+      //       const data = {
191
+      //         F_Parentid: '',
192
+      //         F_CallUser: '',
193
+      //         F_LastCallid: '',
194
+      //         F_Tel: '',
195
+      //         F_ISOutbound: 0
196
+      //       }
197
+      //       data.F_Parentid = this.ruleForm.F_ID
198
+      //       data.F_CallUser = this.rowData[i].UserCode
199
+      //       data.F_LastCallid = this.rowData[i].Id
200
+      //       data.F_Tel = this.rowData[i].Caller
201
+      //       this.autoDialsList.push(data)
202
+      //     }
203
+      //     this.loading = true
204
+      //     const data = {
205
+      //       F_ID: this.ruleForm.F_ID,
206
+      //       F_TaskUser: this.ruleForm.F_TaskUser,
207
+      //       F_Name: this.ruleForm.F_Name,
208
+      //       F_Remarks: this.ruleForm.F_Remarks,
209
+      //       F_StartTime: this.ruleForm.F_StartTime,
210
+      //       F_EndTime: this.ruleForm.F_EndTime,
211
+      //       F_State: this.ruleForm.F_State,
212
+      //       F_Type: this.ruleForm.F_Type,
213
+      //       F_Content: this.ruleForm.F_Content,
214
+      //       AutoDials: this.autoDialsList
215
+      //     }
216
+      //     addOutboundNumberLists(data)
217
+      //       .then((response) => {
218
+      //         this.loading = false
219
+      //         if (response.state.toLowerCase() === 'success') {
220
+      //           this.$parent.$layer.close(this.layerid)
221
+      //           this.$parent.getList() // 重新加载父级数据
222
+      //           this.$message.success('恭喜你,添加成功!')
223
+      //         }
224
+      //       })
225
+      //       .catch(() => {
226
+      //         this.loading = false
227
+      //       })
228
+      //     return
229
+      //   } else {
230
+      //     this.$message.error('请输入有效的必填项信息!')
231
+      //     return false
232
+      //   }
233
+      // })
234
+    },
235
+    getListTask() {
236
+      // this.loading = true
237
+      // return new Promise((resolve) => {
238
+      //   const params = {
239
+      //     pageindex: this.pageParams.pageindex, // int 第几页
240
+      //     pagesize: this.pageParams.pagesize, // int 每页几条信息
241
+      //     keyword: '' // 关键字
242
+      //   }
243
+      //   getTaskLists(params).then((response) => {
244
+      //     this.loading = false
245
+      //     if (response.state.toLowerCase() === 'success') {
246
+      //       this.pageParams.total = response.rows.Totals
247
+      //       this.taskDataLists = response.rows.Rows
248
+      //     }
249
+      //   })
250
+      //   resolve()
251
+      // })
252
+    },
253
+    radioChangeTask() {
254
+      if (this.outboundTaskRadio === '1') {
255
+        this.displayOutboundTask = true
256
+      } else if (this.outboundTaskRadio === '2') {
257
+        this.resetForm()
258
+        this.displayOutboundTask = false
259
+      }
260
+    },
261
+    handleCurrentChangeTask(currentRow, oldCurrentRow) {
262
+      this.ruleForm.F_ID = currentRow.F_ID // 外呼任务行id
263
+      this.ruleForm.F_TaskUser = currentRow.F_TaskUser // 任务人
264
+      this.ruleForm.F_Name = currentRow.F_Name // 任务名称
265
+      this.ruleForm.F_Remarks = currentRow.F_Remarks // 任务说明
266
+      this.ruleForm.F_Time.push(currentRow.F_StartTime) // 时间
267
+      this.ruleForm.F_Time.push(currentRow.F_EndTime) // 时间
268
+      this.ruleForm.F_State = currentRow.F_State + '' // 任务状态
269
+      this.ruleForm.F_Type = currentRow.F_Type + '' // 外呼类型
270
+      this.ruleForm.F_Content = currentRow.F_Content // 外呼内容
271
+      if (currentRow.F_Type === 2) {
272
+        this.displayContent = false
273
+      } else if (currentRow.F_Type === 1) {
274
+        this.displayContent = true
275
+      }
276
+    },
277
+    handleChangeType(val) {
278
+      if (val === '2') {
279
+        this.displayContent = false
280
+      } else if (val === '1') {
281
+        this.displayContent = true
282
+      }
283
+    },
284
+    // 获取任务人
285
+    getRoleSelects() {
286
+      // getUserAccountLists().then((response) => {
287
+      //   if (response.state.toLowerCase() === 'success') {
288
+      //     this.roleOptions = response.data.Rows
289
+      //   }
290
+      // })
291
+    },
292
+    resetForm() {
293
+      this.$refs.ruleForm.resetFields()
294
+    }
295
+  }
296
+}
297
+</script>
298
+
299
+<style rel="stylesheet/scss" lang="scss">
300
+.order_form {
301
+  .form_select {
302
+    width: 100%;
303
+  }
304
+  .form_date {
305
+    width: 100%;
306
+  }
307
+}
308
+</style>

+ 285 - 0
CallCenterWeb.UI/RMYY/src/views/trafficData/callRecord/index.vue

@@ -0,0 +1,285 @@
1
+<template>
2
+  <div class="app-container">
3
+    <div class="filter-container">
4
+      <el-date-picker
5
+        v-model="searchDate"
6
+        :picker-options="pickerOptions"
7
+        class="filter-item"
8
+        type="daterange"
9
+        format="yyyy年MM月dd日"
10
+        value-format="yyyy-MM-dd"
11
+        align="left"
12
+        unlink-panels
13
+        range-separator="至"
14
+        start-placeholder="开始日期"
15
+        end-placeholder="结束日期" />
16
+      <el-input v-model="keyword" placeholder="请输入主叫号码" class="filter-item" />
17
+      <el-select v-model="CallType" class="filter-item" filterable clearable placeholder="请选择呼叫类型">
18
+        <el-option :value="0" label="呼入" />
19
+        <el-option :value="1" label="呼出" />
20
+      </el-select>
21
+      <el-select v-model="CallState" class="filter-item" filterable clearable placeholder="请选择呼叫状态">
22
+        <el-option :value="0" label="未接通电话" />
23
+        <el-option :value="1" label="已接通电话" />
24
+      </el-select>
25
+      <el-button type="primary" class="filter-item" icon="el-icon-search" @click="btn_search">搜索</el-button>
26
+    </div>
27
+    <el-table v-loading="loading" :data="dataLists" border stripe @selection-change="handleSelectionChange">
28
+      <el-table-column type="selection" width="45" />
29
+      <el-table-column type="index" label="编号" align="center" width="80"/>
30
+      <el-table-column prop="CallNumber" label="电话号码" align="center" min-width/>
31
+      <el-table-column label="录音" align="center" min-width>
32
+        <template slot-scope="scope">
33
+          <svg-icon v-if="scope.row.FilePath" class="rec_file" icon-class="bofangluyin" @click.native="playSound(scope.row.FilePath, scope.row.UserCode)" />
34
+          <span v-else>-</span>
35
+        </template>
36
+      </el-table-column>
37
+      <el-table-column label="呼叫类型" align="center" min-width>
38
+        <template slot-scope="scope">{{ scope.row.CallType | calltypeFilter }}</template>
39
+      </el-table-column>
40
+      <el-table-column label="呼叫状态" align="center" min-width>
41
+        <template slot-scope="scope">
42
+          <el-tag :type="scope.row.CallState === 1 ? 'success' : 'danger'" size="mini" disable-transitions>{{ scope.row.CallState | statusFilter }}</el-tag>
43
+        </template>
44
+      </el-table-column>
45
+      <el-table-column prop="TypeName" label="通话类型" align="center" min-width />
46
+      <el-table-column label="满意度" align="center" min-width>
47
+        <template slot-scope="scope">{{ scope.row.MYD | evaluationFilter }}</template>
48
+      </el-table-column>
49
+      <el-table-column prop="UserCode" label="坐席工号" align="center" min-width />
50
+      <el-table-column prop="UserName" label="坐席姓名" align="center" min-width />
51
+      <el-table-column prop="UseExtNumberrName" label="分机号" align="center" min-width />
52
+      <el-table-column label="呼叫开始时间" align="center" min-width="110">
53
+        <template slot-scope="scope">
54
+          <span>{{ scope.row.BeginTime | timesFilter }}</span>
55
+        </template>
56
+      </el-table-column>
57
+      <el-table-column label="通话开始时间" align="center" min-width="110">
58
+        <template slot-scope="scope">
59
+          <span>{{ scope.row.TalkStartTime | timesFilter }}</span>
60
+        </template>
61
+      </el-table-column>
62
+      <el-table-column label="通话结束时间" align="center" min-width="110">
63
+        <template slot-scope="scope">
64
+          <span>{{ scope.row.TalkEndTime | timesFilter }}</span>
65
+        </template>
66
+      </el-table-column>
67
+      <el-table-column prop="TalkLongTime" label="通话时长" align="center" min-width />
68
+      <el-table-column prop="RingLongTime" label="振铃时长" align="center" min-width />
69
+      <el-table-column prop="LongTime" label="总时长" align="center" min-width />
70
+    </el-table>
71
+    <pagination v-show="pageParams.total > 0" :total="pageParams.total" :pageindex.sync="pageParams.pageindex" :pagesize.sync="pageParams.pagesize" class="pagination" @pagination="getList" />
72
+  </div>
73
+</template>
74
+
75
+<script>
76
+import { getCallRecords } from '@/api/trafficData/trafficData'
77
+import audioPlayer from '@/components/audioPlayer'
78
+import { pickerOptions } from '@/utils'
79
+import add from './add'
80
+import Pagination from '@/components/Pagination' // 对el-pagination 二次封装
81
+import store from '@/store'
82
+import { mapGetters } from 'vuex'
83
+export default {
84
+  name: 'CallRecord',
85
+  components: {
86
+    Pagination
87
+  },
88
+  filters: {
89
+    // 呼叫类型
90
+    calltypeFilter(status) {
91
+      const statusMap = {
92
+        0: '呼入',
93
+        1: '呼出'
94
+      }
95
+      return statusMap[status]
96
+    },
97
+    // 呼叫状态
98
+    statusFilter(status) {
99
+      const statusMap = {
100
+        0: '未接通',
101
+        1: '已接通'
102
+      }
103
+      return statusMap[status]
104
+    },
105
+    // 外呼类型
106
+    callopttypeFilter(status) {
107
+      const statusMap = {
108
+        0: '拨号外呼',
109
+        1: '回访外呼'
110
+      }
111
+      return statusMap[status]
112
+    },
113
+    // 满意度
114
+    evaluationFilter(status) {
115
+      const statusMap = {
116
+        0: '-',
117
+        1: '非常满意',
118
+        2: '基本满意',
119
+        3: '不满意'
120
+      }
121
+      return statusMap[status]
122
+    },
123
+    // 时间格式化
124
+    timesFilter(tm) {
125
+      if (tm === '1970-01-01 08:00:00') {
126
+        return '-'
127
+      } else {
128
+        return tm
129
+      }
130
+    },
131
+    // 是否回访
132
+    isReturnvisitFilter(status) {
133
+      const statusMap = {
134
+        0: '未回访',
135
+        1: '已回访'
136
+      }
137
+      return statusMap[status]
138
+    }
139
+  },
140
+  data() {
141
+    return {
142
+      loading: false,
143
+      keyword: '',
144
+      roleId: '',
145
+      CallType: '', // 呼叫类型
146
+      CallState: '', // 呼叫状态
147
+      searchDate: '',
148
+      pickerOptions,
149
+      recordpath: '', // 录音的路径
150
+      pageParams: {
151
+        pageindex: 1, // 当前第几页
152
+        pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
153
+        total: 0 // 总共多少数据
154
+      },
155
+      dataLists: [], // 列表数据
156
+      multipleSelection: [] // 选中数据
157
+    }
158
+  },
159
+  computed: {
160
+    ...mapGetters([
161
+      'token',
162
+      'usercode', // 工号
163
+      'extension', // 分机号
164
+      'telIsVisCallout' // 外呼面板是否显示
165
+    ])
166
+  },
167
+  created() {
168
+    this.getList()
169
+    document.onkeyup = (e) => {
170
+      if (e.keyCode === 13) {
171
+        this.getList()
172
+      }
173
+    }
174
+  },
175
+  methods: {
176
+    getList() {
177
+      this.loading = true
178
+      return new Promise((resolve) => {
179
+        const params = {
180
+          pageindex: this.pageParams.pageindex, // 第几页
181
+          pagesize: this.pageParams.pagesize, // 每页几条信息
182
+          CallNumber: this.keyword.replace(/\s*/g, ''), //	否	string	模糊查询(呼叫号码)
183
+          UserCode: this.roleId, //	否	string	模糊查询(呼叫号码) CallNumber
184
+          CallType: this.CallType == null ? '' : this.CallType, // 呼叫类型
185
+          CallState: this.CallState, // 呼叫状态
186
+          SearchStartTime: this.searchDate && this.searchDate[0],
187
+          SearchEndTime: this.searchDate && this.searchDate[1]
188
+        }
189
+        getCallRecords(params).then((response) => {
190
+          this.loading = false
191
+          if (response.state.toLowerCase() === 'success') {
192
+            // this.recordpath = response.data.recordpath
193
+            this.pageParams.total = response.total
194
+            this.dataLists = response.rows
195
+            console.log(this.dataLists)
196
+          }
197
+        })
198
+        resolve()
199
+      })
200
+    },
201
+    btn_search() {
202
+      this.getList()
203
+    },
204
+    // 播放录音
205
+    playSound(rec_file, artist) {
206
+      console.log('artist', artist)
207
+      this.$layer.iframe({
208
+        content: {
209
+          content: audioPlayer, // 传递的组件对象
210
+          parent: this, // 当前的vue对象
211
+          data: { recFiles: rec_file, artists: artist.toString() } // props//该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
212
+        },
213
+        area: ['600px', '230px'],
214
+        shadeClose: true,
215
+        title: '录音详情'
216
+      })
217
+    },
218
+    handleSelectionChange(selection) {
219
+      this.multipleSelection = selection
220
+    },
221
+    // 添加外呼
222
+    btn_add_outbound() {
223
+      this.$layer.iframe({
224
+        content: {
225
+          content: add, // 传递的组件对象
226
+          parent: this, // 当前的vue对象
227
+          data: { rowData: this.multipleSelection } // props
228
+        },
229
+        area: ['80%', '90%'],
230
+        title: '添加外呼'
231
+      })
232
+    },
233
+    // 外呼
234
+    clickCallOut(phoneNumber, id) {
235
+      this.callOut(phoneNumber, id)
236
+    },
237
+    // 外呼
238
+    callOut(phoneNumber, id) {
239
+      if (phoneNumber) {
240
+        // getCallOutprefix(phoneNumber).then((response) => {
241
+        //   if (response.state.toLowerCase() === 'success') {
242
+        //     const res = response.data
243
+        //     this.scoketDatas = {
244
+        //       Type: 'MakeCall',
245
+        //       AgentID: this.usercode,
246
+        //       AgentExten: this.extension,
247
+        //       Header: res.fix, // 号码前缀 用于截断前缀得到真实号码
248
+        //       DestinationNumber: res.phone //
249
+        //     }
250
+        //     store.dispatch('ChangeCallNum', phoneNumber)
251
+        //     Send(this.scoketDatas)
252
+        //     store.dispatch('UpdateCalloutScreen', false) // 关闭外呼面板
253
+        //     store.dispatch('UpdateOutboundScreen', false) // 关闭外呼弹屏
254
+        //   }
255
+        // })
256
+      } else {
257
+        this.$message({
258
+          message: '请先输入电话号码!',
259
+          type: 'warning'
260
+        })
261
+      }
262
+    }
263
+  }
264
+}
265
+</script>
266
+
267
+<style rel="stylesheet/scss" lang="scss" scoped>
268
+.phoneIcon {
269
+  cursor: pointer;
270
+}
271
+.filter-container {
272
+  .el-select {
273
+    margin-right: 10px;
274
+  }
275
+  .el-date-editor {
276
+    margin-right: 10px;
277
+  }
278
+  .el-cascader {
279
+    margin-right: 10px;
280
+  }
281
+  .filter-item {
282
+    vertical-align: top;
283
+  }
284
+}
285
+</style>

+ 0 - 2
CallCenterWeb.UI/RMYY/static/config/serverConfig.json

@@ -3,8 +3,6 @@
3 3
   "BASE_API": "http://192.168.1.37:8000/",
4 4
   "SOCKET_IP": "192.168.8.7",
5 5
   "SOCKET_PORT": "8081",
6
-  "LineChat_SOCKET_IP": "192.168.5.42",
7
-  "LineChat_SOCKET_PORT": "28300",
8 6
   "PAGESIZES": "[10, 20, 50, 100]",
9 7
   "PAGESIZE": "10",
10 8
   "monitorPlatformTime": "5000",