vue2-client 1.3.0 → 1.3.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 (106) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/index.js +30 -28
  3. package/package.json +1 -1
  4. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +225 -225
  5. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +777 -777
  6. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +553 -553
  7. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +165 -163
  8. package/src/base-client/components/common/Upload/Upload.vue +161 -158
  9. package/src/base-client/components/common/XAddForm/XAddForm.vue +349 -349
  10. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +321 -322
  11. package/src/base-client/components/common/XForm/XForm.vue +273 -268
  12. package/src/base-client/components/common/XForm/XFormItem.vue +387 -371
  13. package/src/base-client/components/common/XFormTable/XFormTable.vue +8 -7
  14. package/src/base-client/components/common/XTable/XTable.vue +278 -274
  15. package/src/base-client/components/{iot → system}/LogDetailsView/LogDetailsView.vue +0 -0
  16. package/src/base-client/components/{iot → system}/LogDetailsView/index.js +0 -0
  17. package/src/base-client/components/{iot → system}/LogDetailsView/index.md +0 -0
  18. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -280
  19. package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +806 -804
  20. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +24 -24
  21. package/src/base-client/plugins/PagedList.js +177 -176
  22. package/src/components/STable/index.js +318 -316
  23. package/src/components/index.js +36 -36
  24. package/src/components/table/StandardTable.vue +141 -142
  25. package/src/components/tool/TagSelect.vue +83 -83
  26. package/src/layouts/header/AdminHeader.vue +104 -109
  27. package/src/layouts/header/HeaderNotice.vue +167 -199
  28. package/src/layouts/header/InstitutionDetail.vue +181 -182
  29. package/src/pages/CreateQueryPage.vue +65 -59
  30. package/src/pages/system/dictionary/index.vue +43 -41
  31. package/src/pages/system/file/Info.vue +56 -0
  32. package/src/pages/system/file/index.vue +317 -0
  33. package/src/pages/system/queryParams/index.vue +43 -41
  34. package/src/pages/system/ticket/index.vue +458 -452
  35. package/src/pages/system/ticket/submitTicketSuccess.vue +206 -203
  36. package/src/router/async/config.async.js +2 -1
  37. package/src/router/async/router.map.js +56 -60
  38. package/src/services/api/DictionaryDetailsViewApi.js +6 -6
  39. package/src/services/api/LogDetailsViewApi.js +10 -10
  40. package/src/services/api/QueryParamsDetailsViewApi.js +6 -6
  41. package/src/services/api/TicketDetailsViewApi.js +42 -40
  42. package/src/services/api/commonTempTable.js +10 -0
  43. package/src/services/api/index.js +2 -24
  44. package/src/services/api/manage.js +8 -16
  45. package/src/utils/excel/Blob.js +181 -181
  46. package/src/utils/excel/Export2Excel.js +141 -142
  47. package/src/utils/i18n.js +80 -80
  48. package/src/utils/request.js +4 -4
  49. package/src/utils/routerUtil.js +358 -350
  50. package/src/utils/theme-color-replacer-extend.js +91 -92
  51. package/vue.config.js +109 -163
  52. package/src/base-client/all.js +0 -62
  53. package/src/base-client/components/iot/CustomerDetailsView/CustomerDetailsView.vue +0 -225
  54. package/src/base-client/components/iot/CustomerDetailsView/index.js +0 -3
  55. package/src/base-client/components/iot/CustomerDetailsView/index.md +0 -40
  56. package/src/base-client/components/iot/DataAnalysisUser/DataAnalysisUser.vue +0 -127
  57. package/src/base-client/components/iot/DataAnalysisUser/index.js +0 -3
  58. package/src/base-client/components/iot/DeviceBrandDetailsView/DeviceBrandDetailsView.vue +0 -452
  59. package/src/base-client/components/iot/DeviceBrandDetailsView/index.js +0 -3
  60. package/src/base-client/components/iot/DeviceDetailsView/DeviceDetailsView.vue +0 -232
  61. package/src/base-client/components/iot/DeviceDetailsView/index.js +0 -3
  62. package/src/base-client/components/iot/DeviceDetailsView/index.md +0 -41
  63. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsCount.vue +0 -678
  64. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsException.vue +0 -57
  65. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstruct.vue +0 -122
  66. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstructOperate.vue +0 -121
  67. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsMain.vue +0 -269
  68. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsRead.vue +0 -131
  69. package/src/base-client/components/iot/DeviceDetailsView/part/index.js +0 -8
  70. package/src/base-client/components/iot/DeviceTypeDetailsView/DeviceTypeDetailsView.vue +0 -300
  71. package/src/base-client/components/iot/DeviceTypeDetailsView/index.js +0 -3
  72. package/src/base-client/components/iot/InstructDetailsView/InstructDetailsView.vue +0 -464
  73. package/src/base-client/components/iot/InstructDetailsView/index.js +0 -3
  74. package/src/base-client/components/iot/InstructDetailsView/index.md +0 -43
  75. package/src/base-client/components/iot/MeterDetailsView/MeterDetailsView.vue +0 -352
  76. package/src/base-client/components/iot/MeterDetailsView/index.js +0 -3
  77. package/src/base-client/components/iot/MeterDetailsView/index.md +0 -41
  78. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsCount.vue +0 -330
  79. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsException.vue +0 -179
  80. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsHandPlan.vue +0 -285
  81. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsInstruct.vue +0 -230
  82. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsMain.vue +0 -251
  83. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsSellGas.vue +0 -184
  84. package/src/base-client/components/iot/MeterDetailsView/part/index.js +0 -9
  85. package/src/base-client/components/iot/WebmeterAnalysisView/WebmeterAnalysisView.vue +0 -960
  86. package/src/base-client/components/iot/WebmeterAnalysisView/index.js +0 -3
  87. package/src/base-client/components/iot/WebmeterAnalysisView/index.md +0 -42
  88. package/src/base-client/components/ticket/EmployeeDetailsView/EmployeeDetailsView.vue +0 -370
  89. package/src/base-client/components/ticket/EmployeeDetailsView/index.js +0 -3
  90. package/src/base-client/components/ticket/EmployeeDetailsView/index.md +0 -28
  91. package/src/components/Charts/DataUserOrderSituation.vue +0 -77
  92. package/src/components/Charts/DataUserReporting.vue +0 -74
  93. package/src/components/Charts/DataUserSituation.vue +0 -107
  94. package/src/services/api/CustomerDetailsViewApi.js +0 -6
  95. package/src/services/api/DeviceBrandDetailsViewApi.js +0 -14
  96. package/src/services/api/DeviceDetailsViewApi.js +0 -10
  97. package/src/services/api/DeviceTypeDetailsViewApi.js +0 -6
  98. package/src/services/api/EmployeeDetailsViewApi.js +0 -12
  99. package/src/services/api/FormGroupEditApi.js +0 -6
  100. package/src/services/api/InstructDetailsViewApi.js +0 -12
  101. package/src/services/api/MeterDetailsViewApi.js +0 -24
  102. package/src/services/api/WebmeterAnalysisViewApi.js +0 -24
  103. package/src/services/api/applyInstallApi.js +0 -14
  104. package/src/services/api/iot/DeviceDetailsView/DeviceDetailsCountApi.js +0 -18
  105. package/src/services/api/iot.js +0 -7
  106. package/src/services/api/service.js +0 -12
