vue2-client 1.16.15 → 1.16.19

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 (332) 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 +1 -1
  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/index.js +3 -3
  63. package/src/base-client/components/common/CitySelect/index.md +109 -109
  64. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  65. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  66. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  67. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  68. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  69. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  70. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  71. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  72. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  73. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  74. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  75. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  76. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  77. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  78. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  79. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  80. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  81. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  82. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  83. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  84. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  85. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  86. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  87. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  88. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  89. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  90. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  91. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  92. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  93. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  94. package/src/base-client/components/common/Recording/index.js +3 -3
  95. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  96. package/src/base-client/components/common/Tree/index.js +2 -2
  97. package/src/base-client/components/common/Upload/index.js +3 -3
  98. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  99. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  100. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  101. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  102. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  103. package/src/base-client/components/common/XAddReport/index.js +3 -3
  104. package/src/base-client/components/common/XAddReport/index.md +56 -56
  105. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  106. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  107. package/src/base-client/components/common/XButtons/index.js +3 -3
  108. package/src/base-client/components/common/XButtons/index.md +61 -61
  109. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  110. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  111. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  112. package/src/base-client/components/common/XDataCard/index.js +3 -3
  113. package/src/base-client/components/common/XDataCard/index.md +1 -1
  114. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  115. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  116. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  117. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  118. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  119. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  120. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  121. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  122. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  123. package/src/base-client/components/common/XForm/index.md +178 -178
  124. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  125. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  126. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  127. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  128. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  129. package/src/base-client/components/common/XFormTable/index.md +92 -92
  130. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  131. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  132. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  133. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  134. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  135. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  136. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  137. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  138. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  139. package/src/base-client/components/common/XPrint/index.vue +97 -97
  140. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  141. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  142. package/src/base-client/components/common/XReport/index.js +3 -3
  143. package/src/base-client/components/common/XReport/print.js +186 -186
  144. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  145. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  146. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  147. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  148. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  149. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  150. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  151. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  152. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  153. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  154. package/src/base-client/components/common/XStepView/index.js +3 -3
  155. package/src/base-client/components/common/XStepView/index.md +31 -31
  156. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  157. package/src/base-client/components/common/XTab/index.js +3 -3
  158. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  159. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  160. package/src/base-client/components/common/XTable/index.md +255 -255
  161. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  162. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  163. package/src/base-client/components/common/XTree/index.js +3 -3
  164. package/src/base-client/components/common/XTree/index.md +36 -36
  165. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  166. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  167. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  168. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  169. package/src/base-client/components/his/XCharge/XCharge.vue +610 -569
  170. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  171. package/src/base-client/components/his/XSidebar/XSidebar.vue +68 -25
  172. package/src/base-client/components/his/threeTestOrders/threeTestOrders.vue +7 -1
  173. package/src/base-client/components/index.js +51 -51
  174. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  175. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  176. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  177. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  178. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  179. package/src/base-client/plugins/Config.js +19 -19
  180. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  181. package/src/base-client/plugins/Recording.js +258 -258
  182. package/src/base-client/plugins/index.js +23 -23
  183. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  184. package/src/components/Charts/Bar.vue +62 -62
  185. package/src/components/Charts/ChartCard.vue +134 -134
  186. package/src/components/Charts/Liquid.vue +67 -67
  187. package/src/components/Charts/MiniArea.vue +39 -39
  188. package/src/components/Charts/MiniBar.vue +39 -39
  189. package/src/components/Charts/MiniProgress.vue +75 -75
  190. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  191. package/src/components/Charts/Radar.vue +68 -68
  192. package/src/components/Charts/RankList.vue +77 -77
  193. package/src/components/Charts/TagCloud.vue +113 -113
  194. package/src/components/Charts/TransferBar.vue +64 -64
  195. package/src/components/Charts/Trend.vue +82 -82
  196. package/src/components/Charts/chart.less +12 -12
  197. package/src/components/Charts/smooth.area.less +13 -13
  198. package/src/components/CodeMirror/inedx.vue +118 -118
  199. package/src/components/CodeMirror/setting.js +40 -40
  200. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  201. package/src/components/NumberInfo/index.js +3 -3
  202. package/src/components/NumberInfo/index.less +54 -54
  203. package/src/components/NumberInfo/index.md +43 -43
  204. package/src/components/card/ChartCard.vue +79 -79
  205. package/src/components/chart/Bar.vue +60 -60
  206. package/src/components/chart/MiniArea.vue +67 -67
  207. package/src/components/chart/MiniBar.vue +59 -59
  208. package/src/components/chart/MiniProgress.vue +57 -57
  209. package/src/components/chart/Radar.vue +80 -80
  210. package/src/components/chart/RankingList.vue +60 -60
  211. package/src/components/chart/Trend.vue +79 -79
  212. package/src/components/chart/index.less +9 -9
  213. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  214. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  215. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  216. package/src/components/checkbox/index.js +9 -9
  217. package/src/components/exception/ExceptionPage.vue +70 -70
  218. package/src/components/g2Charts/constants.js +202 -202
  219. package/src/components/g2Charts/demo.vue +808 -808
  220. package/src/components/g2Charts/designer.vue +228 -228
  221. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  222. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  223. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  224. package/src/components/g2Charts/index.vue +397 -397
  225. package/src/components/index.js +36 -36
  226. package/src/components/input/IInput.vue +66 -66
  227. package/src/components/menu/SideMenu.vue +75 -75
  228. package/src/components/menu/menu.js +273 -273
  229. package/src/components/setting/Setting.vue +234 -234
  230. package/src/components/tool/AStepItem.vue +60 -60
  231. package/src/config/CreateQueryConfig.js +325 -325
  232. package/src/config/default/antd.config.js +89 -89
  233. package/src/config/default/setting.config.js +55 -55
  234. package/src/font-style/font.css +60 -60
  235. package/src/layouts/CommonLayout.vue +56 -56
  236. package/src/layouts/PageLayout.vue +151 -151
  237. package/src/layouts/SinglePageView.vue +136 -136
  238. package/src/layouts/header/AdminHeader.vue +132 -132
  239. package/src/layouts/header/HeaderNotice.vue +177 -177
  240. package/src/layouts/header/InstitutionDetail.vue +181 -181
  241. package/src/layouts/tabs/TabsHead.vue +189 -189
  242. package/src/lib.js +1 -1
  243. package/src/mock/extend/index.js +84 -84
  244. package/src/mock/goods/index.js +108 -108
  245. package/src/pages/DefaultExample/index.vue +77 -77
  246. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  247. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  248. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  249. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  250. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  251. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  252. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  253. package/src/pages/DynamicStatistics/index.vue +282 -282
  254. package/src/pages/Example/childIndex.vue +15 -15
  255. package/src/pages/Example/index.vue +30 -30
  256. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  257. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  258. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  259. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  260. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  261. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  262. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  263. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  264. package/src/pages/Recording/index.vue +77 -77
  265. package/src/pages/ServiceReview/index.vue +284 -284
  266. package/src/pages/SubExample/index.vue +26 -26
  267. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  268. package/src/pages/XReportView/index.vue +64 -64
  269. package/src/pages/XTreeOneProExample/index.vue +67 -67
  270. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  271. package/src/pages/login/Login.vue +379 -379
  272. package/src/pages/login/LoginV3.vue +389 -389
  273. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  274. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  275. package/src/pages/report/ReportTable.js +124 -124
  276. package/src/pages/resourceManage/orgListManage.vue +98 -98
  277. package/src/pages/system/dictionary/index.vue +44 -44
  278. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  279. package/src/pages/system/monitor/operLog/index.vue +37 -37
  280. package/src/pages/system/settings/modifyPassword.vue +117 -117
  281. package/src/pages/system/ticket/index.vue +480 -480
  282. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  283. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  284. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  285. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  286. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  287. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  288. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  289. package/src/plugins/EventLogPlugin.js +33 -33
  290. package/src/plugins/FindParentsData.js +17 -17
  291. package/src/router/async/config.async.js +35 -35
  292. package/src/router/async/router.map.js +1 -2
  293. package/src/router/index.js +27 -27
  294. package/src/services/DataModel.js +30 -30
  295. package/src/services/LodopFuncs.js +137 -137
  296. package/src/services/api/TicketDetailsViewApi.js +46 -46
  297. package/src/services/api/cas.js +79 -79
  298. package/src/services/api/common.js +346 -347
  299. package/src/services/api/entity.js +18 -18
  300. package/src/services/api/index.js +17 -17
  301. package/src/store/modules/account.js +115 -115
  302. package/src/store/modules/index.js +5 -5
  303. package/src/store/modules/lowCode.js +33 -33
  304. package/src/store/modules/setting.js +119 -119
  305. package/src/theme/default/style.less +58 -58
  306. package/src/utils/authority-utils.js +85 -85
  307. package/src/utils/errorCode.js +6 -6
  308. package/src/utils/formatter.js +74 -74
  309. package/src/utils/htmlToPDF.js +108 -108
  310. package/src/utils/htmlToPDFApi.js +5 -5
  311. package/src/utils/login.js +188 -188
  312. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  313. package/src/utils/lowcode/lowcodeLog.js +29 -29
  314. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  315. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  316. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  317. package/src/utils/map-utils.js +47 -47
  318. package/src/utils/reg.js +95 -95
  319. package/src/utils/routerUtil.js +122 -41
  320. package/src/utils/runEvalFunction.js +14 -14
  321. package/src/utils/theme-color-replacer-extend.js +92 -92
  322. package/src/utils/util.js +329 -329
  323. package/src/utils/waterMark.js +31 -31
  324. package/vue.config.js +2 -2
  325. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
  326. package/src/assets/img/paymentMethod/icon1.png +0 -0
  327. package/src/assets/img/paymentMethod/icon2.png +0 -0
  328. package/src/assets/img/paymentMethod/icon3.png +0 -0
  329. package/src/assets/img/paymentMethod/icon4.png +0 -0
  330. package/src/assets/img/paymentMethod/icon5.png +0 -0
  331. package/src/assets/img/paymentMethod/icon6.png +0 -0
  332. package/src/base-client/components/his/XCharge/testConfig.js +0 -149
