wui-components-v2 1.1.70 → 1.1.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/api/feishu.ts +20 -20
  2. package/api/index.ts +4 -4
  3. package/api/login.ts +51 -51
  4. package/api/tree.ts +28 -28
  5. package/components/action-popup/action-popup.vue +116 -116
  6. package/components/add-address-list/add-address-list.vue +187 -187
  7. package/components/add-address-page/config.ts +297 -297
  8. package/components/audio-play/audio-play.vue +220 -220
  9. package/components/batch-upload-file/batch-upload-file.vue +75 -75
  10. package/components/card-botom-buttons/card-botom-buttons.vue +279 -279
  11. package/components/demo-card/demo-card.vue +44 -44
  12. package/components/fold-card/fold-card.vue +2 -2
  13. package/components/global-loading/GlobalLoading.md +366 -366
  14. package/components/global-loading/global-loading.vue +55 -55
  15. package/components/global-message/GlobalMessage.md +570 -570
  16. package/components/global-toast/GlobalToast.md +261 -261
  17. package/components/global-toast/global-toast.vue +56 -56
  18. package/components/label-value/open-value-more.vue +56 -56
  19. package/components/loading/loading.vue +5 -5
  20. package/components/login-form-box/login-form-box.vue +65 -65
  21. package/components/phone-login-form/phone-login-form.vue +204 -204
  22. package/components/privacy-popup/privacy-popup.vue +191 -191
  23. package/components/scan-input/scan-input.vue +406 -406
  24. package/components/select-col-picker/select-col-picker.vue +168 -168
  25. package/components/tab-search/tab-search.vue +73 -73
  26. package/components/tree-select/components/TreeNode.vue +200 -200
  27. package/components/tree-select/components/index.vue +471 -471
  28. package/components/tree-select/components/tree-select.vue +56 -56
  29. package/components/tree-select/index.vue +93 -93
  30. package/components/user-choose/user-choose.vue +169 -151
  31. package/components/video-play/video-play.vue +56 -56
  32. package/components/wui-auto-update-component/wui-auto-update-component.vue +132 -132
  33. package/components/wui-default/wui-default.vue +49 -49
  34. package/components/wui-details-page/wui-details-page.vue +147 -147
  35. package/components/wui-edit-page/wui-edit-page-copy.vue +757 -757
  36. package/components/wui-edit-page/wui-edit-page.vue +793 -793
  37. package/components/wui-login/wui-login.vue +43 -43
  38. package/components/wui-login1/wui-login.vue +41 -41
  39. package/components/wui-menus/wui-menus-top.vue +137 -137
  40. package/components/wui-menus/wui-menus-top1.vue +8 -8
  41. package/components/wui-menus1/components/banner-carousel.vue +320 -320
  42. package/components/wui-menus1/components/quick-panel.vue +55 -55
  43. package/components/wui-menus1/components/search-bar.vue +49 -49
  44. package/components/wui-menus1/components/section-menus.vue +208 -208
  45. package/components/wui-menus1/wui-menus-top.vue +718 -718
  46. package/components/wui-menus1/wui-menus-top1.vue +398 -398
  47. package/components/wui-notify-info/notify-handle.vue +53 -53
  48. package/components/wui-scan-binding-sensor/wui-scan-binding-sensor.vue +75 -75
  49. package/components/wui-search-history-babbar/components/SearchBar.vue +70 -70
  50. package/components/wui-select-popup/wui-select-popup.vue +1 -0
  51. package/components/wui-tree-page/wui-tree-page.vue +297 -297
  52. package/components/wui-update-component/wui-update-component.vue +221 -221
  53. package/composables/types/theme.ts +65 -65
  54. package/composables/types/user.ts +5 -5
  55. package/composables/useColorGenerator.ts +221 -221
  56. package/composables/useEnumes.ts +43 -43
  57. package/composables/useEventBus.ts +37 -37
  58. package/composables/useGlobalLoading.ts +47 -47
  59. package/composables/useGlobalMessage.ts +53 -53
  60. package/composables/useGlobalToast.ts +63 -63
  61. package/composables/useLocale.ts +54 -54
  62. package/composables/useManualTheme.ts +179 -179
  63. package/composables/useSectionMenus.ts +120 -120
  64. package/composables/useTabbar.ts +50 -50
  65. package/composables/useTheme.ts +74 -74
  66. package/composables/useUser.ts +24 -24
  67. package/index.d.ts +90 -90
  68. package/package.json +24 -24
  69. package/store/manualThemeStore.ts +143 -143
  70. package/store/persist.ts +41 -41
  71. package/store/themeStore.ts +74 -74
  72. package/store/userStore.ts +22 -22
  73. package/styles/dark-mode.scss +498 -498
  74. package/type.ts +154 -154
  75. package/utils/control-tree.ts +353 -353
  76. package/utils/eventBus.ts +36 -36
  77. package/utils/idata-scan.ts +99 -99
  78. package/utils/index.ts +979 -979
  79. package/utils/rsaEncrypt.ts +10 -10
