terminal.js 14 KB

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