@@ -1,452 +1,458 @@
1
- <template>
2
- <div>
3
- <!-- 显示成功页抽屉 -->
4
- <a-modal v-model="successVisible" title="工单状态" width="70%" :footer="null" destroy-on-close @cancel="onSuccessCancel">
5
- <submit-ticket-success v-if="serialNumber" :serialNumber="serialNumber" />
6
- </a-modal>
7
- <!-- 两个使用手册弹框 -->
8
- <a-modal
9
- title="向日葵使用指南"
10
- :visible="sunClientManualVisible"
11
- @ok="sunClientManualVisible = false"
12
- @cancel="sunClientManualVisible = false"
13
- width="1000px"
14
- >
15
- <h1>一、安装</h1>
16
- <hr/>
17
- <div style="padding-left: 100px;padding-top: 20px">
18
- <img src="@vue2-client/assets/img/SunClientManual/1.png" style="width: 800px" alt="pic">
19
- <br/>
20
- <br/>
21
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">运行下载好的安装包,按需要手动选择安装路径后,一路点下一步完成安装</p>
22
- <br/>
23
- <br/>
24
- </div>
25
- <h1>二、运行</h1>
26
- <hr/>
27
- <div style="padding-left: 100px;padding-top: 20px">
28
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">在桌面或开始菜单中打开向日葵软件</p>
29
- <img src="@vue2-client/assets/img/SunClientManual/2.png" style="width: 800px" alt="pic">
30
- <br/>
31
- <br/>
32
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">显示此页面时,您已成功运行向日葵</p>
33
- <br/>
34
- <br/>
35
- </div>
36
- <h1>三、截图</h1>
37
- <hr/>
38
- <div style="padding-left: 100px;padding-top: 20px">
39
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">点击软件界面中眼睛样子的按钮,使验证码正常显示</p>
40
- <br/>
41
- <br/>
42
- <img src="@vue2-client/assets/img/SunClientManual/3.png" style="width: 800px" alt="pic">
43
- <br/>
44
- <br/>
45
- <br/>
46
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">
47
- 使用qq,微信,或者任何截图软件。截取屏幕中 “本机识别码” 和 “本机验证码”。
48
- 确保该值清晰可辨别
49
- </p>
50
- <br/>
51
- <br/>
52
- <img src="@vue2-client/assets/img/SunClientManual/4.png" style="width: 800px" alt="pic">
53
- <br/>
54
- <br/>
55
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">
56
- 将您截好的图片,通过表单提交页面,下方 “+” (加号)的按钮,提交给我们。
57
- 这样我们的工作人员就可以远程协助您,排查、解决问题
58
- </p>
59
- <br/>
60
- <br/>
61
- </div>
62
- </a-modal>
63
- <a-modal
64
- title="ToDesk使用指南"
65
- :visible="toDeskManualVisible"
66
- @ok="toDeskManualVisible = false"
67
- @cancel="toDeskManualVisible = false"
68
- width="1000px"
69
- >
70
- <h1>一、安装</h1>
71
- <hr/>
72
- <div style="padding-left: 100px;padding-top: 20px">
73
- <img src="@vue2-client/assets/img/ToDeskManual/1.png" style="width: 800px" alt="pic">
74
- <br/>
75
- <br/>
76
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">运行下载好的安装包,按需要手动选择安装路径后,一路点下一步完成安装</p>
77
- <br/>
78
- <br/>
79
- </div>
80
- <h1>二、运行</h1>
81
- <hr/>
82
- <div style="padding-left: 100px;padding-top: 20px">
83
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">在桌面或开始菜单中打开ToDesk软件</p>
84
- <img src="@vue2-client/assets/img/ToDeskManual/2.png" style="width: 800px" alt="pic">
85
- <br/>
86
- <br/>
87
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">显示此页面时,您已成功运行ToDesk</p>
88
- <br/>
89
- <br/>
90
- </div>
91
- <h1>三、截图</h1>
92
- <hr/>
93
- <div style="padding-left: 100px;padding-top: 20px">
94
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">点击软件界面中眼睛样子的按钮,使临时密码正常显示</p>
95
- <br/>
96
- <br/>
97
- <img src="@vue2-client/assets/img/ToDeskManual/3.png" style="width: 800px" alt="pic">
98
- <br/>
99
- <br/>
100
- <br/>
101
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">
102
- 使用qq,微信,或者任何截图软件。截取屏幕中 “设备代码” 和 “临时密码”。
103
- 确保该值清晰可辨别
104
- </p>
105
- <br/>
106
- <br/>
107
- <img src="@vue2-client/assets/img/ToDeskManual/4.png" style="width: 800px" alt="pic">
108
- <br/>
109
- <br/>
110
- <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">
111
- 将您截好的图片,通过表单提交页面,下方 “+” (加号)的按钮,提交给我们。
112
- 这样我们的工作人员就可以远程协助您,排查、解决问题
113
- </p>
114
- <br/>
115
- <br/>
116
- </div>
117
- </a-modal>
118
- <a-modal
119
- title="填写联系方式"
120
- :visible="infoFormVisible"
121
- @ok="onInfoFormSubmit"
122
- @cancel="infoFormVisible = false">
123
- <a-form-model
124
- ref="infoFormRef"
125
- :model="infoForm"
126
- :label-col="{ span: 5 }"
127
- :wrapper-col="{ span: 18 }">
128
- <a-form-model-item label="联系方式" prop="phone" :rules="{ required: true, message: '请输入联系方式' }">
129
- <a-input v-model="infoForm.phone" placeholder="请输入联系方式查询历史工单" />
130
- </a-form-model-item>
131
- </a-form-model>
132
- </a-modal>
133
- <a-card>
134
- <div style="text-align: right">
135
- <p>欢迎您!{{ currUser.ename }}</p>
136
- </div>
137
- <div class="submitTicketTitle">
138
- <span>奥枫问题反馈平台</span>
139
- </div>
140
- <a-tabs :activeKey="tabActiveKey" @change="changeTab">
141
- <a-tab-pane key="workSubmit" tab="工单提交">
142
- <!-- 表格主体 -->
143
- <a-row v-if="tabActiveKey === 'workSubmit'">
144
- <a-col :span="18">
145
- <a-form :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
146
- <!-- 客户名称输入 -->
147
- <a-form-item v-if="!currUser.ename" label="客户名称">
148
- <a-input v-model="customerName" placeholder="请输入客户名称"/>
149
- <strong v-show="showCustomerNameAlert" style="color: red">客户名称不能为空!</strong>
150
- </a-form-item>
151
- <!-- 问题类型单选框 -->
152
- <a-form-item label="问题类型">
153
- <a-radio-group v-model="form.category" v-for="(item,index) in ticketCategoryMap" :key="index">
154
- <a-radio :value="item.value" class="radio-item">
155
- {{ item.label }}
156
- </a-radio>
157
- </a-radio-group>
158
- <a-spin :spinning="ticketCategoryMapLoading" />
159
- <br/>
160
- <strong v-show="showCategoryAlert" style="color: red">类型不允许为空!</strong>
161
- </a-form-item>
162
- <!-- 联系方式 -->
163
- <a-form-item label="联系方式">
164
- <a-input v-model="form.phone"></a-input>
165
- <strong v-show="showPhoneAlert" style="color: red">联系方式填写有误!</strong>
166
- </a-form-item>
167
- <!-- 问题描述框 -->
168
- <a-form-item label="问题详情描述">
169
- <a-textarea allow-clear v-model="form.desc" placeholder="请用一句话描述您的问题,必要时请注明客户编号,表号,系统功能项等信息"/>
170
- </a-form-item>
171
- <!-- 图片上传 -->
172
- <a-form-item :wrapper-col="{ span: 12 }" label="问题截图">
173
- <div class="clearfix">
174
- <upload v-if="uploadVisible" :model="uploadModel" @setFiles="setFiles" />
175
- <a-modal
176
- :visible="previewVisible"
177
- :footer="null"
178
- @cancel="handleCancel"
179
- >
180
- <img style="width: 100%" :src="previewImage" alt="图片上传"/>
181
- </a-modal>
182
- </div>
183
- </a-form-item>
184
- <!-- 表单底部按钮 -->
185
- <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
186
- <a-button type="primary" @click="onSubmit" style="margin-right: 20px" :disabled="showCategoryAlert || showPhoneAlert || !validCustomerName">
187
- 提交
188
- </a-button>
189
- </a-form-item>
190
- </a-form>
191
- </a-col>
192
- <a-col :span="6">
193
- <a-card title="远程方式快捷下载">
194
- <a-space direction="vertical">
195
- <a-row :gutter="16">
196
- <a-col
197
- :lg="24"
198
- :md="24"
199
- :sm="24"
200
- :xl="12"
201
- :xs="24"
202
- :xxl="12"
203
- style="text-align: center">
204
- <img @click="toSunClientClick" style="width: 128px;height:128px;cursor: pointer" src="@vue2-client/assets/img/SunClientDownload.png" alt="pic"/>
205
- <p style="padding-top:10px;text-align: center"><a @click="sunClientManualVisible = true">向日葵使用说明</a></p>
206
- </a-col>
207
- <a-col
208
- :lg="24"
209
- :md="24"
210
- :sm="24"
211
- :xl="12"
212
- :xs="24"
213
- :xxl="12"
214
- style="text-align: center">
215
- <img @click="toDeskClick" style="width: 128px;height:128px;cursor: pointer" src="@vue2-client/assets/img/ToDeskDownload.png" alt="pic">
216
- <p style="padding-top:10px;text-align: center"><a @click="toDeskManualVisible = true">ToDesk使用说明</a></p>
217
- </a-col>
218
- </a-row>
219
- <a-row :gutter="16" style="text-align: center">
220
- <hr/>
221
- <p style="color: red;font-weight: bolder;padding-top: 10px">如需远程协助,请下载向日葵</p>
222
- <p style="color: red;font-weight: bolder">向日葵安装使用指南,请点击上方“向日葵使用说明”查看</p>
223
- </a-row>
224
- </a-space>
225
- </a-card>
226
- </a-col>
227
- </a-row>
228
- </a-tab-pane>
229
- <a-tab-pane key="workHistory" tab="历史工单">
230
- <!-- 查询表单 -->
231
- <x-form-table
232
- v-if="tabActiveKey === 'workHistory'"
233
- title="已提交工单"
234
- :queryParamsName="queryParamsName"
235
- :fixed-query-form="fixedQueryForm"
236
- @action="toDetail">
237
- <a-button slot="button" type="primary" @click="infoFormVisible = true">填写联系方式</a-button>
238
- </x-form-table>
239
- </a-tab-pane>
240
- </a-tabs>
241
- </a-card>
242
- </div>
243
- </template>
244
-
245
- <script>
246
- import { TicketDetailsViewApi, post } from '@vue2-client/services/api'
247
- import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable'
248
- import submitTicketSuccess from './submitTicketSuccess'
249
-
250
- export default {
251
- name: 'submitTicket',
252
- components: {
253
- XFormTable, submitTicketSuccess
254
- },
255
- data () {
256
- return {
257
- // 查询配置文件名
258
- queryParamsName: 'TicketQueryForCustomer',
259
- // 控制成功页面显示
260
- successVisible: false,
261
- // 控制预览显示
262
- previewVisible: false,
263
- // 图片真实地址
264
- previewImage: '',
265
- // 图片列表
266
- fileList: [],
267
- // 表单数据
268
- form: {
269
- name: '',
270
- category: undefined,
271
- desc: undefined,
272
- phone: ''
273
- },
274
- // 工单序列号
275
- serialNumber: '',
276
- // 类别未填写警告信息控制
277
- showCategoryAlert: true,
278
- showPhoneAlert: true,
279
- showCustomerNameAlert: true,
280
- // 向日葵使用指南可见性
281
- sunClientManualVisible: false,
282
- // 向日葵使用指南可见性
283
- toDeskManualVisible: false,
284
- // 为工单查询指定条件
285
- fixedQueryForm: {},
286
- // 用户信息
287
- currUser: {
288
- ename: ''
289
- },
290
- tabActiveKey: 'workSubmit',
291
- uploadModel,
292
- // 客户名称
293
- customerName: undefined,
294
- // 问题类型选项
295
- ticketCategoryMap: [],
296
- ticketCategoryMapLoading: false,
297
- // 未传入客户名称手动输入联系方式
298
- infoFormVisible: false,
299
- infoForm: {
300
- phone: ''
301
- },
302
- uploadVisible: true
303
- }
304
- },
305
- computed: {
306
- // 检查客户名称是否为空
307
- validCustomerName () {
308
- return this.currUser.ename || this.customerName ? true : false
309
- }
310
- },
311
- created () {
312
- document.title = '奥枫问题反馈平台'
313
- const dictionary = this.$appdata.getParams()
314
- if (dictionary && dictionary['ticketCategoryMap']) {
315
- this.ticketCategoryMap = dictionary['ticketCategoryMap']
316
- } else {
317
- this.ticketCategoryMapLoading = true
318
- this.$appdata.load().then(() => {
319
- this.ticketCategoryMap = this.$appdata.getDictionaryList('ticketCategoryMap')
320
- this.ticketCategoryMapLoading = false
321
- })
322
- }
323
- let customerName = this.$route.query.orgName
324
- // 分割客户名称
325
- if (customerName) {
326
- const partArr = customerName.split('.')
327
- if (partArr.length === 5) {
328
- customerName = `${partArr[1]}.${partArr[4]}`
329
- }
330
- }
331
- this.currUser.ename = customerName
332
- this.fixedQueryForm['t_uploader'] = this.currUser.ename
333
- },
334
- methods: {
335
- toDetail (record, id) {
336
- this.serialNumber = id + ''
337
- this.successVisible = true
338
- },
339
- getBase64 (file) {
340
- return new Promise((resolve, reject) => {
341
- const reader = new FileReader()
342
- reader.readAsDataURL(file)
343
- reader.onload = () => resolve(reader.result)
344
- reader.onerror = error => reject(error)
345
- })
346
- },
347
- setFiles (fileIds) {
348
- this.fileList = fileIds
349
- },
350
- handleCancel () {
351
- this.previewVisible = false
352
- },
353
- // 处理预览图像
354
- async handlePreview (file) {
355
- if (!file.url && !file.preview) {
356
- file.preview = await this.getBase64(file.originFileObj)
357
- }
358
- this.previewImage = file.url || file.preview
359
- this.previewVisible = true
360
- },
361
- // 提交按钮逻辑
362
- onSubmit () {
363
- let customerName = this.currUser.ename
364
- if (!customerName) {
365
- customerName = this.customerName
366
- }
367
- const form = {
368
- customerName,
369
- problemType: this.form.category,
370
- contact: this.form.phone,
371
- problemDetail: this.form.desc,
372
- Images: this.fileList
373
- }
374
- if (!this.form.desc) {
375
- form.problemDetail = '该用户没有填写描述信息'
376
- }
377
- post(TicketDetailsViewApi.createTicket, { form }).then((res) => {
378
- this.serialNumber = res
379
- this.successVisible = true
380
- this.$message.success('创建成功')
381
- this.customerName = ''
382
- this.form.category = undefined
383
- this.form.phone = ''
384
- this.form.desc = ''
385
- this.fileList = []
386
- this.uploadVisible = false
387
- if (!this.currUser.ename) {
388
- this.fixedQueryForm.t_uploader_phone = form.contact
389
- this.infoForm.phone = form.contact
390
- }
391
- })
392
- },
393
- onSuccessCancel () {
394
- this.uploadVisible = true
395
- },
396
- // 点击向日葵链接
397
- toSunClientClick () {
398
- window.open('https://sunlogin.oray.com/download')
399
- },
400
- // 点击ToDesk链接
401
- toDeskClick () {
402
- window.open('https://www.todesk.com/download.html')
403
- },
404
- // 切换标签页
405
- changeTab (id) {
406
- if (id === 'workHistory' && !this.fixedQueryForm.t_uploader && !this.fixedQueryForm.t_uploader_phone) {
407
- this.infoFormVisible = true
408
- return
409
- }
410
- this.tabActiveKey = id
411
- },
412
- onInfoFormSubmit () {
413
- this.$refs.infoFormRef.validate(valid => {
414
- if (valid) {
415
- this.fixedQueryForm = {
416
- t_uploader_phone: this.infoForm.phone
417
- }
418
- this.tabActiveKey = 'workHistory'
419
- this.infoFormVisible = false
420
- }
421
- })
422
- }
423
- },
424
- watch: {
425
- // 监控类别的改变,当类别改变,校验通过
426
- 'form.category' (newVal) {
427
- const numReg = new RegExp(/^[0-9]+$/)
428
- this.showCategoryAlert = !numReg.test(newVal)
429
- },
430
- 'form.phone' (newVal) {
431
- const numReg = new RegExp(/^[0-9]+$/)
432
- this.showPhoneAlert = !numReg.test(newVal)
433
- },
434
- 'customerName' (newVal) {
435
- this.showCustomerNameAlert = !newVal
436
- }
437
- }
438
- }
439
- const uploadModel = JSON.parse('{"addOrEdit":"all","resUploadStock":1,"pathKey":"cs","rule":{"type":"string","required":"false"},"isOnlyAddOrEdit":true,"acceptCount":5,"type":"image","accept":[".jpg,.jpeg,.ico,.gif,svg,.webp,.png,.bmp,.pjpeg,"],"stockAlias":"webmeter","fileRootPath":"D:\\\\nginx-resource\\\\resource\\\\","name":"图片","resUploadMode":"server","model":"Images"}')
440
- </script>
441
-
442
- <style scoped>
443
- .radio-item{
444
- margin-right: 140px;
445
- }
446
- .submitTicketTitle{
447
- font-size: 40px;
448
- vertical-align: middle;
449
- text-align: center;
450
- margin-bottom: 40px;
451
- }
452
- </style>
1
+ <template>
2
+ <div>
3
+ <!-- 显示成功页抽屉 -->
4
+ <a-modal
5
+ v-model="successVisible"
6
+ :footer="null"
7
+ destroy-on-close
8
+ title="工单状态"
9
+ width="70%"
10
+ @cancel="onSuccessCancel">
11
+ <submit-ticket-success v-if="serialNumber" :serialNumber="serialNumber" />
12
+ </a-modal>
13
+ <!-- 两个使用手册弹框 -->
14
+ <a-modal
15
+ :visible="sunClientManualVisible"
16
+ title="向日葵使用指南"
17
+ width="1000px"
18
+ @cancel="sunClientManualVisible = false"
19
+ @ok="sunClientManualVisible = false"
20
+ >
21
+ <h1>一、安装</h1>
22
+ <hr/>
23
+ <div style="padding-left: 100px;padding-top: 20px">
24
+ <img alt="pic" src="@vue2-client/assets/img/SunClientManual/1.png" style="width: 800px">
25
+ <br/>
26
+ <br/>
27
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">运行下载好的安装包,按需要手动选择安装路径后,一路点下一步完成安装</p>
28
+ <br/>
29
+ <br/>
30
+ </div>
31
+ <h1>二、运行</h1>
32
+ <hr/>
33
+ <div style="padding-left: 100px;padding-top: 20px">
34
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">在桌面或开始菜单中打开向日葵软件</p>
35
+ <img alt="pic" src="@vue2-client/assets/img/SunClientManual/2.png" style="width: 800px">
36
+ <br/>
37
+ <br/>
38
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">显示此页面时,您已成功运行向日葵</p>
39
+ <br/>
40
+ <br/>
41
+ </div>
42
+ <h1>三、截图</h1>
43
+ <hr/>
44
+ <div style="padding-left: 100px;padding-top: 20px">
45
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">点击软件界面中眼睛样子的按钮,使验证码正常显示</p>
46
+ <br/>
47
+ <br/>
48
+ <img alt="pic" src="@vue2-client/assets/img/SunClientManual/3.png" style="width: 800px">
49
+ <br/>
50
+ <br/>
51
+ <br/>
52
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">
53
+ 使用qq,微信,或者任何截图软件。截取屏幕中 “本机识别码” 和 “本机验证码”。
54
+ 确保该值清晰可辨别
55
+ </p>
56
+ <br/>
57
+ <br/>
58
+ <img alt="pic" src="@vue2-client/assets/img/SunClientManual/4.png" style="width: 800px">
59
+ <br/>
60
+ <br/>
61
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">
62
+ 将您截好的图片,通过表单提交页面,下方 “+” (加号)的按钮,提交给我们。
63
+ 这样我们的工作人员就可以远程协助您,排查、解决问题
64
+ </p>
65
+ <br/>
66
+ <br/>
67
+ </div>
68
+ </a-modal>
69
+ <a-modal
70
+ :visible="toDeskManualVisible"
71
+ title="ToDesk使用指南"
72
+ width="1000px"
73
+ @cancel="toDeskManualVisible = false"
74
+ @ok="toDeskManualVisible = false"
75
+ >
76
+ <h1>一、安装</h1>
77
+ <hr/>
78
+ <div style="padding-left: 100px;padding-top: 20px">
79
+ <img alt="pic" src="@vue2-client/assets/img/ToDeskManual/1.png" style="width: 800px">
80
+ <br/>
81
+ <br/>
82
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">运行下载好的安装包,按需要手动选择安装路径后,一路点下一步完成安装</p>
83
+ <br/>
84
+ <br/>
85
+ </div>
86
+ <h1>二、运行</h1>
87
+ <hr/>
88
+ <div style="padding-left: 100px;padding-top: 20px">
89
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">在桌面或开始菜单中打开ToDesk软件</p>
90
+ <img alt="pic" src="@vue2-client/assets/img/ToDeskManual/2.png" style="width: 800px">
91
+ <br/>
92
+ <br/>
93
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">显示此页面时,您已成功运行ToDesk</p>
94
+ <br/>
95
+ <br/>
96
+ </div>
97
+ <h1>三、截图</h1>
98
+ <hr/>
99
+ <div style="padding-left: 100px;padding-top: 20px">
100
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">点击软件界面中眼睛样子的按钮,使临时密码正常显示</p>
101
+ <br/>
102
+ <br/>
103
+ <img alt="pic" src="@vue2-client/assets/img/ToDeskManual/3.png" style="width: 800px">
104
+ <br/>
105
+ <br/>
106
+ <br/>
107
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">
108
+ 使用qq,微信,或者任何截图软件。截取屏幕中 “设备代码” 和 “临时密码”。
109
+ 确保该值清晰可辨别
110
+ </p>
111
+ <br/>
112
+ <br/>
113
+ <img alt="pic" src="@vue2-client/assets/img/ToDeskManual/4.png" style="width: 800px">
114
+ <br/>
115
+ <br/>
116
+ <p style="line-height: 30px;font-size: 1.5em;text-indent: 2em">
117
+ 将您截好的图片,通过表单提交页面,下方 “+” (加号)的按钮,提交给我们。
118
+ 这样我们的工作人员就可以远程协助您,排查、解决问题
119
+ </p>
120
+ <br/>
121
+ <br/>
122
+ </div>
123
+ </a-modal>
124
+ <a-modal
125
+ :visible="infoFormVisible"
126
+ title="填写联系方式"
127
+ @cancel="infoFormVisible = false"
128
+ @ok="onInfoFormSubmit">
129
+ <a-form-model
130
+ ref="infoFormRef"
131
+ :label-col="{ span: 5 }"
132
+ :model="infoForm"
133
+ :wrapper-col="{ span: 18 }">
134
+ <a-form-model-item :rules="{ required: true, message: '请输入联系方式' }" label="联系方式" prop="phone">
135
+ <a-input v-model="infoForm.phone" placeholder="请输入联系方式查询历史工单" />
136
+ </a-form-model-item>
137
+ </a-form-model>
138
+ </a-modal>
139
+ <a-card>
140
+ <div style="text-align: right">
141
+ <p>欢迎您!{{ currUser.ename }}</p>
142
+ </div>
143
+ <div class="submitTicketTitle">
144
+ <span>奥枫问题反馈平台</span>
145
+ </div>
146
+ <a-tabs :activeKey="tabActiveKey" @change="changeTab">
147
+ <a-tab-pane key="workSubmit" tab="工单提交">
148
+ <!-- 表格主体 -->
149
+ <a-row v-if="tabActiveKey === 'workSubmit'">
150
+ <a-col :span="18">
151
+ <a-form :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
152
+ <!-- 客户名称输入 -->
153
+ <a-form-item v-if="!currUser.ename" label="客户名称">
154
+ <a-input v-model="customerName" placeholder="请输入客户名称"/>
155
+ <strong v-show="showCustomerNameAlert" style="color: red">客户名称不能为空!</strong>
156
+ </a-form-item>
157
+ <!-- 问题类型单选框 -->
158
+ <a-form-item label="问题类型">
159
+ <a-radio-group v-for="(item,index) in ticketCategoryMap" :key="index" v-model="form.category">
160
+ <a-radio :value="item.value" class="radio-item">
161
+ {{ item.label }}
162
+ </a-radio>
163
+ </a-radio-group>
164
+ <a-spin :spinning="ticketCategoryMapLoading" />
165
+ <br/>
166
+ <strong v-show="showCategoryAlert" style="color: red">类型不允许为空!</strong>
167
+ </a-form-item>
168
+ <!-- 联系方式 -->
169
+ <a-form-item label="联系方式">
170
+ <a-input v-model="form.phone"></a-input>
171
+ <strong v-show="showPhoneAlert" style="color: red">联系方式填写有误!</strong>
172
+ </a-form-item>
173
+ <!-- 问题描述框 -->
174
+ <a-form-item label="问题详情描述">
175
+ <a-textarea v-model="form.desc" allow-clear placeholder="请用一句话描述您的问题,必要时请注明客户编号,表号,系统功能项等信息"/>
176
+ </a-form-item>
177
+ <!-- 图片上传 -->
178
+ <a-form-item :wrapper-col="{ span: 12 }" label="问题截图">
179
+ <div class="clearfix">
180
+ <upload v-if="uploadVisible" :model="uploadModel" @setFiles="setFiles" />
181
+ <a-modal
182
+ :footer="null"
183
+ :visible="previewVisible"
184
+ @cancel="handleCancel"
185
+ >
186
+ <img :src="previewImage" alt="图片上传" style="width: 100%"/>
187
+ </a-modal>
188
+ </div>
189
+ </a-form-item>
190
+ <!-- 表单底部按钮 -->
191
+ <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
192
+ <a-button :disabled="showCategoryAlert || showPhoneAlert || !validCustomerName" style="margin-right: 20px" type="primary" @click="onSubmit">
193
+ 提交
194
+ </a-button>
195
+ </a-form-item>
196
+ </a-form>
197
+ </a-col>
198
+ <a-col :span="6">
199
+ <a-card title="远程方式快捷下载">
200
+ <a-space direction="vertical">
201
+ <a-row :gutter="16">
202
+ <a-col
203
+ :lg="24"
204
+ :md="24"
205
+ :sm="24"
206
+ :xl="12"
207
+ :xs="24"
208
+ :xxl="12"
209
+ style="text-align: center">
210
+ <img alt="pic" src="@vue2-client/assets/img/SunClientDownload.png" style="width: 128px;height:128px;cursor: pointer" @click="toSunClientClick"/>
211
+ <p style="padding-top:10px;text-align: center"><a @click="sunClientManualVisible = true">向日葵使用说明</a></p>
212
+ </a-col>
213
+ <a-col
214
+ :lg="24"
215
+ :md="24"
216
+ :sm="24"
217
+ :xl="12"
218
+ :xs="24"
219
+ :xxl="12"
220
+ style="text-align: center">
221
+ <img alt="pic" src="@vue2-client/assets/img/ToDeskDownload.png" style="width: 128px;height:128px;cursor: pointer" @click="toDeskClick">
222
+ <p style="padding-top:10px;text-align: center"><a @click="toDeskManualVisible = true">ToDesk使用说明</a></p>
223
+ </a-col>
224
+ </a-row>
225
+ <a-row :gutter="16" style="text-align: center">
226
+ <hr/>
227
+ <p style="color: red;font-weight: bolder;padding-top: 10px">如需远程协助,请下载向日葵</p>
228
+ <p style="color: red;font-weight: bolder">向日葵安装使用指南,请点击上方“向日葵使用说明”查看</p>
229
+ </a-row>
230
+ </a-space>
231
+ </a-card>
232
+ </a-col>
233
+ </a-row>
234
+ </a-tab-pane>
235
+ <a-tab-pane key="workHistory" tab="历史工单">
236
+ <!-- 查询表单 -->
237
+ <x-form-table
238
+ v-if="tabActiveKey === 'workHistory'"
239
+ :fixed-query-form="fixedQueryForm"
240
+ :queryParamsName="queryParamsName"
241
+ title="已提交工单"
242
+ @action="toDetail">
243
+ <a-button slot="button" type="primary" @click="infoFormVisible = true">填写联系方式</a-button>
244
+ </x-form-table>
245
+ </a-tab-pane>
246
+ </a-tabs>
247
+ </a-card>
248
+ </div>
249
+ </template>
250
+
251
+ <script>
252
+ import { TicketDetailsViewApi, post } from '@vue2-client/services/api'
253
+ import XFormTable from '@vue2-client/base-client/components/common/XFormTable/XFormTable'
254
+ import submitTicketSuccess from './submitTicketSuccess'
255
+
256
+ export default {
257
+ name: 'submitTicket',
258
+ components: {
259
+ XFormTable, submitTicketSuccess
260
+ },
261
+ data () {
262
+ return {
263
+ // 查询配置文件名
264
+ queryParamsName: 'TicketQueryForCustomer',
265
+ // 控制成功页面显示
266
+ successVisible: false,
267
+ // 控制预览显示
268
+ previewVisible: false,
269
+ // 图片真实地址
270
+ previewImage: '',
271
+ // 图片列表
272
+ fileList: [],
273
+ // 表单数据
274
+ form: {
275
+ name: '',
276
+ category: undefined,
277
+ desc: undefined,
278
+ phone: ''
279
+ },
280
+ // 工单序列号
281
+ serialNumber: '',
282
+ // 类别未填写警告信息控制
283
+ showCategoryAlert: true,
284
+ showPhoneAlert: true,
285
+ showCustomerNameAlert: true,
286
+ // 向日葵使用指南可见性
287
+ sunClientManualVisible: false,
288
+ // 向日葵使用指南可见性
289
+ toDeskManualVisible: false,
290
+ // 为工单查询指定条件
291
+ fixedQueryForm: {},
292
+ // 用户信息
293
+ currUser: {
294
+ ename: ''
295
+ },
296
+ tabActiveKey: 'workSubmit',
297
+ uploadModel,
298
+ // 客户名称
299
+ customerName: undefined,
300
+ // 问题类型选项
301
+ ticketCategoryMap: [],
302
+ ticketCategoryMapLoading: false,
303
+ // 未传入客户名称手动输入联系方式
304
+ infoFormVisible: false,
305
+ infoForm: {
306
+ phone: ''
307
+ },
308
+ uploadVisible: true
309
+ }
310
+ },
311
+ computed: {
312
+ // 检查客户名称是否为空
313
+ validCustomerName () {
314
+ return !!(this.currUser.ename || this.customerName)
315
+ }
316
+ },
317
+ created () {
318
+ document.title = '奥枫问题反馈平台'
319
+ const dictionary = this.$appdata.getParams()
320
+ if (dictionary && dictionary['ticketCategoryMap']) {
321
+ this.ticketCategoryMap = dictionary['ticketCategoryMap']
322
+ } else {
323
+ this.ticketCategoryMapLoading = true
324
+ this.$appdata.load().then(() => {
325
+ this.ticketCategoryMap = this.$appdata.getDictionaryList('ticketCategoryMap')
326
+ this.ticketCategoryMapLoading = false
327
+ })
328
+ }
329
+ let customerName = this.$route.query.orgName
330
+ // 分割客户名称
331
+ if (customerName) {
332
+ const partArr = customerName.split('.')
333
+ if (partArr.length === 5) {
334
+ customerName = `${partArr[1]}.${partArr[4]}`
335
+ }
336
+ }
337
+ this.currUser.ename = customerName
338
+ this.fixedQueryForm['t_uploader'] = this.currUser.ename
339
+ },
340
+ methods: {
341
+ toDetail (record, id) {
342
+ this.serialNumber = id + ''
343
+ this.successVisible = true
344
+ },
345
+ getBase64 (file) {
346
+ return new Promise((resolve, reject) => {
347
+ const reader = new FileReader()
348
+ reader.readAsDataURL(file)
349
+ reader.onload = () => resolve(reader.result)
350
+ reader.onerror = error => reject(error)
351
+ })
352
+ },
353
+ setFiles (fileIds) {
354
+ this.fileList = fileIds
355
+ },
356
+ handleCancel () {
357
+ this.previewVisible = false
358
+ },
359
+ // 处理预览图像
360
+ async handlePreview (file) {
361
+ if (!file.url && !file.preview) {
362
+ file.preview = await this.getBase64(file.originFileObj)
363
+ }
364
+ this.previewImage = file.url || file.preview
365
+ this.previewVisible = true
366
+ },
367
+ // 提交按钮逻辑
368
+ onSubmit () {
369
+ let customerName = this.currUser.ename
370
+ if (!customerName) {
371
+ customerName = this.customerName
372
+ }
373
+ const form = {
374
+ customerName,
375
+ problemType: this.form.category,
376
+ contact: this.form.phone,
377
+ problemDetail: this.form.desc,
378
+ Images: this.fileList
379
+ }
380
+ if (!this.form.desc) {
381
+ form.problemDetail = '该用户没有填写描述信息'
382
+ }
383
+ post(TicketDetailsViewApi.createTicket, { form }).then((res) => {
384
+ this.serialNumber = res
385
+ this.successVisible = true
386
+ this.$message.success('创建成功')
387
+ this.customerName = ''
388
+ this.form.category = undefined
389
+ this.form.phone = ''
390
+ this.form.desc = ''
391
+ this.fileList = []
392
+ this.uploadVisible = false
393
+ if (!this.currUser.ename) {
394
+ this.fixedQueryForm.t_uploader_phone = form.contact
395
+ this.infoForm.phone = form.contact
396
+ }
397
+ })
398
+ },
399
+ onSuccessCancel () {
400
+ this.uploadVisible = true
401
+ },
402
+ // 点击向日葵链接
403
+ toSunClientClick () {
404
+ window.open('https://sunlogin.oray.com/download')
405
+ },
406
+ // 点击ToDesk链接
407
+ toDeskClick () {
408
+ window.open('https://www.todesk.com/download.html')
409
+ },
410
+ // 切换标签页
411
+ changeTab (id) {
412
+ if (id === 'workHistory' && !this.fixedQueryForm.t_uploader && !this.fixedQueryForm.t_uploader_phone) {
413
+ this.infoFormVisible = true
414
+ return
415
+ }
416
+ this.tabActiveKey = id
417
+ },
418
+ onInfoFormSubmit () {
419
+ this.$refs.infoFormRef.validate(valid => {
420
+ if (valid) {
421
+ this.fixedQueryForm = {
422
+ t_uploader_phone: this.infoForm.phone
423
+ }
424
+ this.tabActiveKey = 'workHistory'
425
+ this.infoFormVisible = false
426
+ }
427
+ })
428
+ }
429
+ },
430
+ watch: {
431
+ // 监控类别的改变,当类别改变,校验通过
432
+ 'form.category' (newVal) {
433
+ const numReg = new RegExp(/^[0-9]+$/)
434
+ this.showCategoryAlert = !numReg.test(newVal)
435
+ },
436
+ 'form.phone' (newVal) {
437
+ const numReg = new RegExp(/^[0-9]+$/)
438
+ this.showPhoneAlert = !numReg.test(newVal)
439
+ },
440
+ 'customerName' (newVal) {
441
+ this.showCustomerNameAlert = !newVal
442
+ }
443
+ }
444
+ }
445
+ const uploadModel = JSON.parse('{"addOrEdit":"all","resUploadStock":1,"pathKey":"cs","rule":{"type":"string","required":"false"},"isOnlyAddOrEdit":true,"acceptCount":5,"type":"image","accept":[".jpg,.jpeg,.ico,.gif,svg,.webp,.png,.bmp,.pjpeg,"],"stockAlias":"webmeter","fileRootPath":"D:\\\\nginx-resource\\\\resource\\\\","name":"图片","resUploadMode":"server","model":"Images"}')
446
+ </script>
447
+
448
+ <style scoped>
449
+ .radio-item{
450
+ margin-right: 140px;
451
+ }
452
+ .submitTicketTitle{
453
+ font-size: 40px;
454
+ vertical-align: middle;
455
+ text-align: center;
456
+ margin-bottom: 40px;
457
+ }
458
+ </style>