vue2-client 1.2.0 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/README.md +65 -65
  2. package/babel.config.js +1 -0
  3. package/docs/notice.md +22 -0
  4. package/index.js +28 -28
  5. package/package.json +1 -1
  6. package/src/App.vue +93 -93
  7. package/src/assets/img/SunClientDownload.png +0 -0
  8. package/src/assets/img/SunClientManual/1.png +0 -0
  9. package/src/assets/img/SunClientManual/2.png +0 -0
  10. package/src/assets/img/SunClientManual/3.png +0 -0
  11. package/src/assets/img/SunClientManual/4.png +0 -0
  12. package/src/assets/img/ToDeskDownload.png +0 -0
  13. package/src/assets/img/ToDeskManual/1.png +0 -0
  14. package/src/assets/img/ToDeskManual/2.png +0 -0
  15. package/src/assets/img/ToDeskManual/3.png +0 -0
  16. package/src/assets/img/ToDeskManual/4.png +0 -0
  17. package/src/assets/sound/newNote.mp3 +0 -0
  18. package/src/base-client/all.js +57 -57
  19. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +1157 -1159
  20. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  21. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +540 -540
  22. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  23. package/src/base-client/components/common/CustomColumnsDrawer/index.md +46 -46
  24. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +150 -150
  25. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  26. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  27. package/src/base-client/components/common/XAddForm/XAddForm.vue +323 -323
  28. package/src/base-client/components/common/XAddForm/index.md +60 -60
  29. package/src/base-client/components/common/XBadge/index.md +39 -39
  30. package/src/base-client/components/common/XCard/index.md +43 -43
  31. package/src/base-client/components/common/XForm/XForm.vue +275 -275
  32. package/src/base-client/components/common/XForm/XFormItem.vue +217 -217
  33. package/src/base-client/components/common/XForm/index.md +196 -196
  34. package/src/base-client/components/common/XFormCol/index.md +35 -35
  35. package/src/base-client/components/common/XFormTable/XFormTable.vue +407 -405
  36. package/src/base-client/components/common/XFormTable/index.md +89 -89
  37. package/src/base-client/components/common/XTable/XTable.vue +262 -262
  38. package/src/base-client/components/common/XTable/index.md +255 -255
  39. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +105 -105
  40. package/src/base-client/components/iot/CustomerDetailsView/CustomerDetailsView.vue +226 -226
  41. package/src/base-client/components/iot/CustomerDetailsView/index.md +41 -41
  42. package/src/base-client/components/iot/DataAnalysisUser/DataAnalysisUser.vue +127 -127
  43. package/src/base-client/components/iot/DataAnalysisView/DataAnalysisView.vue +244 -250
  44. package/src/base-client/components/iot/DataAnalysisViewGD/DataAnalysisViewGD.vue +548 -548
  45. package/src/base-client/components/iot/DeviceBrandDetailsView/DeviceBrandDetailsView.vue +453 -453
  46. package/src/base-client/components/iot/DeviceDetailsView/DeviceDetailsView.vue +231 -231
  47. package/src/base-client/components/iot/DeviceDetailsView/index.md +43 -43
  48. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsCount.vue +330 -330
  49. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsException.vue +57 -57
  50. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstruct.vue +122 -122
  51. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstructOperate.vue +122 -122
  52. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsMain.vue +225 -225
  53. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsRead.vue +135 -135
  54. package/src/base-client/components/iot/DeviceTypeDetailsView/DeviceTypeDetailsView.vue +277 -277
  55. package/src/base-client/components/iot/InstructDetailsView/InstructDetailsView.vue +472 -472
  56. package/src/base-client/components/iot/InstructDetailsView/index.md +45 -45
  57. package/src/base-client/components/iot/LogDetailsView/LogDetailsView.vue +380 -380
  58. package/src/base-client/components/iot/LogDetailsView/index.md +43 -43
  59. package/src/base-client/components/iot/MeterDetailsView/MeterDetailsView.vue +360 -360
  60. package/src/base-client/components/iot/MeterDetailsView/index.md +43 -43
  61. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsCount.vue +335 -335
  62. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsException.vue +185 -185
  63. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsHandPlan.vue +292 -292
  64. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsInstruct.vue +237 -237
  65. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsMain.vue +257 -257
  66. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsSellGas.vue +190 -190
  67. package/src/base-client/components/iot/WebmeterAnalysisView/WebmeterAnalysisView.vue +723 -723
  68. package/src/base-client/components/iot/WebmeterAnalysisView/index.md +48 -48
  69. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  70. package/src/base-client/components/system/DictionaryDetailsView/index.md +41 -41
  71. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +248 -248
  72. package/src/base-client/components/ticket/EmployeeDetailsView/EmployeeDetailsView.vue +371 -406
  73. package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +838 -486
  74. package/src/base-client/components/ticket/TicketDetailsView/part/TicketDetailsFlow.vue +261 -184
  75. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +528 -303
  76. package/src/base-client/plugins/AppData.js +69 -69
  77. package/src/base-client/plugins/GetLoginInfoService.js +221 -221
  78. package/src/base-client/plugins/index.js +21 -21
  79. package/src/bootstrap.js +27 -27
  80. package/src/components/Ellipsis/Ellipsis.vue +64 -64
  81. package/src/components/Ellipsis/index.md +38 -38
  82. package/src/components/NumberInfo/index.md +43 -43
  83. package/src/components/STable/README.md +341 -341
  84. package/src/components/Trend/index.md +45 -45
  85. package/src/components/cache/AKeepAlive.js +172 -172
  86. package/src/components/checkbox/index.js +7 -7
  87. package/src/components/index.js +36 -36
  88. package/src/components/menu/menu.js +273 -273
  89. package/src/components/setting/Setting.vue +237 -237
  90. package/src/components/table/advance/AdvanceTable.vue +275 -275
  91. package/src/components/transition/PageToggleTransition.vue +97 -97
  92. package/src/layouts/CommonLayout.vue +42 -42
  93. package/src/layouts/PageLayout.vue +151 -151
  94. package/src/layouts/SinglePageView.vue +74 -74
  95. package/src/layouts/header/AdminHeader.vue +109 -109
  96. package/src/layouts/header/HeaderAvatar.vue +60 -60
  97. package/src/layouts/header/HeaderNotice.vue +97 -97
  98. package/src/layouts/tabs/TabsHead.vue +190 -190
  99. package/src/layouts/tabs/TabsView.vue +355 -355
  100. package/src/main.js +20 -20
  101. package/src/mock/goods/index.js +108 -108
  102. package/src/mock/index.js +12 -12
  103. package/src/mock/project/index.js +17 -17
  104. package/src/mock/user/current.js +13 -13
  105. package/src/mock/user/login.js +39 -39
  106. package/src/mock/workplace/index.js +15 -15
  107. package/src/pages/exception/403.vue +25 -25
  108. package/src/pages/exception/404.vue +25 -25
  109. package/src/pages/exception/500.vue +25 -25
  110. package/src/pages/login/Login.vue +194 -194
  111. package/src/pages/report/ReportTableHome.vue +28 -28
  112. package/src/pages/resourceManage/resourceManageMain.vue +55 -55
  113. package/src/pages/system/applyInstallView/Core.vue +570 -570
  114. package/src/pages/system/applyInstallView/index.vue +34 -34
  115. package/src/pages/system/dictionary/index.vue +41 -41
  116. package/src/pages/system/queryParams/index.vue +41 -41
  117. package/src/router/async/config.async.js +25 -25
  118. package/src/router/async/router.map.js +59 -59
  119. package/src/router/guards.js +104 -104
  120. package/src/router/index.js +27 -27
  121. package/src/services/api/EmployeeDetailsViewApi.js +3 -1
  122. package/src/services/api/TicketDetailsViewApi.js +9 -1
  123. package/src/services/api/common.js +37 -39
  124. package/src/services/api/restTools.js +23 -23
  125. package/src/services/dataSource.js +12 -12
  126. package/src/services/user.js +34 -34
  127. package/src/store/modules/setting.js +114 -114
  128. package/src/utils/i18n.js +80 -80
  129. package/src/utils/indexedDB.js +146 -146
  130. package/src/utils/request.js +197 -197
  131. package/src/utils/routerUtil.js +15 -2
  132. package/tests/unit/ReportTable.spec.js +15 -15
  133. package/vue.config.js +153 -153
  134. package/webpack.config.js +12 -12
