index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. <!--
  2. * @Author: zk
  3. * @Date: 2022-01-17 10:39:22
  4. * @LastEditTime: 2022-06-22 17:39:49
  5. * @LastEditors: your name
  6. * @Description: 离港01
  7. -->
  8. <template>
  9. <div class="departure-one">
  10. <!--功能区-表单-->
  11. <div ref="formWrap" class="terminal-form-wrap">
  12. <el-form ref="form" :inline="true" :model="formData" :rules="rules" class="form">
  13. <div class="form-left">
  14. <el-form-item prop="currentAirport">
  15. <!-- <el-cascader
  16. v-model="formData.currentAirport"
  17. style="width:144px;margin-left:10px"
  18. placeholder="全部机场"
  19. size="small"
  20. :options="currentAirportList"
  21. :props="currentAirportProps"
  22. collapse-tags
  23. clearable
  24. filterable
  25. @change="setCurrentAirport"
  26. /> -->
  27. <el-select v-model="formData.currentAirport" class="input-shadow" size="small" filterable placeholder="请选择机场" @change="airPortChange">
  28. <el-option v-for="(item, index) in AirportList" :key="index" :label="item.planDepartureApt" :value="item.planDepartureApt" />
  29. </el-select>
  30. </el-form-item>
  31. <!-- <el-form-item prop="startDate">
  32. <el-date-picker
  33. v-model="formData.startDate"
  34. class="input-shadow"
  35. style="width:216px;"
  36. size="small"
  37. type="date"
  38. value-format="yyyy-MM-dd"
  39. placeholder="开始时间"
  40. @change="startDateChangeHandler"
  41. />
  42. </el-form-item>
  43. <el-form-item prop="endDate">
  44. <el-date-picker
  45. v-model="formData.endDate"
  46. class="input-shadow"
  47. style="width:216px;"
  48. size="small"
  49. type="date"
  50. value-format="yyyy-MM-dd"
  51. placeholder="结束时间"
  52. @change="endDateChangeHandler"
  53. />
  54. </el-form-item> -->
  55. <el-form-item prop="flightDate" label="航班日期">
  56. <el-date-picker v-model="formData.flightDate" size="small" type="daterange" value-format="yyyy-MM-dd" start-placeholder="开始日期" end-placeholder="结束日期" :picker-options="dateRangePickerOptions" @change="dateChangeHandler" />
  57. </el-form-item>
  58. <el-form-item>
  59. <div class="box-item">
  60. <p>预计装载总数:</p>
  61. <li v-for="(item, index) in orderNum" :key="index" :class="{ 'number-item': !isNaN(item), 'mark-item': isNaN(item) }">
  62. <span v-if="!isNaN(item)">
  63. <i ref="numberItem">0123456789</i>
  64. </span>
  65. <span v-else class="comma">{{ item }}</span>
  66. </li>
  67. </div>
  68. </el-form-item>
  69. </div>
  70. <div class="form-right" @keyup.enter="onSubmit(0)">
  71. <el-form-item prop="search">
  72. <el-popover :value="popoverVisible" placement="bottom" trigger="manual">
  73. <span>请输入航班号(示例:CA1234)或行李牌号(示例:1234567890)</span>
  74. <el-input slot="reference" v-model="formData.search" class="input-shadow" style="width: 240px; margin-left: 105px" size="small" placeholder="请输入内容" prefix-icon="el-icon-search" clearable @focus="popoverVisible = true" @blur="popoverVisible = false" />
  75. </el-popover>
  76. </el-form-item>
  77. <el-form-item>
  78. <el-button class="btn-shadow" size="mini" type="primary" @click="onSubmit(0)">搜索</el-button>
  79. </el-form-item>
  80. <el-form-item v-is="['i_timeIcon']">
  81. <TimeZoneSelector />
  82. </el-form-item>
  83. <el-form-item>
  84. <img class="btn-img btn-shadow" src="../../../../assets/baggage/ic_setting.png" @click="show">
  85. </el-form-item>
  86. </div>
  87. </el-form>
  88. </div>
  89. <!--表格-->
  90. <div v-loading="loading" class="terminal-table" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.8)">
  91. <el-table ref="table" class="table" :height="computedTableHeight" :data="dealedTableData" :header-cell-class-name="headerCellClass" :row-class-name="tableRowClassName" :cell-class-name="cellClass" show-summary :summary-method="summaryMethod" border stripe fit @cell-click="cellClickHandler">
  92. <el-table-column v-for="col in tableColsCopy" :key="col.prop" :prop="col.prop" :label="col.label" :width="col.width" :fixed="col.fixed" :formatter="tableFormat">
  93. <template #header>
  94. <el-tooltip :content="col.disc" placement="top">
  95. <TableHeaderCell :label="col.label" :filter-options="tableDataFilters[col.prop]" :filter-values.sync="filterValues[col.prop]" :sortable="col.sortable" :sort-rule.sync="tableDataSortRules[col.prop]" />
  96. </el-tooltip>
  97. </template>
  98. </el-table-column>
  99. </el-table>
  100. </div>
  101. <!--列设置-->
  102. <Dialog :flag="dialogFlag" class="dialog-check-cols">
  103. <div class="col-dialog">
  104. <div class="title">列设置</div>
  105. <div class="content">
  106. <el-tree :data="tableCols" :class="colsCheckClass" show-checkbox node-key="index" :default-expand-all="true" :props="{
  107. label: 'label',
  108. children: 'children'
  109. }" :default-checked-keys="checkedKeysTemp" @check="handleCheck" />
  110. </div>
  111. <div class="foot right t30">
  112. <el-button size="medium" class="r24" type="primary" @click="onCheck">确定</el-button>
  113. <el-button size="medium" @click="hide">取消</el-button>
  114. </div>
  115. </div>
  116. </Dialog>
  117. </div>
  118. </template>
  119. <script>
  120. import Dialog from '@/layout/components/Dialog'
  121. import TimeZoneSelector from '@/components/TimeZoneSelector'
  122. import terminalMixin from '../../mixins/terminal'
  123. import formMixin from '../../mixins/form'
  124. import tableColsMixin from '../../mixins/tableCols'
  125. import timeZoneMixin from '../../mixins/timeZone'
  126. import { getQuery } from '@/api/flight'
  127. import TableHeaderCell from '@/components/TableHeaderCell'
  128. import { setTableFilters } from '@/utils/table'
  129. export default {
  130. name: 'DepartureTerminalView',
  131. components: { Dialog, TimeZoneSelector, TableHeaderCell },
  132. mixins: [terminalMixin, formMixin, tableColsMixin, timeZoneMixin],
  133. data () {
  134. return {
  135. orderNum: ['0', '0', '0', '0', '0', '0'], // 默认总数
  136. popoverVisible: false,
  137. // 初始表头
  138. tableCols: [
  139. {
  140. prop: 'flightNO',
  141. label: '航班号',
  142. disc: '指航班编号',
  143. width: 80,
  144. fixed: 'left',
  145. filterable: true,
  146. sortable: true
  147. },
  148. {
  149. prop: 'flightDate',
  150. label: '执飞日期',
  151. disc: '指航班计划起飞日期(不变的,机票上),不是预计起飞日期(预计起飞时间可能多个),也不是实际起飞日期(实际起飞等于最后预计)',
  152. width: 105,
  153. fixed: 'left',
  154. filterable: true,
  155. sortable: true
  156. },
  157. {
  158. prop: 'planDepartureTime',
  159. label: '预计起飞时间',
  160. disc: '指航班预计起飞时间,数据是变化的,仅显示最新结果',
  161. width: 150,
  162. filterable: true,
  163. sortable: true
  164. },
  165. {
  166. prop: 'targetAirport',
  167. label: '目的站',
  168. disc: '指航班执飞航段的目的航站,以航站三字码显示',
  169. filterable: true,
  170. sortable: true
  171. },
  172. {
  173. prop: 'departureBuild',
  174. label: '航站楼',
  175. disc: '指航班执飞航段的目的航站楼',
  176. filterable: true,
  177. sortable: true
  178. },
  179. {
  180. prop: 'bordingGate',
  181. label: '登机口',
  182. disc: '指航班的登机口代码,数据是变化的,仅显示最新信息',
  183. filterable: true,
  184. sortable: true
  185. },
  186. {
  187. prop: 'standForDepartrue',
  188. label: '停机位',
  189. disc: '指航班的停机位代码,数据是变化的,仅显示最新信息',
  190. filterable: true,
  191. sortable: true
  192. },
  193. {
  194. prop: 'checkInTravellerNumber',
  195. label: '托运旅客',
  196. disc: '指航班已办理行李托运业务的旅客人数,含取消托运的旅客人数',
  197. },
  198. {
  199. prop: 'checkInNumber',
  200. label: '值机数',
  201. disc: '指已办理值机托运的行李数量,含取消托运的行李数量,含未激活',
  202. },
  203. {
  204. prop: 'unActive',
  205. label: '未激活',
  206. disc: '指最后的 BSM 报文“.S”中行李状态为“I”的行李数量,含取消托运的行李数量',
  207. },
  208. {
  209. prop: 'preLoad',
  210. label: '预计装载',
  211. disc: '指已办理值机托运的行李数量,不含取消托运的行李数量,不包含未激活',
  212. },
  213. {
  214. prop: 'checkNumber',
  215. label: '安检',
  216. disc: '指进行安检的行李数量,含取消托运的行李数量',
  217. },
  218. {
  219. prop: 'sortNumber',
  220. label: '分拣',
  221. disc: '指已分拣完成的行李数量,含取消托运的行李数量',
  222. },
  223. {
  224. prop: 'loadNumber',
  225. label: '装车',
  226. disc: '指已在分拣口装车完成的行李数量,含取消托运的行李数量',
  227. },
  228. {
  229. prop: 'landingNumber',
  230. label: '装机',
  231. disc: '指装机完成的行李数量,不含取消托运的行李数量',
  232. },
  233. {
  234. prop: 'tounLoad',
  235. label: '待翻减',
  236. disc: '指旅客在办理行李托运后,旅客取消该行李的托运并且行李此时已经过装车节点,而没有完成翻减的行李数量(须翻减总数减去已翻减数)',
  237. },
  238. {
  239. prop: 'unLoad',
  240. label: '已翻减',
  241. disc: '指旅客在办理行李托运后,旅客取消该行李的托运并且行李此时已经过装车节点,且已完成翻减的行李数量',
  242. },
  243. {
  244. prop: 'noCheckInNumber',
  245. label: '取消托运',
  246. disc: '指旅客在办理行李托运后,又取消托运的行李总数量',
  247. },
  248. {
  249. prop: 'noBSM',
  250. label: '无BSM',
  251. disc: '行李有处理信息(BPM)但无值机信息(BSM)的行李数量',
  252. },
  253. {
  254. prop: 'warning',
  255. label: '风险预警',
  256. disc: '指依据航班信息中预计起飞时间和当前时间差,与根据分拣到停机位设置的报警阈值对比,超过阈值的为风险行李,本项显示风险预警行李数量',
  257. },
  258. {
  259. prop: 'exceptions',
  260. label: '离港异常',
  261. disc: '指航班关闭货仓门后,应装而未装的行李数量',
  262. },
  263. {
  264. prop: 'midIn',
  265. label: '中转进行李',
  266. disc: '指从其他航班中转到当前航班的行李数量',
  267. }
  268. ],
  269. tableDataSortRules: {
  270. flightCanceled: 'ascending'
  271. },
  272. loading: false,
  273. AirportList: [],
  274. loopEvent: null,
  275. leaveCount: 0,
  276. baggageCount: 0,
  277. hasSetTableScroll: false
  278. }
  279. },
  280. mounted () {
  281. this.getAirPortData()
  282. },
  283. beforeDestroy () {
  284. if (this.loopEvent) {
  285. clearInterval(this.loopEvent)
  286. this.loopEvent = null
  287. }
  288. },
  289. computed: {
  290. singleDay () {
  291. return this.startDate === this.endDate
  292. }
  293. },
  294. methods: {
  295. resetLoopEvent () {
  296. this.loading = true
  297. this.hasSetTableScroll = false
  298. if (this.loopEvent) {
  299. clearInterval(this.loopEvent)
  300. }
  301. this.getTableData()
  302. const that = this
  303. this.loopEvent = setInterval(function () {
  304. that.getTableData()
  305. }, 3000)
  306. },
  307. airPortChange () {
  308. this.resetLoopEvent()
  309. },
  310. dateChangeHandler () {
  311. this.resetLoopEvent()
  312. },
  313. async getAirPortData () {
  314. try {
  315. const res = await getQuery({
  316. id: DATACONTENT_ID.departureAirMainId,
  317. dataContent: []
  318. })
  319. if (Number(res.code) === 0) {
  320. this.AirportList = this._.orderBy(res.returnData.listValues, o => o.planDepartureApt)
  321. this.formData.currentAirport = 'PEK'
  322. this.resetLoopEvent()
  323. } else {
  324. this.$message.error(res.message)
  325. }
  326. } catch (error) {
  327. console.log('出错了', error)
  328. }
  329. },
  330. tableRowClassName ({ row, rowIndex }) {
  331. const classes = []
  332. if (row.flightStatus === 'DLY') {
  333. classes.push('bgl-delayed')
  334. }
  335. if (row.flightStatus === 'CAN') {
  336. classes.push('bgl-canceled')
  337. }
  338. if (row.hasTakenOff === 0) {
  339. classes.push('bgl-hui')
  340. if (rowIndex === this.leaveCount - 1) {
  341. classes.push('redBorder')
  342. }
  343. }
  344. return classes.join(' ')
  345. },
  346. headerCellClass ({ row, column }) {
  347. const classes = []
  348. if (['warning', 'exceptions', 'midIn'].includes(column.property)) {
  349. classes.push('bgl-huang')
  350. }
  351. const rule = this.tableDataSortRules[column.property]
  352. if (rule) {
  353. classes.push(rule)
  354. }
  355. return classes.join(' ')
  356. },
  357. // 获取表单下拉框数据
  358. // getFormData(params) {
  359. // this.relatedAirportQuery({
  360. // ...params,
  361. // type: 'OUT'
  362. // })
  363. // this.outgoingAirlineQuery(params)
  364. // this.craftTypeQuery(params)
  365. // this.flightAttrQuery(params)
  366. // },
  367. // 获取表格数据
  368. async getTableData () {
  369. if (!this.formData.currentAirport || !this.startDate || !this.endDate) {
  370. return
  371. }
  372. const arr = [this.formData.currentAirport, this.startDate, this.endDate]
  373. try {
  374. const res = await getQuery({
  375. id: DATACONTENT_ID.departureTableMainId,
  376. dataContent: [...arr, ...arr, ...arr]
  377. })
  378. if (Number(res.code) === 0) {
  379. this.initTableData(res.returnData.listValues)
  380. } else {
  381. console.log(res.message)
  382. }
  383. this.loading = false
  384. } catch (error) {
  385. if (this.loopEvent) {
  386. clearInterval(this.loopEvent)
  387. this.loopEvent = null
  388. }
  389. this.loading = false
  390. console.log('出错了', error)
  391. }
  392. },
  393. initTableData (tableData) {
  394. this.leaveCount = 0
  395. this.baggageCount = 0
  396. tableData.forEach(item => {
  397. item['flightCanceled'] = item['flightStatus'] === 'CAN' ? 1 : 0
  398. if (item['hasTakenOff'] === 0 && !item['flightCanceled']) {
  399. this.leaveCount++
  400. }
  401. item['landingNumber'] = item['loadNumber']
  402. this.baggageCount = this.baggageCount + item.preLoad
  403. })
  404. this.tableData = this._.sortBy(tableData, ['hasTakenOff', 'planDepartureTime'])
  405. setTableFilters(this.tableData, this.tableDataFilters)
  406. this.toOrderNum(this.baggageCount)
  407. // setInterval(() => {
  408. // this.baggageCount = this.baggageCount+1;
  409. // // 这里输入数字即可调用
  410. // }, 2000);
  411. this.$nextTick(() => {
  412. this.setTableScroll()
  413. })
  414. },
  415. setTableScroll () {
  416. if (!this.singleDay || this.hasSetTableScroll || this.leaveCount === 0) {
  417. return
  418. }
  419. const table = this.$refs['table'].$el
  420. const scrollParent = table.querySelector('.el-table__body-wrapper')
  421. if (scrollParent.scrollHeight <= scrollParent.offsetHeight) {
  422. return
  423. }
  424. const lastRow = table.querySelectorAll('.el-table__body tr')[this.leaveCount - 1]
  425. setTimeout(() => {
  426. const scrollMid = lastRow.offsetTop + lastRow.offsetHeight - scrollParent.offsetHeight / 2
  427. const scrollMax = scrollParent.scrollHeight - scrollParent.offsetHeight
  428. if (scrollMid > 0) {
  429. const scrollHeight = Math.min(scrollMid, scrollMax)
  430. scrollParent.scrollTo(0, scrollHeight)
  431. }
  432. }, 0)
  433. this.hasSetTableScroll = true
  434. },
  435. setNumberTransform () {
  436. const numberItems = this.$refs.numberItem // 拿到数字的ref,计算元素数量
  437. const numberArr = this.orderNum.filter(item => !isNaN(item))
  438. // 结合CSS 对数字字符进行滚动,显示订单数量
  439. for (let index = 0; index < numberItems.length; index++) {
  440. const elem = numberItems[index]
  441. elem.style.transform = `translate(-50%, -${numberArr[index] * 10}%)`
  442. }
  443. },
  444. toOrderNum (num) {
  445. num = num.toString()
  446. if (num.length < 6) {
  447. num = '0' + num // 如未满八位数,添加"0"补位
  448. this.toOrderNum(num) // 递归添加"0"补位
  449. } else if (num.length >= 6) {
  450. this.orderNum = num.split('') // 将其便变成数据,渲染至滚动数组
  451. } else {
  452. // 订单总量数字超过八位显示异常
  453. this.$message.warning('总量数字过大')
  454. }
  455. this.setNumberTransform()
  456. }
  457. }
  458. }
  459. </script>
  460. <style lang="scss" scoped>
  461. .terminal-form-wrap {
  462. padding-top: 11px;
  463. padding-left: 5px;
  464. ::v-deep .form {
  465. display: flex;
  466. justify-content: space-between;
  467. .form-left {
  468. flex: 1;
  469. }
  470. .form-right {
  471. flex: 0 1 498px;
  472. }
  473. .el-form-item {
  474. margin-bottom: 0px;
  475. margin-right: 8px;
  476. button,
  477. input,
  478. optgroup,
  479. select,
  480. textarea {
  481. font-family: Helvetica, "Microsoft YaHei";
  482. font-size: 14px;
  483. }
  484. .el-switch__label {
  485. color: #303133;
  486. }
  487. .el-form-item__error {
  488. z-index: 10;
  489. }
  490. }
  491. .btn-img {
  492. position: relative;
  493. top: 6px;
  494. }
  495. }
  496. .box-item {
  497. position: relative;
  498. height: 50px;
  499. font-size: 18px;
  500. line-height: 32px;
  501. text-align: center;
  502. list-style: none;
  503. color: #2d7cff;
  504. writing-mode: vertical-lr;
  505. text-orientation: upright;
  506. /*文字禁止编辑*/
  507. -moz-user-select: none; /*火狐*/
  508. -webkit-user-select: none; /*webkit浏览器*/
  509. -ms-user-select: none; /*IE10*/
  510. -khtml-user-select: none; /*早期浏览器*/
  511. user-select: none;
  512. /* overflow: hidden; */
  513. p {
  514. line-height: 32px;
  515. writing-mode: horizontal-tb !important;
  516. text-orientation: none !important;
  517. /*文字禁止编辑*/
  518. -moz-user-select: none; /*火狐*/
  519. -webkit-user-select: none; /*webkit浏览器*/
  520. -ms-user-select: none; /*IE10*/
  521. -khtml-user-select: none; /*早期浏览器*/
  522. user-select: none;
  523. margin-top: 5px;
  524. }
  525. }
  526. /* 默认逗号设置 */
  527. .mark-item {
  528. width: 10px;
  529. height: 32px;
  530. margin-right: 5px;
  531. line-height: 10px;
  532. font-size: 18px;
  533. position: relative;
  534. & > span {
  535. position: absolute;
  536. width: 100%;
  537. bottom: 0;
  538. writing-mode: vertical-rl;
  539. text-orientation: upright;
  540. }
  541. }
  542. /*滚动数字设置*/
  543. .number-item {
  544. width: 41px;
  545. height: 42px;
  546. /* 背景图片 */
  547. background: url(/images/text-bg-blue.png) no-repeat center center;
  548. background-size: 100% 100%;
  549. // background: #ccc;
  550. list-style: none;
  551. margin-right: 5px;
  552. // background:rgba(250,250,250,1);
  553. border-radius: 4px;
  554. border: 3px solid rgb(221, 221, 221);
  555. & > span {
  556. position: relative;
  557. display: inline-block;
  558. margin-right: 10px;
  559. width: 100%;
  560. height: 100%;
  561. writing-mode: vertical-rl;
  562. text-orientation: upright;
  563. overflow: hidden;
  564. & > i {
  565. font-style: normal;
  566. position: absolute;
  567. top: 11px;
  568. left: 50%;
  569. transform: translate(-50%, -1%);
  570. transition: transform 1s ease-in-out;
  571. letter-spacing: 10px;
  572. }
  573. }
  574. }
  575. .number-item:last-child {
  576. margin-right: 0;
  577. }
  578. }
  579. .terminal-table {
  580. width: 100%;
  581. ::v-deep .table {
  582. width: 100%;
  583. .cell {
  584. padding: 0;
  585. text-align: center;
  586. font-size: 14px;
  587. font-family: Helvetica, "Microsoft YaHei";
  588. letter-spacing: 0;
  589. }
  590. .cell-click {
  591. cursor: pointer;
  592. color: #2d7cff;
  593. &.cell-clicked {
  594. color: purple;
  595. }
  596. }
  597. .el-table__header-wrapper,
  598. .el-table__fixed-header-wrapper {
  599. .cell {
  600. font-weight: bold;
  601. color: #101116;
  602. }
  603. .has-gutter {
  604. tr {
  605. .bgl-huang {
  606. background: #fcf0b1;
  607. }
  608. }
  609. }
  610. }
  611. .el-table__body-wrapper,
  612. .el-table__fixed-body-wrapper {
  613. tr.bgl-hui {
  614. td {
  615. background: #d2d6df;
  616. }
  617. &.redBorder {
  618. position: relative;
  619. &::after {
  620. content: "";
  621. position: absolute;
  622. left: 0;
  623. bottom: 0;
  624. width: 100%;
  625. height: 2px;
  626. background: #e83f82;
  627. }
  628. }
  629. }
  630. tr.bgl-delayed td {
  631. background: #fcf0b1;
  632. }
  633. tr.bgl-canceled td {
  634. background: #f7babe;
  635. }
  636. td.cell-tounLoad {
  637. background: lightcoral !important;
  638. position: relative;
  639. &::after {
  640. content: "";
  641. display: block;
  642. width: 100%;
  643. height: 100%;
  644. position: absolute;
  645. top: 0;
  646. left: 0;
  647. border: 2px dashed red;
  648. }
  649. }
  650. .el-table__cell.is-hidden > * {
  651. visibility: visible;
  652. }
  653. }
  654. }
  655. }
  656. </style>