terminal.js 13 KB

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