terminal.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  1. /*
  2. * @Author: Badguy
  3. * @Date: 2022-03-04 11:41:55
  4. * @LastEditTime: 2022-08-26 15:32:54
  5. * @LastEditors: your name
  6. * @Description: 航站视图通用部分
  7. * have a nice day!
  8. */
  9. import { mapGetters } from 'vuex'
  10. import { commonTableCellClass } from '@/utils/table'
  11. export default {
  12. data() {
  13. return {
  14. // 表格数据
  15. tableData: [],
  16. tableDataFilters: {},
  17. filterValues: {},
  18. newFilters: {},
  19. tableDataSortRules: {},
  20. spanArr: [],
  21. pos: 0,
  22. loading: false,
  23. computedTableHeight: undefined,
  24. debounceTime: 300
  25. }
  26. },
  27. created() {
  28. this.setFilterAndSort(this.tableCols)
  29. },
  30. updated() {
  31. this.resizeHandler()
  32. },
  33. activated() {
  34. this.resizeHandler()
  35. this.debouncedResizeHandler = this._.debounce(this.resizeHandler, this.debounceTime)
  36. window.addEventListener('resize', this.debouncedResizeHandler)
  37. },
  38. deactivated() {
  39. window.removeEventListener('resize', this.debouncedResizeHandler)
  40. },
  41. computed: {
  42. ...mapGetters(['clickedCells', 'savedTableFilterValuesMap']),
  43. dealedTableData() {
  44. const filtered = this.tableData.filter(item => {
  45. let flag = true
  46. Object.entries(this.filterValues).forEach(([key, arr]) => {
  47. if (arr.length && !arr.includes(String(item[key]))) {
  48. flag = false
  49. }
  50. })
  51. Object.entries(this.newFilters).forEach(([key, [comparisonOperator, value]]) => {
  52. if ((value ?? '') !== '') {
  53. switch (comparisonOperator) {
  54. case '<':
  55. if (Number(item[key]) >= Number(value)) {
  56. flag = false
  57. }
  58. break
  59. case '=':
  60. if (Number(item[key]) !== Number(value)) {
  61. flag = false
  62. }
  63. break
  64. case '>':
  65. if (Number(item[key]) <= Number(value)) {
  66. flag = false
  67. }
  68. break
  69. default:
  70. break
  71. }
  72. }
  73. })
  74. return flag
  75. })
  76. const sortRules = Object.entries(this.tableDataSortRules).reduce(
  77. (pre, [key, value]) => {
  78. if (value) {
  79. pre[0].push(key)
  80. value = value === 'ascending' ? 'asc' : 'desc'
  81. pre[1].push(value)
  82. }
  83. return pre
  84. },
  85. [[], []]
  86. )
  87. return this._.orderBy(filtered, sortRules[0], sortRules[1])
  88. }
  89. },
  90. watch: {
  91. dealedTableData: {
  92. handler(val) {
  93. this.spanArr = []
  94. let contactDot = this.contactDot
  95. val.forEach((item, index, arr) => {
  96. if (index === 0) {
  97. this.spanArr.push(1)
  98. } else {
  99. if (
  100. item['flightNO'] === arr[index - 1]['flightNO'] &&
  101. item['flightDate'] === arr[index - 1]['flightDate']
  102. ) {
  103. this.spanArr[contactDot] += 1
  104. this.spanArr.push(0)
  105. } else {
  106. this.spanArr.push(1)
  107. contactDot = index
  108. }
  109. }
  110. })
  111. },
  112. deep: true
  113. },
  114. // filterValues: {
  115. // handler(val) {
  116. // this.$store.dispatch('savedSettings/saveTableFilterValues', {
  117. // filterValues: val
  118. // })
  119. // },
  120. // deep: true
  121. // }
  122. },
  123. methods: {
  124. // 设置表格高度
  125. resizeHandler() {
  126. const headerHeight = 80
  127. const bottomBlankHeight = 41
  128. const formWrapHeight = this.$refs['formWrap'].offsetHeight
  129. this.computedTableHeight = `calc(100vh - ${headerHeight + bottomBlankHeight + formWrapHeight}px)`
  130. this.$refs.table?.doLayout()
  131. },
  132. // 设置筛选和排序
  133. setFilterAndSort(tableCols) {
  134. const filterValues = this.savedTableFilterValuesMap[this.$route.name]
  135. const self = this
  136. Object.values(tableCols).forEach(({ prop, filterable, sortable, children }) => {
  137. if (children) {
  138. self.setFilterAndSort(children)
  139. } else {
  140. if (Number(filterable) === 1) {
  141. self.$set(self.tableDataFilters, prop, [])
  142. self.$set(self.filterValues, prop, filterValues?.[prop] ?? [])
  143. } else if (Number(filterable) === 2) {
  144. self.$set(self.tableDataFilters, prop, [])
  145. self.$set(self.newFilters, prop, ['=', null])
  146. }
  147. if (sortable) {
  148. self.$set(self.tableDataSortRules, prop, '')
  149. }
  150. }
  151. })
  152. },
  153. // 合计行
  154. summaryMethod({ columns, data }) {
  155. const sums = []
  156. if (columns.length > 0) {
  157. columns.forEach((column, index) => {
  158. if (index === 0) {
  159. sums[index] = '合计'
  160. } else if (index === 1) {
  161. sums[index] = '航班数:' + this.tableData.length
  162. } else if (
  163. // 需要计算的列
  164. [
  165. 'passagernum',
  166. 'checkNumber',
  167. 'not_actived',
  168. 'expect_load',
  169. 'security_all',
  170. 'sortNumber',
  171. 'loadNumber',
  172. 'boardID',
  173. 'toUnload',
  174. 'OFFCount',
  175. 'delbag',
  176. 'noBSM',
  177. 'reach',
  178. 'did_not_arrive',
  179. 'special',
  180. 'claim',
  181. 'uninstalled',
  182. 'terminateArrive',
  183. 'terminatedNotArrived',
  184. 'delivered',
  185. 'not_shipped',
  186. 'container',
  187. 'bulk',
  188. 'checkInTravellerNumber',
  189. 'checkInNumber',
  190. 'unActive',
  191. 'preLoad',
  192. 'noCheckInNumber',
  193. 'midIn',
  194. 'checkIns',
  195. 'projectedLoad',
  196. 'loadedQuantity',
  197. 'numberOfDestinationArrivals',
  198. 'endPointNotReached',
  199. 'specialQuantity',
  200. 'numberOfClaims',
  201. 'numberToBeUninstalled',
  202. 'terminateArrivalQuantity',
  203. 'terminateUnreachedQuantity',
  204. 'quantityShipped',
  205. 'undeliveredQuantity',
  206. 'numberOfContainers',
  207. 'numberOfBulk',
  208. 'inTransferBaggageCount',
  209. 'inTransferredBaggageCount',
  210. 'outTransferBaggageCount',
  211. 'outTransferredBaggageCount',
  212. 'exceptions',
  213. 'warning'
  214. ].includes(column.property)
  215. ) {
  216. const values = data.map(item => Number(item[column.property]))
  217. if (values.some(value => !isNaN(value))) {
  218. sums[index] = values.reduce((prev, curr) => {
  219. const value = Number(curr)
  220. if (!isNaN(value)) {
  221. return Number(prev) + Number(curr)
  222. } else {
  223. return Number(prev)
  224. }
  225. }, 0)
  226. } else {
  227. sums[index] = 0
  228. }
  229. } else {
  230. // 过滤某些字段不参与计算
  231. sums[index] = '-'
  232. }
  233. })
  234. }
  235. return sums
  236. },
  237. cellClass({ row, column, rowIndex, columnIndex }) {
  238. const classes = commonTableCellClass({
  239. row,
  240. column,
  241. rowIndex,
  242. columnIndex
  243. })
  244. if (
  245. [
  246. 'flightNO',
  247. 'preFlightNO',
  248. 'inTransferBaggageCount',
  249. 'inTransferredBaggageCount',
  250. 'outTransferBaggageCount',
  251. 'outTransferredBaggageCount',
  252. 'toUnload',
  253. 'OFFCount',
  254. 'checkInNumber',
  255. 'unActive',
  256. 'preLoad',
  257. 'warning',
  258. 'midIn',
  259. 'noCheckInNumber',
  260. 'checkNumber',
  261. 'sortNumber',
  262. 'loadNumber',
  263. 'boardID',
  264. 'checkIns',
  265. 'terminateArrivalQuantity',
  266. 'projectedLoad',
  267. 'loadedQuantity',
  268. 'numberOfDestinationArrivals',
  269. 'uninstalled',
  270. 'numberOfContainers',
  271. 'numberOfBulk',
  272. 'noBSM'
  273. ].includes(column.property) &&
  274. row[column.property] &&
  275. row[column.property] !== '0'
  276. ) {
  277. classes.push('cell-click')
  278. if (
  279. this.clickedCells.some(
  280. cell =>
  281. cell.pageName === this.$route.name &&
  282. Object.entries(cell.row).every(([key, value]) => row[key] === value) &&
  283. cell.columnProp === column.property
  284. )
  285. ) {
  286. classes.push('cell-clicked')
  287. }
  288. }
  289. if (column.property === 'toUnload' && row[column.property]) {
  290. classes.push('cell-toUnload')
  291. }
  292. if (column.property === 'warning' && row['warningState'] && row['warningState'] == 2) {
  293. classes.push('cell-toUnload')
  294. }
  295. if (column.property === 'warning' && row['warningState'] && row['warningState'] == 1) {
  296. classes.push('cell-toUnloadNew')
  297. }
  298. if (column.property === 'outTransferredBaggageCount' && row['warningState'] && row['warningState'] == 2) {
  299. classes.push('cell-toUnload')
  300. }
  301. if (column.property === 'outTransferredBaggageCount' && row['warningState'] && row['warningState'] == 1) {
  302. classes.push('cell-toUnloadNew')
  303. }
  304. if (column.property === 'outTransferBaggageCount' && row['sharpSign']) {
  305. classes.push('cell-toUnloadNew')
  306. }
  307. if (column.property === 'inTransferredBaggageCount' && row['warningState'] && row['warningState'] == 2) {
  308. classes.push('cell-toUnload')
  309. }
  310. if (column.property === 'inTransferredBaggageCount' && row['warningState'] && row['warningState'] == 1) {
  311. classes.push('cell-toUnloadNew')
  312. }
  313. if (column.property === 'inTransferBaggageCount' && row['sharpSign']) {
  314. classes.push('cell-toUnloadNew')
  315. }
  316. return classes.join(' ')
  317. },
  318. cellClickHandler(row, column, cell, event) {
  319. if (
  320. [
  321. 'flightNO',
  322. 'preFlightNO',
  323. 'inTransferBaggageCount',
  324. 'inTransferredBaggageCount',
  325. 'outTransferBaggageCount',
  326. 'outTransferredBaggageCount',
  327. 'toUnload',
  328. 'OFFCount',
  329. 'checkInNumber',
  330. 'unActive',
  331. 'preLoad',
  332. 'warning',
  333. 'midIn',
  334. 'noCheckInNumber',
  335. 'checkNumber',
  336. 'sortNumber',
  337. 'loadNumber',
  338. 'boardID',
  339. 'checkIns',
  340. 'terminateArrivalQuantity',
  341. 'projectedLoad',
  342. 'loadedQuantity',
  343. 'numberOfDestinationArrivals',
  344. 'uninstalled',
  345. 'numberOfContainers',
  346. 'numberOfBulk',
  347. 'noBSM'
  348. ].includes(column.property) &&
  349. row[column.property] &&
  350. row[column.property] !== '0'
  351. ) {
  352. this.$store.dispatch('keepAlive/addClickedCell', {
  353. row,
  354. columnProp: column.property,
  355. pageName: this.$route.name
  356. })
  357. const path = `${this.$route.path}/flightView`
  358. const query = {}
  359. switch (column.property) {
  360. case 'flightNO':
  361. Object.assign(query, {
  362. flightNO: row.flightNO,
  363. flightDate: row.flightDate
  364. })
  365. break
  366. case 'preFlightNO':
  367. Object.assign(query, {
  368. flightNO: row.preFlightNO,
  369. flightDate: row.preFlightDate
  370. })
  371. break
  372. case 'inTransferBaggageCount':
  373. case 'outTransferBaggageCount':
  374. Object.assign(query, {
  375. flightNO: row.preFlightNO,
  376. flightDate: row.preFlightDate,
  377. fastFilter: `transferFlightNO,${row.flightNO}`
  378. })
  379. break
  380. case 'inTransferredBaggageCount':
  381. case 'outTransferredBaggageCount':
  382. Object.assign(query, {
  383. flightNO: row.flightNO,
  384. flightDate: row.flightDate,
  385. fastFilter: `inFlightNO,${row.preFlightNO}`
  386. })
  387. break
  388. case 'warning':
  389. Object.assign(query, {
  390. flightNO: row.flightNO,
  391. flightDate: row.flightDate,
  392. fastFilter: row['warningState'] === 1 ? 'warning' : 'alarm'
  393. })
  394. break
  395. default: {
  396. const reflect = {
  397. toUnload: 'toUnload', // 装车或装机后,isDEL为'DEL',waitOFF为1
  398. OFFCount: 'unloaded', // 装车或装机后,isDEL为'DEL',waitOFF为0
  399. unActive: 'unActive', // STATUS为'I'
  400. preLoad: 'preLoad', // STATUS不为'I',isDEL不为'del'
  401. projectedLoad: 'preLoad',
  402. midIn: 'inFlightNO',
  403. noCheckInNumber: 'canceled', // isDEL为'DEL'
  404. noBSM: 'NOBSM', // 1/0
  405. checkInNumber: 'checkInTime',
  406. checkNumber: 'securityTime',
  407. sortNumber: 'sortTime',
  408. loadNumber: 'loadTime',
  409. boardID: 'inflTime',
  410. checkIns: 'checkInTime',
  411. numberOfDestinationArrivals: 'arrivedID', // 1/0
  412. uninstalled: 'unloadID', // 1/0
  413. loadedQuantity: 'loaded', // 'loadTime'不为空,isDEL不为'DEL'
  414. terminateArrivalQuantity: 'destination', // 'arrivedID'为1,transferFlightNO为null
  415. numberOfContainers: 'inContainer', // 有容器ID
  416. numberOfBulk: 'FBULK' // 容器ID为'FBULK'
  417. }
  418. Object.assign(query, {
  419. flightNO: row.flightNO,
  420. flightDate: row.flightDate,
  421. fastFilter: reflect[column.property]
  422. })
  423. break
  424. }
  425. }
  426. switch (this.$route.path.split('/').at(-1)) {
  427. case 'departure':
  428. Object.assign(query, {
  429. departureAirport: this.formData.currentAirport ?? '',
  430. landingAirport: row.targetAirport ?? ''
  431. })
  432. break
  433. case 'arrival':
  434. Object.assign(query, {
  435. departureAirport: row.departureAirport ?? '',
  436. landingAirport: this.formData.currentAirport ?? ''
  437. })
  438. break
  439. case 'transferDeparture':
  440. case 'transferArrival':
  441. Object.assign(query, {
  442. departureAirport: row.preAirport ?? '',
  443. landingAirport: row.targetAirport ?? ''
  444. })
  445. break
  446. default:
  447. break
  448. }
  449. this.$router.push({
  450. path,
  451. query
  452. })
  453. }
  454. }
  455. }
  456. }