index.vue 25 KB

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