vue2-client 1.16.61 → 1.16.63

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 (341) hide show
  1. package/.claude/settings.local.json +21 -16
  2. package/.cursorrules +19 -19
  3. package/.env.apply +19 -19
  4. package/.env.gaslink +19 -19
  5. package/.env.his +19 -19
  6. package/.env.liuli +20 -20
  7. package/.env.scada +19 -19
  8. package/.eslintrc.js +90 -90
  9. package/.serena/project.yml +67 -0
  10. package/CHANGELOG.md +824 -824
  11. package/CLAUDE.md +98 -90
  12. package/Components.md +60 -60
  13. package/docs/LowCode/lowcode.md +155 -155
  14. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  15. package/docs/index.md +30 -30
  16. package/index.js +31 -31
  17. package/jest-transform-stub.js +8 -8
  18. package/jest.setup.js +7 -7
  19. package/jsconfig.json +19 -19
  20. package/package.json +112 -112
  21. package/public/his/editor/editor.html +51 -51
  22. package/public/his/editor/mock/bind_data.html +779 -779
  23. package/public/his/editor/mock/data_table.html +40 -40
  24. package/public/his/editor/mock/sign.html +75 -75
  25. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  26. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  27. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  28. package/public/his/editor/vender/date97/calendar.js +4 -4
  29. package/public/his/editor/vender/date97/lang/en.js +13 -13
  30. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  31. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  32. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  33. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  34. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  35. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  36. package/public/his/editor/vender/diff.js +1627 -1627
  37. package/public/his/editor/vender/editor.js +1 -1
  38. package/public/his/editor/vender/fabric.js +31187 -31187
  39. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  40. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  41. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  42. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  43. package/public/his/editor/vender/mui/mui.min.css +4 -4
  44. package/public/his/editor/vender/mui/mui.min.js +5 -5
  45. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  46. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  47. package/public/his/editor/vender/qrcode.js +7 -7
  48. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  49. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  50. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  51. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  52. package/public/his/editor/vender/validator.js +5094 -5094
  53. package/public/his/editor/vender/weui/weui.css +5659 -5659
  54. package/public/his/editor/vender/weui/weui.min.css +4 -4
  55. package/public/his/editor/vender/weui/weui.min.js +11 -11
  56. package/src/assets/img/querySlotDemo.svg +15 -15
  57. package/src/assets/svg/badtwo.svg +1 -1
  58. package/src/assets/svg/female.svg +1 -1
  59. package/src/assets/svg/goodtwo.svg +1 -1
  60. package/src/assets/svg/male.svg +1 -1
  61. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  62. package/src/base-client/components/AI/demo.vue +31 -31
  63. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  64. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  65. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  66. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  67. package/src/base-client/components/common/CitySelect/index.js +3 -3
  68. package/src/base-client/components/common/CitySelect/index.md +109 -109
  69. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  70. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  71. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  72. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  73. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  74. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  75. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  76. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  77. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  78. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  79. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  80. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  81. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  82. package/src/base-client/components/common/HIS/HFormGroup/index.js +3 -3
  83. package/src/base-client/components/common/HIS/HFormTable/HFormTable.vue +379 -379
  84. package/src/base-client/components/common/HIS/demo.vue +14 -14
  85. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  86. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  87. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  88. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  89. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  90. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  91. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  92. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  93. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  94. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  95. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  96. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  97. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  98. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  99. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  100. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  101. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  102. package/src/base-client/components/common/Recording/index.js +3 -3
  103. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  104. package/src/base-client/components/common/Tree/index.js +2 -2
  105. package/src/base-client/components/common/Upload/Upload.vue +334 -334
  106. package/src/base-client/components/common/Upload/index.js +3 -3
  107. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  108. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  109. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  110. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  111. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  112. package/src/base-client/components/common/XAddReport/index.js +3 -3
  113. package/src/base-client/components/common/XAddReport/index.md +56 -56
  114. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  115. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  116. package/src/base-client/components/common/XButtons/index.js +3 -3
  117. package/src/base-client/components/common/XButtons/index.md +61 -61
  118. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  119. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  120. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  121. package/src/base-client/components/common/XCollapse/XCollapse.vue +708 -708
  122. package/src/base-client/components/common/XDataCard/index.js +3 -3
  123. package/src/base-client/components/common/XDataCard/index.md +1 -1
  124. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  125. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  126. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  127. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  128. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  129. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  130. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  131. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  132. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  133. package/src/base-client/components/common/XForm/index.md +178 -178
  134. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  135. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  136. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  137. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  138. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  139. package/src/base-client/components/common/XFormTable/index.md +92 -92
  140. package/src/base-client/components/common/XInput/XInput.vue +147 -147
  141. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  142. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  143. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  144. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  145. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  146. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  147. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  148. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  149. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  150. package/src/base-client/components/common/XPrint/index.vue +97 -97
  151. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  152. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  153. package/src/base-client/components/common/XReport/index.js +3 -3
  154. package/src/base-client/components/common/XReport/print.js +186 -186
  155. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  156. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +1 -1
  157. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +19 -5
  158. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  159. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  160. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  161. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  162. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  163. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  164. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  165. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  166. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  167. package/src/base-client/components/common/XStepView/index.js +3 -3
  168. package/src/base-client/components/common/XStepView/index.md +31 -31
  169. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  170. package/src/base-client/components/common/XTab/index.js +3 -3
  171. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  172. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  173. package/src/base-client/components/common/XTable/XTable.vue +1610 -1610
  174. package/src/base-client/components/common/XTable/index.md +255 -255
  175. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  176. package/src/base-client/components/common/XTimeline/XTimeline.vue +454 -454
  177. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  178. package/src/base-client/components/common/XTree/XTreePro.vue +12 -0
  179. package/src/base-client/components/common/XTree/index.js +3 -3
  180. package/src/base-client/components/common/XTree/index.md +36 -36
  181. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  182. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  183. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  184. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  185. package/src/base-client/components/his/XCharge/XChargeDemo.vue +145 -146
  186. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +705 -705
  187. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  188. package/src/base-client/components/his/XList/XList.vue +829 -829
  189. package/src/base-client/components/his/threeTestOrders/editor.vue +113 -113
  190. package/src/base-client/components/index.js +51 -51
  191. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  192. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  193. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  194. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  195. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  196. package/src/base-client/plugins/Config.js +19 -19
  197. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  198. package/src/base-client/plugins/Recording.js +258 -258
  199. package/src/base-client/plugins/index.js +23 -23
  200. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  201. package/src/components/Charts/Bar.vue +62 -62
  202. package/src/components/Charts/ChartCard.vue +134 -134
  203. package/src/components/Charts/Liquid.vue +67 -67
  204. package/src/components/Charts/MiniArea.vue +39 -39
  205. package/src/components/Charts/MiniBar.vue +39 -39
  206. package/src/components/Charts/MiniProgress.vue +75 -75
  207. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  208. package/src/components/Charts/Radar.vue +68 -68
  209. package/src/components/Charts/RankList.vue +77 -77
  210. package/src/components/Charts/TagCloud.vue +113 -113
  211. package/src/components/Charts/TransferBar.vue +64 -64
  212. package/src/components/Charts/Trend.vue +82 -82
  213. package/src/components/Charts/chart.less +12 -12
  214. package/src/components/Charts/smooth.area.less +13 -13
  215. package/src/components/CodeMirror/inedx.vue +118 -118
  216. package/src/components/CodeMirror/setting.js +40 -40
  217. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  218. package/src/components/NumberInfo/index.js +3 -3
  219. package/src/components/NumberInfo/index.less +54 -54
  220. package/src/components/NumberInfo/index.md +43 -43
  221. package/src/components/card/ChartCard.vue +79 -79
  222. package/src/components/chart/Bar.vue +60 -60
  223. package/src/components/chart/MiniArea.vue +67 -67
  224. package/src/components/chart/MiniBar.vue +59 -59
  225. package/src/components/chart/MiniProgress.vue +57 -57
  226. package/src/components/chart/Radar.vue +80 -80
  227. package/src/components/chart/RankingList.vue +60 -60
  228. package/src/components/chart/Trend.vue +79 -79
  229. package/src/components/chart/index.less +9 -9
  230. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  231. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  232. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  233. package/src/components/checkbox/index.js +9 -9
  234. package/src/components/exception/ExceptionPage.vue +70 -70
  235. package/src/components/g2Charts/constants.js +202 -202
  236. package/src/components/g2Charts/demo.vue +808 -808
  237. package/src/components/g2Charts/designer.vue +228 -228
  238. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  239. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  240. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  241. package/src/components/g2Charts/index.vue +397 -397
  242. package/src/components/index.js +36 -36
  243. package/src/components/input/IInput.vue +66 -66
  244. package/src/components/menu/SideMenu.vue +75 -75
  245. package/src/components/menu/menu.js +273 -273
  246. package/src/components/setting/Setting.vue +234 -234
  247. package/src/components/tool/AStepItem.vue +60 -60
  248. package/src/config/CreateQueryConfig.js +325 -325
  249. package/src/config/default/antd.config.js +89 -89
  250. package/src/config/default/setting.config.js +55 -55
  251. package/src/font-style/font.css +60 -60
  252. package/src/layouts/CommonLayout.vue +56 -56
  253. package/src/layouts/PageLayout.vue +151 -151
  254. package/src/layouts/SinglePageView.vue +136 -136
  255. package/src/layouts/header/AdminHeader.vue +132 -132
  256. package/src/layouts/header/HeaderNotice.vue +177 -177
  257. package/src/layouts/header/InstitutionDetail.vue +181 -181
  258. package/src/layouts/tabs/TabsHead.vue +189 -189
  259. package/src/lib.js +1 -1
  260. package/src/mock/extend/index.js +84 -84
  261. package/src/mock/goods/index.js +108 -108
  262. package/src/pages/DefaultExample/index.vue +77 -77
  263. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  264. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  265. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  266. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  267. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  268. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  269. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  270. package/src/pages/DynamicStatistics/index.vue +282 -282
  271. package/src/pages/Example/childIndex.vue +15 -15
  272. package/src/pages/Example/index.vue +30 -30
  273. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  274. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  275. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  276. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  277. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  278. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  279. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  280. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  281. package/src/pages/Recording/index.vue +77 -77
  282. package/src/pages/ServiceReview/index.vue +284 -284
  283. package/src/pages/SubExample/index.vue +26 -26
  284. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  285. package/src/pages/XReportView/index.vue +64 -64
  286. package/src/pages/XTreeOneProExample/index.vue +67 -67
  287. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  288. package/src/pages/login/Login.vue +379 -379
  289. package/src/pages/login/LoginV3.vue +389 -389
  290. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  291. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  292. package/src/pages/report/ReportTable.js +124 -124
  293. package/src/pages/resourceManage/orgListManage.vue +98 -98
  294. package/src/pages/system/dictionary/index.vue +44 -44
  295. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  296. package/src/pages/system/monitor/operLog/index.vue +37 -37
  297. package/src/pages/system/settings/modifyPassword.vue +117 -117
  298. package/src/pages/system/ticket/index.vue +480 -480
  299. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  300. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  301. package/src/pages/userInfoDetailManage/ExceptionRecordQuery/index.vue +45 -45
  302. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  303. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  304. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  305. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  306. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  307. package/src/plugins/EventLogPlugin.js +33 -33
  308. package/src/plugins/FindParentsData.js +17 -17
  309. package/src/router/async/config.async.js +35 -35
  310. package/src/router/async/router.map.js +130 -129
  311. package/src/router/index.js +27 -27
  312. package/src/services/DataModel.js +30 -30
  313. package/src/services/LodopFuncs.js +137 -137
  314. package/src/services/api/TicketDetailsViewApi.js +46 -46
  315. package/src/services/api/cas.js +79 -79
  316. package/src/services/api/entity.js +18 -18
  317. package/src/services/api/index.js +17 -17
  318. package/src/store/modules/account.js +115 -115
  319. package/src/store/modules/index.js +5 -5
  320. package/src/store/modules/lowCode.js +33 -33
  321. package/src/store/modules/setting.js +119 -119
  322. package/src/theme/default/style.less +58 -58
  323. package/src/utils/authority-utils.js +85 -85
  324. package/src/utils/errorCode.js +6 -6
  325. package/src/utils/formatter.js +74 -74
  326. package/src/utils/htmlToPDF.js +108 -108
  327. package/src/utils/htmlToPDFApi.js +5 -5
  328. package/src/utils/login.js +188 -188
  329. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  330. package/src/utils/lowcode/lowcodeLog.js +29 -29
  331. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  332. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  333. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  334. package/src/utils/map-utils.js +47 -47
  335. package/src/utils/reg.js +95 -95
  336. package/src/utils/runEvalFunction.js +14 -14
  337. package/src/utils/theme-color-replacer-extend.js +92 -92
  338. package/src/utils/util.js +329 -329
  339. package/src/utils/waterMark.js +31 -31
  340. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
  341. package/src-base-client/components/common/XCollapse/XCollapse.vue +0 -0
