vue2-client 1.9.13 → 1.9.14

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 (324) hide show
  1. package/.env +19 -19
  2. package/.env.gaslink +19 -19
  3. package/.env.revenue +19 -19
  4. package/.eslintrc.js +90 -90
  5. package/CHANGELOG.md +824 -824
  6. package/Components.md +60 -60
  7. package/babel.config.js +21 -21
  8. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +45 -45
  9. package/docs/LowCode/lowcode.md +155 -155
  10. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  11. package/docs/index.md +30 -30
  12. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +121 -121
  13. package/index.js +31 -31
  14. package/jest-transform-stub.js +8 -8
  15. package/jest.config.js +21 -21
  16. package/jest.setup.js +7 -7
  17. package/package.json +101 -101
  18. package/public/his/editor/editor.html +51 -51
  19. package/public/his/editor/mock/bind_data.html +779 -779
  20. package/public/his/editor/mock/data_table.html +40 -40
  21. package/public/his/editor/mock/sign.html +75 -75
  22. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  23. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  24. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  25. package/public/his/editor/vender/date97/calendar.js +4 -4
  26. package/public/his/editor/vender/date97/lang/en.js +13 -13
  27. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  28. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  29. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  30. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  31. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  32. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  33. package/public/his/editor/vender/diff.js +1627 -1627
  34. package/public/his/editor/vender/editor.js +1 -1
  35. package/public/his/editor/vender/fabric.js +31187 -31187
  36. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  37. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  38. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  39. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  40. package/public/his/editor/vender/mui/mui.min.css +4 -4
  41. package/public/his/editor/vender/mui/mui.min.js +5 -5
  42. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  43. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  44. package/public/his/editor/vender/qrcode.js +7 -7
  45. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  46. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  47. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  48. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  49. package/public/his/editor/vender/validator.js +5094 -5094
  50. package/public/his/editor/vender/weui/weui.css +5659 -5659
  51. package/public/his/editor/vender/weui/weui.min.css +4 -4
  52. package/public/his/editor/vender/weui/weui.min.js +11 -11
  53. package/public/index.html +27 -27
  54. package/src/App.vue +188 -188
  55. package/src/ReportView.js +19 -19
  56. package/src/assets/img/querySlotDemo.svg +15 -15
  57. package/src/assets/svg/badtwo.svg +1 -1
  58. package/src/assets/svg/goodtwo.svg +1 -1
  59. package/src/base-client/components/common/AMisRender/index.js +3 -3
  60. package/src/base-client/components/common/AMisRender/index.vue +263 -263
  61. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +470 -470
  62. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  63. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  64. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  65. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  66. package/src/base-client/components/common/CitySelect/CitySelect.vue +342 -342
  67. package/src/base-client/components/common/CitySelect/index.js +3 -3
  68. package/src/base-client/components/common/CitySelect/index.md +109 -109
  69. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  70. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  71. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  72. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  73. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  74. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  75. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  76. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  77. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  78. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  79. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  80. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  81. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  82. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  83. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  84. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  85. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  86. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  87. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  88. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  89. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  90. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  91. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  92. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  93. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  94. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  95. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  96. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  97. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  98. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  99. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  100. package/src/base-client/components/common/Tree/index.js +2 -2
  101. package/src/base-client/components/common/Upload/Upload.vue +239 -239
  102. package/src/base-client/components/common/Upload/index.js +3 -3
  103. package/src/base-client/components/common/XAddForm/XAddForm.vue +105 -105
  104. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +803 -803
  105. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  106. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  107. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  108. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  109. package/src/base-client/components/common/XAddReport/XAddReport.vue +180 -180
  110. package/src/base-client/components/common/XAddReport/index.js +3 -3
  111. package/src/base-client/components/common/XAddReport/index.md +56 -56
  112. package/src/base-client/components/common/XBadge/XBadge.vue +86 -86
  113. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  114. package/src/base-client/components/common/XDataCard/XDataCard.vue +364 -364
  115. package/src/base-client/components/common/XDataCard/index.js +3 -3
  116. package/src/base-client/components/common/XDataCard/index.md +1 -1
  117. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  118. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  119. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  120. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +169 -169
  121. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +304 -304
  122. package/src/base-client/components/common/XDescriptions/demo.vue +50 -50
  123. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  124. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  125. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  126. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  127. package/src/base-client/components/common/XForm/XForm.vue +316 -316
  128. package/src/base-client/components/common/XForm/XFormItem.vue +1152 -1152
  129. package/src/base-client/components/common/XForm/XTreeSelect.vue +207 -207
  130. package/src/base-client/components/common/XForm/index.md +178 -178
  131. package/src/base-client/components/common/XFormCol/XFormCol.vue +36 -36
  132. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +250 -250
  133. package/src/base-client/components/common/XFormGroup/demo.vue +40 -40
  134. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  135. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  136. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  137. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  138. package/src/base-client/components/common/XFormTable/XFormTable.vue +638 -638
  139. package/src/base-client/components/common/XFormTable/demo.vue +75 -75
  140. package/src/base-client/components/common/XFormTable/index.md +98 -98
  141. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +162 -162
  142. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  143. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  144. package/src/base-client/components/common/XReport/XReport.vue +873 -873
  145. package/src/base-client/components/common/XReport/XReportDemo.vue +304 -304
  146. package/src/base-client/components/common/XReport/XReportDesign.vue +508 -508
  147. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  148. package/src/base-client/components/common/XReport/XReportTrGroup.vue +802 -802
  149. package/src/base-client/components/common/XReport/index.js +3 -3
  150. package/src/base-client/components/common/XReport/index.md +44 -44
  151. package/src/base-client/components/common/XReport/print.js +186 -186
  152. package/src/base-client/components/common/XReportGrid/XReport.vue +936 -936
  153. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +47 -47
  154. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +556 -556
  155. package/src/base-client/components/common/XReportGrid/XReportJsonRender.vue +381 -381
  156. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +948 -948
  157. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  158. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  159. package/src/base-client/components/common/XReportGrid/print.js +186 -186
  160. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  161. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  162. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  163. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  164. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  165. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  166. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  167. package/src/base-client/components/common/XStepView/index.js +3 -3
  168. package/src/base-client/components/common/XStepView/index.md +31 -31
  169. package/src/base-client/components/common/XTab/XTab.vue +149 -149
  170. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  171. package/src/base-client/components/common/XTab/index.js +3 -3
  172. package/src/base-client/components/common/XTable/XTable.vue +1121 -1121
  173. package/src/base-client/components/common/XTable/index.md +255 -255
  174. package/src/base-client/components/common/XTree/XTree.vue +423 -423
  175. package/src/base-client/components/common/XTree/XTreePro.vue +418 -418
  176. package/src/base-client/components/common/XTree/index.js +3 -3
  177. package/src/base-client/components/common/XTree/index.md +36 -36
  178. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  179. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  180. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  181. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  182. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +196 -196
  183. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  184. package/src/base-client/components/index.js +51 -51
  185. package/src/base-client/components/layout/XPageView/RenderRow.vue +63 -63
  186. package/src/base-client/components/layout/XPageView/XErrorView.vue +11 -11
  187. package/src/base-client/components/layout/XPageView/XPageView.vue +155 -155
  188. package/src/base-client/components/layout/XPageView/index.js +3 -3
  189. package/src/base-client/components/layout/XPageView/index.md +38 -38
  190. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  191. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  192. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  193. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  194. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  195. package/src/base-client/plugins/AppData.js +121 -121
  196. package/src/base-client/plugins/Config.js +19 -19
  197. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  198. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  199. package/src/bootstrap.js +39 -39
  200. package/src/components/CodeMirror/inedx.vue +118 -118
  201. package/src/components/CodeMirror/setting.js +40 -40
  202. package/src/components/FilePreview/FilePreview.vue +166 -166
  203. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  204. package/src/components/STable/index.js +380 -380
  205. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  206. package/src/components/checkbox/ImgCheckbox.vue +163 -163
  207. package/src/components/exception/ExceptionPage.vue +70 -70
  208. package/src/components/menu/SideMenu.vue +75 -75
  209. package/src/components/menu/menu.js +273 -273
  210. package/src/components/tool/AStepItem.vue +60 -60
  211. package/src/config/CreateQueryConfig.js +322 -322
  212. package/src/config/default/antd.config.js +89 -89
  213. package/src/config/default/setting.config.js +55 -55
  214. package/src/font-style/font.css +4 -4
  215. package/src/layouts/CommonLayout.vue +56 -56
  216. package/src/layouts/GridView.vue +45 -45
  217. package/src/layouts/PageLayout.vue +151 -151
  218. package/src/layouts/SinglePageView.vue +136 -136
  219. package/src/layouts/header/AdminHeader.vue +132 -132
  220. package/src/layouts/header/HeaderNotice.vue +177 -177
  221. package/src/layouts/tabs/TabsHead.vue +189 -189
  222. package/src/layouts/tabs/TabsView.vue +389 -389
  223. package/src/lib.js +1 -1
  224. package/src/main.js +30 -30
  225. package/src/mock/extend/index.js +84 -84
  226. package/src/mock/goods/index.js +108 -108
  227. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  228. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  229. package/src/pages/DefaultExample/index.vue +77 -77
  230. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  231. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  232. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  233. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  234. package/src/pages/DynamicStatistics/FavoriteList.vue +51 -51
  235. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  236. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  237. package/src/pages/DynamicStatistics/index.vue +282 -282
  238. package/src/pages/Example/childIndex.vue +15 -15
  239. package/src/pages/Example/index.vue +30 -30
  240. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  241. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  242. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  243. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  244. package/src/pages/NewDynamicStatistics/FavoriteList.vue +51 -51
  245. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  246. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  247. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  248. package/src/pages/ReportGrid/index.vue +76 -76
  249. package/src/pages/ServiceReview/index.vue +284 -284
  250. package/src/pages/SubExample/index.vue +26 -26
  251. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +32 -32
  252. package/src/pages/WorkflowDetail/WorkflowDetail.vue +230 -230
  253. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +131 -131
  254. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  255. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +302 -302
  256. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformationDetails.vue +276 -276
  257. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +863 -863
  258. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +997 -997
  259. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +222 -222
  260. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +233 -233
  261. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +261 -261
  262. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowListResolution.vue +248 -248
  263. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +73 -73
  264. package/src/pages/XPageViewExample/index.vue +38 -38
  265. package/src/pages/XReportView/index.vue +64 -64
  266. package/src/pages/XTreeOneProExample/index.vue +67 -67
  267. package/src/pages/login/Login.vue +378 -378
  268. package/src/pages/login/LoginV3.vue +389 -389
  269. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  270. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  271. package/src/pages/resourceManage/orgListManage.vue +98 -98
  272. package/src/pages/system/dictionary/index.vue +44 -44
  273. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  274. package/src/pages/system/monitor/operLog/index.vue +37 -37
  275. package/src/pages/system/settings/modifyPassword.vue +117 -117
  276. package/src/pages/system/ticket/index.vue +480 -480
  277. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  278. package/src/plugins/EventLogPlugin.js +33 -33
  279. package/src/plugins/FindParentsData.js +17 -17
  280. package/src/router/async/config.async.js +34 -34
  281. package/src/router/async/router.map.js +179 -179
  282. package/src/router/guards.js +264 -264
  283. package/src/router/index.js +27 -27
  284. package/src/router.js +19 -19
  285. package/src/services/api/TicketDetailsViewApi.js +46 -46
  286. package/src/services/api/cas.js +79 -79
  287. package/src/services/api/common.js +329 -329
  288. package/src/services/api/entity.js +18 -18
  289. package/src/services/api/index.js +17 -17
  290. package/src/services/api/restTools.js +67 -67
  291. package/src/services/api/workFlow.js +63 -63
  292. package/src/services/apiService.js +15 -15
  293. package/src/services/user.js +90 -90
  294. package/src/services/v3Api.js +81 -81
  295. package/src/store/modules/account.js +115 -115
  296. package/src/store/modules/index.js +5 -5
  297. package/src/store/modules/lowCode.js +33 -33
  298. package/src/store/modules/setting.js +119 -119
  299. package/src/theme/default/style.less +58 -58
  300. package/src/theme/global.less +159 -159
  301. package/src/utils/authority-utils.js +85 -85
  302. package/src/utils/errorCode.js +6 -6
  303. package/src/utils/formatter.js +80 -80
  304. package/src/utils/htmlToPDF.js +108 -108
  305. package/src/utils/htmlToPDFApi.js +5 -5
  306. package/src/utils/indexedDB.js +258 -258
  307. package/src/utils/login.js +188 -188
  308. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  309. package/src/utils/lowcode/lowcodeLog.js +29 -29
  310. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  311. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  312. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  313. package/src/utils/map-utils.js +47 -47
  314. package/src/utils/reg.js +95 -95
  315. package/src/utils/request.js +362 -362
  316. package/src/utils/routerUtil.js +450 -450
  317. package/src/utils/runEvalFunction.js +14 -14
  318. package/src/utils/util.js +281 -281
  319. package/src/utils/waterMark.js +31 -31
  320. package/test/Amis.spec.js +163 -163
  321. package/test/Tree.spec.js +167 -167
  322. package/test/myDialog.spec.js +46 -46
  323. package/vue.config.js +196 -196
  324. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,803 +1,803 @@
