addAir.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810
  1. <template>
  2. <view class="container">
  3. <view class="line"></view>
  4. <view class="show-selected">
  5. <view class="title-selected">已选择:</view>
  6. <view class="air-selected-name">{{show_airs}}</view>
  7. </view>
  8. <view class="btn">
  9. <view class="btn-bg" @tap="confirm_selection">确认选择</view>
  10. </view>
  11. <view class="line"></view>
  12. <view class="title-tip">请选择</view>
  13. <view class="line"></view>
  14. <view class="tree-box">
  15. <scroll-view scroll-y="true" class="tree-scroll" :style="{height: screenHeight}">
  16. <!-- 校区 -->
  17. <view class="item-school" v-for="(item0, index0) in treeData" :key="index0">
  18. <view class="school" :id="item0.id" @tap="handle_toggle_items">
  19. <view>{{item0.label}}</view>
  20. <uni-icons type="bottom" size="22" color="#ffffff"
  21. :style="{display: item0.isShow ? '' : 'none'}"></uni-icons>
  22. <uni-icons type="top" size="22" color="#ffffff" :style="{display: item0.isShow ? 'none' : ''}">
  23. </uni-icons>
  24. </view>
  25. <!-- 楼栋 -->
  26. <view class="item-loudong" v-for="(item1, index1) in item0.children" :key="index1"
  27. :style="{display: item0.isShow ? '' : 'none'}">
  28. <view class="loudong" :id="item1.id" @tap="handle_toggle_items">
  29. <view class="title-loudong">
  30. <uni-icons type="plus-filled" size="22" color="#2979ff"
  31. :style="{display: item1.isShow ? 'none' : ''}"></uni-icons>
  32. <uni-icons type="minus-filled" size="22" color="#2979ff"
  33. :style="{display: item1.isShow ? '' : 'none'}"></uni-icons>
  34. <view class="txt-loudong">{{item1.label}}</view>
  35. </view>
  36. <uni-icons type="bottom" size="22" color="#2979ff"
  37. :style="{display: item1.isShow ? '' : 'none'}"></uni-icons>
  38. <uni-icons type="top" size="22" color="#2979ff"
  39. :style="{display: item1.isShow ? 'none' : ''}">
  40. </uni-icons>
  41. </view>
  42. <!-- 楼层 -->
  43. <view class="item-loucheng" v-for="(item2, index2) in item1.children" :key="index2"
  44. :style="{display: item1.isShow ? '' : 'none'}">
  45. <view class="loucheng" :id="item2.id" @tap="handle_toggle_items">
  46. <view class="title-loucheng">
  47. <uni-icons type="plus-filled" size="22" color="#2979ff"
  48. :style="{display: item2.isShow ? 'none' : ''}"></uni-icons>
  49. <uni-icons type="minus-filled" size="22" color="#2979ff"
  50. :style="{display: item2.isShow ? '' : 'none'}"></uni-icons>
  51. <view class="txt-loucheng">{{item2.label}}</view>
  52. </view>
  53. <uni-icons type="bottom" size="22" color="#2979ff"
  54. :style="{display: item2.isShow ? '' : 'none'}"></uni-icons>
  55. <uni-icons type="top" size="22" color="#2979ff"
  56. :style="{display: item2.isShow ? 'none' : ''}"></uni-icons>
  57. </view>
  58. <!-- 教室、房间 -->
  59. <view class="item-jiaoshi" v-for="(item3, index3) in item2.children" :key="index3"
  60. :style="{display: item2.isShow ? '' : 'none'}">
  61. <view class="jiaoshi" :id="item3.id"
  62. @tap="get_air_in_the_room($event, item0.id + '|' + item1.id + '|' + item2.id + '|' + item3.id, item0.label + '|' + item1.label + '|'+ item2.label + '|' + item3.label, item3.isShow)">
  63. <view class="title-jiaoshi">
  64. <uni-icons type="plus-filled" size="22" color="#2979ff"
  65. :style="{display: item3.isShow ? 'none' : ''}"></uni-icons>
  66. <uni-icons type="minus-filled" size="22" color="#2979ff"
  67. :style="{display: item3.isShow ? '' : 'none'}"></uni-icons>
  68. <view class="txt-jiaoshi">{{item3.label}}</view>
  69. </view>
  70. <uni-icons type="bottom" size="22" color="#2979ff"
  71. :style="{display: item3.isShow ? '' : 'none'}"></uni-icons>
  72. <uni-icons type="top" size="22" color="#2979ff"
  73. :style="{display: item3.isShow ? 'none' : ''}"></uni-icons>
  74. </view>
  75. <!-- 空调 -->
  76. <view v-for="(item4, index4) in item3.children" :key="index4"
  77. :style="{display: item3.isShow ? '' : 'none'}">
  78. <view class="item-kongtiao" v-if="item4.isUsering">
  79. <view :style="{color: item4.isUsering ? '#747578' : '#2979ff'}">
  80. {{item4.label}}(使用中)
  81. </view>
  82. <checkbox :id="item4.id" :checked="true" :disabled="true" />
  83. </view>
  84. <view class="item-kongtiao" v-else>
  85. <view :style="{color: item4.isUsering ? '#747578' : '#2979ff'}">
  86. {{item4.label}}
  87. </view>
  88. <checkbox :value="index4" :id="item4.id" :checked="item4.isChecked"
  89. @tap="handle_kongtiao" />
  90. </view>
  91. </view>
  92. </view>
  93. </view>
  94. </view>
  95. </view>
  96. </scroll-view>
  97. </view>
  98. </view>
  99. </template>
  100. <script>
  101. export default {
  102. data() {
  103. return {
  104. ceshi: 'air',
  105. id_card: '', // 身份证号
  106. user_name: '', // 姓名
  107. airs_selected: '', //
  108. return_selected_airs: '', // 用于返回到上一页面的结果变量
  109. show_airs: '', // 用于显示已经选择的空调
  110. treeData: [], // 树形选择器的数据,目录树treeData
  111. airsData: [], // 点击教室的时候,获取该教室的空调数据
  112. screenHeight: '' // 屏幕的高度
  113. };
  114. },
  115. onLoad(options) {
  116. uni.showLoading({
  117. title: '加载中'
  118. })
  119. // 获取表格数据
  120. this.getTableData()
  121. setTimeout(() => {
  122. uni.hideLoading();
  123. }, 500);
  124. // 获取身份证号
  125. this.get_base_info(options)
  126. },
  127. onShow() {
  128. // 从新计算高度
  129. setTimeout(() => {
  130. this.calc_screen_height()
  131. }, 1500)
  132. },
  133. methods: {
  134. /**
  135. * 获取身份证号
  136. */
  137. get_base_info(options) {
  138. try {
  139. if (this.id_card == '' || typeof(this.id_card) == 'undefined') {
  140. const userinfo = uni.getStorageSync('userinfo_storage_key')
  141. if (userinfo) {
  142. this.id_card = userinfo.id_card
  143. this.user_name = userinfo.name
  144. } else {
  145. uni.navigateTo({
  146. url: '../index/index?from=' + options.from
  147. })
  148. uni.showToast({
  149. icon: 'none',
  150. title: '身份证号为空,请进行授权',
  151. duration: 3000
  152. });
  153. return
  154. }
  155. }
  156. } catch (e) {
  157. console.log('获取基本信息:' + e.message);
  158. }
  159. },
  160. /**
  161. * 点击房间,显示空调
  162. * @param {Object} e
  163. * @param {Object} id
  164. * @param {Object} label
  165. * @param {Object} rooms
  166. */
  167. async get_air_in_the_room(e, id, label, isShow) {
  168. let ids = id.split('|')
  169. let labels = label.split('|')
  170. // console.log(ids);
  171. // console.log(labels);
  172. // 展开或收起
  173. this.handle_toggle_items(e)
  174. // 展开时获取接口空调信息
  175. if (false === isShow) {
  176. const res = await this.$myRequest({
  177. host: this.ceshi,
  178. url: '/airManage/buildairqueryAirMes.action',
  179. method: 'POST',
  180. header: {
  181. 'content-type': 'application/x-www-form-urlencoded'
  182. },
  183. data: {
  184. school: labels[0],
  185. build: labels[1],
  186. floors: labels[2],
  187. dom: labels[3]
  188. }
  189. })
  190. // console.log(res.data);
  191. let data = res.data
  192. if (typeof data.code === 'undefined') {
  193. uni.showToast({
  194. title: '未找到code!',
  195. icon: 'success'
  196. });
  197. return
  198. }
  199. if (data.code === 200 && typeof data.data !== 'undefined') {
  200. // 清空
  201. this.airsData = []
  202. for (var i = 0; i < data.data.length; i++) {
  203. this.airsData.push({
  204. isUsering: data.data[i].is_on == 1 ? true : false,
  205. label: data.data[i].air_name + '-' + data.data[i].air_config,
  206. isChecked: false,
  207. id: data.data[i].air_ip
  208. })
  209. }
  210. // 排序
  211. this.airsData.sort((a, b) => a.label.localeCompare(b.label))
  212. if (this.airsData.length > 0) {
  213. // 填充数据
  214. this.insert_into_treeData_rooms(this.treeData, ids[3])
  215. }
  216. } else {
  217. uni.showToast({
  218. title: '该房间未配空调'
  219. });
  220. }
  221. }
  222. },
  223. /**
  224. * 填充空调到教室下面,供选择
  225. * @param {Object} obj
  226. * @param {Object} id
  227. */
  228. insert_into_treeData_rooms(obj, id) {
  229. for (var i = 0; i < obj.length; i++) {
  230. if (obj[i].id == id) {
  231. obj[i].children = this.airsData
  232. return
  233. }
  234. if (typeof obj[i].children != 'undefined' && obj[i].children.length > 0) {
  235. this.insert_into_treeData_rooms(obj[i].children, id)
  236. }
  237. }
  238. },
  239. /**
  240. * 树形选择器的数据
  241. */
  242. async getTableData() {
  243. const res = await this.$myRequest({
  244. host: this.ceshi,
  245. url: '/airManage/buildqueryDom.action',
  246. method: 'POST',
  247. header: {
  248. 'content-type': 'application/x-www-form-urlencoded'
  249. }
  250. })
  251. // console.log(res.data);
  252. if (typeof res.data.code === 'undefined') {
  253. uni.showToast({
  254. title: '未找到code!',
  255. icon: 'success'
  256. });
  257. return
  258. }
  259. if (typeof res.data.data === 'undefined') {
  260. uni.showToast({
  261. title: '未返回数据data!',
  262. icon: 'success'
  263. });
  264. return
  265. }
  266. if (res.data.code === 200) {
  267. let data = res.data.data
  268. // 校区
  269. let school = JSON.parse(data)
  270. // console.log('school', school);
  271. if (typeof school !== 'undefined' && school !== '') {
  272. this.treeData = []
  273. let tmpSchool = []
  274. for (var i = 0; i < school.length; i++) {
  275. let nData = []
  276. let builds = school[i]["builds"]
  277. for (var j = 0; j < builds.length; j++) {
  278. let tmpBuilds = {}
  279. let tmpFloors = []
  280. let floors = builds[j]['floors']
  281. for (var k = 0; k < floors.length; k++) {
  282. let room = []
  283. let tmpRooms = []
  284. let rooms = floors[k].rooms
  285. for (var p = 0; p < rooms.length; p++) {
  286. room.push({
  287. id: school[i].id + '' + builds[j].id + '' + floors[k].id + '' + i +
  288. '' + j + '' + k + '' + p,
  289. isShow: false,
  290. label: rooms[p],
  291. children: []
  292. })
  293. }
  294. let floor = {
  295. id: floors[k].id,
  296. label: floors[k].floor,
  297. isShow: false,
  298. children: room
  299. }
  300. tmpFloors.push(floor)
  301. }
  302. tmpFloors.sort((a, b) => a.label.localeCompare(b.label))
  303. tmpBuilds.id = builds[j].id
  304. tmpBuilds.label = builds[j].building
  305. tmpBuilds.isShow = false
  306. tmpBuilds.children = []
  307. tmpBuilds.children = tmpFloors
  308. nData.push(tmpBuilds)
  309. }
  310. nData.sort((a, b) => a.label.localeCompare(b.label))
  311. tmpSchool.push({
  312. id: school[i].id,
  313. label: school[i].school,
  314. isShow: true,
  315. children: nData
  316. })
  317. }
  318. tmpSchool.sort((a, b) => b.label.localeCompare(a.label))
  319. this.treeData = tmpSchool
  320. // console.log(JSON.stringify(this.treeData));
  321. } else {
  322. this.treeData = []
  323. uni.showToast({
  324. title: '无符合的数据!'
  325. });
  326. }
  327. } else {
  328. uni.showToast({
  329. title: res.data.message,
  330. icon: 'success'
  331. });
  332. }
  333. },
  334. /**
  335. * 获取空调的全称,勾选返回空调全称,不勾返回-空调全称,递归调用
  336. * @param {Object} obj
  337. * @param {Object} id
  338. * @param {Object} parentName
  339. */
  340. get_airs_full_name(obj, id, parentName) {
  341. for (var i = 0; i < obj.length; i++) {
  342. if (obj[i].id == id) {
  343. if (parentName == '') {
  344. return obj[i].label
  345. }
  346. if (obj[i].isChecked) {
  347. obj[i].isChecked = false
  348. return '+' + parentName + ' ' + obj[i].label
  349. } else {
  350. obj[i].isChecked = true
  351. return parentName + ' ' + obj[i].label
  352. }
  353. }
  354. let selfName = ''
  355. if (typeof obj[i].children !== 'undefined' && obj[i].children.length > 0) {
  356. if (parentName == '') {
  357. selfName = this.get_airs_full_name(obj[i].children, id, obj[i].label)
  358. } else {
  359. selfName = this.get_airs_full_name(obj[i].children, id, parentName + '+' + obj[i].label)
  360. }
  361. if (typeof selfName !== 'undefined') {
  362. return selfName
  363. }
  364. }
  365. }
  366. },
  367. /**
  368. * 获取空调的ids
  369. * @param {Object} obj
  370. * @param {Object} id
  371. */
  372. get_airs_ids() {
  373. let airs_selected_ids = ''
  374. let obj0 = this.treeData
  375. for (var i = 0; i < obj0.length; i++) {
  376. if (typeof obj0[i].children !== 'undefined' && obj0[i].children.length > 0) {
  377. let obj1 = obj0[i].children
  378. for (var j = 0; j < obj1.length; j++) {
  379. if (typeof obj1[j].children !== 'undefined' && obj1[j].children.length > 0) {
  380. let obj2 = obj1[j].children
  381. for (var k = 0; k < obj2.length; k++) {
  382. if (typeof obj2[k].children !== 'undefined' && obj2[k].children.length > 0) {
  383. let obj3 = obj2[k].children
  384. for (var p = 0; p < obj3.length; p++) {
  385. if (typeof obj3[p].children !== 'undefined' && obj3[p].children.length > 0) {
  386. let obj4 = obj3[p].children
  387. for (var u = 0; u < obj4.length; u++) {
  388. if (obj4[u].isChecked) {
  389. airs_selected_ids += obj0[i].label + '-' + obj1[j].label + '-' +
  390. obj2[k]
  391. .label + '-' + obj3[p].label + '|' + obj4[u].label + '|' +
  392. obj4[u]
  393. .id + ','
  394. }
  395. }
  396. }
  397. }
  398. }
  399. }
  400. }
  401. }
  402. }
  403. }
  404. this.return_selected_airs = airs_selected_ids.substring(0, airs_selected_ids.length - 1)
  405. },
  406. /**
  407. * 更新airs_selected中的数据
  408. * @param {Object} param
  409. */
  410. update_airs_selected(param) {
  411. let tmp_airs_selected = ''
  412. if (param.indexOf('+') == 0) { // 删除airs_selected中的数据
  413. // 把前面的'+'去除
  414. let del_val = param.substring(1)
  415. // 需要删除的值进行拆分成:【楼栋+楼层+房间, 空调】
  416. let room = del_val.split(' ')
  417. if (this.airs_selected.trim() !== '') {
  418. let arrAirs = this.airs_selected.trim().split(',')
  419. let airs = ''
  420. for (var i = 0; i < arrAirs.length; i++) {
  421. airs = arrAirs[i].trim() // 删除空格后,赋给临时变量
  422. // 如果找到指定的房间,则删除
  423. if (airs.indexOf(room[0]) == 0) {
  424. // 删除 楼栋-楼层-房间 中的空调
  425. airs = airs.replace(' ' + room[1], '')
  426. // 如果只剩下 楼栋-楼层-房间,没有了空调,则置为空
  427. if (airs == room[0]) {
  428. airs = ''
  429. }
  430. }
  431. if (airs !== '') {
  432. // 保存到临时变量tmp_airs_selected中
  433. tmp_airs_selected += airs + ','
  434. }
  435. }
  436. }
  437. } else { // 添加、合并到airs_selected中
  438. // 如果为空,直接加入
  439. if (this.airs_selected.trim() == '') {
  440. tmp_airs_selected = param + ','
  441. } else {
  442. let arrAirs = this.airs_selected.trim().split(',')
  443. let num = 0
  444. // 需要添加的数据
  445. let room = param.split(' ')
  446. for (var i = 0; i < arrAirs.length; i++) {
  447. let airs = arrAirs[i].trim().split(' ')
  448. // 如果找到指定的房间,则合并
  449. if (airs[0] == room[0]) {
  450. // 临时数组, 为排序做准备
  451. let tmp_arr = []
  452. // 数组转字符串, 即拼接
  453. tmp_arr.push(room[1])
  454. for (var j = 1; j < airs.length; j++) {
  455. tmp_arr.push(airs[j])
  456. }
  457. // 数组排序
  458. tmp_arr.sort()
  459. // 生成字符串
  460. tmp_airs_selected += room[0]
  461. for (var k = 0; k < tmp_arr.length; k++) {
  462. tmp_airs_selected += ' ' + tmp_arr[k]
  463. }
  464. // 加入分隔符
  465. tmp_airs_selected += ','
  466. } else {
  467. num++ // 计数
  468. tmp_airs_selected += arrAirs[i] + ','
  469. }
  470. }
  471. // 如果没有找到同一房间的,则直接拼接要添加的数据
  472. if (num == arrAirs.length) {
  473. tmp_airs_selected += param + ','
  474. }
  475. }
  476. }
  477. // 更新变量airs_selected
  478. this.airs_selected = tmp_airs_selected.substring(0, tmp_airs_selected.length - 1)
  479. // 更新显示框的内容
  480. this.show_selected_airs()
  481. },
  482. /**
  483. * 选择空调
  484. * @param {Object} e
  485. */
  486. handle_kongtiao(e) {
  487. // console.log(e.currentTarget.id);
  488. // 获取id
  489. let id = e.currentTarget.id
  490. // 获取勾选的值
  491. let airsFullName = this.get_airs_full_name(this.treeData, id, '')
  492. // 获取所有选中的id
  493. this.get_airs_ids()
  494. if (typeof airsFullName !== 'undefined') {
  495. // 更新airs_selected中的数据
  496. this.update_airs_selected(airsFullName)
  497. } else {
  498. uni.showToast({
  499. title: '选取无效!',
  500. duration: 1500
  501. })
  502. }
  503. },
  504. /**
  505. * 选项的展开与收起,进行切换,递归调用
  506. * @param {Object} obj
  507. * @param {Object} id
  508. */
  509. toggle_item(obj, id) {
  510. for (var i = 0; i < obj.length; i++) {
  511. if (obj[i].id == id) {
  512. if (obj[i].isShow) {
  513. obj[i].isShow = false
  514. } else {
  515. obj[i].isShow = true
  516. }
  517. return
  518. }
  519. if (typeof obj[i].children != 'undefined' && obj[i].children.length > 0) {
  520. this.toggle_item(obj[i].children, id)
  521. }
  522. }
  523. },
  524. /**
  525. * 选项的展开与收起,进行切换
  526. * @param {Object} e
  527. */
  528. handle_toggle_items(e) {
  529. // console.log(e.currentTarget.id);
  530. // 获取id
  531. let id = e.currentTarget.id
  532. this.toggle_item(this.treeData, id)
  533. },
  534. /**
  535. * 确认选择,将结果返回到前一页面显示
  536. */
  537. confirm_selection() {
  538. // 触发全局的自定义事件,附加参数都会传给监听器回调函数。
  539. if (this.return_selected_airs !== '') {
  540. // 保存到数据库
  541. let arrAirs = this.return_selected_airs.trim().split(',').sort()
  542. for (var i = 0; i < arrAirs.length; i++) {
  543. let tmpAirs = arrAirs[i].split('|');
  544. let _this = this;
  545. // 绑定空调
  546. (function(t, air_ip) {
  547. setTimeout(function() {
  548. _this.bangding_airs(air_ip);
  549. }, 300 * t);
  550. })(i, tmpAirs[2])
  551. }
  552. uni.$emit('selectAirs', {
  553. airs: this.return_selected_airs
  554. })
  555. }
  556. // 返回空调列表页面
  557. uni.navigateBack({
  558. delta: -1
  559. })
  560. },
  561. /**
  562. * 绑定空调
  563. * @param {Object} air_id
  564. */
  565. async bangding_airs(air_id) {
  566. const res = await this.$myRequest({
  567. host: this.ceshi,
  568. url: '/airManage/usersbdair.action',
  569. method: 'POST',
  570. header: {
  571. 'content-type': 'application/json'
  572. },
  573. data: {
  574. user_name: this.user_name,
  575. sfzh: this.id_card,
  576. air_ip: air_id
  577. }
  578. })
  579. // console.log(res.data);
  580. if (res.data.code == 200) {
  581. uni.showToast({
  582. icon: 'none',
  583. title: res.data.message,
  584. duration: 1500
  585. })
  586. } else {
  587. uni.showToast({
  588. icon: 'none',
  589. title: res.data.message,
  590. duration: 1500
  591. })
  592. }
  593. },
  594. /**
  595. * 超出左边显示"..."
  596. */
  597. show_selected_airs() {
  598. // 显示到上方
  599. this.show_airs = this.airs_selected.split('').reverse().join('').replaceAll('(', '>').replaceAll(')', '<')
  600. .replaceAll('>', ')').replaceAll('<', '(')
  601. },
  602. /**
  603. * 计算屏幕的高度
  604. */
  605. calc_screen_height() {
  606. uni.getSystemInfo({
  607. success: res => {
  608. let h = ((res.screenHeight * (750 / res.windowWidth)) - 480) //将px 转换rpx
  609. this.screenHeight = Math.floor(h) + 'rpx'
  610. }
  611. });
  612. }
  613. }
  614. }
  615. </script>
  616. <style lang="scss" scoped>
  617. .container {
  618. display: flex;
  619. flex-direction: column;
  620. font-size: 28rpx;
  621. font-family: "Microsoft YaHei-3970(82674968)";
  622. width: 730rpx;
  623. padding: 10rpx;
  624. .line {
  625. height: 20rpx;
  626. }
  627. .show-selected {
  628. display: flex;
  629. padding: 20rpx;
  630. border-radius: 10rpx;
  631. border: 1px solid #c7c9ce;
  632. font-size: 32rpx;
  633. .title-selected {
  634. color: #686b71;
  635. white-space: nowrap;
  636. }
  637. .air-selected-name {
  638. width: 600rpx;
  639. font-weight: bold;
  640. white-space: nowrap;
  641. text-overflow: ellipsis;
  642. direction: rtl;
  643. unicode-bidi: bidi-override;
  644. overflow: hidden;
  645. }
  646. }
  647. .btn {
  648. display: flex;
  649. justify-content: flex-end;
  650. .btn-bg {
  651. margin-top: 30rpx;
  652. padding: 20rpx 40rpx;
  653. border-radius: 10rpx;
  654. font-size: 32rpx;
  655. color: #ffffff;
  656. background-color: #2979ff;
  657. }
  658. }
  659. .title-tip {
  660. font-size: 36rpx;
  661. }
  662. .tree-box {
  663. border-radius: 10rpx;
  664. border: 1px solid #c7c9ce;
  665. color: #2979ff;
  666. .tree-scroll {
  667. border-radius: 10rpx;
  668. overflow: scroll;
  669. }
  670. .item-school {
  671. display: flex;
  672. flex-direction: column;
  673. padding: 10rpx 0 0 10rpx;
  674. .school {
  675. display: flex;
  676. align-items: center;
  677. justify-content: space-between;
  678. background-color: #2979ff;
  679. color: #ffffff;
  680. padding: 10rpx 10rpx 10rpx 20rpx;
  681. height: 60rpx;
  682. width: 668rpx;
  683. font-size: 30rpx;
  684. }
  685. .item-loudong {
  686. display: flex;
  687. flex-direction: column;
  688. padding: 10rpx 0 0 10rpx;
  689. margin-left: 30rpx;
  690. .loudong {
  691. display: flex;
  692. align-items: center;
  693. justify-content: space-between;
  694. border: 1rpx solid #c7c9ce;
  695. padding: 10rpx;
  696. height: 60rpx;
  697. width: 636rpx;
  698. font-size: 30rpx;
  699. .title-loudong {
  700. display: flex;
  701. }
  702. .txt-loudong {
  703. padding-left: 5rpx;
  704. }
  705. }
  706. .item-loucheng {
  707. display: flex;
  708. flex-direction: column;
  709. margin-left: 60rpx;
  710. .loucheng {
  711. display: flex;
  712. align-items: center;
  713. justify-content: space-between;
  714. border: 1rpx solid #c7c9ce;
  715. padding: 10rpx;
  716. height: 60rpx;
  717. width: 578rpx;
  718. font-size: 30rpx;
  719. .title-loucheng {
  720. display: flex;
  721. }
  722. .txt-loucheng {
  723. padding-left: 5rpx;
  724. }
  725. }
  726. .item-jiaoshi {
  727. display: flex;
  728. flex-direction: column;
  729. margin-left: 60rpx;
  730. .jiaoshi {
  731. display: flex;
  732. align-items: center;
  733. justify-content: space-between;
  734. border: 1rpx solid #c7c9ce;
  735. padding: 10rpx;
  736. height: 60rpx;
  737. width: 520rpx;
  738. font-size: 30rpx;
  739. .title-jiaoshi {
  740. display: flex;
  741. }
  742. .txt-jiaoshi {
  743. padding-left: 5rpx;
  744. }
  745. }
  746. .item-kongtiao {
  747. display: flex;
  748. justify-content: space-between;
  749. align-items: center;
  750. border: 1rpx solid #c7c9ce;
  751. margin-left: 60rpx;
  752. padding: 10rpx 10rpx 10rpx 30rpx;
  753. height: 60rpx;
  754. width: 442rpx;
  755. font-size: 32rpx;
  756. }
  757. }
  758. }
  759. }
  760. }
  761. }
  762. }
  763. </style>