@@ -1,569 +1,610 @@
1
- <template>
2
- <div class="xcharge-wrapper">
3
- <!-- 顶部金额信息区(表单行风格,宽度固定,每行4个) -->
4
- <a-row :gutter="0" class="amount-info">
5
- <a-col v-for="item in config.amountFields" :key="item.field" :span="6" class="form-row">
6
- <label class="form-label">{{ item.label }}</label>
7
- <a-input
8
- v-model="data[item.field]"
9
- :value="data[item.field]"
10
- :disabled="item.disabled"
11
- class="form-input"
12
- />
13
- </a-col>
14
- </a-row>
15
-
16
- <a-divider/>
17
-
18
- <!-- 支付方式选择区 -->
19
- <div class="payment-methods">
20
- <a-button
21
- v-for="method in config.paymentMethods"
22
- :key="method.key"
23
- :class="['payment-btn', {
24
- active: isMixedPaymentEnabled ? selectedMethods.includes(method.key) : selectedMethod === method.key
25
- }]"
26
- @click="isMixedPaymentEnabled ? toggleMethod(method.key) : selectMethod(method.key)"
27
- >
28
- <div>
29
- <div class="pay-label">{{ method.label }}</div>
30
- <div v-if="isMixedPaymentEnabled && selectedMethods.includes(method.key)" class="selected-indicator">✓</div>
31
- </div>
32
- </a-button>
33
- </div>
34
-
35
- <a-divider/>
36
-
37
- <!-- 支付详情(同一行展示) -->
38
- <div v-if="(isMixedPaymentEnabled && selectedMethods.length > 0) || (!isMixedPaymentEnabled && selectedMethod)" class="mixed-payment-section simple">
39
- <!-- 混合支付:所有金额输入在同一行展示 -->
40
- <div v-if="isMixedPaymentEnabled" class="payment-operation-row">
41
- <div class="payment-inline">
42
- <div v-for="method in selectedMethods" :key="method" class="inline-field">
43
- <label class="form-label">{{ getAmountLabel(method) }}</label>
44
- <a-input
45
- v-model="paymentAmounts[method]"
46
- type="number"
47
- placeholder="请输入金额"
48
- class="form-input"
49
- @change="updatePaymentAmount(method, $event)"
50
- />
51
- </div>
52
- </div>
53
- </div>
54
- <!-- 单一支付:同一行展示一个输入 -->
55
- <div v-if="!isMixedPaymentEnabled && selectedMethod" class="payment-operation-row">
56
- <div class="payment-inline">
57
- <div class="inline-field">
58
- <label class="form-label">{{ getAmountLabel(selectedMethod) }}</label>
59
- <a-input
60
- v-model="paymentAmounts[selectedMethod]"
61
- type="number"
62
- placeholder="请输入金额"
63
- class="form-input"
64
- @change="updatePaymentAmount(selectedMethod, $event)"
65
- />
66
- </div>
67
- </div>
68
- </div>
69
- </div>
70
-
71
- <a-divider/>
72
-
73
- <!-- 底部金额和操作区(表单行风格,宽度固定) -->
74
- <a-row :gutter="0" class="bottom-info">
75
- <a-col v-for="item in config.bottomFields" :key="item.field" :span="8" class="form-row">
76
- <label class="form-label">{{ item.label }}</label>
77
- <a-input
78
- v-model="data[item.field]"
79
- :disabled="item.disabled"
80
- class="form-input"
81
- @change="bottomFieldsChange($event,item)"
82
- />
83
- </a-col>
84
- </a-row>
85
- <a-row class="actions-row" justify="center">
86
- <a-button
87
- v-for="btn in config.actionButtons"
88
- :key="btn.key"
89
- @click="handleAction(btn.key)"
90
- :icon="btn.icon"
91
- style="margin: 0 8px"
92
- >
93
- {{ btn.label }}
94
- </a-button>
95
- </a-row>
96
- </div>
97
- </template>
98
-
99
- <script>
100
- import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
101
-
102
- export default {
103
- name: 'XCharge',
104
- props: {
105
- queryParamsName: {
106
- type: String,
107
- default: ''
108
- },
109
- parameter: {
110
- type: Object,
111
- default: () => ({})
112
- }
113
- },
114
- data () {
115
- return {
116
- config: {
117
- amountFields: [],
118
- paymentMethods: [],
119
- bottomFields: [],
120
- actionButtons: [],
121
- enableMixedPayment: false // 默认关闭混合支付
122
- },
123
- data: {},
124
- selectedMethod: '', // 保持向后兼容
125
- selectedMethods: [], // 新增:支持多选支付方式
126
- paymentAmounts: {}, // 各支付方式的金额
127
- // 事件名配置(可通过配置覆盖)
128
- eventNames: {
129
- method: 'method',
130
- methods: 'methods',
131
- totalPaymentAmount: 'totalPaymentAmount',
132
- action: 'action',
133
- // 新增:单个支付方式金额变更事件
134
- paymentAmountChange: 'paymentAmountChange'
135
- },
136
- hasInitialized: false
137
- }
138
- },
139
- emits: ['init'],
140
- computed: {
141
- // 安全访问混合支付配置
142
- isMixedPaymentEnabled () {
143
- return this.config && this.config.enableMixedPayment === true
144
- },
145
- // 预计算:金额标签映射(仅基于 paymentMethods 配置)
146
- amountLabelMap () {
147
- const map = {}
148
- const methods = Array.isArray(this.config.paymentMethods) ? this.config.paymentMethods : []
149
- // 先用 methods 构建默认与自定义
150
- methods.forEach(m => {
151
- const key = m && m.key
152
- const label = m && m.label
153
- if (!key) return
154
- map[key] = m && m.amountLabel ? m.amountLabel : `${label || key}金额`
155
- })
156
- return map
157
- }
158
- },
159
- created () {
160
- const hasParam = this.parameter && Object.keys(this.parameter).length > 0
161
- // 始终加载组件配置;仅当有参数时,getConfig 内部才会拉取数据
162
- this.getConfig(this.queryParamsName, this.parameter || {})
163
- if (hasParam) this.hasInitialized = true
164
- },
165
- methods: {
166
- selectMethod (value) {
167
- this.selectedMethod = value
168
- this.data.selectedMethod = value
169
- // 单一模式下初始化对应的支付数据
170
- if (!this.isMixedPaymentEnabled && value) {
171
- if (!this.paymentAmounts[value]) this.initPaymentData(value)
172
- }
173
- this.$emit(this.eventNames.method, value)
174
- },
175
- // 新增:切换支付方式选择(支持多选)
176
- toggleMethod (methodKey) {
177
- const index = this.selectedMethods.indexOf(methodKey)
178
- if (index > -1) {
179
- // 如果已选中,则移除
180
- this.selectedMethods.splice(index, 1)
181
- this.removePaymentData(methodKey)
182
- } else {
183
- // 如果未选中,则添加
184
- this.selectedMethods.push(methodKey)
185
- this.initPaymentData(methodKey)
186
- }
187
-
188
- // 更新选中状态
189
- this.selectedMethod = this.selectedMethods.length > 0 ? this.selectedMethods[0] : ''
190
- this.data.selectedMethods = [...this.selectedMethods]
191
-
192
- this.$emit(this.eventNames.methods, this.selectedMethods)
193
- this.$emit(this.eventNames.method, this.selectedMethod) // 保持向后兼容
194
- },
195
- // 新增:移除支付方式
196
- removeMethod (methodKey) {
197
- const index = this.selectedMethods.indexOf(methodKey)
198
- if (index > -1) {
199
- this.selectedMethods.splice(index, 1)
200
- this.removePaymentData(methodKey)
201
- this.$emit(this.eventNames.methods, this.selectedMethods)
202
- }
203
- },
204
- // 新增:初始化支付数据
205
- initPaymentData (methodKey) {
206
- this.$set(this.paymentAmounts, methodKey, '')
207
- if (!this.data.paymentAmounts || typeof this.data.paymentAmounts !== 'object') this.$set(this.data, 'paymentAmounts', {})
208
- this.$set(this.data.paymentAmounts, methodKey, '')
209
- },
210
- // 新增:移除支付数据
211
- removePaymentData (methodKey) {
212
- this.$delete(this.paymentAmounts, methodKey)
213
- if (this.data && this.data.paymentAmounts) this.$delete(this.data.paymentAmounts, methodKey)
214
- },
215
- // 新增:获取支付方式标签
216
- getMethodLabel (methodKey) {
217
- const method = this.config.paymentMethods.find(m => m.key === methodKey)
218
- return method ? method.label : methodKey
219
- },
220
- // 获取金额字段展示名(配置映射 / paymentMethods.amountLabel / 默认「{方式}金额」)
221
- getAmountLabel (methodKey) {
222
- return (this.amountLabelMap && this.amountLabelMap[methodKey]) || `${methodKey}金额`
223
- },
224
- // 新增:获取支付金额字段标签(优先配置映射,其次方法自带 amountLabel,最后回退)
225
- getAmountLabel (methodKey) {
226
- const mapped = (this.config.paymentAmountLabels && this.config.paymentAmountLabels[methodKey]) || ''
227
- if (mapped) return mapped
228
- const method = this.config.paymentMethods.find(m => m.key === methodKey)
229
- if (method && method.amountLabel) return method.amountLabel
230
- return `${method ? method.label : methodKey}金额`
231
- },
232
- // 新增:更新支付金额
233
- updatePaymentAmount (methodKey, event) {
234
- const amount = parseFloat(event.target.value) || 0
235
- this.$set(this.paymentAmounts, methodKey, amount)
236
- if (!this.data.paymentAmounts || typeof this.data.paymentAmounts !== 'object') this.$set(this.data, 'paymentAmounts', {})
237
- this.$set(this.data.paymentAmounts, methodKey, amount)
238
- this.calculateTotalPayment()
239
- // 单个方式金额变更事件,向父组件上抛
240
- this.$emit(this.eventNames.paymentAmountChange, { method: methodKey, amount })
241
- },
242
- // 新增:计算总支付金额
243
- calculateTotalPayment () {
244
- const total = Object.values(this.paymentAmounts).reduce((sum, amount) => {
245
- return sum + (parseFloat(amount) || 0)
246
- }, 0)
247
- this.data.totalPaymentAmount = total
248
- this.$emit(this.eventNames.totalPaymentAmount, total)
249
- },
250
- getConfig (configName, param) {
251
- if (configName) {
252
- console.log('configName', configName)
253
- getConfigByName(configName, 'af-his', res => {
254
- console.log('res', res)
255
- // 检查是否有错误
256
- if (res && res.ERROR) {
257
- console.warn('配置获取失败:', res.ERROR)
258
- return
259
- }
260
- this.config = {
261
- amountFields: res.amountFields || [],
262
- paymentMethods: res.paymentMethods || [],
263
- bottomFields: res.bottomFields || [],
264
- actionButtons: res.actionButtons || [],
265
- enableMixedPayment: res.enableMixedPayment === true
266
- }
267
- // 事件名覆盖(fronImport风格)
268
- if (res.eventNames && typeof res.eventNames === 'object') {
269
- this.eventNames = { ...this.eventNames, ...res.eventNames }
270
- }
271
- this.selectedMethod = res.paymentMethods?.[0]?.key || ''
272
-
273
- // 如果启用混合支付,初始化选中状态
274
- if (this.isMixedPaymentEnabled && res.paymentMethods?.length > 0) {
275
- this.selectedMethods = [res.paymentMethods[0].key]
276
- this.initPaymentData(res.paymentMethods[0].key)
277
- } else if (!this.isMixedPaymentEnabled && this.selectedMethod) {
278
- // 单一支付初始化
279
- this.initPaymentData(this.selectedMethod)
280
- }
281
-
282
- // 初始化数据:仅当传入了有效 param 时才拉取数据
283
- const hasParam = param && Object.keys(param || {}).length > 0
284
- if (hasParam && res.dataSourceConfig) {
285
- runLogic(res.dataSourceConfig, param, 'af-his').then(resData => {
286
- this.data = { ...resData }
287
- }).catch(error => {
288
- console.warn('数据获取失败(保持现有数据):', error)
289
- })
290
- }
291
- })
292
- }
293
- },
294
- refreshList (param) {
295
- this.getConfig(this.queryParamsName, param)
296
- },
297
- async init (conditionData) {
298
- if(conditionData.data){
299
- this.data = { ...conditionData.data }
300
- }
301
- if(conditionData.params){
302
- await this.getConfig(this.queryParamsName, conditionData.params)
303
- }
304
- this.hasInitialized = true
305
- },
306
- // 使用默认数据
307
- useDefaultData () {
308
- this.data = {
309
- f_amount: 100,
310
- f_insurance_amount: 0,
311
- f_self_amount: 100,
312
- f_balance: 100,
313
- out_of_pocket_amount: 0,
314
- biscount_amount: 0,
315
- billing_amount: 0,
316
- received: 100,
317
- change: 0
318
- }
319
- },
320
- handleAction (key) {
321
- console.warn('选择的的方法 ====》' + key)
322
- console.warn('页面数据 ====》' + JSON.stringify(this.data))
323
- console.warn('选择的支付方式 ====》' + this.selectedMethod)
324
-
325
- if (this.isMixedPaymentEnabled) {
326
- console.warn('混合支付方式 ====》' + JSON.stringify(this.selectedMethods))
327
- console.warn('支付详情 ====》' + JSON.stringify({ amounts: this.paymentAmounts }))
328
- }
329
-
330
- const actionData = {
331
- key,
332
- data: this.data,
333
- method: this.selectedMethod,
334
- // 统一返回支付详情,单一模式时 selectedMethods 仅含一个
335
- mixedPayment: {
336
- selectedMethods: this.isMixedPaymentEnabled ? this.selectedMethods : (this.selectedMethod ? [this.selectedMethod] : []),
337
- paymentAmounts: this.paymentAmounts,
338
- totalPaymentAmount: this.data.totalPaymentAmount || 0
339
- }
340
- }
341
-
342
- this.$emit(this.eventNames.action, actionData)
343
- },
344
- bottomFieldsChange (e, item) {
345
- if (item.changeEventName && this.$listeners[item.changeEventName]) {
346
- this.$emit(item.changeEventName, e, item)
347
- }
348
- }
349
- },
350
- watch: {
351
- configName (val) {
352
- this.getConfig()
353
- }
354
- }
355
- }
356
- </script>
357
-
358
- <style scoped>
359
- .xcharge-wrapper {
360
- background: #fff;
361
- padding: 24px;
362
- border-radius: 8px;
363
- }
364
-
365
- .amount-info {
366
- margin-bottom: 20px;
367
- display: flex;
368
- flex-wrap: wrap;
369
- row-gap: 16px;
370
- }
371
-
372
- .form-row {
373
- display: flex;
374
- align-items: center;
375
- margin-bottom: 30px;
376
- }
377
-
378
- .form-label {
379
- width: 100px;
380
- font-size: 18px;
381
- color: #333;
382
- font-weight: bold;
383
- text-align: left;
384
- letter-spacing: 1px;
385
- flex-shrink: 0;
386
- }
387
-
388
- .form-input {
389
- width: 180px;
390
- height: 40px;
391
- font-size: 18px;
392
- border-radius: 8px;
393
- border: 1.5px solid #dcdfe6;
394
- background: #fff;
395
- color: #333;
396
- padding-left: 12px;
397
- }
398
-
399
- .form-input[disabled] {
400
- color: #999;
401
- background: #f5f5f5;
402
- }
403
-
404
- .payment-methods {
405
- display: flex;
406
- justify-content: space-around;
407
- margin: 32px 0;
408
- }
409
-
410
- .payment-btn {
411
- width: 180px;
412
- height: 120px;
413
- margin: 0 16px;
414
- display: flex;
415
- align-items: center;
416
- justify-content: center;
417
- background: #f7f8fa;
418
- border: 1.5px solid #e4e7ed;
419
- color: #333;
420
- font-weight: bold;
421
- font-size: 24px;
422
- transition: all 0.2s;
423
- box-shadow: none;
424
- border-radius: 12px;
425
- }
426
-
427
- .payment-btn.active {
428
- background: #409eff;
429
- border-color: #409eff;
430
- color: #fff;
431
- }
432
-
433
- .pay-label {
434
- font-size: 24px;
435
- font-weight: bold;
436
- }
437
-
438
- .selected-indicator {
439
- position: absolute;
440
- top: 8px;
441
- right: 8px;
442
- background: #52c41a;
443
- color: #fff;
444
- border-radius: 50%;
445
- width: 24px;
446
- height: 24px;
447
- display: flex;
448
- align-items: center;
449
- justify-content: center;
450
- font-size: 14px;
451
- font-weight: bold;
452
- }
453
-
454
- .mixed-payment-section {
455
- margin: 24px 0;
456
- padding: 20px;
457
- background: #f8f9fa;
458
- border-radius: 8px;
459
- border: 1px solid #e9ecef;
460
- }
461
-
462
- .mixed-payment-section.simple {
463
- padding: 0;
464
- background: transparent;
465
- border: none;
466
- }
467
-
468
- .mixed-payment-section.simple .payment-operation-row {
469
- border: none;
470
- background: transparent;
471
- padding: 0;
472
- margin-bottom: 12px;
473
- }
474
-
475
- .section-title {
476
- margin: 0 0 20px 0;
477
- font-size: 18px;
478
- font-weight: bold;
479
- color: #333;
480
- text-align: center;
481
- }
482
-
483
- .payment-operation-row {
484
- margin-bottom: 20px;
485
- padding: 16px;
486
- background: #fff;
487
- border-radius: 6px;
488
- border: 1px solid #d9d9d9;
489
- }
490
-
491
- .payment-method-header {
492
- display: flex;
493
- justify-content: space-between;
494
- align-items: center;
495
- margin-bottom: 16px;
496
- padding-bottom: 8px;
497
- border-bottom: 1px solid #f0f0f0;
498
- }
499
-
500
- .method-name {
501
- font-size: 16px;
502
- font-weight: bold;
503
- color: #1890ff;
504
- }
505
-
506
- .remove-btn {
507
- color: #ff4d4f;
508
- padding: 0;
509
- height: auto;
510
- }
511
-
512
- .remove-btn:hover {
513
- color: #ff7875;
514
- }
515
-
516
- .payment-fields {
517
- margin-top: 12px;
518
- }
519
-
520
- .payment-inline {
521
- display: flex;
522
- flex-wrap: nowrap;
523
- align-items: center;
524
- justify-content: center;
525
- column-gap: 32px;
526
- overflow-x: auto;
527
- }
528
-
529
- .inline-field {
530
- display: inline-flex;
531
- align-items: center;
532
- column-gap: 16px;
533
- white-space: nowrap;
534
- }
535
-
536
- .payment-inline .form-label {
537
- width: auto;
538
- }
539
-
540
- .pay-shortcut {
541
- font-size: 16px;
542
- color: #888;
543
- }
544
-
545
- .bottom-info {
546
- margin-top: 24px;
547
- display: flex;
548
- flex-wrap: wrap;
549
- row-gap: 16px;
550
- }
551
-
552
- .actions-row {
553
- margin-top: 32px;
554
- display: flex;
555
- justify-content: center;
556
- }
557
-
558
- .actions-row .ant-btn {
559
- margin: 0 8px;
560
- background: #444;
561
- color: #fff;
562
- border-radius: 6px;
563
- border: none;
564
- font-size: 16px;
565
- font-weight: 500;
566
- height: 38px;
567
- min-width: 90px;
568
- }
569
- </style>
1
+ <template>
2
+ <div class="xcharge-wrapper">
3
+ <!-- 顶部金额信息区(表单行风格,宽度固定,每行4个) -->
4
+ <a-row :gutter="0" class="amount-info">
5
+ <a-col v-for="item in config.amountFields" :key="item.field" :span="6" class="form-row">
6
+ <label class="form-label">{{ item.label }}</label>
7
+ <a-input
8
+ v-model="data[item.field]"
9
+ :value="data[item.field]"
10
+ :disabled="item.disabled"
11
+ class="form-input"
12
+ />
13
+ </a-col>
14
+ </a-row>
15
+
16
+ <a-divider/>
17
+
18
+ <!-- 支付方式选择区 -->
19
+ <div class="payment-methods">
20
+ <a-button
21
+ v-for="method in config.paymentMethods"
22
+ :key="method.key"
23
+ :class="['payment-btn', {
24
+ active: isMixedPaymentEnabled ? selectedMethods.includes(method.key) : selectedMethod === method.key
25
+ }]"
26
+ @click="isMixedPaymentEnabled ? toggleMethod(method.key) : selectMethod(method.key)"
27
+ >
28
+ <div>
29
+ <div class="pay-label">{{ method.label }}</div>
30
+ <div v-if="isMixedPaymentEnabled && selectedMethods.includes(method.key)" class="selected-indicator">✓</div>
31
+ </div>
32
+ </a-button>
33
+ </div>
34
+
35
+ <a-divider v-if="isMixedPaymentEnabled && selectedMethods.length > 1"/>
36
+
37
+ <!-- 支付详情(同一行展示,仅在混合支付且选择方式>1时出现) -->
38
+ <div v-if="isMixedPaymentEnabled && selectedMethods.length > 1" class="mixed-payment-section simple">
39
+ <div class="payment-operation-row">
40
+ <div class="payment-inline">
41
+ <div v-for="method in selectedMethods" :key="method" class="inline-field">
42
+ <label class="form-label">{{ getAmountLabel(method) }}</label>
43
+ <a-input
44
+ v-model="paymentAmounts[method]"
45
+ type="number"
46
+ placeholder="请输入金额"
47
+ class="form-input"
48
+ @change="updatePaymentAmount(method, $event)"
49
+ />
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ <a-divider/>
56
+
57
+ <!-- 底部金额和操作区(表单行风格,宽度固定) -->
58
+ <a-row :gutter="0" class="bottom-info">
59
+ <a-col v-for="item in config.bottomFields" :key="item.field" :span="8" class="form-row">
60
+ <label class="form-label">{{ item.label }}</label>
61
+ <a-input
62
+ v-model="data[item.field]"
63
+ :disabled="item.disabled"
64
+ class="form-input"
65
+ @change="bottomFieldsChange($event,item)"
66
+ />
67
+ </a-col>
68
+ </a-row>
69
+ <a-row class="actions-row" justify="center">
70
+ <a-button
71
+ v-for="btn in config.actionButtons"
72
+ :key="btn.key"
73
+ @click="handleAction(btn.key)"
74
+ :icon="btn.icon"
75
+ style="margin: 0 8px"
76
+ >
77
+ {{ btn.label }}
78
+ </a-button>
79
+ </a-row>
80
+ </div>
81
+ </template>
82
+
83
+ <script>
84
+ import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
85
+
86
+ export default {
87
+ name: 'XCharge',
88
+ props: {
89
+ queryParamsName: {
90
+ type: String,
91
+ default: ''
92
+ },
93
+ parameter: {
94
+ type: Object,
95
+ default: () => ({})
96
+ }
97
+ },
98
+ data () {
99
+ return {
100
+ config: {
101
+ amountFields: [],
102
+ paymentMethods: [],
103
+ bottomFields: [],
104
+ actionButtons: [],
105
+ enableMixedPayment: false // 默认关闭混合支付
106
+ },
107
+ data: {},
108
+ selectedMethod: '', // 保持向后兼容
109
+ selectedMethods: [], // 新增:支持多选支付方式
110
+ paymentAmounts: {}, // 各支付方式的金额
111
+ // 事件名配置(可通过配置覆盖)
112
+ eventNames: {
113
+ method: 'method',
114
+ methods: 'methods',
115
+ totalPaymentAmount: 'totalPaymentAmount',
116
+ action: 'action',
117
+ // 新增:单个支付方式金额变更事件
118
+ paymentAmountChange: 'paymentAmountChange'
119
+ },
120
+ hasInitialized: false
121
+ }
122
+ },
123
+ emits: ['init'],
124
+ computed: {
125
+ // 安全访问混合支付配置
126
+ isMixedPaymentEnabled () {
127
+ return this.config && this.config.enableMixedPayment === true
128
+ },
129
+ // 预计算:金额标签映射(仅基于 paymentMethods 配置)
130
+ amountLabelMap () {
131
+ const map = {}
132
+ const methods = Array.isArray(this.config.paymentMethods) ? this.config.paymentMethods : []
133
+ // 先用 methods 构建默认与自定义
134
+ methods.forEach(m => {
135
+ const key = m && m.key
136
+ const label = m && m.label
137
+ if (!key) return
138
+ map[key] = m && m.amountLabel ? m.amountLabel : `${label || key}金额`
139
+ })
140
+ return map
141
+ }
142
+ },
143
+ created () {
144
+ const hasParam = this.parameter && Object.keys(this.parameter).length > 0
145
+ // 始终加载组件配置;仅当有参数时,getConfig 内部才会拉取数据
146
+ this.getConfig(this.queryParamsName, this.parameter || {})
147
+ if (hasParam) this.hasInitialized = true
148
+ },
149
+ methods: {
150
+ // 同步 data 中的 selectedMethods / paymentAmounts 到本地状态;并补回缺失的 data 字段
151
+ hydrateFromData () {
152
+ const incomingMethods = Array.isArray(this.data && this.data.selectedMethods) ? this.data.selectedMethods : undefined
153
+ const incomingAmounts = this.data && this.data.paymentAmounts && typeof this.data.paymentAmounts === 'object' ? this.data.paymentAmounts : undefined
154
+
155
+ if (incomingMethods) {
156
+ this.selectedMethods = [...incomingMethods]
157
+ this.selectedMethod = this.selectedMethods[0] || ''
158
+ } else {
159
+ this.data.selectedMethods = [...this.selectedMethods]
160
+ this.data.selectedMethod = this.selectedMethod
161
+ }
162
+
163
+ if (incomingAmounts) {
164
+ // 用 $set 逐项写入,保持响应式
165
+ Object.keys(incomingAmounts).forEach(k => this.$set(this.paymentAmounts, k, incomingAmounts[k]))
166
+ } else if (!this.data.paymentAmounts) {
167
+ this.$set(this.data, 'paymentAmounts', { ...this.paymentAmounts })
168
+ }
169
+
170
+ // 根据 amounts 回算合计
171
+ this.calculateTotalPayment()
172
+ },
173
+ selectMethod (value) {
174
+ this.selectedMethod = value
175
+ this.data.selectedMethod = value
176
+ // 单一模式下初始化对应的支付数据
177
+ if (!this.isMixedPaymentEnabled && value) {
178
+ if (!this.paymentAmounts[value]) this.initPaymentData(value)
179
+ }
180
+ // 同步到数据模型,单一模式下也记录 selectedMethods 便于父层读取
181
+ this.data.selectedMethods = this.isMixedPaymentEnabled ? [...this.selectedMethods] : (value ? [value] : [])
182
+ this.$emit(this.eventNames.method, value)
183
+ },
184
+ // 新增:切换支付方式选择(支持多选)
185
+ toggleMethod (methodKey) {
186
+ const index = this.selectedMethods.indexOf(methodKey)
187
+ if (index > -1) {
188
+ // 如果已选中,则移除
189
+ this.selectedMethods.splice(index, 1)
190
+ this.removePaymentData(methodKey)
191
+ } else {
192
+ // 如果未选中,则添加
193
+ this.selectedMethods.push(methodKey)
194
+ this.initPaymentData(methodKey)
195
+ }
196
+
197
+ // 更新选中状态
198
+ this.selectedMethod = this.selectedMethods.length > 0 ? this.selectedMethods[0] : ''
199
+ this.data.selectedMethod = this.selectedMethod
200
+ this.data.selectedMethods = [...this.selectedMethods]
201
+
202
+ this.$emit(this.eventNames.methods, this.selectedMethods)
203
+ this.$emit(this.eventNames.method, this.selectedMethod) // 保持向后兼容
204
+ },
205
+ // 新增:移除支付方式
206
+ removeMethod (methodKey) {
207
+ const index = this.selectedMethods.indexOf(methodKey)
208
+ if (index > -1) {
209
+ this.selectedMethods.splice(index, 1)
210
+ this.removePaymentData(methodKey)
211
+ // 同步所选方式到数据模型
212
+ this.data.selectedMethods = [...this.selectedMethods]
213
+ this.selectedMethod = this.selectedMethods[0] || ''
214
+ this.data.selectedMethod = this.selectedMethod
215
+ this.$emit(this.eventNames.methods, this.selectedMethods)
216
+ }
217
+ },
218
+ // 新增:初始化支付数据(可传入初始金额,默认空字符串)
219
+ initPaymentData (methodKey, initialValue = '') {
220
+ this.$set(this.paymentAmounts, methodKey, initialValue)
221
+ if (!this.data.paymentAmounts || typeof this.data.paymentAmounts !== 'object') this.$set(this.data, 'paymentAmounts', {})
222
+ this.$set(this.data.paymentAmounts, methodKey, initialValue)
223
+ },
224
+ // 新增:移除支付数据
225
+ removePaymentData (methodKey) {
226
+ this.$delete(this.paymentAmounts, methodKey)
227
+ if (this.data && this.data.paymentAmounts) this.$delete(this.data.paymentAmounts, methodKey)
228
+ },
229
+ // 新增:获取支付方式标签
230
+ getMethodLabel (methodKey) {
231
+ const method = this.config.paymentMethods.find(m => m.key === methodKey)
232
+ return method ? method.label : methodKey
233
+ },
234
+ // 获取支付金额字段标签(优先配置映射,其次方法自带 amountLabel,最后回退)
235
+ getAmountLabel (methodKey) {
236
+ const mapped = (this.config.paymentAmountLabels && this.config.paymentAmountLabels[methodKey]) || ''
237
+ if (mapped) return mapped
238
+ const method = this.config.paymentMethods.find(m => m.key === methodKey)
239
+ if (method && method.amountLabel) return method.amountLabel
240
+ return `${method ? method.label : methodKey}金额`
241
+ },
242
+ // 新增:更新支付金额
243
+ updatePaymentAmount (methodKey, event) {
244
+ const amount = parseFloat(event.target.value) || 0
245
+ this.$set(this.paymentAmounts, methodKey, amount)
246
+ if (!this.data.paymentAmounts || typeof this.data.paymentAmounts !== 'object') this.$set(this.data, 'paymentAmounts', {})
247
+ this.$set(this.data.paymentAmounts, methodKey, amount)
248
+ this.calculateTotalPayment()
249
+ // 单个方式金额变更事件,向父组件上抛
250
+ this.$emit(this.eventNames.paymentAmountChange, { method: methodKey, amount })
251
+ },
252
+ // 新增:计算总支付金额
253
+ calculateTotalPayment () {
254
+ const total = Object.values(this.paymentAmounts).reduce((sum, amount) => {
255
+ return sum + (parseFloat(amount) || 0)
256
+ }, 0)
257
+ this.data.totalPaymentAmount = total
258
+ this.$emit(this.eventNames.totalPaymentAmount, total)
259
+ },
260
+ getConfig (configName, param) {
261
+ if (configName) {
262
+ console.log('configName', configName)
263
+ getConfigByName(configName, 'af-his', res => {
264
+ console.log('res', res)
265
+ // 检查是否有错误
266
+ if (res && res.ERROR) {
267
+ console.warn('配置获取失败:', res.ERROR)
268
+ return
269
+ }
270
+ this.config = {
271
+ amountFields: res.amountFields || [],
272
+ paymentMethods: res.paymentMethods || [],
273
+ bottomFields: res.bottomFields || [],
274
+ actionButtons: res.actionButtons || [],
275
+ enableMixedPayment: res.enableMixedPayment === true
276
+ }
277
+ // 事件名覆盖(fronImport风格)
278
+ if (res.eventNames && typeof res.eventNames === 'object') {
279
+ this.eventNames = { ...this.eventNames, ...res.eventNames }
280
+ }
281
+ // 处理默认选中项(支持 paymentMethods[].default === true)
282
+ const methods = Array.isArray(this.config.paymentMethods) ? this.config.paymentMethods : []
283
+ const defaultMethods = methods.filter(m => m && m.default === true)
284
+
285
+ if (this.isMixedPaymentEnabled) {
286
+ // 混合支付:默认选中全部 default=true 的方式;若没有默认,则保留现有逻辑选择第一个
287
+ if (defaultMethods.length > 0) {
288
+ this.selectedMethods = defaultMethods.map(m => m.key).filter(Boolean)
289
+ } else if (methods.length > 0) {
290
+ this.selectedMethods = [methods[0].key]
291
+ } else {
292
+ this.selectedMethods = []
293
+ }
294
+ // 初始化金额为 0
295
+ this.selectedMethods.forEach(k => this.initPaymentData(k, 0))
296
+ this.selectedMethod = this.selectedMethods[0] || ''
297
+ // 同步到数据模型
298
+ this.data.selectedMethods = [...this.selectedMethods]
299
+ } else {
300
+ // 单一支付:若存在默认项,选中第一个默认;否则选中第一个
301
+ if (defaultMethods.length > 0) {
302
+ this.selectedMethod = defaultMethods[0] && defaultMethods[0].key || ''
303
+ } else {
304
+ this.selectedMethod = methods[0] && methods[0].key || ''
305
+ }
306
+ if (this.selectedMethod) this.initPaymentData(this.selectedMethod, 0)
307
+ // 同步到数据模型,单一模式下也记录 selectedMethods
308
+ this.data.selectedMethods = this.selectedMethod ? [this.selectedMethod] : []
309
+ }
310
+
311
+ // 初始化数据:仅当传入了有效 param 时才拉取数据
312
+ const hasParam = param && Object.keys(param || {}).length > 0
313
+ if (hasParam && res.dataSourceConfig) {
314
+ runLogic(res.dataSourceConfig, param, 'af-his').then(resData => {
315
+ // 合并数据,避免覆盖 selectedMethods / paymentAmounts 等本地状态
316
+ this.data = { ...this.data, ...resData }
317
+ // 让本地状态与 data 保持一致
318
+ this.hydrateFromData()
319
+ }).catch(error => {
320
+ console.warn('数据获取失败(保持现有数据):', error)
321
+ })
322
+ }
323
+ })
324
+ }
325
+ },
326
+ refreshList (param) {
327
+ this.getConfig(this.queryParamsName, param)
328
+ },
329
+ async init (conditionData) {
330
+ if (conditionData.data) {
331
+ // 合并初始化数据,避免覆盖 selectedMethods / paymentAmounts 等本地状态
332
+ this.data = { ...this.data, ...conditionData.data }
333
+ this.hydrateFromData()
334
+ }
335
+ if (conditionData.params) {
336
+ await this.getConfig(this.queryParamsName, conditionData.params)
337
+ }
338
+ this.hasInitialized = true
339
+ },
340
+ // 使用默认数据
341
+ useDefaultData () {
342
+ this.data = {
343
+ f_amount: 100,
344
+ f_insurance_amount: 0,
345
+ f_self_amount: 100,
346
+ f_balance: 100,
347
+ out_of_pocket_amount: 0,
348
+ biscount_amount: 0,
349
+ billing_amount: 0,
350
+ received: 100,
351
+ change: 0
352
+ }
353
+ },
354
+ handleAction (key) {
355
+ console.warn('选择的的方法 ====》' + key)
356
+ console.warn('页面数据 ====》' + JSON.stringify(this.data))
357
+ console.warn('选择的支付方式 ====》' + this.selectedMethod)
358
+
359
+ if (this.isMixedPaymentEnabled) {
360
+ console.warn('混合支付方式 ====》' + JSON.stringify(this.selectedMethods))
361
+ console.warn('支付详情 ====》' + JSON.stringify({ amounts: this.paymentAmounts }))
362
+ }
363
+
364
+ const actionData = {
365
+ key,
366
+ data: this.data,
367
+ method: this.selectedMethod,
368
+ // 统一返回支付详情,单一模式时 selectedMethods 仅含一个
369
+ mixedPayment: {
370
+ selectedMethods: this.isMixedPaymentEnabled ? this.selectedMethods : (this.selectedMethod ? [this.selectedMethod] : []),
371
+ paymentAmounts: this.paymentAmounts,
372
+ totalPaymentAmount: this.data.totalPaymentAmount || 0
373
+ }
374
+ }
375
+
376
+ this.$emit(this.eventNames.action, actionData)
377
+ },
378
+ bottomFieldsChange (e, item) {
379
+ // 统一抛出到底部字段变更事件到父级组件
380
+ this.$emit('bottomFieldChange', {
381
+ event: e,
382
+ item: item,
383
+ field: item.field,
384
+ value: e && e.target ? e.target.value : undefined
385
+ })
386
+
387
+ // 保持原有的自定义事件逻辑(向后兼容)
388
+ if (item.changeEventName && this.$listeners[item.changeEventName]) this.$emit(item.changeEventName, e, item)
389
+ }
390
+ },
391
+ watch: {
392
+ configName (val) {
393
+ this.getConfig()
394
+ }
395
+ }
396
+ }
397
+ </script>
398
+
399
+ <style scoped>
400
+ .xcharge-wrapper {
401
+ background: #fff;
402
+ padding: 24px;
403
+ border-radius: 8px;
404
+ }
405
+
406
+ .amount-info {
407
+ margin-bottom: 20px;
408
+ display: flex;
409
+ flex-wrap: wrap;
410
+ row-gap: 16px;
411
+ }
412
+
413
+ .form-row {
414
+ display: flex;
415
+ align-items: center;
416
+ margin-bottom: 30px;
417
+ }
418
+
419
+ .form-label {
420
+ width: 100px;
421
+ font-size: 18px;
422
+ color: #333;
423
+ font-weight: bold;
424
+ text-align: left;
425
+ letter-spacing: 1px;
426
+ flex-shrink: 0;
427
+ }
428
+
429
+ .form-input {
430
+ width: 180px;
431
+ height: 40px;
432
+ font-size: 18px;
433
+ border-radius: 8px;
434
+ border: 1.5px solid #dcdfe6;
435
+ background: #fff;
436
+ color: #333;
437
+ padding-left: 12px;
438
+ }
439
+
440
+ .form-input[disabled] {
441
+ color: #999;
442
+ background: #f5f5f5;
443
+ }
444
+
445
+ .payment-methods {
446
+ display: flex;
447
+ justify-content: space-around;
448
+ margin: 32px 0;
449
+ }
450
+
451
+ .payment-btn {
452
+ width: 180px;
453
+ height: 120px;
454
+ margin: 0 16px;
455
+ display: flex;
456
+ align-items: center;
457
+ justify-content: center;
458
+ background: #f7f8fa;
459
+ border: 1.5px solid #e4e7ed;
460
+ color: #333;
461
+ font-weight: bold;
462
+ font-size: 24px;
463
+ transition: all 0.2s;
464
+ box-shadow: none;
465
+ border-radius: 12px;
466
+ }
467
+
468
+ .payment-btn.active {
469
+ background: #409eff;
470
+ border-color: #409eff;
471
+ color: #fff;
472
+ }
473
+
474
+ .pay-label {
475
+ font-size: 24px;
476
+ font-weight: bold;
477
+ }
478
+
479
+ .selected-indicator {
480
+ position: absolute;
481
+ top: 8px;
482
+ right: 8px;
483
+ background: #52c41a;
484
+ color: #fff;
485
+ border-radius: 50%;
486
+ width: 24px;
487
+ height: 24px;
488
+ display: flex;
489
+ align-items: center;
490
+ justify-content: center;
491
+ font-size: 14px;
492
+ font-weight: bold;
493
+ }
494
+
495
+ .mixed-payment-section {
496
+ margin: 24px 0;
497
+ padding: 20px;
498
+ background: #f8f9fa;
499
+ border-radius: 8px;
500
+ border: 1px solid #e9ecef;
501
+ }
502
+
503
+ .mixed-payment-section.simple {
504
+ padding: 0;
505
+ background: transparent;
506
+ border: none;
507
+ }
508
+
509
+ .mixed-payment-section.simple .payment-operation-row {
510
+ border: none;
511
+ background: transparent;
512
+ padding: 0;
513
+ margin-bottom: 12px;
514
+ }
515
+
516
+ .section-title {
517
+ margin: 0 0 20px 0;
518
+ font-size: 18px;
519
+ font-weight: bold;
520
+ color: #333;
521
+ text-align: center;
522
+ }
523
+
524
+ .payment-operation-row {
525
+ margin-bottom: 20px;
526
+ padding: 16px;
527
+ background: #fff;
528
+ border-radius: 6px;
529
+ border: 1px solid #d9d9d9;
530
+ }
531
+
532
+ .payment-method-header {
533
+ display: flex;
534
+ justify-content: space-between;
535
+ align-items: center;
536
+ margin-bottom: 16px;
537
+ padding-bottom: 8px;
538
+ border-bottom: 1px solid #f0f0f0;
539
+ }
540
+
541
+ .method-name {
542
+ font-size: 16px;
543
+ font-weight: bold;
544
+ color: #1890ff;
545
+ }
546
+
547
+ .remove-btn {
548
+ color: #ff4d4f;
549
+ padding: 0;
550
+ height: auto;
551
+ }
552
+
553
+ .remove-btn:hover {
554
+ color: #ff7875;
555
+ }
556
+
557
+ .payment-fields {
558
+ margin-top: 12px;
559
+ }
560
+
561
+ .payment-inline {
562
+ display: flex;
563
+ flex-wrap: nowrap;
564
+ align-items: center;
565
+ justify-content: center;
566
+ column-gap: 32px;
567
+ overflow-x: auto;
568
+ }
569
+
570
+ .inline-field {
571
+ display: inline-flex;
572
+ align-items: center;
573
+ column-gap: 16px;
574
+ white-space: nowrap;
575
+ }
576
+
577
+ .payment-inline .form-label {
578
+ width: auto;
579
+ }
580
+
581
+ .pay-shortcut {
582
+ font-size: 16px;
583
+ color: #888;
584
+ }
585
+
586
+ .bottom-info {
587
+ margin-top: 24px;
588
+ display: flex;
589
+ flex-wrap: wrap;
590
+ row-gap: 16px;
591
+ }
592
+
593
+ .actions-row {
594
+ margin-top: 32px;
595
+ display: flex;
596
+ justify-content: center;
597
+ }
598
+
599
+ .actions-row .ant-btn {
600
+ margin: 0 8px;
601
+ background: #444;
602
+ color: #fff;
603
+ border-radius: 6px;
604
+ border: none;
605
+ font-size: 16px;
606
+ font-weight: 500;
607
+ height: 38px;
608
+ min-width: 90px;
609
+ }
610
+ </style>