vue2-client 1.15.85 → 1.15.86

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 (698) hide show
  1. package/.claude/settings.local.json +12 -0
  2. package/.cursorrules +19 -19
  3. package/.editorconfig +9 -9
  4. package/.env +20 -20
  5. package/.env.apply +19 -19
  6. package/.env.development +1 -1
  7. package/.env.gaslink +19 -19
  8. package/.env.his +19 -19
  9. package/.env.iot +19 -19
  10. package/.env.liuli +20 -20
  11. package/.env.message +19 -19
  12. package/.env.revenue +19 -19
  13. package/.env.runtime +19 -19
  14. package/.env.scada +19 -19
  15. package/.eslintrc.js +90 -90
  16. package/.eslintrc.json +5 -5
  17. package/CHANGELOG.md +824 -824
  18. package/CLAUDE.md +89 -89
  19. package/Components.md +60 -60
  20. package/README.md +65 -65
  21. package/babel.config.js +21 -21
  22. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +46 -46
  23. package/docs/LowCode/lowcode.md +155 -155
  24. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  25. package/docs/index.md +30 -30
  26. package/docs/notice.md +22 -22
  27. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +179 -179
  28. package/index.js +31 -31
  29. package/jest-transform-stub.js +8 -8
  30. package/jest.config.js +22 -22
  31. package/jest.setup.js +7 -7
  32. package/jsconfig.json +19 -19
  33. package/package.json +111 -111
  34. package/public/his/editor/editor.html +51 -51
  35. package/public/his/editor/mock/bind_data.html +779 -779
  36. package/public/his/editor/mock/data_table.html +40 -40
  37. package/public/his/editor/mock/sign.html +75 -75
  38. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  39. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  40. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  41. package/public/his/editor/vender/date97/calendar.js +4 -4
  42. package/public/his/editor/vender/date97/lang/en.js +13 -13
  43. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  44. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  45. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  46. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  47. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  48. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  49. package/public/his/editor/vender/diff.js +1627 -1627
  50. package/public/his/editor/vender/editor.js +1 -1
  51. package/public/his/editor/vender/fabric.js +31187 -31187
  52. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  53. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  54. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  55. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  56. package/public/his/editor/vender/mui/mui.min.css +4 -4
  57. package/public/his/editor/vender/mui/mui.min.js +5 -5
  58. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  59. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  60. package/public/his/editor/vender/qrcode.js +7 -7
  61. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  62. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  63. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  64. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  65. package/public/his/editor/vender/validator.js +5094 -5094
  66. package/public/his/editor/vender/weui/weui.css +5659 -5659
  67. package/public/his/editor/vender/weui/weui.min.css +4 -4
  68. package/public/his/editor/vender/weui/weui.min.js +11 -11
  69. package/public/index.html +27 -27
  70. package/src/App.vue +196 -196
  71. package/src/ReportView.js +13 -13
  72. package/src/assets/img/querySlotDemo.svg +15 -15
  73. package/src/assets/svg/badtwo.svg +1 -1
  74. package/src/assets/svg/goodtwo.svg +1 -1
  75. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  76. package/src/base-client/components/AI/demo.vue +31 -31
  77. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +532 -532
  78. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  79. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  80. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  81. package/src/base-client/components/common/AddressSearchCombobox/index.js +3 -3
  82. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  83. package/src/base-client/components/common/AmapMarker/index.js +3 -3
  84. package/src/base-client/components/common/CitySelect/CitySelect.vue +376 -376
  85. package/src/base-client/components/common/CitySelect/demo.vue +43 -43
  86. package/src/base-client/components/common/CitySelect/index.js +3 -3
  87. package/src/base-client/components/common/CitySelect/index.md +109 -109
  88. package/src/base-client/components/common/ColorPickerCombobox/ColorPickerCombobox.vue +99 -99
  89. package/src/base-client/components/common/ColorPickerCombobox/demo.vue +34 -34
  90. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  91. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  92. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  93. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  94. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  95. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  96. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  97. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  98. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +146 -146
  99. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  100. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  101. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  102. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  103. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  104. package/src/base-client/components/common/JSONToTree/index.js +3 -3
  105. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  106. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  107. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  108. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  109. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  110. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  111. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  112. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  113. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  114. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  115. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  116. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  117. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  118. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  119. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  120. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  121. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  122. package/src/base-client/components/common/Recording/index.js +3 -3
  123. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  124. package/src/base-client/components/common/Tree/index.js +2 -2
  125. package/src/base-client/components/common/Upload/Upload.vue +323 -323
  126. package/src/base-client/components/common/Upload/index.js +3 -3
  127. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  128. package/src/base-client/components/common/XAddForm/index.js +3 -3
  129. package/src/base-client/components/common/XAddForm/index.md +61 -61
  130. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +1169 -1169
  131. package/src/base-client/components/common/XAddNativeForm/demo.vue +54 -40
  132. package/src/base-client/components/common/XAddNativeForm/index.js +3 -3
  133. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  134. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  135. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  136. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  137. package/src/base-client/components/common/XAddReport/XAddReport.vue +212 -212
  138. package/src/base-client/components/common/XAddReport/index.js +3 -3
  139. package/src/base-client/components/common/XAddReport/index.md +56 -56
  140. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  141. package/src/base-client/components/common/XBadge/index.js +3 -3
  142. package/src/base-client/components/common/XBadge/index.md +39 -39
  143. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  144. package/src/base-client/components/common/XButtons/XButtons.vue +284 -284
  145. package/src/base-client/components/common/XButtons/index.js +3 -3
  146. package/src/base-client/components/common/XButtons/index.md +61 -61
  147. package/src/base-client/components/common/XCalendar/XCalendar.vue +369 -369
  148. package/src/base-client/components/common/XCalendar/index.md +284 -284
  149. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  150. package/src/base-client/components/common/XCard/index.js +3 -3
  151. package/src/base-client/components/common/XCard/index.md +43 -43
  152. package/src/base-client/components/common/XCardSet/XCardSet.vue +300 -300
  153. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  154. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  155. package/src/base-client/components/common/XCollapse/XCollapse.vue +354 -354
  156. package/src/base-client/components/common/XConversation/XConversation.vue +576 -576
  157. package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
  158. package/src/base-client/components/common/XDataCard/XDataCard.vue +629 -629
  159. package/src/base-client/components/common/XDataCard/index.js +3 -3
  160. package/src/base-client/components/common/XDataCard/index.md +1 -1
  161. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  162. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  163. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  164. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  165. package/src/base-client/components/common/XDatePicker/index.vue +276 -276
  166. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +174 -174
  167. package/src/base-client/components/common/XDescriptions/XDescriptionsGroup.vue +314 -314
  168. package/src/base-client/components/common/XDescriptions/demo.vue +51 -51
  169. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  170. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  171. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  172. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  173. package/src/base-client/components/common/XForm/XForm.vue +420 -420
  174. package/src/base-client/components/common/XForm/XFormItem.vue +1474 -1390
  175. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  176. package/src/base-client/components/common/XForm/XTreeSelect.vue +276 -276
  177. package/src/base-client/components/common/XForm/demo.vue +105 -105
  178. package/src/base-client/components/common/XForm/index.js +3 -3
  179. package/src/base-client/components/common/XForm/index.md +178 -178
  180. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  181. package/src/base-client/components/common/XFormCol/XFormCol.vue +157 -157
  182. package/src/base-client/components/common/XFormCol/index.js +3 -3
  183. package/src/base-client/components/common/XFormCol/index.md +35 -35
  184. package/src/base-client/components/common/XFormGroup/XFormGroup.vue +301 -301
  185. package/src/base-client/components/common/XFormGroup/demo.vue +41 -41
  186. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  187. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  188. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  189. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  190. package/src/base-client/components/common/XFormTable/XFormTable.vue +938 -938
  191. package/src/base-client/components/common/XFormTable/demo.vue +87 -87
  192. package/src/base-client/components/common/XFormTable/index.js +3 -3
  193. package/src/base-client/components/common/XFormTable/index.md +92 -92
  194. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +174 -174
  195. package/src/base-client/components/common/XImportExcel/index.js +3 -3
  196. package/src/base-client/components/common/XImportExcel/index.md +38 -38
  197. package/src/base-client/components/common/XInput/XInput.vue +128 -128
  198. package/src/base-client/components/common/XInput/index.js +3 -3
  199. package/src/base-client/components/common/XInput/index.md +97 -97
  200. package/src/base-client/components/common/XIntervalPicker/XIntervalPicker.vue +121 -121
  201. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  202. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  203. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  204. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  205. package/src/base-client/components/common/XLicensePlate/index.js +3 -3
  206. package/src/base-client/components/common/XLicensePlate/index.md +38 -38
  207. package/src/base-client/components/common/XPrint/Demo.vue +41 -41
  208. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  209. package/src/base-client/components/common/XPrint/PrintBill.vue +308 -308
  210. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  211. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  212. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  213. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  214. package/src/base-client/components/common/XPrint/index.vue +97 -97
  215. package/src/base-client/components/common/XRate/demo.vue +102 -102
  216. package/src/base-client/components/common/XRate/index.vue +149 -149
  217. package/src/base-client/components/common/XReport/XReport.vue +963 -963
  218. package/src/base-client/components/common/XReport/XReportDemo.vue +70 -70
  219. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  220. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  221. package/src/base-client/components/common/XReport/XReportTrGroup.vue +1005 -1005
  222. package/src/base-client/components/common/XReport/index.js +3 -3
  223. package/src/base-client/components/common/XReport/index.md +103 -103
  224. package/src/base-client/components/common/XReport/print.js +186 -186
  225. package/src/base-client/components/common/XReportDrawer/XReportDrawer.vue +201 -201
  226. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  227. package/src/base-client/components/common/XReportGrid/XReport.vue +1075 -1075
  228. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +44 -44
  229. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +620 -620
  230. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +723 -723
  231. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  232. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  233. package/src/base-client/components/common/XReportGrid/print.js +184 -184
  234. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  235. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  236. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  237. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  238. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  239. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  240. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  241. package/src/base-client/components/common/XStepView/index.js +3 -3
  242. package/src/base-client/components/common/XStepView/index.md +31 -31
  243. package/src/base-client/components/common/XTab/XTab.vue +299 -299
  244. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  245. package/src/base-client/components/common/XTab/index.js +3 -3
  246. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  247. package/src/base-client/components/common/XTable/ExportExcel.vue +283 -283
  248. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  249. package/src/base-client/components/common/XTable/XTable.vue +1599 -1599
  250. package/src/base-client/components/common/XTable/XTableWrapper.vue +597 -597
  251. package/src/base-client/components/common/XTable/index.js +3 -3
  252. package/src/base-client/components/common/XTable/index.md +255 -255
  253. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  254. package/src/base-client/components/common/XTimeline/XTimeline.vue +358 -358
  255. package/src/base-client/components/common/XTimeline/index.md +191 -191
  256. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  257. package/src/base-client/components/common/XTree/XTreePro.vue +452 -452
  258. package/src/base-client/components/common/XTree/index.js +3 -3
  259. package/src/base-client/components/common/XTree/index.md +36 -36
  260. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  261. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  262. package/src/base-client/components/common/XTreeOne/index.js +3 -3
  263. package/src/base-client/components/common/XUploadFilesView/index.vue +485 -485
  264. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  265. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  266. package/src/base-client/components/his/XCharge/XCharge.vue +238 -238
  267. package/src/base-client/components/his/XCheckbox/XCheckbox.vue +105 -105
  268. package/src/base-client/components/his/XCheckbox/index.md +253 -253
  269. package/src/base-client/components/his/XHDescriptions/XHDescriptions.vue +430 -430
  270. package/src/base-client/components/his/XHDescriptions/index.md +217 -217
  271. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +629 -629
  272. package/src/base-client/components/his/XHisEditor/diagnosisAutocomplete.js +263 -263
  273. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  274. package/src/base-client/components/his/XList/XList.vue +495 -495
  275. package/src/base-client/components/his/XQuestionnaire/XQuestionnaire.json +3 -3
  276. package/src/base-client/components/his/XQuestionnaire/XQuestionnaire.vue +106 -106
  277. package/src/base-client/components/his/XQuestionnaire/XQuestionnaireDemo.vue +51 -51
  278. package/src/base-client/components/his/XQuestionnaire/XQuestionnaireItem.vue +269 -269
  279. package/src/base-client/components/his/XRadio/XRadio.vue +125 -125
  280. package/src/base-client/components/his/XRadio/index.md +234 -234
  281. package/src/base-client/components/his/XSelect/XSelect.vue +72 -72
  282. package/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +234 -234
  283. package/src/base-client/components/his/XShiftSchedule/dome.vue +29 -29
  284. package/src/base-client/components/his/XSidebar/XSidebar.vue +240 -240
  285. package/src/base-client/components/his/XTextCard/XTextCard.vue +207 -207
  286. package/src/base-client/components/his/XTimeSelect/XTimeSelect.vue +162 -162
  287. package/src/base-client/components/his/XTimeSelect/XTimeSelectDemo.vue +23 -23
  288. package/src/base-client/components/his/XTitle/README.md +113 -113
  289. package/src/base-client/components/his/XTitle/XTitle.vue +123 -123
  290. package/src/base-client/components/his/XTreeRows/TreeNode.vue +107 -107
  291. package/src/base-client/components/his/XTreeRows/XTreeRows.vue +307 -307
  292. package/src/base-client/components/his/threeTestOrders/dome.vue +68 -68
  293. package/src/base-client/components/his/threeTestOrders/editor.vue +111 -111
  294. package/src/base-client/components/his/threeTestOrders/textBox.vue +457 -457
  295. package/src/base-client/components/his/threeTestOrders/threeTestOrders.vue +475 -475
  296. package/src/base-client/components/index.js +51 -51
  297. package/src/base-client/components/layout/XPageView/RenderRow.vue +88 -88
  298. package/src/base-client/components/layout/XPageView/XErrorView.vue +22 -22
  299. package/src/base-client/components/layout/XPageView/XPageRowTemplate.vue +37 -37
  300. package/src/base-client/components/layout/XPageView/XPageView.vue +223 -223
  301. package/src/base-client/components/layout/XPageView/XTab/XTab.vue +96 -96
  302. package/src/base-client/components/layout/XPageView/XTab/index.js +3 -3
  303. package/src/base-client/components/layout/XPageView/componentTypes.js +22 -22
  304. package/src/base-client/components/layout/XPageView/index.js +2 -2
  305. package/src/base-client/components/layout/XPageView/index.md +96 -96
  306. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  307. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  308. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  309. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  310. package/src/base-client/components/system/DictionaryDetailsView/index.js +3 -3
  311. package/src/base-client/components/system/DictionaryDetailsView/index.md +41 -41
  312. package/src/base-client/components/system/LogDetailsView/LogDetailsView.vue +376 -376
  313. package/src/base-client/components/system/LogDetailsView/index.js +3 -3
  314. package/src/base-client/components/system/LogDetailsView/index.md +41 -41
  315. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  316. package/src/base-client/components/system/QueryParamsDetailsView/index.js +3 -3
  317. package/src/base-client/components/ticket/TicketDetailsView/TicketDetailsView.vue +807 -807
  318. package/src/base-client/components/ticket/TicketDetailsView/index.js +3 -3
  319. package/src/base-client/components/ticket/TicketDetailsView/index.md +29 -29
  320. package/src/base-client/components/ticket/TicketDetailsView/part/TicketDetailsFlow.vue +260 -260
  321. package/src/base-client/components/ticket/TicketDetailsView/part/index.js +3 -3
  322. package/src/base-client/components/ticket/TicketSubmitSuccessView/TicketSubmitSuccessView.vue +532 -532
  323. package/src/base-client/components/ticket/TicketSubmitSuccessView/index.js +3 -3
  324. package/src/base-client/components/ticket/TicketSubmitSuccessView/index.md +29 -29
  325. package/src/base-client/plugins/AppData.js +126 -126
  326. package/src/base-client/plugins/Config.js +19 -19
  327. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  328. package/src/base-client/plugins/PagedList.js +177 -177
  329. package/src/base-client/plugins/Recording.js +258 -258
  330. package/src/base-client/plugins/__tests__/selectValueTypeHelper.test.js +154 -0
  331. package/src/base-client/plugins/authority-plugin.js +167 -167
  332. package/src/base-client/plugins/compatible/LoginServiceOA.js +20 -20
  333. package/src/base-client/plugins/i18n-extend.js +32 -32
  334. package/src/base-client/plugins/index.js +23 -23
  335. package/src/base-client/plugins/moment.js +8 -8
  336. package/src/base-client/plugins/selectValueTypeHelper.js +281 -0
  337. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  338. package/src/bootstrap.js +51 -51
  339. package/src/components/Charts/Bar.vue +62 -62
  340. package/src/components/Charts/ChartCard.vue +134 -134
  341. package/src/components/Charts/Liquid.vue +67 -67
  342. package/src/components/Charts/MiniArea.vue +39 -39
  343. package/src/components/Charts/MiniBar.vue +39 -39
  344. package/src/components/Charts/MiniProgress.vue +75 -75
  345. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  346. package/src/components/Charts/Radar.vue +68 -68
  347. package/src/components/Charts/RankList.vue +77 -77
  348. package/src/components/Charts/TagCloud.vue +113 -113
  349. package/src/components/Charts/TransferBar.vue +64 -64
  350. package/src/components/Charts/Trend.vue +82 -82
  351. package/src/components/Charts/chart.less +12 -12
  352. package/src/components/Charts/smooth.area.less +13 -13
  353. package/src/components/CodeMirror/inedx.vue +118 -118
  354. package/src/components/CodeMirror/setting.js +40 -40
  355. package/src/components/Ellipsis/Ellipsis.vue +65 -65
  356. package/src/components/Ellipsis/index.js +3 -3
  357. package/src/components/Ellipsis/index.md +38 -38
  358. package/src/components/FileImageItem/FileItem.vue +320 -320
  359. package/src/components/FileImageItem/FileItemGroup.vue +197 -197
  360. package/src/components/FileImageItem/ImageItem.vue +107 -107
  361. package/src/components/FileImageItem/index.js +4 -4
  362. package/src/components/FilePreview/FilePreview.vue +181 -181
  363. package/src/components/FilePreview/FilePreviewDemo.vue +30 -30
  364. package/src/components/FilePreview/index.js +3 -3
  365. package/src/components/HeightScanner/index.vue +615 -615
  366. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  367. package/src/components/NumberInfo/index.js +3 -3
  368. package/src/components/NumberInfo/index.less +54 -54
  369. package/src/components/NumberInfo/index.md +43 -43
  370. package/src/components/STable/README.md +341 -341
  371. package/src/components/STable/index.js +558 -558
  372. package/src/components/TableSetting/TableSetting.vue +143 -143
  373. package/src/components/TableSetting/index.js +3 -3
  374. package/src/components/Trend/Trend.vue +41 -41
  375. package/src/components/Trend/index.js +3 -3
  376. package/src/components/Trend/index.less +41 -41
  377. package/src/components/Trend/index.md +45 -45
  378. package/src/components/_util/util.js +46 -46
  379. package/src/components/cache/AKeepAlive.js +179 -179
  380. package/src/components/card/ChartCard.vue +79 -79
  381. package/src/components/chart/Bar.vue +60 -60
  382. package/src/components/chart/MiniArea.vue +67 -67
  383. package/src/components/chart/MiniBar.vue +59 -59
  384. package/src/components/chart/MiniProgress.vue +57 -57
  385. package/src/components/chart/Radar.vue +80 -80
  386. package/src/components/chart/RankingList.vue +60 -60
  387. package/src/components/chart/Trend.vue +79 -79
  388. package/src/components/chart/index.less +9 -9
  389. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  390. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  391. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  392. package/src/components/checkbox/index.js +9 -9
  393. package/src/components/exception/ExceptionPage.vue +70 -70
  394. package/src/components/exception/typeConfig.js +19 -19
  395. package/src/components/form/FormRow.vue +52 -52
  396. package/src/components/g2Charts/constants.js +202 -202
  397. package/src/components/g2Charts/demo.vue +808 -808
  398. package/src/components/g2Charts/designer.vue +228 -228
  399. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  400. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  401. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  402. package/src/components/g2Charts/index.vue +397 -397
  403. package/src/components/index.js +36 -36
  404. package/src/components/index.less +5 -5
  405. package/src/components/input/IInput.vue +66 -66
  406. package/src/components/menu/Contextmenu.vue +84 -84
  407. package/src/components/menu/SideMenu.vue +75 -75
  408. package/src/components/menu/index.less +38 -38
  409. package/src/components/menu/menu.js +273 -273
  410. package/src/components/page/header/PageHeader.vue +64 -64
  411. package/src/components/page/header/index.less +40 -40
  412. package/src/components/result/Result.vue +77 -77
  413. package/src/components/setting/Setting.vue +234 -234
  414. package/src/components/setting/SettingItem.vue +26 -26
  415. package/src/components/setting/i18n.js +117 -117
  416. package/src/components/table/StandardTable.vue +141 -141
  417. package/src/components/table/advance/ActionColumns.vue +158 -158
  418. package/src/components/table/advance/ActionSize.vue +45 -45
  419. package/src/components/table/advance/AdvanceTable.vue +275 -275
  420. package/src/components/table/advance/SearchArea.vue +355 -355
  421. package/src/components/table/advance/index.js +2 -2
  422. package/src/components/table/api/ApiTable.vue +50 -50
  423. package/src/components/task/TaskGroup.vue +80 -80
  424. package/src/components/task/TaskItem.vue +26 -26
  425. package/src/components/tool/AStepItem.vue +60 -60
  426. package/src/components/tool/AvatarList.vue +68 -68
  427. package/src/components/tool/DetailList.vue +157 -157
  428. package/src/components/tool/Drawer.vue +142 -142
  429. package/src/components/tool/FooterToolBar.vue +30 -30
  430. package/src/components/tool/HeadInfo.vue +35 -35
  431. package/src/components/tool/TagSelect.vue +83 -83
  432. package/src/components/tool/TagSelectOption.vue +33 -33
  433. package/src/components/transition/PageToggleTransition.vue +97 -97
  434. package/src/config/CreateQueryConfig.js +325 -325
  435. package/src/config/default/admin.config.js +18 -18
  436. package/src/config/default/animate.config.js +21 -21
  437. package/src/config/default/antd.config.js +89 -89
  438. package/src/config/default/index.js +6 -6
  439. package/src/config/default/setting.config.js +55 -55
  440. package/src/config/index.js +3 -3
  441. package/src/config/replacer/index.js +10 -10
  442. package/src/config/replacer/resolve.config.js +67 -67
  443. package/src/expression/ExpressionRunner.js +26 -26
  444. package/src/expression/TestExpression.js +509 -509
  445. package/src/expression/core/Delegate.js +115 -115
  446. package/src/expression/core/Expression.js +1358 -1358
  447. package/src/expression/core/Program.js +932 -932
  448. package/src/expression/core/Token.js +27 -27
  449. package/src/expression/enums/ExpressionType.js +81 -81
  450. package/src/expression/enums/TokenType.js +11 -11
  451. package/src/expression/exception/BreakWayException.js +2 -2
  452. package/src/expression/exception/ContinueWayException.js +2 -2
  453. package/src/expression/exception/ExpressionException.js +28 -28
  454. package/src/expression/exception/ReturnWayException.js +14 -14
  455. package/src/expression/exception/ServiceException.js +22 -22
  456. package/src/expression/instances/LogicConsole.js +44 -44
  457. package/src/expression/ts/ExpressionRunner.ts +28 -28
  458. package/src/expression/ts/TestExpression.ts +509 -509
  459. package/src/expression/ts/core/Delegate.ts +114 -114
  460. package/src/expression/ts/core/Expression.ts +1309 -1309
  461. package/src/expression/ts/core/Program.ts +950 -950
  462. package/src/expression/ts/core/Token.ts +29 -29
  463. package/src/expression/ts/enums/ExpressionType.ts +81 -81
  464. package/src/expression/ts/enums/TokenType.ts +13 -13
  465. package/src/expression/ts/exception/BreakWayException.ts +2 -2
  466. package/src/expression/ts/exception/ContinueWayException.ts +2 -2
  467. package/src/expression/ts/exception/ExpressionException.ts +28 -28
  468. package/src/expression/ts/exception/ReturnWayException.ts +14 -14
  469. package/src/expression/ts/exception/ServiceException.ts +22 -22
  470. package/src/expression/ts/instances/JSONArray.ts +48 -48
  471. package/src/expression/ts/instances/JSONObject.ts +109 -109
  472. package/src/expression/ts/instances/LogicConsole.ts +32 -32
  473. package/src/font-style/font.css +4 -4
  474. package/src/layouts/AdminLayout.vue +176 -176
  475. package/src/layouts/BlankView.vue +79 -79
  476. package/src/layouts/CommonLayout.vue +56 -56
  477. package/src/layouts/ComponentLayoutOne.vue +47 -47
  478. package/src/layouts/GridView.vue +43 -43
  479. package/src/layouts/PageLayout.vue +151 -151
  480. package/src/layouts/PageView.vue +55 -55
  481. package/src/layouts/SinglePageView.vue +136 -136
  482. package/src/layouts/footer/PageFooter.vue +49 -49
  483. package/src/layouts/header/AdminHeader.vue +132 -132
  484. package/src/layouts/header/HeaderAvatar.vue +64 -64
  485. package/src/layouts/header/HeaderNotice.vue +177 -177
  486. package/src/layouts/header/HeaderSearch.vue +67 -67
  487. package/src/layouts/header/InstitutionDetail.vue +181 -181
  488. package/src/layouts/header/index.less +92 -92
  489. package/src/layouts/tabs/TabsHead.vue +189 -189
  490. package/src/layouts/tabs/TabsView.vue +383 -383
  491. package/src/layouts/tabs/i18n.js +25 -25
  492. package/src/layouts/tabs/index.js +2 -2
  493. package/src/lib.js +1 -1
  494. package/src/logic/LogicRunner.js +62 -62
  495. package/src/logic/TestLogic.js +13 -13
  496. package/src/logic/plugins/common/DateTools.js +35 -35
  497. package/src/logic/plugins/common/VueTools.js +30 -30
  498. package/src/logic/plugins/index.js +7 -7
  499. package/src/logic/ts/LogicRunner.ts +67 -67
  500. package/src/logic/ts/TestLogic.ts +13 -13
  501. package/src/main.js +33 -33
  502. package/src/mixins/formValidationMixin.js +46 -46
  503. package/src/mock/common/activityData.js +32 -32
  504. package/src/mock/common/index.js +89 -89
  505. package/src/mock/common/reportData.js +20 -20
  506. package/src/mock/common/tableData.js +118 -118
  507. package/src/mock/extend/index.js +84 -84
  508. package/src/mock/goods/index.js +108 -108
  509. package/src/mock/index.js +12 -12
  510. package/src/mock/project/index.js +17 -17
  511. package/src/mock/user/current.js +13 -13
  512. package/src/mock/user/login.js +39 -39
  513. package/src/mock/user/routes.js +61 -61
  514. package/src/mock/workplace/index.js +15 -15
  515. package/src/pages/DefaultExample/index.vue +77 -77
  516. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  517. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  518. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  519. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  520. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  521. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  522. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  523. package/src/pages/DynamicStatistics/index.vue +282 -282
  524. package/src/pages/Example/childIndex.vue +15 -15
  525. package/src/pages/Example/index.vue +30 -30
  526. package/src/pages/LogicCallExample/index.vue +46 -46
  527. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  528. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  529. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  530. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  531. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  532. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  533. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  534. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  535. package/src/pages/Recording/index.vue +77 -77
  536. package/src/pages/ReportGrid/index.vue +76 -76
  537. package/src/pages/ReportView.vue +50 -50
  538. package/src/pages/ServiceReview/index.vue +284 -284
  539. package/src/pages/SubExample/index.vue +26 -26
  540. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +47 -47
  541. package/src/pages/WorkflowDetail/WorkFlowDemo2.vue +204 -204
  542. package/src/pages/WorkflowDetail/WorkFlowDemo3.vue +203 -225
  543. package/src/pages/WorkflowDetail/WorkflowDetail.vue +391 -391
  544. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +388 -388
  545. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  546. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +415 -415
  547. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformationDetails.vue +276 -276
  548. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +1766 -1766
  549. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +975 -975
  550. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowPreview.vue +109 -109
  551. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +929 -929
  552. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +222 -222
  553. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +243 -243
  554. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowListResolution.vue +248 -248
  555. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +188 -188
  556. package/src/pages/WorkflowDetail/WorkflowPageDetail/components/WorkflowPersonSelector.vue +109 -109
  557. package/src/pages/WorkflowDetail/WorkflowPageDetail/worklog.vue +97 -97
  558. package/src/pages/XPageViewExample/index.vue +149 -149
  559. package/src/pages/XReportView/index.vue +64 -64
  560. package/src/pages/XTreeOneProExample/index.vue +67 -67
  561. package/src/pages/addressSelect/addressDemo.vue +24 -24
  562. package/src/pages/addressSelect/index.vue +270 -270
  563. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  564. package/src/pages/dashboard/workplace/i18n.js +40 -40
  565. package/src/pages/dashboard/workplace/index.js +2 -2
  566. package/src/pages/dashboard/workplace/index.less +59 -59
  567. package/src/pages/exception/403.vue +21 -21
  568. package/src/pages/exception/404.vue +24 -24
  569. package/src/pages/exception/500.vue +21 -21
  570. package/src/pages/login/Login.vue +380 -380
  571. package/src/pages/login/LoginV3.vue +389 -389
  572. package/src/pages/login/index.js +2 -2
  573. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  574. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  575. package/src/pages/report/ReportTable.js +124 -124
  576. package/src/pages/report/ReportTableHome.vue +28 -28
  577. package/src/pages/resourceManage/depListManage.vue +23 -23
  578. package/src/pages/resourceManage/funListManage.vue +23 -23
  579. package/src/pages/resourceManage/index.js +15 -15
  580. package/src/pages/resourceManage/orgListManage.vue +98 -98
  581. package/src/pages/resourceManage/resourceManageMain.vue +57 -57
  582. package/src/pages/resourceManage/roleListManage.vue +23 -23
  583. package/src/pages/resourceManage/staffListManage.vue +23 -23
  584. package/src/pages/system/dictionary/index.vue +44 -44
  585. package/src/pages/system/file/Info.vue +56 -56
  586. package/src/pages/system/file/index.vue +317 -317
  587. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  588. package/src/pages/system/monitor/operLog/index.vue +37 -37
  589. package/src/pages/system/settings/index.vue +126 -126
  590. package/src/pages/system/settings/modifyPassword.vue +117 -117
  591. package/src/pages/system/ticket/index.vue +480 -480
  592. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  593. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  594. package/src/pages/userInfoDetailManage/FillCardRecordQuery/index.vue +77 -77
  595. package/src/pages/userInfoDetailManage/FillGasRecordQuery/index.vue +75 -75
  596. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  597. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  598. package/src/pages/userInfoDetailManage/InsuranceDetailQuery/index.vue +64 -64
  599. package/src/pages/userInfoDetailManage/MachineRecordQuery/index.vue +75 -75
  600. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  601. package/src/pages/userInfoDetailManage/OtherChargeRecordQuery/index.vue +75 -75
  602. package/src/pages/userInfoDetailManage/PriceAdjustments/index.vue +64 -64
  603. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  604. package/src/pages/userInfoDetailManage/UserChargeRecordQuery/index.vue +94 -94
  605. package/src/pages/userInfoDetailManage/UserException/index.vue +64 -64
  606. package/src/pages/userInfoDetailManage/UserHandRecordQuery/index.vue +87 -87
  607. package/src/pages/userInfoDetailManage/UserRecordQuery/index.vue +74 -74
  608. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  609. package/src/pages/userInfoDetailManage/index.vue +290 -290
  610. package/src/pages/userInfoDetailManage/uploadFilesHistory/ImagePreview.vue +101 -101
  611. package/src/pages/userInfoDetailManage/uploadFilesHistory/index.vue +129 -129
  612. package/src/pages/userInfoDetailManage/userInfoDetailQueryTabs.vue +144 -144
  613. package/src/plugins/EventLogPlugin.js +33 -33
  614. package/src/plugins/FindParentsData.js +17 -17
  615. package/src/plugins/HiPrintPlugin.js +164 -164
  616. package/src/router/async/config.async.js +35 -35
  617. package/src/router/async/router.map.js +126 -130
  618. package/src/router/guards.js +262 -262
  619. package/src/router/i18n.js +57 -57
  620. package/src/router/index.js +27 -27
  621. package/src/router.js +17 -17
  622. package/src/services/DataModel.js +30 -30
  623. package/src/services/LodopFuncs.js +137 -137
  624. package/src/services/api/DictionaryDetailsViewApi.js +6 -6
  625. package/src/services/api/LogDetailsViewApi.js +10 -10
  626. package/src/services/api/QueryParamsDetailsViewApi.js +6 -6
  627. package/src/services/api/TicketDetailsViewApi.js +46 -46
  628. package/src/services/api/cas.js +79 -79
  629. package/src/services/api/common.js +346 -346
  630. package/src/services/api/entity.js +18 -18
  631. package/src/services/api/index.js +17 -17
  632. package/src/services/api/logininfor/index.js +6 -6
  633. package/src/services/api/manage.js +8 -8
  634. package/src/services/api/restTools.js +215 -215
  635. package/src/services/api/workFlow.js +57 -57
  636. package/src/services/apiService.js +16 -16
  637. package/src/services/dataSource.js +12 -12
  638. package/src/services/index.js +7 -7
  639. package/src/services/user.js +92 -92
  640. package/src/services/v3Api.js +116 -116
  641. package/src/store/index.js +5 -5
  642. package/src/store/modules/account.js +115 -115
  643. package/src/store/modules/index.js +5 -5
  644. package/src/store/modules/lowCode.js +33 -33
  645. package/src/store/modules/setting.js +119 -119
  646. package/src/store/mutation-types.js +4 -4
  647. package/src/theme/antd/ant-menu.less +2 -2
  648. package/src/theme/antd/ant-message.less +3 -3
  649. package/src/theme/antd/ant-table.less +22 -22
  650. package/src/theme/antd/ant-time-picker.less +3 -3
  651. package/src/theme/antd/index.less +3 -3
  652. package/src/theme/default/color.less +43 -43
  653. package/src/theme/default/index.less +3 -3
  654. package/src/theme/default/nprogress.less +76 -76
  655. package/src/theme/default/style.less +58 -58
  656. package/src/theme/global.less +279 -279
  657. package/src/theme/index.less +5 -5
  658. package/src/theme/reportTable.less +58 -58
  659. package/src/theme/theme.less +1 -1
  660. package/src/utils/EncryptUtil.js +162 -162
  661. package/src/utils/Objects.js +25 -25
  662. package/src/utils/authority-utils.js +85 -85
  663. package/src/utils/axios-interceptors.js +100 -100
  664. package/src/utils/colors.js +107 -107
  665. package/src/utils/common.js +10 -10
  666. package/src/utils/errorCode.js +6 -6
  667. package/src/utils/excel/Blob.js +180 -180
  668. package/src/utils/excel/Export2Excel.js +141 -141
  669. package/src/utils/filter.js +21 -21
  670. package/src/utils/formatter.js +74 -74
  671. package/src/utils/htmlToPDF.js +108 -108
  672. package/src/utils/htmlToPDFApi.js +5 -5
  673. package/src/utils/i18n.js +80 -80
  674. package/src/utils/indexedDB.js +549 -549
  675. package/src/utils/login.js +188 -188
  676. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  677. package/src/utils/lowcode/lowcodeLog.js +29 -29
  678. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  679. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  680. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  681. package/src/utils/map-utils.js +47 -47
  682. package/src/utils/microAppUtils.js +49 -49
  683. package/src/utils/reg.js +95 -95
  684. package/src/utils/request.js +395 -395
  685. package/src/utils/routerUtil.js +553 -553
  686. package/src/utils/runEvalFunction.js +14 -14
  687. package/src/utils/theme-color-replacer-extend.js +92 -92
  688. package/src/utils/themeUtil.js +100 -100
  689. package/src/utils/util.js +329 -329
  690. package/src/utils/waterMark.js +31 -31
  691. package/test/Tree.spec.js +168 -168
  692. package/test/myDialog.spec.js +47 -47
  693. package/test/request.test.js +17 -17
  694. package/test/util.test.js +53 -53
  695. package/test/v3Api.test.js +1984 -1984
  696. package/tests/unit/ReportTable.spec.js +16 -16
  697. package/vue.config.js +222 -222
  698. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
