vue2-client 1.9.13 → 1.9.14

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