index.vue 24 KB

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