index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873
  1. <!--
  2. * @Author: zk
  3. * @Date: 2022-01-17 10:39:22
  4. * @LastEditTime: 2022-06-21 17:52:33
  5. * @LastEditors: your name
  6. * @Description: 进港01
  7. -->
  8. <template>
  9. <div class="arrival-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.planLandingApt"
  49. :value="item.planLandingApt"
  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(1)"
  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(1)"
  143. >搜索</el-button>
  144. </el-form-item>
  145. <el-form-item v-is="['is_timeIcon']">
  146. <TimeZoneSelector />
  147. </el-form-item>
  148. <el-form-item v-is="['is_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. >
  198. <el-table-column
  199. v-for="childCol in col.children"
  200. :key="childCol.prop"
  201. :prop="childCol.prop"
  202. :label="childCol.label"
  203. :width="childCol.width"
  204. :formatter="tableFormat"
  205. >
  206. <template #header>
  207. <el-tooltip
  208. :content="childCol.desc || childCol.label"
  209. placement="top"
  210. >
  211. <TableHeaderCell
  212. :label="childCol.label"
  213. :filter-options="tableDataFilters[childCol.prop]"
  214. :filter-values.sync="filterValues[childCol.prop]"
  215. :sortable="childCol.sortable"
  216. :sort-rule.sync="tableDataSortRules[childCol.prop]"
  217. />
  218. </el-tooltip>
  219. </template>
  220. </el-table-column>
  221. </el-table-column>
  222. </el-table>
  223. </div>
  224. <!--列设置-->
  225. <Dialog
  226. :flag="dialogFlag"
  227. class="dialog-check-cols"
  228. >
  229. <div class="col-dialog">
  230. <div class="title">列设置</div>
  231. <div class="content">
  232. <el-tree
  233. :data="tableCols"
  234. :class="colsCheckClass"
  235. show-checkbox
  236. node-key="index"
  237. :default-expand-all="true"
  238. :props="{
  239. label: 'label',
  240. children: 'children'
  241. }"
  242. :default-checked-keys="checkedKeysTemp"
  243. @check="handleCheck"
  244. />
  245. </div>
  246. <div class="foot right t30">
  247. <el-button
  248. size="medium"
  249. class="r24"
  250. type="primary"
  251. @click="onCheck"
  252. >确定</el-button>
  253. <el-button
  254. size="medium"
  255. @click="hide"
  256. >取消</el-button>
  257. </div>
  258. </div>
  259. </Dialog>
  260. </div>
  261. </template>
  262. <script>
  263. import Dialog from '@/layout/components/Dialog'
  264. import TimeZoneSelector from '@/components/TimeZoneSelector'
  265. import terminalMixin from '../../mixins/terminal'
  266. import formMixin from '../../mixins/form'
  267. import tableColsMixin from '../../mixins/tableCols'
  268. import timeZoneMixin from '../../mixins/timeZone'
  269. import { getQuery } from '@/api/flight'
  270. import TableHeaderCell from '@/components/TableHeaderCell'
  271. import { setTableFilters, throttledExportToExcel } from '@/utils/table'
  272. export default {
  273. name: 'DepartureTerminalView',
  274. components: { Dialog, TimeZoneSelector, TableHeaderCell },
  275. mixins: [terminalMixin, formMixin, tableColsMixin, timeZoneMixin],
  276. data() {
  277. return {
  278. orderNum: ['0', '0', '0', '0', '0', '0'], // 默认总数
  279. popoverVisible: false,
  280. // 初始表头
  281. tableCols: [
  282. {
  283. prop: 'flightInfo',
  284. label: '航班信息',
  285. width: 185,
  286. fixed: 'left',
  287. children: [
  288. {
  289. prop: 'flightNO',
  290. label: '航班号',
  291. desc: '指航班编号',
  292. width: 80,
  293. filterable: true,
  294. sortable: true
  295. },
  296. {
  297. prop: 'flightDate',
  298. label: '执飞日期',
  299. desc: '指航班计划起飞日期(不变的,机票上),不是预计起飞日期(预计起飞时间可能多个),也不是实际起飞日期(实际起飞等于最后预计)',
  300. width: 105,
  301. filterable: true,
  302. sortable: true
  303. },
  304. {
  305. prop: 'arrivalTime',
  306. label: '到港时间',
  307. desc: '指航班预计降落时间,数据是变化的,仅显示最新结果',
  308. width: 150,
  309. filterable: true,
  310. sortable: true
  311. },
  312. {
  313. prop: 'departureAirport',
  314. label: '起飞航站',
  315. desc: '指航班执飞航段的起飞航站,以航站三字码显示',
  316. width: 85,
  317. filterable: true,
  318. sortable: true
  319. },
  320. {
  321. prop: 'arrivalTerminal',
  322. label: '到达航站楼',
  323. desc: '指航班执飞航段的目的航站的航站楼代码',
  324. width: 100,
  325. filterable: true,
  326. sortable: true
  327. },
  328. {
  329. prop: 'luggageCarousel',
  330. label: '行李转盘',
  331. desc: '指航班进港,旅客提取行李转盘的代码',
  332. width: 85,
  333. filterable: true,
  334. sortable: true
  335. },
  336. {
  337. prop: 'parkingSpace',
  338. label: '停机位',
  339. desc: '指航班的停机位代码,数据是变化的,仅显示最新信息',
  340. filterable: true,
  341. sortable: true
  342. }
  343. ]
  344. },
  345. {
  346. prop: 'originAirportBaggageInfo',
  347. label: '始飞站行李信息',
  348. children: [
  349. {
  350. prop: 'checkIns',
  351. label: '值机',
  352. desc: '指已办理值机托运的行李数量,含取消托运的行李数量,含未激活'
  353. },
  354. {
  355. prop: 'projectedLoad',
  356. label: '预计装载',
  357. desc: '指已办理值机托运的行李数量,不含取消托运的行李数量,不包含未激活'
  358. },
  359. {
  360. prop: 'loadedQuantity',
  361. label: '已装载',
  362. desc: '指实际装机完成的行李数量,不包含取消托运的行李数量'
  363. }
  364. ]
  365. },
  366. {
  367. prop: 'arrvivalBaggageInfo',
  368. label: '到达行李信息',
  369. children: [
  370. {
  371. prop: 'numberOfDestinationArrivals',
  372. label: '到达',
  373. desc: '指行李到达提取转盘的行李数量,数据是变化的,仅显示最新信息'
  374. },
  375. {
  376. prop: 'endPointNotReached',
  377. label: '未到达',
  378. desc: '指行李仍未到达提取转盘的行李数量,数据是变化的,仅显示最新信息'
  379. },
  380. {
  381. prop: 'specialQuantity',
  382. label: '特殊',
  383. desc: '指非正常行李的数量,包括(装笼动物、乘务员行李、易碎行李、VIP 行李等),参考 BSM 报文.E 项',
  384. width: 65
  385. },
  386. {
  387. prop: 'numberOfClaims',
  388. label: '理赔',
  389. desc: '指航班收到旅客申请理赔的行李数量',
  390. width: 65
  391. }
  392. ]
  393. },
  394. {
  395. prop: 'uninstallInfo',
  396. label: '卸载状态',
  397. children: [
  398. {
  399. prop: 'uninstalled',
  400. label: '已卸载',
  401. desc: '指卸机的行李数量,数据是变化的,仅显示最新信息'
  402. },
  403. {
  404. prop: 'numberToBeUninstalled',
  405. label: '待卸载',
  406. desc: '指仍未卸机的行李数量,数据是变化的,仅显示最新信息'
  407. }
  408. ]
  409. },
  410. {
  411. prop: 'terminationdBaggageInfo',
  412. label: '终止行李',
  413. children: [
  414. {
  415. prop: 'terminateArrivalQuantity',
  416. label: '到达',
  417. desc: '指旅客已到达目的站的行李数量,数据是变化的,仅显示最新信息'
  418. },
  419. {
  420. prop: 'terminateUnreachedQuantity',
  421. label: '未到达',
  422. desc: '指未到达目的站的行李数量,数据是变化的,仅显示最新信息'
  423. }
  424. ]
  425. },
  426. {
  427. prop: 'transferBaggageInfo',
  428. label: '转运行李',
  429. children: [
  430. {
  431. prop: 'quantityShipped',
  432. label: '已转运',
  433. desc: '指当前航班中转出的行李已完成转运的行李数量,数据是变化的,仅显示最新信息'
  434. },
  435. {
  436. prop: 'undeliveredQuantity',
  437. label: '未转运',
  438. desc: '指当前航班中转出的行李未完成转运的行李数量,数据是变化的,仅显示最新信息'
  439. }
  440. ]
  441. },
  442. {
  443. prop: 'baggageDistributionInfo',
  444. label: '行李分布',
  445. children: [
  446. {
  447. prop: 'numberOfContainers',
  448. label: '容器',
  449. desc: '指当前航班使用容器装载的行李数量,数据是变化的,仅显示最新信息'
  450. },
  451. {
  452. prop: 'numberOfBulk',
  453. label: '散装',
  454. desc: '指当前航班没有使用容器装载的行李数量,数据是变化的,仅显示最新信息',
  455. width: 65
  456. }
  457. ]
  458. }
  459. ],
  460. tableDataSortRules: {
  461. flightCanceled: 'ascending'
  462. },
  463. loading: false,
  464. AirportList: [],
  465. loopEvent: null,
  466. arrivalCount: 0,
  467. baggageCount: 0,
  468. hasSetTableScroll: false,
  469. table: null
  470. }
  471. },
  472. computed: {
  473. singleDay() {
  474. return this.startDate === this.endDate
  475. }
  476. },
  477. mounted() {
  478. this.getAirPortData()
  479. this.table = this.$refs.table.bodyWrapper
  480. const that = this
  481. this.table.addEventListener('scroll', () => {
  482. that.scrollTop = this.table.scrollTop
  483. })
  484. },
  485. activated() {
  486. this.table.scrollTop = this.scrollTop
  487. this.getTableData()
  488. const that = this
  489. this.loopEvent = setInterval(function () {
  490. that.getTableData()
  491. }, 3000)
  492. },
  493. deactivated() {
  494. if (this.loopEvent) {
  495. clearInterval(this.loopEvent)
  496. this.loopEvent = null
  497. }
  498. },
  499. beforeDestroy() {
  500. if (this.loopEvent) {
  501. clearInterval(this.loopEvent)
  502. this.loopEvent = null
  503. }
  504. },
  505. methods: {
  506. resetLoopEvent() {
  507. this.loading = true
  508. this.hasSetTableScroll = false
  509. if (this.loopEvent) {
  510. clearInterval(this.loopEvent)
  511. }
  512. this.getTableData()
  513. const that = this
  514. this.loopEvent = setInterval(function () {
  515. that.getTableData()
  516. }, 3000)
  517. },
  518. airPortChange() {
  519. this.resetLoopEvent()
  520. },
  521. dateChangeHandler() {
  522. this.resetLoopEvent()
  523. },
  524. // 选择机场
  525. async getAirPortData() {
  526. try {
  527. const res = await getQuery({
  528. id: DATACONTENT_ID.arrivalAirId,
  529. dataContent: []
  530. })
  531. if (Number(res.code) === 0) {
  532. this.AirportList = this._.orderBy(res.returnData.listValues, o => o.planLandingApt)
  533. this.formData.currentAirport = 'PEK'
  534. this.resetLoopEvent()
  535. } else {
  536. this.$message.error(res.message)
  537. }
  538. } catch (error) {
  539. console.log('出错了', error.message || error)
  540. }
  541. },
  542. tableRowClassName({ row, rowIndex }) {
  543. const classes = []
  544. if (row.flightStatus === 'DLY') {
  545. classes.push('bgl-delayed')
  546. }
  547. if (row.flightStatus === 'CAN') {
  548. classes.push('bgl-canceled')
  549. }
  550. if (row.hasArrived) {
  551. classes.push('bgl-hui')
  552. if (rowIndex === this.arrivalCount - 1) {
  553. classes.push('redBorder')
  554. }
  555. }
  556. return classes.join(' ')
  557. },
  558. headerCellClass({ row, column }) {
  559. const classes = []
  560. const rule = this.tableDataSortRules[column.property]
  561. if (rule) {
  562. classes.push(rule)
  563. }
  564. return classes.join(' ')
  565. },
  566. // 获取表单下拉框数据
  567. // getFormData(params) {
  568. // this.relatedAirportQuery({
  569. // ...params,
  570. // type: 'OUT'
  571. // })
  572. // this.outgoingAirlineQuery(params)
  573. // this.craftTypeQuery(params)
  574. // this.flightAttrQuery(params)
  575. // },
  576. // 获取表格数据
  577. async getTableData() {
  578. if (!this.formData.currentAirport || !this.startDate || !this.endDate) {
  579. return
  580. }
  581. const arr = [this.formData.currentAirport, this.startDate, this.endDate]
  582. try {
  583. const res = await getQuery({
  584. id: DATACONTENT_ID.arrivalTableId,
  585. dataContent: [...arr, ...arr, ...arr]
  586. })
  587. if (Number(res.code) === 0) {
  588. this.initTableData(res.returnData.listValues)
  589. } else {
  590. console.log(res.message)
  591. }
  592. this.loading = false
  593. } catch (error) {
  594. if (this.loopEvent) {
  595. clearInterval(this.loopEvent)
  596. this.loopEvent = null
  597. }
  598. this.loading = false
  599. console.log('出错了', error.message || error)
  600. }
  601. },
  602. initTableData(tableData) {
  603. this.arrivalCount = 0
  604. this.baggageCount = 0
  605. tableData.forEach(item => {
  606. item['flightCanceled'] = item['flightStatus'] === 'CAN' ? 1 : 0
  607. if (this.hasArrived(item)) {
  608. this.arrivalCount++
  609. }
  610. this.baggageCount = this.baggageCount + item.projectedLoad
  611. })
  612. this.tableData = this._.orderBy(tableData, ['hasArrived', 'arrivalTime'], ['desc', 'asc'])
  613. setTableFilters(this.tableData, this.tableDataFilters)
  614. this.toOrderNum(this.baggageCount)
  615. // setInterval(() => {
  616. // this.baggageCount = this.baggageCount+1;
  617. // // 这里输入数字即可调用
  618. // }, 2000);
  619. this.$nextTick(() => {
  620. this.setTableScroll()
  621. })
  622. },
  623. hasArrived(flight) {
  624. if (flight.arrivalTime) {
  625. const now = new Date()
  626. const arrivalTime = new Date(flight.arrivalTime)
  627. flight['hasArrived'] = now > arrivalTime && !flight['flightCanceled']
  628. } else {
  629. flight['hasArrived'] = false
  630. }
  631. return flight['hasArrived']
  632. },
  633. setTableScroll() {
  634. if (!this.singleDay || this.hasSetTableScroll || this.arrivalCount === 0) {
  635. return
  636. }
  637. const table = this.$refs['table'].$el
  638. const scrollParent = table.querySelector('.el-table__body-wrapper')
  639. if (scrollParent.scrollHeight <= scrollParent.offsetHeight) {
  640. return
  641. }
  642. const lastRow = table.querySelectorAll('.el-table__body tr')[this.arrivalCount - 1]
  643. setTimeout(() => {
  644. const scrollMid = lastRow.offsetTop + lastRow.offsetHeight - scrollParent.offsetHeight / 2
  645. const scrollMax = scrollParent.scrollHeight - scrollParent.offsetHeight
  646. if (scrollMid > 0) {
  647. const scrollHeight = Math.min(scrollMid, scrollMax)
  648. scrollParent.scrollTo(0, scrollHeight)
  649. }
  650. }, 0)
  651. this.hasSetTableScroll = true
  652. },
  653. setNumberTransform() {
  654. const numberItems = this.$refs.numberItem // 拿到数字的ref,计算元素数量
  655. const numberArr = this.orderNum.filter(item => !isNaN(item))
  656. // 结合CSS 对数字字符进行滚动,显示订单数量
  657. for (let index = 0; index < numberItems.length; index++) {
  658. const elem = numberItems[index]
  659. elem.style.transform = `translate(-50%, -${numberArr[index] * 10}%)`
  660. }
  661. },
  662. toOrderNum(num) {
  663. num = num.toString()
  664. if (num.length < 6) {
  665. num = '0' + num // 如未满八位数,添加"0"补位
  666. this.toOrderNum(num) // 递归添加"0"补位
  667. } else if (num.length >= 6) {
  668. this.orderNum = num.split('') // 将其便变成数据,渲染至滚动数组
  669. } else {
  670. // 订单总量数字超过八位显示异常
  671. this.$message.warning('总量数字过大')
  672. }
  673. this.setNumberTransform()
  674. },
  675. exportHandler(refName, tableName) {
  676. if (this.loading) {
  677. return
  678. }
  679. const table = this.$refs[refName].$el.cloneNode(true)
  680. const fileName = `${tableName}-${this.currentAirport}-${this.startDate}-${this.endDate}.xlsx`
  681. throttledExportToExcel(table, tableName, fileName)
  682. }
  683. }
  684. }
  685. </script>
  686. <style lang="scss" scoped>
  687. .terminal-form-wrap {
  688. padding-top: 11px;
  689. padding-left: 5px;
  690. ::v-deep .form {
  691. display: flex;
  692. justify-content: space-between;
  693. .form-left {
  694. flex: 1;
  695. }
  696. .form-right {
  697. flex: 0 1 auto;
  698. }
  699. .el-form-item {
  700. margin-bottom: 0px;
  701. margin-right: 8px;
  702. button,
  703. input,
  704. optgroup,
  705. select,
  706. textarea {
  707. font-family: Helvetica, 'Microsoft YaHei';
  708. font-size: 14px;
  709. }
  710. .el-switch__label {
  711. color: #303133;
  712. }
  713. .el-form-item__error {
  714. z-index: 10;
  715. }
  716. }
  717. .btn-img {
  718. position: relative;
  719. top: 6px;
  720. }
  721. }
  722. .box-item {
  723. position: relative;
  724. height: 50px;
  725. font-size: 18px;
  726. line-height: 32px;
  727. text-align: center;
  728. list-style: none;
  729. color: #2d7cff;
  730. writing-mode: vertical-lr;
  731. text-orientation: upright;
  732. /*文字禁止编辑*/
  733. -moz-user-select: none; /*火狐*/
  734. -webkit-user-select: none; /*webkit浏览器*/
  735. -ms-user-select: none; /*IE10*/
  736. -khtml-user-select: none; /*早期浏览器*/
  737. user-select: none;
  738. /* overflow: hidden; */
  739. p {
  740. line-height: 32px;
  741. writing-mode: horizontal-tb !important;
  742. text-orientation: none !important;
  743. /*文字禁止编辑*/
  744. -moz-user-select: none; /*火狐*/
  745. -webkit-user-select: none; /*webkit浏览器*/
  746. -ms-user-select: none; /*IE10*/
  747. -khtml-user-select: none; /*早期浏览器*/
  748. user-select: none;
  749. margin-top: 5px;
  750. }
  751. }
  752. /* 默认逗号设置 */
  753. .mark-item {
  754. width: 10px;
  755. height: 32px;
  756. margin-right: 5px;
  757. line-height: 10px;
  758. font-size: 18px;
  759. position: relative;
  760. & > span {
  761. position: absolute;
  762. width: 100%;
  763. bottom: 0;
  764. writing-mode: vertical-rl;
  765. text-orientation: upright;
  766. }
  767. }
  768. /*滚动数字设置*/
  769. .number-item {
  770. width: 41px;
  771. height: 42px;
  772. /* 背景图片 */
  773. // background: url('/images/text-bg-blue.png') no-repeat center center;
  774. // background-size: 100% 100%;
  775. // background: #ccc;
  776. list-style: none;
  777. margin-right: 5px;
  778. // background:rgba(250,250,250,1);
  779. border-radius: 4px;
  780. border: 3px solid rgb(221, 221, 221);
  781. & > span {
  782. position: relative;
  783. display: inline-block;
  784. margin-right: 10px;
  785. width: 100%;
  786. height: 100%;
  787. writing-mode: vertical-rl;
  788. text-orientation: upright;
  789. overflow: hidden;
  790. & > i {
  791. font-style: normal;
  792. position: absolute;
  793. top: 11px;
  794. left: 50%;
  795. transform: translate(-50%, -1%);
  796. transition: transform 1s ease-in-out;
  797. letter-spacing: 10px;
  798. }
  799. }
  800. }
  801. .number-item:last-child {
  802. margin-right: 0;
  803. }
  804. }
  805. .terminal-table {
  806. width: 100%;
  807. ::v-deep .table {
  808. width: 100%;
  809. .cell {
  810. padding: 0;
  811. text-align: center;
  812. font-size: 14px;
  813. font-family: Helvetica, 'Microsoft YaHei';
  814. letter-spacing: 0;
  815. }
  816. .cell-click {
  817. cursor: pointer;
  818. color: #2d7cff;
  819. &.cell-clicked {
  820. color: purple;
  821. }
  822. }
  823. .el-table__header-wrapper,
  824. .el-table__fixed-header-wrapper {
  825. .cell {
  826. font-weight: bold;
  827. color: #101116;
  828. }
  829. .has-gutter {
  830. tr {
  831. .bgl-huang {
  832. background: #fcf0b1;
  833. }
  834. }
  835. }
  836. }
  837. .el-table__body-wrapper,
  838. .el-table__fixed-body-wrapper {
  839. tr.bgl-hui {
  840. background: #d2d6df;
  841. td {
  842. background: #d2d6df;
  843. }
  844. &.redBorder {
  845. position: relative;
  846. &::after {
  847. content: '';
  848. position: absolute;
  849. left: 0;
  850. bottom: 0;
  851. width: 100%;
  852. height: 2px;
  853. background: #e83f82;
  854. }
  855. }
  856. }
  857. tr.bgl-delayed td {
  858. background: #fcf0b1;
  859. }
  860. tr.bgl-canceled td {
  861. background: #f7babe;
  862. }
  863. }
  864. .el-table__cell.is-hidden > * {
  865. visibility: visible;
  866. }
  867. }
  868. }
  869. </style>