cnhis-design-vue 2.1.78 → 2.1.80

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 (598) hide show
  1. package/.prettierrc.js +27 -27
  2. package/CHANGELOG.md +2953 -2911
  3. package/README.md +90 -90
  4. package/commitlint.config.js +1 -1
  5. package/es/affix/index.js +8 -8
  6. package/es/age/index.js +18 -18
  7. package/es/alert/index.js +8 -8
  8. package/es/anchor/index.js +8 -8
  9. package/es/auto-complete/index.js +8 -8
  10. package/es/avatar/index.js +8 -8
  11. package/es/back-top/index.js +8 -8
  12. package/es/badge/index.js +8 -8
  13. package/es/base/index.js +8 -8
  14. package/es/big-table/index.js +358 -338
  15. package/es/big-table/style.css +1 -1
  16. package/es/breadcrumb/index.js +8 -8
  17. package/es/button/index.js +31 -31
  18. package/es/calendar/index.js +8 -8
  19. package/es/captcha/index.js +7 -7
  20. package/es/card/index.js +8 -8
  21. package/es/carousel/index.js +8 -8
  22. package/es/cascader/index.js +8 -8
  23. package/es/checkbox/index.js +17 -17
  24. package/es/col/index.js +8 -8
  25. package/es/collapse/index.js +8 -8
  26. package/es/color-picker/index.js +5 -5
  27. package/es/comment/index.js +8 -8
  28. package/es/config-provider/index.js +8 -8
  29. package/es/date-picker/index.js +30 -30
  30. package/es/descriptions/index.js +8 -8
  31. package/es/divider/index.js +8 -8
  32. package/es/drag-layout/index.js +5 -5
  33. package/es/drawer/index.js +8 -8
  34. package/es/dropdown/index.js +8 -8
  35. package/es/editor/index.js +1 -1
  36. package/es/ellipsis/index.js +1 -1
  37. package/es/empty/index.js +8 -8
  38. package/es/fabric-chart/index.js +45 -45
  39. package/es/form/index.js +8 -8
  40. package/es/form-model/index.js +8 -8
  41. package/es/form-table/index.js +144 -144
  42. package/es/grid/index.js +4 -4
  43. package/es/index/index.js +3657 -2281
  44. package/es/index/style.css +1 -1
  45. package/es/input/index.js +11 -11
  46. package/es/input-number/index.js +8 -8
  47. package/es/keep-cache/index.js +9 -9
  48. package/es/layout/index.js +8 -8
  49. package/es/list/index.js +8 -8
  50. package/es/locale-provider/index.js +8 -8
  51. package/es/map/index.js +13 -13
  52. package/es/mentions/index.js +8 -8
  53. package/es/menu/index.js +8 -8
  54. package/es/message/index.js +8 -8
  55. package/es/multi-chat/index.js +117 -117
  56. package/es/multi-chat-client/index.js +111 -111
  57. package/es/multi-chat-history/index.js +6 -6
  58. package/es/multi-chat-record/index.js +27 -27
  59. package/es/multi-chat-setting/index.js +43 -43
  60. package/es/multi-chat-sip/index.js +1 -1
  61. package/es/notification/index.js +8 -8
  62. package/es/page-header/index.js +8 -8
  63. package/es/pagination/index.js +8 -8
  64. package/es/popconfirm/index.js +8 -8
  65. package/es/popover/index.js +8 -8
  66. package/es/progress/index.js +8 -8
  67. package/es/radio/index.js +17 -17
  68. package/es/rate/index.js +8 -8
  69. package/es/result/index.js +8 -8
  70. package/es/row/index.js +8 -8
  71. package/es/scale-container/index.js +1 -1
  72. package/es/scale-view/index.js +200 -198
  73. package/es/scale-view/style.css +1 -1
  74. package/es/select/index.js +44 -44
  75. package/es/select-label/index.js +75 -73
  76. package/es/select-label/style.css +1 -1
  77. package/es/select-person/index.js +45 -41
  78. package/es/select-person/style.css +1 -1
  79. package/es/shortcut-setter/index.js +10 -10
  80. package/es/skeleton/index.js +8 -8
  81. package/es/slider/index.js +8 -8
  82. package/es/space/index.js +8 -8
  83. package/es/spin/index.js +8 -8
  84. package/es/statistic/index.js +8 -8
  85. package/es/steps/index.js +8 -8
  86. package/es/switch/index.js +8 -8
  87. package/es/table-filter/index.js +2697 -1347
  88. package/es/table-filter/style.css +1 -1
  89. package/es/tabs/index.js +8 -8
  90. package/es/tag/index.js +9 -9
  91. package/es/time-picker/index.js +8 -8
  92. package/es/timeline/index.js +8 -8
  93. package/es/tooltip/index.js +8 -8
  94. package/es/transfer/index.js +8 -8
  95. package/es/tree/index.js +8 -8
  96. package/es/tree-select/index.js +8 -8
  97. package/es/upload/index.js +8 -8
  98. package/es/utils/clickoutside.js +7 -7
  99. package/es/utils/kty.min-1.0.0.js +5 -5
  100. package/es/utils/time-domain.js +16 -16
  101. package/es/utils/utils-map.js +32 -32
  102. package/es/utils/vexutils.js +27 -27
  103. package/es/verification-code/index.js +2 -2
  104. package/lib/cui.common.js +11438 -9918
  105. package/lib/cui.umd.js +11438 -9918
  106. package/lib/cui.umd.min.js +69 -69
  107. package/package.json +110 -110
  108. package/packages/affix/index.js +12 -12
  109. package/packages/affix/src/Affix.jsx +12 -12
  110. package/packages/age/index.js +27 -27
  111. package/packages/age/src/age/index.vue +139 -139
  112. package/packages/age/src/age-com/index.vue +209 -209
  113. package/packages/alert/index.js +12 -12
  114. package/packages/alert/src/Alert.jsx +11 -11
  115. package/packages/anchor/index.js +18 -18
  116. package/packages/anchor/src/Anchor.jsx +11 -11
  117. package/packages/anchor/src/Link.jsx +11 -11
  118. package/packages/auto-complete/index.js +12 -12
  119. package/packages/auto-complete/src/AutoComplete.jsx +12 -12
  120. package/packages/avatar/index.js +12 -12
  121. package/packages/avatar/src/Avatar.jsx +11 -11
  122. package/packages/back-top/index.js +12 -12
  123. package/packages/back-top/src/BackTop.jsx +11 -11
  124. package/packages/badge/index.js +12 -12
  125. package/packages/badge/src/Badge.jsx +11 -11
  126. package/packages/base/index.js +3 -3
  127. package/packages/big-table/index.js +16 -16
  128. package/packages/big-table/src/BigTable.vue +3205 -3193
  129. package/packages/big-table/src/Fieldset.vue +2067 -2067
  130. package/packages/big-table/src/assets/iconfont/iconfont.css +21 -21
  131. package/packages/big-table/src/assets/style/table-base.less +390 -387
  132. package/packages/big-table/src/assets/style/table-global.less +175 -175
  133. package/packages/big-table/src/components/AutoLayoutButton.vue +307 -307
  134. package/packages/big-table/src/components/NoData.vue +81 -81
  135. package/packages/big-table/src/components/TextOverTooltip.vue +120 -120
  136. package/packages/big-table/src/components/edit-form/EditForm.vue +509 -509
  137. package/packages/big-table/src/components/edit-form/edit-component/config-data/index.js +68 -68
  138. package/packages/big-table/src/components/edit-form/edit-component/edit-date-picker/edit-date-picker.vue +60 -60
  139. package/packages/big-table/src/components/edit-form/edit-component/edit-digital/edit-digital.vue +54 -54
  140. package/packages/big-table/src/components/edit-form/edit-component/edit-input/edit-input.vue +39 -39
  141. package/packages/big-table/src/components/edit-form/edit-component/edit-input-password/edit-input-password.vue +79 -79
  142. package/packages/big-table/src/components/edit-form/edit-component/edit-month-picker/edit-month-picker.vue +37 -37
  143. package/packages/big-table/src/components/edit-form/edit-component/edit-search/edit-search.vue +82 -82
  144. package/packages/big-table/src/components/edit-form/edit-component/edit-search-more/edit-search-more.vue +95 -95
  145. package/packages/big-table/src/components/edit-form/edit-component/edit-select/edit-select.vue +40 -40
  146. package/packages/big-table/src/components/edit-form/edit-component/edit-select-multiple/edit-select-multiple.vue +55 -55
  147. package/packages/big-table/src/components/edit-form/edit-component/edit-switch/edit-switch.vue +43 -43
  148. package/packages/big-table/src/components/edit-form/edit-component/edit-textarea/edit-textarea.vue +41 -41
  149. package/packages/big-table/src/components/edit-form/edit-component/edit-time-picker/edit-time-picker.vue +40 -40
  150. package/packages/big-table/src/components/edit-form/edit-component/mixins/bound-date.js +3 -3
  151. package/packages/big-table/src/components/edit-form/edit-component/mixins/dateType.js +217 -217
  152. package/packages/big-table/src/components/edit-form/edit-component/mixins/item-default.js +639 -639
  153. package/packages/big-table/src/components/edit-form/edit-component/mixins/search.js +1247 -1247
  154. package/packages/big-table/src/components/edit-form/edit-component/register-com.js +26 -26
  155. package/packages/big-table/src/components/edit-form/edit-item/form-event.js +80 -80
  156. package/packages/big-table/src/components/edit-form/edit-item/global-props.js +33 -33
  157. package/packages/big-table/src/components/edit-form/edit-item/index.js +4 -4
  158. package/packages/big-table/src/components/edit-form/edit-item/render-methods.js +28 -28
  159. package/packages/big-table/src/components/edit-form/edit-item/validate-rules.js +463 -463
  160. package/packages/big-table/src/components/edit-form/edit-mixins/form-commom.js +673 -673
  161. package/packages/big-table/src/components/edit-form/edit-mixins/index.js +3 -3
  162. package/packages/big-table/src/components/edit-form/edit-utils/index.js +112 -112
  163. package/packages/big-table/src/components/password-com.vue +58 -58
  164. package/packages/big-table/src/components/player-vod/index.vue +57 -57
  165. package/packages/big-table/src/components/player-vod/player.vue +193 -193
  166. package/packages/big-table/src/components/player-vod/video-list.vue +265 -265
  167. package/packages/big-table/src/components/player-vod/video-modal.vue +126 -126
  168. package/packages/big-table/src/utils/CustomPagination.vue +86 -86
  169. package/packages/big-table/src/utils/batchEditing.js +610 -610
  170. package/packages/big-table/src/utils/bigTableProps.js +108 -108
  171. package/packages/big-table/src/utils/eventBroadcast.js +24 -24
  172. package/packages/big-table/src/utils/format.js +557 -557
  173. package/packages/big-table/src/utils/nestTable.js +109 -109
  174. package/packages/big-table/src/utils/tableParse.js +234 -234
  175. package/packages/breadcrumb/index.js +21 -21
  176. package/packages/breadcrumb/src/Breadcrumb.jsx +11 -11
  177. package/packages/breadcrumb/src/BreadcrumbItem.jsx +11 -11
  178. package/packages/breadcrumb/src/BreadcrumbSeparator.jsx +11 -11
  179. package/packages/button/index.js +21 -21
  180. package/packages/button/src/Button.jsx +11 -11
  181. package/packages/button/src/ButtonGroup.jsx +11 -11
  182. package/packages/button/src/ButtonPrint/components/IdentityVerification.vue +181 -181
  183. package/packages/button/src/ButtonPrint/index.vue +766 -766
  184. package/packages/button/src/ButtonPrint/mixin/his-print.js +95 -95
  185. package/packages/calendar/index.js +12 -12
  186. package/packages/calendar/src/Calendar.jsx +11 -11
  187. package/packages/captcha/index.js +9 -9
  188. package/packages/captcha/src/Captcha.vue +164 -164
  189. package/packages/captcha/src/Index.vue +47 -47
  190. package/packages/captcha/src/SlideVerify.vue +285 -285
  191. package/packages/card/index.js +21 -21
  192. package/packages/card/src/Card.jsx +12 -12
  193. package/packages/card/src/CardGrid.js +7 -7
  194. package/packages/card/src/CardMeta.js +7 -7
  195. package/packages/carousel/index.js +12 -12
  196. package/packages/carousel/src/Carousel.jsx +12 -12
  197. package/packages/cascader/index.js +12 -12
  198. package/packages/cascader/src/Cascader.jsx +11 -11
  199. package/packages/checkbox/index.js +30 -30
  200. package/packages/checkbox/src/Checkbox.jsx +11 -11
  201. package/packages/checkbox/src/CheckboxImg/index.vue +141 -141
  202. package/packages/checkbox/src/Group.jsx +11 -11
  203. package/packages/col/index.js +13 -13
  204. package/packages/col/src/Col.jsx +11 -11
  205. package/packages/collapse/index.js +18 -18
  206. package/packages/collapse/src/Collapse.jsx +11 -11
  207. package/packages/collapse/src/Panel.jsx +11 -11
  208. package/packages/color-picker/index.js +10 -10
  209. package/packages/color-picker/src/color-picker.vue +191 -191
  210. package/packages/color-picker/src/style.less +109 -109
  211. package/packages/comment/index.js +12 -12
  212. package/packages/comment/src/Comment.jsx +11 -11
  213. package/packages/config-provider/index.js +12 -12
  214. package/packages/config-provider/src/ConfigProvider.jsx +11 -11
  215. package/packages/date-picker/index.js +26 -26
  216. package/packages/date-picker/src/DatePicker.jsx +12 -12
  217. package/packages/date-picker/src/MonthPicker.jsx +11 -11
  218. package/packages/date-picker/src/RangePicker.jsx +11 -11
  219. package/packages/date-picker/src/WeekPicker.jsx +11 -11
  220. package/packages/date-picker/src/utils/index.js +374 -374
  221. package/packages/descriptions/index.js +18 -18
  222. package/packages/descriptions/src/Descriptions.jsx +11 -11
  223. package/packages/descriptions/src/Item.jsx +11 -11
  224. package/packages/divider/index.js +12 -12
  225. package/packages/divider/src/Divider.jsx +11 -11
  226. package/packages/drag-layout/DragFormLeftItem.vue +173 -173
  227. package/packages/drag-layout/DragFormRightItem.vue +284 -284
  228. package/packages/drag-layout/I18n-mixins.js +10 -10
  229. package/packages/drag-layout/drag-layout.vue +778 -778
  230. package/packages/drag-layout/index.js +12 -12
  231. package/packages/drawer/index.js +12 -12
  232. package/packages/drawer/src/Drawer.jsx +11 -11
  233. package/packages/dropdown/index.js +12 -12
  234. package/packages/dropdown/src/Dropdown.jsx +11 -11
  235. package/packages/editor/index.js +9 -9
  236. package/packages/ellipsis/index.js +8 -8
  237. package/packages/ellipsis/src/Ellipsis.vue +65 -65
  238. package/packages/empty/index.js +12 -12
  239. package/packages/empty/src/Empty.jsx +11 -11
  240. package/packages/fabric-chart/index.js +9 -9
  241. package/packages/fabric-chart/src/FabricGrid.vue +67 -67
  242. package/packages/fabric-chart/src/components/DropPopup.vue +90 -90
  243. package/packages/fabric-chart/src/components/MouseRightClick.vue +168 -168
  244. package/packages/fabric-chart/src/components/TimeScaleValue.vue +125 -125
  245. package/packages/fabric-chart/src/const/defaultVaule.js +60 -60
  246. package/packages/fabric-chart/src/fabric-chart/FabricLines.vue +617 -617
  247. package/packages/fabric-chart/src/fabric-chart/FabricPolylines.vue +1191 -1191
  248. package/packages/fabric-chart/src/fabric-chart/FabricScaleValue.vue +139 -139
  249. package/packages/fabric-chart/src/fabric-chart/FabricTextGroup.vue +651 -651
  250. package/packages/fabric-chart/src/mixins/fabricCommon.js +81 -81
  251. package/packages/fabric-chart/src/mixins/fabricObject.js +193 -193
  252. package/packages/fabric-chart/src/mixins/type.js +5 -5
  253. package/packages/fabric-chart/src/utils/bus.js +2 -2
  254. package/packages/form/index.js +16 -16
  255. package/packages/form/src/Form.jsx +11 -11
  256. package/packages/form/src/Item.jsx +11 -11
  257. package/packages/form-model/index.js +14 -14
  258. package/packages/form-model/src/FormModel.jsx +11 -11
  259. package/packages/form-model/src/Item.jsx +11 -11
  260. package/packages/form-table/index.js +16 -16
  261. package/packages/form-table/src/FormTable.vue +1110 -1110
  262. package/packages/form-table/src/components/table-component/config-data/index.js +80 -80
  263. package/packages/form-table/src/components/table-component/global-props.js +22 -22
  264. package/packages/form-table/src/components/table-component/index.js +8 -8
  265. package/packages/form-table/src/components/table-component/mixins/bound-date.js +455 -455
  266. package/packages/form-table/src/components/table-component/mixins/dateType.js +217 -217
  267. package/packages/form-table/src/components/table-component/mixins/item-default.js +257 -257
  268. package/packages/form-table/src/components/table-component/mixins/search.js +1242 -1242
  269. package/packages/form-table/src/components/table-component/register-com.js +30 -30
  270. package/packages/form-table/src/components/table-component/table-age/table-age.vue +175 -175
  271. package/packages/form-table/src/components/table-component/table-date-picker/table-date-picker.vue +87 -87
  272. package/packages/form-table/src/components/table-component/table-digital/table-digital.vue +93 -93
  273. package/packages/form-table/src/components/table-component/table-input/table-input.vue +81 -81
  274. package/packages/form-table/src/components/table-component/table-input-password/table-input-password.vue +126 -126
  275. package/packages/form-table/src/components/table-component/table-month-picker/table-month-picker.vue +55 -55
  276. package/packages/form-table/src/components/table-component/table-search/table-search.vue +174 -174
  277. package/packages/form-table/src/components/table-component/table-search-more/table-search-more.vue +191 -191
  278. package/packages/form-table/src/components/table-component/table-select/table-select.vue +64 -64
  279. package/packages/form-table/src/components/table-component/table-select-multiple/table-select-multiple.vue +81 -81
  280. package/packages/form-table/src/components/table-component/table-textarea/table-textarea.vue +76 -76
  281. package/packages/form-table/src/components/table-component/table-time-picker/table-time-picker.vue +55 -55
  282. package/packages/form-table/src/components/table-component/table-tree-select/table-tree-select.vue +135 -135
  283. package/packages/form-table/src/components/table-component/text-over-tooltip/TextOverTooltip.vue +97 -97
  284. package/packages/form-table/src/components/table-item/form-event.js +81 -81
  285. package/packages/form-table/src/components/table-item/global-props.js +27 -27
  286. package/packages/form-table/src/components/table-item/index.js +4 -4
  287. package/packages/form-table/src/components/table-item/render-methods.js +28 -28
  288. package/packages/form-table/src/components/table-item/validate-rules.js +520 -520
  289. package/packages/form-table/src/components/table-mixins/form-commom.js +98 -98
  290. package/packages/form-table/src/components/table-mixins/index.js +3 -3
  291. package/packages/form-table/src/components/table-utils/index.js +112 -112
  292. package/packages/form-table/src/disabledDetail.less +46 -46
  293. package/packages/grid/index.js +10 -10
  294. package/packages/grid/src/grid.js +28 -28
  295. package/packages/icon/index.js +10 -10
  296. package/packages/icon/src/icon.js +13 -13
  297. package/packages/index.js +313 -313
  298. package/packages/input/index.js +30 -30
  299. package/packages/input/src/Group.jsx +11 -11
  300. package/packages/input/src/Input.jsx +11 -11
  301. package/packages/input/src/Password.jsx +11 -11
  302. package/packages/input/src/Search.jsx +11 -11
  303. package/packages/input/src/TextArea.jsx +11 -11
  304. package/packages/input/src/input-quick/components/quick-item.vue +284 -284
  305. package/packages/input/src/input-quick/components/quick-popover.vue +596 -596
  306. package/packages/input/src/input-quick/index.vue +137 -137
  307. package/packages/input-number/index.js +12 -12
  308. package/packages/input-number/src/InputNumber.jsx +11 -11
  309. package/packages/keep-cache/KeepCache.js +236 -236
  310. package/packages/keep-cache/index.css +2 -2
  311. package/packages/keep-cache/index.js +8 -8
  312. package/packages/layout/index.js +27 -27
  313. package/packages/layout/src/Content.jsx +11 -11
  314. package/packages/layout/src/Footer.jsx +11 -11
  315. package/packages/layout/src/Header.jsx +11 -11
  316. package/packages/layout/src/Layout.jsx +11 -11
  317. package/packages/layout/src/Sider.jsx +11 -11
  318. package/packages/list/index.js +21 -21
  319. package/packages/list/src/Item.jsx +11 -11
  320. package/packages/list/src/ItemMeta.jsx +11 -11
  321. package/packages/list/src/List.jsx +11 -11
  322. package/packages/locale-provider/index.js +12 -12
  323. package/packages/locale-provider/src/LocaleProvider.jsx +11 -11
  324. package/packages/map/index.js +9 -9
  325. package/packages/map/src/Map.vue +484 -484
  326. package/packages/map/src/popup-map.vue +53 -53
  327. package/packages/mentions/index.js +18 -18
  328. package/packages/mentions/src/Mentions.jsx +11 -11
  329. package/packages/mentions/src/Option.jsx +11 -11
  330. package/packages/menu/index.js +27 -27
  331. package/packages/menu/src/Divider.jsx +11 -11
  332. package/packages/menu/src/Item.jsx +11 -11
  333. package/packages/menu/src/ItemGroup.jsx +11 -11
  334. package/packages/menu/src/Menu.jsx +11 -11
  335. package/packages/menu/src/SubMenu.jsx +11 -11
  336. package/packages/message/index.js +8 -8
  337. package/packages/modal/index.js +10 -10
  338. package/packages/modal/src/Modal.js +7 -7
  339. package/packages/multi-chat/chat/addConference.vue +200 -200
  340. package/packages/multi-chat/chat/addMembers.vue +411 -411
  341. package/packages/multi-chat/chat/advancedFilter.vue +372 -372
  342. package/packages/multi-chat/chat/calling.vue +246 -246
  343. package/packages/multi-chat/chat/chatFooter.vue +1647 -1647
  344. package/packages/multi-chat/chat/chatHistory.vue +605 -605
  345. package/packages/multi-chat/chat/chatMain.vue +1490 -1490
  346. package/packages/multi-chat/chat/client/index.vue +149 -149
  347. package/packages/multi-chat/chat/delay.vue +177 -177
  348. package/packages/multi-chat/chat/evaluate.vue +343 -343
  349. package/packages/multi-chat/chat/messageRecord.vue +324 -324
  350. package/packages/multi-chat/chat/mixins/NoData.js +20 -20
  351. package/packages/multi-chat/chat/mixins/base.js +97 -97
  352. package/packages/multi-chat/chat/mixins/uniRTCAPI.js +80 -80
  353. package/packages/multi-chat/chat/mixins/viewerOptions.js +67 -67
  354. package/packages/multi-chat/chat/quickReply.vue +439 -439
  355. package/packages/multi-chat/chat/robot/index.vue +312 -312
  356. package/packages/multi-chat/chat/scrollList.vue +1259 -1259
  357. package/packages/multi-chat/chat/videoVoiceList.vue +348 -348
  358. package/packages/multi-chat/chat/voice.vue +431 -431
  359. package/packages/multi-chat/components/avatar.vue +113 -113
  360. package/packages/multi-chat/components/chat-tabs-header.vue +251 -251
  361. package/packages/multi-chat/components/classify-tabs.vue +185 -185
  362. package/packages/multi-chat/components/empty.vue +24 -24
  363. package/packages/multi-chat/components/modal-refuse-reason.vue +112 -112
  364. package/packages/multi-chat/components/modal-sip.vue +160 -160
  365. package/packages/multi-chat/components/modal-user-transfer.vue +98 -98
  366. package/packages/multi-chat/components/msg-describe.vue +138 -138
  367. package/packages/multi-chat/components/msg-picture.vue +68 -68
  368. package/packages/multi-chat/components/msg-prescription.vue +205 -205
  369. package/packages/multi-chat/components/read-record.vue +133 -133
  370. package/packages/multi-chat/components/read-status.vue +34 -34
  371. package/packages/multi-chat/components/user-status.vue +198 -198
  372. package/packages/multi-chat/components/vuecmf-dialog.vue +322 -322
  373. package/packages/multi-chat/index.js +7 -7
  374. package/packages/multi-chat/setting/authority/index.vue +156 -156
  375. package/packages/multi-chat/setting/authority/roleSetting.vue +204 -204
  376. package/packages/multi-chat/setting/baseInfo/index.vue +1343 -1343
  377. package/packages/multi-chat/setting/customerService/batchSelect.vue +403 -403
  378. package/packages/multi-chat/setting/customerService/index.vue +273 -273
  379. package/packages/multi-chat/setting/event/edit/condition.vue +128 -128
  380. package/packages/multi-chat/setting/event/edit/index.vue +437 -437
  381. package/packages/multi-chat/setting/event/edit/notice.vue +129 -129
  382. package/packages/multi-chat/setting/event/edit/strategy.vue +98 -98
  383. package/packages/multi-chat/setting/event/index.vue +249 -249
  384. package/packages/multi-chat/setting/index.vue +269 -269
  385. package/packages/multi-chat/setting/page.vue +14 -14
  386. package/packages/multi-chat/setting/sessionList/index.vue +412 -412
  387. package/packages/multi-chat/setting/sessionList/messageRecord.vue +372 -372
  388. package/packages/multi-chat/setting/userConfig/index.vue +124 -124
  389. package/packages/multi-chat/setting/worktime/index.vue +274 -274
  390. package/packages/multi-chat/store/actions.js +452 -452
  391. package/packages/multi-chat/store/getters.js +380 -380
  392. package/packages/multi-chat/store/helper.js +66 -66
  393. package/packages/multi-chat/store/index.js +50 -50
  394. package/packages/multi-chat/store/mutation.js +305 -305
  395. package/packages/multi-chat/store/state.js +120 -120
  396. package/packages/multi-chat/style/emoji.css +315 -315
  397. package/packages/multi-chat/style/message.mixin.less +38 -38
  398. package/packages/multi-chat/utils/chatSock.js +93 -93
  399. package/packages/multi-chat/utils/compressImage.js +115 -115
  400. package/packages/multi-chat/utils/emoji.json +68 -68
  401. package/packages/multi-chat/utils/index.js +259 -259
  402. package/packages/multi-chat/utils/observer-scroll.js +49 -49
  403. package/packages/multi-chat/utils/panelsetting.js +48 -48
  404. package/packages/multi-chat-client/index.js +7 -7
  405. package/packages/multi-chat-history/index.js +7 -7
  406. package/packages/multi-chat-record/index.js +7 -7
  407. package/packages/multi-chat-setting/index.js +7 -7
  408. package/packages/multi-chat-sip/index.js +6 -6
  409. package/packages/notification/index.js +8 -8
  410. package/packages/page-header/index.js +12 -12
  411. package/packages/page-header/src/PageHeader.jsx +11 -11
  412. package/packages/pagination/index.js +12 -12
  413. package/packages/pagination/src/Pagination.jsx +11 -11
  414. package/packages/popconfirm/index.js +12 -12
  415. package/packages/popconfirm/src/Popconfirm.jsx +11 -11
  416. package/packages/popover/index.js +12 -12
  417. package/packages/popover/src/Popover.jsx +11 -11
  418. package/packages/progress/index.js +12 -12
  419. package/packages/progress/src/Progress.jsx +11 -11
  420. package/packages/radio/index.js +33 -33
  421. package/packages/radio/src/Group.jsx +11 -11
  422. package/packages/radio/src/Radio.jsx +11 -11
  423. package/packages/radio/src/RadioButton.jsx +11 -11
  424. package/packages/radio/src/RadioImg/index.vue +124 -124
  425. package/packages/rate/index.js +12 -12
  426. package/packages/rate/src/Rate.jsx +11 -11
  427. package/packages/result/index.js +12 -12
  428. package/packages/result/src/Result.jsx +11 -11
  429. package/packages/row/index.js +12 -12
  430. package/packages/row/src/Row.jsx +11 -11
  431. package/packages/scale-container/index.js +8 -8
  432. package/packages/scale-container/src/ScaleContainer.vue +197 -197
  433. package/packages/scale-view/NoData.vue +81 -81
  434. package/packages/scale-view/answerParse.vue +133 -133
  435. package/packages/scale-view/customList.vue +801 -801
  436. package/packages/scale-view/data.js +80 -80
  437. package/packages/scale-view/evaluateCountdown.vue +155 -155
  438. package/packages/scale-view/evaluatePage.vue +202 -202
  439. package/packages/scale-view/formitem/data.js +3991 -3991
  440. package/packages/scale-view/formitem/index.js +7 -7
  441. package/packages/scale-view/formitem/r-address.vue +245 -245
  442. package/packages/scale-view/formitem/r-choice.vue +746 -746
  443. package/packages/scale-view/formitem/r-input.vue +93 -93
  444. package/packages/scale-view/formitem/r-prompt.vue +52 -52
  445. package/packages/scale-view/formitem/r-sign.vue +218 -218
  446. package/packages/scale-view/formitem/r-time.vue +285 -285
  447. package/packages/scale-view/formitem/r-upload-custom-list.vue +242 -242
  448. package/packages/scale-view/formitem/r-upload.vue +287 -287
  449. package/packages/scale-view/formitem/sign-com.vue +316 -316
  450. package/packages/scale-view/formitem/text-over-tooltip/TextOverTooltip.vue +98 -98
  451. package/packages/scale-view/index.js +17 -17
  452. package/packages/scale-view/mixin/NoData.js +38 -38
  453. package/packages/scale-view/mixin/addressVal.js +156 -156
  454. package/packages/scale-view/mixin/evaluate.js +146 -146
  455. package/packages/scale-view/mixin/index.js +337 -337
  456. package/packages/scale-view/mixin/judgeTypes.js +267 -267
  457. package/packages/scale-view/scaleView.vue +2017 -2017
  458. package/packages/select/index.js +27 -27
  459. package/packages/select/src/CustomSelect/index.vue +130 -130
  460. package/packages/select/src/OptGroup.jsx +11 -11
  461. package/packages/select/src/Option.jsx +11 -11
  462. package/packages/select/src/Select/Select.vue +231 -231
  463. package/packages/select/src/Select/index.js +12 -12
  464. package/packages/select/src/TableSelect/index.vue +514 -514
  465. package/packages/select-label/index.js +14 -14
  466. package/packages/select-label/label-classify.vue +129 -129
  467. package/packages/select-label/labelFormContent.vue +787 -787
  468. package/packages/select-label/select-label.vue +597 -581
  469. package/packages/select-person/index.js +10 -10
  470. package/packages/select-person/search-tree.vue +373 -373
  471. package/packages/select-person/select-person.vue +1703 -1696
  472. package/packages/shortcut-setter/index.js +12 -12
  473. package/packages/shortcut-setter/src/ShortcutSetter.vue +55 -55
  474. package/packages/shortcut-setter/src/ShortcutSetterItem.vue +85 -85
  475. package/packages/shortcut-setter/src/utils/index.js +63 -63
  476. package/packages/skeleton/index.js +12 -12
  477. package/packages/skeleton/src/Skeleton.jsx +11 -11
  478. package/packages/slider/index.js +12 -12
  479. package/packages/slider/src/Slider.jsx +11 -11
  480. package/packages/space/index.js +12 -12
  481. package/packages/space/src/Space.jsx +11 -11
  482. package/packages/spin/index.js +12 -12
  483. package/packages/spin/src/Spin.jsx +11 -11
  484. package/packages/statistic/index.js +18 -18
  485. package/packages/statistic/src/Countdown.jsx +11 -11
  486. package/packages/statistic/src/Statistic.jsx +11 -11
  487. package/packages/steps/index.js +18 -18
  488. package/packages/steps/src/Step.jsx +11 -11
  489. package/packages/steps/src/Steps.jsx +11 -11
  490. package/packages/switch/index.js +12 -12
  491. package/packages/switch/src/Switch.jsx +11 -11
  492. package/packages/table-filter/index.js +27 -27
  493. package/packages/table-filter/src/base-search-com/BaseSearch.vue +2622 -2630
  494. package/packages/table-filter/src/classification/Classification-com.vue +1760 -1760
  495. package/packages/table-filter/src/classification/search-class-name.vue +266 -266
  496. package/packages/table-filter/src/classification/search-professional-model.vue +680 -680
  497. package/packages/table-filter/src/components/TextOverTooltip.vue +120 -107
  498. package/packages/table-filter/src/components/age-com/index.vue +205 -205
  499. package/packages/table-filter/src/components/button-group/ButtonGroup.vue +162 -162
  500. package/packages/table-filter/src/components/button-icon/button-icon.js +33 -33
  501. package/packages/table-filter/src/components/button-icon/getBtnIcon.js +34 -34
  502. package/packages/table-filter/src/components/c-tree-select/tree-select.vue +336 -336
  503. package/packages/table-filter/src/components/checkbox-group/CheckboxGroup.vue +53 -0
  504. package/packages/table-filter/src/components/drop-button/drop-button.vue +224 -224
  505. package/packages/table-filter/src/components/drop-button/head-btn-icon.js +33 -33
  506. package/packages/table-filter/src/components/drop-view/drop-view.vue +89 -89
  507. package/packages/table-filter/src/components/multi-select/multi-select.vue +242 -236
  508. package/packages/table-filter/src/components/out-quick-search/out-quick-search.vue +232 -346
  509. package/packages/table-filter/src/components/range-age/index.vue +171 -172
  510. package/packages/table-filter/src/components/render-widget/components/CheckboxGroup.vue +51 -51
  511. package/packages/table-filter/src/components/render-widget/components/DateRangeQuick.vue +212 -0
  512. package/packages/table-filter/src/components/render-widget/components/NumberRange.vue +145 -0
  513. package/packages/table-filter/src/components/render-widget/components/Select.vue +50 -50
  514. package/packages/table-filter/src/components/render-widget/components/SelectDynamic.vue +304 -0
  515. package/packages/table-filter/src/components/render-widget/components/index.js +7 -7
  516. package/packages/table-filter/src/components/render-widget/enums.js +34 -29
  517. package/packages/table-filter/src/components/render-widget/index.vue +124 -91
  518. package/packages/table-filter/src/components/render-widget/mixins/dynamic-method.js +158 -0
  519. package/packages/table-filter/src/components/render-widget/widgetCfgMaps.js +245 -140
  520. package/packages/table-filter/src/components/search-condition/SearchCondition.vue +1907 -1907
  521. package/packages/table-filter/src/components/search-condition/fieldTypeList.js +169 -169
  522. package/packages/table-filter/src/components/search-filter/SearchFilter.vue +280 -278
  523. package/packages/table-filter/src/components/search-modal/set-classification.vue +336 -336
  524. package/packages/table-filter/src/components/table-modal/TableModal.vue +477 -477
  525. package/packages/table-filter/src/const/dataOptions.js +43 -43
  526. package/packages/table-filter/src/const/index.js +1 -1
  527. package/packages/table-filter/src/index.vue +584 -584
  528. package/packages/table-filter/src/mixins/mixins.js +773 -714
  529. package/packages/table-filter/src/mixins/out-quick-method.js +123 -0
  530. package/packages/table-filter/src/mixins/renderWidget.js +97 -89
  531. package/packages/table-filter/src/mixins/tableSearchCon.js +128 -128
  532. package/packages/table-filter/src/mixins/wordBookutils.js +113 -113
  533. package/packages/table-filter/src/quick-search/QuickSearch.vue +2190 -2167
  534. package/packages/tabs/index.js +18 -18
  535. package/packages/tabs/src/TabPane.jsx +11 -11
  536. package/packages/tabs/src/Tabs.jsx +11 -11
  537. package/packages/tag/index.js +21 -21
  538. package/packages/tag/src/CheckableTag.jsx +11 -11
  539. package/packages/tag/src/Tag.jsx +11 -11
  540. package/packages/tag/src/TagGroup.vue +621 -621
  541. package/packages/time-picker/index.js +12 -12
  542. package/packages/time-picker/src/TimePicker.jsx +11 -11
  543. package/packages/timeline/index.js +14 -14
  544. package/packages/timeline/src/Item.jsx +11 -11
  545. package/packages/timeline/src/Timeline.jsx +11 -11
  546. package/packages/tooltip/index.js +12 -12
  547. package/packages/tooltip/src/Tooltip.jsx +11 -11
  548. package/packages/transfer/index.js +12 -12
  549. package/packages/transfer/src/Transfer.jsx +11 -11
  550. package/packages/tree/index.js +18 -18
  551. package/packages/tree/src/Tree.jsx +11 -11
  552. package/packages/tree/src/TreeNode.jsx +11 -11
  553. package/packages/tree-select/index.js +18 -18
  554. package/packages/tree-select/src/TreeNode.jsx +11 -11
  555. package/packages/tree-select/src/TreeSelect.jsx +11 -11
  556. package/packages/upload/chunk-upload/chunk-upload-new.vue +1001 -1001
  557. package/packages/upload/chunk-upload/vod-chunk-upload.vue +749 -749
  558. package/packages/upload/chunk-upload/vod-upload-modal.vue +100 -100
  559. package/packages/upload/index.js +12 -12
  560. package/packages/upload/src/Upload.jsx +11 -11
  561. package/packages/verification-code/SlideVerify.vue +306 -306
  562. package/packages/verification-code/index.js +17 -17
  563. package/packages/verification-code/verification-code.vue +147 -147
  564. package/src/component/player-vod/index.vue +57 -57
  565. package/src/component/player-vod/player.vue +192 -192
  566. package/src/component/player-vod/video-list.vue +262 -262
  567. package/src/component/player-vod/video-modal.vue +128 -128
  568. package/src/component/select-options/index.vue +430 -430
  569. package/src/component/select-pages/index.vue +95 -95
  570. package/src/component/svg/index.vue +59 -59
  571. package/src/core/create.js +6 -6
  572. package/src/core/event.js +23 -23
  573. package/src/core/table-methods.js +444 -444
  574. package/src/directive/flexibleResize.js +151 -151
  575. package/src/directive/preventReClick.js +12 -12
  576. package/src/directive/scroll.js +230 -230
  577. package/src/global/variable.js +2 -2
  578. package/src/style/normalize.css +424 -424
  579. package/src/style/style.less +49 -49
  580. package/src/utils/UniRTCv2.js +626 -626
  581. package/src/utils/chatFetch.js +61 -61
  582. package/src/utils/clickoutside.js +75 -75
  583. package/src/utils/crypto.js +25 -25
  584. package/src/utils/index.js +81 -81
  585. package/src/utils/kty-sdk.js +582 -582
  586. package/src/utils/kty.min-1.0.0.js +14378 -14378
  587. package/src/utils/sip-device.js +79 -79
  588. package/src/utils/time-domain.js +249 -249
  589. package/src/utils/trtc.js +1 -1
  590. package/src/utils/utils-map.js +485 -485
  591. package/src/utils/vexutils.js +836 -836
  592. package/.idea/cnhis-design-vue.iml +0 -12
  593. package/.idea/codeStyles/Project.xml +0 -57
  594. package/.idea/codeStyles/codeStyleConfig.xml +0 -5
  595. package/.idea/git_toolbox_prj.xml +0 -15
  596. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  597. package/.idea/modules.xml +0 -8
  598. package/.idea/vcs.xml +0 -6