@@ -1,406 +1,371 @@
1
- <template>
2
- <a-drawer
3
- title="员工详情"
4
- placement="right"
5
- :width="isMobile ? screenWidth : screenWidth * 0.85"
6
- :visible="visible"
7
- @close="onClose"
8
- >
9
- <!-- 头部信息展示 -->
10
- <a-page-header :title="'员工编号:' + this.empId">
11
- <div class="row">
12
- <div class="content">
13
- <a-descriptions size="small" :column="isMobile ? 1 : 2">
14
- <a-descriptions-item label="姓名">{{ details.name }}</a-descriptions-item>
15
- <a-descriptions-item label="部门">{{ details.department }}</a-descriptions-item>
16
- <a-descriptions-item label="负责模块">{{ details.model_in_charge }}</a-descriptions-item>
17
- </a-descriptions>
18
- </div>
19
- </div>
20
- </a-page-header>
21
-
22
- <!-- 数据展示 -->
23
- <br/>
24
- <br/>
25
- <br/>
26
- <!-- 应答工单统计 -->
27
- <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
28
- <x-card :loadState="confirmLoadState" :retry="loadConfirmCount">
29
- <chart-card title="总应答数" :total="details.response_ticket_count | NumberFormat">
30
- <a-tooltip title="刷新" slot="action" :style="{ marginRight: '10px' }" @click="loadConfirmCount()">
31
- <a-icon type="redo" />
32
- </a-tooltip>
33
- <div>
34
- <mini-area :dataSource="confirmSumWeekly" :scale="confirmSumWeeklyScale" />
35
- </div>
36
- <template slot="footer">7日新增 <span> {{ confirmLastWeekCount | NumberFormat }}</span></template>
37
- </chart-card>
38
- </x-card>
39
- </a-col>
40
- <!-- 完成工单统计 -->
41
- <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
42
- <x-card :loadState="finishLoadState" :retry="loadFinishCount">
43
- <chart-card title="总完成数" :total="details.finished_ticket_count | NumberFormat">
44
- <a-tooltip title="刷新" slot="action" :style="{ marginRight: '10px' }" @click="loadFinishCount()">
45
- <a-icon type="redo" />
46
- </a-tooltip>
47
- <div>
48
- <mini-bar :dataSource="finishSumWeekly" :scale="finishSumWeeklyScale" />
49
- </div>
50
- <template slot="footer">7日新增 <span>{{ finishLastWeekCount | NumberFormat }}</span></template>
51
- </chart-card>
52
- </x-card>
53
- </a-col>
54
- <!-- 工单完成率 -->
55
- <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
56
- <x-card :loadState="finishedRatioLoadStatus">
57
- <chart-card title="工单完成占比" :total="details.finished_ticket_ratio + '%'">
58
- <a-tooltip title="刷新" slot="action" :style="{ marginRight: '10px' }" @click="loadFinishedRatio">
59
- <a-icon type="redo" />
60
- </a-tooltip>
61
- <div>
62
- <mini-progress :color="finishRatioColor" :target="20" :percentage="details.finished_ticket_ratio" height="8px" />
63
- </div>
64
- </chart-card>
65
- </x-card>
66
- </a-col>
67
- </a-drawer>
68
- </template>
69
-
70
- <script>
71
- import JsonViewer from 'vue-json-viewer'
72
- import { formatDate } from '@vue2-client/utils/util'
73
- import { EmployeeDetailsViewApi } from '@vue2-client/services/api/EmployeeDetailsViewApi'
74
- import { post } from '@vue2-client/services/api/restTools'
75
- import XTable from '@vue2-client/base-client/components/common/XTable/XTable'
76
- import { mapState } from 'vuex'
77
- import {
78
- ChartCard,
79
- MiniArea,
80
- MiniBar,
81
- MiniProgress,
82
- RankList,
83
- Bar,
84
- Trend,
85
- NumberInfo,
86
- MiniSmoothArea
87
- } from '@vue2-client/components'
88
-
89
- export default {
90
- name: 'EmployeeDetailsView',
91
- components: {
92
- JsonViewer,
93
- XTable,
94
- ChartCard,
95
- MiniArea,
96
- MiniBar,
97
- MiniProgress,
98
- RankList,
99
- Bar,
100
- Trend,
101
- NumberInfo,
102
- MiniSmoothArea
103
- },
104
- data () {
105
- return {
106
- // 页面宽度
107
- screenWidth: document.documentElement.clientWidth,
108
- // 员工详情
109
- details: {
110
- name: '',
111
- department: undefined,
112
- model_in_charge: undefined,
113
- response_ticket_count: undefined,
114
- finished_ticket_count: undefined,
115
- finished_ticket_ratio: undefined
116
- },
117
- // 控制加载过程
118
- loadTicketDetails: false,
119
- // 控制应答数加载
120
- confirmLoadState: 'Loading...',
121
- // 控制完成数加载
122
- finishLoadState: 'Loading...',
123
- // 控制完成比例加载
124
- finishedRatioLoadStatus: 'Loading...',
125
- // 一周应答明细
126
- confirmSumWeekly: [],
127
- // 一周完成明细
128
- finishSumWeekly: [],
129
- // 一周应答明细列
130
- confirmSumWeeklyScale: [
131
- {
132
- dataKey: 'x',
133
- alias: '时间'
134
- },
135
- {
136
- dataKey: 'y',
137
- alias: '应答数'
138
- }
139
- ],
140
- // 一周完成明细列
141
- finishSumWeeklyScale: [
142
- {
143
- dataKey: 'x',
144
- alias: '时间'
145
- },
146
- {
147
- dataKey: 'y',
148
- alias: '完成数'
149
- }
150
- ],
151
- // 7日新增应答数
152
- confirmLastWeekCount: 0,
153
- // 7日新增完成数
154
- finishLastWeekCount: 0,
155
- // 控制订单完成比例颜色
156
- finishRatioColor: '',
157
- // 部门名字典
158
- departmentDictionary: [],
159
- // 模块名字典
160
- modelDictionary: []
161
- }
162
- },
163
- mounted () {
164
- this.getDepartmentDictionary()
165
- this.getModelDictionary()
166
- this.loadConfirmCount()
167
- this.loadFinishCount()
168
- this.initView()
169
- },
170
- computed: {
171
- ...mapState('account', { currUser: 'user' }),
172
- ...mapState('setting', ['isMobile'])
173
- },
174
- props: {
175
- empId: {
176
- type: String,
177
- required: true
178
- },
179
- visible: {
180
- type: Boolean,
181
- default: false
182
- }
183
- },
184
- methods: {
185
- // 初始化组件
186
- initView () {
187
- this.loadTicketDetails = true
188
- this.finishedRatioLoadStatus = 'Loading...'
189
- this.details.finished_ticket_ratio = 0
190
- return post(EmployeeDetailsViewApi.getEmployeeDetails, {
191
- empId: this.empId
192
- })
193
- .then(res => {
194
- this.details = res
195
- if (this.details.finished_ticket_ratio === undefined) {
196
- this.details.finished_ticket_ratio = 0
197
- }
198
- this.details.finished_ticket_ratio = this.details.finished_ticket_ratio * 100
199
- this.finishRatioColor = this.getFinishedRatioColor(this.details.finished_ticket_ratio)
200
- // 字典值解析
201
- const departmentValue = this.details.department
202
- this.details.department = this.resolveDepartmentDictionary(departmentValue)
203
- const modelInChargeValue = this.details.model_in_charge
204
- this.details.model_in_charge = this.resolveDepartmentDictionary(modelInChargeValue)
205
- this.finishedRatioLoadStatus = 'success'
206
- this.loadTicketDetails = false
207
- }, err => {
208
- this.loadTicketDetails = false
209
- console.error(err)
210
- })
211
- },
212
- // 获取部门名字典
213
- getDepartmentDictionary () {
214
- return post(EmployeeDetailsViewApi.getDepartmentDictionary)
215
- .then(res => {
216
- this.departmentDictionary = res
217
- }, err => {
218
- console.log(err)
219
- })
220
- },
221
- // 解析部门名字典
222
- resolveDepartmentDictionary (key) {
223
- for (let i = 0; i < this.departmentDictionary.length; i++) {
224
- if (this.departmentDictionary[i].value == key) {
225
- return this.departmentDictionary[i].name
226
- }
227
- }
228
- },
229
- // 获取模块名字典
230
- getModelDictionary () {
231
- return post(EmployeeDetailsViewApi.getModelDictionary)
232
- .then(res => {
233
- this.modelDictionary = res
234
- }, err => {
235
- console.log(err)
236
- })
237
- },
238
- // 解析模块名字典
239
- resolveModelDictionary (key) {
240
- for (let i = 0; i < this.modelDictionary.length; i++) {
241
- if (this.modelDictionary[i].value == key) {
242
- return this.modelDictionary[i].name
243
- }
244
- }
245
- },
246
- // 获取应答订单数量
247
- loadConfirmCount () {
248
- this.confirmSumWeekly = []
249
- this.confirmLoadState = 'Loading...'
250
- return post(EmployeeDetailsViewApi.getConfirmTicketsCountWeekly, {
251
- empId: this.empId
252
- }).then(res => {
253
- this.confirmLastWeekCount = 0
254
- for (let i = 0, len = res.length; i < len; i++) {
255
- this.confirmLastWeekCount = this.confirmLastWeekCount + res[i].num
256
- this.confirmSumWeekly.push({
257
- x: res[i].date,
258
- y: res[i].num
259
- })
260
- }
261
- this.confirmLoadState = 'success'
262
- }, err => {
263
- console.warn(err)
264
- this.confirmLoadState = 'error'
265
- })
266
- },
267
- // 获取完成订单数据
268
- loadFinishCount () {
269
- this.finishSumWeekly = []
270
- this.finishLoadState = 'Loading...'
271
- return post(EmployeeDetailsViewApi.getFinishedTicketsCountWeekly, {
272
- empId: this.empId
273
- }).then(res => {
274
- this.finishLastWeekCount = 0
275
- for (let i = 0, len = res.length; i < len; i++) {
276
- this.finishLastWeekCount = this.finishLastWeekCount + res[i].num
277
- this.finishSumWeekly.push({
278
- x: res[i].date,
279
- y: res[i].num
280
- })
281
- }
282
- this.finishLoadState = 'success'
283
- }, err => {
284
- console.warn(err)
285
- this.finishLoadState = 'error'
286
- })
287
- },
288
- // 获取完成订单比例数据
289
- loadFinishedRatio () {
290
- this.initView()
291
- },
292
- // 根据占比返回完成度颜色
293
- getFinishedRatioColor (percent) {
294
- if (percent < 10) {
295
- return 'rgb(242, 99, 123)'
296
- } else if (percent >= 10 && percent <= 20) {
297
- return 'rgb(251, 212, 55)'
298
- } else {
299
- return 'rgb(19, 194, 194)'
300
- }
301
- },
302
- // 关闭抽屉时回调
303
- onClose () {
304
- this.$emit('update:visible', false)
305
- this.details.finished_ticket_ratio = undefined
306
- },
307
- // 日期格式化
308
- format (date, format) {
309
- return formatDate(date, format)
310
- },
311
- // 转换JSON
312
- toJSON (value) {
313
- try {
314
- return JSON.parse(value)
315
- } catch (e) {
316
- return value
317
- }
318
- },
319
- // 控制开始处理按钮可用状态
320
- handlerBtnDisable () {
321
- return this.step !== 0
322
- },
323
- // 控制移交他人按钮可用状态
324
- transferBtnDisable () {
325
- return this.step === 0
326
- }
327
- },
328
- watch: {
329
- 'visible' (val) {
330
- if (val) {
331
- this.initView()
332
- this.loadConfirmCount()
333
- this.loadFinishCount()
334
- }
335
- }
336
- }
337
- }
338
- </script>
339
-
340
- <style lang="less" scoped>
341
- .high-priority{
342
- background-color: rgba(163, 30, 30, 0.66);
343
- border: red solid 1px;
344
- font-size: large;
345
- padding: 5px;
346
- color: white;
347
- border-radius: 10px;
348
- }
349
-
350
- .detail-layout {
351
- margin-left: 44px;
352
- }
353
- .text {
354
- color: rgba(0, 0, 0, .45);
355
- }
356
-
357
- .heading {
358
- color: rgba(0, 0, 0, .85);
359
- font-size: 20px;
360
- }
361
-
362
- .no-data {
363
- color: rgba(0, 0, 0, .25);
364
- text-align: center;
365
- line-height: 64px;
366
- font-size: 16px;
367
-
368
- i {
369
- font-size: 24px;
370
- margin-right: 16px;
371
- position: relative;
372
- top: 3px;
373
- }
374
- }
375
-
376
- .mobile {
377
- .detail-layout {
378
- margin-left: unset;
379
- }
380
- .text {
381
-
382
- }
383
- .status-list {
384
- text-align: left;
385
- }
386
- }
387
-
388
- .row {
389
- display: flex;
390
-
391
- .content {
392
- -webkit-box-flex: 1;
393
- flex: auto;
394
- -ms-flex: auto;
395
- }
396
-
397
- .extra {
398
- flex: 0 1 auto;
399
- -webkit-box-flex: 0;
400
- -ms-flex: 0 1 auto;
401
- min-width: 242px;
402
- margin-left: 88px;
403
- text-align: right;
404
- }
405
- }
406
- </style>
1
+ <template>
2
+ <a-drawer
3
+ title="员工详情"
4
+ placement="right"
5
+ :width="isMobile ? screenWidth : screenWidth * 0.85"
6
+ :visible="visible"
7
+ @close="onClose"
8
+ >
9
+ <!-- 头部信息展示 -->
10
+ <a-page-header :title="'员工编号:' + this.empId">
11
+ <div class="row">
12
+ <div class="content">
13
+ <a-descriptions size="small" :column="isMobile ? 1 : 2">
14
+ <a-descriptions-item label="姓名">{{ details.name }}</a-descriptions-item>
15
+ <a-descriptions-item label="部门">{{ details.department }}</a-descriptions-item>
16
+ <a-descriptions-item label="负责模块">{{ details.model_in_charge }}</a-descriptions-item>
17
+ </a-descriptions>
18
+ </div>
19
+ </div>
20
+ </a-page-header>
21
+
22
+ <!-- 数据展示 -->
23
+ <br/>
24
+ <br/>
25
+ <br/>
26
+ <!-- 应答工单统计 -->
27
+ <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
28
+ <x-card :loadState="confirmLoadState" :retry="loadConfirmCount">
29
+ <chart-card title="总应答数" :total="details.response_ticket_count | NumberFormat">
30
+ <a-tooltip title="刷新" slot="action" :style="{ marginRight: '10px' }" @click="loadConfirmCount()">
31
+ <a-icon type="redo" />
32
+ </a-tooltip>
33
+ <div>
34
+ <mini-area :dataSource="confirmSumWeekly" :scale="confirmSumWeeklyScale" />
35
+ </div>
36
+ <template slot="footer">7日新增 <span> {{ confirmLastWeekCount | NumberFormat }}</span></template>
37
+ </chart-card>
38
+ </x-card>
39
+ </a-col>
40
+ <!-- 完成工单统计 -->
41
+ <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
42
+ <x-card :loadState="finishLoadState" :retry="loadFinishCount">
43
+ <chart-card title="总完成数" :total="details.finished_ticket_count | NumberFormat">
44
+ <a-tooltip title="刷新" slot="action" :style="{ marginRight: '10px' }" @click="loadFinishCount()">
45
+ <a-icon type="redo" />
46
+ </a-tooltip>
47
+ <div>
48
+ <mini-bar :dataSource="finishSumWeekly" :scale="finishSumWeeklyScale" />
49
+ </div>
50
+ <template slot="footer">7日新增 <span>{{ finishLastWeekCount | NumberFormat }}</span></template>
51
+ </chart-card>
52
+ </x-card>
53
+ </a-col>
54
+ <!-- 工单完成率 -->
55
+ <a-col :sm="24" :md="12" :xl="6" :style="{ marginBottom: '24px' }">
56
+ <x-card :loadState="finishedRatioLoadStatus">
57
+ <chart-card title="工单完成占比" :total="details.finished_ticket_ratio + '%'">
58
+ <a-tooltip title="刷新" slot="action" :style="{ marginRight: '10px' }" @click="loadFinishedRatio">
59
+ <a-icon type="redo" />
60
+ </a-tooltip>
61
+ <div>
62
+ <mini-progress :color="finishRatioColor" :target="20" :percentage="details.finished_ticket_ratio" height="8px" />
63
+ </div>
64
+ </chart-card>
65
+ </x-card>
66
+ </a-col>
67
+ </a-drawer>
68
+ </template>
69
+
70
+ <script>
71
+ import JsonViewer from 'vue-json-viewer'
72
+ import { formatDate } from '@vue2-client/utils/util'
73
+ import { EmployeeDetailsViewApi } from '@vue2-client/services/api/EmployeeDetailsViewApi'
74
+ import { post } from '@vue2-client/services/api/restTools'
75
+ import XTable from '@vue2-client/base-client/components/common/XTable/XTable'
76
+ import { mapState } from 'vuex'
77
+ import {
78
+ ChartCard,
79
+ MiniArea,
80
+ MiniBar,
81
+ MiniProgress,
82
+ RankList,
83
+ Bar,
84
+ Trend,
85
+ NumberInfo,
86
+ MiniSmoothArea
87
+ } from '@vue2-client/components'
88
+
89
+ export default {
90
+ name: 'EmployeeDetailsView',
91
+ components: {
92
+ JsonViewer,
93
+ XTable,
94
+ ChartCard,
95
+ MiniArea,
96
+ MiniBar,
97
+ MiniProgress,
98
+ RankList,
99
+ Bar,
100
+ Trend,
101
+ NumberInfo,
102
+ MiniSmoothArea
103
+ },
104
+ data () {
105
+ return {
106
+ // 页面宽度
107
+ screenWidth: document.documentElement.clientWidth,
108
+ // 员工详情
109
+ details: {
110
+ name: '',
111
+ department: undefined,
112
+ model_in_charge: undefined,
113
+ response_ticket_count: undefined,
114
+ finished_ticket_count: undefined,
115
+ finished_ticket_ratio: undefined
116
+ },
117
+ // 控制加载过程
118
+ loadTicketDetails: false,
119
+ // 控制应答数加载
120
+ confirmLoadState: 'Loading...',
121
+ // 控制完成数加载
122
+ finishLoadState: 'Loading...',
123
+ // 控制完成比例加载
124
+ finishedRatioLoadStatus: 'Loading...',
125
+ // 一周应答明细
126
+ confirmSumWeekly: [],
127
+ // 一周完成明细
128
+ finishSumWeekly: [],
129
+ // 一周应答明细列
130
+ confirmSumWeeklyScale: [
131
+ {
132
+ dataKey: 'x',
133
+ alias: '时间'
134
+ },
135
+ {
136
+ dataKey: 'y',
137
+ alias: '应答数'
138
+ }
139
+ ],
140
+ // 一周完成明细列
141
+ finishSumWeeklyScale: [
142
+ {
143
+ dataKey: 'x',
144
+ alias: '时间'
145
+ },
146
+ {
147
+ dataKey: 'y',
148
+ alias: '完成数'
149
+ }
150
+ ],
151
+ // 7日新增应答数
152
+ confirmLastWeekCount: 0,
153
+ // 7日新增完成数
154
+ finishLastWeekCount: 0,
155
+ // 控制订单完成比例颜色
156
+ finishRatioColor: ''
157
+ }
158
+ },
159
+ mounted () {
160
+ this.loadConfirmCount()
161
+ this.loadFinishCount()
162
+ this.initView()
163
+ },
164
+ computed: {
165
+ ...mapState('account', { currUser: 'user' }),
166
+ ...mapState('setting', ['isMobile'])
167
+ },
168
+ props: {
169
+ empId: {
170
+ type: String,
171
+ required: true
172
+ },
173
+ visible: {
174
+ type: Boolean,
175
+ default: false
176
+ }
177
+ },
178
+ methods: {
179
+ // 初始化组件
180
+ initView () {
181
+ this.loadTicketDetails = true
182
+ this.finishedRatioLoadStatus = 'Loading...'
183
+ this.details.finished_ticket_ratio = 0
184
+ return post(EmployeeDetailsViewApi.getEmployeeDetails, {
185
+ empId: this.empId
186
+ })
187
+ .then(res => {
188
+ this.details = res
189
+ if (this.details.finished_ticket_ratio === undefined) {
190
+ this.details.finished_ticket_ratio = 0
191
+ }
192
+ this.details.finished_ticket_ratio = this.details.finished_ticket_ratio * 100
193
+ this.finishRatioColor = this.getFinishedRatioColor(this.details.finished_ticket_ratio)
194
+ // 字典值解析
195
+ const departmentValue = this.details.department
196
+ this.details.department = this.$appdata.getDictionaryList('departmentMap')[departmentValue].label
197
+ const modelInChargeValue = this.details.model_in_charge
198
+ const modelDictionary = this.$appdata.getDictionaryList('serviceModuleType')
199
+ for (let i = 0; i < modelDictionary.length; i++) {
200
+ if (modelInChargeValue === modelDictionary[i].value) {
201
+ this.details.model_in_charge = this.$appdata.getDictionaryList('serviceModuleType')[i].label
202
+ }
203
+ }
204
+ this.finishedRatioLoadStatus = 'success'
205
+ this.loadTicketDetails = false
206
+ }, err => {
207
+ this.loadTicketDetails = false
208
+ console.error(err)
209
+ })
210
+ },
211
+ // 获取应答订单数量
212
+ loadConfirmCount () {
213
+ this.confirmSumWeekly = []
214
+ this.confirmLoadState = 'Loading...'
215
+ return post(EmployeeDetailsViewApi.getConfirmTicketsCountWeekly, {
216
+ empId: this.empId
217
+ }).then(res => {
218
+ this.confirmLastWeekCount = 0
219
+ for (let i = 0, len = res.length; i < len; i++) {
220
+ this.confirmLastWeekCount = this.confirmLastWeekCount + res[i].num
221
+ this.confirmSumWeekly.push({
222
+ x: res[i].date,
223
+ y: res[i].num
224
+ })
225
+ }
226
+ this.confirmLoadState = 'success'
227
+ }, err => {
228
+ console.warn(err)
229
+ this.confirmLoadState = 'error'
230
+ })
231
+ },
232
+ // 获取完成订单数据
233
+ loadFinishCount () {
234
+ this.finishSumWeekly = []
235
+ this.finishLoadState = 'Loading...'
236
+ return post(EmployeeDetailsViewApi.getFinishedTicketsCountWeekly, {
237
+ empId: this.empId
238
+ }).then(res => {
239
+ this.finishLastWeekCount = 0
240
+ for (let i = 0, len = res.length; i < len; i++) {
241
+ this.finishLastWeekCount = this.finishLastWeekCount + res[i].num
242
+ this.finishSumWeekly.push({
243
+ x: res[i].date,
244
+ y: res[i].num
245
+ })
246
+ }
247
+ this.finishLoadState = 'success'
248
+ }, err => {
249
+ console.warn(err)
250
+ this.finishLoadState = 'error'
251
+ })
252
+ },
253
+ // 获取完成订单比例数据
254
+ loadFinishedRatio () {
255
+ this.initView()
256
+ },
257
+ // 根据占比返回完成度颜色
258
+ getFinishedRatioColor (percent) {
259
+ if (percent < 10) {
260
+ return 'rgb(242, 99, 123)'
261
+ } else if (percent >= 10 && percent <= 20) {
262
+ return 'rgb(251, 212, 55)'
263
+ } else {
264
+ return 'rgb(19, 194, 194)'
265
+ }
266
+ },
267
+ // 关闭抽屉时回调
268
+ onClose () {
269
+ this.$emit('update:visible', false)
270
+ this.details.finished_ticket_ratio = undefined
271
+ },
272
+ // 日期格式化
273
+ format (date, format) {
274
+ return formatDate(date, format)
275
+ },
276
+ // 转换JSON
277
+ toJSON (value) {
278
+ try {
279
+ return JSON.parse(value)
280
+ } catch (e) {
281
+ return value
282
+ }
283
+ },
284
+ // 控制开始处理按钮可用状态
285
+ handlerBtnDisable () {
286
+ return this.step !== 0
287
+ },
288
+ // 控制移交他人按钮可用状态
289
+ transferBtnDisable () {
290
+ return this.step === 0
291
+ }
292
+ },
293
+ watch: {
294
+ 'visible' (val) {
295
+ if (val) {
296
+ this.initView()
297
+ this.loadConfirmCount()
298
+ this.loadFinishCount()
299
+ }
300
+ }
301
+ }
302
+ }
303
+ </script>
304
+
305
+ <style lang="less" scoped>
306
+ .high-priority{
307
+ background-color: rgba(163, 30, 30, 0.66);
308
+ border: red solid 1px;
309
+ font-size: large;
310
+ padding: 5px;
311
+ color: white;
312
+ border-radius: 10px;
313
+ }
314
+
315
+ .detail-layout {
316
+ margin-left: 44px;
317
+ }
318
+ .text {
319
+ color: rgba(0, 0, 0, .45);
320
+ }
321
+
322
+ .heading {
323
+ color: rgba(0, 0, 0, .85);
324
+ font-size: 20px;
325
+ }
326
+
327
+ .no-data {
328
+ color: rgba(0, 0, 0, .25);
329
+ text-align: center;
330
+ line-height: 64px;
331
+ font-size: 16px;
332
+
333
+ i {
334
+ font-size: 24px;
335
+ margin-right: 16px;
336
+ position: relative;
337
+ top: 3px;
338
+ }
339
+ }
340
+
341
+ .mobile {
342
+ .detail-layout {
343
+ margin-left: unset;
344
+ }
345
+ .text {
346
+
347
+ }
348
+ .status-list {
349
+ text-align: left;
350
+ }
351
+ }
352
+
353
+ .row {
354
+ display: flex;
355
+
356
+ .content {
357
+ -webkit-box-flex: 1;
358
+ flex: auto;
359
+ -ms-flex: auto;
360
+ }
361
+
362
+ .extra {
363
+ flex: 0 1 auto;
364
+ -webkit-box-flex: 0;
365
+ -ms-flex: 0 1 auto;
366
+ min-width: 242px;
367
+ margin-left: 88px;
368
+ text-align: right;
369
+ }
370
+ }
371
+ </style>