cloud-web-corejs 1.0.281 → 1.1.0-dev.4

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 (158) hide show
  1. package/package.json +6 -2
  2. package/src/components/VabUpload/image-viewer.vue +442 -442
  3. package/src/components/VabUpload/index.vue +44 -2
  4. package/src/components/VabUpload/mixins.js +126 -19
  5. package/src/components/VabUpload/view.vue +247 -209
  6. package/src/components/baseTabs/mixins.js +181 -181
  7. package/src/components/bizTab/BizBillActions.vue +129 -0
  8. package/src/components/bizTab/BizTabListPage.vue +391 -0
  9. package/src/components/bizTab/README.md +378 -0
  10. package/src/components/bizTab/billTableUtil.js +48 -0
  11. package/src/components/bizTab/billValidators.js +136 -0
  12. package/src/components/bizTab/bizBillDetailMixin.js +705 -0
  13. package/src/components/bizTab/index.js +24 -0
  14. package/src/components/excelExport/exportFieldDialog.vue +23 -12
  15. package/src/components/excelExport/exportItemConfigUtil.js +30 -0
  16. package/src/components/excelExport/mixins.js +3 -3
  17. package/src/components/mobile/statusTag/mixins.js +1 -61
  18. package/src/components/mobile/wf/content.vue +1662 -1556
  19. package/src/components/mobile/wf/mixins/wfModifyDialogMixin.js +8 -6
  20. package/src/components/table/config.js +78 -78
  21. package/src/components/table/index.js +1276 -1276
  22. package/src/components/table/plugins/cell-area/index.js +1055 -0
  23. package/src/components/table/plugins/cell-area/index.scss +77 -0
  24. package/src/components/table/plugins/cell-area/util.js +224 -0
  25. package/src/components/table/tableForm.vue +330 -330
  26. package/src/components/table/tableFormMixin.js +318 -318
  27. package/src/components/table/vxeFilter/index.js +163 -163
  28. package/src/components/table/vxeFilter/mixin.js +316 -316
  29. package/src/components/wf/content.vue +1188 -1188
  30. package/src/components/wf/wf.js +40 -20
  31. package/src/components/wf/wfActionDropdown.vue +1 -1
  32. package/src/components/wf/wfActionItems.js +1 -1
  33. package/src/components/xform/docs/2026-08 xform H5 P0 /345/256/236/347/216/260/350/247/204/346/240/274.md" +528 -0
  34. package/src/components/xform/docs/2026-08 xform H5 P1 /345/256/236/347/216/260/350/247/204/346/240/274.md" +412 -0
  35. package/src/components/xform/docs/2026-08 xform H5 P2 /345/256/236/347/216/260/350/247/204/346/240/274.md" +287 -0
  36. package/src/components/xform/docs/2026-08 xform /347/247/273/345/212/250/347/253/257/345/270/203/345/261/200/345/257/271/351/275/220 bill_setting /346/226/271/346/241/210.md" +400 -0
  37. package/src/components/xform/form-designer/designer.js +15 -0
  38. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +269 -269
  39. package/src/components/xform/form-designer/form-widget/container-widget/detail-temp-widget.vue +132 -0
  40. package/src/components/xform/form-designer/form-widget/container-widget/detail-widget.vue +250 -250
  41. package/src/components/xform/form-designer/form-widget/dialog/fileReferenceDialog.vue +319 -320
  42. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +365 -365
  43. package/src/components/xform/form-designer/form-widget/dialog/searchFormDialog.vue +554 -555
  44. package/src/components/xform/form-designer/form-widget/dialog/vabSearchDialog.vue +409 -409
  45. package/src/components/xform/form-designer/form-widget/field-widget/a-link-widget.vue +150 -132
  46. package/src/components/xform/form-designer/form-widget/field-widget/date-range-widget.vue +114 -114
  47. package/src/components/xform/form-designer/form-widget/field-widget/date-widget.vue +154 -154
  48. package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +47 -1
  49. package/src/components/xform/form-designer/form-widget/field-widget/mixins/date-limit-mixin.js +178 -178
  50. package/src/components/xform/form-designer/form-widget/field-widget/mixins/time-limit-mixin.js +77 -77
  51. package/src/components/xform/form-designer/form-widget/field-widget/select-export-item-button-widget.vue +6 -0
  52. package/src/components/xform/form-designer/form-widget/field-widget/select-widget.vue +139 -139
  53. package/src/components/xform/form-designer/form-widget/field-widget/time-range-widget.vue +106 -106
  54. package/src/components/xform/form-designer/form-widget/field-widget/time-widget.vue +134 -134
  55. package/src/components/xform/form-designer/form-widget/field-widget/vabUpload-widget.vue +1 -0
  56. package/src/components/xform/form-designer/setting-panel/form-setting.vue +39 -39
  57. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/data-table-editor.vue +10 -10
  58. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/exportItemColumns-dialog.vue +438 -432
  59. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/table-column-dialog.vue +2103 -2103
  60. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail/detail-temp-edito.vue +90 -0
  61. package/src/components/xform/form-designer/setting-panel/property-editor/container-grid/gutter-editor.vue +82 -82
  62. package/src/components/xform/form-designer/setting-panel/property-editor/container-list-h5/list-h5-editor.vue +19 -5
  63. package/src/components/xform/form-designer/setting-panel/property-editor/container-table/table-dynamicField-editor.vue +8 -8
  64. package/src/components/xform/form-designer/setting-panel/property-editor/dropdownFlag-editor.vue +137 -137
  65. package/src/components/xform/form-designer/setting-panel/property-editor/field-button/search-dialog-event-editor.vue +237 -237
  66. package/src/components/xform/form-designer/setting-panel/property-editor/field-date/date-defaultValue-editor.vue +43 -43
  67. package/src/components/xform/form-designer/setting-panel/property-editor/field-date-range/date-range-defaultValue-editor.vue +43 -43
  68. package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import2-button-editor.vue +96 -96
  69. package/src/components/xform/form-designer/setting-panel/property-editor/field-table-export-button/select-export-item-button-editor.vue +51 -0
  70. package/src/components/xform/form-designer/setting-panel/property-editor/field-time/time-defaultValue-editor.vue +42 -42
  71. package/src/components/xform/form-designer/setting-panel/property-editor/field-time-range/time-range-defaultValue-editor.vue +43 -43
  72. package/src/components/xform/form-designer/setting-panel/property-editor/formScriptEnabled-editor.vue +158 -158
  73. package/src/components/xform/form-designer/setting-panel/property-editor/h5Span-editor.vue +51 -0
  74. package/src/components/xform/form-designer/setting-panel/property-editor/itemStyle-editor.vue +39 -0
  75. package/src/components/xform/form-designer/setting-panel/property-editor/name-editor.vue +188 -188
  76. package/src/components/xform/form-designer/setting-panel/property-editor/styleTempClass-editor.vue +51 -0
  77. package/src/components/xform/form-designer/setting-panel/property-editor/textFlag-editor.vue +347 -347
  78. package/src/components/xform/form-designer/setting-panel/propertyRegister.js +4 -0
  79. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +59 -3
  80. package/src/components/xform/form-render/container-item/data-table-mixin.js +151 -93
  81. package/src/components/xform/form-render/container-item/detail-h5-item.vue +183 -32
  82. package/src/components/xform/form-render/container-item/detail-temp-item.vue +110 -0
  83. package/src/components/xform/form-render/container-item/h5-card-pane-item.vue +160 -140
  84. package/src/components/xform/form-render/container-item/list-h5-item.vue +1688 -1700
  85. package/src/components/xform/form-render/index.vue +153 -147
  86. package/src/components/xform/form-render/indexMixin.js +12 -0
  87. package/src/components/xform/lang/en-US.js +10 -0
  88. package/src/components/xform/lang/zh-CN.js +12 -0
  89. package/src/components/xform/mixins/defaultHandle.js +707 -707
  90. package/src/components/xform/styles/h5.scss +1992 -0
  91. package/src/components/xform/utils/textMaskUtil.js +182 -179
  92. package/src/components/xform/utils/treeTableUtil.js +1292 -1265
  93. package/src/components/xform/utils/util.js +56 -11
  94. package/src/index.js +9 -4
  95. package/src/layout/components/extractedCode/viewDialog.vue +7 -7
  96. package/src/router/index.js +21 -0
  97. package/src/router/modules/customer.js +71 -14
  98. package/src/store/modules/permission.js +17 -18
  99. package/src/utils/pdfUtil.js +429 -429
  100. package/src/utils/resolveViewComponent.js +142 -16
  101. package/src/views/bd/project/branch/bd_branch/edit.vue +145 -0
  102. package/src/views/bd/project/branch/bd_branch/list.vue +72 -0
  103. package/src/views/bd/project/branch/bd_branch/menuKindDialog.vue +106 -0
  104. package/src/views/bd/project/branch/bd_branch/mixins/edit.js +189 -0
  105. package/src/views/bd/project/branch/bd_branch/mixins/list.js +124 -0
  106. package/src/views/bd/project/branch/bd_branch/mixins/menuKindDialog.js +85 -0
  107. package/src/views/bd/project/branch/form_script/list.vue +31 -0
  108. package/src/views/bd/project/branch/form_template/list.vue +30 -0
  109. package/src/views/bd/project/branch/menu_kind/list.vue +31 -0
  110. package/src/views/bd/project/common/form_script/list.vue +16 -0
  111. package/src/views/bd/project/common/form_template/list.vue +15 -0
  112. package/src/views/bd/project/common/menu_kind/list.vue +15 -0
  113. package/src/views/bd/project/core/branchContext.js +100 -0
  114. package/src/views/bd/project/core/branchPage.js +78 -0
  115. package/src/views/bd/project/core/branchPageWrap.vue +225 -0
  116. package/src/views/bd/project/core/branchScope.js +44 -0
  117. package/src/views/bd/project/core/branchSearchPage.js +285 -0
  118. package/src/views/bd/project/core/branchSelect.vue +85 -0
  119. package/src/views/bd/project/core/branchTreeBar.vue +81 -0
  120. package/src/views/bd/project/core/httpBranchPatch.js +58 -0
  121. package/src/views/bd/project/datatable/menu_kind/list.vue +15 -0
  122. package/src/views/bd/project/datatable/table_model/list.vue +15 -0
  123. package/src/views/bd/setting/bd_company_env/dialog.vue +174 -174
  124. package/src/views/bd/setting/table_model/edit.vue +1066 -1066
  125. package/src/views/bd/setting/table_model/mixins/edit.js +1455 -1455
  126. package/src/views/bd/setting/table_model/mixins/zdDialog.js +148 -148
  127. package/src/views/demo/bizTab/bill/billConfig.js +41 -0
  128. package/src/views/demo/bizTab/bill/detail.vue +436 -0
  129. package/src/views/demo/bizTab/bill/list.vue +288 -0
  130. package/src/views/demo/bizTab/bill/productDialog.vue +176 -0
  131. package/src/views/demo/bizTab/simple/billApi.js +123 -0
  132. package/src/views/demo/bizTab/simple/detail.vue +407 -0
  133. package/src/views/demo/bizTab/simple/list.vue +217 -0
  134. package/src/views/demo/bizTab/standalone/index.vue +121 -0
  135. package/src/views/demo/bizTab/wf/billConfig.js +44 -0
  136. package/src/views/demo/bizTab/wf/detail.vue +661 -0
  137. package/src/views/demo/bizTab/wf/list.vue +242 -0
  138. package/src/views/support/form-dialog-demo/demoPickerDialog.vue +72 -0
  139. package/src/views/support/form-dialog-demo/index.vue +537 -0
  140. package/src/views/user/file_view_ins/list.vue +3 -3
  141. package/src/views/user/home/index.vue +8 -6
  142. package/src/views/user/home/wjl/content.vue +1569 -0
  143. package/src/views/user/notify_message/dialog.vue +7 -5
  144. package/src/views/user/outLink/cc_form_view.vue +188 -0
  145. package/src/views/user/outLink/form_view.vue +2 -2
  146. package/src/views/user/outLink/index.vue +4 -4
  147. package/src/views/user/outLink/view.vue +3 -3
  148. package/src/views/user/role/edit.vue +632 -632
  149. package/src/views/user/role/list.vue +260 -260
  150. package/src/views/user/wf/iframe/index.vue +3 -3
  151. package/src/views/user/wf/iframe/index2.vue +3 -3
  152. package/src/views/user/wf/wf_manage/list.vue +1112 -1116
  153. package/src/views/user/wf/wf_manage/list2.vue +9 -13
  154. package/src/views/user/wf/wf_manage/wfContentDialog.vue +8 -5
  155. package/src/components/xform/form-designer/form-widget/field-widget/dropdown-menu-widget.vue +0 -106
  156. package/src/components/xform/form-designer/form-widget/field-widget/tableexportbuttonwidget.vue +0 -99
  157. package/src/components/xform/form-render/container-item/list-h5-item2.vue +0 -1340
  158. package/src/utils/wf.js +0 -766