@@ -1,1696 +1,1703 @@
1
- <template>
2
- <div class="personnel">
3
- <a-spin :spinning="spinning">
4
- <div class="people-tree">
5
- <!-- 树主体与检索 -->
6
- <div class="people-tree-item people-tree-left">
7
- <!-- $t('1.1.1.5.1') -->
8
- <a-input-search style="margin-bottom: 12px" :placeholder="searchPlaceholder" :enter-button="searchButtonText" :allowClear="true" @search="searchClick" v-model="title" class="person-search">
9
- <!-- <a-icon slot="prefix" type="search" class="search-input-icon" /> -->
10
- <!-- <svg-icon
11
- slot="prefix"
12
- class="search-input-icon"
13
- iconClass="xitongtubiaosousuo"
14
- ></svg-icon> -->
15
- </a-input-search>
16
- <div class="type-wrap" v-if="selectType === 'multiple'">
17
- <div class="type-btn" :class="{ 'type-active': typeActiveIndex === 0 }" @click="onTypeClick(0)">选人员</div>
18
- <div class="type-btn" :class="{ 'type-active': typeActiveIndex === 1 }" @click="onTypeClick(1)">选科室</div>
19
- <div class="type-btn" :class="{ 'type-active': typeActiveIndex === 2 }" @click="onTypeClick(2)">选角色</div>
20
- </div>
21
- <template v-if="!isSingleCheck">
22
- <a-checkbox v-if="searchTreeVisable" v-model="searchChecked" :indeterminate="searchIndeterminate" @change="radioChange">
23
- <!-- {{ $t("1.10.139") }} -->
24
- 全选
25
- </a-checkbox>
26
-
27
- <a-checkbox v-else v-model="singleChecked" :indeterminate="indeterminate" @change="radioChange">
28
- <!-- {{ $t("1.10.139") }} -->
29
- 全选
30
- </a-checkbox>
31
- </template>
32
-
33
- <div v-show="search.status == 3 || (search.status == 0 && treeData.temp && treeData.temp.length == 0)" class="no-data-tips">
34
- 查无结果
35
- </div>
36
- <!-- main tree -->
37
- <a-tree
38
- class="main-tree-container"
39
- v-show="search.status == 0"
40
- ref="antTree"
41
- v-model="checkedKeys.temp"
42
- @expand="onExpand"
43
- @check="onTreeCheck"
44
- checkable
45
- :expandedKeys="expandedKeys"
46
- :autoExpandParent="autoExpandParent"
47
- :checkStrictly="checkStrictly"
48
- :selectable="false"
49
- :treeData="treeData.temp"
50
- :load-data="getLoadChildData"
51
- :disabled="isDetail"
52
- >
53
- <template slot="custom" slot-scope="scope">
54
- <span v-if="scope.isLeaf">
55
- <a-tooltip :title="`${scope.title} ${scope.sub_title}`" :mouseEnterDelay="0.3">
56
- <span class="c-title">{{ scope.title || scope.key }}&thinsp; </span>
57
- <span class="c-sub-title">{{ scope.sub_title }}</span>
58
- </a-tooltip>
59
- </span>
60
- <span v-else class="p-title">
61
- <span v-if="scope.title">{{ scope.title }}</span>
62
- <span v-else>{{ scope.key }}</span>
63
- {{ treeCount(scope.count) }}
64
- </span>
65
- </template>
66
- </a-tree>
67
- <!-- search tree -->
68
- <searchTree
69
- v-on="$listeners"
70
- ref="searchTree"
71
- :visable="searchTreeVisable"
72
- :formatTreeData="treeData.search"
73
- :searchValue="searchValue"
74
- :allCheckedKeys="checkedKeys"
75
- :defaultExpandedKeys="search.defaultExpandedKeys"
76
- :dataListKeys="search.dataListKeys"
77
- :searchNoMore="searchNoMore"
78
- :loadMorenLoadinng="loadMorenLoadinng"
79
- @addCheckedkeysMain="addCheckedkeysMain"
80
- @removeCheckedkeysMain="removeCheckedkeysMain"
81
- @addCheckedkeysOther="addCheckedkeysOther"
82
- @removeCheckedkeysOther="removeCheckedkeysOther"
83
- @searchOnloadMore="searchOnloadMore"
84
- ></searchTree>
85
- </div>
86
- <!-- 树已选的数据 -->
87
- <div class="select-wrap">
88
- <div class="select-header" v-if="(defaultShowList && defaultShowList.length) || checkedTreeItem.length">
89
- <div class="select-count" v-if="showCount">已选择:{{ defaultShowList.length + checkedTreeItem.length }}</div>
90
- <div class="clear-btn" @click="onClearSelect" v-if="showClear">清空</div>
91
- </div>
92
- <div class="select-content">
93
- <slot v-if="defaultShowList && defaultShowList.length">
94
- <div class="tag-item def-item" v-for="(tag, i) in defaultShowList" :key="i">
95
- {{ tag.title || tag[wordbookChild.user_name_obj] }}
96
- <a-icon v-if="!isDetail" class="tag-close" type="close-circle" theme="filled" @click="closeDefaultTag(tag, i)" />
97
- <!-- <svg-icon
98
- v-if="!isDetail"
99
- class="tag-close"
100
- :icon-class="'xitongtubiaodaohangtubiaoguanbishixin'"
101
- @click="closeDefaultTag(tag, i)"
102
- ></svg-icon> -->
103
- </div>
104
- </slot>
105
-
106
- <div class="tag-item" :class="{ isRoot: !tag.isLeaf }" v-for="tag in checkedTreeItem" :key="tag.key">
107
- {{ tag.title || tag.key }} {{ treeCount(tag.count) }}
108
- <!-- <svg-icon
109
- v-if="!isDetail"
110
- class="tag-close"
111
- :icon-class="'xitongtubiaodaohangtubiaoguanbishixin'"
112
- @click="closeTag(tag)"
113
- ></svg-icon> -->
114
- <a-icon v-if="!isDetail" class="tag-close" type="close-circle" theme="filled" @click="closeTag(tag)" />
115
- </div>
116
- </div>
117
- </div>
118
- </div>
119
- </a-spin>
120
- </div>
121
- </template>
122
- <script>
123
- /* eslint-disable no-async-promise-executor */
124
-
125
- import { Icon, Checkbox, Tree, Tooltip, Input, Spin } from 'ant-design-vue';
126
- import searchTree from './search-tree';
127
- import create from '@/core/create';
128
- import vexutils from '@/utils/vexutils';
129
- import { filterTree, deepTraversalFirst, getAllParentId } from '@/utils';
130
-
131
- /**
132
- * 查询没有部门的分类时,parent_id_obj 为 undefined a-tree 展示异常。
133
- * 前端 赋上固定key 标识 该分类 无部门,该key 不能提交接口。
134
- * */
135
-
136
- /**
137
- * key 唯一key
138
- * title 展示标题
139
- * sub_title 副标题
140
- * count 数量
141
- */
142
-
143
- const FIXEDKEY = '8982eeb4-0439-4100-9805-8cdd12b2256c-front-end-fixed-key';
144
- export default create({
145
- name: 'select-person',
146
- components: {
147
- searchTree,
148
- [Icon.name]: Icon,
149
- [Spin.name]: Spin,
150
- [Tree.name]: Tree,
151
- [Input.Search.name]: Input.Search,
152
- [Checkbox.name]: Checkbox,
153
- [Tooltip.name]: Tooltip
154
- },
155
- props: {
156
- isDetail: { type: Boolean, isDetail: false },
157
- defaultList: { type: Array, default: () => [] },
158
- data: { type: Array, default: () => [] },
159
- roleData: { type: Array, default: () => [] },
160
- roleFields: {
161
- type: Object,
162
- default: () => ({ title: 'name', key: 'id', children: 'children' })
163
- },
164
- searchPlaceholder: {
165
- type: String,
166
- default: '输入关键字搜索'
167
- },
168
- searchButtonText: {
169
- type: String,
170
- default: '搜索'
171
- },
172
- // 父级配置
173
- wordbook: {
174
- type: Object,
175
- default: () => ({
176
- // parent_id_obj: "dept_id", // 父级 id
177
- // parent_id_obj_key: "dept_id", // 提交的 id 的映射 key
178
- // parent_name_obj: "dept_name", // 名称
179
- // parent_name_obj_key: "dept_name", // 名称 的映射key
180
- // user_count_obj: "count" // 统计 key
181
- })
182
- },
183
-
184
- // 子集配置
185
- wordbookChild: {
186
- type: Object,
187
- default: () => ({})
188
- },
189
-
190
- // 检索加载更多
191
- SearchLoadMore: {
192
- type: Boolean,
193
- default: false
194
- },
195
-
196
- showClear: {
197
- type: Boolean,
198
- default: true
199
- },
200
- showCount: {
201
- type: Boolean,
202
- default: true
203
- },
204
- selectType: {
205
- type: String,
206
- default: 'person' // person dept role multiple
207
- },
208
- isSingleCheck: {
209
- type: Boolean,
210
- default: false
211
- },
212
- checkStrictly: {
213
- type: Boolean,
214
- default: false
215
- },
216
- needFilterParentDept: {
217
- type: Boolean,
218
- default: true
219
- },
220
- filterChildren: {
221
- type: Boolean,
222
- default: false
223
- },
224
- titleAddCode: {
225
- type: Boolean,
226
- default: true // 标题是否加上code
227
- },
228
- queryMainTreeData: Function, // 主树请求
229
- queryLoadChildData: Function, // 懒加载请求
230
- queryTreeSearch: Function // 检索请求
231
- },
232
- data() {
233
- return {
234
- treeData: {
235
- main: [],
236
- search: [],
237
- dept: [],
238
- role: [],
239
- temp: []
240
- },
241
- // 展开的keys
242
- expandedKeys: [],
243
- // 展开的部门keys
244
- expandedDeptKeys: [],
245
- autoExpandParent: true,
246
- // 扁平化tree的options Object{Array[Object]}
247
- dataList: {
248
- main: [],
249
- other: [],
250
- dept: [],
251
- role: []
252
- },
253
- // 当前tree选中的keys Object{Array[Number]}
254
- checkedKeys: {
255
- main: [],
256
- other: [],
257
- dept: [],
258
- role: [],
259
- temp: []
260
- },
261
- search: {
262
- defaultExpandedKeys: [],
263
- // 0: 未查询,1:查询中,2:有查询结果,3无查询结果
264
- status: 0,
265
- dataListKeys: {
266
- main: [],
267
- other: []
268
- },
269
- records: 0
270
- },
271
- searchValue: '',
272
- searchPage: 1,
273
- searchNoMore: false,
274
- title: '',
275
- // 选中的所有叶节点(Leaf)keys <Array[Number]>,最终提交接口所需格式
276
- checkedLeafKeys: [],
277
- spinning: false,
278
- loadMorenLoadinng: false,
279
-
280
- errorMsg: '',
281
-
282
- defaultShowList: [], // 默认选中项
283
- checkedKeysMain: [],
284
-
285
- cacheParentIdObj: {},
286
- singleChecked: false,
287
- indeterminate: false,
288
-
289
- searchIndeterminate: false,
290
- searchChecked: false,
291
- typeActiveIndex: 0
292
- };
293
- },
294
- computed: {
295
- searchTreeVisable() {
296
- return this.search.status == 2;
297
- },
298
- dataListMainKeys() {
299
- if (!this.dataList.main.length) return [];
300
-
301
- return this.dataList.main.map(i => {
302
- return i.key;
303
- });
304
- },
305
- dataListDeptKeys() {
306
- if (!this.dataList.dept.length) return [];
307
-
308
- return this.dataList.dept.map(i => {
309
- return i.key;
310
- });
311
- },
312
- dataListRoleKeys() {
313
- if (!this.dataList.role.length) return [];
314
-
315
- return this.dataList.role.map(i => {
316
- return i.key;
317
- });
318
- },
319
- dataListOtherKeys() {
320
- if (!this.dataList.other.length) return [];
321
-
322
- return this.dataList.other.map(i => {
323
- return i.key;
324
- });
325
- },
326
- // 右侧展示tabs <Array[Object]>
327
- checkedTreeItem() {
328
- let otherItems = this.dataList.other.filter(item => {
329
- return this.checkedKeys.other.includes(item.key);
330
- });
331
- let mainItems = this.dataList.main.filter(item => {
332
- // let f = this.currentKey === 'main';
333
- // if(!f) return f;
334
- let { isLeaf, key } = item;
335
- let parentId = this.getParentId(item);
336
- let showKeys = [...this.checkedKeys.main, ...otherItems];
337
- let checked = showKeys.includes(key);
338
- // 父级全选,子级不展示
339
- /** String(parentId) 类型不相等 */
340
- // if (isLeaf && parentId && this.checkedKeys.temp.some(v => v == parentId)) {
341
- // checked = false;
342
- // }
343
- item.itemType = 'person';
344
- return checked && item.type == 2;
345
- });
346
- let deptItems = this.dataList.dept.filter(item => {
347
- let { key } = item;
348
- let showKeys = [...this.checkedKeys.dept, ...otherItems];
349
- let checked = showKeys.includes(key);
350
- item.itemType = 'dept';
351
- // 只展示最后一级的科室
352
- if (this.needFilterParentDept) {
353
- return checked && item.type == 1 && (!item.children || (item.children && !item.children.length));
354
- } else {
355
- // 不过滤
356
- return checked && item.type == 1;
357
- }
358
- });
359
- let roleItems = this.dataList.role.filter(item => {
360
- let showKeys = [...this.checkedKeys.role, ...otherItems];
361
- let checked = showKeys.includes(item.key);
362
- item.itemType = 'role';
363
- return checked && item.roleId;
364
- });
365
- if (this.selectType === 'multiple') {
366
- deptItems.forEach(item => {
367
- if (item.title) {
368
- item.title = item.title.includes('(科室)') ? item.title : `${item.title}(科室)`;
369
- }
370
- });
371
- roleItems.map(item => {
372
- if (item.title) {
373
- item.title = item.title.includes('(角色)') ? item.title : `${item.title}(角色)`;
374
- }
375
- return item;
376
- });
377
- }
378
-
379
- let list = this.uniqArrObj([...mainItems, ...deptItems, ...roleItems, ...otherItems], 'key');
380
- return list;
381
- },
382
-
383
- wordbookConfig() {
384
- const { parent_id_obj, parent_name_obj } = this.wordbook || {};
385
- const { user_id_obj, user_name_obj } = this.wordbookChild || {};
386
- return {
387
- parent_id_obj,
388
- parent_name_obj,
389
- user_id_obj,
390
- user_name_obj
391
- };
392
- },
393
-
394
- getLoadChildData() {
395
- if (typeof this.queryLoadChildData == 'function') {
396
- return this.onLoadData;
397
- }
398
- return null;
399
- },
400
-
401
- currentKey() {
402
- return { person: 'main', dept: 'dept', role: 'role', multiple: 'main' }[this.selectType];
403
- }
404
- },
405
- watch: {
406
- // defaultList: {
407
- // immediate: true,
408
- // handler(val) {
409
- // if (!val) return;
410
- // this.initDefault();
411
- // }
412
- // },
413
- selectType: {
414
- immediate: true,
415
- handler(val) {
416
- if (val === 'dept' || val === 'role' || val === 'multiple') {
417
- this.typeActiveIndex = { multiple: 0, dept: 1, role: 2 }[val];
418
- }
419
- }
420
- },
421
- data: {
422
- immediate: true,
423
- handler() {
424
- this.handleData();
425
- this.staticDataInit();
426
- this.staticDeptAndRoleDataInit();
427
- const key = { person: 'main', dept: 'dept', role: 'role', multiple: 'main' }[this.selectType];
428
- this.treeData.temp = this.treeData[key];
429
- }
430
- },
431
- roleData: {
432
- immediate: true,
433
- handler() {
434
- this.staticDeptAndRoleDataInit();
435
- const key = { person: 'main', dept: 'dept', role: 'role', multiple: 'main' }[this.selectType];
436
- this.treeData.temp = this.treeData[key];
437
- }
438
- }
439
- },
440
- created() {},
441
- mounted() {
442
- this.getUsers();
443
- this.initDefault();
444
- },
445
- methods: {
446
- initDefault() {
447
- if (this.getLoadChildData) {
448
- this.getDefaultList();
449
- } else {
450
- this.$nextTick(() => {
451
- const userIds = this.defaultList.filter(item => item.itemType === 'person').map(item => item.id);
452
- const deptIds = this.defaultList.filter(item => item.itemType === 'dept').map(item => item.id);
453
- const roleIds = this.defaultList.filter(item => item.itemType === 'role').map(item => item.id);
454
- const key = ['main', 'dept', 'role'][this.typeActiveIndex];
455
- console.log(deptIds, key, '666 init');
456
- this.checkedKeys.main = userIds;
457
- this.checkedKeys.dept = deptIds;
458
- this.checkedKeys.role = roleIds;
459
- this.checkedKeys.temp = this.checkedKeys[key];
460
- });
461
- }
462
- },
463
-
464
- staticDataInit() {
465
- if (!Array.isArray(this.data) || this.data.length == 0) return;
466
- this.treeData.main = this.data;
467
- this.generateDataList(this.treeData.main, this.dataList.main);
468
- },
469
- staticDeptAndRoleDataInit() {
470
- this.treeData.dept = this.getDeptData(this.data);
471
- this.generateDataList(this.treeData.dept, this.dataList.dept);
472
- this.treeData.role = this.handleRoleData(this.roleData);
473
- this.generateDataList(this.treeData.role, this.dataList.role);
474
- },
475
- getDeptData(data) {
476
- // 把data里面的人员过滤掉
477
- let copyData = JSON.parse(JSON.stringify(data));
478
- copyData = copyData.filter(item => item.type === 1);
479
- vexutils.searchTree(copyData, item => {
480
- if (item.type === 1 && item.children && item.children.length) {
481
- item.children = item.children.filter(child => child.type === 1);
482
- }
483
- });
484
- return copyData;
485
- },
486
- handleRoleData(data) {
487
- const copyData = JSON.parse(JSON.stringify(data));
488
- vexutils.searchTree(copyData, item => {
489
- const { title, key, children } = this.roleFields;
490
- item.title = item[title];
491
- item.children = item[children] ? item[children] : [];
492
- item.key = item[key];
493
- });
494
- return copyData;
495
- },
496
- /** --- 默认值 --- */
497
- getDefaultList() {
498
- const { defaultList } = this;
499
- let copy = JSON.parse(JSON.stringify(defaultList));
500
- if (Array.isArray(copy)) {
501
- // this.defaultShowObj = {};
502
-
503
- const { user_id_obj } = this.wordbookChild || {};
504
- copy.forEach(v => {
505
- this.handleDefMapping(v);
506
- let key = this.getuniqKey(v);
507
- let pId = this.getParentId(v);
508
- this.cacheParentIdObj[pId] = pId;
509
- // this.defaultShowObj[key] = v[user_id_obj];
510
- });
511
- this.defaultShowList = copy;
512
- }
513
- },
514
-
515
- getcheckedKeys() {
516
- const { defaultList } = this;
517
- let checkedKeysMain = [],
518
- checkedKeysOther = [];
519
- let copy = JSON.parse(JSON.stringify(defaultList));
520
- if (Array.isArray(copy)) {
521
- copy.forEach(v => {
522
- this.handleDefMapping(v);
523
- let key = this.getuniqKey(v);
524
- checkedKeysMain.push(key);
525
- // 回填到 检索的选择,防止回填马上检索
526
- if (String(key).includes(FIXEDKEY)) {
527
- checkedKeysOther.push(key);
528
- }
529
- });
530
- }
531
- return {
532
- checkedKeysMain,
533
- checkedKeysOther
534
- };
535
- },
536
-
537
- /**
538
- * 根据配置映射默认值
539
- */
540
- handleDefMapping(v) {
541
- const { parent_id_obj, parent_name_obj, user_id_obj, user_name_obj } = this.wordbookConfig || {};
542
- // 自定义 key 值
543
- const { parent_id_obj_key, parent_name_obj_key } = this.wordbook;
544
- const { user_id_obj_key, user_name_obj_key } = this.wordbookChild;
545
- v[parent_id_obj] = v[parent_id_obj_key] || v.parent_id;
546
- v[parent_name_obj] = v[parent_name_obj_key] || v.parent_name;
547
- v[user_id_obj] = v[user_id_obj_key] || v.user_id;
548
- v[user_name_obj] = v[user_name_obj_key] || v.user_name;
549
- },
550
-
551
- /**
552
- * 初始化 请求已选的数据
553
- */
554
- async loadSelected() {
555
- try {
556
- let list = await Promise.all(
557
- this.treeData.main.map(async v => {
558
- const { parent_id_obj } = this.wordbook || {};
559
- if ([v.key, v[parent_id_obj], String(v[parent_id_obj])].includes(this.cacheParentIdObj[v[parent_id_obj]])) {
560
- await this.onLoadData({ dataRef: v });
561
- return v;
562
- }
563
- })
564
- );
565
- return list;
566
- } catch (error) {
567
- return Promise.resolve();
568
- }
569
- },
570
-
571
- /**
572
- * 过滤默认值的右边展示
573
- */
574
- hanldeFilterDefaultShowList(list) {
575
- this.defaultShowList = this.defaultShowList.filter(d => list.findIndex(l => this.getuniqKey(d) == this.getuniqKey(l)) == -1);
576
- // this.updateDefaultShowObj(this.defaultShowList);
577
- },
578
-
579
- updateDefaultShowObj(list) {
580
- const { user_id_obj } = this.wordbookConfig || {};
581
- this.defaultShowObj = {};
582
- list.forEach(v => {
583
- this.defaultShowObj[this.getuniqKey(v)] = v[user_id_obj];
584
- });
585
- },
586
-
587
- /**
588
- * 拼接key
589
- */
590
- getuniqKey(v) {
591
- const { user_id_obj } = this.wordbookConfig || {};
592
- return `${this.getParentId(v)}_${v[user_id_obj]}`;
593
- // return v.key;
594
- },
595
-
596
- getParentId(v) {
597
- const { parent_id_obj } = this.wordbookConfig || {};
598
- // return `${v[parent_id_obj] || FIXEDKEY}`;
599
- return `${v[parent_id_obj]}`;
600
- },
601
-
602
- // 查询树结构数据(一级父类)
603
- async getUsers() {
604
- try {
605
- if (typeof this.queryMainTreeData !== 'function') {
606
- return;
607
- }
608
- this.spinning = true;
609
- const { parent_id_obj } = this.wordbookConfig || {};
610
- let rows = await this.queryMainTreeData();
611
- let list = this.uniqArrObj(rows, parent_id_obj);
612
- this.treeData.main = list;
613
- this.generateDataList(this.treeData.main, this.dataList.main);
614
- // TODO:这里的回填
615
- await this.loadSelected();
616
- let { checkedKeysMain, checkedKeysOther } = this.getcheckedKeys();
617
- this.checkedKeys.main.push(...checkedKeysMain);
618
- this.checkedKeys.other = [...checkedKeysOther];
619
-
620
- this.treeData.main.forEach(f => {
621
- if (f && f.children && f.children.length) {
622
- let flag = f.children.every(c => checkedKeysMain.includes(c.key));
623
- if (flag && f.key) {
624
- this.checkedKeys.main.push(f.key);
625
- }
626
- }
627
- });
628
- if (this.currentKey === 'main') {
629
- this.checkedKeys.temp = this.checkedKeys.main;
630
- this.treeData.temp = this.treeData.main;
631
- }
632
- this.spinning = false;
633
- } catch (error) {
634
- this.spinning = false;
635
- this.$message.error('查询异常');
636
- console.log(error);
637
- }
638
- },
639
-
640
- // 动态获取子节点
641
- onLoadData(treeNode) {
642
- return new Promise(async resolve => {
643
- if (treeNode.dataRef.children) {
644
- resolve();
645
- return;
646
- }
647
- treeNode.dataRef.children = await this.handleLoadChildData(treeNode.dataRef.key, treeNode.dataRef);
648
-
649
- this.hanldeFilterDefaultShowList(treeNode.dataRef.children);
650
-
651
- this.$nextTick(() => {
652
- this.treeData.main = [...this.treeData.main];
653
- this.treeData.temp = [...this.treeData.main];
654
- });
655
-
656
- this.addCheckedKeysChildrenMain(treeNode.dataRef);
657
-
658
- this.generateDataList(treeNode.dataRef.children, this.dataList.main);
659
- resolve();
660
- });
661
- },
662
-
663
- async handleLoadChildData(key, treeNode) {
664
- let rows = await this.queryLoadChildData(key, treeNode);
665
- let list = rows;
666
- return list;
667
- },
668
-
669
- loadMainChildData(searchResultTreeData) {
670
- return new Promise(async resolve => {
671
- let promises = searchResultTreeData.map(async item => {
672
- if (item.users) {
673
- let mainTreeItem = this.treeData.main.find(mainItem => mainItem.key == item.key);
674
- if (!mainTreeItem || (mainTreeItem && !mainTreeItem.children)) {
675
- if (!mainTreeItem) {
676
- mainTreeItem = { ...item };
677
- }
678
- mainTreeItem.children = await this.handleLoadChildData(item.key, mainTreeItem);
679
- this.generateDataList(mainTreeItem.children, this.dataList.main);
680
- this.addCheckedKeysChildrenMain(mainTreeItem);
681
- }
682
- }
683
- });
684
-
685
- await Promise.all(promises);
686
-
687
- resolve();
688
- });
689
- },
690
-
691
- /**
692
- * 检索
693
- */
694
- async searchFetch(data = {}, config = {}) {
695
- if (typeof this.queryTreeSearch !== 'function') {
696
- this.staticDataSearch();
697
- this.spinning = false;
698
- this.isSearchAllCheck();
699
- return;
700
- }
701
- if (!this.searchValue) {
702
- this.search.status = 0;
703
- this.search.defaultExpandedKeys = [];
704
- this.expandedKeys = [];
705
- this.spinning = false;
706
- this.searchNoMore = false;
707
- return false;
708
- }
709
- if (!config.loadMoren) {
710
- this.search.status = 1;
711
- } else {
712
- this.loadMorenLoadinng = true;
713
- }
714
-
715
- let rows = await this.queryTreeSearch(this.searchValue, data);
716
- let searchResultTreeData = rows;
717
- this.loadMorenLoadinng = false;
718
- if (!searchResultTreeData || !searchResultTreeData.length) {
719
- if (this.searchPage == 1) {
720
- this.search.defaultExpandedKeys = [];
721
- this.search.status = 3;
722
- } else {
723
- this.search.status = 2;
724
- this.searchNoMore = true;
725
- }
726
-
727
- this.spinning = false;
728
- this.isSearchAllCheck();
729
- return false;
730
- }
731
-
732
- const { parent_id_obj, parent_name_obj, user_count_obj } = this.wordbook || {};
733
- const { user_name_obj } = this.wordbookChild || {};
734
- let pObj = {};
735
- searchResultTreeData.forEach(item => {
736
- item[parent_id_obj] &&
737
- (pObj[item[parent_id_obj]] = {
738
- key: item[parent_id_obj],
739
- users: []
740
- });
741
-
742
- if (item.users) {
743
- this.insertSearchTreeData(item);
744
- } else {
745
- this.insertSearchTreeDataOther(item);
746
- }
747
- });
748
- let pList = [];
749
- Object.keys(pObj || {}).forEach(v => {
750
- if (v) {
751
- pList.push({ ...pObj[v] });
752
- }
753
- });
754
- let len = this.treeData.search.length || 0;
755
- // TODO:加载更多
756
- if (this.SearchLoadMore) {
757
- this.searchNoMore = false;
758
- } else {
759
- this.searchNoMore = true;
760
- }
761
- // 防止searchTree选中后切换回mainTree,mainTree checkedKeys状态丢失
762
- await this.loadMainChildData(pList);
763
- this.generateSearchDataListKeys(searchResultTreeData);
764
-
765
- this.hanldeFilterDefaultShowList(searchResultTreeData);
766
- this.refreshSearchTree();
767
- this.search.status = 2;
768
- this.spinning = false;
769
-
770
- this.isSearchAllCheck();
771
- },
772
-
773
- insertSearchTreeData(item) {
774
- const { user_count_obj } = this.wordbook || {};
775
- this.search.defaultExpandedKeys.push(item.key);
776
-
777
- // 默认值处理
778
- this.hanldeFilterDefaultShowList(item.children || []);
779
-
780
- if (item[user_count_obj] == item.children.length) {
781
- item.disableCheckbox = false;
782
- }
783
- this.treeData.search.push(item);
784
- },
785
-
786
- insertSearchTreeDataOther(item) {
787
- let formatItem = Object.assign({}, item, { isLeaf: true });
788
-
789
- this.treeData.search.push(formatItem);
790
-
791
- if (this.dataListOtherKeys.includes(formatItem.key)) return false;
792
- this.generateDataList([formatItem], this.dataList.other);
793
- },
794
-
795
- generateSearchDataListKeys(searchResultTreeData) {
796
- // this.search.dataListKeys = {
797
- // main: [],
798
- // other: []
799
- // };
800
- searchResultTreeData.forEach(item => {
801
- if (!this.dataListMainKeys.includes(item.key)) {
802
- this.search.dataListKeys.other.push(item.key);
803
- item.children &&
804
- item.children.forEach(childItem => {
805
- this.search.dataListKeys.other.push(childItem.key);
806
- });
807
- return;
808
- }
809
-
810
- this.search.dataListKeys.main.push(item.key);
811
- item.children &&
812
- item.children.forEach(childItem => {
813
- this.search.dataListKeys.main.push(childItem.key);
814
- });
815
- });
816
- },
817
-
818
- searchOnloadMore() {
819
- this.searchPage = this.searchPage + 1;
820
- this.searchFetch({ page: this.searchPage }, { loadMoren: true });
821
- },
822
-
823
- addCheckedKeysChildrenMain(item) {
824
- if (!item.key) return;
825
- if (!this.checkedKeys.main.includes(String(item.key))) return false;
826
- // 新查询到插入已选中的main treeData 的child key,需要手动push到checkedKeys中
827
- if (!Array.isArray(item.children)) return false;
828
- item.children.forEach(({ key }) => {
829
- // 防止重复添加(已处理,不会重复添加,保留代码以防逻辑缺漏)
830
- if (this.checkedKeys.main.includes(key) || !key) return false;
831
- this.checkedKeys.main.push(key);
832
- });
833
- },
834
-
835
- // 暂存实际可选节点arr
836
- generateDataList(data, dataList) {
837
- for (let i = 0; i < data.length; i++) {
838
- const node = data[i];
839
- dataList.push({
840
- parentId: this.getParentId(node),
841
- ...node
842
- });
843
- if (node.children) {
844
- this.generateDataList(node.children, dataList);
845
- }
846
- }
847
- },
848
-
849
- // 获取匹配搜索节点arr
850
- getParentKey(key, tree) {
851
- let parentKey;
852
- for (let i = 0; i < tree.length; i++) {
853
- const node = tree[i];
854
- if (node.key == key) {
855
- parentKey = node.key;
856
- return parentKey;
857
- }
858
-
859
- if (node.children) {
860
- if (node.children.some(item => item.key == key)) {
861
- parentKey = node.key;
862
- } else if (this.getParentKey(key, node.children)) {
863
- parentKey = this.getParentKey(key, node.children);
864
- }
865
- }
866
- }
867
- return parentKey;
868
- },
869
- radioChange(e) {
870
- let { checked } = e.target || {};
871
- if (this.searchTreeVisable) {
872
- this.singleChecked = checked;
873
- } else {
874
- this.searchChecked = checked;
875
- }
876
- this.checkAll(checked ? 1 : 2);
877
- this.handleOk();
878
- },
879
- // type 1 全选 2 反选(清空)
880
- checkAll(type) {
881
- if (this.checkAllSearchTree(type)) return false;
882
- const key = ['main', 'dept', 'role'][this.typeActiveIndex];
883
- if (type == 1) {
884
- this.expandedKeys = [];
885
- this.checkedKeys[key] = this[`dataList${key.slice(0, 1).toUpperCase()}${key.slice(1)}Keys`]; // dataListMainKeys dataListDeptKeys dataListRoleKeys;
886
- this.checkedKeys.temp = this.checkedKeys[key];
887
- } else if (type == 2) {
888
- this.checkedKeys[key] = [];
889
- this.checkedKeys.temp = [];
890
- this.autoExpandParent = true;
891
- }
892
- },
893
-
894
- checkAllSearchTree(type) {
895
- if (!this.searchTreeVisable) return false;
896
-
897
- if (type == 1) {
898
- // 全选默认不选中父级
899
- let allSearchkeysMain = this.search.dataListKeys.main.filter(key => {
900
- return !this.search.defaultExpandedKeys.includes(key);
901
- });
902
-
903
- let allSearchkeysOther = this.search.dataListKeys.other;
904
-
905
- this.checkedKeys.main = vexutils.uniq([...this.checkedKeys.main, ...allSearchkeysMain]);
906
- this.checkedKeys.other = vexutils.uniq([...this.checkedKeys.other, ...allSearchkeysOther]);
907
-
908
- // 如果子级全选,父级也需要选中
909
- this.search.dataListKeys.main.forEach(key => {
910
- let getParentKey = this.getParentKey(key, this.treeData.main);
911
- let parent = this.treeData.main.filter(item => {
912
- return item.key == getParentKey;
913
- });
914
-
915
- let allCheck = parent[0].children.every(item => {
916
- return this.checkedKeys.main.includes(item.key);
917
- });
918
- allCheck && this.checkedKeys.main.push(getParentKey);
919
- });
920
- this.refreshSearchTree();
921
- } else if (type == 2) {
922
- this.$refs['searchTree'].emptyCheckedKeys();
923
- this.autoExpandParent = true;
924
- }
925
- this.isSearchAllCheck();
926
- return true;
927
- },
928
-
929
- refreshSearchTree() {
930
- if (!this.searchTreeVisable) return false;
931
- this.$refs['searchTree'].setDefaultCheckedKeys();
932
- this.$nextTick(() => {
933
- this.isSearchAllCheck();
934
- });
935
- },
936
-
937
- // 展开数节点
938
- onExpand(expandedKeys) {
939
- // const latestOpenKey = expandedKeys.find(key => this.expandedKeys.indexOf(key) == -1);
940
- // this.expandedKeys = latestOpenKey ? [latestOpenKey] : [];
941
- // this.autoExpandParent = false;
942
- this.expandedKeys = expandedKeys;
943
- this.autoExpandParent = false;
944
- // this.$emit('expand', expandedKeys, ...arg)
945
- },
946
- onExpandDept(expandedKeys) {
947
- this.expandedDeptKeys = expandedKeys;
948
- },
949
-
950
- searchClick() {
951
- this.searchValue = this.title;
952
-
953
- this.treeData.search = [];
954
- this.search.dataListKeys.other = [];
955
- this.search.dataListKeys.main = [];
956
- this.search.defaultExpandedKeys = [];
957
-
958
- this.spinning = true;
959
- this.searchPage = 1;
960
- this.searchFetch();
961
- },
962
-
963
- isAllCheck(checkedKeys = []) {
964
- const key = ['main', 'dept', 'role'][this.typeActiveIndex];
965
- if (!checkedKeys || checkedKeys.length == 0) {
966
- this.indeterminate = false;
967
- this.singleChecked = false;
968
- } else {
969
- let keyArr = this.treeData[key].map(item => item.key);
970
- let keyArrTemp = keyArr.filter(item => checkedKeys.indexOf(item) !== -1);
971
- this.indeterminate = !(keyArr.length == keyArrTemp.length);
972
- this.singleChecked = keyArr.length == keyArrTemp.length;
973
- }
974
- },
975
-
976
- isSearchAllCheck() {
977
- this.$nextTick(() => {
978
- let skeyArr = this.treeData.search.map(item => item.key);
979
- let serchCheckedKeys = this.$refs['searchTree'].checkedKeys;
980
- this.searchIndeterminate = !!serchCheckedKeys.length && serchCheckedKeys.length < skeyArr.length;
981
- this.searchChecked = serchCheckedKeys.length === skeyArr.length;
982
- });
983
- },
984
-
985
- /* 子组件emit方法 */
986
- addCheckedkeysMain(keys) {
987
- let checkedKeys = this.checkedKeys.main;
988
- let filterKey = (keys || {}).filter(Boolean);
989
- filterKey.forEach(key => {
990
- //
991
- checkedKeys.push(key);
992
- // 如果子级全选,父级也需要选中
993
- let getParentKey = this.getParentKey(key, this.treeData.main);
994
- if (!getParentKey) return;
995
- let parent = this.treeData.main.filter(item => {
996
- return item.key == getParentKey;
997
- });
998
- let allCheck = (parent[0]?.children || []).every(item => {
999
- return checkedKeys.includes(item.key);
1000
- });
1001
- allCheck && checkedKeys.push(getParentKey);
1002
- });
1003
- },
1004
-
1005
- removeCheckedkeysMain(keys) {
1006
- let checkedKeysMain = vexutils.clone(this.checkedKeys.main, true);
1007
- keys.forEach(key => {
1008
- //
1009
- let index = checkedKeysMain.findIndex(mainKey => mainKey == key);
1010
- if (index !== -1) {
1011
- checkedKeysMain.splice(index, 1);
1012
- this.checkedKeys.main = [...checkedKeysMain];
1013
- }
1014
- // 删除父级选中
1015
- let getParentKey = this.getParentKey(key, this.treeData.main);
1016
- let parentIndex = checkedKeysMain.findIndex(mainKey => mainKey == getParentKey);
1017
- if (parentIndex !== -1) {
1018
- checkedKeysMain.splice(parentIndex, 1);
1019
- }
1020
- });
1021
-
1022
- this.checkedKeys.main = [...checkedKeysMain];
1023
- },
1024
-
1025
- addCheckedkeysOther(keys) {
1026
- this.checkedKeys.other.push(...keys);
1027
- // this.checkedKeys.main.push(...keys);
1028
- },
1029
-
1030
- removeCheckedkeysOther(keys) {
1031
- let checkedKeys = this.checkedKeys.other;
1032
- // let mainCheckedKeys = this.checkedKeys.main;
1033
- keys.forEach(key => {
1034
- let index = checkedKeys.findIndex(otherKey => otherKey == key);
1035
- checkedKeys.splice(index, 1);
1036
- this.handleDeldefaultShowList(key);
1037
-
1038
- // let mindex = mainCheckedKeys.findIndex(otherKey => otherKey == key);
1039
- // mainCheckedKeys.splice(mindex, 1);
1040
- });
1041
- this.removeCheckedkeysMain(keys);
1042
- },
1043
-
1044
- handleDeldefaultShowList(key) {
1045
- let len = this?.defaultShowList?.length || 0;
1046
- if (len > 0) {
1047
- for (let i = len - 1; i >= 0; i--) {
1048
- let d = this.defaultShowList[i];
1049
- if (`${d.parent_id}_${d.user_id}` == key) {
1050
- this.closeDefaultTag(d, i);
1051
- }
1052
- }
1053
- }
1054
- },
1055
-
1056
- closeDefaultTag(tag, i) {
1057
- this.defaultShowList.splice(i, 1);
1058
- this.closeTag({ parentId: this.getParentId(tag), ...tag });
1059
- },
1060
-
1061
- /* 右侧点击item[x]按钮 相关 */
1062
- closeTag(removedTag) {
1063
- // let { parentId } = removedTag;
1064
-
1065
- this.removedCheckedkeysMain(removedTag);
1066
- this.removedCheckedkeysDept(removedTag);
1067
- this.removedCheckedkeysRole(removedTag);
1068
- this.removedCheckedkeysOther(removedTag);
1069
- const propStr = ['person', 'dept', 'role'][this.typeActiveIndex];
1070
- const checkedKeys = this.checkedTreeItem.filter(item => item.itemType === propStr).map(item => item.key);
1071
- this.checkedKeys.temp = checkedKeys;
1072
- this.handleEmitValue();
1073
- this.refreshSearchTree();
1074
- this.isAllCheck(checkedKeys);
1075
- },
1076
-
1077
- removeCheckedkeysIncludeChildren(parentKey) {
1078
- let needRemoveChildKeys = this.dataList.main
1079
- .filter(i => {
1080
- let parentId = this.getParentId(i);
1081
- return parentId == parentKey || i.key == parentKey;
1082
- })
1083
- .map(i => {
1084
- return i.key;
1085
- });
1086
- const checkedKeys = this.checkedKeys.main.filter(i => {
1087
- return !needRemoveChildKeys.includes(i);
1088
- });
1089
- this.checkedKeys.main = checkedKeys;
1090
- },
1091
-
1092
- removedCheckedkeysMain(tag) {
1093
- let checkedKeys = this.checkedKeys.main;
1094
- let parentId = this.getParentId(tag);
1095
- for (let i = 0; i < checkedKeys.length; i++) {
1096
- if (tag.key == checkedKeys[i] && tag.key == parentId) {
1097
- this.removeCheckedkeysIncludeChildren(tag.key);
1098
- return false;
1099
- } else if (tag.key == checkedKeys[i]) {
1100
- checkedKeys.splice(i, 1);
1101
- return false;
1102
- }
1103
- }
1104
- },
1105
- removeCheckedkeysIncludeChildrenDept(parentKey) {
1106
- let needRemoveChildKeys = this.dataList.dept
1107
- .filter(i => {
1108
- let parentId = this.getParentId(i);
1109
- return parentId == parentKey || i.key == parentKey;
1110
- })
1111
- .map(i => {
1112
- return i.key;
1113
- });
1114
- const checkedKeys = this.checkedKeys.dept.filter(i => {
1115
- return !needRemoveChildKeys.includes(i);
1116
- });
1117
- this.checkedKeys.dept = checkedKeys;
1118
- },
1119
- removedCheckedkeysDept(tag) {
1120
- let checkedKeys = this.checkedKeys.dept;
1121
- let parentId = this.getParentId(tag);
1122
- for (let i = 0; i < checkedKeys.length; i++) {
1123
- if (tag.key == checkedKeys[i] && tag.key == parentId) {
1124
- this.removeCheckedkeysIncludeChildrenDept(tag.key);
1125
- return false;
1126
- } else if (tag.key == checkedKeys[i]) {
1127
- checkedKeys.splice(i, 1);
1128
- return false;
1129
- }
1130
- }
1131
- },
1132
- removedCheckedkeysRole(tag) {
1133
- let checkedKeys = this.checkedKeys.role;
1134
- let parentId = '';
1135
- for (let i = 0; i < checkedKeys.length; i++) {
1136
- if (tag.key == checkedKeys[i] && tag.key == parentId) {
1137
- // this.removeCheckedkeysIncludeChildren(tag.key);
1138
- return false;
1139
- } else if (tag.key == checkedKeys[i]) {
1140
- checkedKeys.splice(i, 1);
1141
- return false;
1142
- }
1143
- }
1144
- },
1145
-
1146
- removedCheckedkeysOther(tag) {
1147
- let checkedKeys = this.checkedKeys.other;
1148
- if (checkedKeys.includes(tag.key)) {
1149
- for (let i = 0; i < checkedKeys.length; i++) {
1150
- if (tag.key == checkedKeys[i]) {
1151
- checkedKeys.splice(i, 1);
1152
- return false;
1153
- }
1154
- }
1155
- } else {
1156
- // 删除科室,删除
1157
- this.OtherRemoveCheckedkeysIncludeChildren(tag.key);
1158
- }
1159
- },
1160
-
1161
- OtherRemoveCheckedkeysIncludeChildren(parentKey) {
1162
- let needRemoveChildKeys = this.dataList.main
1163
- .filter(i => {
1164
- let parentId = this.getParentId(i);
1165
- return parentId == parentKey || i.key == parentKey;
1166
- })
1167
- .map(i => {
1168
- return i.key;
1169
- });
1170
-
1171
- this.checkedKeys.other = this.checkedKeys.other.filter(i => {
1172
- return !needRemoveChildKeys.includes(i);
1173
- });
1174
- },
1175
-
1176
- /* submit 相关 */
1177
- getCheckedMainChildKeys() {
1178
- return new Promise(async resolve => {
1179
- let promises = this.treeData.main.map(async item => {
1180
- // 获取勾选了父类tree, 但未获取children
1181
- // 接口传参,需要的是叶节点的keys
1182
- if (this.checkedKeys.main.includes(item.key) && !item.children) {
1183
- item.children = await this.handleLoadChildData(item.key, item);
1184
- this.addCheckedKeysChildrenMain(item);
1185
-
1186
- this.generateDataList(item.children, this.dataList.main);
1187
- }
1188
- });
1189
-
1190
- await Promise.all(promises);
1191
-
1192
- resolve();
1193
- });
1194
- },
1195
-
1196
- getCheckedLeafKeys() {
1197
- let mainLeafKeys = [];
1198
- let mainLeafDataListKeys = this.dataList.main.filter(item => item.isLeaf).map(item => item.key);
1199
-
1200
- this.checkedKeys.main.forEach(key => {
1201
- if (mainLeafDataListKeys.includes(key)) {
1202
- mainLeafKeys.push(key);
1203
- }
1204
- });
1205
-
1206
- let keyList = [...mainLeafKeys, ...this.checkedKeys.other];
1207
- let res = [...new Set(keyList)];
1208
- return [...res];
1209
- },
1210
-
1211
- async handleOk(isShowLoading = false) {
1212
- isShowLoading && (this.spinning = true);
1213
- this.queryLoadChildData && (await this.getCheckedMainChildKeys());
1214
-
1215
- this.checkedLeafKeys = this.getCheckedLeafKeys();
1216
-
1217
- const submitData = this.handleGetSumitData(this.checkedLeafKeys);
1218
-
1219
- // let subList = [...submitData, ...this.defaultShowList];
1220
-
1221
- this.$emit('pubCheckedTreeItem', [...this.checkedTreeItem, ...this.defaultShowList]);
1222
- this.$emit('check', [...this.checkedTreeItem, ...this.defaultShowList]);
1223
- this.$emit('handleOk', this.checkedLeafKeys);
1224
- this.$emit('change', this.checkedLeafKeys, [...submitData, ...this.defaultShowList]);
1225
- this.$emit('submitData', [...submitData, ...this.defaultShowList]);
1226
-
1227
- isShowLoading && (this.spinning = false);
1228
- },
1229
-
1230
- handleEmitValue() {
1231
- clearTimeout(this.emitTimeout);
1232
- this.emitTimeout = setTimeout(() => {
1233
- this.handleOk();
1234
- }, 100);
1235
- },
1236
-
1237
- hanldeGetValue(...arg) {
1238
- this.handleOk(...arg);
1239
- },
1240
-
1241
- // 获取表单提交的数据
1242
- handleGetSumitData(list = []) {
1243
- if (!Array.isArray(list)) return [];
1244
- let resList = [];
1245
- const { parent_id_obj, parent_name_obj, user_id_obj, user_name_obj } = this.wordbookConfig || {};
1246
- list.forEach(v => {
1247
- // d.key
1248
- let f = this.dataList.main.find(d => this.getuniqKey(d) == v);
1249
- if (!f) {
1250
- f = this.dataList.other.find(o => this.getuniqKey(o) == v);
1251
- }
1252
- // [parent_id_obj]: f[parent_id_obj],
1253
- // [parent_name_obj]: f[parent_name_obj],
1254
- // [user_id_obj]: f[user_id_obj],
1255
- // [user_name_obj]: f[user_name_obj]
1256
- if (f) {
1257
- /** 提交映射 */
1258
- // 自定义 key 值
1259
- const { parent_id_obj_key, parent_name_obj_key } = this.wordbook;
1260
- const { user_id_obj_key, user_name_obj_key } = this.wordbookChild;
1261
- resList.push({
1262
- [user_id_obj_key || 'user_id']: f[user_id_obj],
1263
- [user_name_obj_key || 'user_name']: f[user_name_obj],
1264
- [parent_id_obj_key || 'parent_id']: f[parent_id_obj],
1265
- [parent_name_obj_key || 'parent_name']: f[parent_name_obj]
1266
- });
1267
- }
1268
- });
1269
- return resList;
1270
- },
1271
-
1272
- cancel() {
1273
- this.$emit('update:visible', false);
1274
- this.spinning = false;
1275
- },
1276
- /* */
1277
- treeCount(count) {
1278
- if (!count) return '';
1279
- return `(${count})`;
1280
- },
1281
-
1282
- staticDataSearch() {
1283
- // let expandedKeys = new Set();
1284
- // this.getStaticSearchParentKey(this.treeData.main, expandedKeys);
1285
- // this.expandedKeys = Array.from(expandedKeys);
1286
- // this.autoExpandParent = true;
1287
- const key = ['main', 'dept', 'role'][this.typeActiveIndex];
1288
- if (!this.title) {
1289
- // 如果为空恢复默认数据
1290
- this.$set(this.treeData, 'temp', this.treeData[key]);
1291
- return;
1292
- }
1293
- let copyData = JSON.parse(JSON.stringify(this.treeData[key]));
1294
- // 增加visible属性 true展示 false不展示
1295
- filterTree({ value: this.title, data: copyData, prop: 'title', filterChildren: this.filterChildren });
1296
- // 过滤visible属性 为true的数据
1297
- copyData = copyData.filter(item => item.visible);
1298
- const expandedKeys = [];
1299
- vexutils.searchTree(copyData, item => {
1300
- if (item.visible && item.title.indexOf(this.title) !== -1) {
1301
- const allParentIds = getAllParentId(copyData, item.key).filter(Boolean);
1302
- expandedKeys.push(...allParentIds);
1303
- }
1304
- if (item.children && item.children.length) {
1305
- item.children = item.children.filter(child => child.visible);
1306
- }
1307
- });
1308
- this.$set(this.treeData, 'temp', copyData);
1309
- this.expandedKeys = [...new Set(expandedKeys)];
1310
- },
1311
- getStaticSearchParentKey(treeData, expandedKeys, orgId) {
1312
- const keyword = this.title;
1313
- for (let i = 0; i < treeData.length; i++) {
1314
- const user = treeData[i];
1315
- let { title = '', key, children } = user;
1316
- if (keyword.length > 0 && (String(title).indexOf(keyword) !== -1 || String(key).indexOf(keyword) !== -1)) {
1317
- expandedKeys.add(key);
1318
- if (orgId) {
1319
- expandedKeys.add(orgId);
1320
- }
1321
- break;
1322
- }
1323
- if (children) {
1324
- this.getStaticSearchParentKey(children, expandedKeys, user.key || orgId);
1325
- }
1326
- }
1327
- },
1328
-
1329
- // 数组对象去重
1330
- uniqArrObj(arr, name) {
1331
- let obj = {};
1332
- return arr.reduce((cur, next) => {
1333
- obj[next[name]] ? '' : (obj[next[name]] = true && cur.push(next));
1334
- return cur;
1335
- }, []);
1336
- },
1337
- onTypeClick(index) {
1338
- const key = ['main', 'dept', 'role'][index];
1339
- const checkedKeys = this.checkedKeys[key];
1340
- this.treeData.temp = this.treeData[key];
1341
- this.checkedKeys.temp = checkedKeys;
1342
- this.typeActiveIndex = index;
1343
- // 处理全选框
1344
- this.isAllCheck(checkedKeys);
1345
- },
1346
- onTreeCheck(checkedKeys, { checked, node }) {
1347
- if (this.checkStrictly) {
1348
- checkedKeys = checkedKeys.checked;
1349
- }
1350
- // 断掉了父子关系 要不然当存在一二级科室的时候 搜索二级科室 再选中会把一级也选中 ; 后续与产品沟通 不需要断 只取最后一级科室
1351
- const propStr = ['main', 'dept', 'role'][this.typeActiveIndex];
1352
- let totalCheckedKeys = [];
1353
- // const keyData = this.dataList[propStr].find(item => item.key === node.eventKey);
1354
- // let keyData = {};
1355
- // vexutils.searchTree(this.treeData[propStr], item => {
1356
- // if (item.key === node.eventKey) {
1357
- // keyData = item;
1358
- // }
1359
- // });
1360
- // vexutils.searchTree(keyData.children, item => {
1361
- // childKeys.push(item.key);
1362
- // });
1363
- // if (checked) {
1364
- // const singleCheckedKeys = this.getSingleCheckedKeys(propStr, this.treeData[propStr], keyData);
1365
- // totalCheckedKeys = this.isSingleCheck ? singleCheckedKeys : [...new Set(checkedKeys.concat(childKeys))];
1366
- // } else {
1367
- // // totalCheckedKeys = checkedKeys;
1368
- // totalCheckedKeys = this.isSingleCheck ? [] : checkedKeys.filter(key => !childKeys.includes(key));
1369
- // }
1370
- // 如果是选中就把之前选中和现在选中的合并做为temp值(兼容搜索的情况),
1371
- if (checked) {
1372
- const preChecked = this.checkedKeys[propStr];
1373
- // 搜索时选中上级也要把它所有下级给选中 如果是选中一个下级但是也把其上级选中了要把上级选中给去掉
1374
- const childKeys = [];
1375
- let keyData = {};
1376
- vexutils.searchTree(this.treeData[propStr], item => {
1377
- if (item.key === node.eventKey) {
1378
- keyData = item;
1379
- }
1380
- });
1381
- vexutils.searchTree(keyData.children, item => {
1382
- childKeys.push(item.key);
1383
- });
1384
- const allParentIds = getAllParentId(this.treeData[propStr], node.eventKey).filter(Boolean);
1385
- totalCheckedKeys = [...new Set(preChecked.concat(checkedKeys, childKeys))].filter(id => !allParentIds.includes(id));
1386
- } else {
1387
- // 如果是取消从之前的选择中把当前点击的及其子级去除选中作为temp值(兼容搜索的情况)
1388
- let keyData = {};
1389
- const needCancelKeys = [node.eventKey];
1390
- const preChecked = this.checkedKeys[propStr];
1391
- vexutils.searchTree(this.treeData[propStr], item => {
1392
- if (item.key === node.eventKey) {
1393
- keyData = item;
1394
- }
1395
- });
1396
- vexutils.searchTree(keyData.children, item => {
1397
- needCancelKeys.push(item.key);
1398
- });
1399
- const allParentIds = getAllParentId(this.treeData[propStr], node.eventKey).filter(Boolean);
1400
- totalCheckedKeys = [...new Set(preChecked.filter(key => !needCancelKeys.includes(key)))];
1401
- if (!this.checkStrictly) {
1402
- totalCheckedKeys = totalCheckedKeys.filter(id => !allParentIds.includes(id));
1403
- }
1404
- }
1405
- this.checkedKeys.temp = totalCheckedKeys;
1406
- this.checkedKeys[propStr] = totalCheckedKeys;
1407
- this.isAllCheck(totalCheckedKeys);
1408
- this.isSearchAllCheck(totalCheckedKeys);
1409
- this.$emit('pubCheckedTreeItem', [...this.checkedTreeItem, ...this.defaultShowList]);
1410
- this.$emit('check', [...this.checkedTreeItem, ...this.defaultShowList]);
1411
- },
1412
- getSingleCheckedKeys(propStr, treeData, keyData) {
1413
- const firstTreeData = deepTraversalFirst(keyData) || [];
1414
- let checkedKeys = [];
1415
- if (propStr === 'main') {
1416
- checkedKeys = firstTreeData.map(item => item.key);
1417
- } else if (propStr === 'dept') {
1418
- // 如果是dept 找到层级为科室的第一个数据
1419
- const index = firstTreeData.findIndex(item => item.type === 1);
1420
- if (index > -1) {
1421
- checkedKeys = firstTreeData.slice(0, index + 1).map(item => item.key);
1422
- } else {
1423
- checkedKeys = firstTreeData.map(item => item.key);
1424
- }
1425
- } else if (propStr === 'role') {
1426
- // 如果是dept 找到层级为角色的第一个数据
1427
- const index = firstTreeData.findIndex(item => item.roleId);
1428
- if (index > -1) {
1429
- checkedKeys = firstTreeData.slice(0, index + 1).map(item => item.key);
1430
- } else {
1431
- checkedKeys = firstTreeData.map(item => item.key);
1432
- }
1433
- }
1434
- return checkedKeys;
1435
- },
1436
-
1437
- onClearSelect() {
1438
- this.checkedKeys.temp = [];
1439
- this.checkedKeys.main = [];
1440
- this.checkedKeys.dept = [];
1441
- this.checkedKeys.role = [];
1442
- this.defaultShowList = [];
1443
- this.indeterminate = false;
1444
- this.singleChecked = false;
1445
- },
1446
- filterTreeData({ value, data, prop, filter, filterXor, children, visible, filterChildren = true, callback }) {
1447
- // 默认赋值
1448
- visible = visible || 'visible';
1449
- children = children || 'children';
1450
- prop = prop || 'text';
1451
-
1452
- const filterNodeMethod = function(value, data) {
1453
- if (!value) {
1454
- return true;
1455
- }
1456
- let flag = (data[prop] || '').indexOf(value) !== -1;
1457
- return filterXor ? !flag : flag;
1458
- };
1459
-
1460
- const traverse = function(node) {
1461
- const childNodes = node[children] || [];
1462
-
1463
- childNodes.forEach(child => {
1464
- callback && callback(child);
1465
- child[visible] = (!node.root && !filterChildren && node[visible]) || filterNodeMethod.call(child, value, child, prop);
1466
-
1467
- traverse(child);
1468
- });
1469
-
1470
- if (!node[visible] && childNodes.length) {
1471
- let allHidden = true;
1472
- allHidden = !childNodes.some(child => child[visible]);
1473
-
1474
- node[visible] = allHidden === false;
1475
- }
1476
- };
1477
- let totalData = {
1478
- root: true
1479
- };
1480
- totalData[children] = data;
1481
- traverse(totalData);
1482
-
1483
- if (filter) {
1484
- let copyData = data.slice();
1485
- let filterHandle = filterData => {
1486
- return filterData.filter((item, index) => {
1487
- if (item[visible]) {
1488
- if (item[children]) {
1489
- item[children] = filterHandle(item[children]);
1490
- }
1491
- return true;
1492
- }
1493
- return false;
1494
- });
1495
- };
1496
- return filterHandle(copyData);
1497
- }
1498
- },
1499
- handleData() {
1500
- vexutils.searchTree(this.data, item => {
1501
- if (this.titleAddCode) {
1502
- item.title = `${item.title}(${item.code})`;
1503
- }
1504
- });
1505
- }
1506
- }
1507
- });
1508
- </script>
1509
- <style lang="less" scoped>
1510
- @primary-color: #2563f4;
1511
- .people-tree {
1512
- display: flex;
1513
- .people-tree-item {
1514
- width: 300px;
1515
- padding: 22px 12px 0;
1516
- max-height: 376px;
1517
- height: 376px;
1518
- overflow-y: auto;
1519
- &.people-tree-left {
1520
- display: flex;
1521
- flex-direction: column;
1522
- }
1523
- /deep/ .person-search {
1524
- // .ant-input-affix-wrapper .ant-input:not(:last-child),
1525
- // .ant-input-affix-wrapper .ant-input:not(:first-child) {
1526
- // padding-left: 34px;
1527
- // }
1528
- .ant-input-group-addon {
1529
- padding: 0;
1530
- border: 0px !important;
1531
- }
1532
- .ant-input-search-button {
1533
- border-top-left-radius: 0;
1534
- border-bottom-left-radius: 0;
1535
- }
1536
- }
1537
- /deep/ .main-tree-container {
1538
- > li {
1539
- width: 100%;
1540
- overflow: hidden;
1541
- }
1542
- .ant-tree-switcher {
1543
- flex-shrink: 0;
1544
- }
1545
- .ant-tree-node-content-wrapper {
1546
- width: calc(100% - 24px);
1547
- text-overflow: ellipsis;
1548
- overflow: hidden;
1549
- white-space: nowrap;
1550
- }
1551
- }
1552
- /deep/.ant-tree-title {
1553
- // width: 250px;
1554
- width: 100%;
1555
- text-overflow: ellipsis;
1556
- overflow: hidden;
1557
- white-space: nowrap;
1558
- display: inline-block;
1559
- }
1560
- &:first-child {
1561
- border-right: 1px solid #e8e8e8;
1562
- }
1563
-
1564
- .no-data-tips {
1565
- height: 200px;
1566
- width: 100%;
1567
- display: flex;
1568
- justify-content: center;
1569
- align-items: center;
1570
- font-size: 16px;
1571
- font-weight: 700;
1572
- }
1573
-
1574
- .c-title {
1575
- font-size: 14px;
1576
- font-family: PingFangSC-Regular, PingFang SC;
1577
- font-weight: 400;
1578
- color: #212121;
1579
- }
1580
- .c-sub-title {
1581
- font-size: 12px;
1582
- font-family: PingFangSC-Regular, PingFang SC;
1583
- // font-weight: 400;
1584
- color: #4e4e4e;
1585
- }
1586
- .p-title {
1587
- font-size: 14px;
1588
- font-family: PingFangSC-Medium, PingFang SC;
1589
- font-weight: 500;
1590
- color: #212121;
1591
- }
1592
- }
1593
- /deep/.ant-tree {
1594
- overflow-y: auto;
1595
- // height: 450px;
1596
- flex: 1;
1597
- position: relative;
1598
- &::-webkit-scrollbar {
1599
- width: 6px;
1600
- height: 6px;
1601
- background-color: #f5f5f5;
1602
- }
1603
- }
1604
- .select-wrap {
1605
- flex: 1;
1606
- padding: 22px 12px 0;
1607
- height: 376px;
1608
- display: flex;
1609
- flex-direction: column;
1610
- .select-header {
1611
- display: flex;
1612
- justify-content: space-between;
1613
- margin-bottom: 20px;
1614
- .clear-btn {
1615
- color: @primary-color;
1616
- cursor: pointer;
1617
- }
1618
- }
1619
- .select-content {
1620
- flex: 1;
1621
- overflow-y: auto;
1622
- .tag-item {
1623
- &.isRoot {
1624
- background: rgba(@primary-color, 0.08);
1625
- border: 1px solid rgba(@primary-color, 0.5);
1626
- color: @primary-color;
1627
- .tag-close {
1628
- color: @primary-color;
1629
- &:hover {
1630
- color: rgba(@primary-color, 0.6);
1631
- }
1632
- }
1633
- }
1634
-
1635
- box-sizing: border-box;
1636
- color: #212121;
1637
- font-size: 14px;
1638
- list-style: none;
1639
- display: inline-flex;
1640
- align-items: center;
1641
- height: 24px;
1642
- line-height: 24px;
1643
- margin-right: 8px;
1644
- margin-bottom: 4px;
1645
- padding: 0 6px;
1646
- white-space: nowrap;
1647
- background: rgba(#d5d5d5, 0.2);
1648
- border: 1px solid rgba(#000000, 0.14);
1649
- border-radius: 4px;
1650
- transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
1651
- .tag-close {
1652
- font-size: 12px;
1653
- &:hover {
1654
- color: rgba(@primary-color, 0.6);
1655
- }
1656
- &:active {
1657
- color: #fff;
1658
- }
1659
- display: inline-block;
1660
- font-size: 14px;
1661
- margin-left: 3px;
1662
- color: #969696;
1663
- font-weight: 700;
1664
- cursor: pointer;
1665
- transition: all 0.3s;
1666
- }
1667
- }
1668
- }
1669
- }
1670
- }
1671
- .df {
1672
- display: flex;
1673
- }
1674
- .search-input-icon {
1675
- color: rgba(0, 0, 0, 0.4);
1676
- margin-bottom: -2px;
1677
- }
1678
- .type-wrap {
1679
- display: flex;
1680
- margin-bottom: 10px;
1681
- .type-btn {
1682
- margin-right: 10px;
1683
- padding: 2px 10px;
1684
- background: #f2f2f2;
1685
- border-radius: 8px;
1686
- cursor: pointer;
1687
- &:last-child {
1688
- margin-right: 0;
1689
- }
1690
- }
1691
- .type-active {
1692
- background: @primary-color;
1693
- color: #ffffff;
1694
- }
1695
- }
1696
- </style>
1
+ <template>
2
+ <div class="personnel">
3
+ <a-spin :spinning="spinning">
4
+ <div class="people-tree">
5
+ <!-- 树主体与检索 -->
6
+ <div class="people-tree-item people-tree-left">
7
+ <!-- $t('1.1.1.5.1') -->
8
+ <a-input-search style="margin-bottom: 12px" :placeholder="searchPlaceholder" :enter-button="searchButtonText" :allowClear="true" @search="searchClick" v-model="title" class="person-search">
9
+ <!-- <a-icon slot="prefix" type="search" class="search-input-icon" /> -->
10
+ <!-- <svg-icon
11
+ slot="prefix"
12
+ class="search-input-icon"
13
+ iconClass="xitongtubiaosousuo"
14
+ ></svg-icon> -->
15
+ </a-input-search>
16
+ <div class="type-wrap" v-if="selectType === 'multiple'">
17
+ <div class="type-btn" :class="{ 'type-active': typeActiveIndex === 0 }" @click="onTypeClick(0)">选人员</div>
18
+ <div class="type-btn" :class="{ 'type-active': typeActiveIndex === 1 }" @click="onTypeClick(1)">选科室</div>
19
+ <div class="type-btn" :class="{ 'type-active': typeActiveIndex === 2 }" @click="onTypeClick(2)">选角色</div>
20
+ </div>
21
+ <template v-if="!isSingleCheck">
22
+ <a-checkbox v-if="searchTreeVisable" v-model="searchChecked" :indeterminate="searchIndeterminate" @change="radioChange">
23
+ <!-- {{ $t("1.10.139") }} -->
24
+ 全选
25
+ </a-checkbox>
26
+
27
+ <a-checkbox v-else v-model="singleChecked" :indeterminate="indeterminate" @change="radioChange">
28
+ <!-- {{ $t("1.10.139") }} -->
29
+ 全选
30
+ </a-checkbox>
31
+ </template>
32
+
33
+ <div v-show="search.status == 3 || (search.status == 0 && treeData.temp && treeData.temp.length == 0)" class="no-data-tips">
34
+ 查无结果
35
+ </div>
36
+ <!-- main tree -->
37
+ <a-tree
38
+ class="main-tree-container"
39
+ v-show="search.status == 0"
40
+ ref="antTree"
41
+ v-model="checkedKeys.temp"
42
+ @expand="onExpand"
43
+ @check="onTreeCheck"
44
+ checkable
45
+ :expandedKeys="expandedKeys"
46
+ :autoExpandParent="autoExpandParent"
47
+ :checkStrictly="checkStrictly"
48
+ :selectable="false"
49
+ :treeData="treeData.temp"
50
+ :load-data="getLoadChildData"
51
+ :disabled="isDetail"
52
+ >
53
+ <template slot="custom" slot-scope="scope">
54
+ <span v-if="scope.isLeaf">
55
+ <a-tooltip :title="`${scope.title} ${scope.sub_title}`" :mouseEnterDelay="0.3">
56
+ <span class="c-title">{{ scope.title || scope.key }}&thinsp; </span>
57
+ <span class="c-sub-title">{{ scope.sub_title }}</span>
58
+ </a-tooltip>
59
+ </span>
60
+ <span v-else class="p-title">
61
+ <span v-if="scope.title">{{ scope.title }}</span>
62
+ <span v-else>{{ scope.key }}</span>
63
+ {{ treeCount(scope.count) }}
64
+ </span>
65
+ </template>
66
+ </a-tree>
67
+ <!-- search tree -->
68
+ <searchTree
69
+ v-on="$listeners"
70
+ ref="searchTree"
71
+ :visable="searchTreeVisable"
72
+ :formatTreeData="treeData.search"
73
+ :searchValue="searchValue"
74
+ :allCheckedKeys="checkedKeys"
75
+ :defaultExpandedKeys="search.defaultExpandedKeys"
76
+ :dataListKeys="search.dataListKeys"
77
+ :searchNoMore="searchNoMore"
78
+ :loadMorenLoadinng="loadMorenLoadinng"
79
+ @addCheckedkeysMain="addCheckedkeysMain"
80
+ @removeCheckedkeysMain="removeCheckedkeysMain"
81
+ @addCheckedkeysOther="addCheckedkeysOther"
82
+ @removeCheckedkeysOther="removeCheckedkeysOther"
83
+ @searchOnloadMore="searchOnloadMore"
84
+ ></searchTree>
85
+ </div>
86
+ <!-- 树已选的数据 -->
87
+ <div class="select-wrap">
88
+ <div class="select-header" v-if="(defaultShowList && defaultShowList.length) || checkedTreeItem.length">
89
+ <div class="select-count" v-if="showCount">已选择:{{ defaultShowList.length + checkedTreeItem.length }}</div>
90
+ <div class="clear-btn" @click="onClearSelect" v-if="showClear">清空</div>
91
+ </div>
92
+ <div class="select-content">
93
+ <slot v-if="defaultShowList && defaultShowList.length">
94
+ <div class="tag-item def-item" v-for="(tag, i) in defaultShowList" :key="i">
95
+ <span class="tag-text" :title="tag.title || tag[wordbookChild.user_name_obj]">{{ tag.title || tag[wordbookChild.user_name_obj] }}</span>
96
+ <a-icon v-if="!isDetail" class="tag-close" type="close-circle" theme="filled" @click="closeDefaultTag(tag, i)" />
97
+ <!-- <svg-icon
98
+ v-if="!isDetail"
99
+ class="tag-close"
100
+ :icon-class="'xitongtubiaodaohangtubiaoguanbishixin'"
101
+ @click="closeDefaultTag(tag, i)"
102
+ ></svg-icon> -->
103
+ </div>
104
+ </slot>
105
+
106
+ <div class="tag-item" :class="{ isRoot: !tag.isLeaf }" v-for="tag in checkedTreeItem" :key="tag.key">
107
+ <span class="tag-text" :title="tag.title || tag.key">{{ tag.title || tag.key }} {{ treeCount(tag.count) }}</span>
108
+ <!-- <svg-icon
109
+ v-if="!isDetail"
110
+ class="tag-close"
111
+ :icon-class="'xitongtubiaodaohangtubiaoguanbishixin'"
112
+ @click="closeTag(tag)"
113
+ ></svg-icon> -->
114
+ <a-icon v-if="!isDetail" class="tag-close" type="close-circle" theme="filled" @click="closeTag(tag)" />
115
+ </div>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ </a-spin>
120
+ </div>
121
+ </template>
122
+ <script>
123
+ /* eslint-disable no-async-promise-executor */
124
+
125
+ import { Icon, Checkbox, Tree, Tooltip, Input, Spin } from 'ant-design-vue';
126
+ import searchTree from './search-tree';
127
+ import create from '@/core/create';
128
+ import vexutils from '@/utils/vexutils';
129
+ import { filterTree, deepTraversalFirst, getAllParentId } from '@/utils';
130
+
131
+ /**
132
+ * 查询没有部门的分类时,parent_id_obj 为 undefined a-tree 展示异常。
133
+ * 前端 赋上固定key 标识 该分类 无部门,该key 不能提交接口。
134
+ * */
135
+
136
+ /**
137
+ * key 唯一key
138
+ * title 展示标题
139
+ * sub_title 副标题
140
+ * count 数量
141
+ */
142
+
143
+ const FIXEDKEY = '8982eeb4-0439-4100-9805-8cdd12b2256c-front-end-fixed-key';
144
+ export default create({
145
+ name: 'select-person',
146
+ components: {
147
+ searchTree,
148
+ [Icon.name]: Icon,
149
+ [Spin.name]: Spin,
150
+ [Tree.name]: Tree,
151
+ [Input.Search.name]: Input.Search,
152
+ [Checkbox.name]: Checkbox,
153
+ [Tooltip.name]: Tooltip
154
+ },
155
+ props: {
156
+ isDetail: { type: Boolean, isDetail: false },
157
+ defaultList: { type: Array, default: () => [] },
158
+ data: { type: Array, default: () => [] },
159
+ roleData: { type: Array, default: () => [] },
160
+ roleFields: {
161
+ type: Object,
162
+ default: () => ({ title: 'name', key: 'id', children: 'children' })
163
+ },
164
+ searchPlaceholder: {
165
+ type: String,
166
+ default: '输入关键字搜索'
167
+ },
168
+ searchButtonText: {
169
+ type: String,
170
+ default: '搜索'
171
+ },
172
+ // 父级配置
173
+ wordbook: {
174
+ type: Object,
175
+ default: () => ({
176
+ // parent_id_obj: "dept_id", // 父级 id
177
+ // parent_id_obj_key: "dept_id", // 提交的 id 的映射 key
178
+ // parent_name_obj: "dept_name", // 名称
179
+ // parent_name_obj_key: "dept_name", // 名称 的映射key
180
+ // user_count_obj: "count" // 统计 key
181
+ })
182
+ },
183
+
184
+ // 子集配置
185
+ wordbookChild: {
186
+ type: Object,
187
+ default: () => ({})
188
+ },
189
+
190
+ // 检索加载更多
191
+ SearchLoadMore: {
192
+ type: Boolean,
193
+ default: false
194
+ },
195
+
196
+ showClear: {
197
+ type: Boolean,
198
+ default: true
199
+ },
200
+ showCount: {
201
+ type: Boolean,
202
+ default: true
203
+ },
204
+ selectType: {
205
+ type: String,
206
+ default: 'person' // person dept role multiple
207
+ },
208
+ isSingleCheck: {
209
+ type: Boolean,
210
+ default: false
211
+ },
212
+ checkStrictly: {
213
+ type: Boolean,
214
+ default: false
215
+ },
216
+ needFilterParentDept: {
217
+ type: Boolean,
218
+ default: true
219
+ },
220
+ filterChildren: {
221
+ type: Boolean,
222
+ default: false
223
+ },
224
+ titleAddCode: {
225
+ type: Boolean,
226
+ default: true // 标题是否加上code
227
+ },
228
+ queryMainTreeData: Function, // 主树请求
229
+ queryLoadChildData: Function, // 懒加载请求
230
+ queryTreeSearch: Function // 检索请求
231
+ },
232
+ data() {
233
+ return {
234
+ treeData: {
235
+ main: [],
236
+ search: [],
237
+ dept: [],
238
+ role: [],
239
+ temp: []
240
+ },
241
+ // 展开的keys
242
+ expandedKeys: [],
243
+ // 展开的部门keys
244
+ expandedDeptKeys: [],
245
+ autoExpandParent: true,
246
+ // 扁平化tree的options Object{Array[Object]}
247
+ dataList: {
248
+ main: [],
249
+ other: [],
250
+ dept: [],
251
+ role: []
252
+ },
253
+ // 当前tree选中的keys Object{Array[Number]}
254
+ checkedKeys: {
255
+ main: [],
256
+ other: [],
257
+ dept: [],
258
+ role: [],
259
+ temp: []
260
+ },
261
+ search: {
262
+ defaultExpandedKeys: [],
263
+ // 0: 未查询,1:查询中,2:有查询结果,3无查询结果
264
+ status: 0,
265
+ dataListKeys: {
266
+ main: [],
267
+ other: []
268
+ },
269
+ records: 0
270
+ },
271
+ searchValue: '',
272
+ searchPage: 1,
273
+ searchNoMore: false,
274
+ title: '',
275
+ // 选中的所有叶节点(Leaf)keys <Array[Number]>,最终提交接口所需格式
276
+ checkedLeafKeys: [],
277
+ spinning: false,
278
+ loadMorenLoadinng: false,
279
+
280
+ errorMsg: '',
281
+
282
+ defaultShowList: [], // 默认选中项
283
+ checkedKeysMain: [],
284
+
285
+ cacheParentIdObj: {},
286
+ singleChecked: false,
287
+ indeterminate: false,
288
+
289
+ searchIndeterminate: false,
290
+ searchChecked: false,
291
+ typeActiveIndex: 0
292
+ };
293
+ },
294
+ computed: {
295
+ searchTreeVisable() {
296
+ return this.search.status == 2;
297
+ },
298
+ dataListMainKeys() {
299
+ if (!this.dataList.main.length) return [];
300
+
301
+ return this.dataList.main.map(i => {
302
+ return i.key;
303
+ });
304
+ },
305
+ dataListDeptKeys() {
306
+ if (!this.dataList.dept.length) return [];
307
+
308
+ return this.dataList.dept.map(i => {
309
+ return i.key;
310
+ });
311
+ },
312
+ dataListRoleKeys() {
313
+ if (!this.dataList.role.length) return [];
314
+
315
+ return this.dataList.role.map(i => {
316
+ return i.key;
317
+ });
318
+ },
319
+ dataListOtherKeys() {
320
+ if (!this.dataList.other.length) return [];
321
+
322
+ return this.dataList.other.map(i => {
323
+ return i.key;
324
+ });
325
+ },
326
+ // 右侧展示tabs <Array[Object]>
327
+ checkedTreeItem() {
328
+ let otherItems = this.dataList.other.filter(item => {
329
+ return this.checkedKeys.other.includes(item.key);
330
+ });
331
+ let mainItems = this.dataList.main.filter(item => {
332
+ // let f = this.currentKey === 'main';
333
+ // if(!f) return f;
334
+ let { isLeaf, key } = item;
335
+ let parentId = this.getParentId(item);
336
+ let showKeys = [...this.checkedKeys.main, ...otherItems];
337
+ let checked = showKeys.includes(key);
338
+ // 父级全选,子级不展示
339
+ /** String(parentId) 类型不相等 */
340
+ // if (isLeaf && parentId && this.checkedKeys.temp.some(v => v == parentId)) {
341
+ // checked = false;
342
+ // }
343
+ item.itemType = 'person';
344
+ return checked && item.type == 2;
345
+ });
346
+ let deptItems = this.dataList.dept.filter(item => {
347
+ let { key } = item;
348
+ let showKeys = [...this.checkedKeys.dept, ...otherItems];
349
+ let checked = showKeys.includes(key);
350
+ item.itemType = 'dept';
351
+ // 只展示最后一级的科室
352
+ if (this.needFilterParentDept) {
353
+ return checked && item.type == 1 && (!item.children || (item.children && !item.children.length));
354
+ } else {
355
+ // 不过滤
356
+ return checked && item.type == 1;
357
+ }
358
+ });
359
+ let roleItems = this.dataList.role.filter(item => {
360
+ let showKeys = [...this.checkedKeys.role, ...otherItems];
361
+ let checked = showKeys.includes(item.key);
362
+ item.itemType = 'role';
363
+ return checked && item.roleId;
364
+ });
365
+ if (this.selectType === 'multiple') {
366
+ deptItems.forEach(item => {
367
+ if (item.title) {
368
+ item.title = item.title.includes('(科室)') ? item.title : `${item.title}(科室)`;
369
+ }
370
+ });
371
+ roleItems.map(item => {
372
+ if (item.title) {
373
+ item.title = item.title.includes('(角色)') ? item.title : `${item.title}(角色)`;
374
+ }
375
+ return item;
376
+ });
377
+ }
378
+
379
+ let list = this.uniqArrObj([...mainItems, ...deptItems, ...roleItems, ...otherItems], 'key');
380
+ return list;
381
+ },
382
+
383
+ wordbookConfig() {
384
+ const { parent_id_obj, parent_name_obj } = this.wordbook || {};
385
+ const { user_id_obj, user_name_obj } = this.wordbookChild || {};
386
+ return {
387
+ parent_id_obj,
388
+ parent_name_obj,
389
+ user_id_obj,
390
+ user_name_obj
391
+ };
392
+ },
393
+
394
+ getLoadChildData() {
395
+ if (typeof this.queryLoadChildData == 'function') {
396
+ return this.onLoadData;
397
+ }
398
+ return null;
399
+ },
400
+
401
+ currentKey() {
402
+ return { person: 'main', dept: 'dept', role: 'role', multiple: 'main' }[this.selectType];
403
+ }
404
+ },
405
+ watch: {
406
+ // defaultList: {
407
+ // immediate: true,
408
+ // handler(val) {
409
+ // if (!val) return;
410
+ // this.initDefault();
411
+ // }
412
+ // },
413
+ selectType: {
414
+ immediate: true,
415
+ handler(val) {
416
+ if (val === 'dept' || val === 'role' || val === 'multiple') {
417
+ this.typeActiveIndex = { multiple: 0, dept: 1, role: 2 }[val];
418
+ }
419
+ }
420
+ },
421
+ data: {
422
+ immediate: true,
423
+ handler() {
424
+ this.handleData();
425
+ this.staticDataInit();
426
+ this.staticDeptAndRoleDataInit();
427
+ const key = { person: 'main', dept: 'dept', role: 'role', multiple: 'main' }[this.selectType];
428
+ this.treeData.temp = this.treeData[key];
429
+ }
430
+ },
431
+ roleData: {
432
+ immediate: true,
433
+ handler() {
434
+ this.staticDeptAndRoleDataInit();
435
+ const key = { person: 'main', dept: 'dept', role: 'role', multiple: 'main' }[this.selectType];
436
+ this.treeData.temp = this.treeData[key];
437
+ }
438
+ }
439
+ },
440
+ created() {},
441
+ mounted() {
442
+ this.getUsers();
443
+ this.initDefault();
444
+ },
445
+ methods: {
446
+ initDefault() {
447
+ if (this.getLoadChildData) {
448
+ this.getDefaultList();
449
+ } else {
450
+ this.$nextTick(() => {
451
+ const userIds = this.defaultList.filter(item => item.itemType === 'person').map(item => item.id);
452
+ const deptIds = this.defaultList.filter(item => item.itemType === 'dept').map(item => item.id);
453
+ const roleIds = this.defaultList.filter(item => item.itemType === 'role').map(item => item.id);
454
+ const key = ['main', 'dept', 'role'][this.typeActiveIndex];
455
+ console.log(deptIds, key, '666 init');
456
+ this.checkedKeys.main = userIds;
457
+ this.checkedKeys.dept = deptIds;
458
+ this.checkedKeys.role = roleIds;
459
+ this.checkedKeys.temp = this.checkedKeys[key];
460
+ });
461
+ }
462
+ },
463
+
464
+ staticDataInit() {
465
+ if (!Array.isArray(this.data) || this.data.length == 0) return;
466
+ this.treeData.main = this.data;
467
+ this.generateDataList(this.treeData.main, this.dataList.main);
468
+ },
469
+ staticDeptAndRoleDataInit() {
470
+ this.treeData.dept = this.getDeptData(this.data);
471
+ this.generateDataList(this.treeData.dept, this.dataList.dept);
472
+ this.treeData.role = this.handleRoleData(this.roleData);
473
+ this.generateDataList(this.treeData.role, this.dataList.role);
474
+ },
475
+ getDeptData(data) {
476
+ // 把data里面的人员过滤掉
477
+ let copyData = JSON.parse(JSON.stringify(data));
478
+ copyData = copyData.filter(item => item.type === 1);
479
+ vexutils.searchTree(copyData, item => {
480
+ if (item.type === 1 && item.children && item.children.length) {
481
+ item.children = item.children.filter(child => child.type === 1);
482
+ }
483
+ });
484
+ return copyData;
485
+ },
486
+ handleRoleData(data) {
487
+ const copyData = JSON.parse(JSON.stringify(data));
488
+ vexutils.searchTree(copyData, item => {
489
+ const { title, key, children } = this.roleFields;
490
+ item.title = item[title];
491
+ item.children = item[children] ? item[children] : [];
492
+ item.key = item[key];
493
+ });
494
+ return copyData;
495
+ },
496
+ /** --- 默认值 --- */
497
+ getDefaultList() {
498
+ const { defaultList } = this;
499
+ let copy = JSON.parse(JSON.stringify(defaultList));
500
+ if (Array.isArray(copy)) {
501
+ // this.defaultShowObj = {};
502
+
503
+ const { user_id_obj } = this.wordbookChild || {};
504
+ copy.forEach(v => {
505
+ this.handleDefMapping(v);
506
+ let key = this.getuniqKey(v);
507
+ let pId = this.getParentId(v);
508
+ this.cacheParentIdObj[pId] = pId;
509
+ // this.defaultShowObj[key] = v[user_id_obj];
510
+ });
511
+ this.defaultShowList = copy;
512
+ }
513
+ },
514
+
515
+ getcheckedKeys() {
516
+ const { defaultList } = this;
517
+ let checkedKeysMain = [],
518
+ checkedKeysOther = [];
519
+ let copy = JSON.parse(JSON.stringify(defaultList));
520
+ if (Array.isArray(copy)) {
521
+ copy.forEach(v => {
522
+ this.handleDefMapping(v);
523
+ let key = this.getuniqKey(v);
524
+ checkedKeysMain.push(key);
525
+ // 回填到 检索的选择,防止回填马上检索
526
+ if (String(key).includes(FIXEDKEY)) {
527
+ checkedKeysOther.push(key);
528
+ }
529
+ });
530
+ }
531
+ return {
532
+ checkedKeysMain,
533
+ checkedKeysOther
534
+ };
535
+ },
536
+
537
+ /**
538
+ * 根据配置映射默认值
539
+ */
540
+ handleDefMapping(v) {
541
+ const { parent_id_obj, parent_name_obj, user_id_obj, user_name_obj } = this.wordbookConfig || {};
542
+ // 自定义 key 值
543
+ const { parent_id_obj_key, parent_name_obj_key } = this.wordbook;
544
+ const { user_id_obj_key, user_name_obj_key } = this.wordbookChild;
545
+ v[parent_id_obj] = v[parent_id_obj_key] || v.parent_id;
546
+ v[parent_name_obj] = v[parent_name_obj_key] || v.parent_name;
547
+ v[user_id_obj] = v[user_id_obj_key] || v.user_id;
548
+ v[user_name_obj] = v[user_name_obj_key] || v.user_name;
549
+ },
550
+
551
+ /**
552
+ * 初始化 请求已选的数据
553
+ */
554
+ async loadSelected() {
555
+ try {
556
+ let list = await Promise.all(
557
+ this.treeData.main.map(async v => {
558
+ const { parent_id_obj } = this.wordbook || {};
559
+ if ([v.key, v[parent_id_obj], String(v[parent_id_obj])].includes(this.cacheParentIdObj[v[parent_id_obj]])) {
560
+ await this.onLoadData({ dataRef: v });
561
+ return v;
562
+ }
563
+ })
564
+ );
565
+ return list;
566
+ } catch (error) {
567
+ return Promise.resolve();
568
+ }
569
+ },
570
+
571
+ /**
572
+ * 过滤默认值的右边展示
573
+ */
574
+ hanldeFilterDefaultShowList(list) {
575
+ this.defaultShowList = this.defaultShowList.filter(d => list.findIndex(l => this.getuniqKey(d) == this.getuniqKey(l)) == -1);
576
+ // this.updateDefaultShowObj(this.defaultShowList);
577
+ },
578
+
579
+ updateDefaultShowObj(list) {
580
+ const { user_id_obj } = this.wordbookConfig || {};
581
+ this.defaultShowObj = {};
582
+ list.forEach(v => {
583
+ this.defaultShowObj[this.getuniqKey(v)] = v[user_id_obj];
584
+ });
585
+ },
586
+
587
+ /**
588
+ * 拼接key
589
+ */
590
+ getuniqKey(v) {
591
+ const { user_id_obj } = this.wordbookConfig || {};
592
+ return `${this.getParentId(v)}_${v[user_id_obj]}`;
593
+ // return v.key;
594
+ },
595
+
596
+ getParentId(v) {
597
+ const { parent_id_obj } = this.wordbookConfig || {};
598
+ // return `${v[parent_id_obj] || FIXEDKEY}`;
599
+ return `${v[parent_id_obj]}`;
600
+ },
601
+
602
+ // 查询树结构数据(一级父类)
603
+ async getUsers() {
604
+ try {
605
+ if (typeof this.queryMainTreeData !== 'function') {
606
+ return;
607
+ }
608
+ this.spinning = true;
609
+ const { parent_id_obj } = this.wordbookConfig || {};
610
+ let rows = await this.queryMainTreeData();
611
+ let list = this.uniqArrObj(rows, parent_id_obj);
612
+ this.treeData.main = list;
613
+ this.generateDataList(this.treeData.main, this.dataList.main);
614
+ // TODO:这里的回填
615
+ await this.loadSelected();
616
+ let { checkedKeysMain, checkedKeysOther } = this.getcheckedKeys();
617
+ this.checkedKeys.main.push(...checkedKeysMain);
618
+ this.checkedKeys.other = [...checkedKeysOther];
619
+
620
+ this.treeData.main.forEach(f => {
621
+ if (f && f.children && f.children.length) {
622
+ let flag = f.children.every(c => checkedKeysMain.includes(c.key));
623
+ if (flag && f.key) {
624
+ this.checkedKeys.main.push(f.key);
625
+ }
626
+ }
627
+ });
628
+ if (this.currentKey === 'main') {
629
+ this.checkedKeys.temp = this.checkedKeys.main;
630
+ this.treeData.temp = this.treeData.main;
631
+ }
632
+ this.spinning = false;
633
+ } catch (error) {
634
+ this.spinning = false;
635
+ this.$message.error('查询异常');
636
+ console.log(error);
637
+ }
638
+ },
639
+
640
+ // 动态获取子节点
641
+ onLoadData(treeNode) {
642
+ return new Promise(async resolve => {
643
+ if (treeNode.dataRef.children) {
644
+ resolve();
645
+ return;
646
+ }
647
+ treeNode.dataRef.children = await this.handleLoadChildData(treeNode.dataRef.key, treeNode.dataRef);
648
+
649
+ this.hanldeFilterDefaultShowList(treeNode.dataRef.children);
650
+
651
+ this.$nextTick(() => {
652
+ this.treeData.main = [...this.treeData.main];
653
+ this.treeData.temp = [...this.treeData.main];
654
+ });
655
+
656
+ this.addCheckedKeysChildrenMain(treeNode.dataRef);
657
+
658
+ this.generateDataList(treeNode.dataRef.children, this.dataList.main);
659
+ resolve();
660
+ });
661
+ },
662
+
663
+ async handleLoadChildData(key, treeNode) {
664
+ let rows = await this.queryLoadChildData(key, treeNode);
665
+ let list = rows;
666
+ return list;
667
+ },
668
+
669
+ loadMainChildData(searchResultTreeData) {
670
+ return new Promise(async resolve => {
671
+ let promises = searchResultTreeData.map(async item => {
672
+ if (item.users) {
673
+ let mainTreeItem = this.treeData.main.find(mainItem => mainItem.key == item.key);
674
+ if (!mainTreeItem || (mainTreeItem && !mainTreeItem.children)) {
675
+ if (!mainTreeItem) {
676
+ mainTreeItem = { ...item };
677
+ }
678
+ mainTreeItem.children = await this.handleLoadChildData(item.key, mainTreeItem);
679
+ this.generateDataList(mainTreeItem.children, this.dataList.main);
680
+ this.addCheckedKeysChildrenMain(mainTreeItem);
681
+ }
682
+ }
683
+ });
684
+
685
+ await Promise.all(promises);
686
+
687
+ resolve();
688
+ });
689
+ },
690
+
691
+ /**
692
+ * 检索
693
+ */
694
+ async searchFetch(data = {}, config = {}) {
695
+ if (typeof this.queryTreeSearch !== 'function') {
696
+ this.staticDataSearch();
697
+ this.spinning = false;
698
+ this.isSearchAllCheck();
699
+ return;
700
+ }
701
+ if (!this.searchValue) {
702
+ this.search.status = 0;
703
+ this.search.defaultExpandedKeys = [];
704
+ this.expandedKeys = [];
705
+ this.spinning = false;
706
+ this.searchNoMore = false;
707
+ return false;
708
+ }
709
+ if (!config.loadMoren) {
710
+ this.search.status = 1;
711
+ } else {
712
+ this.loadMorenLoadinng = true;
713
+ }
714
+
715
+ let rows = await this.queryTreeSearch(this.searchValue, data);
716
+ let searchResultTreeData = rows;
717
+ this.loadMorenLoadinng = false;
718
+ if (!searchResultTreeData || !searchResultTreeData.length) {
719
+ if (this.searchPage == 1) {
720
+ this.search.defaultExpandedKeys = [];
721
+ this.search.status = 3;
722
+ } else {
723
+ this.search.status = 2;
724
+ this.searchNoMore = true;
725
+ }
726
+
727
+ this.spinning = false;
728
+ this.isSearchAllCheck();
729
+ return false;
730
+ }
731
+
732
+ const { parent_id_obj, parent_name_obj, user_count_obj } = this.wordbook || {};
733
+ const { user_name_obj } = this.wordbookChild || {};
734
+ let pObj = {};
735
+ searchResultTreeData.forEach(item => {
736
+ item[parent_id_obj] &&
737
+ (pObj[item[parent_id_obj]] = {
738
+ key: item[parent_id_obj],
739
+ users: []
740
+ });
741
+
742
+ if (item.users) {
743
+ this.insertSearchTreeData(item);
744
+ } else {
745
+ this.insertSearchTreeDataOther(item);
746
+ }
747
+ });
748
+ let pList = [];
749
+ Object.keys(pObj || {}).forEach(v => {
750
+ if (v) {
751
+ pList.push({ ...pObj[v] });
752
+ }
753
+ });
754
+ let len = this.treeData.search.length || 0;
755
+ // TODO:加载更多
756
+ if (this.SearchLoadMore) {
757
+ this.searchNoMore = false;
758
+ } else {
759
+ this.searchNoMore = true;
760
+ }
761
+ // 防止searchTree选中后切换回mainTree,mainTree checkedKeys状态丢失
762
+ await this.loadMainChildData(pList);
763
+ this.generateSearchDataListKeys(searchResultTreeData);
764
+
765
+ this.hanldeFilterDefaultShowList(searchResultTreeData);
766
+ this.refreshSearchTree();
767
+ this.search.status = 2;
768
+ this.spinning = false;
769
+
770
+ this.isSearchAllCheck();
771
+ },
772
+
773
+ insertSearchTreeData(item) {
774
+ const { user_count_obj } = this.wordbook || {};
775
+ this.search.defaultExpandedKeys.push(item.key);
776
+
777
+ // 默认值处理
778
+ this.hanldeFilterDefaultShowList(item.children || []);
779
+
780
+ if (item[user_count_obj] == item.children.length) {
781
+ item.disableCheckbox = false;
782
+ }
783
+ this.treeData.search.push(item);
784
+ },
785
+
786
+ insertSearchTreeDataOther(item) {
787
+ let formatItem = Object.assign({}, item, { isLeaf: true });
788
+
789
+ this.treeData.search.push(formatItem);
790
+
791
+ if (this.dataListOtherKeys.includes(formatItem.key)) return false;
792
+ this.generateDataList([formatItem], this.dataList.other);
793
+ },
794
+
795
+ generateSearchDataListKeys(searchResultTreeData) {
796
+ // this.search.dataListKeys = {
797
+ // main: [],
798
+ // other: []
799
+ // };
800
+ searchResultTreeData.forEach(item => {
801
+ if (!this.dataListMainKeys.includes(item.key)) {
802
+ this.search.dataListKeys.other.push(item.key);
803
+ item.children &&
804
+ item.children.forEach(childItem => {
805
+ this.search.dataListKeys.other.push(childItem.key);
806
+ });
807
+ return;
808
+ }
809
+
810
+ this.search.dataListKeys.main.push(item.key);
811
+ item.children &&
812
+ item.children.forEach(childItem => {
813
+ this.search.dataListKeys.main.push(childItem.key);
814
+ });
815
+ });
816
+ },
817
+
818
+ searchOnloadMore() {
819
+ this.searchPage = this.searchPage + 1;
820
+ this.searchFetch({ page: this.searchPage }, { loadMoren: true });
821
+ },
822
+
823
+ addCheckedKeysChildrenMain(item) {
824
+ if (!item.key) return;
825
+ if (!this.checkedKeys.main.includes(String(item.key))) return false;
826
+ // 新查询到插入已选中的main treeData 的child key,需要手动push到checkedKeys中
827
+ if (!Array.isArray(item.children)) return false;
828
+ item.children.forEach(({ key }) => {
829
+ // 防止重复添加(已处理,不会重复添加,保留代码以防逻辑缺漏)
830
+ if (this.checkedKeys.main.includes(key) || !key) return false;
831
+ this.checkedKeys.main.push(key);
832
+ });
833
+ },
834
+
835
+ // 暂存实际可选节点arr
836
+ generateDataList(data, dataList) {
837
+ for (let i = 0; i < data.length; i++) {
838
+ const node = data[i];
839
+ dataList.push({
840
+ parentId: this.getParentId(node),
841
+ ...node
842
+ });
843
+ if (node.children) {
844
+ this.generateDataList(node.children, dataList);
845
+ }
846
+ }
847
+ },
848
+
849
+ // 获取匹配搜索节点arr
850
+ getParentKey(key, tree) {
851
+ let parentKey;
852
+ for (let i = 0; i < tree.length; i++) {
853
+ const node = tree[i];
854
+ if (node.key == key) {
855
+ parentKey = node.key;
856
+ return parentKey;
857
+ }
858
+
859
+ if (node.children) {
860
+ if (node.children.some(item => item.key == key)) {
861
+ parentKey = node.key;
862
+ } else if (this.getParentKey(key, node.children)) {
863
+ parentKey = this.getParentKey(key, node.children);
864
+ }
865
+ }
866
+ }
867
+ return parentKey;
868
+ },
869
+ radioChange(e) {
870
+ let { checked } = e.target || {};
871
+ if (this.searchTreeVisable) {
872
+ this.singleChecked = checked;
873
+ } else {
874
+ this.searchChecked = checked;
875
+ }
876
+ this.checkAll(checked ? 1 : 2);
877
+ this.handleOk();
878
+ },
879
+ // type 1 全选 2 反选(清空)
880
+ checkAll(type) {
881
+ if (this.checkAllSearchTree(type)) return false;
882
+ const key = ['main', 'dept', 'role'][this.typeActiveIndex];
883
+ if (type == 1) {
884
+ this.expandedKeys = [];
885
+ this.checkedKeys[key] = this[`dataList${key.slice(0, 1).toUpperCase()}${key.slice(1)}Keys`]; // dataListMainKeys dataListDeptKeys dataListRoleKeys;
886
+ this.checkedKeys.temp = this.checkedKeys[key];
887
+ } else if (type == 2) {
888
+ this.checkedKeys[key] = [];
889
+ this.checkedKeys.temp = [];
890
+ this.autoExpandParent = true;
891
+ }
892
+ },
893
+
894
+ checkAllSearchTree(type) {
895
+ if (!this.searchTreeVisable) return false;
896
+
897
+ if (type == 1) {
898
+ // 全选默认不选中父级
899
+ let allSearchkeysMain = this.search.dataListKeys.main.filter(key => {
900
+ return !this.search.defaultExpandedKeys.includes(key);
901
+ });
902
+
903
+ let allSearchkeysOther = this.search.dataListKeys.other;
904
+
905
+ this.checkedKeys.main = vexutils.uniq([...this.checkedKeys.main, ...allSearchkeysMain]);
906
+ this.checkedKeys.other = vexutils.uniq([...this.checkedKeys.other, ...allSearchkeysOther]);
907
+
908
+ // 如果子级全选,父级也需要选中
909
+ this.search.dataListKeys.main.forEach(key => {
910
+ let getParentKey = this.getParentKey(key, this.treeData.main);
911
+ let parent = this.treeData.main.filter(item => {
912
+ return item.key == getParentKey;
913
+ });
914
+
915
+ let allCheck = parent[0].children.every(item => {
916
+ return this.checkedKeys.main.includes(item.key);
917
+ });
918
+ allCheck && this.checkedKeys.main.push(getParentKey);
919
+ });
920
+ this.refreshSearchTree();
921
+ } else if (type == 2) {
922
+ this.$refs['searchTree'].emptyCheckedKeys();
923
+ this.autoExpandParent = true;
924
+ }
925
+ this.isSearchAllCheck();
926
+ return true;
927
+ },
928
+
929
+ refreshSearchTree() {
930
+ if (!this.searchTreeVisable) return false;
931
+ this.$refs['searchTree'].setDefaultCheckedKeys();
932
+ this.$nextTick(() => {
933
+ this.isSearchAllCheck();
934
+ });
935
+ },
936
+
937
+ // 展开数节点
938
+ onExpand(expandedKeys) {
939
+ // const latestOpenKey = expandedKeys.find(key => this.expandedKeys.indexOf(key) == -1);
940
+ // this.expandedKeys = latestOpenKey ? [latestOpenKey] : [];
941
+ // this.autoExpandParent = false;
942
+ this.expandedKeys = expandedKeys;
943
+ this.autoExpandParent = false;
944
+ // this.$emit('expand', expandedKeys, ...arg)
945
+ },
946
+ onExpandDept(expandedKeys) {
947
+ this.expandedDeptKeys = expandedKeys;
948
+ },
949
+
950
+ searchClick() {
951
+ this.searchValue = this.title;
952
+
953
+ this.treeData.search = [];
954
+ this.search.dataListKeys.other = [];
955
+ this.search.dataListKeys.main = [];
956
+ this.search.defaultExpandedKeys = [];
957
+
958
+ this.spinning = true;
959
+ this.searchPage = 1;
960
+ this.searchFetch();
961
+ },
962
+
963
+ isAllCheck(checkedKeys = []) {
964
+ const key = ['main', 'dept', 'role'][this.typeActiveIndex];
965
+ if (!checkedKeys || checkedKeys.length == 0) {
966
+ this.indeterminate = false;
967
+ this.singleChecked = false;
968
+ } else {
969
+ let keyArr = this.treeData[key].map(item => item.key);
970
+ let keyArrTemp = keyArr.filter(item => checkedKeys.indexOf(item) !== -1);
971
+ this.indeterminate = !(keyArr.length == keyArrTemp.length);
972
+ this.singleChecked = keyArr.length == keyArrTemp.length;
973
+ }
974
+ },
975
+
976
+ isSearchAllCheck() {
977
+ this.$nextTick(() => {
978
+ let skeyArr = this.treeData.search.map(item => item.key);
979
+ let serchCheckedKeys = this.$refs['searchTree'].checkedKeys;
980
+ this.searchIndeterminate = !!serchCheckedKeys.length && serchCheckedKeys.length < skeyArr.length;
981
+ this.searchChecked = serchCheckedKeys.length === skeyArr.length;
982
+ });
983
+ },
984
+
985
+ /* 子组件emit方法 */
986
+ addCheckedkeysMain(keys) {
987
+ let checkedKeys = this.checkedKeys.main;
988
+ let filterKey = (keys || {}).filter(Boolean);
989
+ filterKey.forEach(key => {
990
+ //
991
+ checkedKeys.push(key);
992
+ // 如果子级全选,父级也需要选中
993
+ let getParentKey = this.getParentKey(key, this.treeData.main);
994
+ if (!getParentKey) return;
995
+ let parent = this.treeData.main.filter(item => {
996
+ return item.key == getParentKey;
997
+ });
998
+ let allCheck = (parent[0]?.children || []).every(item => {
999
+ return checkedKeys.includes(item.key);
1000
+ });
1001
+ allCheck && checkedKeys.push(getParentKey);
1002
+ });
1003
+ },
1004
+
1005
+ removeCheckedkeysMain(keys) {
1006
+ let checkedKeysMain = vexutils.clone(this.checkedKeys.main, true);
1007
+ keys.forEach(key => {
1008
+ //
1009
+ let index = checkedKeysMain.findIndex(mainKey => mainKey == key);
1010
+ if (index !== -1) {
1011
+ checkedKeysMain.splice(index, 1);
1012
+ this.checkedKeys.main = [...checkedKeysMain];
1013
+ }
1014
+ // 删除父级选中
1015
+ let getParentKey = this.getParentKey(key, this.treeData.main);
1016
+ let parentIndex = checkedKeysMain.findIndex(mainKey => mainKey == getParentKey);
1017
+ if (parentIndex !== -1) {
1018
+ checkedKeysMain.splice(parentIndex, 1);
1019
+ }
1020
+ });
1021
+
1022
+ this.checkedKeys.main = [...checkedKeysMain];
1023
+ },
1024
+
1025
+ addCheckedkeysOther(keys) {
1026
+ this.checkedKeys.other.push(...keys);
1027
+ // this.checkedKeys.main.push(...keys);
1028
+ },
1029
+
1030
+ removeCheckedkeysOther(keys) {
1031
+ let checkedKeys = this.checkedKeys.other;
1032
+ // let mainCheckedKeys = this.checkedKeys.main;
1033
+ keys.forEach(key => {
1034
+ let index = checkedKeys.findIndex(otherKey => otherKey == key);
1035
+ checkedKeys.splice(index, 1);
1036
+ this.handleDeldefaultShowList(key);
1037
+
1038
+ // let mindex = mainCheckedKeys.findIndex(otherKey => otherKey == key);
1039
+ // mainCheckedKeys.splice(mindex, 1);
1040
+ });
1041
+ this.removeCheckedkeysMain(keys);
1042
+ },
1043
+
1044
+ handleDeldefaultShowList(key) {
1045
+ let len = this?.defaultShowList?.length || 0;
1046
+ if (len > 0) {
1047
+ for (let i = len - 1; i >= 0; i--) {
1048
+ let d = this.defaultShowList[i];
1049
+ if (`${d.parent_id}_${d.user_id}` == key) {
1050
+ this.closeDefaultTag(d, i);
1051
+ }
1052
+ }
1053
+ }
1054
+ },
1055
+
1056
+ closeDefaultTag(tag, i) {
1057
+ this.defaultShowList.splice(i, 1);
1058
+ this.closeTag({ parentId: this.getParentId(tag), ...tag });
1059
+ },
1060
+
1061
+ /* 右侧点击item[x]按钮 相关 */
1062
+ closeTag(removedTag) {
1063
+ // let { parentId } = removedTag;
1064
+
1065
+ this.removedCheckedkeysMain(removedTag);
1066
+ this.removedCheckedkeysDept(removedTag);
1067
+ this.removedCheckedkeysRole(removedTag);
1068
+ this.removedCheckedkeysOther(removedTag);
1069
+ const propStr = ['person', 'dept', 'role'][this.typeActiveIndex];
1070
+ const checkedKeys = this.checkedTreeItem.filter(item => item.itemType === propStr).map(item => item.key);
1071
+ this.checkedKeys.temp = checkedKeys;
1072
+ this.handleEmitValue();
1073
+ this.refreshSearchTree();
1074
+ this.isAllCheck(checkedKeys);
1075
+ },
1076
+
1077
+ removeCheckedkeysIncludeChildren(parentKey) {
1078
+ let needRemoveChildKeys = this.dataList.main
1079
+ .filter(i => {
1080
+ let parentId = this.getParentId(i);
1081
+ return parentId == parentKey || i.key == parentKey;
1082
+ })
1083
+ .map(i => {
1084
+ return i.key;
1085
+ });
1086
+ const checkedKeys = this.checkedKeys.main.filter(i => {
1087
+ return !needRemoveChildKeys.includes(i);
1088
+ });
1089
+ this.checkedKeys.main = checkedKeys;
1090
+ },
1091
+
1092
+ removedCheckedkeysMain(tag) {
1093
+ let checkedKeys = this.checkedKeys.main;
1094
+ let parentId = this.getParentId(tag);
1095
+ for (let i = 0; i < checkedKeys.length; i++) {
1096
+ if (tag.key == checkedKeys[i] && tag.key == parentId) {
1097
+ this.removeCheckedkeysIncludeChildren(tag.key);
1098
+ return false;
1099
+ } else if (tag.key == checkedKeys[i]) {
1100
+ checkedKeys.splice(i, 1);
1101
+ return false;
1102
+ }
1103
+ }
1104
+ },
1105
+ removeCheckedkeysIncludeChildrenDept(parentKey) {
1106
+ let needRemoveChildKeys = this.dataList.dept
1107
+ .filter(i => {
1108
+ let parentId = this.getParentId(i);
1109
+ return parentId == parentKey || i.key == parentKey;
1110
+ })
1111
+ .map(i => {
1112
+ return i.key;
1113
+ });
1114
+ const checkedKeys = this.checkedKeys.dept.filter(i => {
1115
+ return !needRemoveChildKeys.includes(i);
1116
+ });
1117
+ this.checkedKeys.dept = checkedKeys;
1118
+ },
1119
+ removedCheckedkeysDept(tag) {
1120
+ let checkedKeys = this.checkedKeys.dept;
1121
+ let parentId = this.getParentId(tag);
1122
+ for (let i = 0; i < checkedKeys.length; i++) {
1123
+ if (tag.key == checkedKeys[i] && tag.key == parentId) {
1124
+ this.removeCheckedkeysIncludeChildrenDept(tag.key);
1125
+ return false;
1126
+ } else if (tag.key == checkedKeys[i]) {
1127
+ checkedKeys.splice(i, 1);
1128
+ return false;
1129
+ }
1130
+ }
1131
+ },
1132
+ removedCheckedkeysRole(tag) {
1133
+ let checkedKeys = this.checkedKeys.role;
1134
+ let parentId = '';
1135
+ for (let i = 0; i < checkedKeys.length; i++) {
1136
+ if (tag.key == checkedKeys[i] && tag.key == parentId) {
1137
+ // this.removeCheckedkeysIncludeChildren(tag.key);
1138
+ return false;
1139
+ } else if (tag.key == checkedKeys[i]) {
1140
+ checkedKeys.splice(i, 1);
1141
+ return false;
1142
+ }
1143
+ }
1144
+ },
1145
+
1146
+ removedCheckedkeysOther(tag) {
1147
+ let checkedKeys = this.checkedKeys.other;
1148
+ if (checkedKeys.includes(tag.key)) {
1149
+ for (let i = 0; i < checkedKeys.length; i++) {
1150
+ if (tag.key == checkedKeys[i]) {
1151
+ checkedKeys.splice(i, 1);
1152
+ return false;
1153
+ }
1154
+ }
1155
+ } else {
1156
+ // 删除科室,删除
1157
+ this.OtherRemoveCheckedkeysIncludeChildren(tag.key);
1158
+ }
1159
+ },
1160
+
1161
+ OtherRemoveCheckedkeysIncludeChildren(parentKey) {
1162
+ let needRemoveChildKeys = this.dataList.main
1163
+ .filter(i => {
1164
+ let parentId = this.getParentId(i);
1165
+ return parentId == parentKey || i.key == parentKey;
1166
+ })
1167
+ .map(i => {
1168
+ return i.key;
1169
+ });
1170
+
1171
+ this.checkedKeys.other = this.checkedKeys.other.filter(i => {
1172
+ return !needRemoveChildKeys.includes(i);
1173
+ });
1174
+ },
1175
+
1176
+ /* submit 相关 */
1177
+ getCheckedMainChildKeys() {
1178
+ return new Promise(async resolve => {
1179
+ let promises = this.treeData.main.map(async item => {
1180
+ // 获取勾选了父类tree, 但未获取children
1181
+ // 接口传参,需要的是叶节点的keys
1182
+ if (this.checkedKeys.main.includes(item.key) && !item.children) {
1183
+ item.children = await this.handleLoadChildData(item.key, item);
1184
+ this.addCheckedKeysChildrenMain(item);
1185
+
1186
+ this.generateDataList(item.children, this.dataList.main);
1187
+ }
1188
+ });
1189
+
1190
+ await Promise.all(promises);
1191
+
1192
+ resolve();
1193
+ });
1194
+ },
1195
+
1196
+ getCheckedLeafKeys() {
1197
+ let mainLeafKeys = [];
1198
+ let mainLeafDataListKeys = this.dataList.main.filter(item => item.isLeaf).map(item => item.key);
1199
+
1200
+ this.checkedKeys.main.forEach(key => {
1201
+ if (mainLeafDataListKeys.includes(key)) {
1202
+ mainLeafKeys.push(key);
1203
+ }
1204
+ });
1205
+
1206
+ let keyList = [...mainLeafKeys, ...this.checkedKeys.other];
1207
+ let res = [...new Set(keyList)];
1208
+ return [...res];
1209
+ },
1210
+
1211
+ async handleOk(isShowLoading = false) {
1212
+ isShowLoading && (this.spinning = true);
1213
+ this.queryLoadChildData && (await this.getCheckedMainChildKeys());
1214
+
1215
+ this.checkedLeafKeys = this.getCheckedLeafKeys();
1216
+
1217
+ const submitData = this.handleGetSumitData(this.checkedLeafKeys);
1218
+
1219
+ // let subList = [...submitData, ...this.defaultShowList];
1220
+
1221
+ this.$emit('pubCheckedTreeItem', [...this.checkedTreeItem, ...this.defaultShowList]);
1222
+ this.$emit('check', [...this.checkedTreeItem, ...this.defaultShowList]);
1223
+ this.$emit('handleOk', this.checkedLeafKeys);
1224
+ this.$emit('change', this.checkedLeafKeys, [...submitData, ...this.defaultShowList]);
1225
+ this.$emit('submitData', [...submitData, ...this.defaultShowList]);
1226
+
1227
+ isShowLoading && (this.spinning = false);
1228
+ },
1229
+
1230
+ handleEmitValue() {
1231
+ clearTimeout(this.emitTimeout);
1232
+ this.emitTimeout = setTimeout(() => {
1233
+ this.handleOk();
1234
+ }, 100);
1235
+ },
1236
+
1237
+ hanldeGetValue(...arg) {
1238
+ this.handleOk(...arg);
1239
+ },
1240
+
1241
+ // 获取表单提交的数据
1242
+ handleGetSumitData(list = []) {
1243
+ if (!Array.isArray(list)) return [];
1244
+ let resList = [];
1245
+ const { parent_id_obj, parent_name_obj, user_id_obj, user_name_obj } = this.wordbookConfig || {};
1246
+ list.forEach(v => {
1247
+ // d.key
1248
+ let f = this.dataList.main.find(d => this.getuniqKey(d) == v);
1249
+ if (!f) {
1250
+ f = this.dataList.other.find(o => this.getuniqKey(o) == v);
1251
+ }
1252
+ // [parent_id_obj]: f[parent_id_obj],
1253
+ // [parent_name_obj]: f[parent_name_obj],
1254
+ // [user_id_obj]: f[user_id_obj],
1255
+ // [user_name_obj]: f[user_name_obj]
1256
+ if (f) {
1257
+ /** 提交映射 */
1258
+ // 自定义 key 值
1259
+ const { parent_id_obj_key, parent_name_obj_key } = this.wordbook;
1260
+ const { user_id_obj_key, user_name_obj_key } = this.wordbookChild;
1261
+ resList.push({
1262
+ [user_id_obj_key || 'user_id']: f[user_id_obj],
1263
+ [user_name_obj_key || 'user_name']: f[user_name_obj],
1264
+ [parent_id_obj_key || 'parent_id']: f[parent_id_obj],
1265
+ [parent_name_obj_key || 'parent_name']: f[parent_name_obj]
1266
+ });
1267
+ }
1268
+ });
1269
+ return resList;
1270
+ },
1271
+
1272
+ cancel() {
1273
+ this.$emit('update:visible', false);
1274
+ this.spinning = false;
1275
+ },
1276
+ /* */
1277
+ treeCount(count) {
1278
+ if (!count) return '';
1279
+ return `(${count})`;
1280
+ },
1281
+
1282
+ staticDataSearch() {
1283
+ // let expandedKeys = new Set();
1284
+ // this.getStaticSearchParentKey(this.treeData.main, expandedKeys);
1285
+ // this.expandedKeys = Array.from(expandedKeys);
1286
+ // this.autoExpandParent = true;
1287
+ const key = ['main', 'dept', 'role'][this.typeActiveIndex];
1288
+ if (!this.title) {
1289
+ // 如果为空恢复默认数据
1290
+ this.$set(this.treeData, 'temp', this.treeData[key]);
1291
+ return;
1292
+ }
1293
+ let copyData = JSON.parse(JSON.stringify(this.treeData[key]));
1294
+ // 增加visible属性 true展示 false不展示
1295
+ filterTree({ value: this.title, data: copyData, prop: 'title', filterChildren: this.filterChildren });
1296
+ // 过滤visible属性 为true的数据
1297
+ copyData = copyData.filter(item => item.visible);
1298
+ const expandedKeys = [];
1299
+ vexutils.searchTree(copyData, item => {
1300
+ if (item.visible && item.title.indexOf(this.title) !== -1) {
1301
+ const allParentIds = getAllParentId(copyData, item.key).filter(Boolean);
1302
+ expandedKeys.push(...allParentIds);
1303
+ }
1304
+ if (item.children && item.children.length) {
1305
+ item.children = item.children.filter(child => child.visible);
1306
+ }
1307
+ });
1308
+ this.$set(this.treeData, 'temp', copyData);
1309
+ this.expandedKeys = [...new Set(expandedKeys)];
1310
+ },
1311
+ getStaticSearchParentKey(treeData, expandedKeys, orgId) {
1312
+ const keyword = this.title;
1313
+ for (let i = 0; i < treeData.length; i++) {
1314
+ const user = treeData[i];
1315
+ let { title = '', key, children } = user;
1316
+ if (keyword.length > 0 && (String(title).indexOf(keyword) !== -1 || String(key).indexOf(keyword) !== -1)) {
1317
+ expandedKeys.add(key);
1318
+ if (orgId) {
1319
+ expandedKeys.add(orgId);
1320
+ }
1321
+ break;
1322
+ }
1323
+ if (children) {
1324
+ this.getStaticSearchParentKey(children, expandedKeys, user.key || orgId);
1325
+ }
1326
+ }
1327
+ },
1328
+
1329
+ // 数组对象去重
1330
+ uniqArrObj(arr, name) {
1331
+ let obj = {};
1332
+ return arr.reduce((cur, next) => {
1333
+ obj[next[name]] ? '' : (obj[next[name]] = true && cur.push(next));
1334
+ return cur;
1335
+ }, []);
1336
+ },
1337
+ onTypeClick(index) {
1338
+ const key = ['main', 'dept', 'role'][index];
1339
+ const checkedKeys = this.checkedKeys[key];
1340
+ this.treeData.temp = this.treeData[key];
1341
+ this.checkedKeys.temp = checkedKeys;
1342
+ this.typeActiveIndex = index;
1343
+ // 处理全选框
1344
+ this.isAllCheck(checkedKeys);
1345
+ },
1346
+ onTreeCheck(checkedKeys, { checked, node }) {
1347
+ if (this.checkStrictly) {
1348
+ checkedKeys = checkedKeys.checked;
1349
+ }
1350
+ // 断掉了父子关系 要不然当存在一二级科室的时候 搜索二级科室 再选中会把一级也选中 ; 后续与产品沟通 不需要断 只取最后一级科室
1351
+ const propStr = ['main', 'dept', 'role'][this.typeActiveIndex];
1352
+ let totalCheckedKeys = [];
1353
+ // const keyData = this.dataList[propStr].find(item => item.key === node.eventKey);
1354
+ // let keyData = {};
1355
+ // vexutils.searchTree(this.treeData[propStr], item => {
1356
+ // if (item.key === node.eventKey) {
1357
+ // keyData = item;
1358
+ // }
1359
+ // });
1360
+ // vexutils.searchTree(keyData.children, item => {
1361
+ // childKeys.push(item.key);
1362
+ // });
1363
+ // if (checked) {
1364
+ // const singleCheckedKeys = this.getSingleCheckedKeys(propStr, this.treeData[propStr], keyData);
1365
+ // totalCheckedKeys = this.isSingleCheck ? singleCheckedKeys : [...new Set(checkedKeys.concat(childKeys))];
1366
+ // } else {
1367
+ // // totalCheckedKeys = checkedKeys;
1368
+ // totalCheckedKeys = this.isSingleCheck ? [] : checkedKeys.filter(key => !childKeys.includes(key));
1369
+ // }
1370
+ // 如果是选中就把之前选中和现在选中的合并做为temp值(兼容搜索的情况),
1371
+ if (checked) {
1372
+ const preChecked = this.checkedKeys[propStr];
1373
+ // 搜索时选中上级也要把它所有下级给选中 如果是选中一个下级但是也把其上级选中了要把上级选中给去掉
1374
+ const childKeys = [];
1375
+ let keyData = {};
1376
+ vexutils.searchTree(this.treeData[propStr], item => {
1377
+ if (item.key === node.eventKey) {
1378
+ keyData = item;
1379
+ }
1380
+ });
1381
+ vexutils.searchTree(keyData.children, item => {
1382
+ childKeys.push(item.key);
1383
+ });
1384
+ const allParentIds = getAllParentId(this.treeData[propStr], node.eventKey)?.filter(Boolean) || [];
1385
+ totalCheckedKeys = [...new Set(preChecked.concat(checkedKeys, childKeys))].filter(id => !allParentIds.includes(id));
1386
+ } else {
1387
+ // 如果是取消从之前的选择中把当前点击的及其子级去除选中作为temp值(兼容搜索的情况)
1388
+ let keyData = {};
1389
+ const needCancelKeys = [node.eventKey];
1390
+ const preChecked = this.checkedKeys[propStr];
1391
+ vexutils.searchTree(this.treeData[propStr], item => {
1392
+ if (item.key === node.eventKey) {
1393
+ keyData = item;
1394
+ }
1395
+ });
1396
+ vexutils.searchTree(keyData.children, item => {
1397
+ needCancelKeys.push(item.key);
1398
+ });
1399
+ const allParentIds = getAllParentId(this.treeData[propStr], node.eventKey)?.filter(Boolean) || [];
1400
+ totalCheckedKeys = [...new Set(preChecked.filter(key => !needCancelKeys.includes(key)))];
1401
+ if (!this.checkStrictly) {
1402
+ totalCheckedKeys = totalCheckedKeys.filter(id => !allParentIds.includes(id));
1403
+ }
1404
+ }
1405
+ this.checkedKeys.temp = totalCheckedKeys;
1406
+ this.checkedKeys[propStr] = totalCheckedKeys;
1407
+ this.isAllCheck(totalCheckedKeys);
1408
+ this.isSearchAllCheck(totalCheckedKeys);
1409
+ this.$emit('pubCheckedTreeItem', [...this.checkedTreeItem, ...this.defaultShowList]);
1410
+ this.$emit('check', [...this.checkedTreeItem, ...this.defaultShowList]);
1411
+ },
1412
+ getSingleCheckedKeys(propStr, treeData, keyData) {
1413
+ const firstTreeData = deepTraversalFirst(keyData) || [];
1414
+ let checkedKeys = [];
1415
+ if (propStr === 'main') {
1416
+ checkedKeys = firstTreeData.map(item => item.key);
1417
+ } else if (propStr === 'dept') {
1418
+ // 如果是dept 找到层级为科室的第一个数据
1419
+ const index = firstTreeData.findIndex(item => item.type === 1);
1420
+ if (index > -1) {
1421
+ checkedKeys = firstTreeData.slice(0, index + 1).map(item => item.key);
1422
+ } else {
1423
+ checkedKeys = firstTreeData.map(item => item.key);
1424
+ }
1425
+ } else if (propStr === 'role') {
1426
+ // 如果是dept 找到层级为角色的第一个数据
1427
+ const index = firstTreeData.findIndex(item => item.roleId);
1428
+ if (index > -1) {
1429
+ checkedKeys = firstTreeData.slice(0, index + 1).map(item => item.key);
1430
+ } else {
1431
+ checkedKeys = firstTreeData.map(item => item.key);
1432
+ }
1433
+ }
1434
+ return checkedKeys;
1435
+ },
1436
+
1437
+ onClearSelect() {
1438
+ this.checkedKeys.temp = [];
1439
+ this.checkedKeys.main = [];
1440
+ this.checkedKeys.dept = [];
1441
+ this.checkedKeys.role = [];
1442
+ this.defaultShowList = [];
1443
+ this.indeterminate = false;
1444
+ this.singleChecked = false;
1445
+ },
1446
+ filterTreeData({ value, data, prop, filter, filterXor, children, visible, filterChildren = true, callback }) {
1447
+ // 默认赋值
1448
+ visible = visible || 'visible';
1449
+ children = children || 'children';
1450
+ prop = prop || 'text';
1451
+
1452
+ const filterNodeMethod = function(value, data) {
1453
+ if (!value) {
1454
+ return true;
1455
+ }
1456
+ let flag = (data[prop] || '').indexOf(value) !== -1;
1457
+ return filterXor ? !flag : flag;
1458
+ };
1459
+
1460
+ const traverse = function(node) {
1461
+ const childNodes = node[children] || [];
1462
+
1463
+ childNodes.forEach(child => {
1464
+ callback && callback(child);
1465
+ child[visible] = (!node.root && !filterChildren && node[visible]) || filterNodeMethod.call(child, value, child, prop);
1466
+
1467
+ traverse(child);
1468
+ });
1469
+
1470
+ if (!node[visible] && childNodes.length) {
1471
+ let allHidden = true;
1472
+ allHidden = !childNodes.some(child => child[visible]);
1473
+
1474
+ node[visible] = allHidden === false;
1475
+ }
1476
+ };
1477
+ let totalData = {
1478
+ root: true
1479
+ };
1480
+ totalData[children] = data;
1481
+ traverse(totalData);
1482
+
1483
+ if (filter) {
1484
+ let copyData = data.slice();
1485
+ let filterHandle = filterData => {
1486
+ return filterData.filter((item, index) => {
1487
+ if (item[visible]) {
1488
+ if (item[children]) {
1489
+ item[children] = filterHandle(item[children]);
1490
+ }
1491
+ return true;
1492
+ }
1493
+ return false;
1494
+ });
1495
+ };
1496
+ return filterHandle(copyData);
1497
+ }
1498
+ },
1499
+ handleData() {
1500
+ vexutils.searchTree(this.data, item => {
1501
+ if (this.titleAddCode) {
1502
+ item.title = `${item.title}(${item.code})`;
1503
+ }
1504
+ });
1505
+ }
1506
+ }
1507
+ });
1508
+ </script>
1509
+ <style lang="less" scoped>
1510
+ @primary-color: #2563f4;
1511
+ .people-tree {
1512
+ display: flex;
1513
+ .people-tree-item {
1514
+ flex-shrink: 0;
1515
+ width: 300px;
1516
+ padding: 22px 12px 0;
1517
+ max-height: 376px;
1518
+ height: 376px;
1519
+ overflow-y: auto;
1520
+ &.people-tree-left {
1521
+ display: flex;
1522
+ flex-direction: column;
1523
+ }
1524
+ /deep/ .person-search {
1525
+ // .ant-input-affix-wrapper .ant-input:not(:last-child),
1526
+ // .ant-input-affix-wrapper .ant-input:not(:first-child) {
1527
+ // padding-left: 34px;
1528
+ // }
1529
+ .ant-input-group-addon {
1530
+ padding: 0;
1531
+ border: 0px !important;
1532
+ }
1533
+ .ant-input-search-button {
1534
+ border-top-left-radius: 0;
1535
+ border-bottom-left-radius: 0;
1536
+ }
1537
+ }
1538
+ /deep/ .main-tree-container {
1539
+ > li {
1540
+ width: 100%;
1541
+ overflow: hidden;
1542
+ }
1543
+ .ant-tree-switcher {
1544
+ flex-shrink: 0;
1545
+ }
1546
+ .ant-tree-node-content-wrapper {
1547
+ width: calc(100% - 24px);
1548
+ text-overflow: ellipsis;
1549
+ overflow: hidden;
1550
+ white-space: nowrap;
1551
+ }
1552
+ }
1553
+ /deep/.ant-tree-title {
1554
+ // width: 250px;
1555
+ width: 100%;
1556
+ text-overflow: ellipsis;
1557
+ overflow: hidden;
1558
+ white-space: nowrap;
1559
+ display: inline-block;
1560
+ }
1561
+ &:first-child {
1562
+ border-right: 1px solid #e8e8e8;
1563
+ }
1564
+
1565
+ .no-data-tips {
1566
+ height: 200px;
1567
+ width: 100%;
1568
+ display: flex;
1569
+ justify-content: center;
1570
+ align-items: center;
1571
+ font-size: 16px;
1572
+ font-weight: 700;
1573
+ }
1574
+
1575
+ .c-title {
1576
+ font-size: 14px;
1577
+ font-family: PingFangSC-Regular, PingFang SC;
1578
+ font-weight: 400;
1579
+ color: #212121;
1580
+ }
1581
+ .c-sub-title {
1582
+ font-size: 12px;
1583
+ font-family: PingFangSC-Regular, PingFang SC;
1584
+ // font-weight: 400;
1585
+ color: #4e4e4e;
1586
+ }
1587
+ .p-title {
1588
+ font-size: 14px;
1589
+ font-family: PingFangSC-Medium, PingFang SC;
1590
+ font-weight: 500;
1591
+ color: #212121;
1592
+ }
1593
+ }
1594
+ /deep/.ant-tree {
1595
+ overflow-y: auto;
1596
+ // height: 450px;
1597
+ flex: 1;
1598
+ position: relative;
1599
+ &::-webkit-scrollbar {
1600
+ width: 6px;
1601
+ height: 6px;
1602
+ background-color: #f5f5f5;
1603
+ }
1604
+ }
1605
+ .select-wrap {
1606
+ flex: 1;
1607
+ padding: 22px 12px 0;
1608
+ height: 376px;
1609
+ display: flex;
1610
+ flex-direction: column;
1611
+ .select-header {
1612
+ display: flex;
1613
+ justify-content: space-between;
1614
+ margin-bottom: 20px;
1615
+ .clear-btn {
1616
+ color: @primary-color;
1617
+ cursor: pointer;
1618
+ }
1619
+ }
1620
+ .select-content {
1621
+ flex: 1;
1622
+ overflow-y: auto;
1623
+ .tag-item {
1624
+ .tag-text {
1625
+ overflow: hidden;
1626
+ white-space: nowrap;
1627
+ text-overflow: ellipsis;
1628
+ max-width: 300px;
1629
+ }
1630
+ &.isRoot {
1631
+ background: rgba(@primary-color, 0.08);
1632
+ border: 1px solid rgba(@primary-color, 0.5);
1633
+ color: @primary-color;
1634
+ .tag-close {
1635
+ color: @primary-color;
1636
+ &:hover {
1637
+ color: rgba(@primary-color, 0.6);
1638
+ }
1639
+ }
1640
+ }
1641
+
1642
+ box-sizing: border-box;
1643
+ color: #212121;
1644
+ font-size: 14px;
1645
+ list-style: none;
1646
+ display: inline-flex;
1647
+ align-items: center;
1648
+ height: 24px;
1649
+ line-height: 24px;
1650
+ margin-right: 8px;
1651
+ margin-bottom: 4px;
1652
+ padding: 0 6px;
1653
+ // white-space: nowrap;
1654
+ background: rgba(#d5d5d5, 0.2);
1655
+ border: 1px solid rgba(#000000, 0.14);
1656
+ border-radius: 4px;
1657
+ transition: all 0.3s cubic-bezier(0.215, 0.61, 0.355, 1);
1658
+ .tag-close {
1659
+ font-size: 12px;
1660
+ &:hover {
1661
+ color: rgba(@primary-color, 0.6);
1662
+ }
1663
+ &:active {
1664
+ color: #fff;
1665
+ }
1666
+ display: inline-block;
1667
+ font-size: 14px;
1668
+ margin-left: 3px;
1669
+ color: #969696;
1670
+ font-weight: 700;
1671
+ cursor: pointer;
1672
+ transition: all 0.3s;
1673
+ }
1674
+ }
1675
+ }
1676
+ }
1677
+ }
1678
+ .df {
1679
+ display: flex;
1680
+ }
1681
+ .search-input-icon {
1682
+ color: rgba(0, 0, 0, 0.4);
1683
+ margin-bottom: -2px;
1684
+ }
1685
+ .type-wrap {
1686
+ display: flex;
1687
+ margin-bottom: 10px;
1688
+ .type-btn {
1689
+ margin-right: 10px;
1690
+ padding: 2px 10px;
1691
+ background: #f2f2f2;
1692
+ border-radius: 8px;
1693
+ cursor: pointer;
1694
+ &:last-child {
1695
+ margin-right: 0;
1696
+ }
1697
+ }
1698
+ .type-active {
1699
+ background: @primary-color;
1700
+ color: #ffffff;
1701
+ }
1702
+ }
1703
+ </style>