vue2-client 1.0.0 → 1.2.1

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/.eslintrc.js +81 -81
  2. package/README.md +65 -55
  3. package/babel.config.js +15 -14
  4. package/docs/index.md +29 -29
  5. package/docs/notice.md +24 -0
  6. package/index.js +28 -0
  7. package/jest.config.js +3 -3
  8. package/package.json +1 -1
  9. package/public/index.html +27 -27
  10. package/src/App.vue +2 -2
  11. package/src/base-client/all.js +57 -57
  12. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +1159 -1159
  13. package/src/base-client/components/common/CreateQuery/index.md +1 -1
  14. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +540 -540
  15. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +1 -1
  16. package/src/base-client/components/common/CustomColumnsDrawer/index.md +1 -1
  17. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +150 -150
  18. package/src/base-client/components/common/FormGroupEdit/index.md +1 -1
  19. package/src/base-client/components/common/FormGroupQuery/index.md +1 -1
  20. package/src/base-client/components/common/XAddForm/XAddForm.vue +323 -323
  21. package/src/base-client/components/common/XAddForm/index.md +1 -1
  22. package/src/base-client/components/common/XBadge/index.md +1 -1
  23. package/src/base-client/components/common/XCard/index.md +1 -1
  24. package/src/base-client/components/common/XForm/XForm.vue +275 -275
  25. package/src/base-client/components/common/XForm/XFormItem.vue +217 -217
  26. package/src/base-client/components/common/XForm/index.md +196 -196
  27. package/src/base-client/components/common/XFormCol/index.md +1 -1
  28. package/src/base-client/components/common/XFormTable/XFormTable.vue +405 -405
  29. package/src/base-client/components/common/XFormTable/index.md +2 -2
  30. package/src/base-client/components/common/XTable/XTable.vue +262 -262
  31. package/src/base-client/components/common/XTable/index.md +255 -255
  32. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +1 -1
  33. package/src/base-client/components/iot/CustomerDetailsView/CustomerDetailsView.vue +226 -226
  34. package/src/base-client/components/iot/CustomerDetailsView/index.md +2 -2
  35. package/src/base-client/components/iot/DataAnalysisUser/DataAnalysisUser.vue +1 -1
  36. package/src/base-client/components/iot/DataAnalysisViewGD/DataAnalysisViewGD.vue +548 -548
  37. package/src/base-client/components/iot/DeviceBrandDetailsView/DeviceBrandDetailsView.vue +453 -453
  38. package/src/base-client/components/iot/DeviceDetailsView/DeviceDetailsView.vue +231 -231
  39. package/src/base-client/components/iot/DeviceDetailsView/index.md +1 -1
  40. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsCount.vue +330 -330
  41. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsException.vue +1 -1
  42. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstruct.vue +3 -3
  43. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsInstructOperate.vue +122 -122
  44. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsMain.vue +1 -1
  45. package/src/base-client/components/iot/DeviceDetailsView/part/DeviceDetailsRead.vue +3 -3
  46. package/src/base-client/components/iot/DeviceTypeDetailsView/DeviceTypeDetailsView.vue +277 -277
  47. package/src/base-client/components/iot/InstructDetailsView/InstructDetailsView.vue +472 -472
  48. package/src/base-client/components/iot/InstructDetailsView/index.md +1 -1
  49. package/src/base-client/components/iot/LogDetailsView/LogDetailsView.vue +380 -380
  50. package/src/base-client/components/iot/LogDetailsView/index.md +1 -1
  51. package/src/base-client/components/iot/MeterDetailsView/MeterDetailsView.vue +360 -360
  52. package/src/base-client/components/iot/MeterDetailsView/index.md +1 -1
  53. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsCount.vue +335 -335
  54. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsException.vue +185 -185
  55. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsHandPlan.vue +292 -292
  56. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsInstruct.vue +237 -237
  57. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsMain.vue +257 -257
  58. package/src/base-client/components/iot/MeterDetailsView/part/MeterDetailsSellGas.vue +190 -190
  59. package/src/base-client/components/iot/WebmeterAnalysisView/WebmeterAnalysisView.vue +723 -723
  60. package/src/base-client/components/iot/WebmeterAnalysisView/index.md +1 -1
  61. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  62. package/src/base-client/components/system/DictionaryDetailsView/index.md +1 -1
  63. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +248 -248
  64. package/src/base-client/components/ticket/EmployeeDetailsView/EmployeeDetailsView.vue +406 -406
  65. package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +486 -486
  66. package/src/base-client/components/ticket/TicketDetailsView/part/TicketDetailsFlow.vue +184 -184
  67. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +303 -303
  68. package/src/base-client/plugins/AppData.js +69 -69
  69. package/src/base-client/plugins/GetLoginInfoService.js +221 -222
  70. package/src/base-client/plugins/index.js +21 -21
  71. package/src/bootstrap.js +6 -4
  72. package/src/components/Ellipsis/Ellipsis.vue +1 -1
  73. package/src/components/Ellipsis/index.md +2 -2
  74. package/src/components/NumberInfo/index.md +1 -1
  75. package/src/components/STable/README.md +3 -3
  76. package/src/components/Trend/index.md +1 -1
  77. package/src/components/cache/AKeepAlive.js +1 -1
  78. package/src/components/checkbox/index.js +2 -2
  79. package/src/components/index.js +15 -15
  80. package/src/components/menu/menu.js +1 -1
  81. package/src/components/setting/Setting.vue +4 -4
  82. package/src/components/table/advance/AdvanceTable.vue +3 -3
  83. package/src/components/transition/PageToggleTransition.vue +1 -1
  84. package/src/config/default/setting.config.js +33 -33
  85. package/src/layouts/CommonLayout.vue +1 -1
  86. package/src/layouts/ComponentLayoutOne.vue +47 -47
  87. package/src/layouts/PageLayout.vue +2 -2
  88. package/src/layouts/SinglePageView.vue +1 -1
  89. package/src/layouts/header/AdminHeader.vue +2 -2
  90. package/src/layouts/header/HeaderAvatar.vue +1 -1
  91. package/src/layouts/header/HeaderNotice.vue +97 -97
  92. package/src/layouts/tabs/TabsHead.vue +1 -1
  93. package/src/layouts/tabs/TabsView.vue +6 -6
  94. package/src/main.js +20 -12
  95. package/src/mock/common/reportData.js +20 -20
  96. package/src/mock/goods/index.js +2 -2
  97. package/src/mock/index.js +6 -6
  98. package/src/mock/project/index.js +1 -1
  99. package/src/mock/user/current.js +1 -1
  100. package/src/mock/user/login.js +1 -1
  101. package/src/mock/user/routes.js +61 -61
  102. package/src/mock/workplace/index.js +1 -1
  103. package/src/pages/exception/403.vue +25 -25
  104. package/src/pages/exception/404.vue +25 -25
  105. package/src/pages/exception/500.vue +25 -25
  106. package/src/pages/login/Login.vue +194 -194
  107. package/src/pages/report/ReportTable.js +125 -125
  108. package/src/pages/report/ReportTableHome.vue +28 -28
  109. package/src/pages/resourceManage/resourceManageMain.vue +55 -55
  110. package/src/pages/system/applyInstallView/Core.vue +1 -1
  111. package/src/pages/system/applyInstallView/index.vue +1 -1
  112. package/src/pages/system/dictionary/index.vue +1 -1
  113. package/src/pages/system/queryParams/index.vue +1 -1
  114. package/src/router/async/config.async.js +1 -1
  115. package/src/router/async/router.map.js +59 -59
  116. package/src/router/guards.js +3 -3
  117. package/src/router/index.js +4 -8
  118. package/src/services/api/common.js +39 -39
  119. package/src/services/api/restTools.js +23 -23
  120. package/src/services/dataSource.js +1 -1
  121. package/src/services/user.js +2 -2
  122. package/src/store/index.js +3 -6
  123. package/src/store/modules/setting.js +5 -5
  124. package/src/theme/index.less +5 -5
  125. package/src/theme/reportTable.less +58 -58
  126. package/src/utils/i18n.js +2 -2
  127. package/src/utils/indexedDB.js +146 -146
  128. package/src/utils/request.js +3 -3
  129. package/src/utils/routerUtil.js +18 -5
  130. package/tests/unit/ReportTable.spec.js +15 -15
  131. package/vue.config.js +153 -152
  132. package/webpack.config.js +12 -0
  133. package/src/index.js +0 -29
  134. package/src/router/config.js +0 -23
