vue2-client 1.9.78 → 1.9.79

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 (337) hide show
  1. package/.env +19 -19
  2. package/.env.gaslink +19 -19
  3. package/.env.his +19 -19
  4. package/.env.revenue +19 -19
  5. package/.eslintrc.js +90 -90
  6. package/CHANGELOG.md +824 -824
  7. package/Components.md +60 -60
  8. package/babel.config.js +21 -21
  9. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +45 -45
  10. package/docs/LowCode/lowcode.md +155 -155
  11. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  12. package/docs/index.md +30 -30
  13. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +143 -143
  14. package/index.js +31 -31
  15. package/jest-transform-stub.js +8 -8
  16. package/jest.config.js +21 -21
  17. package/jest.setup.js +7 -7
  18. package/package.json +1 -1
  19. package/public/his/editor/editor.html +51 -51
  20. package/public/his/editor/mock/bind_data.html +779 -779
  21. package/public/his/editor/mock/data_table.html +40 -40
  22. package/public/his/editor/mock/sign.html +75 -75
  23. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  24. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  25. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  26. package/public/his/editor/vender/date97/calendar.js +4 -4
  27. package/public/his/editor/vender/date97/lang/en.js +13 -13
  28. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  29. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  30. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  31. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  32. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  33. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  34. package/public/his/editor/vender/diff.js +1627 -1627
  35. package/public/his/editor/vender/editor.js +1 -1
  36. package/public/his/editor/vender/fabric.js +31187 -31187
  37. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  38. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  39. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  40. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  41. package/public/his/editor/vender/mui/mui.min.css +4 -4
  42. package/public/his/editor/vender/mui/mui.min.js +5 -5
  43. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  44. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  45. package/public/his/editor/vender/qrcode.js +7 -7
  46. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  47. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  48. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  49. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  50. package/public/his/editor/vender/validator.js +5094 -5094
  51. package/public/his/editor/vender/weui/weui.css +5659 -5659
  52. package/public/his/editor/vender/weui/weui.min.css +4 -4
  53. package/public/his/editor/vender/weui/weui.min.js +11 -11
  54. package/public/index.html +27 -27
  55. package/src/App.vue +192 -192
  56. package/src/ReportView.js +19 -19
  57. package/src/assets/img/querySlotDemo.svg +15 -15
  58. package/src/assets/svg/badtwo.svg +1 -1
  59. package/src/assets/svg/goodtwo.svg +1 -1
  60. package/src/base-client/components/common/AMisRender/index.js +3 -3
  61. package/src/base-client/components/common/AMisRender/index.vue +263 -263
  62. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +470 -470
  63. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  64. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  65. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  66. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  67. package/src/base-client/components/common/CitySelect/CitySelect.vue +342 -342
  68. package/src/base-client/components/common/CitySelect/index.js +3 -3
  69. package/src/base-client/components/common/CitySelect/index.md +109 -109
  70. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  71. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  72. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  73. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  74. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  75. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  76. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  77. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  78. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  79. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  80. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  81. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  82. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  83. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  84. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  85. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  86. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  87. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  88. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  89. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  90. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  91. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  92. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  93. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  94. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  95. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  96. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  97. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  98. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  99. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  100. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  101. package/src/base-client/components/common/Tree/index.js +2 -2
  102. package/src/base-client/components/common/Upload/Upload.vue +239 -239
  103. package/src/base-client/components/common/Upload/index.js +3 -3
  104. package/src/base-client/components/common/XAddForm/XAddForm.vue +107 -107
  105. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +868 -868
  106. package/src/base-client/components/common/XAddNativeForm/demo.vue +30 -30
  107. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  108. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  109. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  110. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  111. package/src/base-client/components/common/XAddReport/XAddReport.vue +207 -207
  112. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  113. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  114. package/src/base-client/components/common/XButtons/XButtons.vue +71 -71
  115. package/src/base-client/components/common/XButtons/index.js +3 -3
  116. package/src/base-client/components/common/XButtons/index.md +61 -61
  117. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  118. package/src/base-client/components/common/XConversation/XConversation.vue +140 -140
  119. package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
  120. package/src/base-client/components/common/XDataCard/XDataCard.vue +420 -420
  121. package/src/base-client/components/common/XDataCard/index.js +3 -3
  122. package/src/base-client/components/common/XDataCard/index.md +1 -1
  123. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  124. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  125. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  126. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +169 -169
  127. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +304 -304
  128. package/src/base-client/components/common/XDescriptions/demo.vue +50 -50
  129. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  130. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  131. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  132. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  133. package/src/base-client/components/common/XForm/XForm.vue +340 -340
  134. package/src/base-client/components/common/XForm/XFormItem.vue +4 -3
  135. package/src/base-client/components/common/XForm/XTreeSelect.vue +250 -250
  136. package/src/base-client/components/common/XForm/index.md +178 -178
  137. package/src/base-client/components/common/XFormCol/XFormCol.vue +96 -96
  138. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +261 -261
  139. package/src/base-client/components/common/XFormGroup/demo.vue +45 -45
  140. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  141. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  142. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  143. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  144. package/src/base-client/components/common/XFormTable/XFormTable.vue +713 -713
  145. package/src/base-client/components/common/XFormTable/demo.vue +76 -76
  146. package/src/base-client/components/common/XFormTable/index.md +92 -92
  147. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +162 -162
  148. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  149. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  150. package/src/base-client/components/common/XReport/XReport.vue +892 -892
  151. package/src/base-client/components/common/XReport/XReportDemo.vue +304 -304
  152. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  153. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  154. package/src/base-client/components/common/XReport/XReportTrGroup.vue +808 -808
  155. package/src/base-client/components/common/XReport/index.js +3 -3
  156. package/src/base-client/components/common/XReport/index.md +44 -44
  157. package/src/base-client/components/common/XReport/print.js +186 -186
  158. package/src/base-client/components/common/XReportDrawer/XReportDrawer.vue +201 -201
  159. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  160. package/src/base-client/components/common/XReportGrid/XReport.vue +995 -959
  161. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +42 -42
  162. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +557 -557
  163. package/src/base-client/components/common/XReportGrid/XReportJsonRender.vue +380 -380
  164. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +999 -999
  165. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  166. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  167. package/src/base-client/components/common/XReportGrid/print.js +184 -184
  168. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  169. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  170. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  171. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  172. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  173. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  174. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  175. package/src/base-client/components/common/XStepView/index.js +3 -3
  176. package/src/base-client/components/common/XStepView/index.md +31 -31
  177. package/src/base-client/components/common/XTab/XTab.vue +201 -201
  178. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  179. package/src/base-client/components/common/XTab/index.js +3 -3
  180. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  181. package/src/base-client/components/common/XTable/XTable.vue +1191 -1191
  182. package/src/base-client/components/common/XTable/index.md +255 -255
  183. package/src/base-client/components/common/XTree/XTree.vue +423 -423
  184. package/src/base-client/components/common/XTree/XTreePro.vue +434 -434
  185. package/src/base-client/components/common/XTree/index.js +3 -3
  186. package/src/base-client/components/common/XTree/index.md +36 -36
  187. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  188. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  189. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  190. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  191. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +203 -203
  192. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  193. package/src/base-client/components/index.js +51 -51
  194. package/src/base-client/components/layout/XPageView/RenderRow.vue +63 -63
  195. package/src/base-client/components/layout/XPageView/XErrorView.vue +11 -11
  196. package/src/base-client/components/layout/XPageView/XPageView.vue +155 -155
  197. package/src/base-client/components/layout/XPageView/index.js +3 -3
  198. package/src/base-client/components/layout/XPageView/index.md +38 -38
  199. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  200. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  201. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  202. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  203. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  204. package/src/base-client/plugins/AppData.js +121 -121
  205. package/src/base-client/plugins/Config.js +19 -19
  206. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  207. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  208. package/src/bootstrap.js +39 -39
  209. package/src/components/CodeMirror/inedx.vue +118 -118
  210. package/src/components/CodeMirror/setting.js +40 -40
  211. package/src/components/FilePreview/FilePreview.vue +166 -166
  212. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  213. package/src/components/STable/index.js +380 -380
  214. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  215. package/src/components/checkbox/ImgCheckbox.vue +163 -163
  216. package/src/components/exception/ExceptionPage.vue +70 -70
  217. package/src/components/menu/SideMenu.vue +75 -75
  218. package/src/components/menu/menu.js +273 -273
  219. package/src/components/tool/AStepItem.vue +60 -60
  220. package/src/config/default/antd.config.js +89 -89
  221. package/src/config/default/setting.config.js +55 -55
  222. package/src/font-style/font.css +4 -4
  223. package/src/layouts/CommonLayout.vue +56 -56
  224. package/src/layouts/GridView.vue +45 -45
  225. package/src/layouts/PageLayout.vue +151 -151
  226. package/src/layouts/SinglePageView.vue +136 -136
  227. package/src/layouts/header/AdminHeader.vue +132 -132
  228. package/src/layouts/header/HeaderNotice.vue +177 -177
  229. package/src/layouts/tabs/TabsHead.vue +189 -189
  230. package/src/layouts/tabs/TabsView.vue +389 -389
  231. package/src/lib.js +1 -1
  232. package/src/main.js +30 -30
  233. package/src/mock/extend/index.js +84 -84
  234. package/src/mock/goods/index.js +108 -108
  235. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  236. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  237. package/src/pages/DefaultExample/index.vue +77 -77
  238. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  239. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  240. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  241. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  242. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  243. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  244. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  245. package/src/pages/DynamicStatistics/index.vue +282 -282
  246. package/src/pages/Example/childIndex.vue +15 -15
  247. package/src/pages/Example/index.vue +30 -30
  248. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  249. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  250. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  251. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  252. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  253. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  254. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  255. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  256. package/src/pages/Recording/index.vue +76 -0
  257. package/src/pages/ReportGrid/index.vue +76 -76
  258. package/src/pages/ServiceReview/index.vue +284 -284
  259. package/src/pages/SubExample/index.vue +26 -26
  260. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +32 -32
  261. package/src/pages/WorkflowDetail/WorkflowDetail.vue +230 -230
  262. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +131 -131
  263. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  264. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +302 -302
  265. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformationDetails.vue +276 -276
  266. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +864 -864
  267. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +997 -997
  268. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +222 -222
  269. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +233 -233
  270. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +261 -261
  271. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowListResolution.vue +248 -248
  272. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +73 -73
  273. package/src/pages/XPageViewExample/index.vue +38 -38
  274. package/src/pages/XReportView/index.vue +64 -64
  275. package/src/pages/XTreeOneProExample/index.vue +67 -67
  276. package/src/pages/login/Login.vue +378 -378
  277. package/src/pages/login/LoginV3.vue +389 -389
  278. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  279. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  280. package/src/pages/resourceManage/orgListManage.vue +98 -98
  281. package/src/pages/system/dictionary/index.vue +44 -44
  282. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  283. package/src/pages/system/monitor/operLog/index.vue +37 -37
  284. package/src/pages/system/settings/modifyPassword.vue +117 -117
  285. package/src/pages/system/ticket/index.vue +480 -480
  286. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  287. package/src/plugins/EventLogPlugin.js +33 -33
  288. package/src/plugins/FindParentsData.js +17 -17
  289. package/src/router/async/config.async.js +1 -0
  290. package/src/router/async/router.map.js +183 -183
  291. package/src/router/guards.js +263 -263
  292. package/src/router/index.js +27 -27
  293. package/src/router.js +19 -19
  294. package/src/services/api/TicketDetailsViewApi.js +46 -46
  295. package/src/services/api/cas.js +79 -79
  296. package/src/services/api/common.js +329 -329
  297. package/src/services/api/entity.js +18 -18
  298. package/src/services/api/index.js +17 -17
  299. package/src/services/api/restTools.js +67 -67
  300. package/src/services/api/workFlow.js +63 -63
  301. package/src/services/apiService.js +15 -15
  302. package/src/services/user.js +90 -90
  303. package/src/services/v3Api.js +116 -116
  304. package/src/store/modules/account.js +115 -115
  305. package/src/store/modules/index.js +5 -5
  306. package/src/store/modules/lowCode.js +33 -33
  307. package/src/store/modules/setting.js +119 -119
  308. package/src/theme/default/style.less +58 -58
  309. package/src/theme/global.less +159 -159
  310. package/src/utils/authority-utils.js +85 -85
  311. package/src/utils/errorCode.js +6 -6
  312. package/src/utils/formatter.js +74 -74
  313. package/src/utils/htmlToPDF.js +108 -108
  314. package/src/utils/htmlToPDFApi.js +5 -5
  315. package/src/utils/indexedDB.js +263 -263
  316. package/src/utils/login.js +188 -188
  317. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  318. package/src/utils/lowcode/lowcodeLog.js +29 -29
  319. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  320. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  321. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  322. package/src/utils/map-utils.js +47 -47
  323. package/src/utils/microAppUtils.js +40 -40
  324. package/src/utils/reg.js +95 -95
  325. package/src/utils/request.js +362 -362
  326. package/src/utils/routerUtil.js +450 -450
  327. package/src/utils/runEvalFunction.js +14 -14
  328. package/src/utils/util.js +313 -313
  329. package/src/utils/waterMark.js +31 -31
  330. package/test/Amis.spec.js +163 -163
  331. package/test/Tree.spec.js +167 -167
  332. package/test/myDialog.spec.js +46 -46
  333. package/test/util.test.js +36 -36
  334. package/test/v3Api.test.js +1983 -1983
  335. package/vue.config.js +199 -199
  336. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
  337. /package/src/base-client/components/common/Recording/{Recoding.vue → Recording.vue} +0 -0