@@ -1,757 +1,757 @@
1
- <!-- 用于测试 -->
2
- <script lang="ts" setup>
3
- import { computed, defineOptions, onBeforeMount, ref, toRaw } from 'vue'
4
- import { onLoad } from '@dcloudio/uni-app'
5
- import { useRouter } from 'uni-mini-router'
6
- import FormControl from '../form-control/form-control.vue'
7
- import { addPageConfig, editPageConfig, editPageDataSave, enums, selectDatas } from '../../api/page'
8
- import type { Entities, Enums, Groups, dtmplConfig } from '../../type'
9
- import { useGlobalToast } from '../../composables/useGlobalToast'
10
- import foldCard from '../fold-card/fold-card.vue'
11
- import { generateHighResolutionID } from '../../utils/index'
12
- import TreeSelectControl from '../tree-select/index.vue'
13
- import batchUploadFile from '../batch-upload-file/batch-upload-file.vue'
14
-
15
- defineOptions({
16
- name: 'WuiEditPage',
17
- })
18
- const pageConfig = ref<dtmplConfig>({
19
- id: '',
20
- title: '',
21
- groups: [],
22
- entity: {
23
- arrayMap: {},
24
- code: '',
25
- fieldMap: {},
26
- },
27
- buttons: [],
28
- })
29
- const tree = ref({ value: '', sourceId: '' })
30
- const loading = ref(false)
31
- const globalToast = useGlobalToast()
32
- const router = useRouter()
33
- const mainCode = ref('')
34
- const id = ref('')
35
- const sourceId = ref('')
36
- const formControlRef = ref()
37
- const subLoading = ref(false)
38
- const Enumcolumn = ref<Enums | undefined>()
39
- const pageTitle = ref('')
40
- const pageType = ref('')
41
- const selectData = ref<{ [key: string]: { loading: boolean, data: string[] } }>({})
42
- const rowData = ref<{ [key: string]: { [key: string]: any } }>({})
43
- const action = ref('')
44
- const hydrocarbonProgramToken = ref('')
45
- const token = ref('')
46
- // 全局事件名称
47
- const SELECTEVENT = generateHighResolutionID()
48
- const SENDSELECTEVENT = generateHighResolutionID()
49
- const addEvent = ref('')
50
- const editEvent = ref('')
51
- const rowAddEvent = ref('')
52
- const sendRowAddEvent = ref('')
53
- // 折叠面板
54
- const collapses = ref()
55
- const groupsformat = computed(() => {
56
- return pageConfig.value.groups.filter((item: Groups) => {
57
- return item.displayConfig.includes('displayed')
58
- })
59
- })
60
- onLoad((option: any) => {
61
- sourceId.value = option.sourceId
62
- mainCode.value = option.mainCode || ''
63
- id.value = option.id || ''
64
- pageTitle.value = option.title
65
- addEvent.value = option.addEvent
66
- editEvent.value = option.editEvent
67
- pageType.value = option.pageType || ''
68
- rowAddEvent.value = option.rowAddEvent
69
- sendRowAddEvent.value = option.sendRowAddEvent
70
- getEditPageConfig()
71
- })
72
- onBeforeMount(() => {
73
- action.value = uni.getStorageSync('BASE_URL')
74
- hydrocarbonProgramToken.value = uni.getStorageSync('HYDROCARBON_PROGRAM_TOKEN')
75
- token.value = uni.getStorageSync('TOKEN')
76
- })
77
- // 获取编辑页面配置
78
- async function getEditPageConfig() {
79
- // 判断是否为行新增事件
80
- if (sendRowAddEvent.value) {
81
- uni.$once(sendRowAddEvent.value, (conf: any) => {
82
- console.log('sendRowAddEvent.value', conf)
83
- pageConfig.value = {
84
- id: '',
85
- title: '行添加',
86
- groups: conf.groups,
87
- entity: conf.entity || {
88
- arrayMap: {},
89
- code: '',
90
- fieldMap: {},
91
- },
92
- buttons: [],
93
- }
94
- getEnums()
95
- uni.$off(sendRowAddEvent.value)
96
- })
97
- setTimeout(() => {
98
- collapses.value = pageConfig.value.groups.map((item: Groups) => {
99
- return item.id
100
- })
101
- }, 100)
102
-
103
- return
104
- }
105
-
106
- try {
107
- let res = null
108
- loading.value = true
109
- if (id.value) {
110
- res = await editPageConfig(sourceId.value, id.value)
111
- }
112
- else {
113
- res = await addPageConfig(sourceId.value)
114
- }
115
- loading.value = false
116
- // 初始化折叠面板
117
- if (res.dtmplConfig) {
118
- uni.setNavigationBarTitle({
119
- title: `${res.dtmplConfig.title}`,
120
- })
121
- pageConfig.value = res.dtmplConfig
122
- collapses.value = pageConfig.value.groups.map((item: Groups) => {
123
- return item.id
124
- })
125
-
126
- pageConfig.value.groups.forEach((item: Groups) => {
127
- // 初始化勾选数据
128
- if (item.type === 'relation' && (item.buttons.includes('dtmplAdd') || item.buttons.includes('selectAdd'))) {
129
- selectData.value[item.id] = {
130
- data: (pageConfig.value.entity && pageConfig.value.entity.arrayMap[item.id]?.map((sebitem: any) => {
131
- return `${sebitem.code}`
132
- })) || [],
133
- loading: false,
134
- }
135
- }
136
- // 初始化行数据
137
- if (item.type === 'relation' && item.buttons.includes('rowAdd')) {
138
- rowData.value[item.id] = (pageConfig.value.entity && pageConfig.value.entity.arrayMap[item.id]?.map((sebitem: any) => {
139
- return {
140
- id: sebitem.code,
141
- ...sebitem.fieldMap,
142
- }
143
- })) || []
144
- }
145
- })
146
- getEnums()
147
- }
148
- }
149
- catch (error) {
150
- loading.value = false
151
- console.log('error:', error)
152
- }
153
- }
154
- // 获取枚举
155
- async function getEnums() {
156
- try {
157
- const params: string[] = []
158
- pageConfig.value.groups?.forEach((item: any) => {
159
- item.fields?.forEach((subItem: any) => {
160
- if (subItem.extControlType === 'select' || subItem.extControlType === 'multiselect') {
161
- params.push(`mstrucIds=${subItem.mstrucId}`)
162
- }
163
- })
164
- })
165
- if (!params.length)
166
- return
167
- const res = await enums(params.join('&'))
168
- Enumcolumn.value = res.enumMap || {}
169
- }
170
- catch (error) {
171
- console.log('error:', error)
172
- }
173
- }
174
-
175
- // 行添加保存
176
- async function rowAddSave(all: any) {
177
- console.log('行数据', all)
178
- router.back()
179
- uni.$emit(rowAddEvent.value, all)
180
- }
181
-
182
- // 保存
183
- async function save() {
184
- // 判断是否为树添加
185
- if (pageType.value === '树' && !tree.value.value) {
186
- return globalToast.warning('请选择分组')
187
- }
188
-
189
- try {
190
- const formArray: any[] = []
191
- formControlRef.value.forEach((element: any) => {
192
- formArray.push(element.submit())
193
- })
194
- const res = await Promise.all(formArray)
195
- const beasData = res.reduce((acc, cur) => {
196
- return { ...acc, ...cur }
197
- }, {})
198
- subLoading.value = true
199
-
200
- /**
201
- *
202
- * 421639572264099847.$$flag$$:true
203
- 421639572264099847[0].$$relation$$:拥有角色
204
- 421639572264099847[0].唯一编码:448591711817211909
205
- */
206
- let all: Record<string, any> = {}
207
- for (const key in selectData.value) {
208
- if (Object.prototype.hasOwnProperty.call(selectData.value, key)) {
209
- const element = selectData.value[key].data
210
- if (element) {
211
- all[`${key}.$$flag$$`] = true
212
- element.forEach((item, index) => {
213
- all[`${key}[${index}].$$relation$$`] = pageConfig.value.groups.find(item => item.id === key)?.relationNames[0]
214
- if (typeof item === 'string') {
215
- all[`${key}[${index}].唯一编码`] = item.split('@R@')[0]
216
- }
217
- })
218
- }
219
- }
220
- }
221
- console.log('rowData.value', rowData.value)
222
- for (const key in rowData.value) {
223
- if (Object.prototype.hasOwnProperty.call(rowData.value, key)) {
224
- const element1 = rowData.value[key]
225
- if (element1) {
226
- all[`${key}.$$flag$$`] = true
227
- element1.forEach((item: any, index: any) => {
228
- all[`${key}[${index}].$$relation$$`] = pageConfig.value.groups.find(item => item.id === key)?.relationNames[0]
229
- all[`${key}[${index}].唯一编码`] = item.id
230
-
231
- for (const key1 in item) {
232
- if (Object.prototype.hasOwnProperty.call(item, key1)) {
233
- console.log('item[key1]', item[key1])
234
- if (item[key1] && item[key1].response) {
235
- all[`${key}[${index}].${key1}`] = JSON.stringify({
236
- valid: item[key1].disabled ? 'old' : 'new',
237
- fileKey: JSON.parse(item[key1].response).fileKey,
238
- fileName: item[key1].name,
239
- })
240
- }
241
-
242
- if (typeof item[key1] === 'string') {
243
- // all[`${key}[${index}].${key1}`] = item[key1].split('@R@')[0]
244
- all[`${key}[${index}].${key1}`] = item[key1]
245
- }
246
- }
247
- }
248
- })
249
- }
250
- }
251
- }
252
- console.log('all', all, beasData)
253
- all = {
254
- ...all,
255
- ...beasData,
256
- }
257
-
258
- // 判断是否为行添加
259
- if (rowAddEvent.value) {
260
- subLoading.value = false
261
- return rowAddSave({ ...all, id: pageConfig.value.entity.code })
262
- }
263
-
264
- const newAll: Record<string, any> = {}
265
-
266
- for (const key1 in all) {
267
- if (Object.prototype.hasOwnProperty.call(all, key1)) {
268
- if (all[key1] && all[key1].response) {
269
- newAll[`${key1}`] = JSON.stringify({
270
- valid: all[key1].disabled ? 'old' : 'new',
271
- fileKey: JSON.parse(all[key1].response).fileKey,
272
- fileName: all[key1].name,
273
- })
274
- }
275
- else {
276
- newAll[key1] = all[key1]
277
- }
278
- }
279
- }
280
-
281
- editPageDataSave(tree.value.sourceId || sourceId.value, id.value, newAll, tree.value.value || mainCode.value).then((res: any) => {
282
- // 发送事件
283
- if (addEvent.value)
284
- uni.$emit(addEvent.value, { entityCode: res.entityCode, data: newAll })
285
- if (editEvent.value)
286
- uni.$emit(editEvent.value, res.entityCode)
287
-
288
- subLoading.value = false
289
- globalToast.success('保存成功')
290
- router.back()
291
- }).catch((error: any) => {
292
- subLoading.value = false
293
- globalToast.error(error.message)
294
- })
295
- }
296
- catch (error) {
297
- console.log('error:', error)
298
- }
299
- }
300
-
301
- // 跳转勾选页面
302
- function gotoSlect(group: Groups) {
303
- router.push(`/pages/select-list/index?sourceId=${group.id}&title=${pageTitle.value}&selectEvent=${SELECTEVENT}&sendSelectEvent=${SENDSELECTEVENT}&extControlType=${''}&cardModel=complex`)
304
- // 发送数据给选择页面,延迟发送防止页面不刷新
305
- setTimeout(() => {
306
- console.log('selectData:', selectData.value)
307
- uni.$emit(SENDSELECTEVENT, toRaw(selectData.value[group.id].data))
308
- }, 100)
309
-
310
- // 接收勾选页面发送过来的数据
311
- uni.$once(SELECTEVENT, (data: any) => {
312
- selectData.value[group.id].data = data
313
- getSelectData(data, group.id)
314
- uni.$off(SELECTEVENT)
315
- })
316
- }
317
- // 获取勾选数据
318
- async function getSelectData(data: any, relationID: string) {
319
- try {
320
- // 获取勾选数据
321
- let codes = ''
322
- data.forEach((item: any) => {
323
- codes += `codes=${item.split('@R@')[0]}&`
324
- })
325
- selectData.value[relationID].loading = true
326
- const res = await selectDatas(relationID, codes)
327
- if (pageConfig.value.entity) {
328
- pageConfig.value.entity.arrayMap[relationID] = res.entities
329
- }
330
- else {
331
- pageConfig.value.entity = { arrayMap: { [relationID]: res.entities }, code: '', fieldMap: {} }
332
- }
333
-
334
- selectData.value[relationID].loading = false
335
- }
336
- catch (error) {
337
- console.log('error:', error)
338
- }
339
- }
340
-
341
- // 获取添加数据
342
- async function getAddData(data: any, relationID: string) {
343
- addEvent.value = ''
344
- try {
345
- let codes = ''
346
- selectData.value[relationID].data = [
347
- ...data,
348
- ...selectData.value[relationID].data,
349
- ]
350
- selectData.value[relationID].data.forEach((item: any) => {
351
- codes += `codes=${item}&`
352
- })
353
- selectData.value[relationID].loading = true
354
- const res = await selectDatas(relationID, codes)
355
- if (pageConfig.value.entity) {
356
- if (pageConfig.value.entity.arrayMap) {
357
- pageConfig.value.entity.arrayMap[relationID] = res.entities
358
- }
359
- else {
360
- pageConfig.value.entity.arrayMap = { [relationID]: res.entities }
361
- }
362
- }
363
- else {
364
- pageConfig.value.entity = { arrayMap: { [relationID]: res.entities }, code: '', fieldMap: {} }
365
- }
366
-
367
- selectData.value[relationID].loading = false
368
- }
369
- catch (error) {
370
- console.log('error:', error)
371
- }
372
- }
373
-
374
- // 获取编辑数据
375
- async function getEditData(data: any, relationID: string) {
376
- editEvent.value = ''
377
- try {
378
- let codes = ''
379
- selectData.value[relationID].data.forEach((item: any) => {
380
- codes += `codes=${item}&`
381
- })
382
- selectData.value[relationID].loading = true
383
- const res = await selectDatas(relationID, codes)
384
- pageConfig.value.entity.arrayMap[relationID] = res.entities
385
- selectData.value[relationID].loading = false
386
- }
387
- catch (error) {
388
- console.log('error:', error)
389
- }
390
- }
391
- // 跳转添加页面
392
- function gotoAdd(group: Groups) {
393
- const addEvent = generateHighResolutionID()
394
- router.push(`/pages/edit-page/index?sourceId=${group.id}&id=&title=${group.title}&addEvent=${addEvent}`)
395
- // 接收添加页面发送过来的数据
396
- uni.$once(addEvent, (data: any) => {
397
- uni.$off(addEvent)
398
- getAddData([data.entityCode], group.id)
399
- })
400
- }
401
-
402
- // 跳转编辑页面
403
- function edit(group: Groups, field: Entities) {
404
- const editEvent = generateHighResolutionID()
405
- router.push(`/pages/edit-page/index?sourceId=${group.id}&id=${field.code}&title=${group.title}&editEvent=${editEvent}`)
406
- // 接收编辑页面发送过来的数据
407
- uni.$once(editEvent, (data: any) => {
408
- uni.$off(editEvent)
409
- getEditData([data], group.id)
410
- })
411
- }
412
-
413
- // 跳转行添加页面
414
- function gotoRowAdd(group: Groups) {
415
- const rowAddEvent = generateHighResolutionID()
416
- const sendRowAddEvent = generateHighResolutionID()
417
- router.push(`/pages/edit-page/index?sourceId=${group.id}&id=&title=${group.title}&rowAddEvent=${rowAddEvent}&sendRowAddEvent=${sendRowAddEvent}`)
418
- // 发送数据给行添加页面
419
- setTimeout(() => {
420
- // groups: conf.groups,
421
- // entity: conf.entity,
422
- const groupf = {
423
- ...group,
424
- type: 'fieldGroup',
425
- }
426
- uni.$emit(sendRowAddEvent, { groups: [groupf], entity: pageConfig.value?.entity?.arrayMap[group.id] })
427
- }, 100)
428
-
429
- // 接收添加页面发送过来的数据
430
- uni.$once(rowAddEvent, (data: any) => {
431
- const newData: { [key: string]: any } = {}
432
- const id = generateHighResolutionID()
433
- for (const key in data) {
434
- if (Object.prototype.hasOwnProperty.call(data, key)) {
435
- newData[key] = data[key]
436
- }
437
- }
438
-
439
- if (rowData.value[group.id]) {
440
- rowData.value[group.id].push({
441
- ...newData,
442
- id,
443
- })
444
- }
445
- else {
446
- rowData.value[group.id] = [{
447
- ...newData,
448
- id,
449
- }]
450
- }
451
-
452
- console.log(pageConfig.value.entity)
453
- // 显示数据
454
- if (pageConfig.value.entity && pageConfig.value.entity.arrayMap[group.id]) {
455
- pageConfig.value.entity.arrayMap[group.id].push({
456
- arrayMap: {},
457
- code: id,
458
- fieldMap: {
459
- ...data,
460
- },
461
- })
462
- }
463
- else {
464
- if (pageConfig.value.entity && pageConfig.value.entity.arrayMap) {
465
- pageConfig.value.entity = {
466
- arrayMap: {
467
- ...pageConfig.value.entity.arrayMap,
468
- [group.id]: [{
469
- arrayMap: {},
470
- code: id,
471
- fieldMap: {
472
- ...data,
473
- },
474
- }],
475
- },
476
- code: id,
477
- fieldMap: {},
478
- }
479
- }
480
- else {
481
- pageConfig.value.entity = {
482
- arrayMap: {
483
- [group.id]: [{
484
- arrayMap: {},
485
- code: id,
486
- fieldMap: {
487
- ...data,
488
- },
489
- }],
490
- },
491
- code: id,
492
- fieldMap: {},
493
- }
494
- }
495
- }
496
-
497
- console.log(rowData.value, 'rowData.value')
498
- uni.$off(rowAddEvent)
499
- })
500
- }
501
-
502
- // 跳转编辑行页面
503
- function rowEdit(group: Groups, field: Entities) {
504
- const rowAddEvent = generateHighResolutionID()
505
- const sendRowAddEvent = generateHighResolutionID()
506
- router.push(`/pages/edit-page/index?sourceId=${group.id}&id=&title=${group.title}&rowAddEvent=${rowAddEvent}&sendRowAddEvent=${sendRowAddEvent}`)
507
- // 发送数据给行编辑页面
508
- setTimeout(() => {
509
- // groups: conf.groups,
510
- // entity: conf.entity,
511
- const groupf = {
512
- ...group,
513
- type: 'fieldGroup',
514
- }
515
- uni.$emit(sendRowAddEvent, { groups: [groupf], entity: field })
516
- }, 100)
517
-
518
- // 接收行编辑页面发送过来的数据
519
- uni.$once(rowAddEvent, (data: any) => {
520
- console.log('rowAddEvent', data)
521
- const newData: { [key: string]: any } = {}
522
- for (const key in data) {
523
- if (Object.prototype.hasOwnProperty.call(data, key)) {
524
- newData[key] = data[key]
525
- }
526
- }
527
-
528
- if (rowData.value[group.id]) {
529
- rowData.value[group.id] = rowData.value[group.id].filter((item: any) => item.id !== newData.id)
530
- rowData.value[group.id].push({
531
- ...newData,
532
- })
533
- }
534
-
535
- // 显示数据
536
- if (pageConfig.value.entity.arrayMap[group.id]) {
537
- const index = pageConfig.value.entity.arrayMap[group.id].findIndex((item: any) => item.code === newData.id)
538
- console.log('index', index)
539
- pageConfig.value.entity.arrayMap[group.id][index] = {
540
- arrayMap: {},
541
- code: '',
542
- fieldMap: {
543
- ...newData,
544
- },
545
- }
546
- // pageConfig.value.entity.arrayMap[group.id] = pageConfig.value.entity.arrayMap[group.id].filter((item: any) => item.code !== newData.id)
547
- // pageConfig.value.entity.arrayMap[group.id].push({
548
- // arrayMap: {},
549
- // code: '',
550
- // fieldMap: {
551
- // ...newData,
552
- // },
553
- // })
554
- }
555
-
556
- console.log(rowData.value, group.id, 'rowData.value')
557
- uni.$off(rowAddEvent)
558
- })
559
- }
560
-
561
- /**
562
- * 判断编辑按钮是否可以点击
563
- */
564
- function canClick(group: Groups) {
565
- if (group.max) {
566
- if (pageConfig.value.entity && pageConfig.value.entity.arrayMap[group.id] && pageConfig.value.entity.arrayMap[group.id].length >= group.max) {
567
- return true
568
- }
569
- else {
570
- return false
571
- }
572
- }
573
- else {
574
- return false
575
- }
576
- }
577
-
578
- /**
579
- * 删除行数据
580
- */
581
- function remove(group: Groups, field: Entities) {
582
- // 行编辑数据
583
- if (rowData.value[group.id]) {
584
- rowData.value[group.id] = rowData.value[group.id].filter((item: any) => item.id !== (field.code || field.fieldMap.id))
585
- }
586
-
587
- // 显示数据
588
- if (pageConfig.value.entity.arrayMap[group.id]) {
589
- pageConfig.value.entity.arrayMap[group.id] = pageConfig.value.entity.arrayMap[group.id].filter((item: any) => (item.code || item.fieldMap.id) !== (field.code || field.fieldMap.id))
590
- }
591
-
592
- // 行选择数据
593
- if (selectData.value[group.id]) {
594
- selectData.value[group.id].data = selectData.value[group.id].data.filter((item: any) => item.split('@R@')[0] !== field.code)
595
- }
596
-
597
- console.log(rowData.value[group.id], field, '删除行数据')
598
- }
599
- /**
600
- * 批量上传文件
601
- */
602
- function handleFileChange(e: any, group: Groups) {
603
- console.log(e, group)
604
- const newData: { [key: string]: any } = {
605
-
606
- }
607
-
608
- group.fields.forEach((item) => {
609
- newData[item.sourceId] = ''
610
- })
611
- const id = generateHighResolutionID()
612
- if (group.batchAddFileField)
613
- newData[group.batchAddFileField?.sourceId] = e.file
614
-
615
- if (rowData.value[group.id]) {
616
- rowData.value[group.id].push({
617
- ...newData,
618
- id,
619
- })
620
- }
621
- else {
622
- rowData.value[group.id] = [{
623
- ...newData,
624
- id,
625
- }]
626
- }
627
-
628
- // 显示数据
629
- if (pageConfig.value.entity && pageConfig.value.entity.arrayMap[group.id]) {
630
- pageConfig.value.entity.arrayMap[group.id].push({
631
- arrayMap: {},
632
- code: id,
633
- fieldMap: {
634
- ...newData,
635
- },
636
- })
637
- }
638
- else {
639
- if (pageConfig.value.entity && pageConfig.value.entity.arrayMap) {
640
- pageConfig.value.entity = {
641
- arrayMap: {
642
- ...pageConfig.value.entity.arrayMap,
643
- [group.id]: [{
644
- arrayMap: {},
645
- code: id,
646
- fieldMap: {
647
- ...newData,
648
- },
649
- }],
650
- },
651
- code: id,
652
- fieldMap: {},
653
- }
654
- }
655
- else {
656
- pageConfig.value.entity = {
657
- arrayMap: {
658
- [group.id]: [{
659
- arrayMap: {},
660
- code: id,
661
- fieldMap: {
662
- ...newData,
663
- },
664
- }],
665
- },
666
- code: id,
667
- fieldMap: {},
668
- }
669
- }
670
- }
671
- }
672
- </script>
673
-
674
- <template>
675
- <view class="relative h-[calc(100vh-44px)] w-100vw overflow-auto">
676
- <view v-if="loading" class="flex justify-center p-3">
677
- <wd-loading />
678
- </view>
679
- <view v-else>
680
- <wd-cell v-if="pageType === '树'" title="分组" title-width="100px">
681
- <TreeSelectControl
682
- v-model="tree" select-mode="single" :source-id="sourceId" title="分组"
683
- ext-control-type="relselect " :readonly="false" :clearable="false"
684
- />
685
- </wd-cell>
686
- <wd-collapse v-model="collapses">
687
- <wd-collapse-item v-for="group in groupsformat" :key="group.id" :title="group.title" :name="group.id">
688
- <FormControl
689
- v-if="group.type === 'fieldGroup'" ref="formControlRef" :field-group="group"
690
- :entity="pageConfig?.entity?.fieldMap" :enum-column="Enumcolumn"
691
- />
692
- <view v-if="group.type === 'relation'">
693
- <view v-if="selectData[group.id]?.loading" class="flex justify-center p-3">
694
- <wd-loading />
695
- </view>
696
- <view v-else>
697
- <view v-if="!group.readOnly" class="w-upload flex justify-center gap-2">
698
- <batchUploadFile
699
- v-if="group.batchAddFileField && group.batchAddFileField.extControlType === 'file'"
700
- @handle-file-change="(e) => { handleFileChange(e, group) }"
701
- />
702
-
703
- <wd-button
704
- v-if="group.buttons.includes('selectAdd')" :disabled="canClick(group)" type="info"
705
- size="small" @click="gotoSlect(group)"
706
- >
707
- 选择
708
- </wd-button>
709
- <wd-button
710
- v-if="group.buttons.includes('dtmplAdd')" :disabled="canClick(group)" type="info"
711
- size="small" @click="gotoAdd(group)"
712
- >
713
- 新增
714
- </wd-button>
715
- <wd-button
716
- v-if="group.buttons.includes('rowAdd')" :disabled="canClick(group)" type="info" size="small"
717
- @click="gotoRowAdd(group)"
718
- >
719
- 新增
720
- </wd-button>
721
- </view>
722
- <view v-for="(field, index) in pageConfig?.entity?.arrayMap[group.id]" :key="field.code">
723
- <foldCard
724
- :index="index" :enum-column="{}" :groups="group" :source-id="sourceId" :columns="group.fields"
725
- model="complex" :data="field"
726
- >
727
- <template v-if="!group.readOnly" #buttons>
728
- <wd-button v-if="group.buttons.includes('dtmplEdit')" size="small" @click="edit(group, field)">
729
- 编辑
730
- </wd-button>
731
- <wd-button v-if="group.buttons.includes('rowEdit')" size="small" @click="rowEdit(group, field)">
732
- 编辑
733
- </wd-button>
734
- <wd-button
735
- v-if="group.buttons.includes('singleDelete')" type="error" size="small"
736
- @click="remove(group, field)"
737
- >
738
- 删除
739
- </wd-button>
740
- </template>
741
- </foldCard>
742
- </view>
743
- </view>
744
- </view>
745
- </wd-collapse-item>
746
- </wd-collapse>
747
- <view class="h-12" />
748
- <view class="fixed bottom-0 left-0 right-0 box-border w-100% flex p-2 bg-white dark:bg-[var(--wot-dark-background)]">
749
- <wd-button class="flex-1" :loading="subLoading" @click="save">
750
- 保存
751
- </wd-button>
752
- </view>
753
- </view>
754
- </view>
755
- </template>
756
-
757
- <style scoped></style>
1
+ <!-- 用于测试 -->
2
+ <script lang="ts" setup>
3
+ import { computed, defineOptions, onBeforeMount, ref, toRaw } from 'vue'
4
+ import { onLoad } from '@dcloudio/uni-app'
5
+ import { useRouter } from 'uni-mini-router'
6
+ import FormControl from '../form-control/form-control.vue'
7
+ import { addPageConfig, editPageConfig, editPageDataSave, enums, selectDatas } from '../../api/page'
8
+ import type { Entities, Enums, Groups, dtmplConfig } from '../../type'
9
+ import { useGlobalToast } from '../../composables/useGlobalToast'
10
+ import foldCard from '../fold-card/fold-card.vue'
11
+ import { generateHighResolutionID } from '../../utils/index'
12
+ import TreeSelectControl from '../tree-select/index.vue'
13
+ import batchUploadFile from '../batch-upload-file/batch-upload-file.vue'
14
+
15
+ defineOptions({
16
+ name: 'WuiEditPage',
17
+ })
18
+ const pageConfig = ref<dtmplConfig>({
19
+ id: '',
20
+ title: '',
21
+ groups: [],
22
+ entity: {
23
+ arrayMap: {},
24
+ code: '',
25
+ fieldMap: {},
26
+ },
27
+ buttons: [],
28
+ })
29
+ const tree = ref({ value: '', sourceId: '' })
30
+ const loading = ref(false)
31
+ const globalToast = useGlobalToast()
32
+ const router = useRouter()
33
+ const mainCode = ref('')
34
+ const id = ref('')
35
+ const sourceId = ref('')
36
+ const formControlRef = ref()
37
+ const subLoading = ref(false)
38
+ const Enumcolumn = ref<Enums | undefined>()
39
+ const pageTitle = ref('')
40
+ const pageType = ref('')
41
+ const selectData = ref<{ [key: string]: { loading: boolean, data: string[] } }>({})
42
+ const rowData = ref<{ [key: string]: { [key: string]: any } }>({})
43
+ const action = ref('')
44
+ const hydrocarbonProgramToken = ref('')
45
+ const token = ref('')
46
+ // 全局事件名称
47
+ const SELECTEVENT = generateHighResolutionID()
48
+ const SENDSELECTEVENT = generateHighResolutionID()
49
+ const addEvent = ref('')
50
+ const editEvent = ref('')
51
+ const rowAddEvent = ref('')
52
+ const sendRowAddEvent = ref('')
53
+ // 折叠面板
54
+ const collapses = ref()
55
+ const groupsformat = computed(() => {
56
+ return pageConfig.value.groups.filter((item: Groups) => {
57
+ return item.displayConfig.includes('displayed')
58
+ })
59
+ })
60
+ onLoad((option: any) => {
61
+ sourceId.value = option.sourceId
62
+ mainCode.value = option.mainCode || ''
63
+ id.value = option.id || ''
64
+ pageTitle.value = option.title
65
+ addEvent.value = option.addEvent
66
+ editEvent.value = option.editEvent
67
+ pageType.value = option.pageType || ''
68
+ rowAddEvent.value = option.rowAddEvent
69
+ sendRowAddEvent.value = option.sendRowAddEvent
70
+ getEditPageConfig()
71
+ })
72
+ onBeforeMount(() => {
73
+ action.value = uni.getStorageSync('BASE_URL')
74
+ hydrocarbonProgramToken.value = uni.getStorageSync('HYDROCARBON_PROGRAM_TOKEN')
75
+ token.value = uni.getStorageSync('TOKEN')
76
+ })
77
+ // 获取编辑页面配置
78
+ async function getEditPageConfig() {
79
+ // 判断是否为行新增事件
80
+ if (sendRowAddEvent.value) {
81
+ uni.$once(sendRowAddEvent.value, (conf: any) => {
82
+ console.log('sendRowAddEvent.value', conf)
83
+ pageConfig.value = {
84
+ id: '',
85
+ title: '行添加',
86
+ groups: conf.groups,
87
+ entity: conf.entity || {
88
+ arrayMap: {},
89
+ code: '',
90
+ fieldMap: {},
91
+ },
92
+ buttons: [],
93
+ }
94
+ getEnums()
95
+ uni.$off(sendRowAddEvent.value)
96
+ })
97
+ setTimeout(() => {
98
+ collapses.value = pageConfig.value.groups.map((item: Groups) => {
99
+ return item.id
100
+ })
101
+ }, 100)
102
+
103
+ return
104
+ }
105
+
106
+ try {
107
+ let res = null
108
+ loading.value = true
109
+ if (id.value) {
110
+ res = await editPageConfig(sourceId.value, id.value)
111
+ }
112
+ else {
113
+ res = await addPageConfig(sourceId.value)
114
+ }
115
+ loading.value = false
116
+ // 初始化折叠面板
117
+ if (res.dtmplConfig) {
118
+ uni.setNavigationBarTitle({
119
+ title: `${res.dtmplConfig.title}`,
120
+ })
121
+ pageConfig.value = res.dtmplConfig
122
+ collapses.value = pageConfig.value.groups.map((item: Groups) => {
123
+ return item.id
124
+ })
125
+
126
+ pageConfig.value.groups.forEach((item: Groups) => {
127
+ // 初始化勾选数据
128
+ if (item.type === 'relation' && (item.buttons.includes('dtmplAdd') || item.buttons.includes('selectAdd'))) {
129
+ selectData.value[item.id] = {
130
+ data: (pageConfig.value.entity && pageConfig.value.entity.arrayMap[item.id]?.map((sebitem: any) => {
131
+ return `${sebitem.code}`
132
+ })) || [],
133
+ loading: false,
134
+ }
135
+ }
136
+ // 初始化行数据
137
+ if (item.type === 'relation' && item.buttons.includes('rowAdd')) {
138
+ rowData.value[item.id] = (pageConfig.value.entity && pageConfig.value.entity.arrayMap[item.id]?.map((sebitem: any) => {
139
+ return {
140
+ id: sebitem.code,
141
+ ...sebitem.fieldMap,
142
+ }
143
+ })) || []
144
+ }
145
+ })
146
+ getEnums()
147
+ }
148
+ }
149
+ catch (error) {
150
+ loading.value = false
151
+ console.log('error:', error)
152
+ }
153
+ }
154
+ // 获取枚举
155
+ async function getEnums() {
156
+ try {
157
+ const params: string[] = []
158
+ pageConfig.value.groups?.forEach((item: any) => {
159
+ item.fields?.forEach((subItem: any) => {
160
+ if (subItem.extControlType === 'select' || subItem.extControlType === 'multiselect') {
161
+ params.push(`mstrucIds=${subItem.mstrucId}`)
162
+ }
163
+ })
164
+ })
165
+ if (!params.length)
166
+ return
167
+ const res = await enums(params.join('&'))
168
+ Enumcolumn.value = res.enumMap || {}
169
+ }
170
+ catch (error) {
171
+ console.log('error:', error)
172
+ }
173
+ }
174
+
175
+ // 行添加保存
176
+ async function rowAddSave(all: any) {
177
+ console.log('行数据', all)
178
+ router.back()
179
+ uni.$emit(rowAddEvent.value, all)
180
+ }
181
+
182
+ // 保存
183
+ async function save() {
184
+ // 判断是否为树添加
185
+ if (pageType.value === '树' && !tree.value.value) {
186
+ return globalToast.warning('请选择分组')
187
+ }
188
+
189
+ try {
190
+ const formArray: any[] = []
191
+ formControlRef.value.forEach((element: any) => {
192
+ formArray.push(element.submit())
193
+ })
194
+ const res = await Promise.all(formArray)
195
+ const beasData = res.reduce((acc, cur) => {
196
+ return { ...acc, ...cur }
197
+ }, {})
198
+ subLoading.value = true
199
+
200
+ /**
201
+ *
202
+ * 421639572264099847.$$flag$$:true
203
+ 421639572264099847[0].$$relation$$:拥有角色
204
+ 421639572264099847[0].唯一编码:448591711817211909
205
+ */
206
+ let all: Record<string, any> = {}
207
+ for (const key in selectData.value) {
208
+ if (Object.prototype.hasOwnProperty.call(selectData.value, key)) {
209
+ const element = selectData.value[key].data
210
+ if (element) {
211
+ all[`${key}.$$flag$$`] = true
212
+ element.forEach((item, index) => {
213
+ all[`${key}[${index}].$$relation$$`] = pageConfig.value.groups.find(item => item.id === key)?.relationNames[0]
214
+ if (typeof item === 'string') {
215
+ all[`${key}[${index}].唯一编码`] = item.split('@R@')[0]
216
+ }
217
+ })
218
+ }
219
+ }
220
+ }
221
+ console.log('rowData.value', rowData.value)
222
+ for (const key in rowData.value) {
223
+ if (Object.prototype.hasOwnProperty.call(rowData.value, key)) {
224
+ const element1 = rowData.value[key]
225
+ if (element1) {
226
+ all[`${key}.$$flag$$`] = true
227
+ element1.forEach((item: any, index: any) => {
228
+ all[`${key}[${index}].$$relation$$`] = pageConfig.value.groups.find(item => item.id === key)?.relationNames[0]
229
+ all[`${key}[${index}].唯一编码`] = item.id
230
+
231
+ for (const key1 in item) {
232
+ if (Object.prototype.hasOwnProperty.call(item, key1)) {
233
+ console.log('item[key1]', item[key1])
234
+ if (item[key1] && item[key1].response) {
235
+ all[`${key}[${index}].${key1}`] = JSON.stringify({
236
+ valid: item[key1].disabled ? 'old' : 'new',
237
+ fileKey: JSON.parse(item[key1].response).fileKey,
238
+ fileName: item[key1].name,
239
+ })
240
+ }
241
+
242
+ if (typeof item[key1] === 'string') {
243
+ // all[`${key}[${index}].${key1}`] = item[key1].split('@R@')[0]
244
+ all[`${key}[${index}].${key1}`] = item[key1]
245
+ }
246
+ }
247
+ }
248
+ })
249
+ }
250
+ }
251
+ }
252
+ console.log('all', all, beasData)
253
+ all = {
254
+ ...all,
255
+ ...beasData,
256
+ }
257
+
258
+ // 判断是否为行添加
259
+ if (rowAddEvent.value) {
260
+ subLoading.value = false
261
+ return rowAddSave({ ...all, id: pageConfig.value.entity.code })
262
+ }
263
+
264
+ const newAll: Record<string, any> = {}
265
+
266
+ for (const key1 in all) {
267
+ if (Object.prototype.hasOwnProperty.call(all, key1)) {
268
+ if (all[key1] && all[key1].response) {
269
+ newAll[`${key1}`] = JSON.stringify({
270
+ valid: all[key1].disabled ? 'old' : 'new',
271
+ fileKey: JSON.parse(all[key1].response).fileKey,
272
+ fileName: all[key1].name,
273
+ })
274
+ }
275
+ else {
276
+ newAll[key1] = all[key1]
277
+ }
278
+ }
279
+ }
280
+
281
+ editPageDataSave(tree.value.sourceId || sourceId.value, id.value, newAll, tree.value.value || mainCode.value).then((res: any) => {
282
+ // 发送事件
283
+ if (addEvent.value)
284
+ uni.$emit(addEvent.value, { entityCode: res.entityCode, data: newAll })
285
+ if (editEvent.value)
286
+ uni.$emit(editEvent.value, res.entityCode)
287
+
288
+ subLoading.value = false
289
+ globalToast.success('保存成功')
290
+ router.back()
291
+ }).catch((error: any) => {
292
+ subLoading.value = false
293
+ globalToast.error(error.message)
294
+ })
295
+ }
296
+ catch (error) {
297
+ console.log('error:', error)
298
+ }
299
+ }
300
+
301
+ // 跳转勾选页面
302
+ function gotoSlect(group: Groups) {
303
+ router.push(`/pages/select-list/index?sourceId=${group.id}&title=${pageTitle.value}&selectEvent=${SELECTEVENT}&sendSelectEvent=${SENDSELECTEVENT}&extControlType=${''}&cardModel=complex`)
304
+ // 发送数据给选择页面,延迟发送防止页面不刷新
305
+ setTimeout(() => {
306
+ console.log('selectData:', selectData.value)
307
+ uni.$emit(SENDSELECTEVENT, toRaw(selectData.value[group.id].data))
308
+ }, 100)
309
+
310
+ // 接收勾选页面发送过来的数据
311
+ uni.$once(SELECTEVENT, (data: any) => {
312
+ selectData.value[group.id].data = data
313
+ getSelectData(data, group.id)
314
+ uni.$off(SELECTEVENT)
315
+ })
316
+ }
317
+ // 获取勾选数据
318
+ async function getSelectData(data: any, relationID: string) {
319
+ try {
320
+ // 获取勾选数据
321
+ let codes = ''
322
+ data.forEach((item: any) => {
323
+ codes += `codes=${item.split('@R@')[0]}&`
324
+ })
325
+ selectData.value[relationID].loading = true
326
+ const res = await selectDatas(relationID, codes)
327
+ if (pageConfig.value.entity) {
328
+ pageConfig.value.entity.arrayMap[relationID] = res.entities
329
+ }
330
+ else {
331
+ pageConfig.value.entity = { arrayMap: { [relationID]: res.entities }, code: '', fieldMap: {} }
332
+ }
333
+
334
+ selectData.value[relationID].loading = false
335
+ }
336
+ catch (error) {
337
+ console.log('error:', error)
338
+ }
339
+ }
340
+
341
+ // 获取添加数据
342
+ async function getAddData(data: any, relationID: string) {
343
+ addEvent.value = ''
344
+ try {
345
+ let codes = ''
346
+ selectData.value[relationID].data = [
347
+ ...data,
348
+ ...selectData.value[relationID].data,
349
+ ]
350
+ selectData.value[relationID].data.forEach((item: any) => {
351
+ codes += `codes=${item}&`
352
+ })
353
+ selectData.value[relationID].loading = true
354
+ const res = await selectDatas(relationID, codes)
355
+ if (pageConfig.value.entity) {
356
+ if (pageConfig.value.entity.arrayMap) {
357
+ pageConfig.value.entity.arrayMap[relationID] = res.entities
358
+ }
359
+ else {
360
+ pageConfig.value.entity.arrayMap = { [relationID]: res.entities }
361
+ }
362
+ }
363
+ else {
364
+ pageConfig.value.entity = { arrayMap: { [relationID]: res.entities }, code: '', fieldMap: {} }
365
+ }
366
+
367
+ selectData.value[relationID].loading = false
368
+ }
369
+ catch (error) {
370
+ console.log('error:', error)
371
+ }
372
+ }
373
+
374
+ // 获取编辑数据
375
+ async function getEditData(data: any, relationID: string) {
376
+ editEvent.value = ''
377
+ try {
378
+ let codes = ''
379
+ selectData.value[relationID].data.forEach((item: any) => {
380
+ codes += `codes=${item}&`
381
+ })
382
+ selectData.value[relationID].loading = true
383
+ const res = await selectDatas(relationID, codes)
384
+ pageConfig.value.entity.arrayMap[relationID] = res.entities
385
+ selectData.value[relationID].loading = false
386
+ }
387
+ catch (error) {
388
+ console.log('error:', error)
389
+ }
390
+ }
391
+ // 跳转添加页面
392
+ function gotoAdd(group: Groups) {
393
+ const addEvent = generateHighResolutionID()
394
+ router.push(`/pages/edit-page/index?sourceId=${group.id}&id=&title=${group.title}&addEvent=${addEvent}`)
395
+ // 接收添加页面发送过来的数据
396
+ uni.$once(addEvent, (data: any) => {
397
+ uni.$off(addEvent)
398
+ getAddData([data.entityCode], group.id)
399
+ })
400
+ }
401
+
402
+ // 跳转编辑页面
403
+ function edit(group: Groups, field: Entities) {
404
+ const editEvent = generateHighResolutionID()
405
+ router.push(`/pages/edit-page/index?sourceId=${group.id}&id=${field.code}&title=${group.title}&editEvent=${editEvent}`)
406
+ // 接收编辑页面发送过来的数据
407
+ uni.$once(editEvent, (data: any) => {
408
+ uni.$off(editEvent)
409
+ getEditData([data], group.id)
410
+ })
411
+ }
412
+
413
+ // 跳转行添加页面
414
+ function gotoRowAdd(group: Groups) {
415
+ const rowAddEvent = generateHighResolutionID()
416
+ const sendRowAddEvent = generateHighResolutionID()
417
+ router.push(`/pages/edit-page/index?sourceId=${group.id}&id=&title=${group.title}&rowAddEvent=${rowAddEvent}&sendRowAddEvent=${sendRowAddEvent}`)
418
+ // 发送数据给行添加页面
419
+ setTimeout(() => {
420
+ // groups: conf.groups,
421
+ // entity: conf.entity,
422
+ const groupf = {
423
+ ...group,
424
+ type: 'fieldGroup',
425
+ }
426
+ uni.$emit(sendRowAddEvent, { groups: [groupf], entity: pageConfig.value?.entity?.arrayMap[group.id] })
427
+ }, 100)
428
+
429
+ // 接收添加页面发送过来的数据
430
+ uni.$once(rowAddEvent, (data: any) => {
431
+ const newData: { [key: string]: any } = {}
432
+ const id = generateHighResolutionID()
433
+ for (const key in data) {
434
+ if (Object.prototype.hasOwnProperty.call(data, key)) {
435
+ newData[key] = data[key]
436
+ }
437
+ }
438
+
439
+ if (rowData.value[group.id]) {
440
+ rowData.value[group.id].push({
441
+ ...newData,
442
+ id,
443
+ })
444
+ }
445
+ else {
446
+ rowData.value[group.id] = [{
447
+ ...newData,
448
+ id,
449
+ }]
450
+ }
451
+
452
+ console.log(pageConfig.value.entity)
453
+ // 显示数据
454
+ if (pageConfig.value.entity && pageConfig.value.entity.arrayMap[group.id]) {
455
+ pageConfig.value.entity.arrayMap[group.id].push({
456
+ arrayMap: {},
457
+ code: id,
458
+ fieldMap: {
459
+ ...data,
460
+ },
461
+ })
462
+ }
463
+ else {
464
+ if (pageConfig.value.entity && pageConfig.value.entity.arrayMap) {
465
+ pageConfig.value.entity = {
466
+ arrayMap: {
467
+ ...pageConfig.value.entity.arrayMap,
468
+ [group.id]: [{
469
+ arrayMap: {},
470
+ code: id,
471
+ fieldMap: {
472
+ ...data,
473
+ },
474
+ }],
475
+ },
476
+ code: id,
477
+ fieldMap: {},
478
+ }
479
+ }
480
+ else {
481
+ pageConfig.value.entity = {
482
+ arrayMap: {
483
+ [group.id]: [{
484
+ arrayMap: {},
485
+ code: id,
486
+ fieldMap: {
487
+ ...data,
488
+ },
489
+ }],
490
+ },
491
+ code: id,
492
+ fieldMap: {},
493
+ }
494
+ }
495
+ }
496
+
497
+ console.log(rowData.value, 'rowData.value')
498
+ uni.$off(rowAddEvent)
499
+ })
500
+ }
501
+
502
+ // 跳转编辑行页面
503
+ function rowEdit(group: Groups, field: Entities) {
504
+ const rowAddEvent = generateHighResolutionID()
505
+ const sendRowAddEvent = generateHighResolutionID()
506
+ router.push(`/pages/edit-page/index?sourceId=${group.id}&id=&title=${group.title}&rowAddEvent=${rowAddEvent}&sendRowAddEvent=${sendRowAddEvent}`)
507
+ // 发送数据给行编辑页面
508
+ setTimeout(() => {
509
+ // groups: conf.groups,
510
+ // entity: conf.entity,
511
+ const groupf = {
512
+ ...group,
513
+ type: 'fieldGroup',
514
+ }
515
+ uni.$emit(sendRowAddEvent, { groups: [groupf], entity: field })
516
+ }, 100)
517
+
518
+ // 接收行编辑页面发送过来的数据
519
+ uni.$once(rowAddEvent, (data: any) => {
520
+ console.log('rowAddEvent', data)
521
+ const newData: { [key: string]: any } = {}
522
+ for (const key in data) {
523
+ if (Object.prototype.hasOwnProperty.call(data, key)) {
524
+ newData[key] = data[key]
525
+ }
526
+ }
527
+
528
+ if (rowData.value[group.id]) {
529
+ rowData.value[group.id] = rowData.value[group.id].filter((item: any) => item.id !== newData.id)
530
+ rowData.value[group.id].push({
531
+ ...newData,
532
+ })
533
+ }
534
+
535
+ // 显示数据
536
+ if (pageConfig.value.entity.arrayMap[group.id]) {
537
+ const index = pageConfig.value.entity.arrayMap[group.id].findIndex((item: any) => item.code === newData.id)
538
+ console.log('index', index)
539
+ pageConfig.value.entity.arrayMap[group.id][index] = {
540
+ arrayMap: {},
541
+ code: '',
542
+ fieldMap: {
543
+ ...newData,
544
+ },
545
+ }
546
+ // pageConfig.value.entity.arrayMap[group.id] = pageConfig.value.entity.arrayMap[group.id].filter((item: any) => item.code !== newData.id)
547
+ // pageConfig.value.entity.arrayMap[group.id].push({
548
+ // arrayMap: {},
549
+ // code: '',
550
+ // fieldMap: {
551
+ // ...newData,
552
+ // },
553
+ // })
554
+ }
555
+
556
+ console.log(rowData.value, group.id, 'rowData.value')
557
+ uni.$off(rowAddEvent)
558
+ })
559
+ }
560
+
561
+ /**
562
+ * 判断编辑按钮是否可以点击
563
+ */
564
+ function canClick(group: Groups) {
565
+ if (group.max) {
566
+ if (pageConfig.value.entity && pageConfig.value.entity.arrayMap[group.id] && pageConfig.value.entity.arrayMap[group.id].length >= group.max) {
567
+ return true
568
+ }
569
+ else {
570
+ return false
571
+ }
572
+ }
573
+ else {
574
+ return false
575
+ }
576
+ }
577
+
578
+ /**
579
+ * 删除行数据
580
+ */
581
+ function remove(group: Groups, field: Entities) {
582
+ // 行编辑数据
583
+ if (rowData.value[group.id]) {
584
+ rowData.value[group.id] = rowData.value[group.id].filter((item: any) => item.id !== (field.code || field.fieldMap.id))
585
+ }
586
+
587
+ // 显示数据
588
+ if (pageConfig.value.entity.arrayMap[group.id]) {
589
+ pageConfig.value.entity.arrayMap[group.id] = pageConfig.value.entity.arrayMap[group.id].filter((item: any) => (item.code || item.fieldMap.id) !== (field.code || field.fieldMap.id))
590
+ }
591
+
592
+ // 行选择数据
593
+ if (selectData.value[group.id]) {
594
+ selectData.value[group.id].data = selectData.value[group.id].data.filter((item: any) => item.split('@R@')[0] !== field.code)
595
+ }
596
+
597
+ console.log(rowData.value[group.id], field, '删除行数据')
598
+ }
599
+ /**
600
+ * 批量上传文件
601
+ */
602
+ function handleFileChange(e: any, group: Groups) {
603
+ console.log(e, group)
604
+ const newData: { [key: string]: any } = {
605
+
606
+ }
607
+
608
+ group.fields.forEach((item) => {
609
+ newData[item.sourceId] = ''
610
+ })
611
+ const id = generateHighResolutionID()
612
+ if (group.batchAddFileField)
613
+ newData[group.batchAddFileField?.sourceId] = e.file
614
+
615
+ if (rowData.value[group.id]) {
616
+ rowData.value[group.id].push({
617
+ ...newData,
618
+ id,
619
+ })
620
+ }
621
+ else {
622
+ rowData.value[group.id] = [{
623
+ ...newData,
624
+ id,
625
+ }]
626
+ }
627
+
628
+ // 显示数据
629
+ if (pageConfig.value.entity && pageConfig.value.entity.arrayMap[group.id]) {
630
+ pageConfig.value.entity.arrayMap[group.id].push({
631
+ arrayMap: {},
632
+ code: id,
633
+ fieldMap: {
634
+ ...newData,
635
+ },
636
+ })
637
+ }
638
+ else {
639
+ if (pageConfig.value.entity && pageConfig.value.entity.arrayMap) {
640
+ pageConfig.value.entity = {
641
+ arrayMap: {
642
+ ...pageConfig.value.entity.arrayMap,
643
+ [group.id]: [{
644
+ arrayMap: {},
645
+ code: id,
646
+ fieldMap: {
647
+ ...newData,
648
+ },
649
+ }],
650
+ },
651
+ code: id,
652
+ fieldMap: {},
653
+ }
654
+ }
655
+ else {
656
+ pageConfig.value.entity = {
657
+ arrayMap: {
658
+ [group.id]: [{
659
+ arrayMap: {},
660
+ code: id,
661
+ fieldMap: {
662
+ ...newData,
663
+ },
664
+ }],
665
+ },
666
+ code: id,
667
+ fieldMap: {},
668
+ }
669
+ }
670
+ }
671
+ }
672
+ </script>
673
+
674
+ <template>
675
+ <view class="relative h-[calc(100vh-44px)] w-100vw overflow-auto">
676
+ <view v-if="loading" class="flex justify-center p-3">
677
+ <wd-loading />
678
+ </view>
679
+ <view v-else>
680
+ <wd-cell v-if="pageType === '树'" title="分组" title-width="100px">
681
+ <TreeSelectControl
682
+ v-model="tree" select-mode="single" :source-id="sourceId" title="分组"
683
+ ext-control-type="relselect " :readonly="false" :clearable="false"
684
+ />
685
+ </wd-cell>
686
+ <wd-collapse v-model="collapses">
687
+ <wd-collapse-item v-for="group in groupsformat" :key="group.id" :title="group.title" :name="group.id">
688
+ <FormControl
689
+ v-if="group.type === 'fieldGroup'" ref="formControlRef" :field-group="group"
690
+ :entity="pageConfig?.entity?.fieldMap" :enum-column="Enumcolumn"
691
+ />
692
+ <view v-if="group.type === 'relation'">
693
+ <view v-if="selectData[group.id]?.loading" class="flex justify-center p-3">
694
+ <wd-loading />
695
+ </view>
696
+ <view v-else>
697
+ <view v-if="!group.readOnly" class="w-upload flex justify-center gap-2">
698
+ <batchUploadFile
699
+ v-if="group.batchAddFileField && group.batchAddFileField.extControlType === 'file'"
700
+ @handle-file-change="(e) => { handleFileChange(e, group) }"
701
+ />
702
+
703
+ <wd-button
704
+ v-if="group.buttons.includes('selectAdd')" :disabled="canClick(group)" type="info"
705
+ size="small" @click="gotoSlect(group)"
706
+ >
707
+ 选择
708
+ </wd-button>
709
+ <wd-button
710
+ v-if="group.buttons.includes('dtmplAdd')" :disabled="canClick(group)" type="info"
711
+ size="small" @click="gotoAdd(group)"
712
+ >
713
+ 新增
714
+ </wd-button>
715
+ <wd-button
716
+ v-if="group.buttons.includes('rowAdd')" :disabled="canClick(group)" type="info" size="small"
717
+ @click="gotoRowAdd(group)"
718
+ >
719
+ 新增
720
+ </wd-button>
721
+ </view>
722
+ <view v-for="(field, index) in pageConfig?.entity?.arrayMap[group.id]" :key="field.code">
723
+ <foldCard
724
+ :index="index" :enum-column="{}" :groups="group" :source-id="sourceId" :columns="group.fields"
725
+ model="complex" :data="field"
726
+ >
727
+ <template v-if="!group.readOnly" #buttons>
728
+ <wd-button v-if="group.buttons.includes('dtmplEdit')" size="small" @click="edit(group, field)">
729
+ 编辑
730
+ </wd-button>
731
+ <wd-button v-if="group.buttons.includes('rowEdit')" size="small" @click="rowEdit(group, field)">
732
+ 编辑
733
+ </wd-button>
734
+ <wd-button
735
+ v-if="group.buttons.includes('singleDelete')" type="error" size="small"
736
+ @click="remove(group, field)"
737
+ >
738
+ 删除
739
+ </wd-button>
740
+ </template>
741
+ </foldCard>
742
+ </view>
743
+ </view>
744
+ </view>
745
+ </wd-collapse-item>
746
+ </wd-collapse>
747
+ <view class="h-12" />
748
+ <view class="fixed bottom-0 left-0 right-0 box-border w-100% flex p-2 bg-white dark:bg-[var(--wot-dark-background)]">
749
+ <wd-button class="flex-1" :loading="subLoading" @click="save">
750
+ 保存
751
+ </wd-button>
752
+ </view>
753
+ </view>
754
+ </view>
755
+ </template>
756
+
757
+ <style scoped></style>