wui-components-v2 1.1.69 → 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 (117) hide show
  1. package/api/core/index.ts +74 -74
  2. package/api/feishu.ts +20 -20
  3. package/api/index.ts +4 -4
  4. package/api/login.ts +51 -51
  5. package/api/menu.ts +45 -45
  6. package/api/page.ts +114 -114
  7. package/api/sys.ts +12 -12
  8. package/api/tree.ts +28 -28
  9. package/components/action-popup/action-popup.vue +116 -116
  10. package/components/add-address-list/add-address-list.vue +187 -187
  11. package/components/add-address-page/add-address-page.vue +77 -77
  12. package/components/add-address-page/config.ts +297 -297
  13. package/components/audio-play/audio-play.vue +220 -220
  14. package/components/batch-upload-file/batch-upload-file.vue +75 -75
  15. package/components/card-botom-buttons/card-botom-buttons.vue +279 -279
  16. package/components/custom-date-picker/custom-date-picker.vue +106 -106
  17. package/components/custom-select-picker/custom-select-picker.vue +95 -95
  18. package/components/demo-block/demo-block.vue +63 -63
  19. package/components/demo-card/demo-card.vue +44 -44
  20. package/components/detail-popup/detail-popup.vue +99 -99
  21. package/components/evaluation-page/evaluation-page.vue +196 -196
  22. package/components/fold-card/fold-card.vue +171 -171
  23. package/components/form-control/form-control.vue +661 -661
  24. package/components/global-loading/GlobalLoading.md +366 -366
  25. package/components/global-loading/global-loading.vue +55 -55
  26. package/components/global-message/GlobalMessage.md +570 -570
  27. package/components/global-message/global-message.vue +68 -68
  28. package/components/global-toast/GlobalToast.md +261 -261
  29. package/components/global-toast/global-toast.vue +56 -56
  30. package/components/label-value/label-value.vue +144 -144
  31. package/components/label-value/open-value-more.vue +56 -56
  32. package/components/list-top-buttons/list-top-buttons.vue +19 -19
  33. package/components/loading/loading.vue +5 -5
  34. package/components/login-form/login-form.vue +126 -126
  35. package/components/login-form-box/login-form-box.vue +65 -65
  36. package/components/mulselect-picker/mulselect-picker.vue +86 -86
  37. package/components/phone-login-form/phone-login-form.vue +204 -204
  38. package/components/privacy-popup/privacy-popup.vue +191 -191
  39. package/components/product-card/product-card.vue +201 -201
  40. package/components/scan-input/scan-input.vue +406 -406
  41. package/components/search/search.vue +128 -128
  42. package/components/select-col-picker/select-col-picker.vue +168 -168
  43. package/components/tab-search/tab-search.vue +73 -73
  44. package/components/tree-select/components/TreeNode.vue +200 -200
  45. package/components/tree-select/components/index.vue +471 -471
  46. package/components/tree-select/components/tree-select.vue +56 -56
  47. package/components/tree-select/index.vue +93 -93
  48. package/components/user-choose/user-choose.vue +169 -151
  49. package/components/video-play/video-play.vue +56 -56
  50. package/components/wui-auto-update-component/wui-auto-update-component.vue +132 -132
  51. package/components/wui-default/wui-default.vue +49 -49
  52. package/components/wui-details-page/wui-details-page.vue +147 -147
  53. package/components/wui-edit-page/wui-edit-page-copy.vue +757 -757
  54. package/components/wui-edit-page/wui-edit-page.vue +793 -793
  55. package/components/wui-enume-select-control/wui-enume-select-control.vue +92 -92
  56. package/components/wui-list/wui-list.vue +235 -235
  57. package/components/wui-login/wui-login.vue +43 -43
  58. package/components/wui-login1/wui-login.vue +41 -41
  59. package/components/wui-menus/wui-menus-top.vue +137 -137
  60. package/components/wui-menus/wui-menus-top1.vue +8 -8
  61. package/components/wui-menus/wui-menus.vue +247 -247
  62. package/components/wui-menus1/components/banner-carousel.vue +320 -320
  63. package/components/wui-menus1/components/navbar.vue +43 -43
  64. package/components/wui-menus1/components/quick-panel.vue +55 -55
  65. package/components/wui-menus1/components/search-bar.vue +49 -49
  66. package/components/wui-menus1/components/section-menus.vue +208 -208
  67. package/components/wui-menus1/wui-menus-top.vue +718 -718
  68. package/components/wui-menus1/wui-menus-top1.vue +398 -398
  69. package/components/wui-menus1/wui-menus.vue +564 -564
  70. package/components/wui-notify-info/notify-handle.vue +53 -53
  71. package/components/wui-notify-info/wui-notify-info.vue +280 -280
  72. package/components/wui-scan-binding-sensor/wui-scan-binding-sensor.vue +75 -75
  73. package/components/wui-search-history-babbar/components/SearchBar.vue +70 -70
  74. package/components/wui-search-history-babbar/wui-search-history-babbar.vue +204 -204
  75. package/components/wui-select-list/wui-select-list.vue +310 -310
  76. package/components/wui-select-popup/wui-select-popup.vue +613 -612
  77. package/components/wui-system-settings/wui-system-settings.vue +144 -144
  78. package/components/wui-tabbar/wui-tabbar.vue +106 -106
  79. package/components/wui-tree-page/components/tree-item.vue +238 -238
  80. package/components/wui-tree-page/wui-tree-page.vue +297 -297
  81. package/components/wui-update-component/wui-update-component.vue +221 -221
  82. package/components/wui-user/wui-user.vue +202 -202
  83. package/composables/types/theme.ts +65 -65
  84. package/composables/types/user.ts +5 -5
  85. package/composables/useColorGenerator.ts +221 -221
  86. package/composables/useCompanyFieldFilter.ts +91 -91
  87. package/composables/useEnumes.ts +43 -43
  88. package/composables/useEventBus.ts +37 -37
  89. package/composables/useGlobalLoading.ts +47 -47
  90. package/composables/useGlobalMessage.ts +53 -53
  91. package/composables/useGlobalToast.ts +63 -63
  92. package/composables/useLocale.ts +54 -54
  93. package/composables/useManualTheme.ts +179 -179
  94. package/composables/useMenus.ts +193 -193
  95. package/composables/useSectionMenus.ts +120 -120
  96. package/composables/useTabbar.ts +50 -50
  97. package/composables/useTheme.ts +74 -74
  98. package/composables/useUser.ts +24 -24
  99. package/index.d.ts +90 -90
  100. package/index.ts +83 -83
  101. package/package.json +24 -24
  102. package/static/iconfont/iconfont.css +63 -63
  103. package/store/language.ts +151 -151
  104. package/store/manualThemeStore.ts +143 -143
  105. package/store/persist.ts +41 -41
  106. package/store/themeStore.ts +74 -74
  107. package/store/userStore.ts +22 -22
  108. package/styles/dark-mode.css +523 -523
  109. package/styles/dark-mode.min.css +1 -1
  110. package/styles/dark-mode.scss +498 -498
  111. package/type.ts +154 -154
  112. package/utils/control-tree.ts +353 -353
  113. package/utils/control-type-supportor.ts +148 -148
  114. package/utils/eventBus.ts +36 -36
  115. package/utils/idata-scan.ts +99 -99
  116. package/utils/index.ts +979 -979
  117. 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>