index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. <!--
  2. * @Author: your name
  3. * @Date: 2022-01-17 10:39:22
  4. * @LastEditTime: 2022-05-07 15:56:23
  5. * @LastEditors: your name
  6. * @Description: 行李视图
  7. -->
  8. <template>
  9. <div class="baggage-view">
  10. <div class="part1">
  11. <div class="title">
  12. <span>行李基本信息</span>
  13. <el-radio-group
  14. v-model="infoBtn"
  15. class="radioBtn"
  16. size="mini"
  17. fill="#FFFFFF"
  18. text-color="#28344D"
  19. >
  20. <el-radio-button
  21. v-for="item in infoRadios"
  22. :key="item"
  23. :label="item"
  24. />
  25. </el-radio-group>
  26. </div>
  27. <div class="part1_info">
  28. <el-row :gutter="12">
  29. <el-col
  30. v-for="(item, index) in baggageBasicInfoCols"
  31. :key="index"
  32. :span="[1, 4, 5].includes(index % 7) ? 4 : 3"
  33. >
  34. <span class="label">{{ item.label }}:</span><span
  35. class="content"
  36. :title="baggageBasicInfo[item.content]"
  37. >{{ baggageBasicInfo[item.content] }}</span>
  38. </el-col>
  39. </el-row>
  40. </div>
  41. </div>
  42. <div
  43. v-if="infoBtn === infoRadios[0]"
  44. class="part2"
  45. >
  46. <div class="part2_info">
  47. <div
  48. style="width: 120px"
  49. class="title"
  50. >行李跟踪信息</div>
  51. <div
  52. v-if="infoBtn === infoRadios[0]"
  53. class="type normal"
  54. >
  55. {{ baggageBasicInfo.BagStatus }}
  56. </div>
  57. <div
  58. v-if="infoBtn === infoRadios[0]"
  59. class="step"
  60. >
  61. <div class="baggage-track-chart">
  62. <div class="stepLine">
  63. <div
  64. :style="{ width: lineWidth }"
  65. class="stepLineBlue"
  66. />
  67. </div>
  68. <div
  69. v-for="(item, index) in stepData"
  70. :key="index"
  71. class="stepItem"
  72. :class="{ activeItem: item.DealTime }"
  73. >
  74. <span class="head">
  75. <!-- {{ item.airPort }} -->
  76. <!-- <span v-if="item.airPort && item.nodeName !== ''">-</span> -->
  77. <span>{{ item.NodeNameEN }}</span>
  78. </span>
  79. <span>{{ item.DealTime }}</span>
  80. <!-- <span>{{ item.time }}</span> -->
  81. </div>
  82. </div>
  83. </div>
  84. </div>
  85. <div class="btns">
  86. <el-button
  87. type="primary"
  88. icon="el-icon-download"
  89. size="mini"
  90. />
  91. <el-button
  92. class="btn-set"
  93. type="primary"
  94. icon="el-icon-s-tools"
  95. size="mini"
  96. @click="show"
  97. />
  98. </div>
  99. </div>
  100. <div
  101. v-if="infoBtn == infoRadios[0]"
  102. class="part3"
  103. >
  104. <el-table
  105. ref="table"
  106. :data="baggageTableData"
  107. size="mini"
  108. border
  109. stripe
  110. fit
  111. :span-method="tableSpanMethod"
  112. :header-cell-style="{ color: '#101116' }"
  113. >
  114. <el-table-column
  115. v-for="item in tableColsCopy"
  116. :key="item.index"
  117. :prop="item.prop"
  118. :label="item.name"
  119. :align="item.align"
  120. :width="item.width + 'px'"
  121. :show-overflow-tooltip="true"
  122. />
  123. </el-table>
  124. </div>
  125. <div
  126. v-if="infoBtn === infoRadios[1]"
  127. class="part4"
  128. >
  129. <header class="head">
  130. <div class="title">行李跟踪信息</div>
  131. <div class="btns">
  132. <el-button
  133. type="primary"
  134. icon="el-icon-download"
  135. size="mini"
  136. />
  137. <el-button
  138. class="btn-set"
  139. type="primary"
  140. icon="el-icon-s-tools"
  141. size="mini"
  142. />
  143. </div>
  144. </header>
  145. <main class="main">
  146. <template v-if="messageList.length">
  147. <el-row
  148. :gutter="24"
  149. type="flex"
  150. >
  151. <el-col
  152. v-for="(message, index) in messageList"
  153. :key="index"
  154. :span="6"
  155. >
  156. <div class="card">
  157. <div class="message-date">{{ message.date }}</div>
  158. <div class="message-content">
  159. {{ message.content.replace(/\s+/g, "").split(".").join("\n.") }}
  160. <!-- BSM <br>
  161. .V/1LHRB <br>
  162. .F/XX1640/08APR/PEK/Y <br>
  163. .O/ZZ941/08APR/DXB/E <br>
  164. .N/0666826758001 <br>
  165. .D/SELF//08APR/110023L//PEK30113 <br>
  166. .S/N/32L/C/030//Y/I <br>
  167. .W/K/l/0 <br>
  168. .P/1CUI/DI ENDBSM<br> -->
  169. </div>
  170. </div>
  171. </el-col>
  172. </el-row>
  173. </template>
  174. <template v-else>
  175. <el-empty
  176. :image-size="1"
  177. description="暂无数据"
  178. />
  179. </template>
  180. </main>
  181. </div>
  182. <!--列设置-->
  183. <Dialog
  184. :flag="dialogFlag"
  185. class="dialog-check-cols"
  186. >
  187. <div class="col-dialog">
  188. <div class="title">列设置</div>
  189. <div class="content">
  190. <el-tree
  191. :data="tableCols"
  192. :class="colsCheckClass"
  193. show-checkbox
  194. node-key="index"
  195. :default-expand-all="true"
  196. :props="{
  197. label: 'name',
  198. children: 'children',
  199. }"
  200. :default-checked-keys="checkedKeysTemp"
  201. @check="handleCheck"
  202. />
  203. </div>
  204. <div class="foot right t30">
  205. <el-button
  206. size="medium"
  207. class="r24"
  208. type="primary"
  209. @click="onCheck"
  210. >确定</el-button>
  211. <el-button
  212. size="medium"
  213. @click="hide"
  214. >取消</el-button>
  215. </div>
  216. </div>
  217. </Dialog>
  218. </div>
  219. </template>
  220. <script>
  221. import Dialog from '@/layout/components/Dialog/index.vue'
  222. import { queryMap, myQuery } from '@/api/dataIntegration'
  223. import { BaggageMessageQuery } from '@/api/flight'
  224. import tableColsMixin from '../../mixins/tableCols'
  225. export default {
  226. name: 'BaggageView',
  227. components: {
  228. Dialog
  229. },
  230. mixins: [tableColsMixin],
  231. data() {
  232. return {
  233. departureAirport: '',
  234. landingAirport: '',
  235. queryData: {},
  236. baggageBasicInfoCols: [
  237. {
  238. label: '行李牌号',
  239. content: 'bagNo'
  240. },
  241. {
  242. label: '企业或团队名称',
  243. content: 'teamOrGroup'
  244. },
  245. {
  246. label: '值机位置',
  247. content: 'checkInLocation'
  248. },
  249. {
  250. label: '特殊行李类型',
  251. content: 'specialType'
  252. },
  253. {
  254. label: 'PNR编号',
  255. content: 'PNR'
  256. },
  257. {
  258. label: '旅客姓名大写拼音',
  259. content: 'name'
  260. },
  261. {
  262. label: '装载序列号',
  263. content: 'loadSequenceIndex'
  264. },
  265. {
  266. label: '总件数',
  267. content: 'totalNumber'
  268. },
  269. {
  270. label: '总重量',
  271. content: 'totalWeight'
  272. },
  273. {
  274. label: '尺寸',
  275. content: 'size'
  276. },
  277. {
  278. label: '外部特征描述',
  279. content: 'externalCharacterization'
  280. },
  281. {
  282. label: '常旅客号',
  283. content: 'frequentFlyerNumber'
  284. },
  285. {
  286. label: '常旅客级别',
  287. content: 'frequentFlyerClass'
  288. },
  289. {
  290. label: '是否取消值机',
  291. content: 'whetherToCancelTheCheckIn'
  292. },
  293. {
  294. label: '是否可装载',
  295. content: 'isItLoadable'
  296. },
  297. {
  298. label: '是否可运输',
  299. content: 'isItTransportable'
  300. },
  301. {
  302. label: '行李激活状态',
  303. content: 'activeState'
  304. },
  305. {
  306. label: '无BSM状态',
  307. content: 'noBSM'
  308. },
  309. {
  310. label: '中转标记',
  311. content: 'transitSign'
  312. },
  313. {
  314. label: '速运标记',
  315. content: 'expressSign'
  316. },
  317. {
  318. label: '破损标记',
  319. content: 'brokenSign'
  320. },
  321. {
  322. label: '投诉标记',
  323. content: 'complaintSign'
  324. },
  325. {
  326. label: '赔偿标记',
  327. content: 'compensationSign'
  328. },
  329. {
  330. label: '异常状态',
  331. content: 'bagExcType'
  332. }
  333. ],
  334. baggageBasicInfo: {},
  335. dialogVisibledele: false,
  336. active: 2,
  337. infoBtn: '跟踪信息',
  338. infoRadios: ['跟踪信息', '跟踪报文'],
  339. messageList: [
  340. // {
  341. // content: `BSM
  342. // .V/1LHRB
  343. // .F/XX1640/08APR/PEK/Y
  344. // .O/ZZ941/08APR/DXB/E
  345. // .N/0666826758001
  346. // .D/SELF//08APR/110023L//PEK30113
  347. // .S/N/32L/C/030//Y/I
  348. // .W/K/l/0
  349. // .P/1CUI/DI ENDBSM`,
  350. // date: '2022-04-25 12:42:38:00'
  351. // }
  352. ],
  353. checkList: [],
  354. stepData: new Array(9).fill({}),
  355. tableCols: [
  356. {
  357. name: '航班号',
  358. prop: 'flightNo',
  359. align: 'center'
  360. },
  361. { name: '航班日期', prop: 'flightDate', align: 'center', width: 103 },
  362. {
  363. name: '起飞航站\n预计起飞时间',
  364. prop: 'departureAirport',
  365. align: 'center',
  366. width: 111
  367. },
  368. {
  369. name: '目的航站\n预计降落时间',
  370. prop: 'landingAirport',
  371. align: 'center',
  372. sortable: 'custom',
  373. width: 111
  374. },
  375. { name: '旅客仓位', prop: 'passengerCompartment', align: 'center' },
  376. { name: '旅客座位号', prop: 'passengerSeatNumber', align: 'center', width: 101 },
  377. { name: '值机序号', prop: 'passengerCheckInNumber', align: 'center' },
  378. { name: '节点标识', prop: 'nodeCode', align: 'center', width: 102 },
  379. { name: '节点名称', prop: 'nodeName', align: 'center' },
  380. { name: '位置标识', prop: 'locationCode', align: 'center' },
  381. // { name: '位置码', prop: '', align: 'center' },
  382. { name: '位置描述', prop: 'locationRemark', align: 'center' },
  383. { name: '读取时间', prop: 'dealTime', align: 'center' },
  384. { name: '结果', prop: 'status', align: 'center' },
  385. { name: '次级代码', prop: 'secondaryCode', align: 'center' },
  386. { name: '操作人', prop: 'AgentCode', align: 'center' },
  387. { name: '设备ID', prop: 'DeviceCode', align: 'center' },
  388. { name: '发往位置', prop: 'toLocation', align: 'center' },
  389. { name: '发往位置描述', prop: 'toLocationMark', align: 'center', width: 113 },
  390. { name: '装载序号', prop: 'LoadSN', align: 'center' },
  391. { name: '容器编号', prop: 'U_Device_ID', align: 'center' }
  392. ],
  393. baggageTableData: [],
  394. spanArr: [],
  395. pos: 0,
  396. loopEvent:null
  397. }
  398. },
  399. computed: {
  400. lineWidth() {
  401. for (let i = this.stepData.length - 1; i > -1; i--) {
  402. if (this.stepData[i].DealTime) {
  403. return (i * 100) / (this.stepData.length - 1) + '%'
  404. }
  405. }
  406. return 0
  407. }
  408. },
  409. // watch: {
  410. // infoBtn(val) {
  411. // if (val === '跟踪报文') {
  412. // const { BagSN: bagNo, FlightNO: flightNo, FlightDate: flightDate } = this.queryData
  413. // const params = { flightNo, flightDate, bagNo }
  414. // this.baggageMessageQuery(params)
  415. // }
  416. // }
  417. // },
  418. mounted() {
  419. this.queryData = this._.cloneDeep(this.$route.query)
  420. // console.log(this.queryData)
  421. let that = this
  422. this.loopEvent = setInterval(function(){
  423. that.queryBaggageAll()
  424. },3000)
  425. },
  426. methods: {
  427. // objectSpanMethod({ row, column, rowIndex, columnIndex }) {
  428. // if (columnIndex < 4) {
  429. // const _row = this.spanArr[rowIndex]
  430. // const _col = _row > 0 ? 1 : 0
  431. // return {
  432. // rowspan: _row,
  433. // colspan: _col
  434. // }
  435. // }
  436. // },
  437. initTableData(tableData) {
  438. const spanArr = []
  439. let pos = 0
  440. for (let i = 0; i < tableData.length; i++) {
  441. if (i === 0) {
  442. spanArr.push(1)
  443. } else {
  444. if (
  445. tableData[i]['flightNo'] === tableData[i - 1]['flightNo'] &&
  446. tableData[i]['flightDate'] === tableData[i - 1]['flightDate']&&
  447. tableData[i]['departureAirport'] === tableData[i - 1]['departureAirport']&&
  448. tableData[i]['landingAirport'] === tableData[i - 1]['landingAirport']
  449. ) {
  450. spanArr[pos] += 1
  451. spanArr.push(0)
  452. } else {
  453. spanArr.push(1)
  454. pos = i
  455. }
  456. }
  457. }
  458. this.spanArr = spanArr
  459. this.pos = pos
  460. },
  461. tableSpanMethod({ row, column, rowIndex, columnIndex }) {
  462. if (['flightNo', 'flightDate','departureAirport','landingAirport'].includes(column['property'])) {
  463. const _row = this.spanArr[rowIndex]
  464. const _col = _row > 0 ? 1 : 0
  465. return {
  466. rowspan: _row,
  467. colspan: _col
  468. }
  469. }
  470. },
  471. // 行李详情基础信息
  472. queryBaggageBasicInfo(dataContent) {
  473. return myQuery(queryMap.baggageBasicInfoByID, ...dataContent)
  474. },
  475. // 行李详情追踪链
  476. queryBaggageTrack(dataContent) {
  477. return myQuery(queryMap.baggageTrackByID, ...dataContent)
  478. },
  479. // 行李详情表格
  480. queryBaggageDetails(dataContent) {
  481. return myQuery(queryMap.baggageDetailsByID, ...dataContent)
  482. },
  483. async queryBaggageAll(queryData = this.queryData) {
  484. const { FlightNO, FlightDate, BagSN } = queryData
  485. const dataContent = [FlightNO, FlightDate, BagSN]
  486. try {
  487. const [
  488. baggageBasicInfo,
  489. // baggageTrack,
  490. baggageDetails
  491. ] = await Promise.all([
  492. this.queryBaggageBasicInfo(dataContent),
  493. // this.queryBaggageTrack(new Array(2).fill(dataContent).flat()),
  494. this.queryBaggageDetails(new Array(6).fill(dataContent).flat())
  495. ])
  496. baggageBasicInfo.length && (this.baggageBasicInfo = baggageBasicInfo[0])
  497. // this._.sortBy(baggageTrack, item => item.DealTime).forEach((item, index) => {
  498. // item['DealTime'] = item['DealTime'].replace('T', '\n')
  499. // item.NodeNameEN && this.stepData.splice(index, 1, item)
  500. // })
  501. let baggageDetailsData = this._.sortBy(baggageDetails, ['flightDate','dealTime'])
  502. this.baggageTableData = baggageDetailsData.map((item, index) => {
  503. this.stepData.splice(index, 1, {
  504. NodeNameEN: item.nodeCode,
  505. DealTime: item.dealTime.replace('T', '\n')
  506. })
  507. if(item['dealTime'].split('T').length>1){
  508. item['dealTime'] = item['dealTime'].split('T')[1]
  509. }
  510. item['departureAirport'] = `${item['departureAirport']}\n${item['departureTime'].split('T')[1]}`
  511. item['landingAirport'] = `${item['landingAirport']}\n${item['landingTime'].split('T')[1]}`
  512. return item
  513. })
  514. this.initTableData(this.baggageTableData)
  515. } catch (error) {
  516. console.log('错误', error)
  517. }
  518. },
  519. async baggageMessageQuery(params) {
  520. try {
  521. const result = await BaggageMessageQuery(params)
  522. // console.log(result.returnData)
  523. this.messageList = result.returnData
  524. } catch (error) {
  525. console.log(error)
  526. }
  527. }
  528. },
  529. beforeDestroy() {
  530. clearInterval(this.loopEvent);
  531. },
  532. }
  533. </script>
  534. <style lang="scss">
  535. .radioBtn {
  536. padding: 5px;
  537. background: #000d2a;
  538. .el-radio-button__inner {
  539. background: #000d2a;
  540. color: #fff;
  541. border: none;
  542. font-weight: bold;
  543. }
  544. .el-radio-button:first-child .el-radio-button__inner {
  545. border: none;
  546. }
  547. }
  548. </style>
  549. <style lang="scss" scoped>
  550. .baggage-view {
  551. width: 100%;
  552. height: calc(100vh - 81px);
  553. overflow: hidden;
  554. background: #dfe3ea;
  555. padding: 8px 8px 0;
  556. .part1 {
  557. width: 100%;
  558. height: 232px;
  559. background: #041741;
  560. padding: 16px 30px;
  561. .title {
  562. font-size: 18px;
  563. font-weight: bold;
  564. color: #ffffff;
  565. width: 320px;
  566. display: flex;
  567. flex-direction: row;
  568. justify-content: space-between;
  569. align-items: center;
  570. }
  571. .part1_info {
  572. width: 100%;
  573. color: #fff;
  574. font-size: 14px;
  575. font-weight: 400;
  576. color: #ffffff;
  577. > .el-row > .el-col {
  578. height: 38px;
  579. line-height: 38px;
  580. display: flex;
  581. .label {
  582. flex-basis: 126px;
  583. text-align: right;
  584. }
  585. .content {
  586. flex: 1;
  587. margin: 0;
  588. white-space: nowrap;
  589. overflow: hidden;
  590. text-overflow: ellipsis;
  591. }
  592. }
  593. }
  594. }
  595. .part2 {
  596. margin: 8px 0;
  597. width: 100%;
  598. padding: 24px 30px;
  599. background: #ffffff;
  600. display: flex;
  601. flex-direction: row;
  602. justify-content: space-between;
  603. align-items: center;
  604. .part2_info {
  605. display: flex;
  606. flex-direction: row;
  607. justify-content: flex-start;
  608. align-items: center;
  609. .title {
  610. font-size: 18px;
  611. font-weight: bold;
  612. color: #303133;
  613. margin-right: 42px;
  614. }
  615. .type {
  616. font-size: 18px;
  617. font-weight: bold;
  618. margin-right: 80px;
  619. }
  620. .warn {
  621. color: #df3559;
  622. }
  623. .normal {
  624. color: #519f6b;
  625. }
  626. .step {
  627. height: 80px;
  628. width: 1430px;
  629. position: relative;
  630. .baggage-track-chart {
  631. display: flex;
  632. flex-direction: row;
  633. justify-content: space-between;
  634. align-items: center;
  635. width: 100%;
  636. overflow-x: scroll;
  637. overflow-y: hidden;
  638. }
  639. .stepLine {
  640. width: 100%;
  641. height: 20px;
  642. background: #afb4bf;
  643. position: absolute;
  644. top: 50%;
  645. margin-top: -10px;
  646. border-radius: 10px;
  647. .stepLineBlue {
  648. position: absolute;
  649. height: 100%;
  650. z-index: 1;
  651. background: #041741;
  652. border-radius: 10px;
  653. }
  654. }
  655. .stepItem {
  656. width: 80px;
  657. height: 80px;
  658. background: #afb4bf;
  659. border-radius: 50%;
  660. z-index: 1;
  661. text-align: center;
  662. font-weight: bold;
  663. color: #ffffff;
  664. font-size: 12px;
  665. display: flex;
  666. flex-direction: column;
  667. align-content: space-around;
  668. align-items: center;
  669. // padding-top: 19px;
  670. justify-content: center;
  671. .head {
  672. font-size: 14px;
  673. }
  674. }
  675. .activeItem {
  676. background: #041741;
  677. }
  678. }
  679. }
  680. }
  681. .part3 {
  682. width: 100%;
  683. height: calc(100% - 232px - 146px);
  684. ::v-deep .el-table {
  685. width: 100%;
  686. height: 100%;
  687. .el-table__cell {
  688. background: #f0f3f7;
  689. }
  690. &.el-table--striped {
  691. .el-table__body tr.el-table__row--striped td.el-table__cell,
  692. .el-table__header .el-table__cell {
  693. background: #ffffff;
  694. }
  695. }
  696. .cell {
  697. word-spacing: 0;
  698. font-size: 14px;
  699. font-family: Helvetica, 'Microsoft YaHei';
  700. font-weight: 400;
  701. color: #303133;
  702. white-space: pre-line;
  703. }
  704. }
  705. }
  706. .part4 {
  707. width: 100%;
  708. height: calc(100vh - 81px - 232px);
  709. .head {
  710. padding: 16px 24px 11px 30px;
  711. background: transparent;
  712. display: flex;
  713. justify-content: space-between;
  714. .title {
  715. line-height: 30px;
  716. font-size: 18px;
  717. font-weight: bold;
  718. color: #303133;
  719. }
  720. }
  721. .main {
  722. height: calc(100% - 57px);
  723. overflow-y: auto;
  724. overflow-x: hidden;
  725. ::v-deep .el-row {
  726. flex-wrap: wrap;
  727. .card {
  728. width: 100%;
  729. min-height: 330px;
  730. padding: 24px 0 0 32px;
  731. background: #ffffff;
  732. box-shadow: 0px 3px 2px 0px rgba(0, 0, 0, 0.29);
  733. margin-bottom: 24px;
  734. > .message-date {
  735. width: 160px;
  736. height: 26px;
  737. line-height: 14px;
  738. font-size: 14px;
  739. font-family: Helvetica;
  740. color: #afb4bf;
  741. border-bottom: 1px solid #afb4bf;
  742. margin-bottom: 18px;
  743. }
  744. > .message-content {
  745. white-space: pre-line;
  746. line-height: 24px;
  747. font-size: 14px;
  748. color: #303133;
  749. }
  750. }
  751. }
  752. }
  753. }
  754. .btns {
  755. height: 30px;
  756. display: flex;
  757. .el-button {
  758. margin-left: 10px;
  759. width: 30px;
  760. display: flex;
  761. align-items: center;
  762. justify-content: center;
  763. }
  764. }
  765. }
  766. ::v-deep .dialog-check-cols .el-tree {
  767. &.has-children .el-tree-node > .el-tree-node__children {
  768. display: flex;
  769. flex-wrap: wrap;
  770. }
  771. &.no-children {
  772. display: flex;
  773. flex-wrap: wrap;
  774. }
  775. }
  776. </style>