@@ -1,808 +1,808 @@
1
- <template>
2
- <tr>
3
- <!-- 预览页展示 -->
4
- <template v-if="display">
5
- <template v-if="!inputColumns">
6
- <td
7
- v-for="(cell, cellIndex) in columns"
8
- v-if="!cell.dontShowRow"
9
- :key="cellIndex"
10
- :class=" calcTDBorder(cell.noBoarder) "
11
- :style="determineCellStyle(cell)"
12
- :colspan="cell.colSpan ? cell.colSpan : undefined">
13
- <template v-if="cell.type === 'column'">
14
- <template v-if="cell.customFunction">
15
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
16
- </template>
17
- <template v-else>
18
- {{ cell.text }}
19
- </template>
20
- </template>
21
- <!-- 占位 -->
22
- <template v-else-if="cell.type === 'placeHolderColumn'">
23
- </template>
24
- <template v-else-if="cell.type === 'value'">
25
- <template v-if="cell.customFunction === undefined">
26
- {{ cell.value }}
27
- </template>
28
- <template v-else>
29
- {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
30
- </template>
31
- </template>
32
- <template v-else-if="cell.type === 'input'">
33
- <template v-if="cell.customFunction === undefined">
34
- {{ getDeepObject(configData, cell.dataIndex) }}
35
- </template>
36
- <template v-else>
37
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
38
- </template>
39
- </template>
40
- <template v-else-if="cell.type === 'inputs'">
41
- <template v-if="cell.customFunction === undefined">
42
- {{ showSubRowValue(cell) }}
43
- </template>
44
- <template v-else>
45
- {{ deserializeFunctionAndRun(cell.customFunction, showSubRowValue(cell), config) }}
46
- </template>
47
- </template>
48
- <template v-else-if="cell.type === 'list'">
49
- <template v-if="listIndex === 0">
50
- <span style="font-weight: bold">{{ cell.listHead }}</span>
51
- </template>
52
- <template v-else-if="cell.listType === 'input'">
53
- {{ getDeepObject(configData, cell.dataIndex)[listIndex] }}
54
- </template>
55
- <template v-else-if="cell.listType === 'value'">
56
- {{ cell.content[listIndex] }}
57
- </template>
58
- <template v-else-if="cell.listType === 'variable'">
59
- {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
60
- </template>
61
- </template>
62
- <template v-else-if="cell.type === 'images'">
63
- <template v-if="getDeepObject(configData.images, cell.dataIndex) === undefined || getDeepObject(configData.images, cell.dataIndex).length === 0">
64
- <template v-if="getDeepObject(configData, cell.dataIndex) === undefined || getDeepObject(configData, cell.dataIndex).length === 0">
65
- <span>无</span>
66
- </template>
67
- <template v-else>
68
- <template v-if="typeof getDeepObject(configData, cell.dataIndex) === 'object'">
69
- <div style="display: flex; align-items: end; justify-content: space-evenly; flex-wrap: wrap">
70
- <template v-for="(img,imgIndex) in getDeepObject(configData, cell.dataIndex)">
71
- <template v-if="showImgInCell">
72
- <div :key="imgIndex">
73
- <img :src="img.url" alt="图片"/>
74
- <p>{{ img.name }}</p>
75
- </div>
76
- </template>
77
- <template v-else>
78
- <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
79
- </template>
80
- </template>
81
- </div>
82
- </template>
83
- <template v-else>
84
- <img :src="getDeepObject(configData, cell.dataIndex)" alt="图片"/>
85
- <p style="margin-right: 5%">{{ formatImgStr(getDeepObject(configData, cell.dataIndex))[0].name }}</p>
86
- </template>
87
- </template>
88
- </template>
89
- <template v-else v-for="(img,imgIndex) in getDeepObject(configData.images, cell.dataIndex)">
90
- <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
91
- </template>
92
- </template>
93
- </td>
94
- </template>
95
- <template v-else>
96
- <td
97
- v-for="(cell, cellIndex) in columns"
98
- :key="cellIndex"
99
- :class=" calcTDBorder(cell.noBoarder) "
100
- :colspan="cell.colSpan ? cell.colSpan : undefined"
101
- :style="determineCellStyle(cell)"
102
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
103
- <template v-if="cell.type === 'column'">
104
- {{ cell.text }}
105
- </template>
106
- <template v-else-if="cell.type === 'value'">
107
- <template v-if="cell.customFunction === undefined">
108
- {{ cell.value }}
109
- </template>
110
- <template v-else>
111
- {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
112
- </template>
113
- </template>
114
- <template v-else-if="cell.type === 'increment'">
115
- <template v-if="cell.customFunction === undefined">
116
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
117
- </template>
118
- <template v-else>
119
- {{
120
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
121
- }}
122
- </template>
123
- </template>
124
- <template v-else-if="cell.type === 'input'">
125
- <template v-if="cell.customFunction === undefined">
126
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
127
- </template>
128
- <template v-else>
129
- {{
130
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
131
- }}
132
- </template>
133
- </template>
134
- <template v-else-if="cell.type === 'inputs'">
135
- <template v-if="cell.customFunction === undefined">
136
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
137
- </template>
138
- <template v-else>
139
- {{
140
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
141
- }}
142
- </template>
143
- </template>
144
- </td>
145
- </template>
146
- </template>
147
- <!-- 不是动态行 -->
148
- <template v-else-if="!inputColumns">
149
- <td
150
- v-for="(cell, cellIndex) in columns"
151
- :key="cellIndex"
152
- :class=" calcTDBorder(cell.noBoarder) "
153
- :colspan="cell.colSpan ? cell.colSpan : undefined"
154
- :style="determineCellStyle(cell)"
155
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
156
- <template v-if="cell.type === 'column'">
157
- <template v-if="cell.customFunction">
158
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
159
- </template>
160
- <template v-else>
161
- {{ cell.text }}
162
- </template>
163
- </template>
164
- <template v-else-if="cell.type === 'placeHolderColumn'">
165
- <!-- 占位 -->
166
- </template>
167
- <template v-else-if="cell.type === 'value'">
168
- {{ cell.value }}
169
- </template>
170
- <template v-else-if="cell.type === 'curDateInput'">
171
- <a-button type="dashed" v-if="configData[cell.dataIndex]">
172
- {{ configData[cell.dataIndex] }}
173
- </a-button>
174
- <a-button
175
- v-if="!configData[cell.dataIndex]"
176
- type="primary"
177
- @click="getNowDate(cell.dataIndex)"
178
- >{{ cell.text || '确认' }}
179
- </a-button>
180
- </template>
181
- <template v-else-if="cell.type === 'input'">
182
- <template v-if="cell.inputReadOnly === true">
183
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
184
- <a-input
185
- @change="handleInputDeepChange($event, cell.dataIndex)"
186
- v-model="config.tempData[cell.dataIndex]"
187
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
188
- :disabled="true"/>
189
- </template>
190
- <template v-else>
191
- <a-input
192
- v-model="configData[cell.dataIndex]"
193
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
194
- :disabled="true"/>
195
- </template>
196
- </template>
197
- <template v-else>
198
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
199
- <a-input
200
- @change="handleInputDeepChange($event, cell.dataIndex)"
201
- v-model="config.tempData[cell.dataIndex]"
202
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
203
- </template>
204
- <template v-else>
205
- <a-input
206
- v-model="configData[cell.dataIndex]"
207
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
208
- </template>
209
- </template>
210
- </template>
211
- <template v-else-if="cell.type === 'inputs'">
212
- <template v-if="cell.inputReadOnly === true">
213
- <div class="inputsDiv">
214
- <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
215
- <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
216
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
217
- <a-input
218
- @change="handleInputDeepChange($event, cell.dataIndex)"
219
- v-model="config.tempData[cell.dataIndex][index]"
220
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
221
- :disabled="true"/>
222
- </template>
223
- <template v-else>
224
- <a-input
225
- v-model="configData[cell.dataIndex][index]"
226
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
227
- :disabled="true"/>
228
- </template>
229
- <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
230
- </div>
231
- </div>
232
- </template>
233
- <template v-else>
234
- <div class="inputsDiv">
235
- <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
236
- <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
237
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
238
- <a-input
239
- @change="handleInputDeepChange($event, cell.dataIndex)"
240
- v-model="config.tempData[cell.dataIndex][index]"
241
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
242
- </template>
243
- <template v-else>
244
- <a-input
245
- v-model="configData[cell.dataIndex][index]"
246
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
247
- </template>
248
- <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
249
- </div>
250
- </div>
251
- </template>
252
- </template>
253
- <template v-else-if="cell.type === 'list'">
254
- <template v-if="listIndex === 0">
255
- <span style="font-weight: bold">{{ cell.listHead }}</span>
256
- </template>
257
- <template v-else-if="cell.listType === 'input'">
258
- <a-input
259
- v-model="configData[cell.dataIndex][listIndex]"
260
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
261
- </template>
262
- <template v-else-if="cell.listType === 'value'">
263
- {{ cell.content[listIndex] }}
264
- </template>
265
- <template v-else-if="cell.listType === 'variable'">
266
- {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
267
- </template>
268
- </template>
269
- <template v-else-if="cell.type === 'images'">
270
- <div>
271
- <template v-if="configData.images[cell.dataIndex]?.length > 0">
272
- <upload
273
- :model="uploadParams"
274
- :img-prefix="imgPrefix"
275
- :service-name="serverName"
276
- :images="checkImg(cell.dataIndex, 'configData')"
277
- :outer-container-index="cell.dataIndex"
278
- @setFiles="(...args) => {setImages(args, 'configData')}"
279
- :upload-style="'simple'"
280
- />
281
- </template>
282
- <template v-else>
283
- <upload
284
- :model="uploadParams"
285
- :img-prefix="imgPrefix"
286
- :service-name="serverName"
287
- :images="checkImg(cell.dataIndex, 'config')"
288
- :outer-container-index="cell.dataIndex"
289
- @setFiles="(...args) => {setImages(args, 'config', cell.dataIndex)}"
290
- :upload-style="'simple'"
291
- />
292
- </template>
293
- </div>
294
- </template>
295
- </td>
296
- </template>
297
- <!-- 动态行插入按钮 -->
298
- <template v-else-if="inputColumnsButton">
299
- <td :colspan="maxColSpan" :class="calcTDBorder()">
300
- <a-button-group>
301
- <a-button @click="addData(columns[0].dataIndex, columns)">
302
- <a-icon type="plus"/>
303
- </a-button>
304
- <a-button @click="removeData(columns[0].dataIndex)">
305
- <a-icon type="minus"/>
306
- </a-button>
307
- </a-button-group>
308
- </td>
309
- </template>
310
- <!-- 其他行 -->
311
- <template v-else>
312
- <td
313
- v-for="(cell, cellIndex) in columns"
314
- :key="cellIndex"
315
- :class=" calcTDBorder(cell.noBoarder) "
316
- :colspan="cell.colSpan ? cell.colSpan : undefined"
317
- :style="determineCellStyle(cell)"
318
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
319
- <template v-if="cell.type === 'column'">
320
- {{ cell.text }}
321
- </template>
322
- <template v-else-if="cell.type === 'value'">
323
- {{ cell.value }}
324
- </template>
325
- <template v-else-if="cell.type === 'curDateInput'">
326
- <a-button type="dashed" v-if="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]">
327
- {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
328
- </a-button>
329
- <a-button
330
- v-if="!configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
331
- type="primary"
332
- @click="getNowDate(inputColumnsDefinitionIndex,cell.dataIndex)"
333
- >{{ cell.text || '确认' }}
334
- </a-button>
335
- </template>
336
- <template v-else-if="cell.type === 'increment'">
337
- {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
338
- </template>
339
- <template v-else-if="cell.type === 'input'">
340
- <template v-if="cell.inputReadOnly === true">
341
- <a-input
342
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
343
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
344
- :disabled="true"/>
345
- </template>
346
- <template v-else>
347
- <a-input
348
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
349
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
350
- </template>
351
- </template>
352
- <template v-else-if="cell.type === 'inputs'">
353
- <template v-if="cell.inputReadOnly === true">
354
- <a-input
355
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
356
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
357
- :disabled="true"/>
358
- </template>
359
- <template v-else>
360
- <a-input
361
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
362
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
363
- </template>
364
- </template>
365
- </td>
366
- </template>
367
- </tr>
368
- </template>
369
-
370
- <script>
371
- import Upload from '@vue2-client/base-client/components/common/Upload'
372
- import { formatDate } from '@vue2-client/utils/util'
373
- import { nanoid } from 'nanoid'
374
-
375
- export default {
376
- name: 'XReportTrGroup',
377
- components: {
378
- Upload
379
- },
380
- props: {
381
- // 每一行的配置
382
- columns: {
383
- type: Array,
384
- required: true
385
- },
386
- showImgInCell: {
387
- type: Boolean,
388
- default: false
389
- },
390
- config: {
391
- type: Object,
392
- default: function () {
393
- return {}
394
- }
395
- },
396
- // 命名空间
397
- serverName: {
398
- type: String,
399
- default: 'af-system'
400
- },
401
- // 原始配置
402
- configData: {
403
- type: Object,
404
- required: true
405
- },
406
- // 是否为动态行
407
- inputColumns: {
408
- type: Boolean,
409
- default: false
410
- },
411
- // 是否为动态行按钮
412
- inputColumnsButton: {
413
- type: Boolean,
414
- default: false
415
- },
416
- // 动态行的Index
417
- inputColumnsDefinitionIndex: {
418
- type: Number,
419
- default: undefined
420
- },
421
- // 是否为展示行
422
- display: {
423
- type: Boolean,
424
- default: false
425
- },
426
- // list类型的下标,用于遍历列表时,获取对应的数据
427
- listIndex: {
428
- type: Number,
429
- default: undefined
430
- },
431
- // 表格没有上边框
432
- noTopBorder: {
433
- type: Boolean,
434
- default: false
435
- },
436
- // 图片是否使用OSS来保存
437
- useOssForImg: {
438
- type: Boolean,
439
- default: true
440
- },
441
- // 图片上传后添加前缀
442
- imgPrefix: {
443
- type: String,
444
- default: undefined
445
- }
446
- },
447
- data () {
448
- return {
449
- maxColSpan: 12,
450
- uploadParams: {
451
- type: 'image',
452
- accept: ['*'],
453
- resUploadStock: 1,
454
- pathKey: 'cs'
455
- }
456
- // tableConfig: {}
457
- }
458
- },
459
- methods: {
460
- updateImg (data) {
461
- this.$emit('updateImg', data)
462
- },
463
- formatImgStr (str) {
464
- const result = []
465
- if (str !== '') {
466
- const arr = str.split('/')
467
- result.push({
468
- uid: nanoid(6),
469
- url: str,
470
- name: arr[arr.length - 1],
471
- status: 'done'
472
- })
473
- }
474
- this.uploadParams.acceptCount = 1
475
- return result
476
- },
477
- checkImg (index, type) {
478
- let target
479
- if (type === 'configData') {
480
- target = this.configData.images[index]
481
- } else {
482
- target = this.config.tempData[index]
483
- }
484
- if (typeof target !== 'object') {
485
- return this.formatImgStr(target)
486
- }
487
- target.forEach(obj => {
488
- if (obj.uid === undefined) {
489
- obj.uid = obj.id.toString()
490
- }
491
- if (obj.url === undefined) {
492
- if (obj.path) {
493
- obj.url = obj.path
494
- }
495
- }
496
- if (obj.name === undefined) {
497
- const withOutEndFix = obj.url.split('.')[0]
498
- const temp = withOutEndFix.split('/')
499
- obj.name = temp[temp.length - 1]
500
- }
501
- if (obj.status === undefined) {
502
- obj.status = 'done'
503
- }
504
- })
505
- return target
506
- },
507
- // 判断单元格样式
508
- determineCellStyle (cell, color = '#000', borderWidth = '1px') {
509
- // 如果声明了borderColor
510
- if (this.config.style.borderColor) {
511
- color = this.config.style.borderColor
512
- }
513
- // 如果声明了borderWidth
514
- if (this.config.style.borderWidth) {
515
- borderWidth = this.config.style.borderWidth
516
- }
517
- // 普通带边框单元格
518
- const withBorder = {
519
- border: borderWidth + ' solid ' + color,
520
- padding: '8px'
521
- }
522
- // 只有左右边框的单元格
523
- const noBorder = {
524
- borderLeft: borderWidth + ' solid ' + color,
525
- borderRight: borderWidth + ' solid ' + color,
526
- padding: '8px'
527
- }
528
- // 只没有上边框的单元格
529
- const NoTopBorder = {
530
- borderTopStyle: 'none',
531
- borderLeft: borderWidth + ' solid ' + color,
532
- borderRight: borderWidth + ' solid ' + color,
533
- borderBottom: borderWidth + ' solid ' + color,
534
- padding: '8px'
535
- }
536
- let result = {}
537
- // 如果表格也声明了样式,用表格样式将样式覆盖
538
- if (cell.style) {
539
- if (cell.noBorder) {
540
- result = { ...noBorder, ...cell.style }
541
- } else {
542
- if (this.noTopBorder) {
543
- result = { ...NoTopBorder, ...cell.style }
544
- } else {
545
- result = { ...withBorder, ...cell.style }
546
- }
547
- }
548
- return result
549
- }
550
- // 如果表头声明了样式,则用其将基础样式覆盖
551
- if (cell.type === 'column') {
552
- if (this.config.labelStyle !== undefined) {
553
- if (cell.noBorder) {
554
- result = { ...noBorder, ...this.config.labelStyle }
555
- } else {
556
- if (this.noTopBorder) {
557
- result = { ...NoTopBorder, ...this.config.labelStyle }
558
- } else {
559
- result = { ...withBorder, ...this.config.labelStyle }
560
- }
561
- }
562
- return result
563
- }
564
- }
565
- if (cell.noBorder) {
566
- result = { ...noBorder }
567
- } else {
568
- if (this.noTopBorder) {
569
- result = { ...NoTopBorder }
570
- } else {
571
- result = { ...withBorder }
572
- }
573
- }
574
- return result
575
- },
576
- // 表格中数据key含有@@@,需要手动触发更新
577
- handleInputDeepChange () {
578
- this.$forceUpdate()
579
- },
580
- // 路径中含有@@@的key,将其解析,并返回其数据
581
- getDeepObject (obj, strPath) {
582
- const arr = strPath.split('@@@')
583
- let result = obj[arr[0]]
584
- arr.shift()
585
- try {
586
- while (arr.length > 0) {
587
- result = result[arr[0]]
588
- arr.shift()
589
- }
590
- } catch (e) {
591
- result = undefined
592
- }
593
- return result
594
- },
595
- // 获取当前日期
596
- getNowDate (index1, index2) {
597
- if (index2) {
598
- // @click="getNowDate(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
599
- this.configData.arr[index1][index2] = formatDate('now')
600
- } else {
601
- this.configData[index1] = formatDate('now')
602
- }
603
- this.configData = Object.assign({}, this.configData)
604
- },
605
- // 反序列化函数并执行
606
- deserializeFunctionAndRun (functionStr, value) {
607
- // eslint-disable-next-line no-eval
608
- const fun = eval('(' + functionStr + ')')
609
- return fun(value, this.config)
610
- },
611
- // 基础上传组件,图片改动后触发
612
- setImages (args, type, index = undefined) {
613
- // 如果基础上传组件在初始化完成后,就调用emit了setImage,此时图片并没有变化,直接返回
614
- if (args[2] === 'created') {
615
- return
616
- }
617
- if (type === 'configData') {
618
- this.configData.images[args[1]] = args[0]
619
- } else {
620
- this.config.tempData[args[1]] = args[0]
621
- if (index) {
622
- this.$emit('updateImg', this.config.tempData[index])
623
- }
624
- }
625
- },
626
- // 动态行删除
627
- removeData (index) {
628
- if (this.configData[index].length === 0) {
629
- this.$message.warn('已经没有更多了')
630
- return
631
- }
632
- this.configData[index].pop()
633
- },
634
- // 添加一行
635
- addData (index, row) {
636
- // 获取定义
637
- const defs = row[0].definition
638
-
639
- // 获取外层对象名
640
- const dataName = row[0].dataIndex
641
- const temp = {}
642
-
643
- defs.forEach(def => {
644
- // 找到数组中最后一个数据的值
645
- let lastDataNo = 0
646
- if (this.configData[dataName][this.configData[dataName].length - 1]) {
647
- lastDataNo = this.configData[dataName][this.configData[dataName].length - 1][def.dataIndex]
648
- }
649
-
650
- // 如果没有值,检查是否声明了初始值
651
- if (lastDataNo === 0 && def.initialValue) {
652
- lastDataNo = def.initialValue
653
- }
654
-
655
- // 检查是否有步长
656
- let step = 1
657
- if (def.step) {
658
- step = def.step
659
- }
660
-
661
- // 如果单元格类型为increment,则进行自增
662
- if (def.type === 'increment') {
663
- temp[def.dataIndex] = lastDataNo + step
664
- }
665
- })
666
- this.configData[index].push(temp)
667
- },
668
- // 根据format计算需要多少个输入框
669
- calcFormatInputNum (formatStr) {
670
- let count = 0
671
- for (let i = 0; i < formatStr.length; i++) {
672
- if (formatStr[i] === '{') {
673
- count++
674
- }
675
- }
676
- return count
677
- },
678
- // 根据format计算输入框之后的文字显示
679
- displayFormatText (formatStr, num) {
680
- let start = 0
681
- let count = 0
682
- num++
683
- for (let i = 0; i < formatStr.length; i++) {
684
- if (formatStr[i] === '}') {
685
- start = i
686
- count++
687
- }
688
- if (count === num) {
689
- for (let j = start + 1; j < formatStr.length; j++) {
690
- if (formatStr[j] === '{') {
691
- return formatStr.slice(start + 1, j)
692
- }
693
- if (j === formatStr.length - 1 && formatStr[j] !== '}') {
694
- return formatStr[j]
695
- }
696
- }
697
- }
698
- }
699
- },
700
- calcTDBorder (cellNoBorder = false) {
701
- if (cellNoBorder) {
702
- return 'tdNoBorder'
703
- } else {
704
- if (this.noTopBorder) {
705
- return 'tdWithNoTopBorder'
706
- } else {
707
- return 'tdWithBorder'
708
- }
709
- }
710
- },
711
- // 根据format计算输入框之前的文字显示
712
- displayFormatStartText (formatStr) {
713
- let count = 0
714
- for (let i = 0; i < formatStr.length; i++) {
715
- if (formatStr[i] === '{') {
716
- break
717
- } else {
718
- count++
719
- }
720
- }
721
- return formatStr.slice(0, count)
722
- },
723
- // 拼接被自动拆分的单元格内容
724
- showSubRowValue (cell) {
725
- const dataName = cell.dataIndex
726
- const formatArr = []
727
- const dataArr = []
728
-
729
- // 从config中取出所有数据,根据dataIndex的开头内容进行拼接
730
- this.config.columns.forEach(row => row.forEach(cell => {
731
- if (cell.dataIndex && cell.dataIndex.startsWith(dataName)) {
732
- formatArr.push(cell.format)
733
- dataArr.push(this.configData[cell.dataIndex])
734
- }
735
- }))
736
-
737
- const text = []
738
- const data = []
739
-
740
- formatArr.forEach(word => {
741
- const temp = word.split('{}')
742
- temp.forEach(char => {
743
- if (char !== '') {
744
- text.push(char)
745
- }
746
- })
747
- })
748
-
749
- dataArr.forEach(item => {
750
- item.forEach(num => {
751
- data.push(num)
752
- })
753
- })
754
-
755
- let result = ''
756
- for (let i = 0; i < data.length; i++) {
757
- result += data[i]
758
- result += text[i]
759
- }
760
-
761
- return result
762
- },
763
- },
764
- beforeMount () {
765
- if (this.useOssForImg) {
766
- this.uploadParams.resUploadMode = 'oss'
767
- }
768
- }
769
- }
770
-
771
- </script>
772
-
773
- <style scoped lang="less">
774
- .inputsDiv {
775
- display: flex;
776
- justify-content: space-between;
777
-
778
- .inputsDivItem {
779
- display: flex;
780
- align-items: center;
781
- padding: 0 4px;
782
- white-space: nowrap;
783
-
784
- .inputsDivItemLabel {
785
- padding: 0 4px;
786
- }
787
- }
788
- }
789
-
790
- .tdNoBorder {
791
- border-left: 1px solid #000;
792
- border-right: 1px solid #000;
793
- padding: 8px;
794
- }
795
-
796
- .tdWithBorder {
797
- border: 1px solid #000;
798
- padding: 8px;
799
- }
800
-
801
- .tdWithNoTopBorder {
802
- border-top-style: none;
803
- border-left: 1px solid #000;
804
- border-right: 1px solid #000;
805
- border-bottom: 1px solid #000;
806
- padding: 8px;
807
- }
808
- </style>
1
+ <template>
2
+ <tr>
3
+ <!-- 预览页展示 -->
4
+ <template v-if="display">
5
+ <template v-if="!inputColumns">
6
+ <td
7
+ v-for="(cell, cellIndex) in columns"
8
+ v-if="!cell.dontShowRow"
9
+ :key="cellIndex"
10
+ :class=" calcTDBorder(cell.noBoarder) "
11
+ :style="determineCellStyle(cell)"
12
+ :colspan="cell.colSpan ? cell.colSpan : undefined">
13
+ <template v-if="cell.type === 'column'">
14
+ <template v-if="cell.customFunction">
15
+ {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
16
+ </template>
17
+ <template v-else>
18
+ {{ cell.text }}
19
+ </template>
20
+ </template>
21
+ <!-- 占位 -->
22
+ <template v-else-if="cell.type === 'placeHolderColumn'">
23
+ </template>
24
+ <template v-else-if="cell.type === 'value'">
25
+ <template v-if="cell.customFunction === undefined">
26
+ {{ cell.value }}
27
+ </template>
28
+ <template v-else>
29
+ {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
30
+ </template>
31
+ </template>
32
+ <template v-else-if="cell.type === 'input'">
33
+ <template v-if="cell.customFunction === undefined">
34
+ {{ getDeepObject(configData, cell.dataIndex) }}
35
+ </template>
36
+ <template v-else>
37
+ {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
38
+ </template>
39
+ </template>
40
+ <template v-else-if="cell.type === 'inputs'">
41
+ <template v-if="cell.customFunction === undefined">
42
+ {{ showSubRowValue(cell) }}
43
+ </template>
44
+ <template v-else>
45
+ {{ deserializeFunctionAndRun(cell.customFunction, showSubRowValue(cell), config) }}
46
+ </template>
47
+ </template>
48
+ <template v-else-if="cell.type === 'list'">
49
+ <template v-if="listIndex === 0">
50
+ <span style="font-weight: bold">{{ cell.listHead }}</span>
51
+ </template>
52
+ <template v-else-if="cell.listType === 'input'">
53
+ {{ getDeepObject(configData, cell.dataIndex)[listIndex] }}
54
+ </template>
55
+ <template v-else-if="cell.listType === 'value'">
56
+ {{ cell.content[listIndex] }}
57
+ </template>
58
+ <template v-else-if="cell.listType === 'variable'">
59
+ {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
60
+ </template>
61
+ </template>
62
+ <template v-else-if="cell.type === 'images'">
63
+ <template v-if="getDeepObject(configData.images, cell.dataIndex) === undefined || getDeepObject(configData.images, cell.dataIndex).length === 0">
64
+ <template v-if="getDeepObject(configData, cell.dataIndex) === undefined || getDeepObject(configData, cell.dataIndex).length === 0">
65
+ <span>无</span>
66
+ </template>
67
+ <template v-else>
68
+ <template v-if="typeof getDeepObject(configData, cell.dataIndex) === 'object'">
69
+ <div style="display: flex; align-items: end; justify-content: space-evenly; flex-wrap: wrap">
70
+ <template v-for="(img,imgIndex) in getDeepObject(configData, cell.dataIndex)">
71
+ <template v-if="showImgInCell">
72
+ <div :key="imgIndex">
73
+ <img :src="img.url" alt="图片"/>
74
+ <p>{{ img.name }}</p>
75
+ </div>
76
+ </template>
77
+ <template v-else>
78
+ <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
79
+ </template>
80
+ </template>
81
+ </div>
82
+ </template>
83
+ <template v-else>
84
+ <img :src="getDeepObject(configData, cell.dataIndex)" alt="图片"/>
85
+ <p style="margin-right: 5%">{{ formatImgStr(getDeepObject(configData, cell.dataIndex))[0].name }}</p>
86
+ </template>
87
+ </template>
88
+ </template>
89
+ <template v-else v-for="(img,imgIndex) in getDeepObject(configData.images, cell.dataIndex)">
90
+ <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
91
+ </template>
92
+ </template>
93
+ </td>
94
+ </template>
95
+ <template v-else>
96
+ <td
97
+ v-for="(cell, cellIndex) in columns"
98
+ :key="cellIndex"
99
+ :class=" calcTDBorder(cell.noBoarder) "
100
+ :colspan="cell.colSpan ? cell.colSpan : undefined"
101
+ :style="determineCellStyle(cell)"
102
+ :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
103
+ <template v-if="cell.type === 'column'">
104
+ {{ cell.text }}
105
+ </template>
106
+ <template v-else-if="cell.type === 'value'">
107
+ <template v-if="cell.customFunction === undefined">
108
+ {{ cell.value }}
109
+ </template>
110
+ <template v-else>
111
+ {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
112
+ </template>
113
+ </template>
114
+ <template v-else-if="cell.type === 'increment'">
115
+ <template v-if="cell.customFunction === undefined">
116
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
117
+ </template>
118
+ <template v-else>
119
+ {{
120
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
121
+ }}
122
+ </template>
123
+ </template>
124
+ <template v-else-if="cell.type === 'input'">
125
+ <template v-if="cell.customFunction === undefined">
126
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
127
+ </template>
128
+ <template v-else>
129
+ {{
130
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
131
+ }}
132
+ </template>
133
+ </template>
134
+ <template v-else-if="cell.type === 'inputs'">
135
+ <template v-if="cell.customFunction === undefined">
136
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
137
+ </template>
138
+ <template v-else>
139
+ {{
140
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
141
+ }}
142
+ </template>
143
+ </template>
144
+ </td>
145
+ </template>
146
+ </template>
147
+ <!-- 不是动态行 -->
148
+ <template v-else-if="!inputColumns">
149
+ <td
150
+ v-for="(cell, cellIndex) in columns"
151
+ :key="cellIndex"
152
+ :class=" calcTDBorder(cell.noBoarder) "
153
+ :colspan="cell.colSpan ? cell.colSpan : undefined"
154
+ :style="determineCellStyle(cell)"
155
+ :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
156
+ <template v-if="cell.type === 'column'">
157
+ <template v-if="cell.customFunction">
158
+ {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
159
+ </template>
160
+ <template v-else>
161
+ {{ cell.text }}
162
+ </template>
163
+ </template>
164
+ <template v-else-if="cell.type === 'placeHolderColumn'">
165
+ <!-- 占位 -->
166
+ </template>
167
+ <template v-else-if="cell.type === 'value'">
168
+ {{ cell.value }}
169
+ </template>
170
+ <template v-else-if="cell.type === 'curDateInput'">
171
+ <a-button type="dashed" v-if="configData[cell.dataIndex]">
172
+ {{ configData[cell.dataIndex] }}
173
+ </a-button>
174
+ <a-button
175
+ v-if="!configData[cell.dataIndex]"
176
+ type="primary"
177
+ @click="getNowDate(cell.dataIndex)"
178
+ >{{ cell.text || '确认' }}
179
+ </a-button>
180
+ </template>
181
+ <template v-else-if="cell.type === 'input'">
182
+ <template v-if="cell.inputReadOnly === true">
183
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
184
+ <a-input
185
+ @change="handleInputDeepChange($event, cell.dataIndex)"
186
+ v-model="config.tempData[cell.dataIndex]"
187
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
188
+ :disabled="true"/>
189
+ </template>
190
+ <template v-else>
191
+ <a-input
192
+ v-model="configData[cell.dataIndex]"
193
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
194
+ :disabled="true"/>
195
+ </template>
196
+ </template>
197
+ <template v-else>
198
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
199
+ <a-input
200
+ @change="handleInputDeepChange($event, cell.dataIndex)"
201
+ v-model="config.tempData[cell.dataIndex]"
202
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
203
+ </template>
204
+ <template v-else>
205
+ <a-input
206
+ v-model="configData[cell.dataIndex]"
207
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
208
+ </template>
209
+ </template>
210
+ </template>
211
+ <template v-else-if="cell.type === 'inputs'">
212
+ <template v-if="cell.inputReadOnly === true">
213
+ <div class="inputsDiv">
214
+ <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
215
+ <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
216
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
217
+ <a-input
218
+ @change="handleInputDeepChange($event, cell.dataIndex)"
219
+ v-model="config.tempData[cell.dataIndex][index]"
220
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
221
+ :disabled="true"/>
222
+ </template>
223
+ <template v-else>
224
+ <a-input
225
+ v-model="configData[cell.dataIndex][index]"
226
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
227
+ :disabled="true"/>
228
+ </template>
229
+ <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
230
+ </div>
231
+ </div>
232
+ </template>
233
+ <template v-else>
234
+ <div class="inputsDiv">
235
+ <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
236
+ <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
237
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
238
+ <a-input
239
+ @change="handleInputDeepChange($event, cell.dataIndex)"
240
+ v-model="config.tempData[cell.dataIndex][index]"
241
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
242
+ </template>
243
+ <template v-else>
244
+ <a-input
245
+ v-model="configData[cell.dataIndex][index]"
246
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
247
+ </template>
248
+ <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
249
+ </div>
250
+ </div>
251
+ </template>
252
+ </template>
253
+ <template v-else-if="cell.type === 'list'">
254
+ <template v-if="listIndex === 0">
255
+ <span style="font-weight: bold">{{ cell.listHead }}</span>
256
+ </template>
257
+ <template v-else-if="cell.listType === 'input'">
258
+ <a-input
259
+ v-model="configData[cell.dataIndex][listIndex]"
260
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
261
+ </template>
262
+ <template v-else-if="cell.listType === 'value'">
263
+ {{ cell.content[listIndex] }}
264
+ </template>
265
+ <template v-else-if="cell.listType === 'variable'">
266
+ {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
267
+ </template>
268
+ </template>
269
+ <template v-else-if="cell.type === 'images'">
270
+ <div>
271
+ <template v-if="configData.images[cell.dataIndex]?.length > 0">
272
+ <upload
273
+ :model="uploadParams"
274
+ :img-prefix="imgPrefix"
275
+ :service-name="serverName"
276
+ :images="checkImg(cell.dataIndex, 'configData')"
277
+ :outer-container-index="cell.dataIndex"
278
+ @setFiles="(...args) => {setImages(args, 'configData')}"
279
+ :upload-style="'simple'"
280
+ />
281
+ </template>
282
+ <template v-else>
283
+ <upload
284
+ :model="uploadParams"
285
+ :img-prefix="imgPrefix"
286
+ :service-name="serverName"
287
+ :images="checkImg(cell.dataIndex, 'config')"
288
+ :outer-container-index="cell.dataIndex"
289
+ @setFiles="(...args) => {setImages(args, 'config', cell.dataIndex)}"
290
+ :upload-style="'simple'"
291
+ />
292
+ </template>
293
+ </div>
294
+ </template>
295
+ </td>
296
+ </template>
297
+ <!-- 动态行插入按钮 -->
298
+ <template v-else-if="inputColumnsButton">
299
+ <td :colspan="maxColSpan" :class="calcTDBorder()">
300
+ <a-button-group>
301
+ <a-button @click="addData(columns[0].dataIndex, columns)">
302
+ <a-icon type="plus"/>
303
+ </a-button>
304
+ <a-button @click="removeData(columns[0].dataIndex)">
305
+ <a-icon type="minus"/>
306
+ </a-button>
307
+ </a-button-group>
308
+ </td>
309
+ </template>
310
+ <!-- 其他行 -->
311
+ <template v-else>
312
+ <td
313
+ v-for="(cell, cellIndex) in columns"
314
+ :key="cellIndex"
315
+ :class=" calcTDBorder(cell.noBoarder) "
316
+ :colspan="cell.colSpan ? cell.colSpan : undefined"
317
+ :style="determineCellStyle(cell)"
318
+ :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
319
+ <template v-if="cell.type === 'column'">
320
+ {{ cell.text }}
321
+ </template>
322
+ <template v-else-if="cell.type === 'value'">
323
+ {{ cell.value }}
324
+ </template>
325
+ <template v-else-if="cell.type === 'curDateInput'">
326
+ <a-button type="dashed" v-if="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]">
327
+ {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
328
+ </a-button>
329
+ <a-button
330
+ v-if="!configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
331
+ type="primary"
332
+ @click="getNowDate(inputColumnsDefinitionIndex,cell.dataIndex)"
333
+ >{{ cell.text || '确认' }}
334
+ </a-button>
335
+ </template>
336
+ <template v-else-if="cell.type === 'increment'">
337
+ {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
338
+ </template>
339
+ <template v-else-if="cell.type === 'input'">
340
+ <template v-if="cell.inputReadOnly === true">
341
+ <a-input
342
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
343
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
344
+ :disabled="true"/>
345
+ </template>
346
+ <template v-else>
347
+ <a-input
348
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
349
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
350
+ </template>
351
+ </template>
352
+ <template v-else-if="cell.type === 'inputs'">
353
+ <template v-if="cell.inputReadOnly === true">
354
+ <a-input
355
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
356
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
357
+ :disabled="true"/>
358
+ </template>
359
+ <template v-else>
360
+ <a-input
361
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
362
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
363
+ </template>
364
+ </template>
365
+ </td>
366
+ </template>
367
+ </tr>
368
+ </template>
369
+
370
+ <script>
371
+ import Upload from '@vue2-client/base-client/components/common/Upload'
372
+ import { formatDate } from '@vue2-client/utils/util'
373
+ import { nanoid } from 'nanoid'
374
+
375
+ export default {
376
+ name: 'XReportTrGroup',
377
+ components: {
378
+ Upload
379
+ },
380
+ props: {
381
+ // 每一行的配置
382
+ columns: {
383
+ type: Array,
384
+ required: true
385
+ },
386
+ showImgInCell: {
387
+ type: Boolean,
388
+ default: false
389
+ },
390
+ config: {
391
+ type: Object,
392
+ default: function () {
393
+ return {}
394
+ }
395
+ },
396
+ // 命名空间
397
+ serverName: {
398
+ type: String,
399
+ default: 'af-system'
400
+ },
401
+ // 原始配置
402
+ configData: {
403
+ type: Object,
404
+ required: true
405
+ },
406
+ // 是否为动态行
407
+ inputColumns: {
408
+ type: Boolean,
409
+ default: false
410
+ },
411
+ // 是否为动态行按钮
412
+ inputColumnsButton: {
413
+ type: Boolean,
414
+ default: false
415
+ },
416
+ // 动态行的Index
417
+ inputColumnsDefinitionIndex: {
418
+ type: Number,
419
+ default: undefined
420
+ },
421
+ // 是否为展示行
422
+ display: {
423
+ type: Boolean,
424
+ default: false
425
+ },
426
+ // list类型的下标,用于遍历列表时,获取对应的数据
427
+ listIndex: {
428
+ type: Number,
429
+ default: undefined
430
+ },
431
+ // 表格没有上边框
432
+ noTopBorder: {
433
+ type: Boolean,
434
+ default: false
435
+ },
436
+ // 图片是否使用OSS来保存
437
+ useOssForImg: {
438
+ type: Boolean,
439
+ default: true
440
+ },
441
+ // 图片上传后添加前缀
442
+ imgPrefix: {
443
+ type: String,
444
+ default: undefined
445
+ }
446
+ },
447
+ data () {
448
+ return {
449
+ maxColSpan: 12,
450
+ uploadParams: {
451
+ type: 'image',
452
+ accept: ['*'],
453
+ resUploadStock: 1,
454
+ pathKey: 'cs'
455
+ }
456
+ // tableConfig: {}
457
+ }
458
+ },
459
+ methods: {
460
+ updateImg (data) {
461
+ this.$emit('updateImg', data)
462
+ },
463
+ formatImgStr (str) {
464
+ const result = []
465
+ if (str !== '') {
466
+ const arr = str.split('/')
467
+ result.push({
468
+ uid: nanoid(6),
469
+ url: str,
470
+ name: arr[arr.length - 1],
471
+ status: 'done'
472
+ })
473
+ }
474
+ this.uploadParams.acceptCount = 1
475
+ return result
476
+ },
477
+ checkImg (index, type) {
478
+ let target
479
+ if (type === 'configData') {
480
+ target = this.configData.images[index]
481
+ } else {
482
+ target = this.config.tempData[index]
483
+ }
484
+ if (typeof target !== 'object') {
485
+ return this.formatImgStr(target)
486
+ }
487
+ target.forEach(obj => {
488
+ if (obj.uid === undefined) {
489
+ obj.uid = obj.id.toString()
490
+ }
491
+ if (obj.url === undefined) {
492
+ if (obj.path) {
493
+ obj.url = obj.path
494
+ }
495
+ }
496
+ if (obj.name === undefined) {
497
+ const withOutEndFix = obj.url.split('.')[0]
498
+ const temp = withOutEndFix.split('/')
499
+ obj.name = temp[temp.length - 1]
500
+ }
501
+ if (obj.status === undefined) {
502
+ obj.status = 'done'
503
+ }
504
+ })
505
+ return target
506
+ },
507
+ // 判断单元格样式
508
+ determineCellStyle (cell, color = '#000', borderWidth = '1px') {
509
+ // 如果声明了borderColor
510
+ if (this.config.style.borderColor) {
511
+ color = this.config.style.borderColor
512
+ }
513
+ // 如果声明了borderWidth
514
+ if (this.config.style.borderWidth) {
515
+ borderWidth = this.config.style.borderWidth
516
+ }
517
+ // 普通带边框单元格
518
+ const withBorder = {
519
+ border: borderWidth + ' solid ' + color,
520
+ padding: '8px'
521
+ }
522
+ // 只有左右边框的单元格
523
+ const noBorder = {
524
+ borderLeft: borderWidth + ' solid ' + color,
525
+ borderRight: borderWidth + ' solid ' + color,
526
+ padding: '8px'
527
+ }
528
+ // 只没有上边框的单元格
529
+ const NoTopBorder = {
530
+ borderTopStyle: 'none',
531
+ borderLeft: borderWidth + ' solid ' + color,
532
+ borderRight: borderWidth + ' solid ' + color,
533
+ borderBottom: borderWidth + ' solid ' + color,
534
+ padding: '8px'
535
+ }
536
+ let result = {}
537
+ // 如果表格也声明了样式,用表格样式将样式覆盖
538
+ if (cell.style) {
539
+ if (cell.noBorder) {
540
+ result = { ...noBorder, ...cell.style }
541
+ } else {
542
+ if (this.noTopBorder) {
543
+ result = { ...NoTopBorder, ...cell.style }
544
+ } else {
545
+ result = { ...withBorder, ...cell.style }
546
+ }
547
+ }
548
+ return result
549
+ }
550
+ // 如果表头声明了样式,则用其将基础样式覆盖
551
+ if (cell.type === 'column') {
552
+ if (this.config.labelStyle !== undefined) {
553
+ if (cell.noBorder) {
554
+ result = { ...noBorder, ...this.config.labelStyle }
555
+ } else {
556
+ if (this.noTopBorder) {
557
+ result = { ...NoTopBorder, ...this.config.labelStyle }
558
+ } else {
559
+ result = { ...withBorder, ...this.config.labelStyle }
560
+ }
561
+ }
562
+ return result
563
+ }
564
+ }
565
+ if (cell.noBorder) {
566
+ result = { ...noBorder }
567
+ } else {
568
+ if (this.noTopBorder) {
569
+ result = { ...NoTopBorder }
570
+ } else {
571
+ result = { ...withBorder }
572
+ }
573
+ }
574
+ return result
575
+ },
576
+ // 表格中数据key含有@@@,需要手动触发更新
577
+ handleInputDeepChange () {
578
+ this.$forceUpdate()
579
+ },
580
+ // 路径中含有@@@的key,将其解析,并返回其数据
581
+ getDeepObject (obj, strPath) {
582
+ const arr = strPath.split('@@@')
583
+ let result = obj[arr[0]]
584
+ arr.shift()
585
+ try {
586
+ while (arr.length > 0) {
587
+ result = result[arr[0]]
588
+ arr.shift()
589
+ }
590
+ } catch (e) {
591
+ result = undefined
592
+ }
593
+ return result
594
+ },
595
+ // 获取当前日期
596
+ getNowDate (index1, index2) {
597
+ if (index2) {
598
+ // @click="getNowDate(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
599
+ this.configData.arr[index1][index2] = formatDate('now')
600
+ } else {
601
+ this.configData[index1] = formatDate('now')
602
+ }
603
+ this.configData = Object.assign({}, this.configData)
604
+ },
605
+ // 反序列化函数并执行
606
+ deserializeFunctionAndRun (functionStr, value) {
607
+ // eslint-disable-next-line no-eval
608
+ const fun = eval('(' + functionStr + ')')
609
+ return fun(value, this.config)
610
+ },
611
+ // 基础上传组件,图片改动后触发
612
+ setImages (args, type, index = undefined) {
613
+ // 如果基础上传组件在初始化完成后,就调用emit了setImage,此时图片并没有变化,直接返回
614
+ if (args[2] === 'created') {
615
+ return
616
+ }
617
+ if (type === 'configData') {
618
+ this.configData.images[args[1]] = args[0]
619
+ } else {
620
+ this.config.tempData[args[1]] = args[0]
621
+ if (index) {
622
+ this.$emit('updateImg', this.config.tempData[index])
623
+ }
624
+ }
625
+ },
626
+ // 动态行删除
627
+ removeData (index) {
628
+ if (this.configData[index].length === 0) {
629
+ this.$message.warn('已经没有更多了')
630
+ return
631
+ }
632
+ this.configData[index].pop()
633
+ },
634
+ // 添加一行
635
+ addData (index, row) {
636
+ // 获取定义
637
+ const defs = row[0].definition
638
+
639
+ // 获取外层对象名
640
+ const dataName = row[0].dataIndex
641
+ const temp = {}
642
+
643
+ defs.forEach(def => {
644
+ // 找到数组中最后一个数据的值
645
+ let lastDataNo = 0
646
+ if (this.configData[dataName][this.configData[dataName].length - 1]) {
647
+ lastDataNo = this.configData[dataName][this.configData[dataName].length - 1][def.dataIndex]
648
+ }
649
+
650
+ // 如果没有值,检查是否声明了初始值
651
+ if (lastDataNo === 0 && def.initialValue) {
652
+ lastDataNo = def.initialValue
653
+ }
654
+
655
+ // 检查是否有步长
656
+ let step = 1
657
+ if (def.step) {
658
+ step = def.step
659
+ }
660
+
661
+ // 如果单元格类型为increment,则进行自增
662
+ if (def.type === 'increment') {
663
+ temp[def.dataIndex] = lastDataNo + step
664
+ }
665
+ })
666
+ this.configData[index].push(temp)
667
+ },
668
+ // 根据format计算需要多少个输入框
669
+ calcFormatInputNum (formatStr) {
670
+ let count = 0
671
+ for (let i = 0; i < formatStr.length; i++) {
672
+ if (formatStr[i] === '{') {
673
+ count++
674
+ }
675
+ }
676
+ return count
677
+ },
678
+ // 根据format计算输入框之后的文字显示
679
+ displayFormatText (formatStr, num) {
680
+ let start = 0
681
+ let count = 0
682
+ num++
683
+ for (let i = 0; i < formatStr.length; i++) {
684
+ if (formatStr[i] === '}') {
685
+ start = i
686
+ count++
687
+ }
688
+ if (count === num) {
689
+ for (let j = start + 1; j < formatStr.length; j++) {
690
+ if (formatStr[j] === '{') {
691
+ return formatStr.slice(start + 1, j)
692
+ }
693
+ if (j === formatStr.length - 1 && formatStr[j] !== '}') {
694
+ return formatStr[j]
695
+ }
696
+ }
697
+ }
698
+ }
699
+ },
700
+ calcTDBorder (cellNoBorder = false) {
701
+ if (cellNoBorder) {
702
+ return 'tdNoBorder'
703
+ } else {
704
+ if (this.noTopBorder) {
705
+ return 'tdWithNoTopBorder'
706
+ } else {
707
+ return 'tdWithBorder'
708
+ }
709
+ }
710
+ },
711
+ // 根据format计算输入框之前的文字显示
712
+ displayFormatStartText (formatStr) {
713
+ let count = 0
714
+ for (let i = 0; i < formatStr.length; i++) {
715
+ if (formatStr[i] === '{') {
716
+ break
717
+ } else {
718
+ count++
719
+ }
720
+ }
721
+ return formatStr.slice(0, count)
722
+ },
723
+ // 拼接被自动拆分的单元格内容
724
+ showSubRowValue (cell) {
725
+ const dataName = cell.dataIndex
726
+ const formatArr = []
727
+ const dataArr = []
728
+
729
+ // 从config中取出所有数据,根据dataIndex的开头内容进行拼接
730
+ this.config.columns.forEach(row => row.forEach(cell => {
731
+ if (cell.dataIndex && cell.dataIndex.startsWith(dataName)) {
732
+ formatArr.push(cell.format)
733
+ dataArr.push(this.configData[cell.dataIndex])
734
+ }
735
+ }))
736
+
737
+ const text = []
738
+ const data = []
739
+
740
+ formatArr.forEach(word => {
741
+ const temp = word.split('{}')
742
+ temp.forEach(char => {
743
+ if (char !== '') {
744
+ text.push(char)
745
+ }
746
+ })
747
+ })
748
+
749
+ dataArr.forEach(item => {
750
+ item.forEach(num => {
751
+ data.push(num)
752
+ })
753
+ })
754
+
755
+ let result = ''
756
+ for (let i = 0; i < data.length; i++) {
757
+ result += data[i]
758
+ result += text[i]
759
+ }
760
+
761
+ return result
762
+ },
763
+ },
764
+ beforeMount () {
765
+ if (this.useOssForImg) {
766
+ this.uploadParams.resUploadMode = 'oss'
767
+ }
768
+ }
769
+ }
770
+
771
+ </script>
772
+
773
+ <style scoped lang="less">
774
+ .inputsDiv {
775
+ display: flex;
776
+ justify-content: space-between;
777
+
778
+ .inputsDivItem {
779
+ display: flex;
780
+ align-items: center;
781
+ padding: 0 4px;
782
+ white-space: nowrap;
783
+
784
+ .inputsDivItemLabel {
785
+ padding: 0 4px;
786
+ }
787
+ }
788
+ }
789
+
790
+ .tdNoBorder {
791
+ border-left: 1px solid #000;
792
+ border-right: 1px solid #000;
793
+ padding: 8px;
794
+ }
795
+
796
+ .tdWithBorder {
797
+ border: 1px solid #000;
798
+ padding: 8px;
799
+ }
800
+
801
+ .tdWithNoTopBorder {
802
+ border-top-style: none;
803
+ border-left: 1px solid #000;
804
+ border-right: 1px solid #000;
805
+ border-bottom: 1px solid #000;
806
+ padding: 8px;
807
+ }
808
+ </style>