lw-cdp-ui 1.2.21 → 1.2.22

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.
@@ -3,379 +3,447 @@ import { onBeforeMount, reactive, ref, watch, toRefs, getCurrentInstance } from
3
3
  import dayjs from 'dayjs'
4
4
 
5
5
  export default {
6
- name: 'lwTable',
7
- props: {
8
- refName: { type: String, default: 'multipleTableRef' },
9
- tableName: { type: String, default: '' },
10
- isRadio: { type: Boolean, default: false },
11
- bordered: { type: Boolean, default: true },
12
- stripe: { type: Boolean, default: false },
13
- summaryMethod: { type: Function, default: () => [] },
14
- rowKey: { type: String, default: 'id' },
15
- defaultSelectData: { type: Array, default: () => [] },
16
- searchParams: { type: Object, default: () => ({ page: 1, size: 20 }) },
17
- selectStatus: { type: Function, default: () => true },
18
- pageSizes: { type: Array, default: () => [10, 20, 30, 40, 50] },
19
- isShowPagination: { type: Boolean, default: true },
20
- tableData: { type: Array, default: [] },
21
- totalCount: { type: Number, default: 0 },
22
- tableColumns: { type: Array, default: [] },
23
- hoverable: { type: Boolean, default: true },
24
- defaultExpandAll: { type: Boolean, default: false },
25
- isSetting: { type: Boolean, default: false },
26
- saveKey: { type: String, default: '' },
27
- orderPage: { type: Boolean, default: false },
28
- tableSize: { type: String, default: 'large' },
29
- loading: { type: Boolean, default: false },
30
- rowSelection: { type: Boolean, default: false },
31
- selectedKeys: { type: Array },
32
- selectDatas: { type: Array },
33
- hideTool: { type: Boolean, default: true },
34
- virtualListProps: { type: Object, default: undefined },
35
- draggable: { type: Object },
36
- maxHeight: { type: String, default: 'calc(100vh - 270px)' }
37
- },
38
- setup(props, context) {
39
- const multipleTable = ref()
40
- const {
41
- proxy: { $bus, $tool }
42
- } = getCurrentInstance()
43
- const { isFullscreen, toggle: toggleFullScreen } = useFullscreen()
44
- const state = reactive({
45
- dialogVisible: false,
46
- tableSettingTitle: '选择字段',
47
-
48
- tableHeaderListAll: [],
49
- checkedList: [],
50
- defaultProps: {
51
- children: 'children',
52
- label: 'label'
53
- },
54
- num: 0,
55
- endFixed: false,
56
- filterHeader: [],
57
- tableSize: props.tableSize,
58
-
59
- checkedKeys: [],
60
- treeData: [],
61
- allCheck: true,
62
- lastColumsFixed: true,
63
- tableHeaders: [],
64
- fixNum: 0
65
- })
66
-
67
- // 处理数据
68
- const filterData = () => {
69
- let list = props.tableColumns
70
-
71
- state.checkedKeys = []
72
- let arr = []
73
- list.forEach((item, index) => {
74
- if (!item.key) {
75
- item.key = $tool.getUUID()
76
- }
77
- if (!!item.checked || item.checked == undefined) {
78
- state.checkedKeys.push(item.key)
79
- arr.push(item)
80
- }
81
- })
82
- state.treeData = list
83
- state.tableHeaders = arr
84
- }
85
-
86
- onBeforeMount(async () => {
87
- window.addEventListener('resize', () => {
88
- let isFull =
89
- document.mozFullScreen || document.fullScreen || document.webkitIsFullScreen || document.webkitRequestFullScreen || document.mozRequestFullScreen || document.msFullscreenEnabled
90
- if (isFull === undefined) {
91
- isFull = false
92
- }
93
- if (isFull == false) {
94
- $bus.$emit('tableFullScreen', false)
95
- }
96
- })
97
- })
98
-
99
- watch(
100
- () => props.tableColumns,
101
- (newVal) => {
102
- filterData()
103
- },
104
- { deep: true, immediate: true }
105
- )
106
-
107
- const selectedKeysForm = ref([])
108
- const selectGoodsDatas = ref([])
109
- const selectAllGoods = ref([])
110
-
111
- watch(
112
- () => props.tableData,
113
- (newVal) => {
114
- const allArr = [...newVal, ...selectAllGoods.value]
115
- const allObj = {}
116
- const newAllArr = allArr.reduce((cur, next) => {
117
- allObj[next[props.rowKey]] ? '' : (allObj[next[props.rowKey]] = true && cur.push(next))
118
- return cur
119
- }, [])
120
- selectAllGoods.value = newAllArr || []
121
- },
122
- { deep: true, immediate: true }
123
- )
124
-
125
- watch(
126
- () => props.selectedKeys,
127
- (newVal) => {
128
- selectedKeysForm.value = newVal
129
- selectGoodsDatas.value = []
130
-
131
- if (selectAllGoods.value.length && !!newVal) {
132
- const data = selectAllGoods.value.filter((item) => {
133
- return newVal.includes(item[props.rowKey])
134
- })
135
- const arr = [...data, ...selectGoodsDatas.value]
136
- const obj = {}
137
- const newArr = arr.reduce((cur, next) => {
138
- obj[next[props.rowKey]] ? '' : (obj[next[props.rowKey]] = true && cur.push(next))
139
- return cur
140
- }, [])
141
- selectGoodsDatas.value = newArr || []
142
- context.emit('update:selectDatas', newArr)
143
- }
144
- },
145
- { deep: true, immediate: true }
146
- )
147
-
148
- const handleChange = (currentData) => {
149
- context.emit('draggable', currentData)
150
- }
151
-
152
- const handleSelectionChange = (val) => {
153
- context.emit('multipleSelection', val)
154
- }
155
-
156
- const handleCurrentChange = (val) => {
157
- context.emit('currentChange', val)
158
- }
159
-
160
- const sizeChange = (val) => {
161
- props.searchParams.size = val
162
- context.emit('getTableData')
163
- }
164
-
165
- const currentChange = (page) => {
166
- props.searchParams.page = page - 1
167
-
168
- context.emit('getTableData', props.searchParams.page)
169
- }
170
-
171
- const refresh = () => {
172
- currentChange(1)
173
- }
174
-
175
- const toggleRowChange = (row, status) => {
176
- multipleTable.value.toggleRowSelection(row, status)
177
- }
178
-
179
- const clearTableSelection = (row, status) => {
180
- multipleTable.value.clearSelection()
181
- }
182
-
183
- const allowDrop = (draggingNode, dropNode, type) => {
184
- return type !== 'inner'
185
- }
186
-
187
- const allowDrag = (draggingNode) => {
188
- return draggingNode.data.label.indexOf('Level three 3-1-1') === -1
189
- }
190
-
191
- const tableSetting = () => {
192
- state.tableSettingTitle = '选择字段'
193
- state.dialogVisible = true
194
- }
195
-
196
- const next = () => {
197
- if (state.checkedList.length === 0) {
198
- Message.error('选择字段不可以为空!')
199
- return
200
- }
201
- state.tableSettingTitle = '排序'
202
-
203
- state.treeData = []
204
- let num = 0
205
- let list = JSON.parse(JSON.stringify(state.checkedList))
206
- list.forEach((item, index) => {
207
- props.tableHeader.forEach((it) => {
208
- if (item === it.label) {
209
- let obj = {
210
- label: item,
211
- children: [],
212
- index: index,
213
- fixed: it.fixed ? it.fixed : ''
214
- }
215
- state.treeData.push(obj)
216
- if (it.fixed === 'left') {
217
- num++
218
- } else if (it.fixed === 'right') {
219
- state.endFixed = true
220
- }
221
- }
222
- })
223
-
224
- state.num = num
225
- })
226
- }
227
-
228
- const prev = () => {
229
- state.tableSettingTitle = '选择字段'
230
- }
231
-
232
- const tableHeaderConfirm = () => {
233
- if ((state.num > 2 && state.endFixed) || (state.num > 3 && !state.endFixed)) {
234
- Message.error('固定列最多只能选择3列!')
235
- return
236
- }
237
- state.tableHeaderList = []
238
- state.treeData.forEach((item, index) => {
239
- if (state.num > 0 && state.num > index) {
240
- item.fixed = 'left'
241
- } else if (state.endFixed && index === state.treeData.length - 1) {
242
- item.fixed = 'right'
243
- } else {
244
- item.fixed = ''
245
- }
246
- state.tableHeaderList.push(item)
247
- })
248
- state.dialogVisible = false
249
- let obj = {
250
- userId: 1,
251
- json: state.tableHeaderList
252
- }
253
- localStorage.setItem('userTable', JSON.stringify(obj))
254
- }
255
-
256
- const download = (url) => {
257
- let fileUrl =
258
- (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test') && location.hostname !== 'localhost' ? location.origin + url : 'http://dev.yihai.lianwei.com.cn' + url
259
- window.open(fileUrl, '_blank')
260
- }
261
-
262
- const sortChange = ({ column, prop, order }) => {
263
- props.searchParams.sortField = prop?.split(',')[0]
264
- props.searchParams.sortType = order
265
- const data = { ...props.searchParams }
266
- context.emit('getTableData', data)
267
- }
268
-
269
- const getHeader = (header) => {
270
- context.emit('getHeader', header)
271
- }
272
-
273
- const handleSelect = (v) => {
274
- state.tableSize = v
275
- }
276
-
277
- const checkAll = (selected) => {
278
- if (selected) {
279
- state.tableHeaders = JSON.parse(JSON.stringify(props.tableColumns))
280
- state.tableHeaders.forEach((item, index) => {
281
- if (!item.key) {
282
- item.key = $tool.getUUID()
283
- }
284
- state.checkedKeys.push(item.key)
285
- })
286
- } else {
287
- state.tableHeaders = []
288
- state.checkedKeys = []
289
- }
290
-
291
- state.treeData.forEach((item) => {
292
- item.checked = selected
293
- })
294
- }
295
-
296
- const treeCheck = () => {
297
- let list = state.treeData.filter((t) => state.checkedKeys.includes(t.key))
298
- state.tableHeaders = list
299
- }
300
-
301
- const tableToggleFullScreen = () => {
302
- $bus.$emit('tableFullScreen', !isFullscreen.value)
303
- toggleFullScreen()
304
- }
305
-
306
- const fixNumChange = () => {
307
- let num = state.fixNum
308
- if (num > 0) {
309
- state.tableHeaders.forEach((item, index) => {
310
- if (index < num) {
311
- item.fixed = 'left'
312
- item.width = item.width ?? '120'
313
- }
314
- })
315
- } else {
316
- state.tableHeaders.forEach((item) => {
317
- if (item.fixed === 'left') {
318
- delete item.fixed
319
- }
320
- })
321
- }
322
- }
323
-
324
- const setSelectAll = (status) => {
325
- multipleTable.value.selectAll(status)
326
- context.emit('update:selectedKeys', status ? props.tableData.map((item) => item.id) : [])
327
- }
328
-
329
- const setSelect = (rowKey, status) => {
330
- multipleTable.value.select(rowKey, status)
331
- const selectedKeys = [...props.selectedKeys]
332
- context.emit('update:selectedKeys', status ? selectedKeys.push(rowKey) : selectedKeys.filter((item) => item !== rowKey))
333
- }
334
-
335
- const selectAll = (status) => {
336
- context.emit('update:selectedKeys', status ? props.tableData.map((item) => item[props.rowKey]) : [])
337
- }
338
-
339
- const select = (rowKeys, rowKey, record) => {
340
- context.emit('update:selectedKeys', rowKeys)
341
- }
342
-
343
- const changeColWidth = (newWidth, oldWidth, { property }) => {}
344
-
345
- return {
346
- ...toRefs(state),
347
- refresh,
348
- dayjs,
349
- handleChange,
350
- handleSelectionChange,
351
- handleCurrentChange,
352
- sizeChange,
353
- currentChange,
354
- multipleTable,
355
- allowDrop,
356
- allowDrag,
357
- tableSetting,
358
- next,
359
- prev,
360
- tableHeaderConfirm,
361
- toggleRowChange,
362
- clearTableSelection,
363
- download,
364
- sortChange,
365
- getHeader,
366
- handleSelect,
367
- checkAll,
368
- tableToggleFullScreen,
369
- isFullscreen,
370
- treeCheck,
371
- fixNumChange,
372
- setSelectAll,
373
- setSelect,
374
- selectedKeysForm,
375
- selectGoodsDatas,
376
- selectAll,
377
- select,
378
- changeColWidth
379
- }
380
- }
381
- }
6
+ name: 'lwTable',
7
+ // 组件属性定义
8
+ props: {
9
+ refName: { type: String, default: 'multipleTableRef' }, // 表格ref名称
10
+ tableName: { type: String, default: '' }, // 表格名称
11
+ isRadio: { type: Boolean, default: false }, // 是否单选
12
+ bordered: { type: Boolean, default: true }, // 是否显示边框
13
+ stripe: { type: Boolean, default: false }, // 是否显示斑马纹
14
+ summaryMethod: { type: Function, default: () => [] }, // 合计行计算方法
15
+ rowKey: { type: String, default: 'id' }, // 行数据的唯一标识
16
+ defaultSelectData: { type: Array, default: () => [] }, // 默认选中的数据
17
+ searchParams: { type: Object, default: () => ({ page: 1, size: 20 }) }, // 查询参数
18
+ selectStatus: { type: Function, default: () => true }, // 选择状态判断函数
19
+ pageSizes: { type: Array, default: () => [10, 20, 30, 40, 50] }, // 分页大小选项
20
+ isShowPagination: { type: Boolean, default: true }, // 是否显示分页
21
+ tableData: { type: Array, default: [] }, // 表格数据
22
+ totalCount: { type: Number, default: 0 }, // 数据总数
23
+ tableColumns: { type: Array, default: [] }, // 表格列配置
24
+ hoverable: { type: Boolean, default: true }, // 是否启用悬停效果
25
+ defaultExpandAll: { type: Boolean, default: false }, // 是否默认展开所有行
26
+ isSetting: { type: Boolean, default: false }, // 是否启用设置功能
27
+ saveKey: { type: String, default: '' }, // 保存设置的键名
28
+ orderPage: { type: Boolean, default: false }, // 是否为订单页面
29
+ tableSize: { type: String, default: 'large' }, // 表格大小
30
+ loading: { type: Boolean, default: false }, // 加载状态
31
+ rowSelection: { type: Boolean, default: false }, // 是否可选择行
32
+ selectedKeys: { type: Array }, // 选中的键值数组
33
+ selectDatas: { type: Array }, // 选中的数据数组
34
+ hideTool: { type: Boolean, default: true }, // 是否隐藏工具栏
35
+ virtualListProps: { type: Object, default: undefined }, // 虚拟列表属性
36
+ draggable: { type: Object }, // 拖拽配置
37
+ maxHeight: { type: String, default: 'calc(100vh - 270px)' } // 最大高度
38
+ },
39
+
40
+ setup(props, context) {
41
+ // 表格引用
42
+ const multipleTable = ref()
43
+
44
+ // 获取全局实例
45
+ const {
46
+ proxy: { $bus, $tool }
47
+ } = getCurrentInstance()
48
+
49
+ // 全屏相关状态
50
+ const { isFullscreen, toggle: toggleFullScreen } = useFullscreen()
51
+
52
+ // 响应式状态数据
53
+ const state = reactive({
54
+ dialogVisible: false, // 对话框可见性
55
+ tableSettingTitle: '选择字段', // 表格设置标题
56
+ tableHeaderListAll: [], // 所有表头列表
57
+ checkedList: [], // 已选中列表
58
+ defaultProps: {
59
+ children: 'children',
60
+ label: 'label'
61
+ },
62
+ num: 0, // 计数器
63
+ endFixed: false, // 是否固定末尾
64
+ filterHeader: [], // 过滤后的表头
65
+ tableSize: props.tableSize, // 表格大小
66
+ checkedKeys: [], // 选中的键
67
+ treeData: [], // 树形数据
68
+ allCheck: true, // 是否全选
69
+ lastColumsFixed: true, // 最后一列是否固定
70
+ tableHeaders: [], // 表格表头
71
+ fixNum: 0 // 固定列数量
72
+ })
73
+
74
+ // 过滤数据处理
75
+ const filterData = () => {
76
+ let list = props.tableColumns
77
+ state.checkedKeys = []
78
+ let arr = []
79
+ list.forEach((item, index) => {
80
+ if (!item.key) {
81
+ item.key = $tool.getUUID()
82
+ }
83
+ if (!!item.checked || item.checked == undefined) {
84
+ state.checkedKeys.push(item.key)
85
+ arr.push(item)
86
+ }
87
+ })
88
+ state.treeData = list
89
+ state.tableHeaders = arr
90
+ }
91
+
92
+ // 组件挂载前
93
+ onBeforeMount(async () => {
94
+ // 监听窗口大小变化,处理全屏状态
95
+ window.addEventListener('resize', () => {
96
+ let isFull =
97
+ document.mozFullScreen ||
98
+ document.fullScreen ||
99
+ document.webkitIsFullScreen ||
100
+ document.webkitRequestFullScreen ||
101
+ document.mozRequestFullScreen ||
102
+ document.msFullscreenEnabled
103
+ if (isFull === undefined) {
104
+ isFull = false
105
+ }
106
+ if (isFull == false) {
107
+ $bus.$emit('tableFullScreen', false)
108
+ }
109
+ })
110
+ })
111
+
112
+ // 监听表格列变化
113
+ watch(
114
+ () => props.tableColumns,
115
+ (newVal) => {
116
+ filterData()
117
+ },
118
+ { deep: true, immediate: true }
119
+ )
120
+
121
+ // 选择相关的响应式引用
122
+ const selectedKeysForm = ref([])
123
+ const selectGoodsDatas = ref([])
124
+ const selectAllGoods = ref([])
125
+
126
+ // 监听表格数据变化
127
+ watch(
128
+ () => props.tableData,
129
+ (newVal) => {
130
+ // 合并并去重数据
131
+ const allArr = [...newVal, ...selectAllGoods.value]
132
+ const allObj = {}
133
+ const newAllArr = allArr.reduce((cur, next) => {
134
+ allObj[next[props.rowKey]] ? '' : (allObj[next[props.rowKey]] = true && cur.push(next))
135
+ return cur
136
+ }, [])
137
+ selectAllGoods.value = newAllArr || []
138
+ },
139
+ { deep: true, immediate: true }
140
+ )
141
+
142
+ // 监听选中键变化
143
+ watch(
144
+ () => props.selectedKeys,
145
+ (newVal) => {
146
+ selectedKeysForm.value = newVal
147
+ selectGoodsDatas.value = []
148
+
149
+ if (selectAllGoods.value.length && !!newVal) {
150
+ // 过滤并合并选中数据
151
+ const data = selectAllGoods.value.filter((item) => {
152
+ return newVal.includes(item[props.rowKey])
153
+ })
154
+ const arr = [...data, ...selectGoodsDatas.value]
155
+ const obj = {}
156
+ const newArr = arr.reduce((cur, next) => {
157
+ obj[next[props.rowKey]] ? '' : (obj[next[props.rowKey]] = true && cur.push(next))
158
+ return cur
159
+ }, [])
160
+ selectGoodsDatas.value = newArr || []
161
+ context.emit('update:selectDatas', newArr)
162
+ }
163
+ },
164
+ { deep: true, immediate: true }
165
+ )
166
+
167
+ // 拖拽处理函数
168
+ const handleChange = (currentData) => {
169
+ context.emit('draggable', currentData)
170
+ }
171
+
172
+ // 选择变化处理函数
173
+ const handleSelectionChange = (val) => {
174
+ context.emit('multipleSelection', val)
175
+ }
176
+
177
+ // 当前项变化处理函数
178
+ const handleCurrentChange = (val) => {
179
+ context.emit('currentChange', val)
180
+ }
181
+
182
+ // 分页大小变化处理函数
183
+ const sizeChange = (val) => {
184
+ props.searchParams.size = val
185
+ context.emit('getTableData')
186
+ }
187
+
188
+ // 页码变化处理函数
189
+ const currentChange = (page) => {
190
+ props.searchParams.page = page - 1
191
+ context.emit('getTableData', props.searchParams.page)
192
+ }
193
+
194
+ // 刷新处理函数
195
+ const refresh = () => {
196
+ currentChange(1)
197
+ }
198
+
199
+ // 切换行选择状态
200
+ const toggleRowChange = (row, status) => {
201
+ multipleTable.value.toggleRowSelection(row, status)
202
+ }
203
+
204
+ // 清除表格选择
205
+ const clearTableSelection = (row, status) => {
206
+ multipleTable.value.clearSelection()
207
+ }
208
+
209
+ // 允许拖拽放置判断
210
+ const allowDrop = (draggingNode, dropNode, type) => {
211
+ return type !== 'inner'
212
+ }
213
+
214
+ // 允许拖拽判断
215
+ const allowDrag = (draggingNode) => {
216
+ return draggingNode.data.label.indexOf('Level three 3-1-1') === -1
217
+ }
218
+
219
+ // 表格设置处理函数
220
+ const tableSetting = () => {
221
+ state.tableSettingTitle = '选择字段'
222
+ state.dialogVisible = true
223
+ }
224
+
225
+ // 下一步处理函数
226
+ const next = () => {
227
+ if (state.checkedList.length === 0) {
228
+ Message.error('选择字段不可以为空!')
229
+ return
230
+ }
231
+ state.tableSettingTitle = '排序'
232
+
233
+ state.treeData = []
234
+ let num = 0
235
+ let list = JSON.parse(JSON.stringify(state.checkedList))
236
+ list.forEach((item, index) => {
237
+ props.tableHeader.forEach((it) => {
238
+ if (item === it.label) {
239
+ let obj = {
240
+ label: item,
241
+ children: [],
242
+ index: index,
243
+ fixed: it.fixed ? it.fixed : ''
244
+ }
245
+ state.treeData.push(obj)
246
+ if (it.fixed === 'left') {
247
+ num++
248
+ } else if (it.fixed === 'right') {
249
+ state.endFixed = true
250
+ }
251
+ }
252
+ })
253
+
254
+ state.num = num
255
+ })
256
+ }
257
+
258
+ // 上一步处理函数
259
+ const prev = () => {
260
+ state.tableSettingTitle = '选择字段'
261
+ }
262
+
263
+ // 表头确认处理函数
264
+ const tableHeaderConfirm = () => {
265
+ if ((state.num > 2 && state.endFixed) || (state.num > 3 && !state.endFixed)) {
266
+ Message.error('固定列最多只能选择3列!')
267
+ return
268
+ }
269
+ state.tableHeaderList = []
270
+ state.treeData.forEach((item, index) => {
271
+ if (state.num > 0 && state.num > index) {
272
+ item.fixed = 'left'
273
+ } else if (state.endFixed && index === state.treeData.length - 1) {
274
+ item.fixed = 'right'
275
+ } else {
276
+ item.fixed = ''
277
+ }
278
+ state.tableHeaderList.push(item)
279
+ })
280
+ state.dialogVisible = false
281
+ let obj = {
282
+ userId: 1,
283
+ json: state.tableHeaderList
284
+ }
285
+ localStorage.setItem('userTable', JSON.stringify(obj))
286
+ }
287
+
288
+ // 下载处理函数
289
+ const download = (url) => {
290
+ let fileUrl =
291
+ (process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test') && location.hostname !== 'localhost'
292
+ ? location.origin + url
293
+ : 'http://dev.yihai.lianwei.com.cn' + url
294
+ window.open(fileUrl, '_blank')
295
+ }
296
+
297
+ // 排序变化处理函数
298
+ const sortChange = ({ column, prop, order }) => {
299
+ props.searchParams.sortField = prop?.split(',')[0]
300
+ props.searchParams.sortType = order
301
+ const data = { ...props.searchParams }
302
+ context.emit('getTableData', data)
303
+ }
304
+
305
+ // 获取表头处理函数
306
+ const getHeader = (header) => {
307
+ context.emit('getHeader', header)
308
+ }
309
+
310
+ // 选择处理函数
311
+ const handleSelect = (v) => {
312
+ state.tableSize = v
313
+ }
314
+
315
+ // 全选处理函数
316
+ const checkAll = (selected) => {
317
+ if (selected) {
318
+ state.tableHeaders = JSON.parse(JSON.stringify(props.tableColumns))
319
+ state.tableHeaders.forEach((item, index) => {
320
+ if (!item.key) {
321
+ item.key = $tool.getUUID()
322
+ }
323
+ state.checkedKeys.push(item.key)
324
+ })
325
+ } else {
326
+ state.tableHeaders = []
327
+ state.checkedKeys = []
328
+ }
329
+
330
+ state.treeData.forEach((item) => {
331
+ item.checked = selected
332
+ })
333
+ }
334
+
335
+ // 树形选择处理函数
336
+ const treeCheck = () => {
337
+ let list = state.treeData.filter((t) => state.checkedKeys.includes(t.key))
338
+ state.tableHeaders = list
339
+ }
340
+
341
+ // 表格全屏切换处理函数
342
+ const tableToggleFullScreen = () => {
343
+ $bus.$emit('tableFullScreen', !isFullscreen.value)
344
+ toggleFullScreen()
345
+ }
346
+
347
+ // 固定列数量变化处理函数
348
+ const fixNumChange = () => {
349
+ let num = state.fixNum
350
+ if (num > 0) {
351
+ state.tableHeaders.forEach((item, index) => {
352
+ if (index < num) {
353
+ item.fixed = 'left'
354
+ item.width = item.width ?? '120'
355
+ }
356
+ })
357
+ } else {
358
+ state.tableHeaders.forEach((item) => {
359
+ if (item.fixed === 'left') {
360
+ delete item.fixed
361
+ }
362
+ })
363
+ }
364
+ }
365
+
366
+ // 设置全选处理函数
367
+ const setSelectAll = (status) => {
368
+ multipleTable.value.selectAll(status)
369
+ context.emit('update:selectedKeys', status ? props.tableData.map((item) => item.id) : [])
370
+ }
371
+
372
+ // 设置选择处理函数
373
+ const setSelect = (rowKey, status) => {
374
+ multipleTable.value.select(rowKey, status)
375
+ const selectedKeys = [...props.selectedKeys]
376
+ context.emit('update:selectedKeys', status ? selectedKeys.push(rowKey) : selectedKeys.filter((item) => item !== rowKey))
377
+ }
378
+
379
+ // 全选处理函数
380
+ const selectAll = (status) => {
381
+ context.emit('update:selectedKeys', status ? props.tableData.map((item) => item[props.rowKey]) : [])
382
+ }
383
+
384
+ // 选择处理函数
385
+ const select = (rowKeys, rowKey, record) => {
386
+ context.emit('update:selectedKeys', rowKeys)
387
+ }
388
+
389
+ // 列宽变化处理函数
390
+ const changeColWidth = (newWidth, oldWidth, { property }) => {}
391
+
392
+ // 权限检查函数
393
+ const checkAuth = (auth) => {
394
+ const data = JSON.parse(localStorage.getItem('userAuthInfo'))
395
+ const { menus, authorities } = data
396
+ if (!auth) return true
397
+ if (Array.isArray(auth)) {
398
+ return auth.some((permission) => [...menus, ...authorities].includes(permission))
399
+ } else if (typeof auth === 'string') {
400
+ return [...menus, ...authorities].includes(auth)
401
+ }
402
+ return false
403
+ }
404
+
405
+ // 操作过滤函数
406
+ const filterOperations = (operations, row) => {
407
+ return operations.filter((o) => (!o?.isShow || o.isShow(row)) && checkAuth(o.auth))
408
+ }
409
+
410
+ // 返回所有需要暴露的属性和方法
411
+ return {
412
+ ...toRefs(state),
413
+ checkAuth,
414
+ filterOperations,
415
+ refresh,
416
+ dayjs,
417
+ handleChange,
418
+ handleSelectionChange,
419
+ handleCurrentChange,
420
+ sizeChange,
421
+ currentChange,
422
+ multipleTable,
423
+ allowDrop,
424
+ allowDrag,
425
+ tableSetting,
426
+ next,
427
+ prev,
428
+ tableHeaderConfirm,
429
+ toggleRowChange,
430
+ clearTableSelection,
431
+ download,
432
+ sortChange,
433
+ getHeader,
434
+ handleSelect,
435
+ checkAll,
436
+ tableToggleFullScreen,
437
+ isFullscreen,
438
+ treeCheck,
439
+ fixNumChange,
440
+ setSelectAll,
441
+ setSelect,
442
+ selectedKeysForm,
443
+ selectGoodsDatas,
444
+ selectAll,
445
+ select,
446
+ changeColWidth
447
+ }
448
+ }
449
+ }