index.vue 24 KB

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