cloud-web-corejs 1.0.54-dev.73 → 1.0.54-dev.730

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 (555) hide show
  1. package/package.json +23 -14
  2. package/src/App.vue +30 -34
  3. package/src/api/user.js +85 -40
  4. package/src/components/Qrcode/fileParse.vue +0 -1
  5. package/src/components/Tinymce/index.vue +112 -71
  6. package/src/components/VabUpload/fileLibraryDialog.vue +296 -0
  7. package/src/components/VabUpload/image-viewer.vue +2 -2
  8. package/src/components/VabUpload/index.js +69 -1
  9. package/src/components/VabUpload/index.vue +9 -1
  10. package/src/components/VabUpload/mixins/fileLibraryDialog.js +1112 -0
  11. package/src/components/VabUpload/mixins.js +1881 -2
  12. package/src/components/VabUpload/propertiesDialog.vue +3 -3
  13. package/src/components/VabUpload/view.vue +209 -120
  14. package/src/components/advancedSearchDialog/mixins.js +28 -1
  15. package/src/components/base-textarea/index.vue +104 -0
  16. package/src/components/baseAlert/index.js +44 -1
  17. package/src/components/baseAlert/index.vue +24 -20
  18. package/src/components/baseAlert/mixins.js +61 -1
  19. package/src/components/baseArea/index.vue +1543 -0
  20. package/src/components/baseAttachment/index.vue +49 -40
  21. package/src/components/baseAttachment/install.js +21 -5
  22. package/src/components/baseAttachment/mixins.js +310 -1
  23. package/src/components/baseInputBatch/mixins.js +58 -1
  24. package/src/components/baseInputExport/index.vue +21 -14
  25. package/src/components/baseInputExport/mixins.js +391 -1
  26. package/src/components/baseTabs/index.vue +16 -8
  27. package/src/components/baseTabs/mixins.js +166 -1
  28. package/src/components/cnPrint/index.js +44 -1
  29. package/src/components/cnPrint/mixins.js +189 -1
  30. package/src/components/code-editor/index.vue +131 -62
  31. package/src/components/confirmDialog/index.js +41 -1
  32. package/src/components/confirmDialog/index.vue +24 -17
  33. package/src/components/confirmDialog/mixins.js +31 -1
  34. package/src/components/errorMsg/index.js +1 -1
  35. package/src/components/errorMsg/index.vue +78 -70
  36. package/src/components/errorMsg/mixins.js +6 -5
  37. package/src/components/excelExport/button.vue +86 -24
  38. package/src/components/excelExport/exportFieldDialog.vue +215 -81
  39. package/src/components/excelExport/index.js +51 -6
  40. package/src/components/excelExport/index.vue +108 -26
  41. package/src/components/excelExport/mixins.js +1051 -8
  42. package/src/components/excelImport/index.js +13 -13
  43. package/src/components/excelImport/mixins.js +2 -1
  44. package/src/components/fileLibrary/fileObjAuthDialog.vue +179 -89
  45. package/src/components/fileLibrary/fileObjAuthEditDialog.vue +6 -0
  46. package/src/components/fileLibrary/filterDialog.vue +454 -0
  47. package/src/components/fileLibrary/index.vue +692 -269
  48. package/src/components/fileLibrary/mixins/categoryMoveDialogMixins.js +1 -1
  49. package/src/components/fileLibrary/mixins/fileCategoryDialogMixins.js +1 -1
  50. package/src/components/fileLibrary/mixins/fileHistoryDialogMixins.js +2 -2
  51. package/src/components/fileLibrary/mixins/fileObjAuthDialogMixin.js +339 -211
  52. package/src/components/fileLibrary/mixins/fileObjAuthEditDialogMixin.js +31 -27
  53. package/src/components/fileLibrary/mixins/fileObjAuthEditMixin.js +4 -4
  54. package/src/components/fileLibrary/mixins/indexMixins.js +220 -101
  55. package/src/components/fileLibrary/mixins/propertiesDialogMixins.js +62 -3
  56. package/src/components/fileLibrary/mixins/recycleBinDialogMixins.js +3 -3
  57. package/src/components/fileLibrary/propertiesDialog.vue +119 -74
  58. package/src/components/fileLibrary/shareDialog.vue +1 -1
  59. package/src/components/formOplog/mixins.js +85 -4
  60. package/src/components/hiprint/css/bootstrap.min.css +6 -0
  61. package/src/components/hiprint/fonts/glyphicons-halflings-regular.eot +0 -0
  62. package/src/components/hiprint/fonts/glyphicons-halflings-regular.svg +288 -0
  63. package/src/components/hiprint/fonts/glyphicons-halflings-regular.ttf +0 -0
  64. package/src/components/hiprint/fonts/glyphicons-halflings-regular.woff +0 -0
  65. package/src/components/hiprint/fonts/glyphicons-halflings-regular.woff2 +0 -0
  66. package/src/components/hiprint/hiprint.bundle.js +15 -3
  67. package/src/components/hiprint/view/design/index.vue +140 -47
  68. package/src/components/hiprint/view/design/mixins.js +611 -1
  69. package/src/components/hiprint/view/design/preview.vue +75 -52
  70. package/src/components/hiprint/view/json-view.vue +31 -31
  71. package/src/components/jdPrint/index.js +44 -1
  72. package/src/components/jdPrint/mixins.js +208 -1
  73. package/src/components/jsonImport/exportUtil.js +106 -0
  74. package/src/components/jsonImport/index.js +212 -17
  75. package/src/components/jsonImport/mixins.js +333 -1
  76. package/src/components/langImport/index.js +80 -1
  77. package/src/components/langImport/mixins.js +500 -16
  78. package/src/components/langTag/mixins/addButton.js +51 -5
  79. package/src/components/langTag/mixins/deleteButton.js +55 -5
  80. package/src/components/langTag/mixins/view.js +47 -5
  81. package/src/components/luckysheet/dialog.vue +159 -0
  82. package/src/components/luckysheet/export.js +595 -0
  83. package/src/components/luckysheet/fileUtils.js +147 -0
  84. package/src/components/luckysheet/index.js +72 -0
  85. package/src/components/luckysheet/templateJson.js +12078 -0
  86. package/src/components/luckysheet/view.vue +210 -0
  87. package/src/components/obsUpload/index.js +34 -0
  88. package/src/components/obsUpload/index.vue +231 -0
  89. package/src/components/obsUpload/mixins.js +1476 -0
  90. package/src/components/onlineTalk/index.vue +1 -1
  91. package/src/components/onlineTalk/mixins.js +852 -1
  92. package/src/components/onlineTalk/talkUserDialog.vue +280 -0
  93. package/src/components/oplogTable/mixins.js +83 -4
  94. package/src/components/pddPrint/index.js +44 -1
  95. package/src/components/pddPrint/mixins.js +252 -1
  96. package/src/components/projectTag/mixins/addButton.js +52 -1
  97. package/src/components/projectTag/mixins/deleteButton.js +52 -1
  98. package/src/components/projectTag/mixins/view.js +43 -1
  99. package/src/components/scriptDescription/button.vue +12 -4
  100. package/src/components/scriptDescription/mixins.js +30 -1
  101. package/src/components/scriptTest/mixins.js +90 -1
  102. package/src/components/statusTag/mixins.js +66 -1
  103. package/src/components/table/CellSlot.vue +12 -9
  104. package/src/components/table/config.js +1 -1
  105. package/src/components/table/index.js +1191 -11
  106. package/src/components/table/plugins/extend-cell-area/vxe-table-extend-cell-area.es6.min.js +11028 -0
  107. package/src/components/table/plugins/extend-cell-area/vxe-table-extend-cell-area.min.css +200 -0
  108. package/src/components/table/tableForm.vue +99 -63
  109. package/src/components/table/tableFormMixin.js +1 -1
  110. package/src/components/table/util/index.js +339 -0
  111. package/src/components/table/vxeFilter/index.js +2 -1
  112. package/src/components/table/vxeFilter/mixin.js +8 -6
  113. package/src/components/tempStorage/index.vue +76 -55
  114. package/src/components/tempStorage/tempStorageDialog.vue +179 -54
  115. package/src/components/vb-tabs/x-tabs.vue +57 -30
  116. package/src/components/vipPrint/index.js +44 -1
  117. package/src/components/vipPrint/mixins.js +268 -1
  118. package/src/components/wf/addOpinionButton.vue +57 -0
  119. package/src/components/wf/content.vue +834 -362
  120. package/src/components/wf/mixins/addOpinionButton.js +53 -0
  121. package/src/components/wf/mixins/setCandidateButton.js +161 -0
  122. package/src/components/wf/mixins/setCandidateDialog.js +213 -1
  123. package/src/components/wf/mixins/setCandidateDialog2.js +252 -0
  124. package/src/components/wf/mixins/wfFlowEleScriptDialog.js +131 -0
  125. package/src/components/wf/mixins/wfTaskUserRangeDialog.js +69 -0
  126. package/src/components/wf/setCandidateButton.vue +40 -0
  127. package/src/components/wf/setCandidateDialog.vue +10 -0
  128. package/src/components/wf/setCandidateDialog2.vue +105 -0
  129. package/src/components/wf/wf.js +2174 -1
  130. package/src/components/wf/wfFlowEleScriptDialog.vue +89 -0
  131. package/src/components/wf/wfStartDialog.vue +66 -42
  132. package/src/components/wf/wfTaskUserRangeDialog.vue +65 -0
  133. package/src/components/wf/wfUtil.js +280 -1
  134. package/src/components/xform/XFormTabContainer//346/226/260/345/242/236/351/241/265/347/255/276/346/250/241/345/274/217-/346/234/200/347/273/210/345/256/236/347/216/260.md +195 -0
  135. package/src/components/xform/docs/autocomplete /350/207/252/345/212/250/345/256/214/346/210/220/347/273/204/344/273/266/350/257/264/346/230/216.md" +126 -0
  136. package/src/components/xform/docs//345/220/216/345/217/260/345/255/227/346/256/265/357/274/210/345/212/250/346/200/201/347/224/237/346/210/220/357/274/211JSON /350/257/264/346/230/216.md" +1286 -0
  137. package/src/components/xform/docs//345/257/271/346/257/224/345/212/237/350/203/275/350/220/275/345/234/260/346/226/271/346/241/210.md +569 -0
  138. package/src/components/xform/docs//346/225/260/346/215/256/350/241/250/346/240/274/345/212/250/346/200/201/345/210/227 JSON /350/257/264/346/230/216.md" +657 -0
  139. package/src/components/xform/form-designer/designer.js +2006 -9
  140. package/src/components/xform/form-designer/form-widget/components/gantt/index.vue +434 -0
  141. package/src/components/xform/form-designer/form-widget/container-widget/containerMixin.js +1 -1
  142. package/src/components/xform/form-designer/form-widget/container-widget/data-table-mixin.js +9 -8
  143. package/src/components/xform/form-designer/form-widget/container-widget/data-table-widget.vue +14 -1
  144. package/src/components/xform/form-designer/form-widget/container-widget/detail-pane-widget.vue +3 -2
  145. package/src/components/xform/form-designer/form-widget/container-widget/detail-widget.vue +3 -3
  146. package/src/components/xform/form-designer/form-widget/dialog/baseFormulaDialog copy.vue +971 -0
  147. package/src/components/xform/form-designer/form-widget/dialog/baseFormulaDialog.vue +971 -0
  148. package/src/components/xform/form-designer/form-widget/dialog/exportDialog.vue +13 -0
  149. package/src/components/xform/form-designer/form-widget/dialog/fileReferenceDialog.vue +301 -0
  150. package/src/components/xform/form-designer/form-widget/dialog/formDialog.vue +85 -48
  151. package/src/components/xform/form-designer/form-widget/dialog/formDrawer.vue +6 -2
  152. package/src/components/xform/form-designer/form-widget/dialog/formulaDialog.vue +799 -0
  153. package/src/components/xform/form-designer/form-widget/dialog/importDialog.vue +30 -8
  154. package/src/components/xform/form-designer/form-widget/dialog/importDialogMixin.js +1762 -9
  155. package/src/components/xform/form-designer/form-widget/dialog/searchFormDialog.vue +222 -75
  156. package/src/components/xform/form-designer/form-widget/field-widget/a-link-widget.vue +67 -54
  157. package/src/components/xform/form-designer/form-widget/field-widget/a-text-widget.vue +1 -1
  158. package/src/components/xform/form-designer/form-widget/field-widget/area-select-widget.vue +260 -0
  159. package/src/components/xform/form-designer/form-widget/field-widget/autocomplete-widget.vue +119 -0
  160. package/src/components/xform/form-designer/form-widget/field-widget/baseAttachment-widget.vue +45 -14
  161. package/src/components/xform/form-designer/form-widget/field-widget/button-widget.vue +76 -66
  162. package/src/components/xform/form-designer/form-widget/field-widget/cascader-widget.vue +209 -90
  163. package/src/components/xform/form-designer/form-widget/field-widget/census-widget.vue +41 -35
  164. package/src/components/xform/form-designer/form-widget/field-widget/checkbox-widget.vue +18 -7
  165. package/src/components/xform/form-designer/form-widget/field-widget/color-widget.vue +4 -1
  166. package/src/components/xform/form-designer/form-widget/field-widget/copy_button-widget.vue +95 -0
  167. package/src/components/xform/form-designer/form-widget/field-widget/date-range-widget.vue +14 -3
  168. package/src/components/xform/form-designer/form-widget/field-widget/date-widget.vue +48 -5
  169. package/src/components/xform/form-designer/form-widget/field-widget/download-button-widget.vue +133 -0
  170. package/src/components/xform/form-designer/form-widget/field-widget/dropdown-item-widget.vue +86 -0
  171. package/src/components/xform/form-designer/form-widget/field-widget/dropdown-widget.vue +170 -0
  172. package/src/components/xform/form-designer/form-widget/field-widget/fieldMixin.js +1948 -16
  173. package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +921 -379
  174. package/src/components/xform/form-designer/form-widget/field-widget/gantt-widget.vue +964 -0
  175. package/src/components/xform/form-designer/form-widget/field-widget/html-text-widget.vue +6 -2
  176. package/src/components/xform/form-designer/form-widget/field-widget/import-button-widget.vue +22 -11
  177. package/src/components/xform/form-designer/form-widget/field-widget/import2-button-widget.vue +90 -0
  178. package/src/components/xform/form-designer/form-widget/field-widget/input-widget.vue +7 -2
  179. package/src/components/xform/form-designer/form-widget/field-widget/mixins/autocomplete-mixin.js +451 -0
  180. package/src/components/xform/form-designer/form-widget/field-widget/mixins/date-limit-mixin.js +157 -0
  181. package/src/components/xform/form-designer/form-widget/field-widget/mixins/echart-bar-mixin.js +3 -9
  182. package/src/components/xform/form-designer/form-widget/field-widget/mixins/echart-category-mixin.js +3 -9
  183. package/src/components/xform/form-designer/form-widget/field-widget/mixins/echart-pie-mixin.js +3 -9
  184. package/src/components/xform/form-designer/form-widget/field-widget/mixins/utc-transform-mixin.js +75 -0
  185. package/src/components/xform/form-designer/form-widget/field-widget/mixins/vabsearch-mixin.js +192 -0
  186. package/src/components/xform/form-designer/form-widget/field-widget/multiSearch-widget.vue +53 -0
  187. package/src/components/xform/form-designer/form-widget/field-widget/number-widget.vue +117 -81
  188. package/src/components/xform/form-designer/form-widget/field-widget/oplog-widget.vue +186 -0
  189. package/src/components/xform/form-designer/form-widget/field-widget/print-button-widget.vue +55 -28
  190. package/src/components/xform/form-designer/form-widget/field-widget/print-detail-button-widget.vue +119 -0
  191. package/src/components/xform/form-designer/form-widget/field-widget/project-tag-widget.vue +156 -54
  192. package/src/components/xform/form-designer/form-widget/field-widget/radio-widget.vue +26 -6
  193. package/src/components/xform/form-designer/form-widget/field-widget/save_submit_wf_button-widget.vue +112 -0
  194. package/src/components/xform/form-designer/form-widget/field-widget/script-input-widget.vue +146 -0
  195. package/src/components/xform/form-designer/form-widget/field-widget/search_button-widget.vue +2 -2
  196. package/src/components/xform/form-designer/form-widget/field-widget/select-export-button-widget.vue +86 -0
  197. package/src/components/xform/form-designer/form-widget/field-widget/select-export-item-button-widget.vue +92 -0
  198. package/src/components/xform/form-designer/form-widget/field-widget/select-widget.vue +24 -9
  199. package/src/components/xform/form-designer/form-widget/field-widget/singerSearch-widget.vue +53 -0
  200. package/src/components/xform/form-designer/form-widget/field-widget/singleUpload-widget.vue +145 -0
  201. package/src/components/xform/form-designer/form-widget/field-widget/static-content-wrapper.vue +16 -1
  202. package/src/components/xform/form-designer/form-widget/field-widget/static-text-widget.vue +8 -3
  203. package/src/components/xform/form-designer/form-widget/field-widget/status-widget.vue +93 -49
  204. package/src/components/xform/form-designer/form-widget/field-widget/switch-widget.vue +9 -1
  205. package/src/components/xform/form-designer/form-widget/field-widget/table-export-button-widget.vue +38 -38
  206. package/src/components/xform/form-designer/form-widget/field-widget/tempStorage-widget.vue +147 -0
  207. package/src/components/xform/form-designer/form-widget/field-widget/text-widget.vue +111 -34
  208. package/src/components/xform/form-designer/form-widget/field-widget/time-range-widget.vue +4 -3
  209. package/src/components/xform/form-designer/form-widget/field-widget/time-widget.vue +2 -1
  210. package/src/components/xform/form-designer/form-widget/field-widget/vabSearch-widget.vue +3 -171
  211. package/src/components/xform/form-designer/form-widget/field-widget/vabUpload-widget.vue +187 -70
  212. package/src/components/xform/form-designer/form-widget/field-widget/vabUpload2-widget.vue +753 -0
  213. package/src/components/xform/form-designer/form-widget/field-widget/vue-page-widget.vue +231 -0
  214. package/src/components/xform/form-designer/form-widget/index.vue +6 -1
  215. package/src/components/xform/form-designer/form-widget/indexMixin.js +1 -1
  216. package/src/components/xform/form-designer/index.vue +5 -1
  217. package/src/components/xform/form-designer/indexMixin.js +838 -13
  218. package/src/components/xform/form-designer/refMixinDesign.js +1 -28
  219. package/src/components/xform/form-designer/setting-panel/form-dynamicField-setting.vue +601 -0
  220. package/src/components/xform/form-designer/setting-panel/form-setting.vue +1067 -174
  221. package/src/components/xform/form-designer/setting-panel/index.vue +41 -32
  222. package/src/components/xform/form-designer/setting-panel/indexMixin.js +1 -1
  223. package/src/components/xform/form-designer/setting-panel/option-items-setting.vue +585 -302
  224. package/src/components/xform/form-designer/setting-panel/property-editor/a-link-editor.vue +4 -4
  225. package/src/components/xform/form-designer/setting-panel/property-editor/a-text-editor.vue +3 -3
  226. package/src/components/xform/form-designer/setting-panel/property-editor/autoValueEnabled-editor.vue +38 -0
  227. package/src/components/xform/form-designer/setting-panel/property-editor/buttonIcon-editor.vue +14 -15
  228. package/src/components/xform/form-designer/setting-panel/property-editor/censusClass-editor.vue +6 -0
  229. package/src/components/xform/form-designer/setting-panel/property-editor/colorClass-editor.vue +28 -0
  230. package/src/components/xform/form-designer/setting-panel/property-editor/commonAttributeEnabled-editor.vue +41 -0
  231. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/columnRenderDialog.vue +124 -0
  232. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/data-table-editor.vue +1154 -1048
  233. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/edit-tree-button-group-config-dialog.vue +281 -0
  234. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/exportItemColumns-dialog.vue +432 -0
  235. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/onCheckboxChange-editor.vue +1 -1
  236. package/src/components/xform/form-designer/setting-panel/property-editor/container-data-table/table-column-dialog.vue +1632 -592
  237. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail/detail-editor.vue +3 -3
  238. package/src/components/xform/form-designer/setting-panel/property-editor/container-detail-pane/detail-pane-editor.vue +3 -3
  239. package/src/components/xform/form-designer/setting-panel/property-editor/container-grid-col/grid-col-offset-editor.vue +1 -1
  240. package/src/components/xform/form-designer/setting-panel/property-editor/container-grid-col/grid-col-pull-editor.vue +1 -1
  241. package/src/components/xform/form-designer/setting-panel/property-editor/container-grid-col/grid-col-push-editor.vue +1 -1
  242. package/src/components/xform/form-designer/setting-panel/property-editor/container-list-h5/list-h5-editor.vue +34 -46
  243. package/src/components/xform/form-designer/setting-panel/property-editor/container-table/table-dynamicField-editor.vue +344 -0
  244. package/src/components/xform/form-designer/setting-panel/property-editor/container-tree/tree-customClass-editor.vue +31 -2
  245. package/src/components/xform/form-designer/setting-panel/property-editor/copyButton-editor.vue +36 -0
  246. package/src/components/xform/form-designer/setting-panel/property-editor/downloadButtonFlag-editor.vue +32 -0
  247. package/src/components/xform/form-designer/setting-panel/property-editor/dropdownFlag-editor.vue +133 -0
  248. package/src/components/xform/form-designer/setting-panel/property-editor/event-handler/eventMixin.js +2 -2
  249. package/src/components/xform/form-designer/setting-panel/property-editor/event-handler/onClick-editor.vue +23 -8
  250. package/src/components/xform/form-designer/setting-panel/property-editor/field-area-select/areaDataType-editor.vue +25 -0
  251. package/src/components/xform/form-designer/setting-panel/property-editor/field-area-select/areaName-editor.vue +20 -0
  252. package/src/components/xform/form-designer/setting-panel/property-editor/field-autocomplete/autocomplete-vabSearchName-editor.vue +199 -0
  253. package/src/components/xform/form-designer/setting-panel/property-editor/field-button/clickBindEvent-editor.vue +35 -20
  254. package/src/components/xform/form-designer/setting-panel/property-editor/field-button/icon-editor.vue +14 -15
  255. package/src/components/xform/form-designer/setting-panel/property-editor/field-button/search-dialog-event-editor.vue +64 -5
  256. package/src/components/xform/form-designer/setting-panel/property-editor/field-cascader/cascader-multiple-editor.vue +8 -3
  257. package/src/components/xform/form-designer/setting-panel/property-editor/field-cascader/checkStrictly-editor.vue +11 -13
  258. package/src/components/xform/form-designer/setting-panel/property-editor/field-cascader/showAllLevels-editor.vue +21 -0
  259. package/src/components/xform/form-designer/setting-panel/property-editor/field-date/date-dateLimit-editor.vue +157 -0
  260. package/src/components/xform/form-designer/setting-panel/property-editor/field-dropdown-menu/dropdown-item-editor.vue +21 -0
  261. package/src/components/xform/form-designer/setting-panel/property-editor/field-dropdown-menu/dropdown-menu-editor.vue +59 -0
  262. package/src/components/xform/form-designer/setting-panel/property-editor/field-gantt/gantt-editor.vue +36 -0
  263. package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import-button-editor.vue +75 -21
  264. package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import2-button-editor.vue +96 -0
  265. package/src/components/xform/form-designer/setting-panel/property-editor/field-print-button/print-button-editor.vue +44 -15
  266. package/src/components/xform/form-designer/setting-panel/property-editor/field-print-button/print-detail-button-editor.vue +115 -0
  267. package/src/components/xform/form-designer/setting-panel/property-editor/field-rate/rate-defaultValue-editor.vue +1 -1
  268. package/src/components/xform/form-designer/setting-panel/property-editor/field-script-input/script-input-editor.vue +55 -0
  269. package/src/components/xform/form-designer/setting-panel/property-editor/field-static-text/preWrap-editor.vue +23 -0
  270. package/src/components/xform/form-designer/setting-panel/property-editor/field-static-text/textContent-editor.vue +1 -1
  271. package/src/components/xform/form-designer/setting-panel/property-editor/field-status/field-status-editor.vue +67 -41
  272. package/src/components/xform/form-designer/setting-panel/property-editor/field-table-export-button/select-export-button-editor.vue +56 -0
  273. package/src/components/xform/form-designer/setting-panel/property-editor/field-table-export-button/select-export-item-button-editor.vue +71 -0
  274. package/src/components/xform/form-designer/setting-panel/property-editor/field-vabSearch/vabSearchName-editor.vue +13 -1
  275. package/src/components/xform/form-designer/setting-panel/property-editor/field-vabUpload/field-vabUpload-editor.vue +33 -1
  276. package/src/components/xform/form-designer/setting-panel/property-editor/field-vabUpload2/field-vabUpload2-editor.vue +66 -0
  277. package/src/components/xform/form-designer/setting-panel/property-editor/field-vue-page/vue-page-editor.vue +48 -0
  278. package/src/components/xform/form-designer/setting-panel/property-editor/formScriptEnabled-editor.vue +107 -19
  279. package/src/components/xform/form-designer/setting-panel/property-editor/formatType-editor.vue +137 -0
  280. package/src/components/xform/form-designer/setting-panel/property-editor/formula-editor.vue +721 -466
  281. package/src/components/xform/form-designer/setting-panel/property-editor/labelColor-editor.vue +20 -11
  282. package/src/components/xform/form-designer/setting-panel/property-editor/labelIconClass-editor.vue +17 -16
  283. package/src/components/xform/form-designer/setting-panel/property-editor/labelIconPosition-editor.vue +25 -25
  284. package/src/components/xform/form-designer/setting-panel/property-editor/labelTooltip-editor.vue +67 -13
  285. package/src/components/xform/form-designer/setting-panel/property-editor/limit-editor.vue +1 -1
  286. package/src/components/xform/form-designer/setting-panel/property-editor/multiple-editor.vue +19 -14
  287. package/src/components/xform/form-designer/setting-panel/property-editor/multipleLimit-editor.vue +1 -1
  288. package/src/components/xform/form-designer/setting-panel/property-editor/name-editor.vue +127 -50
  289. package/src/components/xform/form-designer/setting-panel/property-editor/oplog-editor.vue +31 -0
  290. package/src/components/xform/form-designer/setting-panel/property-editor/precision-editor.vue +1 -1
  291. package/src/components/xform/form-designer/setting-panel/property-editor/prefixIcon-editor.vue +14 -15
  292. package/src/components/xform/form-designer/setting-panel/property-editor/project-tag-editor.vue +349 -0
  293. package/src/components/xform/form-designer/setting-panel/property-editor/required-editor.vue +10 -6
  294. package/src/components/xform/form-designer/setting-panel/property-editor/requiredHint-editor.vue +3 -3
  295. package/src/components/xform/form-designer/setting-panel/property-editor/suffixIcon-editor.vue +14 -15
  296. package/src/components/xform/form-designer/setting-panel/property-editor/tempStorage-editor.vue +42 -0
  297. package/src/components/xform/form-designer/setting-panel/property-editor/textFlag-editor.vue +304 -19
  298. package/src/components/xform/form-designer/setting-panel/property-editor/utcTransformEnabled-editor.vue +19 -0
  299. package/src/components/xform/form-designer/setting-panel/property-editor/validation-editor.vue +2 -2
  300. package/src/components/xform/form-designer/setting-panel/property-editor/validationHint-editor.vue +2 -2
  301. package/src/components/xform/form-designer/setting-panel/property-editor/wfFlag-editor.vue +372 -50
  302. package/src/components/xform/form-designer/setting-panel/property-editor/widgetShowRuleFlag-editor.vue +263 -0
  303. package/src/components/xform/form-designer/setting-panel/propertyRegister.js +230 -187
  304. package/src/components/xform/form-designer/setting-panel/widgetPropertyDialogMixin.js +186 -0
  305. package/src/components/xform/form-designer/toolbar-panel/index.vue +267 -103
  306. package/src/components/xform/form-designer/toolbar-panel/indexMixin.js +1 -1
  307. package/src/components/xform/form-designer/widget-panel/index.vue +50 -1
  308. package/src/components/xform/form-designer/widget-panel/indexMixin.js +19 -18
  309. package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +2264 -974
  310. package/src/components/xform/form-render/compareDelList.vue +83 -0
  311. package/src/components/xform/form-render/compareView.vue +76 -0
  312. package/src/components/xform/form-render/container-item/containerItemMixin.js +1237 -11
  313. package/src/components/xform/form-render/container-item/data-table-item.vue +221 -203
  314. package/src/components/xform/form-render/container-item/data-table-mixin.js +4554 -1890
  315. package/src/components/xform/form-render/container-item/detail-item.vue +177 -49
  316. package/src/components/xform/form-render/container-item/detail-pane-item.vue +17 -3
  317. package/src/components/xform/form-render/container-item/dynamicFieldEngine.js +285 -0
  318. package/src/components/xform/form-render/container-item/dynamicFieldMixin.js +416 -0
  319. package/src/components/xform/form-render/container-item/grid-col-item.vue +10 -3
  320. package/src/components/xform/form-render/container-item/grid-item.vue +1 -1
  321. package/src/components/xform/form-render/container-item/list-h5-item.vue +1184 -419
  322. package/src/components/xform/form-render/container-item/sub-form-item.vue +10 -2
  323. package/src/components/xform/form-render/container-item/tab-item.vue +62 -25
  324. package/src/components/xform/form-render/container-item/table-cell-item.vue +38 -32
  325. package/src/components/xform/form-render/container-item/table-item.vue +7 -7
  326. package/src/components/xform/form-render/container-item/table2-cell-item.vue +53 -34
  327. package/src/components/xform/form-render/container-item/table2-item.vue +198 -99
  328. package/src/components/xform/form-render/container-item/tree-item.vue +32 -11
  329. package/src/components/xform/form-render/dynamicDialogRender.js +1 -1
  330. package/src/components/xform/form-render/formDynamicFieldMixin.js +131 -0
  331. package/src/components/xform/form-render/index.vue +86 -21
  332. package/src/components/xform/form-render/indexMixin.js +4907 -12
  333. package/src/components/xform/form-render/refMixin.js +3 -3
  334. package/src/components/xform/icon-picker/icons.json +284 -0
  335. package/src/components/xform/icon-picker/index.vue +145 -0
  336. package/src/components/xform/lang/en-US.js +12 -1
  337. package/src/components/xform/lang/en-US_extension.js +4 -0
  338. package/src/components/xform/lang/zh-CN.js +117 -90
  339. package/src/components/xform/mixins/defaultHandle.js +474 -2
  340. package/src/components/xform/mixins/scriptHttp.js +179 -3
  341. package/src/components/xform/utils/dynamicSchemaUtil.js +315 -0
  342. package/src/components/xform/utils/emitter.js +4 -4
  343. package/src/components/xform/utils/formHttp.js +162 -0
  344. package/src/components/xform/utils/format.js +205 -172
  345. package/src/components/xform/utils/formula-util.js +969 -0
  346. package/src/components/xform/utils/sfc-generator.js +2 -2
  347. package/src/components/xform/utils/smart-vue-i18n/index.js +2 -1
  348. package/src/components/xform/utils/tableCellValidateUtil.js +148 -0
  349. package/src/components/xform/utils/tableColumnHelper.js +155 -0
  350. package/src/components/xform/utils/util.js +1554 -1
  351. package/src/components/xform/utils/validators.js +2 -5
  352. package/src/components/xform/utils/vue2js-generator.js +2 -2
  353. package/src/components/xhsPrint/index.js +44 -1
  354. package/src/components/xhsPrint/mixins.js +269 -1
  355. package/src/directive/LimitNumber/index.js +125 -1
  356. package/src/directive/el-dialog-center/index.js +34 -1
  357. package/src/directive/el-drag-dialog/drag.js +86 -1
  358. package/src/directive/el-readonly/index.js +15 -1
  359. package/src/directive/permission/hasPermi.js +34 -1
  360. package/src/index.js +230 -190
  361. package/src/lang/index.js +56 -51
  362. package/src/lang/locale/en/login.js +27 -0
  363. package/src/lang/locale/zh/login.js +26 -0
  364. package/src/layout/components/AppMain.vue +14 -3
  365. package/src/layout/components/Sidebar/default.vue +1655 -1223
  366. package/src/layout/components/Sidebar/index.vue +6 -1
  367. package/src/layout/components/TagsView/index.vue +57 -15
  368. package/src/layout/components/createCompany/createCompanyDialog.vue +157 -0
  369. package/src/layout/components/extractedCode/createDialog.vue +92 -0
  370. package/src/layout/components/extractedCode/queryDialog.vue +103 -0
  371. package/src/layout/components/extractedCode/viewDialog.vue +207 -0
  372. package/src/layout/components/langTool.vue +33 -30
  373. package/src/layout/components/watermark/index.vue +83 -0
  374. package/src/layout/defaultLayout.vue +17 -9
  375. package/src/mixins/selectDialog/index.js +266 -1
  376. package/src/mixins/tableTree/index.js +199 -4
  377. package/src/mixins/wf/index.js +33 -1
  378. package/src/permission.js +135 -18
  379. package/src/resources/js/base/common.js +109 -109
  380. package/src/router/index.js +4 -7
  381. package/src/router/modules/customer.js +12 -18
  382. package/src/router/modules/system.js +4 -0
  383. package/src/store/config/index.js +83 -14
  384. package/src/store/getters.js +4 -1
  385. package/src/store/modules/permission.js +373 -41
  386. package/src/store/modules/settings.js +26 -1
  387. package/src/store/modules/tagsView.js +206 -5
  388. package/src/store/modules/user.js +367 -16
  389. package/src/utils/aes.js +2 -1
  390. package/src/utils/auth.js +1 -1
  391. package/src/utils/global.js +1 -1
  392. package/src/utils/index.js +2 -3
  393. package/src/utils/keepAlive.js +185 -1
  394. package/src/utils/pddLog.js +92 -0
  395. package/src/utils/pdfUtil.js +71 -0
  396. package/src/utils/repeatOpen.js +48 -0
  397. package/src/utils/request.js +1 -1
  398. package/src/utils/vab.js +1275 -27
  399. package/src/utils/validate.js +1 -1
  400. package/src/utils/wf.js +4 -4
  401. package/src/views/bd/setting/bd_attach_setting/edit.vue +5 -5
  402. package/src/views/bd/setting/bd_attach_setting/list.vue +28 -55
  403. package/src/views/bd/setting/bd_attach_setting/mixins/dialog.js +84 -1
  404. package/src/views/bd/setting/bd_attach_setting/mixins/edit.js +116 -5
  405. package/src/views/bd/setting/bd_attach_setting/mixins/list.js +239 -1
  406. package/src/views/bd/setting/bd_company_env/dialog.vue +174 -0
  407. package/src/views/bd/setting/bd_company_env/edit.vue +193 -0
  408. package/src/views/bd/setting/bd_company_env/list.vue +175 -0
  409. package/src/views/bd/setting/config_manage/list.vue +83 -0
  410. package/src/views/bd/setting/formVersion/button.vue +55 -0
  411. package/src/views/bd/setting/formVersion/compareBasicSection.vue +125 -0
  412. package/src/views/bd/setting/formVersion/compareCodeSection.vue +539 -0
  413. package/src/views/bd/setting/formVersion/compareContMixin.scss +65 -0
  414. package/src/views/bd/setting/formVersion/compareContent.vue +63 -0
  415. package/src/views/bd/setting/formVersion/compareDialog.vue +88 -0
  416. package/src/views/bd/setting/formVersion/compareMixin.js +93 -0
  417. package/src/views/bd/setting/formVersion/fieldCompare.vue +54 -0
  418. package/src/views/bd/setting/formVersion/formScriptCompareView.vue +94 -0
  419. package/src/views/bd/setting/formVersion/formTemplateCompareView.vue +74 -0
  420. package/src/views/bd/setting/formVersion/ftHistoryDialog.vue +491 -0
  421. package/src/views/bd/setting/formVersion/link.vue +58 -0
  422. package/src/views/bd/setting/formVersion/preformDialog.vue +87 -0
  423. package/src/views/bd/setting/formVersion/reverButton.vue +82 -0
  424. package/src/views/bd/setting/formVersion/tableDetailDiff.js +99 -0
  425. package/src/views/bd/setting/formVersion/tableModelCompareView.vue +514 -0
  426. package/src/views/bd/setting/formVersion/textDiff.js +102 -0
  427. package/src/views/bd/setting/form_import_log/edit.vue +130 -0
  428. package/src/views/bd/setting/form_import_log/list.vue +211 -0
  429. package/src/views/bd/setting/form_script/edit.vue +196 -74
  430. package/src/views/bd/setting/form_script/edit1.vue +410 -187
  431. package/src/views/bd/setting/form_script/form_list.vue +118 -37
  432. package/src/views/bd/setting/form_script/list.vue +95 -21
  433. package/src/views/bd/setting/form_script/list1.vue +205 -118
  434. package/src/views/bd/setting/form_script/mixins/dialog.js +130 -1
  435. package/src/views/bd/setting/form_script/mixins/edit.js +265 -7
  436. package/src/views/bd/setting/form_script/mixins/edit1.js +259 -9
  437. package/src/views/bd/setting/form_script/mixins/form_list.js +322 -14
  438. package/src/views/bd/setting/form_script/mixins/list.js +307 -4
  439. package/src/views/bd/setting/form_script/mixins/list1.js +512 -14
  440. package/src/views/bd/setting/form_script/mixins/list2.js +10 -1
  441. package/src/views/bd/setting/form_script/mixins/otherAuthDialog.js +194 -0
  442. package/src/views/bd/setting/form_script/mixins/preformDialog.js +34 -1
  443. package/src/views/bd/setting/form_script/otherAuthDialog.vue +83 -0
  444. package/src/views/bd/setting/form_template/batchWfObjConfigDialog.vue +3 -3
  445. package/src/views/bd/setting/form_template/edit.vue +355 -184
  446. package/src/views/bd/setting/form_template/formDesignerDialog.vue +171 -0
  447. package/src/views/bd/setting/form_template/list.vue +301 -214
  448. package/src/views/bd/setting/form_template/mixins/batchWfObjConfigDialog.js +279 -1
  449. package/src/views/bd/setting/form_template/mixins/dialog.js +103 -1
  450. package/src/views/bd/setting/form_template/mixins/edit.js +277 -9
  451. package/src/views/bd/setting/form_template/mixins/editWfObjConfigDialog.js +92 -1
  452. package/src/views/bd/setting/form_template/mixins/ftHistoryDialog.js +91 -1
  453. package/src/views/bd/setting/form_template/mixins/itemEdit.js +104 -1
  454. package/src/views/bd/setting/form_template/mixins/itemList.js +234 -1
  455. package/src/views/bd/setting/form_template/mixins/list.js +721 -22
  456. package/src/views/bd/setting/form_template/mixins/list2.js +411 -0
  457. package/src/views/bd/setting/form_template/mixins/otherAuthDialog.js +193 -0
  458. package/src/views/bd/setting/form_template/mixins/preformDialog.js +28 -3
  459. package/src/views/bd/setting/form_template/mixins/wf_list.js +421 -3
  460. package/src/views/bd/setting/form_template/otherAuthDialog.vue +83 -0
  461. package/src/views/bd/setting/form_template/wfObjConfigDialog.vue +2 -2
  462. package/src/views/bd/setting/form_template/wf_list.vue +161 -127
  463. package/src/views/bd/setting/logic_param/edit.vue +146 -0
  464. package/src/views/bd/setting/logic_param/edit1.vue +106 -0
  465. package/src/views/bd/setting/logic_param/edit2.vue +139 -0
  466. package/src/views/bd/setting/logic_param/list.vue +74 -0
  467. package/src/views/bd/setting/logic_param/list1.vue +12 -0
  468. package/src/views/bd/setting/logic_param/list2.vue +12 -0
  469. package/src/views/bd/setting/logic_param/mixins/edit.js +93 -0
  470. package/src/views/bd/setting/logic_param/mixins/list.js +376 -0
  471. package/src/views/bd/setting/menu_kind/list.vue +172 -83
  472. package/src/views/bd/setting/menu_kind/mixins/authDialog.js +300 -7
  473. package/src/views/bd/setting/menu_kind/mixins/dialog.js +139 -1
  474. package/src/views/bd/setting/menu_kind/mixins/list.js +201 -1
  475. package/src/views/bd/setting/push_data/edit.vue +139 -0
  476. package/src/views/bd/setting/push_data/list.vue +283 -0
  477. package/src/views/bd/setting/push_data_h/edit.vue +153 -0
  478. package/src/views/bd/setting/push_data_h/list.vue +293 -0
  479. package/src/views/bd/setting/request_async_setting/edit.vue +320 -0
  480. package/src/views/bd/setting/request_async_setting/list.vue +372 -0
  481. package/src/views/bd/setting/request_setting/edit.vue +300 -0
  482. package/src/views/bd/setting/request_setting/list.vue +301 -0
  483. package/src/views/bd/setting/table_model/edit.vue +1079 -426
  484. package/src/views/bd/setting/table_model/list.vue +218 -128
  485. package/src/views/bd/setting/table_model/mixins/dialog.js +71 -1
  486. package/src/views/bd/setting/table_model/mixins/edit.js +1309 -13
  487. package/src/views/bd/setting/table_model/mixins/list.js +463 -2
  488. package/src/views/bd/setting/table_model/mixins/otherAuthDialog.js +201 -0
  489. package/src/views/bd/setting/table_model/mixins/zdDialog.js +114 -3
  490. package/src/views/bd/setting/table_model/otherAuthDialog.vue +83 -0
  491. package/src/views/bd/setting/utils/index.js +75 -1
  492. package/src/views/user/access_log/list.vue +418 -349
  493. package/src/views/user/area/dialog.vue +223 -117
  494. package/src/views/user/area/list.vue +318 -0
  495. package/src/views/user/commMenu/index.vue +2 -2
  496. package/src/views/user/common_attribute/list.vue +4 -1
  497. package/src/views/user/company_info/dialog.vue +195 -163
  498. package/src/views/user/extend_datasource/dialog.vue +3 -0
  499. package/src/views/user/extend_datasource/edit.vue +2 -1
  500. package/src/views/user/extend_datasource/list.vue +3 -0
  501. package/src/views/user/fieldTranslation/editDialog.vue +8 -8
  502. package/src/views/user/fieldTranslation/list.vue +33 -33
  503. package/src/views/user/form/vform/designer.vue +792 -749
  504. package/src/views/user/form/vform/formFieldMapping.js +2 -3
  505. package/src/views/user/form/vform/out_render.vue +1 -1
  506. package/src/views/user/form/vform/render.vue +67 -37
  507. package/src/views/user/form/view/edit.vue +56 -37
  508. package/src/views/user/form/view/list.vue +470 -54
  509. package/src/views/user/home/default.vue +1117 -979
  510. package/src/views/user/home/default2.vue +1151 -0
  511. package/src/views/user/home/dev.vue +29 -0
  512. package/src/views/user/home/index.vue +18 -7
  513. package/src/views/user/login/default.vue +165 -44
  514. package/src/views/user/login/index.vue +4 -6
  515. package/src/views/user/login/indexMixin.js +322 -120
  516. package/src/views/user/menu/list.vue +50 -1
  517. package/src/views/user/notify_message/dialog.vue +44 -22
  518. package/src/views/user/notify_template/edit.vue +188 -187
  519. package/src/views/user/notify_template/edit2.vue +176 -0
  520. package/src/views/user/notify_template/list.vue +4 -1
  521. package/src/views/user/notify_template/list2.vue +190 -0
  522. package/src/views/user/outLink/form_view.vue +211 -211
  523. package/src/views/user/outLink/index.vue +64 -14
  524. package/src/views/user/position/list.vue +4 -4
  525. package/src/views/user/project_tag/dialog.vue +9 -4
  526. package/src/views/user/project_tag/edit.vue +2 -2
  527. package/src/views/user/project_tag/list.vue +9 -4
  528. package/src/views/user/request_setting/edit.vue +258 -0
  529. package/src/views/user/request_setting/list.vue +248 -0
  530. package/src/views/user/role/authConfig.vue +89 -0
  531. package/src/views/user/role/dialog.vue +70 -48
  532. package/src/views/user/role/edit.vue +609 -429
  533. package/src/views/user/role/list.vue +4 -4
  534. package/src/views/user/sale_org/dialog.vue +1 -1
  535. package/src/views/user/sale_org/list.vue +4 -1
  536. package/src/views/user/system_notice/infoDialog.vue +2 -1
  537. package/src/views/user/user/dialog.vue +46 -23
  538. package/src/views/user/user/edit.vue +1391 -1021
  539. package/src/views/user/user/form_dialog.vue +158 -0
  540. package/src/views/user/user/form_info.vue +210 -0
  541. package/src/views/user/user/info.vue +253 -140
  542. package/src/views/user/user/list.vue +652 -563
  543. package/src/views/user/user/modifyPasswordDialog.vue +64 -53
  544. package/src/views/user/wf/wfReport/index.vue +619 -0
  545. package/src/views/user/wf/wf_auto_submit_data/list.vue +2 -0
  546. package/src/views/user/wf/wf_manage/list.vue +379 -250
  547. package/src/views/user/wf/wf_manage/list2.vue +854 -0
  548. package/src/views/user/wf/wf_manage/wfContentDialog.vue +25 -22
  549. package/src/views/user/wf/wf_obj_config/importItemDialog.vue +109 -0
  550. package/src/views/user/wf/wf_obj_config/itemEdit.vue +25 -1
  551. package/src/views/user/wf/wf_obj_config/list.vue +114 -9
  552. package/src/views/user/wf/wf_transfer_setting/edit.vue +282 -0
  553. package/src/views/user/wf/wf_transfer_setting/list.vue +319 -0
  554. package/src/views/user/workbench_menu/list.vue +555 -0
  555. package/src/components/xform/form-render/container-item/list-h5-item2.vue +0 -1347
