vue2-client 1.10.21 → 1.10.26

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