vue2-client 1.16.23 → 1.16.25

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 (333) hide show
  1. package/.cursorrules +19 -19
  2. package/.env.apply +19 -19
  3. package/.env.gaslink +19 -19
  4. package/.env.his +19 -19
  5. package/.env.liuli +20 -20
  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/docs/LowCode/lowcode.md +155 -155
  11. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  12. package/docs/index.md +30 -30
  13. package/index.js +31 -31
  14. package/jest-transform-stub.js +8 -8
  15. package/jest.setup.js +7 -7
  16. package/jsconfig.json +19 -19
  17. package/package.json +112 -112
  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/src/assets/img/querySlotDemo.svg +15 -15
  54. package/src/assets/svg/badtwo.svg +1 -1
  55. package/src/assets/svg/goodtwo.svg +1 -1
  56. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  57. package/src/base-client/components/AI/demo.vue +31 -31
  58. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  59. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  60. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  61. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  62. package/src/base-client/components/common/CitySelect/CitySelect.vue +1 -1
  63. package/src/base-client/components/common/CitySelect/index.js +3 -3
  64. package/src/base-client/components/common/CitySelect/index.md +109 -109
  65. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  66. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  67. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  68. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  69. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  70. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  71. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  72. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  73. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  74. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  75. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  76. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  77. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  78. package/src/base-client/components/common/HIS/HAddNativeForm/HAddNativeForm.vue +478 -478
  79. package/src/base-client/components/common/HIS/HAddNativeForm/index.js +3 -3
  80. package/src/base-client/components/common/HIS/HButtons/HButtons.vue +365 -365
  81. package/src/base-client/components/common/HIS/HFormTable/HFormTable.vue +219 -219
  82. package/src/base-client/components/common/HIS/HTab/HTab.vue +293 -293
  83. package/src/base-client/components/common/HIS/demo.vue +54 -54
  84. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  85. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  86. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  87. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  88. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  89. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  90. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  91. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  92. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  93. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  94. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  95. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  96. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  97. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  98. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  99. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  100. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  101. package/src/base-client/components/common/Recording/index.js +3 -3
  102. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  103. package/src/base-client/components/common/Tree/index.js +2 -2
  104. package/src/base-client/components/common/Upload/index.js +3 -3
  105. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  106. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  107. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  108. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  109. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  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 +94 -94
  113. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  114. package/src/base-client/components/common/XButtons/index.js +3 -3
  115. package/src/base-client/components/common/XButtons/index.md +61 -61
  116. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  117. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  118. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  119. package/src/base-client/components/common/XDataCard/index.js +3 -3
  120. package/src/base-client/components/common/XDataCard/index.md +1 -1
  121. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  122. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  123. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  124. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  125. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  126. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  127. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  128. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  129. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  130. package/src/base-client/components/common/XForm/index.md +178 -178
  131. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  132. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  133. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  134. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  135. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  136. package/src/base-client/components/common/XFormTable/index.md +92 -92
  137. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  138. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  139. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  140. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  141. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  142. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  143. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  144. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  145. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  146. package/src/base-client/components/common/XPrint/index.vue +97 -97
  147. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  148. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  149. package/src/base-client/components/common/XReport/index.js +3 -3
  150. package/src/base-client/components/common/XReport/print.js +186 -186
  151. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  152. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +813 -813
  153. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  154. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  155. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  156. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  157. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  158. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  159. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  160. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  161. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  162. package/src/base-client/components/common/XStepView/index.js +3 -3
  163. package/src/base-client/components/common/XStepView/index.md +31 -31
  164. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  165. package/src/base-client/components/common/XTab/index.js +3 -3
  166. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  167. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  168. package/src/base-client/components/common/XTable/index.md +255 -255
  169. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  170. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  171. package/src/base-client/components/common/XTree/index.js +3 -3
  172. package/src/base-client/components/common/XTree/index.md +36 -36
  173. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  174. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  175. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  176. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  177. package/src/base-client/components/his/XCharge/XCharge.vue +610 -610
  178. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  179. package/src/base-client/components/his/XSidebar/XSidebar.vue +283 -283
  180. package/src/base-client/components/his/XSimpleTable/XSimpleTable.vue +119 -119
  181. package/src/base-client/components/his/XTimeSelect/XTimeSelect.vue +200 -192
  182. package/src/base-client/components/his/threeTestOrders/threeTestOrders.vue +482 -482
  183. package/src/base-client/components/index.js +51 -51
  184. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  185. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  186. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  187. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  188. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  189. package/src/base-client/plugins/Config.js +19 -19
  190. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  191. package/src/base-client/plugins/Recording.js +258 -258
  192. package/src/base-client/plugins/index.js +23 -23
  193. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  194. package/src/components/Charts/Bar.vue +62 -62
  195. package/src/components/Charts/ChartCard.vue +134 -134
  196. package/src/components/Charts/Liquid.vue +67 -67
  197. package/src/components/Charts/MiniArea.vue +39 -39
  198. package/src/components/Charts/MiniBar.vue +39 -39
  199. package/src/components/Charts/MiniProgress.vue +75 -75
  200. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  201. package/src/components/Charts/Radar.vue +68 -68
  202. package/src/components/Charts/RankList.vue +77 -77
  203. package/src/components/Charts/TagCloud.vue +113 -113
  204. package/src/components/Charts/TransferBar.vue +64 -64
  205. package/src/components/Charts/Trend.vue +82 -82
  206. package/src/components/Charts/chart.less +12 -12
  207. package/src/components/Charts/smooth.area.less +13 -13
  208. package/src/components/CodeMirror/inedx.vue +118 -118
  209. package/src/components/CodeMirror/setting.js +40 -40
  210. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  211. package/src/components/NumberInfo/index.js +3 -3
  212. package/src/components/NumberInfo/index.less +54 -54
  213. package/src/components/NumberInfo/index.md +43 -43
  214. package/src/components/card/ChartCard.vue +79 -79
  215. package/src/components/chart/Bar.vue +60 -60
  216. package/src/components/chart/MiniArea.vue +67 -67
  217. package/src/components/chart/MiniBar.vue +59 -59
  218. package/src/components/chart/MiniProgress.vue +57 -57
  219. package/src/components/chart/Radar.vue +80 -80
  220. package/src/components/chart/RankingList.vue +60 -60
  221. package/src/components/chart/Trend.vue +79 -79
  222. package/src/components/chart/index.less +9 -9
  223. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  224. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  225. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  226. package/src/components/checkbox/index.js +9 -9
  227. package/src/components/exception/ExceptionPage.vue +70 -70
  228. package/src/components/g2Charts/constants.js +202 -202
  229. package/src/components/g2Charts/demo.vue +808 -808
  230. package/src/components/g2Charts/designer.vue +228 -228
  231. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  232. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  233. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  234. package/src/components/g2Charts/index.vue +397 -397
  235. package/src/components/index.js +36 -36
  236. package/src/components/input/IInput.vue +66 -66
  237. package/src/components/menu/SideMenu.vue +75 -75
  238. package/src/components/menu/menu.js +273 -273
  239. package/src/components/setting/Setting.vue +234 -234
  240. package/src/components/tool/AStepItem.vue +60 -60
  241. package/src/config/CreateQueryConfig.js +325 -325
  242. package/src/config/default/antd.config.js +89 -89
  243. package/src/config/default/setting.config.js +55 -55
  244. package/src/font-style/font.css +60 -60
  245. package/src/layouts/CommonLayout.vue +56 -56
  246. package/src/layouts/PageLayout.vue +151 -151
  247. package/src/layouts/SinglePageView.vue +136 -136
  248. package/src/layouts/header/AdminHeader.vue +132 -132
  249. package/src/layouts/header/HeaderNotice.vue +177 -177
  250. package/src/layouts/header/InstitutionDetail.vue +181 -181
  251. package/src/layouts/tabs/TabsHead.vue +189 -189
  252. package/src/lib.js +1 -1
  253. package/src/mock/extend/index.js +84 -84
  254. package/src/mock/goods/index.js +108 -108
  255. package/src/pages/DefaultExample/index.vue +77 -77
  256. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  257. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  258. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  259. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  260. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  261. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  262. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  263. package/src/pages/DynamicStatistics/index.vue +282 -282
  264. package/src/pages/Example/childIndex.vue +15 -15
  265. package/src/pages/Example/index.vue +30 -30
  266. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  267. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  268. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  269. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  270. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  271. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  272. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  273. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  274. package/src/pages/Recording/index.vue +77 -77
  275. package/src/pages/ServiceReview/index.vue +284 -284
  276. package/src/pages/SubExample/index.vue +26 -26
  277. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  278. package/src/pages/XReportView/index.vue +64 -64
  279. package/src/pages/XTreeOneProExample/index.vue +67 -67
  280. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  281. package/src/pages/login/Login.vue +379 -379
  282. package/src/pages/login/LoginV3.vue +389 -389
  283. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  284. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  285. package/src/pages/report/ReportTable.js +124 -124
  286. package/src/pages/resourceManage/orgListManage.vue +98 -98
  287. package/src/pages/system/dictionary/index.vue +44 -44
  288. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  289. package/src/pages/system/monitor/operLog/index.vue +37 -37
  290. package/src/pages/system/settings/modifyPassword.vue +117 -117
  291. package/src/pages/system/ticket/index.vue +480 -480
  292. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  293. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  294. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  295. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  296. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  297. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  298. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  299. package/src/plugins/EventLogPlugin.js +33 -33
  300. package/src/plugins/FindParentsData.js +17 -17
  301. package/src/router/async/config.async.js +35 -35
  302. package/src/router/async/router.map.js +129 -129
  303. package/src/router/index.js +27 -27
  304. package/src/services/DataModel.js +30 -30
  305. package/src/services/LodopFuncs.js +137 -137
  306. package/src/services/api/TicketDetailsViewApi.js +46 -46
  307. package/src/services/api/cas.js +79 -79
  308. package/src/services/api/common.js +346 -346
  309. package/src/services/api/entity.js +18 -18
  310. package/src/services/api/index.js +17 -17
  311. package/src/store/modules/account.js +115 -115
  312. package/src/store/modules/index.js +5 -5
  313. package/src/store/modules/lowCode.js +33 -33
  314. package/src/store/modules/setting.js +119 -119
  315. package/src/theme/default/style.less +58 -58
  316. package/src/utils/authority-utils.js +85 -85
  317. package/src/utils/errorCode.js +6 -6
  318. package/src/utils/formatter.js +74 -74
  319. package/src/utils/htmlToPDF.js +108 -108
  320. package/src/utils/htmlToPDFApi.js +5 -5
  321. package/src/utils/login.js +188 -188
  322. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  323. package/src/utils/lowcode/lowcodeLog.js +29 -29
  324. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  325. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  326. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  327. package/src/utils/map-utils.js +47 -47
  328. package/src/utils/reg.js +95 -95
  329. package/src/utils/runEvalFunction.js +14 -14
  330. package/src/utils/theme-color-replacer-extend.js +92 -92
  331. package/src/utils/util.js +329 -329
  332. package/src/utils/waterMark.js +31 -31
  333. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,478 +1,478 @@
