treeHouse.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <template>
  2. <div class="organ-trees">
  3. <div v-show="showHouseTree">
  4. <div>
  5. <el-input v-model="filterText" v-if="!showCheckboxTree" placeholder="请输入关键字" suffix-icon="el-icon-search"></el-input>
  6. <el-input
  7. v-model="selectHouse"
  8. placeholder="选择的房间"
  9. @focus="inputFocue('house')"
  10. maxlength="10"
  11. suffix-icon="el-icon-search"
  12. v-else
  13. ></el-input>
  14. </div>
  15. <div class="tree-style-box no-scrollbar" v-show="inputFocueHouse">
  16. <el-tree
  17. class="tree-style"
  18. :data="organList"
  19. ref="tree"
  20. node-key="id"
  21. :highlight-current="true"
  22. :props="defaultProps"
  23. :expand-on-click-node="false"
  24. @check="clickCheckTree"
  25. :default-expand-all="defaultExpandAllTree"
  26. :filter-node-method="filterNode"
  27. :show-checkbox="showCheckboxTree"
  28. :accordion="accordion"
  29. :prevDetailData="prevDetailData"
  30. :default-expanded-keys="defaultSelectAll"
  31. :check-on-click-node="true"
  32. >
  33. </el-tree>
  34. <div class="end-btn" @click="endBtn">
  35. <el-button type="primary">确定</el-button>
  36. </div>
  37. </div>
  38. </div>
  39. <div>
  40. <el-input
  41. v-show="!showHouseTree"
  42. v-model="selectPeople"
  43. placeholder="选择的人员"
  44. maxlength="10"
  45. @focus="inputFocue()"
  46. suffix-icon="el-icon-search"
  47. ></el-input>
  48. <div class="tree-style-box no-scrollbar" v-show="inputFocuePeople">
  49. <el-tree
  50. class="tree-style"
  51. :data="dataPeopleList"
  52. ref="treePeople"
  53. node-key="id"
  54. :highlight-current="true"
  55. :props="defaultPropsPeople"
  56. :expand-on-click-node="false"
  57. @check="clickCheckTreePeople"
  58. :default-expand-all="defaultExpandAllTree"
  59. :filter-node-method="filterNodePeople"
  60. :show-checkbox="showCheckboxTree"
  61. :accordion="accordionPeople"
  62. :selectAll="selectAll"
  63. :prevDetailData="prevDetailData"
  64. :check-on-click-node="true"
  65. >
  66. </el-tree>
  67. <div class="end-btn">
  68. <el-button type="primary" @click="endBtn">确定</el-button>
  69. </div>
  70. </div>
  71. </div>
  72. </div>
  73. </template>
  74. <script>
  75. export default {
  76. name: 'treeHouse',
  77. props: {
  78. buildingType: { type: String, default: 'buildingType' },
  79. showCheckboxTree: {
  80. //显示多选框
  81. type: Boolean,
  82. default: false
  83. },
  84. disabledHouse: {
  85. type: Boolean,
  86. default: true
  87. },
  88. disabledPeople: {
  89. type: Boolean,
  90. default: true
  91. },
  92. defaultExpandAllTree: {
  93. //是否默认展开所有节点
  94. type: Boolean,
  95. default: true
  96. },
  97. showHouseTree: {
  98. //显示房间树
  99. type: Boolean,
  100. default: true
  101. },
  102. accordion: {
  103. //房间展开手风琴
  104. type: Boolean,
  105. default: false
  106. },
  107. accordionPeople: {
  108. //人员展开手风琴
  109. type: Boolean,
  110. default: false
  111. },
  112. prevDetailData: {
  113. type: Array,
  114. default() {
  115. return [];
  116. }
  117. }
  118. },
  119. data() {
  120. return {
  121. //输入框获得焦点
  122. inputFocueHouse: false,
  123. inputFocuePeople: false,
  124. filterText: '',
  125. selectHouse: '',
  126. selectPeople: '',
  127. organList: [],
  128. dataPeopleList: [],
  129. defaultSelectAll: [],
  130. defaultProps: {
  131. children: 'children',
  132. label: 'name'
  133. },
  134. defaultPropsPeople: {
  135. children: 'children',
  136. label: 'label'
  137. }
  138. };
  139. },
  140. watch: {
  141. selectHouse(val) {
  142. // this.$refs.tree.filter(val);
  143. },
  144. dataPeopleList(val) {
  145. console.log('====================================');
  146. console.log('dataPeopleList', val);
  147. console.log('====================================');
  148. this.$refs.tree.filter(val);
  149. }
  150. },
  151. computed: {},
  152. methods: {
  153. // 输入框获得焦点
  154. inputFocue(val) {
  155. if (val) {
  156. this.inputFocueHouse = true;
  157. } else {
  158. this.inputFocuePeople = true;
  159. }
  160. },
  161. endBtn() {
  162. this.inputFocueHouse = false;
  163. this.inputFocuePeople = false;
  164. },
  165. // 过滤选中的社区下的房间
  166. filterhouse(val, datas) {
  167. let array = datas;
  168. let data;
  169. for (let index = 0; index < array.length; index++) {
  170. const element = array[index];
  171. if (element.id == val && element.children) {
  172. data = element.children;
  173. }
  174. }
  175. this.$nextTick(() => {
  176. this.organList = data;
  177. this.defaultSelectAll = data;
  178. this.selectAllHouse();
  179. this.clickCheckTree();
  180. // this.$refs.tree.setCheckedNodes('C1栋');
  181. });
  182. console.log('this.$refs.tree.setCheckedNodes(this.organList);', this.organList);
  183. },
  184. // 选中所有房间
  185. selectAllHouse() {
  186. this.$nextTick(() => {
  187. this.$refs.tree.setCheckedNodes(this.organList);
  188. this.clickCheckTree();
  189. });
  190. },
  191. // 选中指定房间
  192. selectHouseOr() {
  193. this.$nextTick(() => {
  194. this.$refs.tree.setCheckedKeys([]);
  195. this.clickCheckTree();
  196. });
  197. },
  198. // 选中所有人员
  199. selectAllPeople() {
  200. this.$nextTick(() => {
  201. this.$refs.treePeople.setCheckedNodes(this.dataPeopleList);
  202. this.clickCheckTreePeople();
  203. });
  204. },
  205. // 选中指定人员
  206. selectPeopleOr() {
  207. this.$nextTick(() => {
  208. this.$refs.treePeople.setCheckedKeys([]);
  209. this.clickCheckTreePeople();
  210. });
  211. },
  212. // 获取人员
  213. getPeopleList() {
  214. this.$http.get('/sc-user-center/user/findUserList').then(({ status, data, msg }) => {
  215. if (status === 0) {
  216. this.dataPeopleList = data;
  217. this.$emit('dataPeople', data);
  218. } else {
  219. this.$message(warning, '获取人员失败,请稍后重试');
  220. }
  221. console.log('获取人员', data);
  222. });
  223. },
  224. getSelect(data) {
  225. var str = [];
  226. const getStr = function (list) {
  227. list.forEach(function (row) {
  228. if (row.children) {
  229. getStr(row.children);
  230. } else {
  231. str.push(row.value);
  232. }
  233. });
  234. };
  235. getStr(data);
  236. return str;
  237. console.log('getStr', str);
  238. },
  239. // 多选框返回选中房间的数据
  240. clickCheckTree(val) {
  241. let tree = this.$refs.tree;
  242. let nameArr = [];
  243. let array = tree.getCheckedNodes();
  244. for (let index = 0; index < array.length; index++) {
  245. const element = array[index];
  246. nameArr.push(element.name);
  247. if (Array.isArray(element) && element.length > 0) {
  248. nameArr.push(element.name);
  249. }
  250. }
  251. // 输入框显示的房间
  252. this.selectHouse = nameArr;
  253. var arr = [];
  254. array.forEach(function (item) {
  255. if (item.type === 'room' && Number(item.value) !== String) {
  256. arr.push(Number(item.value));
  257. }
  258. });
  259. let obj = {};
  260. obj.userList = arr;
  261. obj.checkData = array;
  262. console.log('多选框返回选中房间的数据', array);
  263. // 选中的房间id
  264. this.$emit('selectData', obj);
  265. },
  266. // 多选框返回选中人员的数据
  267. clickCheckTreePeople(val) {
  268. let nameArr = [];
  269. let tree = this.$refs.treePeople;
  270. let array = tree.getCheckedNodes();
  271. for (let index = 0; index < array.length; index++) {
  272. const element = array[index];
  273. nameArr.push(element.label);
  274. if (Array.isArray(element) && element.length > 0) {
  275. nameArr.push(element.label);
  276. }
  277. }
  278. let checkDatas = tree.getCheckedNodes();
  279. var a = [];
  280. for (let i in checkDatas) {
  281. if (checkDatas[i].children == null) {
  282. a.push(checkDatas[i].id);
  283. }
  284. }
  285. let obj = {};
  286. obj.userList = a;
  287. obj.checkData = array;
  288. console.log('多选框返回选中人员的数据', JSON.stringify(checkDatas));
  289. // 输入框显示的人员
  290. this.selectPeople = nameArr.toString();
  291. // 选中的人员id
  292. this.$emit('selectPeople', obj);
  293. },
  294. filterNode(value, data) {
  295. if (!value) return true;
  296. return data.name.indexOf(value) !== -1;
  297. },
  298. filterNodePeople(value, data) {
  299. if (!value) return true;
  300. return data.label.indexOf(value) !== -1;
  301. }
  302. },
  303. created() {
  304. // this.getOrgTreeList();
  305. this.getPeopleList();
  306. }
  307. };
  308. </script>
  309. <style lang="scss" scoped>
  310. .organ-trees {
  311. box-sizing: border-box;
  312. float: left;
  313. z-index: 99999;
  314. &::before {
  315. clear: both;
  316. }
  317. .tree-style-box {
  318. // margin-top: 20px;
  319. // max-height: calc(100vh - 200px);
  320. // overflow: scroll;
  321. }
  322. .end-btn {
  323. position: absolute;
  324. right: 30px;
  325. top: 10px;
  326. }
  327. .el-tree {
  328. background: #fafcff;
  329. max-height: 50vh;
  330. overflow: scroll;
  331. padding: 10px;
  332. }
  333. }
  334. </style>