vue2-client 1.10.21 → 1.10.26

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 (426) hide show
  1. package/.cursorrules +19 -19
  2. package/.env +19 -19
  3. package/.env.gaslink +19 -19
  4. package/.env.his +19 -19
  5. package/.env.liuli +19 -19
  6. package/.env.revenue +19 -19
  7. package/.env.scada +19 -19
  8. package/.eslintrc.js +90 -90
  9. package/CHANGELOG.md +824 -824
  10. package/Components.md +60 -60
  11. package/babel.config.js +21 -21
  12. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +45 -45
  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/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +174 -174
  17. package/index.js +31 -31
  18. package/jest-transform-stub.js +8 -8
  19. package/jest.config.js +21 -21
  20. package/jest.setup.js +7 -7
  21. package/jsconfig.json +19 -19
  22. package/package.json +107 -107
  23. package/public/his/editor/editor.html +51 -51
  24. package/public/his/editor/mock/bind_data.html +779 -779
  25. package/public/his/editor/mock/data_table.html +40 -40
  26. package/public/his/editor/mock/sign.html +75 -75
  27. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  28. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  29. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  30. package/public/his/editor/vender/date97/calendar.js +4 -4
  31. package/public/his/editor/vender/date97/lang/en.js +13 -13
  32. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  33. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  34. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  35. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  36. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  37. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  38. package/public/his/editor/vender/diff.js +1627 -1627
  39. package/public/his/editor/vender/editor.js +1 -1
  40. package/public/his/editor/vender/fabric.js +31187 -31187
  41. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  42. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  43. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  44. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  45. package/public/his/editor/vender/mui/mui.min.css +4 -4
  46. package/public/his/editor/vender/mui/mui.min.js +5 -5
  47. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  48. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  49. package/public/his/editor/vender/qrcode.js +7 -7
  50. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  51. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  52. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  53. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  54. package/public/his/editor/vender/validator.js +5094 -5094
  55. package/public/his/editor/vender/weui/weui.css +5659 -5659
  56. package/public/his/editor/vender/weui/weui.min.css +4 -4
  57. package/public/his/editor/vender/weui/weui.min.js +11 -11
  58. package/public/index.html +27 -27
  59. package/src/App.vue +196 -196
  60. package/src/ReportView.js +19 -19
  61. package/src/assets/img/querySlotDemo.svg +15 -15
  62. package/src/assets/svg/badtwo.svg +1 -1
  63. package/src/assets/svg/goodtwo.svg +1 -1
  64. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  65. package/src/base-client/components/AI/demo.vue +31 -31
  66. package/src/base-client/components/common/AMisRender/index.js +3 -3
  67. package/src/base-client/components/common/AMisRender/index.vue +263 -263
  68. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +470 -470
  69. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  70. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  71. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  72. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  73. package/src/base-client/components/common/CitySelect/CitySelect.vue +342 -342
  74. package/src/base-client/components/common/CitySelect/index.js +3 -3
  75. package/src/base-client/components/common/CitySelect/index.md +109 -109
  76. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  77. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  78. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  79. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  80. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  81. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  82. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  83. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  84. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  85. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  86. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  87. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  88. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  89. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  90. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  91. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  92. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  93. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  94. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  95. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  96. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  97. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  98. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  99. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  100. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  101. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  102. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  103. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  104. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  105. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  106. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  107. package/src/base-client/components/common/Recording/index.js +3 -3
  108. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  109. package/src/base-client/components/common/Tree/index.js +2 -2
  110. package/src/base-client/components/common/Upload/Upload.vue +322 -322
  111. package/src/base-client/components/common/Upload/index.js +3 -3
  112. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  113. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +1146 -1146
  114. package/src/base-client/components/common/XAddNativeForm/demo.vue +43 -43
  115. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  116. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  117. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  118. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  119. package/src/base-client/components/common/XAddReport/XAddReport.vue +207 -207
  120. package/src/base-client/components/common/XAddReport/index.js +3 -3
  121. package/src/base-client/components/common/XAddReport/index.md +56 -56
  122. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  123. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  124. package/src/base-client/components/common/XButtons/XButtons.vue +71 -71
  125. package/src/base-client/components/common/XButtons/index.js +3 -3
  126. package/src/base-client/components/common/XButtons/index.md +61 -61
  127. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  128. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  129. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  130. package/src/base-client/components/common/XConversation/XConversation.vue +263 -263
  131. package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
  132. package/src/base-client/components/common/XDataCard/XDataCard.vue +565 -411
  133. package/src/base-client/components/common/XDataCard/index.js +3 -3
  134. package/src/base-client/components/common/XDataCard/index.md +1 -1
  135. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  136. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  137. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  138. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  139. package/src/base-client/components/common/XDatePicker/index.vue +259 -259
  140. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +169 -169
  141. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +304 -304
  142. package/src/base-client/components/common/XDescriptions/demo.vue +50 -50
  143. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  144. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  145. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  146. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  147. package/src/base-client/components/common/XForm/XForm.vue +393 -393
  148. package/src/base-client/components/common/XForm/XFormItem.vue +1286 -1286
  149. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  150. package/src/base-client/components/common/XForm/XTreeSelect.vue +250 -250
  151. package/src/base-client/components/common/XForm/index.md +178 -178
  152. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  153. package/src/base-client/components/common/XFormCol/XFormCol.vue +157 -157
  154. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +304 -304
  155. package/src/base-client/components/common/XFormGroup/demo.vue +46 -46
  156. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  157. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  158. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  159. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  160. package/src/base-client/components/common/XFormTable/XFormTable.vue +856 -856
  161. package/src/base-client/components/common/XFormTable/demo.vue +60 -60
  162. package/src/base-client/components/common/XFormTable/index.md +92 -92
  163. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +167 -167
  164. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  165. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  166. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  167. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  168. package/src/base-client/components/common/XPrint/Demo.vue +41 -41
  169. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  170. package/src/base-client/components/common/XPrint/PrintBill.vue +302 -302
  171. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  172. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  173. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  174. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  175. package/src/base-client/components/common/XPrint/index.vue +97 -97
  176. package/src/base-client/components/common/XReport/XReport.vue +892 -892
  177. package/src/base-client/components/common/XReport/XReportDemo.vue +71 -304
  178. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  179. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  180. package/src/base-client/components/common/XReport/XReportTrGroup.vue +816 -808
  181. package/src/base-client/components/common/XReport/index.js +3 -3
  182. package/src/base-client/components/common/XReport/index.md +44 -44
  183. package/src/base-client/components/common/XReportDrawer/XReportDrawer.vue +201 -201
  184. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  185. package/src/base-client/components/common/XReportGrid/XReport.vue +1070 -1070
  186. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +47 -47
  187. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +628 -628
  188. package/src/base-client/components/common/XReportGrid/XReportJsonRender.vue +380 -380
  189. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +1104 -1104
  190. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  191. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  192. package/src/base-client/components/common/XReportGrid/print.js +184 -184
  193. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  194. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  195. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  196. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  197. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  198. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  199. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  200. package/src/base-client/components/common/XStepView/index.js +3 -3
  201. package/src/base-client/components/common/XStepView/index.md +31 -31
  202. package/src/base-client/components/common/XTab/XTab.vue +201 -201
  203. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  204. package/src/base-client/components/common/XTab/index.js +3 -3
  205. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  206. package/src/base-client/components/common/XTable/ExportExcel.vue +276 -284
  207. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  208. package/src/base-client/components/common/XTable/XTable.vue +1431 -1431
  209. package/src/base-client/components/common/XTable/index.md +255 -255
  210. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  211. package/src/base-client/components/common/XTree/XTree.vue +424 -423
  212. package/src/base-client/components/common/XTree/XTreePro.vue +452 -451
  213. package/src/base-client/components/common/XTree/index.js +3 -3
  214. package/src/base-client/components/common/XTree/index.md +36 -36
  215. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  216. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  217. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  218. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  219. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +359 -359
  220. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  221. package/src/base-client/components/index.js +51 -51
  222. package/src/base-client/components/layout/XPageView/RenderRow.vue +63 -63
  223. package/src/base-client/components/layout/XPageView/XErrorView.vue +11 -11
  224. package/src/base-client/components/layout/XPageView/XPageView.vue +155 -155
  225. package/src/base-client/components/layout/XPageView/index.js +3 -3
  226. package/src/base-client/components/layout/XPageView/index.md +38 -38
  227. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  228. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  229. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  230. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  231. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  232. package/src/base-client/plugins/AppData.js +121 -121
  233. package/src/base-client/plugins/Config.js +19 -19
  234. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  235. package/src/base-client/plugins/Recording.js +258 -258
  236. package/src/base-client/plugins/index.js +23 -23
  237. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  238. package/src/bootstrap.js +42 -42
  239. package/src/components/Charts/Bar.vue +62 -62
  240. package/src/components/Charts/ChartCard.vue +134 -134
  241. package/src/components/Charts/Liquid.vue +67 -67
  242. package/src/components/Charts/MiniArea.vue +39 -39
  243. package/src/components/Charts/MiniBar.vue +39 -39
  244. package/src/components/Charts/MiniProgress.vue +75 -75
  245. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  246. package/src/components/Charts/Radar.vue +68 -68
  247. package/src/components/Charts/RankList.vue +77 -77
  248. package/src/components/Charts/TagCloud.vue +113 -113
  249. package/src/components/Charts/TransferBar.vue +64 -64
  250. package/src/components/Charts/Trend.vue +82 -82
  251. package/src/components/Charts/chart.less +12 -12
  252. package/src/components/Charts/smooth.area.less +13 -13
  253. package/src/components/CodeMirror/inedx.vue +118 -118
  254. package/src/components/CodeMirror/setting.js +40 -40
  255. package/src/components/FilePreview/FilePreview.vue +166 -166
  256. package/src/components/HeightScanner/index.vue +571 -571
  257. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  258. package/src/components/NumberInfo/index.js +3 -3
  259. package/src/components/NumberInfo/index.less +54 -54
  260. package/src/components/NumberInfo/index.md +43 -43
  261. package/src/components/STable/index.js +390 -390
  262. package/src/components/card/ChartCard.vue +79 -79
  263. package/src/components/chart/Bar.vue +60 -60
  264. package/src/components/chart/MiniArea.vue +67 -67
  265. package/src/components/chart/MiniBar.vue +59 -59
  266. package/src/components/chart/MiniProgress.vue +57 -57
  267. package/src/components/chart/Radar.vue +80 -80
  268. package/src/components/chart/RankingList.vue +60 -60
  269. package/src/components/chart/Trend.vue +79 -79
  270. package/src/components/chart/index.less +9 -9
  271. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  272. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  273. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  274. package/src/components/checkbox/index.js +9 -9
  275. package/src/components/exception/ExceptionPage.vue +70 -70
  276. package/src/components/g2Charts/constants.js +202 -202
  277. package/src/components/g2Charts/demo.vue +808 -808
  278. package/src/components/g2Charts/designer.vue +228 -228
  279. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  280. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  281. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  282. package/src/components/g2Charts/index.vue +397 -397
  283. package/src/components/index.js +36 -36
  284. package/src/components/input/IInput.vue +66 -66
  285. package/src/components/menu/SideMenu.vue +75 -75
  286. package/src/components/menu/menu.js +273 -273
  287. package/src/components/setting/Setting.vue +234 -234
  288. package/src/components/tool/AStepItem.vue +60 -60
  289. package/src/config/CreateQueryConfig.js +325 -325
  290. package/src/config/default/antd.config.js +89 -89
  291. package/src/config/default/setting.config.js +55 -55
  292. package/src/font-style/font.css +4 -4
  293. package/src/layouts/CommonLayout.vue +56 -56
  294. package/src/layouts/GridView.vue +45 -45
  295. package/src/layouts/PageLayout.vue +151 -151
  296. package/src/layouts/SinglePageView.vue +136 -136
  297. package/src/layouts/header/AdminHeader.vue +132 -132
  298. package/src/layouts/header/HeaderNotice.vue +177 -177
  299. package/src/layouts/header/InstitutionDetail.vue +181 -181
  300. package/src/layouts/tabs/TabsHead.vue +189 -189
  301. package/src/layouts/tabs/TabsView.vue +389 -389
  302. package/src/lib.js +1 -1
  303. package/src/main.js +34 -34
  304. package/src/mock/extend/index.js +84 -84
  305. package/src/mock/goods/index.js +108 -108
  306. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  307. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  308. package/src/pages/DefaultExample/index.vue +77 -77
  309. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  310. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  311. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  312. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  313. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  314. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  315. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  316. package/src/pages/DynamicStatistics/index.vue +282 -282
  317. package/src/pages/Example/childIndex.vue +15 -15
  318. package/src/pages/Example/index.vue +30 -30
  319. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  320. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  321. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  322. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  323. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  324. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  325. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  326. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  327. package/src/pages/Recording/index.vue +77 -77
  328. package/src/pages/ReportGrid/index.vue +76 -76
  329. package/src/pages/ServiceReview/index.vue +284 -284
  330. package/src/pages/SubExample/index.vue +26 -26
  331. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +32 -32
  332. package/src/pages/WorkflowDetail/WorkflowDetail.vue +230 -230
  333. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +131 -131
  334. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  335. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +302 -302
  336. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformationDetails.vue +276 -276
  337. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +864 -864
  338. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +997 -997
  339. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +222 -222
  340. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +233 -233
  341. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +261 -261
  342. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowListResolution.vue +248 -248
  343. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +73 -73
  344. package/src/pages/XPageViewExample/index.vue +38 -38
  345. package/src/pages/XReportView/index.vue +64 -64
  346. package/src/pages/XTreeOneProExample/index.vue +67 -67
  347. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  348. package/src/pages/login/Login.vue +378 -378
  349. package/src/pages/login/LoginV3.vue +389 -389
  350. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  351. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  352. package/src/pages/report/ReportTable.js +124 -124
  353. package/src/pages/resourceManage/orgListManage.vue +98 -98
  354. package/src/pages/system/dictionary/index.vue +44 -44
  355. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  356. package/src/pages/system/monitor/operLog/index.vue +37 -37
  357. package/src/pages/system/settings/modifyPassword.vue +117 -117
  358. package/src/pages/system/ticket/index.vue +480 -480
  359. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  360. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  361. package/src/pages/userInfoDetailManage/FillCardRecordQuery/index.vue +76 -76
  362. package/src/pages/userInfoDetailManage/FillGasRecordQuery/index.vue +74 -74
  363. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  364. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  365. package/src/pages/userInfoDetailManage/MachineRecordQuery/index.vue +74 -74
  366. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  367. package/src/pages/userInfoDetailManage/OtherChargeRecordQuery/index.vue +74 -74
  368. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  369. package/src/pages/userInfoDetailManage/UserChargeRecordQuery/index.vue +92 -92
  370. package/src/pages/userInfoDetailManage/UserHandRecordQuery/index.vue +86 -86
  371. package/src/pages/userInfoDetailManage/UserRecordQuery/index.vue +73 -73
  372. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  373. package/src/pages/userInfoDetailManage/index.vue +82 -82
  374. package/src/pages/userInfoDetailManage/userInfoDetailQueryTabs.vue +132 -132
  375. package/src/plugins/EventLogPlugin.js +33 -33
  376. package/src/plugins/FindParentsData.js +17 -17
  377. package/src/plugins/HiPrintPlugin.js +124 -124
  378. package/src/router/async/config.async.js +35 -35
  379. package/src/router/async/router.map.js +188 -188
  380. package/src/router/guards.js +263 -263
  381. package/src/router/index.js +27 -27
  382. package/src/router.js +19 -19
  383. package/src/services/DataModel.js +30 -30
  384. package/src/services/LodopFuncs.js +137 -137
  385. package/src/services/api/TicketDetailsViewApi.js +46 -46
  386. package/src/services/api/cas.js +79 -79
  387. package/src/services/api/common.js +346 -346
  388. package/src/services/api/entity.js +18 -18
  389. package/src/services/api/index.js +17 -17
  390. package/src/services/api/restTools.js +145 -145
  391. package/src/services/api/workFlow.js +63 -63
  392. package/src/services/apiService.js +15 -15
  393. package/src/services/user.js +90 -90
  394. package/src/services/v3Api.js +116 -116
  395. package/src/store/modules/account.js +115 -115
  396. package/src/store/modules/index.js +5 -5
  397. package/src/store/modules/lowCode.js +33 -33
  398. package/src/store/modules/setting.js +119 -119
  399. package/src/theme/default/style.less +58 -58
  400. package/src/theme/global.less +159 -159
  401. package/src/utils/authority-utils.js +85 -85
  402. package/src/utils/errorCode.js +6 -6
  403. package/src/utils/formatter.js +74 -74
  404. package/src/utils/htmlToPDF.js +108 -108
  405. package/src/utils/htmlToPDFApi.js +5 -5
  406. package/src/utils/indexedDB.js +263 -263
  407. package/src/utils/login.js +188 -188
  408. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  409. package/src/utils/lowcode/lowcodeLog.js +29 -29
  410. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  411. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  412. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  413. package/src/utils/microAppUtils.js +40 -40
  414. package/src/utils/reg.js +95 -95
  415. package/src/utils/request.js +362 -362
  416. package/src/utils/routerUtil.js +450 -450
  417. package/src/utils/runEvalFunction.js +14 -14
  418. package/src/utils/util.js +329 -329
  419. package/src/utils/waterMark.js +31 -31
  420. package/test/Amis.spec.js +163 -163
  421. package/test/Tree.spec.js +167 -167
  422. package/test/myDialog.spec.js +46 -46
  423. package/test/util.test.js +52 -52
  424. package/test/v3Api.test.js +1983 -1983
  425. package/vue.config.js +213 -213
  426. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,1104 +1,1104 @@