@@ -1,1005 +1,1005 @@
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 === 'datePicker'">
41
- <template v-if="cell.customFunction === undefined">
42
- {{ getDeepObject(configData, cell.dataIndex) }}
43
- </template>
44
- <template v-else>
45
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
46
- </template>
47
- </template>
48
- <template v-else-if="cell.type === 'timePicker'">
49
- <template v-if="cell.customFunction === undefined">
50
- {{ getDeepObject(configData, cell.dataIndex) }}
51
- </template>
52
- <template v-else>
53
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
54
- </template>
55
- </template>
56
- <template v-else-if="cell.type === 'inputs'">
57
- <template v-if="cell.customFunction === undefined">
58
- {{ showSubRowValue(cell) }}
59
- </template>
60
- <template v-else>
61
- {{ deserializeFunctionAndRun(cell.customFunction, showSubRowValue(cell), config) }}
62
- </template>
63
- </template>
64
- <template v-else-if="cell.type === 'list'">
65
- <template v-if="listIndex === 0">
66
- <span style="font-weight: bold">{{ cell.listHead }}</span>
67
- </template>
68
- <template v-else-if="cell.listType === 'input'">
69
- {{ getDeepObject(configData, cell.dataIndex)[listIndex] }}
70
- </template>
71
- <template v-else-if="cell.listType === 'value'">
72
- {{ cell.content[listIndex] }}
73
- </template>
74
- <template v-else-if="cell.listType === 'variable'">
75
- {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
76
- </template>
77
- </template>
78
- <template v-else-if="cell.type === 'images'">
79
- <template v-if="getDeepObject(configData.images, cell.dataIndex) === undefined || getDeepObject(configData.images, cell.dataIndex).length === 0">
80
- <template v-if="getDeepObject(configData, cell.dataIndex) === undefined || getDeepObject(configData, cell.dataIndex).length === 0">
81
- <span>无</span>
82
- </template>
83
- <template v-else>
84
- <template v-if="typeof getDeepObject(configData, cell.dataIndex) === 'object'">
85
- <div style="display: flex; align-items: end; justify-content: space-evenly; flex-wrap: wrap">
86
- <template v-for="(img,imgIndex) in getDeepObject(configData, cell.dataIndex)">
87
- <template v-if="showImgInCell">
88
- <div :key="imgIndex">
89
- <img :src="img.url" alt="图片"/>
90
- <p>{{ img.name }}</p>
91
- </div>
92
- </template>
93
- <template v-else>
94
- <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
95
- </template>
96
- </template>
97
- </div>
98
- </template>
99
- <template v-else>
100
- <img :src="getDeepObject(configData, cell.dataIndex)" alt="图片"/>
101
- <p style="margin-right: 5%">{{ formatImgStr(getDeepObject(configData, cell.dataIndex))[0].name }}</p>
102
- </template>
103
- </template>
104
- </template>
105
- <template v-else v-for="(img,imgIndex) in getDeepObject(configData.images, cell.dataIndex)">
106
- <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
107
- </template>
108
- </template>
109
- </td>
110
- </template>
111
- <template v-else>
112
- <td
113
- v-for="(cell, cellIndex) in columns"
114
- :key="cellIndex"
115
- :class=" calcTDBorder(cell.noBoarder) "
116
- :colspan="cell.colSpan ? cell.colSpan : undefined"
117
- :style="determineCellStyle(cell)"
118
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
119
- <template v-if="cell.type === 'column'">
120
- {{ cell.text }}
121
- </template>
122
- <template v-else-if="cell.type === 'value'">
123
- <template v-if="cell.customFunction === undefined">
124
- {{ cell.value }}
125
- </template>
126
- <template v-else>
127
- {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
128
- </template>
129
- </template>
130
- <template v-else-if="cell.type === 'increment'">
131
- <template v-if="cell.customFunction === undefined">
132
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
133
- </template>
134
- <template v-else>
135
- {{
136
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
137
- }}
138
- </template>
139
- </template>
140
- <template v-else-if="cell.type === 'input'">
141
- <template v-if="cell.customFunction === undefined">
142
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
143
- </template>
144
- <template v-else>
145
- {{
146
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
147
- }}
148
- </template>
149
- </template>
150
- <template v-else-if="cell.type === 'datePicker'">
151
- <template v-if="cell.customFunction === undefined">
152
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
153
- </template>
154
- <template v-else>
155
- {{
156
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
157
- }}
158
- </template>
159
- </template>
160
- <template v-else-if="cell.type === 'timePicker'">
161
- <template v-if="cell.customFunction === undefined">
162
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
163
- </template>
164
- <template v-else>
165
- {{
166
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
167
- }}
168
- </template>
169
- </template>
170
- <template v-else-if="cell.type === 'inputs'">
171
- <template v-if="cell.customFunction === undefined">
172
- {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
173
- </template>
174
- <template v-else>
175
- {{
176
- deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
177
- }}
178
- </template>
179
- </template>
180
- </td>
181
- </template>
182
- </template>
183
- <!-- 不是动态行 -->
184
- <template v-else-if="!inputColumns">
185
- <td
186
- v-for="(cell, cellIndex) in columns"
187
- :key="cellIndex"
188
- :class=" calcTDBorder(cell.noBoarder) "
189
- :colspan="cell.colSpan ? cell.colSpan : undefined"
190
- :style="determineCellStyle(cell)"
191
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
192
- <template v-if="cell.type === 'column'">
193
- <template v-if="cell.customFunction">
194
- {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
195
- </template>
196
- <template v-else>
197
- {{ cell.text }}
198
- </template>
199
- </template>
200
- <template v-else-if="cell.type === 'placeHolderColumn'">
201
- <!-- 占位 -->
202
- </template>
203
- <template v-else-if="cell.type === 'value'">
204
- {{ cell.value }}
205
- </template>
206
- <template v-else-if="cell.type === 'curDateInput'">
207
- <a-button type="dashed" v-if="configData[cell.dataIndex]">
208
- {{ configData[cell.dataIndex] }}
209
- </a-button>
210
- <a-button
211
- v-if="!configData[cell.dataIndex]"
212
- type="primary"
213
- @click="getNowDate(cell.dataIndex)"
214
- >{{ cell.text || '确认' }}
215
- </a-button>
216
- </template>
217
- <template v-else-if="cell.type === 'datePicker'">
218
- <div>
219
- <a-date-picker
220
- @change="handleDatePickerChange($event, cell.dataIndex, cell)"
221
- :value="formatDateValue(configData[cell.dataIndex])"
222
- format="YYYY-MM-DD"
223
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
224
- :disabled="cell.inputReadOnly===true"
225
- :class="{'required-field-error': isFieldRequired(cell) && !configData[cell.dataIndex]}"/>
226
- <div v-if="isFieldRequired(cell) && !configData[cell.dataIndex]" class="required-message">
227
- {{ getRequiredMessage(cell, 'datePicker') }}
228
- </div>
229
- </div>
230
- </template>
231
- <template v-else-if="cell.type === 'timePicker'">
232
- <div>
233
- <a-date-picker
234
- @change="handleTimePickerChange($event, cell.dataIndex, cell)"
235
- :value="formatDateValue(configData[cell.dataIndex])"
236
- format="YYYY-MM-DD HH:mm:ss"
237
- show-time
238
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
239
- :disabled="cell.inputReadOnly===true"
240
- :class="{'required-field-error': isFieldRequired(cell) && !configData[cell.dataIndex]}"/>
241
- <div v-if="isFieldRequired(cell) && !configData[cell.dataIndex]" class="required-message">
242
- {{ getRequiredMessage(cell, 'timePicker') }}
243
- </div>
244
- </div>
245
- </template>
246
- <template v-else-if="cell.type === 'signature'">
247
- <img :src="configData[cell.dataIndex]" alt="签名加载失败" style="max-height: 2rem">
248
- <a-button v-if="!configData[cell.dataIndex]" type="dashed" >需要在手机端签名 </a-button>
249
- </template>
250
- <template v-else-if="cell.type === 'input'">
251
- <div>
252
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
253
- <a-input
254
- @change="handleInputDeepChange($event, cell.dataIndex, cell)"
255
- v-model="config.tempData[cell.dataIndex]"
256
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
257
- :disabled="cell.inputReadOnly === true"
258
- :class="{'required-field-error': isFieldRequired(cell) && !config.tempData[cell.dataIndex]}"/>
259
- </template>
260
- <template v-else>
261
- <a-input
262
- @change="handleInputChange($event, cell.dataIndex, cell)"
263
- v-model="configData[cell.dataIndex]"
264
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
265
- :disabled="cell.inputReadOnly === true"
266
- :class="{'required-field-error': isFieldRequired(cell) && !configData[cell.dataIndex]}"/>
267
- </template>
268
- <div v-if="isFieldRequired(cell) && !getInputValue(cell)" class="required-message">
269
- {{ getRequiredMessage(cell, 'input') }}
270
- </div>
271
- </div>
272
- </template>
273
- <template v-else-if="cell.type === 'inputs'">
274
- <template v-if="cell.inputReadOnly === true">
275
- <div class="inputsDiv">
276
- <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
277
- <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
278
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
279
- <a-input
280
- @change="handleInputDeepChange($event, cell.dataIndex, cell)"
281
- v-model="config.tempData[cell.dataIndex][index]"
282
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
283
- :disabled="true"/>
284
- </template>
285
- <template v-else>
286
- <a-input
287
- v-model="configData[cell.dataIndex][index]"
288
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
289
- :disabled="true"/>
290
- </template>
291
- <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
292
- </div>
293
- </div>
294
- </template>
295
- <template v-else>
296
- <div class="inputsDiv">
297
- <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
298
- <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
299
- <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
300
- <a-input
301
- @change="handleInputDeepChange($event, cell.dataIndex, cell)"
302
- v-model="config.tempData[cell.dataIndex][index]"
303
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
304
- </template>
305
- <template v-else>
306
- <a-input
307
- v-model="configData[cell.dataIndex][index]"
308
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
309
- </template>
310
- <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
311
- </div>
312
- </div>
313
- </template>
314
- </template>
315
- <template v-else-if="cell.type === 'list'">
316
- <template v-if="listIndex === 0">
317
- <span style="font-weight: bold">{{ cell.listHead }}</span>
318
- </template>
319
- <template v-else-if="cell.listType === 'input'">
320
- <a-input
321
- v-model="configData[cell.dataIndex][listIndex]"
322
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
323
- </template>
324
- <template v-else-if="cell.listType === 'value'">
325
- {{ cell.content[listIndex] }}
326
- </template>
327
- <template v-else-if="cell.listType === 'variable'">
328
- {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
329
- </template>
330
- </template>
331
- <template v-else-if="cell.type === 'images'">
332
- <div>
333
- <template v-if="configData.images[cell.dataIndex]?.length > 0">
334
- <upload
335
- :model="uploadParams"
336
- :img-prefix="imgPrefix"
337
- :service-name="serverName"
338
- :images="checkImg(cell.dataIndex, 'configData')"
339
- :outer-container-index="cell.dataIndex"
340
- @setFiles="(...args) => {setImages(args, 'configData')}"
341
- :upload-style="'simple'"
342
- />
343
- </template>
344
- <template v-else>
345
- <upload
346
- :model="uploadParams"
347
- :img-prefix="imgPrefix"
348
- :service-name="serverName"
349
- :images="checkImg(cell.dataIndex, 'config')"
350
- :outer-container-index="cell.dataIndex"
351
- @setFiles="(...args) => {setImages(args, 'config', cell.dataIndex)}"
352
- :upload-style="'simple'"
353
- />
354
- </template>
355
- </div>
356
- </template>
357
- </td>
358
- </template>
359
- <!-- 动态行插入按钮 -->
360
- <template v-else-if="inputColumnsButton">
361
- <td :colspan="maxColSpan" :class="calcTDBorder()">
362
- <a-button-group>
363
- <a-button @click="addData(columns[0].dataIndex, columns)">
364
- <a-icon type="plus"/>
365
- </a-button>
366
- <a-button @click="removeData(columns[0].dataIndex)">
367
- <a-icon type="minus"/>
368
- </a-button>
369
- </a-button-group>
370
- </td>
371
- </template>
372
- <!-- 其他行 -->
373
- <template v-else>
374
- <td
375
- v-for="(cell, cellIndex) in columns"
376
- :key="cellIndex"
377
- :class=" calcTDBorder(cell.noBoarder) "
378
- :colspan="cell.colSpan ? cell.colSpan : undefined"
379
- :style="determineCellStyle(cell)"
380
- :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
381
- <template v-if="cell.type === 'column'">
382
- {{ cell.text }}
383
- </template>
384
- <template v-else-if="cell.type === 'value'">
385
- {{ cell.value }}
386
- </template>
387
- <template v-else-if="cell.type === 'curDateInput'">
388
- <a-button type="dashed" v-if="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]">
389
- {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
390
- </a-button>
391
- <a-button
392
- v-if="!configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
393
- type="primary"
394
- @click="getNowDate(inputColumnsDefinitionIndex,cell.dataIndex)"
395
- >{{ cell.text || '确认' }}
396
- </a-button>
397
- </template>
398
- <template v-else-if="cell.type === 'datePicker'">
399
- <div>
400
- <a-date-picker
401
- @change="handleArrayDatePickerChange($event, inputColumnsDefinitionIndex, cell.dataIndex, cell)"
402
- :value="formatDateValue(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
403
- format="YYYY-MM-DD"
404
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
405
- :disabled="cell.inputReadOnly === true"
406
- :class="{'required-field-error': isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]}"/>
407
- <div v-if="isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]" class="required-message">
408
- {{ getRequiredMessage(cell, 'datePicker') }}
409
- </div>
410
- </div>
411
- </template>
412
- <template v-else-if="cell.type === 'timePicker'">
413
- <div>
414
- <a-date-picker
415
- @change="handleArrayTimePickerChange($event, inputColumnsDefinitionIndex, cell.dataIndex, cell)"
416
- :value="formatDateValue(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
417
- format="YYYY-MM-DD HH:mm:ss"
418
- show-time
419
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
420
- :disabled="cell.inputReadOnly === true"
421
- :class="{'required-field-error': isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]}"/>
422
- <div v-if="isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]" class="required-message">
423
- {{ getRequiredMessage(cell, 'timePicker') }}
424
- </div>
425
- </div>
426
- </template>
427
- <template v-else-if="cell.type === 'signature'">
428
- <img :src="configData[cell.dataIndex]" alt="签名加载失败" style="max-height: 2rem">
429
- <a-button v-if="!configData[cell.dataIndex]" type="dashed" >需要在手机端签名</a-button>
430
- </template>
431
- <template v-else-if="cell.type === 'increment'">
432
- {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
433
- </template>
434
- <template v-else-if="cell.type === 'input'">
435
- <div>
436
- <a-input
437
- @change="handleArrayInputChange($event, inputColumnsDefinitionIndex, cell.dataIndex, cell)"
438
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
439
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
440
- :disabled="cell.inputReadOnly === true"
441
- :class="{'required-field-error': isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]}"/>
442
- <div v-if="isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]" class="required-message">
443
- {{ getRequiredMessage(cell, 'input') }}
444
- </div>
445
- </div>
446
- </template>
447
- <template v-else-if="cell.type === 'inputs'">
448
- <template v-if="cell.inputReadOnly === true">
449
- <a-input
450
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
451
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
452
- :disabled="true"/>
453
- </template>
454
- <template v-else>
455
- <a-input
456
- v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
457
- :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
458
- </template>
459
- </template>
460
- </td>
461
- </template>
462
- </tr>
463
- </template>
464
-
465
- <script>
466
- import Upload from '@vue2-client/base-client/components/common/Upload'
467
- import { formatDate } from '@vue2-client/utils/util'
468
- import { nanoid } from 'nanoid'
469
- import moment from 'moment'
470
-
471
- export default {
472
- name: 'XReportTrGroup',
473
- components: {
474
- Upload
475
- },
476
- props: {
477
- // 每一行的配置
478
- columns: {
479
- type: Array,
480
- required: true
481
- },
482
- showImgInCell: {
483
- type: Boolean,
484
- default: false
485
- },
486
- config: {
487
- type: Object,
488
- default: function () {
489
- return {}
490
- }
491
- },
492
- // 命名空间
493
- serverName: {
494
- type: String,
495
- default: 'af-system'
496
- },
497
- // 原始配置
498
- configData: {
499
- type: Object,
500
- required: true
501
- },
502
- // 是否为动态行
503
- inputColumns: {
504
- type: Boolean,
505
- default: false
506
- },
507
- // 是否为动态行按钮
508
- inputColumnsButton: {
509
- type: Boolean,
510
- default: false
511
- },
512
- // 动态行的Index
513
- inputColumnsDefinitionIndex: {
514
- type: Number,
515
- default: undefined
516
- },
517
- // 是否为展示行
518
- display: {
519
- type: Boolean,
520
- default: false
521
- },
522
- // list类型的下标,用于遍历列表时,获取对应的数据
523
- listIndex: {
524
- type: Number,
525
- default: undefined
526
- },
527
- // 表格没有上边框
528
- noTopBorder: {
529
- type: Boolean,
530
- default: false
531
- },
532
- // 图片是否使用OSS来保存
533
- useOssForImg: {
534
- type: Boolean,
535
- default: true
536
- },
537
- // 图片上传后添加前缀
538
- imgPrefix: {
539
- type: String,
540
- default: undefined
541
- }
542
- },
543
- data () {
544
- return {
545
- maxColSpan: 12,
546
- uploadParams: {
547
- type: 'image',
548
- accept: ['*'],
549
- resUploadStock: 1,
550
- pathKey: 'cs'
551
- }
552
- // tableConfig: {}
553
- }
554
- },
555
- methods: {
556
- updateImg (data) {
557
- this.$emit('updateImg', data)
558
- },
559
- formatImgStr (str) {
560
- const result = []
561
- if (str !== '') {
562
- const arr = str.split('/')
563
- result.push({
564
- uid: nanoid(6),
565
- url: str,
566
- name: arr[arr.length - 1],
567
- status: 'done'
568
- })
569
- }
570
- this.uploadParams.acceptCount = 1
571
- return result
572
- },
573
- checkImg (index, type) {
574
- let target
575
- if (type === 'configData') {
576
- target = this.configData.images[index]
577
- } else {
578
- target = this.config.tempData[index]
579
- }
580
- if (typeof target !== 'object') {
581
- return this.formatImgStr(target)
582
- }
583
- target.forEach(obj => {
584
- if (obj.uid === undefined) {
585
- obj.uid = obj.id.toString()
586
- }
587
- if (obj.url === undefined) {
588
- if (obj.path) {
589
- obj.url = obj.path
590
- }
591
- }
592
- if (obj.name === undefined) {
593
- const withOutEndFix = obj.url.split('.')[0]
594
- const temp = withOutEndFix.split('/')
595
- obj.name = temp[temp.length - 1]
596
- }
597
- if (obj.status === undefined) {
598
- obj.status = 'done'
599
- }
600
- })
601
- return target
602
- },
603
- // 判断单元格样式
604
- determineCellStyle (cell, color = '#000', borderWidth = '1px') {
605
- // 如果声明了borderColor
606
- if (this.config.style.borderColor) {
607
- color = this.config.style.borderColor
608
- }
609
- // 如果声明了borderWidth
610
- if (this.config.style.borderWidth) {
611
- borderWidth = this.config.style.borderWidth
612
- }
613
- // 普通带边框单元格
614
- const withBorder = {
615
- border: borderWidth + ' solid ' + color,
616
- padding: '8px'
617
- }
618
- // 只有左右边框的单元格
619
- const noBorder = {
620
- borderLeft: borderWidth + ' solid ' + color,
621
- borderRight: borderWidth + ' solid ' + color,
622
- padding: '8px'
623
- }
624
- // 只没有上边框的单元格
625
- const NoTopBorder = {
626
- borderTopStyle: 'none',
627
- borderLeft: borderWidth + ' solid ' + color,
628
- borderRight: borderWidth + ' solid ' + color,
629
- borderBottom: borderWidth + ' solid ' + color,
630
- padding: '8px'
631
- }
632
- let result = {}
633
- // 如果表格也声明了样式,用表格样式将样式覆盖
634
- if (cell.style) {
635
- if (cell.noBorder) {
636
- result = { ...noBorder, ...cell.style }
637
- } else {
638
- if (this.noTopBorder) {
639
- result = { ...NoTopBorder, ...cell.style }
640
- } else {
641
- result = { ...withBorder, ...cell.style }
642
- }
643
- }
644
- return result
645
- }
646
- // 如果表头声明了样式,则用其将基础样式覆盖
647
- if (cell.type === 'column') {
648
- if (this.config.labelStyle !== undefined) {
649
- if (cell.noBorder) {
650
- result = { ...noBorder, ...this.config.labelStyle }
651
- } else {
652
- if (this.noTopBorder) {
653
- result = { ...NoTopBorder, ...this.config.labelStyle }
654
- } else {
655
- result = { ...withBorder, ...this.config.labelStyle }
656
- }
657
- }
658
- return result
659
- }
660
- }
661
- if (cell.noBorder) {
662
- result = { ...noBorder }
663
- } else {
664
- if (this.noTopBorder) {
665
- result = { ...NoTopBorder }
666
- } else {
667
- result = { ...withBorder }
668
- }
669
- }
670
- return result
671
- },
672
- // 表格中数据key含有@@@,需要手动触发更新
673
- handleInputDeepChange (event, dataIndex, cell = null) {
674
- // 如果字段必填且有值,触发重新渲染以移除错误样式
675
- if (cell && this.isFieldRequired(cell) && event.target.value) {
676
- this.$forceUpdate()
677
- }
678
- this.$forceUpdate()
679
- },
680
- // 处理普通input变化
681
- handleInputChange (event, dataIndex, cell = null) {
682
- // 如果字段必填且有值,触发重新渲染以移除错误样式
683
- if (cell && this.isFieldRequired(cell) && event.target.value) {
684
- this.$forceUpdate()
685
- }
686
- },
687
- // 处理动态行中input变化
688
- handleArrayInputChange (event, arrayIndex, dataIndex, cell = null) {
689
- // 如果字段必填且有值,触发重新渲染以移除错误样式
690
- if (cell && this.isFieldRequired(cell) && event.target.value) {
691
- this.$forceUpdate()
692
- }
693
- },
694
- // 获取input的值,用于必填校验
695
- getInputValue (cell) {
696
- if (cell.dataIndex.indexOf('@@@') !== -1) {
697
- return this.config.tempData[cell.dataIndex]
698
- } else {
699
- return this.configData[cell.dataIndex]
700
- }
701
- },
702
- // 路径中含有@@@的key,将其解析,并返回其数据
703
- getDeepObject (obj, strPath) {
704
- const arr = strPath.split('@@@')
705
- let result = obj[arr[0]]
706
- arr.shift()
707
- try {
708
- while (arr.length > 0) {
709
- result = result[arr[0]]
710
- arr.shift()
711
- }
712
- } catch (e) {
713
- result = undefined
714
- }
715
- return result
716
- },
717
- // 获取当前日期
718
- getNowDate (index1, index2) {
719
- if (index2) {
720
- // @click="getNowDate(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
721
- this.configData.arr[index1][index2] = formatDate('now')
722
- } else {
723
- this.configData[index1] = formatDate('now')
724
- }
725
- this.configData = Object.assign({}, this.configData)
726
- },
727
- // 通用的日期时间选择器变化处理方法
728
- handleDateTimePickerChange (date, dataIndex, format, arrayIndex = null, cell = null) {
729
- const dateStr = date ? moment(date).format(format) : ''
730
-
731
- if (arrayIndex !== null) {
732
- // 处理动态行中的日期时间选择器
733
- this.configData.arr[arrayIndex][dataIndex] = dateStr
734
- } else if (dataIndex.indexOf('@@@') !== -1) {
735
- // 处理深层嵌套的数据
736
- this.handleInputDeepChange({ target: { value: dateStr } }, dataIndex, cell)
737
- } else {
738
- // 处理普通的数据
739
- this.configData[dataIndex] = dateStr
740
- }
741
-
742
- // 如果字段必填且有值,触发重新渲染以移除错误样式
743
- if (cell && this.isFieldRequired(cell) && dateStr) {
744
- this.$forceUpdate()
745
- }
746
-
747
- this.configData = Object.assign({}, this.configData)
748
- },
749
- // 日期选择器变化处理(YYYY-MM-DD格式)
750
- handleDatePickerChange (date, dataIndex, cell = null) {
751
- this.handleDateTimePickerChange(date, dataIndex, 'YYYY-MM-DD', null, cell)
752
- },
753
- // 时间选择器变化处理(YYYY-MM-DD HH:mm:ss格式)
754
- handleTimePickerChange (date, dataIndex, cell = null) {
755
- this.handleDateTimePickerChange(date, dataIndex, 'YYYY-MM-DD HH:mm:ss', null, cell)
756
- },
757
- // 动态行中日期选择器变化处理
758
- handleArrayDatePickerChange (date, arrayIndex, dataIndex, cell = null) {
759
- this.handleDateTimePickerChange(date, dataIndex, 'YYYY-MM-DD', arrayIndex, cell)
760
- },
761
- // 动态行中时间选择器变化处理
762
- handleArrayTimePickerChange (date, arrayIndex, dataIndex, cell = null) {
763
- this.handleDateTimePickerChange(date, dataIndex, 'YYYY-MM-DD HH:mm:ss', arrayIndex, cell)
764
- },
765
- // 判断字段是否必填
766
- isFieldRequired (cell) {
767
- return cell && cell.required === true
768
- },
769
- // 获取必填字段的提示信息
770
- getRequiredMessage (cell, fieldType) {
771
- if (cell.requiredMessage) {
772
- return cell.requiredMessage
773
- }
774
-
775
- // 默认提示信息
776
- const defaultMessages = {
777
- datePicker: '请选择日期',
778
- timePicker: '请选择日期时间',
779
- input: '请填写此字段'
780
- }
781
-
782
- return defaultMessages[fieldType] || '此字段为必填项'
783
- },
784
- // 格式化日期值,用于日期选择器的value
785
- formatDateValue (dateStr) {
786
- if (!dateStr) return null
787
- const date = moment(dateStr)
788
- return date.isValid() ? date : null
789
- },
790
- // 反序列化函数并执行
791
- deserializeFunctionAndRun (functionStr, value) {
792
- // eslint-disable-next-line no-eval
793
- const fun = eval('(' + functionStr + ')')
794
- return fun(value, this.config)
795
- },
796
- // 基础上传组件,图片改动后触发
797
- setImages (args, type, index = undefined) {
798
- // 如果基础上传组件在初始化完成后,就调用emit了setImage,此时图片并没有变化,直接返回
799
- if (args[2] === 'created') {
800
- return
801
- }
802
- if (type === 'configData') {
803
- this.configData.images[args[1]] = args[0]
804
- } else {
805
- this.config.tempData[args[1]] = args[0]
806
- if (index) {
807
- this.$emit('updateImg', this.config.tempData[index])
808
- }
809
- }
810
- },
811
- // 动态行删除
812
- removeData (index) {
813
- if (this.configData[index].length === 0) {
814
- this.$message.warn('已经没有更多了')
815
- return
816
- }
817
- this.configData[index].pop()
818
- },
819
- // 添加一行
820
- addData (index, row) {
821
- // 获取定义
822
- const defs = row[0].definition
823
-
824
- // 获取外层对象名
825
- const dataName = row[0].dataIndex
826
- const temp = {}
827
-
828
- defs.forEach(def => {
829
- // 找到数组中最后一个数据的值
830
- let lastDataNo = 0
831
- if (this.configData[dataName][this.configData[dataName].length - 1]) {
832
- lastDataNo = this.configData[dataName][this.configData[dataName].length - 1][def.dataIndex]
833
- }
834
-
835
- // 如果没有值,检查是否声明了初始值
836
- if (lastDataNo === 0 && def.initialValue) {
837
- lastDataNo = def.initialValue
838
- }
839
-
840
- // 检查是否有步长
841
- let step = 1
842
- if (def.step) {
843
- step = def.step
844
- }
845
-
846
- // 如果单元格类型为increment,则进行自增
847
- if (def.type === 'increment') {
848
- temp[def.dataIndex] = lastDataNo + step
849
- }
850
- })
851
- this.configData[index].push(temp)
852
- },
853
- // 根据format计算需要多少个输入框
854
- calcFormatInputNum (formatStr) {
855
- let count = 0
856
- for (let i = 0; i < formatStr.length; i++) {
857
- if (formatStr[i] === '{') {
858
- count++
859
- }
860
- }
861
- return count
862
- },
863
- // 根据format计算输入框之后的文字显示
864
- displayFormatText (formatStr, num) {
865
- let start = 0
866
- let count = 0
867
- num++
868
- for (let i = 0; i < formatStr.length; i++) {
869
- if (formatStr[i] === '}') {
870
- start = i
871
- count++
872
- }
873
- if (count === num) {
874
- for (let j = start + 1; j < formatStr.length; j++) {
875
- if (formatStr[j] === '{') {
876
- return formatStr.slice(start + 1, j)
877
- }
878
- if (j === formatStr.length - 1 && formatStr[j] !== '}') {
879
- return formatStr[j]
880
- }
881
- }
882
- }
883
- }
884
- },
885
- calcTDBorder (cellNoBorder = false) {
886
- if (cellNoBorder) {
887
- return 'tdNoBorder'
888
- } else {
889
- if (this.noTopBorder) {
890
- return 'tdWithNoTopBorder'
891
- } else {
892
- return 'tdWithBorder'
893
- }
894
- }
895
- },
896
- // 根据format计算输入框之前的文字显示
897
- displayFormatStartText (formatStr) {
898
- let count = 0
899
- for (let i = 0; i < formatStr.length; i++) {
900
- if (formatStr[i] === '{') {
901
- break
902
- } else {
903
- count++
904
- }
905
- }
906
- return formatStr.slice(0, count)
907
- },
908
- // 拼接被自动拆分的单元格内容
909
- showSubRowValue (cell) {
910
- const dataName = cell.dataIndex
911
- const formatArr = []
912
- const dataArr = []
913
-
914
- // 从config中取出所有数据,根据dataIndex的开头内容进行拼接
915
- this.config.columns.forEach(row => row.forEach(cell => {
916
- if (cell.dataIndex && cell.dataIndex.startsWith(dataName)) {
917
- formatArr.push(cell.format)
918
- dataArr.push(this.configData[cell.dataIndex])
919
- }
920
- }))
921
-
922
- const text = []
923
- const data = []
924
-
925
- formatArr.forEach(word => {
926
- const temp = word.split('{}')
927
- temp.forEach(char => {
928
- if (char !== '') {
929
- text.push(char)
930
- }
931
- })
932
- })
933
-
934
- dataArr.forEach(item => {
935
- item.forEach(num => {
936
- data.push(num)
937
- })
938
- })
939
-
940
- let result = ''
941
- for (let i = 0; i < data.length; i++) {
942
- result += data[i]
943
- result += text[i]
944
- }
945
-
946
- return result
947
- },
948
- },
949
- beforeMount () {
950
- if (this.useOssForImg) {
951
- this.uploadParams.resUploadMode = 'oss'
952
- }
953
- }
954
- }
955
-
956
- </script>
957
-
958
- <style scoped lang="less">
959
- .inputsDiv {
960
- display: flex;
961
- justify-content: space-between;
962
-
963
- .inputsDivItem {
964
- display: flex;
965
- align-items: center;
966
- padding: 0 4px;
967
- white-space: nowrap;
968
-
969
- .inputsDivItemLabel {
970
- padding: 0 4px;
971
- }
972
- }
973
- }
974
-
975
- .tdNoBorder {
976
- border-left: 1px solid #000;
977
- border-right: 1px solid #000;
978
- padding: 8px;
979
- }
980
-
981
- .tdWithBorder {
982
- border: 1px solid #000;
983
- padding: 8px;
984
- }
985
-
986
- .tdWithNoTopBorder {
987
- border-top-style: none;
988
- border-left: 1px solid #000;
989
- border-right: 1px solid #000;
990
- border-bottom: 1px solid #000;
991
- padding: 8px;
992
- }
993
-
994
- .required-field-error {
995
- border-color: #ff4d4f !important;
996
- box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2) !important;
997
- }
998
-
999
- .required-message {
1000
- color: #ff4d4f;
1001
- font-size: 12px;
1002
- margin-top: 4px;
1003
- line-height: 1.2;
1004
- }
1005
- </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 === 'datePicker'">
41
+ <template v-if="cell.customFunction === undefined">
42
+ {{ getDeepObject(configData, cell.dataIndex) }}
43
+ </template>
44
+ <template v-else>
45
+ {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
46
+ </template>
47
+ </template>
48
+ <template v-else-if="cell.type === 'timePicker'">
49
+ <template v-if="cell.customFunction === undefined">
50
+ {{ getDeepObject(configData, cell.dataIndex) }}
51
+ </template>
52
+ <template v-else>
53
+ {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
54
+ </template>
55
+ </template>
56
+ <template v-else-if="cell.type === 'inputs'">
57
+ <template v-if="cell.customFunction === undefined">
58
+ {{ showSubRowValue(cell) }}
59
+ </template>
60
+ <template v-else>
61
+ {{ deserializeFunctionAndRun(cell.customFunction, showSubRowValue(cell), config) }}
62
+ </template>
63
+ </template>
64
+ <template v-else-if="cell.type === 'list'">
65
+ <template v-if="listIndex === 0">
66
+ <span style="font-weight: bold">{{ cell.listHead }}</span>
67
+ </template>
68
+ <template v-else-if="cell.listType === 'input'">
69
+ {{ getDeepObject(configData, cell.dataIndex)[listIndex] }}
70
+ </template>
71
+ <template v-else-if="cell.listType === 'value'">
72
+ {{ cell.content[listIndex] }}
73
+ </template>
74
+ <template v-else-if="cell.listType === 'variable'">
75
+ {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
76
+ </template>
77
+ </template>
78
+ <template v-else-if="cell.type === 'images'">
79
+ <template v-if="getDeepObject(configData.images, cell.dataIndex) === undefined || getDeepObject(configData.images, cell.dataIndex).length === 0">
80
+ <template v-if="getDeepObject(configData, cell.dataIndex) === undefined || getDeepObject(configData, cell.dataIndex).length === 0">
81
+ <span>无</span>
82
+ </template>
83
+ <template v-else>
84
+ <template v-if="typeof getDeepObject(configData, cell.dataIndex) === 'object'">
85
+ <div style="display: flex; align-items: end; justify-content: space-evenly; flex-wrap: wrap">
86
+ <template v-for="(img,imgIndex) in getDeepObject(configData, cell.dataIndex)">
87
+ <template v-if="showImgInCell">
88
+ <div :key="imgIndex">
89
+ <img :src="img.url" alt="图片"/>
90
+ <p>{{ img.name }}</p>
91
+ </div>
92
+ </template>
93
+ <template v-else>
94
+ <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
95
+ </template>
96
+ </template>
97
+ </div>
98
+ </template>
99
+ <template v-else>
100
+ <img :src="getDeepObject(configData, cell.dataIndex)" alt="图片"/>
101
+ <p style="margin-right: 5%">{{ formatImgStr(getDeepObject(configData, cell.dataIndex))[0].name }}</p>
102
+ </template>
103
+ </template>
104
+ </template>
105
+ <template v-else v-for="(img,imgIndex) in getDeepObject(configData.images, cell.dataIndex)">
106
+ <span :key="imgIndex" style="margin-right: 5%">{{ img.name }}</span>
107
+ </template>
108
+ </template>
109
+ </td>
110
+ </template>
111
+ <template v-else>
112
+ <td
113
+ v-for="(cell, cellIndex) in columns"
114
+ :key="cellIndex"
115
+ :class=" calcTDBorder(cell.noBoarder) "
116
+ :colspan="cell.colSpan ? cell.colSpan : undefined"
117
+ :style="determineCellStyle(cell)"
118
+ :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
119
+ <template v-if="cell.type === 'column'">
120
+ {{ cell.text }}
121
+ </template>
122
+ <template v-else-if="cell.type === 'value'">
123
+ <template v-if="cell.customFunction === undefined">
124
+ {{ cell.value }}
125
+ </template>
126
+ <template v-else>
127
+ {{ deserializeFunctionAndRun(cell.customFunction, cell.value, config) }}
128
+ </template>
129
+ </template>
130
+ <template v-else-if="cell.type === 'increment'">
131
+ <template v-if="cell.customFunction === undefined">
132
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
133
+ </template>
134
+ <template v-else>
135
+ {{
136
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
137
+ }}
138
+ </template>
139
+ </template>
140
+ <template v-else-if="cell.type === 'input'">
141
+ <template v-if="cell.customFunction === undefined">
142
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
143
+ </template>
144
+ <template v-else>
145
+ {{
146
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
147
+ }}
148
+ </template>
149
+ </template>
150
+ <template v-else-if="cell.type === 'datePicker'">
151
+ <template v-if="cell.customFunction === undefined">
152
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
153
+ </template>
154
+ <template v-else>
155
+ {{
156
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
157
+ }}
158
+ </template>
159
+ </template>
160
+ <template v-else-if="cell.type === 'timePicker'">
161
+ <template v-if="cell.customFunction === undefined">
162
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
163
+ </template>
164
+ <template v-else>
165
+ {{
166
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
167
+ }}
168
+ </template>
169
+ </template>
170
+ <template v-else-if="cell.type === 'inputs'">
171
+ <template v-if="cell.customFunction === undefined">
172
+ {{ getDeepObject(configData.arr[inputColumnsDefinitionIndex], cell.dataIndex) }}
173
+ </template>
174
+ <template v-else>
175
+ {{
176
+ deserializeFunctionAndRun(cell.customFunction, configData.arr[inputColumnsDefinitionIndex][cell.dataIndex], config)
177
+ }}
178
+ </template>
179
+ </template>
180
+ </td>
181
+ </template>
182
+ </template>
183
+ <!-- 不是动态行 -->
184
+ <template v-else-if="!inputColumns">
185
+ <td
186
+ v-for="(cell, cellIndex) in columns"
187
+ :key="cellIndex"
188
+ :class=" calcTDBorder(cell.noBoarder) "
189
+ :colspan="cell.colSpan ? cell.colSpan : undefined"
190
+ :style="determineCellStyle(cell)"
191
+ :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
192
+ <template v-if="cell.type === 'column'">
193
+ <template v-if="cell.customFunction">
194
+ {{ deserializeFunctionAndRun(cell.customFunction, configData[cell.dataIndex], config) }}
195
+ </template>
196
+ <template v-else>
197
+ {{ cell.text }}
198
+ </template>
199
+ </template>
200
+ <template v-else-if="cell.type === 'placeHolderColumn'">
201
+ <!-- 占位 -->
202
+ </template>
203
+ <template v-else-if="cell.type === 'value'">
204
+ {{ cell.value }}
205
+ </template>
206
+ <template v-else-if="cell.type === 'curDateInput'">
207
+ <a-button type="dashed" v-if="configData[cell.dataIndex]">
208
+ {{ configData[cell.dataIndex] }}
209
+ </a-button>
210
+ <a-button
211
+ v-if="!configData[cell.dataIndex]"
212
+ type="primary"
213
+ @click="getNowDate(cell.dataIndex)"
214
+ >{{ cell.text || '确认' }}
215
+ </a-button>
216
+ </template>
217
+ <template v-else-if="cell.type === 'datePicker'">
218
+ <div>
219
+ <a-date-picker
220
+ @change="handleDatePickerChange($event, cell.dataIndex, cell)"
221
+ :value="formatDateValue(configData[cell.dataIndex])"
222
+ format="YYYY-MM-DD"
223
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
224
+ :disabled="cell.inputReadOnly===true"
225
+ :class="{'required-field-error': isFieldRequired(cell) && !configData[cell.dataIndex]}"/>
226
+ <div v-if="isFieldRequired(cell) && !configData[cell.dataIndex]" class="required-message">
227
+ {{ getRequiredMessage(cell, 'datePicker') }}
228
+ </div>
229
+ </div>
230
+ </template>
231
+ <template v-else-if="cell.type === 'timePicker'">
232
+ <div>
233
+ <a-date-picker
234
+ @change="handleTimePickerChange($event, cell.dataIndex, cell)"
235
+ :value="formatDateValue(configData[cell.dataIndex])"
236
+ format="YYYY-MM-DD HH:mm:ss"
237
+ show-time
238
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
239
+ :disabled="cell.inputReadOnly===true"
240
+ :class="{'required-field-error': isFieldRequired(cell) && !configData[cell.dataIndex]}"/>
241
+ <div v-if="isFieldRequired(cell) && !configData[cell.dataIndex]" class="required-message">
242
+ {{ getRequiredMessage(cell, 'timePicker') }}
243
+ </div>
244
+ </div>
245
+ </template>
246
+ <template v-else-if="cell.type === 'signature'">
247
+ <img :src="configData[cell.dataIndex]" alt="签名加载失败" style="max-height: 2rem">
248
+ <a-button v-if="!configData[cell.dataIndex]" type="dashed" >需要在手机端签名 </a-button>
249
+ </template>
250
+ <template v-else-if="cell.type === 'input'">
251
+ <div>
252
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
253
+ <a-input
254
+ @change="handleInputDeepChange($event, cell.dataIndex, cell)"
255
+ v-model="config.tempData[cell.dataIndex]"
256
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
257
+ :disabled="cell.inputReadOnly === true"
258
+ :class="{'required-field-error': isFieldRequired(cell) && !config.tempData[cell.dataIndex]}"/>
259
+ </template>
260
+ <template v-else>
261
+ <a-input
262
+ @change="handleInputChange($event, cell.dataIndex, cell)"
263
+ v-model="configData[cell.dataIndex]"
264
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
265
+ :disabled="cell.inputReadOnly === true"
266
+ :class="{'required-field-error': isFieldRequired(cell) && !configData[cell.dataIndex]}"/>
267
+ </template>
268
+ <div v-if="isFieldRequired(cell) && !getInputValue(cell)" class="required-message">
269
+ {{ getRequiredMessage(cell, 'input') }}
270
+ </div>
271
+ </div>
272
+ </template>
273
+ <template v-else-if="cell.type === 'inputs'">
274
+ <template v-if="cell.inputReadOnly === true">
275
+ <div class="inputsDiv">
276
+ <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
277
+ <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
278
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
279
+ <a-input
280
+ @change="handleInputDeepChange($event, cell.dataIndex, cell)"
281
+ v-model="config.tempData[cell.dataIndex][index]"
282
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
283
+ :disabled="true"/>
284
+ </template>
285
+ <template v-else>
286
+ <a-input
287
+ v-model="configData[cell.dataIndex][index]"
288
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
289
+ :disabled="true"/>
290
+ </template>
291
+ <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
292
+ </div>
293
+ </div>
294
+ </template>
295
+ <template v-else>
296
+ <div class="inputsDiv">
297
+ <div class="inputsDivItem" v-for="(num, index) of calcFormatInputNum(cell.format)" :key="index">
298
+ <span class="inputsDivItemLabel">{{ displayFormatStartText(cell.format) }}</span>
299
+ <template v-if="cell.dataIndex.indexOf('@@@') !== -1">
300
+ <a-input
301
+ @change="handleInputDeepChange($event, cell.dataIndex, cell)"
302
+ v-model="config.tempData[cell.dataIndex][index]"
303
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
304
+ </template>
305
+ <template v-else>
306
+ <a-input
307
+ v-model="configData[cell.dataIndex][index]"
308
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
309
+ </template>
310
+ <span class="inputsDivItemLabel">{{ displayFormatText(cell.format, index) }}</span>
311
+ </div>
312
+ </div>
313
+ </template>
314
+ </template>
315
+ <template v-else-if="cell.type === 'list'">
316
+ <template v-if="listIndex === 0">
317
+ <span style="font-weight: bold">{{ cell.listHead }}</span>
318
+ </template>
319
+ <template v-else-if="cell.listType === 'input'">
320
+ <a-input
321
+ v-model="configData[cell.dataIndex][listIndex]"
322
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
323
+ </template>
324
+ <template v-else-if="cell.listType === 'value'">
325
+ {{ cell.content[listIndex] }}
326
+ </template>
327
+ <template v-else-if="cell.listType === 'variable'">
328
+ {{ configData[cell.dataIndex][listIndex - 1][cell.listDataIndex] }}
329
+ </template>
330
+ </template>
331
+ <template v-else-if="cell.type === 'images'">
332
+ <div>
333
+ <template v-if="configData.images[cell.dataIndex]?.length > 0">
334
+ <upload
335
+ :model="uploadParams"
336
+ :img-prefix="imgPrefix"
337
+ :service-name="serverName"
338
+ :images="checkImg(cell.dataIndex, 'configData')"
339
+ :outer-container-index="cell.dataIndex"
340
+ @setFiles="(...args) => {setImages(args, 'configData')}"
341
+ :upload-style="'simple'"
342
+ />
343
+ </template>
344
+ <template v-else>
345
+ <upload
346
+ :model="uploadParams"
347
+ :img-prefix="imgPrefix"
348
+ :service-name="serverName"
349
+ :images="checkImg(cell.dataIndex, 'config')"
350
+ :outer-container-index="cell.dataIndex"
351
+ @setFiles="(...args) => {setImages(args, 'config', cell.dataIndex)}"
352
+ :upload-style="'simple'"
353
+ />
354
+ </template>
355
+ </div>
356
+ </template>
357
+ </td>
358
+ </template>
359
+ <!-- 动态行插入按钮 -->
360
+ <template v-else-if="inputColumnsButton">
361
+ <td :colspan="maxColSpan" :class="calcTDBorder()">
362
+ <a-button-group>
363
+ <a-button @click="addData(columns[0].dataIndex, columns)">
364
+ <a-icon type="plus"/>
365
+ </a-button>
366
+ <a-button @click="removeData(columns[0].dataIndex)">
367
+ <a-icon type="minus"/>
368
+ </a-button>
369
+ </a-button-group>
370
+ </td>
371
+ </template>
372
+ <!-- 其他行 -->
373
+ <template v-else>
374
+ <td
375
+ v-for="(cell, cellIndex) in columns"
376
+ :key="cellIndex"
377
+ :class=" calcTDBorder(cell.noBoarder) "
378
+ :colspan="cell.colSpan ? cell.colSpan : undefined"
379
+ :style="determineCellStyle(cell)"
380
+ :rowspan="cell.rowSpan ? cell.rowSpan : undefined">
381
+ <template v-if="cell.type === 'column'">
382
+ {{ cell.text }}
383
+ </template>
384
+ <template v-else-if="cell.type === 'value'">
385
+ {{ cell.value }}
386
+ </template>
387
+ <template v-else-if="cell.type === 'curDateInput'">
388
+ <a-button type="dashed" v-if="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]">
389
+ {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
390
+ </a-button>
391
+ <a-button
392
+ v-if="!configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
393
+ type="primary"
394
+ @click="getNowDate(inputColumnsDefinitionIndex,cell.dataIndex)"
395
+ >{{ cell.text || '确认' }}
396
+ </a-button>
397
+ </template>
398
+ <template v-else-if="cell.type === 'datePicker'">
399
+ <div>
400
+ <a-date-picker
401
+ @change="handleArrayDatePickerChange($event, inputColumnsDefinitionIndex, cell.dataIndex, cell)"
402
+ :value="formatDateValue(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
403
+ format="YYYY-MM-DD"
404
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
405
+ :disabled="cell.inputReadOnly === true"
406
+ :class="{'required-field-error': isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]}"/>
407
+ <div v-if="isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]" class="required-message">
408
+ {{ getRequiredMessage(cell, 'datePicker') }}
409
+ </div>
410
+ </div>
411
+ </template>
412
+ <template v-else-if="cell.type === 'timePicker'">
413
+ <div>
414
+ <a-date-picker
415
+ @change="handleArrayTimePickerChange($event, inputColumnsDefinitionIndex, cell.dataIndex, cell)"
416
+ :value="formatDateValue(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
417
+ format="YYYY-MM-DD HH:mm:ss"
418
+ show-time
419
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
420
+ :disabled="cell.inputReadOnly === true"
421
+ :class="{'required-field-error': isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]}"/>
422
+ <div v-if="isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]" class="required-message">
423
+ {{ getRequiredMessage(cell, 'timePicker') }}
424
+ </div>
425
+ </div>
426
+ </template>
427
+ <template v-else-if="cell.type === 'signature'">
428
+ <img :src="configData[cell.dataIndex]" alt="签名加载失败" style="max-height: 2rem">
429
+ <a-button v-if="!configData[cell.dataIndex]" type="dashed" >需要在手机端签名</a-button>
430
+ </template>
431
+ <template v-else-if="cell.type === 'increment'">
432
+ {{ configData.arr[inputColumnsDefinitionIndex][cell.dataIndex] }}
433
+ </template>
434
+ <template v-else-if="cell.type === 'input'">
435
+ <div>
436
+ <a-input
437
+ @change="handleArrayInputChange($event, inputColumnsDefinitionIndex, cell.dataIndex, cell)"
438
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
439
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
440
+ :disabled="cell.inputReadOnly === true"
441
+ :class="{'required-field-error': isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]}"/>
442
+ <div v-if="isFieldRequired(cell) && !configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]" class="required-message">
443
+ {{ getRequiredMessage(cell, 'input') }}
444
+ </div>
445
+ </div>
446
+ </template>
447
+ <template v-else-if="cell.type === 'inputs'">
448
+ <template v-if="cell.inputReadOnly === true">
449
+ <a-input
450
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
451
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"
452
+ :disabled="true"/>
453
+ </template>
454
+ <template v-else>
455
+ <a-input
456
+ v-model="configData.arr[inputColumnsDefinitionIndex][cell.dataIndex]"
457
+ :style="'width:' + (cell.inputWidth ? cell.inputWidth : '100') + '%'"/>
458
+ </template>
459
+ </template>
460
+ </td>
461
+ </template>
462
+ </tr>
463
+ </template>
464
+
465
+ <script>
466
+ import Upload from '@vue2-client/base-client/components/common/Upload'
467
+ import { formatDate } from '@vue2-client/utils/util'
468
+ import { nanoid } from 'nanoid'
469
+ import moment from 'moment'
470
+
471
+ export default {
472
+ name: 'XReportTrGroup',
473
+ components: {
474
+ Upload
475
+ },
476
+ props: {
477
+ // 每一行的配置
478
+ columns: {
479
+ type: Array,
480
+ required: true
481
+ },
482
+ showImgInCell: {
483
+ type: Boolean,
484
+ default: false
485
+ },
486
+ config: {
487
+ type: Object,
488
+ default: function () {
489
+ return {}
490
+ }
491
+ },
492
+ // 命名空间
493
+ serverName: {
494
+ type: String,
495
+ default: 'af-system'
496
+ },
497
+ // 原始配置
498
+ configData: {
499
+ type: Object,
500
+ required: true
501
+ },
502
+ // 是否为动态行
503
+ inputColumns: {
504
+ type: Boolean,
505
+ default: false
506
+ },
507
+ // 是否为动态行按钮
508
+ inputColumnsButton: {
509
+ type: Boolean,
510
+ default: false
511
+ },
512
+ // 动态行的Index
513
+ inputColumnsDefinitionIndex: {
514
+ type: Number,
515
+ default: undefined
516
+ },
517
+ // 是否为展示行
518
+ display: {
519
+ type: Boolean,
520
+ default: false
521
+ },
522
+ // list类型的下标,用于遍历列表时,获取对应的数据
523
+ listIndex: {
524
+ type: Number,
525
+ default: undefined
526
+ },
527
+ // 表格没有上边框
528
+ noTopBorder: {
529
+ type: Boolean,
530
+ default: false
531
+ },
532
+ // 图片是否使用OSS来保存
533
+ useOssForImg: {
534
+ type: Boolean,
535
+ default: true
536
+ },
537
+ // 图片上传后添加前缀
538
+ imgPrefix: {
539
+ type: String,
540
+ default: undefined
541
+ }
542
+ },
543
+ data () {
544
+ return {
545
+ maxColSpan: 12,
546
+ uploadParams: {
547
+ type: 'image',
548
+ accept: ['*'],
549
+ resUploadStock: 1,
550
+ pathKey: 'cs'
551
+ }
552
+ // tableConfig: {}
553
+ }
554
+ },
555
+ methods: {
556
+ updateImg (data) {
557
+ this.$emit('updateImg', data)
558
+ },
559
+ formatImgStr (str) {
560
+ const result = []
561
+ if (str !== '') {
562
+ const arr = str.split('/')
563
+ result.push({
564
+ uid: nanoid(6),
565
+ url: str,
566
+ name: arr[arr.length - 1],
567
+ status: 'done'
568
+ })
569
+ }
570
+ this.uploadParams.acceptCount = 1
571
+ return result
572
+ },
573
+ checkImg (index, type) {
574
+ let target
575
+ if (type === 'configData') {
576
+ target = this.configData.images[index]
577
+ } else {
578
+ target = this.config.tempData[index]
579
+ }
580
+ if (typeof target !== 'object') {
581
+ return this.formatImgStr(target)
582
+ }
583
+ target.forEach(obj => {
584
+ if (obj.uid === undefined) {
585
+ obj.uid = obj.id.toString()
586
+ }
587
+ if (obj.url === undefined) {
588
+ if (obj.path) {
589
+ obj.url = obj.path
590
+ }
591
+ }
592
+ if (obj.name === undefined) {
593
+ const withOutEndFix = obj.url.split('.')[0]
594
+ const temp = withOutEndFix.split('/')
595
+ obj.name = temp[temp.length - 1]
596
+ }
597
+ if (obj.status === undefined) {
598
+ obj.status = 'done'
599
+ }
600
+ })
601
+ return target
602
+ },
603
+ // 判断单元格样式
604
+ determineCellStyle (cell, color = '#000', borderWidth = '1px') {
605
+ // 如果声明了borderColor
606
+ if (this.config.style.borderColor) {
607
+ color = this.config.style.borderColor
608
+ }
609
+ // 如果声明了borderWidth
610
+ if (this.config.style.borderWidth) {
611
+ borderWidth = this.config.style.borderWidth
612
+ }
613
+ // 普通带边框单元格
614
+ const withBorder = {
615
+ border: borderWidth + ' solid ' + color,
616
+ padding: '8px'
617
+ }
618
+ // 只有左右边框的单元格
619
+ const noBorder = {
620
+ borderLeft: borderWidth + ' solid ' + color,
621
+ borderRight: borderWidth + ' solid ' + color,
622
+ padding: '8px'
623
+ }
624
+ // 只没有上边框的单元格
625
+ const NoTopBorder = {
626
+ borderTopStyle: 'none',
627
+ borderLeft: borderWidth + ' solid ' + color,
628
+ borderRight: borderWidth + ' solid ' + color,
629
+ borderBottom: borderWidth + ' solid ' + color,
630
+ padding: '8px'
631
+ }
632
+ let result = {}
633
+ // 如果表格也声明了样式,用表格样式将样式覆盖
634
+ if (cell.style) {
635
+ if (cell.noBorder) {
636
+ result = { ...noBorder, ...cell.style }
637
+ } else {
638
+ if (this.noTopBorder) {
639
+ result = { ...NoTopBorder, ...cell.style }
640
+ } else {
641
+ result = { ...withBorder, ...cell.style }
642
+ }
643
+ }
644
+ return result
645
+ }
646
+ // 如果表头声明了样式,则用其将基础样式覆盖
647
+ if (cell.type === 'column') {
648
+ if (this.config.labelStyle !== undefined) {
649
+ if (cell.noBorder) {
650
+ result = { ...noBorder, ...this.config.labelStyle }
651
+ } else {
652
+ if (this.noTopBorder) {
653
+ result = { ...NoTopBorder, ...this.config.labelStyle }
654
+ } else {
655
+ result = { ...withBorder, ...this.config.labelStyle }
656
+ }
657
+ }
658
+ return result
659
+ }
660
+ }
661
+ if (cell.noBorder) {
662
+ result = { ...noBorder }
663
+ } else {
664
+ if (this.noTopBorder) {
665
+ result = { ...NoTopBorder }
666
+ } else {
667
+ result = { ...withBorder }
668
+ }
669
+ }
670
+ return result
671
+ },
672
+ // 表格中数据key含有@@@,需要手动触发更新
673
+ handleInputDeepChange (event, dataIndex, cell = null) {
674
+ // 如果字段必填且有值,触发重新渲染以移除错误样式
675
+ if (cell && this.isFieldRequired(cell) && event.target.value) {
676
+ this.$forceUpdate()
677
+ }
678
+ this.$forceUpdate()
679
+ },
680
+ // 处理普通input变化
681
+ handleInputChange (event, dataIndex, cell = null) {
682
+ // 如果字段必填且有值,触发重新渲染以移除错误样式
683
+ if (cell && this.isFieldRequired(cell) && event.target.value) {
684
+ this.$forceUpdate()
685
+ }
686
+ },
687
+ // 处理动态行中input变化
688
+ handleArrayInputChange (event, arrayIndex, dataIndex, cell = null) {
689
+ // 如果字段必填且有值,触发重新渲染以移除错误样式
690
+ if (cell && this.isFieldRequired(cell) && event.target.value) {
691
+ this.$forceUpdate()
692
+ }
693
+ },
694
+ // 获取input的值,用于必填校验
695
+ getInputValue (cell) {
696
+ if (cell.dataIndex.indexOf('@@@') !== -1) {
697
+ return this.config.tempData[cell.dataIndex]
698
+ } else {
699
+ return this.configData[cell.dataIndex]
700
+ }
701
+ },
702
+ // 路径中含有@@@的key,将其解析,并返回其数据
703
+ getDeepObject (obj, strPath) {
704
+ const arr = strPath.split('@@@')
705
+ let result = obj[arr[0]]
706
+ arr.shift()
707
+ try {
708
+ while (arr.length > 0) {
709
+ result = result[arr[0]]
710
+ arr.shift()
711
+ }
712
+ } catch (e) {
713
+ result = undefined
714
+ }
715
+ return result
716
+ },
717
+ // 获取当前日期
718
+ getNowDate (index1, index2) {
719
+ if (index2) {
720
+ // @click="getNowDate(configData.arr[inputColumnsDefinitionIndex][cell.dataIndex])"
721
+ this.configData.arr[index1][index2] = formatDate('now')
722
+ } else {
723
+ this.configData[index1] = formatDate('now')
724
+ }
725
+ this.configData = Object.assign({}, this.configData)
726
+ },
727
+ // 通用的日期时间选择器变化处理方法
728
+ handleDateTimePickerChange (date, dataIndex, format, arrayIndex = null, cell = null) {
729
+ const dateStr = date ? moment(date).format(format) : ''
730
+
731
+ if (arrayIndex !== null) {
732
+ // 处理动态行中的日期时间选择器
733
+ this.configData.arr[arrayIndex][dataIndex] = dateStr
734
+ } else if (dataIndex.indexOf('@@@') !== -1) {
735
+ // 处理深层嵌套的数据
736
+ this.handleInputDeepChange({ target: { value: dateStr } }, dataIndex, cell)
737
+ } else {
738
+ // 处理普通的数据
739
+ this.configData[dataIndex] = dateStr
740
+ }
741
+
742
+ // 如果字段必填且有值,触发重新渲染以移除错误样式
743
+ if (cell && this.isFieldRequired(cell) && dateStr) {
744
+ this.$forceUpdate()
745
+ }
746
+
747
+ this.configData = Object.assign({}, this.configData)
748
+ },
749
+ // 日期选择器变化处理(YYYY-MM-DD格式)
750
+ handleDatePickerChange (date, dataIndex, cell = null) {
751
+ this.handleDateTimePickerChange(date, dataIndex, 'YYYY-MM-DD', null, cell)
752
+ },
753
+ // 时间选择器变化处理(YYYY-MM-DD HH:mm:ss格式)
754
+ handleTimePickerChange (date, dataIndex, cell = null) {
755
+ this.handleDateTimePickerChange(date, dataIndex, 'YYYY-MM-DD HH:mm:ss', null, cell)
756
+ },
757
+ // 动态行中日期选择器变化处理
758
+ handleArrayDatePickerChange (date, arrayIndex, dataIndex, cell = null) {
759
+ this.handleDateTimePickerChange(date, dataIndex, 'YYYY-MM-DD', arrayIndex, cell)
760
+ },
761
+ // 动态行中时间选择器变化处理
762
+ handleArrayTimePickerChange (date, arrayIndex, dataIndex, cell = null) {
763
+ this.handleDateTimePickerChange(date, dataIndex, 'YYYY-MM-DD HH:mm:ss', arrayIndex, cell)
764
+ },
765
+ // 判断字段是否必填
766
+ isFieldRequired (cell) {
767
+ return cell && cell.required === true
768
+ },
769
+ // 获取必填字段的提示信息
770
+ getRequiredMessage (cell, fieldType) {
771
+ if (cell.requiredMessage) {
772
+ return cell.requiredMessage
773
+ }
774
+
775
+ // 默认提示信息
776
+ const defaultMessages = {
777
+ datePicker: '请选择日期',
778
+ timePicker: '请选择日期时间',
779
+ input: '请填写此字段'
780
+ }
781
+
782
+ return defaultMessages[fieldType] || '此字段为必填项'
783
+ },
784
+ // 格式化日期值,用于日期选择器的value
785
+ formatDateValue (dateStr) {
786
+ if (!dateStr) return null
787
+ const date = moment(dateStr)
788
+ return date.isValid() ? date : null
789
+ },
790
+ // 反序列化函数并执行
791
+ deserializeFunctionAndRun (functionStr, value) {
792
+ // eslint-disable-next-line no-eval
793
+ const fun = eval('(' + functionStr + ')')
794
+ return fun(value, this.config)
795
+ },
796
+ // 基础上传组件,图片改动后触发
797
+ setImages (args, type, index = undefined) {
798
+ // 如果基础上传组件在初始化完成后,就调用emit了setImage,此时图片并没有变化,直接返回
799
+ if (args[2] === 'created') {
800
+ return
801
+ }
802
+ if (type === 'configData') {
803
+ this.configData.images[args[1]] = args[0]
804
+ } else {
805
+ this.config.tempData[args[1]] = args[0]
806
+ if (index) {
807
+ this.$emit('updateImg', this.config.tempData[index])
808
+ }
809
+ }
810
+ },
811
+ // 动态行删除
812
+ removeData (index) {
813
+ if (this.configData[index].length === 0) {
814
+ this.$message.warn('已经没有更多了')
815
+ return
816
+ }
817
+ this.configData[index].pop()
818
+ },
819
+ // 添加一行
820
+ addData (index, row) {
821
+ // 获取定义
822
+ const defs = row[0].definition
823
+
824
+ // 获取外层对象名
825
+ const dataName = row[0].dataIndex
826
+ const temp = {}
827
+
828
+ defs.forEach(def => {
829
+ // 找到数组中最后一个数据的值
830
+ let lastDataNo = 0
831
+ if (this.configData[dataName][this.configData[dataName].length - 1]) {
832
+ lastDataNo = this.configData[dataName][this.configData[dataName].length - 1][def.dataIndex]
833
+ }
834
+
835
+ // 如果没有值,检查是否声明了初始值
836
+ if (lastDataNo === 0 && def.initialValue) {
837
+ lastDataNo = def.initialValue
838
+ }
839
+
840
+ // 检查是否有步长
841
+ let step = 1
842
+ if (def.step) {
843
+ step = def.step
844
+ }
845
+
846
+ // 如果单元格类型为increment,则进行自增
847
+ if (def.type === 'increment') {
848
+ temp[def.dataIndex] = lastDataNo + step
849
+ }
850
+ })
851
+ this.configData[index].push(temp)
852
+ },
853
+ // 根据format计算需要多少个输入框
854
+ calcFormatInputNum (formatStr) {
855
+ let count = 0
856
+ for (let i = 0; i < formatStr.length; i++) {
857
+ if (formatStr[i] === '{') {
858
+ count++
859
+ }
860
+ }
861
+ return count
862
+ },
863
+ // 根据format计算输入框之后的文字显示
864
+ displayFormatText (formatStr, num) {
865
+ let start = 0
866
+ let count = 0
867
+ num++
868
+ for (let i = 0; i < formatStr.length; i++) {
869
+ if (formatStr[i] === '}') {
870
+ start = i
871
+ count++
872
+ }
873
+ if (count === num) {
874
+ for (let j = start + 1; j < formatStr.length; j++) {
875
+ if (formatStr[j] === '{') {
876
+ return formatStr.slice(start + 1, j)
877
+ }
878
+ if (j === formatStr.length - 1 && formatStr[j] !== '}') {
879
+ return formatStr[j]
880
+ }
881
+ }
882
+ }
883
+ }
884
+ },
885
+ calcTDBorder (cellNoBorder = false) {
886
+ if (cellNoBorder) {
887
+ return 'tdNoBorder'
888
+ } else {
889
+ if (this.noTopBorder) {
890
+ return 'tdWithNoTopBorder'
891
+ } else {
892
+ return 'tdWithBorder'
893
+ }
894
+ }
895
+ },
896
+ // 根据format计算输入框之前的文字显示
897
+ displayFormatStartText (formatStr) {
898
+ let count = 0
899
+ for (let i = 0; i < formatStr.length; i++) {
900
+ if (formatStr[i] === '{') {
901
+ break
902
+ } else {
903
+ count++
904
+ }
905
+ }
906
+ return formatStr.slice(0, count)
907
+ },
908
+ // 拼接被自动拆分的单元格内容
909
+ showSubRowValue (cell) {
910
+ const dataName = cell.dataIndex
911
+ const formatArr = []
912
+ const dataArr = []
913
+
914
+ // 从config中取出所有数据,根据dataIndex的开头内容进行拼接
915
+ this.config.columns.forEach(row => row.forEach(cell => {
916
+ if (cell.dataIndex && cell.dataIndex.startsWith(dataName)) {
917
+ formatArr.push(cell.format)
918
+ dataArr.push(this.configData[cell.dataIndex])
919
+ }
920
+ }))
921
+
922
+ const text = []
923
+ const data = []
924
+
925
+ formatArr.forEach(word => {
926
+ const temp = word.split('{}')
927
+ temp.forEach(char => {
928
+ if (char !== '') {
929
+ text.push(char)
930
+ }
931
+ })
932
+ })
933
+
934
+ dataArr.forEach(item => {
935
+ item.forEach(num => {
936
+ data.push(num)
937
+ })
938
+ })
939
+
940
+ let result = ''
941
+ for (let i = 0; i < data.length; i++) {
942
+ result += data[i]
943
+ result += text[i]
944
+ }
945
+
946
+ return result
947
+ },
948
+ },
949
+ beforeMount () {
950
+ if (this.useOssForImg) {
951
+ this.uploadParams.resUploadMode = 'oss'
952
+ }
953
+ }
954
+ }
955
+
956
+ </script>
957
+
958
+ <style scoped lang="less">
959
+ .inputsDiv {
960
+ display: flex;
961
+ justify-content: space-between;
962
+
963
+ .inputsDivItem {
964
+ display: flex;
965
+ align-items: center;
966
+ padding: 0 4px;
967
+ white-space: nowrap;
968
+
969
+ .inputsDivItemLabel {
970
+ padding: 0 4px;
971
+ }
972
+ }
973
+ }
974
+
975
+ .tdNoBorder {
976
+ border-left: 1px solid #000;
977
+ border-right: 1px solid #000;
978
+ padding: 8px;
979
+ }
980
+
981
+ .tdWithBorder {
982
+ border: 1px solid #000;
983
+ padding: 8px;
984
+ }
985
+
986
+ .tdWithNoTopBorder {
987
+ border-top-style: none;
988
+ border-left: 1px solid #000;
989
+ border-right: 1px solid #000;
990
+ border-bottom: 1px solid #000;
991
+ padding: 8px;
992
+ }
993
+
994
+ .required-field-error {
995
+ border-color: #ff4d4f !important;
996
+ box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2) !important;
997
+ }
998
+
999
+ .required-message {
1000
+ color: #ff4d4f;
1001
+ font-size: 12px;
1002
+ margin-top: 4px;
1003
+ line-height: 1.2;
1004
+ }
1005
+ </style>