@@ -1,708 +1,708 @@
1
- <template>
2
- <div class="x-collapse-wrapper" :class="wrapperClassObject">
3
- <div class="collapse-content-wrapper" :class="{ 'with-pagination': shouldShowPagination }">
4
- <a-collapse
5
- :activeKey="activeKey"
6
- @change="handleChange"
7
- :bordered="config.bordered || true"
8
- :expand-icon-position="config.expandIconPosition || 'right'"
9
- :style="config.style || ''"
10
- >
11
- <a-collapse-panel
12
- v-for="(panel, panelIndex) in pagedPanels"
13
- :key="panelIndex.toString()"
14
- :show-arrow="config.showArrow || false"
15
- :disabled="config.collapsible">
16
- <template #header>
17
- <div class="header-content">
18
- <!-- 新增蓝色圆点图标,根据配置显示 -->
19
- <div
20
- v-if="config.showCircleIcon"
21
- class="blue-circle-icon"
22
- :style="config.circleIconStyle || {}"></div>
23
- <span
24
- class="header-text"
25
- :style="config.titleStyle">
26
- {{ getPanelTitle(panel) }}
27
- </span>
28
- <!-- 当有 title2 数据时显示信息项 -->
29
- <template v-if="panel.title2 && panel.title2.length">
30
- <span
31
- v-for="(item, headerIndex) in panel.title2"
32
- :key="headerIndex"
33
- class="info-item"
34
- :style="config.title2Style">
35
- <!-- 根据showTitle是否显示键名 -->
36
- <span v-if="item.showTitle">{{ item.key }};</span>
37
- <span>{{ item.value }}</span>
38
- </span>
39
- </template>
40
- <!-- 当有 title3 数据时显示时间项(与 title2 一致:支持数组/单项) -->
41
- <template v-if="panel.title3 && Array.isArray(panel.title3) && panel.title3.length">
42
- <span
43
- v-for="(item, t3Index) in panel.title3"
44
- :key="t3Index"
45
- :class="['time-item', { 'time-first': t3Index === 0 }]"
46
- :style="config.title3Style">
47
- <span v-if="item.showTitle">{{ item.key }}:</span>
48
- <span>{{ item.value }}</span>
49
- </span>
50
- </template>
51
- <span
52
- v-else-if="panel.title3"
53
- class="time-item time-first"
54
- :style="config.title3Style">
55
- {{ panel.title3 }}
56
- </span>
57
- <!-- 修改搜索框的显示条件 -->
58
- <a-input-search
59
- v-if="panel.search"
60
- v-model="searchText[panelIndex]"
61
- :placeholder="panel.searchPlace"
62
- class="search-input"
63
- @search="(value) => onSearch(value, panelIndex)"
64
- @click.stop/>
65
- </div>
66
- </template>
67
-
68
- <!-- 新增设置图标,根据配置显示 -->
69
- <template #extra v-if="config.showSettingIcon">
70
- <a-icon
71
- v-if="activeKey.includes(panelIndex.toString())"
72
- :type="config.settingIconType || 'setting'"
73
- class="setting-icon"
74
- @click.stop="handleSettingClick(panel, panelIndex)"/>
75
- </template>
76
-
77
- <!-- 根据类型显示不同内容 -->
78
- <template v-if="panel.type === 'picture'">
79
- <img :src="panel.configName" alt="图片" style="width: 100%; max-width: 500px;"/>
80
- </template>
81
- <template v-else-if="['x-image-report','x-form-table','x-simple-table','x-add-native-form','x-tree-pro', 'x-his-editor', 'x-tab', 'x-form-group', 'x-report', 'x-buttons', 'x-label-select', 'x-conversation', 'x-check-list', 'x-cardSet', 'x-collapse','x-h-descriptions', 'x-sidebar', 'x-list','x-input','x-time-line', 'x-radio', 'x-text-card','x-tree-rows'].includes(panel.type)">
82
- <component
83
- :is="getComponentName(panel.type)"
84
- :ref="`dynamicComponent_${ panel.type }_${ panelIndex }`"
85
- :serverName="panel.serverName || 'af-his'"
86
- :queryParamsName="panel.configName"
87
- :parameter="panel.parameter"
88
- :countVisible="false"
89
- :env="env"
90
- :style="config.componentStyle || ''"
91
- v-bind="panel.attrs || {}"
92
- :class="panel.className"
93
- :ipanelIndex="panelIndex"
94
- @deleteData="deleteData"
95
- @add="add"
96
- @listClick="listClick"
97
- @click="click"
98
- @component-mounted="handleMounted"
99
- @search-complete="handleSearchComplete" />
100
- </template>
101
- </a-collapse-panel>
102
- </a-collapse>
103
- <div v-if="shouldShowPagination" class="xcollapse-pagination">
104
- <div class="pagination-extras">
105
- <a-button-group size="small">
106
- <a-button icon="vertical-right" :disabled="paginationCurrent === 1" @click="goFirstPage"/>
107
- <a-pagination
108
- :current="paginationCurrent"
109
- :pageSize="paginationPageSize"
110
- :total="paginationTotal"
111
- :showSizeChanger="false"
112
- show-less-items
113
- @change="onPageChange"/>
114
- <a-button icon="vertical-left" :disabled="paginationCurrent === maxPage" @click="goLastPage"/>
115
- </a-button-group>
116
- <span class="pagination-info">共 {{ maxPage }} 页, {{ paginationTotal }} 条</span>
117
- </div>
118
- </div>
119
- </div>
120
- </div>
121
- </template>
122
-
123
- <script>
124
- import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
125
-
126
- export default {
127
- name: 'XCollapse',
128
- components: {
129
- XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'),
130
- XAddNativeForm: () => import('@vue2-client/base-client/components/common/XAddNativeForm/XAddNativeForm.vue'),
131
- XFormGroup: () => import('@vue2-client/base-client/components/common/XFormGroup/XFormGroup.vue'),
132
- XTreePro: () => import('@vue2-client/base-client/components/common/XTree/XTreePro.vue'),
133
- XHisEditor: () => import('@vue2-client/base-client/components/his/XHisEditor/XHisEditor.vue'),
134
- XTab: () => import('@vue2-client/base-client/components/common/XTab/XTab.vue'),
135
- XReport: () => import('@vue2-client/base-client/components/common/XReport/XReport.vue'),
136
- XButtons: () => import('@vue2-client/base-client/components/common/XButtons/XButtons.vue'),
137
- XLabelSelect: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelect.vue'),
138
- XConversation: () => import('@vue2-client/base-client/components/common/XConversation/XConversation.vue'),
139
- XCheckList: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
140
- XCardSet: () => import('@vue2-client/base-client/components/common/XCardSet/XCardSet.vue'),
141
- XCollapse: () => import('@vue2-client/base-client/components/common/XCollapse/XCollapse.vue'),
142
- XHDescriptions: () => import('@vue2-client/base-client/components/his/XHDescriptions/XHDescriptions.vue'),
143
- XImageReport: () => import('@vue2-client/base-client/components/his/XImageReport/XImageReport.vue'),
144
- XSidebar: () => import('@vue2-client/base-client/components/his/XSidebar/XSidebar.vue'),
145
- XList: () => import('@vue2-client/base-client/components/his/XList/XList.vue'),
146
- XInput: () => import('@vue2-client/base-client/components/common/XInput/XInput.vue'),
147
- XTimeLine: () => import('@vue2-client/base-client/components/common/XTimeline/XTimeline.vue'),
148
- XRadio: () => import('@vue2-client/base-client/components/his/XRadio/XRadio.vue'),
149
- XTextCard: () => import('@vue2-client/base-client/components/his/XTextCard/XTextCard.vue'),
150
- XTreeRows: () => import('@vue2-client/base-client/components/his/XTreeRows/XTreeRows.vue'),
151
- XSimpleTable: () => import('@vue2-client/base-client/components/his/XSimpleTable/XSimpleTable.vue')
152
- },
153
- data () {
154
- return {
155
- activeKey: [],
156
- config: {},
157
- configName: '',
158
- searchText: {},
159
- sonInstances: [], // 存储子组件实例
160
- paginationCurrent: 1,
161
- paginationPageSize: 5,
162
- lastParams: {}, // 缓存最近一次非分页参数
163
- paginationTotal: 0, // 后端返回的 total(仅分页模式使用)
164
- }
165
- },
166
- props: {
167
- // 环境
168
- env: {
169
- type: String,
170
- default: 'prod'
171
- },
172
- // json名
173
- queryParamsName: {
174
- type: Object,
175
- default: null
176
- },
177
- parameter: {
178
- type: Object,
179
- default: () => {
180
- return {}
181
- }
182
- }
183
- },
184
- created () {
185
- this.getData(this.queryParamsName, this.parameter)
186
- },
187
- beforeDestroy () {},
188
- computed: {
189
- // 基于 $attrs 的样式类开关(与 XHDescriptions.vue 思路一致)
190
- wrapperClassObject () {
191
- const attrs = this.$attrs || {}
192
- const classes = {}
193
- const booleanStyleKeys = [
194
- 'style1'
195
- ]
196
- booleanStyleKeys.forEach(key => {
197
- const val = attrs[key]
198
- const truthy = val === true || val === '' || val === 'true'
199
- if (truthy) classes[`xcollapse-${key}`] = true
200
- })
201
- const size = attrs.size
202
- if (size && typeof size === 'string') classes[`xcollapse-size-${size}`] = true
203
- if (this.shouldShowPagination) classes['with-pagination'] = true
204
- return classes
205
- },
206
- enablePagination () { return !!this.config?.pagination },
207
- shouldShowPagination () { return this.enablePagination },
208
- maxPage () {
209
- const size = Number(this.paginationPageSize || 1)
210
- const total = this.paginationTotal
211
- return Math.max(1, Math.ceil(total / size))
212
- },
213
- pagedPanels () {
214
- const showData = this.config?.showData || []
215
- if (this.enablePagination) return showData
216
- const start = (this.paginationCurrent - 1) * this.paginationPageSize
217
- const end = start + this.paginationPageSize
218
- return showData.slice(start, end)
219
- }
220
- },
221
- methods: {
222
- handleMounted (instance) {
223
- this.sonInstances.push(instance)
224
- },
225
- handleSearchComplete ({ hasMatch, panelIndex }) {
226
- if (hasMatch && !this.activeKey.includes(panelIndex.toString())) {
227
- // 只展开包含搜索结果的面板
228
- this.activeKey = [panelIndex.toString()]
229
- }
230
- },
231
- getComponentName (componentName) {
232
- return componentName
233
- },
234
- getPanelTitle (panel) {
235
- // 兼容数据为纯对象数组(无 title 字段)时的显示
236
- if (panel && panel.title) return panel.title
237
- if (panel && panel.name) return panel.name
238
- if (panel && panel.code) return panel.code
239
- return ''
240
- },
241
- add (data) {
242
- this.$emit('add', data)
243
- },
244
- deleteData (data) {
245
- this.$emit('deleteData', data)
246
- },
247
- listClick (data) {
248
- this.$emit('listClick', data)
249
- },
250
- click (data) {
251
- this.$emit('click', data)
252
- },
253
- getConfigByName (componentName) {
254
- const refKey = `dynamicComponent_${componentName}`
255
- return this.$refs[refKey]
256
- },
257
- // xTreeRow 组件搜素功能
258
- searchTreeRows (title) {
259
- this.$nextTick(() => {
260
- const instances = this.sonInstances
261
- instances.forEach(comp => {
262
- try {
263
- comp.searchTitleToggle?.(title)
264
- } catch (e) {
265
- console.error('调用失败:', e)
266
- }
267
- })
268
- })
269
- },
270
- async getData (config, parameter) {
271
- this.configName = config
272
- getConfigByName(config, 'af-his', res => {
273
- // 合并配置,保留已有的 pagination 等开关
274
- const original = this.config || {}
275
- this.config = { ...original, ...res }
276
- // 同步分页初值(仅当配置里提供时)
277
- const p = this.config?.pagination || null
278
- if (p && p.pageSize) this.paginationPageSize = Number(p.pageSize)
279
- // 只在初始化时设置默认页码,避免每次重置
280
- if (p && p.current && this.paginationCurrent === 1) {
281
- this.paginationCurrent = Number(p.current)
282
- }
283
-
284
- // 组合请求参数,启用分页时传递页码与页大小
285
- const baseParams = (parameter && Object.keys(parameter).length ? parameter : this.lastParams) || {}
286
- this.lastParams = { ...baseParams }
287
- const requestParams = { ...baseParams }
288
- if (this.enablePagination) {
289
- requestParams.page = this.paginationCurrent
290
- requestParams.pageSize = this.paginationPageSize
291
- }
292
-
293
- runLogic(res.mainLogic, requestParams, 'af-his').then(result => {
294
- let showData = []
295
- let totalCount = 0
296
-
297
- if (this.enablePagination) {
298
- // 启用分页:后端固定返回 { total, data: [], page, pageSize }
299
- showData = result.data
300
- this.paginationTotal = Number(result.total) || 0
301
- totalCount = this.paginationTotal
302
- } else {
303
- // 未启用分页:直接取数组
304
- showData = Array.isArray(result && result.data) ? result.data : (Array.isArray(result) ? result : [])
305
- totalCount = showData.length
306
- }
307
-
308
- // 赋值
309
- this.$set(this.config, 'showData', showData)
310
- this.$set(this.config, 'totalCount', Number(totalCount))
311
-
312
- // 后端分页边界保护:当前页超界时回退到最后一页并重拉
313
- if (this.enablePagination) {
314
- const total = Number(this.config.totalCount || 0)
315
- const size = Number(this.paginationPageSize || 1)
316
- const maxPage = Math.max(1, Math.ceil(total / size))
317
- if (this.paginationCurrent > maxPage) {
318
- this.paginationCurrent = maxPage
319
- this.getData(this.queryParamsName, this.parameter)
320
- return
321
- }
322
- }
323
-
324
- // 更具timeType更改时间类型
325
- if (this.config.timeType && this.config.timeType === '.') {
326
- this.config.showData.forEach(panel => {
327
- // if (panel.title3) {
328
- // panel.title3 = this.convertToCustomFormat(panel.title3)
329
- // }
330
- })
331
- this.$forceUpdate()
332
- }
333
- // 默认展开当前页的所有面板
334
- this.activeKey = (this.config.showData || []).map((_, i) => i.toString())
335
- // 初始化关闭所有折叠面板
336
- const shouldCollapseAll = this.config.collapseAllByDefault || false
337
- if (shouldCollapseAll) {
338
- setTimeout(() => {
339
- this.activeKey = [] // 关闭所有面板
340
- }, 0.00001)
341
- }
342
- })
343
- })
344
- },
345
- onPageChange (page) {
346
- this.paginationCurrent = page
347
- // 后端分页:重新拉数;前端分页:仅切片
348
- this.getData(this.queryParamsName, this.lastParams)
349
- },
350
- goFirstPage () {
351
- if (this.paginationCurrent === 1) return
352
- this.onPageChange(1)
353
- },
354
- goLastPage () {
355
- if (this.paginationCurrent === this.maxPage) return
356
- this.onPageChange(this.maxPage)
357
- },
358
- refreshXCollapse () {
359
- this.getData(this.queryParamsName, this.parameter)
360
- },
361
- convertToCustomFormat (dateString) {
362
- // 创建一个新的 Date 对象
363
- const date = new Date(dateString)
364
- // 获取年、月、日
365
- const year = date.getFullYear()
366
- const month = date.getMonth() + 1 // 月份从0开始,所以需要加1
367
- const day = date.getDate()
368
- // 返回格式化后的字符串
369
- return `${year}.${month}.${day}`
370
- },
371
- handleChange (keys) {
372
- this.activeKey = keys
373
- // console.log(this.activeKey)
374
- },
375
- onSearch (value, panelIndex) {
376
- this.$emit('searchChange', { value: value, panelIndex: panelIndex })
377
- },
378
- handleSettingClick (panel, panelIndex) {
379
- this.$emit('settingClick', { panel, panelIndex })
380
- }
381
- },
382
- watch: {
383
- queryParamsName: {
384
- handler (newValue) {
385
- this.getData(newValue, this.parameter)
386
- },
387
- deep: true
388
- }
389
- }
390
- }
391
- </script>
392
-
393
- <style scoped lang="less">
394
- .x-collapse-wrapper { position: relative; display: flex; flex-direction: column; min-height: 100%; height: 100%; }
395
- .collapse-content-wrapper { flex: 1; min-height: 0; overflow: auto; position: relative; max-height: 79vh; }
396
- .collapse-content-wrapper.with-pagination { padding-bottom: 0px; }
397
- .header-content {
398
- display: flex;
399
- align-items: center;
400
- justify-content: flex-start; // 左对齐,避免圆点被拉开
401
- gap: 8px; // 圆点与标题的基础间距
402
- white-space: nowrap;
403
- overflow: hidden;
404
- flex: 1; // 占满可用宽度,便于空间分配
405
- }
406
-
407
- .header-text {
408
- margin-right: 14.17px;
409
- font-size: 16px;
410
- font-weight: 800;
411
- flex-shrink: 0;
412
- }
413
-
414
- .info-item {
415
- display: inline-flex;
416
- align-items: center;
417
- gap: 8px;
418
- font-size: 12px;
419
- color: #888888;
420
- flex-shrink: 0;
421
- }
422
-
423
- .time-item {
424
- margin-left: 12px;
425
- text-align: right;
426
- flex-shrink: 0;
427
- }
428
-
429
- :deep(.ant-collapse-header) {
430
- display: flex;
431
- position: relative;
432
- border-bottom: v-bind('config.showLine ? "1px solid #000000" : "none"');
433
- align-items: center !important;
434
- background-color: #ffffff;
435
- padding: 12px 16px !important; /* 确保头部有足够的内边距 */
436
- min-height: 50px; /* 设置头部最小高度 */
437
- }
438
-
439
- :deep(.ant-collapse-header-text) {
440
- flex: 1;
441
- }
442
-
443
- :deep(.ant-collapse-content > .ant-collapse-content-box) {
444
- padding: 16px !important; /* 确保内容区域有足够的内边距 */
445
- }
446
-
447
- .search-input {
448
- margin-left: 12px;
449
- width: auto;
450
- max-width: 40%;
451
- }
452
-
453
- // 右侧块定位:首个 info-item 或 time-item 推到右侧
454
- .header-content .info-item:first-of-type { margin-left: auto; }
455
- .header-content .time-item:first-of-type { margin-left: auto; }
456
-
457
- // 右侧块内部兄弟间距统一
458
- .info-item + .info-item { margin-left: 12px; }
459
- :deep(.ant-collapse-item-disabled > .ant-collapse-header) {
460
- cursor: default !important;
461
- }
462
-
463
- /* 新增样式 */
464
- .blue-circle-icon {
465
- width: 12px;
466
- height: 12px;
467
- border-radius: 6px;
468
- background: #3362DA;
469
- margin: 6px;
470
- flex-shrink: 0;
471
- }
472
-
473
- .setting-icon {
474
- font-size: 16px;
475
- cursor: pointer;
476
- display: inline-flex;
477
- align-items: center;
478
- justify-content: center;
479
- height: 100%;
480
- line-height: 1;
481
- vertical-align: middle;
482
- margin-top: -20px; /* 微调偏移量(根据实际情况调整) */
483
- }
484
-
485
- :deep(.ant-collapse-extra) {
486
- display: flex !important;
487
- align-items: center;
488
- }
489
-
490
- .configurable-area {
491
- //padding: 16px;
492
- min-height: 100px;
493
- border: 1px dashed #d9d9d9;
494
- border-radius: 4px;
495
- background-color: #fafafa;
496
- }
497
-
498
- .empty-hint {
499
- color: #999;
500
- text-align: center;
501
- margin: 20px 0;
502
- }
503
-
504
- .loading-message {
505
- text-align: center;
506
- padding: 20px;
507
- color: #666;
508
- background: #f5f5f5;
509
- border-radius: 4px;
510
- margin: 10px 0;
511
- }
512
-
513
- .empty-state {
514
- text-align: center;
515
- padding: 40px 20px;
516
- color: #999;
517
- background: #fafafa;
518
- border-radius: 4px;
519
- margin: 10px 0;
520
- flex: 1;
521
- display: flex;
522
- align-items: center;
523
- justify-content: center;
524
- }
525
-
526
- /* 分页组件:固定在组件容器底部(不影响全局布局) */
527
- .with-pagination { padding-bottom: 0; }
528
- .xcollapse-pagination { /* 粘在视口底部,宽度随容器 */
529
- position: sticky;
530
- bottom: 0;
531
- display: flex;
532
- justify-content: center;
533
- padding: 12px 0;
534
- background: #fff;
535
- border-top: 1px solid #f0f0f0;
536
- }
537
- .pagination-extras { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
538
- .pagination-extras .ant-btn-group { gap: 8px; }
539
- .pagination-extras .ant-btn-group + .pagination-info { margin-left: 9px; }
540
- .pagination-info {
541
- color: #5D5C5C;
542
- font-family: 'Source Han Sans', sans-serif;
543
- font-size: 16px;
544
- font-weight: normal;
545
- line-height: normal;
546
- letter-spacing: 0em;
547
- font-feature-settings: "kern" on;
548
- }
549
-
550
- /* 自定义分页按钮样式 */
551
- :deep(.pagination-extras .ant-btn) {
552
- font-family: 'Source Han Sans', sans-serif;
553
- font-size: 16px;
554
- font-weight: normal;
555
- line-height: normal;
556
- letter-spacing: 0em;
557
- font-feature-settings: "kern" on;
558
- color: #5D5C5C;
559
- border-radius: 4px;
560
- border: 1px solid #D8D8D8;
561
- background: #FFFFFF;
562
- box-sizing: border-box;
563
- margin-right: 8px;
564
- }
565
-
566
- :deep(.pagination-extras .ant-btn:last-child) {
567
- margin-right: 0;
568
- }
569
-
570
- /* 直达首页末页按钮样式 */
571
- :deep(.pagination-extras .ant-btn[icon="vertical-left"]),
572
- :deep(.pagination-extras .ant-btn[icon="vertical-right"]) {
573
- position: absolute;
574
- left: 24px;
575
- top: 24px;
576
- width: 24px;
577
- height: 24px;
578
- transform: rotate(180deg);
579
- border-radius: 4px;
580
- opacity: 1;
581
- background: #FFFFFF;
582
- box-sizing: border-box;
583
- border: 1px solid #D8D8D8;
584
- }
585
-
586
- /* 上一页下一页按钮样式 */
587
- :deep(.ant-pagination .ant-pagination-prev),
588
- :deep(.ant-pagination .ant-pagination-next) {
589
- width: 24px;
590
- height: 24px;
591
- line-height: 24px;
592
- border-radius: 4px;
593
- opacity: 1;
594
- background: #FFFFFF;
595
- box-sizing: border-box;
596
- border: 1px solid #D8D8D8;
597
- }
598
-
599
- /* 页码选择按钮样式 */
600
- :deep(.ant-pagination .ant-pagination-item) {
601
- width: 36px;
602
- height: 24px;
603
- border-radius: 4px;
604
- border: 1px solid #D8D8D8;
605
- background: #FFFFFF;
606
- box-sizing: border-box;
607
- font-family: 'Source Han Sans', sans-serif;
608
- font-size: 16px;
609
- font-weight: normal;
610
- line-height: normal;
611
- letter-spacing: 0em;
612
- font-feature-settings: "kern" on;
613
- color: #5D5C5C;
614
- margin-right: 8px;
615
- }
616
-
617
- :deep(.ant-pagination .ant-pagination-item:last-child) {
618
- margin-right: 0;
619
- }
620
-
621
- /* 当前页码样式 */
622
- :deep(.ant-pagination .ant-pagination-item-active) {
623
- background: #FFFFFF;
624
- border: 1px solid #1890ff;
625
- color: #1890ff;
626
- }
627
-
628
- /* 禁用状态样式 */
629
- :deep(.pagination-extras .ant-btn:disabled) {
630
- opacity: 0.5;
631
- cursor: not-allowed;
632
- }
633
-
634
- /* 移除所有可能导致截断的固定高度 */
635
- :deep(.ant-collapse-item) .ant-collapse-content .ant-collapse-content-box > * {
636
- max-height: none !important; /* 移除可能的最大高度限制 */
637
- height: auto !important; /* 使用自动高度 */
638
- }
639
-
640
- // 基于根容器类进行样式整合:x-collapse-wrapper.xcollapse-style1
641
- .x-collapse-wrapper {
642
- &.xcollapse-style1 {
643
- height: auto; /* 允许根据内容自适应高度,避免滚动被限制 */
644
- min-height: 600px;
645
- .blue-circle-icon { margin: 0 !important; }
646
- .header-text {
647
- font-family: "Source Han Sans";
648
- font-size: 16px;
649
- font-weight: 700;
650
- line-height: normal;
651
- letter-spacing: 0em;
652
- color: #313131;
653
- margin-right: 0 !important;
654
- }
655
-
656
- .info-item {
657
- font-family: "Source Han Sans";
658
- font-size: 16px;
659
- font-weight: 700;
660
- line-height: normal;
661
- text-align: right;
662
- color: #313131;
663
- margin-left: 28.14px;
664
- letter-spacing: 0em
665
- }
666
-
667
- .time-item {
668
- font-family: "Source Han Sans";
669
- font-size: 16px;
670
- font-weight: 400;
671
- line-height: normal;
672
- text-align: right;
673
- color: #313131;
674
- letter-spacing: 0em;
675
- }
676
-
677
- // 让每个面板成为独立卡片:去掉 antd 默认的分隔线,增加间距与圆角
678
- :deep(.ant-collapse) {
679
- background: transparent;
680
- border: 0;
681
- }
682
-
683
- :deep(.ant-collapse > .ant-collapse-item) {
684
- width: 564px;
685
- min-height: auto;
686
- height: auto;
687
- margin: 3px 10px 26px 12px; // 面板之间留白
688
- background: #FFFFFF; // 独立白底
689
- box-sizing: border-box;
690
- border: 1px solid #E5E9F0; // 每个面板自身边框
691
- }
692
-
693
- :deep(.ant-collapse > .ant-collapse-item:first-child) { margin-top: 0; }
694
- :deep(.ant-collapse > .ant-collapse-item:last-child) { margin-bottom: 0; }
695
-
696
- :deep(.ant-collapse-content > .ant-collapse-content-box) { background: #FFFFFF; }
697
-
698
- // 表头:恢复合适的上下内边距,去掉顶部额外空白
699
- :deep(.ant-collapse-header) {
700
- background: #FFFFFF;
701
- padding: 0px 0px;
702
- align-items: center;
703
- height: 39px;
704
- border-bottom: none !important; // 移除标题处下边线,避免与外边框连为一体
705
- }
706
- }
707
- }
708
- </style>
1
+ <template>
2
+ <div class="x-collapse-wrapper" :class="wrapperClassObject">
3
+ <div class="collapse-content-wrapper" :class="{ 'with-pagination': shouldShowPagination }">
4
+ <a-collapse
5
+ :activeKey="activeKey"
6
+ @change="handleChange"
7
+ :bordered="config.bordered || true"
8
+ :expand-icon-position="config.expandIconPosition || 'right'"
9
+ :style="config.style || ''"
10
+ >
11
+ <a-collapse-panel
12
+ v-for="(panel, panelIndex) in pagedPanels"
13
+ :key="panelIndex.toString()"
14
+ :show-arrow="config.showArrow || false"
15
+ :disabled="config.collapsible">
16
+ <template #header>
17
+ <div class="header-content">
18
+ <!-- 新增蓝色圆点图标,根据配置显示 -->
19
+ <div
20
+ v-if="config.showCircleIcon"
21
+ class="blue-circle-icon"
22
+ :style="config.circleIconStyle || {}"></div>
23
+ <span
24
+ class="header-text"
25
+ :style="config.titleStyle">
26
+ {{ getPanelTitle(panel) }}
27
+ </span>
28
+ <!-- 当有 title2 数据时显示信息项 -->
29
+ <template v-if="panel.title2 && panel.title2.length">
30
+ <span
31
+ v-for="(item, headerIndex) in panel.title2"
32
+ :key="headerIndex"
33
+ class="info-item"
34
+ :style="config.title2Style">
35
+ <!-- 根据showTitle是否显示键名 -->
36
+ <span v-if="item.showTitle">{{ item.key }};</span>
37
+ <span>{{ item.value }}</span>
38
+ </span>
39
+ </template>
40
+ <!-- 当有 title3 数据时显示时间项(与 title2 一致:支持数组/单项) -->
41
+ <template v-if="panel.title3 && Array.isArray(panel.title3) && panel.title3.length">
42
+ <span
43
+ v-for="(item, t3Index) in panel.title3"
44
+ :key="t3Index"
45
+ :class="['time-item', { 'time-first': t3Index === 0 }]"
46
+ :style="config.title3Style">
47
+ <span v-if="item.showTitle">{{ item.key }}:</span>
48
+ <span>{{ item.value }}</span>
49
+ </span>
50
+ </template>
51
+ <span
52
+ v-else-if="panel.title3"
53
+ class="time-item time-first"
54
+ :style="config.title3Style">
55
+ {{ panel.title3 }}
56
+ </span>
57
+ <!-- 修改搜索框的显示条件 -->
58
+ <a-input-search
59
+ v-if="panel.search"
60
+ v-model="searchText[panelIndex]"
61
+ :placeholder="panel.searchPlace"
62
+ class="search-input"
63
+ @search="(value) => onSearch(value, panelIndex)"
64
+ @click.stop/>
65
+ </div>
66
+ </template>
67
+
68
+ <!-- 新增设置图标,根据配置显示 -->
69
+ <template #extra v-if="config.showSettingIcon">
70
+ <a-icon
71
+ v-if="activeKey.includes(panelIndex.toString())"
72
+ :type="config.settingIconType || 'setting'"
73
+ class="setting-icon"
74
+ @click.stop="handleSettingClick(panel, panelIndex)"/>
75
+ </template>
76
+
77
+ <!-- 根据类型显示不同内容 -->
78
+ <template v-if="panel.type === 'picture'">
79
+ <img :src="panel.configName" alt="图片" style="width: 100%; max-width: 500px;"/>
80
+ </template>
81
+ <template v-else-if="['x-image-report','x-form-table','x-simple-table','x-add-native-form','x-tree-pro', 'x-his-editor', 'x-tab', 'x-form-group', 'x-report', 'x-buttons', 'x-label-select', 'x-conversation', 'x-check-list', 'x-cardSet', 'x-collapse','x-h-descriptions', 'x-sidebar', 'x-list','x-input','x-time-line', 'x-radio', 'x-text-card','x-tree-rows'].includes(panel.type)">
82
+ <component
83
+ :is="getComponentName(panel.type)"
84
+ :ref="`dynamicComponent_${ panel.type }_${ panelIndex }`"
85
+ :serverName="panel.serverName || 'af-his'"
86
+ :queryParamsName="panel.configName"
87
+ :parameter="panel.parameter"
88
+ :countVisible="false"
89
+ :env="env"
90
+ :style="config.componentStyle || ''"
91
+ v-bind="panel.attrs || {}"
92
+ :class="panel.className"
93
+ :ipanelIndex="panelIndex"
94
+ @deleteData="deleteData"
95
+ @add="add"
96
+ @listClick="listClick"
97
+ @click="click"
98
+ @component-mounted="handleMounted"
99
+ @search-complete="handleSearchComplete" />
100
+ </template>
101
+ </a-collapse-panel>
102
+ </a-collapse>
103
+ <div v-if="shouldShowPagination" class="xcollapse-pagination">
104
+ <div class="pagination-extras">
105
+ <a-button-group size="small">
106
+ <a-button icon="vertical-right" :disabled="paginationCurrent === 1" @click="goFirstPage"/>
107
+ <a-pagination
108
+ :current="paginationCurrent"
109
+ :pageSize="paginationPageSize"
110
+ :total="paginationTotal"
111
+ :showSizeChanger="false"
112
+ show-less-items
113
+ @change="onPageChange"/>
114
+ <a-button icon="vertical-left" :disabled="paginationCurrent === maxPage" @click="goLastPage"/>
115
+ </a-button-group>
116
+ <span class="pagination-info">共 {{ maxPage }} 页, {{ paginationTotal }} 条</span>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ </div>
121
+ </template>
122
+
123
+ <script>
124
+ import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
125
+
126
+ export default {
127
+ name: 'XCollapse',
128
+ components: {
129
+ XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'),
130
+ XAddNativeForm: () => import('@vue2-client/base-client/components/common/XAddNativeForm/XAddNativeForm.vue'),
131
+ XFormGroup: () => import('@vue2-client/base-client/components/common/XFormGroup/XFormGroup.vue'),
132
+ XTreePro: () => import('@vue2-client/base-client/components/common/XTree/XTreePro.vue'),
133
+ XHisEditor: () => import('@vue2-client/base-client/components/his/XHisEditor/XHisEditor.vue'),
134
+ XTab: () => import('@vue2-client/base-client/components/common/XTab/XTab.vue'),
135
+ XReport: () => import('@vue2-client/base-client/components/common/XReport/XReport.vue'),
136
+ XButtons: () => import('@vue2-client/base-client/components/common/XButtons/XButtons.vue'),
137
+ XLabelSelect: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelect.vue'),
138
+ XConversation: () => import('@vue2-client/base-client/components/common/XConversation/XConversation.vue'),
139
+ XCheckList: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
140
+ XCardSet: () => import('@vue2-client/base-client/components/common/XCardSet/XCardSet.vue'),
141
+ XCollapse: () => import('@vue2-client/base-client/components/common/XCollapse/XCollapse.vue'),
142
+ XHDescriptions: () => import('@vue2-client/base-client/components/his/XHDescriptions/XHDescriptions.vue'),
143
+ XImageReport: () => import('@vue2-client/base-client/components/his/XImageReport/XImageReport.vue'),
144
+ XSidebar: () => import('@vue2-client/base-client/components/his/XSidebar/XSidebar.vue'),
145
+ XList: () => import('@vue2-client/base-client/components/his/XList/XList.vue'),
146
+ XInput: () => import('@vue2-client/base-client/components/common/XInput/XInput.vue'),
147
+ XTimeLine: () => import('@vue2-client/base-client/components/common/XTimeline/XTimeline.vue'),
148
+ XRadio: () => import('@vue2-client/base-client/components/his/XRadio/XRadio.vue'),
149
+ XTextCard: () => import('@vue2-client/base-client/components/his/XTextCard/XTextCard.vue'),
150
+ XTreeRows: () => import('@vue2-client/base-client/components/his/XTreeRows/XTreeRows.vue'),
151
+ XSimpleTable: () => import('@vue2-client/base-client/components/his/XSimpleTable/XSimpleTable.vue')
152
+ },
153
+ data () {
154
+ return {
155
+ activeKey: [],
156
+ config: {},
157
+ configName: '',
158
+ searchText: {},
159
+ sonInstances: [], // 存储子组件实例
160
+ paginationCurrent: 1,
161
+ paginationPageSize: 5,
162
+ lastParams: {}, // 缓存最近一次非分页参数
163
+ paginationTotal: 0, // 后端返回的 total(仅分页模式使用)
164
+ }
165
+ },
166
+ props: {
167
+ // 环境
168
+ env: {
169
+ type: String,
170
+ default: 'prod'
171
+ },
172
+ // json名
173
+ queryParamsName: {
174
+ type: Object,
175
+ default: null
176
+ },
177
+ parameter: {
178
+ type: Object,
179
+ default: () => {
180
+ return {}
181
+ }
182
+ }
183
+ },
184
+ created () {
185
+ this.getData(this.queryParamsName, this.parameter)
186
+ },
187
+ beforeDestroy () {},
188
+ computed: {
189
+ // 基于 $attrs 的样式类开关(与 XHDescriptions.vue 思路一致)
190
+ wrapperClassObject () {
191
+ const attrs = this.$attrs || {}
192
+ const classes = {}
193
+ const booleanStyleKeys = [
194
+ 'style1'
195
+ ]
196
+ booleanStyleKeys.forEach(key => {
197
+ const val = attrs[key]
198
+ const truthy = val === true || val === '' || val === 'true'
199
+ if (truthy) classes[`xcollapse-${key}`] = true
200
+ })
201
+ const size = attrs.size
202
+ if (size && typeof size === 'string') classes[`xcollapse-size-${size}`] = true
203
+ if (this.shouldShowPagination) classes['with-pagination'] = true
204
+ return classes
205
+ },
206
+ enablePagination () { return !!this.config?.pagination },
207
+ shouldShowPagination () { return this.enablePagination },
208
+ maxPage () {
209
+ const size = Number(this.paginationPageSize || 1)
210
+ const total = this.paginationTotal
211
+ return Math.max(1, Math.ceil(total / size))
212
+ },
213
+ pagedPanels () {
214
+ const showData = this.config?.showData || []
215
+ if (this.enablePagination) return showData
216
+ const start = (this.paginationCurrent - 1) * this.paginationPageSize
217
+ const end = start + this.paginationPageSize
218
+ return showData.slice(start, end)
219
+ }
220
+ },
221
+ methods: {
222
+ handleMounted (instance) {
223
+ this.sonInstances.push(instance)
224
+ },
225
+ handleSearchComplete ({ hasMatch, panelIndex }) {
226
+ if (hasMatch && !this.activeKey.includes(panelIndex.toString())) {
227
+ // 只展开包含搜索结果的面板
228
+ this.activeKey = [panelIndex.toString()]
229
+ }
230
+ },
231
+ getComponentName (componentName) {
232
+ return componentName
233
+ },
234
+ getPanelTitle (panel) {
235
+ // 兼容数据为纯对象数组(无 title 字段)时的显示
236
+ if (panel && panel.title) return panel.title
237
+ if (panel && panel.name) return panel.name
238
+ if (panel && panel.code) return panel.code
239
+ return ''
240
+ },
241
+ add (data) {
242
+ this.$emit('add', data)
243
+ },
244
+ deleteData (data) {
245
+ this.$emit('deleteData', data)
246
+ },
247
+ listClick (data) {
248
+ this.$emit('listClick', data)
249
+ },
250
+ click (data) {
251
+ this.$emit('click', data)
252
+ },
253
+ getConfigByName (componentName) {
254
+ const refKey = `dynamicComponent_${componentName}`
255
+ return this.$refs[refKey]
256
+ },
257
+ // xTreeRow 组件搜素功能
258
+ searchTreeRows (title) {
259
+ this.$nextTick(() => {
260
+ const instances = this.sonInstances
261
+ instances.forEach(comp => {
262
+ try {
263
+ comp.searchTitleToggle?.(title)
264
+ } catch (e) {
265
+ console.error('调用失败:', e)
266
+ }
267
+ })
268
+ })
269
+ },
270
+ async getData (config, parameter) {
271
+ this.configName = config
272
+ getConfigByName(config, 'af-his', res => {
273
+ // 合并配置,保留已有的 pagination 等开关
274
+ const original = this.config || {}
275
+ this.config = { ...original, ...res }
276
+ // 同步分页初值(仅当配置里提供时)
277
+ const p = this.config?.pagination || null
278
+ if (p && p.pageSize) this.paginationPageSize = Number(p.pageSize)
279
+ // 只在初始化时设置默认页码,避免每次重置
280
+ if (p && p.current && this.paginationCurrent === 1) {
281
+ this.paginationCurrent = Number(p.current)
282
+ }
283
+
284
+ // 组合请求参数,启用分页时传递页码与页大小
285
+ const baseParams = (parameter && Object.keys(parameter).length ? parameter : this.lastParams) || {}
286
+ this.lastParams = { ...baseParams }
287
+ const requestParams = { ...baseParams }
288
+ if (this.enablePagination) {
289
+ requestParams.page = this.paginationCurrent
290
+ requestParams.pageSize = this.paginationPageSize
291
+ }
292
+
293
+ runLogic(res.mainLogic, requestParams, 'af-his').then(result => {
294
+ let showData = []
295
+ let totalCount = 0
296
+
297
+ if (this.enablePagination) {
298
+ // 启用分页:后端固定返回 { total, data: [], page, pageSize }
299
+ showData = result.data
300
+ this.paginationTotal = Number(result.total) || 0
301
+ totalCount = this.paginationTotal
302
+ } else {
303
+ // 未启用分页:直接取数组
304
+ showData = Array.isArray(result && result.data) ? result.data : (Array.isArray(result) ? result : [])
305
+ totalCount = showData.length
306
+ }
307
+
308
+ // 赋值
309
+ this.$set(this.config, 'showData', showData)
310
+ this.$set(this.config, 'totalCount', Number(totalCount))
311
+
312
+ // 后端分页边界保护:当前页超界时回退到最后一页并重拉
313
+ if (this.enablePagination) {
314
+ const total = Number(this.config.totalCount || 0)
315
+ const size = Number(this.paginationPageSize || 1)
316
+ const maxPage = Math.max(1, Math.ceil(total / size))
317
+ if (this.paginationCurrent > maxPage) {
318
+ this.paginationCurrent = maxPage
319
+ this.getData(this.queryParamsName, this.parameter)
320
+ return
321
+ }
322
+ }
323
+
324
+ // 更具timeType更改时间类型
325
+ if (this.config.timeType && this.config.timeType === '.') {
326
+ this.config.showData.forEach(panel => {
327
+ // if (panel.title3) {
328
+ // panel.title3 = this.convertToCustomFormat(panel.title3)
329
+ // }
330
+ })
331
+ this.$forceUpdate()
332
+ }
333
+ // 默认展开当前页的所有面板
334
+ this.activeKey = (this.config.showData || []).map((_, i) => i.toString())
335
+ // 初始化关闭所有折叠面板
336
+ const shouldCollapseAll = this.config.collapseAllByDefault || false
337
+ if (shouldCollapseAll) {
338
+ setTimeout(() => {
339
+ this.activeKey = [] // 关闭所有面板
340
+ }, 0.00001)
341
+ }
342
+ })
343
+ })
344
+ },
345
+ onPageChange (page) {
346
+ this.paginationCurrent = page
347
+ // 后端分页:重新拉数;前端分页:仅切片
348
+ this.getData(this.queryParamsName, this.lastParams)
349
+ },
350
+ goFirstPage () {
351
+ if (this.paginationCurrent === 1) return
352
+ this.onPageChange(1)
353
+ },
354
+ goLastPage () {
355
+ if (this.paginationCurrent === this.maxPage) return
356
+ this.onPageChange(this.maxPage)
357
+ },
358
+ refreshXCollapse () {
359
+ this.getData(this.queryParamsName, this.parameter)
360
+ },
361
+ convertToCustomFormat (dateString) {
362
+ // 创建一个新的 Date 对象
363
+ const date = new Date(dateString)
364
+ // 获取年、月、日
365
+ const year = date.getFullYear()
366
+ const month = date.getMonth() + 1 // 月份从0开始,所以需要加1
367
+ const day = date.getDate()
368
+ // 返回格式化后的字符串
369
+ return `${year}.${month}.${day}`
370
+ },
371
+ handleChange (keys) {
372
+ this.activeKey = keys
373
+ // console.log(this.activeKey)
374
+ },
375
+ onSearch (value, panelIndex) {
376
+ this.$emit('searchChange', { value: value, panelIndex: panelIndex })
377
+ },
378
+ handleSettingClick (panel, panelIndex) {
379
+ this.$emit('settingClick', { panel, panelIndex })
380
+ }
381
+ },
382
+ watch: {
383
+ queryParamsName: {
384
+ handler (newValue) {
385
+ this.getData(newValue, this.parameter)
386
+ },
387
+ deep: true
388
+ }
389
+ }
390
+ }
391
+ </script>
392
+
393
+ <style scoped lang="less">
394
+ .x-collapse-wrapper { position: relative; display: flex; flex-direction: column; min-height: 100%; height: 100%; }
395
+ .collapse-content-wrapper { flex: 1; min-height: 0; overflow: auto; position: relative; max-height: 79vh; }
396
+ .collapse-content-wrapper.with-pagination { padding-bottom: 0px; }
397
+ .header-content {
398
+ display: flex;
399
+ align-items: center;
400
+ justify-content: flex-start; // 左对齐,避免圆点被拉开
401
+ gap: 8px; // 圆点与标题的基础间距
402
+ white-space: nowrap;
403
+ overflow: hidden;
404
+ flex: 1; // 占满可用宽度,便于空间分配
405
+ }
406
+
407
+ .header-text {
408
+ margin-right: 14.17px;
409
+ font-size: 16px;
410
+ font-weight: 800;
411
+ flex-shrink: 0;
412
+ }
413
+
414
+ .info-item {
415
+ display: inline-flex;
416
+ align-items: center;
417
+ gap: 8px;
418
+ font-size: 12px;
419
+ color: #888888;
420
+ flex-shrink: 0;
421
+ }
422
+
423
+ .time-item {
424
+ margin-left: 12px;
425
+ text-align: right;
426
+ flex-shrink: 0;
427
+ }
428
+
429
+ :deep(.ant-collapse-header) {
430
+ display: flex;
431
+ position: relative;
432
+ border-bottom: v-bind('config.showLine ? "1px solid #000000" : "none"');
433
+ align-items: center !important;
434
+ background-color: #ffffff;
435
+ padding: 12px 16px !important; /* 确保头部有足够的内边距 */
436
+ min-height: 50px; /* 设置头部最小高度 */
437
+ }
438
+
439
+ :deep(.ant-collapse-header-text) {
440
+ flex: 1;
441
+ }
442
+
443
+ :deep(.ant-collapse-content > .ant-collapse-content-box) {
444
+ padding: 16px !important; /* 确保内容区域有足够的内边距 */
445
+ }
446
+
447
+ .search-input {
448
+ margin-left: 12px;
449
+ width: auto;
450
+ max-width: 40%;
451
+ }
452
+
453
+ // 右侧块定位:首个 info-item 或 time-item 推到右侧
454
+ .header-content .info-item:first-of-type { margin-left: auto; }
455
+ .header-content .time-item:first-of-type { margin-left: auto; }
456
+
457
+ // 右侧块内部兄弟间距统一
458
+ .info-item + .info-item { margin-left: 12px; }
459
+ :deep(.ant-collapse-item-disabled > .ant-collapse-header) {
460
+ cursor: default !important;
461
+ }
462
+
463
+ /* 新增样式 */
464
+ .blue-circle-icon {
465
+ width: 12px;
466
+ height: 12px;
467
+ border-radius: 6px;
468
+ background: #3362DA;
469
+ margin: 6px;
470
+ flex-shrink: 0;
471
+ }
472
+
473
+ .setting-icon {
474
+ font-size: 16px;
475
+ cursor: pointer;
476
+ display: inline-flex;
477
+ align-items: center;
478
+ justify-content: center;
479
+ height: 100%;
480
+ line-height: 1;
481
+ vertical-align: middle;
482
+ margin-top: -20px; /* 微调偏移量(根据实际情况调整) */
483
+ }
484
+
485
+ :deep(.ant-collapse-extra) {
486
+ display: flex !important;
487
+ align-items: center;
488
+ }
489
+
490
+ .configurable-area {
491
+ //padding: 16px;
492
+ min-height: 100px;
493
+ border: 1px dashed #d9d9d9;
494
+ border-radius: 4px;
495
+ background-color: #fafafa;
496
+ }
497
+
498
+ .empty-hint {
499
+ color: #999;
500
+ text-align: center;
501
+ margin: 20px 0;
502
+ }
503
+
504
+ .loading-message {
505
+ text-align: center;
506
+ padding: 20px;
507
+ color: #666;
508
+ background: #f5f5f5;
509
+ border-radius: 4px;
510
+ margin: 10px 0;
511
+ }
512
+
513
+ .empty-state {
514
+ text-align: center;
515
+ padding: 40px 20px;
516
+ color: #999;
517
+ background: #fafafa;
518
+ border-radius: 4px;
519
+ margin: 10px 0;
520
+ flex: 1;
521
+ display: flex;
522
+ align-items: center;
523
+ justify-content: center;
524
+ }
525
+
526
+ /* 分页组件:固定在组件容器底部(不影响全局布局) */
527
+ .with-pagination { padding-bottom: 0; }
528
+ .xcollapse-pagination { /* 粘在视口底部,宽度随容器 */
529
+ position: sticky;
530
+ bottom: 0;
531
+ display: flex;
532
+ justify-content: center;
533
+ padding: 12px 0;
534
+ background: #fff;
535
+ border-top: 1px solid #f0f0f0;
536
+ }
537
+ .pagination-extras { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
538
+ .pagination-extras .ant-btn-group { gap: 8px; }
539
+ .pagination-extras .ant-btn-group + .pagination-info { margin-left: 9px; }
540
+ .pagination-info {
541
+ color: #5D5C5C;
542
+ font-family: 'Source Han Sans', sans-serif;
543
+ font-size: 16px;
544
+ font-weight: normal;
545
+ line-height: normal;
546
+ letter-spacing: 0em;
547
+ font-feature-settings: "kern" on;
548
+ }
549
+
550
+ /* 自定义分页按钮样式 */
551
+ :deep(.pagination-extras .ant-btn) {
552
+ font-family: 'Source Han Sans', sans-serif;
553
+ font-size: 16px;
554
+ font-weight: normal;
555
+ line-height: normal;
556
+ letter-spacing: 0em;
557
+ font-feature-settings: "kern" on;
558
+ color: #5D5C5C;
559
+ border-radius: 4px;
560
+ border: 1px solid #D8D8D8;
561
+ background: #FFFFFF;
562
+ box-sizing: border-box;
563
+ margin-right: 8px;
564
+ }
565
+
566
+ :deep(.pagination-extras .ant-btn:last-child) {
567
+ margin-right: 0;
568
+ }
569
+
570
+ /* 直达首页末页按钮样式 */
571
+ :deep(.pagination-extras .ant-btn[icon="vertical-left"]),
572
+ :deep(.pagination-extras .ant-btn[icon="vertical-right"]) {
573
+ position: absolute;
574
+ left: 24px;
575
+ top: 24px;
576
+ width: 24px;
577
+ height: 24px;
578
+ transform: rotate(180deg);
579
+ border-radius: 4px;
580
+ opacity: 1;
581
+ background: #FFFFFF;
582
+ box-sizing: border-box;
583
+ border: 1px solid #D8D8D8;
584
+ }
585
+
586
+ /* 上一页下一页按钮样式 */
587
+ :deep(.ant-pagination .ant-pagination-prev),
588
+ :deep(.ant-pagination .ant-pagination-next) {
589
+ width: 24px;
590
+ height: 24px;
591
+ line-height: 24px;
592
+ border-radius: 4px;
593
+ opacity: 1;
594
+ background: #FFFFFF;
595
+ box-sizing: border-box;
596
+ border: 1px solid #D8D8D8;
597
+ }
598
+
599
+ /* 页码选择按钮样式 */
600
+ :deep(.ant-pagination .ant-pagination-item) {
601
+ width: 36px;
602
+ height: 24px;
603
+ border-radius: 4px;
604
+ border: 1px solid #D8D8D8;
605
+ background: #FFFFFF;
606
+ box-sizing: border-box;
607
+ font-family: 'Source Han Sans', sans-serif;
608
+ font-size: 16px;
609
+ font-weight: normal;
610
+ line-height: normal;
611
+ letter-spacing: 0em;
612
+ font-feature-settings: "kern" on;
613
+ color: #5D5C5C;
614
+ margin-right: 8px;
615
+ }
616
+
617
+ :deep(.ant-pagination .ant-pagination-item:last-child) {
618
+ margin-right: 0;
619
+ }
620
+
621
+ /* 当前页码样式 */
622
+ :deep(.ant-pagination .ant-pagination-item-active) {
623
+ background: #FFFFFF;
624
+ border: 1px solid #1890ff;
625
+ color: #1890ff;
626
+ }
627
+
628
+ /* 禁用状态样式 */
629
+ :deep(.pagination-extras .ant-btn:disabled) {
630
+ opacity: 0.5;
631
+ cursor: not-allowed;
632
+ }
633
+
634
+ /* 移除所有可能导致截断的固定高度 */
635
+ :deep(.ant-collapse-item) .ant-collapse-content .ant-collapse-content-box > * {
636
+ max-height: none !important; /* 移除可能的最大高度限制 */
637
+ height: auto !important; /* 使用自动高度 */
638
+ }
639
+
640
+ // 基于根容器类进行样式整合:x-collapse-wrapper.xcollapse-style1
641
+ .x-collapse-wrapper {
642
+ &.xcollapse-style1 {
643
+ height: auto; /* 允许根据内容自适应高度,避免滚动被限制 */
644
+ min-height: 600px;
645
+ .blue-circle-icon { margin: 0 !important; }
646
+ .header-text {
647
+ font-family: "Source Han Sans";
648
+ font-size: 16px;
649
+ font-weight: 700;
650
+ line-height: normal;
651
+ letter-spacing: 0em;
652
+ color: #313131;
653
+ margin-right: 0 !important;
654
+ }
655
+
656
+ .info-item {
657
+ font-family: "Source Han Sans";
658
+ font-size: 16px;
659
+ font-weight: 700;
660
+ line-height: normal;
661
+ text-align: right;
662
+ color: #313131;
663
+ margin-left: 28.14px;
664
+ letter-spacing: 0em
665
+ }
666
+
667
+ .time-item {
668
+ font-family: "Source Han Sans";
669
+ font-size: 16px;
670
+ font-weight: 400;
671
+ line-height: normal;
672
+ text-align: right;
673
+ color: #313131;
674
+ letter-spacing: 0em;
675
+ }
676
+
677
+ // 让每个面板成为独立卡片:去掉 antd 默认的分隔线,增加间距与圆角
678
+ :deep(.ant-collapse) {
679
+ background: transparent;
680
+ border: 0;
681
+ }
682
+
683
+ :deep(.ant-collapse > .ant-collapse-item) {
684
+ width: 564px;
685
+ min-height: auto;
686
+ height: auto;
687
+ margin: 3px 10px 26px 12px; // 面板之间留白
688
+ background: #FFFFFF; // 独立白底
689
+ box-sizing: border-box;
690
+ border: 1px solid #E5E9F0; // 每个面板自身边框
691
+ }
692
+
693
+ :deep(.ant-collapse > .ant-collapse-item:first-child) { margin-top: 0; }
694
+ :deep(.ant-collapse > .ant-collapse-item:last-child) { margin-bottom: 0; }
695
+
696
+ :deep(.ant-collapse-content > .ant-collapse-content-box) { background: #FFFFFF; }
697
+
698
+ // 表头:恢复合适的上下内边距,去掉顶部额外空白
699
+ :deep(.ant-collapse-header) {
700
+ background: #FFFFFF;
701
+ padding: 0px 0px;
702
+ align-items: center;
703
+ height: 39px;
704
+ border-bottom: none !important; // 移除标题处下边线,避免与外边框连为一体
705
+ }
706
+ }
707
+ }
708
+ </style>