vue2-client 1.12.2 → 1.12.3-9.alpha

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 (418) hide show
  1. package/.cursorrules +19 -19
  2. package/.env +19 -19
  3. package/.env.gaslink +19 -19
  4. package/.env.his +19 -19
  5. package/.env.iot +19 -0
  6. package/.env.liuli +19 -19
  7. package/.env.revenue +19 -19
  8. package/.env.scada +19 -19
  9. package/.eslintrc.js +90 -90
  10. package/CHANGELOG.md +824 -824
  11. package/Components.md +60 -60
  12. package/babel.config.js +4 -1
  13. package/docs/Logic/345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +45 -45
  14. package/docs/LowCode/lowcode.md +155 -155
  15. package/docs/LowCode/lowcodeForDeveloper.md +230 -230
  16. package/docs/index.md +30 -30
  17. package/docs//345/207/275/346/225/260/344/275/277/347/224/250/347/233/270/345/205/263.md +175 -174
  18. package/index.js +31 -31
  19. package/jest-transform-stub.js +8 -8
  20. package/jest.config.js +22 -22
  21. package/jest.setup.js +7 -7
  22. package/jsconfig.json +19 -19
  23. package/package.json +108 -108
  24. package/public/his/editor/editor.html +51 -51
  25. package/public/his/editor/mock/bind_data.html +779 -779
  26. package/public/his/editor/mock/data_table.html +40 -40
  27. package/public/his/editor/mock/sign.html +75 -75
  28. package/public/his/editor/vender/JsBarcode.all.js +3669 -3669
  29. package/public/his/editor/vender/date97/My97DatePicker.htm +65 -65
  30. package/public/his/editor/vender/date97/WdatePicker.js +677 -677
  31. package/public/his/editor/vender/date97/calendar.js +4 -4
  32. package/public/his/editor/vender/date97/lang/en.js +13 -13
  33. package/public/his/editor/vender/date97/lang/zh-cn.js +13 -13
  34. package/public/his/editor/vender/date97/lang/zh-tw.js +13 -13
  35. package/public/his/editor/vender/date97/skin/WdatePicker.css +10 -10
  36. package/public/his/editor/vender/date97/skin/default/datepicker.css +328 -328
  37. package/public/his/editor/vender/date97/skin/ext/datepicker.css +308 -308
  38. package/public/his/editor/vender/date97/skin/whyGreen/datepicker.css +255 -255
  39. package/public/his/editor/vender/diff.js +1627 -1627
  40. package/public/his/editor/vender/editor.js +1 -1
  41. package/public/his/editor/vender/fabric.js +31187 -31187
  42. package/public/his/editor/vender/jquery/jquery.base64.js +190 -190
  43. package/public/his/editor/vender/jquery/jquery.js +10872 -10872
  44. package/public/his/editor/vender/jquery/jquery.print.js +255 -255
  45. package/public/his/editor/vender/jquery/zTreeStyle/zTreeStyle.css +96 -96
  46. package/public/his/editor/vender/mui/mui.min.css +4 -4
  47. package/public/his/editor/vender/mui/mui.min.js +5 -5
  48. package/public/his/editor/vender/mui/mui.picker.min.css +6 -6
  49. package/public/his/editor/vender/mui/mui.picker.min.js +6 -6
  50. package/public/his/editor/vender/qrcode.js +7 -7
  51. package/public/his/editor/vender/requirejs/require.js +2145 -2145
  52. package/public/his/editor/vender/signature/jSignature.CompressorSVG.js +518 -518
  53. package/public/his/editor/vender/signature/jSignature.UndoButton.js +164 -164
  54. package/public/his/editor/vender/signature/jSignature.js +1486 -1486
  55. package/public/his/editor/vender/validator.js +5094 -5094
  56. package/public/his/editor/vender/weui/weui.css +5659 -5659
  57. package/public/his/editor/vender/weui/weui.min.css +4 -4
  58. package/public/his/editor/vender/weui/weui.min.js +11 -11
  59. package/public/index.html +27 -27
  60. package/src/ReportView.js +19 -19
  61. package/src/assets/img/querySlotDemo.svg +15 -15
  62. package/src/assets/svg/badtwo.svg +1 -1
  63. package/src/assets/svg/goodtwo.svg +1 -1
  64. package/src/base-client/components/AI/AskAiBtn.vue +136 -136
  65. package/src/base-client/components/AI/demo.vue +31 -31
  66. package/src/base-client/components/common/AMisRender/index.js +3 -3
  67. package/src/base-client/components/common/AMisRender/index.vue +263 -263
  68. package/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox.vue +470 -470
  69. package/src/base-client/components/common/AddressSearchCombobox/IcMapIcon.vue +16 -16
  70. package/src/base-client/components/common/AddressSearchCombobox/demo.vue +36 -36
  71. package/src/base-client/components/common/AddressSearchCombobox/ic_map.svg +6 -6
  72. package/src/base-client/components/common/AmapMarker/AmapPointRendering.vue +120 -120
  73. package/src/base-client/components/common/CitySelect/index.js +3 -3
  74. package/src/base-client/components/common/CitySelect/index.md +109 -109
  75. package/src/base-client/components/common/CreateQuery/CreateQuery.vue +669 -669
  76. package/src/base-client/components/common/CreateQuery/CreateQueryItem.vue +1014 -1014
  77. package/src/base-client/components/common/CreateQuery/index.js +3 -3
  78. package/src/base-client/components/common/CreateQuery/index.md +42 -42
  79. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQuery.vue +452 -452
  80. package/src/base-client/components/common/CreateSimpleFormQuery/CreateSimpleFormQueryItem.vue +511 -511
  81. package/src/base-client/components/common/CreateSimpleFormQuery/index.js +3 -3
  82. package/src/base-client/components/common/CreateSimpleFormQuery/index.md +42 -42
  83. package/src/base-client/components/common/FormGroupEdit/FormGroupEdit.vue +149 -149
  84. package/src/base-client/components/common/FormGroupEdit/index.js +3 -3
  85. package/src/base-client/components/common/FormGroupEdit/index.md +43 -43
  86. package/src/base-client/components/common/FormGroupQuery/FormGroupQuery.vue +166 -166
  87. package/src/base-client/components/common/FormGroupQuery/index.js +3 -3
  88. package/src/base-client/components/common/FormGroupQuery/index.md +43 -43
  89. package/src/base-client/components/common/JSONToTree/jsontotree.vue +271 -271
  90. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorModal.vue +108 -108
  91. package/src/base-client/components/common/LowCodeComponent/LowCodeEditorPanel.vue +413 -413
  92. package/src/base-client/components/common/LowCodeComponent/LowCodePageOrganization.vue +502 -502
  93. package/src/base-client/components/common/LowCodeComponent/LowCodeRender.vue +728 -728
  94. package/src/base-client/components/common/LowCodeComponent/LowCodeRenderEnter.vue +29 -29
  95. package/src/base-client/components/common/LowCodeComponent/LowCodeUIStore.vue +219 -219
  96. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeAddPageModal.vue +117 -117
  97. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeCustomJSModal.vue +80 -80
  98. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeEventEditorModal.vue +398 -398
  99. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLifeCycleModal.vue +65 -65
  100. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicCallbackModal.vue +64 -64
  101. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeLogicParamModal.vue +73 -73
  102. package/src/base-client/components/common/LowCodeComponent/modal/lowCodeRunFunctionParamModal.vue +76 -76
  103. package/src/base-client/components/common/PersonSetting/PersonSetting.vue +208 -208
  104. package/src/base-client/components/common/PersonSetting/index.js +3 -3
  105. package/src/base-client/components/common/Recording/Recording.vue +243 -243
  106. package/src/base-client/components/common/Recording/index.js +3 -3
  107. package/src/base-client/components/common/Tree/Tree.vue +149 -149
  108. package/src/base-client/components/common/Tree/index.js +2 -2
  109. package/src/base-client/components/common/Upload/index.js +3 -3
  110. package/src/base-client/components/common/XAddForm/XAddForm.vue +113 -113
  111. package/src/base-client/components/common/XAddNativeForm/XAddNativeForm.vue +1146 -1146
  112. package/src/base-client/components/common/XAddNativeForm/index.md +146 -146
  113. package/src/base-client/components/common/XAddNativeFormOA/XAddNativeFormOA.vue +303 -303
  114. package/src/base-client/components/common/XAddNativeFormOA/index.js +3 -3
  115. package/src/base-client/components/common/XAddNativeFormOA/index.md +146 -146
  116. package/src/base-client/components/common/XAddReport/index.js +3 -3
  117. package/src/base-client/components/common/XAddReport/index.md +56 -56
  118. package/src/base-client/components/common/XBadge/XBadge.vue +94 -94
  119. package/src/base-client/components/common/XButtons/XButtonDemo.vue +28 -28
  120. package/src/base-client/components/common/XButtons/XButtons.vue +71 -71
  121. package/src/base-client/components/common/XButtons/index.js +3 -3
  122. package/src/base-client/components/common/XButtons/index.md +61 -61
  123. package/src/base-client/components/common/XCard/XCard.vue +64 -64
  124. package/src/base-client/components/common/XCardSet/XCardSet.vue +300 -0
  125. package/src/base-client/components/common/XCheckList/XCheckList.vue +106 -106
  126. package/src/base-client/components/common/XCheckList/XCheckListDemo.vue +41 -41
  127. package/src/base-client/components/common/XCollapse/XCollapse.vue +154 -0
  128. package/src/base-client/components/common/XConversation/XConversation.vue +87 -2
  129. package/src/base-client/components/common/XConversation/XConversationDemo.vue +28 -28
  130. package/src/base-client/components/common/XDataCard/XDataCard.vue +47 -21
  131. package/src/base-client/components/common/XDataCard/index.js +3 -3
  132. package/src/base-client/components/common/XDataCard/index.md +1 -1
  133. package/src/base-client/components/common/XDataDrawer/XDataDrawer.vue +180 -180
  134. package/src/base-client/components/common/XDataDrawer/index.js +3 -3
  135. package/src/base-client/components/common/XDataDrawer/index.md +41 -41
  136. package/src/base-client/components/common/XDatePicker/demo.vue +153 -153
  137. package/src/base-client/components/common/XDatePicker/index.vue +269 -259
  138. package/src/base-client/components/common/XDescriptions/XDescriptions.vue +169 -169
  139. package/src/base-client/components/common/XDescriptions/index.js +3 -3
  140. package/src/base-client/components/common/XDescriptions/index.md +83 -83
  141. package/src/base-client/components/common/XDetailsView/XDetailsView.vue +238 -238
  142. package/src/base-client/components/common/XDetailsView/index.js +3 -3
  143. package/src/base-client/components/common/XForm/XForm.vue +1 -1
  144. package/src/base-client/components/common/XForm/XFormItem.vue +1264 -1254
  145. package/src/base-client/components/common/XForm/XStatusButton.vue +54 -54
  146. package/src/base-client/components/common/XForm/XTreeSelect.vue +1 -2
  147. package/src/base-client/components/common/XForm/demo.vue +105 -0
  148. package/src/base-client/components/common/XForm/index.md +178 -178
  149. package/src/base-client/components/common/XForm/itemComponent/XClickChangeBtn/index.vue +49 -49
  150. package/src/base-client/components/common/XFormGroup/index.js +3 -3
  151. package/src/base-client/components/common/XFormGroup/index.md +38 -38
  152. package/src/base-client/components/common/XFormGroupDetails/XFormGroupDetails.vue +72 -72
  153. package/src/base-client/components/common/XFormGroupDetails/index.js +3 -3
  154. package/src/base-client/components/common/XFormTable/demo.vue +11 -3
  155. package/src/base-client/components/common/XFormTable/index.md +92 -92
  156. package/src/base-client/components/common/XImportExcel/XImportExcel.vue +167 -167
  157. package/src/base-client/components/common/XLabelSelect/XLabelSelect.vue +110 -110
  158. package/src/base-client/components/common/XLabelSelect/XLabelSelectDemo.vue +35 -35
  159. package/src/base-client/components/common/XLicensePlate/XLicensePlate.vue +193 -193
  160. package/src/base-client/components/common/XLicensePlate/XLicensePlateDemo.vue +48 -48
  161. package/src/base-client/components/common/XPrint/Demo.vue +41 -41
  162. package/src/base-client/components/common/XPrint/OpenInvoice.vue +21 -21
  163. package/src/base-client/components/common/XPrint/PrintBill.vue +302 -302
  164. package/src/base-client/components/common/XPrint/PrintHtml.js +98 -98
  165. package/src/base-client/components/common/XPrint/css/hiPrintCss.js +359 -359
  166. package/src/base-client/components/common/XPrint/css/lodopCss.js +26 -26
  167. package/src/base-client/components/common/XPrint/css/print-lock.css +351 -351
  168. package/src/base-client/components/common/XPrint/index.vue +97 -97
  169. package/src/base-client/components/common/XRate/demo.vue +102 -0
  170. package/src/base-client/components/common/XRate/index.vue +136 -0
  171. package/src/base-client/components/common/XReport/XReport.vue +892 -892
  172. package/src/base-client/components/common/XReport/XReportDesign.vue +463 -463
  173. package/src/base-client/components/common/XReport/XReportJsonRender.vue +381 -381
  174. package/src/base-client/components/common/XReport/index.js +3 -3
  175. package/src/base-client/components/common/XReport/index.md +44 -44
  176. package/src/base-client/components/common/XReport/print.js +186 -186
  177. package/src/base-client/components/common/XReportDrawer/index.js +3 -3
  178. package/src/base-client/components/common/XReportGrid/XReport.vue +240 -305
  179. package/src/base-client/components/common/XReportGrid/XReportDemo.vue +0 -2
  180. package/src/base-client/components/common/XReportGrid/XReportDesign.vue +115 -345
  181. package/src/base-client/components/common/XReportGrid/XReportTrGroup.vue +100 -723
  182. package/src/base-client/components/common/XReportGrid/index.js +3 -3
  183. package/src/base-client/components/common/XReportGrid/index.md +44 -44
  184. package/src/base-client/components/common/XReportSlot/XReportSlot.vue +110 -110
  185. package/src/base-client/components/common/XReportSlot/index.js +3 -3
  186. package/src/base-client/components/common/XReportSlot/index.md +48 -48
  187. package/src/base-client/components/common/XSimpleDescriptions/XSimpleDescriptions.vue +166 -166
  188. package/src/base-client/components/common/XSimpleDescriptions/index.js +3 -3
  189. package/src/base-client/components/common/XSimpleDescriptions/index.md +7 -7
  190. package/src/base-client/components/common/XStepView/XStepView.vue +252 -252
  191. package/src/base-client/components/common/XStepView/index.js +3 -3
  192. package/src/base-client/components/common/XStepView/index.md +31 -31
  193. package/src/base-client/components/common/XTab/XTabDemo.vue +22 -22
  194. package/src/base-client/components/common/XTab/index.js +3 -3
  195. package/src/base-client/components/common/XTable/CustomFuncCel.vue +51 -51
  196. package/src/base-client/components/common/XTable/TableCellRenderer.vue +161 -161
  197. package/src/base-client/components/common/XTable/XTable.vue +3 -0
  198. package/src/base-client/components/common/XTable/XTableWrapper.vue +244 -240
  199. package/src/base-client/components/common/XTable/index.md +255 -255
  200. package/src/base-client/components/common/XTagGroup/index.vue +52 -52
  201. package/src/base-client/components/common/XTree/XTree.vue +424 -424
  202. package/src/base-client/components/common/XTree/index.js +3 -3
  203. package/src/base-client/components/common/XTree/index.md +36 -36
  204. package/src/base-client/components/common/XTreeOne/XTreeOne.vue +113 -113
  205. package/src/base-client/components/common/XTreeOne/XTreeOnePro.vue +128 -128
  206. package/src/base-client/components/common/richTextModal/index.vue +56 -56
  207. package/src/base-client/components/common/richTextModal/richDemo.vue +48 -48
  208. package/src/base-client/components/his/XHDescriptions/XHDescriptions.vue +172 -0
  209. package/src/base-client/components/his/XHisEditor/XHisEditor.vue +360 -359
  210. package/src/base-client/components/his/XHisEditor/index.js +3 -3
  211. package/src/base-client/components/index.js +51 -51
  212. package/src/base-client/components/layout/XPageView/XErrorView.vue +11 -11
  213. package/src/base-client/components/layout/XPageView/XPageView.vue +155 -155
  214. package/src/base-client/components/layout/XPageView/index.js +3 -3
  215. package/src/base-client/components/layout/XPageView/index.md +38 -38
  216. package/src/base-client/components/layout/XTreeView/XTreeView.vue +130 -130
  217. package/src/base-client/components/layout/XTreeView/index.js +3 -3
  218. package/src/base-client/components/layout/XTreeView/index.md +46 -46
  219. package/src/base-client/components/system/DictionaryDetailsView/DictionaryDetailsView.vue +232 -232
  220. package/src/base-client/components/system/QueryParamsDetailsView/QueryParamsDetailsView.vue +281 -281
  221. package/src/base-client/plugins/AppData.js +121 -121
  222. package/src/base-client/plugins/Config.js +19 -19
  223. package/src/base-client/plugins/GetLoginInfoService.js +183 -183
  224. package/src/base-client/plugins/Recording.js +258 -258
  225. package/src/base-client/plugins/index.js +23 -23
  226. package/src/base-client/plugins/tabs-page-plugin.js +39 -39
  227. package/src/bootstrap.js +42 -42
  228. package/src/components/Charts/Bar.vue +62 -62
  229. package/src/components/Charts/ChartCard.vue +134 -134
  230. package/src/components/Charts/Liquid.vue +67 -67
  231. package/src/components/Charts/MiniArea.vue +39 -39
  232. package/src/components/Charts/MiniBar.vue +39 -39
  233. package/src/components/Charts/MiniProgress.vue +75 -75
  234. package/src/components/Charts/MiniSmoothArea.vue +40 -40
  235. package/src/components/Charts/Radar.vue +68 -68
  236. package/src/components/Charts/RankList.vue +77 -77
  237. package/src/components/Charts/TagCloud.vue +113 -113
  238. package/src/components/Charts/TransferBar.vue +64 -64
  239. package/src/components/Charts/Trend.vue +82 -82
  240. package/src/components/Charts/chart.less +12 -12
  241. package/src/components/Charts/smooth.area.less +13 -13
  242. package/src/components/CodeMirror/inedx.vue +118 -118
  243. package/src/components/CodeMirror/setting.js +40 -40
  244. package/src/components/FilePreview/FilePreview.vue +166 -166
  245. package/src/components/HeightScanner/index.vue +571 -571
  246. package/src/components/NumberInfo/NumberInfo.vue +54 -54
  247. package/src/components/NumberInfo/index.js +3 -3
  248. package/src/components/NumberInfo/index.less +54 -54
  249. package/src/components/NumberInfo/index.md +43 -43
  250. package/src/components/card/ChartCard.vue +79 -79
  251. package/src/components/chart/Bar.vue +60 -60
  252. package/src/components/chart/MiniArea.vue +67 -67
  253. package/src/components/chart/MiniBar.vue +59 -59
  254. package/src/components/chart/MiniProgress.vue +57 -57
  255. package/src/components/chart/Radar.vue +80 -80
  256. package/src/components/chart/RankingList.vue +60 -60
  257. package/src/components/chart/Trend.vue +79 -79
  258. package/src/components/chart/index.less +9 -9
  259. package/src/components/checkbox/ColorCheckbox.vue +157 -157
  260. package/src/components/checkbox/ImgCheckbox.vue +117 -117
  261. package/src/components/checkbox/ImgCheckboxGroup.vue +76 -76
  262. package/src/components/checkbox/index.js +9 -9
  263. package/src/components/exception/ExceptionPage.vue +70 -70
  264. package/src/components/g2Charts/constants.js +202 -202
  265. package/src/components/g2Charts/demo.vue +808 -808
  266. package/src/components/g2Charts/designer.vue +228 -228
  267. package/src/components/g2Charts/designerBaseConfig.vue +61 -61
  268. package/src/components/g2Charts/designerDataConfig.vue +259 -259
  269. package/src/components/g2Charts/designerStyleConfig.vue +16 -16
  270. package/src/components/g2Charts/index.vue +397 -397
  271. package/src/components/index.js +36 -36
  272. package/src/components/input/IInput.vue +66 -66
  273. package/src/components/menu/SideMenu.vue +75 -75
  274. package/src/components/menu/menu.js +273 -273
  275. package/src/components/setting/Setting.vue +234 -234
  276. package/src/components/tool/AStepItem.vue +60 -60
  277. package/src/config/CreateQueryConfig.js +325 -325
  278. package/src/config/default/antd.config.js +89 -89
  279. package/src/config/default/setting.config.js +55 -55
  280. package/src/font-style/font.css +4 -4
  281. package/src/layouts/CommonLayout.vue +56 -56
  282. package/src/layouts/GridView.vue +43 -45
  283. package/src/layouts/PageLayout.vue +151 -151
  284. package/src/layouts/SinglePageView.vue +136 -136
  285. package/src/layouts/header/AdminHeader.vue +132 -132
  286. package/src/layouts/header/HeaderNotice.vue +177 -177
  287. package/src/layouts/header/InstitutionDetail.vue +181 -181
  288. package/src/layouts/tabs/TabsHead.vue +189 -189
  289. package/src/layouts/tabs/TabsView.vue +389 -389
  290. package/src/lib.js +1 -1
  291. package/src/logic/plugins/common/DateTools.js +3 -0
  292. package/src/logic/plugins/common/VueTools.js +30 -0
  293. package/src/logic/plugins/index.js +3 -1
  294. package/src/main.js +34 -34
  295. package/src/mock/extend/index.js +84 -84
  296. package/src/mock/goods/index.js +108 -108
  297. package/src/pages/AMisDemo/AMisDemo.vue +325 -325
  298. package/src/pages/AMisDemo/AMisDemo2.vue +74 -74
  299. package/src/pages/DefaultExample/index.vue +77 -77
  300. package/src/pages/DynamicStatistics/ChartSelector.vue +331 -331
  301. package/src/pages/DynamicStatistics/DataTabs.vue +83 -83
  302. package/src/pages/DynamicStatistics/DynamicTable.vue +128 -128
  303. package/src/pages/DynamicStatistics/EvaluationArea.vue +69 -69
  304. package/src/pages/DynamicStatistics/FavoriteList.vue +50 -50
  305. package/src/pages/DynamicStatistics/QuestionHistoryAndFavorites.vue +591 -591
  306. package/src/pages/DynamicStatistics/SearchBar.vue +192 -192
  307. package/src/pages/DynamicStatistics/index.vue +282 -282
  308. package/src/pages/Example/childIndex.vue +15 -15
  309. package/src/pages/Example/index.vue +30 -30
  310. package/src/pages/LogicCallExample/index.vue +10 -0
  311. package/src/pages/NewDynamicStatistics/ChartSelector.vue +331 -331
  312. package/src/pages/NewDynamicStatistics/DataTabs.vue +122 -122
  313. package/src/pages/NewDynamicStatistics/DynamicTable.vue +128 -128
  314. package/src/pages/NewDynamicStatistics/EvaluationArea.vue +69 -69
  315. package/src/pages/NewDynamicStatistics/FavoriteList.vue +50 -50
  316. package/src/pages/NewDynamicStatistics/QuestionHistoryAndFavorites.vue +289 -289
  317. package/src/pages/NewDynamicStatistics/SearchBar.vue +193 -193
  318. package/src/pages/NewDynamicStatistics/index.vue +258 -258
  319. package/src/pages/Recording/index.vue +77 -77
  320. package/src/pages/ServiceReview/index.vue +284 -284
  321. package/src/pages/SubExample/index.vue +26 -26
  322. package/src/pages/WorkflowDetail/WorkFlowDemo.vue +47 -32
  323. package/src/pages/WorkflowDetail/WorkflowDetail.vue +235 -230
  324. package/src/pages/WorkflowDetail/WorkflowPageDetail/LeaveMessage.vue +131 -131
  325. package/src/pages/WorkflowDetail/WorkflowPageDetail/TrimTextTail.vue +23 -23
  326. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformation.vue +302 -302
  327. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowBaseInformationDetails.vue +276 -276
  328. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandle.vue +876 -864
  329. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowHandleReso.vue +997 -997
  330. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkFlowTimeline.vue +222 -222
  331. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkOrderParentDetails.vue +233 -233
  332. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowDetailResso.vue +261 -261
  333. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowListResolution.vue +248 -248
  334. package/src/pages/WorkflowDetail/WorkflowPageDetail/WorkflowLog.vue +73 -73
  335. package/src/pages/XPageViewExample/index.vue +38 -38
  336. package/src/pages/XReportView/index.vue +64 -64
  337. package/src/pages/XTreeOneProExample/index.vue +67 -67
  338. package/src/pages/dashboard/workplace/WorkPlace.vue +141 -141
  339. package/src/pages/login/Login.vue +378 -378
  340. package/src/pages/login/LoginV3.vue +389 -389
  341. package/src/pages/lowCode/lowCodeEditor.vue +1219 -1219
  342. package/src/pages/lowCode/lowCodeRenderPage.vue +43 -43
  343. package/src/pages/report/ReportTable.js +124 -124
  344. package/src/pages/resourceManage/orgListManage.vue +98 -98
  345. package/src/pages/system/dictionary/index.vue +44 -44
  346. package/src/pages/system/monitor/loginInfor/index.vue +37 -37
  347. package/src/pages/system/monitor/operLog/index.vue +37 -37
  348. package/src/pages/system/settings/modifyPassword.vue +117 -117
  349. package/src/pages/system/ticket/index.vue +480 -480
  350. package/src/pages/system/ticket/submitTicketSuccess.vue +484 -484
  351. package/src/pages/userInfoDetailManage/ChangeMeterRecordQuery/index.vue +64 -64
  352. package/src/pages/userInfoDetailManage/FillCardRecordQuery/index.vue +76 -76
  353. package/src/pages/userInfoDetailManage/FillGasRecordQuery/index.vue +74 -74
  354. package/src/pages/userInfoDetailManage/InfoChangeRecordQuery/index.vue +64 -64
  355. package/src/pages/userInfoDetailManage/InstructRecordQuery/index.vue +64 -64
  356. package/src/pages/userInfoDetailManage/MachineRecordQuery/index.vue +74 -74
  357. package/src/pages/userInfoDetailManage/MeterParamRecordQuery/index.vue +64 -64
  358. package/src/pages/userInfoDetailManage/OtherChargeRecordQuery/index.vue +74 -74
  359. package/src/pages/userInfoDetailManage/TransferRecordQuery/index.vue +66 -66
  360. package/src/pages/userInfoDetailManage/UserChargeRecordQuery/index.vue +92 -92
  361. package/src/pages/userInfoDetailManage/UserHandRecordQuery/index.vue +86 -86
  362. package/src/pages/userInfoDetailManage/UserRecordQuery/index.vue +73 -73
  363. package/src/pages/userInfoDetailManage/WatchCollectionRecordQuery/index.vue +64 -64
  364. package/src/pages/userInfoDetailManage/index.vue +82 -82
  365. package/src/pages/userInfoDetailManage/userInfoDetailQueryTabs.vue +132 -132
  366. package/src/plugins/EventLogPlugin.js +33 -33
  367. package/src/plugins/FindParentsData.js +17 -17
  368. package/src/plugins/HiPrintPlugin.js +164 -124
  369. package/src/router/async/config.async.js +35 -35
  370. package/src/router/async/router.map.js +117 -116
  371. package/src/router.js +19 -19
  372. package/src/services/DataModel.js +30 -30
  373. package/src/services/LodopFuncs.js +137 -137
  374. package/src/services/api/TicketDetailsViewApi.js +46 -46
  375. package/src/services/api/cas.js +79 -79
  376. package/src/services/api/common.js +346 -346
  377. package/src/services/api/entity.js +18 -18
  378. package/src/services/api/index.js +17 -17
  379. package/src/services/api/restTools.js +145 -145
  380. package/src/services/api/workFlow.js +63 -63
  381. package/src/services/apiService.js +16 -16
  382. package/src/services/v3Api.js +116 -116
  383. package/src/store/modules/account.js +115 -115
  384. package/src/store/modules/index.js +5 -5
  385. package/src/store/modules/lowCode.js +33 -33
  386. package/src/store/modules/setting.js +119 -119
  387. package/src/theme/default/style.less +58 -58
  388. package/src/theme/global.less +159 -159
  389. package/src/utils/EncryptUtil.js +6 -7
  390. package/src/utils/authority-utils.js +85 -85
  391. package/src/utils/errorCode.js +6 -6
  392. package/src/utils/formatter.js +74 -74
  393. package/src/utils/htmlToPDF.js +108 -108
  394. package/src/utils/htmlToPDFApi.js +5 -5
  395. package/src/utils/indexedDB.js +3 -1
  396. package/src/utils/login.js +188 -188
  397. package/src/utils/lowcode/lowcodeComponentMixin.js +120 -120
  398. package/src/utils/lowcode/lowcodeLog.js +29 -29
  399. package/src/utils/lowcode/lowcodeUtils.js +373 -373
  400. package/src/utils/lowcode/registerComponentForEditor.js +1 -1
  401. package/src/utils/lowcode/registerComponentForRender.js +11 -11
  402. package/src/utils/map-utils.js +47 -47
  403. package/src/utils/reg.js +95 -95
  404. package/src/utils/request.js +4 -8
  405. package/src/utils/routerUtil.js +17 -0
  406. package/src/utils/runEvalFunction.js +14 -14
  407. package/src/utils/theme-color-replacer-extend.js +92 -92
  408. package/src/utils/util.js +329 -329
  409. package/src/utils/waterMark.js +31 -31
  410. package/test/Amis.spec.js +164 -164
  411. package/test/Tree.spec.js +168 -168
  412. package/test/myDialog.spec.js +47 -47
  413. package/test/request.test.js +17 -17
  414. package/test/util.test.js +53 -53
  415. package/test/v3Api.test.js +1984 -1984
  416. package//350/277/201/347/247/273/346/227/245/345/277/227.md +15 -15
  417. package/.babelrc +0 -3
  418. package/src/base-client/components/common/XReportGrid/XReportJsonRender.vue +0 -380
