index.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880
  1. <!--
  2. * @Author: zk
  3. * @Date: 2022-01-17 10:39:22
  4. * @LastEditTime: 2022-05-07 16:55:50
  5. * @LastEditors: your name
  6. * @Description: 离港01
  7. -->
  8. <template>
  9. <div class="departure-one">
  10. <!--功能区-表单-->
  11. <div class="departure-form">
  12. <el-form
  13. ref="form"
  14. :inline="true"
  15. :model="formData"
  16. :rules="rules"
  17. class="form"
  18. >
  19. <el-form-item prop="currentAirport">
  20. <!-- <el-cascader
  21. v-model="formData.currentAirport"
  22. style="width:144px;margin-left:10px"
  23. placeholder="全部机场"
  24. size="small"
  25. :options="currentAirportList"
  26. :props="currentAirportProps"
  27. collapse-tags
  28. clearable
  29. filterable
  30. @change="setCurrentAirport"
  31. /> -->
  32. <el-select
  33. v-model="formData.currentAirport"
  34. size="small"
  35. @change="airPortChange"
  36. filterable
  37. placeholder="请选择机场"
  38. >
  39. <el-option
  40. v-for="(item, index) in AirportList"
  41. :key="index"
  42. :label="item.PlanDepartureApt"
  43. :value="item.PlanDepartureApt"
  44. >
  45. </el-option>
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item prop="inboundCarrier">
  49. <el-cascader
  50. v-model="formData.inboundCarrier"
  51. style="width: 164px"
  52. size="small"
  53. :options="carrierProps"
  54. :props="optionProps"
  55. placeholder="进港承运航司"
  56. collapse-tags
  57. clearable
  58. filterable
  59. @change="getTableData"
  60. />
  61. </el-form-item>
  62. <el-form-item prop="outgoingAirline">
  63. <el-cascader
  64. v-model="formData.outgoingAirline"
  65. style="width: 164px"
  66. size="small"
  67. :options="carrierPropsop"
  68. :props="optionPropser"
  69. placeholder="离港承运航司"
  70. collapse-tags
  71. clearable
  72. filterable
  73. @change="getTableData"
  74. />
  75. </el-form-item>
  76. <el-form-item prop="startDate">
  77. <el-date-picker
  78. v-model="formData.startDate"
  79. style="width: 216px"
  80. size="small"
  81. type="date"
  82. value-format="yyyy-MM-dd"
  83. placeholder="开始时间"
  84. @change="setStartDate"
  85. />
  86. </el-form-item>
  87. <el-form-item prop="endDate">
  88. <el-date-picker
  89. v-model="formData.endDate"
  90. style="width: 216px"
  91. size="small"
  92. type="date"
  93. value-format="yyyy-MM-dd"
  94. placeholder="结束时间"
  95. @change="setEndDate"
  96. />
  97. </el-form-item>
  98. <!-- <el-form-item>
  99. <div class="box-item">
  100. <p>预计装载总数:</p>
  101. <li
  102. :class="{ 'number-item': !isNaN(item), 'mark-item': isNaN(item) }"
  103. v-for="(item, index) in orderNum"
  104. :key="index"
  105. >
  106. <span v-if="!isNaN(item)">
  107. <i ref="numberItem">0123456789</i>
  108. </span>
  109. <span class="comma" v-else>{{ item }}</span>
  110. </li>
  111. </div>
  112. </el-form-item> -->
  113. <div style="float: right">
  114. <el-form-item prop="search">
  115. <el-input
  116. v-model="formData.search"
  117. style="width: 240px; margin-left: 105px"
  118. size="small"
  119. placeholder="请输入内容"
  120. prefix-icon="el-icon-search"
  121. clearable
  122. @clear="inputClear"
  123. @keyup.enter="onSubmit(0)"
  124. />
  125. </el-form-item>
  126. <el-form-item>
  127. <el-button size="small" type="primary" @click="onSubmit(0)"
  128. >搜索</el-button
  129. >
  130. </el-form-item>
  131. <!-- <el-form-item>
  132. <el-switch
  133. v-model="formData.switch"
  134. style="margin-left: 40px"
  135. active-text="显示中转"
  136. />
  137. </el-form-item> -->
  138. <!-- <el-form-item v-is="['i_timeIcon']">
  139. <el-dropdown>
  140. <img
  141. class="checkTime msgImg"
  142. src="../../../../assets/departure/ic_time.png"
  143. />切换视角
  144. <el-dropdown-menu slot="dropdown" class="time-zone">
  145. <el-dropdown-item>国内Local/国际UTC</el-dropdown-item>
  146. <el-dropdown-item>Local</el-dropdown-item>
  147. <el-dropdown-item>UTC</el-dropdown-item>
  148. </el-dropdown-menu>
  149. </el-dropdown>
  150. </el-form-item> -->
  151. <el-form-item v-is="['ti_showTransit']">
  152. <el-button size="small" type="primary" @click="changeView"
  153. >切换视角</el-button
  154. >
  155. </el-form-item>
  156. <el-form-item v-is="['i_timeIcon']">
  157. <el-dropdown>
  158. <img
  159. class="checkTime msgImg"
  160. src="../../../../assets/departure/ic_time.png"
  161. />
  162. <el-dropdown-menu slot="dropdown" class="time-zone">
  163. <el-dropdown-item>国内Local/国际UTC</el-dropdown-item>
  164. <el-dropdown-item>Local</el-dropdown-item>
  165. <el-dropdown-item>UTC</el-dropdown-item>
  166. </el-dropdown-menu>
  167. </el-dropdown>
  168. </el-form-item>
  169. <el-form-item>
  170. <img
  171. class="msgImg"
  172. src="../../../../assets/departure/ic_setting.png"
  173. @click="show"
  174. />
  175. </el-form-item>
  176. <!-- <el-form-item>
  177. <el-button
  178. class="btn-square setBtn"
  179. type="primary"
  180. icon="el-icon-s-tools"
  181. size="mini"
  182. @click="show"
  183. />
  184. </el-form-item> -->
  185. </div>
  186. </el-form>
  187. </div>
  188. <!--表格-->
  189. <div
  190. v-loading="loading"
  191. class="departure-table"
  192. element-loading-text="拼命加载中"
  193. element-loading-spinner="el-icon-loading"
  194. element-loading-background="rgba(0, 0, 0, 0.8)"
  195. >
  196. <el-table
  197. ref="table"
  198. :data="tableData"
  199. class="table"
  200. max-height="100%"
  201. :height="computedTableHeight"
  202. show-summary
  203. :summary-method="summaryMethod"
  204. :span-method="arraySpanMethod"
  205. @cell-click="cellClick"
  206. :cell-class-name="cellClass"
  207. border
  208. stripe
  209. >
  210. <el-table-column
  211. v-for="(item, index) in tableColsCopy"
  212. :key="index"
  213. :prop="item.statCode"
  214. :label="item.statName"
  215. >
  216. <el-table-column
  217. v-for="(p, i) in item.children"
  218. :key="i"
  219. :prop="p.statCode"
  220. :label="p.statName"
  221. :formatter="tableFormat"
  222. />
  223. </el-table-column>
  224. </el-table>
  225. </div>
  226. <!--列设置-->
  227. <Dialog :flag="dialogFlag" class="dialog-check-cols">
  228. <div class="col-dialog">
  229. <div class="title">列设置</div>
  230. <div class="content">
  231. <el-tree
  232. :data="tableCols"
  233. :class="colsCheckClass"
  234. show-checkbox
  235. node-key="index"
  236. :default-expand-all="true"
  237. :props="{
  238. label: 'statName',
  239. children: 'children',
  240. }"
  241. :default-checked-keys="checkedKeysTemp"
  242. @check="handleCheck"
  243. />
  244. </div>
  245. <div class="foot right t30">
  246. <el-button size="medium" class="r24" type="primary" @click="onCheck"
  247. >确定</el-button
  248. >
  249. <el-button size="medium" @click="hide">取消</el-button>
  250. </div>
  251. </div>
  252. </Dialog>
  253. </div>
  254. </template>
  255. <script>
  256. import Dialog from "@/layout/components/Dialog";
  257. import terminalMixin from "../../mixins/terminal";
  258. import formMixin from "../../mixins/form";
  259. import tableColsMixin from "../../mixins/tableCols";
  260. import { getQuery } from "@/api/flight";
  261. export default {
  262. name: "DepartureTerminalView",
  263. components: { Dialog },
  264. mixins: [terminalMixin, formMixin, tableColsMixin],
  265. data() {
  266. return {
  267. optionProps: {
  268. value: "inAicompanyCode2",
  269. label: "inAicompanyCode2",
  270. },
  271. optionPropser: {
  272. value: "outAicompanyCode2",
  273. label: "outAicompanyCode2",
  274. },
  275. orderNum: ["0", "0", "0", "0"], // 默认总数
  276. // 初始表头
  277. tableCols: [
  278. {
  279. statCode: "departureInfo",
  280. statName: "离港航班",
  281. children: [
  282. {
  283. statCode: "FlightNO",
  284. statName: "航班号",
  285. width: 81,
  286. },
  287. {
  288. statCode: "FlightDate",
  289. statName: "航班日期",
  290. width: 100,
  291. },
  292. {
  293. statCode: "ActualDepartureTime",
  294. statName: "起飞时间",
  295. width: 100,
  296. },
  297. {
  298. statCode: "TargetAirport",
  299. statName: "目的站",
  300. width: 93,
  301. },
  302. {
  303. statCode: "DepartureBuild",
  304. statName: "起飞航站楼",
  305. width: 81,
  306. },
  307. {
  308. statCode: "BordingGate",
  309. statName: "起飞登机口",
  310. width: 81,
  311. },
  312. {
  313. statCode: "StandForDepartrue",
  314. statName: "起飞停机位",
  315. width: 81,
  316. },
  317. {
  318. statCode: "outTransferBaggageCount",
  319. statName: "中转进行李数",
  320. width: 93,
  321. },
  322. {
  323. statCode: "outTransferredBaggageCount",
  324. statName: "已中转进行李数",
  325. width: 120,
  326. },
  327. {
  328. statCode: "timeDifference",
  329. statName: "转运时间",
  330. width: 93,
  331. },
  332. ],
  333. },
  334. {
  335. statCode: "arrivalInfo",
  336. statName: "进港航班",
  337. children: [
  338. {
  339. statCode: "PreFlightNO",
  340. statName: "航班号",
  341. width: 122,
  342. },
  343. {
  344. statCode: "PreFlightDate",
  345. statName: "航班日期",
  346. width: 83,
  347. },
  348. {
  349. statCode: "PreAirport",
  350. statName: "起飞机场",
  351. width: 79,
  352. },
  353. {
  354. statCode: "ActualLandingTime",
  355. statName: "降落时间",
  356. width: 79,
  357. },
  358. {
  359. statCode: "LandingBuild",
  360. statName: "降落航站楼",
  361. width: 79,
  362. },
  363. {
  364. statCode: "Carousel",
  365. statName: "行李转盘",
  366. width: 79,
  367. },
  368. {
  369. statCode: "StandForLanding",
  370. statName: "降落停机位",
  371. width: 79,
  372. },
  373. {
  374. statCode: "inTransferBaggageCount",
  375. statName: "中转行李数",
  376. width: 58,
  377. },
  378. {
  379. statCode: "inTransferredBaggageCount",
  380. statName: "已中转行李数",
  381. width: 63,
  382. },
  383. ],
  384. },
  385. ],
  386. AirportList: [],
  387. carrierProps: [],
  388. carrierPropsop: [],
  389. flightBaggageTableFilters: {
  390. FlightNO: [],
  391. FlightDate: [],
  392. PlanDepartureTime: [],
  393. TargetAirport: [],
  394. BordingGate: [],
  395. StandForDepartrue: [],
  396. DepartureBuild: [],
  397. },
  398. loopEvent: null,
  399. leaveCount: 0,
  400. baggageCount: 0,
  401. spanArr: [],
  402. contactDot: 0,
  403. flag: 0,
  404. };
  405. },
  406. created() {
  407. this.getAirPortData();
  408. },
  409. methods: {
  410. cellClass(row, column, rowIndex, columnIndex){
  411. if (row.column.property == "FlightNO"||row.column.property == "PreFlightNO") {
  412. return "clickCell"
  413. }
  414. },
  415. cellClick(row, column, cell, event) {
  416. if (column.property == "FlightNO") {
  417. this.$router.push({ path: "/transfer/departure/flightView", query: row });
  418. }
  419. if (column.property == "PreFlightNO") {
  420. let row2 = this._.cloneDeep(row);
  421. row2.FlightNO = row2.PreFlightNO
  422. this.$router.push({ path: "/transfer/departure/flightView", query: row2 });
  423. }
  424. },
  425. changeView() {
  426. this.$router.replace({
  427. path: "/transfer/arrival",
  428. });
  429. },
  430. airPortChange() {
  431. this.getAviationData();
  432. this.upAviationData();
  433. // this.getTableData();
  434. },
  435. //选择机场
  436. async getAirPortData() {
  437. try {
  438. const res = await getQuery({
  439. id: 72,
  440. dataContent: [],
  441. });
  442. if (res.code == 0) {
  443. this.AirportList = res.returnData;
  444. this.formData.currentAirport = "PEK";
  445. this.getAviationData();
  446. this.upAviationData();
  447. this.getTableData();
  448. } else {
  449. this.$message.error(res.message);
  450. }
  451. } catch (error) {
  452. console.log("出错了", error);
  453. }
  454. },
  455. //选择航司
  456. async getAviationData() {
  457. try {
  458. const res = await getQuery({
  459. id: 71,
  460. dataContent: [this.formData.currentAirport],
  461. });
  462. if (res.code == 0) {
  463. this.carrierProps = res.returnData;
  464. // this.getTableData();
  465. } else {
  466. this.$message.error(res.message);
  467. }
  468. } catch (error) {
  469. console.log("出错了", error);
  470. }
  471. },
  472. //选择航司
  473. async upAviationData() {
  474. try {
  475. const res = await getQuery({
  476. id: 74,
  477. dataContent: [this.formData.currentAirport],
  478. });
  479. if (res.code == 0) {
  480. this.carrierPropsop = res.returnData;
  481. // this.getTableData();
  482. } else {
  483. this.$message.error(res.message);
  484. }
  485. } catch (error) {
  486. console.log("出错了", error);
  487. }
  488. },
  489. tableRowClassName({ row, rowIndex }) {
  490. if (row.hasTakenOff == 0) {
  491. if (rowIndex == this.leaveCount - 1) {
  492. return "bgl-hui redBorder";
  493. } else {
  494. return "bgl-hui";
  495. }
  496. }
  497. },
  498. tableCellClassName({ row, column }) {
  499. if (
  500. column.property === "transfer_all" ||
  501. column.property === "departureAnomaly" ||
  502. column.property === "riskWarning"
  503. ) {
  504. return "bgl-huang";
  505. }
  506. },
  507. // 获取表单下拉框数据
  508. // getFormData(params) {
  509. // this.relatedAirportQuery({
  510. // ...params,
  511. // type: 'OUT'
  512. // })
  513. // this.outgoingAirlineQuery(params)
  514. // this.craftTypeQuery(params)
  515. // this.flightAttrQuery(params)
  516. // },
  517. // 获取表格数据
  518. async getTableData() {
  519. // let arr = [
  520. // this.formData.currentAirport,
  521. // this.formData.startDate,
  522. // this.formData.endDate,
  523. // this.formData.inboundCarrier,
  524. // this.formData.outgoingAirline,
  525. // ];
  526. let arrs1 = [
  527. this.formData.inboundCarrier.length == 0
  528. ? ""
  529. : this.formData.inboundCarrier[0]
  530. ];
  531. let arrs2 = [
  532. this.formData.outgoingAirline.length == 0
  533. ? ""
  534. : this.formData.outgoingAirline[0]
  535. ];
  536. let arr = [
  537. this.formData.currentAirport,
  538. this.formData.startDate,
  539. this.formData.endDate,
  540. ...arrs1,
  541. ...arrs1,
  542. ...arrs1,
  543. ...arrs2,
  544. ...arrs2,
  545. ...arrs2,
  546. // this.formData.inboundCarrier,
  547. // this.formData.outgoingAirline,
  548. // JSON.stringify(this.formData.inboundCarrier),
  549. // JSON.stringify(this.formData.outgoingAirline),
  550. ];
  551. try {
  552. const res = await getQuery({
  553. id: 68,
  554. dataContent: [...arr],
  555. });
  556. if (res.code == 0) {
  557. this.tableData = res.returnData;
  558. let contactDot = this.contactDot;
  559. this.spanArr = []
  560. this.tableData.forEach((item, index) => {
  561. item.index = index;
  562. if (index === 0) {
  563. this.spanArr.push(1);
  564. } else {
  565. if (item.FlightNO === this.tableData[index - 1].FlightNO) {
  566. this.spanArr[contactDot] += 1;
  567. this.spanArr.push(0);
  568. } else {
  569. this.spanArr.push(1);
  570. contactDot = index;
  571. }
  572. }
  573. });
  574. //this.initTableData(res.returnData);
  575. } else {
  576. console.log(res.message);
  577. }
  578. } catch (error) {
  579. clearInterval(this.loopEvent);
  580. console.log("出错了", error);
  581. }
  582. },
  583. initTableData(tableData) {
  584. this.leaveCount = 0;
  585. this.baggageCount = 0;
  586. tableData.forEach((item) => {
  587. if (item.hasTakenOff == 0) {
  588. this.leaveCount++;
  589. }
  590. // item["waitfanj"] = item["noCheckInNumber"] - item["unLoad"];
  591. this.baggageCount = this.baggageCount + item.preLoad;
  592. });
  593. this.tableData = this._.sortBy(tableData, [
  594. "FlightDate",
  595. "PlanDepartureTime",
  596. ]);
  597. // this.setTableFilters();
  598. // this.toOrderNum(this.baggageCount);
  599. // setInterval(() => {
  600. // this.baggageCount = this.baggageCount+1;
  601. // // 这里输入数字即可调用
  602. // }, 2000);
  603. },
  604. // 表格添加过滤条件
  605. setTableFilters() {
  606. this.tableData.forEach((item) => {
  607. Object.keys(this.flightBaggageTableFilters).forEach((key) => {
  608. if (
  609. (item[key] ?? "") !== "" &&
  610. this.flightBaggageTableFilters[key].every(
  611. (obj) => obj.value !== item[key]
  612. )
  613. ) {
  614. this.flightBaggageTableFilters[key].push({
  615. text: item[key],
  616. value: item[key],
  617. });
  618. }
  619. this.flightBaggageTableFilters[key] = this._.sortBy(
  620. this.flightBaggageTableFilters[key],
  621. ["value"]
  622. );
  623. });
  624. });
  625. },
  626. filterHandler(value, row, column) {
  627. const property = column["property"];
  628. return row[property] === value;
  629. },
  630. setNumberTransform() {
  631. const numberItems = this.$refs.numberItem; // 拿到数字的ref,计算元素数量
  632. const numberArr = this.orderNum.filter((item) => !isNaN(item));
  633. // 结合CSS 对数字字符进行滚动,显示订单数量
  634. for (let index = 0; index < numberItems.length; index++) {
  635. const elem = numberItems[index];
  636. elem.style.transform = `translate(-50%, -${numberArr[index] * 10}%)`;
  637. }
  638. },
  639. toOrderNum(num) {
  640. num = num.toString();
  641. if (num.length < 4) {
  642. num = "0" + num; // 如未满八位数,添加"0"补位
  643. this.toOrderNum(num); // 递归添加"0"补位
  644. } else if (num.length === 4) {
  645. this.orderNum = num.split(""); // 将其便变成数据,渲染至滚动数组
  646. } else {
  647. // 订单总量数字超过八位显示异常
  648. this.$message.warning("总量数字过大");
  649. }
  650. this.setNumberTransform();
  651. },
  652. tableSpanMethod({ row, column, rowIndex, columnIndex }) {
  653. if (
  654. [
  655. "FlightNO",
  656. "FlightDate",
  657. "PlanLandingTime",
  658. "PlanDepartureApt",
  659. "LandingBuild",
  660. "Carousel",
  661. "StandForLanding",
  662. "positionDistribution",
  663. "expect_load",
  664. "loadflight",
  665. ].includes(column["property"])
  666. ) {
  667. const _row = this.spanArr[rowIndex];
  668. const _col = _row > 0 ? 1 : 0;
  669. return {
  670. rowspan: _row,
  671. colspan: _col,
  672. };
  673. }
  674. },
  675. arraySpanMethod({ row, column, rowIndex, columnIndex }) {
  676. for (let i = 0; i < 7; i++) {
  677. if (columnIndex === i) {
  678. const _row = this.spanArr[rowIndex];
  679. const _col = _row > 0 ? 1 : 0;
  680. return {
  681. rowspan: _row,
  682. colspan: _col,
  683. };
  684. }
  685. }
  686. },
  687. },
  688. mounted() {
  689. let that = this;
  690. this.loopEvent = setInterval(function () {
  691. that.getTableData();
  692. }, 3000);
  693. },
  694. beforeDestroy() {
  695. clearInterval(this.loopEvent);
  696. },
  697. };
  698. </script>
  699. <style lang="scss" scoped>
  700. .departure-form {
  701. padding-top: 11px;
  702. padding-left: 5px;
  703. ::v-deep .form {
  704. .el-form-item {
  705. margin-bottom: 0px;
  706. margin-right: 8px;
  707. button,
  708. input,
  709. optgroup,
  710. select,
  711. textarea {
  712. font-family: Helvetica, "Microsoft YaHei";
  713. font-size: 14px;
  714. }
  715. .el-switch__label {
  716. color: #303133;
  717. }
  718. .el-form-item__error {
  719. z-index: 10;
  720. }
  721. .el-button {
  722. &.btn-square {
  723. width: 30px;
  724. height: 30px;
  725. display: flex;
  726. align-items: center;
  727. justify-content: center;
  728. margin-top: 5px;
  729. }
  730. }
  731. }
  732. .checkTime {
  733. margin: 0 16px;
  734. }
  735. .msgImg {
  736. cursor: pointer;
  737. position: relative;
  738. top: 6px;
  739. }
  740. }
  741. .box-item {
  742. position: relative;
  743. height: 32px;
  744. font-size: 18px;
  745. line-height: 32px;
  746. text-align: center;
  747. list-style: none;
  748. color: #2d7cff;
  749. writing-mode: vertical-lr;
  750. text-orientation: upright;
  751. /*文字禁止编辑*/
  752. -moz-user-select: none; /*火狐*/
  753. -webkit-user-select: none; /*webkit浏览器*/
  754. -ms-user-select: none; /*IE10*/
  755. -khtml-user-select: none; /*早期浏览器*/
  756. user-select: none;
  757. /* overflow: hidden; */
  758. p {
  759. line-height: 32px;
  760. writing-mode: horizontal-tb !important;
  761. text-orientation: none !important;
  762. /*文字禁止编辑*/
  763. -moz-user-select: none; /*火狐*/
  764. -webkit-user-select: none; /*webkit浏览器*/
  765. -ms-user-select: none; /*IE10*/
  766. -khtml-user-select: none; /*早期浏览器*/
  767. user-select: none;
  768. margin-top: 5px;
  769. }
  770. }
  771. /* 默认逗号设置 */
  772. .mark-item {
  773. width: 10px;
  774. height: 32px;
  775. margin-right: 5px;
  776. line-height: 10px;
  777. font-size: 18px;
  778. position: relative;
  779. & > span {
  780. position: absolute;
  781. width: 100%;
  782. bottom: 0;
  783. writing-mode: vertical-rl;
  784. text-orientation: upright;
  785. }
  786. }
  787. /*滚动数字设置*/
  788. .number-item {
  789. width: 41px;
  790. height: 42px;
  791. /* 背景图片 */
  792. background: url(/images/text-bg-blue.png) no-repeat center center;
  793. background-size: 100% 100%;
  794. // background: #ccc;
  795. list-style: none;
  796. margin-right: 5px;
  797. // background:rgba(250,250,250,1);
  798. border-radius: 4px;
  799. border: 3px solid rgb(221, 221, 221);
  800. & > span {
  801. position: relative;
  802. display: inline-block;
  803. margin-right: 10px;
  804. width: 100%;
  805. height: 100%;
  806. writing-mode: vertical-rl;
  807. text-orientation: upright;
  808. overflow: hidden;
  809. & > i {
  810. font-style: normal;
  811. position: absolute;
  812. top: 11px;
  813. left: 50%;
  814. transform: translate(-50%, -1%);
  815. transition: transform 1s ease-in-out;
  816. letter-spacing: 10px;
  817. }
  818. }
  819. }
  820. .number-item:last-child {
  821. margin-right: 0;
  822. }
  823. }
  824. .departure-table {
  825. width: 100%;
  826. ::v-deep .table {
  827. width: 100%;
  828. .cell {
  829. padding: 0;
  830. text-align: center;
  831. font-size: 14px;
  832. font-family: Helvetica, "Microsoft YaHei";
  833. letter-spacing: 0;
  834. }
  835. .clickCell{
  836. cursor: pointer;
  837. color: #2d7cff;
  838. }
  839. .el-table__header-wrapper {
  840. .cell {
  841. font-weight: bold;
  842. color: #101116;
  843. }
  844. .has-gutter {
  845. tr {
  846. .bgl-huang {
  847. background: #fcf0b1;
  848. }
  849. }
  850. }
  851. }
  852. .el-table__body-wrapper {
  853. tr.bgl-hui {
  854. background: #d2d6df;
  855. td {
  856. background: #d2d6df;
  857. }
  858. &.redBorder {
  859. position: relative;
  860. &::after {
  861. content: "";
  862. position: absolute;
  863. left: 0;
  864. bottom: 0;
  865. width: 100%;
  866. height: 2px;
  867. background: #e83f82;
  868. }
  869. }
  870. }
  871. }
  872. }
  873. }
  874. </style>