1
- <template>
2
- <a-row id="has_row" type="flex" :gutter="gutter" :style="isWidget ? {margin: '0px'} : {'margin-bottom': '.5rem'}">
3
- <!-- 预览页展示 -->
4
- <template v-if="display">
5
- <template v-if="!inputColumns">
6
- <a-col
7
- name="trGroup"
8
- v-for="(cell, cellIndex) in columns"
9
- v-if="Array.isArray(cell) || !cell.dontShowRow"
10
- :key="cellIndex"
11
- :style="isWidget ? {padding: '0px 2px'} : (Array.isArray(cell) ? {} : determineCellStyle(cell))"
12
- :span="Array.isArray(cell) ? cell[0][0].colSpan * 2 : (cell.colSpan ? cell.colSpan * 2 : undefined)">
13
- <div id="report_widget" v-if="isWidget">
14
- <!-- 插槽渲染 -->
15
- <template v-if="Array.isArray(cell)">
16
- <!-- 处理 cell 是数组的情况 -->
17
- <div v-for="(item, index) in cell" :key="index">
18
- <x-report-tr-group
19
- @updateImg="updateImg"
20
- :show-img-in-cell="showImgInCell"
21
- :img-prefix="imgPrefix"
22
- :server-name="serverName"
23
- :env="env"
24
- :use-oss-for-img="useOssForImg"
25
- :key="index"
26
- :columns="recalculateItem(item)"
27
- :no-top-border="noTopBorder"
28
- :config-data="configData"
29
- :config="config"
30
- :display="true">
31
- </x-report-tr-group>
32
- </div>
33
- </template>
34
- <template v-else-if="cell.type === 'slot'">
35
- <template
36
- v-if="['x-form-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'].includes(cell.slotType)">
37
- <component
38
- :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
39
- :key="cellIndex"
40
- :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
41
- :serviceName="cell.serviceName"
42
- :serverName="cell.serviceName"
43
- v-on="getEventHandlers(cell)"
44
- @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
45
- :queryParamsName="cell.slotConfig"
46
- :configName="cell.slotConfig"
47
- :countVisible="false"
48
- :env="env"
49
- />
50
- </template>
51
- </template>
52
- </div>
53
- <a-card v-else class="flexItem" :bordered="false" :body-style="flexItemBodyState">
54
- <!-- 插槽渲染 -->
55
- <template v-if="Array.isArray(cell)">
56
- <!-- 处理 cell 是数组的情况 -->
57
- <div v-for="(item, index) in cell" :key="index">
58
- <x-report-tr-group
59
- @updateImg="updateImg"
60
- :show-img-in-cell="showImgInCell"
61
- :img-prefix="imgPrefix"
62
- :server-name="serverName"
63
- :env="env"
64
- :use-oss-for-img="useOssForImg"
65
- :key="index"
66
- :columns="recalculateItem(item)"
67
- :no-top-border="noTopBorder"
68
- :config-data="configData"
69
- :config="config"
70
- :display="true">
71
- </x-report-tr-group>
72
- </div>
73
- </template>
74
- <template v-else-if="cell.type === 'slot'">
75
- <template
76
- v-if="['x-form-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'].includes(cell.slotType)">
77
- <component
78
- :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
79
- :key="cellIndex"
80
- :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
81
- :serviceName="cell.serviceName"
82
- :serverName="cell.serviceName"
83
- v-on="getEventHandlers(cell)"
84
- @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
85
- :queryParamsName="cell.slotConfig"
86
- :configName="cell.slotConfig"
87
- :countVisible="false"
88
- :env="env"
89
- />
90
- </template>
91
- </template>
92
- <!-- button 按钮渲染 -->
93
- <template v-else-if="cell.type === 'button'">
94
- <a-button v-on="getEventHandlers(cell)">
95
- {{ cell.buttonName }}
96
- </a-button>
97
- </template>
98
- <template v-else-if="cell.type === 'column'">
99
- <template v-if="cell.customFunction">
100
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
101
- </template>
102
- <template v-else>
103
- {{ cell.text }}
104
- </template>
105
- </template>
106
- <!-- 占位 -->
107
- <template v-else-if="cell.type === 'placeHolderColumn'">
108
- </template>
109
- <template v-else-if="cell.type === 'value'">
110
- <template v-if="cell.customFunction === undefined">
111
- {{ cell.value }}
112
- </template>
113
- <template v-else>
114
- {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
115
- </template>
116
- </template>
117
- <template v-else-if="cell.type === 'input'">
118
- <template v-if="cell.customFunction === undefined">
119
- {{ getDeepObject(configData, cell.dataIndex) }}
120
- </template>
121
- <template v-else>
122
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
123
- </template>
124
- </template>
125
- <template v-else-if="cell.type === 'inputs'">
126
- <template v-if="cell.customFunction === undefined">
127
- {{ showSubRowValue(cell) }}
128
- </template>
129
- <template v-else>
130
- {{ deserializeFunctionAndRun(cell.customFunction, showSubRowValue(cell), config) }}
131
- </template>
132
- </template>
133
- <template v-else-if="cell.type === 'list'">
134
- <template v-if="listIndex === 0">
135
- <span style="font-weight: bold">{{ cell.listHead }}</span>
136
- </template>
137
- <template v-else-if="cell.listType === 'input'">
138
- {{ getDeepObject(configData, cell.dataIndex)[listIndex] }}
139
- </template>
140
- <template v-else-if="cell.listType === 'value'">
141
- {{ cell.content[listIndex] }}
142
- </template>
143
- <template v-else-if="cell.listType === 'variable'">
144
- {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
145
- </template>
146
- </template>
147
- <template v-else-if="cell.type === 'images'">
148
- <template
149
- v-if="getDeepObject(configData.images, cell.dataIndex) === undefined || getDeepObject(configData.images, cell.dataIndex).length === 0">
150
- <template
151
- v-if="getDeepObject(configData, cell.dataIndex) === undefined || getDeepObject(configData, cell.dataIndex).length === 0">
152
- <span>无</span>
153
- </template>
154
- <template v-else>
155
- <template v-if="typeof getDeepObject(configData, cell.dataIndex) === 'object'">
156
- <div style="display: flex; align-items: end; justify-content: space-evenly; flex-wrap: wrap">
157
- <template v-for="(img,imgIndex) in getDeepObject(configData, cell.dataIndex)">
158
- <template v-if="showImgInCell">
159
- <div :key="imgIndex">
160
- <img :src="img.url" alt="图片"/>
161
- <p>{{ img.name }}</p>
162
- </div>
163
- </template>
164
- <template v-else>
165
- <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
166
- </template>
167
- </template>
168
- </div>
169
- </template>
170
- <template v-else>
171
- <img :src="getDeepObject(configData, cell.dataIndex)" alt="图片"/>
172
- <p style="margin-right: 5%">{{ formatImgStr(getDeepObject(configData, cell.dataIndex))[0].name }}</p>
173
- </template>
174
- </template>
175
- </template>
176
- <span v-else v-for="(img,imgIndex) in getDeepObject(configData.images, cell.dataIndex)" :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
177
- </template>
178
- </a-card>
179
- </a-col>
180
- </template>
181
- <template v-else>
182
- <a-col
183
- v-for="(cell, cellIndex) in columns"
184
- :key="cellIndex"
185
- :class=" calcTDBorder(cell.noBoarder) "
186
- :span="cell.colSpan ? cell.colSpan * 2 : undefined"
187
- :style="determineCellStyle(cell)"
188
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
189
- <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
190
- <template v-if="cell.type === 'column'">
191
- {{ cell.text }}
192
- </template>
193
- <template v-else-if="cell.type === 'value'">
194
- <template v-if="cell.customFunction === undefined">
195
- {{ cell.value }}
196
- </template>
197
- <template v-else>
198
- {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
199
- </template>
200
- </template>
201
- <template v-else-if="cell.type === 'increment'">
202
- <template v-if="cell.customFunction === undefined">
203
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
204
- </template>
205
- <template v-else>
206
- {{
207
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
208
- }}
209
- </template>
210
- </template>
211
- <template v-else-if="cell.type === 'input'">
212
- <template v-if="cell.customFunction === undefined">
213
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
214
- </template>
215
- <template v-else>
216
- {{
217
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
218
- }}
219
- </template>
220
- </template>
221
- <template v-else-if="cell.type === 'inputs'">
222
- <template v-if="cell.customFunction === undefined">
223
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
224
- </template>
225
- <template v-else>
226
- {{
227
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
228
- }}
229
- </template>
230
- </template>
231
- </a-card>
232
- </a-col>
233
- </template>
234
- </template>
235
- <!-- 不是动态行 -->
236
- <template v-else-if="!inputColumns">
237
- <a-col
238
- v-for="(cell, cellIndex) in columns"
239
- :key="cellIndex"
240
- :class=" calcTDBorder(cell.noBoarder) "
241
- :span="cell.colSpan ? cell.colSpan * 2 : undefined"
242
- :style="determineCellStyle(cell)"
243
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
244
- <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
245
- <template v-if="cell.type === 'column'">
246
- <template v-if="cell.customFunction">
247
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
248
- </template>
249
- <template v-else>
250
- {{ cell.text }}
251
- </template>
252
- </template>
253
- <template v-else-if="cell.type === 'placeHolderColumn'">
254
- <!-- 占位 -->
255
- </template>
256
- <template v-else-if="cell.type === 'value'">
257
- {{ cell.value }}
258
- </template>
259
- <template v-else-if="cell.type === 'curDateInput'">
260
- <a-button type="dashed" v-if="configData[cell.dataIndex]">
261
- {{ configData[cell.dataIndex] }}
262
- </a-button>
263
- <a-button
264
- v-if="!configData[cell.dataIndex]"
265
- type="primary"
266
- @click="getNowDate(cell.dataIndex)"
267
- >{{ cell.text || '确认' }}
268
- </a-button>
269
- </template>
270
- <template v-else-if="cell.type === 'input'">
271
- <template v-if="cell.inputReadOnly === true">
272
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
273
- <a-input
274
- @change="handleInputDeepChange($event, cell.dataIndex)"
275
- v-model="config.tempData[cell.dataIndex]"
276
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
277
- :disabled="true"/>
278
- </template>
279
- <template v-else>
280
- <a-input
281
- v-model="configData[cell.dataIndex]"
282
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
283
- :disabled="true"/>
284
- </template>
285
- </template>
286
- <template v-else>
287
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
288
- <a-input
289
- @change="handleInputDeepChange($event, cell.dataIndex)"
290
- v-model="config.tempData[cell.dataIndex]"
291
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
292
- </template>
293
- <template v-else>
294
- <a-input
295
- v-model="configData[cell.dataIndex]"
296
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
297
- </template>
298
- </template>
299
- </template>
300
- <template v-else-if="cell.type === 'inputs'">
301
- <template v-if="cell.inputReadOnly === true">
302
- <div class="inputsDiv">
303
- <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
304
- <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
305
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
306
- <a-input
307
- @change="handleInputDeepChange($event, cell.dataIndex)"
308
- v-model="config.tempData[cell.dataIndex][index]"
309
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
310
- :disabled="true"/>
311
- </template>
312
- <template v-else>
313
- <a-input
314
- v-model="configData[cell.dataIndex][index]"
315
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
316
- :disabled="true"/>
317
- </template>
318
- <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
319
- </div>
320
- </div>
321
- </template>
322
- <template v-else>
323
- <div class="inputsDiv">
324
- <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
325
- <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
326
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
327
- <a-input
328
- @change="handleInputDeepChange($event, cell.dataIndex)"
329
- v-model="config.tempData[cell.dataIndex][index]"
330
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
331
- </template>
332
- <template v-else>
333
- <a-input
334
- v-model="configData[cell.dataIndex][index]"
335
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
336
- </template>
337
- <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
338
- </div>
339
- </div>
340
- </template>
341
- </template>
342
- <template v-else-if="cell.type === 'list'">
343
- <template v-if="cell.listType === 'input'">
344
- <a-input
345
- v-model="configData[cell.dataIndex][listIndex]"
346
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
347
- </template>
348
- <template v-else-if="cell.listType === 'value'">
349
- {{ cell.content[listIndex] }}
350
- </template>
351
- </template>
352
- <template v-else-if="cell.type === 'images'">
353
- <div>
354
- <template v-if="configData.images[cell.dataIndex]?.length > 0">
355
- <upload
356
- :model="uploadParams"
357
- :img-prefix="imgPrefix"
358
- :service-name="serverName"
359
- :images="checkImg(cell.dataIndex, 'configData')"
360
- :outer-container-index="cell.dataIndex"
361
- @setFiles="(...args) => {setImages(args, 'configData')}"
362
- :upload-style="'simple'"
363
- />
364
- </template>
365
- <template v-else>
366
- <upload
367
- :model="uploadParams"
368
- :img-prefix="imgPrefix"
369
- :service-name="serverName"
370
- :images="checkImg(cell.dataIndex, 'config')"
371
- :outer-container-index="cell.dataIndex"
372
- @setFiles="(...args) => {setImages(args, 'config', cell.dataIndex)}"
373
- :upload-style="'simple'"
374
- />
375
- </template>
376
- </div>
377
- </template>
378
- </a-card>
379
- </a-col>
380
- </template>
381
- <!-- 动态行插入按钮 -->
382
- <template v-else-if="inputColumnsButton">
383
- <a-col :span="maxColSpan" :class="calcTDBorder()">
384
- <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
385
- <a-button-group>
386
- <a-button @click="addData(columns[0].dataIndex, columns)">
387
- <a-icon type="plus"/>
388
- </a-button>
389
- <a-button @click="removeData(columns[0].dataIndex)">
390
- <a-icon type="minus"/>
391
- </a-button>
392
- </a-button-group>
393
- </a-card>
394
- </a-col>
395
- </template>
396
- <!-- 其他行 -->
397
- <template v-else>
398
- <a-col
399
- v-for="(cell, cellIndex) in columns"
400
- :key="cellIndex"
401
- :class=" calcTDBorder(cell.noBoarder) "
402
- :span="cell.colSpan ? cell.colSpan * 2 : undefined"
403
- :style="determineCellStyle(cell)"
404
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
405
- <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
406
- <template v-if="cell.type === 'column'">
407
- {{ cell.text }}
408
- </template>
409
- <template v-else-if="cell.type === 'value'">
410
- {{ cell.value }}
411
- </template>
412
- <template v-else-if="cell.type === 'curDateInput'">
413
- <a-button type="dashed" v-if="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]">
414
- {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
415
- </a-button>
416
- <a-button
417
- v-if="!configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
418
- type="primary"
419
- @click="getNowDate(inputColumnsDefinitionIndex,cell.dataIndex)"
420
- >{{ cell.text || '确认' }}
421
- </a-button>
422
- </template>
423
- <template v-else-if="cell.type === 'increment'">
424
- {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
425
- </template>
426
- <template v-else-if="cell.type === 'input'">
427
- <template v-if="cell.inputReadOnly === true">
428
- <a-input
429
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
430
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
431
- :disabled="true"/>
432
- </template>
433
- <template v-else>
434
- <a-input
435
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
436
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
437
- </template>
438
- </template>
439
- <template v-else-if="cell.type === 'inputs'">
440
- <template v-if="cell.inputReadOnly === true">
441
- <a-input
442
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
443
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
444
- :disabled="true"/>
445
- </template>
446
- <template v-else>
447
- <a-input
448
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
449
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
450
- </template>
451
- </template>
452
- </a-card>
453
- </a-col>
454
- </template>
455
- </a-row>
456
- </template>
457
-
458
- <script>
459
- import Upload from '@vue2-client/base-client/components/common/Upload'
460
- import { formatDate, getRealKeyData } from '@vue2-client/utils/util'
461
- import { nanoid } from 'nanoid'
462
- import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
463
- import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
464
- import { getMicroData, getWindow, isMicroAppEnv, microDispatch } from '@vue2-client/utils/microAppUtils'
465
-
466
- export default {
467
- name: 'XReportTrGroup',
468
- components: {
469
- Upload,
470
- XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'),
471
- XAddNativeForm: () => import('@vue2-client/base-client/components/common/XAddNativeForm/XAddNativeForm.vue'),
472
- XFormGroup: () => import('@vue2-client/base-client/components/common/XFormGroup/XFormGroup.vue'),
473
- XTreePro: () => import('@vue2-client/base-client/components/common/XTree/XTreePro.vue'),
474
- XHisEditor: () => import('@vue2-client/base-client/components/his/XHisEditor/XHisEditor.vue'),
475
- XTab: () => import('@vue2-client/base-client/components/common/XTab/XTab.vue'),
476
- XReport: () => import('@vue2-client/base-client/components/common/XReport/XReport.vue'),
477
- XButtons: () => import('@vue2-client/base-client/components/common/XButtons/XButtons.vue'),
478
- XLabelSelect: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelect.vue'),
479
- XConversation: () => import('@vue2-client/base-client/components/common/XConversation/XConversation.vue'),
480
- XCheckList: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
481
- },
482
- props: {
483
- // 每一行的配置
484
- columns: {
485
- type: Array,
486
- required: true
487
- },
488
- showImgInCell: {
489
- type: Boolean,
490
- default: false
491
- },
492
- config: {
493
- type: Object,
494
- default: function () {
495
- return {}
496
- }
497
- },
498
- // 命名空间
499
- serverName: {
500
- type: String,
501
- default: 'af-system'
502
- },
503
- // 环境
504
- env: {
505
- type: String,
506
- default: 'prod'
507
- },
508
- // 原始配置
509
- configData: {
510
- type: Object,
511
- required: true
512
- },
513
- // 是否为动态行
514
- inputColumns: {
515
- type: Boolean,
516
- default: false
517
- },
518
- // 是否为动态行按钮
519
- inputColumnsButton: {
520
- type: Boolean,
521
- default: false
522
- },
523
- // 动态行的Index
524
- inputColumnsDefinitionIndex: {
525
- type: Number,
526
- default: undefined
527
- },
528
- // 是否为展示行
529
- display: {
530
- type: Boolean,
531
- default: false
532
- },
533
- // list类型的下标,用于遍历列表时,获取对应的数据
534
- listIndex: {
535
- type: Number,
536
- default: undefined
537
- },
538
- // 表格没有上边框
539
- noTopBorder: {
540
- type: Boolean,
541
- default: false
542
- },
543
- // 图片是否使用OSS来保存
544
- useOssForImg: {
545
- type: Boolean,
546
- default: true
547
- },
548
- // 图片上传后添加前缀
549
- imgPrefix: {
550
- type: String,
551
- default: undefined
552
- }
553
- },
554
- computed: {
555
- allSlotSum () {
556
- // 计算总共有多少个Slot
557
- let sum = 0
558
- this.columns.forEach((item) => {
559
- console.log('item', item)
560
- if (Array.isArray(item)) {
561
- item.forEach((cell) => {
562
- if (cell.type === 'slot') {
563
- sum++
564
- }
565
- })
566
- } else if (item.type && item.type === 'slot') {
567
- sum++
568
- }
569
- })
570
- console.log(`=总共有 ${sum} 个插槽栅格`)
571
- return sum
572
- }
573
- },
574
- data () {
575
- return {
576
- gutter: [8, { xs: 8, sm: 16, md: 24, lg: 32 }], // 设置水槽大小
577
- maxColSpan: 12,
578
- uploadParams: {
579
- type: 'image',
580
- accept: ['*'],
581
- resUploadStock: 1,
582
- pathKey: 'cs'
583
- },
584
- mixinData: {},
585
- flexItemBodyState: {},
586
- // 已经渲染得插槽得数量
587
- slotRendered: 0,
588
- // tableConfig: {}
589
- }
590
- },
591
- inject: ['openDialog', 'emitEvent', 'registerComponent', 'getComponentByName', 'runLogic', 'getMixinData', 'getSelectedId', 'isInAModal', 'getConfigByName', 'getSelectedData', 'getOutEnv', 'currUser', 'isWidget'],
592
- methods: {
593
- getWindow,
594
- isMicroAppEnv,
595
- microDispatch,
596
- getMicroData,
597
- getRealKeyData,
598
- onComponentMounted (h, cell, cellIndex) {
599
- this.slotRendered += 1
600
- if (this.slotRendered >= this.allSlotSum) {
601
- this.$emit('slotRendered')
602
- }
603
- if (this.getMixinData && this.getMixinData()) {
604
- this.mixinData = this.getMixinData()
605
- }
606
- if (cell.slotRef) {
607
- this.registerComponent(cell.slotRef, this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0])
608
- }
609
- // 传递给祖先组件
610
- console.log(`插槽组件已经初始化 slotType ${cell.slotType},ref= dynamicComponent_${cell.slotRef || cellIndex} , serviceName = ${cell.serviceName}`)
611
- const shouldInit = cell.shouldInit == null ? true : cell.shouldInit
612
- if (shouldInit) {
613
- if (cell.slotType === 'x-add-native-form') {
614
- // 简易表单需要主动调用初始化方法
615
- getConfigByName(cell.slotConfig, cell.serviceName, async (res) => {
616
- // 如果配置了 表单初始化logic
617
- // 调用 logic 获取参数
618
- let param = { ...this.mixinData }
619
- let selectedId
620
- if (res.paramLogicName) {
621
- if (!!this.getSelectedId) {
622
- selectedId = this.getSelectedId()
623
- if (typeof selectedId !== 'object') {
624
- selectedId = { selectedId: selectedId }
625
- }
626
- }
627
- param = Object.assign(param, await runLogic(res.paramLogicName, selectedId, cell.serviceName))
628
- }
629
- console.info('给表单赋值', res)
630
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
631
- serviceName: cell.serviceName,
632
- configName: cell.slotConfig,
633
- formItems: res.formJson,
634
- showSubmitBtn: !this.isInAModal,
635
- businessType: param.businessType || '新增',
636
- layout: res.xAddFormLayout,
637
- primaryKey: res.primaryKey,
638
- ...res,
639
- fixedAddForm: param,
640
- modifyModelData: {
641
- files: param.files,
642
- images: param.images
643
- }
644
- })
645
- }, this.env === 'dev')
646
- } else if (cell.slotType === 'x-form-group') {
647
- // 简易表单需要主动调用初始化方法
648
- getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
649
- // 如果配置了 表单初始化logic
650
- // 调用 logic 获取参数
651
- const param = { ...this.mixinData }
652
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
653
- ...res,
654
- serviceName: cell.serviceName,
655
- showSubmitBtn: !this.isInAModal,
656
- businessType: param.businessType || '新增',
657
- modifyModelData: param,
658
- showLeftTab: true,
659
- })
660
- }, this.env === 'dev')
661
- } else if (cell.slotType === 'x-buttons') {
662
- // 按钮组需要主动调用初始化方法
663
- getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
664
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
665
- ...res,
666
- serviceName: cell.serviceName,
667
- })
668
- }, this.env === 'dev')
669
- } else if (cell.slotType === 'x-label-select') {
670
- // 按钮组需要主动调用初始化方法
671
- getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
672
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
673
- ...res,
674
- serviceName: cell.serviceName,
675
- })
676
- }, this.env === 'dev')
677
- }
678
- }
679
- if (cell.slotType === 'x-report') {
680
- const param = { ...this.mixinData }
681
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init(param)
682
- }
683
- if (cell.slotType === 'x-conversation') {
684
- getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
685
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
686
- serviceName: cell.serviceName,
687
- ...res,
688
- })
689
- }, this.env === 'dev')
690
- }
691
- if (cell.slotType === 'x-check-list') {
692
- getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
693
- this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
694
- serviceName: cell.serviceName,
695
- ...res,
696
- })
697
- }, this.env === 'dev')
698
- }
699
- },
700
-
701
- // 对于嵌套情况,对colSpan重新分配
702
- recalculateItem (item) {
703
- const totalColSpan = item.reduce((sum, cell) => sum + (cell.colSpan || 1), 0) // 计算总的 colSpan
704
- return item.map(cell => {
705
- const newColSpan = Math.round((cell.colSpan || 1) / totalColSpan * 12) // 按比例重新分配 colSpan
706
- return {
707
- ...cell,
708
- colSpan: newColSpan // 更新 colSpan
709
- }
710
- })
711
- },
712
-
713
- getEventHandlers (cell) {
714
- const handlers = {}
715
- if (!cell?.events || cell?.events?.length === 0) {
716
- return handlers
717
- }
718
- cell.events.forEach(event => {
719
- handlers[event.type] = async (...args) => {
720
- console.info('Event handled:', event.type, args)
721
- let func = event.customFunction
722
- if (func && func.startsWith('function')) {
723
- func = func.replace('function', 'async function')
724
- }
725
- const result = await executeStrFunctionByContext(this, func, args)
726
- if (result instanceof Promise) {
727
- result.then((res) => {
728
- if (!res) return
729
- let messageType = 'success'
730
- // 如果传递了组件名字 自动调用刷新
731
- if (res?.name) {
732
- const waitRefreshRef = this.getComponentByName(res.name)
733
- if (waitRefreshRef) {
734
- waitRefreshRef.refresh()
735
- } else {
736
- console.warn(`未找到组件${res.name}无法刷新`)
737
- }
738
- }
739
- // 如果传递消息类型 自动调用消息
740
- if (res?.messageType) {
741
- messageType = res.messageType
742
- }
743
- // 如果传递了提示信息自动调用提示
744
- if (res?.message) {
745
- this.$message[messageType](res?.message)
746
- }
747
- })
748
- }
749
- }
750
- })
751
- return handlers
752
- },
753
- getComponentName (queryParamsName, serviceName, componentName) {
754
- // const config = await getConfigByName(queryParamsName, serviceName)
755
- // const componentName = config.$globalProp.type
756
- return componentName
757
- },
758
- updateImg (data) {
759
- this.$emit('updateImg', data)
760
- },
761
- formatImgStr (str) {
762
- const result = []
763
- if (str !== '') {
764
- const arr = str.split('/')
765
- result.push({
766
- uid: nanoid(6),
767
- url: str,
768
- name: arr[arr.length - 1],
769
- status: 'done'
770
- })
771
- }
772
- this.uploadParams.acceptCount = 1
773
- return result
774
- },
775
- checkImg (index, type) {
776
- let target
777
- if (type === 'configData') {
778
- target = this.configData.images[index]
779
- } else {
780
- target = this.config.tempData[index]
781
- }
782
- if (typeof target !== 'object') {
783
- return this.formatImgStr(target)
784
- }
785
- target.forEach(obj => {
786
- if (obj.uid === undefined) {
787
- obj.uid = obj.id.toString()
788
- }
789
- if (obj.url === undefined) {
790
- if (obj.path) {
791
- obj.url = obj.path
792
- }
793
- }
794
- if (obj.name === undefined) {
795
- const withOutEndFix = obj.url.split('.')[0]
796
- const temp = withOutEndFix.split('/')
797
- obj.name = temp[temp.length - 1]
798
- }
799
- if (obj.status === undefined) {
800
- obj.status = 'done'
801
- }
802
- })
803
- return target
804
- },
805
- // 判断单元格样式
806
- determineCellStyle (cell, color = '#000', borderWidth = '1px') {
807
- // 如果声明了borderColor
808
- if (this.config.style.borderColor) {
809
- color = this.config.style.borderColor
810
- }
811
- let result = {}
812
- // 如果表格也声明了样式,用表格样式将样式覆盖
813
- if (cell.style) {
814
- if (cell.noBorder) {
815
- result = { ...cell.style }
816
- } else {
817
- if (this.noTopBorder) {
818
- result = { ...cell.style }
819
- } else {
820
- result = { ...cell.style }
821
- }
822
- }
823
- return result
824
- }
825
- return result
826
- },
827
-
828
- // 表格中数据key含有@@@,需要手动触发更新
829
- handleInputDeepChange () {
830
- this.$forceUpdate()
831
- },
832
- // 路径中含有@@@的key,将其解析,并返回其数据
833
- getDeepObject (obj, strPath) {
834
- if (!strPath) {
835
- return ''
836
- }
837
- const arr = strPath.split('@@@')
838
- let result = obj[arr[0]]
839
- arr.shift()
840
- try {
841
- while (arr.length > 0) {
842
- result = result[arr[0]]
843
- arr.shift()
844
- }
845
- } catch (e) {
846
- result = undefined
847
- }
848
- return result
849
- },
850
- // 获取当前日期
851
- getNowDate (index1, index2) {
852
- if (index2) {
853
- // @click="getNowDate(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
854
- this.configData.arr[index1][index2] = formatDate('now')
855
- } else {
856
- this.configData[index1] = formatDate('now')
857
- }
858
- this.configData = Object.assign({}, this.configData)
859
- },
860
- // 反序列化函数并执行
861
- deserializeFunctionAndRun (functionStr, value) {
862
- // eslint-disable-next-line no-eval
863
- const fun = eval('(' + functionStr + ')')
864
- return fun(value, this.config)
865
- },
866
- // 基础上传组件,图片改动后触发
867
- setImages (args, type, index = undefined) {
868
- // 如果基础上传组件在初始化完成后,就调用emit了setImage,此时图片并没有变化,直接返回
869
- if (args[2] === 'created') {
870
- return
871
- }
872
- if (type === 'configData') {
873
- this.configData.images[args[1]] = args[0]
874
- } else {
875
- this.config.tempData[args[1]] = args[0]
876
- if (index) {
877
- this.$emit('updateImg', this.config.tempData[index])
878
- }
879
- }
880
- },
881
- // 动态行删除
882
- removeData (index) {
883
- if (this.configData[index].length === 0) {
884
- this.$message.warn('已经没有更多了')
885
- return
886
- }
887
- this.configData[index].pop()
888
- },
889
- // 添加一行
890
- addData (index, row) {
891
- // 获取定义
892
- const defs = row[0].definition
893
-
894
- // 获取外层对象名
895
- const dataName = row[0].dataIndex
896
- const temp = {}
897
-
898
- defs.forEach(def => {
899
- // 找到数组中最后一个数据的值
900
- let lastDataNo = 0
901
- if (this.configData[dataName][this.configData[dataName].length - 1]) {
902
- lastDataNo = this.configData[dataName][this.configData[dataName].length - 1][def.dataIndex]
903
- }
904
-
905
- // 如果没有值,检查是否声明了初始值
906
- if (lastDataNo === 0 && def.initialValue) {
907
- lastDataNo = def.initialValue
908
- }
909
-
910
- // 检查是否有步长
911
- let step = 1
912
- if (def.step) {
913
- step = def.step
914
- }
915
-
916
- // 如果单元格类型为increment,则进行自增
917
- if (def.type === 'increment') {
918
- temp[def.dataIndex] = lastDataNo + step
919
- }
920
- })
921
- this.configData[index].push(temp)
922
- },
923
- // 根据format计算需要多少个输入框
924
- calcFormatInputNum (formatStr) {
925
- let count = 0
926
- for (let i = 0; i < formatStr.length; i++) {
927
- if (formatStr[i] === '{') {
928
- count++
929
- }
930
- }
931
- return count
932
- },
933
- // 根据format计算输入框之后的文字显示
934
- displayFormatText (formatStr, num) {
935
- let start = 0
936
- let count = 0
937
- num++
938
- for (let i = 0; i < formatStr.length; i++) {
939
- if (formatStr[i] === '}') {
940
- start = i
941
- count++
942
- }
943
- if (count === num) {
944
- for (let j = start + 1; j < formatStr.length; j++) {
945
- if (formatStr[j] === '{') {
946
- return formatStr.slice(start + 1, j)
947
- }
948
- if (j === formatStr.length - 1 && formatStr[j] !== '}') {
949
- return formatStr[j]
950
- }
951
- }
952
- }
953
- }
954
- },
955
- calcTDBorder (cellNoBorder = false) {
956
- if (cellNoBorder) {
957
- return 'tdNoBorder'
958
- } else {
959
- if (this.noTopBorder) {
960
- return 'tdWithNoTopBorder'
961
- } else {
962
- return 'tdWithBorder'
963
- }
964
- }
965
- },
966
- // 根据format计算输入框之前的文字显示
967
- displayFormatStartText (formatStr) {
968
- let count = 0
969
- for (let i = 0; i < formatStr.length; i++) {
970
- if (formatStr[i] === '{') {
971
- break
972
- } else {
973
- count++
974
- }
975
- }
976
- return formatStr.slice(0, count)
977
- },
978
- // 拼接被自动拆分的单元格内容
979
- showSubRowValue (cell) {
980
- const dataName = cell.dataIndex
981
- const formatArr = []
982
- const dataArr = []
983
-
984
- // 从config中取出所有数据,根据dataIndex的开头内容进行拼接
985
- this.config.columns.forEach(row => row.forEach(cell => {
986
- if (cell.dataIndex && cell.dataIndex.startsWith(dataName)) {
987
- formatArr.push(cell.format)
988
- dataArr.push(this.configData[cell.dataIndex])
989
- }
990
- }))
991
-
992
- const text = []
993
- const data = []
994
-
995
- formatArr.forEach(word => {
996
- const temp = word.split('{}')
997
- temp.forEach(char => {
998
- if (char !== '') {
999
- text.push(char)
1000
- }
1001
- })
1002
- })
1003
-
1004
- dataArr.forEach(item => {
1005
- item.forEach(num => {
1006
- data.push(num)
1007
- })
1008
- })
1009
-
1010
- let result = ''
1011
- for (let i = 0; i < data.length; i++) {
1012
- result += data[i]
1013
- result += text[i]
1014
- }
1015
-
1016
- return result
1017
- },
1018
- // 把用户定义的组件,传递到整个杉格中,方便调用
1019
- passComponentNamesToAncestor (refs) {
1020
- console.log('组件的keys', Object.entries(refs), refs)
1021
- // 遍历所有 refs
1022
- Object.entries(refs).forEach(([refKey, refValue]) => {
1023
- // 检查 ref 是否以 dynamicComponent_ 开头
1024
- if (refKey.startsWith('dynamicComponent_')) {
1025
- console.log('组件名存在')
1026
- const componentRef = refValue[0]
1027
- if (componentRef) {
1028
- // 去掉前缀并获取组件名字
1029
- const index = refKey.replace('dynamicComponent_', '') // 去掉前缀
1030
- console.log('注册组件', index)
1031
- // 传递给祖先组件
1032
- this.registerComponent(index, componentRef)
1033
- }
1034
- }
1035
- })
1036
- }
1037
- },
1038
- beforeMount () {
1039
- if (this.useOssForImg) {
1040
- this.uploadParams.resUploadMode = 'oss'
1041
- }
1042
- },
1043
- mounted () {
1044
- },
1045
- }
1046
-
1047
- </script>
1048
-
1049
- <style scoped lang="less">
1050
- .inputsDiv {
1051
- display: flex;
1052
- justify-content: space-between;
1053
-
1054
- .inputsDivItem {
1055
- display: flex;
1056
- align-items: center;
1057
- padding: 0 4px;
1058
- white-space: nowrap;
1059
-
1060
- .inputsDivItemLabel {
1061
- padding: 0 4px;
1062
- }
1063
- }
1064
- }
1065
-
1066
- .tdNoBorder {
1067
- border-left: 1px solid #000;
1068
- border-right: 1px solid #000;
1069
- padding: 8px;
1070
- }
1071
-
1072
- .tdWithBorder {
1073
- border: 1px solid #000;
1074
- padding: 8px;
1075
- }
1076
-
1077
- .tdWithNoTopBorder {
1078
- border-top-style: none;
1079
- border-left: 1px solid #000;
1080
- border-right: 1px solid #000;
1081
- border-bottom: 1px solid #000;
1082
- padding: 8px;
1083
- }
1084
-
1085
- .grid-content {
1086
- border-radius: 4px;
1087
- min-height: 36px;
1088
- text-align: center;
1089
- color: #fff;
1090
- background-color: #606266;
1091
- }
1092
-
1093
- .bg-purple {
1094
- background: #9254de;
1095
- }
1096
-
1097
- .bg-purple-light {
1098
- background: #b37feb;
1099
- }
1100
- .flexItem {
1101
- border-radius: 8px;
1102
- height: 100%;
1103
- }
1104
- </style>
1
+ <template>
2
+ <a-row id="has_row" type="flex" :gutter="gutter" :style="isWidget ? {margin: '0px'} : {'margin-bottom': '.5rem'}">
3
+ <!-- 预览页展示 -->
4
+ <template v-if="display">
5
+ <template v-if="!inputColumns">
6
+ <a-col
7
+ name="trGroup"
8
+ v-for="(cell, cellIndex) in columns"
9
+ v-if="Array.isArray(cell) || !cell.dontShowRow"
10
+ :key="cellIndex"
11
+ :style="isWidget ? {padding: '0px 2px'} : (Array.isArray(cell) ? {} : determineCellStyle(cell))"
12
+ :span="Array.isArray(cell) ? cell[0][0].colSpan * 2 : (cell.colSpan ? cell.colSpan * 2 : undefined)">
13
+ <div id="report_widget" v-if="isWidget">
14
+ <!-- 插槽渲染 -->
15
+ <template v-if="Array.isArray(cell)">
16
+ <!-- 处理 cell 是数组的情况 -->
17
+ <div v-for="(item, index) in cell" :key="index">
18
+ <x-report-tr-group
19
+ @updateImg="updateImg"
20
+ :show-img-in-cell="showImgInCell"
21
+ :img-prefix="imgPrefix"
22
+ :server-name="serverName"
23
+ :env="env"
24
+ :use-oss-for-img="useOssForImg"
25
+ :key="index"
26
+ :columns="recalculateItem(item)"
27
+ :no-top-border="noTopBorder"
28
+ :config-data="configData"
29
+ :config="config"
30
+ :display="true">
31
+ </x-report-tr-group>
32
+ </div>
33
+ </template>
34
+ <template v-else-if="cell.type === 'slot'">
35
+ <template
36
+ v-if="['x-form-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'].includes(cell.slotType)">
37
+ <component
38
+ :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
39
+ :key="cellIndex"
40
+ :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
41
+ :serviceName="cell.serviceName"
42
+ :serverName="cell.serviceName"
43
+ v-on="getEventHandlers(cell)"
44
+ @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
45
+ :queryParamsName="cell.slotConfig"
46
+ :configName="cell.slotConfig"
47
+ :countVisible="false"
48
+ :env="env"
49
+ />
50
+ </template>
51
+ </template>
52
+ </div>
53
+ <a-card v-else class="flexItem" :bordered="false" :body-style="flexItemBodyState">
54
+ <!-- 插槽渲染 -->
55
+ <template v-if="Array.isArray(cell)">
56
+ <!-- 处理 cell 是数组的情况 -->
57
+ <div v-for="(item, index) in cell" :key="index">
58
+ <x-report-tr-group
59
+ @updateImg="updateImg"
60
+ :show-img-in-cell="showImgInCell"
61
+ :img-prefix="imgPrefix"
62
+ :server-name="serverName"
63
+ :env="env"
64
+ :use-oss-for-img="useOssForImg"
65
+ :key="index"
66
+ :columns="recalculateItem(item)"
67
+ :no-top-border="noTopBorder"
68
+ :config-data="configData"
69
+ :config="config"
70
+ :display="true">
71
+ </x-report-tr-group>
72
+ </div>
73
+ </template>
74
+ <template v-else-if="cell.type === 'slot'">
75
+ <template
76
+ v-if="['x-form-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'].includes(cell.slotType)">
77
+ <component
78
+ :is="getComponentName(cell.slotConfig, cell.serviceName, cell.slotType)"
79
+ :key="cellIndex"
80
+ :ref="`dynamicComponent_${ cell.slotRef || cellIndex}`"
81
+ :serviceName="cell.serviceName"
82
+ :serverName="cell.serviceName"
83
+ v-on="getEventHandlers(cell)"
84
+ @hook:mounted="(h)=>onComponentMounted(h,cell,cellIndex)"
85
+ :queryParamsName="cell.slotConfig"
86
+ :configName="cell.slotConfig"
87
+ :countVisible="false"
88
+ :env="env"
89
+ />
90
+ </template>
91
+ </template>
92
+ <!-- button 按钮渲染 -->
93
+ <template v-else-if="cell.type === 'button'">
94
+ <a-button v-on="getEventHandlers(cell)">
95
+ {{ cell.buttonName }}
96
+ </a-button>
97
+ </template>
98
+ <template v-else-if="cell.type === 'column'">
99
+ <template v-if="cell.customFunction">
100
+ {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
101
+ </template>
102
+ <template v-else>
103
+ {{ cell.text }}
104
+ </template>
105
+ </template>
106
+ <!-- 占位 -->
107
+ <template v-else-if="cell.type === 'placeHolderColumn'">
108
+ </template>
109
+ <template v-else-if="cell.type === 'value'">
110
+ <template v-if="cell.customFunction === undefined">
111
+ {{ cell.value }}
112
+ </template>
113
+ <template v-else>
114
+ {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
115
+ </template>
116
+ </template>
117
+ <template v-else-if="cell.type === 'input'">
118
+ <template v-if="cell.customFunction === undefined">
119
+ {{ getDeepObject(configData, cell.dataIndex) }}
120
+ </template>
121
+ <template v-else>
122
+ {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
123
+ </template>
124
+ </template>
125
+ <template v-else-if="cell.type === 'inputs'">
126
+ <template v-if="cell.customFunction === undefined">
127
+ {{ showSubRowValue(cell) }}
128
+ </template>
129
+ <template v-else>
130
+ {{ deserializeFunctionAndRun(cell.customFunction, showSubRowValue(cell), config) }}
131
+ </template>
132
+ </template>
133
+ <template v-else-if="cell.type === 'list'">
134
+ <template v-if="listIndex === 0">
135
+ <span style="font-weight: bold">{{ cell.listHead }}</span>
136
+ </template>
137
+ <template v-else-if="cell.listType === 'input'">
138
+ {{ getDeepObject(configData, cell.dataIndex)[listIndex] }}
139
+ </template>
140
+ <template v-else-if="cell.listType === 'value'">
141
+ {{ cell.content[listIndex] }}
142
+ </template>
143
+ <template v-else-if="cell.listType === 'variable'">
144
+ {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
145
+ </template>
146
+ </template>
147
+ <template v-else-if="cell.type === 'images'">
148
+ <template
149
+ v-if="getDeepObject(configData.images, cell.dataIndex) === undefined || getDeepObject(configData.images, cell.dataIndex).length === 0">
150
+ <template
151
+ v-if="getDeepObject(configData, cell.dataIndex) === undefined || getDeepObject(configData, cell.dataIndex).length === 0">
152
+ <span>无</span>
153
+ </template>
154
+ <template v-else>
155
+ <template v-if="typeof getDeepObject(configData, cell.dataIndex) === 'object'">
156
+ <div style="display: flex; align-items: end; justify-content: space-evenly; flex-wrap: wrap">
157
+ <template v-for="(img,imgIndex) in getDeepObject(configData, cell.dataIndex)">
158
+ <template v-if="showImgInCell">
159
+ <div :key="imgIndex">
160
+ <img :src="img.url" alt="图片"/>
161
+ <p>{{ img.name }}</p>
162
+ </div>
163
+ </template>
164
+ <template v-else>
165
+ <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
166
+ </template>
167
+ </template>
168
+ </div>
169
+ </template>
170
+ <template v-else>
171
+ <img :src="getDeepObject(configData, cell.dataIndex)" alt="图片"/>
172
+ <p style="margin-right: 5%">{{ formatImgStr(getDeepObject(configData, cell.dataIndex))[0].name }}</p>
173
+ </template>
174
+ </template>
175
+ </template>
176
+ <span v-else v-for="(img,imgIndex) in getDeepObject(configData.images, cell.dataIndex)" :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
177
+ </template>
178
+ </a-card>
179
+ </a-col>
180
+ </template>
181
+ <template v-else>
182
+ <a-col
183
+ v-for="(cell, cellIndex) in columns"
184
+ :key="cellIndex"
185
+ :class=" calcTDBorder(cell.noBoarder) "
186
+ :span="cell.colSpan ? cell.colSpan * 2 : undefined"
187
+ :style="determineCellStyle(cell)"
188
+ :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
189
+ <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
190
+ <template v-if="cell.type === 'column'">
191
+ {{ cell.text }}
192
+ </template>
193
+ <template v-else-if="cell.type === 'value'">
194
+ <template v-if="cell.customFunction === undefined">
195
+ {{ cell.value }}
196
+ </template>
197
+ <template v-else>
198
+ {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
199
+ </template>
200
+ </template>
201
+ <template v-else-if="cell.type === 'increment'">
202
+ <template v-if="cell.customFunction === undefined">
203
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
204
+ </template>
205
+ <template v-else>
206
+ {{
207
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
208
+ }}
209
+ </template>
210
+ </template>
211
+ <template v-else-if="cell.type === 'input'">
212
+ <template v-if="cell.customFunction === undefined">
213
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
214
+ </template>
215
+ <template v-else>
216
+ {{
217
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
218
+ }}
219
+ </template>
220
+ </template>
221
+ <template v-else-if="cell.type === 'inputs'">
222
+ <template v-if="cell.customFunction === undefined">
223
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
224
+ </template>
225
+ <template v-else>
226
+ {{
227
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
228
+ }}
229
+ </template>
230
+ </template>
231
+ </a-card>
232
+ </a-col>
233
+ </template>
234
+ </template>
235
+ <!-- 不是动态行 -->
236
+ <template v-else-if="!inputColumns">
237
+ <a-col
238
+ v-for="(cell, cellIndex) in columns"
239
+ :key="cellIndex"
240
+ :class=" calcTDBorder(cell.noBoarder) "
241
+ :span="cell.colSpan ? cell.colSpan * 2 : undefined"
242
+ :style="determineCellStyle(cell)"
243
+ :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
244
+ <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
245
+ <template v-if="cell.type === 'column'">
246
+ <template v-if="cell.customFunction">
247
+ {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
248
+ </template>
249
+ <template v-else>
250
+ {{ cell.text }}
251
+ </template>
252
+ </template>
253
+ <template v-else-if="cell.type === 'placeHolderColumn'">
254
+ <!-- 占位 -->
255
+ </template>
256
+ <template v-else-if="cell.type === 'value'">
257
+ {{ cell.value }}
258
+ </template>
259
+ <template v-else-if="cell.type === 'curDateInput'">
260
+ <a-button type="dashed" v-if="configData[cell.dataIndex]">
261
+ {{ configData[cell.dataIndex] }}
262
+ </a-button>
263
+ <a-button
264
+ v-if="!configData[cell.dataIndex]"
265
+ type="primary"
266
+ @click="getNowDate(cell.dataIndex)"
267
+ >{{ cell.text || '确认' }}
268
+ </a-button>
269
+ </template>
270
+ <template v-else-if="cell.type === 'input'">
271
+ <template v-if="cell.inputReadOnly === true">
272
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
273
+ <a-input
274
+ @change="handleInputDeepChange($event, cell.dataIndex)"
275
+ v-model="config.tempData[cell.dataIndex]"
276
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
277
+ :disabled="true"/>
278
+ </template>
279
+ <template v-else>
280
+ <a-input
281
+ v-model="configData[cell.dataIndex]"
282
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
283
+ :disabled="true"/>
284
+ </template>
285
+ </template>
286
+ <template v-else>
287
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
288
+ <a-input
289
+ @change="handleInputDeepChange($event, cell.dataIndex)"
290
+ v-model="config.tempData[cell.dataIndex]"
291
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
292
+ </template>
293
+ <template v-else>
294
+ <a-input
295
+ v-model="configData[cell.dataIndex]"
296
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
297
+ </template>
298
+ </template>
299
+ </template>
300
+ <template v-else-if="cell.type === 'inputs'">
301
+ <template v-if="cell.inputReadOnly === true">
302
+ <div class="inputsDiv">
303
+ <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
304
+ <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
305
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
306
+ <a-input
307
+ @change="handleInputDeepChange($event, cell.dataIndex)"
308
+ v-model="config.tempData[cell.dataIndex][index]"
309
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
310
+ :disabled="true"/>
311
+ </template>
312
+ <template v-else>
313
+ <a-input
314
+ v-model="configData[cell.dataIndex][index]"
315
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
316
+ :disabled="true"/>
317
+ </template>
318
+ <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
319
+ </div>
320
+ </div>
321
+ </template>
322
+ <template v-else>
323
+ <div class="inputsDiv">
324
+ <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
325
+ <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
326
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
327
+ <a-input
328
+ @change="handleInputDeepChange($event, cell.dataIndex)"
329
+ v-model="config.tempData[cell.dataIndex][index]"
330
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
331
+ </template>
332
+ <template v-else>
333
+ <a-input
334
+ v-model="configData[cell.dataIndex][index]"
335
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
336
+ </template>
337
+ <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
338
+ </div>
339
+ </div>
340
+ </template>
341
+ </template>
342
+ <template v-else-if="cell.type === 'list'">
343
+ <template v-if="cell.listType === 'input'">
344
+ <a-input
345
+ v-model="configData[cell.dataIndex][listIndex]"
346
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
347
+ </template>
348
+ <template v-else-if="cell.listType === 'value'">
349
+ {{ cell.content[listIndex] }}
350
+ </template>
351
+ </template>
352
+ <template v-else-if="cell.type === 'images'">
353
+ <div>
354
+ <template v-if="configData.images[cell.dataIndex]?.length > 0">
355
+ <upload
356
+ :model="uploadParams"
357
+ :img-prefix="imgPrefix"
358
+ :service-name="serverName"
359
+ :images="checkImg(cell.dataIndex, 'configData')"
360
+ :outer-container-index="cell.dataIndex"
361
+ @setFiles="(...args) => {setImages(args, 'configData')}"
362
+ :upload-style="'simple'"
363
+ />
364
+ </template>
365
+ <template v-else>
366
+ <upload
367
+ :model="uploadParams"
368
+ :img-prefix="imgPrefix"
369
+ :service-name="serverName"
370
+ :images="checkImg(cell.dataIndex, 'config')"
371
+ :outer-container-index="cell.dataIndex"
372
+ @setFiles="(...args) => {setImages(args, 'config', cell.dataIndex)}"
373
+ :upload-style="'simple'"
374
+ />
375
+ </template>
376
+ </div>
377
+ </template>
378
+ </a-card>
379
+ </a-col>
380
+ </template>
381
+ <!-- 动态行插入按钮 -->
382
+ <template v-else-if="inputColumnsButton">
383
+ <a-col :span="maxColSpan" :class="calcTDBorder()">
384
+ <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
385
+ <a-button-group>
386
+ <a-button @click="addData(columns[0].dataIndex, columns)">
387
+ <a-icon type="plus"/>
388
+ </a-button>
389
+ <a-button @click="removeData(columns[0].dataIndex)">
390
+ <a-icon type="minus"/>
391
+ </a-button>
392
+ </a-button-group>
393
+ </a-card>
394
+ </a-col>
395
+ </template>
396
+ <!-- 其他行 -->
397
+ <template v-else>
398
+ <a-col
399
+ v-for="(cell, cellIndex) in columns"
400
+ :key="cellIndex"
401
+ :class=" calcTDBorder(cell.noBoarder) "
402
+ :span="cell.colSpan ? cell.colSpan * 2 : undefined"
403
+ :style="determineCellStyle(cell)"
404
+ :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
405
+ <a-card class="flexItem" :bordered="false" :body-style="flexItemBodyState">
406
+ <template v-if="cell.type === 'column'">
407
+ {{ cell.text }}
408
+ </template>
409
+ <template v-else-if="cell.type === 'value'">
410
+ {{ cell.value }}
411
+ </template>
412
+ <template v-else-if="cell.type === 'curDateInput'">
413
+ <a-button type="dashed" v-if="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]">
414
+ {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
415
+ </a-button>
416
+ <a-button
417
+ v-if="!configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
418
+ type="primary"
419
+ @click="getNowDate(inputColumnsDefinitionIndex,cell.dataIndex)"
420
+ >{{ cell.text || '确认' }}
421
+ </a-button>
422
+ </template>
423
+ <template v-else-if="cell.type === 'increment'">
424
+ {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
425
+ </template>
426
+ <template v-else-if="cell.type === 'input'">
427
+ <template v-if="cell.inputReadOnly === true">
428
+ <a-input
429
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
430
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
431
+ :disabled="true"/>
432
+ </template>
433
+ <template v-else>
434
+ <a-input
435
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
436
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
437
+ </template>
438
+ </template>
439
+ <template v-else-if="cell.type === 'inputs'">
440
+ <template v-if="cell.inputReadOnly === true">
441
+ <a-input
442
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
443
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
444
+ :disabled="true"/>
445
+ </template>
446
+ <template v-else>
447
+ <a-input
448
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
449
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
450
+ </template>
451
+ </template>
452
+ </a-card>
453
+ </a-col>
454
+ </template>
455
+ </a-row>
456
+ </template>
457
+
458
+ <script>
459
+ import Upload from '@vue2-client/base-client/components/common/Upload'
460
+ import { formatDate, getRealKeyData } from '@vue2-client/utils/util'
461
+ import { nanoid } from 'nanoid'
462
+ import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
463
+ import { getConfigByName, runLogic } from '@vue2-client/services/api/common'
464
+ import { getMicroData, getWindow, isMicroAppEnv, microDispatch } from '@vue2-client/utils/microAppUtils'
465
+
466
+ export default {
467
+ name: 'XReportTrGroup',
468
+ components: {
469
+ Upload,
470
+ XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'),
471
+ XAddNativeForm: () => import('@vue2-client/base-client/components/common/XAddNativeForm/XAddNativeForm.vue'),
472
+ XFormGroup: () => import('@vue2-client/base-client/components/common/XFormGroup/XFormGroup.vue'),
473
+ XTreePro: () => import('@vue2-client/base-client/components/common/XTree/XTreePro.vue'),
474
+ XHisEditor: () => import('@vue2-client/base-client/components/his/XHisEditor/XHisEditor.vue'),
475
+ XTab: () => import('@vue2-client/base-client/components/common/XTab/XTab.vue'),
476
+ XReport: () => import('@vue2-client/base-client/components/common/XReport/XReport.vue'),
477
+ XButtons: () => import('@vue2-client/base-client/components/common/XButtons/XButtons.vue'),
478
+ XLabelSelect: () => import('@vue2-client/base-client/components/common/XLabelSelect/XLabelSelect.vue'),
479
+ XConversation: () => import('@vue2-client/base-client/components/common/XConversation/XConversation.vue'),
480
+ XCheckList: () => import('@vue2-client/base-client/components/common/XCheckList/XCheckList.vue'),
481
+ },
482
+ props: {
483
+ // 每一行的配置
484
+ columns: {
485
+ type: Array,
486
+ required: true
487
+ },
488
+ showImgInCell: {
489
+ type: Boolean,
490
+ default: false
491
+ },
492
+ config: {
493
+ type: Object,
494
+ default: function () {
495
+ return {}
496
+ }
497
+ },
498
+ // 命名空间
499
+ serverName: {
500
+ type: String,
501
+ default: 'af-system'
502
+ },
503
+ // 环境
504
+ env: {
505
+ type: String,
506
+ default: 'prod'
507
+ },
508
+ // 原始配置
509
+ configData: {
510
+ type: Object,
511
+ required: true
512
+ },
513
+ // 是否为动态行
514
+ inputColumns: {
515
+ type: Boolean,
516
+ default: false
517
+ },
518
+ // 是否为动态行按钮
519
+ inputColumnsButton: {
520
+ type: Boolean,
521
+ default: false
522
+ },
523
+ // 动态行的Index
524
+ inputColumnsDefinitionIndex: {
525
+ type: Number,
526
+ default: undefined
527
+ },
528
+ // 是否为展示行
529
+ display: {
530
+ type: Boolean,
531
+ default: false
532
+ },
533
+ // list类型的下标,用于遍历列表时,获取对应的数据
534
+ listIndex: {
535
+ type: Number,
536
+ default: undefined
537
+ },
538
+ // 表格没有上边框
539
+ noTopBorder: {
540
+ type: Boolean,
541
+ default: false
542
+ },
543
+ // 图片是否使用OSS来保存
544
+ useOssForImg: {
545
+ type: Boolean,
546
+ default: true
547
+ },
548
+ // 图片上传后添加前缀
549
+ imgPrefix: {
550
+ type: String,
551
+ default: undefined
552
+ }
553
+ },
554
+ computed: {
555
+ allSlotSum () {
556
+ // 计算总共有多少个Slot
557
+ let sum = 0
558
+ this.columns.forEach((item) => {
559
+ console.log('item', item)
560
+ if (Array.isArray(item)) {
561
+ item.forEach((cell) => {
562
+ if (cell.type === 'slot') {
563
+ sum++
564
+ }
565
+ })
566
+ } else if (item.type && item.type === 'slot') {
567
+ sum++
568
+ }
569
+ })
570
+ console.log(`=总共有 ${sum} 个插槽栅格`)
571
+ return sum
572
+ }
573
+ },
574
+ data () {
575
+ return {
576
+ gutter: [8, { xs: 8, sm: 16, md: 24, lg: 32 }], // 设置水槽大小
577
+ maxColSpan: 12,
578
+ uploadParams: {
579
+ type: 'image',
580
+ accept: ['*'],
581
+ resUploadStock: 1,
582
+ pathKey: 'cs'
583
+ },
584
+ mixinData: {},
585
+ flexItemBodyState: {},
586
+ // 已经渲染得插槽得数量
587
+ slotRendered: 0,
588
+ // tableConfig: {}
589
+ }
590
+ },
591
+ inject: ['openDialog', 'emitEvent', 'registerComponent', 'getComponentByName', 'runLogic', 'getMixinData', 'getSelectedId', 'isInAModal', 'getConfigByName', 'getSelectedData', 'getOutEnv', 'currUser', 'isWidget'],
592
+ methods: {
593
+ getWindow,
594
+ isMicroAppEnv,
595
+ microDispatch,
596
+ getMicroData,
597
+ getRealKeyData,
598
+ onComponentMounted (h, cell, cellIndex) {
599
+ this.slotRendered += 1
600
+ if (this.slotRendered >= this.allSlotSum) {
601
+ this.$emit('slotRendered')
602
+ }
603
+ if (this.getMixinData && this.getMixinData()) {
604
+ this.mixinData = this.getMixinData()
605
+ }
606
+ if (cell.slotRef) {
607
+ this.registerComponent(cell.slotRef, this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0])
608
+ }
609
+ // 传递给祖先组件
610
+ console.log(`插槽组件已经初始化 slotType ${cell.slotType},ref= dynamicComponent_${cell.slotRef || cellIndex} , serviceName = ${cell.serviceName}`)
611
+ const shouldInit = cell.shouldInit == null ? true : cell.shouldInit
612
+ if (shouldInit) {
613
+ if (cell.slotType === 'x-add-native-form') {
614
+ // 简易表单需要主动调用初始化方法
615
+ getConfigByName(cell.slotConfig, cell.serviceName, async (res) => {
616
+ // 如果配置了 表单初始化logic
617
+ // 调用 logic 获取参数
618
+ let param = { ...this.mixinData }
619
+ let selectedId
620
+ if (res.paramLogicName) {
621
+ if (!!this.getSelectedId) {
622
+ selectedId = this.getSelectedId()
623
+ if (typeof selectedId !== 'object') {
624
+ selectedId = { selectedId: selectedId }
625
+ }
626
+ }
627
+ param = Object.assign(param, await runLogic(res.paramLogicName, selectedId, cell.serviceName))
628
+ }
629
+ console.info('给表单赋值', res)
630
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
631
+ serviceName: cell.serviceName,
632
+ configName: cell.slotConfig,
633
+ formItems: res.formJson,
634
+ showSubmitBtn: !this.isInAModal,
635
+ businessType: param.businessType || '新增',
636
+ layout: res.xAddFormLayout,
637
+ primaryKey: res.primaryKey,
638
+ ...res,
639
+ fixedAddForm: param,
640
+ modifyModelData: {
641
+ files: param.files,
642
+ images: param.images
643
+ }
644
+ })
645
+ }, this.env === 'dev')
646
+ } else if (cell.slotType === 'x-form-group') {
647
+ // 简易表单需要主动调用初始化方法
648
+ getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
649
+ // 如果配置了 表单初始化logic
650
+ // 调用 logic 获取参数
651
+ const param = { ...this.mixinData }
652
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
653
+ ...res,
654
+ serviceName: cell.serviceName,
655
+ showSubmitBtn: !this.isInAModal,
656
+ businessType: param.businessType || '新增',
657
+ modifyModelData: param,
658
+ showLeftTab: true,
659
+ })
660
+ }, this.env === 'dev')
661
+ } else if (cell.slotType === 'x-buttons') {
662
+ // 按钮组需要主动调用初始化方法
663
+ getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
664
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
665
+ ...res,
666
+ serviceName: cell.serviceName,
667
+ })
668
+ }, this.env === 'dev')
669
+ } else if (cell.slotType === 'x-label-select') {
670
+ // 按钮组需要主动调用初始化方法
671
+ getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
672
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
673
+ ...res,
674
+ serviceName: cell.serviceName,
675
+ })
676
+ }, this.env === 'dev')
677
+ }
678
+ }
679
+ if (cell.slotType === 'x-report') {
680
+ const param = { ...this.mixinData }
681
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init(param)
682
+ }
683
+ if (cell.slotType === 'x-conversation') {
684
+ getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
685
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
686
+ serviceName: cell.serviceName,
687
+ ...res,
688
+ })
689
+ }, this.env === 'dev')
690
+ }
691
+ if (cell.slotType === 'x-check-list') {
692
+ getConfigByName(cell.slotConfig, cell.serviceName, (res) => {
693
+ this.$refs[`dynamicComponent_${cell.slotRef || cellIndex}`][0].init({
694
+ serviceName: cell.serviceName,
695
+ ...res,
696
+ })
697
+ }, this.env === 'dev')
698
+ }
699
+ },
700
+
701
+ // 对于嵌套情况,对colSpan重新分配
702
+ recalculateItem (item) {
703
+ const totalColSpan = item.reduce((sum, cell) => sum + (cell.colSpan || 1), 0) // 计算总的 colSpan
704
+ return item.map(cell => {
705
+ const newColSpan = Math.round((cell.colSpan || 1) / totalColSpan * 12) // 按比例重新分配 colSpan
706
+ return {
707
+ ...cell,
708
+ colSpan: newColSpan // 更新 colSpan
709
+ }
710
+ })
711
+ },
712
+
713
+ getEventHandlers (cell) {
714
+ const handlers = {}
715
+ if (!cell?.events || cell?.events?.length === 0) {
716
+ return handlers
717
+ }
718
+ cell.events.forEach(event => {
719
+ handlers[event.type] = async (...args) => {
720
+ console.info('Event handled:', event.type, args)
721
+ let func = event.customFunction
722
+ if (func && func.startsWith('function')) {
723
+ func = func.replace('function', 'async function')
724
+ }
725
+ const result = await executeStrFunctionByContext(this, func, args)
726
+ if (result instanceof Promise) {
727
+ result.then((res) => {
728
+ if (!res) return
729
+ let messageType = 'success'
730
+ // 如果传递了组件名字 自动调用刷新
731
+ if (res?.name) {
732
+ const waitRefreshRef = this.getComponentByName(res.name)
733
+ if (waitRefreshRef) {
734
+ waitRefreshRef.refresh()
735
+ } else {
736
+ console.warn(`未找到组件${res.name}无法刷新`)
737
+ }
738
+ }
739
+ // 如果传递消息类型 自动调用消息
740
+ if (res?.messageType) {
741
+ messageType = res.messageType
742
+ }
743
+ // 如果传递了提示信息自动调用提示
744
+ if (res?.message) {
745
+ this.$message[messageType](res?.message)
746
+ }
747
+ })
748
+ }
749
+ }
750
+ })
751
+ return handlers
752
+ },
753
+ getComponentName (queryParamsName, serviceName, componentName) {
754
+ // const config = await getConfigByName(queryParamsName, serviceName)
755
+ // const componentName = config.$globalProp.type
756
+ return componentName
757
+ },
758
+ updateImg (data) {
759
+ this.$emit('updateImg', data)
760
+ },
761
+ formatImgStr (str) {
762
+ const result = []
763
+ if (str !== '') {
764
+ const arr = str.split('/')
765
+ result.push({
766
+ uid: nanoid(6),
767
+ url: str,
768
+ name: arr[arr.length - 1],
769
+ status: 'done'
770
+ })
771
+ }
772
+ this.uploadParams.acceptCount = 1
773
+ return result
774
+ },
775
+ checkImg (index, type) {
776
+ let target
777
+ if (type === 'configData') {
778
+ target = this.configData.images[index]
779
+ } else {
780
+ target = this.config.tempData[index]
781
+ }
782
+ if (typeof target !== 'object') {
783
+ return this.formatImgStr(target)
784
+ }
785
+ target.forEach(obj => {
786
+ if (obj.uid === undefined) {
787
+ obj.uid = obj.id.toString()
788
+ }
789
+ if (obj.url === undefined) {
790
+ if (obj.path) {
791
+ obj.url = obj.path
792
+ }
793
+ }
794
+ if (obj.name === undefined) {
795
+ const withOutEndFix = obj.url.split('.')[0]
796
+ const temp = withOutEndFix.split('/')
797
+ obj.name = temp[temp.length - 1]
798
+ }
799
+ if (obj.status === undefined) {
800
+ obj.status = 'done'
801
+ }
802
+ })
803
+ return target
804
+ },
805
+ // 判断单元格样式
806
+ determineCellStyle (cell, color = '#000', borderWidth = '1px') {
807
+ // 如果声明了borderColor
808
+ if (this.config.style.borderColor) {
809
+ color = this.config.style.borderColor
810
+ }
811
+ let result = {}
812
+ // 如果表格也声明了样式,用表格样式将样式覆盖
813
+ if (cell.style) {
814
+ if (cell.noBorder) {
815
+ result = { ...cell.style }
816
+ } else {
817
+ if (this.noTopBorder) {
818
+ result = { ...cell.style }
819
+ } else {
820
+ result = { ...cell.style }
821
+ }
822
+ }
823
+ return result
824
+ }
825
+ return result
826
+ },
827
+
828
+ // 表格中数据key含有@@@,需要手动触发更新
829
+ handleInputDeepChange () {
830
+ this.$forceUpdate()
831
+ },
832
+ // 路径中含有@@@的key,将其解析,并返回其数据
833
+ getDeepObject (obj, strPath) {
834
+ if (!strPath) {
835
+ return ''
836
+ }
837
+ const arr = strPath.split('@@@')
838
+ let result = obj[arr[0]]
839
+ arr.shift()
840
+ try {
841
+ while (arr.length > 0) {
842
+ result = result[arr[0]]
843
+ arr.shift()
844
+ }
845
+ } catch (e) {
846
+ result = undefined
847
+ }
848
+ return result
849
+ },
850
+ // 获取当前日期
851
+ getNowDate (index1, index2) {
852
+ if (index2) {
853
+ // @click="getNowDate(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
854
+ this.configData.arr[index1][index2] = formatDate('now')
855
+ } else {
856
+ this.configData[index1] = formatDate('now')
857
+ }
858
+ this.configData = Object.assign({}, this.configData)
859
+ },
860
+ // 反序列化函数并执行
861
+ deserializeFunctionAndRun (functionStr, value) {
862
+ // eslint-disable-next-line no-eval
863
+ const fun = eval('(' + functionStr + ')')
864
+ return fun(value, this.config)
865
+ },
866
+ // 基础上传组件,图片改动后触发
867
+ setImages (args, type, index = undefined) {
868
+ // 如果基础上传组件在初始化完成后,就调用emit了setImage,此时图片并没有变化,直接返回
869
+ if (args[2] === 'created') {
870
+ return
871
+ }
872
+ if (type === 'configData') {
873
+ this.configData.images[args[1]] = args[0]
874
+ } else {
875
+ this.config.tempData[args[1]] = args[0]
876
+ if (index) {
877
+ this.$emit('updateImg', this.config.tempData[index])
878
+ }
879
+ }
880
+ },
881
+ // 动态行删除
882
+ removeData (index) {
883
+ if (this.configData[index].length === 0) {
884
+ this.$message.warn('已经没有更多了')
885
+ return
886
+ }
887
+ this.configData[index].pop()
888
+ },
889
+ // 添加一行
890
+ addData (index, row) {
891
+ // 获取定义
892
+ const defs = row[0].definition
893
+
894
+ // 获取外层对象名
895
+ const dataName = row[0].dataIndex
896
+ const temp = {}
897
+
898
+ defs.forEach(def => {
899
+ // 找到数组中最后一个数据的值
900
+ let lastDataNo = 0
901
+ if (this.configData[dataName][this.configData[dataName].length - 1]) {
902
+ lastDataNo = this.configData[dataName][this.configData[dataName].length - 1][def.dataIndex]
903
+ }
904
+
905
+ // 如果没有值,检查是否声明了初始值
906
+ if (lastDataNo === 0 && def.initialValue) {
907
+ lastDataNo = def.initialValue
908
+ }
909
+
910
+ // 检查是否有步长
911
+ let step = 1
912
+ if (def.step) {
913
+ step = def.step
914
+ }
915
+
916
+ // 如果单元格类型为increment,则进行自增
917
+ if (def.type === 'increment') {
918
+ temp[def.dataIndex] = lastDataNo + step
919
+ }
920
+ })
921
+ this.configData[index].push(temp)
922
+ },
923
+ // 根据format计算需要多少个输入框
924
+ calcFormatInputNum (formatStr) {
925
+ let count = 0
926
+ for (let i = 0; i < formatStr.length; i++) {
927
+ if (formatStr[i] === '{') {
928
+ count++
929
+ }
930
+ }
931
+ return count
932
+ },
933
+ // 根据format计算输入框之后的文字显示
934
+ displayFormatText (formatStr, num) {
935
+ let start = 0
936
+ let count = 0
937
+ num++
938
+ for (let i = 0; i < formatStr.length; i++) {
939
+ if (formatStr[i] === '}') {
940
+ start = i
941
+ count++
942
+ }
943
+ if (count === num) {
944
+ for (let j = start + 1; j < formatStr.length; j++) {
945
+ if (formatStr[j] === '{') {
946
+ return formatStr.slice(start + 1, j)
947
+ }
948
+ if (j === formatStr.length - 1 && formatStr[j] !== '}') {
949
+ return formatStr[j]
950
+ }
951
+ }
952
+ }
953
+ }
954
+ },
955
+ calcTDBorder (cellNoBorder = false) {
956
+ if (cellNoBorder) {
957
+ return 'tdNoBorder'
958
+ } else {
959
+ if (this.noTopBorder) {
960
+ return 'tdWithNoTopBorder'
961
+ } else {
962
+ return 'tdWithBorder'
963
+ }
964
+ }
965
+ },
966
+ // 根据format计算输入框之前的文字显示
967
+ displayFormatStartText (formatStr) {
968
+ let count = 0
969
+ for (let i = 0; i < formatStr.length; i++) {
970
+ if (formatStr[i] === '{') {
971
+ break
972
+ } else {
973
+ count++
974
+ }
975
+ }
976
+ return formatStr.slice(0, count)
977
+ },
978
+ // 拼接被自动拆分的单元格内容
979
+ showSubRowValue (cell) {
980
+ const dataName = cell.dataIndex
981
+ const formatArr = []
982
+ const dataArr = []
983
+
984
+ // 从config中取出所有数据,根据dataIndex的开头内容进行拼接
985
+ this.config.columns.forEach(row => row.forEach(cell => {
986
+ if (cell.dataIndex && cell.dataIndex.startsWith(dataName)) {
987
+ formatArr.push(cell.format)
988
+ dataArr.push(this.configData[cell.dataIndex])
989
+ }
990
+ }))
991
+
992
+ const text = []
993
+ const data = []
994
+
995
+ formatArr.forEach(word => {
996
+ const temp = word.split('{}')
997
+ temp.forEach(char => {
998
+ if (char !== '') {
999
+ text.push(char)
1000
+ }
1001
+ })
1002
+ })
1003
+
1004
+ dataArr.forEach(item => {
1005
+ item.forEach(num => {
1006
+ data.push(num)
1007
+ })
1008
+ })
1009
+
1010
+ let result = ''
1011
+ for (let i = 0; i < data.length; i++) {
1012
+ result += data[i]
1013
+ result += text[i]
1014
+ }
1015
+
1016
+ return result
1017
+ },
1018
+ // 把用户定义的组件,传递到整个杉格中,方便调用
1019
+ passComponentNamesToAncestor (refs) {
1020
+ console.log('组件的keys', Object.entries(refs), refs)
1021
+ // 遍历所有 refs
1022
+ Object.entries(refs).forEach(([refKey, refValue]) => {
1023
+ // 检查 ref 是否以 dynamicComponent_ 开头
1024
+ if (refKey.startsWith('dynamicComponent_')) {
1025
+ console.log('组件名存在')
1026
+ const componentRef = refValue[0]
1027
+ if (componentRef) {
1028
+ // 去掉前缀并获取组件名字
1029
+ const index = refKey.replace('dynamicComponent_', '') // 去掉前缀
1030
+ console.log('注册组件', index)
1031
+ // 传递给祖先组件
1032
+ this.registerComponent(index, componentRef)
1033
+ }
1034
+ }
1035
+ })
1036
+ }
1037
+ },
1038
+ beforeMount () {
1039
+ if (this.useOssForImg) {
1040
+ this.uploadParams.resUploadMode = 'oss'
1041
+ }
1042
+ },
1043
+ mounted () {
1044
+ },
1045
+ }
1046
+
1047
+ </script>
1048
+
1049
+ <style scoped lang="less">
1050
+ .inputsDiv {
1051
+ display: flex;
1052
+ justify-content: space-between;
1053
+
1054
+ .inputsDivItem {
1055
+ display: flex;
1056
+ align-items: center;
1057
+ padding: 0 4px;
1058
+ white-space: nowrap;
1059
+
1060
+ .inputsDivItemLabel {
1061
+ padding: 0 4px;
1062
+ }
1063
+ }
1064
+ }
1065
+
1066
+ .tdNoBorder {
1067
+ border-left: 1px solid #000;
1068
+ border-right: 1px solid #000;
1069
+ padding: 8px;
1070
+ }
1071
+
1072
+ .tdWithBorder {
1073
+ border: 1px solid #000;
1074
+ padding: 8px;
1075
+ }
1076
+
1077
+ .tdWithNoTopBorder {
1078
+ border-top-style: none;
1079
+ border-left: 1px solid #000;
1080
+ border-right: 1px solid #000;
1081
+ border-bottom: 1px solid #000;
1082
+ padding: 8px;
1083
+ }
1084
+
1085
+ .grid-content {
1086
+ border-radius: 4px;
1087
+ min-height: 36px;
1088
+ text-align: center;
1089
+ color: #fff;
1090
+ background-color: #606266;
1091
+ }
1092
+
1093
+ .bg-purple {
1094
+ background: #9254de;
1095
+ }
1096
+
1097
+ .bg-purple-light {
1098
+ background: #b37feb;
1099
+ }
1100
+ .flexItem {
1101
+ border-radius: 8px;
1102
+ height: 100%;
1103
+ }
1104
+ </style>