1
- <template>
2
- <div>
3
- <a-form-model
4
- v-if="loaded"
5
- ref="selectForm"
6
- :zIndex="1001"
7
- :model="form"
8
- v-bind="formItemLayout"
9
- :layout="layout"
10
- :rules="rules">
11
- <a-row :gutter="16" type="flex">
12
- <x-form-item
13
- v-for="(item, index) in realJsonData"
14
- :key="index"
15
- :attr="item"
16
- :disabled="itemDisabled(item)"
17
- :read-only="readonly(item)"
18
- :files="files"
19
- :style="layout === 'inline' ? { marginTop:'5px' } : undefined"
20
- :form="form"
21
- :images="images"
22
- :service-name="serviceName"
23
- mode="新增/修改"
24
- :layout="layout"
25
- :get-data-params="getDataParams"
26
- :env="env"
27
- @x-form-item-emit-func="emitFunc"
28
- :setForm="setForm"
29
- />
30
- </a-row>
31
- <a-row :gutter="16" v-for="(groupItem, groupIndex) in groupJsonData" :key="groupIndex">
32
- <a-card v-if="groupItem.groupItems.length > 0" :title="groupItem.name" :bordered="false" size="small">
33
- <x-form-item
34
- v-for="(item, index) in groupItem.groupItems"
35
- :key="index"
36
- :attr="item"
37
- :disabled="itemDisabled(item)"
38
- :readonly="readonly(item)"
39
- :files="files"
40
- :style="layout ==='inline'?{marginTop:'5px'}:undefined"
41
- :form="form[groupItem.model]"
42
- :images="images"
43
- :service-name="serviceName"
44
- mode="新增/修改"
45
- :get-data-params="getDataParams"
46
- :env="env"
47
- :setForm="setForm"
48
- />
49
- </a-card>
50
- <template v-else>
51
- <slot
52
- name="groupFormItems"
53
- :form="form"
54
- :model="groupItem.model"
55
- :rules="rules"
56
- :modifyModelData="modifyModelData"></slot>
57
- </template>
58
- </a-row>
59
- <a-row :gutter="16" v-for="(item, key) in simpleFormJsonData" :key="'row' + key">
60
- <a-card v-if="item.value.length > 0" :title="item.name" :bordered="false" size="small">
61
- <x-form-item
62
- v-for="(formItem, formItemIndex) in item.value"
63
- :key="key + formItemIndex"
64
- :attr="formItem"
65
- :disabled="itemDisabled(formItem)"
66
- :readonly="readonly(formItem)"
67
- :files="files"
68
- :style="layout ==='inline'?{marginTop:'5px'}:undefined"
69
- :form="form[groupItem.model]"
70
- :images="images"
71
- :service-name="serviceName"
72
- mode="新增/修改"
73
- :get-data-params="getDataParams"
74
- :env="env"
75
- :setForm="setForm"
76
- />
77
- </a-card>
78
- </a-row>
79
- <a-row type="flex" justify="end">
80
- <a-button v-if="showSubmitBtn" :loading="loading" type="primary" @click="onSubmit()">提交</a-button>
81
- </a-row>
82
- </a-form-model>
83
- </div>
84
- </template>
85
- <script>
86
- import XFormItem from '@vue2-client/base-client/components/common/XForm/XFormItem'
87
- import { formatDate } from '@vue2-client/utils/util'
88
- import { mapState } from 'vuex'
89
- import { addOrModify, getConfigByName, getConfigByNameAsync, runLogic } from '@vue2-client/services/api/common'
90
- import { checkIdNumber, REG_EMAIL, REG_LANDLINE, REG_PHONE } from '@vue2-client/utils/reg'
91
- import moment from 'moment/moment'
92
- import { executeStrFunction } from '@vue2-client/utils/runEvalFunction'
93
-
94
- export default {
95
- name: 'XAddNativeForm',
96
- components: {
97
- XFormItem
98
- },
99
- props: {},
100
- data () {
101
- return {
102
- // 预览模式
103
- viewMode: false,
104
- // 是否处理表单Key值
105
- isHandleFormKey: true,
106
- // 内容加载是否完成
107
- loaded: false,
108
- // 业务类型
109
- businessType: '',
110
- // 业务标题
111
- title: '',
112
- // 新增或修改业务是否执行中
113
- loading: false,
114
- // 表单Model
115
- form: {},
116
- // 配置名称
117
- configName: undefined,
118
- // 配置内容,用于查询配置生成器的预览
119
- configContent: undefined,
120
- // 表单项集合
121
- formItems: [],
122
- // 服务名称
123
- serviceName: undefined,
124
- // 是否显示提交按钮
125
- showSubmitBtn: true,
126
- // 修改有文件的表单时使用
127
- files: [],
128
- images: [],
129
- // 校验
130
- rules: {},
131
- // 调用logic获取数据源的追加参数
132
- getDataParams: {},
133
- // 是否为临时表
134
- isTableTemp: false,
135
- // 是否处理表单key
136
- isKeyHandle: true,
137
- // 动态简易表单集合
138
- simpleFormJsonData: {},
139
- // 待修改的数据集
140
- modifyModelData: {},
141
- // 当前环境
142
- env: 'prod',
143
- // 表单模式 horizontal | vertical | inline
144
- layout: 'horizontal'
145
- }
146
- },
147
- computed: {
148
- // 过滤出用于新增/修改场景的表单项
149
- realJsonData: function () {
150
- return this.formItems.filter((item) => {
151
- return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
152
- })
153
- },
154
- // 过滤出用于新增/修改场景的表单项
155
- groupJsonData: function () {
156
- return this.formItems.filter((item) => {
157
- return item.type === 'group'
158
- }).map((item) => {
159
- item.groupItems = item.groupItems.filter((item) => {
160
- return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
161
- }).map((groupItem) => {
162
- // 只保留第一个下划线后面的内容
163
- // 多层校验规则需要将prop设置为 key1.key2.....
164
- groupItem.prop = `${item.model}.${groupItem.model.substring(groupItem.model.indexOf('_') + 1)}`
165
- groupItem.model = groupItem.model.substring(groupItem.model.indexOf('_') + 1)
166
- return groupItem
167
- })
168
- return item
169
- }
170
- )
171
- },
172
- // 过滤出用于静默新增场景的表单项
173
- silenceAddJsonData: function () {
174
- return this.formItems.filter(function (item) {
175
- return item.addOrEdit === 'silenceAdd'
176
- })
177
- },
178
- // 过滤出版本号表单项
179
- versionJsonData: function () {
180
- return this.formItems.filter(function (item) {
181
- return item.addOrEdit === 'version'
182
- })
183
- },
184
- formItemLayout () {
185
- if (this.layout === 'horizontal') {
186
- return {
187
- labelCol: { span: 4, offset: 2 },
188
- wrapperCol: { span: 14 },
189
- }
190
- }
191
- if (this.layout === 'vertical') {
192
- return {}
193
- }
194
- return {
195
- labelCol: { span: 6 },
196
- wrapperCol: { span: 18 },
197
- }
198
- },
199
- ...mapState('account', { currUser: 'user' })
200
- },
201
- methods: {
202
- runLogic,
203
- getConfigByNameAsync,
204
- getConfigByName,
205
- init (params) {
206
- const {
207
- configName, configContent, formItems, formJson, viewMode, isHandleFormKey = true,
208
- showSubmitBtn = true, serviceName, isTableTemp = false, isKeyHandle = true,
209
- modifyModelData = {}, businessType, title, fixedAddForm = {}, getDataParams = {},
210
- simpleFormJsonData = {}, env = 'prod', layout, xAddFormLayout = 'horizontal'
211
- } = params
212
- this.loaded = false
213
- // 兼容需要省略 传递 layout: res.xAddFormLayout 可以使用 ...res 展开运算符 直接转递
214
- if (xAddFormLayout && !layout) {
215
- this.layout = xAddFormLayout
216
- } else {
217
- this.layout = layout
218
- }
219
- this.configName = configName
220
- this.configContent = configContent
221
- this.formItems = this.getFromItem(formItems, formJson)
222
- this.viewMode = viewMode
223
- this.isHandleFormKey = isHandleFormKey
224
- this.showSubmitBtn = showSubmitBtn
225
- this.serviceName = serviceName
226
- this.businessType = businessType
227
- this.title = title
228
- this.getDataParams = getDataParams
229
- this.simpleFormJsonData = simpleFormJsonData
230
- this.env = env
231
- this.isTableTemp = isTableTemp
232
- this.isKeyHandle = isKeyHandle
233
- // 如果 fixedAddForm 有 selected_id 值,并且设置了处理表单key值,则多给 selected_id 加前缀 避免处理错误
234
- if (fixedAddForm.selected_id && this.isKeyHandle) {
235
- fixedAddForm._selected_id = fixedAddForm.selected_id
236
- delete fixedAddForm.selected_id
237
- }
238
- // 设置普通表单项的相关参数
239
- const formData = Object.assign({}, fixedAddForm)
240
- for (let i = 0; i < this.realJsonData.length; i++) {
241
- const item = this.realJsonData[i]
242
- this.setFormProps(formData, item, null)
243
- }
244
- // 设置表单分组项目相关参数
245
- for (let i = 0; i < this.groupJsonData.length; i++) {
246
- const groupItem = this.groupJsonData[i]
247
- formData[groupItem.model] = {}
248
- for (let j = 0; j < groupItem.groupItems.length; j++) {
249
- const item = groupItem.groupItems[j]
250
- this.setFormProps(formData[groupItem.model], item, item.prop)
251
- }
252
- }
253
- // 设置动态简易表单项的相关参数
254
- for (const key in this.simpleFormJsonData) {
255
- for (const item of this.simpleFormJsonData[key].value) {
256
- item.model = key + '@' + item.model
257
- this.setFormProps(formData, item, null)
258
- }
259
- }
260
-
261
- this.form = formData
262
- // 修改场景下对表单项赋值
263
- if (modifyModelData && modifyModelData.data) {
264
- this.modifyModelData = modifyModelData
265
- if (Object.keys(modifyModelData.data).length > 0) {
266
- this.getModifyModelData(modifyModelData)
267
- }
268
- }
269
- // 处理表单得附件
270
- if (modifyModelData && modifyModelData.files) {
271
- this.files = modifyModelData.files
272
- }
273
- if (modifyModelData && modifyModelData.images) {
274
- this.images = modifyModelData.images
275
- }
276
- this.loaded = true
277
- },
278
- // 兼容需要省略 传递 [formItems: res.formJson ] 可以使用 ...res 展开运算符 直接转递
279
- getFromItem (formItems, formJson) {
280
- const _formItems = formItems || formJson
281
- if (typeof formItems === 'string') {
282
- return JSON.parse(_formItems)
283
- } else {
284
- return JSON.parse(JSON.stringify(_formItems))
285
- }
286
- },
287
- // 时间组件赋默认值
288
- getDateRange (type, defaultValue) {
289
- // const format = type === 'datePicker' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss'
290
- const format = 'YYYY-MM-DD HH:mm:ss'
291
- let start
292
- switch (defaultValue) {
293
- case 'curYear':
294
- start = moment().startOf('year').format(format)
295
- break
296
- case 'curMonth':
297
- start = moment().startOf('month').format(format)
298
- break
299
- case 'curDay':
300
- start = moment().startOf('day').format(format)
301
- break
302
- default:
303
- return defaultValue
304
- }
305
- return start
306
- },
307
- setFormProps (formData, item, groupItem) {
308
- if (formData[item.model] === undefined || formData[item.model] === null) {
309
- formData[item.model] = undefined
310
- }
311
- if (!formData[item.model] && item.formDefault) {
312
- if (['datePicker', 'rangePicker', 'yearPicker', 'monthPicker'].includes(item.type)) {
313
- formData[item.model] = this.getDateRange(item.type, item.formDefault)
314
- } else if (['treeSelect', 'select', 'checkbox'].includes(item.type) && ['curOrgId', 'curDepId', 'curUserId'].includes(item.formDefault)) {
315
- if (item.formDefault === 'curOrgId') {
316
- formData[item.model] = item.type === 'select' ? this.currUser.orgid : [this.currUser.orgid]
317
- }
318
- if (item.formDefault === 'curDepId') {
319
- formData[item.model] = item.type === 'select' ? this.currUser.depids : [this.currUser.depids]
320
- }
321
- if (item.formDefault === 'curUserId') {
322
- formData[item.model] = item.type === 'select' ? this.currUser.id : [this.currUser.id]
323
- }
324
- } else {
325
- formData[item.model] = item.formDefault
326
- }
327
- }
328
- // 处理表单校验情况
329
- if (item.rule) {
330
- if (groupItem) {
331
- this.rules[groupItem] = []
332
- } else {
333
- this.rules[item.model] = []
334
- }
335
- const required = item.rule.required ? item.rule.required === true || item.rule.required === 'true' : false
336
- let trigger
337
- let message
338
- if (required) {
339
- switch (item.type) {
340
- case 'select':
341
- case 'checkbox':
342
- case 'radio':
343
- case 'treeSelect':
344
- case 'rangePicker':
345
- case 'monthPicker':
346
- case 'yearPicker':
347
- case 'datePicker':
348
- case 'file':
349
- case 'image':
350
- case 'citySelect':
351
- case 'addressSearch':
352
- case 'personSetting':
353
- message = '请选择' + item.name
354
- trigger = 'change'
355
- break
356
- default:
357
- message = '请输入' + item.name
358
- trigger = 'blur'
359
- }
360
- if (groupItem) {
361
- this.rules[groupItem].push({
362
- required: true,
363
- message: message,
364
- trigger: trigger
365
- })
366
- } else {
367
- this.rules[item.model].push({
368
- required: true,
369
- message: message,
370
- trigger: trigger
371
- })
372
- }
373
- }
374
-
375
- switch (item.rule.type) {
376
- case 'number':
377
- case 'integer':
378
- case 'float':
379
- // eslint-disable-next-line no-case-declarations
380
- let defaultValue
381
- // eslint-disable-next-line no-case-declarations
382
- let message
383
- switch (item.rule.type) {
384
- case 'number':
385
- item.numberInput = true
386
- message = '数字'
387
- defaultValue = 0
388
- break
389
- case 'integer':
390
- item.numberInput = true
391
- message = '整数'
392
- defaultValue = 0
393
- break
394
- case 'float':
395
- item.numberInput = true
396
- message = '小数'
397
- defaultValue = 0.0
398
- break
399
- }
400
- if (groupItem) {
401
- this.rules[groupItem].push({
402
- type: item.rule.type,
403
- message: item.name + '必须为' + message,
404
- transform: (value) => {
405
- if (value && value.length !== 0) {
406
- return Number(value)
407
- } else {
408
- return defaultValue
409
- }
410
- },
411
- trigger: 'blur'
412
- })
413
- } else {
414
- this.rules[item.model].push({
415
- type: item.rule.type,
416
- message: item.name + '必须为' + message,
417
- transform: (value) => {
418
- if (value && value.length !== 0) {
419
- return Number(value)
420
- } else {
421
- return defaultValue
422
- }
423
- },
424
- trigger: 'blur'
425
- })
426
- }
427
- break
428
- case 'email': {
429
- const validator = (rule, value, callback) => {
430
- if (value && !REG_EMAIL.test(value)) {
431
- callback(new Error('请输入正确的邮箱地址'))
432
- } else {
433
- callback()
434
- }
435
- }
436
- this.rules[groupItem || item.model].push({
437
- type: 'email',
438
- validator: validator,
439
- message: '请输入正确的邮箱地址',
440
- trigger: 'blur'
441
- })
442
- break
443
- }
444
- case 'userPhone': {
445
- this.rules[groupItem || item.model].push({
446
- type: 'userPhone',
447
- validator: (rule, value, callback) => {
448
- if (value && !REG_PHONE.test(value)) {
449
- callback(new Error('请输入正确的手机号码'))
450
- } else {
451
- callback()
452
- }
453
- },
454
- message: '请输入正确的手机号码',
455
- trigger: 'blur'
456
- })
457
- break
458
- }
459
- case 'idNumber': {
460
- this.rules[groupItem || item.model].push({
461
- validator: (rule, value, callback) => {
462
- if (value && !checkIdNumber(value)) {
463
- callback(new Error('请输入正确的身份证号码'))
464
- } else {
465
- callback()
466
- }
467
- },
468
- trigger: 'blur'
469
- })
470
- break
471
- }
472
- case 'landlineNumber': {
473
- this.rules[item.model].push({
474
- validator: (rule, value, callback) => {
475
- if (value && !REG_LANDLINE.test(value)) {
476
- callback(new Error('请输入正确的座机号码'))
477
- } else {
478
- callback()
479
- }
480
- },
481
- trigger: 'blur'
482
- })
483
- break
484
- }
485
- // 大于0
486
- case 'greaterThanZero': {
487
- item.numberInput = true
488
- this.rules[item.model].push({
489
- validator: (rule, value, callback) => {
490
- if (isNaN(value) || value <= 0) {
491
- callback(new Error('请输入一个大于0的数字'))
492
- } else {
493
- callback()
494
- }
495
- },
496
- trigger: 'blur'
497
- })
498
- break
499
- }
500
- // 大于等于0
501
- case 'greaterThanOrEqualZero': {
502
- item.numberInput = true
503
- this.rules[item.model].push({
504
- validator: (rule, value, callback) => {
505
- if (isNaN(value) || value < 0) {
506
- callback(new Error('请输入一个大于等于0的数字'))
507
- } else {
508
- callback()
509
- }
510
- },
511
- trigger: 'blur'
512
- })
513
- break
514
- }
515
- case 'stringLength': {
516
- this.rules[item.model].push({
517
- validator: (rule, value, callback) => {
518
- if (value && value.length < item.rule.minLen) {
519
- callback(new Error('长度不能少于' + item.rule.minLen + '个字符'))
520
- } else if (value && value.length > item.rule.maxLen) {
521
- callback(new Error('长度不能超过' + item.rule.maxLen + '个字符'))
522
- } else {
523
- callback()
524
- }
525
- },
526
- trigger: 'blur'
527
- })
528
- break
529
- }
530
- case 'customJs': {
531
- this.rules[item.model].push({
532
- validator: (rule, value, callback) => {
533
- this.customJsValidate(rule, value, callback, item)
534
- },
535
- trigger: 'blur'
536
- })
537
- break
538
- }
539
- }
540
- }
541
- },
542
- customJsValidate (rule, value, callback, item) {
543
- if (item.rule.customValidatorFunc) {
544
- executeStrFunction(item.rule.customValidatorFunc, [rule, value, callback, this.form, item, this.util])
545
- } else {
546
- callback()
547
- }
548
- },
549
- itemDisabled (value) {
550
- return (this.businessType === '新增' && value.addOrEdit === 'edit') ||
551
- (this.businessType === '修改' && value.addOrEdit === 'add')
552
- },
553
- readonly (value) {
554
- return value.addOrEdit === 'readonly'
555
- },
556
- async onSubmit () {
557
- const valid = await this.validateForm()
558
- if (!valid) return false
559
- this.loading = true
560
- const requestForm = this.prepareForm()
561
- await this.appendSilenceAddFields(requestForm)
562
-
563
- if (this.isTableTemp) {
564
- this.$emit('tempTableModify', {
565
- valid: valid,
566
- form: requestForm,
567
- businessType: this.businessType
568
- })
569
- return
570
- }
571
-
572
- const realForm = this.handleFormKeys(requestForm)
573
- if (this.viewMode) {
574
- this.$message.info('预览模式禁止新增和修改')
575
- return false
576
- }
577
-
578
- if (this.$listeners.onSubmit) {
579
- // 交由父级处理
580
- this.$emit('onSubmit', {
581
- businessType: this.businessType,
582
- serviceName: this.serviceName,
583
- realForm: realForm,
584
- currUserName: this.currUser.name,
585
- currUserId: this.currUser.id,
586
- orgId: this.currUser.orgid
587
- })
588
- } else {
589
- this.defaultSubmit(realForm)
590
- }
591
- },
592
-
593
- async asyncSubmit () {
594
- return new Promise((resolve, reject) => {
595
- this.$refs.selectForm.validate(async valid => {
596
- if (!valid) {
597
- reject(new Error('Form validation failed'))
598
- return
599
- }
600
- this.loading = true
601
- const requestForm = this.prepareForm()
602
- await this.appendSilenceAddFields(requestForm)
603
- const realForm = this.handleFormKeys(requestForm)
604
- if (this.businessType === '新增') {
605
- delete realForm.id
606
- }
607
- resolve({
608
- realForm,
609
- businessType: this.businessType,
610
- serviceName: this.serviceName,
611
- currUserName: this.currUser.name,
612
- currUserId: this.currUser.id,
613
- orgId: this.currUser.orgid
614
- })
615
- })
616
- })
617
- },
618
-
619
- validateForm () {
620
- return new Promise((resolve) => {
621
- this.$refs.selectForm.validate(valid => resolve(valid))
622
- })
623
- },
624
-
625
- prepareForm () {
626
- const form = { ...this.form }
627
- for (const key of Object.keys(form)) {
628
- const value = form[key]
629
- if (value === null || (typeof value === 'object' && Object.keys(value).length === 0)) {
630
- form[key] = undefined
631
- }
632
- }
633
- return form
634
- },
635
-
636
- async appendSilenceAddFields (form) {
637
- if (this.businessType === '新增') {
638
- for (const item of this.silenceAddJsonData) {
639
- switch (item.silencePurpose) {
640
- case 'createTime':
641
- form[item.model] = formatDate('now')
642
- break
643
- case 'operator':
644
- form[item.model] = this.currUser.name
645
- break
646
- case 'operatorId':
647
- form[item.model] = this.currUser.id
648
- break
649
- case 'orgId':
650
- form[item.model] = this.currUser.orgid
651
- break
652
- case 'orgName':
653
- form[item.model] = this.currUser.orgs
654
- break
655
- case 'depId':
656
- form[item.model] = this.currUser.depids
657
- break
658
- case 'depName':
659
- form[item.model] = this.currUser.deps
660
- break
661
- }
662
- }
663
- for (const item of this.silenceAddJsonData.filter((item) => item.silencePurpose === 'customize')) {
664
- form[item.model] = await runLogic(item.silenceSource, form, this.serviceName)
665
- }
666
- }
667
- },
668
-
669
- handleFormKeys (form) {
670
- const realForm = {}
671
- for (const key of Object.keys(form)) {
672
- const value = form[key]
673
- const extraFormKeyTagIndex = key.indexOf('@')
674
- if (extraFormKeyTagIndex !== -1) {
675
- const extraFormKey = key.substring(0, extraFormKeyTagIndex)
676
- const realKey = key.substring(extraFormKeyTagIndex + 1)
677
- if (!realForm[extraFormKey]) {
678
- realForm[extraFormKey] = {}
679
- }
680
- realForm[extraFormKey][realKey] = value
681
- } else {
682
- const realKey = this.isKeyHandle ? this.getRealKey(key) : key
683
- // 如果发生重名,不覆盖,把key的别名带上
684
- if (realForm[realKey]) {
685
- realForm[key] = value
686
- } else {
687
- realForm[realKey] = value
688
- }
689
- }
690
- }
691
- return realForm
692
- },
693
- // 默认提交事件
694
- defaultSubmit (realForm, callback) {
695
- // 新增移除id
696
- if (this.businessType === '新增') {
697
- delete realForm.id
698
- }
699
- // 组织请求
700
- const requestParameters = {
701
- queryParamsName: this.configName,
702
- queryParams: this.configContent,
703
- form: realForm,
704
- businessType: this.businessType,
705
- operator: this.currUser.name
706
- }
707
- addOrModify(requestParameters, this.serviceName, this.env === 'dev').then(data => {
708
- this.$message.success(this.businessType + '成功!')
709
- // commit
710
- this.$emit('afterSubmit', { type: this.businessType, id: data.id, form: requestParameters.form })
711
- }).catch(e => {
712
- this.$message.error(this.businessType + '失败:' + e)
713
- }).finally(() => {
714
- this.loading = false
715
- if (callback) {
716
- callback()
717
- }
718
- })
719
- },
720
- // 获取表单字段实际值
721
- getRealKey (key) {
722
- if (this.isHandleFormKey) {
723
- return key.substring(key.indexOf('_') + 1)
724
- } else {
725
- return key
726
- }
727
- },
728
- /**
729
- * 获取被修改记录数据
730
- * @param modifyModelData 被修改记录的数据
731
- */
732
- getModifyModelData (modifyModelData) {
733
- if (modifyModelData.primaryKeyData) {
734
- this.form = Object.assign(this.form, modifyModelData.primaryKeyData)
735
- }
736
- // 对动态简易表单项特殊处理
737
- for (const key in modifyModelData.data) {
738
- const realKey = this.isKeyHandle ? this.getRealKey(key) : key
739
- if (this.simpleFormJsonData[realKey]) {
740
- const extraForm = JSON.parse(modifyModelData.data[key])
741
- for (const key in extraForm) {
742
- const model = realKey + '@' + key
743
- this.form[model] = extraForm[key]
744
- }
745
- }
746
- }
747
- // 对普通表单项处理
748
- for (let i = 0; i < this.realJsonData.length; i++) {
749
- if (['FilesId', 'Images'].includes(this.realJsonData[i])) {
750
- // 附件需要跳过 因为会通过 modifyModelData中的files,images属性给upload赋值
751
- // 新增修改表单每次提交时只会提交最新添加的文件
752
- continue
753
- }
754
- const item = this.realJsonData[i]
755
- if (modifyModelData.data[item.model] || modifyModelData.data[item.model] === 0) {
756
- if (modifyModelData.data[item.model] instanceof Array) {
757
- this.form[item.model] = modifyModelData.data[item.model]
758
- } else {
759
- this.form[item.model] = modifyModelData.data[item.model] + ''
760
- }
761
- }
762
- }
763
- // 对分组表单进行处理
764
- for (let i = 0; i < this.groupJsonData.length; i++) {
765
- const item = this.groupJsonData[i]
766
- try {
767
- if (modifyModelData.data[item.model]) {
768
- this.form[item.model] = JSON.parse(modifyModelData.data[item.model])
769
- }
770
- } catch (e) {
771
- }
772
- }
773
- // 追加版本号信息
774
- for (const item of this.versionJsonData) {
775
- if (!modifyModelData.data[item.model]) {
776
- this.form[item.model] = 0
777
- } else {
778
- this.form[item.model] = modifyModelData.data[item.model] + ''
779
- }
780
- }
781
- },
782
- setForm (obj) {
783
- this.form = Object.assign(this.form, obj)
784
- },
785
- emitFunc (func, data) {
786
- this.$emit('x-form-item-emit-func', func, data)
787
- },
788
- close () {
789
- this.loaded = false
790
- }
791
- }
792
- }
793
- </script>
794
-
795
- <style scoped>
796
- :deep(.ant-form-inline .ant-form-item ) {
797
- display: block !important;
798
- }
799
-
800
- :deep(.ant-form-item-with-help) {
801
- margin-bottom: 0;
802
- }
803
- </style>
1
+ <template>
2
+ <div>
3
+ <a-form-model
4
+ v-if="loaded"
5
+ ref="selectForm"
6
+ :zIndex="1001"
7
+ :model="form"
8
+ v-bind="formItemLayout"
9
+ :layout="layout"
10
+ :rules="rules">
11
+ <a-row :gutter="16" type="flex">
12
+ <x-form-item
13
+ v-for="(item, index) in realJsonData"
14
+ :key="index"
15
+ :attr="item"
16
+ :disabled="itemDisabled(item)"
17
+ :read-only="readonly(item)"
18
+ :files="files"
19
+ :style="layout === 'inline' ? { marginTop:'5px' } : undefined"
20
+ :form="form"
21
+ :images="images"
22
+ :service-name="serviceName"
23
+ mode="新增/修改"
24
+ :layout="layout"
25
+ :get-data-params="getDataParams"
26
+ :env="env"
27
+ @x-form-item-emit-func="emitFunc"
28
+ :setForm="setForm"
29
+ />
30
+ </a-row>
31
+ <a-row :gutter="16" v-for="(groupItem, groupIndex) in groupJsonData" :key="groupIndex">
32
+ <a-card v-if="groupItem.groupItems.length > 0" :title="groupItem.name" :bordered="false" size="small">
33
+ <x-form-item
34
+ v-for="(item, index) in groupItem.groupItems"
35
+ :key="index"
36
+ :attr="item"
37
+ :disabled="itemDisabled(item)"
38
+ :readonly="readonly(item)"
39
+ :files="files"
40
+ :style="layout ==='inline'?{marginTop:'5px'}:undefined"
41
+ :form="form[groupItem.model]"
42
+ :images="images"
43
+ :service-name="serviceName"
44
+ mode="新增/修改"
45
+ :get-data-params="getDataParams"
46
+ :env="env"
47
+ :setForm="setForm"
48
+ />
49
+ </a-card>
50
+ <template v-else>
51
+ <slot
52
+ name="groupFormItems"
53
+ :form="form"
54
+ :model="groupItem.model"
55
+ :rules="rules"
56
+ :modifyModelData="modifyModelData"></slot>
57
+ </template>
58
+ </a-row>
59
+ <a-row :gutter="16" v-for="(item, key) in simpleFormJsonData" :key="'row' + key">
60
+ <a-card v-if="item.value.length > 0" :title="item.name" :bordered="false" size="small">
61
+ <x-form-item
62
+ v-for="(formItem, formItemIndex) in item.value"
63
+ :key="key + formItemIndex"
64
+ :attr="formItem"
65
+ :disabled="itemDisabled(formItem)"
66
+ :readonly="readonly(formItem)"
67
+ :files="files"
68
+ :style="layout ==='inline'?{marginTop:'5px'}:undefined"
69
+ :form="form[groupItem.model]"
70
+ :images="images"
71
+ :service-name="serviceName"
72
+ mode="新增/修改"
73
+ :get-data-params="getDataParams"
74
+ :env="env"
75
+ :setForm="setForm"
76
+ />
77
+ </a-card>
78
+ </a-row>
79
+ <a-row type="flex" justify="end">
80
+ <a-button v-if="showSubmitBtn" :loading="loading" type="primary" @click="onSubmit()">提交</a-button>
81
+ </a-row>
82
+ </a-form-model>
83
+ </div>
84
+ </template>
85
+ <script>
86
+ import XFormItem from '@vue2-client/base-client/components/common/XForm/XFormItem'
87
+ import { formatDate } from '@vue2-client/utils/util'
88
+ import { mapState } from 'vuex'
89
+ import { addOrModify, getConfigByName, getConfigByNameAsync, runLogic } from '@vue2-client/services/api/common'
90
+ import { checkIdNumber, REG_EMAIL, REG_LANDLINE, REG_PHONE } from '@vue2-client/utils/reg'
91
+ import moment from 'moment/moment'
92
+ import { executeStrFunction } from '@vue2-client/utils/runEvalFunction'
93
+
94
+ export default {
95
+ name: 'XAddNativeForm',
96
+ components: {
97
+ XFormItem
98
+ },
99
+ props: {},
100
+ data () {
101
+ return {
102
+ // 预览模式
103
+ viewMode: false,
104
+ // 是否处理表单Key值
105
+ isHandleFormKey: true,
106
+ // 内容加载是否完成
107
+ loaded: false,
108
+ // 业务类型
109
+ businessType: '',
110
+ // 业务标题
111
+ title: '',
112
+ // 新增或修改业务是否执行中
113
+ loading: false,
114
+ // 表单Model
115
+ form: {},
116
+ // 配置名称
117
+ configName: undefined,
118
+ // 配置内容,用于查询配置生成器的预览
119
+ configContent: undefined,
120
+ // 表单项集合
121
+ formItems: [],
122
+ // 服务名称
123
+ serviceName: undefined,
124
+ // 是否显示提交按钮
125
+ showSubmitBtn: true,
126
+ // 修改有文件的表单时使用
127
+ files: [],
128
+ images: [],
129
+ // 校验
130
+ rules: {},
131
+ // 调用logic获取数据源的追加参数
132
+ getDataParams: {},
133
+ // 是否为临时表
134
+ isTableTemp: false,
135
+ // 是否处理表单key
136
+ isKeyHandle: true,
137
+ // 动态简易表单集合
138
+ simpleFormJsonData: {},
139
+ // 待修改的数据集
140
+ modifyModelData: {},
141
+ // 当前环境
142
+ env: 'prod',
143
+ // 表单模式 horizontal | vertical | inline
144
+ layout: 'horizontal'
145
+ }
146
+ },
147
+ computed: {
148
+ // 过滤出用于新增/修改场景的表单项
149
+ realJsonData: function () {
150
+ return this.formItems.filter((item) => {
151
+ return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
152
+ })
153
+ },
154
+ // 过滤出用于新增/修改场景的表单项
155
+ groupJsonData: function () {
156
+ return this.formItems.filter((item) => {
157
+ return item.type === 'group'
158
+ }).map((item) => {
159
+ item.groupItems = item.groupItems.filter((item) => {
160
+ return item.addOrEdit && item.addOrEdit !== 'no' && item.addOrEdit !== 'silenceAdd' && item.addOrEdit !== 'version' && !this.itemDisabled(item)
161
+ }).map((groupItem) => {
162
+ // 只保留第一个下划线后面的内容
163
+ // 多层校验规则需要将prop设置为 key1.key2.....
164
+ groupItem.prop = `${item.model}.${groupItem.model.substring(groupItem.model.indexOf('_') + 1)}`
165
+ groupItem.model = groupItem.model.substring(groupItem.model.indexOf('_') + 1)
166
+ return groupItem
167
+ })
168
+ return item
169
+ }
170
+ )
171
+ },
172
+ // 过滤出用于静默新增场景的表单项
173
+ silenceAddJsonData: function () {
174
+ return this.formItems.filter(function (item) {
175
+ return item.addOrEdit === 'silenceAdd'
176
+ })
177
+ },
178
+ // 过滤出版本号表单项
179
+ versionJsonData: function () {
180
+ return this.formItems.filter(function (item) {
181
+ return item.addOrEdit === 'version'
182
+ })
183
+ },
184
+ formItemLayout () {
185
+ if (this.layout === 'horizontal') {
186
+ return {
187
+ labelCol: { span: 4, offset: 2 },
188
+ wrapperCol: { span: 14 },
189
+ }
190
+ }
191
+ if (this.layout === 'vertical') {
192
+ return {}
193
+ }
194
+ return {
195
+ labelCol: { span: 6 },
196
+ wrapperCol: { span: 18 },
197
+ }
198
+ },
199
+ ...mapState('account', { currUser: 'user' })
200
+ },
201
+ methods: {
202
+ runLogic,
203
+ getConfigByNameAsync,
204
+ getConfigByName,
205
+ init (params) {
206
+ const {
207
+ configName, configContent, formItems, formJson, viewMode, isHandleFormKey = true,
208
+ showSubmitBtn = true, serviceName, isTableTemp = false, isKeyHandle = true,
209
+ modifyModelData = {}, businessType, title, fixedAddForm = {}, getDataParams = {},
210
+ simpleFormJsonData = {}, env = 'prod', layout, xAddFormLayout = 'horizontal'
211
+ } = params
212
+ this.loaded = false
213
+ // 兼容需要省略 传递 layout: res.xAddFormLayout 可以使用 ...res 展开运算符 直接转递
214
+ if (xAddFormLayout && !layout) {
215
+ this.layout = xAddFormLayout
216
+ } else {
217
+ this.layout = layout
218
+ }
219
+ this.configName = configName
220
+ this.configContent = configContent
221
+ this.formItems = this.getFromItem(formItems, formJson)
222
+ this.viewMode = viewMode
223
+ this.isHandleFormKey = isHandleFormKey
224
+ this.showSubmitBtn = showSubmitBtn
225
+ this.serviceName = serviceName
226
+ this.businessType = businessType
227
+ this.title = title
228
+ this.getDataParams = getDataParams
229
+ this.simpleFormJsonData = simpleFormJsonData
230
+ this.env = env
231
+ this.isTableTemp = isTableTemp
232
+ this.isKeyHandle = isKeyHandle
233
+ // 如果 fixedAddForm 有 selected_id 值,并且设置了处理表单key值,则多给 selected_id 加前缀 避免处理错误
234
+ if (fixedAddForm.selected_id && this.isKeyHandle) {
235
+ fixedAddForm._selected_id = fixedAddForm.selected_id
236
+ delete fixedAddForm.selected_id
237
+ }
238
+ // 设置普通表单项的相关参数
239
+ const formData = Object.assign({}, fixedAddForm)
240
+ for (let i = 0; i < this.realJsonData.length; i++) {
241
+ const item = this.realJsonData[i]
242
+ this.setFormProps(formData, item, null)
243
+ }
244
+ // 设置表单分组项目相关参数
245
+ for (let i = 0; i < this.groupJsonData.length; i++) {
246
+ const groupItem = this.groupJsonData[i]
247
+ formData[groupItem.model] = {}
248
+ for (let j = 0; j < groupItem.groupItems.length; j++) {
249
+ const item = groupItem.groupItems[j]
250
+ this.setFormProps(formData[groupItem.model], item, item.prop)
251
+ }
252
+ }
253
+ // 设置动态简易表单项的相关参数
254
+ for (const key in this.simpleFormJsonData) {
255
+ for (const item of this.simpleFormJsonData[key].value) {
256
+ item.model = key + '@' + item.model
257
+ this.setFormProps(formData, item, null)
258
+ }
259
+ }
260
+
261
+ this.form = formData
262
+ // 修改场景下对表单项赋值
263
+ if (modifyModelData && modifyModelData.data) {
264
+ this.modifyModelData = modifyModelData
265
+ if (Object.keys(modifyModelData.data).length > 0) {
266
+ this.getModifyModelData(modifyModelData)
267
+ }
268
+ }
269
+ // 处理表单得附件
270
+ if (modifyModelData && modifyModelData.files) {
271
+ this.files = modifyModelData.files
272
+ }
273
+ if (modifyModelData && modifyModelData.images) {
274
+ this.images = modifyModelData.images
275
+ }
276
+ this.loaded = true
277
+ },
278
+ // 兼容需要省略 传递 [formItems: res.formJson ] 可以使用 ...res 展开运算符 直接转递
279
+ getFromItem (formItems, formJson) {
280
+ const _formItems = formItems || formJson
281
+ if (typeof formItems === 'string') {
282
+ return JSON.parse(_formItems)
283
+ } else {
284
+ return JSON.parse(JSON.stringify(_formItems))
285
+ }
286
+ },
287
+ // 时间组件赋默认值
288
+ getDateRange (type, defaultValue) {
289
+ // const format = type === 'datePicker' ? 'YYYY-MM-DD' : 'YYYY-MM-DD HH:mm:ss'
290
+ const format = 'YYYY-MM-DD HH:mm:ss'
291
+ let start
292
+ switch (defaultValue) {
293
+ case 'curYear':
294
+ start = moment().startOf('year').format(format)
295
+ break
296
+ case 'curMonth':
297
+ start = moment().startOf('month').format(format)
298
+ break
299
+ case 'curDay':
300
+ start = moment().startOf('day').format(format)
301
+ break
302
+ default:
303
+ return defaultValue
304
+ }
305
+ return start
306
+ },
307
+ setFormProps (formData, item, groupItem) {
308
+ if (formData[item.model] === undefined || formData[item.model] === null) {
309
+ formData[item.model] = undefined
310
+ }
311
+ if (!formData[item.model] && item.formDefault) {
312
+ if (['datePicker', 'rangePicker', 'yearPicker', 'monthPicker'].includes(item.type)) {
313
+ formData[item.model] = this.getDateRange(item.type, item.formDefault)
314
+ } else if (['treeSelect', 'select', 'checkbox'].includes(item.type) && ['curOrgId', 'curDepId', 'curUserId'].includes(item.formDefault)) {
315
+ if (item.formDefault === 'curOrgId') {
316
+ formData[item.model] = item.type === 'select' ? this.currUser.orgid : [this.currUser.orgid]
317
+ }
318
+ if (item.formDefault === 'curDepId') {
319
+ formData[item.model] = item.type === 'select' ? this.currUser.depids : [this.currUser.depids]
320
+ }
321
+ if (item.formDefault === 'curUserId') {
322
+ formData[item.model] = item.type === 'select' ? this.currUser.id : [this.currUser.id]
323
+ }
324
+ } else {
325
+ formData[item.model] = item.formDefault
326
+ }
327
+ }
328
+ // 处理表单校验情况
329
+ if (item.rule) {
330
+ if (groupItem) {
331
+ this.rules[groupItem] = []
332
+ } else {
333
+ this.rules[item.model] = []
334
+ }
335
+ const required = item.rule.required ? item.rule.required === true || item.rule.required === 'true' : false
336
+ let trigger
337
+ let message
338
+ if (required) {
339
+ switch (item.type) {
340
+ case 'select':
341
+ case 'checkbox':
342
+ case 'radio':
343
+ case 'treeSelect':
344
+ case 'rangePicker':
345
+ case 'monthPicker':
346
+ case 'yearPicker':
347
+ case 'datePicker':
348
+ case 'file':
349
+ case 'image':
350
+ case 'citySelect':
351
+ case 'addressSearch':
352
+ case 'personSetting':
353
+ message = '请选择' + item.name
354
+ trigger = 'change'
355
+ break
356
+ default:
357
+ message = '请输入' + item.name
358
+ trigger = 'blur'
359
+ }
360
+ if (groupItem) {
361
+ this.rules[groupItem].push({
362
+ required: true,
363
+ message: message,
364
+ trigger: trigger
365
+ })
366
+ } else {
367
+ this.rules[item.model].push({
368
+ required: true,
369
+ message: message,
370
+ trigger: trigger
371
+ })
372
+ }
373
+ }
374
+
375
+ switch (item.rule.type) {
376
+ case 'number':
377
+ case 'integer':
378
+ case 'float':
379
+ // eslint-disable-next-line no-case-declarations
380
+ let defaultValue
381
+ // eslint-disable-next-line no-case-declarations
382
+ let message
383
+ switch (item.rule.type) {
384
+ case 'number':
385
+ item.numberInput = true
386
+ message = '数字'
387
+ defaultValue = 0
388
+ break
389
+ case 'integer':
390
+ item.numberInput = true
391
+ message = '整数'
392
+ defaultValue = 0
393
+ break
394
+ case 'float':
395
+ item.numberInput = true
396
+ message = '小数'
397
+ defaultValue = 0.0
398
+ break
399
+ }
400
+ if (groupItem) {
401
+ this.rules[groupItem].push({
402
+ type: item.rule.type,
403
+ message: item.name + '必须为' + message,
404
+ transform: (value) => {
405
+ if (value && value.length !== 0) {
406
+ return Number(value)
407
+ } else {
408
+ return defaultValue
409
+ }
410
+ },
411
+ trigger: 'blur'
412
+ })
413
+ } else {
414
+ this.rules[item.model].push({
415
+ type: item.rule.type,
416
+ message: item.name + '必须为' + message,
417
+ transform: (value) => {
418
+ if (value && value.length !== 0) {
419
+ return Number(value)
420
+ } else {
421
+ return defaultValue
422
+ }
423
+ },
424
+ trigger: 'blur'
425
+ })
426
+ }
427
+ break
428
+ case 'email': {
429
+ const validator = (rule, value, callback) => {
430
+ if (value && !REG_EMAIL.test(value)) {
431
+ callback(new Error('请输入正确的邮箱地址'))
432
+ } else {
433
+ callback()
434
+ }
435
+ }
436
+ this.rules[groupItem || item.model].push({
437
+ type: 'email',
438
+ validator: validator,
439
+ message: '请输入正确的邮箱地址',
440
+ trigger: 'blur'
441
+ })
442
+ break
443
+ }
444
+ case 'userPhone': {
445
+ this.rules[groupItem || item.model].push({
446
+ type: 'userPhone',
447
+ validator: (rule, value, callback) => {
448
+ if (value && !REG_PHONE.test(value)) {
449
+ callback(new Error('请输入正确的手机号码'))
450
+ } else {
451
+ callback()
452
+ }
453
+ },
454
+ message: '请输入正确的手机号码',
455
+ trigger: 'blur'
456
+ })
457
+ break
458
+ }
459
+ case 'idNumber': {
460
+ this.rules[groupItem || item.model].push({
461
+ validator: (rule, value, callback) => {
462
+ if (value && !checkIdNumber(value)) {
463
+ callback(new Error('请输入正确的身份证号码'))
464
+ } else {
465
+ callback()
466
+ }
467
+ },
468
+ trigger: 'blur'
469
+ })
470
+ break
471
+ }
472
+ case 'landlineNumber': {
473
+ this.rules[item.model].push({
474
+ validator: (rule, value, callback) => {
475
+ if (value && !REG_LANDLINE.test(value)) {
476
+ callback(new Error('请输入正确的座机号码'))
477
+ } else {
478
+ callback()
479
+ }
480
+ },
481
+ trigger: 'blur'
482
+ })
483
+ break
484
+ }
485
+ // 大于0
486
+ case 'greaterThanZero': {
487
+ item.numberInput = true
488
+ this.rules[item.model].push({
489
+ validator: (rule, value, callback) => {
490
+ if (isNaN(value) || value <= 0) {
491
+ callback(new Error('请输入一个大于0的数字'))
492
+ } else {
493
+ callback()
494
+ }
495
+ },
496
+ trigger: 'blur'
497
+ })
498
+ break
499
+ }
500
+ // 大于等于0
501
+ case 'greaterThanOrEqualZero': {
502
+ item.numberInput = true
503
+ this.rules[item.model].push({
504
+ validator: (rule, value, callback) => {
505
+ if (isNaN(value) || value < 0) {
506
+ callback(new Error('请输入一个大于等于0的数字'))
507
+ } else {
508
+ callback()
509
+ }
510
+ },
511
+ trigger: 'blur'
512
+ })
513
+ break
514
+ }
515
+ case 'stringLength': {
516
+ this.rules[item.model].push({
517
+ validator: (rule, value, callback) => {
518
+ if (value && value.length < item.rule.minLen) {
519
+ callback(new Error('长度不能少于' + item.rule.minLen + '个字符'))
520
+ } else if (value && value.length > item.rule.maxLen) {
521
+ callback(new Error('长度不能超过' + item.rule.maxLen + '个字符'))
522
+ } else {
523
+ callback()
524
+ }
525
+ },
526
+ trigger: 'blur'
527
+ })
528
+ break
529
+ }
530
+ case 'customJs': {
531
+ this.rules[item.model].push({
532
+ validator: (rule, value, callback) => {
533
+ this.customJsValidate(rule, value, callback, item)
534
+ },
535
+ trigger: 'blur'
536
+ })
537
+ break
538
+ }
539
+ }
540
+ }
541
+ },
542
+ customJsValidate (rule, value, callback, item) {
543
+ if (item.rule.customValidatorFunc) {
544
+ executeStrFunction(item.rule.customValidatorFunc, [rule, value, callback, this.form, item, this.util])
545
+ } else {
546
+ callback()
547
+ }
548
+ },
549
+ itemDisabled (value) {
550
+ return (this.businessType === '新增' && value.addOrEdit === 'edit') ||
551
+ (this.businessType === '修改' && value.addOrEdit === 'add')
552
+ },
553
+ readonly (value) {
554
+ return value.addOrEdit === 'readonly'
555
+ },
556
+ async onSubmit () {
557
+ const valid = await this.validateForm()
558
+ if (!valid) return false
559
+ this.loading = true
560
+ const requestForm = this.prepareForm()
561
+ await this.appendSilenceAddFields(requestForm)
562
+
563
+ if (this.isTableTemp) {
564
+ this.$emit('tempTableModify', {
565
+ valid: valid,
566
+ form: requestForm,
567
+ businessType: this.businessType
568
+ })
569
+ return
570
+ }
571
+
572
+ const realForm = this.handleFormKeys(requestForm)
573
+ if (this.viewMode) {
574
+ this.$message.info('预览模式禁止新增和修改')
575
+ return false
576
+ }
577
+
578
+ if (this.$listeners.onSubmit) {
579
+ // 交由父级处理
580
+ this.$emit('onSubmit', {
581
+ businessType: this.businessType,
582
+ serviceName: this.serviceName,
583
+ realForm: realForm,
584
+ currUserName: this.currUser.name,
585
+ currUserId: this.currUser.id,
586
+ orgId: this.currUser.orgid
587
+ })
588
+ } else {
589
+ this.defaultSubmit(realForm)
590
+ }
591
+ },
592
+
593
+ async asyncSubmit () {
594
+ return new Promise((resolve, reject) => {
595
+ this.$refs.selectForm.validate(async valid => {
596
+ if (!valid) {
597
+ reject(new Error('Form validation failed'))
598
+ return
599
+ }
600
+ this.loading = true
601
+ const requestForm = this.prepareForm()
602
+ await this.appendSilenceAddFields(requestForm)
603
+ const realForm = this.handleFormKeys(requestForm)
604
+ if (this.businessType === '新增') {
605
+ delete realForm.id
606
+ }
607
+ resolve({
608
+ realForm,
609
+ businessType: this.businessType,
610
+ serviceName: this.serviceName,
611
+ currUserName: this.currUser.name,
612
+ currUserId: this.currUser.id,
613
+ orgId: this.currUser.orgid
614
+ })
615
+ })
616
+ })
617
+ },
618
+
619
+ validateForm () {
620
+ return new Promise((resolve) => {
621
+ this.$refs.selectForm.validate(valid => resolve(valid))
622
+ })
623
+ },
624
+
625
+ prepareForm () {
626
+ const form = { ...this.form }
627
+ for (const key of Object.keys(form)) {
628
+ const value = form[key]
629
+ if (value === null || (typeof value === 'object' && Object.keys(value).length === 0)) {
630
+ form[key] = undefined
631
+ }
632
+ }
633
+ return form
634
+ },
635
+
636
+ async appendSilenceAddFields (form) {
637
+ if (this.businessType === '新增') {
638
+ for (const item of this.silenceAddJsonData) {
639
+ switch (item.silencePurpose) {
640
+ case 'createTime':
641
+ form[item.model] = formatDate('now')
642
+ break
643
+ case 'operator':
644
+ form[item.model] = this.currUser.name
645
+ break
646
+ case 'operatorId':
647
+ form[item.model] = this.currUser.id
648
+ break
649
+ case 'orgId':
650
+ form[item.model] = this.currUser.orgid
651
+ break
652
+ case 'orgName':
653
+ form[item.model] = this.currUser.orgs
654
+ break
655
+ case 'depId':
656
+ form[item.model] = this.currUser.depids
657
+ break
658
+ case 'depName':
659
+ form[item.model] = this.currUser.deps
660
+ break
661
+ }
662
+ }
663
+ for (const item of this.silenceAddJsonData.filter((item) => item.silencePurpose === 'customize')) {
664
+ form[item.model] = await runLogic(item.silenceSource, form, this.serviceName)
665
+ }
666
+ }
667
+ },
668
+
669
+ handleFormKeys (form) {
670
+ const realForm = {}
671
+ for (const key of Object.keys(form)) {
672
+ const value = form[key]
673
+ const extraFormKeyTagIndex = key.indexOf('@')
674
+ if (extraFormKeyTagIndex !== -1) {
675
+ const extraFormKey = key.substring(0, extraFormKeyTagIndex)
676
+ const realKey = key.substring(extraFormKeyTagIndex + 1)
677
+ if (!realForm[extraFormKey]) {
678
+ realForm[extraFormKey] = {}
679
+ }
680
+ realForm[extraFormKey][realKey] = value
681
+ } else {
682
+ const realKey = this.isKeyHandle ? this.getRealKey(key) : key
683
+ // 如果发生重名,不覆盖,把key的别名带上
684
+ if (realForm[realKey]) {
685
+ realForm[key] = value
686
+ } else {
687
+ realForm[realKey] = value
688
+ }
689
+ }
690
+ }
691
+ return realForm
692
+ },
693
+ // 默认提交事件
694
+ defaultSubmit (realForm, callback) {
695
+ // 新增移除id
696
+ if (this.businessType === '新增') {
697
+ delete realForm.id
698
+ }
699
+ // 组织请求
700
+ const requestParameters = {
701
+ queryParamsName: this.configName,
702
+ queryParams: this.configContent,
703
+ form: realForm,
704
+ businessType: this.businessType,
705
+ operator: this.currUser.name
706
+ }
707
+ addOrModify(requestParameters, this.serviceName, this.env === 'dev').then(data => {
708
+ this.$message.success(this.businessType + '成功!')
709
+ // commit
710
+ this.$emit('afterSubmit', { type: this.businessType, id: data.id, form: requestParameters.form })
711
+ }).catch(e => {
712
+ this.$message.error(this.businessType + '失败:' + e)
713
+ }).finally(() => {
714
+ this.loading = false
715
+ if (callback) {
716
+ callback()
717
+ }
718
+ })
719
+ },
720
+ // 获取表单字段实际值
721
+ getRealKey (key) {
722
+ if (this.isHandleFormKey) {
723
+ return key.substring(key.indexOf('_') + 1)
724
+ } else {
725
+ return key
726
+ }
727
+ },
728
+ /**
729
+ * 获取被修改记录数据
730
+ * @param modifyModelData 被修改记录的数据
731
+ */
732
+ getModifyModelData (modifyModelData) {
733
+ if (modifyModelData.primaryKeyData) {
734
+ this.form = Object.assign(this.form, modifyModelData.primaryKeyData)
735
+ }
736
+ // 对动态简易表单项特殊处理
737
+ for (const key in modifyModelData.data) {
738
+ const realKey = this.isKeyHandle ? this.getRealKey(key) : key
739
+ if (this.simpleFormJsonData[realKey]) {
740
+ const extraForm = JSON.parse(modifyModelData.data[key])
741
+ for (const key in extraForm) {
742
+ const model = realKey + '@' + key
743
+ this.form[model] = extraForm[key]
744
+ }
745
+ }
746
+ }
747
+ // 对普通表单项处理
748
+ for (let i = 0; i < this.realJsonData.length; i++) {
749
+ if (['FilesId', 'Images'].includes(this.realJsonData[i])) {
750
+ // 附件需要跳过 因为会通过 modifyModelData中的files,images属性给upload赋值
751
+ // 新增修改表单每次提交时只会提交最新添加的文件
752
+ continue
753
+ }
754
+ const item = this.realJsonData[i]
755
+ if (modifyModelData.data[item.model] || modifyModelData.data[item.model] === 0) {
756
+ if (modifyModelData.data[item.model] instanceof Array) {
757
+ this.form[item.model] = modifyModelData.data[item.model]
758
+ } else {
759
+ this.form[item.model] = modifyModelData.data[item.model] + ''
760
+ }
761
+ }
762
+ }
763
+ // 对分组表单进行处理
764
+ for (let i = 0; i < this.groupJsonData.length; i++) {
765
+ const item = this.groupJsonData[i]
766
+ try {
767
+ if (modifyModelData.data[item.model]) {
768
+ this.form[item.model] = JSON.parse(modifyModelData.data[item.model])
769
+ }
770
+ } catch (e) {
771
+ }
772
+ }
773
+ // 追加版本号信息
774
+ for (const item of this.versionJsonData) {
775
+ if (!modifyModelData.data[item.model]) {
776
+ this.form[item.model] = 0
777
+ } else {
778
+ this.form[item.model] = modifyModelData.data[item.model] + ''
779
+ }
780
+ }
781
+ },
782
+ setForm (obj) {
783
+ this.form = Object.assign(this.form, obj)
784
+ },
785
+ emitFunc (func, data) {
786
+ this.$emit('x-form-item-emit-func', func, data)
787
+ },
788
+ close () {
789
+ this.loaded = false
790
+ }
791
+ }
792
+ }
793
+ </script>
794
+
795
+ <style scoped>
796
+ :deep(.ant-form-inline .ant-form-item ) {
797
+ display: block !important;
798
+ }
799
+
800
+ :deep(.ant-form-item-with-help) {
801
+ margin-bottom: 0;
802
+ }
803
+ </style>