vue2-client 1.10.6 → 1.10.8

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 (424) hide show
  1. package/.env +19 -19
  2. package/.env.gaslink +19 -19
  3. package/.env.his +19 -19
  4. package/.env.liuli +19 -19
  5. package/.env.revenue +19 -19
  6. package/.env.scada +19 -19
  7. package/.eslintrc.js +90 -90
  8. package/CHANGELOG.md +824 -824
  9. package/Components.md +60 -60
  10. package/babel.config.js +21 -21
  11. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +45 -45
  12. package/docs/LowCode/lowcode.md +155 -155
  13. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  14. package/docs/index.md +30 -30
  15. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +174 -174
  16. package/index.js +31 -31
  17. package/jest-transform-stub.js +8 -8
  18. package/jest.config.js +21 -21
  19. package/jest.setup.js +7 -7
  20. package/jsconfig.json +19 -19
  21. package/package.json +107 -107
  22. package/public/his/editor/editor.html +51 -51
  23. package/public/his/editor/mock/bind_data.html +779 -779
  24. package/public/his/editor/mock/data_table.html +40 -40
  25. package/public/his/editor/mock/sign.html +75 -75
  26. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  27. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  28. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  29. package/public/his/editor/vender/date97/calendar.js +4 -4
  30. package/public/his/editor/vender/date97/lang/en.js +13 -13
  31. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  32. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  33. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  34. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  35. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  36. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  37. package/public/his/editor/vender/diff.js +1627 -1627
  38. package/public/his/editor/vender/editor.js +1 -1
  39. package/public/his/editor/vender/fabric.js +31187 -31187
  40. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  41. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  42. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  43. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  44. package/public/his/editor/vender/mui/mui.min.css +4 -4
  45. package/public/his/editor/vender/mui/mui.min.js +5 -5
  46. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  47. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  48. package/public/his/editor/vender/qrcode.js +7 -7
  49. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  50. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  51. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  52. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  53. package/public/his/editor/vender/validator.js +5094 -5094
  54. package/public/his/editor/vender/weui/weui.css +5659 -5659
  55. package/public/his/editor/vender/weui/weui.min.css +4 -4
  56. package/public/his/editor/vender/weui/weui.min.js +11 -11
  57. package/src/App.vue +196 -196
  58. package/src/ReportView.js +19 -19
  59. package/src/assets/img/querySlotDemo.svg +15 -15
  60. package/src/assets/svg/badtwo.svg +1 -1
  61. package/src/assets/svg/goodtwo.svg +1 -1
  62. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  63. package/src/base-client/components/AI/demo.vue +31 -31
  64. package/src/base-client/components/common/AMisRender/index.js +3 -3
  65. package/src/base-client/components/common/AMisRender/index.vue +263 -263
  66. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +470 -470
  67. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  68. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  69. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  70. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  71. package/src/base-client/components/common/CitySelect/CitySelect.vue +342 -342
  72. package/src/base-client/components/common/CitySelect/index.js +3 -3
  73. package/src/base-client/components/common/CitySelect/index.md +109 -109
  74. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  75. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  76. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  77. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  78. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  79. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  80. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  81. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  82. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  83. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  84. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  85. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  86. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  87. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  88. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  89. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  90. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  91. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  92. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  93. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  94. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  95. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  96. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  97. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  98. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  99. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  100. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  101. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  102. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  103. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  104. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  105. package/src/base-client/components/common/Recording/index.js +3 -3
  106. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  107. package/src/base-client/components/common/Tree/index.js +2 -2
  108. package/src/base-client/components/common/Upload/Upload.vue +239 -239
  109. package/src/base-client/components/common/Upload/index.js +3 -3
  110. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  111. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +1069 -1066
  112. package/src/base-client/components/common/XAddNativeForm/demo.vue +36 -35
  113. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  114. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  115. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  116. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  117. package/src/base-client/components/common/XAddReport/XAddReport.vue +207 -207
  118. package/src/base-client/components/common/XAddReport/index.js +3 -3
  119. package/src/base-client/components/common/XAddReport/index.md +56 -56
  120. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  121. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  122. package/src/base-client/components/common/XButtons/XButtons.vue +71 -71
  123. package/src/base-client/components/common/XButtons/index.js +3 -3
  124. package/src/base-client/components/common/XButtons/index.md +61 -61
  125. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  126. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  127. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  128. package/src/base-client/components/common/XConversation/XConversation.vue +263 -263
  129. package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
  130. package/src/base-client/components/common/XDataCard/XDataCard.vue +411 -411
  131. package/src/base-client/components/common/XDataCard/index.js +3 -3
  132. package/src/base-client/components/common/XDataCard/index.md +1 -1
  133. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  134. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  135. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  136. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  137. package/src/base-client/components/common/XDatePicker/index.vue +259 -259
  138. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +169 -169
  139. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +304 -304
  140. package/src/base-client/components/common/XDescriptions/demo.vue +50 -50
  141. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  142. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  143. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  144. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  145. package/src/base-client/components/common/XForm/XForm.vue +393 -393
  146. package/src/base-client/components/common/XForm/XFormItem.vue +1286 -1263
  147. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  148. package/src/base-client/components/common/XForm/XTreeSelect.vue +250 -250
  149. package/src/base-client/components/common/XForm/index.md +178 -178
  150. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  151. package/src/base-client/components/common/XFormCol/XFormCol.vue +157 -146
  152. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +295 -295
  153. package/src/base-client/components/common/XFormGroup/demo.vue +45 -45
  154. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  155. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  156. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  157. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  158. package/src/base-client/components/common/XFormTable/XFormTable.vue +854 -854
  159. package/src/base-client/components/common/XFormTable/demo.vue +60 -60
  160. package/src/base-client/components/common/XFormTable/index.md +92 -92
  161. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +167 -167
  162. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  163. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  164. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  165. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  166. package/src/base-client/components/common/XPrint/Demo.vue +41 -41
  167. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  168. package/src/base-client/components/common/XPrint/PrintBill.vue +302 -302
  169. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  170. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  171. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  172. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  173. package/src/base-client/components/common/XPrint/index.vue +97 -97
  174. package/src/base-client/components/common/XReport/XReport.vue +892 -892
  175. package/src/base-client/components/common/XReport/XReportDemo.vue +304 -304
  176. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  177. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  178. package/src/base-client/components/common/XReport/XReportTrGroup.vue +808 -808
  179. package/src/base-client/components/common/XReport/index.js +3 -3
  180. package/src/base-client/components/common/XReport/index.md +44 -44
  181. package/src/base-client/components/common/XReport/print.js +186 -186
  182. package/src/base-client/components/common/XReportDrawer/XReportDrawer.vue +201 -201
  183. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  184. package/src/base-client/components/common/XReportGrid/XReport.vue +1070 -1070
  185. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +47 -47
  186. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +628 -628
  187. package/src/base-client/components/common/XReportGrid/XReportJsonRender.vue +380 -380
  188. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +1104 -1104
  189. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  190. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  191. package/src/base-client/components/common/XReportGrid/print.js +184 -184
  192. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  193. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  194. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  195. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  196. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  197. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  198. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  199. package/src/base-client/components/common/XStepView/index.js +3 -3
  200. package/src/base-client/components/common/XStepView/index.md +31 -31
  201. package/src/base-client/components/common/XTab/XTab.vue +201 -201
  202. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  203. package/src/base-client/components/common/XTab/index.js +3 -3
  204. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  205. package/src/base-client/components/common/XTable/ExportExcel.vue +284 -284
  206. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  207. package/src/base-client/components/common/XTable/XTable.vue +1415 -1415
  208. package/src/base-client/components/common/XTable/index.md +255 -255
  209. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  210. package/src/base-client/components/common/XTree/XTree.vue +423 -423
  211. package/src/base-client/components/common/XTree/XTreePro.vue +451 -451
  212. package/src/base-client/components/common/XTree/index.js +3 -3
  213. package/src/base-client/components/common/XTree/index.md +36 -36
  214. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  215. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  216. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  217. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  218. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +359 -359
  219. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  220. package/src/base-client/components/index.js +51 -51
  221. package/src/base-client/components/layout/XPageView/RenderRow.vue +63 -63
  222. package/src/base-client/components/layout/XPageView/XErrorView.vue +11 -11
  223. package/src/base-client/components/layout/XPageView/XPageView.vue +155 -155
  224. package/src/base-client/components/layout/XPageView/index.js +3 -3
  225. package/src/base-client/components/layout/XPageView/index.md +38 -38
  226. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  227. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  228. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  229. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  230. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  231. package/src/base-client/plugins/AppData.js +121 -121
  232. package/src/base-client/plugins/Config.js +19 -19
  233. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  234. package/src/base-client/plugins/Recording.js +258 -258
  235. package/src/base-client/plugins/index.js +23 -23
  236. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  237. package/src/bootstrap.js +42 -42
  238. package/src/components/Charts/Bar.vue +62 -62
  239. package/src/components/Charts/ChartCard.vue +134 -134
  240. package/src/components/Charts/Liquid.vue +67 -67
  241. package/src/components/Charts/MiniArea.vue +39 -39
  242. package/src/components/Charts/MiniBar.vue +39 -39
  243. package/src/components/Charts/MiniProgress.vue +75 -75
  244. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  245. package/src/components/Charts/Radar.vue +68 -68
  246. package/src/components/Charts/RankList.vue +77 -77
  247. package/src/components/Charts/TagCloud.vue +113 -113
  248. package/src/components/Charts/TransferBar.vue +64 -64
  249. package/src/components/Charts/Trend.vue +82 -82
  250. package/src/components/Charts/chart.less +12 -12
  251. package/src/components/Charts/smooth.area.less +13 -13
  252. package/src/components/CodeMirror/inedx.vue +118 -118
  253. package/src/components/CodeMirror/setting.js +40 -40
  254. package/src/components/FilePreview/FilePreview.vue +166 -166
  255. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  256. package/src/components/NumberInfo/index.js +3 -3
  257. package/src/components/NumberInfo/index.less +54 -54
  258. package/src/components/NumberInfo/index.md +43 -43
  259. package/src/components/STable/index.js +390 -390
  260. package/src/components/card/ChartCard.vue +79 -79
  261. package/src/components/chart/Bar.vue +60 -60
  262. package/src/components/chart/MiniArea.vue +67 -67
  263. package/src/components/chart/MiniBar.vue +59 -59
  264. package/src/components/chart/MiniProgress.vue +57 -57
  265. package/src/components/chart/Radar.vue +80 -80
  266. package/src/components/chart/RankingList.vue +60 -60
  267. package/src/components/chart/Trend.vue +79 -79
  268. package/src/components/chart/index.less +9 -9
  269. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  270. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  271. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  272. package/src/components/checkbox/index.js +9 -9
  273. package/src/components/exception/ExceptionPage.vue +70 -70
  274. package/src/components/g2Charts/constants.js +202 -202
  275. package/src/components/g2Charts/demo.vue +808 -808
  276. package/src/components/g2Charts/designer.vue +228 -228
  277. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  278. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  279. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  280. package/src/components/g2Charts/index.vue +397 -397
  281. package/src/components/index.js +36 -36
  282. package/src/components/input/IInput.vue +66 -66
  283. package/src/components/menu/SideMenu.vue +75 -75
  284. package/src/components/menu/menu.js +273 -273
  285. package/src/components/setting/Setting.vue +234 -234
  286. package/src/components/tool/AStepItem.vue +60 -60
  287. package/src/config/CreateQueryConfig.js +325 -325
  288. package/src/config/default/antd.config.js +89 -89
  289. package/src/config/default/setting.config.js +55 -55
  290. package/src/font-style/font.css +4 -4
  291. package/src/layouts/CommonLayout.vue +56 -56
  292. package/src/layouts/GridView.vue +45 -45
  293. package/src/layouts/PageLayout.vue +151 -151
  294. package/src/layouts/SinglePageView.vue +136 -136
  295. package/src/layouts/header/AdminHeader.vue +132 -132
  296. package/src/layouts/header/HeaderNotice.vue +177 -177
  297. package/src/layouts/header/InstitutionDetail.vue +181 -181
  298. package/src/layouts/tabs/TabsHead.vue +189 -189
  299. package/src/layouts/tabs/TabsView.vue +390 -390
  300. package/src/lib.js +1 -1
  301. package/src/main.js +34 -34
  302. package/src/mock/extend/index.js +84 -84
  303. package/src/mock/goods/index.js +108 -108
  304. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  305. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  306. package/src/pages/DefaultExample/index.vue +77 -77
  307. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  308. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  309. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  310. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  311. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  312. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  313. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  314. package/src/pages/DynamicStatistics/index.vue +282 -282
  315. package/src/pages/Example/childIndex.vue +15 -15
  316. package/src/pages/Example/index.vue +30 -30
  317. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  318. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  319. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  320. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  321. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  322. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  323. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  324. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  325. package/src/pages/Recording/index.vue +77 -77
  326. package/src/pages/ReportGrid/index.vue +76 -76
  327. package/src/pages/ServiceReview/index.vue +284 -284
  328. package/src/pages/SubExample/index.vue +26 -26
  329. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +32 -32
  330. package/src/pages/WorkflowDetail/WorkflowDetail.vue +230 -230
  331. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +131 -131
  332. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  333. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +302 -302
  334. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformationDetails.vue +276 -276
  335. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +864 -864
  336. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +997 -997
  337. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +222 -222
  338. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +233 -233
  339. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +261 -261
  340. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowListResolution.vue +248 -248
  341. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +73 -73
  342. package/src/pages/XPageViewExample/index.vue +38 -38
  343. package/src/pages/XReportView/index.vue +64 -64
  344. package/src/pages/XTreeOneProExample/index.vue +67 -67
  345. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  346. package/src/pages/login/Login.vue +378 -378
  347. package/src/pages/login/LoginV3.vue +389 -389
  348. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  349. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  350. package/src/pages/report/ReportTable.js +124 -124
  351. package/src/pages/resourceManage/orgListManage.vue +98 -98
  352. package/src/pages/system/dictionary/index.vue +44 -44
  353. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  354. package/src/pages/system/monitor/operLog/index.vue +37 -37
  355. package/src/pages/system/settings/modifyPassword.vue +117 -117
  356. package/src/pages/system/ticket/index.vue +480 -480
  357. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  358. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  359. package/src/pages/userInfoDetailManage/FillCardRecordQuery/index.vue +76 -76
  360. package/src/pages/userInfoDetailManage/FillGasRecordQuery/index.vue +74 -74
  361. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  362. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  363. package/src/pages/userInfoDetailManage/MachineRecordQuery/index.vue +74 -74
  364. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  365. package/src/pages/userInfoDetailManage/OtherChargeRecordQuery/index.vue +74 -74
  366. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  367. package/src/pages/userInfoDetailManage/UserChargeRecordQuery/index.vue +92 -92
  368. package/src/pages/userInfoDetailManage/UserHandRecordQuery/index.vue +86 -86
  369. package/src/pages/userInfoDetailManage/UserRecordQuery/index.vue +73 -73
  370. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  371. package/src/pages/userInfoDetailManage/index.vue +82 -82
  372. package/src/pages/userInfoDetailManage/userInfoDetailQueryTabs.vue +132 -132
  373. package/src/plugins/EventLogPlugin.js +33 -33
  374. package/src/plugins/FindParentsData.js +17 -17
  375. package/src/plugins/HiPrintPlugin.js +124 -124
  376. package/src/router/async/config.async.js +35 -35
  377. package/src/router/async/router.map.js +188 -188
  378. package/src/router/guards.js +263 -263
  379. package/src/router/index.js +27 -27
  380. package/src/router.js +19 -19
  381. package/src/services/DataModel.js +30 -30
  382. package/src/services/LodopFuncs.js +137 -137
  383. package/src/services/api/TicketDetailsViewApi.js +46 -46
  384. package/src/services/api/cas.js +79 -79
  385. package/src/services/api/common.js +346 -346
  386. package/src/services/api/entity.js +18 -18
  387. package/src/services/api/index.js +17 -17
  388. package/src/services/api/restTools.js +145 -145
  389. package/src/services/apiService.js +15 -15
  390. package/src/services/user.js +90 -90
  391. package/src/services/v3Api.js +116 -116
  392. package/src/store/modules/account.js +115 -115
  393. package/src/store/modules/index.js +5 -5
  394. package/src/store/modules/lowCode.js +33 -33
  395. package/src/store/modules/setting.js +119 -119
  396. package/src/theme/default/style.less +58 -58
  397. package/src/theme/global.less +159 -159
  398. package/src/utils/authority-utils.js +85 -85
  399. package/src/utils/errorCode.js +6 -6
  400. package/src/utils/formatter.js +74 -74
  401. package/src/utils/htmlToPDF.js +108 -108
  402. package/src/utils/htmlToPDFApi.js +5 -5
  403. package/src/utils/indexedDB.js +263 -263
  404. package/src/utils/login.js +188 -188
  405. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  406. package/src/utils/lowcode/lowcodeLog.js +29 -29
  407. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  408. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  409. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  410. package/src/utils/map-utils.js +47 -47
  411. package/src/utils/microAppUtils.js +40 -40
  412. package/src/utils/reg.js +95 -95
  413. package/src/utils/request.js +362 -362
  414. package/src/utils/routerUtil.js +450 -450
  415. package/src/utils/runEvalFunction.js +14 -14
  416. package/src/utils/util.js +310 -310
  417. package/src/utils/waterMark.js +31 -31
  418. package/test/Amis.spec.js +163 -163
  419. package/test/Tree.spec.js +167 -167
  420. package/test/myDialog.spec.js +46 -46
  421. package/test/util.test.js +52 -52
  422. package/test/v3Api.test.js +1983 -1983
  423. package/vue.config.js +213 -213
  424. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,1066 +1,1069 @@