@@ -1,1254 +1,1264 @@
1
- <template>
2
- <!-- 输入框 -->
3
- <x-form-col
4
- v-if="attr.type === 'input' && show"
5
- :occupyCol="attr.occupyCol"
6
- :labelCol="labelCol"
7
- :flex="attr.flex">
8
- <a-form-model-item
9
- :ref="attr.model"
10
- :label="showLabel?attr.name:undefined"
11
- :prop="attr.prop ? attr.prop : attr.model">
12
- <!-- 如果配置了后置按钮插槽 -->
13
- <a-input-group
14
- v-if="((attr.inputOnAfterName && attr.inputOnAfterFunc) || (attr.inputOnAfterIcon && attr.inputOnAfterIconFunc)) && mode !== '查询'"
15
- style="display: flex; width: 100%; padding: 4px 0"
16
- compact>
17
- <a-input
18
- v-model="form[attr.model]"
19
- :read-only="readOnly"
20
- :disabled="disabled && !readOnly"
21
- :whitespace="true"
22
- @input="attr.dataChangeFunc && debouncedDataChangeFunc()"
23
- :suffix="attr.inputSuffix && mode !== '新增' ? attr.inputSuffix : ''"
24
- @blur="mode !== '查询' && attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
25
- @keyup.enter="mode !== '查询' && attr.inputOnEnterFunc && emitFunc(attr.inputOnEnterFunc, attr)"
26
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
27
- :ref="`${attr.model}input`"/>
28
- <a-button
29
- v-if="attr.inputOnAfterName && attr.inputOnAfterFunc && !attr.inputOnAfterName.includes('|')"
30
- style="width: auto; min-width: 4rem;max-width: 6rem"
31
- type="primary"
32
- @click="emitFunc(attr.inputOnAfterFunc,attr)">
33
- {{ attr.inputOnAfterName }}
34
- </a-button>
35
- <!-- 仅可以配置 一个按钮 以及 一个图标插槽 -->
36
- <a-button
37
- style="width: 2rem; flex-shrink: 0;"
38
- v-else-if="attr.inputOnAfterIcon"
39
- :type="attr.inputOnAfterIcon && attr.inputOnAfterName ? 'primary' :''"
40
- :icon="attr.inputOnAfterIcon || 'question'"
41
- @click="emitFunc(attr.inputOnAfterIconFunc,attr)">
42
- </a-button>
43
- <!-- 状态按钮 -->
44
- <x-status-button
45
- v-else
46
- :states="parseStates(attr.inputOnAfterName, attr.inputOnAfterFunc)"
47
- v-on="generateDynamicEvents(attr.inputOnAfterFunc, attr)"
48
- style="width: auto; min-width: 4rem; max-width: 6rem"
49
- />
50
- </a-input-group>
51
- <a-input-number
52
- v-else-if="attr.numberInput && !readOnly"
53
- v-model="form[attr.model]"
54
- :whitespace="true"
55
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
56
- :disabled="disabled && !readOnly"
57
- style="width:100%"
58
- @blur="mode !== '查询' && attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
59
- @keyup.enter="mode !== '查询' && attr.inputOnEnterFunc && emitFunc(attr.inputOnEnterFunc, attr)"
60
- :suffix="attr.inputSuffix && mode !== '新增' ? attr.inputSuffix : ''"
61
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
62
- :ref="`${attr.model}input`"/>
63
- <a-input
64
- v-else
65
- v-model="form[attr.model]"
66
- :whitespace="true"
67
- :read-only="readOnly"
68
- :disabled="disabled && !readOnly"
69
- @input="attr.dataChangeFunc && debouncedDataChangeFunc()"
70
- :suffix="attr.inputSuffix && mode !== '新增' ? attr.inputSuffix : ''"
71
- style="width:100%"
72
- @blur="mode !== '查询' && attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
73
- @keyup.enter="mode !== '查询' && attr.inputOnEnterFunc && emitFunc(attr.inputOnEnterFunc, attr)"
74
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
75
- :ref="`${attr.model}input`"/>
76
- </a-form-model-item>
77
- </x-form-col>
78
- <!-- 下拉框 -->
79
- <x-form-col
80
- v-else-if="(attr.type === 'select' || (attr.type === 'rate' && mode==='查询')) && show"
81
- :labelCol="labelCol"
82
- :flex="attr.flex">
83
- <a-form-model-item
84
- v-if="!attr.showMode || mode === '查询' || attr.showMode === 'select' "
85
- :ref="attr.model"
86
- :label="showLabel?attr.name:undefined"
87
- :prop="attr.prop ? attr.prop : attr.model">
88
- <!-- <span slot="label" class="label-box">{{ showLabel?attr.name:undefined }}</span>-->
89
- <a-select
90
- v-if="!attr.lazyLoad || attr.lazyLoad === 'false'"
91
- v-model="form[attr.model]"
92
- :disabled="disabled"
93
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
94
- :filter-option="filterOption"
95
- :getPopupContainer="getPopupContainer"
96
- dropdownClassName="custom-dropdown"
97
- :dropdownMatchSelectWidth="false"
98
- :dropdownStyle="{ position: 'absolute'}"
99
- :placeholder="attr.placeholder ? attr.placeholder : '请选择'"
100
- show-search
101
- >
102
- <a-select-option
103
- v-if="mode === '查询'"
104
- key="999999"
105
- value="">全部
106
- </a-select-option>
107
- <template v-if="attr.keys">
108
- <a-select-option
109
- v-for="(item,index) in attr.keys"
110
- :key="index.value"
111
- :value="item.value + ''">
112
- {{ item.label }}
113
- </a-select-option>
114
- </template>
115
- <template v-else>
116
- <template
117
- v-if="attr.keyName.indexOf('logic@') !== -1 || attr.keyName.indexOf('config@') !== -1
118
- ||attr.keyName.indexOf('search@') !== -1 || attr.keyName.indexOf('search@') !== -1">
119
- <a-select-option
120
- v-for="(item,index) in option"
121
- :key="index.value"
122
- :value="item.value + ''">
123
- <template v-if="attr.keyName.indexOf('config@') !== -1 && item.status">
124
- <!-- 徽标(badge) -->
125
- <a-badge v-if="item.status !== 'gary'" :color="item.status" :text="item.label"/>
126
- <a-badge v-else color="#D9D9D9" :text="item.label"/>
127
- </template>
128
- <template v-else>
129
- {{ item.label }}
130
- </template>
131
- </a-select-option>
132
- </template>
133
- <template
134
- v-else-if="attr.keyName.indexOf('async ') !== -1 || attr.keyName.indexOf('function ') !== -1">
135
- <a-select-option
136
- v-for="(item,index) in optionForFunc"
137
- :key="index.value"
138
- :value="item.value + ''">
139
- <template>
140
- {{ item.label }}
141
- </template>
142
- </a-select-option>
143
- </template>
144
- <template v-else>
145
- <a-select-option
146
- v-for="item in $appdata.getDictionaryList(attr.keyName)"
147
- :key="item.value"
148
- :value="item.value + ''">
149
- <!-- 徽标(badge) -->
150
- <x-badge
151
- :badge-key="attr.keyName"
152
- :replaceText="item.text"
153
- :value="item.value"
154
- :service-name="serviceName"
155
- :env="env"/>
156
- </a-select-option>
157
- </template>
158
- </template>
159
- </a-select>
160
- <a-select
161
- v-else
162
- v-model="form[attr.model]"
163
- :disabled="disabled"
164
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
165
- :filter-option="filterOption"
166
- :getPopupContainer="getPopupContainer"
167
- dropdownClassName="custom-dropdown"
168
- :dropdownMatchSelectWidth="false"
169
- :dropdownStyle="{ position: 'absolute'}"
170
- :placeholder="attr.placeholder ? attr.placeholder : '搜索' + attr.name"
171
- show-search
172
- @search="fetchFunction"
173
- >
174
- <template #notFoundContent>
175
- <a-spin v-if="searching" size="small"/>
176
- </template>
177
- <a-select-option
178
- v-if="mode === '查询'"
179
- key="999999"
180
- value="">全部
181
- </a-select-option>
182
- <a-select-option
183
- v-for="(item,index) in option"
184
- :key="index"
185
- :value="item.value + ''">{{ item.label }}
186
- </a-select-option>
187
- </a-select>
188
- </a-form-model-item>
189
- <a-form-model-item
190
- v-else-if="attr.showMode === 'radioGroup'"
191
- :ref="attr.model"
192
- :label="showLabel?attr.name:undefined"
193
- :prop="attr.prop ? attr.prop : attr.model">
194
- <a-radio-group v-model="form[attr.model]">
195
- <a-radio-button v-for="modeItem in option" :key="modeItem.value" :value="modeItem.value">
196
- {{ modeItem.label }}
197
- </a-radio-button>
198
- </a-radio-group>
199
- </a-form-model-item>
200
- <a-form-model-item
201
- v-else-if="attr.showMode === 'clickChange' && option.length > 0"
202
- :ref="attr.model"
203
- :label="showLabel?attr.name:undefined"
204
- :prop="attr.prop ? attr.prop : attr.model">
205
- <XClickChangeBtn></XClickChangeBtn>
206
- </a-form-model-item>
207
- </x-form-col>
208
- <!-- 多选框 -->
209
- <x-form-col
210
- v-else-if="attr.type === 'checkbox' && show"
211
- :labelCol="labelCol"
212
- :flex="attr.flex">
213
- <a-form-model-item
214
- v-if="!attr.showMode || mode === '查询' || attr.showMode === 'select' "
215
- :ref="attr.model"
216
- :label="showLabel?attr.name:undefined"
217
- :prop="attr.prop ? attr.prop : attr.model">
218
- <a-select
219
- style="width:100%"
220
- v-if="!attr.lazyLoad || attr.lazyLoad === 'false'"
221
- v-model="form[attr.model]"
222
- :disabled="disabled"
223
- :filter-option="filterOption"
224
- :getPopupContainer="getPopupContainer"
225
- :placeholder="attr.placeholder ? attr.placeholder : '请选择'"
226
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
227
- mode="multiple"
228
- show-search
229
- allowClear
230
- >
231
- <template v-if="attr.keys">
232
- <a-select-option
233
- v-for="(item,index) in attr.keys"
234
- :key="index"
235
- :value="item.value + ''">
236
- {{ item.label }}
237
- </a-select-option>
238
- </template>
239
- <template v-else>
240
- <template
241
- v-if="attr.keyName.indexOf('logic@') !== -1 || attr.keyName.indexOf('config@') !== -1
242
- ||attr.keyName.indexOf('search@') !== -1 || attr.keyName.indexOf('search@') !== -1">
243
- <a-select-option
244
- v-for="(item,index) in option"
245
- :key="index"
246
- :value="item.value">{{ item.label }}
247
- </a-select-option>
248
- </template>
249
- <template v-else>
250
- <a-select-option
251
- v-for="item in $appdata.getDictionaryList(attr.keyName)"
252
- :key="item.value"
253
- :value="item.value + ''">{{ item.text }}
254
- </a-select-option>
255
- </template>
256
- </template>
257
- </a-select>
258
- <a-select
259
- v-else
260
- v-model="form[attr.model]"
261
- :disabled="disabled"
262
- :filter-option="filterOption"
263
- :getPopupContainer="getPopupContainer"
264
- :placeholder="attr.placeholder ? attr.placeholder : '搜索' + attr.name"
265
- mode="multiple"
266
- style="width:100%"
267
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
268
- show-search
269
- allowClear
270
- @search="fetchFunction"
271
- >
272
- <template #notFoundContent>
273
- <a-spin v-if="searching" size="small"/>
274
- </template>
275
- <a-select-option
276
- v-for="(item,index) in option"
277
- :key="index"
278
- :value="item.value + ''">{{ item.label }}
279
- </a-select-option>
280
- </a-select>
281
- </a-form-model-item>
282
- <a-form-model-item
283
- v-else
284
- :ref="attr.model"
285
- :label="showLabel?attr.name:undefined"
286
- :prop="attr.prop ? attr.prop : attr.model">
287
- <a-checkbox-group
288
- v-model="form[attr.model]"
289
- :options="option"
290
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
291
- />
292
- </a-form-model-item>
293
- </x-form-col>
294
- <!-- 单选框 -->
295
- <x-form-col
296
- v-else-if="attr.type === 'radio' && show"
297
- :labelCol="labelCol"
298
- :flex="attr.flex">
299
- <a-form-model-item
300
- v-if="!attr.showMode || attr.type === 'radio' "
301
- :ref="attr.model"
302
- :label="showLabel?attr.name:undefined"
303
- :prop="attr.prop ? attr.prop : attr.model">
304
- <a-radio-group
305
- v-model="form[attr.model]"
306
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
307
- >
308
- <template v-if="attr.keys">
309
- <a-radio v-for="(item,index) in attr.keys" :key="index" :value="item.value">
310
- {{ item.label }}
311
- </a-radio>
312
- </template>
313
- <template v-else>
314
- <template
315
- v-if="attr.keyName.indexOf('logic@') !== -1 || attr.keyName.indexOf('config@') !== -1
316
- ||attr.keyName.indexOf('search@') !== -1 || attr.keyName.indexOf('search@') !== -1">
317
- <a-radio v-for="(item,index) in option" :key="index" :value="item.value">
318
- {{ item.label }}
319
- </a-radio>
320
- </template>
321
- <template v-else>
322
- <a-radio v-for="(item,index) in $appdata.getDictionaryList(attr.keyName)" :key="index" :value="item.value">
323
- {{ item.text }}
324
- </a-radio>
325
- </template>
326
- </template>
327
- </a-radio-group>
328
- </a-form-model-item>
329
- <a-form-model-item
330
- v-else-if="attr.showMode === 'radioGroup'"
331
- :ref="attr.model"
332
- :label="showLabel?attr.name:undefined"
333
- :prop="attr.prop ? attr.prop : attr.model">
334
- <a-radio-group v-model="form[attr.model]">
335
- <a-radio-button v-for="modeItem in option" :key="modeItem.value" :value="modeItem.value">
336
- {{ modeItem.label }}
337
- </a-radio-button>
338
- </a-radio-group>
339
- </a-form-model-item>
340
- <a-form-model-item
341
- v-else-if="attr.showMode === 'clickChange' && option.length > 0"
342
- :ref="attr.model"
343
- :label="showLabel?attr.name:undefined"
344
- :prop="attr.prop ? attr.prop : attr.model">
345
- <XClickChangeBtn></XClickChangeBtn>
346
- </a-form-model-item>
347
- </x-form-col>
348
- <!-- 时间 日期 框整合 -->
349
- <x-form-col
350
- v-else-if="['datePicker', 'rangePicker', 'yearPicker', 'monthPicker', 'yearRangePicker', 'monthRangePicker'].includes(attr.type) && show"
351
- :labelCol="labelCol"
352
- :flex="attr.flex">
353
- <a-form-model-item
354
- :ref="attr.model"
355
- :label="showLabel?attr.name:undefined"
356
- :prop="attr.prop ? attr.prop : attr.model">
357
- <XFormDatePicker
358
- :attr="attr"
359
- :mode="mode"
360
- :disabled="disabled"
361
- :readOnly="readOnly"
362
- :showLabel="showLabel"
363
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
364
- v-model="form[attr.model]"/>
365
- </a-form-model-item>
366
- </x-form-col>
367
- <!-- 文本域 -->
368
- <x-form-col
369
- v-else-if="attr.type === 'textarea' && show"
370
- :labelCol="labelCol"
371
- :flex="attr.flex">
372
- <!-- :style="layout === 'inline'?{width:'calc(100% - 60px)'}:{}"-->
373
- <a-form-model-item
374
- :ref="attr.model"
375
- :label="showLabel?attr.name:undefined"
376
- :prop="attr.prop ? attr.prop : attr.model">
377
- <a-textarea
378
- v-model="form[attr.model]"
379
- style="width: 100%;"
380
- :disabled="disabled"
381
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
382
- :rows="4"/>
383
- </a-form-model-item>
384
- </x-form-col>
385
- <!-- 文件上传 -->
386
- <x-form-col
387
- v-else-if="(attr.type === 'file' || attr.type === 'image') && show"
388
- :labelCol="labelCol"
389
- :flex="attr.flex">
390
- <a-form-model-item
391
- :ref="attr.model"
392
- :label="showLabel?attr.name:undefined"
393
- :prop="attr.prop ? attr.prop : attr.model">
394
- <upload
395
- :files="files"
396
- :images="images"
397
- :model="attr"
398
- v-bind="attr"
399
- :service-name="serviceName"
400
- @setFiles="setFiles"></upload>
401
- </a-form-model-item>
402
- </x-form-col>
403
- <!-- 省市区选择框 -->
404
- <x-form-col
405
- v-else-if="attr.type === 'citySelect' && show"
406
- :labelCol="labelCol"
407
- :flex="attr.flex">
408
- <a-form-model-item
409
- :ref="attr.model"
410
- :label="showLabel?attr.name:undefined"
411
- :prop="attr.prop ? attr.prop : attr.model">
412
- <citySelect
413
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
414
- ref="citySelect"
415
- v-model="form[attr.model]"
416
- :contexts="attr.contexts"
417
- :value-type="attr.valueType"
418
- :default-value="form[attr.model]"></citySelect>
419
- </a-form-model-item>
420
- </x-form-col>
421
- <!-- 地点搜索框 -->
422
- <x-form-col
423
- v-else-if="attr.type === 'addressSearch' && show"
424
- :labelCol="labelCol"
425
- :occupyCol="attr.occupyCol"
426
- :flex="attr.flex">
427
- <a-form-model-item
428
- :ref="attr.model"
429
- :label="showLabel?attr.name:undefined"
430
- :prop="attr.prop ? attr.prop : attr.model">
431
- <address-search-combobox
432
- :emitFunc="emitFunc"
433
- :attr="attr"
434
- :read-only="readOnly"
435
- v-model="searchResult"
436
- :resultKeys="{ address: attr.model, coords: `${attr.model}_lng_lat` }"
437
- ref="addressSearchCombobox"
438
- searchResultType="Object"
439
- @onSelect="addressSearchComboboxSelect"
440
- @onDivisionsChange="onDivisionsChange"
441
- ></address-search-combobox>
442
- </a-form-model-item>
443
- </x-form-col>
444
- <!-- 人员选择框 -->
445
- <x-form-col
446
- v-else-if="attr.type === 'personSetting' && show"
447
- :labelCol="labelCol"
448
- :flex="attr.flex">
449
- <a-form-model-item
450
- :ref="attr.model"
451
- :label="showLabel?attr.name:undefined"
452
- :prop="attr.prop ? attr.prop : attr.model">
453
- <PersonSetting v-model="form[attr.model]"></PersonSetting>
454
- </a-form-model-item>
455
- </x-form-col>
456
- <!-- 树形选择框 -->
457
- <x-form-col
458
- v-else-if="attr.type === 'treeSelect' && show"
459
- :labelCol="labelCol"
460
- :flex="attr.flex">
461
- <x-tree-select
462
- @onChange="attr.dataChangeFunc && debouncedDataChangeFunc()"
463
- v-model="form[attr.model]"
464
- :attr="attr"
465
- @mounted="itemMounted"
466
- ref="xTreeSelect">
467
- </x-tree-select>
468
- </x-form-col>
469
- <!-- 列表选择框 -->
470
- <x-form-col
471
- v-else-if="attr.type === 'listSelect' && show"
472
- :labelCol="labelCol"
473
- :flex="attr.flex">
474
- <a-form-model-item
475
- :ref="attr.model"
476
- :label="showLabel?attr.name:undefined"
477
- :style="layout === 'inline'&& attr.occupyCol && attr.occupyCol > 1? {width:`calc(100% - ${attr.occupyCol * 1.533}rem)`}:{}"
478
- :prop="attr.prop ? attr.prop : attr.model">
479
- <a-popover
480
- ref="rowChoosePopover"
481
- :visible="rowChoosePopoverVisible"
482
- title="选择数据"
483
- placement="bottom"
484
- trigger="focus"
485
- :arrowPointAtCenter="true"
486
- :overlayStyle="{ width: '1000px', height: '30vh' }">
487
- <template #content>
488
- <x-report
489
- v-if="isCover"
490
- :use-oss-for-img="false"
491
- :config-name="queryParamsName"
492
- :service-name="serviceName"
493
- :show-img-in-cell="true"
494
- :display-only="true"
495
- :edit-mode="false"
496
- :show-save-button="true"
497
- :no-padding="true"
498
- :dont-format="true"
499
- @rowChoose="rowChoose"
500
- @cancel="closeRowChooseInput"
501
- >
502
- </x-report>
503
- <x-form-table
504
- v-else
505
- title="请选择数据"
506
- :queryParamsName="queryParamsName"
507
- :rowSelectMode="true"
508
- :allowSelectRowNum="1"
509
- :service-name="serviceName"
510
- :fixed-query-form="rowChooseFixedQueryValue"
511
- @rowChoose="rowChoose"
512
- @afterQuery="rowChooseSearchAfterQuery"
513
- ref="rowChooseTable">
514
- <template #button>
515
- <a-button @click="closeRowChooseInput">
516
- 关闭
517
- </a-button>
518
- </template>
519
- </x-form-table>
520
- </template>
521
- <a-input
522
- v-model="form[attr.model]"
523
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
524
- @change="searchRowChooseData"
525
- @focus="showCloseRowChooseInput"/>
526
- </a-popover>
527
- </a-form-model-item>
528
- </x-form-col>
529
- <!-- 评分框 -->
530
- <x-form-col
531
- v-else-if="attr.type === 'rate' && show"
532
- :labelCol="labelCol"
533
- :flex="attr.flex">
534
- <a-form-model-item
535
- :ref="attr.model"
536
- :label="showLabel?attr.name:undefined"
537
- :prop="attr.prop ? attr.prop : attr.model">
538
- <a-rate
539
- v-model="form[attr.model]"
540
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
541
- />
542
- </a-form-model-item>
543
- </x-form-col>
544
- <!-- 区间选择器 -->
545
- <x-form-col
546
- v-else-if="attr.type === 'intervalPicker' && show"
547
- :labelCol="labelCol"
548
- :flex="attr.flex">
549
- <a-form-model-item
550
- :ref="attr.model"
551
- :label="showLabel?attr.name:undefined"
552
- :prop="attr.prop ? attr.prop : attr.model">
553
- <x-interval-picker
554
- v-model="form[attr.model]"
555
- :mode="mode"
556
- :read-only="readOnly"
557
- :disabled="disabled && !readOnly"
558
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
559
- :start-placeholder="attr.startPlaceholder || '起始值'"
560
- :end-placeholder="attr.endPlaceholder || '结束值'"
561
- @blur="attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
562
- />
563
- </a-form-model-item>
564
- </x-form-col>
565
- <!-- 车牌号选择 -->
566
- <x-form-col
567
- v-else-if="attr.type === 'licensePlate' && show"
568
- :labelCol="labelCol"
569
- :flex="attr.flex">
570
- <a-form-model-item
571
- :ref="attr.model"
572
- :label="showLabel?attr.name:undefined"
573
- :style="layout === 'inline'&& attr.occupyCol && attr.occupyCol > 1? {width:`calc(100% - ${attr.occupyCol * 1.533}rem)`}:{}"
574
- :prop="attr.prop ? attr.prop : attr.model">
575
- <!-- 如果配置了后置按钮插槽 -->
576
- <a-input
577
- v-if="mode ==='查询'"
578
- v-model="form[attr.model]"
579
- :whitespace="true"
580
- :read-only="readOnly"
581
- :disabled="disabled && !readOnly"
582
- style="width:100%"
583
- @blur="attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
584
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
585
- :ref="`${attr.model}input`"/>
586
- <x-license-plate
587
- v-else
588
- v-model="form[attr.model]"
589
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
590
- ></x-license-plate>
591
- </a-form-model-item>
592
- </x-form-col>
593
- <!-- 录音 -->
594
- <x-form-col
595
- v-else-if="attr.type === 'recording' && show"
596
- :labelCol="labelCol"
597
- :flex="attr.flex">
598
- <recording
599
- ref="recording"
600
- @recordingData="recordingData"
601
- >
602
- </recording>
603
- </x-form-col>
604
- <!-- 表格录入 -->
605
- <x-form-col
606
- v-else-if="attr.type === 'rowEdit' && show"
607
- :labelCol="labelCol"
608
- :flex="attr.flex">
609
- <a-form-model-item
610
- :ref="attr.model"
611
- :label="showLabel?attr.name:undefined"
612
- :prop="attr.prop ? attr.prop : attr.model">
613
- <x-form-table
614
- :key="'childTable_' + attr.model"
615
- :title="attr.name"
616
- :queryParamsName="attr.crud"
617
- :localEditMode="true"
618
- :fixed-query-form="childTableFixedQueryForm(attr)"
619
- :service-name="serviceName"
620
- @hook:mounted="(h)=>onComponentMounted(h, attr)"
621
- :ref="'childXFormTable_' + attr.model">
622
- </x-form-table>
623
- </a-form-model-item>
624
- </x-form-col>
625
- </template>
626
- <script>
627
- import { debounce } from 'ant-design-vue/lib/vc-table/src/utils'
628
- import XFormCol from '@vue2-client/base-client/components/common/XFormCol'
629
- import XBadge from '@vue2-client/base-client/components/common/XBadge'
630
- import CitySelect from '@vue2-client/base-client/components/common/CitySelect'
631
- import PersonSetting from '@vue2-client/base-client/components/common/PersonSetting'
632
- import AddressSearchCombobox from '@vue2-client/base-client/components/common/AddressSearchCombobox'
633
- import Upload from '@vue2-client/base-client/components/common/Upload'
634
- import moment from 'moment'
635
- import { getConfigByName, runLogic, getConfigByNameAsync } from '@vue2-client/services/api/common'
636
- import * as util from '@vue2-client/utils/util'
637
- import XTreeSelect from '@vue2-client/base-client/components/common/XForm/XTreeSelect'
638
- import { searchToListOption, searchToOption } from '@vue2-client/services/v3Api'
639
- import { mapState } from 'vuex'
640
- import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
641
- import XLicensePlate from '@vue2-client/base-client/components/common/XLicensePlate/XLicensePlate.vue'
642
- import XStatusButton from './XStatusButton.vue'
643
- import XClickChangeBtn from './itemComponent/XClickChangeBtn'
644
- import 'moment/locale/zh-cn'
645
- import XFormDatePicker from '@vue2-client/base-client/components/common/XDatePicker/index.vue'
646
- import XIntervalPicker from '@vue2-client/base-client/components/common/XIntervalPicker/XIntervalPicker.vue'
647
-
648
- export default {
649
- name: 'XFormItem',
650
- components: {
651
- XFormDatePicker,
652
- XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'),
653
- Recording: () => import('@vue2-client/base-client/components/common/Recording/Recording.vue'),
654
- XReport: () => import('@vue2-client/base-client/components/common/XReportGrid/XReport.vue'),
655
- XLicensePlate,
656
- XTreeSelect,
657
- XFormCol,
658
- XBadge,
659
- CitySelect,
660
- PersonSetting,
661
- AddressSearchCombobox,
662
- Upload,
663
- XStatusButton,
664
- XClickChangeBtn,
665
- XIntervalPicker
666
- },
667
- data () {
668
- // 检索去抖
669
- this.fetchFunction = debounce(this.fetchFunction, 800)
670
- return {
671
- option: [],
672
- // 最后检索版本
673
- lastFetchId: 0,
674
- // 检索中
675
- searching: false,
676
- searchResult: '',
677
- optionForFunc: [],
678
- // 控制当前表单项是否展示
679
- show: true,
680
- // moment
681
- moment,
682
- // 行选择器浮层是否显示
683
- rowChoosePopoverVisible: false,
684
- // 行选择器CRUD固定查询值
685
- rowChooseFixedQueryValue: undefined
686
- }
687
- },
688
- props: {
689
- attr: {
690
- type: Object,
691
- default:
692
- () => {
693
- return {}
694
- }
695
- },
696
- form: {
697
- type: Object,
698
- required:
699
- true
700
- },
701
- disabled: {
702
- type: Boolean,
703
- default:
704
- () => {
705
- return false
706
- }
707
- },
708
- readOnly: {
709
- type: Boolean,
710
- default:
711
- () => {
712
- return false
713
- }
714
- },
715
- mode: {
716
- type: String,
717
- default:
718
- () => {
719
- return '查询'
720
- }
721
- },
722
- files: {
723
- type: Array,
724
- default:
725
- () => {
726
- return []
727
- }
728
- },
729
- images: {
730
- type: Array,
731
- default:
732
- () => {
733
- return []
734
- }
735
- },
736
- serviceName: {
737
- type: String,
738
- default:
739
- undefined
740
- },
741
- // 调用logic获取数据源的追加参数
742
- getDataParams: {
743
- type: Object,
744
- default:
745
- undefined
746
- },
747
- // 布局
748
- layout: {
749
- type: String,
750
- default:
751
- 'horizontal'
752
- },
753
- // 环境
754
- env: {
755
- type: String,
756
- default:
757
- () => {
758
- return 'prod'
759
- }
760
- },
761
- // 设置表单值
762
- setForm: {
763
- type: Function,
764
- default: (val) => {
765
- console.log(val)
766
- }
767
- },
768
- showLabel: {
769
- type: Boolean,
770
- default:
771
- () => {
772
- return true
773
- }
774
- },
775
- labelCol: {
776
- type: Object,
777
- default: () => {
778
- return { span: 8 }
779
- }
780
- }
781
- },
782
- provide () {
783
- return {
784
- FormItemContext: this
785
- }
786
- },
787
- created () {
788
- this.init()
789
- if (this.attr.keyName && (this.attr?.keyName?.toString().indexOf('async ') !== -1 || this.attr?.keyName?.toString()?.indexOf('function') !== -1)) {
790
- this.debouncedUpdateOptions = debounce(this.updateOptions, 200)
791
- }
792
- if (this.attr.dataChangeFunc) {
793
- this.debouncedDataChangeFunc = debounce(this.dataChangeFunc, 200)
794
- // 执行一次
795
- this.dataChangeFunc()
796
- }
797
- if (this.attr.showFormItemFunc) {
798
- this.debouncedShowFormItemFunc = debounce(this.showFormItemFunc, 100)
799
- // 执行一次
800
- this.showFormItemFunc()
801
- }
802
- if (this.attr.showQueryFormItemFunc) {
803
- this.debouncedShowQueryFormItemFunc = debounce(this.showQueryFormItemFunc, 100)
804
- // 执行一次
805
- this.showFormItemFunc()
806
- }
807
- // 人员联动框增加监听
808
- if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动人员')) {
809
- this.debouncedUserLinkFunc = debounce(() => this.updateResOptions('人员'), 200)
810
- }
811
- if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动部门')) {
812
- this.debouncedDepLinkFunc = debounce(() => this.updateResOptions('部门'), 200)
813
- }
814
- // xTreeSelect 自己调用 mounted
815
- if (this.attr.type !== 'treeSelect') {
816
- this.$emit('mounted')
817
- }
818
- },
819
- computed: {
820
- ...mapState('account', { currUser: 'user' }),
821
- queryParamsName () {
822
- if (this.attr.keyName.startsWith('function')) {
823
- // 调用异步函数获取内容
824
- return executeStrFunctionByContext(this, this.attr.keyName, [this.form, runLogic, this.mode, getConfigByNameAsync])
825
- } else {
826
- // 按现有方式处理
827
- return this.attr.keyName.split('@')[this.attr.keyName.split('@').length - 1]
828
- }
829
- },
830
- // 判断弹出时是否Cover,弹出只支持Cover以及CRUD
831
- isCover () {
832
- // 如果 queryParamsName 为空,返回空
833
- if (!this.queryParamsName) {
834
- return false
835
- }
836
- const result = this.queryParamsName.endsWith('Cover')
837
- return result
838
- },
839
- },
840
- watch: {
841
- attr: {
842
- handler () {
843
- this.init()
844
- },
845
- deep: true
846
- },
847
- form: {
848
- handler (newVal, oldVal) {
849
- // 如果是从函数获取 options
850
- if (this.attr.keyName && (this.attr.keyName.toString().indexOf('async ') !== -1 || this.attr.keyName.toString().indexOf('function') !== -1)) {
851
- this.debouncedUpdateOptions()
852
- }
853
- // 如果有自定义是否展示表单项函数
854
- if (this.attr.showFormItemFunc) {
855
- this.debouncedShowFormItemFunc()
856
- }
857
- // 如果有自定义是否展示查询表单项函数
858
- if (this.attr.showQueryFormItemFunc) {
859
- this.debouncedShowQueryFormItemFunc()
860
- }
861
- // 地址搜索框赋值
862
- if (this.attr.type === 'addressSearch') {
863
- this.$refs.addressSearchCombobox.addressInput = this.form[this.attr.model]
864
- }
865
- // 数据源来自人员联动时更新数据
866
- if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动人员')) {
867
- this.debouncedUserLinkFunc()
868
- }
869
- // 数据源来自人员联动时更新数据
870
- if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动部门')) {
871
- this.debouncedDepLinkFunc()
872
- }
873
- },
874
- deep: true
875
- }
876
- },
877
- inject: {
878
- getComponentByName: {
879
- default: () => () => {
880
- console.warn('getComponentByName is not provided')
881
- return null // 或者返回一个默认的函数
882
- },
883
- },
884
- registerComponent: {
885
- default: () => () => {
886
- console.warn('registerComponent is not provided')
887
- return null // 或者返回一个默认的函数
888
- },
889
- },
890
- getSelf: {
891
- default: () => () => {
892
- console.warn('getSelf is not provided')
893
- return null // 或者返回一个默认的函数
894
- },
895
- },
896
- },
897
- methods: {
898
- // 把内部的crud表单录入放到表单中,以便外部可以调用
899
- onComponentMounted (h, attr) {
900
- console.log('crud表单', h)
901
- if (attr.crud) {
902
- this.registerComponent(attr.model, this.$refs['childXFormTable_' + attr.model])
903
- }
904
- },
905
- childTableFixedQueryForm (item) {
906
- console.log('传递的form', this.form)
907
- if (this.modifyModelData?.primaryKeyData) {
908
- const fixedForm = {}
909
- fixedForm[item.childTableForeignKeyName] = Object.values(this.modifyModelData.primaryKeyData)[0]
910
- return fixedForm
911
- }
912
- return null
913
- },
914
- // 动态生成事件绑定对象
915
- generateDynamicEvents (inputOnAfterFunc, attr) {
916
- const events = {}
917
- const states = this.parseStates(attr.inputOnAfterName, inputOnAfterFunc)
918
-
919
- states.forEach((state) => {
920
- // 动态绑定事件名到 emitFunc
921
- events[state.event] = () => {
922
- console.info('事件名', state.event)
923
- this.emitFunc(state.event, attr)
924
- }
925
- })
926
-
927
- return events // 返回 { state1Event: handler, state2Event: handler, ... }
928
- },
929
- parseStates (input, events) {
930
- const eventNames = events.split('|')
931
- return input.split('|').map((label, index) => ({
932
- label,
933
- event: eventNames[index] // 如果没有提供事件名称,则使用默认值
934
- }))
935
- },
936
- focusInput () {
937
- if (this.attr.defaultFocus) {
938
- this.$nextTick(h => {
939
- const el = this.$refs[`${this.attr.model}input`]?.$el
940
- let inputEl
941
- if (el) {
942
- if (el.tagName.toLowerCase() === 'input') {
943
- inputEl = el
944
- } else {
945
- inputEl = el.querySelector('input')
946
- }
947
- }
948
- if (inputEl) {
949
- inputEl.focus()
950
- if (inputEl.type === 'number') {
951
- if (inputEl.valueAsNumber) {
952
- inputEl.setSelectionRange(0, inputEl.valueAsNumber.toString().length)
953
- }
954
- } else {
955
- if (inputEl.value) {
956
- inputEl.setSelectionRange(0, inputEl.value.length)
957
- }
958
- }
959
- }
960
- })
961
- }
962
- },
963
- // 更新人员下拉框数据
964
- async updateResOptions (type) {
965
- if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString()?.endsWith(`]联动${type}`)) {
966
- const searchData = { source: `获取${type}`, userid: this.currUser.id }
967
- const startIndex = this.attr.keyName.indexOf('[') + 1
968
- const endIndex = this.attr.keyName.indexOf(']', startIndex)
969
- const fromModel = this.attr.keyName.substring(startIndex, endIndex).replace('.', '_')
970
- const formModelData = this.form[fromModel]
971
- if (fromModel?.length && formModelData?.length) {
972
- await searchToListOption(searchData, res => {
973
- this.getDataCallback(
974
- res.filter(h => {
975
- if (fromModel.indexOf('org') > -1) {
976
- return formModelData?.includes(h.orgid || h.f_organization_id || h.parentid)
977
- } else {
978
- return formModelData?.includes(h?.parentid)
979
- }
980
- }
981
- )
982
- )
983
- })
984
- }
985
- }
986
- },
987
- // js 函数作为数据源
988
- async updateOptions () {
989
- if (this.attr.keyName && (this.attr.keyName.indexOf('async ') !== -1 || this.attr.keyName.indexOf('function ') !== -1)) {
990
- this.optionForFunc = await executeStrFunctionByContext(this, this.attr.keyName, [this.form, runLogic, this.mode, getConfigByNameAsync])
991
- }
992
- },
993
- async dataChangeFunc () {
994
- if (this.attr.dataChangeFunc) {
995
- await executeStrFunctionByContext(this, this.attr.dataChangeFunc, [this.form, this.setForm, this.attr, util, this.mode, runLogic, getConfigByNameAsync])
996
- }
997
- },
998
- async showFormItemFunc () {
999
- if (this.attr.showFormItemFunc) {
1000
- const obj = executeStrFunctionByContext(this, this.attr.showFormItemFunc, [this.form, this.setForm, this.attr, util, this.mode])
1001
- // 判断是 bool 还是 obj 兼容
1002
- if (typeof obj === 'boolean') {
1003
- this.show = obj
1004
- } else if (obj && typeof obj === 'object') {
1005
- // obj 是一个对象,并且不是数组
1006
- this.show = obj?.show
1007
- this.readOnly = obj?.readOnly
1008
- }
1009
- } else {
1010
- this.show = true
1011
- }
1012
- },
1013
- async showQueryFormItemFunc () {
1014
- if (this.attr.showQueryFormItemFunc) {
1015
- const obj = executeStrFunctionByContext(this, this.attr.showQueryFormItemFunc, [this.form, this.setForm, this.attr, util, this.mode])
1016
- // 判断是 bool 还是 obj 兼容
1017
- if (typeof obj === 'boolean') {
1018
- this.show = obj
1019
- } else if (obj && typeof obj === 'object') {
1020
- // obj 是一个对象,并且不是数组
1021
- this.show = obj?.show
1022
- this.readOnly = obj?.readOnly
1023
- }
1024
- } else {
1025
- this.show = true
1026
- }
1027
- },
1028
- init () {
1029
- if (!this.attr.flex) {
1030
- if (this.mode === '新增/修改') {
1031
- if (['horizontal', 'vertical'].includes(this.layout) || ['textarea', 'file', 'image'].includes(this.attr.type)) {
1032
- // 新增修改表单 horizontal 模式下默认为一行
1033
- this.attr.flex = {
1034
- xs: 24,
1035
- sm: 24,
1036
- md: 24,
1037
- lg: 24,
1038
- xl: 24,
1039
- xxl: 24,
1040
- fullWidth: true
1041
- }
1042
- } else {
1043
- // 新增修改表单 vertical 模式下默认为1列
1044
- this.attr.flex = {
1045
- xs: 24,
1046
- sm: 12,
1047
- md: 8,
1048
- lg: 8,
1049
- xl: 6,
1050
- xxl: 6
1051
- }
1052
- }
1053
- } else {
1054
- this.attr.flex = {
1055
- xs: 24,
1056
- sm: 24,
1057
- md: 8,
1058
- lg: 6,
1059
- xl: 6,
1060
- xxl: 6
1061
- }
1062
- }
1063
- }
1064
- if (this.attr.keyName && typeof this.attr.keyName === 'string') {
1065
- if (this.attr.keyName.indexOf('logic@') !== -1) {
1066
- this.getData({}, res => this.getDataCallback(res))
1067
- } else if (this.attr.keyName.indexOf('search@') !== -1) {
1068
- // `tool.getFullTree(this.getRights().where(row.getType()==$organization$))`
1069
- // 判断是否根据角色查询
1070
- let source = this.attr.keyName.substring(7)
1071
- const userid = this.currUser.id
1072
- let roleName = 'roleName'
1073
- if (source.startsWith('根据角色[') && source.endsWith(']获取人员')) {
1074
- const startIndex = source.indexOf('[') + 1
1075
- const endIndex = source.indexOf(']', startIndex)
1076
- roleName = source.substring(startIndex, endIndex)
1077
- source = '根据角色获取人员'
1078
- }
1079
- const searchData = { source, userid, roleName }
1080
- // 判断是否根据某个表单项联动 仅返回列表结构并筛选
1081
- if (source.startsWith('根据表单项[') && source.endsWith(']联动人员')) {
1082
- this.updateResOptions('人员')
1083
- } else if (source.startsWith('根据表单项[') && source.endsWith(']联动部门')) {
1084
- this.updateResOptions('部门')
1085
- } else if (this.attr.type === 'select' || this.attr.type === 'checkbox') {
1086
- // 仅获取最内层数据
1087
- searchToListOption(searchData, res => this.getDataCallback(res))
1088
- } else {
1089
- // 其他资源通用逻辑
1090
- searchToOption(searchData, res => this.getDataCallback(res))
1091
- }
1092
- } else if (this.attr.keyName.indexOf('config@') !== -1) {
1093
- const configName = this.attr.keyName.substring(7)
1094
- getConfigByName(configName, this.serviceName, res => {
1095
- this.getDataCallback(res.value)
1096
- }, this.env === 'dev')
1097
- } else if (this.attr.keyName.indexOf('async ') !== -1 || this.attr.keyName.indexOf('function ') !== -1) {
1098
- this.updateOptions()
1099
- }
1100
- } else if (this.attr.keys) {
1101
- this.getDataCallback(this.attr.keys)
1102
- }
1103
- this.focusInput()
1104
- },
1105
- addressSearchComboboxSelect (data) {
1106
- this.form = Object.assign(this.form, JSON.parse(data))
1107
- },
1108
- onDivisionsChange (data) {
1109
- this.emitFunc('addressSearchComboboxSelect', {
1110
- key: this.attr.model,
1111
- value: data
1112
- })
1113
- },
1114
- getDataCallback (res) {
1115
- this.option = res
1116
- if (this.attr.type === 'treeSelect') {
1117
- this.$nextTick(() => {
1118
- this.$refs.xTreeSelect.init({
1119
- option: this.option,
1120
- form: this.form,
1121
- queryType: this.attr.queryType,
1122
- name: this.attr.name,
1123
- model: this.attr.model,
1124
- mode: this.mode,
1125
- disabled: this.disabled
1126
- })
1127
- })
1128
- } else if (this.attr.type === 'radio' || ['radioGroup', 'clickChange'].includes(this.attr.showMode)) {
1129
- this.initRadioValue()
1130
- }
1131
- },
1132
- initRadioValue () {
1133
- const model = this.attr.model
1134
- if (this.mode === '新增/修改' && (this.form[model] === undefined || this.form[model] === null) && !this.attr.prop) {
1135
- if (this.attr.keys && this.attr.keys.length > 1) {
1136
- this.form[model] = this.attr.keys[0].value
1137
- } else if (this.option.length > 1) {
1138
- this.form[model] = this.option[0].value
1139
- }
1140
- }
1141
- },
1142
- // 文件框时设置上传组件的值
1143
- setFiles (fileIds) {
1144
- if (!this.form[this.attr.model]) {
1145
- this.form[this.attr.model] = []
1146
- }
1147
- this.form[this.attr.model] = [...fileIds]
1148
- },
1149
- // 懒加载检索方法
1150
- fetchFunction (value) {
1151
- this.lastFetchId += 1
1152
- const fetchId = this.lastFetchId
1153
- this.option = []
1154
- this.searching = true
1155
- this.getData({
1156
- word: value
1157
- }, res => {
1158
- if (fetchId !== this.lastFetchId) {
1159
- return
1160
- }
1161
- this.option = res
1162
- this.searching = false
1163
- })
1164
- },
1165
- // 获取数据
1166
- getData (value, callbackFun) {
1167
- if (value !== '') {
1168
- const logicName = this.attr.keyName
1169
- const logic = logicName.substring(6)
1170
- // 调用logic前设置参数
1171
- if (this.getDataParams && this.getDataParams[this.attr.model]) {
1172
- Object.assign(value, this.getDataParams[this.attr.model])
1173
- }
1174
- runLogic(logic, Object.assign(value, {
1175
- orgId: this.currUser.orgid,
1176
- userId: this.currUser.id
1177
- }), this.serviceName, this.env === 'dev').then(res => {
1178
- callbackFun(res)
1179
- }).catch(e => {
1180
- callbackFun([])
1181
- console.error('获取数据失败:' + e)
1182
- })
1183
- }
1184
- },
1185
- filterOption (input, option) {
1186
- const child = option.componentOptions.children[0]
1187
- if (child.text) {
1188
- return child.text.toLowerCase().indexOf(input.toLowerCase()) >= 0
1189
- } else if (child.elm.innerText) {
1190
- return child.elm.innerText.toLowerCase().indexOf(input.toLowerCase()) >= 0
1191
- } else {
1192
- return child.child.value.toLowerCase().indexOf(input.toLowerCase()) >= 0
1193
- }
1194
- },
1195
- // 表单项变更函数中调用 控制表单组中表单项组名为 groupName 的表单是否展示
1196
- // func:x-form-show(显示)/x-form-no-show(不显示)
1197
- emitShowFormFunc (func, groupName) {
1198
- this.emitFunc(func, groupName)
1199
- },
1200
- emitFunc (func, data) {
1201
- this.$emit('x-form-item-emit-func', func, data, data?.model ? this.form[data.model] : this.form)
1202
- },
1203
- itemMounted (h) {
1204
- this.$emit('mounted', h)
1205
- },
1206
- rowChoose (rows) {
1207
- this.$emit('rowChoose', rows, this.attr, this.closeRowChooseInput)
1208
- },
1209
- searchRowChooseData () {
1210
- if (this.searching) {
1211
- return
1212
- }
1213
- this.lastFetchId += 1
1214
- const fetchId = this.lastFetchId
1215
- this.searching = true
1216
- if (fetchId !== this.lastFetchId) {
1217
- return
1218
- }
1219
- this.rowChooseFixedQueryValue = []
1220
- this.rowChooseFixedQueryValue[this.attr.model] = this.form[this.attr.model]
1221
- this.$nextTick(() => {
1222
- this.$refs.rowChooseTable.refresh(true)
1223
- })
1224
- },
1225
- showCloseRowChooseInput () {
1226
- this.rowChoosePopoverVisible = true
1227
- },
1228
- closeRowChooseInput () {
1229
- this.rowChoosePopoverVisible = false
1230
- },
1231
- rowChooseSearchAfterQuery () {
1232
- this.searching = false
1233
- },
1234
- // 获取 recording 转换后的数据
1235
- getRecodingData () {
1236
- return this.$refs.recording.getRecordingData()
1237
- },
1238
- recordingData (data) {
1239
- this.emitFunc('recordingData', data)
1240
- },
1241
- getPopupContainer (triggerNode) {
1242
- return document.body
1243
- // return triggerNode.parentNode
1244
- }
1245
- }
1246
- }
1247
- </script>
1248
-
1249
- <style lang="less" scoped>
1250
- .custom-dropdown {
1251
- position: absolute;
1252
- z-index: 1050;
1253
- }
1254
- </style>
1
+ <template>
2
+ <!-- 输入框 -->
3
+ <x-form-col
4
+ v-if="attr.type === 'input' && show"
5
+ :occupyCol="attr.occupyCol"
6
+ :labelCol="labelCol"
7
+ :flex="attr.flex">
8
+ <a-form-model-item
9
+ :ref="attr.model"
10
+ :label="showLabel?attr.name:undefined"
11
+ :prop="attr.prop ? attr.prop : attr.model">
12
+ <!-- 如果配置了后置按钮插槽 -->
13
+ <a-input-group
14
+ v-if="((attr.inputOnAfterName && attr.inputOnAfterFunc) || (attr.inputOnAfterIcon && attr.inputOnAfterIconFunc)) && mode !== '查询'"
15
+ style="display: flex; width: 100%; padding: 4px 0"
16
+ compact>
17
+ <a-input
18
+ v-model="form[attr.model]"
19
+ :read-only="readOnly"
20
+ :disabled="disabled && !readOnly"
21
+ :whitespace="true"
22
+ @input="attr.dataChangeFunc && debouncedDataChangeFunc()"
23
+ :suffix="attr.inputSuffix && mode !== '新增' ? attr.inputSuffix : ''"
24
+ @blur="mode !== '查询' && attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
25
+ @keyup.enter="mode !== '查询' && attr.inputOnEnterFunc && emitFunc(attr.inputOnEnterFunc, attr)"
26
+ :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
27
+ :ref="`${attr.model}input`"/>
28
+ <a-button
29
+ v-if="attr.inputOnAfterName && attr.inputOnAfterFunc && !attr.inputOnAfterName.includes('|')"
30
+ style="width: auto; min-width: 4rem;max-width: 6rem"
31
+ type="primary"
32
+ @click="emitFunc(attr.inputOnAfterFunc,attr)">
33
+ {{ attr.inputOnAfterName }}
34
+ </a-button>
35
+ <!-- 仅可以配置 一个按钮 以及 一个图标插槽 -->
36
+ <a-button
37
+ style="width: 2rem; flex-shrink: 0;"
38
+ v-else-if="attr.inputOnAfterIcon"
39
+ :type="attr.inputOnAfterIcon && attr.inputOnAfterName ? 'primary' :''"
40
+ :icon="attr.inputOnAfterIcon || 'question'"
41
+ @click="emitFunc(attr.inputOnAfterIconFunc,attr)">
42
+ </a-button>
43
+ <!-- 状态按钮 -->
44
+ <x-status-button
45
+ v-else
46
+ :states="parseStates(attr.inputOnAfterName, attr.inputOnAfterFunc)"
47
+ v-on="generateDynamicEvents(attr.inputOnAfterFunc, attr)"
48
+ style="width: auto; min-width: 4rem; max-width: 6rem"
49
+ />
50
+ </a-input-group>
51
+ <a-input-number
52
+ v-else-if="attr.numberInput && !readOnly"
53
+ v-model="form[attr.model]"
54
+ :whitespace="true"
55
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
56
+ :disabled="disabled && !readOnly"
57
+ style="width:100%"
58
+ @blur="mode !== '查询' && attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
59
+ @keyup.enter="mode !== '查询' && attr.inputOnEnterFunc && emitFunc(attr.inputOnEnterFunc, attr)"
60
+ :suffix="attr.inputSuffix && mode !== '新增' ? attr.inputSuffix : ''"
61
+ :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
62
+ :ref="`${attr.model}input`"/>
63
+ <a-input
64
+ v-else
65
+ v-model="form[attr.model]"
66
+ :whitespace="true"
67
+ :read-only="readOnly"
68
+ :disabled="disabled && !readOnly"
69
+ @input="attr.dataChangeFunc && debouncedDataChangeFunc()"
70
+ :suffix="attr.inputSuffix && mode !== '新增' ? attr.inputSuffix : ''"
71
+ style="width:100%"
72
+ @blur="mode !== '查询' && attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
73
+ @keyup.enter="mode !== '查询' && attr.inputOnEnterFunc && emitFunc(attr.inputOnEnterFunc, attr)"
74
+ :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
75
+ :ref="`${attr.model}input`"/>
76
+ </a-form-model-item>
77
+ </x-form-col>
78
+ <!-- 下拉框 -->
79
+ <x-form-col
80
+ v-else-if="attr.type === 'select' && show"
81
+ :labelCol="labelCol"
82
+ :flex="attr.flex">
83
+ <a-form-model-item
84
+ v-if="!attr.showMode || mode === '查询' || attr.showMode === 'select' "
85
+ :ref="attr.model"
86
+ :label="showLabel?attr.name:undefined"
87
+ :prop="attr.prop ? attr.prop : attr.model">
88
+ <!-- <span slot="label" class="label-box">{{ showLabel?attr.name:undefined }}</span>-->
89
+ <a-select
90
+ v-if="!attr.lazyLoad || attr.lazyLoad === 'false'"
91
+ v-model="form[attr.model]"
92
+ :disabled="disabled"
93
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
94
+ :filter-option="filterOption"
95
+ :getPopupContainer="getPopupContainer"
96
+ dropdownClassName="custom-dropdown"
97
+ :dropdownMatchSelectWidth="false"
98
+ :dropdownStyle="{ position: 'absolute'}"
99
+ :placeholder="attr.placeholder ? attr.placeholder : '请选择'"
100
+ show-search
101
+ >
102
+ <a-select-option
103
+ v-if="mode === '查询'"
104
+ key="999999"
105
+ value="">全部
106
+ </a-select-option>
107
+ <template v-if="attr.keys">
108
+ <a-select-option
109
+ v-for="(item,index) in attr.keys"
110
+ :key="index.value"
111
+ :value="item.value + ''">
112
+ {{ item.label }}
113
+ </a-select-option>
114
+ </template>
115
+ <template v-else>
116
+ <template
117
+ v-if="attr.keyName.indexOf('logic@') !== -1 || attr.keyName.indexOf('config@') !== -1
118
+ ||attr.keyName.indexOf('search@') !== -1 || attr.keyName.indexOf('search@') !== -1">
119
+ <a-select-option
120
+ v-for="(item,index) in option"
121
+ :key="index.value"
122
+ :value="item.value + ''">
123
+ <template v-if="attr.keyName.indexOf('config@') !== -1 && item.status">
124
+ <!-- 徽标(badge) -->
125
+ <a-badge v-if="item.status !== 'gary'" :color="item.status" :text="item.label"/>
126
+ <a-badge v-else color="#D9D9D9" :text="item.label"/>
127
+ </template>
128
+ <template v-else>
129
+ {{ item.label }}
130
+ </template>
131
+ </a-select-option>
132
+ </template>
133
+ <template
134
+ v-else-if="attr.keyName.indexOf('async ') !== -1 || attr.keyName.indexOf('function ') !== -1">
135
+ <a-select-option
136
+ v-for="(item,index) in optionForFunc"
137
+ :key="index.value"
138
+ :value="item.value + ''">
139
+ <template>
140
+ {{ item.label }}
141
+ </template>
142
+ </a-select-option>
143
+ </template>
144
+ <template v-else>
145
+ <a-select-option
146
+ v-for="item in $appdata.getDictionaryList(attr.keyName)"
147
+ :key="item.value"
148
+ :value="item.value + ''">
149
+ <!-- 徽标(badge) -->
150
+ <x-badge
151
+ :badge-key="attr.keyName"
152
+ :replaceText="item.text"
153
+ :value="item.value"
154
+ :service-name="serviceName"
155
+ :env="env"/>
156
+ </a-select-option>
157
+ </template>
158
+ </template>
159
+ </a-select>
160
+ <a-select
161
+ v-else
162
+ v-model="form[attr.model]"
163
+ :disabled="disabled"
164
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
165
+ :filter-option="filterOption"
166
+ :getPopupContainer="getPopupContainer"
167
+ dropdownClassName="custom-dropdown"
168
+ :dropdownMatchSelectWidth="false"
169
+ :dropdownStyle="{ position: 'absolute'}"
170
+ :placeholder="attr.placeholder ? attr.placeholder : '搜索' + attr.name"
171
+ show-search
172
+ @search="fetchFunction"
173
+ >
174
+ <template #notFoundContent>
175
+ <a-spin v-if="searching" size="small"/>
176
+ </template>
177
+ <a-select-option
178
+ v-if="mode === '查询'"
179
+ key="999999"
180
+ value="">全部
181
+ </a-select-option>
182
+ <a-select-option
183
+ v-for="(item,index) in option"
184
+ :key="index"
185
+ :value="item.value + ''">{{ item.label }}
186
+ </a-select-option>
187
+ </a-select>
188
+ </a-form-model-item>
189
+ <a-form-model-item
190
+ v-else-if="attr.showMode === 'radioGroup'"
191
+ :ref="attr.model"
192
+ :label="showLabel?attr.name:undefined"
193
+ :prop="attr.prop ? attr.prop : attr.model">
194
+ <a-radio-group v-model="form[attr.model]">
195
+ <a-radio-button v-for="modeItem in option" :key="modeItem.value" :value="modeItem.value">
196
+ {{ modeItem.label }}
197
+ </a-radio-button>
198
+ </a-radio-group>
199
+ </a-form-model-item>
200
+ <a-form-model-item
201
+ v-else-if="attr.showMode === 'clickChange' && option.length > 0"
202
+ :ref="attr.model"
203
+ :label="showLabel?attr.name:undefined"
204
+ :prop="attr.prop ? attr.prop : attr.model">
205
+ <XClickChangeBtn></XClickChangeBtn>
206
+ </a-form-model-item>
207
+ </x-form-col>
208
+ <!-- 多选框 -->
209
+ <x-form-col
210
+ v-else-if="attr.type === 'checkbox' && show"
211
+ :labelCol="labelCol"
212
+ :flex="attr.flex">
213
+ <a-form-model-item
214
+ v-if="!attr.showMode || mode === '查询' || attr.showMode === 'select' "
215
+ :ref="attr.model"
216
+ :label="showLabel?attr.name:undefined"
217
+ :prop="attr.prop ? attr.prop : attr.model">
218
+ <a-select
219
+ style="width:100%"
220
+ v-if="!attr.lazyLoad || attr.lazyLoad === 'false'"
221
+ v-model="form[attr.model]"
222
+ :disabled="disabled"
223
+ :filter-option="filterOption"
224
+ :getPopupContainer="getPopupContainer"
225
+ :placeholder="attr.placeholder ? attr.placeholder : '请选择'"
226
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
227
+ mode="multiple"
228
+ show-search
229
+ allowClear
230
+ >
231
+ <template v-if="attr.keys">
232
+ <a-select-option
233
+ v-for="(item,index) in attr.keys"
234
+ :key="index"
235
+ :value="item.value + ''">
236
+ {{ item.label }}
237
+ </a-select-option>
238
+ </template>
239
+ <template v-else>
240
+ <template
241
+ v-if="attr.keyName.indexOf('logic@') !== -1 || attr.keyName.indexOf('config@') !== -1
242
+ ||attr.keyName.indexOf('search@') !== -1 || attr.keyName.indexOf('search@') !== -1">
243
+ <a-select-option
244
+ v-for="(item,index) in option"
245
+ :key="index"
246
+ :value="item.value">{{ item.label }}
247
+ </a-select-option>
248
+ </template>
249
+ <template v-else>
250
+ <a-select-option
251
+ v-for="item in $appdata.getDictionaryList(attr.keyName)"
252
+ :key="item.value"
253
+ :value="item.value + ''">{{ item.text }}
254
+ </a-select-option>
255
+ </template>
256
+ </template>
257
+ </a-select>
258
+ <a-select
259
+ v-else
260
+ v-model="form[attr.model]"
261
+ :disabled="disabled"
262
+ :filter-option="filterOption"
263
+ :getPopupContainer="getPopupContainer"
264
+ :placeholder="attr.placeholder ? attr.placeholder : '搜索' + attr.name"
265
+ mode="multiple"
266
+ style="width:100%"
267
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
268
+ show-search
269
+ allowClear
270
+ @search="fetchFunction"
271
+ >
272
+ <template #notFoundContent>
273
+ <a-spin v-if="searching" size="small"/>
274
+ </template>
275
+ <a-select-option
276
+ v-for="(item,index) in option"
277
+ :key="index"
278
+ :value="item.value + ''">{{ item.label }}
279
+ </a-select-option>
280
+ </a-select>
281
+ </a-form-model-item>
282
+ <a-form-model-item
283
+ v-else
284
+ :ref="attr.model"
285
+ :label="showLabel?attr.name:undefined"
286
+ :prop="attr.prop ? attr.prop : attr.model">
287
+ <a-checkbox-group
288
+ v-model="form[attr.model]"
289
+ :options="option"
290
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
291
+ />
292
+ </a-form-model-item>
293
+ </x-form-col>
294
+ <!-- 单选框 -->
295
+ <x-form-col
296
+ v-else-if="attr.type === 'radio' && show"
297
+ :labelCol="labelCol"
298
+ :flex="attr.flex">
299
+ <a-form-model-item
300
+ v-if="!attr.showMode || attr.type === 'radio' "
301
+ :ref="attr.model"
302
+ :label="showLabel?attr.name:undefined"
303
+ :prop="attr.prop ? attr.prop : attr.model">
304
+ <a-radio-group
305
+ v-model="form[attr.model]"
306
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
307
+ >
308
+ <template v-if="attr.keys">
309
+ <a-radio v-for="(item,index) in attr.keys" :key="index" :value="item.value">
310
+ {{ item.label }}
311
+ </a-radio>
312
+ </template>
313
+ <template v-else>
314
+ <template
315
+ v-if="attr.keyName.indexOf('logic@') !== -1 || attr.keyName.indexOf('config@') !== -1
316
+ ||attr.keyName.indexOf('search@') !== -1 || attr.keyName.indexOf('search@') !== -1">
317
+ <a-radio v-for="(item,index) in option" :key="index" :value="item.value">
318
+ {{ item.label }}
319
+ </a-radio>
320
+ </template>
321
+ <template v-else>
322
+ <a-radio v-for="(item,index) in $appdata.getDictionaryList(attr.keyName)" :key="index" :value="item.value">
323
+ {{ item.text }}
324
+ </a-radio>
325
+ </template>
326
+ </template>
327
+ </a-radio-group>
328
+ </a-form-model-item>
329
+ <a-form-model-item
330
+ v-else-if="attr.showMode === 'radioGroup'"
331
+ :ref="attr.model"
332
+ :label="showLabel?attr.name:undefined"
333
+ :prop="attr.prop ? attr.prop : attr.model">
334
+ <a-radio-group v-model="form[attr.model]">
335
+ <a-radio-button v-for="modeItem in option" :key="modeItem.value" :value="modeItem.value">
336
+ {{ modeItem.label }}
337
+ </a-radio-button>
338
+ </a-radio-group>
339
+ </a-form-model-item>
340
+ <a-form-model-item
341
+ v-else-if="attr.showMode === 'clickChange' && option.length > 0"
342
+ :ref="attr.model"
343
+ :label="showLabel?attr.name:undefined"
344
+ :prop="attr.prop ? attr.prop : attr.model">
345
+ <XClickChangeBtn></XClickChangeBtn>
346
+ </a-form-model-item>
347
+ </x-form-col>
348
+ <!-- 时间 日期 框整合 -->
349
+ <x-form-col
350
+ v-else-if="['datePicker', 'rangePicker', 'yearPicker', 'monthPicker', 'yearRangePicker', 'monthRangePicker'].includes(attr.type) && show"
351
+ :labelCol="labelCol"
352
+ :flex="attr.flex">
353
+ <a-form-model-item
354
+ :ref="attr.model"
355
+ :label="showLabel?attr.name:undefined"
356
+ :prop="attr.prop ? attr.prop : attr.model">
357
+ <XFormDatePicker
358
+ :attr="attr"
359
+ :mode="mode"
360
+ :disabled="disabled"
361
+ :readOnly="readOnly"
362
+ :showLabel="showLabel"
363
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
364
+ v-model="form[attr.model]"/>
365
+ </a-form-model-item>
366
+ </x-form-col>
367
+ <!-- 文本域 -->
368
+ <x-form-col
369
+ v-else-if="attr.type === 'textarea' && show"
370
+ :labelCol="labelCol"
371
+ :flex="attr.flex">
372
+ <!-- :style="layout === 'inline'?{width:'calc(100% - 60px)'}:{}"-->
373
+ <a-form-model-item
374
+ :ref="attr.model"
375
+ :label="showLabel?attr.name:undefined"
376
+ :prop="attr.prop ? attr.prop : attr.model">
377
+ <a-textarea
378
+ v-model="form[attr.model]"
379
+ style="width: 100%;"
380
+ :disabled="disabled"
381
+ :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
382
+ :rows="4"/>
383
+ </a-form-model-item>
384
+ </x-form-col>
385
+ <!-- 文件上传 -->
386
+ <x-form-col
387
+ v-else-if="(attr.type === 'file' || attr.type === 'image') && show"
388
+ :labelCol="labelCol"
389
+ :flex="attr.flex">
390
+ <a-form-model-item
391
+ :ref="attr.model"
392
+ :label="showLabel?attr.name:undefined"
393
+ :prop="attr.prop ? attr.prop : attr.model">
394
+ <upload
395
+ :files="files"
396
+ :images="images"
397
+ :model="attr"
398
+ v-bind="attr"
399
+ :service-name="serviceName"
400
+ @setFiles="setFiles"></upload>
401
+ </a-form-model-item>
402
+ </x-form-col>
403
+ <!-- 省市区选择框 -->
404
+ <x-form-col
405
+ v-else-if="attr.type === 'citySelect' && show"
406
+ :labelCol="labelCol"
407
+ :flex="attr.flex">
408
+ <a-form-model-item
409
+ :ref="attr.model"
410
+ :label="showLabel?attr.name:undefined"
411
+ :prop="attr.prop ? attr.prop : attr.model">
412
+ <citySelect
413
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
414
+ ref="citySelect"
415
+ v-model="form[attr.model]"
416
+ :contexts="attr.contexts"
417
+ :value-type="attr.valueType"
418
+ :default-value="form[attr.model]"></citySelect>
419
+ </a-form-model-item>
420
+ </x-form-col>
421
+ <!-- 地点搜索框 -->
422
+ <x-form-col
423
+ v-else-if="attr.type === 'addressSearch' && show"
424
+ :labelCol="labelCol"
425
+ :occupyCol="attr.occupyCol"
426
+ :flex="attr.flex">
427
+ <a-form-model-item
428
+ :ref="attr.model"
429
+ :label="showLabel?attr.name:undefined"
430
+ :prop="attr.prop ? attr.prop : attr.model">
431
+ <address-search-combobox
432
+ :emitFunc="emitFunc"
433
+ :attr="attr"
434
+ :read-only="readOnly"
435
+ v-model="searchResult"
436
+ :resultKeys="{ address: attr.model, coords: `${attr.model}_lng_lat` }"
437
+ ref="addressSearchCombobox"
438
+ searchResultType="Object"
439
+ @onSelect="addressSearchComboboxSelect"
440
+ @onDivisionsChange="onDivisionsChange"
441
+ ></address-search-combobox>
442
+ </a-form-model-item>
443
+ </x-form-col>
444
+ <!-- 人员选择框 -->
445
+ <x-form-col
446
+ v-else-if="attr.type === 'personSetting' && show"
447
+ :labelCol="labelCol"
448
+ :flex="attr.flex">
449
+ <a-form-model-item
450
+ :ref="attr.model"
451
+ :label="showLabel?attr.name:undefined"
452
+ :prop="attr.prop ? attr.prop : attr.model">
453
+ <PersonSetting v-model="form[attr.model]"></PersonSetting>
454
+ </a-form-model-item>
455
+ </x-form-col>
456
+ <!-- 树形选择框 -->
457
+ <x-form-col
458
+ v-else-if="attr.type === 'treeSelect' && show"
459
+ :labelCol="labelCol"
460
+ :flex="attr.flex">
461
+ <x-tree-select
462
+ @onChange="attr.dataChangeFunc && debouncedDataChangeFunc()"
463
+ v-model="form[attr.model]"
464
+ :attr="attr"
465
+ @mounted="itemMounted"
466
+ ref="xTreeSelect">
467
+ </x-tree-select>
468
+ </x-form-col>
469
+ <!-- 列表选择框 -->
470
+ <x-form-col
471
+ v-else-if="attr.type === 'listSelect' && show"
472
+ :labelCol="labelCol"
473
+ :flex="attr.flex">
474
+ <a-form-model-item
475
+ :ref="attr.model"
476
+ :label="showLabel?attr.name:undefined"
477
+ :style="layout === 'inline'&& attr.occupyCol && attr.occupyCol > 1? {width:`calc(100% - ${attr.occupyCol * 1.533}rem)`}:{}"
478
+ :prop="attr.prop ? attr.prop : attr.model">
479
+ <a-popover
480
+ ref="rowChoosePopover"
481
+ :visible="rowChoosePopoverVisible"
482
+ title="选择数据"
483
+ placement="bottom"
484
+ trigger="focus"
485
+ :arrowPointAtCenter="true"
486
+ :overlayStyle="{ width: '1000px', height: '30vh' }">
487
+ <template #content>
488
+ <x-report
489
+ v-if="isCover"
490
+ :use-oss-for-img="false"
491
+ :config-name="queryParamsName"
492
+ :service-name="serviceName"
493
+ :show-img-in-cell="true"
494
+ :display-only="true"
495
+ :edit-mode="false"
496
+ :show-save-button="true"
497
+ :no-padding="true"
498
+ :dont-format="true"
499
+ @rowChoose="rowChoose"
500
+ @cancel="closeRowChooseInput"
501
+ >
502
+ </x-report>
503
+ <x-form-table
504
+ v-else
505
+ title="请选择数据"
506
+ :queryParamsName="queryParamsName"
507
+ :rowSelectMode="true"
508
+ :allowSelectRowNum="1"
509
+ :service-name="serviceName"
510
+ :fixed-query-form="rowChooseFixedQueryValue"
511
+ @rowChoose="rowChoose"
512
+ @afterQuery="rowChooseSearchAfterQuery"
513
+ ref="rowChooseTable">
514
+ <template #button>
515
+ <a-button @click="closeRowChooseInput">
516
+ 关闭
517
+ </a-button>
518
+ </template>
519
+ </x-form-table>
520
+ </template>
521
+ <a-input
522
+ v-model="form[attr.model]"
523
+ :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
524
+ @change="searchRowChooseData"
525
+ @focus="showCloseRowChooseInput"/>
526
+ </a-popover>
527
+ </a-form-model-item>
528
+ </x-form-col>
529
+ <!-- 评分框 -->
530
+ <x-form-col
531
+ v-else-if="attr.type === 'rate' && show"
532
+ :labelCol="labelCol"
533
+ :flex="attr.flex">
534
+ <a-form-model-item
535
+ :ref="attr.model"
536
+ :label="showLabel?attr.name:undefined"
537
+ :prop="attr.prop ? attr.prop : attr.model">
538
+ <x-rate
539
+ v-model="form[attr.model]"
540
+ :mode="mode"
541
+ :disabled="disabled"
542
+ :query-type="attr.queryType"
543
+ :max-count="attr.maxCount"
544
+ :allow-half="attr.allowHalf"
545
+ :placeholder="attr.placeholder ? attr.placeholder : '请选择'+attr.name.replace(/\s*/g, '')"
546
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
547
+ />
548
+ </a-form-model-item>
549
+ </x-form-col>
550
+ <!-- 区间选择器 -->
551
+ <x-form-col
552
+ v-else-if="attr.type === 'intervalPicker' && show"
553
+ :labelCol="labelCol"
554
+ :flex="attr.flex">
555
+ <a-form-model-item
556
+ :ref="attr.model"
557
+ :label="showLabel?attr.name:undefined"
558
+ :prop="attr.prop ? attr.prop : attr.model">
559
+ <x-interval-picker
560
+ v-model="form[attr.model]"
561
+ :mode="mode"
562
+ :read-only="readOnly"
563
+ :disabled="disabled && !readOnly"
564
+ :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
565
+ :start-placeholder="attr.startPlaceholder || '起始值'"
566
+ :end-placeholder="attr.endPlaceholder || '结束值'"
567
+ @blur="attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
568
+ />
569
+ </a-form-model-item>
570
+ </x-form-col>
571
+ <!-- 车牌号选择 -->
572
+ <x-form-col
573
+ v-else-if="attr.type === 'licensePlate' && show"
574
+ :labelCol="labelCol"
575
+ :flex="attr.flex">
576
+ <a-form-model-item
577
+ :ref="attr.model"
578
+ :label="showLabel?attr.name:undefined"
579
+ :style="layout === 'inline'&& attr.occupyCol && attr.occupyCol > 1? {width:`calc(100% - ${attr.occupyCol * 1.533}rem)`}:{}"
580
+ :prop="attr.prop ? attr.prop : attr.model">
581
+ <!-- 如果配置了后置按钮插槽 -->
582
+ <a-input
583
+ v-if="mode ==='查询'"
584
+ v-model="form[attr.model]"
585
+ :whitespace="true"
586
+ :read-only="readOnly"
587
+ :disabled="disabled && !readOnly"
588
+ style="width:100%"
589
+ @blur="attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
590
+ :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
591
+ :ref="`${attr.model}input`"/>
592
+ <x-license-plate
593
+ v-else
594
+ v-model="form[attr.model]"
595
+ @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
596
+ ></x-license-plate>
597
+ </a-form-model-item>
598
+ </x-form-col>
599
+ <!-- 录音 -->
600
+ <x-form-col
601
+ v-else-if="attr.type === 'recording' && show"
602
+ :labelCol="labelCol"
603
+ :flex="attr.flex">
604
+ <recording
605
+ ref="recording"
606
+ @recordingData="recordingData"
607
+ >
608
+ </recording>
609
+ </x-form-col>
610
+ <!-- 表格录入 -->
611
+ <x-form-col
612
+ v-else-if="attr.type === 'rowEdit' && show"
613
+ :labelCol="labelCol"
614
+ :flex="attr.flex">
615
+ <a-form-model-item
616
+ :ref="attr.model"
617
+ :label="showLabel?attr.name:undefined"
618
+ :prop="attr.prop ? attr.prop : attr.model">
619
+ <x-form-table
620
+ :key="'childTable_' + attr.model"
621
+ :title="attr.name"
622
+ :queryParamsName="attr.crud"
623
+ :localEditMode="true"
624
+ :fixed-query-form="childTableFixedQueryForm(attr)"
625
+ :service-name="serviceName"
626
+ @hook:mounted="(h)=>onComponentMounted(h, attr)"
627
+ :ref="'childXFormTable_' + attr.model">
628
+ </x-form-table>
629
+ </a-form-model-item>
630
+ </x-form-col>
631
+ </template>
632
+ <script>
633
+ import { debounce } from 'ant-design-vue/lib/vc-table/src/utils'
634
+ import XFormCol from '@vue2-client/base-client/components/common/XFormCol'
635
+ import XBadge from '@vue2-client/base-client/components/common/XBadge'
636
+ import CitySelect from '@vue2-client/base-client/components/common/CitySelect'
637
+ import PersonSetting from '@vue2-client/base-client/components/common/PersonSetting'
638
+ import AddressSearchCombobox from '@vue2-client/base-client/components/common/AddressSearchCombobox'
639
+ import Upload from '@vue2-client/base-client/components/common/Upload'
640
+ import moment from 'moment'
641
+ import { getConfigByName, runLogic, getConfigByNameAsync } from '@vue2-client/services/api/common'
642
+ import * as util from '@vue2-client/utils/util'
643
+ import XTreeSelect from '@vue2-client/base-client/components/common/XForm/XTreeSelect'
644
+ import { searchToListOption, searchToOption } from '@vue2-client/services/v3Api'
645
+ import { mapState } from 'vuex'
646
+ import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
647
+ import XLicensePlate from '@vue2-client/base-client/components/common/XLicensePlate/XLicensePlate.vue'
648
+ import XStatusButton from './XStatusButton.vue'
649
+ import XClickChangeBtn from './itemComponent/XClickChangeBtn'
650
+ import 'moment/locale/zh-cn'
651
+ import XFormDatePicker from '@vue2-client/base-client/components/common/XDatePicker/index.vue'
652
+ import XIntervalPicker from '@vue2-client/base-client/components/common/XIntervalPicker/XIntervalPicker.vue'
653
+ import XRate from '@vue2-client/base-client/components/common/XRate/index.vue'
654
+
655
+ export default {
656
+ name: 'XFormItem',
657
+ components: {
658
+ XFormDatePicker,
659
+ XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'),
660
+ Recording: () => import('@vue2-client/base-client/components/common/Recording/Recording.vue'),
661
+ XReport: () => import('@vue2-client/base-client/components/common/XReportGrid/XReport.vue'),
662
+ XLicensePlate,
663
+ XTreeSelect,
664
+ XFormCol,
665
+ XBadge,
666
+ CitySelect,
667
+ PersonSetting,
668
+ AddressSearchCombobox,
669
+ Upload,
670
+ XStatusButton,
671
+ XClickChangeBtn,
672
+ XIntervalPicker,
673
+ XRate
674
+ },
675
+ data () {
676
+ // 检索去抖
677
+ this.fetchFunction = debounce(this.fetchFunction, 800)
678
+ return {
679
+ option: [],
680
+ // 最后检索版本
681
+ lastFetchId: 0,
682
+ // 检索中
683
+ searching: false,
684
+ searchResult: '',
685
+ optionForFunc: [],
686
+ // 控制当前表单项是否展示
687
+ show: true,
688
+ // moment
689
+ moment,
690
+ // 行选择器浮层是否显示
691
+ rowChoosePopoverVisible: false,
692
+ // 行选择器CRUD固定查询值
693
+ rowChooseFixedQueryValue: undefined
694
+ }
695
+ },
696
+ props: {
697
+ attr: {
698
+ type: Object,
699
+ default:
700
+ () => {
701
+ return {}
702
+ }
703
+ },
704
+ form: {
705
+ type: Object,
706
+ required:
707
+ true
708
+ },
709
+ disabled: {
710
+ type: Boolean,
711
+ default:
712
+ () => {
713
+ return false
714
+ }
715
+ },
716
+ readOnly: {
717
+ type: Boolean,
718
+ default:
719
+ () => {
720
+ return false
721
+ }
722
+ },
723
+ mode: {
724
+ type: String,
725
+ default:
726
+ () => {
727
+ return '查询'
728
+ }
729
+ },
730
+ files: {
731
+ type: Array,
732
+ default:
733
+ () => {
734
+ return []
735
+ }
736
+ },
737
+ images: {
738
+ type: Array,
739
+ default:
740
+ () => {
741
+ return []
742
+ }
743
+ },
744
+ serviceName: {
745
+ type: String,
746
+ default:
747
+ undefined
748
+ },
749
+ // 调用logic获取数据源的追加参数
750
+ getDataParams: {
751
+ type: Object,
752
+ default:
753
+ undefined
754
+ },
755
+ // 布局
756
+ layout: {
757
+ type: String,
758
+ default:
759
+ 'horizontal'
760
+ },
761
+ // 环境
762
+ env: {
763
+ type: String,
764
+ default:
765
+ () => {
766
+ return 'prod'
767
+ }
768
+ },
769
+ // 设置表单值
770
+ setForm: {
771
+ type: Function,
772
+ default: (val) => {
773
+ console.log(val)
774
+ }
775
+ },
776
+ showLabel: {
777
+ type: Boolean,
778
+ default:
779
+ () => {
780
+ return true
781
+ }
782
+ },
783
+ labelCol: {
784
+ type: Object,
785
+ default: () => {
786
+ return { span: 8 }
787
+ }
788
+ }
789
+ },
790
+ provide () {
791
+ return {
792
+ FormItemContext: this
793
+ }
794
+ },
795
+ created () {
796
+ this.init()
797
+ if (this.attr.keyName && (this.attr?.keyName?.toString().indexOf('async ') !== -1 || this.attr?.keyName?.toString()?.indexOf('function') !== -1)) {
798
+ this.debouncedUpdateOptions = debounce(this.updateOptions, 200)
799
+ }
800
+ if (this.attr.dataChangeFunc) {
801
+ this.debouncedDataChangeFunc = debounce(this.dataChangeFunc, 200)
802
+ // 执行一次
803
+ this.dataChangeFunc()
804
+ }
805
+ if (this.attr.showFormItemFunc) {
806
+ this.debouncedShowFormItemFunc = debounce(this.showFormItemFunc, 100)
807
+ // 执行一次
808
+ this.showFormItemFunc()
809
+ }
810
+ if (this.attr.showQueryFormItemFunc) {
811
+ this.debouncedShowQueryFormItemFunc = debounce(this.showQueryFormItemFunc, 100)
812
+ // 执行一次
813
+ this.showFormItemFunc()
814
+ }
815
+ // 人员联动框增加监听
816
+ if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动人员')) {
817
+ this.debouncedUserLinkFunc = debounce(() => this.updateResOptions('人员'), 200)
818
+ }
819
+ if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动部门')) {
820
+ this.debouncedDepLinkFunc = debounce(() => this.updateResOptions('部门'), 200)
821
+ }
822
+ // xTreeSelect 自己调用 mounted
823
+ if (this.attr.type !== 'treeSelect') {
824
+ this.$emit('mounted', this.attr)
825
+ }
826
+ },
827
+ computed: {
828
+ ...mapState('account', { currUser: 'user' }),
829
+ queryParamsName () {
830
+ if (this.attr.keyName.startsWith('function')) {
831
+ // 调用异步函数获取内容
832
+ return executeStrFunctionByContext(this, this.attr.keyName, [this.form, runLogic, this.mode, getConfigByNameAsync])
833
+ } else {
834
+ // 按现有方式处理
835
+ return this.attr.keyName.split('@')[this.attr.keyName.split('@').length - 1]
836
+ }
837
+ },
838
+ // 判断弹出时是否Cover,弹出只支持Cover以及CRUD
839
+ isCover () {
840
+ // 如果 queryParamsName 为空,返回空
841
+ if (!this.queryParamsName) {
842
+ return false
843
+ }
844
+ const result = this.queryParamsName.endsWith('Cover')
845
+ return result
846
+ },
847
+ },
848
+ watch: {
849
+ attr: {
850
+ handler () {
851
+ this.init()
852
+ },
853
+ deep: true
854
+ },
855
+ form: {
856
+ handler (newVal, oldVal) {
857
+ // 如果是从函数获取 options
858
+ if (this.attr.keyName && (this.attr.keyName.toString().indexOf('async ') !== -1 || this.attr.keyName.toString().indexOf('function') !== -1)) {
859
+ this.debouncedUpdateOptions()
860
+ }
861
+ // 如果有自定义是否展示表单项函数
862
+ if (this.attr.showFormItemFunc) {
863
+ this.debouncedShowFormItemFunc()
864
+ }
865
+ // 如果有自定义是否展示查询表单项函数
866
+ if (this.attr.showQueryFormItemFunc) {
867
+ this.debouncedShowQueryFormItemFunc()
868
+ }
869
+ // 地址搜索框赋值
870
+ if (this.attr.type === 'addressSearch') {
871
+ this.$refs.addressSearchCombobox.addressInput = this.form[this.attr.model]
872
+ }
873
+ // 数据源来自人员联动时更新数据
874
+ if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动人员')) {
875
+ this.debouncedUserLinkFunc()
876
+ }
877
+ // 数据源来自人员联动时更新数据
878
+ if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动部门')) {
879
+ this.debouncedDepLinkFunc()
880
+ }
881
+ },
882
+ deep: true
883
+ }
884
+ },
885
+ inject: {
886
+ getComponentByName: {
887
+ default: () => () => {
888
+ console.warn('getComponentByName is not provided')
889
+ return null // 或者返回一个默认的函数
890
+ },
891
+ },
892
+ registerComponent: {
893
+ default: () => () => {
894
+ console.warn('registerComponent is not provided')
895
+ return null // 或者返回一个默认的函数
896
+ },
897
+ },
898
+ getSelf: {
899
+ default: () => () => {
900
+ console.warn('getSelf is not provided')
901
+ return null // 或者返回一个默认的函数
902
+ },
903
+ },
904
+ },
905
+ methods: {
906
+ // 把内部的crud表单录入放到表单中,以便外部可以调用
907
+ onComponentMounted (h, attr) {
908
+ console.log('crud表单', h)
909
+ if (attr.crud) {
910
+ this.registerComponent(attr.model, this.$refs['childXFormTable_' + attr.model])
911
+ }
912
+ },
913
+ childTableFixedQueryForm (item) {
914
+ console.log('传递的form', this.form)
915
+ if (this.modifyModelData?.primaryKeyData) {
916
+ const fixedForm = {}
917
+ fixedForm[item.childTableForeignKeyName] = Object.values(this.modifyModelData.primaryKeyData)[0]
918
+ return fixedForm
919
+ }
920
+ return null
921
+ },
922
+ // 动态生成事件绑定对象
923
+ generateDynamicEvents (inputOnAfterFunc, attr) {
924
+ const events = {}
925
+ const states = this.parseStates(attr.inputOnAfterName, inputOnAfterFunc)
926
+
927
+ states.forEach((state) => {
928
+ // 动态绑定事件名到 emitFunc
929
+ events[state.event] = () => {
930
+ console.info('事件名', state.event)
931
+ this.emitFunc(state.event, attr)
932
+ }
933
+ })
934
+
935
+ return events // 返回 { state1Event: handler, state2Event: handler, ... }
936
+ },
937
+ parseStates (input, events) {
938
+ const eventNames = events.split('|')
939
+ return input.split('|').map((label, index) => ({
940
+ label,
941
+ event: eventNames[index] // 如果没有提供事件名称,则使用默认值
942
+ }))
943
+ },
944
+ focusInput () {
945
+ if (this.attr.defaultFocus) {
946
+ this.$nextTick(h => {
947
+ const el = this.$refs[`${this.attr.model}input`]?.$el
948
+ let inputEl
949
+ if (el) {
950
+ if (el.tagName.toLowerCase() === 'input') {
951
+ inputEl = el
952
+ } else {
953
+ inputEl = el.querySelector('input')
954
+ }
955
+ }
956
+ if (inputEl) {
957
+ inputEl.focus()
958
+ if (inputEl.type === 'number') {
959
+ if (inputEl.valueAsNumber) {
960
+ inputEl.setSelectionRange(0, inputEl.valueAsNumber.toString().length)
961
+ }
962
+ } else {
963
+ if (inputEl.value) {
964
+ inputEl.setSelectionRange(0, inputEl.value.length)
965
+ }
966
+ }
967
+ }
968
+ })
969
+ }
970
+ },
971
+ // 更新人员下拉框数据
972
+ async updateResOptions (type) {
973
+ if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString()?.endsWith(`]联动${type}`)) {
974
+ const startIndex = this.attr.keyName.indexOf('[') + 1
975
+ const endIndex = this.attr.keyName.indexOf(']', startIndex)
976
+ const fromModel = this.attr.keyName.substring(startIndex, endIndex).replace('.', '_')
977
+ const formModelData = Array.isArray(this.form[fromModel])
978
+ ? this.form[fromModel]
979
+ : [this.form[fromModel]]
980
+ if (fromModel?.length && formModelData?.length) {
981
+ const searchData = { source: `获取${type}`, userid: this.currUser.id, filter: formModelData, filterType: fromModel.indexOf('org') > -1 ? 'org' : 'dep' }
982
+ await searchToListOption(searchData, res => {
983
+ this.getDataCallback(
984
+ res.filter(h => {
985
+ if (fromModel.indexOf('org') > -1) {
986
+ return formModelData?.includes(h.orgid || h.f_organization_id || h.parentid)
987
+ } else {
988
+ return formModelData?.includes(h?.parentid)
989
+ }
990
+ }
991
+ )
992
+ )
993
+ })
994
+ }
995
+ }
996
+ },
997
+ // js 函数作为数据源
998
+ async updateOptions () {
999
+ if (this.attr.keyName && (this.attr.keyName.indexOf('async ') !== -1 || this.attr.keyName.indexOf('function ') !== -1)) {
1000
+ this.optionForFunc = await executeStrFunctionByContext(this, this.attr.keyName, [this.form, runLogic, this.mode, getConfigByNameAsync])
1001
+ }
1002
+ },
1003
+ async dataChangeFunc () {
1004
+ if (this.attr.dataChangeFunc) {
1005
+ await executeStrFunctionByContext(this, this.attr.dataChangeFunc, [this.form, this.setForm, this.attr, util, this.mode, runLogic, getConfigByNameAsync])
1006
+ }
1007
+ },
1008
+ async showFormItemFunc () {
1009
+ if (this.attr.showFormItemFunc) {
1010
+ const obj = executeStrFunctionByContext(this, this.attr.showFormItemFunc, [this.form, this.setForm, this.attr, util, this.mode])
1011
+ // 判断是 bool 还是 obj 兼容
1012
+ if (typeof obj === 'boolean') {
1013
+ this.show = obj
1014
+ } else if (obj && typeof obj === 'object') {
1015
+ // obj 是一个对象,并且不是数组
1016
+ this.show = obj?.show
1017
+ this.readOnly = obj?.readOnly
1018
+ }
1019
+ } else {
1020
+ this.show = true
1021
+ }
1022
+ },
1023
+ async showQueryFormItemFunc () {
1024
+ if (this.attr.showQueryFormItemFunc) {
1025
+ const obj = executeStrFunctionByContext(this, this.attr.showQueryFormItemFunc, [this.form, this.setForm, this.attr, util, this.mode])
1026
+ // 判断是 bool 还是 obj 兼容
1027
+ if (typeof obj === 'boolean') {
1028
+ this.show = obj
1029
+ } else if (obj && typeof obj === 'object') {
1030
+ // obj 是一个对象,并且不是数组
1031
+ this.show = obj?.show
1032
+ this.readOnly = obj?.readOnly
1033
+ }
1034
+ } else {
1035
+ this.show = true
1036
+ }
1037
+ },
1038
+ init () {
1039
+ if (!this.attr.flex) {
1040
+ if (this.mode === '新增/修改') {
1041
+ if (['horizontal', 'vertical'].includes(this.layout) || ['textarea', 'file', 'image'].includes(this.attr.type)) {
1042
+ // 新增修改表单 horizontal 模式下默认为一行
1043
+ this.attr.flex = {
1044
+ xs: 24,
1045
+ sm: 24,
1046
+ md: 24,
1047
+ lg: 24,
1048
+ xl: 24,
1049
+ xxl: 24,
1050
+ fullWidth: true
1051
+ }
1052
+ } else {
1053
+ // 新增修改表单 vertical 模式下默认为1列
1054
+ this.attr.flex = {
1055
+ xs: 24,
1056
+ sm: 12,
1057
+ md: 8,
1058
+ lg: 8,
1059
+ xl: 6,
1060
+ xxl: 6
1061
+ }
1062
+ }
1063
+ } else {
1064
+ this.attr.flex = {
1065
+ xs: 24,
1066
+ sm: 24,
1067
+ md: 8,
1068
+ lg: 6,
1069
+ xl: 6,
1070
+ xxl: 6
1071
+ }
1072
+ }
1073
+ }
1074
+ if (this.attr.keyName && typeof this.attr.keyName === 'string') {
1075
+ if (this.attr.keyName.indexOf('logic@') !== -1) {
1076
+ this.getData({}, res => this.getDataCallback(res))
1077
+ } else if (this.attr.keyName.indexOf('search@') !== -1) {
1078
+ // `tool.getFullTree(this.getRights().where(row.getType()==$organization$))`
1079
+ // 判断是否根据角色查询
1080
+ let source = this.attr.keyName.substring(7)
1081
+ const userid = this.currUser.id
1082
+ let roleName = 'roleName'
1083
+ if (source.startsWith('根据角色[') && source.endsWith(']获取人员')) {
1084
+ const startIndex = source.indexOf('[') + 1
1085
+ const endIndex = source.indexOf(']', startIndex)
1086
+ roleName = source.substring(startIndex, endIndex)
1087
+ source = '根据角色获取人员'
1088
+ }
1089
+ const searchData = { source, userid, roleName }
1090
+ // 判断是否根据某个表单项联动 仅返回列表结构并筛选
1091
+ if (source.startsWith('根据表单项[') && source.endsWith(']联动人员')) {
1092
+ this.updateResOptions('人员')
1093
+ } else if (source.startsWith('根据表单项[') && source.endsWith(']联动部门')) {
1094
+ this.updateResOptions('部门')
1095
+ } else if (this.attr.type === 'select' || this.attr.type === 'checkbox') {
1096
+ // 仅获取最内层数据
1097
+ searchToListOption(searchData, res => this.getDataCallback(res))
1098
+ } else {
1099
+ // 其他资源通用逻辑
1100
+ searchToOption(searchData, res => this.getDataCallback(res))
1101
+ }
1102
+ } else if (this.attr.keyName.indexOf('config@') !== -1) {
1103
+ const configName = this.attr.keyName.substring(7)
1104
+ getConfigByName(configName, this.serviceName, res => {
1105
+ this.getDataCallback(res.value)
1106
+ }, this.env === 'dev')
1107
+ } else if (this.attr.keyName.indexOf('async ') !== -1 || this.attr.keyName.indexOf('function ') !== -1) {
1108
+ this.updateOptions()
1109
+ }
1110
+ } else if (this.attr.keys) {
1111
+ this.getDataCallback(this.attr.keys)
1112
+ }
1113
+ this.focusInput()
1114
+ },
1115
+ addressSearchComboboxSelect (data) {
1116
+ this.form = Object.assign(this.form, JSON.parse(data))
1117
+ },
1118
+ onDivisionsChange (data) {
1119
+ this.emitFunc('addressSearchComboboxSelect', {
1120
+ key: this.attr.model,
1121
+ value: data
1122
+ })
1123
+ },
1124
+ getDataCallback (res) {
1125
+ this.option = res
1126
+ if (this.attr.type === 'treeSelect') {
1127
+ this.$nextTick(() => {
1128
+ this.$refs.xTreeSelect.init({
1129
+ option: this.option,
1130
+ form: this.form,
1131
+ queryType: this.attr.queryType,
1132
+ name: this.attr.name,
1133
+ model: this.attr.model,
1134
+ mode: this.mode,
1135
+ disabled: this.disabled
1136
+ })
1137
+ })
1138
+ } else if (this.attr.type === 'radio' || ['radioGroup', 'clickChange'].includes(this.attr.showMode)) {
1139
+ this.initRadioValue()
1140
+ }
1141
+ },
1142
+ initRadioValue () {
1143
+ const model = this.attr.model
1144
+ if (this.mode === '新增/修改' && (this.form[model] === undefined || this.form[model] === null) && !this.attr.prop) {
1145
+ if (this.attr.keys && this.attr.keys.length > 1) {
1146
+ this.form[model] = this.attr.keys[0].value
1147
+ } else if (this.option.length > 1) {
1148
+ this.form[model] = this.option[0].value
1149
+ }
1150
+ }
1151
+ },
1152
+ // 文件框时设置上传组件的值
1153
+ setFiles (fileIds) {
1154
+ if (!this.form[this.attr.model]) {
1155
+ this.form[this.attr.model] = []
1156
+ }
1157
+ this.form[this.attr.model] = [...fileIds]
1158
+ },
1159
+ // 懒加载检索方法
1160
+ fetchFunction (value) {
1161
+ this.lastFetchId += 1
1162
+ const fetchId = this.lastFetchId
1163
+ this.option = []
1164
+ this.searching = true
1165
+ this.getData({
1166
+ word: value
1167
+ }, res => {
1168
+ if (fetchId !== this.lastFetchId) {
1169
+ return
1170
+ }
1171
+ this.option = res
1172
+ this.searching = false
1173
+ })
1174
+ },
1175
+ // 获取数据
1176
+ getData (value, callbackFun) {
1177
+ if (value !== '') {
1178
+ const logicName = this.attr.keyName
1179
+ const logic = logicName.substring(6)
1180
+ // 调用logic前设置参数
1181
+ if (this.getDataParams && this.getDataParams[this.attr.model]) {
1182
+ Object.assign(value, this.getDataParams[this.attr.model])
1183
+ }
1184
+ runLogic(logic, Object.assign(value, {
1185
+ orgId: this.currUser.orgid,
1186
+ userId: this.currUser.id
1187
+ }), this.serviceName, this.env === 'dev').then(res => {
1188
+ callbackFun(res)
1189
+ }).catch(e => {
1190
+ callbackFun([])
1191
+ console.error('获取数据失败:' + e)
1192
+ })
1193
+ }
1194
+ },
1195
+ filterOption (input, option) {
1196
+ const child = option.componentOptions.children[0]
1197
+ if (child.text) {
1198
+ return child.text.toLowerCase().indexOf(input.toLowerCase()) >= 0
1199
+ } else if (child.elm.innerText) {
1200
+ return child.elm.innerText.toLowerCase().indexOf(input.toLowerCase()) >= 0
1201
+ } else {
1202
+ return child.child.value.toLowerCase().indexOf(input.toLowerCase()) >= 0
1203
+ }
1204
+ },
1205
+ // 表单项变更函数中调用 控制表单组中表单项组名为 groupName 的表单是否展示
1206
+ // func:x-form-show(显示)/x-form-no-show(不显示)
1207
+ emitShowFormFunc (func, groupName) {
1208
+ this.emitFunc(func, groupName)
1209
+ },
1210
+ emitFunc (func, data) {
1211
+ this.$emit('x-form-item-emit-func', func, data, data?.model ? this.form[data.model] : this.form)
1212
+ },
1213
+ itemMounted (h) {
1214
+ this.$emit('mounted', h)
1215
+ },
1216
+ rowChoose (rows) {
1217
+ this.$emit('rowChoose', rows, this.attr, this.closeRowChooseInput)
1218
+ },
1219
+ searchRowChooseData () {
1220
+ if (this.searching) {
1221
+ return
1222
+ }
1223
+ this.lastFetchId += 1
1224
+ const fetchId = this.lastFetchId
1225
+ this.searching = true
1226
+ if (fetchId !== this.lastFetchId) {
1227
+ return
1228
+ }
1229
+ this.rowChooseFixedQueryValue = []
1230
+ this.rowChooseFixedQueryValue[this.attr.model] = this.form[this.attr.model]
1231
+ this.$nextTick(() => {
1232
+ this.$refs.rowChooseTable.refresh(true)
1233
+ })
1234
+ },
1235
+ showCloseRowChooseInput () {
1236
+ this.rowChoosePopoverVisible = true
1237
+ },
1238
+ closeRowChooseInput () {
1239
+ this.rowChoosePopoverVisible = false
1240
+ },
1241
+ rowChooseSearchAfterQuery () {
1242
+ this.searching = false
1243
+ },
1244
+ // 获取 recording 转换后的数据
1245
+ getRecodingData () {
1246
+ return this.$refs.recording.getRecordingData()
1247
+ },
1248
+ recordingData (data) {
1249
+ this.emitFunc('recordingData', data)
1250
+ },
1251
+ getPopupContainer (triggerNode) {
1252
+ return document.body
1253
+ // return triggerNode.parentNode
1254
+ },
1255
+ }
1256
+ }
1257
+ </script>
1258
+
1259
+ <style lang="less" scoped>
1260
+ .custom-dropdown {
1261
+ position: absolute;
1262
+ z-index: 1050;
1263
+ }
1264
+ </style>