liuzhihui 3 yıl önce
ebeveyn
işleme
28a73fe244
23 değiştirilmiş dosya ile 2683 ekleme ve 1332 silme
  1. 9 1
      CallCenterWeb.UI/RMYY/src/api/commonAPI.js
  2. 31 0
      CallCenterWeb.UI/RMYY/src/api/equipment/equip.js
  3. 8 0
      CallCenterWeb.UI/RMYY/src/api/faultRepairManagement/faultRepair.js
  4. 8 1
      CallCenterWeb.UI/RMYY/src/api/orderManagement/orderList.js
  5. 31 0
      CallCenterWeb.UI/RMYY/src/api/orderManagement/patientvisit.js
  6. 13 4
      CallCenterWeb.UI/RMYY/src/components/button/orderList.vue
  7. 61 27
      CallCenterWeb.UI/RMYY/src/utils/telWebsocket.js
  8. 1 1
      CallCenterWeb.UI/RMYY/src/views/callScreen/components/AddOrEditOrder.vue
  9. 131 0
      CallCenterWeb.UI/RMYY/src/views/equipmentManage/equipmentList/addOrEdit.vue
  10. 255 0
      CallCenterWeb.UI/RMYY/src/views/equipmentManage/equipmentList/index.vue
  11. 13 9
      CallCenterWeb.UI/RMYY/src/views/faultRepair/clinicalReporting/components/addRepairbase.vue
  12. 193 0
      CallCenterWeb.UI/RMYY/src/views/faultRepairManagement/repairList/finish.vue
  13. 648 843
      CallCenterWeb.UI/RMYY/src/views/faultRepairManagement/repairList/index.vue
  14. 401 361
      CallCenterWeb.UI/RMYY/src/views/layout/components/Navbar/Teloperation.vue
  15. 8 8
      CallCenterWeb.UI/RMYY/src/views/layout/components/Navbar/index.vue
  16. 33 41
      CallCenterWeb.UI/RMYY/src/views/orderManage/components/addOrEditInfOrder.vue
  17. 3 17
      CallCenterWeb.UI/RMYY/src/views/orderManage/components/askdetail.vue
  18. 1 1
      CallCenterWeb.UI/RMYY/src/views/orderManage/mySubmit/index.vue
  19. 1 1
      CallCenterWeb.UI/RMYY/src/views/orderManage/orderList/index.vue
  20. 323 0
      CallCenterWeb.UI/RMYY/src/views/orderManage/patientVisit/index.vue
  21. 462 0
      CallCenterWeb.UI/RMYY/src/views/orderManage/patientVisit/visit.vue
  22. 36 15
      CallCenterWeb.UI/RMYY/src/views/systemSetup/LogManage/Loginlog/index.vue
  23. 13 2
      CallCenterWeb.UI/RMYY/src/views/systemSetup/sysSetting/orderTypeManage/addOrEditOrderType.vue

+ 9 - 1
CallCenterWeb.UI/RMYY/src/api/commonAPI.js

@@ -82,7 +82,7 @@ export function GetDicValue(Flag) {
82 82
 // 工单状态
83 83
 export function GetTypeState(params) {
84 84
   return request({
85
-    url: '/T_Dis_WorkOrder/GetTypeState',
85
+    url: 'T_Dis_WorkOrder/GetTypeState',
86 86
     method: 'get',
87 87
     params
88 88
   })
@@ -105,3 +105,11 @@ export function GetFiledState(TableId) {
105 105
     }
106 106
   })
107 107
 }
108
+// 签入签出
109
+export function Teljournal(params) {
110
+  return request({
111
+    url: 'Home/Teljournal',
112
+    method: 'get',
113
+    params
114
+  })
115
+}

+ 31 - 0
CallCenterWeb.UI/RMYY/src/api/equipment/equip.js

@@ -0,0 +1,31 @@
1
+import request from '@/utils/request'
2
+
3
+// 获取列表数据
4
+export function GetEquipmentlist(params) {
5
+  return request({
6
+    url: 'Equipment/GetList',
7
+    method: 'get',
8
+    params
9
+  })
10
+}
11
+export function GetAddEquip(params) {
12
+  return request({
13
+    url: 'Equipment/AddEquip',
14
+    method: 'post',
15
+    params
16
+  })
17
+}
18
+export function GetEditEquip(params) {
19
+  return request({
20
+    url: 'Equipment/EditEquip',
21
+    method: 'post',
22
+    params
23
+  })
24
+}
25
+export function GetDelEquips(params) {
26
+  return request({
27
+    url: 'Equipment/DelEquips',
28
+    method: 'get',
29
+    params
30
+  })
31
+}

+ 8 - 0
CallCenterWeb.UI/RMYY/src/api/faultRepairManagement/faultRepair.js

@@ -1,5 +1,13 @@
1 1
 import request from '@/utils/request'
2 2
 
3
+// 完工设备下拉框数据
4
+export function getsbeilist(params) {
5
+  return request({
6
+    url: 'Equipment/GetAllList',
7
+    method: 'get',
8
+    data: params
9
+  })
10
+}
3 11
 // 新故障报修
4 12
 // 添加工单
5 13
 export function getAddRepairbase(params) {

+ 8 - 1
CallCenterWeb.UI/RMYY/src/api/orderManagement/orderList.js

@@ -7,7 +7,14 @@ export function getOrderStateData(params) {
7 7
     params
8 8
   })
9 9
 }
10
-
10
+// 投诉来源下拉数据
11
+export function getTouSuSelect(params) {
12
+  return request({
13
+    url: 'Dictionary/GetDicValueList',
14
+    method: 'get',
15
+    params
16
+  })
17
+}
11 18
 // 工单新增