1
- <template>
2
- <div id="XAddNativeForm">
3
- <a-form-model
4
- v-if="loaded"
5
- ref="selectForm"
6
- :zIndex="1001"
7
- :model="form"
8
- v-bind="formItemLayoutGen"
9
- :layout="layout"
10
- :rules="rules">
11
- <a-row ref="GroupItemRow">
12
- <a-col :span="3" v-if="!inXFormGroup && !(groups[0].groupName === DEFAULT_GROUP_NAME)">
13
- <!-- <a-anchor :getContainer="() => { return $refs.GroupItemRow.$el }">-->
14
- <!-- <a-anchor-link-->
15
- <!-- v-for="(groupsItem,groupsIndex) in groups"-->
16
- <!-- :key="groupsIndex"-->
17
- <!-- :href="`#${groupsItem.groupName}`"-->
18
- <!-- :title="groupsItem.groupName"/>-->
19
- <!-- </a-anchor>-->
20
- <a-tabs tab-position="left" v-model="activeTab" @change="scrollToGroup">
21
- <a-tab-pane
22
- v-for="(groupsItem,groupsIndex) in groups"
23
- :tab="groupsItem.groupName"
24
- :key="groupsIndex">
25
- </a-tab-pane>
26
- </a-tabs>
27
- </a-col>
28
- <a-col
29
- :span="(!inXFormGroup && !(groups[0].groupName === DEFAULT_GROUP_NAME)) ? 21: 24">
30
- <a-row
31
- :gutter="16"
32
- type="flex"
33
- :key="groupsIndex"
34
- v-for="(groupsItem,groupsIndex) in groups"
35
- >
36
- <a-col
37
- :span="24"
38
- :style="{ marginTop: groupsIndex === 0 ? '' : '8px',fontSize:inXFormGroup?'15px':'14px', marginLeft:'-5px' }"
39
- v-if="groupsItem.groupName !== DEFAULT_GROUP_NAME">
40
- <span class="xFormGroupTitle" :ref="`group-title-${groupsIndex}`">{{ groupsItem.groupName }}</span>
41
- </a-col>
42
- <x-form-item
43
- v-for="(item, index) in groupsItem.realJsonData"
44
- :key="index"
45
- :attr="item"
46
- :disabled="itemDisabled(item)"
47
- :read-only="readonly(item)"
48
- :files="files"
49
- :style="layout === 'inline' ? { marginTop:'5px' } : undefined"
50
- :form="form"
51
- :images="images"
52
- :service-name="serviceName"
53
- mode="新增/修改"
54
- :layout="layout"
55
- :get-data-params="getDataParams"
56
- :env="env"
57
- @x-form-item-emit-func="emitFunc"
58
- @rowChoose="rowChoose"
59
- :setForm="setForm"
60
- />
61
- </a-row>
62
- </a-col>
63
- </a-row>
64
- <a-row :gutter="16" v-for="(groupItem, groupIndex) in groupJsonData" :key="groupIndex">
65
- <a-card v-if="groupItem.groupItems.length > 0" :title="groupItem.name" :bordered="false" size="small">
66
- <x-form-item
67
- v-for="(item, index) in groupItem.groupItems"
68
- :key="index"
69
- :attr="item"
70
- :disabled="itemDisabled(item)"
71
- :readonly="readonly(item)"
72
- :files="files"
73
- :style="layout ==='inline'?{marginTop:'5px'}:undefined"
74
- :form="form[groupItem.model]"
75
- :images="images"
76
- :service-name="serviceName"
77
- mode="新增/修改"
78
- :get-data-params="getDataParams"
79
- :env="env"
80
- :setForm="setForm"
81
- @rowChoose="rowChoose"
82
- />
83
- </a-card>
84
- <template v-else>
85
- <slot
86
- name="groupFormItems"
87
- :form="form"
88
- :model="groupItem.model"
89
- :rules="rules"
90
- :modifyModelData="modifyModelData"></slot>
91
- </template>
92
- </a-row>
93
- <a-row :gutter="16" v-for="(item, key) in simpleFormJsonData" :key="'row' + key">
94
- <a-card v-if="item.value.length > 0" :title="item.name" :bordered="false" size="small">
95
- <x-form-item
96
- v-for="(formItem, formItemIndex) in item.value"
97
- :key="key + formItemIndex"
98
- :attr="formItem"
99
- :disabled="itemDisabled(formItem)"
100
- :readonly="readonly(formItem)"
101
- :files="files"
102
- :style="layout ==='inline'?{marginTop:'5px'}:undefined"
103
- :form="form[groupItem.model]"
104
- :images="images"
105
- :service-name="serviceName"
106
- mode="新增/修改"
107
- :get-data-params="getDataParams"
108
- :env="env"
109
- :setForm="setForm"
110
- @rowChoose="rowChoose"
111
- />
112
- </a-card>
113
- </a-row>
114
- <a-row :gutter="16" v-for="(item, key) in childTableData" :key="'childTableRow' + key">
115
- <a-card :title="item.name" :bordered="false" size="small">
116
- <x-form-table
117
- :key="'childTable_' + item.model"
118
- :title="item.name"
119
- :queryParamsName="item.childTableConfigName"
120
- :localEditMode="true"
121
- :fixed-query-form="childTableFixedQueryForm(item)"
122
- :service-name="serviceName"
123
- :ref="'childXFormTable_' + item.model">
124
- </x-form-table>
125
- </a-card>
126
- </a-row>
127
- <a-row type="flex" :justify="btnPlace" :style="{paddingLeft: '16px',paddingRight: '16px'}">
128
- <slot name="footer" :loading="loading">
129
- <a-button v-if="showSubmitBtn" :loading="loading" type="primary" @click="onSubmit()">{{ btnName }}</a-button>
130
- </slot>
131
- </a-row>
132
- </a-form-model>
133
- </div>
134
- </template>
135
- <script>
136
- import XFormItem from '@vue2-client/base-client/components/common/XForm/XFormItem'
137
- import { formatDate, setDataByRealKey } from '@vue2-client/utils/util'
138
- import * as util from '@vue2-client/utils/util'
139
- import { mapState } from 'vuex'
140
- import { addOrModify, getConfigByName, getConfigByNameAsync, runLogic } from '@vue2-client/services/api/common'
141
- import { checkIdNumber, REG_EMAIL, REG_LANDLINE, REG_PHONE } from '@vue2-client/utils/reg'
142
- import moment from 'moment/moment'
143
- import { executeStrFunction, executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
144
-
145
- const DEFAULT_GROUP_NAME = '__default__'
146
- export default {
147
- name: 'XAddNativeForm',
148
- components: {
149
- XFormItem,
150
- XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue')
151
- },
152
- inject: {
153
- inXFormGroup: {
154
- default: false
155
- }
156
- },
157
- props: {},
158
- data () {
159
- return {
160
- DEFAULT_GROUP_NAME,
161
- // 预览模式
162
- viewMode: false,
163
- // 是否处理表单Key值
164
- isHandleFormKey: true,
165
- // 内容加载是否完成
166
- loaded: false,
167
- // 业务类型
168
- businessType: '',
169
- // 业务标题
170
- title: '',
171
- // 新增或修改业务是否执行中
172
- loading: false,
173
- // 表单Model
174
- form: {},
175
- // 配置名称
176
- configName: undefined,
177
- // 配置内容,用于查询配置生成器的预览
178
- configContent: undefined,
179
- // 表单项集合
180
- formItems: [],
181
- // 服务名称
182
- serviceName: undefined,
183
- // 是否显示提交按钮
184
- showSubmitBtn: true,
185
- // 修改有文件的表单时使用
186
- files: [],
187
- images: [],
188
- // 校验
189
- rules: {},
190
- // 调用logic获取数据源的追加参数
191
- getDataParams: {},
192
- // 动态简易表单集合
193
- simpleFormJsonData: {},
194
- // 待修改的数据集
195
- modifyModelData: {},
196
- // 当前环境
197
- env: 'prod',
198
- // 表单主键
199
- primaryKey: null,
200
- // 表单模式 horizontal | vertical | inline
201
- layout: 'horizontal',
202
- // 提交按钮名称
203
- btnName: '提交',
204
- // 提交按钮位置 start / center / end
205
- btnPlace: 'center',
206
- activeTab: 0
207
- }
208
- },
209
- computed: {
210
- // 过滤出用于新增/修改场景的表单项
211
- realJsonData: function () {
212
- return this.formItems.filter((item) => {
213
- return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
214
- })
215
- },
216
- // 表单项组 / 不是 数据组
217
- groups: function () {
218
- if (!this.realJsonData || this.realJsonData.length === 0) {
219
- return [{
220
- groupName: DEFAULT_GROUP_NAME,
221
- realJsonData: this.realJsonData,
222
- xAddFormLayout: 'horizontal'
223
- }]
224
- }
225
- const uniqueGroups = new Set(this.realJsonData.map(item => item.group).filter(Boolean))
226
- const allGroup = Array.from(uniqueGroups).map(group => {
227
- return {
228
- groupName: group,
229
- realJsonData: this.realJsonData.filter(item => item.group === group),
230
- xAddFormLayout: 'horizontal'
231
- }
232
- })
233
- // 判断每一组得formJson 长度相加是否等于 realJsonData 长度 避免错误数据
234
- if (allGroup.reduce((total, item) => total + item.realJsonData.length, 0) === this.realJsonData.length) {
235
- return allGroup
236
- } else {
237
- return [{
238
- groupName: DEFAULT_GROUP_NAME,
239
- realJsonData: this.realJsonData,
240
- xAddFormLayout: 'horizontal'
241
- }]
242
- }
243
- },
244
- // 过滤出用于新增/修改场景的表单项
245
- groupJsonData: function () {
246
- return this.formItems.filter((item) => {
247
- return item.type === 'group'
248
- }).map((item) => {
249
- item.groupItems = item.groupItems.filter((item) => {
250
- return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
251
- }).map((groupItem) => {
252
- // 只保留第一个下划线后面的内容
253
- // 多层校验规则需要将prop设置为 key1.key2.....
254
- groupItem.prop = `${item.model}.${groupItem.model.substring(groupItem.model.indexOf('_') + 1)}`
255
- groupItem.model = groupItem.model.substring(groupItem.model.indexOf('_') + 1)
256
- return groupItem
257
- })
258
- return item
259
- }
260
- )
261
- },
262
- // 过滤出用于子表数据新增/修改场景的表单项
263
- childTableData: function () {
264
- return this.formItems.filter((item) => {
265
- return item.type === 'childTable'
266
- })
267
- },
268
- // 过滤出用于form子表数据新增/修改场景的表单项
269
- childFormData: function () {
270
- return this.formItems.filter((item) => {
271
- return item.type === 'rowEdit'
272
- })
273
- },
274
- // 过滤出用于静默新增场景的表单项
275
- silenceAddJsonData: function () {
276
- return this.formItems.filter(function (item) {
277
- return item.addOrEdit === 'silenceAdd'
278
- })
279
- },
280
- // 过滤出版本号表单项
281
- versionJsonData: function () {
282
- return this.formItems.filter(function (item) {
283
- return item.addOrEdit === 'version'
284
- })
285
- },
286
- formItemLayoutGen () {
287
- if (this.layout === 'horizontal') {
288
- return {
289
- labelCol: { span: 4, offset: 2 },
290
- wrapperCol: { span: 14 },
291
- }
292
- } else if (this.layout === 'vertical') {
293
- return {}
294
- } else {
295
- if (!this.formItemLayout.labelCol || !this.formItemLayout.wrapperCol) {
296
- return {
297
- labelCol: { span: 8 },
298
- wrapperCol: { span: 16 },
299
- }
300
- }
301
- return {
302
- labelCol: { span: this.formItemLayout.labelCol },
303
- wrapperCol: { span: this.formItemLayout.wrapperCol },
304
- }
305
- }
306
- },
307
- ...mapState('account', { currUser: 'user' })
308
- },
309
- provide () {
310
- return {
311
- getComponentByName: this.getComponentByName,
312
- registerComponent: this.registerComponent,
313
- getSelf: () => this,
314
- }
315
- },
316
- methods: {
317
- runLogic,
318
- getConfigByNameAsync,
319
- getConfigByName,
320
- init (params) {
321
- const {
322
- configName,
323
- configContent,
324
- formItems,
325
- formJson,
326
- viewMode,
327
- isHandleFormKey,
328
- isKeyHandle = true,
329
- showSubmitBtn = true,
330
- serviceName,
331
- primaryKey,
332
- modifyModelData = {},
333
- businessType,
334
- title,
335
- fixedAddForm = {},
336
- getDataParams = {},
337
- simpleFormJsonData = {},
338
- env = 'prod',
339
- layout,
340
- xAddFormLayout = 'horizontal',
341
- formItemLayout = {},
342
- btnName = '提交',
343
- btnPlace = 'center'
344
- } = params
345
- this.loaded = false
346
- // 兼容需要省略 传递 layout: res.xAddFormLayout 可以使用 ...res 展开运算符 直接转递
347
- if (xAddFormLayout && layout === undefined) {
348
- this.layout = xAddFormLayout
349
- } else {
350
- this.layout = layout
351
- }
352
- this.formItemLayout = formItemLayout
353
- if ((isHandleFormKey === null || isHandleFormKey === undefined) && !isKeyHandle) {
354
- this.isHandleFormKey = isKeyHandle
355
- } else if (isHandleFormKey) {
356
- this.isHandleFormKey = isHandleFormKey
357
- } else {
358
- this.isHandleFormKey = isKeyHandle
359
- }
360
- this.configName = configName
361
- this.configContent = configContent
362
- this.formItems = this.getFromItem(formItems, formJson)
363
- this.viewMode = viewMode
364
- this.showSubmitBtn = showSubmitBtn
365
- this.primaryKey = primaryKey
366
- this.serviceName = serviceName
367
- this.businessType = businessType
368
- this.title = title
369
- this.getDataParams = getDataParams
370
- this.simpleFormJsonData = simpleFormJsonData
371
- this.env = env
372
- this.btnName = btnName
373
- this.btnPlace = btnPlace
374
- // 如果 fixedAddForm 有 selected_id 值,并且设置了处理表单key值,则多给 selected_id 加前缀 避免处理错误
375
- if (fixedAddForm.selected_id && this.isHandleFormKey) {
376
- fixedAddForm._selected_id = fixedAddForm.selected_id
377
- delete fixedAddForm.selected_id
378
- }
379
- // 设置普通表单项的相关参数
380
- const formData = Object.assign({}, fixedAddForm)
381
- for (let i = 0; i < this.realJsonData.length; i++) {
382
- const item = this.realJsonData[i]
383
- this.setFormProps(formData, item, null)
384
- }
385
- // 设置表单分组项目相关参数
386
- for (let i = 0; i < this.groupJsonData.length; i++) {
387
- const groupItem = this.groupJsonData[i]
388
- formData[groupItem.model] = {}
389
- for (let j = 0; j < groupItem.groupItems.length; j++) {
390
- const item = groupItem.groupItems[j]
391
- this.setFormProps(formData[groupItem.model], item, item.prop)
392
- }
393
- }
394
- // 设置动态简易表单项的相关参数
395
- for (const key in this.simpleFormJsonData) {
396
- for (const item of this.simpleFormJsonData[key].value) {
397
- item.model = key + '@' + item.model
398
- this.setFormProps(formData, item, null)
399
- }
400
- }
401
-
402
- this.form = formData
403
- // 修改场景下对表单项赋值
404
- if (modifyModelData && modifyModelData.data) {
405
- this.modifyModelData = modifyModelData
406
- if (Object.keys(modifyModelData.data).length > 0) {
407
- this.getModifyModelData(modifyModelData)
408
- }
409
- }
410
- // 处理表单得附件
411
- if (modifyModelData && modifyModelData.files) {
412
- this.files = modifyModelData.files
413
- }
414
- if (modifyModelData && modifyModelData.images) {
415
- this.images = modifyModelData.images
416
- }
417
- this.loaded = true
418
- },
419
- scrollToGroup (index) {
420
- const groupElement = this.$refs[`group-title-${index}`][0]
421
- if (groupElement) {
422
- groupElement.scrollIntoView({ behavior: 'smooth' })
423
- }
424
- },
425
- registerComponent (componentName, component) {
426
- console.log('内部注册', this.$options.name, componentName)
427
- this.$refs[componentName] = component
428
- console.log('内部注册完成', this.$refs)
429
- },
430
- // 根据名字从注册到组件中获取组件
431
- getComponentByName (componentName) {
432
- console.log('内部取组件', this.$options.name, componentName)
433
- console.log('内部组件内容', this.$refs)
434
- return this.$refs[componentName]
435
- },
436
- // 兼容需要省略 传递 [formItems: res.formJson ] 可以使用 ...res 展开运算符 直接转递
437
- getFromItem (formItems, formJson) {
438
- const _formItems = formItems || formJson
439
- if (typeof formItems === 'string') {
440
- return JSON.parse(_formItems)
441
- } else {
442
- return JSON.parse(JSON.stringify(_formItems))
443
- }
444
- },
445
- // 时间组件赋默认值
446
- // .type, item.formDefault
447
- getDateRange ({ type, formDefault: defaultValue, formValueFormat }) {
448
- // const format = type === 'datePicker' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss'
449
- let format = 'YYYY-MM-DD HH:mm:ss'
450
- if (formValueFormat) {
451
- format = formValueFormat
452
- }
453
- let start
454
- switch (defaultValue) {
455
- case 'curYear':
456
- start = moment().startOf('year').format(format)
457
- break
458
- case 'curMonth':
459
- start = moment().startOf('month').format(format)
460
- break
461
- case 'curDay':
462
- start = moment().startOf('day').format(format)
463
- break
464
- case 'curTime':
465
- start = moment().format(format)
466
- break
467
- default:
468
- return defaultValue
469
- }
470
- return start
471
- },
472
- setFormProps (formData, item, groupItem) {
473
- if (formData[item.model] === undefined || formData[item.model] === null) {
474
- formData[item.model] = undefined
475
- }
476
- if (!formData[item.model] && item.formDefault) {
477
- if (['datePicker', 'rangePicker', 'yearPicker', 'monthPicker', 'yearRangePicker', 'monthRangePicker'].includes(item.type)) {
478
- formData[item.model] = this.getDateRange(item)
479
- } else if (['treeSelect', 'select', 'checkbox'].includes(item.type) && ['curOrgId', 'curDepId', 'curUserId'].includes(item.formDefault)) {
480
- if (item.formDefault === 'curOrgId') {
481
- formData[item.model] = item.type === 'select' ? this.currUser.orgid : [this.currUser.orgid]
482
- }
483
- if (item.formDefault === 'curDepId') {
484
- formData[item.model] = item.type === 'select' ? this.currUser.depids : [this.currUser.depids]
485
- }
486
- if (item.formDefault === 'curUserId') {
487
- formData[item.model] = item.type === 'select' ? this.currUser.id : [this.currUser.id]
488
- }
489
- } else {
490
- formData[item.model] = item.formDefault
491
- }
492
- }
493
- // 处理表单校验情况
494
- if (item.rule) {
495
- if (groupItem) {
496
- this.rules[groupItem] = []
497
- } else {
498
- this.rules[item.model] = []
499
- }
500
- const required = item.rule.required ? item.rule.required === true || item.rule.required === 'true' : false
501
- let trigger
502
- let message
503
- if (required) {
504
- switch (item.type) {
505
- case 'select':
506
- case 'checkbox':
507
- case 'radio':
508
- case 'treeSelect':
509
- case 'rangePicker':
510
- case 'monthPicker':
511
- case 'yearPicker':
512
- case 'datePicker':
513
- case 'file':
514
- case 'image':
515
- case 'citySelect':
516
- case 'addressSearch':
517
- case 'personSetting':
518
- message = '请选择' + item.name
519
- trigger = 'change'
520
- break
521
- default:
522
- message = '请输入' + item.name
523
- trigger = 'blur'
524
- }
525
- if (groupItem) {
526
- this.rules[groupItem].push({
527
- required: true,
528
- message: message,
529
- trigger: trigger
530
- })
531
- } else {
532
- this.rules[item.model].push({
533
- required: true,
534
- message: message,
535
- trigger: trigger
536
- })
537
- }
538
- }
539
-
540
- switch (item.rule.type) {
541
- case 'number':
542
- case 'integer':
543
- case 'float':
544
- // eslint-disable-next-line no-case-declarations
545
- let defaultValue
546
- // eslint-disable-next-line no-case-declarations
547
- let message
548
- switch (item.rule.type) {
549
- case 'number':
550
- item.numberInput = true
551
- message = '数字'
552
- defaultValue = 0
553
- break
554
- case 'integer':
555
- item.numberInput = true
556
- message = '整数'
557
- defaultValue = 0
558
- break
559
- case 'float':
560
- item.numberInput = true
561
- message = '小数'
562
- defaultValue = 0.0
563
- break
564
- }
565
- if (groupItem) {
566
- this.rules[groupItem].push({
567
- type: item.rule.type,
568
- message: item.name + '必须为' + message,
569
- transform: (value) => {
570
- if (value && value.length !== 0) {
571
- return Number(value)
572
- } else {
573
- return defaultValue
574
- }
575
- },
576
- trigger: 'blur'
577
- })
578
- } else {
579
- this.rules[item.model].push({
580
- type: item.rule.type,
581
- message: item.name + '必须为' + message,
582
- transform: (value) => {
583
- if (value && value.length !== 0) {
584
- return Number(value)
585
- } else {
586
- return defaultValue
587
- }
588
- },
589
- trigger: 'blur'
590
- })
591
- }
592
- break
593
- case 'email': {
594
- const validator = (rule, value, callback) => {
595
- if (value && !REG_EMAIL.test(value)) {
596
- callback(new Error('请输入正确的邮箱地址'))
597
- } else {
598
- callback()
599
- }
600
- }
601
- this.rules[groupItem || item.model].push({
602
- type: 'email',
603
- validator: validator,
604
- message: '请输入正确的邮箱地址',
605
- trigger: 'blur'
606
- })
607
- break
608
- }
609
- case 'userPhone': {
610
- this.rules[groupItem || item.model].push({
611
- type: 'userPhone',
612
- validator: (rule, value, callback) => {
613
- if (value && !REG_PHONE.test(value)) {
614
- callback(new Error('请输入正确的手机号码'))
615
- } else {
616
- callback()
617
- }
618
- },
619
- message: '请输入正确的手机号码',
620
- trigger: 'blur'
621
- })
622
- break
623
- }
624
- case 'idNumber': {
625
- this.rules[groupItem || item.model].push({
626
- validator: (rule, value, callback) => {
627
- if (value && !checkIdNumber(value)) {
628
- callback(new Error('请输入正确的身份证号码'))
629
- } else {
630
- callback()
631
- }
632
- },
633
- trigger: 'blur'
634
- })
635
- break
636
- }
637
- case 'landlineNumber': {
638
- this.rules[item.model].push({
639
- validator: (rule, value, callback) => {
640
- if (value && !REG_LANDLINE.test(value)) {
641
- callback(new Error('请输入正确的座机号码'))
642
- } else {
643
- callback()
644
- }
645
- },
646
- trigger: 'blur'
647
- })
648
- break
649
- }
650
- // 大于0
651
- case 'greaterThanZero': {
652
- item.numberInput = true
653
- this.rules[item.model].push({
654
- validator: (rule, value, callback) => {
655
- if (isNaN(value) || value <= 0) {
656
- callback(new Error('请输入一个大于0的数字'))
657
- } else {
658
- callback()
659
- }
660
- },
661
- trigger: 'blur'
662
- })
663
- break
664
- }
665
- // 大于等于0
666
- case 'greaterThanOrEqualZero': {
667
- item.numberInput = true
668
- this.rules[item.model].push({
669
- validator: (rule, value, callback) => {
670
- if (isNaN(value) || value < 0) {
671
- callback(new Error('请输入一个大于等于0的数字'))
672
- } else {
673
- callback()
674
- }
675
- },
676
- trigger: 'blur'
677
- })
678
- break
679
- }
680
- case 'stringLength': {
681
- this.rules[item.model].push({
682
- validator: (rule, value, callback) => {
683
- if (value && value.length < item.rule.minLen) {
684
- callback(new Error('长度不能少于' + item.rule.minLen + '个字符'))
685
- } else if (value && value.length > item.rule.maxLen) {
686
- callback(new Error('长度不能超过' + item.rule.maxLen + '个字符'))
687
- } else {
688
- callback()
689
- }
690
- },
691
- trigger: 'blur'
692
- })
693
- break
694
- }
695
- case 'customJs': {
696
- this.rules[item.model].push({
697
- validator: (rule, value, callback) => {
698
- this.customJsValidate(rule, value, callback, item)
699
- },
700
- trigger: 'blur'
701
- })
702
- break
703
- }
704
- }
705
- }
706
- },
707
- customJsValidate (rule, value, callback, item) {
708
- if (item.rule.customValidatorFunc) {
709
- executeStrFunctionByContext(this, item.rule.customValidatorFunc, [rule, value, callback, this.form, item, this.util, runLogic, getConfigByNameAsync])
710
- } else {
711
- callback()
712
- }
713
- },
714
- itemDisabled (value) {
715
- return (this.businessType === '新增' && value.addOrEdit === 'edit') ||
716
- (this.businessType === '修改' && value.addOrEdit === 'add')
717
- },
718
- readonly (value) {
719
- return value.addOrEdit === 'readonly'
720
- },
721
- async onSubmit () {
722
- const valid = await this.validateForm()
723
- if (!valid) return false
724
- if (this.viewMode) {
725
- this.$message.info('预览模式禁止新增和修改')
726
- return false
727
- }
728
- this.loading = true
729
- const requestForm = this.prepareForm()
730
- await this.appendSilenceAddFields(requestForm)
731
- const realForm = this.handleFormKeys(requestForm)
732
- // 增加子表数据
733
- if (this.childTableData.length > 0) {
734
- for (const item of this.childTableData) {
735
- const childModel = item.model
736
- const childDataRef = this.$refs['childXFormTable_' + item.model][0].getTableData()
737
- const childData = []
738
- for (const item of childDataRef) {
739
- childData.push(JSON.parse(JSON.stringify(item)))
740
- }
741
- for (let i = 0; i < childData.length; i++) {
742
- childData[i] = this.handleFormKeys(childData[i])
743
- // 外键不需要带表别名,所以此处放到表单处理后赋值
744
- if (realForm.id) {
745
- childData[i][item.childTableForeignKeyName] = realForm.id
746
- }
747
- }
748
- realForm[childModel] = childData
749
- }
750
- }
751
- // 增加form子表数据
752
- if (this.childFormData.length > 0) {
753
- for (const item of this.childFormData) {
754
- const childModel = item.model
755
- const childData = this.$refs[item.model].getTableData()
756
- for (let i = 0; i < childData.length; i++) {
757
- childData[i] = this.handleFormKeys(childData[i], true)
758
- // 外键不需要带表别名,所以此处放到表单处理后赋值
759
- if (realForm.id) {
760
- childData[i][item.foreignKey] = realForm.id
761
- }
762
- }
763
- realForm[childModel] = childData
764
- }
765
- }
766
- if (this.$listeners.onSubmit) {
767
- // 交由父级处理
768
- this.$emit('onSubmit', {
769
- businessType: this.businessType,
770
- serviceName: this.serviceName,
771
- realForm: realForm,
772
- currUserName: this.currUser.name,
773
- currUserId: this.currUser.id,
774
- orgId: this.currUser.orgid
775
- })
776
- } else {
777
- this.defaultSubmit(realForm)
778
- }
779
- },
780
-
781
- async asyncSubmit () {
782
- return new Promise((resolve, reject) => {
783
- this.$refs.selectForm.validate(async valid => {
784
- if (!valid) {
785
- reject(new Error('Form validation failed'))
786
- return
787
- }
788
- this.loading = true
789
- const requestForm = this.prepareForm()
790
- await this.appendSilenceAddFields(requestForm)
791
- const realForm = this.handleFormKeys(requestForm)
792
- resolve({
793
- realForm,
794
- businessType: this.businessType,
795
- serviceName: this.serviceName,
796
- currUserName: this.currUser.name,
797
- currUserId: this.currUser.id,
798
- orgId: this.currUser.orgid
799
- })
800
- })
801
- })
802
- },
803
-
804
- validateForm () {
805
- return new Promise((resolve) => {
806
- this.$refs.selectForm.validate(valid => resolve(valid))
807
- })
808
- },
809
-
810
- childTableFixedQueryForm (item) {
811
- if (this.modifyModelData?.primaryKeyData) {
812
- const fixedForm = {}
813
- fixedForm[item.childTableForeignKeyName] = Object.values(this.modifyModelData.primaryKeyData)[0]
814
- return fixedForm
815
- }
816
- return null
817
- },
818
-
819
- prepareForm () {
820
- const form = { ...this.form }
821
- for (const key of Object.keys(form)) {
822
- const value = form[key]
823
- if (value === null || (typeof value === 'object' && Object.keys(value).length === 0)) {
824
- form[key] = undefined
825
- }
826
- }
827
- return form
828
- },
829
-
830
- async appendSilenceAddFields (form) {
831
- if (this.businessType === '新增') {
832
- for (const item of this.silenceAddJsonData) {
833
- switch (item.silencePurpose) {
834
- case 'createTime':
835
- form[item.model] = formatDate('now')
836
- break
837
- case 'operator':
838
- form[item.model] = this.currUser.name
839
- break
840
- case 'operatorId':
841
- form[item.model] = this.currUser.id
842
- break
843
- case 'orgId':
844
- form[item.model] = this.currUser.orgid
845
- break
846
- case 'orgName':
847
- form[item.model] = this.currUser.orgs
848
- break
849
- case 'depId':
850
- form[item.model] = this.currUser.depids
851
- break
852
- case 'depName':
853
- form[item.model] = this.currUser.deps
854
- break
855
- }
856
- }
857
- for (const item of this.silenceAddJsonData.filter((item) => item.silencePurpose === 'customize')) {
858
- const result = await runLogic(item.silenceSource, form, this.serviceName)
859
- if (result) {
860
- const keys = Object.keys(result)
861
- if (keys.length === 1 && keys[0] === 'value') {
862
- form[item.model] = result.value
863
- } else {
864
- form[item.model] = result
865
- }
866
- } else {
867
- form[item.model] = result
868
- }
869
- }
870
- }
871
- },
872
-
873
- handleFormKeys (form, mustHandleKey = false) {
874
- const realForm = {}
875
- for (const key of Object.keys(form)) {
876
- const value = form[key]
877
- const extraFormKeyTagIndex = key.indexOf('@')
878
- if (extraFormKeyTagIndex !== -1) {
879
- const extraFormKey = key.substring(0, extraFormKeyTagIndex)
880
- const realKey = key.substring(extraFormKeyTagIndex + 1)
881
- if (!realForm[extraFormKey]) {
882
- realForm[extraFormKey] = {}
883
- }
884
- realForm[extraFormKey][realKey] = value
885
- } else {
886
- const realKey = this.isHandleFormKey || mustHandleKey ? this.getRealKey(key, mustHandleKey) : key
887
- // 如果发生重名,不覆盖,把key的别名带上
888
- if (realForm[realKey]) {
889
- realForm[key] = value
890
- } else {
891
- realForm[realKey] = value
892
- }
893
- }
894
- }
895
- return realForm
896
- },
897
- // 默认提交事件
898
- defaultSubmit (realForm, callback) {
899
- // 新增移除id
900
- if (this.businessType === '新增') {
901
- delete realForm.id
902
- }
903
- // 组织请求
904
- const requestParameters = {
905
- queryParamsName: this.configName,
906
- queryParams: this.configContent,
907
- form: realForm,
908
- businessType: this.businessType,
909
- operator: this.currUser.name
910
- }
911
- addOrModify(requestParameters, this.serviceName, this.env === 'dev').then(data => {
912
- this.$message.success(this.businessType + '成功!')
913
- // commit
914
- this.$emit('afterSubmit', { type: this.businessType, id: data.id, data: data, form: requestParameters.form })
915
- this.loading = false
916
- if (callback) {
917
- callback()
918
- }
919
- }).catch(e => {
920
- this.loading = false
921
- this.$message.error(this.businessType + '失败:' + e)
922
- })
923
- },
924
- // 获取表单字段实际值
925
- getRealKey (key, mustHandleKey = false) {
926
- if (key === 'selected_id') return key
927
- if (this.isHandleFormKey || mustHandleKey) {
928
- return key.substring(key.indexOf('_') + 1)
929
- } else {
930
- return key
931
- }
932
- },
933
- /**
934
- * 获取被修改记录数据
935
- * @param modifyModelData 被修改记录的数据
936
- */
937
- getModifyModelData (modifyModelData) {
938
- if (modifyModelData.primaryKeyData) {
939
- this.form = Object.assign(this.form, modifyModelData.primaryKeyData)
940
- }
941
- // 对动态简易表单项特殊处理
942
- for (const key in modifyModelData.data) {
943
- const realKey = this.isHandleFormKey ? this.getRealKey(key) : key
944
- if (this.simpleFormJsonData[realKey]) {
945
- const extraForm = JSON.parse(modifyModelData.data[key])
946
- for (const key in extraForm) {
947
- const model = realKey + '@' + key
948
- this.form[model] = extraForm[key]
949
- }
950
- }
951
- }
952
- // 对普通表单项处理
953
- for (let i = 0; i < this.realJsonData.length; i++) {
954
- if (['FilesId', 'Images'].includes(this.realJsonData[i])) {
955
- // 附件需要跳过 因为会通过 modifyModelData中的files,images属性给upload赋值
956
- // 新增修改表单每次提交时只会提交最新添加的文件
957
- continue
958
- }
959
- const item = this.realJsonData[i]
960
- if (modifyModelData.data[item.model] || modifyModelData.data[item.model] === 0) {
961
- if (modifyModelData.data[item.model] instanceof Array) {
962
- this.form[item.model] = modifyModelData.data[item.model]
963
- } else {
964
- this.form[item.model] = modifyModelData.data[item.model] + ''
965
- }
966
- }
967
- }
968
- // 对分组表单进行处理
969
- for (let i = 0; i < this.groupJsonData.length; i++) {
970
- const item = this.groupJsonData[i]
971
- try {
972
- if (modifyModelData.data[item.model]) {
973
- this.form[item.model] = JSON.parse(modifyModelData.data[item.model])
974
- }
975
- } catch (e) {
976
- if (modifyModelData.data[item.model]) {
977
- this.form[item.model] = modifyModelData.data[item.model]
978
- }
979
- }
980
- }
981
- // 追加版本号信息
982
- for (const item of this.versionJsonData) {
983
- if (!modifyModelData.data[item.model]) {
984
- this.form[item.model] = 0
985
- } else {
986
- this.form[item.model] = modifyModelData.data[item.model] + ''
987
- }
988
- }
989
- },
990
- setForm (obj) {
991
- this.form = Object.assign(this.form, obj)
992
- // 给子表赋外键条件
993
- if (this.childFormData.length > 0) {
994
- for (const item of this.childFormData) {
995
- const child = this.$refs[item.model]
996
- // 获取子表别名,以便在条件上添加别名
997
- const alias = child.realQueryConfig.tableAliasName
998
- // 有主键,且主键有值,添加主键条件
999
- if (this.primaryKey && this.form[this.primaryKey]) {
1000
- const foreignKey = item.foreignKey
1001
- const fixedQueryForm = { [alias + '_' + foreignKey]: this.form[this.primaryKey] }
1002
- if (!child.fixedQueryForm) {
1003
- child.fixedQueryForm = fixedQueryForm
1004
- } else {
1005
- Object.assign(child.fixedQueryForm, fixedQueryForm)
1006
- }
1007
- child.refreshTable()
1008
- }
1009
- }
1010
- }
1011
- },
1012
- setFormWithKey (obj) {
1013
- setDataByRealKey(this.form, obj)
1014
- },
1015
- setFormWithNoKey (obj) {
1016
- setDataByRealKey(this.form, obj)
1017
- },
1018
- emitFunc (func, data, value) {
1019
- this.$emit(func, data, value)
1020
- this.$emit('x-form-item-emit-func', func, data, value)
1021
- },
1022
- // 直接转发事件的函数
1023
- emitEvent (event, ...args) {
1024
- this.$emit(event, ...args)
1025
- },
1026
- close () {
1027
- this.loaded = false
1028
- },
1029
- /**
1030
- * 行选择事件
1031
- * @param row 选中行集合
1032
- * @param attr 表单项属性
1033
- */
1034
- async rowChoose (row, attr, callback) {
1035
- // 如果配置了自定义函数
1036
- if (attr.dataChangeFunc) {
1037
- await executeStrFunction(attr.dataChangeFunc, [this.form, this.setForm, {
1038
- ...attr,
1039
- selectRows: row
1040
- }, util, this.mode, runLogic, getConfigByNameAsync])
1041
- } else {
1042
- // 默认填充选中行数据到当前表单
1043
- setDataByRealKey(this.form, row[0])
1044
- }
1045
- if (callback) {
1046
- callback()
1047
- }
1048
- }
1049
- }
1050
- }
1051
- </script>
1052
-
1053
- <style scoped lang="less">
1054
- :deep(.ant-form-inline .ant-form-item ) {
1055
- display: block !important;
1056
- }
1057
-
1058
- :deep(.ant-form-item-with-help) {
1059
- margin-bottom: 0;
1060
- }
1061
-
1062
- .xFormGroupTitle {
1063
- font-weight: bold;
1064
- color: @primary-color;
1065
- }
1066
- </style>
1
+ <template>
2
+ <div id="XAddNativeForm">
3
+ <a-form-model
4
+ v-if="loaded"
5
+ ref="selectForm"
6
+ :zIndex="1001"
7
+ :model="form"
8
+ v-bind="formItemLayoutGen"
9
+ :layout="layout"
10
+ :rules="rules">
11
+ <a-row ref="GroupItemRow">
12
+ <a-col :span="3" v-if="!inXFormGroup && !(groups[0].groupName === DEFAULT_GROUP_NAME)">
13
+ <!-- <a-anchor :getContainer="() => { return $refs.GroupItemRow.$el }">-->
14
+ <!-- <a-anchor-link-->
15
+ <!-- v-for="(groupsItem,groupsIndex) in groups"-->
16
+ <!-- :key="groupsIndex"-->
17
+ <!-- :href="`#${groupsItem.groupName}`"-->
18
+ <!-- :title="groupsItem.groupName"/>-->
19
+ <!-- </a-anchor>-->
20
+ <a-tabs tab-position="left" v-model="activeTab" @change="scrollToGroup">
21
+ <a-tab-pane
22
+ v-for="(groupsItem,groupsIndex) in groups"
23
+ :tab="groupsItem.groupName"
24
+ :key="groupsIndex">
25
+ </a-tab-pane>
26
+ </a-tabs>
27
+ </a-col>
28
+ <a-col
29
+ :span="(!inXFormGroup && !(groups[0].groupName === DEFAULT_GROUP_NAME)) ? 21: 24">
30
+ <a-row
31
+ :gutter="16"
32
+ type="flex"
33
+ :key="groupsIndex"
34
+ v-for="(groupsItem,groupsIndex) in groups"
35
+ >
36
+ <a-col
37
+ :span="24"
38
+ :style="{ marginTop: groupsIndex === 0 ? '' : '8px',fontSize:inXFormGroup?'15px':'14px', marginLeft:'-5px' }"
39
+ v-if="groupsItem.groupName !== DEFAULT_GROUP_NAME">
40
+ <span class="xFormGroupTitle" :ref="`group-title-${groupsIndex}`">{{ groupsItem.groupName }}</span>
41
+ </a-col>
42
+ <x-form-item
43
+ v-for="(item, index) in groupsItem.realJsonData"
44
+ :key="index"
45
+ :attr="item"
46
+ :disabled="itemDisabled(item)"
47
+ :read-only="readonly(item)"
48
+ :files="files"
49
+ v-bind="formItemLayoutGen"
50
+ :style="layout === 'inline' ? { marginTop:'5px' } : undefined"
51
+ :form="form"
52
+ :images="images"
53
+ :service-name="serviceName"
54
+ mode="新增/修改"
55
+ :layout="layout"
56
+ :get-data-params="getDataParams"
57
+ :env="env"
58
+ @x-form-item-emit-func="emitFunc"
59
+ @rowChoose="rowChoose"
60
+ :setForm="setForm"
61
+ />
62
+ </a-row>
63
+ </a-col>
64
+ </a-row>
65
+ <a-row :gutter="16" v-for="(groupItem, groupIndex) in groupJsonData" :key="groupIndex">
66
+ <a-card v-if="groupItem.groupItems.length > 0" :title="groupItem.name" :bordered="false" size="small">
67
+ <x-form-item
68
+ v-for="(item, index) in groupItem.groupItems"
69
+ :key="index"
70
+ :attr="item"
71
+ :disabled="itemDisabled(item)"
72
+ :readonly="readonly(item)"
73
+ :files="files"
74
+ v-bind="formItemLayoutGen"
75
+ :style="layout ==='inline'?{marginTop:'5px'}:undefined"
76
+ :form="form[groupItem.model]"
77
+ :images="images"
78
+ :service-name="serviceName"
79
+ mode="新增/修改"
80
+ :get-data-params="getDataParams"
81
+ :env="env"
82
+ :setForm="setForm"
83
+ @rowChoose="rowChoose"
84
+ />
85
+ </a-card>
86
+ <template v-else>
87
+ <slot
88
+ name="groupFormItems"
89
+ :form="form"
90
+ :model="groupItem.model"
91
+ :rules="rules"
92
+ :modifyModelData="modifyModelData"></slot>
93
+ </template>
94
+ </a-row>
95
+ <a-row :gutter="16" v-for="(item, key) in simpleFormJsonData" :key="'row' + key">
96
+ <a-card v-if="item.value.length > 0" :title="item.name" :bordered="false" size="small">
97
+ <x-form-item
98
+ v-for="(formItem, formItemIndex) in item.value"
99
+ :key="key + formItemIndex"
100
+ :attr="formItem"
101
+ :disabled="itemDisabled(formItem)"
102
+ :readonly="readonly(formItem)"
103
+ :files="files"
104
+ v-bind="formItemLayoutGen"
105
+ :style="layout ==='inline'?{marginTop:'5px'}:undefined"
106
+ :form="form[groupItem.model]"
107
+ :images="images"
108
+ :service-name="serviceName"
109
+ mode="新增/修改"
110
+ :get-data-params="getDataParams"
111
+ :env="env"
112
+ :setForm="setForm"
113
+ @rowChoose="rowChoose"
114
+ />
115
+ </a-card>
116
+ </a-row>
117
+ <a-row :gutter="16" v-for="(item, key) in childTableData" :key="'childTableRow' + key">
118
+ <a-card :title="item.name" :bordered="false" size="small">
119
+ <x-form-table
120
+ :key="'childTable_' + item.model"
121
+ :title="item.name"
122
+ :queryParamsName="item.childTableConfigName"
123
+ :localEditMode="true"
124
+ :fixed-query-form="childTableFixedQueryForm(item)"
125
+ :service-name="serviceName"
126
+ :ref="'childXFormTable_' + item.model">
127
+ </x-form-table>
128
+ </a-card>
129
+ </a-row>
130
+ <a-row type="flex" :justify="btnPlace" :style="{paddingLeft: '16px',paddingRight: '16px'}">
131
+ <slot name="footer" :loading="loading">
132
+ <a-button v-if="showSubmitBtn" :loading="loading" type="primary" @click="onSubmit()">{{ btnName }}</a-button>
133
+ </slot>
134
+ </a-row>
135
+ </a-form-model>
136
+ </div>
137
+ </template>
138
+ <script>
139
+ import XFormItem from '@vue2-client/base-client/components/common/XForm/XFormItem'
140
+ import { formatDate, setDataByRealKey } from '@vue2-client/utils/util'
141
+ import * as util from '@vue2-client/utils/util'
142
+ import { mapState } from 'vuex'
143
+ import { addOrModify, getConfigByName, getConfigByNameAsync, runLogic } from '@vue2-client/services/api/common'
144
+ import { checkIdNumber, REG_EMAIL, REG_LANDLINE, REG_PHONE } from '@vue2-client/utils/reg'
145
+ import moment from 'moment/moment'
146
+ import { executeStrFunction, executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
147
+
148
+ const DEFAULT_GROUP_NAME = '__default__'
149
+ export default {
150
+ name: 'XAddNativeForm',
151
+ components: {
152
+ XFormItem,
153
+ XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue')
154
+ },
155
+ inject: {
156
+ inXFormGroup: {
157
+ default: false
158
+ }
159
+ },
160
+ props: {},
161
+ data () {
162
+ return {
163
+ DEFAULT_GROUP_NAME,
164
+ // 预览模式
165
+ viewMode: false,
166
+ // 是否处理表单Key值
167
+ isHandleFormKey: true,
168
+ // 内容加载是否完成
169
+ loaded: false,
170
+ // 业务类型
171
+ businessType: '',
172
+ // 业务标题
173
+ title: '',
174
+ // 新增或修改业务是否执行中
175
+ loading: false,
176
+ // 表单Model
177
+ form: {},
178
+ // 配置名称
179
+ configName: undefined,
180
+ // 配置内容,用于查询配置生成器的预览
181
+ configContent: undefined,
182
+ // 表单项集合
183
+ formItems: [],
184
+ // 服务名称
185
+ serviceName: undefined,
186
+ // 是否显示提交按钮
187
+ showSubmitBtn: true,
188
+ // 修改有文件的表单时使用
189
+ files: [],
190
+ images: [],
191
+ // 校验
192
+ rules: {},
193
+ // 调用logic获取数据源的追加参数
194
+ getDataParams: {},
195
+ // 动态简易表单集合
196
+ simpleFormJsonData: {},
197
+ // 待修改的数据集
198
+ modifyModelData: {},
199
+ // 当前环境
200
+ env: 'prod',
201
+ // 表单主键
202
+ primaryKey: null,
203
+ // 表单模式 horizontal | vertical | inline
204
+ layout: 'horizontal',
205
+ // 提交按钮名称
206
+ btnName: '提交',
207
+ // 提交按钮位置 start / center / end
208
+ btnPlace: 'center',
209
+ activeTab: 0
210
+ }
211
+ },
212
+ computed: {
213
+ // 过滤出用于新增/修改场景的表单项
214
+ realJsonData: function () {
215
+ return this.formItems.filter((item) => {
216
+ return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
217
+ })
218
+ },
219
+ // 表单项组 / 不是 数据组
220
+ groups: function () {
221
+ if (!this.realJsonData || this.realJsonData.length === 0) {
222
+ return [{
223
+ groupName: DEFAULT_GROUP_NAME,
224
+ realJsonData: this.realJsonData,
225
+ xAddFormLayout: 'horizontal'
226
+ }]
227
+ }
228
+ const uniqueGroups = new Set(this.realJsonData.map(item => item.group).filter(Boolean))
229
+ const allGroup = Array.from(uniqueGroups).map(group => {
230
+ return {
231
+ groupName: group,
232
+ realJsonData: this.realJsonData.filter(item => item.group === group),
233
+ xAddFormLayout: 'horizontal'
234
+ }
235
+ })
236
+ // 判断每一组得formJson 长度相加是否等于 realJsonData 长度 避免错误数据
237
+ if (allGroup.reduce((total, item) => total + item.realJsonData.length, 0) === this.realJsonData.length) {
238
+ return allGroup
239
+ } else {
240
+ return [{
241
+ groupName: DEFAULT_GROUP_NAME,
242
+ realJsonData: this.realJsonData,
243
+ xAddFormLayout: 'horizontal'
244
+ }]
245
+ }
246
+ },
247
+ // 过滤出用于新增/修改场景的表单项
248
+ groupJsonData: function () {
249
+ return this.formItems.filter((item) => {
250
+ return item.type === 'group'
251
+ }).map((item) => {
252
+ item.groupItems = item.groupItems.filter((item) => {
253
+ return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
254
+ }).map((groupItem) => {
255
+ // 只保留第一个下划线后面的内容
256
+ // 多层校验规则需要将prop设置为 key1.key2.....
257
+ groupItem.prop = `${item.model}.${groupItem.model.substring(groupItem.model.indexOf('_') + 1)}`
258
+ groupItem.model = groupItem.model.substring(groupItem.model.indexOf('_') + 1)
259
+ return groupItem
260
+ })
261
+ return item
262
+ }
263
+ )
264
+ },
265
+ // 过滤出用于子表数据新增/修改场景的表单项
266
+ childTableData: function () {
267
+ return this.formItems.filter((item) => {
268
+ return item.type === 'childTable'
269
+ })
270
+ },
271
+ // 过滤出用于form子表数据新增/修改场景的表单项
272
+ childFormData: function () {
273
+ return this.formItems.filter((item) => {
274
+ return item.type === 'rowEdit'
275
+ })
276
+ },
277
+ // 过滤出用于静默新增场景的表单项
278
+ silenceAddJsonData: function () {
279
+ return this.formItems.filter(function (item) {
280
+ return item.addOrEdit === 'silenceAdd'
281
+ })
282
+ },
283
+ // 过滤出版本号表单项
284
+ versionJsonData: function () {
285
+ return this.formItems.filter(function (item) {
286
+ return item.addOrEdit === 'version'
287
+ })
288
+ },
289
+ formItemLayoutGen () {
290
+ if (this.layout === 'horizontal') {
291
+ return {
292
+ labelCol: { span: 4, offset: 2 },
293
+ wrapperCol: { span: 14 },
294
+ }
295
+ } else if (this.layout === 'vertical') {
296
+ return {}
297
+ } else {
298
+ if (!this.formItemLayout.labelCol || !this.formItemLayout.wrapperCol) {
299
+ return {
300
+ labelCol: { span: 8 },
301
+ wrapperCol: { span: 16 },
302
+ }
303
+ }
304
+ return {
305
+ labelCol: { span: this.formItemLayout.labelCol },
306
+ wrapperCol: { span: this.formItemLayout.wrapperCol },
307
+ }
308
+ }
309
+ },
310
+ ...mapState('account', { currUser: 'user' })
311
+ },
312
+ provide () {
313
+ return {
314
+ getComponentByName: this.getComponentByName,
315
+ registerComponent: this.registerComponent,
316
+ getSelf: () => this,
317
+ }
318
+ },
319
+ methods: {
320
+ runLogic,
321
+ getConfigByNameAsync,
322
+ getConfigByName,
323
+ init (params) {
324
+ const {
325
+ configName,
326
+ configContent,
327
+ formItems,
328
+ formJson,
329
+ viewMode,
330
+ isHandleFormKey,
331
+ isKeyHandle = true,
332
+ showSubmitBtn = true,
333
+ serviceName,
334
+ primaryKey,
335
+ modifyModelData = {},
336
+ businessType,
337
+ title,
338
+ fixedAddForm = {},
339
+ getDataParams = {},
340
+ simpleFormJsonData = {},
341
+ env = 'prod',
342
+ layout,
343
+ xAddFormLayout = 'horizontal',
344
+ formItemLayout = {},
345
+ btnName = '提交',
346
+ btnPlace = 'center'
347
+ } = params
348
+ this.loaded = false
349
+ // 兼容需要省略 传递 layout: res.xAddFormLayout 可以使用 ...res 展开运算符 直接转递
350
+ if (xAddFormLayout && layout === undefined) {
351
+ this.layout = xAddFormLayout
352
+ } else {
353
+ this.layout = layout
354
+ }
355
+ this.formItemLayout = formItemLayout
356
+ if ((isHandleFormKey === null || isHandleFormKey === undefined) && !isKeyHandle) {
357
+ this.isHandleFormKey = isKeyHandle
358
+ } else if (isHandleFormKey) {
359
+ this.isHandleFormKey = isHandleFormKey
360
+ } else {
361
+ this.isHandleFormKey = isKeyHandle
362
+ }
363
+ this.configName = configName
364
+ this.configContent = configContent
365
+ this.formItems = this.getFromItem(formItems, formJson)
366
+ this.viewMode = viewMode
367
+ this.showSubmitBtn = showSubmitBtn
368
+ this.primaryKey = primaryKey
369
+ this.serviceName = serviceName
370
+ this.businessType = businessType
371
+ this.title = title
372
+ this.getDataParams = getDataParams
373
+ this.simpleFormJsonData = simpleFormJsonData
374
+ this.env = env
375
+ this.btnName = btnName
376
+ this.btnPlace = btnPlace
377
+ // 如果 fixedAddFormselected_id 值,并且设置了处理表单key值,则多给 selected_id 加前缀 避免处理错误
378
+ if (fixedAddForm.selected_id && this.isHandleFormKey) {
379
+ fixedAddForm._selected_id = fixedAddForm.selected_id
380
+ delete fixedAddForm.selected_id
381
+ }
382
+ // 设置普通表单项的相关参数
383
+ const formData = Object.assign({}, fixedAddForm)
384
+ for (let i = 0; i < this.realJsonData.length; i++) {
385
+ const item = this.realJsonData[i]
386
+ this.setFormProps(formData, item, null)
387
+ }
388
+ // 设置表单分组项目相关参数
389
+ for (let i = 0; i < this.groupJsonData.length; i++) {
390
+ const groupItem = this.groupJsonData[i]
391
+ formData[groupItem.model] = {}
392
+ for (let j = 0; j < groupItem.groupItems.length; j++) {
393
+ const item = groupItem.groupItems[j]
394
+ this.setFormProps(formData[groupItem.model], item, item.prop)
395
+ }
396
+ }
397
+ // 设置动态简易表单项的相关参数
398
+ for (const key in this.simpleFormJsonData) {
399
+ for (const item of this.simpleFormJsonData[key].value) {
400
+ item.model = key + '@' + item.model
401
+ this.setFormProps(formData, item, null)
402
+ }
403
+ }
404
+
405
+ this.form = formData
406
+ // 修改场景下对表单项赋值
407
+ if (modifyModelData && modifyModelData.data) {
408
+ this.modifyModelData = modifyModelData
409
+ if (Object.keys(modifyModelData.data).length > 0) {
410
+ this.getModifyModelData(modifyModelData)
411
+ }
412
+ }
413
+ // 处理表单得附件
414
+ if (modifyModelData && modifyModelData.files) {
415
+ this.files = modifyModelData.files
416
+ }
417
+ if (modifyModelData && modifyModelData.images) {
418
+ this.images = modifyModelData.images
419
+ }
420
+ this.loaded = true
421
+ },
422
+ scrollToGroup (index) {
423
+ const groupElement = this.$refs[`group-title-${index}`][0]
424
+ if (groupElement) {
425
+ groupElement.scrollIntoView({ behavior: 'smooth' })
426
+ }
427
+ },
428
+ registerComponent (componentName, component) {
429
+ console.log('内部注册', this.$options.name, componentName)
430
+ this.$refs[componentName] = component
431
+ console.log('内部注册完成', this.$refs)
432
+ },
433
+ // 根据名字从注册到组件中获取组件
434
+ getComponentByName (componentName) {
435
+ console.log('内部取组件', this.$options.name, componentName)
436
+ console.log('内部组件内容', this.$refs)
437
+ return this.$refs[componentName]
438
+ },
439
+ // 兼容需要省略 传递 [formItems: res.formJson ] 可以使用 ...res 展开运算符 直接转递
440
+ getFromItem (formItems, formJson) {
441
+ const _formItems = formItems || formJson
442
+ if (typeof formItems === 'string') {
443
+ return JSON.parse(_formItems)
444
+ } else {
445
+ return JSON.parse(JSON.stringify(_formItems))
446
+ }
447
+ },
448
+ // 时间组件赋默认值
449
+ // .type, item.formDefault
450
+ getDateRange ({ type, formDefault: defaultValue, formValueFormat }) {
451
+ // const format = type === 'datePicker' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss'
452
+ let format = 'YYYY-MM-DD HH:mm:ss'
453
+ if (formValueFormat) {
454
+ format = formValueFormat
455
+ }
456
+ let start
457
+ switch (defaultValue) {
458
+ case 'curYear':
459
+ start = moment().startOf('year').format(format)
460
+ break
461
+ case 'curMonth':
462
+ start = moment().startOf('month').format(format)
463
+ break
464
+ case 'curDay':
465
+ start = moment().startOf('day').format(format)
466
+ break
467
+ case 'curTime':
468
+ start = moment().format(format)
469
+ break
470
+ default:
471
+ return defaultValue
472
+ }
473
+ return start
474
+ },
475
+ setFormProps (formData, item, groupItem) {
476
+ if (formData[item.model] === undefined || formData[item.model] === null) {
477
+ formData[item.model] = undefined
478
+ }
479
+ if (!formData[item.model] && item.formDefault) {
480
+ if (['datePicker', 'rangePicker', 'yearPicker', 'monthPicker', 'yearRangePicker', 'monthRangePicker'].includes(item.type)) {
481
+ formData[item.model] = this.getDateRange(item)
482
+ } else if (['treeSelect', 'select', 'checkbox'].includes(item.type) && ['curOrgId', 'curDepId', 'curUserId'].includes(item.formDefault)) {
483
+ if (item.formDefault === 'curOrgId') {
484
+ formData[item.model] = item.type === 'select' ? this.currUser.orgid : [this.currUser.orgid]
485
+ }
486
+ if (item.formDefault === 'curDepId') {
487
+ formData[item.model] = item.type === 'select' ? this.currUser.depids : [this.currUser.depids]
488
+ }
489
+ if (item.formDefault === 'curUserId') {
490
+ formData[item.model] = item.type === 'select' ? this.currUser.id : [this.currUser.id]
491
+ }
492
+ } else {
493
+ formData[item.model] = item.formDefault
494
+ }
495
+ }
496
+ // 处理表单校验情况
497
+ if (item.rule) {
498
+ if (groupItem) {
499
+ this.rules[groupItem] = []
500
+ } else {
501
+ this.rules[item.model] = []
502
+ }
503
+ const required = item.rule.required ? item.rule.required === true || item.rule.required === 'true' : false
504
+ let trigger
505
+ let message
506
+ if (required) {
507
+ switch (item.type) {
508
+ case 'select':
509
+ case 'checkbox':
510
+ case 'radio':
511
+ case 'treeSelect':
512
+ case 'rangePicker':
513
+ case 'monthPicker':
514
+ case 'yearPicker':
515
+ case 'datePicker':
516
+ case 'file':
517
+ case 'image':
518
+ case 'citySelect':
519
+ case 'addressSearch':
520
+ case 'personSetting':
521
+ message = '请选择' + item.name
522
+ trigger = 'change'
523
+ break
524
+ default:
525
+ message = '请输入' + item.name
526
+ trigger = 'blur'
527
+ }
528
+ if (groupItem) {
529
+ this.rules[groupItem].push({
530
+ required: true,
531
+ message: message,
532
+ trigger: trigger
533
+ })
534
+ } else {
535
+ this.rules[item.model].push({
536
+ required: true,
537
+ message: message,
538
+ trigger: trigger
539
+ })
540
+ }
541
+ }
542
+
543
+ switch (item.rule.type) {
544
+ case 'number':
545
+ case 'integer':
546
+ case 'float':
547
+ // eslint-disable-next-line no-case-declarations
548
+ let defaultValue
549
+ // eslint-disable-next-line no-case-declarations
550
+ let message
551
+ switch (item.rule.type) {
552
+ case 'number':
553
+ item.numberInput = true
554
+ message = '数字'
555
+ defaultValue = 0
556
+ break
557
+ case 'integer':
558
+ item.numberInput = true
559
+ message = '整数'
560
+ defaultValue = 0
561
+ break
562
+ case 'float':
563
+ item.numberInput = true
564
+ message = '小数'
565
+ defaultValue = 0.0
566
+ break
567
+ }
568
+ if (groupItem) {
569
+ this.rules[groupItem].push({
570
+ type: item.rule.type,
571
+ message: item.name + '必须为' + message,
572
+ transform: (value) => {
573
+ if (value && value.length !== 0) {
574
+ return Number(value)
575
+ } else {
576
+ return defaultValue
577
+ }
578
+ },
579
+ trigger: 'blur'
580
+ })
581
+ } else {
582
+ this.rules[item.model].push({
583
+ type: item.rule.type,
584
+ message: item.name + '必须为' + message,
585
+ transform: (value) => {
586
+ if (value && value.length !== 0) {
587
+ return Number(value)
588
+ } else {
589
+ return defaultValue
590
+ }
591
+ },
592
+ trigger: 'blur'
593
+ })
594
+ }
595
+ break
596
+ case 'email': {
597
+ const validator = (rule, value, callback) => {
598
+ if (value && !REG_EMAIL.test(value)) {
599
+ callback(new Error('请输入正确的邮箱地址'))
600
+ } else {
601
+ callback()
602
+ }
603
+ }
604
+ this.rules[groupItem || item.model].push({
605
+ type: 'email',
606
+ validator: validator,
607
+ message: '请输入正确的邮箱地址',
608
+ trigger: 'blur'
609
+ })
610
+ break
611
+ }
612
+ case 'userPhone': {
613
+ this.rules[groupItem || item.model].push({
614
+ type: 'userPhone',
615
+ validator: (rule, value, callback) => {
616
+ if (value && !REG_PHONE.test(value)) {
617
+ callback(new Error('请输入正确的手机号码'))
618
+ } else {
619
+ callback()
620
+ }
621
+ },
622
+ message: '请输入正确的手机号码',
623
+ trigger: 'blur'
624
+ })
625
+ break
626
+ }
627
+ case 'idNumber': {
628
+ this.rules[groupItem || item.model].push({
629
+ validator: (rule, value, callback) => {
630
+ if (value && !checkIdNumber(value)) {
631
+ callback(new Error('请输入正确的身份证号码'))
632
+ } else {
633
+ callback()
634
+ }
635
+ },
636
+ trigger: 'blur'
637
+ })
638
+ break
639
+ }
640
+ case 'landlineNumber': {
641
+ this.rules[item.model].push({
642
+ validator: (rule, value, callback) => {
643
+ if (value && !REG_LANDLINE.test(value)) {
644
+ callback(new Error('请输入正确的座机号码'))
645
+ } else {
646
+ callback()
647
+ }
648
+ },
649
+ trigger: 'blur'
650
+ })
651
+ break
652
+ }
653
+ // 大于0
654
+ case 'greaterThanZero': {
655
+ item.numberInput = true
656
+ this.rules[item.model].push({
657
+ validator: (rule, value, callback) => {
658
+ if (isNaN(value) || value <= 0) {
659
+ callback(new Error('请输入一个大于0的数字'))
660
+ } else {
661
+ callback()
662
+ }
663
+ },
664
+ trigger: 'blur'
665
+ })
666
+ break
667
+ }
668
+ // 大于等于0
669
+ case 'greaterThanOrEqualZero': {
670
+ item.numberInput = true
671
+ this.rules[item.model].push({
672
+ validator: (rule, value, callback) => {
673
+ if (isNaN(value) || value < 0) {
674
+ callback(new Error('请输入一个大于等于0的数字'))
675
+ } else {
676
+ callback()
677
+ }
678
+ },
679
+ trigger: 'blur'
680
+ })
681
+ break
682
+ }
683
+ case 'stringLength': {
684
+ this.rules[item.model].push({
685
+ validator: (rule, value, callback) => {
686
+ if (value && value.length < item.rule.minLen) {
687
+ callback(new Error('长度不能少于' + item.rule.minLen + '个字符'))
688
+ } else if (value && value.length > item.rule.maxLen) {
689
+ callback(new Error('长度不能超过' + item.rule.maxLen + '个字符'))
690
+ } else {
691
+ callback()
692
+ }
693
+ },
694
+ trigger: 'blur'
695
+ })
696
+ break
697
+ }
698
+ case 'customJs': {
699
+ this.rules[item.model].push({
700
+ validator: (rule, value, callback) => {
701
+ this.customJsValidate(rule, value, callback, item)
702
+ },
703
+ trigger: 'blur'
704
+ })
705
+ break
706
+ }
707
+ }
708
+ }
709
+ },
710
+ customJsValidate (rule, value, callback, item) {
711
+ if (item.rule.customValidatorFunc) {
712
+ executeStrFunctionByContext(this, item.rule.customValidatorFunc, [rule, value, callback, this.form, item, this.util, runLogic, getConfigByNameAsync])
713
+ } else {
714
+ callback()
715
+ }
716
+ },
717
+ itemDisabled (value) {
718
+ return (this.businessType === '新增' && value.addOrEdit === 'edit') ||
719
+ (this.businessType === '修改' && value.addOrEdit === 'add')
720
+ },
721
+ readonly (value) {
722
+ return value.addOrEdit === 'readonly'
723
+ },
724
+ async onSubmit () {
725
+ const valid = await this.validateForm()
726
+ if (!valid) return false
727
+ if (this.viewMode) {
728
+ this.$message.info('预览模式禁止新增和修改')
729
+ return false
730
+ }
731
+ this.loading = true
732
+ const requestForm = this.prepareForm()
733
+ await this.appendSilenceAddFields(requestForm)
734
+ const realForm = this.handleFormKeys(requestForm)
735
+ // 增加子表数据
736
+ if (this.childTableData.length > 0) {
737
+ for (const item of this.childTableData) {
738
+ const childModel = item.model
739
+ const childDataRef = this.$refs['childXFormTable_' + item.model][0].getTableData()
740
+ const childData = []
741
+ for (const item of childDataRef) {
742
+ childData.push(JSON.parse(JSON.stringify(item)))
743
+ }
744
+ for (let i = 0; i < childData.length; i++) {
745
+ childData[i] = this.handleFormKeys(childData[i])
746
+ // 外键不需要带表别名,所以此处放到表单处理后赋值
747
+ if (realForm.id) {
748
+ childData[i][item.childTableForeignKeyName] = realForm.id
749
+ }
750
+ }
751
+ realForm[childModel] = childData
752
+ }
753
+ }
754
+ // 增加form子表数据
755
+ if (this.childFormData.length > 0) {
756
+ for (const item of this.childFormData) {
757
+ const childModel = item.model
758
+ const childData = this.$refs[item.model].getTableData()
759
+ for (let i = 0; i < childData.length; i++) {
760
+ childData[i] = this.handleFormKeys(childData[i], true)
761
+ // 外键不需要带表别名,所以此处放到表单处理后赋值
762
+ if (realForm.id) {
763
+ childData[i][item.foreignKey] = realForm.id
764
+ }
765
+ }
766
+ realForm[childModel] = childData
767
+ }
768
+ }
769
+ if (this.$listeners.onSubmit) {
770
+ // 交由父级处理
771
+ this.$emit('onSubmit', {
772
+ businessType: this.businessType,
773
+ serviceName: this.serviceName,
774
+ realForm: realForm,
775
+ currUserName: this.currUser.name,
776
+ currUserId: this.currUser.id,
777
+ orgId: this.currUser.orgid
778
+ })
779
+ } else {
780
+ this.defaultSubmit(realForm)
781
+ }
782
+ },
783
+
784
+ async asyncSubmit () {
785
+ return new Promise((resolve, reject) => {
786
+ this.$refs.selectForm.validate(async valid => {
787
+ if (!valid) {
788
+ reject(new Error('Form validation failed'))
789
+ return
790
+ }
791
+ this.loading = true
792
+ const requestForm = this.prepareForm()
793
+ await this.appendSilenceAddFields(requestForm)
794
+ const realForm = this.handleFormKeys(requestForm)
795
+ resolve({
796
+ realForm,
797
+ businessType: this.businessType,
798
+ serviceName: this.serviceName,
799
+ currUserName: this.currUser.name,
800
+ currUserId: this.currUser.id,
801
+ orgId: this.currUser.orgid
802
+ })
803
+ })
804
+ })
805
+ },
806
+
807
+ validateForm () {
808
+ return new Promise((resolve) => {
809
+ this.$refs.selectForm.validate(valid => resolve(valid))
810
+ })
811
+ },
812
+
813
+ childTableFixedQueryForm (item) {
814
+ if (this.modifyModelData?.primaryKeyData) {
815
+ const fixedForm = {}
816
+ fixedForm[item.childTableForeignKeyName] = Object.values(this.modifyModelData.primaryKeyData)[0]
817
+ return fixedForm
818
+ }
819
+ return null
820
+ },
821
+
822
+ prepareForm () {
823
+ const form = { ...this.form }
824
+ for (const key of Object.keys(form)) {
825
+ const value = form[key]
826
+ if (value === null || (typeof value === 'object' && Object.keys(value).length === 0)) {
827
+ form[key] = undefined
828
+ }
829
+ }
830
+ return form
831
+ },
832
+
833
+ async appendSilenceAddFields (form) {
834
+ if (this.businessType === '新增') {
835
+ for (const item of this.silenceAddJsonData) {
836
+ switch (item.silencePurpose) {
837
+ case 'createTime':
838
+ form[item.model] = formatDate('now')
839
+ break
840
+ case 'operator':
841
+ form[item.model] = this.currUser.name
842
+ break
843
+ case 'operatorId':
844
+ form[item.model] = this.currUser.id
845
+ break
846
+ case 'orgId':
847
+ form[item.model] = this.currUser.orgid
848
+ break
849
+ case 'orgName':
850
+ form[item.model] = this.currUser.orgs
851
+ break
852
+ case 'depId':
853
+ form[item.model] = this.currUser.depids
854
+ break
855
+ case 'depName':
856
+ form[item.model] = this.currUser.deps
857
+ break
858
+ }
859
+ }
860
+ for (const item of this.silenceAddJsonData.filter((item) => item.silencePurpose === 'customize')) {
861
+ const result = await runLogic(item.silenceSource, form, this.serviceName)
862
+ if (result) {
863
+ const keys = Object.keys(result)
864
+ if (keys.length === 1 && keys[0] === 'value') {
865
+ form[item.model] = result.value
866
+ } else {
867
+ form[item.model] = result
868
+ }
869
+ } else {
870
+ form[item.model] = result
871
+ }
872
+ }
873
+ }
874
+ },
875
+
876
+ handleFormKeys (form, mustHandleKey = false) {
877
+ const realForm = {}
878
+ for (const key of Object.keys(form)) {
879
+ const value = form[key]
880
+ const extraFormKeyTagIndex = key.indexOf('@')
881
+ if (extraFormKeyTagIndex !== -1) {
882
+ const extraFormKey = key.substring(0, extraFormKeyTagIndex)
883
+ const realKey = key.substring(extraFormKeyTagIndex + 1)
884
+ if (!realForm[extraFormKey]) {
885
+ realForm[extraFormKey] = {}
886
+ }
887
+ realForm[extraFormKey][realKey] = value
888
+ } else {
889
+ const realKey = this.isHandleFormKey || mustHandleKey ? this.getRealKey(key, mustHandleKey) : key
890
+ // 如果发生重名,不覆盖,把key的别名带上
891
+ if (realForm[realKey]) {
892
+ realForm[key] = value
893
+ } else {
894
+ realForm[realKey] = value
895
+ }
896
+ }
897
+ }
898
+ return realForm
899
+ },
900
+ // 默认提交事件
901
+ defaultSubmit (realForm, callback) {
902
+ // 新增移除id
903
+ if (this.businessType === '新增') {
904
+ delete realForm.id
905
+ }
906
+ // 组织请求
907
+ const requestParameters = {
908
+ queryParamsName: this.configName,
909
+ queryParams: this.configContent,
910
+ form: realForm,
911
+ businessType: this.businessType,
912
+ operator: this.currUser.name
913
+ }
914
+ addOrModify(requestParameters, this.serviceName, this.env === 'dev').then(data => {
915
+ this.$message.success(this.businessType + '成功!')
916
+ // commit
917
+ this.$emit('afterSubmit', { type: this.businessType, id: data.id, data: data, form: requestParameters.form })
918
+ this.loading = false
919
+ if (callback) {
920
+ callback()
921
+ }
922
+ }).catch(e => {
923
+ this.loading = false
924
+ this.$message.error(this.businessType + '失败:' + e)
925
+ })
926
+ },
927
+ // 获取表单字段实际值
928
+ getRealKey (key, mustHandleKey = false) {
929
+ if (key === 'selected_id') return key
930
+ if (this.isHandleFormKey || mustHandleKey) {
931
+ return key.substring(key.indexOf('_') + 1)
932
+ } else {
933
+ return key
934
+ }
935
+ },
936
+ /**
937
+ * 获取被修改记录数据
938
+ * @param modifyModelData 被修改记录的数据
939
+ */
940
+ getModifyModelData (modifyModelData) {
941
+ if (modifyModelData.primaryKeyData) {
942
+ this.form = Object.assign(this.form, modifyModelData.primaryKeyData)
943
+ }
944
+ // 对动态简易表单项特殊处理
945
+ for (const key in modifyModelData.data) {
946
+ const realKey = this.isHandleFormKey ? this.getRealKey(key) : key
947
+ if (this.simpleFormJsonData[realKey]) {
948
+ const extraForm = JSON.parse(modifyModelData.data[key])
949
+ for (const key in extraForm) {
950
+ const model = realKey + '@' + key
951
+ this.form[model] = extraForm[key]
952
+ }
953
+ }
954
+ }
955
+ // 对普通表单项处理
956
+ for (let i = 0; i < this.realJsonData.length; i++) {
957
+ if (['FilesId', 'Images'].includes(this.realJsonData[i])) {
958
+ // 附件需要跳过 因为会通过 modifyModelData中的files,images属性给upload赋值
959
+ // 新增修改表单每次提交时只会提交最新添加的文件
960
+ continue
961
+ }
962
+ const item = this.realJsonData[i]
963
+ if (modifyModelData.data[item.model] || modifyModelData.data[item.model] === 0) {
964
+ if (modifyModelData.data[item.model] instanceof Array) {
965
+ this.form[item.model] = modifyModelData.data[item.model]
966
+ } else {
967
+ this.form[item.model] = modifyModelData.data[item.model] + ''
968
+ }
969
+ }
970
+ }
971
+ // 对分组表单进行处理
972
+ for (let i = 0; i < this.groupJsonData.length; i++) {
973
+ const item = this.groupJsonData[i]
974
+ try {
975
+ if (modifyModelData.data[item.model]) {
976
+ this.form[item.model] = JSON.parse(modifyModelData.data[item.model])
977
+ }
978
+ } catch (e) {
979
+ if (modifyModelData.data[item.model]) {
980
+ this.form[item.model] = modifyModelData.data[item.model]
981
+ }
982
+ }
983
+ }
984
+ // 追加版本号信息
985
+ for (const item of this.versionJsonData) {
986
+ if (!modifyModelData.data[item.model]) {
987
+ this.form[item.model] = 0
988
+ } else {
989
+ this.form[item.model] = modifyModelData.data[item.model] + ''
990
+ }
991
+ }
992
+ },
993
+ setForm (obj) {
994
+ this.form = Object.assign(this.form, obj)
995
+ // 给子表赋外键条件
996
+ if (this.childFormData.length > 0) {
997
+ for (const item of this.childFormData) {
998
+ const child = this.$refs[item.model]
999
+ // 获取子表别名,以便在条件上添加别名
1000
+ const alias = child.realQueryConfig.tableAliasName
1001
+ // 有主键,且主键有值,添加主键条件
1002
+ if (this.primaryKey && this.form[this.primaryKey]) {
1003
+ const foreignKey = item.foreignKey
1004
+ const fixedQueryForm = { [alias + '_' + foreignKey]: this.form[this.primaryKey] }
1005
+ if (!child.fixedQueryForm) {
1006
+ child.fixedQueryForm = fixedQueryForm
1007
+ } else {
1008
+ Object.assign(child.fixedQueryForm, fixedQueryForm)
1009
+ }
1010
+ child.refreshTable()
1011
+ }
1012
+ }
1013
+ }
1014
+ },
1015
+ setFormWithKey (obj) {
1016
+ setDataByRealKey(this.form, obj)
1017
+ },
1018
+ setFormWithNoKey (obj) {
1019
+ setDataByRealKey(this.form, obj)
1020
+ },
1021
+ emitFunc (func, data, value) {
1022
+ this.$emit(func, data, value)
1023
+ this.$emit('x-form-item-emit-func', func, data, value)
1024
+ },
1025
+ // 直接转发事件的函数
1026
+ emitEvent (event, ...args) {
1027
+ this.$emit(event, ...args)
1028
+ },
1029
+ close () {
1030
+ this.loaded = false
1031
+ },
1032
+ /**
1033
+ * 行选择事件
1034
+ * @param row 选中行集合
1035
+ * @param attr 表单项属性
1036
+ */
1037
+ async rowChoose (row, attr, callback) {
1038
+ // 如果配置了自定义函数
1039
+ if (attr.dataChangeFunc) {
1040
+ await executeStrFunction(attr.dataChangeFunc, [this.form, this.setForm, {
1041
+ ...attr,
1042
+ selectRows: row
1043
+ }, util, this.mode, runLogic, getConfigByNameAsync])
1044
+ } else {
1045
+ // 默认填充选中行数据到当前表单
1046
+ setDataByRealKey(this.form, row[0])
1047
+ }
1048
+ if (callback) {
1049
+ callback()
1050
+ }
1051
+ }
1052
+ }
1053
+ }
1054
+ </script>
1055
+
1056
+ <style scoped lang="less">
1057
+ :deep(.ant-form-inline .ant-form-item ) {
1058
+ display: block !important;
1059
+ }
1060
+
1061
+ :deep(.ant-form-item-with-help) {
1062
+ margin-bottom: 0;
1063
+ }
1064
+
1065
+ .xFormGroupTitle {
1066
+ font-weight: bold;
1067
+ color: @primary-color;
1068
+ }
1069
+ </style>