manage-client 4.1.141 → 4.1.143

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.
@@ -6,8 +6,8 @@ const proxyMiddleware = require('http-proxy-middleware')
6
6
  const app = express()
7
7
  const compiler = webpack(config)
8
8
 
9
- const server = 'http://192.168.50.67:31567/'
10
- const local = 'http://127.0.0.1:9026/'
9
+ const server = 'http://121.36.106.17:31467/'
10
+ const local = 'http://121.36.106.17:31467/'
11
11
  const proxyTable = {
12
12
  '/rs/logic/exportfile': {
13
13
  target: server
@@ -16,21 +16,21 @@ const proxyTable = {
16
16
  target: server
17
17
  },
18
18
  '/api/af-revenue/sql/': {
19
- pathRewrite: {
20
- '^/api/af-revenue': '/'
21
- },
19
+ // pathRewrite: {
20
+ // '^/api/af-revenue': '/'
21
+ // },
22
22
  target: local
23
23
  },
24
24
  '/api/af-revenue/report/': {
25
- pathRewrite: {
26
- '^/api/af-revenue': '/'
27
- },
25
+ // pathRewrite: {
26
+ // '^/api/af-revenue': '/'
27
+ // },
28
28
  target: local
29
29
  },
30
30
  '/api/af-revenue/logic': {
31
- pathRewrite: {
32
- '^/api/af-revenue': '/'
33
- },
31
+ // pathRewrite: {
32
+ // '^/api/af-revenue': '/'
33
+ // },
34
34
  target: local
35
35
  },
36
36
  '/api': {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "manage-client",
3
- "version": "4.1.141",
3
+ "version": "4.1.143",
4
4
  "description": "经营管控模块前台组件",
5
5
  "main": "src/index.js",
6
6
  "directories": {
@@ -132,10 +132,28 @@
132
132
  <button class="button_clear" @click="cancel()">取消</button>
133
133
  </footer>
134
134
  </modal>
135
+ <modal :show.sync="signatureModalShow" large backdrop="false" width="50%">
136
+ <header slot="modal-header" class="modal-header" style="text-align: center">
137
+ <h4 class="modal-title">业务员签名</h4>
138
+ </header>
139
+ <article slot="modal-body" class="modal-body">
140
+ <div style="text-align:center">
141
+ <canvas v-ref:signCanvas data-sign-canvas="true"
142
+ style="border:1px solid #ccc; background:#fff; width:600px; height:300px; touch-action:none;">
143
+ </canvas>
144
+ </div>
145
+ </article>
146
+ <footer slot="modal-footer" class="modal-footer">
147
+ <button type="button" class="button_clear" @click="clearSignatureCanvas()">清除</button>
148
+ <button type="button" class="button_search" @click="saveSignatureAndSubmit()" :disabled="signatureUploadInProgress">保存并提交</button>
149
+ <button type="button" class="button_clear" @click="signatureModalShow=false">取消</button>
150
+ </footer>
151
+ </modal>
135
152
  </div>
136
153
  </template>
137
154
 
138
155
  <script>
156
+ import Vue from 'vue'
139
157
  import {DataModel} from 'vue-client'
140
158
  import co from 'co'
141
159
 
@@ -174,6 +192,16 @@ export default {
174
192
  },
175
193
  pushAuditData: {},
176
194
  pushAuditShow: false,
195
+ signatureModalShow: false,
196
+ signatureData: '',
197
+ signatureDrawn: false,
198
+ signatureUploadInProgress: false,
199
+ signing: false,
200
+ signLastX: 0,
201
+ signLastY: 0,
202
+ signDPR: 1,
203
+ signCanvasContext: null,
204
+ signatureCanvas: null,
177
205
  config: {
178
206
  hasAudit: false
179
207
  }
@@ -189,10 +217,21 @@ export default {
189
217
  },
190
218
  methods: {
191
219
  auditConfirm () {
220
+ // If no signature yet, require the reviewer to sign first
221
+ if (!this.pushAuditData.f_audit_person) {
222
+ this.$showMessage('请选择审核人')
223
+ return
224
+ }
225
+ if (!this.pushAuditData.signature) {
226
+ this.signatureModalShow = true
227
+ return
228
+ }
229
+
192
230
  const param = {
193
231
  f_type: '收费结账报表',
194
232
  f_requestparam: this.model.data,
195
233
  f_audit_person: this.pushAuditData.f_audit_person,
234
+ f_signature: this.pushAuditData.signature,
196
235
  f_otherparam: this.pushAuditData,
197
236
  f_operator: this.$login.f.name,
198
237
  f_operatorid: this.$login.f.id,
@@ -210,8 +249,286 @@ export default {
210
249
  }).then((res) => {
211
250
  this.pushAuditShow = false
212
251
  this.pushAuditData.f_audit_person = ''
252
+ this.pushAuditData.signature = ''
253
+ })
254
+ },
255
+ initSignCanvas () {
256
+ this.$nextTick(() => {
257
+ let canvas = this.$refs.signCanvas
258
+ if (!canvas) {
259
+ canvas = this.$el.querySelector('canvas[data-sign-canvas]') || document.querySelector('canvas[data-sign-canvas]')
260
+
261
+ }
262
+ const desiredW = 600
263
+ const desiredH = 300
264
+ canvas.width = desiredW
265
+ canvas.height = desiredH
266
+ canvas.style.width = desiredW + 'px'
267
+ canvas.style.height = desiredH + 'px'
268
+ const ctx = canvas.getContext('2d')
269
+ ctx.setTransform(1, 0, 0, 1, 0, 0)
270
+ ctx.fillStyle = '#fff'
271
+ ctx.fillRect(0, 0, desiredW, desiredH)
272
+ ctx.strokeStyle = '#000'
273
+ ctx.lineWidth = 2
274
+ ctx.lineCap = 'round'
275
+ ctx.lineJoin = 'round'
276
+ this.signCanvasContext = ctx
277
+ this.signing = false
278
+ this.signatureDrawn = false
279
+ this.destroySignCanvasListeners()
280
+ const getPoint = (event) => {
281
+ const rect = canvas.getBoundingClientRect()
282
+ let clientX = event.clientX
283
+ let clientY = event.clientY
284
+ if (event.touches && event.touches.length) {
285
+ clientX = event.touches[0].clientX
286
+ clientY = event.touches[0].clientY
287
+ } else if (event.changedTouches && event.changedTouches.length) {
288
+ clientX = event.changedTouches[0].clientX
289
+ clientY = event.changedTouches[0].clientY
290
+ }
291
+ if (clientX == null || clientY == null) return null
292
+ const x = (clientX - rect.left) * (canvas.width / rect.width)
293
+ const y = (clientY - rect.top) * (canvas.height / rect.height)
294
+ return { x, y }
295
+ }
296
+
297
+ const onStart = (event) => {
298
+ event.preventDefault()
299
+ const point = getPoint(event)
300
+ if (!point) return
301
+ this.signing = true
302
+ this.signatureDrawn = true
303
+ this.signLastX = point.x
304
+ this.signLastY = point.y
305
+ }
306
+ const onMove = (event) => {
307
+ if (!this.signing) return
308
+ event.preventDefault()
309
+ const point = getPoint(event)
310
+ if (!point) return
311
+ const ctx2 = this.signCanvasContext
312
+ ctx2.beginPath()
313
+ ctx2.moveTo(this.signLastX, this.signLastY)
314
+ ctx2.lineTo(point.x, point.y)
315
+ ctx2.stroke()
316
+ this.signLastX = point.x
317
+ this.signLastY = point.y
318
+ }
319
+ const onEnd = (event) => {
320
+ if (this.signing) {
321
+ event.preventDefault()
322
+ }
323
+ this.signing = false
324
+ }
325
+ canvas.addEventListener('mousedown', onStart)
326
+ canvas.addEventListener('mousemove', onMove)
327
+ canvas.addEventListener('mouseup', onEnd)
328
+ canvas.addEventListener('mouseleave', onEnd)
329
+ canvas.addEventListener('touchstart', onStart, {passive:false})
330
+ canvas.addEventListener('touchmove', onMove, {passive:false})
331
+ canvas.addEventListener('touchend', onEnd)
332
+ canvas.addEventListener('touchcancel', onEnd)
333
+
334
+ this._signCanvasListeners = { canvas, onStart, onMove, onEnd }
335
+ this.signatureCanvas = canvas
336
+ })
337
+ },
338
+ destroySignCanvasListeners () {
339
+ if (!this._signCanvasListeners) return
340
+ const { canvas, onStart, onMove, onEnd } = this._signCanvasListeners
341
+ canvas.removeEventListener('mousedown', onStart)
342
+ canvas.removeEventListener('mousemove', onMove)
343
+ canvas.removeEventListener('mouseup', onEnd)
344
+ canvas.removeEventListener('mouseleave', onEnd)
345
+ canvas.removeEventListener('touchstart', onStart)
346
+ canvas.removeEventListener('touchmove', onMove)
347
+ canvas.removeEventListener('touchend', onEnd)
348
+ canvas.removeEventListener('touchcancel', onEnd)
349
+ this._signCanvasListeners = null
350
+ this.signatureCanvas = null
351
+ },
352
+ getSignCanvasElement () {
353
+ return this.$refs.signCanvas || this.signatureCanvas || this.$el.querySelector('canvas[data-sign-canvas]') || document.querySelector('canvas[data-sign-canvas]')
354
+ },
355
+ getSignPoint (event) {
356
+ const canvas = this.getSignCanvasElement()
357
+ if (!canvas) return null
358
+ const rect = canvas.getBoundingClientRect()
359
+ let clientX = event.clientX
360
+ let clientY = event.clientY
361
+
362
+ if (event.touches && event.touches.length) {
363
+ clientX = event.touches[0].clientX
364
+ clientY = event.touches[0].clientY
365
+ } else if (event.changedTouches && event.changedTouches.length) {
366
+ clientX = event.changedTouches[0].clientX
367
+ clientY = event.changedTouches[0].clientY
368
+ }
369
+
370
+ if (clientX == null || clientY == null) return null
371
+
372
+ // Use offset within canvas bounding box
373
+ const x = (clientX - rect.left) * (canvas.width / rect.width)
374
+ const y = (clientY - rect.top) * (canvas.height / rect.height)
375
+ return { x, y }
376
+ },
377
+ signStart (event) {
378
+ // legacy support: keep method but not used by native listeners
379
+ if (!this.signCanvasContext) return
380
+ const point = this.getSignPoint(event)
381
+ if (!point) return
382
+ this.signing = true
383
+ this.signatureDrawn = true
384
+ this.signLastX = point.x
385
+ this.signLastY = point.y
386
+ },
387
+ signMove (event) {
388
+ if (!this.signing || !this.signCanvasContext) return
389
+ const point = this.getSignPoint(event)
390
+ if (!point) return
391
+ const ctx = this.signCanvasContext
392
+ ctx.beginPath()
393
+ ctx.moveTo(this.signLastX, this.signLastY)
394
+ ctx.lineTo(point.x, point.y)
395
+ ctx.stroke()
396
+ this.signLastX = point.x
397
+ this.signLastY = point.y
398
+ },
399
+ signEnd () {
400
+ this.signing = false
401
+ },
402
+ clearSignatureCanvas () {
403
+ const canvas = this.getSignCanvasElement()
404
+ const ctx = this.signCanvasContext || (canvas ? canvas.getContext('2d') : null)
405
+ if (!canvas || !ctx) {
406
+ return
407
+ }
408
+
409
+ const desiredW = 600
410
+ const desiredH = 300
411
+ ctx.setTransform(1, 0, 0, 1, 0, 0)
412
+ ctx.clearRect(0, 0, desiredW, desiredH)
413
+ ctx.fillStyle = '#fff'
414
+ ctx.fillRect(0, 0, desiredW, desiredH)
415
+ this.signatureDrawn = false
416
+ this.pushAuditData.signature = ''
417
+ },
418
+ getUploadPathFromResponse (res) {
419
+ return res && (res.id)
420
+ },
421
+ canvasToBlob (canvas) {
422
+ return new Promise((resolve, reject) => {
423
+ if (canvas.toBlob) {
424
+ canvas.toBlob((blob) => {
425
+ if (blob) {
426
+ resolve(blob)
427
+ } else {
428
+ reject(new Error('canvas toBlob returned null'))
429
+ }
430
+ }, 'image/png')
431
+ } else {
432
+ try {
433
+ const dataURL = canvas.toDataURL('image/png')
434
+ const byteString = atob(dataURL.split(',')[1])
435
+ const mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0]
436
+ const ab = new ArrayBuffer(byteString.length)
437
+ const ia = new Uint8Array(ab)
438
+ for (let i = 0; i < byteString.length; i++) {
439
+ ia[i] = byteString.charCodeAt(i)
440
+ }
441
+ resolve(new Blob([ab], { type: mimeString }))
442
+ } catch (err) {
443
+ reject(err)
444
+ }
445
+ }
446
+ })
447
+ },
448
+ uploadSignatureFile () {
449
+ return new Promise(async (resolve, reject) => {
450
+ const canvas = this.getSignCanvasElement()
451
+ if (!canvas) {
452
+ reject(new Error('签名画布未找到'))
453
+ return
454
+ }
455
+ let blob
456
+ try {
457
+ blob = await this.canvasToBlob(canvas)
458
+ } catch (err) {
459
+ reject(err)
460
+ return
461
+ }
462
+
463
+ const form = new FormData()
464
+ form.append('file', blob, 'signature.png')
465
+
466
+ const xhr = new XMLHttpRequest()
467
+ xhr.open('POST', 'api/af-revenue/file/uploadFile', true)
468
+ if (Vue.$login && Vue.$login.jwt) {
469
+ xhr.setRequestHeader('Authorization', 'Bearer ' + Vue.$login.jwtNew)
470
+ xhr.setRequestHeader('Token', Vue.$login.jwt)
471
+ }
472
+
473
+ xhr.onreadystatechange = function () {
474
+ if (xhr.readyState < 4) return
475
+ if (xhr.status < 400) {
476
+ try {
477
+ const res = JSON.parse(xhr.responseText)
478
+ const uploadPath = this.getUploadPathFromResponse(res)
479
+ if (!uploadPath) {
480
+ reject(new Error('上传成功但未返回有效路径'))
481
+ return
482
+ }
483
+ resolve(uploadPath)
484
+ } catch (err) {
485
+ reject(err)
486
+ }
487
+ } else {
488
+ let err
489
+ try {
490
+ err = JSON.parse(xhr.responseText)
491
+ } catch (parseErr) {
492
+ err = new Error(xhr.statusText || '签名上传失败')
493
+ }
494
+ reject(err)
495
+ }
496
+ }.bind(this)
497
+
498
+ xhr.onerror = function () {
499
+ reject(new Error('签名文件上传网络错误'))
500
+ }
501
+
502
+ xhr.send(form)
213
503
  })
214
504
  },
505
+ async saveSignatureAndSubmit () {
506
+ if (!this.signatureDrawn) {
507
+ if (this.$showMessage) this.$showMessage('请先签名')
508
+ return
509
+ }
510
+
511
+ const canvas = this.getSignCanvasElement()
512
+ if (!canvas) {
513
+ if (this.$showMessage) this.$showMessage('签名画布未找到,请重新打开签名弹窗')
514
+ return
515
+ }
516
+
517
+ if (this.signatureUploadInProgress) {
518
+ return
519
+ }
520
+ this.signatureUploadInProgress = true
521
+ try {
522
+ const uploadPath = await this.uploadSignatureFile()
523
+ this.pushAuditData.signature = uploadPath
524
+ this.signatureModalShow = false
525
+ this.auditConfirm()
526
+ } catch (err) {
527
+ if (this.$showMessage) this.$showMessage('签名上传失败,请重试')
528
+ } finally {
529
+ this.signatureUploadInProgress = false
530
+ }
531
+ },
215
532
  async getAuditor () {
216
533
  await this.$MagGetSaleParam.initinputtor()
217
534
  console.log('查询到的人员:', await this.$MagGetSaleParam.initinputtor())
@@ -221,6 +538,7 @@ export default {
221
538
  },
222
539
  cancel () {
223
540
  this.pushAuditShow = false
541
+ this.pushAuditData.signature = ''
224
542
  },
225
543
  pushAudit () {
226
544
  if (this.model.data === null || this.model.data === ' ') {
@@ -278,6 +596,15 @@ export default {
278
596
  }
279
597
  this.spans = len
280
598
  }
599
+ ,
600
+ signatureModalShow (val) {
601
+ console.log('[ManageBusSummary] signatureModalShow watcher', val)
602
+ if (val) {
603
+ this.initSignCanvas()
604
+ } else {
605
+ this.destroySignCanvasListeners()
606
+ }
607
+ }
281
608
  },
282
609
  computed: {
283
610
  charge_state () {
@@ -0,0 +1,383 @@
1
+ <template>
2
+ <div id="unit" class="flex-row">
3
+ <div class="basic-main" @keyup.enter="search">
4
+ <div class="flex">
5
+ <criteria-paged :model="model" v-ref:paged>
6
+ <criteria partial='criteria' @condition-changed='$parent.selfSearch' v-ref:cri>
7
+ <div novalidate class="form-horizontal select-overspread container-fluid auto" partial>
8
+ <div class="row">
9
+ <div class="col-sm-2 form-group">
10
+ <label class="font_normal_body">客户编号</label>
11
+ <input type="text" style="width:60%" class="input_search" v-model="model.f_userinfo_code"
12
+ condition="f_userinfo_code = '{}' " placeholder="客户编号">
13
+ </div>
14
+ <div class="col-sm-2 form-group">
15
+ <label class="font_normal_body">客户名称</label>
16
+ <input type="text" style="width:60%" class="input_search" v-model="model.f_user_name"
17
+ condition=" f_user_name like '%{}%'" placeholder='客户名称'>
18
+ </div>
19
+ <div class="col-sm-2 form-group">
20
+ <label class="font_normal_body">用户地址</label>
21
+ <input type="text" style="width:60%" class="input_search" v-model="model.f_address"
22
+ condition="f_address like '%{}%'" placeholder='客户地址'>
23
+ </div>
24
+ <!-- <div class="col-sm-2">-->
25
+ <!-- <label class="font_normal_body">组织机构</label>-->
26
+ <!-- <res-select :initresid="$parent.$parent.org"-->
27
+ <!-- style="width:60%"-->
28
+ <!-- @res-select="$parent.$parent.getorg"-->
29
+ <!-- restype='organization'>-->
30
+ <!-- </res-select>-->
31
+
32
+ <!-- </div>-->
33
+ <div class="col-sm-2 form-group">
34
+ <label class="font_normal_body">&emsp;公司&emsp;</label>
35
+ <right-tree @re-res="$parent.$parent.getorg"
36
+ :initresid='$parent.$parent.org'></right-tree>
37
+ </div>
38
+ <div class="span" style="float:right;">
39
+ <button class="button_search button_spacing" @click="search()">查询</button>
40
+ <button class="button_clear button_spacing" @click="$parent.$parent.clear()">清空</button>
41
+ <export-excel :data="$parent.$parent.getCondition" :footer="$parent.$parent.footer"
42
+ :field="$parent.$parent.getfield" :header="$parent.$parent.other"
43
+ sqlurl="api/af-revenue/logic/openapi/exportfile" sql-name="manage_getReportDataQuery" template-name='结算查询导出'
44
+ :choose-col="true"></export-excel>
45
+ <div style="float: right" class="button_spacing"
46
+ :class="{'button_shrink_top':$parent.$parent.criteriaShow,'button_shrink_bottom':!$parent.$parent.criteriaShow}"
47
+ @click="$parent.$parent.hidden()"></div>
48
+ </div>
49
+
50
+ </div>
51
+
52
+ <div class="row" v-show="$parent.$parent.criteriaShow">
53
+ <div class="col-sm-2 form-group">
54
+ <label class="font_normal_body">表&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;号</label>
55
+ <input type="text" style="width:60%" class="input_search" v-model="model.f_meternumber"
56
+ condition="f_meternumber like '%{}%'" placeholder='表号'>
57
+ </div>
58
+ <div class="col-sm-2 form-group">
59
+ <label class="font_normal_body">&nbsp;&nbsp;&nbsp;小区&nbsp;&nbsp;&nbsp;</label>
60
+ <input type="text" style="width:60%" class="input_search" v-model="model.f_residential_area"
61
+ condition="f_residential_area like '%{}%'" placeholder='小区'>
62
+ </div>
63
+ <div class="col-sm-2 form-group">
64
+ <label class="font_normal_body">气表品牌</label>
65
+ <v-select
66
+ placeholder='气表品牌'
67
+ :value.sync="model.f_meter_brand"
68
+ v-model="model.f_meter_brand"
69
+ :options='$parent.$parent.meterbrands'
70
+ close-on-select
71
+ condition="f_meter_brand='{}'">
72
+ </v-select>
73
+ </div>
74
+ <div class="col-sm-2 form-group" >
75
+ <label class="font_normal_body">气表型号</label>
76
+ <v-select
77
+ placeholder='气表型号'
78
+ :value.sync="model.f_meter_style"
79
+ v-model="model.f_meter_style"
80
+ :options='$parent.$parent.metertypes'
81
+ close-on-select
82
+ condition="f_meter_style='{}'">
83
+ </v-select>
84
+ </div>
85
+ <div class="col-sm-2 form-group">
86
+ <label for="startDate" class="font_normal_body">插入时间</label>
87
+ <datepicker id="startDate" placeholder="插入时间" style="width:60%"
88
+ v-model="model.startDate"
89
+ :value.sync="model.startDate"
90
+ :format="'yyyy-MM-dd HH:mm:ss'"
91
+ :show-reset-button="true"
92
+ condition="f_insert_date >= '{}'">
93
+ </datepicker>
94
+ </div>
95
+ <div class="col-sm-2 form-group">
96
+ <label for="endDate" class="font_normal_body">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;至&nbsp;&nbsp;&nbsp;&nbsp;</label>
97
+ <datepicker id="endDate" placeholder="插入时间" style="width:60%"
98
+ v-model="model.endDate"
99
+ :value.sync="model.endDate"
100
+ :format="'yyyy-MM-dd HH:mm:ss'"
101
+ :show-reset-button="true"
102
+ condition="f_insert_date <= '{}'">
103
+ </datepicker>
104
+ </div>
105
+ <div class="col-sm-2 form-group">
106
+ <label class="font_normal_body">客户类型</label>
107
+ <v-select :value.sync="model.f_user_type"
108
+ @change="$parent.$parent.userTypeChange()"
109
+ :options='$parent.$parent.usertypes' placeholder='请选择' v-model="model.f_user_type"
110
+ condition="f_user_type = '{}'"
111
+ close-on-select></v-select>
112
+ </div>
113
+ <div class="col-sm-2 form-group">
114
+ <label class="font_normal_body">用气性质</label>
115
+ <v-select :value.sync="model.f_gasproperties" v-model="model.f_gasproperties"
116
+ :options='$parent.$parent.gasproperties' placeholder='请选择'
117
+ condition="f_gasproperties = '{}'"
118
+ close-on-select></v-select>
119
+ </div>
120
+ <div class="col-sm-2 form-group">
121
+ <label class="font_normal_body">用气类型</label>
122
+ <v-select :value.sync="model.f_user_nature" v-model="model.f_user_nature"
123
+ :options='$parent.$parent.usernatures' placeholder='请选择'
124
+ condition="f_user_nature = '{}'"
125
+ close-on-select></v-select>
126
+ </div>
127
+ <div class="col-sm-2 form-group">
128
+ <label class="font_normal_body">用户等级</label>
129
+ <v-select :value.sync="model.f_user_level"
130
+ :options='$parent.$parent.usergrade'
131
+ placeholder='请选择' v-model="model.f_user_level"
132
+ condition="f_user_level = '{}'"
133
+ close-on-select></v-select>
134
+ </div>
135
+ <div class="col-sm-2 form-group">
136
+ <label class="font_normal_body" >档案抄表员</label>
137
+ <v-select :value.sync="model.f_dainputtores"
138
+ v-model="model.f_dainputtores"
139
+ :options='$parent.$parent.dainputtores' placeholder='请选择'
140
+ condition="f_inputtor = '{}'"
141
+ close-on-select>
142
+ </v-select>
143
+ </div>
144
+ </div>
145
+
146
+ </div>
147
+ </criteria>
148
+
149
+ <data-grid :model="model" partial='list' class="list_area table_sy" v-ref:grid>
150
+ <template partial='head'>
151
+ <tr>
152
+ <th v-for="row in $parent.$parent.$parent.headData">
153
+ <nobr>{{row}}</nobr>
154
+ </th>
155
+ </tr>
156
+ </template>
157
+ <template partial='body'>
158
+ <tr v-for="row in $parent.$parent.$parent.model.rows">
159
+ <td style="text-align: center;" v-for="item in $parent.$parent.$parent.config.fieldMapping">
160
+ <nobr v-if="item == 'f_lowlithiumbattery'">{{row[item] == 1 ? '是' : '否'}}</nobr>
161
+ <nobr v-if="item == 'f_magneticinterference'">{{row[item] == 1 ? '异常' : '正常'}}</nobr>
162
+ <nobr v-if="item != 'f_magneticinterference' && item != 'f_lowlithiumbattery'">{{row[item]}}</nobr>
163
+ </td>
164
+ </tr>
165
+ </template>
166
+ <template partial='foot'></template>
167
+ </data-grid>
168
+ </criteria-paged>
169
+ </div>
170
+ </div>
171
+ </div>
172
+ </template>
173
+
174
+ <script>
175
+ import {HttpResetClass, PagedList} from 'vue-client'
176
+ import tableConfig from './config/tableConfig'
177
+ import exportConfig from './config/exportConfig'
178
+ import plugin from 'system-clients/src/plugins/GetLoginInfoService'
179
+
180
+ let readySomething = async function (self) {
181
+ await self.$MagLoadParams.loadParam()
182
+ self.initParams()
183
+ self.sumsmodel = self.$refs.paged.$refs.grid.model.sums;
184
+ }
185
+ export default {
186
+ title: '上报数据查询',
187
+ data() {
188
+ return {
189
+ other:[],
190
+ sumsmodel: {},
191
+ footer:[],
192
+ model: new PagedList('api/af-revenue/sql/manage_getReportDataQuery', 20, {}),
193
+ criteriaShow: false,
194
+ config: {
195
+ fieldMapping: {
196
+ f_userinfo_code: '客户编号',
197
+ f_user_name: '客户名称'
198
+ }
199
+ },
200
+ WarningType: [
201
+ {label: '全部', value: ''}
202
+ ],
203
+ Warningstyles: [
204
+ {label: '全部', value: ''}
205
+ ],
206
+ styles:false,
207
+ headData: [],
208
+ bodyData: [],
209
+ gasproperties:[],
210
+ dainputtores:[{label: '全部',value: ''}],
211
+ orgCondtionStr: " and f_filialeid in (" + this.$login.f.orgid+")",
212
+ resshow:['company'],
213
+ org:[this.$login.f.orgid],
214
+ meterbrands:[]
215
+ }
216
+ },
217
+ created () {
218
+ this.config.fieldMapping=tableConfig.ReportDataQuery
219
+ console.log("========================")
220
+ console.log(this.config.fieldMapping)
221
+ var item="用户编号"
222
+ console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
223
+ console.log(this.config.fieldMapping[item])
224
+ this.headData=Object.keys(this.config.fieldMapping)
225
+ // for(var i=0;i<this.config.fieldMapping;i++){
226
+ // this.headData.push(this.config.fieldMapping[i])
227
+ // }
228
+
229
+ },
230
+ ready() {
231
+ this.hqdainputtores()
232
+ this.$refs.paged.$refs.cri.model.startDate = this.$login.toStandardDateString() + ' 00:00:00'
233
+ this.$refs.paged.$refs.cri.model.endDate = this.$login.toStandardDateString() + ' 23:59:59'
234
+ readySomething(this).then(() => {
235
+ this.$emit('ready')
236
+ }).catch((error) => {
237
+ this.$emit('error', error)
238
+ })
239
+ },
240
+ methods: {
241
+ async hqdainputtores() {
242
+ let param = {
243
+ items: 'DISTINCT f_inputtor',
244
+ tablename: 't_userfiles',
245
+ condition: ` f_inputtor is NOT null`,
246
+ }
247
+ let getDainputtores = await new HttpResetClass().load("POST",'api/af-revenue/sql/singleTableParam', {data: param}, {
248
+ resolveMsg: null,
249
+ rejectMsg: null
250
+ });
251
+ if (getDainputtores.data.length > 0) {
252
+ let rs = [];
253
+ getDainputtores.data.forEach((item) => {
254
+ if (item.f_inputtor.length > 0) {
255
+ let temp = {
256
+ label: item.f_inputtor,
257
+ value: item.f_inputtor
258
+ };
259
+ rs.push(temp);
260
+ }
261
+ })
262
+ this.dainputtores = [{label: '全部', value: ''}, ...rs];
263
+ } else {
264
+ this.dainputtores = [{label: '全部', value: ''}];
265
+ }
266
+ },
267
+ userTypeChange () {
268
+ this.gasproperties=[]
269
+ if(this.$refs.paged.$refs.cri.model !==null) {
270
+ this.$refs.paged.$refs.cri.model.f_gasproperties=''
271
+ this.gasproperties = this.$appdata.getParam(this.$refs.paged.$refs.cri.model.f_user_type[0])
272
+ }
273
+ else{
274
+ this.gasproperties =[{label: '全部', value: ''}]
275
+ }
276
+ },
277
+ initParams() {
278
+ // 初始化气表品牌
279
+ let brandArr = []
280
+ this.$MagGetSaleParam.getGasbrand().forEach((item) => {
281
+ let temp = {}
282
+ if(item.value.f_meter_type==='物联网表'){
283
+ temp.label = item.label
284
+ temp.value = item.value.f_meter_brand
285
+ brandArr.push(temp )
286
+ }
287
+ })
288
+ this.meterbrands = [{label: '全部', value: ''}, ...brandArr]
289
+ //初始化气表价格
290
+ this.prices = this.$MagGetSaleParam.getPrices();
291
+ },
292
+ showMeterStyle() {
293
+ this.styles = true
294
+ },
295
+ search() {
296
+ this.$refs.paged.$refs.cri.search()
297
+ },
298
+ async selfSearch(args) {
299
+ args.condition = `${args.condition}` + this.orgCondtionStr
300
+ await this.model.search(args.condition, args.model)
301
+ // 查询到数据进行处理
302
+ // if (this.model.rows.length > 0) {
303
+ // this.bodyData = Object.keys(this.model.rows[0])
304
+ // }
305
+ },
306
+ getorg(obj) {
307
+ if (obj.resids.length>0) {
308
+ this.orgCondtionStr = " and f_filialeid in " + plugin.convertToIn(obj.resids)
309
+ }else
310
+ {
311
+ this.orgCondtionStr = " and f_filialeid = " + this.$login.f.orgid
312
+ }
313
+ },
314
+ // getorg(obj) {
315
+ // // if(plugins.convertToIn(obj)!==null&&plugins.convertToIn(obj)!==''){
316
+ // // this.orgCondtionStr = " and f_filialeid in " + plugins.convertToIn(obj)
317
+ // // }else{
318
+ // // this.orgCondtionStr = " and f_filialeid = " + this.$login.f.orgid
319
+ // // }
320
+ // // this.orgname = obj.res
321
+ // },
322
+ clear() {
323
+ Object.keys(this.$refs.paged.$refs.cri.model).forEach((key) => {
324
+ this.$refs.paged.$refs.cri.model[key] = []
325
+ })
326
+ },
327
+ hidden() {
328
+ this.criteriaShow = !this.criteriaShow
329
+ },
330
+
331
+ // getRes(obj) {
332
+ // this.orgCondtionStr = obj
333
+ // }
334
+ getotherfooter() {
335
+ this.other = [];
336
+ this.footer = [];
337
+ let otherInData = [];
338
+ let secondLine = [
339
+ `开始时间: ${this.$refs.paged.$refs.cri.model.startDate}`,
340
+ `结束时间: ${this.$refs.paged.$refs.cri.model.startDate}`
341
+ ];
342
+ otherInData.push(`导出时间: ${this.$login.toStandardTimeString()}`);
343
+ let footerData = []
344
+
345
+ this.footer.push(footerData);
346
+ this.other.push(otherInData);
347
+ this.other.push(secondLine);
348
+ }
349
+ },
350
+ watch: {
351
+ sumsmodel:{
352
+ handler: function(val) {
353
+ this.getotherfooter();
354
+ },
355
+ deep: true
356
+ },
357
+ },
358
+ computed: {
359
+ metertypes() {
360
+ return [{label: ' 全部 ', value: ''}, ...this.$appdata.getParam('气表类型')]
361
+ },
362
+ usernatures(){
363
+ return [{label: '全部', value: ''}, ...this.$appdata.getParam('用气类型')]
364
+ },
365
+ usertypes() {
366
+ return [{label: ' 全部 ', value: ''}, ...this.$appdata.getParam('用户类型')]
367
+ },
368
+ usergrade(){
369
+ return [{label: '全部', value: ''}, ...this.$appdata.getParam('用户等级')]
370
+ },
371
+ getCondition() {
372
+ return {
373
+ startDate: this.$refs.paged.$refs.cri.model.startDate,
374
+ endDate: this.$refs.paged.$refs.cri.model.endDate,
375
+ condition: `${this.$refs.paged.$refs.cri.condition}` + this.orgCondtionStr
376
+ }
377
+ },
378
+ getfield() {
379
+ return exportConfig.ReportDataConfig
380
+ }
381
+ }
382
+ }
383
+ </script>
@@ -1575,6 +1575,57 @@ export default {
1575
1575
  'f_wosi_lng': '我司',
1576
1576
  'f_yinzhen_lng': '引镇',
1577
1577
  'finaltotal': '一日'
1578
+ },
1579
+ // 上报数据
1580
+ ReportDataConfig: {
1581
+ 'f_userinfo_code': '用户编号',
1582
+ 'f_user_name': '用户名称',
1583
+ 'f_address': '用户地址',
1584
+ 'f_residential_area': '小区',
1585
+ 'f_user_type': '用户类型',
1586
+ 'f_user_nature': '用气类型',
1587
+ 'f_gasproperties': '用气性质',
1588
+ 'f_user_level': '用户等级',
1589
+ 'f_inputtor': '档案抄表员',
1590
+ 'f_meternumber': '表号',
1591
+ 'f_tablebase': '本次抄表底数',
1592
+ 'f_last_tablebase': '上次抄表底数',
1593
+ 'f_jval': '表计剩余余额',
1594
+ 'f_hand_date': '抄表日期',
1595
+
1596
+ 'f_last_hand_date': '上次抄表日期',
1597
+ 'f_gas_date': '开户日期',
1598
+ 'f_software_version': '软件版本号',
1599
+ 'f_table_msg': '表状态信息',
1600
+ 'f_last_meter_state_msg': '上次表状态信息',
1601
+
1602
+ 'f_insert_date': '插入日期',
1603
+ 'f_last_insertdate': '上次插入日期',
1604
+ 'f_whether_clear': '是否结算',
1605
+ 'f_super_gas': '超用气量',
1606
+ 'f_electricity': '电量等级',
1607
+
1608
+ 'f_times': '购气次数',
1609
+ 'f_price': '单价',
1610
+ 'f_signal': '信号强度',
1611
+ 'f_snr': '信噪比',
1612
+ 'f_batterylevel': '电压',
1613
+
1614
+ 'f_networkshutvalve': '阀门强制状态',
1615
+ 'f_valvestate': '阀门状态',
1616
+ 'f_wmprepaytype': '计量类型',
1617
+ 'f_upload_type': '上报类型',
1618
+ 'f_moneystate': '金额状态',
1619
+
1620
+ 'f_lowlithiumbattery': '电压状态',
1621
+ 'f_magneticinterference': '磁干扰异常',
1622
+ 'f_meterbalanceamt': '表内剩余金额',
1623
+ 'f_meterdebitamt': '表内累计充值金额',
1624
+ 'f_compensatestate': '补偿状态',
1625
+ 'f_meter_brand': '气表品牌',
1626
+ 'f_meter_style': '气表型号',
1627
+ 'f_orgname': '分公司'
1628
+
1578
1629
  }
1579
1630
 
1580
1631
  }
@@ -1,48 +1,61 @@
1
1
  export default{
2
- //查询页面的字段名和中文对应
3
- ReportDataQuery:
4
- {
5
- "用户编号":"f_userinfo_code",
6
- "用户名称":"f_user_name",
7
- "表号":"f_meternumber",
8
- "本次抄表底数":"f_tablebase",
9
- "上次抄表底数":"f_last_tablebase",
10
- "表计剩余余额":"f_jval",
11
- "抄表日期":"f_hand_date",
12
-
13
- "上次抄表日期":"f_last_hand_date",
14
- "开户日期":"f_gas_date",
15
- "软件版本号":"f_software_version",
16
- "表状态信息":"f_table_msg",
17
- "上次表状态信息":"f_last_meter_state_msg",
18
-
19
- "插入日期":"f_insert_date",
20
- "上次插入日期":"f_last_insertdate",
21
- "是否结算":"f_whether_clear",
22
- "超用气量":"f_super_gas",
23
- "电量等级":"f_electricity",
24
-
25
- "购气次数":"f_times",
26
- "单价":"f_price",
27
- "信号强度":"f_signal",
28
- "信噪比":"f_snr",
29
- "电压":"f_batterylevel",
30
-
31
- "阀门强制状态":"f_networkshutvalve",
32
- "阀门状态":"f_valvestate",
33
- "计量类型":"f_wmprepaytype",
34
- "上报类型":"f_upload_type",
35
- "金额状态":"f_moneystate",
36
-
37
- "电压状态":"f_lowlithiumbattery",
38
- "磁干扰异常":"f_magneticinterference",
39
- "表内剩余金额":"f_meterbalanceamt",
40
- "表内累计充值金额":"f_meterdebitamt",
41
- "补偿状态":"f_compensatestate",
42
- "气表品牌":"f_meter_brand",
43
- "气表型号":"f_meter_style",
44
- "分公司":"f_orgname"
45
-
46
- }
2
+ // 查询页面的字段名和中文对应
3
+ ReportDataQuery: {
4
+ '用户编号': 'f_userinfo_code',
5
+ '用户名称': 'f_user_name',
6
+ '用户地址': 'f_address',
7
+ '小区': 'f_residential_area',
8
+ '用户类型': 'f_user_type',
9
+ '用气类型': 'f_user_nature',
10
+ '用气性质': 'f_gasproperties',
11
+ '用户等级': 'f_user_level',
12
+ '档案抄表员': 'f_inputtor',
13
+ '表号': 'f_meternumber',
14
+ '本次抄表底数': 'f_tablebase',
15
+ '上次抄表底数': 'f_last_tablebase',
16
+ '表上余额': 'f_jval',
17
+ '抄表日期': 'f_hand_date',
18
+
19
+ '上次抄表日期': 'f_last_hand_date',
20
+ '开户日期': 'f_gas_date',
21
+ '软件版本号': 'f_software_version',
22
+ '表状态信息': 'f_table_msg',
23
+ '上次表状态信息': 'f_last_meter_state_msg',
24
+
25
+ '插入日期': 'f_insert_date',
26
+ '上次插入日期': 'f_last_insertdate',
27
+ '是否结算': 'f_whether_clear',
28
+ '超用气量': 'f_super_gas',
29
+ '电量等级': 'f_electricity',
30
+
31
+ '购气次数': 'f_times',
32
+ '单价': 'f_price',
33
+ '信号强度': 'f_signal',
34
+ '信噪比': 'f_snr',
35
+ '电压': 'f_batterylevel',
36
+
37
+ '阀门强制状态': 'f_networkshutvalve',
38
+ '阀门状态': 'f_valvestate',
39
+ '计量类型': 'f_wmprepaytype',
40
+ '上报类型': 'f_upload_type',
41
+ '金额状态': 'f_moneystate',
42
+
43
+ '增加工况瞬时': 'operatingModeFlow',
44
+ '标况瞬时': 'standardConditionFlow',
45
+ '开盖状态': 'f_SplitAlarm',
46
+ '液晶状态': 'f_XTIpllStopFlag',
47
+ '声速': 'soundVelocity',
48
+
49
+ '外电低电': 'f_lowlithiumbattery',
50
+ '磁干扰异常': 'f_magneticinterference',
51
+ '表内剩余金额': 'f_meterbalanceamt',
52
+ '表内累计充值金额': 'f_meterdebitamt',
53
+ '补偿状态': 'f_compensatestate',
54
+ '气表品牌': 'f_meter_brand',
55
+ '气表型号': 'f_meter_style',
56
+ '分公司': 'f_orgname',
57
+ '部门': 'f_depname'
58
+
59
+ }
47
60
 
48
61
  }
@@ -6,4 +6,6 @@ export default function () {
6
6
  Vue.component('new-webmeter-user-gas-all', (resolve) => { require(['./UserGasAll'], resolve) })
7
7
  // 上报统计分析--抄表分析
8
8
  Vue.component('user-gas-list', (resolve) => { require(['./UserGasList'], resolve) })
9
+ // 物联网表结算查询
10
+ Vue.component('report-data-query', (resolve) => { require(['./ReportDataQuery'], resolve) })
9
11
  }