1
2
3
<template>
<j-modal
centered
肖超群
authored
about a year ago
4
:title="name + ' ' + this.$t('button.select')"
5
6
7
8
9
:width="width"
:visible="visible"
switchFullscreen
@ok="handleOk"
@cancel="close"
谭毅彬
authored
about a year ago
10
:cancelText="$t('button.close')">
11
12
<a-row :gutter="24">
13
14
15
16
17
<a-col :span="16">
<!-- 查询区域 -->
<a-form layout="inline" class="j-inline-form">
<!-- 固定条件 -->
<a-form-item :label="(queryParamText||name)">
18
<a-input v-model="queryParam[queryParamCode||displayKey]" :placeholder="(queryParamPlaceholder||queryParamText)" @pressEnter="searchQuery"/>
19
20
</a-form-item>
<!-- 动态生成的查询条件 -->
21
<j-select-biz-query-item v-if="queryConfig.length>0" v-show="showMoreQueryItems" :queryParam="queryParam" :queryConfig="queryConfig" @pressEnter="searchQuery"/>
22
<!-- 按钮 -->
谭毅彬
authored
about a year ago
23
24
<a-button type="primary" @click="searchQuery" icon="search">{{ $t('button.search') }}</a-button>
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">{{ $t('button.reset') }}</a-button>
25
<a v-if="queryConfig.length>0" @click="showMoreQueryItems=!showMoreQueryItems" style="margin-left: 8px">
肖超群
authored
about a year ago
26
{{ showMoreQueryItems ? this.$t('button.collapse') : this.$t('button.expand') }}
27
28
29
30
31
32
33
<a-icon :type="showMoreQueryItems ? 'up' : 'down'"/>
</a>
</a-form>
<a-table
size="middle"
bordered
:rowKey="rowKey"
34
:columns="columns"
35
36
37
38
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:customRow="customRowFn"
39
40
:rowSelection="{selectedRowKeys, onChange: onSelectChange, type: multiple ? 'checkbox':'radio'}"
class="j-table-force-nowrap"
41
@change="handleTableChange">
42
<span slot="zoneCode" slot-scope="zoneCode">
43
44
45
46
47
48
49
50
51
52
53
<a-tag :key="zoneCode" color=blue>
{{ solutionZoneCode(zoneCode) }}
</a-tag>
</span>
<span slot="fillStatus" slot-scope="fillStatus">
<a-tag :key="fillStatus" :color="getStatusColor(fillStatus)">
{{ fillStatus_dictText(fillStatus) }}
</a-tag>
</span>
54
55
56
57
</a-table>
</a-col>
<a-col :span="8">
肖超群
authored
about a year ago
58
<a-card :title="this.$t('button.select') + ' ' + name" :bordered="false" :head-style="{padding:0}" :body-style="{padding:0}">
59
60
<a-table size="middle" :rowKey="rowKey" bordered v-bind="selectedTable">
<span slot="action" slot-scope="text, record, index">
谭毅彬
authored
about a year ago
61
<a @click="handleDeleteSelected(record, index)">{{$t('button.delete')}}</a>
62
63
64
65
66
67
68
69
70
</span>
</a-table>
</a-card>
</a-col>
</a-row>
</j-modal>
</template>
<script>
71
72
73
74
75
76
import {getAction} from '@/api/manage'
import Ellipsis from '@/components/Ellipsis'
import {JeecgListMixin} from '@/mixins/JeecgListMixin'
import {pushIfNotExist} from '@/utils/util'
import JSelectBizQueryItem from './JSelectBizQueryItem'
import {cloneDeep} from 'lodash'
77
import {ajaxGetDictItems, getZoneList} from "@api/api";
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
export default {
name: 'JSelectBizComponentModal',
mixins: [JeecgListMixin],
components: {Ellipsis, JSelectBizQueryItem},
props: {
value: {
type: Array,
default: () => []
},
visible: {
type: Boolean,
default: false
},
valueKey: {
type: String,
required: true
},
multiple: {
type: Boolean,
default: true
},
width: {
type: Number,
default: 900
},
104
105
106
107
name: {
type: String,
default: ''
108
},
109
110
111
112
listUrl: {
type: String,
required: true,
default: ''
113
},
114
115
116
117
// 根据 value 获取显示文本的地址,例如存的是 username,可以通过该地址获取到 realname
valueUrl: {
type: String,
default: ''
118
},
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
displayKey: {
type: String,
default: null
},
columns: {
type: Array,
required: true,
default: () => []
},
// 查询条件Code
queryParamCode: {
type: String,
default: null
},
// 查询条件文字
queryParamText: {
type: String,
default: null
},
138
139
140
141
142
// 查询条件占位符
queryParamPlaceholder: {
type: String,
default: null
},
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// 查询配置
queryConfig: {
type: Array,
default: () => []
},
rowKey: {
type: String,
default: 'id'
},
// 过长裁剪长度,设置为 -1 代表不裁剪
ellipsisLength: {
type: Number,
default: 12
},
},
data() {
return {
innerValue: [],
161
162
zoneList: [],
zoneOptions:[],
163
fillStatusList:[],
164
165
166
167
168
169
170
171
// 已选择列表
selectedTable: {
pagination: false,
columns: [
{
...this.columns[0],
width: this.columns[0].widthRight || this.columns[0].width,
},
谭毅彬
authored
about a year ago
172
{title: this.$t('system.options'), dataIndex: 'action', align: 'center', width: 100, scopedSlots: {customRender: 'action'}}
173
174
],
dataSource: [],
175
},
176
177
178
179
180
181
182
183
renderEllipsis: (value) => (<ellipsis length={this.ellipsisLength}>{value}</ellipsis>),
url: {list: this.listUrl},
/* 分页参数 */
ipagination: {
current: 1,
pageSize: 5,
pageSizeOptions: ['5', '10', '20', '30'],
showTotal: (total, range) => {
谭毅彬
authored
about a year ago
184
return range[0] + '-' + range[1] + " " + this.$t('list.showing') + " " + total + " " + this.$t('list.records')
185
186
187
188
},
showQuickJumper: true,
showSizeChanger: true,
total: 0
189
},
190
191
192
193
194
options: [],
dataSourceMap: {},
showMoreQueryItems: false,
}
},
195
196
197
created() {
this.loadFrom();
},
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
computed: {
// 表头
innerColumns() {
let columns = cloneDeep(this.columns)
columns.forEach(column => {
// 给所有的列加上过长裁剪
if (this.ellipsisLength !== -1) {
// JSelectBizComponent columns 建议开放customRender等方法类配置
// https://github.com/jeecgboot/jeecg-boot/issues/3203
let myCustomRender = column.customRender
column.customRender = (text, record, index) => {
let value = text
if (typeof myCustomRender === 'function') {
// noinspection JSVoidFunctionReturnValueUsed
value = myCustomRender(text, record, index)
213
}
214
215
if (typeof value === 'string') {
return this.renderEllipsis(value)
216
}
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
return value
}
}
})
return columns
},
},
watch: {
value: {
deep: true,
immediate: true,
handler(val) {
this.innerValue = cloneDeep(val)
this.selectedRowKeys = []
this.valueWatchHandler(val)
this.queryOptionsByValue(val)
233
234
}
},
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
dataSource: {
deep: true,
handler(val) {
this.emitOptions(val)
this.valueWatchHandler(this.innerValue)
}
},
selectedRowKeys: {
immediate: true,
deep: true,
handler(val) {
//update--begin--autor:scott-----date:20200927------for:选取职务名称出现全选 #1753-----
if (this.innerValue) {
this.innerValue.length = 0;
}
//update--end--autor:scott-----date:20200927------for:选取职务名称出现全选 #1753-----
this.selectedTable.dataSource = val.map(key => {
for (let data of this.dataSource) {
if (data[this.rowKey] === key) {
pushIfNotExist(this.innerValue, data[this.valueKey])
return data
256
}
257
258
259
260
261
262
263
264
265
}
for (let data of this.selectedTable.dataSource) {
if (data[this.rowKey] === key) {
pushIfNotExist(this.innerValue, data[this.valueKey])
return data
}
}
console.warn('未找到选择的行信息,key:' + key)
return {}
266
267
})
},
268
269
}
},
270
271
272
273
274
275
276
277
278
279
280
281
methods: {
/** 关闭弹窗 */
close() {
this.$emit('update:visible', false)
},
valueWatchHandler(val) {
val.forEach(item => {
this.dataSource.concat(this.selectedTable.dataSource).forEach(data => {
if (data[this.valueKey] === item) {
pushIfNotExist(this.selectedRowKeys, data[this.rowKey])
282
}
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
})
})
},
queryOptionsByValue(value) {
if (!value || value.length === 0) {
return
}
// 判断options是否存在value,如果已存在数据就不再请求后台了
let notExist = false
for (let val of value) {
let find = false
for (let option of this.options) {
if (val === option.value) {
find = true
298
299
300
break
}
}
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
if (!find) {
notExist = true
break
}
}
if (!notExist) return
getAction(this.valueUrl || this.listUrl, {
// 这里最后加一个 , 的原因是因为无论如何都要使用 in 查询,防止后台进行了模糊匹配,导致查询结果不准确
[this.valueKey]: value.join(',') + ',',
pageNo: 1,
pageSize: value.length
}).then((res) => {
if (res.success) {
let dataSource = res.result
if (!(dataSource instanceof Array)) {
dataSource = res.result.records
317
}
318
319
320
321
322
323
324
325
this.emitOptions(dataSource, (data) => {
pushIfNotExist(this.innerValue, data[this.valueKey])
pushIfNotExist(this.selectedRowKeys, data[this.rowKey])
pushIfNotExist(this.selectedTable.dataSource, data, this.rowKey)
})
}
})
},
326
327
328
329
330
331
332
333
334
335
emitOptions(dataSource, callback) {
dataSource.forEach(data => {
let key = data[this.valueKey]
this.dataSourceMap[key] = data
pushIfNotExist(this.options, {label: data[this.displayKey || this.valueKey], value: key}, 'value')
typeof callback === 'function' ? callback(data) : ''
})
this.$emit('options', this.options, this.dataSourceMap)
},
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
/** 完成选择 */
handleOk() {
let value = this.selectedTable.dataSource.map(data => data[this.valueKey])
this.$emit('input', value)
this.close()
},
/** 删除已选择的 */
handleDeleteSelected(record, index) {
this.selectedRowKeys.splice(this.selectedRowKeys.indexOf(record[this.rowKey]), 1)
//update--begin--autor:wangshuai-----date:20200722------for:JSelectBizComponent组件切换页数值问题------
this.selectedTable.dataSource.splice(this.selectedTable.dataSource.indexOf(record), 1)
this.innerValue.splice(this.innerValue.indexOf(record[this.valueKey]), 1)
console.log("this.selectedRowKeys:", this.selectedRowKeys)
console.log("this.selectedTable.dataSource:", this.selectedTable.dataSource)
//update--begin--autor:wangshuai-----date:20200722------for:JSelectBizComponent组件切换页数值问题------
},
353
354
355
356
357
358
359
360
361
362
363
solutionZoneCode(value) {
var actions = []
Object.keys(this.zoneList).some((key) => {
if (this.zoneList[key].code == ('' + value)) {
actions.push(this.zoneList[key].name)
return true
}
})
return actions.join('')
},
364
365
366
367
368
369
370
371
372
373
fillStatus_dictText(value) {
var actions = []
Object.keys(this.fillStatusList).some((key) => {
if (this.fillStatusList[key].value == ('' + value)) {
actions.push(this.fillStatusList[key].text)
return true
}
})
return actions.join('')
},
374
375
376
377
378
379
380
381
382
383
384
385
386
387
loadFrom() {
getZoneList().then((res) => {
if (res.success) {
this.zoneList = res.result
//延迟半秒执行,避免组件未加载完,数据已经加载完
setTimeout(()=>{
//slice可以在数组的任何位置进行删除/添加操作
this.zoneOptions.splice(0, 1);
for (let i = 0; i < res.result.length; i++) {
this.zoneOptions.push({value:res.result[i].code,text:res.result[i].name})
}
},500)
}
});
388
389
390
391
392
393
var dictCode = "fill_status"
ajaxGetDictItems(dictCode, null).then((res) => {
if (res.success) {
this.fillStatusList = res.result;
}
})
394
395
},
396
397
398
399
400
401
402
403
404
405
406
407
408
customRowFn(record) {
return {
on: {
click: () => {
let key = record[this.rowKey]
if (!this.multiple) {
this.selectedRowKeys = [key]
this.selectedTable.dataSource = [record]
} else {
let index = this.selectedRowKeys.indexOf(key)
if (index === -1) {
this.selectedRowKeys.push(key)
this.selectedTable.dataSource.push(record)
409
} else {
410
this.handleDeleteSelected(record, index)
411
412
413
414
}
}
}
}
415
416
}
},
417
418
}
419
}
420
421
</script>
<style lang="less" scoped>
422
423
424
.full-form-item {
display: flex;
margin-right: 0;
425
426
427
428
/deep/ .ant-form-item-control-wrapper {
flex: 1 1;
display: inline-block;
429
}
430
}
431
432
433
.j-inline-form {
/deep/ .ant-form-item {
谭毅彬
authored
about a year ago
434
margin-bottom: 24px;
435
}
436
437
438
439
440
/deep/ .ant-form-item-label {
line-height: 32px;
width: auto;
}
441
442
443
444
/deep/ .ant-form-item-control {
height: 32px;
line-height: 32px;
445
}
446
}
447
</style>