vue2-client 1.6.58-single → 1.6.59-single

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.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Change Log
2
2
  > 所有关于本项目的变化都在该文档里。
3
3
 
4
+ **1.6.59 -2023-08-08 @江超**
5
+ - XTable增加按钮组左侧扩展操作slot
6
+
4
7
  **1.6.58 -2023-08-08 @江超**
5
8
  - 优化XAddNativeForm的表单校验
6
9
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2-client",
3
- "version": "1.6.58-single",
3
+ "version": "1.6.59-single",
4
4
  "private": false,
5
5
  "scripts": {
6
6
  "serve": "SET NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve",
@@ -25,6 +25,9 @@
25
25
  @selectRow="selectRow"
26
26
  @afterQuery="afterQuery"
27
27
  @tempTableEdit="tempTableEdit">
28
+ <template slot="leftButton" slot-scope="{selectedRowKeys, selectedRows}">
29
+ <slot name="leftButton" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
30
+ </template>
28
31
  <template slot="button" slot-scope="{selectedRowKeys, selectedRows}">
29
32
  <slot name="button" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
30
33
  </template>
@@ -1,506 +1,507 @@
1
- <template>
2
- <div v-show="tableColumns.length > 0">
3
- <a-row :gutter="48">
4
- <a-col>
5
- <span :style="{ float: 'left', overflow: 'hidden', marginBottom: '8px' }">
6
- <a-space>
7
- <a-button v-if="!buttonState || buttonState.add" type="primary" @click="add">
8
- <a-icon :style="iconStyle" type="plus"/>新增
9
- </a-button>
10
- <a-button
11
- v-if="!buttonState || buttonState.edit"
12
- :disabled="!isModify"
13
- :loading="editLoading"
14
- class="btn-success"
15
- type="dashed"
16
- @click="edit()">
17
- <a-icon :style="iconStyle" type="edit"/>修改
18
- </a-button>
19
- <a-button v-if="!buttonState || buttonState.delete" :disabled="!isDelete" type="danger" @click="deleteItem">
20
- <a-icon :style="iconStyle" type="delete"/>删除
21
- </a-button>
22
- <a-button v-if="!buttonState || buttonState.import" type="dashed" @click="importData">
23
- <a-icon :style="iconStyle" type="import" />导入
24
- </a-button>
25
- <a-dropdown v-if="!buttonState || buttonState.export">
26
- <a-menu slot="overlay">
27
- <a-menu-item :disabled="selectedRowKeys.length === 0" key="1" @click="handleExport(true)"><a-icon :style="iconStyle" type="ordered-list" />导出选中数据</a-menu-item>
28
- <a-menu-item key="2" @click="handleExport(false)"><a-icon :style="iconStyle" type="snippets" />导出本页数据</a-menu-item>
29
- <a-menu-item key="3" @click="handleExportByQuery"><a-icon :style="iconStyle" type="download" />导出所有符合条件的数据</a-menu-item>
30
- </a-menu>
31
- <a-button>导出 <a-icon type="down" /> </a-button>
32
- </a-dropdown>
33
- <slot name="button" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
34
- </a-space>
35
- </span>
36
- </a-col>
37
- <a-col>
38
- <span :style="{ float: 'right', overflow: 'hidden', marginBottom: '8px' }">
39
- <a-button-group>
40
- <slot name="rightBtnExpand" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
41
- <a-button @click="refresh(true)">
42
- <a-icon :style="iconStyle" type="reload" />
43
- </a-button>
44
- <table-setting v-if="columnSelectLoaded" v-model="tableColumns" />
45
- </a-button-group>
46
- </span>
47
- </a-col>
48
- </a-row>
49
- <s-table
50
- ref="table"
51
- :alert="true"
52
- :columns="tableColumns"
53
- :data="loadData"
54
- :rowKey="rowKey"
55
- :rowSelection="rowSelection"
56
- :scroll="{ x: scrollXWidth, y: scrollYHeight }"
57
- :showPagination="showPagination"
58
- size="default"
59
- >
60
- <template
61
- v-for="(item, index) in tableColumns"
62
- :slot="item.dataIndex"
63
- slot-scope="text, record">
64
- <!-- 文本溢出省略(ellipsis) -->
65
- <span v-if="item.slotType === 'ellipsis'" :key="index">
66
- <ellipsis :length="item.slotValue" tooltip>{{ text === '' ? '--' : text }}</ellipsis>
67
- </span>
68
- <!-- 徽标(badge) -->
69
- <span v-else-if="item.slotType === 'badge'" :key="index">
70
- <x-badge v-if="text !== null && text !== undefined" :badge-key="item.slotKeyMap" :value="text" />
71
- </span>
72
- <!-- 日期(date) -->
73
- <span v-else-if="item.slotType === 'date'" :key="index">
74
- {{ format(text,'yyyy-MM-dd') }}
75
- </span>
76
- <!-- 日期时间(datetime) -->
77
- <span v-else-if="item.slotType === 'dateTime'" :key="index">
78
- {{ format(text,'yyyy-MM-dd hh:mm:ss') }}
79
- </span>
80
- <!-- 操作列(action) -->
81
- <span v-else-if="item.slotType === 'action'" :key="index">
82
- <a @click="action(record, item.dataIndex)">{{ item.slotValue }}</a>
83
- </span>
84
- </template>
85
- <template slot="footer">
86
- <slot name="footer" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
87
- </template>
88
- </s-table>
89
- <!-- 上传文件 -->
90
- <x-import-excel
91
- ref="importExcel"
92
- @ok="refresh(true)"
93
- :title="title"
94
- :service-name="serviceName"
95
- :query-params-name="queryParamsName"
96
- />
97
- </div>
98
- </template>
99
- <script>
100
- import { Ellipsis, STable } from '@vue2-client/components'
101
- import { formatDate } from '@vue2-client/utils/util'
102
- import XBadge from '@vue2-client/base-client/components/common/XBadge'
103
- import TableSetting from '@vue2-client/components/TableSetting/TableSetting'
104
- import { exportJson } from '@vue2-client/utils/excel/Export2Excel'
105
- import { exportData, query, queryWithResource, remove } from '@vue2-client/services/api/common'
106
- import XImportExcel from '@vue2-client/base-client/components/common/XImportExcel'
107
- import { Modal } from 'ant-design-vue'
108
- import { post } from '@vue2-client/services/api'
109
- import { CommonTempTable } from '@vue2-client/services/api/commonTempTable'
110
-
111
- export default {
112
- name: 'XTable',
113
- components: {
114
- TableSetting,
115
- STable,
116
- Ellipsis,
117
- XBadge,
118
- XImportExcel
119
- },
120
- data () {
121
- return {
122
- // 筛选列加载状态
123
- columnSelectLoaded: false,
124
- // 预览模式
125
- viewMode: false,
126
- // 加载数据方法 必须为 Promise 对象
127
- loadData: parameter => {
128
- // 取到表格携带的表单参数
129
- const requestParameters = Object.assign({}, parameter)
130
- // 取到父组件传入的表单参数
131
- const conditionParams = Object.assign(this.form, this.fixedQueryForm)
132
- // 如果传了燃气公司字段,则进行数据处理
133
- if (conditionParams.orgName) {
134
- requestParameters.orgName = conditionParams.orgName
135
- delete conditionParams.orgName
136
- }
137
- requestParameters.conditionParams = conditionParams
138
- requestParameters.queryParamsName = this.queryParamsName
139
- requestParameters.queryParams = this.queryParams
140
- // 加载数据
141
- return this.loadTableData(requestParameters)
142
- },
143
- rowKey: undefined,
144
- // x滚动条宽度
145
- scrollXWidth: 1600,
146
- // y滚动条高度
147
- scrollYHeight: 437,
148
- // 表格选择列Key集合
149
- selectedRowKeys: [],
150
- // 表格选择Row集合
151
- selectedRows: [],
152
- // 业务标题
153
- title: '',
154
- // 数据列
155
- tableColumns: [],
156
- // 查询用表单
157
- form: {},
158
- // 是否允许修改
159
- isModify: false,
160
- // 是否允许删除
161
- isDelete: false,
162
- // 服务名称
163
- serviceName: 'af-system',
164
- // 选中用于修改的id
165
- selectId: undefined,
166
- // 是否为临时表
167
- isTableTemp: false,
168
- // 是否显示展示列抽屉
169
- visible: false,
170
- // 编辑按钮加载状态
171
- editLoading: false,
172
- // 按钮状态
173
- buttonState: {},
174
- // 图标样式
175
- iconStyle: {
176
- position: 'relative',
177
- top: '1px'
178
- }
179
- }
180
- },
181
- props: {
182
- // 查询配置文件名
183
- queryParamsName: {
184
- type: String,
185
- default: () => {
186
- return ''
187
- }
188
- },
189
- // 查询配置文件Json
190
- queryParamsJson: {
191
- type: Object,
192
- default: null
193
- },
194
- // 固定查询表单
195
- fixedQueryForm: {
196
- type: Object,
197
- default: () => {
198
- return {}
199
- }
200
- },
201
- // 数据只有一页时是否展示分页,true:展示,auto:隐藏
202
- showPagination: {
203
- type: Boolean,
204
- default: true
205
- }
206
- },
207
- computed: {
208
- rowSelection () {
209
- return {
210
- selectedRowKeys: this.selectedRowKeys,
211
- onChange: this.onSelectChange
212
- }
213
- }
214
- },
215
- mounted () {},
216
- methods: {
217
- /**
218
- * 初始化表格参数
219
- */
220
- init (params) {
221
- const {
222
- // 查询参数对象, 用于没有对应查询配置文件名时
223
- queryParams,
224
- tableColumns,
225
- buttonState,
226
- title,
227
- serviceName = 'af-system',
228
- viewMode
229
- } = params
230
- this.queryParams = queryParams
231
- this.tableColumns = JSON.parse(JSON.stringify(tableColumns))
232
- if (this.tableColumns.length === 0) {
233
- return
234
- }
235
- this.buttonState = buttonState
236
- this.title = title
237
- this.serviceName = serviceName
238
- this.viewMode = viewMode
239
- this.rowKey = this.tableColumns[0].dataIndex
240
- let totalWidth = 0
241
- // 设置表格宽度
242
- for (let i = 0; i < this.tableColumns.length; i++) {
243
- const item = this.tableColumns[i]
244
- if (item.slotType === 'action') {
245
- item.fixed = 'right'
246
- item.width = 70
247
- }
248
- if (item.width) {
249
- totalWidth = totalWidth + item.width
250
- } else {
251
- totalWidth = totalWidth + 180
252
- }
253
- }
254
- // 设置表格高度
255
- const height = document.documentElement.clientHeight
256
- if (height >= 1070) {
257
- this.scrollYHeight = 'calc(100vh - 526px)'
258
- } else {
259
- this.scrollYHeight = 'calc(100vh - 398px)'
260
- }
261
- // 横向滚动长度大于所有宽度,才能实现固定表头
262
- this.scrollXWidth = totalWidth
263
- // 加载筛选列完成
264
- this.columnSelectLoaded = true
265
- this.setQueryForm({})
266
- },
267
- /**
268
- * 加载表格数据
269
- * @param requestParameters 请求参数
270
- */
271
- loadTableData (requestParameters) {
272
- let result = {}
273
- if (this.queryParamsJson) {
274
- if (this.queryParamsJson.tableName.startsWith('##')) {
275
- this.isTableTemp = true
276
- result = this.initTempTable(requestParameters)
277
- }
278
- }
279
- if (!this.isTableTemp) {
280
- result = query(requestParameters, this.serviceName)
281
- }
282
- this.clearRowKeys()
283
- this.$emit('afterQuery', result, requestParameters.conditionParams)
284
- return result
285
- },
286
- action (record, actionType) {
287
- this.$emit('action', record, record[this.getPrimaryKeyName()], actionType)
288
- },
289
- onSelectChange (selectedRowKeys, selectedRows) {
290
- this.selectedRowKeys = selectedRowKeys
291
- this.selectedRows = selectedRows
292
- this.isModify = this.selectedRowKeys.length === 1
293
- this.isDelete = this.selectedRowKeys.length > 0
294
- this.$emit('selectRow', selectedRowKeys, selectedRows)
295
- },
296
- /**
297
- * 清除表格选中项
298
- */
299
- clearRowKeys () {
300
- this.$refs.table.clearSelected()
301
- },
302
- /**
303
- * 为表格附加查询条件
304
- */
305
- setQueryForm (form = {}) {
306
- this.form = form
307
- this.refresh(true)
308
- },
309
- /**
310
- * 表格重新加载方法
311
- * 如果参数为 true, 则强制刷新到第一页
312
- */
313
- refresh (bool) {
314
- this.$refs.table.refresh(bool)
315
- },
316
- format (date, format) {
317
- return formatDate(date, format)
318
- },
319
- showDrawer () {
320
- this.visible = true
321
- },
322
- /**
323
- * 获取主键列名称
324
- */
325
- getPrimaryKeyName () {
326
- return this.tableColumns[0].dataIndex
327
- },
328
- // 导出选中或本页数据
329
- handleExport (isSelected) {
330
- const tHeader = this.tableColumns.filter(res => res.slotType !== 'action').map(res => res.title)
331
- const filterVal = this.tableColumns.map(res => res.dataIndex)
332
- let exportData
333
- if (isSelected) {
334
- exportData = this.selectedRows
335
- } else {
336
- exportData = this.$refs.table.localDataSource
337
- }
338
- const data = this.formatJson(filterVal, exportData)
339
- exportJson(tHeader, data, this.title + `数据_${new Date().toLocaleString()}`)
340
- },
341
- // 导出符合条件的数据
342
- handleExportByQuery () {
343
- const that = this
344
- const conditionParams = Object.assign(that.form, that.fixedQueryForm)
345
- this.$confirm({
346
- title: '是否确认导出?',
347
- content: '此操作将导出当前条件下所有数据而非选中数据',
348
- onOk () {
349
- exportData({
350
- queryParamsName: that.queryParamsName,
351
- queryParams: that.queryParams,
352
- form: conditionParams
353
- }, that.serviceName).then(res => {
354
- window.open('/res/excel/export/' + res.value)
355
- })
356
- },
357
- onCancel () {}
358
- })
359
- },
360
- // 新增业务
361
- add () {
362
- this.$emit('add')
363
- },
364
- // 编辑业务
365
- edit (id) {
366
- this.editLoading = true
367
- // 组织被编辑数据
368
- const requestParameters = {
369
- queryParamsName: this.queryParamsName,
370
- queryParams: this.queryParams,
371
- conditionParams: {},
372
- pageNo: 1,
373
- pageSize: 1
374
- }
375
- if (!id) {
376
- this.selectId = this.selectedRowKeys[0]
377
- } else {
378
- this.selectId = id
379
- }
380
- const primaryKeyName = this.getPrimaryKeyName()
381
- requestParameters.conditionParams[primaryKeyName] = this.selectId
382
- requestParameters.f_businessid = this.selectId
383
- if (this.isTableTemp) {
384
- this.$emit('tempTableEdit', requestParameters)
385
- return
386
- }
387
- queryWithResource(requestParameters, this.serviceName).then(res => {
388
- // 将更新需要的主键值加入到primaryKeyData中
389
- const primaryKeyData = {}
390
- primaryKeyData[primaryKeyName] = this.selectId
391
- const modifyModelData = { data: res.data[0], primaryKeyData: primaryKeyData, images: res.images, files: res.files }
392
- this.$emit('edit', modifyModelData)
393
- this.editLoading = false
394
- })
395
- },
396
- // 删除业务
397
- deleteItem () {
398
- if (this.viewMode) {
399
- this.$message.info('预览模式禁止删除')
400
- return
401
- }
402
- Modal.confirm({
403
- title: '提示',
404
- content: '您本次要删除共' + this.selectedRowKeys.length + '条数据,确定操作吗?',
405
- zIndex: 1001,
406
- onOk: () => {
407
- return new Promise((resolve, reject) => {
408
- const requestParameters = {
409
- queryParamsName: this.queryParamsName,
410
- idList: this.selectedRowKeys
411
- }
412
- remove(requestParameters, this.serviceName).then(res => {
413
- resolve(res)
414
- this.$message.success('删除成功!')
415
- this.refresh(true)
416
- // afterDelete
417
- this.$emit('afterDelete', requestParameters)
418
- }).catch(e => {
419
- reject(e)
420
- this.$message.error('删除失败!')
421
- })
422
- })
423
- },
424
- onCancel () {}
425
- })
426
- },
427
- // 导入业务
428
- importData () {
429
- this.$refs.importExcel.importExcelHandleOpen()
430
- },
431
- formatJson (filterVal, jsonData) {
432
- return jsonData.map(v => filterVal.map(j => v[j]))
433
- },
434
- // 初始化临时表
435
- async initTempTable (json) {
436
- await this.createTempTable(this.queryParamsJson)
437
- await this.insertTempTableData(this.queryParamsJson)
438
- let result = {}
439
- await post(CommonTempTable.initApplySubTable, {
440
- define: json
441
- }).then(res => {
442
- console.log('子表临时表已创建')
443
- result = res
444
- })
445
- return result
446
- },
447
- // 创建临时表sql生成
448
- createTempTable (defineJson) {
449
- const tableName = defineJson.tableName
450
- const define = defineJson.column
451
- return post(CommonTempTable.createTempTable, {
452
- define: define,
453
- tableName: tableName
454
- }).then(res => {
455
- return res
456
- }, err => {
457
- console.log(err)
458
- })
459
- },
460
- // 插入临时表数据sql生成
461
- insertTempTableData (defineJson) {
462
- const tableName = defineJson.tableName
463
- const params = {}
464
- params.define = defineJson.column
465
- params.applyId = defineJson.applyId
466
- params.stepName = defineJson.stepName
467
- params.tableName = tableName
468
- return post(CommonTempTable.insertDataToTempTable, {
469
- tempTableData: params
470
- }).then(res => {
471
- return res
472
- })
473
- }
474
- }
475
- }
476
- </script>
477
- <style lang="less" scoped>
478
- .btn-success {
479
- color: #ffffff;
480
- }
481
- .btn-success:enabled:hover {
482
- background-color: #85CE61 !important;
483
- border-color: #85CE61 !important;
484
- }
485
- .btn-success:enabled {
486
- background-color: #67c23a;
487
- border-color: #67c23a;
488
- }
489
- .btn-success:disabled {
490
- color: rgba(0, 0, 0, 0.25);
491
- }
492
- .btn-warn {
493
- color: #ffffff;
494
- }
495
- .btn-warn:enabled:hover {
496
- background-color: #ffc833 !important;
497
- border-color: #ffc833 !important;
498
- }
499
- .btn-warn:enabled {
500
- background-color: #ffba00;
501
- border-color: #ffba00;
502
- }
503
- .btn-warn:disabled {
504
- color: rgba(0, 0, 0, 0.25);
505
- }
506
- </style>
1
+ <template>
2
+ <div v-show="tableColumns.length > 0">
3
+ <a-row :gutter="48">
4
+ <a-col>
5
+ <span :style="{ float: 'left', overflow: 'hidden', marginBottom: '8px' }">
6
+ <a-space>
7
+ <slot name="leftButton" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
8
+ <a-button v-if="!buttonState || buttonState.add" type="primary" @click="add">
9
+ <a-icon :style="iconStyle" type="plus"/>新增
10
+ </a-button>
11
+ <a-button
12
+ v-if="!buttonState || buttonState.edit"
13
+ :disabled="!isModify"
14
+ :loading="editLoading"
15
+ class="btn-success"
16
+ type="dashed"
17
+ @click="edit()">
18
+ <a-icon :style="iconStyle" type="edit"/>修改
19
+ </a-button>
20
+ <a-button v-if="!buttonState || buttonState.delete" :disabled="!isDelete" type="danger" @click="deleteItem">
21
+ <a-icon :style="iconStyle" type="delete"/>删除
22
+ </a-button>
23
+ <a-button v-if="!buttonState || buttonState.import" type="dashed" @click="importData">
24
+ <a-icon :style="iconStyle" type="import" />导入
25
+ </a-button>
26
+ <a-dropdown v-if="!buttonState || buttonState.export">
27
+ <a-menu slot="overlay">
28
+ <a-menu-item :disabled="selectedRowKeys.length === 0" key="1" @click="handleExport(true)"><a-icon :style="iconStyle" type="ordered-list" />导出选中数据</a-menu-item>
29
+ <a-menu-item key="2" @click="handleExport(false)"><a-icon :style="iconStyle" type="snippets" />导出本页数据</a-menu-item>
30
+ <a-menu-item key="3" @click="handleExportByQuery"><a-icon :style="iconStyle" type="download" />导出所有符合条件的数据</a-menu-item>
31
+ </a-menu>
32
+ <a-button>导出 <a-icon type="down" /> </a-button>
33
+ </a-dropdown>
34
+ <slot name="button" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
35
+ </a-space>
36
+ </span>
37
+ </a-col>
38
+ <a-col>
39
+ <span :style="{ float: 'right', overflow: 'hidden', marginBottom: '8px' }">
40
+ <a-button-group>
41
+ <slot name="rightBtnExpand" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
42
+ <a-button @click="refresh(true)">
43
+ <a-icon :style="iconStyle" type="reload" />
44
+ </a-button>
45
+ <table-setting v-if="columnSelectLoaded" v-model="tableColumns" />
46
+ </a-button-group>
47
+ </span>
48
+ </a-col>
49
+ </a-row>
50
+ <s-table
51
+ ref="table"
52
+ :alert="true"
53
+ :columns="tableColumns"
54
+ :data="loadData"
55
+ :rowKey="rowKey"
56
+ :rowSelection="rowSelection"
57
+ :scroll="{ x: scrollXWidth, y: scrollYHeight }"
58
+ :showPagination="showPagination"
59
+ size="default"
60
+ >
61
+ <template
62
+ v-for="(item, index) in tableColumns"
63
+ :slot="item.dataIndex"
64
+ slot-scope="text, record">
65
+ <!-- 文本溢出省略(ellipsis) -->
66
+ <span v-if="item.slotType === 'ellipsis'" :key="index">
67
+ <ellipsis :length="item.slotValue" tooltip>{{ text === '' ? '--' : text }}</ellipsis>
68
+ </span>
69
+ <!-- 徽标(badge) -->
70
+ <span v-else-if="item.slotType === 'badge'" :key="index">
71
+ <x-badge v-if="text !== null && text !== undefined" :badge-key="item.slotKeyMap" :value="text" />
72
+ </span>
73
+ <!-- 日期(date) -->
74
+ <span v-else-if="item.slotType === 'date'" :key="index">
75
+ {{ format(text,'yyyy-MM-dd') }}
76
+ </span>
77
+ <!-- 日期时间(datetime) -->
78
+ <span v-else-if="item.slotType === 'dateTime'" :key="index">
79
+ {{ format(text,'yyyy-MM-dd hh:mm:ss') }}
80
+ </span>
81
+ <!-- 操作列(action) -->
82
+ <span v-else-if="item.slotType === 'action'" :key="index">
83
+ <a @click="action(record, item.dataIndex)">{{ item.slotValue }}</a>
84
+ </span>
85
+ </template>
86
+ <template slot="footer">
87
+ <slot name="footer" :selectedRowKeys="selectedRowKeys" :selectedRows="selectedRows"></slot>
88
+ </template>
89
+ </s-table>
90
+ <!-- 上传文件 -->
91
+ <x-import-excel
92
+ ref="importExcel"
93
+ @ok="refresh(true)"
94
+ :title="title"
95
+ :service-name="serviceName"
96
+ :query-params-name="queryParamsName"
97
+ />
98
+ </div>
99
+ </template>
100
+ <script>
101
+ import { Ellipsis, STable } from '@vue2-client/components'
102
+ import { formatDate } from '@vue2-client/utils/util'
103
+ import XBadge from '@vue2-client/base-client/components/common/XBadge'
104
+ import TableSetting from '@vue2-client/components/TableSetting/TableSetting'
105
+ import { exportJson } from '@vue2-client/utils/excel/Export2Excel'
106
+ import { exportData, query, queryWithResource, remove } from '@vue2-client/services/api/common'
107
+ import XImportExcel from '@vue2-client/base-client/components/common/XImportExcel'
108
+ import { Modal } from 'ant-design-vue'
109
+ import { post } from '@vue2-client/services/api'
110
+ import { CommonTempTable } from '@vue2-client/services/api/commonTempTable'
111
+
112
+ export default {
113
+ name: 'XTable',
114
+ components: {
115
+ TableSetting,
116
+ STable,
117
+ Ellipsis,
118
+ XBadge,
119
+ XImportExcel
120
+ },
121
+ data () {
122
+ return {
123
+ // 筛选列加载状态
124
+ columnSelectLoaded: false,
125
+ // 预览模式
126
+ viewMode: false,
127
+ // 加载数据方法 必须为 Promise 对象
128
+ loadData: parameter => {
129
+ // 取到表格携带的表单参数
130
+ const requestParameters = Object.assign({}, parameter)
131
+ // 取到父组件传入的表单参数
132
+ const conditionParams = Object.assign(this.form, this.fixedQueryForm)
133
+ // 如果传了燃气公司字段,则进行数据处理
134
+ if (conditionParams.orgName) {
135
+ requestParameters.orgName = conditionParams.orgName
136
+ delete conditionParams.orgName
137
+ }
138
+ requestParameters.conditionParams = conditionParams
139
+ requestParameters.queryParamsName = this.queryParamsName
140
+ requestParameters.queryParams = this.queryParams
141
+ // 加载数据
142
+ return this.loadTableData(requestParameters)
143
+ },
144
+ rowKey: undefined,
145
+ // x滚动条宽度
146
+ scrollXWidth: 1600,
147
+ // y滚动条高度
148
+ scrollYHeight: 437,
149
+ // 表格选择列Key集合
150
+ selectedRowKeys: [],
151
+ // 表格选择Row集合
152
+ selectedRows: [],
153
+ // 业务标题
154
+ title: '',
155
+ // 数据列
156
+ tableColumns: [],
157
+ // 查询用表单
158
+ form: {},
159
+ // 是否允许修改
160
+ isModify: false,
161
+ // 是否允许删除
162
+ isDelete: false,
163
+ // 服务名称
164
+ serviceName: 'af-system',
165
+ // 选中用于修改的id
166
+ selectId: undefined,
167
+ // 是否为临时表
168
+ isTableTemp: false,
169
+ // 是否显示展示列抽屉
170
+ visible: false,
171
+ // 编辑按钮加载状态
172
+ editLoading: false,
173
+ // 按钮状态
174
+ buttonState: {},
175
+ // 图标样式
176
+ iconStyle: {
177
+ position: 'relative',
178
+ top: '1px'
179
+ }
180
+ }
181
+ },
182
+ props: {
183
+ // 查询配置文件名
184
+ queryParamsName: {
185
+ type: String,
186
+ default: () => {
187
+ return ''
188
+ }
189
+ },
190
+ // 查询配置文件Json
191
+ queryParamsJson: {
192
+ type: Object,
193
+ default: null
194
+ },
195
+ // 固定查询表单
196
+ fixedQueryForm: {
197
+ type: Object,
198
+ default: () => {
199
+ return {}
200
+ }
201
+ },
202
+ // 数据只有一页时是否展示分页,true:展示,auto:隐藏
203
+ showPagination: {
204
+ type: Boolean,
205
+ default: true
206
+ }
207
+ },
208
+ computed: {
209
+ rowSelection () {
210
+ return {
211
+ selectedRowKeys: this.selectedRowKeys,
212
+ onChange: this.onSelectChange
213
+ }
214
+ }
215
+ },
216
+ mounted () {},
217
+ methods: {
218
+ /**
219
+ * 初始化表格参数
220
+ */
221
+ init (params) {
222
+ const {
223
+ // 查询参数对象, 用于没有对应查询配置文件名时
224
+ queryParams,
225
+ tableColumns,
226
+ buttonState,
227
+ title,
228
+ serviceName = 'af-system',
229
+ viewMode
230
+ } = params
231
+ this.queryParams = queryParams
232
+ this.tableColumns = JSON.parse(JSON.stringify(tableColumns))
233
+ if (this.tableColumns.length === 0) {
234
+ return
235
+ }
236
+ this.buttonState = buttonState
237
+ this.title = title
238
+ this.serviceName = serviceName
239
+ this.viewMode = viewMode
240
+ this.rowKey = this.tableColumns[0].dataIndex
241
+ let totalWidth = 0
242
+ // 设置表格宽度
243
+ for (let i = 0; i < this.tableColumns.length; i++) {
244
+ const item = this.tableColumns[i]
245
+ if (item.slotType === 'action') {
246
+ item.fixed = 'right'
247
+ item.width = 70
248
+ }
249
+ if (item.width) {
250
+ totalWidth = totalWidth + item.width
251
+ } else {
252
+ totalWidth = totalWidth + 180
253
+ }
254
+ }
255
+ // 设置表格高度
256
+ const height = document.documentElement.clientHeight
257
+ if (height >= 1070) {
258
+ this.scrollYHeight = 'calc(100vh - 526px)'
259
+ } else {
260
+ this.scrollYHeight = 'calc(100vh - 398px)'
261
+ }
262
+ // 横向滚动长度大于所有宽度,才能实现固定表头
263
+ this.scrollXWidth = totalWidth
264
+ // 加载筛选列完成
265
+ this.columnSelectLoaded = true
266
+ this.setQueryForm({})
267
+ },
268
+ /**
269
+ * 加载表格数据
270
+ * @param requestParameters 请求参数
271
+ */
272
+ loadTableData (requestParameters) {
273
+ let result = {}
274
+ if (this.queryParamsJson) {
275
+ if (this.queryParamsJson.tableName.startsWith('##')) {
276
+ this.isTableTemp = true
277
+ result = this.initTempTable(requestParameters)
278
+ }
279
+ }
280
+ if (!this.isTableTemp) {
281
+ result = query(requestParameters, this.serviceName)
282
+ }
283
+ this.clearRowKeys()
284
+ this.$emit('afterQuery', result, requestParameters.conditionParams)
285
+ return result
286
+ },
287
+ action (record, actionType) {
288
+ this.$emit('action', record, record[this.getPrimaryKeyName()], actionType)
289
+ },
290
+ onSelectChange (selectedRowKeys, selectedRows) {
291
+ this.selectedRowKeys = selectedRowKeys
292
+ this.selectedRows = selectedRows
293
+ this.isModify = this.selectedRowKeys.length === 1
294
+ this.isDelete = this.selectedRowKeys.length > 0
295
+ this.$emit('selectRow', selectedRowKeys, selectedRows)
296
+ },
297
+ /**
298
+ * 清除表格选中项
299
+ */
300
+ clearRowKeys () {
301
+ this.$refs.table.clearSelected()
302
+ },
303
+ /**
304
+ * 为表格附加查询条件
305
+ */
306
+ setQueryForm (form = {}) {
307
+ this.form = form
308
+ this.refresh(true)
309
+ },
310
+ /**
311
+ * 表格重新加载方法
312
+ * 如果参数为 true, 则强制刷新到第一页
313
+ */
314
+ refresh (bool) {
315
+ this.$refs.table.refresh(bool)
316
+ },
317
+ format (date, format) {
318
+ return formatDate(date, format)
319
+ },
320
+ showDrawer () {
321
+ this.visible = true
322
+ },
323
+ /**
324
+ * 获取主键列名称
325
+ */
326
+ getPrimaryKeyName () {
327
+ return this.tableColumns[0].dataIndex
328
+ },
329
+ // 导出选中或本页数据
330
+ handleExport (isSelected) {
331
+ const tHeader = this.tableColumns.filter(res => res.slotType !== 'action').map(res => res.title)
332
+ const filterVal = this.tableColumns.map(res => res.dataIndex)
333
+ let exportData
334
+ if (isSelected) {
335
+ exportData = this.selectedRows
336
+ } else {
337
+ exportData = this.$refs.table.localDataSource
338
+ }
339
+ const data = this.formatJson(filterVal, exportData)
340
+ exportJson(tHeader, data, this.title + `数据_${new Date().toLocaleString()}`)
341
+ },
342
+ // 导出符合条件的数据
343
+ handleExportByQuery () {
344
+ const that = this
345
+ const conditionParams = Object.assign(that.form, that.fixedQueryForm)
346
+ this.$confirm({
347
+ title: '是否确认导出?',
348
+ content: '此操作将导出当前条件下所有数据而非选中数据',
349
+ onOk () {
350
+ exportData({
351
+ queryParamsName: that.queryParamsName,
352
+ queryParams: that.queryParams,
353
+ form: conditionParams
354
+ }, that.serviceName).then(res => {
355
+ window.open('/res/excel/export/' + res.value)
356
+ })
357
+ },
358
+ onCancel () {}
359
+ })
360
+ },
361
+ // 新增业务
362
+ add () {
363
+ this.$emit('add')
364
+ },
365
+ // 编辑业务
366
+ edit (id) {
367
+ this.editLoading = true
368
+ // 组织被编辑数据
369
+ const requestParameters = {
370
+ queryParamsName: this.queryParamsName,
371
+ queryParams: this.queryParams,
372
+ conditionParams: {},
373
+ pageNo: 1,
374
+ pageSize: 1
375
+ }
376
+ if (!id) {
377
+ this.selectId = this.selectedRowKeys[0]
378
+ } else {
379
+ this.selectId = id
380
+ }
381
+ const primaryKeyName = this.getPrimaryKeyName()
382
+ requestParameters.conditionParams[primaryKeyName] = this.selectId
383
+ requestParameters.f_businessid = this.selectId
384
+ if (this.isTableTemp) {
385
+ this.$emit('tempTableEdit', requestParameters)
386
+ return
387
+ }
388
+ queryWithResource(requestParameters, this.serviceName).then(res => {
389
+ // 将更新需要的主键值加入到primaryKeyData
390
+ const primaryKeyData = {}
391
+ primaryKeyData[primaryKeyName] = this.selectId
392
+ const modifyModelData = { data: res.data[0], primaryKeyData: primaryKeyData, images: res.images, files: res.files }
393
+ this.$emit('edit', modifyModelData)
394
+ this.editLoading = false
395
+ })
396
+ },
397
+ // 删除业务
398
+ deleteItem () {
399
+ if (this.viewMode) {
400
+ this.$message.info('预览模式禁止删除')
401
+ return
402
+ }
403
+ Modal.confirm({
404
+ title: '提示',
405
+ content: '您本次要删除共' + this.selectedRowKeys.length + '条数据,确定操作吗?',
406
+ zIndex: 1001,
407
+ onOk: () => {
408
+ return new Promise((resolve, reject) => {
409
+ const requestParameters = {
410
+ queryParamsName: this.queryParamsName,
411
+ idList: this.selectedRowKeys
412
+ }
413
+ remove(requestParameters, this.serviceName).then(res => {
414
+ resolve(res)
415
+ this.$message.success('删除成功!')
416
+ this.refresh(true)
417
+ // afterDelete
418
+ this.$emit('afterDelete', requestParameters)
419
+ }).catch(e => {
420
+ reject(e)
421
+ this.$message.error('删除失败!')
422
+ })
423
+ })
424
+ },
425
+ onCancel () {}
426
+ })
427
+ },
428
+ // 导入业务
429
+ importData () {
430
+ this.$refs.importExcel.importExcelHandleOpen()
431
+ },
432
+ formatJson (filterVal, jsonData) {
433
+ return jsonData.map(v => filterVal.map(j => v[j]))
434
+ },
435
+ // 初始化临时表
436
+ async initTempTable (json) {
437
+ await this.createTempTable(this.queryParamsJson)
438
+ await this.insertTempTableData(this.queryParamsJson)
439
+ let result = {}
440
+ await post(CommonTempTable.initApplySubTable, {
441
+ define: json
442
+ }).then(res => {
443
+ console.log('子表临时表已创建')
444
+ result = res
445
+ })
446
+ return result
447
+ },
448
+ // 创建临时表sql生成
449
+ createTempTable (defineJson) {
450
+ const tableName = defineJson.tableName
451
+ const define = defineJson.column
452
+ return post(CommonTempTable.createTempTable, {
453
+ define: define,
454
+ tableName: tableName
455
+ }).then(res => {
456
+ return res
457
+ }, err => {
458
+ console.log(err)
459
+ })
460
+ },
461
+ // 插入临时表数据sql生成
462
+ insertTempTableData (defineJson) {
463
+ const tableName = defineJson.tableName
464
+ const params = {}
465
+ params.define = defineJson.column
466
+ params.applyId = defineJson.applyId
467
+ params.stepName = defineJson.stepName
468
+ params.tableName = tableName
469
+ return post(CommonTempTable.insertDataToTempTable, {
470
+ tempTableData: params
471
+ }).then(res => {
472
+ return res
473
+ })
474
+ }
475
+ }
476
+ }
477
+ </script>
478
+ <style lang="less" scoped>
479
+ .btn-success {
480
+ color: #ffffff;
481
+ }
482
+ .btn-success:enabled:hover {
483
+ background-color: #85CE61 !important;
484
+ border-color: #85CE61 !important;
485
+ }
486
+ .btn-success:enabled {
487
+ background-color: #67c23a;
488
+ border-color: #67c23a;
489
+ }
490
+ .btn-success:disabled {
491
+ color: rgba(0, 0, 0, 0.25);
492
+ }
493
+ .btn-warn {
494
+ color: #ffffff;
495
+ }
496
+ .btn-warn:enabled:hover {
497
+ background-color: #ffc833 !important;
498
+ border-color: #ffc833 !important;
499
+ }
500
+ .btn-warn:enabled {
501
+ background-color: #ffba00;
502
+ border-color: #ffba00;
503
+ }
504
+ .btn-warn:disabled {
505
+ color: rgba(0, 0, 0, 0.25);
506
+ }
507
+ </style>