@@ -1,360 +1,360 @@
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
- <a-spin :spinning="loadUserFilesDetails">
10
- <a-page-header
11
- :title="'表号:' + details.f_meternumber"
12
- >
13
- <div class="row">
14
- <div class="content">
15
- <a-descriptions size="small" :column="isMobile ? 1 : 2">
16
- <a-descriptions-item label="表编号">{{ details.id }}</a-descriptions-item>
17
- <a-descriptions-item label="用户编号">{{ details.f_userinfo_id }}</a-descriptions-item>
18
- <a-descriptions-item label="余额">{{ details.f_balance_amount }}</a-descriptions-item>
19
- <a-descriptions-item label="网络购气次数">{{ details.f_iot_times }}</a-descriptions-item>
20
- <a-descriptions-item label="总购金额">{{ details.f_total_fee }}</a-descriptions-item>
21
- <a-descriptions-item label="总购气量">{{ details.f_total_gas }}</a-descriptions-item>
22
- <a-descriptions-item label="气表品牌别名">{{ details.f_alias }}</a-descriptions-item>
23
- </a-descriptions>
24
- </div>
25
- <div class="extra">
26
- <a-row class="status-list">
27
- <a-col :xs="12" :sm="24">
28
- <div class="text">开户状态</div>
29
- <div class="heading">
30
- <x-badge :value="details.f_sendsuccess" badge-key="openAccountStateMap" :is-external-text="true"/>
31
- </div>
32
- </a-col>
33
- </a-row>
34
- <p></p>
35
- <a-row class="status-list">
36
- <a-col :xs="12" :sm="24">
37
- <div class="text">表档案状态</div>
38
- <div class="heading">
39
- <x-badge :value="details.f_table_state" badge-key="tableStateMap" :is-external-text="true"/>
40
- </div>
41
- </a-col>
42
- </a-row>
43
- </div>
44
- </div>
45
- <!-- actions -->
46
- <template v-slot:extra>
47
- <a-button-group style="margin-right: 4px;">
48
- <a-button type="dashed" @click="initView" :loading="loadUserFilesDetails">刷新</a-button>
49
- </a-button-group>
50
- <a-button-group style="margin-right: 4px;">
51
- <a-popover title="重新开户" placement="bottomLeft">
52
- <template slot="content">
53
- <p>将档案标记为未开户状态</p>
54
- <p>指令将在 定时器轮询/表具上报 后重新生成</p>
55
- <p style="color: red">此操作不可撤销</p>
56
- </template>
57
- <a-button type="primary" class="business" @click="againOpenAccount(details.id,selectOrgName)" :disabled="againOpenAccountBtnHide()">重新开户</a-button>
58
- </a-popover>
59
- <a-popover title="开阀" placement="bottomLeft">
60
- <template slot="content">
61
- <p>对表具生成<span style="color: red;font-weight: bold">开阀</span>指令</p>
62
- <p>只有已经开户的表具才可以进行该操作</p>
63
- <p>操作后,可以在指令维护界面取消发送</p>
64
- </template>
65
- <a-button type="primary" @click="saveValveControl(details.id,selectOrgName,1,details.f_alias)" :disabled="saveValveControlBtnHide()">开阀</a-button>
66
- </a-popover>
67
- <a-popover title="关阀" placement="bottomLeft">
68
- <template slot="content">
69
- <p>对表具生成<span style="color: red;font-weight: bold">关阀</span>指令,请谨慎操作</p>
70
- <p>只有已经开户的表具才可以进行该操作</p>
71
- <p>操作后,可以在指令维护界面取消发送</p>
72
- </template>
73
- <a-button type="danger" @click="saveValveControl(details.id,selectOrgName,0,details.f_alias)" :disabled="saveValveControlBtnHide()">关阀</a-button>
74
- </a-popover>
75
- </a-button-group>
76
- </template>
77
- <template slot="footer">
78
- <a-tabs :default-active-key="tabActiveKey" :activeKey="tabActiveKey" @change="handleTabChange" style="margin-bottom: 23px;">
79
- <template v-for="value in tabList">
80
- <a-tab-pane :key="value.key" :tab="value.tab"/>
81
- </template>
82
- </a-tabs>
83
- <meter-details-main :userid="userid" :select-org-name="selectOrgName" :details="details" v-if="tabActiveKey === '1'"/>
84
- <meter-details-count :userid="userid" :select-org-name="selectOrgName" v-else-if="tabActiveKey === '2'"/>
85
- <meter-details-sell-gas :userid="userid" :select-org-name="selectOrgName" v-else-if="tabActiveKey === '3'"/>
86
- <meter-details-hand-plan :userid="userid" :select-org-name="selectOrgName" v-else-if="tabActiveKey === '4'"/>
87
- <meter-details-exception :userid="userid" :select-org-name="selectOrgName" v-else-if="tabActiveKey === '5'"/>
88
- <meter-details-instruct :userid="userid" :select-org-name="selectOrgName" v-else-if="tabActiveKey === '6'"/>
89
- </template>
90
- </a-page-header>
91
- </a-spin>
92
- </a-drawer>
93
- </template>
94
-
95
- <script>
96
- import { MeterDetailsMain, MeterDetailsCount, MeterDetailsHandPlan,
97
- MeterDetailsSellGas, MeterDetailsException, MeterDetailsInstruct } from '@/base-client/components/iot/MeterDetailsView/part'
98
- import { MeterDetailsViewApi } from '@/services/api/MeterDetailsViewApi'
99
- import { post } from '@/services/api/restTools'
100
- import { mapState } from 'vuex'
101
-
102
- export default {
103
- name: 'MeterDetailsView',
104
- components: {
105
- MeterDetailsMain,
106
- MeterDetailsCount,
107
- MeterDetailsHandPlan,
108
- MeterDetailsSellGas,
109
- MeterDetailsException,
110
- MeterDetailsInstruct
111
- },
112
- data () {
113
- return {
114
- // 页面宽度
115
- screenWidth: document.documentElement.clientWidth,
116
- // Tab页签
117
- tabActiveKey: '1',
118
- // 档案详情
119
- details: {
120
- id: 0,
121
- f_userinfo_id: 0,
122
- f_meternumber: '',
123
- f_balance_amount: 0,
124
- f_meter_base: 0,
125
- f_times: 0,
126
- f_total_fee: 0,
127
- f_total_gas: 0,
128
- f_table_state: '正常',
129
- f_alias: '',
130
- f_sendsuccess: '未同步',
131
- f_meter_brand: '',
132
- f_meter_type: '',
133
- f_meter_style: '',
134
- f_type: ''
135
- },
136
- tabList: [
137
- { key: '1', tab: '基础' },
138
- { key: '2', tab: '统计' },
139
- { key: '3', tab: '充值' },
140
- { key: '4', tab: '抄表' },
141
- { key: '5', tab: '异常' },
142
- { key: '6', tab: '指令' }
143
- ],
144
- // 档案详情加载
145
- loadUserFilesDetails: true
146
- }
147
- },
148
- mounted () {
149
- this.initView()
150
- },
151
- computed: {
152
- ...mapState('account', { currUser: 'user' }),
153
- ...mapState('setting', ['isMobile'])
154
- },
155
- props: {
156
- userid: {
157
- type: String,
158
- required: true
159
- },
160
- selectOrgName: {
161
- type: String,
162
- required: true
163
- },
164
- visible: {
165
- type: Boolean,
166
- default: false
167
- }
168
- },
169
- methods: {
170
- // 初始化组件
171
- initView () {
172
- this.tabActiveKey = '1'
173
- this.getUserFiles(this.userid, this.selectOrgName)
174
- },
175
- onClose () {
176
- this.$emit('update:visible', false)
177
- },
178
- // 通用徽标过滤器
179
- badgeFilter (key, value) {
180
- const object = this.$appdata.getParam(key)
181
- if (object.hasOwnProperty(value)) {
182
- return object[value]
183
- } else {
184
- return {
185
- 'status': 'default',
186
- 'text': '未知类型:' + value
187
- }
188
- }
189
- },
190
- // 获取档案详情信息
191
- getUserFiles (userId, selectOrgName) {
192
- this.loadUserFilesDetails = true
193
- return post(MeterDetailsViewApi.getUserFilesDetails, {
194
- id: userId,
195
- orgName: selectOrgName
196
- })
197
- .then(res => {
198
- if (res.f_sendsuccess === undefined) {
199
- res.f_sendsuccess = '未同步'
200
- }
201
- this.details = res
202
- this.loadUserFilesDetails = false
203
- }, err => {
204
- this.loadUserFilesDetails = false
205
- console.error(err)
206
- })
207
- },
208
- // Tab切换
209
- handleTabChange (key) {
210
- this.tabActiveKey = key
211
- },
212
- // 重新开户
213
- againOpenAccount (id, selectOrgName) {
214
- const _this = this
215
- this.$confirm({
216
- title: '您确定要对档案进行重新开户吗?',
217
- content: '将会在一段时间内重新生成开户指令',
218
- okText: '确定',
219
- okType: 'danger',
220
- cancelText: '取消',
221
- onOk () {
222
- return post(MeterDetailsViewApi.againOpenAccount, {
223
- id: id,
224
- orgName: selectOrgName,
225
- username: _this.currUser.username
226
- }).then(res => {
227
- _this.getUserFiles(id, selectOrgName)
228
- if (res.nums === 1) {
229
- _this.$message.success('操作成功')
230
- } else {
231
- _this.$message.error('操作失败')
232
- }
233
- })
234
- }
235
- })
236
- },
237
- // 开关阀
238
- saveValveControl (id, selectOrgName, isOpen, alias) {
239
- const _this = this
240
- let type
241
- if (isOpen === 1) {
242
- type = '开阀'
243
- } else {
244
- type = '关阀'
245
- }
246
- this.$confirm({
247
- title: '您确定要对档案生成' + type + '指令吗?',
248
- content: '生成指令后,可以在指令维护界面查看和操作',
249
- okText: '确定',
250
- okType: 'danger',
251
- cancelText: '取消',
252
- onOk () {
253
- return post(MeterDetailsViewApi.saveValveControl, {
254
- id: id,
255
- orgName: selectOrgName,
256
- isOpenValue: isOpen,
257
- aliasValue: alias,
258
- username: _this.currUser.username
259
- }).then(res => {
260
- _this.getUserFiles(id, selectOrgName)
261
- if (res.nums > 0) {
262
- _this.$message.success('生成成功')
263
- } else {
264
- _this.$message.error('生成失败')
265
- }
266
- })
267
- }
268
- })
269
- },
270
- // 控制重新开户按钮的显示
271
- againOpenAccountBtnHide () {
272
- return this.details.f_sendsuccess === '未同步' || this.details.f_table_state !== '正常'
273
- },
274
- // 控制开关阀按钮的显示
275
- saveValveControlBtnHide () {
276
- return this.details.f_sendsuccess !== '成功' || this.details.f_table_state !== '正常'
277
- }
278
- },
279
- watch: {
280
- 'visible' (val) {
281
- if (val) {
282
- this.initView()
283
- }
284
- }
285
- }
286
- }
287
- </script>
288
-
289
- <style lang="less" scoped>
290
- .business {
291
- color: #ffffff;
292
- }
293
- .business:enabled:hover {
294
- background-color: #85CE61 !important;
295
- border-color: #85CE61 !important;
296
- }
297
- .business:enabled {
298
- background-color: #67c23a;
299
- border-color: #67c23a;
300
- }
301
- .business:disabled {
302
- color: rgba(0, 0, 0, 0.25);
303
- }
304
- .detail-layout {
305
- margin-left: 44px;
306
- }
307
- .text {
308
- color: rgba(0, 0, 0, .45);
309
- }
310
-
311
- .heading {
312
- color: rgba(0, 0, 0, .85);
313
- font-size: 20px;
314
- }
315
-
316
- .no-data {
317
- color: rgba(0, 0, 0, .25);
318
- text-align: center;
319
- line-height: 64px;
320
- font-size: 16px;
321
-
322
- i {
323
- font-size: 24px;
324
- margin-right: 16px;
325
- position: relative;
326
- top: 3px;
327
- }
328
- }
329
-
330
- .mobile {
331
- .detail-layout {
332
- margin-left: unset;
333
- }
334
- .text {
335
-
336
- }
337
- .status-list {
338
- text-align: left;
339
- }
340
- }
341
-
342
- .row {
343
- display: flex;
344
-
345
- .content {
346
- -webkit-box-flex: 1;
347
- flex: auto;
348
- -ms-flex: auto;
349
- }
350
-
351
- .extra {
352
- flex: 0 1 auto;
353
- -webkit-box-flex: 0;
354
- -ms-flex: 0 1 auto;
355
- min-width: 242px;
356
- margin-left: 88px;
357
- text-align: right;
358
- }
359
- }
360
- </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
+ <a-spin :spinning="loadUserFilesDetails">
10
+ <a-page-header
11
+ :title="'表号:' + details.f_meternumber"
12
+ >
13
+ <div class="row">
14
+ <div class="content">
15
+ <a-descriptions size="small" :column="isMobile ? 1 : 2">
16
+ <a-descriptions-item label="表编号">{{ details.id }}</a-descriptions-item>
17
+ <a-descriptions-item label="用户编号">{{ details.f_userinfo_id }}</a-descriptions-item>
18
+ <a-descriptions-item label="余额">{{ details.f_balance_amount }}</a-descriptions-item>
19
+ <a-descriptions-item label="网络购气次数">{{ details.f_iot_times }}</a-descriptions-item>
20
+ <a-descriptions-item label="总购金额">{{ details.f_total_fee }}</a-descriptions-item>
21
+ <a-descriptions-item label="总购气量">{{ details.f_total_gas }}</a-descriptions-item>
22
+ <a-descriptions-item label="气表品牌别名">{{ details.f_alias }}</a-descriptions-item>
23
+ </a-descriptions>
24
+ </div>
25
+ <div class="extra">
26
+ <a-row class="status-list">
27
+ <a-col :xs="12" :sm="24">
28
+ <div class="text">开户状态</div>
29
+ <div class="heading">
30
+ <x-badge :value="details.f_sendsuccess" badge-key="openAccountStateMap" :is-external-text="true"/>
31
+ </div>
32
+ </a-col>
33
+ </a-row>
34
+ <p></p>
35
+ <a-row class="status-list">
36
+ <a-col :xs="12" :sm="24">
37
+ <div class="text">表档案状态</div>
38
+ <div class="heading">
39
+ <x-badge :value="details.f_table_state" badge-key="tableStateMap" :is-external-text="true"/>
40
+ </div>
41
+ </a-col>
42
+ </a-row>
43
+ </div>
44
+ </div>
45
+ <!-- actions -->
46
+ <template v-slot:extra>
47
+ <a-button-group style="margin-right: 4px;">
48
+ <a-button type="dashed" @click="initView" :loading="loadUserFilesDetails">刷新</a-button>
49
+ </a-button-group>
50
+ <a-button-group style="margin-right: 4px;">
51
+ <a-popover title="重新开户" placement="bottomLeft">
52
+ <template slot="content">
53
+ <p>将档案标记为未开户状态</p>
54
+ <p>指令将在 定时器轮询/表具上报 后重新生成</p>
55
+ <p style="color: red">此操作不可撤销</p>
56
+ </template>
57
+ <a-button type="primary" class="business" @click="againOpenAccount(details.id,selectOrgName)" :disabled="againOpenAccountBtnHide()">重新开户</a-button>
58
+ </a-popover>
59
+ <a-popover title="开阀" placement="bottomLeft">
60
+ <template slot="content">
61
+ <p>对表具生成<span style="color: red;font-weight: bold">开阀</span>指令</p>
62
+ <p>只有已经开户的表具才可以进行该操作</p>
63
+ <p>操作后,可以在指令维护界面取消发送</p>
64
+ </template>
65
+ <a-button type="primary" @click="saveValveControl(details.id,selectOrgName,1,details.f_alias)" :disabled="saveValveControlBtnHide()">开阀</a-button>
66
+ </a-popover>
67
+ <a-popover title="关阀" placement="bottomLeft">
68
+ <template slot="content">
69
+ <p>对表具生成<span style="color: red;font-weight: bold">关阀</span>指令,请谨慎操作</p>
70
+ <p>只有已经开户的表具才可以进行该操作</p>
71
+ <p>操作后,可以在指令维护界面取消发送</p>
72
+ </template>
73
+ <a-button type="danger" @click="saveValveControl(details.id,selectOrgName,0,details.f_alias)" :disabled="saveValveControlBtnHide()">关阀</a-button>
74
+ </a-popover>
75
+ </a-button-group>
76
+ </template>
77
+ <template slot="footer">
78
+ <a-tabs :default-active-key="tabActiveKey" :activeKey="tabActiveKey" @change="handleTabChange" style="margin-bottom: 23px;">
79
+ <template v-for="value in tabList">
80
+ <a-tab-pane :key="value.key" :tab="value.tab"/>
81
+ </template>
82
+ </a-tabs>
83
+ <meter-details-main :userid="userid" :select-org-name="selectOrgName" :details="details" v-if="tabActiveKey === '1'"/>
84
+ <meter-details-count :userid="userid" :select-org-name="selectOrgName" v-else-if="tabActiveKey === '2'"/>
85
+ <meter-details-sell-gas :userid="userid" :select-org-name="selectOrgName" v-else-if="tabActiveKey === '3'"/>
86
+ <meter-details-hand-plan :userid="userid" :select-org-name="selectOrgName" v-else-if="tabActiveKey === '4'"/>
87
+ <meter-details-exception :userid="userid" :select-org-name="selectOrgName" v-else-if="tabActiveKey === '5'"/>
88
+ <meter-details-instruct :userid="userid" :select-org-name="selectOrgName" v-else-if="tabActiveKey === '6'"/>
89
+ </template>
90
+ </a-page-header>
91
+ </a-spin>
92
+ </a-drawer>
93
+ </template>
94
+
95
+ <script>
96
+ import { MeterDetailsMain, MeterDetailsCount, MeterDetailsHandPlan,
97
+ MeterDetailsSellGas, MeterDetailsException, MeterDetailsInstruct } from '@vue2-client/base-client/components/iot/MeterDetailsView/part'
98
+ import { MeterDetailsViewApi } from '@vue2-client/services/api/MeterDetailsViewApi'
99
+ import { post } from '@vue2-client/services/api/restTools'
100
+ import { mapState } from 'vuex'
101
+
102
+ export default {
103
+ name: 'MeterDetailsView',
104
+ components: {
105
+ MeterDetailsMain,
106
+ MeterDetailsCount,
107
+ MeterDetailsHandPlan,
108
+ MeterDetailsSellGas,
109
+ MeterDetailsException,
110
+ MeterDetailsInstruct
111
+ },
112
+ data () {
113
+ return {
114
+ // 页面宽度
115
+ screenWidth: document.documentElement.clientWidth,
116
+ // Tab页签
117
+ tabActiveKey: '1',
118
+ // 档案详情
119
+ details: {
120
+ id: 0,
121
+ f_userinfo_id: 0,
122
+ f_meternumber: '',
123
+ f_balance_amount: 0,
124
+ f_meter_base: 0,
125
+ f_times: 0,
126
+ f_total_fee: 0,
127
+ f_total_gas: 0,
128
+ f_table_state: '正常',
129
+ f_alias: '',
130
+ f_sendsuccess: '未同步',
131
+ f_meter_brand: '',
132
+ f_meter_type: '',
133
+ f_meter_style: '',
134
+ f_type: ''
135
+ },
136
+ tabList: [
137
+ { key: '1', tab: '基础' },
138
+ { key: '2', tab: '统计' },
139
+ { key: '3', tab: '充值' },
140
+ { key: '4', tab: '抄表' },
141
+ { key: '5', tab: '异常' },
142
+ { key: '6', tab: '指令' }
143
+ ],
144
+ // 档案详情加载
145
+ loadUserFilesDetails: true
146
+ }
147
+ },
148
+ mounted () {
149
+ this.initView()
150
+ },
151
+ computed: {
152
+ ...mapState('account', { currUser: 'user' }),
153
+ ...mapState('setting', ['isMobile'])
154
+ },
155
+ props: {
156
+ userid: {
157
+ type: String,
158
+ required: true
159
+ },
160
+ selectOrgName: {
161
+ type: String,
162
+ required: true
163
+ },
164
+ visible: {
165
+ type: Boolean,
166
+ default: false
167
+ }
168
+ },
169
+ methods: {
170
+ // 初始化组件
171
+ initView () {
172
+ this.tabActiveKey = '1'
173
+ this.getUserFiles(this.userid, this.selectOrgName)
174
+ },
175
+ onClose () {
176
+ this.$emit('update:visible', false)
177
+ },
178
+ // 通用徽标过滤器
179
+ badgeFilter (key, value) {
180
+ const object = this.$appdata.getParam(key)
181
+ if (object.hasOwnProperty(value)) {
182
+ return object[value]
183
+ } else {
184
+ return {
185
+ 'status': 'default',
186
+ 'text': '未知类型:' + value
187
+ }
188
+ }
189
+ },
190
+ // 获取档案详情信息
191
+ getUserFiles (userId, selectOrgName) {
192
+ this.loadUserFilesDetails = true
193
+ return post(MeterDetailsViewApi.getUserFilesDetails, {
194
+ id: userId,
195
+ orgName: selectOrgName
196
+ })
197
+ .then(res => {
198
+ if (res.f_sendsuccess === undefined) {
199
+ res.f_sendsuccess = '未同步'
200
+ }
201
+ this.details = res
202
+ this.loadUserFilesDetails = false
203
+ }, err => {
204
+ this.loadUserFilesDetails = false
205
+ console.error(err)
206
+ })
207
+ },
208
+ // Tab切换
209
+ handleTabChange (key) {
210
+ this.tabActiveKey = key
211
+ },
212
+ // 重新开户
213
+ againOpenAccount (id, selectOrgName) {
214
+ const _this = this
215
+ this.$confirm({
216
+ title: '您确定要对档案进行重新开户吗?',
217
+ content: '将会在一段时间内重新生成开户指令',
218
+ okText: '确定',
219
+ okType: 'danger',
220
+ cancelText: '取消',
221
+ onOk () {
222
+ return post(MeterDetailsViewApi.againOpenAccount, {
223
+ id: id,
224
+ orgName: selectOrgName,
225
+ username: _this.currUser.username
226
+ }).then(res => {
227
+ _this.getUserFiles(id, selectOrgName)
228
+ if (res.nums === 1) {
229
+ _this.$message.success('操作成功')
230
+ } else {
231
+ _this.$message.error('操作失败')
232
+ }
233
+ })
234
+ }
235
+ })
236
+ },
237
+ // 开关阀
238
+ saveValveControl (id, selectOrgName, isOpen, alias) {
239
+ const _this = this
240
+ let type
241
+ if (isOpen === 1) {
242
+ type = '开阀'
243
+ } else {
244
+ type = '关阀'
245
+ }
246
+ this.$confirm({
247
+ title: '您确定要对档案生成' + type + '指令吗?',
248
+ content: '生成指令后,可以在指令维护界面查看和操作',
249
+ okText: '确定',
250
+ okType: 'danger',
251
+ cancelText: '取消',
252
+ onOk () {
253
+ return post(MeterDetailsViewApi.saveValveControl, {
254
+ id: id,
255
+ orgName: selectOrgName,
256
+ isOpenValue: isOpen,
257
+ aliasValue: alias,
258
+ username: _this.currUser.username
259
+ }).then(res => {
260
+ _this.getUserFiles(id, selectOrgName)
261
+ if (res.nums > 0) {
262
+ _this.$message.success('生成成功')
263
+ } else {
264
+ _this.$message.error('生成失败')
265
+ }
266
+ })
267
+ }
268
+ })
269
+ },
270
+ // 控制重新开户按钮的显示
271
+ againOpenAccountBtnHide () {
272
+ return this.details.f_sendsuccess === '未同步' || this.details.f_table_state !== '正常'
273
+ },
274
+ // 控制开关阀按钮的显示
275
+ saveValveControlBtnHide () {
276
+ return this.details.f_sendsuccess !== '成功' || this.details.f_table_state !== '正常'
277
+ }
278
+ },
279
+ watch: {
280
+ 'visible' (val) {
281
+ if (val) {
282
+ this.initView()
283
+ }
284
+ }
285
+ }
286
+ }
287
+ </script>
288
+
289
+ <style lang="less" scoped>
290
+ .business {
291
+ color: #ffffff;
292
+ }
293
+ .business:enabled:hover {
294
+ background-color: #85CE61 !important;
295
+ border-color: #85CE61 !important;
296
+ }
297
+ .business:enabled {
298
+ background-color: #67c23a;
299
+ border-color: #67c23a;
300
+ }
301
+ .business:disabled {
302
+ color: rgba(0, 0, 0, 0.25);
303
+ }
304
+ .detail-layout {
305
+ margin-left: 44px;
306
+ }
307
+ .text {
308
+ color: rgba(0, 0, 0, .45);
309
+ }
310
+
311
+ .heading {
312
+ color: rgba(0, 0, 0, .85);
313
+ font-size: 20px;
314
+ }
315
+
316
+ .no-data {
317
+ color: rgba(0, 0, 0, .25);
318
+ text-align: center;
319
+ line-height: 64px;
320
+ font-size: 16px;
321
+
322
+ i {
323
+ font-size: 24px;
324
+ margin-right: 16px;
325
+ position: relative;
326
+ top: 3px;
327
+ }
328
+ }
329
+
330
+ .mobile {
331
+ .detail-layout {
332
+ margin-left: unset;
333
+ }
334
+ .text {
335
+
336
+ }
337
+ .status-list {
338
+ text-align: left;
339
+ }
340
+ }
341
+
342
+ .row {
343
+ display: flex;
344
+
345
+ .content {
346
+ -webkit-box-flex: 1;
347
+ flex: auto;
348
+ -ms-flex: auto;
349
+ }
350
+
351
+ .extra {
352
+ flex: 0 1 auto;
353
+ -webkit-box-flex: 0;
354
+ -ms-flex: 0 1 auto;
355
+ min-width: 242px;
356
+ margin-left: 88px;
357
+ text-align: right;
358
+ }
359
+ }
360
+ </style>