12 19
 export function addOrEdittOrder(data) {
13 20
   return request({

+ 31 - 0
CallCenterWeb.UI/RMYY/src/api/orderManagement/patientvisit.js

@@ -0,0 +1,31 @@
1
+import request from '@/utils/request'
2
+
3
+export function getGongDanType(params) {
4
+  return request({
5
+    url: 'GongDanType/GetList',
6
+    method: 'get',
7
+    params
8
+  })
9
+}
10
+export function getGetList(params) {
11
+  return request({
12
+    url: 'Con_WorkOrder/GetList',
13
+    method: 'get',
14
+    params
15
+  })
16
+}
17
+export function GetOrderDetail(params) {
18
+  return request({
19
+    url: 'Con_WorkOrder/GetWorkOrder',
20
+    method: 'get',
21
+    params
22
+  })
23
+}
24
+export function GetVisitWorkOrder(params) {
25
+  return request({
26
+    url: 'Con_WorkOrder/VisitWorkOrder',
27
+    method: 'post',
28
+    params
29
+  })
30
+}
31
+

+ 13 - 4
CallCenterWeb.UI/RMYY/src/components/button/orderList.vue

@@ -71,12 +71,19 @@
71 71
     <!-- 咨询预约处理 -->
72 72
     <el-dialog :visible.sync="dialogStatus.dialog_ywzx_chuli" title="预约处理">
73 73
       <el-form ref="appointmentForm" :model="appointmentForm" :rules="rules" label-width="100px">
74
-        <el-form-item label="是否完结" prop="isover">
75
-          <el-radio-group v-model="appointmentForm.isover">
74
+        <el-form-item label="是否回访" prop="isvisit">
75
+          <el-radio-group v-model="appointmentForm.isvisit">
76 76
             <el-radio label="0">否</el-radio>
77 77
             <el-radio label="1">是</el-radio>
78 78
           </el-radio-group>
79 79
         </el-form-item>
80
+        <el-form-item label="沟通情况" prop="communicate">
81
+          <el-radio-group v-model="appointmentForm.communicate">
82
+            <el-radio label="0">沟通</el-radio>
83
+            <el-radio label="1">已沟通未预约</el-radio>
84
+            <el-radio label="2">已沟通已预约</el-radio>
85
+          </el-radio-group>
86
+        </el-form-item>
80 87
         <el-form-item label="处理结果" prop="cont">
81 88
           <el-input :autosize="{ minRows: 4, maxRows: 8}" v-model="appointmentForm.cont" show-word-limit maxlength="100"
82 89
             type="textarea" />
@@ -183,7 +190,9 @@
183 190
           ReturnReason: ''
184 191
         },
185 192
         appointmentForm: {
186
-          isover: '',
193
+          isover:1,
194
+          isvisit: '',
195
+          communicate: '',
187 196
           cont: ''
188 197
         },
189 198
         postEvent: null,
@@ -248,7 +257,7 @@
248 257
 
249 258
     },
250 259
     methods: {
251
-      butOptionMethod(name, code) {
260
+      butOptionMethod(name, code,row) {
252 261
         this.optionName = name
253 262
         this.wocode = code
254 263
         if (this.dialogStatus[`dialog_${name}`] === false) {

+ 61 - 27
CallCenterWeb.UI/RMYY/src/utils/telWebsocket.js

@@ -3,10 +3,14 @@
3 3
  * 签入后心跳开始;签出后心跳结束;
4 4
  * 增加心跳 false 处理(签出)
5 5
  */
6
-import { Message, MessageBox, Switch } from 'element-ui'
6
+import {
7
+  Message,
8
+  MessageBox,
9
+  Switch
10
+} from 'element-ui'
7 11
 import store from '@/store'
8 12
 import router from '@/router'
9
-
13
+import { Teljournal } from '@/api/commonAPI'
10 14
 let ws // websocket 实例
11 15
 let cls = 0
12 16
 let lockReconnect = false // 避免重复连接
@@ -15,7 +19,7 @@ let wsUrl = null
15 19
 // const wsUrl = 'ws://' + process.env.SOCKET_IP + ':' + process.env.SOCKET_PORT
16 20
 // 创建scoket连接
17 21
 export function createWebSocket() {
18
-  wsUrl = 'ws://' + store.getters.serverConfig.SOCKET_IP + ':' + store.getters.serverConfig.SOCKET_PORT// 请求地址
22
+  wsUrl = 'ws://' + store.getters.serverConfig.SOCKET_IP + ':' + store.getters.serverConfig.SOCKET_PORT // 请求地址
19 23
   try {
20 24
     if ('WebSocket' in window) {
21 25
       ws = new WebSocket(wsUrl) // 创建一个websocket实例
@@ -55,7 +59,8 @@ function init() {
55 59
     // 如果获取到消息,心跳检测重置
56 60
     // 拿到任何消息都说明当前连接是正常的
57 61
     // heartCheck.reset().start()
58
-    console.log('%c' + new Date() + '%c receive%c telWebsocket %ctype:' + JSON.parse(evt.data)[0].Type + '%c ' + evt.data, 'color: #111', 'color: #67C23A', 'color: #111', 'color: #67C23A', 'color: #111')
62
+    console.log('%c' + new Date() + '%c receive%c telWebsocket %ctype:' + JSON.parse(evt.data)[0].Type + '%c ' + evt
63
+      .data, 'color: #111', 'color: #67C23A', 'color: #111', 'color: #67C23A', 'color: #111')
59 64
     dealMsg(JSON.parse(evt.data)[0])
60 65
     // 修改 store 中telwebsocket的数据
61 66
     const telWSData = JSON.parse(evt.data)
@@ -111,8 +116,8 @@ function init() {
111 116
 }
112 117
 
113 118
 /**
114
-  * 重新连接
115
-  */
119
+ * 重新连接
120
+ */
116 121
 function reconnect() {
117 122
   if (lockReconnect) return
118 123
   lockReconnect = true
@@ -131,15 +136,16 @@ function reconnect() {
131 136
 }
132 137
 
133 138
 /**
134
-  * 发送
135
-  * @ socketDatas 发送的数据 type {}
136
-  */
139
+ * 发送
140
+ * @ socketDatas 发送的数据 type {}
141
+ */
137 142
 export function Send(scoketDatas) {
138 143
   if (ws.readyState !== ws.OPEN) {
139 144
     reconnect()
140 145
   }
141 146
   if (ws.readyState === ws.OPEN) {
142
-    console.log('%c' + new Date() + '%c  send %c telWebsocket  ' + JSON.stringify(scoketDatas), 'color: #111', 'color: #409EFF', 'color: #111')
147
+    console.log('%c' + new Date() + '%c  send %c telWebsocket  ' + JSON.stringify(scoketDatas), 'color: #111',
148
+      'color: #409EFF', 'color: #111')
143 149
     ws.send(JSON.stringify(scoketDatas))
144 150
     scoketDatas.operationType = '发送'
145 151
     // 修改 store 中telwebsocket的数据
@@ -209,9 +215,9 @@ function signIn() {
209 215
   Send(scoketDatas)
210 216
 }
211 217
 /**
212
-  * 处理接收的消息
213
-  * @ msgData 接收的数据 type {}
214
-  */
218
+ * 处理接收的消息
219
+ * @ msgData 接收的数据 type {}
220
+ */
215 221
 function dealMsg(msgData) {
216 222
   if (msgData) {
217 223
     const rlt = msgData.Result
@@ -264,7 +270,8 @@ function dealMsg(msgData) {
264 270
       // const errCode = msgData.Error % 10000
265 271
       Message({
266 272
         dangerouslyUseHTMLString: true,
267
-        message: '<div style="font-size:42px;font-weight: 700;text-align: center; width:80%;margin: 0 auto;">' + msgData.Type + '</div>',
273
+        message: '<div style="font-size:42px;font-weight: 700;text-align: center; width:80%;margin: 0 auto;">' +
274
+          msgData.Type + '</div>',
268 275
         offset: 400,
269 276
         center: true,
270 277
         type: 'error',
@@ -281,7 +288,8 @@ function dealMsg(msgData) {
281 288
         // Message.error(`${rlt} !`)
282 289
         Message({
283 290
           dangerouslyUseHTMLString: true,
284
-          message: '<div style="font-size:42px;font-weight: 700;text-align: center; width:80%;margin: 0 auto;">' + rlt + '</div>',
291
+          message: '<div style="font-size:42px;font-weight: 700;text-align: center; width:80%;margin: 0 auto;">' +
292
+            rlt + '</div>',
285 293
           offset: 400,
286 294
           center: true,
287 295
           type: 'error',
@@ -291,6 +299,7 @@ function dealMsg(msgData) {
291 299
     }
292 300
   }
293 301
 }
302
+
294 303
 function updateSeatMonitorlists(msgData) {
295 304
   store.dispatch('ChangeMonitor', true) // 修改监听操作的返回值
296 305
   store.dispatch('ChangeMonitorstate', msgData.State) // 监控状态
@@ -335,6 +344,8 @@ function LogoutBack(reState) {
335 344
   // 重置初始化状态
336 345
   resetInitState()
337 346
   window.sessionStorage.setItem('storageSeatState', 0)
347
+  getOperatonTime('2')
348
+  console.log('签出2')
338 349
 }
339 350
 
340 351
 // 重置初始化状态
@@ -348,25 +359,29 @@ function resetInitState() {
348 359
 }
349 360
 
350 361
 /**
351
-  * 置忙 置闲
352
-  * sayOption (点击置忙置闲后的返回值)
353
-  * */
362
+ * 置忙 置闲
363
+ * sayOption (点击置忙置闲后的返回值)
364
+ * */
354 365
 function SetState(sayOption) {
355 366
   if (sayOption.State === 5) {
356 367
     store.dispatch('ChangeSeatState', 5)
357 368
     window.sessionStorage.setItem('storageSeatState', 5)
358 369
     store.dispatch('ChangeTopRightState', ['忙碌', false])
370
+    getOperatonTime('3')
371
+    console.log('置忙3')
359 372
   } else if (sayOption.State === 2) {
360 373
     store.dispatch('ChangeSeatState', 2)
361 374
     window.sessionStorage.setItem('storageSeatState', 2)
362 375
     store.dispatch('ChangeTopRightState', ['空闲', true])
376
+    getOperatonTime('4')
377
+    console.log('置闲4')
363 378
   }
364 379
 }
365 380
 
366 381
 /**
367
-  * 置忙
368
-  * sayOption (点击置忙置闲后的返回值)
369
-  * */
382
+ * 置忙
383
+ * sayOption (点击置忙置闲后的返回值)
384
+ * */
370 385
 function SayBusyBack(sayOption) {
371 386
   store.dispatch('ChangeSeatState', 5)
372 387
   if (sayOption.Type === 'SayBusy') {
@@ -374,9 +389,9 @@ function SayBusyBack(sayOption) {
374 389
   }
375 390
 }
376 391
 /**
377
-  * 置闲
378
-  * sayOption (点击置忙置闲后的返回值)
379
-  * */
392
+ * 置闲
393
+ * sayOption (点击置忙置闲后的返回值)
394
+ * */
380 395
 function SayFreeBack(sayOption) {
381 396
   store.dispatch('ChangeSeatState', 2)
382 397
   if (sayOption.Type === 'SayFree') {
@@ -448,7 +463,15 @@ function IncomingBack(inComingData) {
448 463
     // console.log(inComingNumber)
449 464
   }
450 465
   window.localStorage.setItem('callidSave', inComingData.CallID) // 用户的坐席组code
451
-  router.push({ name: 'CallScreen', path: '/callScreen', fullPath: '/callScreen', params: { callid: inComingCallId, telInNumber: inComingNumber }})
466
+  router.push({
467
+    name: 'CallScreen',
468
+    path: '/callScreen',
469
+    fullPath: '/callScreen',
470
+    params: {
471
+      callid: inComingCallId,
472
+      telInNumber: inComingNumber
473
+    }
474
+  })
452 475
   store.dispatch('ChangeCallNum', inComingNumber)
453 476
 }
454 477
 
@@ -480,10 +503,10 @@ function MakeCallBack(callBackData) {
480 503
 }
481 504
 
482 505
 // 多方通话
483
-function MeetingBack() { }
506
+function MeetingBack() {}
484 507
 
485 508
 // 录音返回
486
-function RecordPathBack() { }
509
+function RecordPathBack() {}
487 510
 
488 511
 // 保持
489 512
 function HoldBack(holdData) {
@@ -510,3 +533,14 @@ function getAgentList(data) {
510 533
   store.dispatch('GetOnlineSeatList', data.AgentList) // 监控坐席
511 534
 }
512 535
 
536
+function getOperatonTime(state) {
537
+  const params = {
538
+    state: state,
539
+    token: localStorage.getItem('Admin-Token').split(' ')[1]
540
+  }
541
+  Teljournal(params)
542
+    .then((response) => {
543
+
544
+    })
545
+    .catch((result) => {})
546
+}

+ 1 - 1
CallCenterWeb.UI/RMYY/src/views/callScreen/components/AddOrEditOrder.vue

@@ -8,7 +8,7 @@
8 8
       </el-col>
9 9
       <!--业务咨询工单 -->
10 10
       <el-col v-if="orderTypeData.F_Type1===1000" :span="22">
11
-        <add-or-edit-inf-order :wid='wid' :callid='callid' :order-type-data="orderTypeData" :person-parms-data="personParmsData"/>
11
+        <add-or-edit-inf-order :iswomanage='iswomanage' :wid='wid' :callid='callid' :order-type-data="orderTypeData" :person-parms-data="personParmsData"/>
12 12
       </el-col>
13 13
       <!-- 综合调度 -->
14 14
       <el-col v-if="orderTypeData.F_Type1===2000" :span="22">

+ 131 - 0
CallCenterWeb.UI/RMYY/src/views/equipmentManage/equipmentList/addOrEdit.vue

@@ -0,0 +1,131 @@
1
+<template>
2
+  <div>
3
+    <el-form ref="ruleForm" :rules="rules" :model="ruleForm" label-width="80px">
4
+      <el-form-item label="设备名称" prop="equipname">
5
+        <el-input v-model="ruleForm.equipname" type="text" placeholder="请输入设备名称" />
6
+      </el-form-item>
7
+      <el-form-item label="规格型号" prop="equipnumber">
8
+        <el-input v-model="ruleForm.equipnumber" type="text" placeholder="请输入规格型号" />
9
+      </el-form-item>
10
+      <el-form-item label="设备价格" prop="equipprice">
11
+        <el-input v-model="ruleForm.equipprice" type="text" placeholder="请输入设备价格" />
12
+      </el-form-item>
13
+      <el-form-item label="是否有效">
14
+        <el-switch v-model="ruleForm.state" active-color="#13ce66" inactive-color="#ff4949" active-value="1"
15
+          inactive-value="0">
16
+        </el-switch>
17
+      </el-form-item>
18
+      <el-form-item>
19
+        <el-button type="primary" @click="submitForm()">提交</el-button>
20
+      </el-form-item>
21
+    </el-form>
22
+  </div>
23
+</template>
24
+<script>
25
+  import {
26
+    AuditOrder
27
+  } from '@/api/orderManagement/orderList'
28
+  import {
29
+    GetAddEquip,
30
+    GetEditEquip
31
+  } from '@/api/equipment/equip'
32
+  export default {
33
+    name: 'AddOrEdit',
34
+    props: {
35
+      rowid: {
36
+        type: Number,
37
+        default: 0
38
+      },
39
+      layerid: {
40
+        type: String,
41
+        default: ''
42
+      },
43
+      rowdata: {
44
+        type: Object,
45
+        default () {
46
+          return {}
47
+        }
48
+      }
49
+    },
50
+    data() {
51
+      return {
52
+        ruleForm: {
53
+          equipname: '',
54
+          equipnumber: '',
55
+          equipprice: '',
56
+          state: '1'
57
+        },
58
+        rules: {
59
+          equipname: [{
60
+            required: true,
61
+            message: '请输入设备名称',
62
+            trigger: 'blur'
63
+          }],
64
+          equipnumber: [{
65
+            required: true,
66
+            message: '请输入设备型号',
67
+            trigger: 'blur'
68
+          }],
69
+          equipprice: [{
70
+            required: true,
71
+            message: '请输入设备价格',
72
+            trigger: 'blur'
73
+          }]
74
+        }
75
+      }
76
+    },
77
+    created() {
78
+      if (JSON.stringify(this.rowdata) != "{}") {
79
+        this.ruleForm.equipname = this.rowdata.F_EquipName
80
+        this.ruleForm.equipnumber = this.rowdata.F_EquipNumber
81
+        this.ruleForm.equipprice = this.rowdata.F_EquipPrice
82
+        this.ruleForm.state = this.rowdata.F_State.toString()
83
+        this.ruleForm.equipid = this.rowdata.F_EquipID
84
+      }
85
+    },
86
+    methods: {
87
+      submitForm() {
88
+        this.$refs.ruleForm.validate(valid => {
89
+          if (valid) {
90
+            // 添加
91
+            if (JSON.stringify(this.rowdata) === "{}") {
92
+              GetAddEquip(this.ruleForm)
93
+                .then((response) => {
94
+                  if (response.state.toLowerCase() === 'success') {
95
+                    this.$parent.$layer.close(this.layerid)
96
+                    this.$parent.getList() // 重新加载父级数据
97
+                    this.$message.success('添加成功!')
98
+                  }
99
+                })
100
+                .catch(() => {
101
+                  this.loading = false
102
+                })
103
+              return
104
+            } else {
105
+              GetEditEquip(this.ruleForm)
106
+                .then((response) => {
107
+                  if (response.state.toLowerCase() === 'success') {
108
+                    this.$parent.$layer.close(this.layerid)
109
+                    this.$parent.getList() // 重新加载父级数据
110
+                    this.$message.success('编辑成功!')
111
+                  }
112
+                })
113
+                .catch(() => {
114
+                  this.loading = false
115
+                })
116
+              return
117
+            }
118
+          } else {
119
+            this.$message.error('请输入有效的必填项信息!')
120
+            return false
121
+          }
122
+        })
123
+      }
124
+    }
125
+  }
126
+</script>
127
+<style lang="scss" scoped>
128
+  .form_select {
129
+    width: 100%;
130
+  }
131
+</style>

+ 255 - 0
CallCenterWeb.UI/RMYY/src/views/equipmentManage/equipmentList/index.vue

@@ -0,0 +1,255 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-row :gutter="20" />
4
+    <el-form :inline="true" :model="ruleForm" class="demo-form-inline">
5
+      <el-form-item label="设备名称:">
6
+        <el-input v-model="ruleForm.sbmc" placeholder="请输入设备名称" size="medium" />
7
+      </el-form-item>
8
+      <el-form-item>
9
+        <el-button type="primary" size="medium" @click="btn_search_task">查询</el-button>
10
+        <el-button type="primary" size="medium" @click="btn_add">添加</el-button>
11
+      </el-form-item>
12
+    </el-form>
13
+    <el-table :data="dataLists" border highlight-current-row stripe>
14
+      <el-table-column type="index" label="序号" align="center" width="100">
15
+      </el-table-column>
16
+      <el-table-column prop="F_EquipName" label="设备名称" align="center" min-width />
17
+      <el-table-column prop="F_EquipNumber" label="规格型号" align="center" min-width />
18
+      <el-table-column prop="F_EquipPrice" label="价格(元)" align="center" min-width />
19
+      <el-table-column label="状态" align="center" min-width>
20
+        <template slot-scope="scope">
21
+          <span v-if="scope.row.F_State==1">有效</span>
22
+          <span v-if="scope.row.F_State==0">无效</span>
23
+        </template>
24
+      </el-table-column>
25
+      <el-table-column prop="F_CreateUser" label="添加人" align="center" min-width />
26
+      <el-table-column prop="F_CreateTime" label="添加时间" align="center" min-width />
27
+      <el-table-column label="操作" align="center">
28
+        <template slot-scope="scope">
29
+          <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
30
+          <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
31
+        </template>
32
+      </el-table-column>
33
+    </el-table>
34
+    <pagination v-show="pageParams.total > 0" :total="pageParams.total" :pageindex.sync="pageParams.pageindex"
35
+      :pagesize.sync="pageParams.pagesize" class="pagination" @pagination="getList" />
36
+  </div>
37
+</template>
38
+
39
+<script>
40
+  import Pagination from '@/components/context/Pagination' // 对el-pagination 二次封装
41
+  import AddOrEdit from './addOrEdit'
42
+  import {
43
+    GetEquipmentlist,
44
+    GetDelEquips
45
+  } from '@/api/equipment/equip'
46
+  import {
47
+    exportExcel
48
+  } from '@/utils'
49
+  export default {
50
+    name: 'EquipmentManage',
51
+    components: {
52
+      Pagination
53
+    },
54
+    data() {
55
+      return {
56
+        dataLists: [],
57
+        pageParams: {
58
+          pageindex: 1, // 当前第几页
59
+          pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
60
+          total: 0 // 总共多少数据
61
+        },
62
+        ruleForm: {
63
+          sbmc: ''
64
+        },
65
+      }
66
+    },
67
+    computed: {},
68
+    created() {
69
+      this.getNowTime()
70
+      this.getList()
71
+    },
72
+    mounted() {},
73
+    methods: {
74
+      // 搜索
75
+      btn_search_task() {
76
+        this.getList()
77
+      },
78
+      getList() {
79
+        const params = {
80
+          PageIndex:this.pageParams.pageindex,
81
+          PageSize:this.pageParams.pagesize,
82
+          equipmentname: this.ruleForm.sbmc
83
+        }
84
+        return new Promise(resolve => {
85
+          GetEquipmentlist(params).then(response => {
86
+            if (response.state.toLowerCase() === 'success') {
87
+              this.dataLists = response.data
88
+            }
89
+          })
90
+          resolve()
91
+        })
92
+      },
93
+      btn_add() {
94
+        this.$layer.iframe({
95
+          content: {
96
+            content: AddOrEdit, // 传递的组件对象
97
+            parent: this, // 当前的vue对象
98
+            data: {
99
+
100
+            } // props
101
+          },
102
+          area: ['40%', '50%'],
103
+          title: '添加设备'
104
+        })
105
+      },
106
+      handleEdit(row) {
107
+        this.$layer.iframe({
108
+          content: {
109
+            content: AddOrEdit, // 传递的组件对象
110
+            parent: this, // 当前的vue对象
111
+            data: {
112
+              rowdata:row
113
+            } // props
114
+          },
115
+          area: ['40%', '50%'],
116
+          title: '编辑设备'
117
+        })
118
+      },
119
+      handleDelete(row) {
120
+        this.$confirm('确定要删除此设备吗?', '提示', {
121
+            confirmButtonText: '确定',
122
+            cancelButtonText: '取消',
123
+            type: 'warning'
124
+          })
125
+          .then(() => {
126
+            const params = {
127
+              ids : row.F_EquipID
128
+            }
129
+            GetDelEquips(params).then((response) => {
130
+              if (response.state.toLowerCase() === 'success') {
131
+                this.$message.success('删除成功!')
132
+                this.getList()
133
+              }
134
+            })
135
+          })
136
+          .catch(() => {
137
+            this.$message('已取消删除')
138
+          })
139
+      },
140
+      btn_export() {
141
+        const exporParams = {
142
+          stime: this.ruleForm.startTime && this.ruleForm.startTime[0],
143
+          endtime: this.ruleForm.startTime && this.ruleForm.startTime[1],
144
+          groupby: this.ruleForm.way,
145
+          isdc: 1
146
+        }
147
+        exportExcel(exporParams, getListExpt)
148
+      },
149
+      formtTime(val) {
150
+        if (!val) {
151
+          return '0秒'
152
+        }
153
+        var secondTime = parseInt(val);
154
+        var minuteTime = 0;
155
+        var hourTime = 0;
156
+        if (secondTime > 60) {
157
+          minuteTime = parseInt(secondTime / 60);
158
+          secondTime = parseInt(secondTime % 60);
159
+          if (minuteTime > 60) {
160
+            hourTime = parseInt(minuteTime / 60);
161
+            minuteTime = parseInt(minuteTime % 60);
162
+          }
163
+        }
164
+        var result = "" + parseInt(secondTime) + "秒";
165
+        if (minuteTime > 0) {
166
+          result = "" + parseInt(minuteTime) + "分" + result;
167
+        }
168
+        if (hourTime > 0) {
169
+          result = "" + parseInt(hourTime) + "小时" + result;
170
+        }
171
+        return result;
172
+      },
173
+      getNowTime() {
174
+        var now = new Date();
175
+        var year = now.getFullYear(); //得到年份
176
+        var month = now.getMonth(); //得到月份
177
+        var date = now.getDate(); //得到日期
178
+        month = month + 1;
179
+        month = month.toString().padStart(2, "0");
180
+        date = date.toString().padStart(2, "0");
181
+        var defaultDate = `${year}-${month}-${date}`;
182
+        // this.ruleForm.startTime=[defaultDate,defaultDate]
183
+        this.$set(this.ruleForm, "startTime", [defaultDate, defaultDate]);
184
+      },
185
+      btn_way() {
186
+        this.getList()
187
+      }
188
+    }
189
+  }
190
+</script>
191
+
192
+<style scoped>
193
+  /deep/.el-tabs__item {
194
+    width: 185px !important;
195
+    text-align: center;
196
+    font-size: 16px !important;
197
+    font-weight: 600;
198
+  }
199
+
200
+  .el-popper[x-placement^='bottom'] {
201
+    z-index: 10px !important;
202
+  }
203
+
204
+  .operation div {
205
+    font-size: 14px;
206
+    color: #222;
207
+    padding: 5px 0;
208
+    cursor: pointer;
209
+  }
210
+
211
+  .el-icon-s-tools {
212
+    font-size: 18px !important;
213
+    vertical-align: middle;
214
+  }
215
+
216
+  .el-popover {
217
+    min-width: 75px;
218
+    text-align: center;
219
+  }
220
+
221
+  .el-table .cell {
222
+    position: relative;
223
+  }
224
+
225
+  .el {
226
+    cursor: pointer;
227
+  }
228
+
229
+  .filter-container {
230
+    padding-top: 15px;
231
+  }
232
+
233
+  .el-table--mini,
234
+  .el-table--small,
235
+  .el-table__expand-icon {
236
+    font-size: 14px;
237
+  }
238
+
239
+  .el-table--small td,
240
+  .el-table--small th {
241
+    padding: 2px 0 !important;
242
+  }
243
+
244
+  .filter-date {
245
+    width: 388px !important;
246
+  }
247
+
248
+  .el-table {
249
+    color: #000;
250
+  }
251
+
252
+  .app-container {
253
+    padding: 10px;
254
+  }
255
+</style>

+ 13 - 9
CallCenterWeb.UI/RMYY/src/views/faultRepair/clinicalReporting/components/addRepairbase.vue

@@ -119,13 +119,13 @@
119 119
         type: String,
120 120
         default: ''
121 121
       },
122
-      callid:{
123
-        type:String,
124
-        default:''
122
+      callid: {
123
+        type: String,
124
+        default: ''
125 125
       },
126
-      iswomanage:{
127
-        type:String,
128
-        default:''
126
+      iswomanage: {
127
+        type: String,
128
+        default: ''
129 129
       }
130 130
     },
131 131
     data() {
@@ -208,6 +208,10 @@
208 208
       if (this.wid) {
209 209
         this.getWoDetail(this.wid, '0')
210 210
       }
211
+      if (this.iswomanage == 1) {
212
+        this.ruleForm.assignDepart = ''
213
+        this.ruleForm.assignMant = ''
214
+      }
211 215
     },
212 216
     methods: {
213 217
       // 部门
@@ -302,7 +306,7 @@
302 306
         this.ruleForm.repairImageid += res.data[0].F_FileId + ','
303 307
       },
304 308
       submitForm(formName) {
305
-        console.log(this.callid,'callid')
309
+        console.log(this.callid, 'callid')
306 310
         console.log(this.ruleForm.repairDeptid)
307 311
         this.$refs[formName].validate((valid) => {
308 312
           if (valid) {
@@ -345,8 +349,8 @@
345 349
                 if (this.wid == '') {
346 350
                   console.log('tj')
347 351
                   const params = {
348
-                    LeaveRecordId:this.fid,
349
-                    CallId:this.callid,
352
+                    LeaveRecordId: this.fid,
353
+                    CallId: this.callid,
350 354
                     Applicant: this.ruleForm.repairmanid, // 申请人
351 355
                     ApplicationDept: this.ruleForm.repairDeptid, // 申请部门
352 356
                     Applicantsphone: this.ruleForm.repairmanphone, // 申请电话

+ 193 - 0
CallCenterWeb.UI/RMYY/src/views/faultRepairManagement/repairList/finish.vue

@@ -0,0 +1,193 @@
1
+<template>
2
+  <div>
3
+    <el-form ref="doneForm" :model="doneForm" label-width="100px">
4
+      <el-form-item label="完成情况" prop="type">
5
+        <el-radio-group v-model="doneForm.type">
6
+          <el-radio label="0">正常完成</el-radio>
7
+          <el-radio label="1">异常完成</el-radio>
8
+        </el-radio-group>
9
+      </el-form-item>
10
+      <el-form-item v-if="doneForm.type == '1'" label="异常原因">
11
+        <el-select v-model="doneForm.ExceptionType" placeholder="请选择异常原因" size="medium" clearable>
12
+          <el-option v-for="(item, index) in unusualArr" :key="index" :value="item.F_DictionaryValueId"
13
+            :label="item.F_Name" />
14
+        </el-select>
15
+      </el-form-item>
16
+      <el-form-item v-if="doneForm.type == '0'" label="是否涉及设备">
17
+        <el-radio-group v-model="doneForm.IsInvolvedEquip" style="margin-right: 15px">
18
+          <el-radio label="0">否</el-radio>
19
+          <el-radio label="1">是</el-radio>
20
+        </el-radio-group>
21
+        <el-select v-if="doneForm.IsInvolvedEquip == '1'" v-model="equilist" placeholder="请选择设备" size="medium" multiple
22
+          clearable style="width: 80%;" @change="equiChange">
23
+          <el-option v-for="(item, index) in equiArr" :key="index" :label="item.F_Name+'('+item.F_Describe+')'"
24
+            :value="item.F_DictionaryValueId" />
25
+        </el-select>
26
+      </el-form-item>
27
+      <el-form-item v-if="doneForm.type == '0' && equilist.length > 0">
28
+        <el-table :data="equipmodellist" border stripe style="width: 100%">
29
+          <el-table-column prop="F_EquipName" label="设备" width="180" />
30
+          <el-table-column prop="F_EquipNumber" label="规格型号" width="180" />
31
+          <el-table-column prop="F_EquipAmount" label="数量" width="180">
32
+            <template slot-scope="scope">
33
+              <el-input v-model="scope.row.F_EquipAmount" type="number" placeholder="请输入数量" size="small" />
34
+            </template>
35
+          </el-table-column>
36
+          <el-table-column prop="F_EquipPrice" label="价格" width="180">
37
+            <template slot-scope="scope">
38
+              <el-input v-model="scope.row.F_EquipPrice" type="number" placeholder="请输入价格" size="small" />
39
+            </template>
40
+          </el-table-column>
41
+        </el-table>
42
+      </el-form-item>
43
+      <el-form-item label="完成说明" prop="result">
44
+        <el-input v-model="doneForm.result" :autosize="{ minRows: 4, maxRows: 8 }" show-word-limit maxlength="100"
45
+          type="textarea" placeholder="请输入完成说明" />
46
+      </el-form-item>
47
+      <el-form-item>
48
+        <el-button type="primary" @click="postDoneOrder">确 定</el-button>
49
+      </el-form-item>
50
+    </el-form>
51
+  </div>
52
+</template>
53
+
54
+<script>
55
+  import Pagination from '@/components/context/Pagination' // 对el-pagination 二次封装
56
+  import {
57
+    GetPerson
58
+  } from '@/api/commonAPI'
59
+  import {
60
+    GetFiledState,
61
+    AddFiled
62
+  } from '@/api/commonAPI'
63
+  import fieldDATA from '@/utils/fieldsData.js'
64
+  import selectOrderTypeTwo from '@/components/context/commonSelect/selectOrderTypeTwo.vue'
65
+  import addDefinedList from '@/components/context/addDefinedList'
66
+  import {
67
+    getMaintenancerList,
68
+    postTaskOrders,
69
+    postBackWorkOrder,
70
+    postAssistWorkOrder,
71
+    postTransfer,
72
+    postDealWorkOrder,
73
+    postHangUpWorkOrder,
74
+    postArriveWorkOrder,
75
+    getDicValueList
76
+  } from '@/api/faultRepairManagement/faultRepair'
77
+  import detail from '../../orderManage/components/orderDetail.vue'
78
+  export default {
79
+    name: 'Finish',
80
+    components: {
81
+      Pagination,
82
+      selectOrderTypeTwo
83
+    },
84
+    data() {
85
+      return {
86
+        equiArr: [], // 设备
87
+        unusualArr: [], // 异常原因
88
+        equilist: [], // 设备id
89
+        checkLabel: [], // 设备名称
90
+        checkLabelxh: [], //设备型号
91
+        doneForm: {
92
+          workordercode: '',
93
+          type: '0',
94
+          IsInvolvedEquip: '',
95
+          equipmodellist: [],
96
+          ExceptionType: '',
97
+          result: ''
98
+        },
99
+        equiTable: [],
100
+        equipmodellist: [],
101
+      }
102
+    },
103
+    created() {
104
+      this.getycValueList()
105
+      this.getsbValueList()
106
+    },
107
+    methods: {
108
+      equiChange(val) {
109
+        this.equiTable = []
110
+        this.checkLabel = []
111
+        this.checkLabelxh = []
112
+        this.equipmodellist = []
113
+        for (var i = 0; i < val.length; i++) {
114
+          this.equiArr.find((item) => {
115
+            if (item.F_DictionaryValueId == val[i]) {
116
+              this.checkLabel.push(item.F_Name)
117
+              this.checkLabelxh.push(item.F_Describe)
118
+            }
119
+          })
120
+        }
121
+        console.log(this.checkLabelxh)
122
+        for (var a = 0; a < this.equilist.length; a++) {
123
+          for (var b = 0; b < this.checkLabel.length; b++) {
124
+            for (var c = 0; c < this.checkLabelxh.length; c++) {
125
+              this.equiTable.push({
126
+                F_DicId: this.equilist[b],
127
+                F_EquipName: this.checkLabel[b],
128
+                F_EquipNumber: this.checkLabelxh[b],
129
+                F_EquipAmount: '',
130
+                F_EquipPrice: ''
131
+              })
132
+            }
133
+          }
134
+        }
135
+        let temp = {}
136
+        this.equiTable.map((item, index) => {
137
+          if (!temp[item.F_DicId]) {
138
+            this.equipmodellist.push(item)
139
+            temp[item.F_DicId] = true
140
+          }
141
+        })
142
+        console.log(this.equipmodellist)
143
+      },
144
+      getycValueList() {
145
+        const params = {
146
+          Flag: 'YCLX',
147
+          Name: ''
148
+        }
149
+        getDicValueList(params).then((res) => {
150
+          this.unusualArr = res.rows
151
+        })
152
+      },
153
+      getsbValueList() {
154
+        const params = {
155
+          Flag: 'SJSB',
156
+          Name: ''
157
+        }
158
+        getDicValueList(params).then((res) => {
159
+          this.equiArr = res.rows
160
+        })
161
+      },
162
+      postDoneOrder() {
163
+        // console.log(this.equipmodellist)
164
+        if (this.doneForm.equipmodellist) {
165
+          this.doneForm.equipmodellist = this.equipmodellist
166
+        }
167
+        new Promise((resolve) => {
168
+          const params = this.doneForm
169
+          postDealWorkOrder(params).then((response) => {
170
+            if (response.state === 'success') {
171
+              this.$message({
172
+                type: 'success',
173
+                message: '操作成功!'
174
+              })
175
+              this.dialogDone = false
176
+              this.equipmodellist = []
177
+              this.getListTask()
178
+            } else {
179
+              this.$message({
180
+                type: 'info',
181
+                message: response.message
182
+              })
183
+            }
184
+          })
185
+          resolve()
186
+        })
187
+      }
188
+    }
189
+  }
190
+</script>
191
+
192
+<style>
193
+</style>

Dosya farkı çok büyük olduğundan ihmal edildi
+ 648 - 843
CallCenterWeb.UI/RMYY/src/views/faultRepairManagement/repairList/index.vue


+ 401 - 361
CallCenterWeb.UI/RMYY/src/views/layout/components/Navbar/Teloperation.vue

@@ -25,7 +25,8 @@
25 25
           <span v-show="telIsLogin && telLineState === 10" key="15">保持中</span>
26 26
           <svg-icon v-show="telIsLogin" icon-class="xinhao" />
27 27
         </p>
28
-        <p v-show="(telSeatState === 2 && telLineState < 6) || (telSeatState === 5 && telLineState < 6)" class="call_time">--:--:--</p>
28
+        <p v-show="(telSeatState === 2 && telLineState < 6) || (telSeatState === 5 && telLineState < 6)"
29
+          class="call_time">--:--:--</p>
29 30
         <p v-show="telIsLogin && (telLineState === 6 || telLineState === 10)" class="call_time">
30 31
           <span v-show="Number(telCallTime.hh) === 0">{{ telCallTime.hh }}</span>
31 32
           <span v-show="Number(telCallTime.hh) > 0 && Number(telCallTime.hh) < 10">
@@ -45,431 +46,470 @@
45 46
     </div>
46 47
     <div v-show="telIsLogin" class="call_middle">
47 48
       <el-input :class="{ no_write: true }" :readonly="true" v-model="telCallNum" size="small" placeholder />
48
-      <i v-show="(telSeatState === 2 && telLineState === 1) || (telSeatState === 5 && telLineState === 1)" slot="reference" class="dialicon" @click="makeCall" />
49
-      <el-popover :value="telIsVisCallout" :disabled="false" trigger="manual" popper-class="dial_popover" placement="bottom-start" width="300" transition="fade-in-linear" @after-leave="afterLeave">
49
+      <i v-show="(telSeatState === 2 && telLineState === 1) || (telSeatState === 5 && telLineState === 1)"
50
+        slot="reference" class="dialicon" @click="makeCall" />
51
+      <el-popover :value="telIsVisCallout" :disabled="false" trigger="manual" popper-class="dial_popover"
52
+        placement="bottom-start" width="300" transition="fade-in-linear" @after-leave="afterLeave">
50 53
         <Dialplate />
51 54
       </el-popover>
52 55
     </div>
53 56
     <div class="call_right">
54 57
       <transition-group type="transition" name="fade-list">
55 58
         <button v-waves v-show="!telIsLogin" key="27" type="button" class="start_btn" @click="signIn">开始工作</button>
56
-        <button v-waves v-show="telIsLogin && telSeatState === 2 && telLineState === 1" key="17" type="button" class="call_btn" @click="setBusy">置忙</button>
57
-        <button v-waves v-show="telIsLogin && telSeatState === 5 && telLineState === 1" key="18" type="button" class="call_btn" @click="setFree">置闲</button>
58
-        <button v-waves v-show="telIsLogin && (telSeatState === 2 || telSeatState === 5) && telLineState === 1" key="19" type="button" class="call_btn" @click="signOut">签出</button>
59
-        <button v-waves v-show="telIsLogin && telLineState === 6" key="20" type="button" class="call_btn yellow_bg" @click="holdBack">保持通话</button>
60
-        <button v-waves v-show="telIsLogin && telLineState === 10" key="21" type="button" class="call_btn green_bg" @click="retrieveBack">接回通话</button>
61
-        <button v-waves v-show="telIsLogin && (telLineState === 6 || telLineState === 10)" key="24" type="button" class="call_btn" @click="transferCall">转接</button>
62
-        <button v-waves v-show="telIsLogin && (telLineState === 6 || telLineState === 10)" key="25" type="button" class="call_btn" @click="meetingCall">多方通话</button>
63
-        <button v-waves v-show="telIsLogin && telLineState > 5" key="22" type="button" class="call_btn" @click="btn_IVR">转IVR</button>
64
-        <button v-waves v-show="telIsLogin && telLineState > 5" key="23" type="button" class="call_btn red_bg" @click="dropCall">挂断</button>
59
+        <button v-waves v-show="telIsLogin && telSeatState === 2 && telLineState === 1" key="17" type="button"
60
+          class="call_btn" @click="setBusy">置忙</button>
61
+        <button v-waves v-show="telIsLogin && telSeatState === 5 && telLineState === 1" key="18" type="button"
62
+          class="call_btn" @click="setFree">置闲</button>
63
+        <button v-waves v-show="telIsLogin && (telSeatState === 2 || telSeatState === 5) && telLineState === 1" key="19"
64
+          type="button" class="call_btn" @click="signOut">签出</button>
65
+        <button v-waves v-show="telIsLogin && telLineState === 6" key="20" type="button" class="call_btn yellow_bg"
66
+          @click="holdBack">保持通话</button>
67
+        <button v-waves v-show="telIsLogin && telLineState === 10" key="21" type="button" class="call_btn green_bg"
68
+          @click="retrieveBack">接回通话</button>
69
+        <button v-waves v-show="telIsLogin && (telLineState === 6 || telLineState === 10)" key="24" type="button"
70
+          class="call_btn" @click="transferCall">转接</button>
71
+        <button v-waves v-show="telIsLogin && (telLineState === 6 || telLineState === 10)" key="25" type="button"
72
+          class="call_btn" @click="meetingCall">多方通话</button>
73
+        <button v-waves v-show="telIsLogin && telLineState > 5" key="22" type="button" class="call_btn"
74
+          @click="btn_IVR">转IVR</button>
75
+        <button v-waves v-show="telIsLogin && telLineState > 5" key="23" type="button" class="call_btn red_bg"
76
+          @click="dropCall">挂断</button>
65 77
       </transition-group>
66 78
     </div>
67 79
   </div>
68 80
 </template>
69 81
 
70 82
 <script>
71
-import { mapGetters } from 'vuex'
72
-import store from '@/store'
73
-import { Send } from '@/utils/telWebsocket'
74
-import Dialplate from '@/components/context/Dialplate'
75
-export default {
76
-  name: 'Teloperation',
77
-  components: {
78
-    Dialplate
79
-  },
80
-  data() {
81
-    return {
82
-      scoketDatas: {}, // 发送的数据
83
-      telNumber: '',
84
-      telTimer: null // 时间定时器
85
-    }
86
-  },
87
-  computed: {
88
-    ...mapGetters([
89
-      'usercode', // 工号
90
-      'extension', // 分机号
91
-      'groupcode', // 坐席组code
92
-      'telIsLogin', // 是否签入
93
-      'telSeatState', // 坐席状态
94
-      'telLineState', // 线路状态
95
-      'telCallNum', // 电话号码
96
-      'telIsVisCallout', // 外呼操作面板是否显示
97
-      'telCallTime', // 通话时间
98
-      'telMessageData' // telwebsocket 接收的数据
99
-    ])
100
-  },
101
-  watch: {
102
-    // 如果 `telLineState` 发生改变,这个函数就会运行
103
-    telLineState: function(newT, oldT) {
104
-      this.watchTelLineState(newT, oldT)
105
-    }
106
-  },
107
-  methods: {
108
-    // 签入
109
-    signIn() {
110
-      if (!this.extension) {
111
-        this.$confirm('如果您想进行话务操作,请重新登录并且输入分机号, 是否重新登录?', '提示', {
112
-          confirmButtonText: '是',
113
-          cancelButtonText: '否',
114
-          type: 'warning'
115
-        })
116
-          .then(() => {
117
-            this.$store.dispatch('FedLogOut').then(() => {
118
-              location.reload() // 为了重新实例化vue-router对象 避免bug
119
-            })
120
-          })
121
-          .catch(() => {})
122
-        return
123
-      }
124
-      this.scoketDatas = {
125
-        Type: 'Login',
126
-        AgentID: this.usercode,
127
-        AgentExten: this.extension,
128
-        AgentGroup: window.localStorage.getItem('groupCode'), // 坐席组id window.localStorage.getItem('groupCode')
129
-        AgentType: '0',
130
-        DisposeTime: '0' // 话后处理时长设置,0代表一致话后处理,除非发送置闲 (按照历史习惯,字符串形式)
131
-      }
132
-      Send(this.scoketDatas)
83
+  import {
84
+    mapGetters
85
+  } from 'vuex'
86
+  import store from '@/store'
87
+  import {
88
+    Send
89
+  } from '@/utils/telWebsocket'
90
+  import {
91
+    Teljournal
92
+  } from '@/api/commonAPI'
93
+  import Dialplate from '@/components/context/Dialplate'
94
+  export default {
95
+    name: 'Teloperation',
96
+    components: {
97
+      Dialplate
133 98
     },
134
-    // 签出
135
-    signOut() {
136
-      this.scoketDatas = {
137
-        Type: 'Logout',
138
-        AgentID: this.usercode,
139
-        AgentExten: this.extension
99
+    data() {
100
+      return {
101
+        scoketDatas: {}, // 发送的数据
102
+        telNumber: '',
103
+        telTimer: null // 时间定时器
140 104
       }
141
-      Send(this.scoketDatas)
142
-      store.dispatch('UpdateCalloutScreen', false)
143 105
     },
144
-    // 置忙
145
-    setBusy() {
146
-      this.scoketDatas = {
147
-        Type: 'SayBusy',
148
-        AgentID: this.usercode,
149
-        AgentExten: this.extension
150
-      }
151
-      Send(this.scoketDatas)
106
+    computed: {
107
+      ...mapGetters([
108
+        'usercode', // 工号
109
+        'extension', // 分机号
110
+        'groupcode', // 坐席组code
111
+        'telIsLogin', // 是否签入
112
+        'telSeatState', // 坐席状态
113
+        'telLineState', // 线路状态
114
+        'telCallNum', // 电话号码
115
+        'telIsVisCallout', // 外呼操作面板是否显示
116
+        'telCallTime', // 通话时间
117
+        'telMessageData' // telwebsocket 接收的数据
118
+      ])
152 119
     },
153
-    // 置闲
154
-    setFree() {
155
-      this.scoketDatas = {
156
-        Type: 'SayFree',
157
-        AgentID: this.usercode,
158
-        AgentExten: this.extension
120
+    watch: {
121
+      // 如果 `telLineState` 发生改变,这个函数就会运行
122
+      telLineState: function(newT, oldT) {
123
+        this.watchTelLineState(newT, oldT)
159 124
       }
160
-      Send(this.scoketDatas)
161
-    },
162
-    // 转IVR
163
-    btn_IVR() {
164
-      this.scoketDatas = {
165
-        Type: 'TurnIvr',
166
-        AgentID: this.usercode,
167
-        AgentExten: this.extension,
168
-        IvrName: 'MYD_ZXZ',
169
-        IvrPos: '1'
170
-      }
171
-      Send(this.scoketDatas)
172
-    },
173
-    // 挂断
174
-    dropCall() {
175
-      this.scoketDatas = {
176
-        Type: 'DropCall',
177
-        AgentID: this.usercode,
178
-        AgentExten: this.extension
179
-      }
180
-      Send(this.scoketDatas)
181
-      store.dispatch('UpdateCalloutScreen', false)
182
-    },
183
-    // 保持通话
184
-    holdBack() {
185
-      this.scoketDatas = {
186
-        Type: 'Hold',
187
-        AgentID: this.usercode,
188
-        AgentExten: this.extension
189
-      }
190
-      Send(this.scoketDatas)
191
-    },
192
-    // 接回通话
193
-    retrieveBack() {
194
-      this.scoketDatas = {
195
-        Type: 'Retrieve',
196
-        AgentID: this.usercode,
197
-        AgentExten: this.extension
198
-      }
199
-      Send(this.scoketDatas)
200
-    },
201
-    // 外呼
202
-    makeCall() {
203
-      store.dispatch('ChangeCallType', 'MakeCall')
204
-      store.dispatch('UpdateCalloutScreen', !this.telIsVisCallout)
205 125
     },
206
-    // 转接
207
-    transferCall() {
208
-      store.dispatch('ChangeCallType', 'Transfer')
209
-      store.dispatch('UpdateCalloutScreen', !this.telIsVisCallout)
210
-    },
211
-    // 多方通话
212
-    meetingCall() {
213
-      store.dispatch('ChangeCallType', 'Meeting')
214
-      store.dispatch('UpdateCalloutScreen', !this.telIsVisCallout)
215
-    },
216
-    // 外呼操作面板 关闭后
217
-    afterLeave() {
218
-      store.dispatch('ChangeCallType', 'MakeCall')
219
-    },
220
-    // 通话时间
221
-    callTime() {
222
-      // 通话时间重置为00:00:00
223
-      store.dispatch('UpdateCallTime', {
224
-        hh: '00',
225
-        mm: '00',
226
-        ss: '00'
227
-      })
228
-      // 时间 计时
229
-      let _n = 0
230
-      if (this.telTimer) {
231
-        clearInterval(this.telTimer)
232
-      }
233
-      this.telTimer = setInterval(() => {
234
-        _n++
235
-
126
+    methods: {
127
+      // 签入
128
+      signIn() {
129
+        this.getOperatonTime('1')
130
+        console.log('签入1')
131
+        if (!this.extension) {
132
+          this.$confirm('如果您想进行话务操作,请重新登录并且输入分机号, 是否重新登录?', '提示', {
133
+              confirmButtonText: '是',
134
+              cancelButtonText: '否',
135
+              type: 'warning'
136
+            })
137
+            .then(() => {
138
+              this.$store.dispatch('FedLogOut').then(() => {
139
+                location.reload() // 为了重新实例化vue-router对象 避免bug
140
+              })
141
+            })
142
+            .catch(() => {})
143
+          return
144
+        }
145
+        this.scoketDatas = {
146
+          Type: 'Login',
147
+          AgentID: this.usercode,
148
+          AgentExten: this.extension,
149
+          AgentGroup: window.localStorage.getItem('groupCode'), // 坐席组id window.localStorage.getItem('groupCode')
150
+          AgentType: '0',
151
+          DisposeTime: '0' // 话后处理时长设置,0代表一致话后处理,除非发送置闲 (按照历史习惯,字符串形式)
152
+        }
153
+        Send(this.scoketDatas)
154
+      },
155
+      // 签出
156
+      signOut() {
157
+        this.scoketDatas = {
158
+          Type: 'Logout',
159
+          AgentID: this.usercode,
160
+          AgentExten: this.extension
161
+        }
162
+        Send(this.scoketDatas)
163
+        store.dispatch('UpdateCalloutScreen', false)
164
+      },
165
+      // 置忙
166
+      setBusy() {
167
+        this.scoketDatas = {
168
+          Type: 'SayBusy',
169
+          AgentID: this.usercode,
170
+          AgentExten: this.extension
171
+        }
172
+        Send(this.scoketDatas)
173
+      },
174
+      // 置闲
175
+      setFree() {
176
+        this.scoketDatas = {
177
+          Type: 'SayFree',
178
+          AgentID: this.usercode,
179
+          AgentExten: this.extension
180
+        }
181
+        Send(this.scoketDatas)
182
+      },
183
+      // 转IVR
184
+      btn_IVR() {
185
+        this.scoketDatas = {
186
+          Type: 'TurnIvr',
187
+          AgentID: this.usercode,
188
+          AgentExten: this.extension,
189
+          IvrName: 'MYD_ZXZ',
190
+          IvrPos: '1'
191
+        }
192
+        Send(this.scoketDatas)
193
+      },
194
+      // 挂断
195
+      dropCall() {
196
+        this.scoketDatas = {
197
+          Type: 'DropCall',
198
+          AgentID: this.usercode,
199
+          AgentExten: this.extension
200
+        }
201
+        Send(this.scoketDatas)
202
+        store.dispatch('UpdateCalloutScreen', false)
203
+      },
204
+      // 保持通话
205
+      holdBack() {
206
+        this.scoketDatas = {
207
+          Type: 'Hold',
208
+          AgentID: this.usercode,
209
+          AgentExten: this.extension
210
+        }
211
+        Send(this.scoketDatas)
212
+      },
213
+      // 接回通话
214
+      retrieveBack() {
215
+        this.scoketDatas = {
216
+          Type: 'Retrieve',
217
+          AgentID: this.usercode,
218
+          AgentExten: this.extension
219
+        }
220
+        Send(this.scoketDatas)
221
+      },
222
+      // 外呼
223
+      makeCall() {
224
+        store.dispatch('ChangeCallType', 'MakeCall')
225
+        store.dispatch('UpdateCalloutScreen', !this.telIsVisCallout)
226
+      },
227
+      // 转接
228
+      transferCall() {
229
+        store.dispatch('ChangeCallType', 'Transfer')
230
+        store.dispatch('UpdateCalloutScreen', !this.telIsVisCallout)
231
+      },
232
+      // 多方通话
233
+      meetingCall() {
234
+        store.dispatch('ChangeCallType', 'Meeting')
235
+        store.dispatch('UpdateCalloutScreen', !this.telIsVisCallout)
236
+      },
237
+      // 外呼操作面板 关闭后
238
+      afterLeave() {
239
+        store.dispatch('ChangeCallType', 'MakeCall')
240
+      },
241
+      // 通话时间
242
+      callTime() {
243
+        // 通话时间重置为00:00:00
236 244
         store.dispatch('UpdateCallTime', {
237
-          hh: this.toDub(parseInt((_n / 60 / 60) % 60)), // 小时
238
-          mm: this.toDub(parseInt((_n / 60) % 60)), // 分钟
239
-          ss: this.toDub(parseInt(_n % 60)) // 秒
245
+          hh: '00',
246
+          mm: '00',
247
+          ss: '00'
240 248
         })
241
-      }, 1000)
242
-    },
243
-    // 清除定时器
244
-    clearInter() {
245
-      clearInterval(this.telTimer)
246
-    },
247
-    // 小于10补0
248
-    toDub(i) {
249
-      return i < 10 ? '0' + i : '' + i
250
-    },
251
-    // 监听 线路状态
252
-    watchTelLineState(newT, oldT) {
253
-      // 外呼
254
-      if (newT === 6 && oldT === 4) {
255
-        this.callTime()
256
-      }
257
-      // 来电
258
-      if (newT === 6 && oldT === 5) {
259
-        this.callTime()
260
-      }
261
-      if (newT === 1) {
249
+        // 时间 计时
250
+        let _n = 0
262 251
         if (this.telTimer) {
263 252
           clearInterval(this.telTimer)
264
-          this.telTimer = null
265 253
         }
254
+        this.telTimer = setInterval(() => {
255
+          _n++
256
+
257
+          store.dispatch('UpdateCallTime', {
258
+            hh: this.toDub(parseInt((_n / 60 / 60) % 60)), // 小时
259
+            mm: this.toDub(parseInt((_n / 60) % 60)), // 分钟
260
+            ss: this.toDub(parseInt(_n % 60)) // 秒
261
+          })
262
+        }, 1000)
263
+      },
264
+      // 清除定时器
265
+      clearInter() {
266
+        clearInterval(this.telTimer)
267
+      },
268
+      // 小于10补0
269
+      toDub(i) {
270
+        return i < 10 ? '0' + i : '' + i
271
+      },
272
+      // 监听 线路状态
273
+      watchTelLineState(newT, oldT) {
274
+        // 外呼
275
+        if (newT === 6 && oldT === 4) {
276
+          this.callTime()
277
+        }
278
+        // 来电
279
+        if (newT === 6 && oldT === 5) {
280
+          this.callTime()
281
+        }
282
+        if (newT === 1) {
283
+          if (this.telTimer) {
284
+            clearInterval(this.telTimer)
285
+            this.telTimer = null
286
+          }
287
+        }
288
+      },
289
+      getOperatonTime(state) {
290
+        const params = {
291
+          state: state,
292
+          token: localStorage.getItem('Admin-Token').split(' ')[1]
293
+        }
294
+        Teljournal(params)
295
+          .then((response) => {
296
+
297
+          })
298
+          .catch((result) => {})
266 299
       }
267 300
     }
268 301
   }
269
-}
270 302
 </script>
271 303
 
272 304
 <style rel="stylesheet/scss" lang="scss">
273
-.call_middle {
274
-  .el-input {
275
-    width: 130px;
276
-  }
277
-  .el-input__inner {
278
-    width: 130px;
279
-    background-color: #282b36;
280
-    color: #ffffff;
281
-    border-radius: 16px;
282
-    border-color: transparent;
283
-    font-family: "黑体";
284
-  }
285
-  .no_write .el-input__inner {
286
-    background-color: transparent;
287
-    font-size: 18px;
288
-    padding-left: 6px;
289
-    padding-right: 0;
305
+  .call_middle {
306
+    .el-input {
307
+      width: 130px;
308
+    }
309
+
310
+    .el-input__inner {
311
+      width: 130px;
312
+      background-color: #282b36;
313
+      color: #ffffff;
314
+      border-radius: 16px;
315
+      border-color: transparent;
316
+      font-family: "黑体";
317
+    }
318
+
319
+    .no_write .el-input__inner {
320
+      background-color: transparent;
321
+      font-size: 18px;
322
+      padding-left: 6px;
323
+      padding-right: 0;
324
+    }
290 325
   }
291
-}
292
-
293
-.dial_popover {
294
-  background-color: #42484d;
295
-  padding: 0;
296
-  border-bottom-left-radius: 10px;
297
-  border-bottom-right-radius: 0;
298
-  border-top-right-radius: 0;
299
-  border-top-left-radius: 0;
300
-  border-color: #42484d;
301
-
302
-  .popper__arrow,
303
-  .popper__arrow::after {
304
-    border-bottom-color: #42484d !important;
326
+
327
+  .dial_popover {
328
+    background-color: #42484d;
329
+    padding: 0;
330
+    border-bottom-left-radius: 10px;
331
+    border-bottom-right-radius: 0;
332
+    border-top-right-radius: 0;
333
+    border-top-left-radius: 0;
334
+    border-color: #42484d;
335
+
336
+    .popper__arrow,
337
+    .popper__arrow::after {
338
+      border-bottom-color: #42484d !important;
339
+    }
305 340
   }
306
-}
307 341
 </style>
308 342
 
309 343
 <style rel="stylesheet/scss" lang="scss" scoped>
310
-.tel_operation {
311
-  position: absolute;
312
-  left: 230px;
313
-  top: 3px;
314
-  background-color: #42484d;
315
-  min-width: 284px;
316
-  height: 46px;
317
-  line-height: 46px;
318
-  border-radius: 23px;
319
-  -webkit-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.7);
320
-  box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.7);
321
-  z-index: 999;
322
-
323
-  .call_left,
324
-  .call_middle,
325
-  .call_right {
326
-    float: left;
344
+  .tel_operation {
345
+    position: absolute;
346
+    left: 230px;
347
+    top: 3px;
348
+    background-color: #42484d;
349
+    min-width: 284px;
327 350
     height: 46px;
328
-    overflow: hidden;
329 351
     line-height: 46px;
330
-  }
352
+    border-radius: 23px;
353
+    -webkit-box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.7);
354
+    box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.7);
355
+    z-index: 999;
331 356
 
332
-  .call_left {
333
-    width: 139px;
334
-    display: flex;
335
-    .call_icon {
336
-      display: inline-block;
337
-      margin-left: 7px;
338
-      margin-top: 7px;
339
-      width: 32px;
340
-      height: 32px;
341
-      text-align: center;
342
-      border-radius: 50%;
357
+    .call_left,
358
+    .call_middle,
359
+    .call_right {
360
+      float: left;
361
+      height: 46px;
343 362
       overflow: hidden;
344
-      background-color: #1f2129;
345
-      .calli {
363
+      line-height: 46px;
364
+    }
365
+
366
+    .call_left {
367
+      width: 139px;
368
+      display: flex;
369
+
370
+      .call_icon {
346 371
         display: inline-block;
372
+        margin-left: 7px;
373
+        margin-top: 7px;
347 374
         width: 32px;
348 375
         height: 32px;
376
+        text-align: center;
349 377
         border-radius: 50%;
350
-      }
351
-      .free {
352
-        background: url("~@/assets/imgs/free.gif") center center no-repeat;
353
-      }
354
-      .incalling {
355
-        background: url("~@//assets/imgs/incalling.gif") center center no-repeat;
356
-      }
357
-      .callringing {
358
-        background: url("~@//assets/imgs/callringing.gif") center center no-repeat;
359
-      }
378
+        overflow: hidden;
379
+        background-color: #1f2129;
360 380
 
361
-      .svg-icon {
362
-        color: #ffffff;
363
-        font-size: 16px;
364
-        vertical-align: 0.3em;
365
-      }
381
+        .calli {
382
+          display: inline-block;
383
+          width: 32px;
384
+          height: 32px;
385
+          border-radius: 50%;
386
+        }
366 387
 
367
-      .ringing {
368
-        color: #1bce7d;
369
-      }
388
+        .free {
389
+          background: url("~@/assets/imgs/free.gif") center center no-repeat;
390
+        }
370 391
 
371
-      .incall {
372
-        color: #149ee4;
373
-      }
374
-    }
392
+        .incalling {
393
+          background: url("~@//assets/imgs/incalling.gif") center center no-repeat;
394
+        }
375 395
 
376
-    .call_content {
377
-      display: inline-block;
378
-      margin-left: 12px;
379
-      vertical-align: -0.09em;
396
+        .callringing {
397
+          background: url("~@//assets/imgs/callringing.gif") center center no-repeat;
398
+        }
380 399
 
381
-      p {
382
-        margin: 0;
383
-        padding: 0;
384
-        color: #ffffff;
385
-      }
400
+        .svg-icon {
401
+          color: #ffffff;
402
+          font-size: 16px;
403
+          vertical-align: 0.3em;
404
+        }
386 405
 
387
-      .blue_color {
388
-        color: #409eff;
389
-      }
406
+        .ringing {
407
+          color: #1bce7d;
408
+        }
390 409
 
391
-      .ft16 {
392
-        font-size: 16px;
410
+        .incall {
411
+          color: #149ee4;
412
+        }
393 413
       }
394 414
 
395
-      .call_text {
396
-        font-size: 12px;
397
-        line-height: 13px;
415
+      .call_content {
416
+        display: inline-block;
417
+        margin-left: 12px;
418
+        vertical-align: -0.09em;
398 419
 
399
-        .svg-icon {
400
-          margin-left: 20px;
401
-          font-size: 15px;
420
+        p {
421
+          margin: 0;
422
+          padding: 0;
423
+          color: #ffffff;
424
+        }
425
+
426
+        .blue_color {
427
+          color: #409eff;
402 428
         }
403
-      }
404 429
 
405
-      .call_time {
406
-        margin-top: 4px;
407
-        font-size: 14px;
408
-        line-height: 20px;
430
+        .ft16 {
431
+          font-size: 16px;
432
+        }
433
+
434
+        .call_text {
435
+          font-size: 12px;
436
+          line-height: 13px;
437
+
438
+          .svg-icon {
439
+            margin-left: 20px;
440
+            font-size: 15px;
441
+          }
442
+        }
443
+
444
+        .call_time {
445
+          margin-top: 4px;
446
+          font-size: 14px;
447
+          line-height: 20px;
448
+        }
409 449
       }
410 450
     }
411
-  }
412 451
 
413
-  .call_middle {
414
-    width: 160px;
415
-    margin-left: 16px;
416
-    .dialicon {
417
-      display: inline-block;
418
-      width: 14px;
419
-      height: 19px;
420
-      background: url("~@/assets/imgs/dialicon.png") center center no-repeat;
421
-      margin-right: 10px;
422
-      cursor: pointer;
423
-      vertical-align: text-bottom;
452
+    .call_middle {
453
+      width: 160px;
454
+      margin-left: 16px;
455
+
456
+      .dialicon {
457
+        display: inline-block;
458
+        width: 14px;
459
+        height: 19px;
460
+        background: url("~@/assets/imgs/dialicon.png") center center no-repeat;
461
+        margin-right: 10px;
462
+        cursor: pointer;
463
+        vertical-align: text-bottom;
464
+      }
424 465
     }
425
-  }
426 466
 
427
-  .call_right {
428
-    margin-left: 17px;
467
+    .call_right {
468
+      margin-left: 17px;
429 469
 
430
-    .start_btn {
431
-      border: none;
432
-      outline: none;
433
-      background-color: #409eff;
434
-      color: #ffffff;
435
-      border-top-right-radius: 23px;
436
-      border-bottom-right-radius: 23px;
437
-      height: 46px;
438
-      line-height: 46px;
439
-      width: 140px;
440
-      font-size: 16px;
441
-      text-align: center;
442
-      cursor: pointer;
443
-    }
470
+      .start_btn {
471
+        border: none;
472
+        outline: none;
473
+        background-color: #409eff;
474
+        color: #ffffff;
475
+        border-top-right-radius: 23px;
476
+        border-bottom-right-radius: 23px;
477
+        height: 46px;
478
+        line-height: 46px;
479
+        width: 140px;
480
+        font-size: 16px;
481
+        text-align: center;
482
+        cursor: pointer;
483
+      }
444 484
 
445
-    .call_btn {
446
-      outline: none;
447
-      cursor: pointer;
448
-      background-color: #42484d;
449
-      border: 2px solid #191c26;
450
-      height: 26px;
451
-      padding: 0 20px;
452
-      margin-right: 10px;
453
-      border-radius: 11px;
454
-      font-size: 12px;
455
-      color: #ffffff;
456
-    }
485
+      .call_btn {
486
+        outline: none;
487
+        cursor: pointer;
488
+        background-color: #42484d;
489
+        border: 2px solid #191c26;
490
+        height: 26px;
491
+        padding: 0 20px;
492
+        margin-right: 10px;
493
+        border-radius: 11px;
494
+        font-size: 12px;
495
+        color: #ffffff;
496
+      }
457 497
 
458
-    .yellow_bg {
459
-      background-color: #e6ad43;
460
-    }
498
+      .yellow_bg {
499
+        background-color: #e6ad43;
500
+      }
461 501
 
462
-    .green_bg {
463
-      background-color: #1795d5;
464
-    }
502
+      .green_bg {
503
+        background-color: #1795d5;
504
+      }
465 505
 
466
-    .red_bg {
467
-      background-color: #e6261e;
506
+      .red_bg {
507
+        background-color: #e6261e;
508
+      }
468 509
     }
469
-  }
470 510
 
471
-  .inlineBlock {
472
-    display: inline-block;
511
+    .inlineBlock {
512
+      display: inline-block;
513
+    }
473 514
   }
474
-}
475 515
 </style>

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

@@ -69,7 +69,9 @@
69 69
     mapGetters
70 70
   } from 'vuex'
71 71
   import store from '@/store'
72
-  import {getLogout} from '@/api/layout/permsgEdit'
72
+  import {
73
+    getLogout
74
+  } from '@/api/layout/permsgEdit'
73 75
   import {
74 76
     createWebSocket
75 77
   } from '@/utils/telWebsocket'
@@ -170,9 +172,6 @@
170 172
             this.isDisable = false
171 173
             this.loginout()
172 174
             this.signOut() // 签出
173
-            this.$store.dispatch('FedLogOut').then(() => {
174
-              location.reload() // 为了重新实例化vue-router对象 避免bug
175
-            })
176 175
           })
177 176
           .catch(() => {
178 177
             this.$message({
@@ -181,18 +180,19 @@
181 180
             })
182 181
           })
183 182
       },
184
-      loginout(){
183
+      loginout() {
185 184
         const params = {
186
-          token:localStorage.getItem('Admin-Token').split(' ')[1]
185
+          token: localStorage.getItem('Admin-Token').split(' ')[1]
187 186
         }
188 187
         return new Promise((resolve, reject) => {
189 188
           getLogout(params).then(response => {
190
-
189
+            this.$store.dispatch('FedLogOut').then(() => {
190
+              location.reload() // 为了重新实例化vue-router对象 避免bug
191
+            })
191 192
           }).catch(error => {
192 193
             reject(error)
193 194
           })
194 195
         })
195
-
196 196
       },
197 197
       tosend(roleid, uesrid) {
198 198
         this.$layer.iframe({

+ 33 - 41
CallCenterWeb.UI/RMYY/src/views/orderManage/components/addOrEditInfOrder.vue

@@ -19,6 +19,16 @@
19 19
               </el-form-item>
20 20
             </el-col>
21 21
           </el-row>
22
+          <el-row v-if="ruleForm.type2Arr[0] == 8015&&iswomanage!=1">
23
+            <el-col :span="22">
24
+              <el-form-item label="投诉来源">
25
+                <el-select v-model="ruleForm.F_ComplaintSource" style="width: 100%;">
26
+                  <el-option v-for="(item,index) in tousuArr" :key="index" :label="item.F_Name" :value="item.F_DictionaryValueId">
27
+                  </el-option>
28
+                </el-select>
29
+              </el-form-item>
30
+            </el-col>
31
+          </el-row>
22 32
           <el-row>
23 33
             <el-col :span="12">
24 34
               <el-form-item label="姓名" prop="F_Customer">
@@ -70,16 +80,6 @@
70 80
               </el-form-item>
71 81
             </el-col>
72 82
           </el-row>
73
-          <!-- 家庭预约上门字段 -->
74
-          <!--       <el-row v-if="ruleForm.F_Type2 === 1004">
75
-            <el-col :span="10">
76
-              <el-form-item label="服务项目" prop="F_ServiceItems">
77
-                <select-service-project v-if="OrderDetailFlag" :services-param="inServicesParam"
78
-                  @post-service-project="getServiceProject" />
79
-              </el-form-item>
80
-            </el-col>
81
-          </el-row> -->
82
-          <!-- 外聘专家咨询字段 -->
83 83
           <el-row v-if="ruleForm.type2Arr[0] == 8008">
84 84
             <el-col :span="12">
85 85
               <el-form-item label="地区" prop="F_Address">
@@ -113,36 +113,6 @@
113 113
               </el-form-item>
114 114
             </el-col>
115 115
           </el-row>
116
-          <!-- PICC、中长导管置管 -->
117
-          <!--         <el-row v-if="ruleForm.F_Type2 === 1005">
118
-            <el-col :span="10">
119
-              <el-form-item label="置管类型" prop="F_Cathetertype">
120
-                <el-input v-model="ruleForm.F_Cathetertype" placeholder="请输入置管类型" />
121
-              </el-form-item>
122
-            </el-col>
123
-            <el-col :span="10">
124
-              <el-form-item label="置管科室" prop="F_Catheterdept">
125
-                <el-input v-model="ruleForm.F_Catheterdept" placeholder="请输入置管科室" />
126
-              </el-form-item>
127
-            </el-col>
128
-            <el-col :span="10">
129
-              <el-form-item label="置管时间" prop="F_Cathetertime">
130
-                <el-date-picker v-model="ruleForm.F_Cathetertime" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
131
-                  style="width: 100%;" placeholder="请选择置管时间" />
132
-              </el-form-item>
133
-            </el-col>
134
-            <el-col :span="10">
135
-              <el-form-item label="床号" prop="F_BedNum">
136
-                <el-input v-model="ruleForm.F_BedNum" placeholder="请输入床号" />
137
-              </el-form-item>
138
-            </el-col>
139
-            <el-col :span="10">
140
-              <el-form-item label="住院号" prop="F_InpatientNum">
141
-                <el-input v-model="ruleForm.F_InpatientNum" placeholder="请输入住院号" />
142
-              </el-form-item>
143
-            </el-col>
144
-          </el-row> -->
145
-          <!--工单处理内容 -->
146 116
           <el-row>
147 117
             <el-col :span="24">
148 118
               <el-form-item label="工单内容" prop="F_WorkOrderContents">
@@ -215,7 +185,8 @@
215 185
   import {
216 186
     addOrEdittOrder,
217 187
     updateWorkOrder,
218
-    GetOrderDetail
188
+    GetOrderDetail,
189
+    getTouSuSelect
219 190
   } from '@/api/orderManagement/orderList'
220 191
   import {
221 192
     validateTel
@@ -237,6 +208,10 @@
237 208
         type: String,
238 209
         default: ''
239 210
       },
211
+      iswomanage: {
212
+        type: String,
213
+        default: ''
214
+      },
240 215
       // callid:{
241 216
       //   type:String,
242 217
       //   default:''
@@ -275,6 +250,7 @@
275 250
         repairman: [],
276 251
         deptidArr1: [],
277 252
         repairman1: [],
253
+        tousuArr: [],
278 254
         firstOrderTypeParam: {
279 255
           typeid: 1,
280 256
           name: '',
@@ -433,6 +409,7 @@
433 409
           clbm: '',
434 410
           clid: '',
435 411
           cont: '',
412
+          F_ComplaintSource:4010,
436 413
           F_ComplaintDept: '',
437 414
           F_ComplaintUser: '',
438 415
           F_WorkOrderContents: '', // 工单内容
@@ -481,6 +458,10 @@
481 458
       if (this.wid) {
482 459
         this.OrderDetail()
483 460
       }
461
+      if(this.iswomanage){
462
+        this.ruleForm.F_ComplaintSource = ''
463
+      }
464
+      this.gettsSelect()
484 465
     },
485 466
     mounted() {
486 467
       if (this.wid) {
@@ -498,6 +479,7 @@
498 479
             const data = {
499 480
               F_CallID: this.ruleForm.F_CallID,
500 481
               F_ID: this.ruleForm.F_ID,
482
+              F_ComplaintSource:this.ruleForm.F_ComplaintSource,
501 483
               F_Source: this.ruleForm.F_Source, // 业务类别
502 484
               F_Type1: this.ruleForm.F_Type1, // 工单类别
503 485
               F_Type2: this.ruleForm.F_Type2, // 工单子类
@@ -869,6 +851,16 @@
869 851
         this.ruleForm.F_Relationship = ''
870 852
         this.ruleForm.F_FullName = ''
871 853
         this.ruleForm.F_IDNumber = ''
854
+      },
855
+      //投诉来源下拉框数据
856
+      gettsSelect(){
857
+        const params = {
858
+          Flag: 'tsly',
859
+          Name: ''
860
+        }
861
+        getTouSuSelect(params).then(res=>{
862
+          this.tousuArr = res.rows
863
+        })
872 864
       }
873 865
     }
874 866
   }

+ 3 - 17
CallCenterWeb.UI/RMYY/src/views/orderManage/components/askdetail.vue

@@ -7,7 +7,7 @@
7 7
             <el-col :md="18">
8 8
               <h1 class="title" style="display: inline-block;">
9 9
                 <svg-icon class="title_icon" icon-class="hongqi" />工单编号:{{ orderDetailData.F_WorkOrderCode }}
10
-                <span class="wostate">{{orderDetailData.StateName}}</span>
10
+                <span v-if="orderDetailData.StateName" class="wostate">{{orderDetailData.StateName}}</span>
11 11
               </h1>
12 12
             </el-col>
13 13
           </el-col>
@@ -27,7 +27,7 @@
27 27
                 <th>性别:</th>
28 28
                 <td>{{orderDetailData.F_Sex}}</td>
29 29
                 <th>来源:</th>
30
-                <td>{{orderDetailData.F_Source}}</td>
30
+                <td>{{orderDetailData.F_ComplaintSource}}</td>
31 31
               </tr>
32 32
               <tr>
33 33
                 <th>联系电话:</th>
@@ -59,20 +59,6 @@
59 59
                 <th>地区:</th>
60 60
                 <td colspan="3">{{orderDetailData.F_Address}}</td>
61 61
               </tr>
62
-              <!-- <tr v-show="isConduit">
63
-                <th>置管类型:</th>
64
-                <td>{{orderDetailData.F_Cathetertype}}</td>
65
-                <th>置管科室:</th>
66
-                <td>{{orderDetailData.F_Catheterdept}}</td>
67
-                <th>置管时间:</th>
68
-                <td>{{orderDetailData.F_Cathetertime}}</td>
69
-              </tr>
70
-              <tr v-show="isConduit">
71
-                <th>床号:</th>
72
-                <td>{{orderDetailData.F_BedNum}}</td>
73
-                <th>住院号:</th>
74
-                <td colspan="3">{{orderDetailData.F_InpatientNum}}</td>
75
-              </tr> -->
76 62
               <tr>
77 63
                 <th>工单内容:</th>
78 64
                 <td colspan="5">{{orderDetailData.F_WorkOrderContents}}</td>
@@ -286,7 +272,7 @@
286 272
     }
287 273
 
288 274
     .el-col {
289
-      margin-bottom: 20px;
275
+      // margin-bottom: 20px;
290 276
     }
291 277
 
292 278
     .el-icon-time {

+ 1 - 1
CallCenterWeb.UI/RMYY/src/views/orderManage/mySubmit/index.vue

@@ -162,7 +162,7 @@
162 162
       },
163 163
       btnClickEvents(button, wocode, row) {
164 164
         this.buttonName = button.key
165
-        this.$refs.butOption.butOptionMethod(this.buttonName, wocode)
165
+        this.$refs.butOption.butOptionMethod(this.buttonName, wocode,row)
166 166
         if (this.buttonName === 'chehuibianji') {
167 167
           this.btn_edit(wocode)
168 168
         }

+ 1 - 1
CallCenterWeb.UI/RMYY/src/views/orderManage/orderList/index.vue

@@ -237,7 +237,7 @@ export default {
237 237
     },
238 238
     btnClickEvents(button, wocode, row) {
239 239
       this.buttonName = button.key
240
-      this.$refs.butOption.butOptionMethod(this.buttonName, wocode)
240
+      this.$refs.butOption.butOptionMethod(this.buttonName, wocode ,row)
241 241
       if (this.buttonName === 'bianji') {
242 242
         // this.btn_edit(wocode)
243 243
         this.btn_edit(wocode,row.F_Type)

+ 323 - 0
CallCenterWeb.UI/RMYY/src/views/orderManage/patientVisit/index.vue

@@ -0,0 +1,323 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-row :gutter="20" />
4
+    <el-form :inline="true" :model="ruleForm" class="demo-form-inline">
5
+      <el-form-item label="关键字:">
6
+        <el-input v-model="ruleForm.keywords" placeholder="患者名称,手机号,工单编号" size="medium" />
7
+      </el-form-item>
8
+      <el-form-item label="类型:">
9
+        <el-cascader size="medium" ref="cascader" v-model="ruleForm.type" :options="orderData" :props="TagProps"
10
+          clearable @change="handleChange" />
11
+      </el-form-item>
12
+      <el-form-item label="回访状态:">
13
+        <el-select v-model="ruleForm.state" size="medium" clearable>
14
+          <el-option value="7" label="待回访"></el-option>
15
+          <el-option value="10" label="已回访"></el-option>
16
+        </el-select>
17
+      </el-form-item>
18
+      <el-form-item label="满意度:">
19
+        <el-select v-model="ruleForm.satisfaction" size="medium" clearable>
20
+          <el-option value="0" label="满意"></el-option>
21
+          <el-option value="1" label="基本满意"></el-option>
22
+          <el-option value="2" label="不满意"></el-option>
23
+        </el-select>
24
+      </el-form-item>
25
+      <el-form-item>
26
+        <el-button type="primary" size="medium" @click="btn_search_task">查询</el-button>
27
+      </el-form-item>
28
+    </el-form>
29
+    <el-table :data="dataLists" border highlight-current-row stripe>
30
+      <el-table-column prop="F_WorkOrderCode" label="工单编号" align="center" min-width />
31
+      <el-table-column prop="typename2" label="工单类别" align="center" min-width />
32
+      <!-- <el-table-column label="工单类别" align="center" min-width>
33
+        <template slot-scope="scope">
34
+          <span v-if="scope.row.F_State==1">有效</span>
35
+          <span v-if="scope.row.F_State==0">无效</span>
36
+        </template>
37
+      </el-table-column> -->
38
+      <el-table-column prop="F_WorkOrderContents" label="工单内容" align="center" min-width />
39
+      <el-table-column prop="F_Customer" label="患者姓名" align="center" min-width />
40
+      <el-table-column label="患者手机号" align="center" min-width>
41
+        <template slot-scope="scope">
42
+          <a @click="btn_visit(scope.row)" style="color: #55aaff;">{{scope.row.F_Phon}}</a>
43
+        </template>
44
+      </el-table-column>
45
+      <el-table-column label="回访状态" align="center" min-width>
46
+        <template slot-scope="scope">
47
+          <span v-if="scope.row.F_State==7" style="color: #00aaff;">待回访</span>
48
+          <span v-if="scope.row.F_State==10">已回访</span>
49
+        </template>
50
+      </el-table-column>
51
+      <el-table-column label="满意度" align="center" min-width>
52
+        <template slot-scope="scope">
53
+          <span v-if="scope.row.F_Satisfaction==0" style="color: #00aaff;">满意</span>
54
+          <span v-if="scope.row.F_Satisfaction==1" style="color: #ffaa00;">基本满意</span>
55
+          <span v-if="scope.row.F_Satisfaction==2" style="color: #ff0000;">不满意</span>
56
+        </template>
57
+      </el-table-column>
58
+      <el-table-column prop="F_ReturnBakTime" label="回访时间" align="center" min-width />
59
+    </el-table>
60
+    <pagination v-show="pageParams.total > 0" :total="pageParams.total" :pageindex.sync="pageParams.pageindex"
61
+      :pagesize.sync="pageParams.pagesize" class="pagination" @pagination="getList" />
62
+  </div>
63
+</template>
64
+
65
+<script>
66
+  import Pagination from '@/components/context/Pagination' // 对el-pagination 二次封装
67
+  import Visit from './visit'
68
+  import {
69
+    getGongDanType,
70
+    getGetList
71
+  } from '@/api/orderManagement/patientvisit'
72
+  import {
73
+    exportExcel
74
+  } from '@/utils'
75
+  export default {
76
+    name: 'PatientVisit',
77
+    components: {
78
+      Pagination
79
+    },
80
+    data() {
81
+      return {
82
+        dataLists: [],
83
+        pageParams: {
84
+          pageindex: 1, // 当前第几页
85
+          pagesize: Number(this.$store.getters.serverConfig.PAGESIZE), // 每页几条数据
86
+          total: 0 // 总共多少数据
87
+        },
88
+        orderData: [],
89
+        TagProps: {
90
+          checkStrictly: true,
91
+          value: 'id',
92
+          label: 'text',
93
+          children: 'children',
94
+        },
95
+        ruleForm: {
96
+          keywords: '',
97
+          state: '',
98
+          satisfaction: '',
99
+          type: []
100
+        },
101
+      }
102
+    },
103
+    computed: {},
104
+    created() {
105
+      this.getNowTime()
106
+      this.getList()
107
+      this.getgdtype()
108
+    },
109
+    mounted() {},
110
+    methods: {
111
+      // 搜索
112
+      btn_search_task() {
113
+        this.getList()
114
+      },
115
+      getList() {
116
+        const params = {
117
+          isvisit: 1,
118
+          keywords: this.ruleForm.keywords,
119
+          state: this.ruleForm.state,
120
+          satisfaction: this.ruleForm.satisfaction,
121
+          type: this.ruleForm.type[this.ruleForm.type.length - 1]
122
+        }
123
+        return new Promise(resolve => {
124
+          getGetList(params).then(response => {
125
+            if (response.state.toLowerCase() === 'success') {
126
+              this.dataLists = response.rows
127
+              this.pageParams.total = response.total
128
+            }
129
+          })
130
+          resolve()
131
+        })
132
+      },
133
+      getgdtype() {
134
+        const params = {
135
+          pid: 1000,
136
+          flag: 1
137
+        }
138
+        return new Promise(resolve => {
139
+          getGongDanType(params).then(response => {
140
+            if (response.state.toLowerCase() === 'success') {
141
+              this.orderData = response.data
142
+            }
143
+          })
144
+          resolve()
145
+        })
146
+      },
147
+      handleChange() {},
148
+      btn_visit(row) {
149
+        this.$layer.iframe({
150
+          content: {
151
+            content: Visit, // 传递的组件对象
152
+            parent: this, // 当前的vue对象
153
+            data: {
154
+              rowid:row.F_WorkOrderCode
155
+            } // props
156
+          },
157
+          area: ['70%', '80%'],
158
+          title: '回访'
159
+        })
160
+      },
161
+      btn_add() {
162
+        this.$layer.iframe({
163
+          content: {
164
+            content: AddOrEdit, // 传递的组件对象
165
+            parent: this, // 当前的vue对象
166
+            data: {
167
+
168
+            } // props
169
+          },
170
+          area: ['40%', '50%'],
171
+          title: '添加设备'
172
+        })
173
+      },
174
+      handleEdit(row) {
175
+        this.$layer.iframe({
176
+          content: {
177
+            content: AddOrEdit, // 传递的组件对象
178
+            parent: this, // 当前的vue对象
179
+            data: {
180
+              rowdata: row
181
+            } // props
182
+          },
183
+          area: ['40%', '50%'],
184
+          title: '编辑设备'
185
+        })
186
+      },
187
+      handleDelete(row) {
188
+        this.$confirm('确定要删除此设备吗?', '提示', {
189
+            confirmButtonText: '确定',
190
+            cancelButtonText: '取消',
191
+            type: 'warning'
192
+          })
193
+          .then(() => {
194
+            const params = {
195
+              ids: row.F_EquipID
196
+            }
197
+            GetDelEquips(params).then((response) => {
198
+              if (response.state.toLowerCase() === 'success') {
199
+                this.$message.success('删除成功!')
200
+                this.getList()
201
+              }
202
+            })
203
+          })
204
+          .catch(() => {
205
+            this.$message('已取消删除')
206
+          })
207
+      },
208
+      btn_export() {
209
+        const exporParams = {
210
+          stime: this.ruleForm.startTime && this.ruleForm.startTime[0],
211
+          endtime: this.ruleForm.startTime && this.ruleForm.startTime[1],
212
+          groupby: this.ruleForm.way,
213
+          isdc: 1
214
+        }
215
+        exportExcel(exporParams, getListExpt)
216
+      },
217
+      formtTime(val) {
218
+        if (!val) {
219
+          return '0秒'
220
+        }
221
+        var secondTime = parseInt(val);
222
+        var minuteTime = 0;
223
+        var hourTime = 0;
224
+        if (secondTime > 60) {
225
+          minuteTime = parseInt(secondTime / 60);
226
+          secondTime = parseInt(secondTime % 60);
227
+          if (minuteTime > 60) {
228
+            hourTime = parseInt(minuteTime / 60);
229
+            minuteTime = parseInt(minuteTime % 60);
230
+          }
231
+        }
232
+        var result = "" + parseInt(secondTime) + "秒";
233
+        if (minuteTime > 0) {
234
+          result = "" + parseInt(minuteTime) + "分" + result;
235
+        }
236
+        if (hourTime > 0) {
237
+          result = "" + parseInt(hourTime) + "小时" + result;
238
+        }
239
+        return result;
240
+      },
241
+      getNowTime() {
242
+        var now = new Date();
243
+        var year = now.getFullYear(); //得到年份
244
+        var month = now.getMonth(); //得到月份
245
+        var date = now.getDate(); //得到日期
246
+        month = month + 1;
247
+        month = month.toString().padStart(2, "0");
248
+        date = date.toString().padStart(2, "0");
249
+        var defaultDate = `${year}-${month}-${date}`;
250
+        // this.ruleForm.startTime=[defaultDate,defaultDate]
251
+        this.$set(this.ruleForm, "startTime", [defaultDate, defaultDate]);
252
+      },
253
+      btn_way() {
254
+        this.getList()
255
+      }
256
+    }
257
+  }
258
+</script>
259
+
260
+<style scoped>
261
+  /deep/.el-tabs__item {
262
+    width: 185px !important;
263
+    text-align: center;
264
+    font-size: 16px !important;
265
+    font-weight: 600;
266
+  }
267
+
268
+  .el-popper[x-placement^='bottom'] {
269
+    z-index: 10px !important;
270
+  }
271
+
272
+  .operation div {
273
+    font-size: 14px;
274
+    color: #222;
275
+    padding: 5px 0;
276
+    cursor: pointer;
277
+  }
278
+
279
+  .el-icon-s-tools {
280
+    font-size: 18px !important;
281
+    vertical-align: middle;
282
+  }
283
+
284
+  .el-popover {
285
+    min-width: 75px;
286
+    text-align: center;
287
+  }
288
+
289
+  .el-table .cell {
290
+    position: relative;
291
+  }
292
+
293
+  .el {
294
+    cursor: pointer;
295
+  }
296
+
297
+  .filter-container {
298
+    padding-top: 15px;
299
+  }
300
+
301
+  .el-table--mini,
302
+  .el-table--small,
303
+  .el-table__expand-icon {
304
+    font-size: 14px;
305
+  }
306
+
307
+  .el-table--small td,
308
+  .el-table--small th {
309
+    padding: 2px 0 !important;
310
+  }
311
+
312
+  .filter-date {
313
+    width: 388px !important;
314
+  }
315
+
316
+  .el-table {
317
+    color: #000;
318
+  }
319
+
320
+  .app-container {
321
+    padding: 10px;
322
+  }
323
+</style>

+ 462 - 0
CallCenterWeb.UI/RMYY/src/views/orderManage/patientVisit/visit.vue

@@ -0,0 +1,462 @@
1
+<template>
2
+  <div class="order_detail">
3
+    <el-row :gutter="20">
4
+      <el-col :md="24" class="order_detail_content">
5
+        <el-alert title="工单信息" type="success" class="ordertit" style="" :closable="false">
6
+        </el-alert>
7
+        <table class="tabdept" cellspacing="0" cellpadding="0">
8
+          <tr>
9
+            <th>业务类别:</th>
10
+            <td>{{orderDetailData.TypeName}}</td>
11
+            <th>工单类别:</th>
12
+            <td>{{orderDetailData.F_TypeName2}}</td>
13
+            <th>创建时间:</th>
14
+            <td>{{orderDetailData.F_CreateTime}}</td>
15
+          </tr>
16
+          <tr>
17
+            <th>姓名:</th>
18
+            <td>{{ orderDetailData.F_Customer }}</td>
19
+            <th>性别:</th>
20
+            <td>{{orderDetailData.F_Sex}}</td>
21
+            <th>联系电话:</th>
22
+            <td>{{orderDetailData.F_Phon}} <i class="el-icon-mobile" style="
23
+              color: #24c6c8;
24
+              font-size: 20px;
25
+              vertical-align: middle;
26
+              margin-left: 5px;
27
+              cursor: pointer;
28
+            " @click="oncall" /></td>
29
+          </tr>
30
+          <tr>
31
+            <th>工单内容:</th>
32
+            <td colspan="5">{{orderDetailData.F_WorkOrderContents}}</td>
33
+          </tr>
34
+          <tr>
35
+            <th>处理部门:</th>
36
+            <td>{{orderDetailData.DealDeptName}}</td>
37
+            <th>处理人:</th>
38
+            <td>{{orderDetailData.DealUserName}}</td>
39
+            <th>处理时间:</th>
40
+            <td>{{orderDetailData.F_HandleTime}}</td>
41
+          </tr>
42
+          <tr>
43
+            <th>处理结果:</th>
44
+            <td colspan="5">{{orderDetailData.F_DealResult}}</td>
45
+          </tr>
46
+        </table>
47
+      </el-col>
48
+      <el-col :md="24" class="order_detail_body">
49
+        <el-alert title="回访记录" type="success" class="ordertit" :closable="false">
50
+        </el-alert>
51
+        <el-table :data="visitarr" border highlight-current-row stripe>
52
+          <el-table-column type="index" width="100" label="序号" align="center">
53
+          </el-table-column>
54
+          <el-table-column prop="F_CreateTime" label="回访时间" align="center" min-width />
55
+          <el-table-column prop="F_CreateUser" label="回访人" align="center" min-width />
56
+          <el-table-column prop="F_CallResult" label="呼叫结果" align="center" min-width />
57
+          <el-table-column prop="F_Result" label="回访结果" align="center" min-width />
58
+          <el-table-column label="满意度" align="center" min-width>
59
+            <template slot-scope="scope">
60
+              <span v-if="scope.row.F_Satisfaction==0" style="color: #00aaff;">满意</span>
61
+              <span v-if="scope.row.F_Satisfaction==1" style="color: #ffaa00;">基本满意</span>
62
+              <span v-if="scope.row.F_Satisfaction==2" style="color: #ff0000;">不满意</span>
63
+              <span v-if="scope.row.F_Satisfaction==-1">-</span>
64
+            </template>
65
+          </el-table-column>
66
+          <el-table-column label="录音" align="center" min-width>
67
+            <template slot-scope="scope">
68
+              <svg-icon v-if="scope.row.FilePath" class="rec_file" icon-class="bofangluyin"
69
+                @click.native="playSound(scope.row.FilePath, scope.row.F_CreateUser)" />
70
+              <span v-else>-</span>
71
+            </template>
72
+          </el-table-column>
73
+        </el-table>
74
+      </el-col>
75
+      <el-col :md="24" class="order_detail_body" v-if="orderDetailData.F_State==7">
76
+        <el-alert title="呼叫结果" type="success" class="ordertit" style="margin-bottom: 30px;" :closable="false">
77
+        </el-alert>
78
+        <el-radio-group v-model="ruleForm.callResult" style="margin-left: 20px;">
79
+          <el-radio label="正常接通">正常接通</el-radio>
80
+          <el-radio label="拒接">拒接</el-radio>
81
+          <el-radio label="不是本人">不是本人</el-radio>
82
+          <el-radio label="关机">关机</el-radio>
83
+          <el-radio label="停机">停机</el-radio>
84
+          <el-radio label="无人接听">无人接听</el-radio>
85
+          <el-radio label="空号">空号</el-radio>
86
+          <el-radio label="免回访">免回访</el-radio>
87
+        </el-radio-group>
88
+      </el-col>
89
+      <el-col :md="24" class="order_detail_body" v-if="orderDetailData.F_State==7">
90
+        <el-alert title="回访结果" type="success" class="ordertit" style="margin-bottom: 20px;" :closable="false">
91
+        </el-alert>
92
+        <el-form ref="ruleForm" :model="ruleForm" label-width="80px" style="font-size: 14px" class="order_form">
93
+          <el-form-item v-if="ruleForm.callResult=='正常接通'||ruleForm.callResult=='免回访'" label="满意度:">
94
+            <el-radio-group v-model="ruleForm.satisfaction">
95
+              <el-radio :label="0">满意</el-radio>
96
+              <el-radio :label="1">基本满意</el-radio>
97
+              <el-radio :label="2">不满意</el-radio>
98
+            </el-radio-group>
99
+          </el-form-item>
100
+          <el-form-item label="回访结果:">
101
+            <el-input v-model="ruleForm.result" type="textarea" placeholder="请输入回访结果" />
102
+          </el-form-item>
103
+          <el-form-item v-if="ruleForm.callResult=='正常接通'||ruleForm.callResult=='免回访'" label="是否完结:">
104
+            <el-radio-group v-model="ruleForm.isover">
105
+              <el-radio :label="0">否</el-radio>
106
+              <el-radio :label="1">是</el-radio>
107
+            </el-radio-group>
108
+          </el-form-item>
109
+          <el-form-item>
110
+            <el-button type="primary" @click='btnVisit'>确定</el-button>
111
+          </el-form-item>
112
+        </el-form>
113
+      </el-col>
114
+    </el-row>
115
+  </div>
116
+</template>
117
+
118
+<script>
119
+  import {
120
+    mapGetters
121
+  } from 'vuex'
122
+  import {
123
+    GetOrderDetail,
124
+    GetVisitWorkOrder
125
+  } from '@/api/orderManagement/patientvisit'
126
+  import {
127
+    getCallOutprefix
128
+  } from '@/api/trafficData/trafficData'
129
+  import {
130
+    Send
131
+  } from '@/utils/telWebsocket'
132
+  import audioPlayer from '@/components/context/audioPlayer'
133
+  import Pagination from '@/components/context/Pagination' // 对el-pagination 二次封装
134
+
135
+  export default {
136
+    name: 'Visit',
137
+    components: {
138
+      Pagination
139
+    },
140
+    props: {
141
+      rowid: {
142
+        type: String,
143
+        default: ''
144
+      },
145
+      layerid: {
146
+        type: String,
147
+        default: ''
148
+      }
149
+    },
150
+    data() {
151
+      return {
152
+        visitarr: [],
153
+        orderDetailData: {},
154
+        pageParams: {
155
+          pageindex: 1, // 当前第几页
156
+          pagesize: 5, // 每页几条数据
157
+          total: 0 // 总共多少数据
158
+        },
159
+        ruleForm: {
160
+          callResult: '',
161
+          satisfaction: '',
162
+          result: '',
163
+          isover: 0
164
+        },
165
+        workOrderCirculationList: [] // 工单流转
166
+      }
167
+    },
168
+    computed: {
169
+      ...mapGetters(['rolecode'])
170
+    },
171
+    created() {
172
+      this.getDetail('0')
173
+      this.getDetail('2')
174
+    },
175
+    methods: {
176
+      // 详情
177
+      getDetail(num) {
178
+        const params = {
179
+          WorkOrderCode: this.rowid,
180
+          type: num
181
+        }
182
+        GetOrderDetail(params).then((response) => {
183
+          if (num == 0) {
184
+            this.orderDetailData = response.data[0]
185
+            this.orderDetailData.F_TypeName2 = this.$store.getters.workTypeMap[parseInt(response.data[0].F_type2)]
186
+              .text // 工单子类
187
+          }
188
+          if (num == 2) {
189
+            this.visitarr = response.data
190
+          }
191
+        })
192
+      },
193
+      btnVisit() {
194
+        if (this.ruleForm.satisfaction == 2 && this.ruleForm.result == '') {
195
+          this.$message.error('请输入回访结果');
196
+          return;
197
+        }
198
+        const params = {
199
+          WorkOrderCode: this.orderDetailData.F_WorkOrderCode,
200
+          callid: this.orderDetailData.F_CallID,
201
+          callResult: this.ruleForm.callResult,
202
+          satisfaction: this.ruleForm.satisfaction,
203
+          result: this.ruleForm.result,
204
+          isover: this.ruleForm.isover,
205
+          phone: this.orderDetailData.F_Phon
206
+        }
207
+        GetVisitWorkOrder(params).then(res => {
208
+          if (res.state == 'success') {
209
+            this.$message.success('回访成功')
210
+            this.$parent.getList()
211
+            this.$parent.$layer.close(this.layerid)
212
+          }
213
+        })
214
+      },
215
+      oncall() {
216
+        const params = {
217
+          phone: this.orderDetailData.F_Phon
218
+        }
219
+        getCallOutprefix(params).then((response) => {
220
+          if (response.state.toLowerCase() === 'success') {
221
+            const scoketDatas = {
222
+              Type: 'MakeCall',
223
+              AgentID: localStorage.getItem('storageUsercode'),
224
+              AgentExten: localStorage.getItem('ext'),
225
+              Header: response.data.fix,
226
+              DestinationNumber: response.data.phone
227
+            }
228
+            Send(scoketDatas)
229
+          }
230
+        })
231
+      },
232
+      playSound(rec_file, artist) {
233
+        console.log('artist', artist)
234
+        this.$layer.iframe({
235
+          content: {
236
+            content: audioPlayer, // 传递的组件对象
237
+            parent: this, // 当前的vue对象
238
+            data: {
239
+              recFiles: rec_file,
240
+              artists: artist.toString()
241
+            } // props//该方法会自动添加一个key为layerid的值, 该值为创建层的id, 可以直接使用
242
+          },
243
+          area: ['600px', '230px'],
244
+          shadeClose: true,
245
+          title: '录音详情'
246
+        })
247
+      },
248
+    }
249
+  }
250
+</script>
251
+
252
+<style rel="stylesheet/scss" lang="scss">
253
+  .order_detail {
254
+    .ordertit {
255
+      color: #000000;
256
+      font-size: 20px !important;
257
+      font-weight: bold;
258
+      background-color: #f5f5f5;
259
+      border-bottom: 1px dashed #00ff7f;
260
+      padding-left: 0;
261
+    }
262
+
263
+    .tabdept {
264
+      width: 100%;
265
+      margin: 10px 0;
266
+      border: 1px solid #ccc;
267
+    }
268
+
269
+    .tabdept th {
270
+      width: 150px;
271
+      padding: 10px 0;
272
+      font-size: 14px;
273
+      text-align: center;
274
+      background-color: #ececec;
275
+      border: 1px solid #ccc;
276
+    }
277
+
278
+    .tabdept td {
279
+      font-size: 14px;
280
+      text-align: center;
281
+      background-color: #fafafa;
282
+      border: 1px solid #ccc;
283
+    }
284
+
285
+    .wostate {
286
+      color: #67aa60;
287
+      display: inline-block;
288
+      border: 1px solid #c1c1c1;
289
+      border-radius: 5px;
290
+      padding: 5px 10px 3px 10px;
291
+      font-size: 17px !important;
292
+    }
293
+
294
+    .el-col {
295
+      // margin-bottom: 20px;
296
+    }
297
+
298
+    .el-icon-time {
299
+      color: #d81e06;
300
+    }
301
+
302
+    .el-card__header {
303
+      padding-top: 14px;
304
+      padding-bottom: 14px;
305
+      background-color: #f5f5f6;
306
+    }
307
+
308
+    .order_file {
309
+      .el-card__body {
310
+        padding: 22px 0 0 0;
311
+        text-align: center;
312
+      }
313
+    }
314
+
315
+    .order_steps {
316
+      .el-step__icon-inner {
317
+        display: none;
318
+      }
319
+    }
320
+
321
+    .order_record {
322
+      .el-card__body {
323
+        padding: 0;
324
+      }
325
+
326
+      .el-tabs__header {
327
+        padding: 0px 20px;
328
+        background-color: #f5f5f6;
329
+
330
+        .el-tabs__item {
331
+          font-size: 16px;
332
+          height: 47px;
333
+          line-height: 47px;
334
+        }
335
+      }
336
+    }
337
+  }
338
+</style>
339
+
340
+<style rel="stylesheet/scss" lang="scss" scoped>
341
+  .order_detail {
342
+    .order_detail_body {
343
+      margin-bottom: 20px;
344
+
345
+      .round_img {
346
+        width: 90px;
347
+        height: 90px;
348
+        border-radius: 50%;
349
+        overflow: hidden;
350
+        margin: 14px;
351
+
352
+        img {
353
+          width: 100%;
354
+          height: 100%;
355
+        }
356
+      }
357
+
358
+      .title {
359
+        font-size: 20px;
360
+
361
+        .title_icon {
362
+          color: #d81e06;
363
+          font-size: 16px;
364
+          margin-right: 20px;
365
+        }
366
+      }
367
+
368
+      .title_sub {
369
+        font-size: 14px;
370
+        color: #666666;
371
+      }
372
+
373
+      .order_detail_content {
374
+        background-color: #f5f5f6;
375
+        padding-top: 20px;
376
+        color: #4c4c4c;
377
+        font-size: 14px;
378
+
379
+        .order_detail_item {
380
+          margin-bottom: 10px;
381
+
382
+          .order_content {
383
+            margin-top: 10px;
384
+          }
385
+
386
+          .order_file {
387
+            position: relative;
388
+            cursor: pointer;
389
+
390
+            .img_mask {
391
+              display: none;
392
+              position: absolute;
393
+              left: 0px;
394
+              top: 0px;
395
+              background-color: rgba(0, 0, 0, 0.3);
396
+              width: 100%;
397
+              height: 22px;
398
+              text-align: right;
399
+              z-index: 1;
400
+
401
+              i {
402
+                font-size: 20px;
403
+                line-height: 22px;
404
+                display: inline-block;
405
+                margin-right: 15px;
406
+                color: #fff;
407
+              }
408
+            }
409
+
410
+            p {
411
+              margin-top: 5px;
412
+              padding-left: 14px;
413
+              padding-right: 14px;
414
+              white-space: nowrap;
415
+              overflow: hidden;
416
+              text-overflow: ellipsis;
417
+            }
418
+
419
+            .file_icon {
420
+              height: 68px;
421
+              line-height: 68px;
422
+              font-size: 68px;
423
+              color: #409eff;
424
+            }
425
+          }
426
+
427
+          .order_file:hover .img_mask {
428
+            display: block;
429
+          }
430
+        }
431
+      }
432
+    }
433
+
434
+    .green {
435
+      color: #00c1de;
436
+    }
437
+
438
+    .done {
439
+      color: #198120;
440
+    }
441
+
442
+    .red {
443
+      color: #d81e06;
444
+    }
445
+
446
+    .yellow {
447
+      color: #e6a23c;
448
+    }
449
+
450
+    .order_steps {
451
+
452
+      // height: 240px;
453
+      .el-step__icon-inner {
454
+        display: none;
455
+      }
456
+    }
457
+
458
+    .tab_body {
459
+      padding: 0 20px 20px 20px;
460
+    }
461
+  }
462
+</style>

+ 36 - 15
CallCenterWeb.UI/RMYY/src/views/systemSetup/LogManage/Loginlog/index.vue

@@ -3,10 +3,23 @@
3 3
     <el-row :gutter="20">
4 4
       <el-col :md="24">
5 5
         <el-form :inline="true" :model="ruleForm" class="demo-form-inline">
6
-          <el-form-item>
7
-            <el-input v-model="ruleForm.username" placeholder="请输入操作人姓名" size="medium" />
6
+          <el-form-item label="操作人:">
7
+            <el-input v-model="ruleForm.username" placeholder="请输入姓名" size="medium" />
8 8
           </el-form-item>
9
-          <el-form-item>
9
+          <el-form-item label="操作:">
10
+            <el-select v-model="ruleForm.msg" placeholder="请选择操作">
11
+              <el-option value="登录" label="登录"></el-option>
12
+              <el-option value="登出" label="登出"></el-option>
13
+              <el-option value="签入" label="签入"></el-option>
14
+              <el-option value="签出" label="签出"></el-option>
15
+              <el-option value="置闲" label="置闲"></el-option>
16
+              <el-option value="置忙" label="置忙"></el-option>
17
+            </el-select>
18
+          </el-form-item>
19
+          <el-form-item label="IP地址:">
20
+            <el-input v-model="ruleForm.ip" placeholder="请输入ip地址" size="medium" />
21
+          </el-form-item>
22
+          <el-form-item label="时间范围:">
10 23
             <el-col :span="16">
11 24
               <el-date-picker v-model="ruleForm.searchTime" type="daterange" format="yyyy年MM月dd日"
12 25
                 value-format="yyyy-MM-dd" align="left" unlink-panels range-separator="至" start-placeholder="开始日期"
@@ -18,17 +31,21 @@
18 31
           </el-form-item>
19 32
         </el-form>
20 33
         <el-table :data="taskDataLists" border stripe @selection-change="handleSelectionChange">
21
-          <el-table-column type="index" label="编号" align="center" width="120">
34
+          <el-table-column type="index" label="序号" align="center" width="120">
35
+          </el-table-column>
36
+          <el-table-column label="操作人" align="center" min-width>
37
+            <template slot-scope="scope">
38
+              <span>{{scope.row.T_username}} ({{scope.row.T_usercode}})</span>
39
+            </template>
40
+          </el-table-column>
41
+          <el-table-column label="操作类型" align="center" min-width>
42
+            <template slot-scope="scope">
43
+              <span>{{scope.row.T_result.substring(0,2)}}</span>
44
+            </template>
22 45
           </el-table-column>
23
-          <el-table-column prop="T_usercode" label="操作人编号" align="center" min-width />
24
-          <el-table-column prop="T_username" label="操作人名称" align="center" min-width />
25
-          <el-table-column prop="T_time" label="登录时间" align="center" min-width />
26
-          <el-table-column prop="T_LoginOutDate" label="登出时间" align="center" min-width />
27
-          <el-table-column prop="LoginTime" label="签入时间" align="center" min-width />
28
-          <el-table-column prop="LogoutTime" label="签出时间" align="center" min-width />
29
-          <el-table-column prop="IdleTime" label="置闲时间" align="center" min-width />
30
-          <el-table-column prop="BusyTime" label="置忙时间" align="center" min-width />
31
-          <el-table-column prop="T_result" label="操作内容" align="center" min-width />
46
+          <el-table-column prop="T_login_ip" label="操作IP" align="center" min-width />
47
+          <el-table-column prop="T_time" label="操作时间" align="center" min-width />
48
+          <el-table-column prop="T_result" label="备注" align="center" min-width />
32 49
         </el-table>
33 50
         <pagination v-show="pageParams.total > 0" :total="pageParams.total" :pageindex.sync="pageParams.pageindex"
34 51
           :pagesize.sync="pageParams.pagesize" class="pagination" @pagination="getListTask" />
@@ -52,7 +69,9 @@
52 69
       return {
53 70
         ruleForm: {
54 71
           username:'',
55
-          searchTime:''
72
+          searchTime:'',
73
+          msg:'',
74
+          ip:'',
56 75
         },
57 76
         taskDataLists: [],
58 77
         pageParams: {
@@ -87,7 +106,9 @@
87 106
             pagesize:this.pageParams.pagesize,
88 107
             username:this.ruleForm.username,
89 108
             starttime:this.ruleForm.searchTime&&this.ruleForm.searchTime[0],
90
-            endtime:this.ruleForm.searchTime&&this.ruleForm.searchTime[1]
109
+            endtime:this.ruleForm.searchTime&&this.ruleForm.searchTime[1],
110
+            msg:this.ruleForm.msg,
111
+            ip:this.ruleForm.ip
91 112
           }
92 113
           getLogList(params)
93 114
             .then((response) => {

+ 13 - 2
CallCenterWeb.UI/RMYY/src/views/systemSetup/sysSetting/orderTypeManage/addOrEditOrderType.vue

@@ -20,6 +20,9 @@
20 20
       <el-form-item label="返修时限">
21 21
         <el-input-number v-model="ruleForm.F_RepairTimeLimit" :min="0"></el-input-number>
22 22
       </el-form-item>
23
+      <el-form-item label="流转部门">
24
+        <select-dept-tree :deptparam="deptidArr" @post-deptid="getDeptid" />
25
+      </el-form-item>
23 26
       <el-form-item label="备注" prop="F_Remark">
24 27
         <el-input
25 28
           v-model="ruleForm.F_Remark"
@@ -43,7 +46,7 @@
43 46
 import { getOrderType, addOrderType, editOrderType } from '@/api/systemSetup/roleSetting/orderTypeManage'
44 47
 import { validateSort } from '@/utils/validate'
45 48
 import { filterContent } from '@/utils'
46
-
49
+import selectDeptTree from '@/components/context/commonSelect/selectDeptTree.vue'
47 50
 const validateSortRule = (rule, value, callback) => {
48 51
   if (!validateSort(value)) {
49 52
     callback(new Error('请输入有效的排序编号(正整数、负整数、0)'))
@@ -54,6 +57,9 @@ const validateSortRule = (rule, value, callback) => {
54 57
 
55 58
 export default {
56 59
   name: 'AddOrEditOrderType',
60
+  components: {
61
+    selectDeptTree
62
+  },
57 63
   props: {
58 64
     rowid: {
59 65
       type: String,
@@ -88,6 +94,7 @@ export default {
88 94
         F_Remark: '', // 工单类型备注
89 95
         F_Sort: '' ,// 排序
90 96
         F_Identification:'',
97
+        F_AutoDept:''//流转部门
91 98
       },
92 99
       rules: {
93 100
         F_Name: [{
@@ -96,6 +103,7 @@ export default {
96 103
           trigger: 'blur'
97 104
         }]
98 105
       },
106
+      deptidArr:[],
99 107
       loading: false
100 108
     }
101 109
   },
@@ -175,7 +183,10 @@ export default {
175 183
           this.ruleForm.F_Identification = res.identification
176 184
         }
177 185
       })
178
-    }
186
+    },
187
+    getDeptid(data) {
188
+      this.ruleForm.F_AutoDept = data[data.length - 1]
189
+    },
179 190
   }
180 191
 }
181 192
 </script>