@@ -27,6 +27,7 @@ const COMMON_PROPERTIES = {
27
27
  border: "border-editor",
28
28
  labelWidth: "labelWidth-editor",
29
29
  labelHidden: "labelHidden-editor",
30
+ h5Span: "h5Span-editor",
30
31
  rows: "rows-editor",
31
32
  required: "required-editor",
32
33
  // 'requiredHint': 'requiredHint-editor',
@@ -71,6 +72,7 @@ const COMMON_PROPERTIES = {
71
72
  fileTypes: "fileTypes-editor",
72
73
  customClass: "customClass-editor",
73
74
  styleTitClass: "styleTitClass-editor",
75
+ styleTempClass: "styleTempClass-editor",
74
76
  styleTableClass: "styleTableClass-editor",
75
77
  iconClass: "iconClass-editor",
76
78
  echartHeight: "echartHeight-editor",
@@ -108,6 +110,7 @@ const COMMON_PROPERTIES = {
108
110
  pull: "pull-editor",
109
111
  height: "height-editor",
110
112
  detailContainer: "detail-editor",
113
+ detailTempContainer: "detail-temp-editor",
111
114
  detailPlainContainer: "detail-plain-editor",
112
115
  detailPaneContainer: "detail-pane-editor",
113
116
  vabSearchField: "vabSearchField-editor",
@@ -121,6 +124,7 @@ const COMMON_PROPERTIES = {
121
124
  detailH5Container: "detail-h5-editor",
122
125
  h5Card: "h5-card-editor",
123
126
  listH5: "list-h5-editor",
127
+ itemStyle: "itemStyle-editor",
124
128
  formScriptEnabled: "formScriptEnabled-editor",
125
129
  textFlag: "textFlag-editor",
126
130
  showRuleFlag: "showRuleFlag-editor",
@@ -445,6 +445,26 @@ export const containers = [
445
445
  customClass: ""
446
446
  }
447
447
  },*/
448
+ {
449
+ type: "detail-temp",
450
+ category: "container",
451
+ icon: "form",
452
+ commonFlag: !0,
453
+ layoutType: "PC",
454
+ panes: [],
455
+ widgetList: [],
456
+ options: {
457
+ name: "",
458
+ hidden: !1,
459
+ label: "模板模块",
460
+ detailTempContainer: true,
461
+ styleTempClass: 'd-temp-1',
462
+ customClass: "",
463
+ wfEnabled: false,
464
+ onCreated: "",
465
+ onMounted: "",
466
+ },
467
+ },
448
468
  {
449
469
  type: "detail",
450
470
  category: "container",
@@ -548,6 +568,7 @@ export const containers = [
548
568
  detailH5Container: true,
549
569
  // colHeight: null,
550
570
  customClass: "",
571
+ // 底栏平铺个数不做成选项,写死在 detail-h5-item 的 H5_BOTTOM_MAX_BUTTONS(=3)
551
572
  wfEnabled: false,
552
573
  onCreated: "",
553
574
  onMounted: "",
@@ -573,6 +594,8 @@ export const containers = [
573
594
  listH5: true,
574
595
  // colHeight: null,
575
596
  customClass: "",
597
+ // 明细行样式:'plain'=原有朴素列表(默认,保持存量表现);'card'=卡片皮肤
598
+ itemStyle: "plain",
576
599
  isQueryTable: false,
577
600
 
578
601
  accessUrl: null,
@@ -3318,6 +3341,10 @@ export const advancedFields = [
3318
3341
  showImageAtTable: false,
3319
3342
  selectExportItemFlag: 1,
3320
3343
  exportItemConditionEnabled: !1,
3344
+ // 按钮级明细导出配置:三项各自独立,留空的那项沿用数据表格属性上维护的
3345
+ exportItemColumns: [],
3346
+ exportItemScriptCode: null,
3347
+ exportItemParam: "",
3321
3348
 
3322
3349
  onCreated: "",
3323
3350
  onMounted: "",
@@ -4544,6 +4571,7 @@ export const widgetPanelOrder = {
4544
4571
  "detail-tabs",
4545
4572
  "detail-plain",
4546
4573
  "detail-pane",
4574
+ "detail-temp",
4547
4575
  "tree-pane",
4548
4576
  "tree",
4549
4577
  "vf-dialog",
@@ -4625,18 +4653,46 @@ export const widgetPanelOrder = {
4625
4653
  ],
4626
4654
  };
4627
4655
 
4656
+ /**
4657
+ * H5 版式:所有表单字段统一具备 h5Span(整宽/半宽)。
4658
+ *
4659
+ * 为什么用后处理而不是在 42 个字段定义里逐个展开 ...defaultH5Config:
4660
+ * 1) 一处逻辑覆盖全部字段,不会漏;
4661
+ * 2) 顺带覆盖 extension 通过 add*Schema 动态注册的组件;
4662
+ * 3) 用函数调用而非展开运算符,不踩本文件头部注释里那个 Babel TDZ 的坑。
4663
+ *
4664
+ * 属性面板显不显示「H5 占宽」由 designer.hasConfig 决定,它查的是**原型 widget
4665
+ * 的 options**(不是实例),所以必须在这里写进原型。
4666
+ * 详见 docs/2026-08 xform H5 P0 实现规格.md §3.1。
4667
+ */
4668
+ export const defaultH5Config = {
4669
+ h5Span: "full", // 'full' | 'half'
4670
+ };
4671
+
4672
+ function applyH5FieldDefaults(schema) {
4673
+ if (!schema || !schema.formItemFlag || !schema.options) return schema;
4674
+ if (!Object.prototype.hasOwnProperty.call(schema.options, "h5Span")) {
4675
+ Object.assign(schema.options, defaultH5Config);
4676
+ }
4677
+ return schema;
4678
+ }
4679
+
4680
+ [basicFields, advancedFields, businessFields, customFields].forEach((list) =>
4681
+ list.forEach(applyH5FieldDefaults)
4682
+ );
4683
+
4628
4684
  export function addContainerWidgetSchema(containerSchema) {
4629
4685
  containers.push(containerSchema);
4630
4686
  }
4631
4687
 
4632
4688
  export function addBasicFieldSchema(fieldSchema) {
4633
- basicFields.push(fieldSchema);
4689
+ basicFields.push(applyH5FieldDefaults(fieldSchema));
4634
4690
  }
4635
4691
 
4636
4692
  export function addAdvancedFieldSchema(fieldSchema) {
4637
- advancedFields.push(fieldSchema);
4693
+ advancedFields.push(applyH5FieldDefaults(fieldSchema));
4638
4694
  }
4639
4695
 
4640
4696
  export function addCustomWidgetSchema(widgetSchema) {
4641
- customFields.push(widgetSchema);
4697
+ customFields.push(applyH5FieldDefaults(widgetSchema));
4642
4698
  }
@@ -68,6 +68,7 @@ import {
68
68
  isTemporaryTreeKey,
69
69
  syncTreeKeyReferences,
70
70
  sanitizeTreeRow,
71
+ stripTreeContainers,
71
72
  } from "../../utils/treeTableUtil";
72
73
  import { tableTreeMixins } from "../../../../mixins/tableTree/index.js";
73
74
 
@@ -2442,76 +2443,7 @@ modules = {
2442
2443
  };
2443
2444
  }
2444
2445
 
2445
- let exportItemConfig = null;
2446
- if (
2447
- this.widget.options.exportItemColumns &&
2448
- this.widget.options.exportItemColumns.length > 0
2449
- ) {
2450
- let formatKeys = [
2451
- "d1",
2452
- "d2",
2453
- "d3",
2454
- "d4",
2455
- "d5",
2456
- "n1",
2457
- "n2",
2458
- "n3",
2459
- "n4",
2460
- "n5",
2461
- "n6",
2462
- "n7",
2463
- ];
2464
- let exportItemColumns = this.widget.options.exportItemColumns.map(
2465
- (item) => {
2466
- let columnSlots = null;
2467
- let columnParams = {};
2468
- if (item.formatS === "render") {
2469
- let r = item.render
2470
- ? new Function("params", "h", item.render)
2471
- : null;
2472
- columnSlots = {
2473
- default: (params, h) => {
2474
- return r ? r.call(this, params, h) : "";
2475
- },
2476
- };
2477
- } else if (formatKeys.includes(item.formatS)) {
2478
- columnSlots = {
2479
- default: (params, h) => {
2480
- let cellValue = params.row[params.column.field];
2481
- return this.getFormatterValue(
2482
- cellValue,
2483
- item.formatS,
2484
- item.utcTransformEnabled
2485
- );
2486
- },
2487
- };
2488
- }
2489
- if (item.exportType) {
2490
- columnParams.exportType = item.exportType;
2491
- }
2492
- return {
2493
- id: item.id,
2494
- title: item.title,
2495
- field: item.field,
2496
- params: columnParams,
2497
- slots: columnSlots,
2498
- };
2499
- }
2500
- );
2501
- exportItemConfig = {
2502
- scriptCode:
2503
- this.widget.options.exportItemScriptCode ||
2504
- this.widget.options.formScriptCode,
2505
- columns: exportItemColumns,
2506
- param: () => {
2507
- if (this.widget.options.exportItemParam) {
2508
- return this.handleCustomParam(
2509
- this.widget.options.exportItemParam
2510
- );
2511
- }
2512
- },
2513
- };
2514
- }
2446
+ let exportItemConfig = this.buildExportItemConfig();
2515
2447
  let rowConfig = {};
2516
2448
  if (this.widget.options.tableRowHeight) {
2517
2449
  rowConfig.height = this.widget.options.tableRowHeight;
@@ -3228,7 +3160,9 @@ modules = {
3228
3160
  if (isItemExport(exportType)) {
3229
3161
  let $grid = this.getGridTable();
3230
3162
  let originOption = $grid.params.originOption;
3231
- let exportItemConfig = originOption.exportItemConfig || {};
3163
+ // 导出按钮上单独维护了明细列时,配置随导出参数下发,优先于表格属性那套
3164
+ let btnConfig = customParam?.exportParam?.exportItemConfig;
3165
+ let exportItemConfig = btnConfig || originOption.exportItemConfig || {};
3232
3166
  if (exportItemConfig.scriptCode) {
3233
3167
  scriptCode = exportItemConfig.scriptCode;
3234
3168
  }
@@ -3339,30 +3273,134 @@ modules = {
3339
3273
  let tableRef = this.widget.id;
3340
3274
  return tableRef;
3341
3275
  },
3342
- /** 导出前按脱敏规则剔除列,实现见 textMaskUtil.markMaskedExportColumns。 */
3343
- markMaskedColumnsForExport() {
3276
+ /**
3277
+ * 导出前按脱敏规则剔除列,实现见 textMaskUtil.markMaskedExportColumns。
3278
+ * @param {Array} [exportItemColumns] 本次明细导出实际使用的列;不传则取表格属性上配的那套。
3279
+ */
3280
+ markMaskedColumnsForExport(exportItemColumns) {
3344
3281
  markMaskedExportColumns(
3345
3282
  this.getGridTable(),
3346
3283
  buildTextMaskContext(
3347
3284
  this.getFormRef(),
3348
3285
  this.$store.getters.companyCode
3349
- )
3286
+ ),
3287
+ exportItemColumns
3350
3288
  );
3351
3289
  },
3290
+ /**
3291
+ * 明细导出列配置 → vxe 列:formatS/render 转成渲染插槽,exportType 落到 params。
3292
+ * @param {Array} rawColumns 设计器维护的明细导出列。
3293
+ * @returns {Array} vxe 列定义。
3294
+ */
3295
+ buildExportItemColumns(rawColumns) {
3296
+ let formatKeys = [
3297
+ "d1",
3298
+ "d2",
3299
+ "d3",
3300
+ "d4",
3301
+ "d5",
3302
+ "n1",
3303
+ "n2",
3304
+ "n3",
3305
+ "n4",
3306
+ "n5",
3307
+ "n6",
3308
+ "n7",
3309
+ ];
3310
+ return rawColumns.map((item) => {
3311
+ let columnSlots = null;
3312
+ let columnParams = {};
3313
+ if (item.formatS === "render") {
3314
+ let r = item.render ? new Function("params", "h", item.render) : null;
3315
+ columnSlots = {
3316
+ default: (params, h) => {
3317
+ return r ? r.call(this, params, h) : "";
3318
+ },
3319
+ };
3320
+ } else if (formatKeys.includes(item.formatS)) {
3321
+ columnSlots = {
3322
+ default: (params, h) => {
3323
+ let cellValue = params.row[params.column.field];
3324
+ return this.getFormatterValue(
3325
+ cellValue,
3326
+ item.formatS,
3327
+ item.utcTransformEnabled
3328
+ );
3329
+ },
3330
+ };
3331
+ }
3332
+ if (item.exportType) {
3333
+ columnParams.exportType = item.exportType;
3334
+ }
3335
+ return {
3336
+ id: item.id,
3337
+ title: item.title,
3338
+ field: item.field,
3339
+ params: columnParams,
3340
+ slots: columnSlots,
3341
+ };
3342
+ });
3343
+ },
3344
+ /**
3345
+ * 组装一份明细导出配置。导出列、脚本编码、自定义导出参数三项都可以由导出按钮单独维护,
3346
+ * 各自独立生效:按钮留空的那一项回落到表格属性,三项都留空就是表格属性上原来那套。
3347
+ * @param {Object} [overrides] 按钮级配置。
3348
+ * @param {Array} [overrides.columns] 明细导出列。
3349
+ * @param {String} [overrides.scriptCode] 明细导出脚本编码。
3350
+ * @param {String} [overrides.paramScript] 明细导出查询参数脚本。
3351
+ * @returns {Object|null} 两处都没维护列时返回 null。
3352
+ */
3353
+ buildExportItemConfig(overrides) {
3354
+ let options = this.widget.options;
3355
+ let o = overrides || {};
3356
+ let hasColumns = o.columns && o.columns.length;
3357
+ let columns = hasColumns ? o.columns : options.exportItemColumns;
3358
+ if (!columns || !columns.length) return null;
3359
+ let scriptCode = o.scriptCode || options.exportItemScriptCode;
3360
+ let paramScript = o.paramScript || options.exportItemParam;
3361
+ return {
3362
+ scriptCode: scriptCode || options.formScriptCode,
3363
+ columns: this.buildExportItemColumns(columns),
3364
+ // 取数参数脚本与表格上其它脚本一样走 handleCustomEvent(它负责注入 dataId /
3365
+ // formCode 并统一弹前端脚本异常)。原先写的 handleCustomParam 全库没有定义,
3366
+ // 配了「明细导出查询参数」的表格一点导出就抛 TypeError。
3367
+ param: () => {
3368
+ if (paramScript) {
3369
+ return this.handleCustomEvent(paramScript);
3370
+ }
3371
+ },
3372
+ };
3373
+ },
3352
3374
  /**
3353
3375
  * 使用统一 Excel 导出器导出当前表格。
3354
3376
  * @param {Object} option 导出参数;prefix 为空时自动使用当前服务前缀。
3377
+ * option.exportItemColumns / exportItemScriptCode / exportItemParam 为按钮上维护的
3378
+ * 明细导出列、脚本编码与取数参数脚本,三项各自独立:传了哪项就以哪项为准(同一张表格
3379
+ * 可以挂多个明细导出按钮、各导各自的列、各走各自的脚本),组装成 exportItemConfig 随
3380
+ * 导出参数下发,下游(字段选择弹框 / 分页取数 / 脱敏剔除)一律优先读它,读不到才回落
3381
+ * 表格属性那套。
3355
3382
  */
3356
3383
  exportData(option) {
3357
- this.markMaskedColumnsForExport();
3384
+ let exportOption = { ...option };
3385
+ let itemColumns = exportOption.exportItemColumns;
3386
+ let itemScriptCode = exportOption.exportItemScriptCode;
3387
+ let itemParam = exportOption.exportItemParam;
3388
+ delete exportOption.exportItemColumns;
3389
+ delete exportOption.exportItemScriptCode;
3390
+ delete exportOption.exportItemParam;
3391
+ let hasOverride = itemColumns?.length || itemScriptCode || itemParam;
3392
+ if (isItemExport(exportOption.type) && hasOverride) {
3393
+ exportOption.exportItemConfig = this.buildExportItemConfig({
3394
+ columns: itemColumns,
3395
+ scriptCode: itemScriptCode,
3396
+ paramScript: itemParam,
3397
+ });
3398
+ }
3399
+ this.markMaskedColumnsForExport(exportOption.exportItemConfig?.columns);
3358
3400
  let tableRef = this.getTableRef();
3359
3401
  let serviceName = this.getFormRef().reportTemplate.serviceName;
3360
- option.prefix = option.prefix || "/" + serviceName;
3361
- let exportTableTarget = this.$refs.exportTable;
3362
- let getExportTableRef = () => {
3363
- return exportTableTarget;
3364
- };
3365
- this.$excelExport({ targetRef: tableRef, ...option });
3402
+ exportOption.prefix = exportOption.prefix || "/" + serviceName;
3403
+ this.$excelExport({ targetRef: tableRef, ...exportOption });
3366
3404
  },
3367
3405
  async deleteRow(row, rowIndex) {
3368
3406
  let isTreeTable = this.widget.options.isTreeTable;
@@ -3533,7 +3571,7 @@ modules = {
3533
3571
  let newData = this.createNewTableData();
3534
3572
  tableRows.push(newData);
3535
3573
  }
3536
- this.setValue(tableRows);
3574
+ this.setValue(this.stripTreeContainerRows(tableRows));
3537
3575
  this.$nextTick(() => {
3538
3576
  this.handleWbs();
3539
3577
  });
@@ -4520,7 +4558,7 @@ modules = {
4520
4558
  await reconcileGrid.clearActived();
4521
4559
  }
4522
4560
  if (rebuildTreeAfterSave && !responseAlreadyApplied) {
4523
- this.setValue(treeTableRows);
4561
+ this.setValue(this.stripTreeContainerRows(treeTableRows));
4524
4562
  treeSnapshotApplied = true;
4525
4563
  await new Promise((resolve) => this.$nextTick(resolve));
4526
4564
  }
@@ -4692,7 +4730,7 @@ modules = {
4692
4730
  } else {
4693
4731
  tableRows.splice(0, 0, newRow);
4694
4732
  }
4695
- this.setValue(tableRows);
4733
+ this.setValue(this.stripTreeContainerRows(tableRows));
4696
4734
  this.$nextTick(() => {
4697
4735
  this.handleWbs();
4698
4736
  if (isEditTable) {
@@ -4714,7 +4752,7 @@ modules = {
4714
4752
  } else {
4715
4753
  tableRows.splice(0, 0, newRow);
4716
4754
  }
4717
- this.setValue(tableRows);
4755
+ this.setValue(this.stripTreeContainerRows(tableRows));
4718
4756
  this.$nextTick(() => {
4719
4757
  this.handleWbs();
4720
4758
  // setValue 已浅克隆所有行,obj.row 是失效引用,须按 _X_ROW_KEY 找回新行
@@ -4802,7 +4840,7 @@ modules = {
4802
4840
  });
4803
4841
  this.validateNewTreeRows(newRows, treeContext);
4804
4842
  tableRows.push(...newRows);
4805
- this.setValue(tableRows);
4843
+ this.setValue(this.stripTreeContainerRows(tableRows));
4806
4844
  this.$nextTick(() => {
4807
4845
  this.handleWbs();
4808
4846
  if (parent) {
@@ -4811,6 +4849,26 @@ modules = {
4811
4849
  }
4812
4850
  });
4813
4851
  },
4852
+ /**
4853
+ * 去掉 VXE 建树时写回行对象的容器字段(children / mapChildren)。
4854
+ *
4855
+ * 删除、排序这类「改扁平数组再整表重载」的操作必须先剥容器:容器是上一次
4856
+ * 渲染的产物,已被移出数组的节点仍挂在存活父行下,setValue 里的
4857
+ * canonicalizeTreeInput 会顺着容器把它们收回来,删除与排序因此静默失效。
4858
+ *
4859
+ * 只对 isTreeTable(强制 transform,父子关系由 parentField 表达)生效;
4860
+ * 靠 children 表达层级的表原样返回,剥掉会丢层级。
4861
+ * @param {Array} rows 取自表单模型的扁平活动行。
4862
+ * @returns {Array} 可安全交给 setValue 的行数组。
4863
+ */
4864
+ stripTreeContainerRows(rows) {
4865
+ if (!this.widget.options.isTreeTable) {
4866
+ return rows || [];
4867
+ }
4868
+ return stripTreeContainers(rows || [], {
4869
+ fields: this.getTreeFields(),
4870
+ });
4871
+ },
4814
4872
  /**
4815
4873
  * 收集节点全部后代的 _X_ROW_KEY(不含节点自身)。
4816
4874
  * 兼容嵌套结构(children 字段)与扁平结构(parentField 关联)两种数据形态。
@@ -4890,7 +4948,7 @@ modules = {
4890
4948
  });
4891
4949
  }
4892
4950
  let newRows = tableRows.filter((item) => !delKeys.has(item._X_ROW_KEY));
4893
- this.setValue(newRows);
4951
+ this.setValue(this.stripTreeContainerRows(newRows));
4894
4952
  this.$nextTick(() => {
4895
4953
  this.handleWbs();
4896
4954
  });
@@ -5148,7 +5206,7 @@ modules = {
5148
5206
  } else {
5149
5207
  tableRows.splice(0, 0, newRow);
5150
5208
  }
5151
- this.setValue(tableRows);
5209
+ this.setValue(this.stripTreeContainerRows(tableRows));
5152
5210
  this.$nextTick(() => {
5153
5211
  this.handleWbs();
5154
5212
  });
@@ -5165,7 +5223,7 @@ modules = {
5165
5223
  } else {
5166
5224
  tableRows.splice(0, 0, newRow);
5167
5225
  }
5168
- this.setValue(tableRows);
5226
+ this.setValue(this.stripTreeContainerRows(tableRows));
5169
5227
  this.$nextTick(() => {
5170
5228
  this.handleWbs();
5171
5229
  // setValue 已浅克隆所有行,obj.row 是失效引用,须按 _X_ROW_KEY 找回新行
@@ -5362,7 +5420,7 @@ modules = {
5362
5420
  );
5363
5421
  tableRows.splice(currentIndex, 1);
5364
5422
  tableRows.splice(prevIndex, 0, row);
5365
- this.setValue(tableRows);
5423
+ this.setValue(this.stripTreeContainerRows(tableRows));
5366
5424
  this.$nextTick(() => {
5367
5425
  this.handleWbs();
5368
5426
  });
@@ -5411,7 +5469,7 @@ modules = {
5411
5469
  );
5412
5470
  tableRows.splice(currentIndex, 1);
5413
5471
  tableRows.splice(nextIndex, 0, row);
5414
- this.setValue(tableRows);
5472
+ this.setValue(this.stripTreeContainerRows(tableRows));
5415
5473
  this.$nextTick(() => {
5416
5474
  this.handleWbs();
5417
5475
  });
@@ -5488,7 +5546,7 @@ modules = {
5488
5546
  rows.forEach((row, index1) => {
5489
5547
  items.splice(index + index1, 0, row);
5490
5548
  });
5491
- this.setValue(items);
5549
+ this.setValue(this.stripTreeContainerRows(items));
5492
5550
  this.$nextTick(() => {
5493
5551
  this.handleWbs();
5494
5552
  });
@@ -5783,7 +5841,7 @@ modules = {
5783
5841
  if (this.designState) return;
5784
5842
  this.$on("setFormData", (o) => {
5785
5843
  let rows = this.formModel[this.fieldKeyName] || [];
5786
- this.setValue(rows);
5844
+ this.setValue(this.stripTreeContainerRows(rows));
5787
5845
  });
5788
5846
  },
5789
5847
  /** @param {Object} widget 组件 schema。@param {Array<String>} ignoreFields 忽略字段。@returns {Boolean} 是否处理禁用状态。 */