1
- <script>
2
- import { v4 as uuidv4 } from 'uuid'
3
- import {
4
- FormModel,
5
- Input,
6
- Button,
7
- Row,
8
- Col,
9
- Card,
10
- Divider,
11
- message,
12
- Select,
13
- Spin
14
- } from 'ant-design-vue'
15
- import { getConfigByNameAsync, runLogic } from '@vue2-client/services/api/common'
16
- import { mapState } from 'vuex'
17
- import { debounce } from 'lodash'
18
-
19
- export default {
20
- name: 'HAddNativeForm',
21
- components: {
22
- 'a-form-model': FormModel,
23
- 'a-form-item': FormModel.Item,
24
- 'a-input': Input,
25
- 'a-button': Button,
26
- 'a-row': Row,
27
- 'a-col': Col,
28
- 'a-card': Card,
29
- 'a-divider': Divider,
30
- 'a-select': Select,
31
- 'a-select-option': Select.Option,
32
- 'a-spin': Spin
33
- },
34
- props: {
35
- queryParamsName: {
36
- type: String,
37
- required: true
38
- },
39
- serviceName: {
40
- type: String,
41
- default: process.env.VUE_APP_SYSTEM_NAME
42
- }
43
- },
44
- data () {
45
- return {
46
- loading: true,
47
- config: {},
48
- formInstances: [],
49
- // 从配置读取的样式标识(默认值)
50
- formStyle: 'defaultForm'
51
- }
52
- },
53
- computed: {
54
- formItemLayoutComputed () {
55
- // 如果是 inline 布局,则不绑定 formItemLayout,让其使用 Ant Design Vue 默认的 inline 样式
56
- if (this.config.xAddFormLayout === 'inline') {
57
- return {}
58
- }
59
- if (this.config.formItemLayout) {
60
- return {
61
- labelCol: { span: this.config.formItemLayout.labelCol },
62
- wrapperCol: { span: this.config.formItemLayout.wrapperCol }
63
- }
64
- }
65
- // 如果是 horizontal 布局但未提供 formItemLayout,则提供一个默认值
66
- return {
67
- labelCol: { span: 6 }, // 默认标签宽度
68
- wrapperCol: { span: 18 } // 默认控件宽度,确保输入框足够宽
69
- }
70
- },
71
- ...mapState('account', { currUser: 'user' })
72
- },
73
- created () {
74
- this.debouncedSearch = debounce(this.performSearch, 500)
75
- this.fetchConfigAndInitializeForms()
76
- },
77
- methods: {
78
- async fetchConfigAndInitializeForms () {
79
- try {
80
- this.loading = true
81
- const res = await getConfigByNameAsync(this.queryParamsName, this.serviceName)
82
- if (res) {
83
- this.config = res
84
- // 从接口配置设置样式标识
85
- if (this.config.formStyle) {
86
- this.formStyle = this.config.formStyle
87
- }
88
- if (this.config.manyForm) {
89
- this.addFormInstance()
90
- } else {
91
- this.addFormInstance()
92
- }
93
- } else {
94
- console.error('HAddNativeForm: 未能获取到配置内容。')
95
- message.error('未能获取到表单配置,请检查配置名称或网络。')
96
- }
97
- } catch (error) {
98
- console.error('HAddNativeForm: 获取配置时发生错误:', error)
99
- message.error('获取表单配置时发生错误。')
100
- } finally {
101
- this.loading = false
102
- }
103
- },
104
- async getOptions (item, formDataContext, searchKeyword = '') {
105
- if (!item.keyName) {
106
- return
107
- }
108
-
109
- this.$set(item, 'loadingOptions', true)
110
- let fetchedOptions = []
111
-
112
- try {
113
- if (item.keyName.startsWith('logic@')) {
114
- const logicName = item.keyName.substring(6)
115
- const result = await runLogic(logicName, { searchKeyword: searchKeyword }, this.serviceName)
116
-
117
- if (Array.isArray(result)) {
118
- fetchedOptions = result.map(opt => ({
119
- label: opt.label || opt.name || opt.text,
120
- value: (opt.value || opt.id) + '',
121
- ...opt // 将所有原始属性也添加到选项中
122
- }))
123
- } else {
124
- console.warn(`Logic '${logicName}' did not return an array for options. Result:`, result)
125
- }
126
- } else if (item.keyName.startsWith('config@')) {
127
- const configName = item.keyName.substring(7)
128
- const res = await getConfigByNameAsync(configName, this.serviceName)
129
- if (res && res.value && Array.isArray(res.value)) {
130
- fetchedOptions = res.value.map(opt => ({
131
- label: opt.label || opt.name || opt.text,
132
- value: (opt.value || opt.id) + '',
133
- ...opt // 将所有原始属性也添加到选项中
134
- }))
135
- } else {
136
- console.warn(`Config '${configName}' did not return a valid 'value' array for options. Result:`, res)
137
- }
138
- } else {
139
- // 全局字典
140
- if (this.$appdata && typeof this.$appdata.getDictionaryList === 'function') {
141
- const dictionaryList = this.$appdata.getDictionaryList(item.keyName)
142
- if (Array.isArray(dictionaryList)) {
143
- fetchedOptions = dictionaryList.map(opt => ({
144
- label: opt.text,
145
- value: opt.value + '',
146
- ...opt // 将所有原始属性也添加到选项中
147
- }))
148
- } else {
149
- console.warn(`Global dictionary '${item.keyName}' did not return an array. Result:`, dictionaryList)
150
- }
151
- } else {
152
- console.error('$appdata.getDictionaryList is not available. Please ensure it\'s globally provided.')
153
- }
154
- }
155
- } catch (error) {
156
- console.error(`Error fetching options for item '${item.key}':`, error)
157
- fetchedOptions = []
158
- } finally {
159
- this.$set(item, 'options', fetchedOptions)
160
- this.$set(item, 'loadingOptions', false)
161
- }
162
- },
163
- // 搜索处理函数,使用 debounce 优化性能
164
- handleSelectSearch (value, item, formDataContext) {
165
- // 更新搜索关键字,并触发 debouncedSearch
166
- this.$set(item, 'searchKeyword', value)
167
- this.debouncedSearch(item, formDataContext)
168
- },
169
- // 执行实际的搜索操作
170
- performSearch (item, formDataContext) {
171
- this.getOptions(item, formDataContext, item.searchKeyword)
172
- },
173
- // 当选择框获得焦点时,重新加载选项(如果没有搜索关键字)
174
- handleSelectFocus (item, formDataContext) {
175
- if (!item.searchKeyword || item.searchKeyword === '') {
176
- this.getOptions(item, formDataContext)
177
- }
178
- },
179
- // 批量设置所有表单值
180
- setAllFormsData (dataList) {
181
- // 确保有足够多的表单实例来容纳所有数据
182
- while (this.formInstances.length < dataList.length) {
183
- this.addFormInstance()
184
- }
185
- dataList.forEach((data, index) => {
186
- if (this.formInstances[index]) {
187
- Object.assign(this.formInstances[index].formData, data)
188
- }
189
- })
190
- this.$forceUpdate()
191
- },
192
- addFormInstance () {
193
- const newId = uuidv4()
194
- const newFormData = {}
195
- const clonedFormItems = this.config.formItem ? JSON.parse(JSON.stringify(this.config.formItem)) : []
196
-
197
- if (clonedFormItems.length > 0) {
198
- for (const item of clonedFormItems) {
199
- newFormData[item.key] = undefined
200
- if (item.formType === 'select' && item.keyName) {
201
- this.$set(item, 'options', [])
202
- this.$set(item, 'loadingOptions', false)
203
- this.$set(item, 'searchKeyword', '')
204
- this.getOptions(item, newFormData)
205
- }
206
- }
207
- }
208
-
209
- this.formInstances.push({
210
- id: newId,
211
- formData: newFormData,
212
- formItems: clonedFormItems
213
- })
214
- },
215
- deleteFormInstance (id) {
216
- if (this.formInstances.length > 1) {
217
- this.formInstances = this.formInstances.filter(instance => instance.id !== id)
218
- } else {
219
- message.warning('至少需要保留一个表单实例。')
220
- }
221
- },
222
- getRules (item) {
223
- const rules = []
224
- if (item.rule && (item.rule.required === true || item.rule.required === 'true')) {
225
- rules.push({
226
- required: true,
227
- message: `请输入${item.title}`,
228
- trigger: 'blur'
229
- })
230
- }
231
- return rules
232
- },
233
- async onSubmit () {
234
- let allFormsValid = true
235
- const allFormsData = []
236
-
237
- for (const instance of this.formInstances) {
238
- const formRef = this.$refs['formModel_' + instance.id][0]
239
- if (formRef) {
240
- try {
241
- await formRef.validate()
242
- allFormsData.push(instance.formData)
243
- } catch (error) {
244
- allFormsValid = false
245
- break
246
- }
247
- }
248
- }
249
-
250
- if (allFormsValid) {
251
- message.success('表单提交成功!')
252
- this.$emit('submit', allFormsData)
253
- } else {
254
- message.error('部分表单校验失败,请检查。')
255
- }
256
- },
257
- getAllFormsData () {
258
- return this.formInstances.map(instance => {
259
- return instance.formData
260
- })
261
- },
262
- handleSelectChange (value, option, selectItem, formData, allFormItems) {
263
- // 直接获取option.data.props中的完整数据
264
- const selectedOptionData = option?.data?.props
265
- if (selectedOptionData) {
266
- for (const key in selectedOptionData) {
267
- if (Object.prototype.hasOwnProperty.call(selectedOptionData, key) && !['label', 'value'].includes(key)) {
268
- const targetItem = allFormItems.find(item => item.key === key)
269
- if (targetItem) {
270
- formData[key] = selectedOptionData[key]
271
- this.$forceUpdate()
272
- }
273
- }
274
- }
275
- }
276
- }
277
- }
278
- }
279
- </script>
280
-
281
- <template>
282
- <div class="h-add-native-form-group" :class="[`h-add-native-form-${formStyle}`]">
283
- <a-skeleton :loading="loading" :paragraph="{ rows: 4 }" />
284
- <div v-if="!loading">
285
- <div v-for="(formInstance, formIndex) in formInstances" :key="formInstance.id" class="form-instance-wrapper">
286
- <!-- <div v-if="config.manyForm" class="form-instance-title">药品 {{ formIndex + 1 }}</div> -->
287
- <a-form-model
288
- :ref="'formModel_' + formInstance.id"
289
- :model="formInstance.formData"
290
- v-bind="formItemLayoutComputed"
291
- :layout="config.xAddFormLayout || 'horizontal'"
292
- >
293
- <a-row :gutter="16">
294
- <a-col
295
- v-for="(item, itemIndex) in formInstance.formItems"
296
- :key="itemIndex"
297
- :xs="24"
298
- :sm="12"
299
- :md="8"
300
- :lg="6"
301
- :xl="6"
302
- >
303
- <a-form-item
304
- :label="item.title"
305
- :prop="item.key"
306
- :rules="getRules(item)"
307
- >
308
- <a-input
309
- v-if="item.formType === 'input'"
310
- v-model="formInstance.formData[item.key]"
311
- :placeholder="'请输入' + item.title"
312
- style="width: 100%"
313
- />
314
- <a-select
315
- v-else-if="item.formType === 'select'"
316
- v-model="formInstance.formData[item.key]"
317
- :placeholder=" '请选择' + item.title"
318
- :options="item.options"
319
- :loading="item.loadingOptions"
320
- show-search
321
- allowClear
322
- :filter-option="false"
323
- @search="(value) => handleSelectSearch(value, item, formInstance.formData)"
324
- @focus="() => handleSelectFocus(item, formInstance.formData)"
325
- @change="(value, option) => handleSelectChange(value, option, item, formInstance.formData, formInstance.formItems)"
326
- :dropdownMatchSelectWidth="false"
327
- :dropdownStyle="{ minWidth: '200px' }"
328
- style="width: 100%"
329
- >
330
- <a-spin v-if="item.loadingOptions" slot="notFoundContent" size="small" />
331
- </a-select>
332
- <!-- 可以根据需要添加其他表单类型,例如 select, datePicker 等 -->
333
- </a-form-item>
334
- </a-col>
335
- </a-row>
336
- </a-form-model>
337
- <a-divider style="margin: 10px" v-if="config.manyForm && formIndex < formInstances.length - 1" />
338
- </div>
339
-
340
- <!-- 全局添加/删除按钮,只在所有表单实例之后显示 -->
341
- <a-row v-if="config.manyForm" type="flex" justify="start" style="margin-top: 20px; gap: 10px;">
342
- <a-button v-if="config.showAddButton" class="form-action-button" icon="plus" @click="addFormInstance"></a-button>
343
- <a-button v-if="config.showDeleteButton && formInstances.length > 1" class="form-action-button" style="margin-left: 0px" icon="minus" @click="deleteFormInstance(formInstances[formInstances.length - 1].id)"></a-button>
344
- </a-row>
345
-
346
- <a-row v-if="config.showSubmitBtn" type="flex" justify="start" style="margin-top: 20px;">
347
- <a-col>
348
- <a-button type="primary" @click="onSubmit">{{ config.btnName || '提交' }}</a-button>
349
- </a-col>
350
- </a-row>
351
- </div>
352
- </div>
353
- </template>
354
-
355
- <style scoped lang="less">
356
- .h-add-native-form-group {
357
- // 基础样式,对应 defaultForm
358
- &.h-add-native-form-defaultForm {
359
- padding: 0px;
360
- // background-color: #fff;
361
- border-radius: 8px;
362
- }
363
- &.h-add-native-form-medicalForm {
364
- @media (min-width: 1200px) {
365
- :deep(.ant-col-xl-6) {
366
- display: block;
367
- flex: 0 0 42%;
368
- max-width: 42%;
369
- width: 42%;
370
- }
371
- }
372
- }
373
- }
374
-
375
- .form-instance-wrapper {
376
- margin-bottom: 0px;
377
- /* 移除边框和背景色,使其看起来像一个整体 */
378
- /* border: 1px solid #e8e8e8;
379
- border-radius: 4px;
380
- background-color: #fff; */
381
- }
382
-
383
- .form-instance-title {
384
- font-weight: bold;
385
- font-size: 16px;
386
- margin-bottom: 10px;
387
- padding-left: 10px; /* 与表单项对齐 */
388
- color: rgba(0, 0, 0, 0.85);
389
- }
390
-
391
- .form-action-button {
392
- width: 40px;
393
- height: 40px;
394
- border-radius: 8px;
395
- border: 1px solid #d9d9d9;
396
- background-color: #fff;
397
- color: rgba(0, 0, 0, 0.65);
398
- display: flex;
399
- justify-content: center;
400
- align-items: center;
401
- margin-left: 95px;
402
-
403
- &:hover {
404
- border-color: #40a9ff; /* 鼠标悬停时边框颜色 */
405
- color: #40a9ff; /* 鼠标悬停时图标颜色 */
406
- }
407
- }
408
-
409
- // 修复表单控件宽度问题
410
- :deep(.ant-form-item-control-wrapper) {
411
- width: 100%;
412
- }
413
-
414
- :deep(.ant-form-item-control) {
415
- width: 100%;
416
- }
417
-
418
- :deep(.ant-input),
419
- :deep(.ant-select) {
420
- width: 100% !important;
421
- }
422
-
423
- :deep(.ant-card-extra) {
424
- padding: 0;
425
- }
426
-
427
- :deep(.ant-form-item) {
428
- margin-bottom: 5px; // 增加表单项间距
429
- display: flex;
430
- flex-direction: column;
431
- margin-left: 95px;
432
- }
433
-
434
- :deep(.ant-form-item-label) {
435
- text-align: left;
436
- white-space: normal;
437
- }
438
-
439
- :deep(.ant-form-item-control-wrapper) {
440
- flex: 1;
441
- }
442
-
443
- // 针对 inline 布局的样式调整
444
- :deep(.ant-form-inline .ant-form-item) {
445
- margin-right: 0;
446
- margin-bottom: 16px;
447
- display: flex;
448
- flex-direction: row;
449
- align-items: flex-start;
450
- }
451
-
452
- :deep(.ant-form-inline .ant-form-item-label) {
453
- padding-right: 8px;
454
- flex: none;
455
- }
456
-
457
- :deep(.ant-form-inline .ant-form-item-control-wrapper) {
458
- flex: 1;
459
- min-width: 0;
460
- }
461
-
462
- :deep(.ant-form-inline .ant-input),
463
- :deep(.ant-form-inline .ant-select) {
464
- width: 100% !important;
465
- min-width: 120px; // 确保有最小宽度
466
- }
467
-
468
- // 响应式布局调整
469
- @media (max-width: 768px) {
470
- :deep(.ant-col-xs-24) {
471
- width: 100%;
472
- }
473
-
474
- :deep(.ant-form-item) {
475
- margin-bottom: 12px;
476
- }
477
- }
478
- </style>
1
+ <script>
2
+ import { v4 as uuidv4 } from 'uuid'
3
+ import {
4
+ FormModel,
5
+ Input,
6
+ Button,
7
+ Row,
8
+ Col,
9
+ Card,
10
+ Divider,
11
+ message,
12
+ Select,
13
+ Spin
14
+ } from 'ant-design-vue'
15
+ import { getConfigByNameAsync, runLogic } from '@vue2-client/services/api/common'
16
+ import { mapState } from 'vuex'
17
+ import { debounce } from 'lodash'
18
+
19
+ export default {
20
+ name: 'HAddNativeForm',
21
+ components: {
22
+ 'a-form-model': FormModel,
23
+ 'a-form-item': FormModel.Item,
24
+ 'a-input': Input,
25
+ 'a-button': Button,
26
+ 'a-row': Row,
27
+ 'a-col': Col,
28
+ 'a-card': Card,
29
+ 'a-divider': Divider,
30
+ 'a-select': Select,
31
+ 'a-select-option': Select.Option,
32
+ 'a-spin': Spin
33
+ },
34
+ props: {
35
+ queryParamsName: {
36
+ type: String,
37
+ required: true
38
+ },
39
+ serviceName: {
40
+ type: String,
41
+ default: process.env.VUE_APP_SYSTEM_NAME
42
+ }
43
+ },
44
+ data () {
45
+ return {
46
+ loading: true,
47
+ config: {},
48
+ formInstances: [],
49
+ // 从配置读取的样式标识(默认值)
50
+ formStyle: 'defaultForm'
51
+ }
52
+ },
53
+ computed: {
54
+ formItemLayoutComputed () {
55
+ // 如果是 inline 布局,则不绑定 formItemLayout,让其使用 Ant Design Vue 默认的 inline 样式
56
+ if (this.config.xAddFormLayout === 'inline') {
57
+ return {}
58
+ }
59
+ if (this.config.formItemLayout) {
60
+ return {
61
+ labelCol: { span: this.config.formItemLayout.labelCol },
62
+ wrapperCol: { span: this.config.formItemLayout.wrapperCol }
63
+ }
64
+ }
65
+ // 如果是 horizontal 布局但未提供 formItemLayout,则提供一个默认值
66
+ return {
67
+ labelCol: { span: 6 }, // 默认标签宽度
68
+ wrapperCol: { span: 18 } // 默认控件宽度,确保输入框足够宽
69
+ }
70
+ },
71
+ ...mapState('account', { currUser: 'user' })
72
+ },
73
+ created () {
74
+ this.debouncedSearch = debounce(this.performSearch, 500)
75
+ this.fetchConfigAndInitializeForms()
76
+ },
77
+ methods: {
78
+ async fetchConfigAndInitializeForms () {
79
+ try {
80
+ this.loading = true
81
+ const res = await getConfigByNameAsync(this.queryParamsName, this.serviceName)
82
+ if (res) {
83
+ this.config = res
84
+ // 从接口配置设置样式标识
85
+ if (this.config.formStyle) {
86
+ this.formStyle = this.config.formStyle
87
+ }
88
+ if (this.config.manyForm) {
89
+ this.addFormInstance()
90
+ } else {
91
+ this.addFormInstance()
92
+ }
93
+ } else {
94
+ console.error('HAddNativeForm: 未能获取到配置内容。')
95
+ message.error('未能获取到表单配置,请检查配置名称或网络。')
96
+ }
97
+ } catch (error) {
98
+ console.error('HAddNativeForm: 获取配置时发生错误:', error)
99
+ message.error('获取表单配置时发生错误。')
100
+ } finally {
101
+ this.loading = false
102
+ }
103
+ },
104
+ async getOptions (item, formDataContext, searchKeyword = '') {
105
+ if (!item.keyName) {
106
+ return
107
+ }
108
+
109
+ this.$set(item, 'loadingOptions', true)
110
+ let fetchedOptions = []
111
+
112
+ try {
113
+ if (item.keyName.startsWith('logic@')) {
114
+ const logicName = item.keyName.substring(6)
115
+ const result = await runLogic(logicName, { searchKeyword: searchKeyword }, this.serviceName)
116
+
117
+ if (Array.isArray(result)) {
118
+ fetchedOptions = result.map(opt => ({
119
+ label: opt.label || opt.name || opt.text,
120
+ value: (opt.value || opt.id) + '',
121
+ ...opt // 将所有原始属性也添加到选项中
122
+ }))
123
+ } else {
124
+ console.warn(`Logic '${logicName}' did not return an array for options. Result:`, result)
125
+ }
126
+ } else if (item.keyName.startsWith('config@')) {
127
+ const configName = item.keyName.substring(7)
128
+ const res = await getConfigByNameAsync(configName, this.serviceName)
129
+ if (res && res.value && Array.isArray(res.value)) {
130
+ fetchedOptions = res.value.map(opt => ({
131
+ label: opt.label || opt.name || opt.text,
132
+ value: (opt.value || opt.id) + '',
133
+ ...opt // 将所有原始属性也添加到选项中
134
+ }))
135
+ } else {
136
+ console.warn(`Config '${configName}' did not return a valid 'value' array for options. Result:`, res)
137
+ }
138
+ } else {
139
+ // 全局字典
140
+ if (this.$appdata && typeof this.$appdata.getDictionaryList === 'function') {
141
+ const dictionaryList = this.$appdata.getDictionaryList(item.keyName)
142
+ if (Array.isArray(dictionaryList)) {
143
+ fetchedOptions = dictionaryList.map(opt => ({
144
+ label: opt.text,
145
+ value: opt.value + '',
146
+ ...opt // 将所有原始属性也添加到选项中
147
+ }))
148
+ } else {
149
+ console.warn(`Global dictionary '${item.keyName}' did not return an array. Result:`, dictionaryList)
150
+ }
151
+ } else {
152
+ console.error('$appdata.getDictionaryList is not available. Please ensure it\'s globally provided.')
153
+ }
154
+ }
155
+ } catch (error) {
156
+ console.error(`Error fetching options for item '${item.key}':`, error)
157
+ fetchedOptions = []
158
+ } finally {
159
+ this.$set(item, 'options', fetchedOptions)
160
+ this.$set(item, 'loadingOptions', false)
161
+ }
162
+ },
163
+ // 搜索处理函数,使用 debounce 优化性能
164
+ handleSelectSearch (value, item, formDataContext) {
165
+ // 更新搜索关键字,并触发 debouncedSearch
166
+ this.$set(item, 'searchKeyword', value)
167
+ this.debouncedSearch(item, formDataContext)
168
+ },
169
+ // 执行实际的搜索操作
170
+ performSearch (item, formDataContext) {
171
+ this.getOptions(item, formDataContext, item.searchKeyword)
172
+ },
173
+ // 当选择框获得焦点时,重新加载选项(如果没有搜索关键字)
174
+ handleSelectFocus (item, formDataContext) {
175
+ if (!item.searchKeyword || item.searchKeyword === '') {
176
+ this.getOptions(item, formDataContext)
177
+ }
178
+ },
179
+ // 批量设置所有表单值
180
+ setAllFormsData (dataList) {
181
+ // 确保有足够多的表单实例来容纳所有数据
182
+ while (this.formInstances.length < dataList.length) {
183
+ this.addFormInstance()
184
+ }
185
+ dataList.forEach((data, index) => {
186
+ if (this.formInstances[index]) {
187
+ Object.assign(this.formInstances[index].formData, data)
188
+ }
189
+ })
190
+ this.$forceUpdate()
191
+ },
192
+ addFormInstance () {
193
+ const newId = uuidv4()
194
+ const newFormData = {}
195
+ const clonedFormItems = this.config.formItem ? JSON.parse(JSON.stringify(this.config.formItem)) : []
196
+
197
+ if (clonedFormItems.length > 0) {
198
+ for (const item of clonedFormItems) {
199
+ newFormData[item.key] = undefined
200
+ if (item.formType === 'select' && item.keyName) {
201
+ this.$set(item, 'options', [])
202
+ this.$set(item, 'loadingOptions', false)
203
+ this.$set(item, 'searchKeyword', '')
204
+ this.getOptions(item, newFormData)
205
+ }
206
+ }
207
+ }
208
+
209
+ this.formInstances.push({
210
+ id: newId,
211
+ formData: newFormData,
212
+ formItems: clonedFormItems
213
+ })
214
+ },
215
+ deleteFormInstance (id) {
216
+ if (this.formInstances.length > 1) {
217
+ this.formInstances = this.formInstances.filter(instance => instance.id !== id)
218
+ } else {
219
+ message.warning('至少需要保留一个表单实例。')
220
+ }
221
+ },
222
+ getRules (item) {
223
+ const rules = []
224
+ if (item.rule && (item.rule.required === true || item.rule.required === 'true')) {
225
+ rules.push({
226
+ required: true,
227
+ message: `请输入${item.title}`,
228
+ trigger: 'blur'
229
+ })
230
+ }
231
+ return rules
232
+ },
233
+ async onSubmit () {
234
+ let allFormsValid = true
235
+ const allFormsData = []
236
+
237
+ for (const instance of this.formInstances) {
238
+ const formRef = this.$refs['formModel_' + instance.id][0]
239
+ if (formRef) {
240
+ try {
241
+ await formRef.validate()
242
+ allFormsData.push(instance.formData)
243
+ } catch (error) {
244
+ allFormsValid = false
245
+ break
246
+ }
247
+ }
248
+ }
249
+
250
+ if (allFormsValid) {
251
+ message.success('表单提交成功!')
252
+ this.$emit('submit', allFormsData)
253
+ } else {
254
+ message.error('部分表单校验失败,请检查。')
255
+ }
256
+ },
257
+ getAllFormsData () {
258
+ return this.formInstances.map(instance => {
259
+ return instance.formData
260
+ })
261
+ },
262
+ handleSelectChange (value, option, selectItem, formData, allFormItems) {
263
+ // 直接获取option.data.props中的完整数据
264
+ const selectedOptionData = option?.data?.props
265
+ if (selectedOptionData) {
266
+ for (const key in selectedOptionData) {
267
+ if (Object.prototype.hasOwnProperty.call(selectedOptionData, key) && !['label', 'value'].includes(key)) {
268
+ const targetItem = allFormItems.find(item => item.key === key)
269
+ if (targetItem) {
270
+ formData[key] = selectedOptionData[key]
271
+ this.$forceUpdate()
272
+ }
273
+ }
274
+ }
275
+ }
276
+ }
277
+ }
278
+ }
279
+ </script>
280
+
281
+ <template>
282
+ <div class="h-add-native-form-group" :class="[`h-add-native-form-${formStyle}`]">
283
+ <a-skeleton :loading="loading" :paragraph="{ rows: 4 }" />
284
+ <div v-if="!loading">
285
+ <div v-for="(formInstance, formIndex) in formInstances" :key="formInstance.id" class="form-instance-wrapper">
286
+ <!-- <div v-if="config.manyForm" class="form-instance-title">药品 {{ formIndex + 1 }}</div> -->
287
+ <a-form-model
288
+ :ref="'formModel_' + formInstance.id"
289
+ :model="formInstance.formData"
290
+ v-bind="formItemLayoutComputed"
291
+ :layout="config.xAddFormLayout || 'horizontal'"
292
+ >
293
+ <a-row :gutter="16">
294
+ <a-col
295
+ v-for="(item, itemIndex) in formInstance.formItems"
296
+ :key="itemIndex"
297
+ :xs="24"
298
+ :sm="12"
299
+ :md="8"
300
+ :lg="6"
301
+ :xl="6"
302
+ >
303
+ <a-form-item
304
+ :label="item.title"
305
+ :prop="item.key"
306
+ :rules="getRules(item)"
307
+ >
308
+ <a-input
309
+ v-if="item.formType === 'input'"
310
+ v-model="formInstance.formData[item.key]"
311
+ :placeholder="'请输入' + item.title"
312
+ style="width: 100%"
313
+ />
314
+ <a-select
315
+ v-else-if="item.formType === 'select'"
316
+ v-model="formInstance.formData[item.key]"
317
+ :placeholder=" '请选择' + item.title"
318
+ :options="item.options"
319
+ :loading="item.loadingOptions"
320
+ show-search
321
+ allowClear
322
+ :filter-option="false"
323
+ @search="(value) => handleSelectSearch(value, item, formInstance.formData)"
324
+ @focus="() => handleSelectFocus(item, formInstance.formData)"
325
+ @change="(value, option) => handleSelectChange(value, option, item, formInstance.formData, formInstance.formItems)"
326
+ :dropdownMatchSelectWidth="false"
327
+ :dropdownStyle="{ minWidth: '200px' }"
328
+ style="width: 100%"
329
+ >
330
+ <a-spin v-if="item.loadingOptions" slot="notFoundContent" size="small" />
331
+ </a-select>
332
+ <!-- 可以根据需要添加其他表单类型,例如 select, datePicker 等 -->
333
+ </a-form-item>
334
+ </a-col>
335
+ </a-row>
336
+ </a-form-model>
337
+ <a-divider style="margin: 10px" v-if="config.manyForm && formIndex < formInstances.length - 1" />
338
+ </div>
339
+
340
+ <!-- 全局添加/删除按钮,只在所有表单实例之后显示 -->
341
+ <a-row v-if="config.manyForm" type="flex" justify="start" style="margin-top: 20px; gap: 10px;">
342
+ <a-button v-if="config.showAddButton" class="form-action-button" icon="plus" @click="addFormInstance"></a-button>
343
+ <a-button v-if="config.showDeleteButton && formInstances.length > 1" class="form-action-button" style="margin-left: 0px" icon="minus" @click="deleteFormInstance(formInstances[formInstances.length - 1].id)"></a-button>
344
+ </a-row>
345
+
346
+ <a-row v-if="config.showSubmitBtn" type="flex" justify="start" style="margin-top: 20px;">
347
+ <a-col>
348
+ <a-button type="primary" @click="onSubmit">{{ config.btnName || '提交' }}</a-button>
349
+ </a-col>
350
+ </a-row>
351
+ </div>
352
+ </div>
353
+ </template>
354
+
355
+ <style scoped lang="less">
356
+ .h-add-native-form-group {
357
+ // 基础样式,对应 defaultForm
358
+ &.h-add-native-form-defaultForm {
359
+ padding: 0px;
360
+ // background-color: #fff;
361
+ border-radius: 8px;
362
+ }
363
+ &.h-add-native-form-medicalForm {
364
+ @media (min-width: 1200px) {
365
+ :deep(.ant-col-xl-6) {
366
+ display: block;
367
+ flex: 0 0 42%;
368
+ max-width: 42%;
369
+ width: 42%;
370
+ }
371
+ }
372
+ }
373
+ }
374
+
375
+ .form-instance-wrapper {
376
+ margin-bottom: 0px;
377
+ /* 移除边框和背景色,使其看起来像一个整体 */
378
+ /* border: 1px solid #e8e8e8;
379
+ border-radius: 4px;
380
+ background-color: #fff; */
381
+ }
382
+
383
+ .form-instance-title {
384
+ font-weight: bold;
385
+ font-size: 16px;
386
+ margin-bottom: 10px;
387
+ padding-left: 10px; /* 与表单项对齐 */
388
+ color: rgba(0, 0, 0, 0.85);
389
+ }
390
+
391
+ .form-action-button {
392
+ width: 40px;
393
+ height: 40px;
394
+ border-radius: 8px;
395
+ border: 1px solid #d9d9d9;
396
+ background-color: #fff;
397
+ color: rgba(0, 0, 0, 0.65);
398
+ display: flex;
399
+ justify-content: center;
400
+ align-items: center;
401
+ margin-left: 95px;
402
+
403
+ &:hover {
404
+ border-color: #40a9ff; /* 鼠标悬停时边框颜色 */
405
+ color: #40a9ff; /* 鼠标悬停时图标颜色 */
406
+ }
407
+ }
408
+
409
+ // 修复表单控件宽度问题
410
+ :deep(.ant-form-item-control-wrapper) {
411
+ width: 100%;
412
+ }
413
+
414
+ :deep(.ant-form-item-control) {
415
+ width: 100%;
416
+ }
417
+
418
+ :deep(.ant-input),
419
+ :deep(.ant-select) {
420
+ width: 100% !important;
421
+ }
422
+
423
+ :deep(.ant-card-extra) {
424
+ padding: 0;
425
+ }
426
+
427
+ :deep(.ant-form-item) {
428
+ margin-bottom: 5px; // 增加表单项间距
429
+ display: flex;
430
+ flex-direction: column;
431
+ margin-left: 95px;
432
+ }
433
+
434
+ :deep(.ant-form-item-label) {
435
+ text-align: left;
436
+ white-space: normal;
437
+ }
438
+
439
+ :deep(.ant-form-item-control-wrapper) {
440
+ flex: 1;
441
+ }
442
+
443
+ // 针对 inline 布局的样式调整
444
+ :deep(.ant-form-inline .ant-form-item) {
445
+ margin-right: 0;
446
+ margin-bottom: 16px;
447
+ display: flex;
448
+ flex-direction: row;
449
+ align-items: flex-start;
450
+ }
451
+
452
+ :deep(.ant-form-inline .ant-form-item-label) {
453
+ padding-right: 8px;
454
+ flex: none;
455
+ }
456
+
457
+ :deep(.ant-form-inline .ant-form-item-control-wrapper) {
458
+ flex: 1;
459
+ min-width: 0;
460
+ }
461
+
462
+ :deep(.ant-form-inline .ant-input),
463
+ :deep(.ant-form-inline .ant-select) {
464
+ width: 100% !important;
465
+ min-width: 120px; // 确保有最小宽度
466
+ }
467
+
468
+ // 响应式布局调整
469
+ @media (max-width: 768px) {
470
+ :deep(.ant-col-xs-24) {
471
+ width: 100%;
472
+ }
473
+
474
+ :deep(.ant-form-item) {
475
+ margin-bottom: 12px;
476
+ }
477
+ }
478
+ </style>