index.vue 25 KB

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