@@ -0,0 +1,569 @@
1
+ # xform 表单对比(变更前/变更后)功能落地方案
2
+
3
+ > **实现状态:已落地。** 涉及文件:
4
+ > - 新增 `form-render/compareView.vue`(对比提示组件;感叹号固定在字段前、flex 布局不失焦不顶起输入框,文案 `$t1` 国际化)
5
+ > - 新增 `form-render/compareDelList.vue`(查看删除数据弹窗;vxe-grid、列取当前数据表格字段/标题/宽度、固定高度铺满、系统弹框样式、`$t1` 国际化)
6
+ > - `form-render/indexMixin.js`:状态 `isCompare/oldFormData/compareRowKey/compareExcludeTypes/compareExcludeFields`;provide 下发(含 `isCompareExcludeField`);公开方法 `enableCompare/disableCompare/setOldSubData/getDelData/openCompareDelList`;取数 `loadOldData`(主表 getOne + 表头附件各自 getList + data-table 子表 getList,均带 `attachmentType/thirdtabm`);一行接入 `initChangeFromSource`(模式A)/`enableCompareBySource`(模式B);清洗 `sanitizeChangeData`(系统字段清理、树表 id/parent_id 重生成 `regenerateTreeIds`、附件白名单 `attachmentKeepFields`、`defaultFields/subDefaultFields` 不覆盖取默认、`subSourceFields` 原单字段/表头回填);行级样式 `getCompareRowClass`(变更行/新增行)、字段级排除 `isCompareExcludeField`(`create_by/create_date/modify_by/modify_date` 等系统字段默认排除)
7
+ > - `form-render/index.vue`:注册并挂载 compareDelList
8
+ > - `field-widget/fieldMixin.js`:`compareEquals`(原始值判定)、`resolveDisplayValue`(值→label)、`resolveCompareOldDisplay`(关联类从原单行取伴随 label);各映射组件 override(select/radio/checkbox/status/switch/cascader/vabSearch/autocomplete)
9
+ > - `field-widget/form-item-wrapper.vue`:inject 对比接口、`isCompareOn/compareOldRow/compareIsDiff/compareOldDisplay/compareRowIsNew`(新增行不逐格显示感叹号)、按类型+字段名排除
10
+ > - `container-item/data-table-mixin.js` + `data-table-item.vue`:`rowClassName` 注入变更行/新增行整行高亮;`getSubTableCurrentRows` 读实时表格数据
11
+ > - `mixins/defaultHandle.js`:`getReqFormData` 提交前递归剥除对比快照字段 `hData`
12
+ > - `widget-panel/widgetsConfig.js` + `widget-panel/index.vue`:业务组件标签页下新增「对比组件」分组(对比 / 关闭对比 / 查看删除明细 3 个按钮,默认展开)
13
+
14
+
15
+ > 参考实现:`2023/yx2-vue/sf-cloud-web-vue-tw@std/src/views/yx/certificate/agreementChange/edit.vue`
16
+ > 目标组件:`src/components/xform/`(form-render + field-widget)
17
+
18
+ ## 〇、接入指南(配置流程)
19
+
20
+ > 面向业务配置人员:如何给一张「变更单」接上对比。form-render 已内置能力,业务侧只需配置按钮 onClick 脚本、表单 onMounted 脚本,以及列表页一段 autoAdd。
21
+
22
+ ### 前置:后端接口
23
+ 推荐用内置的**通用多包加载 `loadOldData`**,它直接复用原单模板的标准读脚本(主表 `getOne`、data-table 子表 `getList`),**无需为对比新增后端接口** —— 只要原单本身的表单读脚本可按 id 查询即可。
24
+
25
+ 仅当需要自定义取数时,才手动取数 + `enableCompare`。**取原单数据统一走 `loadOldData`(内部用 `formHttp` 按模板脚本发包),不要用 `formRef.$http` 直接打 url。** 需要额外定制请求时用 `formRef.formHttp({ scriptCode, data, success })`。
26
+
27
+ ### 相关入口(本项目现有机制)
28
+ - 列表打开详情:`openEditDialog(row, param, option)` —— `row=null` 走新增(无 dataId);`param` 为业务参数,详情用 `getFormParam()` 读取。列表 xform 宿主:`src/views/user/form/view/list.vue`。
29
+ - 详情表单读打开参数:`this.getFormParam()`(`defaultHandle.js`,返回 `formRef.param`)。
30
+ - 按钮/表单脚本上下文:`this` 为组件,`this.getFormRef()` 拿 form-render 实例;注入参数含 `dataId`。
31
+
32
+ ### 数据流(三跳)
33
+ ```
34
+ 原单详情「变更」按钮
35
+ └─ router.push 到「变更单列表路由」,query 带 sourceId + autoAdd
36
+
37
+ 变更单列表页 (list.vue 宿主)
38
+ └─ mounted 读 $route.query,autoAdd 时调
39
+ openEditDialog(null, { sourceId }, { formCode: addFormCode })
40
+
41
+ 变更单详情表单 onMounted
42
+ └─ 无 dataId:sourceId = getFormParam().sourceId
43
+ → getOld(sourceId) → setFormData + enableCompare (模式A 自动对比)
44
+ ```
45
+
46
+ ### 第 1 跳:原单「变更」按钮 onClick
47
+ 从「对比组件」拖入**变更**按钮(`compare-change-button`),预置 onClick 直接调内置方法(`dataId` 为注入参数):
48
+ ```js
49
+ this.getFormRef().goChangeBill(dataId, '变更单formCode'); // 把 '变更单formCode' 改成实际编号
50
+ ```
51
+ > **`goChangeBill(sourceId, formCode, options)`(form-render 内置)**:跳到变更单列表并携带 sourceId 打开新增。
52
+ > - 目标列表路径:默认复用当前路由、把**最后一段替换为 `formCode`**(同基兄弟列表约定);不符合时用 `options.listPath` 指定完整路径。
53
+ > - 打开参数走 `query.param`(JSON):`{ sourceId, autoAdd:1 }`(可用 `options.param` 追加)。
54
+ > - 跳转方式:先 `store.dispatch('tagsView/delCachedView', view)` 清缓存视图,再 `router.replace(view)`,确保列表按新参数重载。
55
+
56
+ ### 第 2 跳:变更单列表页自动打开新增详情
57
+ 变更单列表页(xform 宿主 `list.vue` 或其业务包装)`mounted`/`activated` 里加(`param` 由 `query.param` 解析到 `this.param`):
58
+ ```js
59
+ let p = this.param || {};
60
+ if (p.autoAdd) {
61
+ // row=null → 新增;param 带 sourceId,详情用 getFormParam() 取
62
+ this.openEditDialog(null, { sourceId: p.sourceId }, { formCode: this.addFormCode });
63
+ }
64
+ ```
65
+ > 唯一需在列表页新增的一小段(读 param → 调现有 `openEditDialog`)。
66
+
67
+ ### 第 3 跳:变更单详情表单 onMounted(模式 A 自动对比)
68
+ **推荐:一行接入 `initChangeFromSource`** —— 内部自动按原单模板多包拉取(主表 + 所有 data-table 子表)→ 清洗 → 填充新单 → 开启对比。无需逐个子表写发包。
69
+ ```js
70
+ if (!dataId) { // dataId 注入参数,无=新建
71
+ let f = this.getFormRef();
72
+ let sourceId = f.getFormParam() && f.getFormParam().sourceId;
73
+ f.initChangeFromSource(sourceId, {
74
+ sourceFormCode: '原单formCode', // 用原单模板拉原单数据(原单≠变更单模板时)
75
+ compareRowKey: 'uuid',
76
+ sanitize: { // 传给 sanitizeChangeData
77
+ defaultFields: ['billType'], // 主表字段不吃原单值、保留变更单默认值
78
+ subDefaultFields: { 明细A: ['status'] }, // 明细列不吃原单值
79
+ subSourceFields: { 明细A: 'f_source_id' }, // 原明细 id 回填
80
+ treeSubTables: ['分类明细'],
81
+ },
82
+ });
83
+ }
84
+ ```
85
+ > `initChangeFromSource` = `loadOldData`(自动多包) + `sanitizeChangeData`(清洗) + `setFormData`(新单) + `enableCompare`(原始旧数据为基准)。
86
+ >
87
+ > **模板解析**:传 `sourceFormCode` 时,内部按 `/formTemplate/getByFormCode` 拉**原单模板**,用其 widgetList 枚举原单子表、entity、formCode 来发包(原单与变更单模板不同时用这个);不传则复用当前变更单模板(结构一致时)。也可用 `reportTemplate/formCode/formVersion/entity` 精确覆盖。
88
+
89
+ **手动版(需自定义拆解逻辑时)**:仍用 `loadOldData` 取数(内部 formHttp),只是手动清洗/填充/对比。`setFormData` 用清洗后数据,`enableCompare` 用原始旧数据;`uuid` 不被清理,新旧行仍匹配。
90
+ ```js
91
+ f.loadOldData(sourceId, { sourceFormCode: '原单formCode' }).then(oldData => {
92
+ let newData = f.sanitizeChangeData(oldData, { defaultFields:['billType'] });
93
+ f.setFormData(newData);
94
+ f.enableCompare(oldData, { compareRowKey: 'uuid' });
95
+ // 子表多包补充:f.setOldSubData('子表字段名', 子表旧行);
96
+ });
97
+ ```
98
+ `sanitizeChangeData(oldData, options)` 选项:
99
+ - `masterClearFields`:覆盖主表默认清理字段(默认含 id/createBy/createDate/modifyBy/modifyDate/_createBy/_modifyBy 及其 snake_case 形式);
100
+ - `subExtraClearFields`:仅子表额外清理的外键字段,默认 `head_table_id/headTableId/alias_id/object_foreign_id`;
101
+ - `defaultFields`(主表)/ `subDefaultFields`(明细 `{keyName:[列prop]}`):这些字段**不吃原单值**,保留变更单自身值/默认值;
102
+ - `subSourceFields`:`{ 明细keyName: 配置 }`,原明细行/原单表头字段回填到明细(字符串/`{from,to}`/`{fromHeader,to}`/数组/`(row,header)=>{}`;早于清 id/树表重生成执行);
103
+ - `attachmentKeepFields`:附件文件对象保留字段白名单(默认 `name/thumbnail/extension/large/fileSize/domain/source/medium/url`);`cleanAttachment:false` 关闭精简;
104
+ - `treeSubTables`:**树结构子表**配置,其 `id/parent_id` 需重新生成并把 parent_id 按旧→新映射重指向以保留层级。格式 `[{ name, idField='id', parentField='parent_id' }]`,也可简写字符串数组 `['子表名']`。外部父级的 parent_id 置空作根。**新生成 id 形如 `_row{随机数}`,本表内保证唯一。**
105
+
106
+ 示例(含树表):
107
+ ```js
108
+ let newData = f.sanitizeChangeData(oldData, {
109
+ defaultFields: ['billType'],
110
+ subDefaultFields: { 明细A: ['status'] },
111
+ subSourceFields: { 明细A: (row, header) => { row.f_source_id = row.id; row.f_head_no = header.f_no; } },
112
+ treeSubTables: [{ name: '分类明细', idField: 'id', parentField: 'parent_id' }],
113
+ });
114
+ ```
115
+
116
+ ### 模式 B:已保存变更单「对比」按钮 onClick
117
+ **推荐:一行接入 `enableCompareBySource`** —— 自动按模板多包拉取原单并开启对比:
118
+ ```js
119
+ let f = this.getFormRef();
120
+ let sourceId = f.getFormData().sourceId; // 变更单里存的原单引用
121
+ f.enableCompareBySource(sourceId, { compareRowKey: 'uuid' });
122
+ ```
123
+ > 手动版:`f.loadOldData(sourceId).then(old => f.enableCompare(old, { compareRowKey:'uuid' }))`。
124
+
125
+ ### 其它按钮
126
+ - 关闭对比:`this.getFormRef().disableCompare();`
127
+ - 查看删除数据:`this.getFormRef().openCompareDelList('子表字段名');`(要中文列头传第二参 `[{field,title},...]`)
128
+
129
+ ### 全局配置项(可选)
130
+ - `formConfig.compareRowKey`:子表行匹配主键,默认 `uuid`;也可 `enableCompare(old,{compareRowKey})` 覆盖。
131
+ - `formConfig.compareExcludeTypes` / `enableCompare(old,{excludeTypes})`:不参与对比的字段类型(附件/上传类已默认排除)。
132
+ - `formConfig.compareExcludeFields` / `enableCompare(old,{excludeFields})`:按**字段名**不参与对比;`create_by/create_date/modify_by/modify_date/id/head_table_id/alias_id/object_foreign_id` 等系统字段已默认排除。
133
+ - `sanitize.defaultFields`(主表)/ `sanitize.subDefaultFields`(明细表 `{keyName:[列prop]}`):这些字段**不吃原单值**,保留变更单自身值/默认值。
134
+ - `sanitize.subExtraClearFields`:子表额外清空的外键字段,默认 `head_table_id/headTableId/alias_id/object_foreign_id`。
135
+ - `sanitize.attachmentKeepFields`:附件文件对象保留字段白名单,默认 `name/thumbnail/extension/large/fileSize/domain/source/medium/url`(表头附件、data-table 单元格附件都按此精简;`sanitize.cleanAttachment:false` 可整体关闭)。
136
+ - `sanitize.subSourceFields`:`{ 明细keyName: 配置 }`,把原明细行/原单表头字段回填到明细业务字段。配置支持:
137
+ - `'目标字段'` → 原明细 `id` → 目标字段
138
+ - `{ from:'明细字段', to:'目标字段' }`(from 默认 `id`)
139
+ - `{ fromHeader:'表头字段', to:'目标字段' }` → 原单表头字段回填
140
+ - `[ {..}, {..} ]` → 多字段
141
+ - `(row, header) => {...}` → 自定义函数(row 原明细行、header 原单表头;均为原始值,早于清 id/树表重生成执行)
142
+ - `sanitize.treeSubTables`:树表配置 `[{ name, idField, parentField }]`,id/parent_id 会重新生成并保留层级。
143
+ - **保存**:提交时 `getReqFormData` 自动剥除对比快照字段 `hData`,无需业务处理。
144
+ - **行级高亮**:变更行橙色、新增行绿色(各带左侧色条),新增行不逐格显示感叹号;系统字段/`compareExcludeFields`/附件列不参与行级判定。
145
+
146
+ ### 完整接入示例(GlobalConfig)
147
+ 把对比相关逻辑收敛到 `getGlobalConfig()` 返回对象里,详情页脚本按需调用。
148
+
149
+ #### 步骤 1:从「对比组件」拖入 3 个按钮
150
+
151
+ 设计器 → **业务组件**标签页 → **对比组件**分组(默认展开),拖入按钮。分组含 4 个按钮,已预置好 `label`、默认显隐、`onClick` 脚本,拖进去基本即用。
152
+
153
+ | 按钮 | 面板 type | 放在 | 唯一名称(示例) | 默认显隐 | 预置 onClick |
154
+ |------|-----------|------|----------------|----------|--------------|
155
+ | 变更 | `compare-change-button` | **原单** | — | 显示 | `this.getFormRef().goChangeBill(dataId, '变更单formCode')` |
156
+ | 对比 | `compare-button` | 变更单 | `button67308` | 显示 | `this.getFormRef().getGlobalConfig().enableCompareBySource(this)` |
157
+ | 关闭对比 | `compare-close-button` | 变更单 | `button107799` | **隐藏** | `this.getFormRef().getGlobalConfig().disableCompare(this)` |
158
+ | 查看删除明细 | `compare-del-button` | 变更单 | `button41887` | **隐藏** | `this.getFormRef().openCompareDelList('明细表keyName')` |
159
+
160
+ 拖入后仅需:① **变更**按钮把 `'变更单formCode'` 改成实际变更单编号(放在原单表单);② 变更单上 3 个按钮设「唯一名称」,与 GlobalConfig 里 `compareBtnName/closeBtnbName/checkDelbTNName` 对应;③ 把「查看删除明细」里的 `'明细表keyName'` 改成实际明细 keyName(如 `test_source_bill_item`)。
161
+
162
+ > 「关闭对比」「查看删除明细」已预置默认隐藏;开启对比后由 `handleCompareButton` 统一放出、隐藏「对比」。
163
+
164
+ #### 步骤 2:`getGlobalConfig` 里定义对比逻辑
165
+
166
+ ```js
167
+ //对比功能配置步骤
168
+ //定义GlobalConfig
169
+ let compareRowKey = 'f_uuid'; // 明细行的对比唯一字段
170
+ let defaultFields = ['f_type', 'f_source_id'];// 字段值不覆盖的字段(保留变更单自身值)
171
+ let excludeFields = ['f_type', 'f_source_id'];// 不对比字段
172
+ let compareBtnName = 'button67308'; // 对比按钮的唯一名称
173
+ let closeBtnbName = 'button107799'; // 关闭对比按钮的唯一名称
174
+ let checkDelbTNName = ['button41887']; // 查看删除明细按钮的唯一名称(可多个)
175
+ return {
176
+ initChangeFromSource(that) {
177
+ // 新增页面初始化原单数据(模式A:自动开启对比)
178
+ if (!dataId) {
179
+ let sourceId = that.getFormParam()?.sourceId
180
+ ? Number(that.getFormParam()?.sourceId) : null;
181
+ if (sourceId) {
182
+ that.formModel.f_source_id = sourceId;
183
+ that.formModel.f_type = 1;
184
+ that.getFormRef().initChangeFromSource(sourceId, {
185
+ compareRowKey: compareRowKey,
186
+ excludeFields: excludeFields,
187
+ sanitize: { // 传给 sanitizeChangeData
188
+ defaultFields: defaultFields,
189
+ subSourceFields: {
190
+ // test_source_bill_item 原单明细ID回填到 f_source_item_id
191
+ test_source_bill_item: (row, header) => {
192
+ row.f_source_item_id = row.id;
193
+ },
194
+ },
195
+ },
196
+ });
197
+ }
198
+ this.handleCompareButton(that, true); // 处理对比按钮的显隐
199
+ }
200
+ },
201
+ enableCompareBySource(that) {
202
+ // 点击对比,启用对比(模式B:从后端重新拉原单比对)
203
+ let formRef = that.getFormRef();
204
+ let sourceId = that.formModel.f_source_id;
205
+ formRef.enableCompareBySource(sourceId, {
206
+ compareRowKey: compareRowKey,
207
+ excludeFields: excludeFields,
208
+ });
209
+ this.handleCompareButton(that, true); // 处理对比按钮的显隐
210
+ },
211
+ disableCompare(that) {
212
+ // 关闭对比
213
+ that.getFormRef().disableCompare();
214
+ this.handleCompareButton(that, false); // 处理对比按钮的显隐
215
+ },
216
+ handleCompareButton(that, isCompare) {
217
+ // 开启对比后,隐藏对比按钮,放出关闭按钮和查看删除按钮;关闭对比则相反
218
+ that.getWidgetRef(compareBtnName).setHidden(isCompare); // 隐藏对比按钮
219
+ that.getWidgetRef(closeBtnbName).setHidden(!isCompare); // 放出关闭对比按钮
220
+ checkDelbTNName.forEach((item) => {
221
+ that.getWidgetRef(item).setHidden(!isCompare); // 放出查看删除按钮(用 item)
222
+ });
223
+ },
224
+ };
225
+ ```
226
+
227
+ #### 步骤 3:详情页入口脚本 / 按钮 onClick 调用
228
+
229
+ ```js
230
+ // 新增页面初始化原单数据(表单入口脚本 / onMounted)
231
+ if (!dataId) {
232
+ let globalConfig = this.getGlobalConfig();
233
+ globalConfig.initChangeFromSource(this);
234
+ }
235
+
236
+ // 「对比」按钮 onClick
237
+ this.getGlobalConfig().enableCompareBySource(this);
238
+
239
+ // 「关闭对比」按钮 onClick
240
+ this.getGlobalConfig().disableCompare(this);
241
+
242
+ // 「查看删除明细」按钮 onClick
243
+ this.getFormRef().openCompareDelList('test_source_bill_item');
244
+ ```
245
+
246
+ > **易错点**:
247
+ > 1. `handleCompareButton` 里遍历删除按钮要用循环变量 `item`,不要误写成 `closeBtnbName`。
248
+ > 2. 模式A(新增自动对比)也要调用 `handleCompareButton(that, true)`,否则按钮状态与模式B不一致。
249
+ > 3. 「关闭对比」「查看删除明细」按钮在设计器里默认隐藏,避免非对比态先闪出。
250
+ > 4. 模式B靠 `f_source_id` 反查原单,确认保存/回显链路带上了该字段。
251
+ > 5. `subSourceFields` 回填在清空/重生成 id 之前执行;`(row, header)` 可同时读原明细行与原单表头。
252
+
253
+ ## 一、背景与目标
254
+
255
+ 外部业务页把「变更前的旧整单数据」传入 form-render,开启对比模式后:
256
+
257
+ - **主表字段**:值发生变化时,字段旁展示"变更前"提示(hover 弹出旧值)。
258
+ - **子表格单元格**:同上,逐行逐列对比。
259
+ - **被删除的子表行**:可通过"查看删除数据"弹窗查看。
260
+
261
+ 对比逻辑完全参照 agreementChange:`isCompare` 开关 + 旧数据对象 + `compareView` 提示组件 + 子表逐行 `hData` 快照(按主键匹配)+ `getDelData` 删除行比对。
262
+
263
+ ## 二、参考实现的对比机制(梳理)
264
+
265
+ 1. **双份数据**:`agreement`(当前)与 `oldAgreement`(变更前)并存。
266
+ 2. **主表字段**:`compareView` 直接吃 `oldAgreement.xxx` 与 `agreement.xxx`。
267
+ 3. **子表**:每行携带 `hData` 快照(`item.hData = cloneDeep(旧行)`),按 `uuid` 匹配新旧行;`getHValue(row, column)` 返回 `row.hData[column.property]`。
268
+ 4. **compareView 组件**:props `isCompare / oldVal / newVal`;`isCompare && oldVal != newVal` → 显示 `el-icon-warning` + popover「变更前:xxx」,否则原样渲染 slot。
269
+ 5. **删除行**:`getDelData(key)` 用 uuid 比对新旧明细数组,找出"旧有但新无"的行,配合 `compareDelList` 弹窗展示。
270
+
271
+ ## 二·五、业务场景与触发时机(重要)
272
+
273
+ 整个对比发生在「变更单」表单上,分两种模式:
274
+
275
+ ### 模式 A:新建变更单(默认开启对比)
276
+ 1. 在原单据详情页点击「变更」按钮。
277
+ 2. 跳转到变更单列表页,并自动打开对应的变更单**新增**详情页(此时无变更单 id)。
278
+ 3. 页面加载时拿到**原单据数据**作为旧数据,`enableCompare(原单据数据)` 自动执行,默认进入对比态。
279
+
280
+ > 对应参考实现:`created()` 中 `if (!this._dataId) this.isCompare = true;`,旧数据来自 `getOld`。
281
+
282
+ ### 模式 B:已保存的变更单(手动点「对比」触发)
283
+ 1. 变更单保存成功后,页面已带变更单 id,**默认不开启对比**。
284
+ 2. 用户点击「对比」按钮 → 此时才去拉取原单据数据 → `enableCompare(原单据数据)` 进入对比态。
285
+
286
+ > 对应参考实现:保存后 `isCompare=false`,点 `compare()` → `getDataH` 拉原单 → `isCompare=true`。
287
+
288
+ ### 职责划分(按钮为 xform 内部 button-widget)
289
+ 「变更 / 对比 / 保存」按钮都是**表单内部的 button-widget**,通过配置在 `field.options.onClick` 的自定义脚本触发。脚本运行时:
290
+ - `this` = 按钮组件实例,`this.getFormRef()` 返回 form-render 实例。
291
+ - 注入参数含 `dataId`(当前单据 id)、`formCode`、`event`(表格内按钮另有 `row/rowIndex`)。
292
+ - 可用 `this.getFormRef().$http(...)` 发请求、`this.getFormRef().enableCompare(...)` 开启对比。
293
+
294
+ 因此:
295
+ - **form-render 只负责**:提供 `enableCompare(oldData) / disableCompare() / getDelData() / openCompareDelList()` 与对比渲染;**不主动发请求、不做路由**。
296
+ - **onClick 脚本负责**:拉原单据数据、判断新建/已存、调 `enableCompare`。
297
+ - **无需给 button-widget 新增"对比"动作类型** —— 完全靠 onClick 脚本调用 form-render 的公开方法即可。这一点使内部按钮方案对 xform 核心的改动与外层按钮方案一致。
298
+
299
+ ### 与 form-render 的衔接点
300
+ - 模式 A(新建自动开):可写在表单的 `onMounted` 脚本或"变更/新增"入口脚本里,判断无 dataId 时 `getFormRef().enableCompare(oldData)`。
301
+ - 模式 B(点对比开):「对比」按钮 onClick 脚本里拉原单 → `getFormRef().enableCompare(oldData)`。
302
+
303
+ ## 二·六、旧数据的传递与获取(数据流)
304
+
305
+ > **已封装为通用方法,日常接入看第〇章一行式 `initChangeFromSource`/`enableCompareBySource` 即可。** 本节保留底层原理与手动版,供理解与特殊定制。
306
+
307
+ xform 的 form-render 通过 `loadFormData` 用 `dataId` + `reportTemplate.formCode` 调后端脚本(`getOne` 或自定义 `formScriptCode`)拉取自己的数据(额外参数来自 `formScriptParam` 脚本),结果经 `setFormData` 注入。`loadOldData` 即复用这套机制,按原单模板对原单 id 自动多包取数。
308
+
309
+ **核心原则:跨页面传的是「原单 id」,旧数据一律在目标页用 id 向后端拉取,不搬运数据 blob。**(整单+子表数据量大、跨路由易丢失/失真,后端才是快照权威来源。)
310
+
311
+ ### 点「变更」时——传 id,不传数据
312
+ `变更` 打开一张新的变更单(无 dataId),旧数据 = 原单据快照:
313
+ 1. `变更` 按钮 onClick:跳转变更单详情页,URL/打开参数带上**原单 id**(如 `?sourceId=xxx`)。
314
+ 2. 变更详情页无 dataId,在 `onMounted` / 入口脚本读到 `sourceId`,用 `initChangeFromSource` 一步完成(内部 `loadOldData`→formHttp 取数,一份两用):
315
+ ```js
316
+ if (!dataId) { // 新建变更单
317
+ let formRef = this.getFormRef();
318
+ let sourceId = formRef.getFormParam() && formRef.getFormParam().sourceId;
319
+ formRef.initChangeFromSource(sourceId, { sourceFormCode:'原单formCode', compareRowKey:'uuid' });
320
+ }
321
+ ```
322
+ > 对应参考:`getOld(原单id)` 既 clone 出新单,又作为 `oldAgreement`。**取数统一走 `loadOldData`(formHttp 按模板脚本发包),不要用 `formRef.$http` 直接打 url。**
323
+
324
+ ### 详情页点「对比」时——用当前单关联 id 反查
325
+ 已保存变更单(带 dataId)数据里存有指向原单的引用(如 `sourceId`/`sourceSn`,保存时落库)。`对比` 按钮 onClick:
326
+ ```js
327
+ let formRef = this.getFormRef();
328
+ let sourceId = formRef.getFormData().sourceId; // 当前变更单里存的原单引用
329
+ formRef.enableCompareBySource(sourceId, { sourceFormCode:'原单formCode', compareRowKey:'uuid' });
330
+ ```
331
+
332
+ ### 主从表旧数据的获取粒度(多包 vs 单包)
333
+ xform 现状:加载现单时主表 `getOne` 一个包,**每个 data-table 子表各自 `getList`(`taBm=fieldKeyName`)独立发包**(见 `data-table-mixin.loadDefaultViewList`),子表本就是异步/懒加载。旧数据获取与之对称,有两套落地:
334
+
335
+ **方案一:分表增量(推荐,贴合 xform 异步加载)**
336
+ `loadOldData` 内部即按此思路自动多包(主表 `getOne` + 各 data-table `getList`,均走 `formHttp`)并组装。若要手动控制各包时序,用 `enableCompare(oldMasterData)` 先设主表 + `setOldSubData(name, oldRows)` 增量补子表;子表旧数据同样通过 `formHttp`(按模板脚本)而非 `formRef.$http` 打 url 获取:
337
+ ```js
338
+ formRef.enableCompare(master, { compareRowKey: 'uuid' }); // 主表旧数据
339
+ formRef.formHttp({ vue: formRef, scriptCode: 'getList',
340
+ data: { formCode, formVersion, taBm: '子表A', data: { id } },
341
+ success: r => formRef.setOldSubData('子表A', (r.objx && r.objx.records) || r.objx || []) });
342
+ ```
343
+ 优点:与子表懒加载/分 tab 加载天然契合;某子表未加载不阻塞主表对比。
344
+
345
+ **方案二:一个大包**
346
+ 后端提供 `getOldFull(id)` 一次返回主表+所有子表数组,前端 `enableCompare(fullOldData)` 内部遍历所有子表做快照(即"设主表 + 循环 setOldSubData")。
347
+ - 优点:前端简单、时序可控;缺点:需后端聚合接口,大单据传输量大,且若新子表懒加载未就绪,`getDelData` 需等新子表加载完再算。
348
+
349
+ > **两种方式都要支持,且共用同一套底层 API,无需两套实现。** 由调用方(按钮 onClick 脚本)自行选择:
350
+ > - 走**多包**就多次调用 `setOldSubData`;
351
+ > - 走**单包**就用聚合数据调一次 `enableCompare(fullOldData)`(其内部即"设主表 + 循环 setOldSubData")。
352
+ > - 甚至可混用:主表 + 部分子表随主包一次给(`enableCompare` 内处理已带的子表数组),其余子表后续 `setOldSubData` 增量补入。
353
+ >
354
+ > 因此 form-render 的实现要点是:`enableCompare` 能吃"仅主表"或"主表+任意数量子表数组"的 oldData,`setOldSubData` 可被任意次增量调用,两者对同一子表重复设置时以最后一次为准(幂等)。
355
+
356
+ ### 取旧数据的后端约定(二选一)
357
+ - **A(推荐)**:后端提供 `getOld(变更单 dataId)`,直接返回该变更单对应的"变更前快照"(参考实现即此,`agreementChange/getOld`)。前端不必关心原单 id。
358
+ - **B**:变更单里存 `sourceId`,前端读出后调通用 `get(原单id)`。
359
+
360
+ ### 依赖前提
361
+ 两种模式都需**后端提供返回"变更前快照"的接口**。这是外部依赖,不在 xform 前端范围内。
362
+
363
+ ## 三、xform 现有架构关键点
364
+
365
+ - **form-render**(`form-render/indexMixin.js`)持有 `formDataModel`(当前整单数据),暴露 `getFormData/setFormData`,通过 `provide()` 的 `globalModel.formModel` 下发给所有字段。
366
+ - **字段**(`field-widget/fieldMixin.js`)从 `formModel[fieldKeyName]`(或表格内 `tableParam.row[fieldKeyName]`)计算 `fieldModel`。
367
+ - **form-item-wrapper.vue**:渲染字段编辑控件 slot 与只读文本(`getShowValue`),是注入对比图标的统一入口。
368
+ - **三类表格容器**:`sub-form-item`、`table2-item`、`data-table-item`(vxe),单元格都经 `field-widget + tableParam.row` 渲染,旧行快照挂 `tableParam.row.hData`。
369
+ - 现状:xform 中**无任何** `isCompare / hData / compareView` 基础设施,需从零搭建。
370
+
371
+ ## 四、主键约定
372
+
373
+ - 子表行匹配默认字段 `uuid`,可通过 `enableCompare` 的 options 或 `formConfig.compareRowKey` 覆盖(如 `id`)。
374
+ - 统一匹配 helper:`matchRowKey(rowA, rowB, key = 'uuid')`。
375
+
376
+ ## 五、新增文件
377
+
378
+ ### 1. `form-render/compareView.vue`
379
+ 基于参考实现,接口调整以支持字段差异化(见 七·五):
380
+ - props:`isCompare` / `isDiff` / `oldVal`(展示文本)/ `newVal`(展示文本)。
381
+ - `isCompare && isDiff` → 渲染 `<slot>` + hover popover「变更前:{{ oldVal }}」的 `el-icon-warning` 图标;否则仅渲染 `<slot>`。
382
+ - 差异判定由字段侧(wrapper + fieldMixin.compareEquals)算好通过 `isDiff` 传入,组件本身不再做 `oldVal!=newVal` 裸比。
383
+ - 注册进 form-render 的 components,供 form-item-wrapper 使用。
384
+
385
+ ### 2. `form-render/compareDelList.vue`
386
+ - `el-dialog` + `vxe-grid`,props:`visiable` / `option`(`{ columns, data }`)。
387
+ - 展示某子表被删除的行;列配置由 form-render 依据子表 widget 列自动生成。
388
+
389
+ ## 六、form-render 改造(`indexMixin.js`)
390
+
391
+ ### data 新增(实际实现)
392
+ ```js
393
+ isCompare: false, // 对比开关
394
+ oldFormData: {}, // 旧整单数据(主表字段 + 各子表数组)
395
+ compareRowKey: 'uuid', // 子表行匹配主键,可被 enableCompare(options)/formConfig 覆盖
396
+ compareExcludeTypes: [ // 不参与对比的字段类型(附件/上传类)
397
+ 'file-upload','picture-upload','baseAttachment','vabUpload','vabUpload2','singleUpload',
398
+ ],
399
+ showCompareDelList: false,
400
+ compareDelListOption: {},
401
+ ```
402
+
403
+ ### 公开方法(实际实现)
404
+ **对比开关**
405
+ - **`enableCompare(oldData, options)`**:`oldFormData=deepClone(oldData)` → 解析 `compareRowKey`(options / formConfig / 默认)→ `isCompare=true` → 对 `oldData` 中已带的数组子表逐个 `applyCompareSubSnapshot`。
406
+ - **`setOldSubData(subFormName, oldRows)`**:多包/增量设置某子表旧数据(幂等),写 `oldFormData[name]` 并 `applyCompareSubSnapshot(name)`。
407
+ - **`applyCompareSubSnapshot(subFormName)`**(内部):按 `compareRowKey` 把旧行匹配到当前行,写每行 `hData`;当前子表未加载时仅保留旧数据,加载后可再次调用补做。
408
+ - **`matchCompareRowKey(a, b, rowKey)`**(内部):按主键匹配两行。
409
+ - **`disableCompare()`**:复位状态、移除各行 `hData`。
410
+
411
+ **删除行 / 弹窗**
412
+ - **`getDelData(subFormName)`**:**实时计算**(旧数组中当前按主键找不到的行),不缓存。
413
+ - **`openCompareDelList(subFormName, columns)`**:组装 `compareDelListOption` 并弹窗。
414
+
415
+ **变更跳转(原单侧)**
416
+ - **`goChangeBill(sourceId, formCode, options)`**:跳变更单列表并携带 `sourceId` 打开新增。默认把当前路由最后一段替换为 `formCode`(`options.listPath` 可覆盖),`query.param`=JSON`{sourceId,autoAdd:1}`;先 `tagsView/delCachedView` 清缓存视图再 `router.replace`。
417
+
418
+ **通用取数(自动多包)**
419
+ - **`loadOldData(sourceId, options)`** → `Promise<oldData>`:先解析模板(`sourceFormCode` 拉原单模板 / 否则复用当前模板)→ 主表 `getOne` 包 + 各 data-table 子表 `getList` 包 → 组装整单返回。
420
+ - **`getCompareSubTables()` / `getCompareSubTablesFrom(widgetList)`**:枚举需独立发包的 data-table 子表。
421
+ - **`fetchTemplateByFormCode(formCode)`** → `Promise<{reportTemplate, formConfig, widgetList}>`:按 formCode 拉模板(`/formTemplate/getByFormCode`)。
422
+ - **`enableCompareBySource(sourceId, options)`**(模式B 一行):`loadOldData` → `enableCompare`。
423
+ - **`initChangeFromSource(sourceId, options)`**(模式A 一行):`loadOldData` → `sanitizeChangeData(old, options.sanitize)` → `setFormData(新单)` → `enableCompare(原始旧数据)`。
424
+
425
+ **数据清洗(变更初始化)**
426
+ - **`sanitizeChangeData(oldData, options)`** → 清洗后克隆:清主/子表系统字段(id/createBy/createDate/modifyBy/modifyDate/_createBy/_modifyBy + snake_case)、子表外键(head_table_id/alias_id/object_foreign_id)、附件白名单精简(attachmentKeepFields)、不覆盖取默认(defaultFields/subDefaultFields)、原单字段回填(subSourceFields)、树表 id/parent_id 重生成(treeSubTables)。
427
+ - **`regenerateTreeIds(rows, idField, parentField)`**(内部):树表新 id 形如 `_row{随机}`(本表唯一),parent_id 旧→新重映射,外部父级置空作根。
428
+
429
+ ### provide 新增下发(实际实现)
430
+ ```js
431
+ getIsCompare: () => e.isCompare,
432
+ getOldFormData: () => e.oldFormData,
433
+ getCompareRowKey: () => e.compareRowKey,
434
+ getCompareExcludeTypes: () => e.compareExcludeTypes,
435
+ ```
436
+
437
+ ### 模板
438
+ index.vue 末尾挂:
439
+ ```html
440
+ <compareDelList v-if="showCompareDelList" :visiable.sync="showCompareDelList" :option="compareDelListOption" />
441
+ ```
442
+
443
+ ## 七、字段展示改造(`form-item-wrapper.vue`)
444
+
445
+ ### inject 新增
446
+ `getIsCompare` / `getOldFormData` / `getCompareRowKey`(均给默认工厂:非对比场景返回 `false` / `{}`,保证旧调用不受影响)。
447
+
448
+ ### computed
449
+ - `isCompareOn = getIsCompare()`(设计态 `this.designer` 存在、或命中排除类型时强制 false)。
450
+ - `oldRawValue`(原始旧值,用于相等判定):
451
+ - 表格列字段(`this.tableParam && this.tableParam.row`):`this.tableParam.row.hData?.[property]`,`property` 复用 `getPropName` 里已有的取列名逻辑(`getFieldKeyName(field)` / vabSearch 特例)。
452
+ - 主表字段:`getOldFormData()[fieldKeyName]`。
453
+ - `newRawValue`:取 `$parent.fieldModel`。
454
+ - `oldDisplay = $parent.resolveDisplayValue(oldRawValue)`(见 七·五,解析成展示文本)。
455
+ - `newDisplay = getShowValue()`(复用现有展示逻辑)。
456
+ - `isDiff = !$parent.compareEquals(oldRawValue, newRawValue)`(类型化相等判定,见 七·五)。
457
+
458
+ ### 模板包裹
459
+ `isShowWidget()` 编辑分支的 `<slot>` 与只读分支的 `getShowValue()` 外层各包一层:
460
+ ```html
461
+ <compareView :isCompare="isCompareOn" :isDiff="isDiff" :oldVal="oldDisplay" :newVal="newDisplay">
462
+ ...原内容...
463
+ </compareView>
464
+ ```
465
+ > compareView 内部按 `isCompare && isDiff` 决定是否显示"变更前"图标+popover(把差异判定从组件内上移到字段侧,以支持差异化比较)。
466
+
467
+ ### 不参与对比的字段类型(重要)
468
+ 附件/上传类字段值为文件数组,弹出"变更前"旧值无意义(参考实现的附件 tab 也未包 compareView),需排除。判定:
469
+ ```js
470
+ compareExcludeTypes = [
471
+ 'file-upload', 'picture-upload', 'baseAttachment',
472
+ 'vabUpload', 'vabUpload2', 'singleUpload',
473
+ ];
474
+ // isCompareOn 计算时叠加:!compareExcludeTypes.includes(this.field.type)
475
+ ```
476
+ - 命中排除类型时 `isCompareOn=false`,字段原样渲染,不显示对比图标。
477
+ - 富文本(`rich-editor`)、按钮(`button` 等 static 类)等无值或非数据字段天然不进对比(`newFieldValue` 为空 / 无 fieldModel),可视情况一并纳入排除列表。
478
+ - 排除列表建议做成 form-render 可配置项(`formConfig.compareExcludeTypes`)以便按单据调整。
479
+
480
+ ## 七·五、字段差异化对比规则(核心难点)
481
+
482
+ 不同字段类型的「存储值」与「展示值」不一致,`compareView` 不能简单地 `oldVal != newVal` 裸比、也不能直接把裸值弹出来。现有 `getOptionLabel()` 只解析当前 `this.fieldModel`,无法解析任意旧值,需扩展。
483
+
484
+ ### 各类型的值模型
485
+ | 字段类型 | 存储值 | 展示值 | 相等判定 | 旧值展示 |
486
+ |----------|--------|--------|----------|----------|
487
+ | input / textarea | 字符串 | 同值 | 归一空值后字符串比 | 原值 |
488
+ | number | 数值 | 格式化 | 数值比(`Number()` 归一) | 格式化旧值 |
489
+ | select / radio | code | options.label | code 比 | 用 options 解析旧 code→label |
490
+ | checkbox / 多选 select | code 数组 | 多 label 拼接 | **数组无序比** | 解析旧数组→多 label |
491
+ | switch | 布尔 | 是/否文案 | 布尔比 | 旧布尔→文案 |
492
+ | date / time / date-range | 时间串/数组 | 按 format | 归一后比 | 按 format 展示旧值 |
493
+ | cascader / area | 数组路径 | 路径名拼接 | 数组深比 | 解析旧路径→名称 |
494
+ | 关联搜索 vabsearch/singerSearch/multiSearch | id(另存 `xxxName`) | 关联 name | id 比 | 展示旧 `xxxName` 字段 |
495
+
496
+ ### 判定与展示的分离原则(重要)
497
+ **差异判定一律用「原始存储值」,弹出的「变更前」一律用「展示文本(label)」。** 二者解耦:
498
+ - 下拉/单选/多选:`isDiff` 按 code(数组按 code 集合)比;popover 展示旧 code 解析出的 **label**。
499
+ - 关联搜索(vabsearch 等):`isDiff` 按 id 比;popover 展示旧记录的 **name(label)**。
500
+ - 即:`isDiff = !compareEquals(oldRaw, newRaw)`(code/id),`oldVal = resolveDisplayValue(oldRaw)`(label)。
501
+ - 好处:code 相同 label 偶然相同/不同都不误判;用户看到的是可读的中文旧值而非编码。
502
+
503
+ ### 设计
504
+ 1. **相等判定 `compareEquals(oldRaw, newRaw)`**(放 fieldMixin,可被具体 widget override):
505
+ - `null / undefined / '' / []` 之间视为"都为空"→相等;
506
+ - 数组:长度+元素无序比(多选/cascader/area);
507
+ - 对象:按 key 深比;
508
+ - 标量:`String(a) === String(b)`(吸收 number/string 差异,或按类型精确比)。
509
+ 2. **旧值展示 `resolveDisplayValue(rawValue)`**(放 fieldMixin,可 override):把 `getOptionLabel/getShowValue` 里依赖 `this.fieldModel` 的逻辑改造成"接收任意入参",对 select/radio/checkbox 用 `optionItems` 解析入参→label;date/number 按格式;其它返回原值。
510
+ 3. **compareView 接口调整**:由 wrapper 计算好后传入
511
+ - `:isCompare`、`:oldVal="oldDisplay"`(已解析文本,用于弹窗展示)、`:newVal="newDisplay"`、`:isDiff="!compareEquals(oldRaw,newRaw)"`(相等判定用原始值,展示用文本)。
512
+ - compareView 内部:`isCompare && isDiff` 时显示图标 + popover「变更前:{{ oldVal }}」。(相比参考版把"是否差异"的判定从组件内 `oldVal!=newVal` 上移到字段侧,以支持类型化比较。)
513
+
514
+ ### 关联字段的特殊说明
515
+ 关联搜索类字段值为 id、展示靠同表的 `xxxName` 字段。由于对比是**逐字段**进行的,`xxxName` 字段本身也会被对比与展示,故:
516
+ - id 字段:`compareEquals` 用 id 比即可;其展示可直接复用 `xxxName`(或在排除列表里让 id 字段不单独弹提示,只让 name 字段弹)。
517
+ - 建议:**对关联字段,只在其 name 展示字段上挂对比提示**,id 字段纳入"不弹提示"集合,避免同一处两个图标。
518
+
519
+ ## 八、"查看删除数据"入口(实际实现)
520
+ 未在容器工具栏内置按钮,改由**业务按钮 onClick 脚本**触发(更灵活,不侵入容器):
521
+ ```js
522
+ // 「查看删除数据」按钮 onClick
523
+ this.getFormRef().openCompareDelList('子表字段名');
524
+ // 需中文表头时传列配置:openCompareDelList('子表字段名', [{ field:'xxx', title:'名称' }, ...])
525
+ ```
526
+ - `getDelData(name)` 实时算出旧有、当前按主键找不到的行;`compareDelList.vue`(el-dialog + el-table)展示,列未传时按数据 key 自动生成。
527
+ - 按钮可加显示条件(脚本里先判断 `getFormRef().getDelData(name).length`)。
528
+
529
+ ## 九、内部按钮 onClick 脚本调用方式(API 速查)
530
+
531
+ `this` 为按钮组件,`this.getFormRef()` 取 form-render 实例,注入参数含 `dataId`。**推荐用一行式方法(见第〇章)**,下面是完整 API:
532
+
533
+ ```js
534
+ let f = this.getFormRef();
535
+
536
+ // 模式A 新建(onMounted):自动多包取原单 + 清洗 + 填充 + 对比
537
+ f.initChangeFromSource(sourceId, { sourceFormCode:'原单formCode', compareRowKey:'uuid', excludeFields:['status'],
538
+ sanitize:{ defaultFields:['billType'], subSourceFields:{ 明细A:'f_source_id' }, treeSubTables:['分类明细'] } });
539
+
540
+ // 模式B 已存(对比按钮):自动多包取原单 + 对比
541
+ f.enableCompareBySource(sourceId, { sourceFormCode:'原单formCode', compareRowKey:'uuid' });
542
+
543
+ // 关闭对比
544
+ f.disableCompare();
545
+
546
+ // 查看某子表删除数据(可传列配置作中文表头)
547
+ f.openCompareDelList('子表字段名');
548
+
549
+ // —— 底层/手动版(需自定义取数时)——
550
+ f.loadOldData(sourceId, opts).then(old => { // 仅取数
551
+ f.setFormData(f.sanitizeChangeData(old, {...})); // 手动清洗填充
552
+ f.enableCompare(old, { compareRowKey:'uuid' }); // 手动开启
553
+ });
554
+ f.setOldSubData('子表字段名', 子表旧行); // 子表旧数据增量补入
555
+ ```
556
+
557
+ ## 十、实施进度(已完成)
558
+ 1. ✅ `compareView.vue` + form-item-wrapper 注入(主表字段对比)。
559
+ 2. ✅ `enableCompare` / `setOldSubData` 子表 `hData` 快照 + 表格单元格对比。
560
+ 3. ✅ `getDelData`(实时)+ `compareDelList.vue` + `openCompareDelList`。
561
+ 4. ✅ `sanitizeChangeData`(系统字段/外键/自定义/默认值/树表 id 重生成)。
562
+ 5. ✅ 通用多包 `loadOldData`(读原单模板自动发包)+ 一行式 `initChangeFromSource` / `enableCompareBySource`。
563
+
564
+ ## 十一、说明 / 注意事项
565
+ - **对比图标注入点**:统一在 `form-item-wrapper.vue`,覆盖主表字段与三类表格容器的单元格(均经 field-widget + tableParam.row 渲染);仅对比态包裹 compareView,非对比态零改动。
566
+ - **「查看删除数据」按钮**:未在容器工具栏内置,由业务按钮 onClick 调 `openCompareDelList('子表名')` 触发(更灵活)。
567
+ - **子表快照时序**:`enableCompare`/`setOldSubData` 对当前已加载行打 `hData` 快照;若子表在开启对比后才异步加载,需在其加载完成后再调一次 `setOldSubData` 补快照(多包流程天然满足)。
568
+ - **vxe data-table 行引用**:依赖 `formDataModel[子表名]` 与表格行同引用,`hData` 才能被单元格读到——建议用真实带子表的变更单验证。
569
+ - **性能**:大子表逐行 deepClone `hData`,行数极大时需评估(可改为只存差异或懒计算)。