index.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <template>
  2. <div class="airport-view">
  3. <div class="airport-header">
  4. <AirportForm :name="name" @form-data-change="formDataChangeHandler" />
  5. <div class="airport-count">
  6. <CountBox
  7. :count-number="tableDataCount.waybillCount"
  8. :label="isDeparture ? '预计装载总运单数' : '预计卸载总运单数'"
  9. />
  10. <CountBox
  11. v-show="countFlag"
  12. :count-number="tableDataCount.goodsCount"
  13. :label="isDeparture ? '预计装载总件数' : '预计卸载总件数'"
  14. />
  15. </div>
  16. <div class="airport-settings">
  17. <div v-permission="getPermission('count')">
  18. <CommonSwitch v-model:flag="countFlag" label="显示件数" />
  19. </div>
  20. <div v-permission="getPermission('UTC')">
  21. <CommonSwitch v-model:flag="UTCFlag" label="开启UTC" />
  22. </div>
  23. <div v-permission="getPermission('columnSet')">
  24. <ColumnSet
  25. :table-columns="tableColumns"
  26. @checked-submit="columnChecked"
  27. />
  28. </div>
  29. </div>
  30. </div>
  31. <div class="airport-table">
  32. <el-auto-resizer>
  33. <template #default="{ height, width }">
  34. <el-table-v2
  35. :columns="tableColumns"
  36. :data="dealedTableData"
  37. :width="width"
  38. :height="height"
  39. :fixed="isDeparture"
  40. :footer-height="60"
  41. :row-class="rowClassV2"
  42. :cell-props="cellPropsGetter"
  43. >
  44. <template #header-cell="{ column }: HeaderCellSlotProps">
  45. <TableHeaderCell
  46. v-model:filter-values="filterValueMap[column.columnName]"
  47. v-model:sort-rule="tableDataSortRuleMap[column.columnName]"
  48. :label="tableColumnFormatter(column.columnLabel)"
  49. :desc="column.columnDescribe"
  50. :filter-options="filterOptionMap[column.columnName]"
  51. :sortable="column.needSort"
  52. filter-style="arrow"
  53. />
  54. </template>
  55. <template #cell="slot: CellSlotProps">
  56. <div
  57. class="el-table-v2__cell-text"
  58. @click="cellClickHandlerV2(slot)"
  59. >
  60. <!-- <el-tooltip
  61. v-if="slot.column.columnName.includes('Time')"
  62. :content="tableDataFormatter(slot)"
  63. >
  64. {{ tableDataFormatter(slot) }}
  65. </el-tooltip>
  66. <span v-else>{{ tableDataFormatter(slot) }}</span> -->
  67. {{ tableDataFormatter(slot) }}
  68. </div>
  69. </template>
  70. <template #footer>
  71. <div class="table-footer">
  72. <!-- <span class="table-footer-count">航班总数:{{ tableDataCount.flightCount }}</span> -->
  73. <span class="table-footer-count"
  74. >货运航班总数:{{ tableDataCount.freightFlightCount }}</span
  75. >
  76. <span v-if="isDeparture" class="table-footer-count"
  77. >已装机总数:{{ tableDataCount.loadCount }}</span
  78. >
  79. <span v-else class="table-footer-count"
  80. >已卸机总数:{{ tableDataCount.unloadCount }}</span
  81. >
  82. <span class="table-footer-count"
  83. >已起飞总数:{{ tableDataCount.takeOffCount }}</span
  84. >
  85. </div>
  86. </template>
  87. </el-table-v2>
  88. </template>
  89. </el-auto-resizer>
  90. </div>
  91. </div>
  92. </template>
  93. <script lang="ts" setup>
  94. import type { CellSlotProps } from '../../type'
  95. import AirportForm from './AirportForm.vue'
  96. import ColumnSet from '../../components/ColumnSet/index.vue'
  97. import CountBox from '../../components/CountBox/index.vue'
  98. import CommonSwitch from '../../components/CommonSwitch/index.vue'
  99. import TableHeaderCell from '@/components/TableHeaderCell/index.vue'
  100. import { useTableColumnSet } from '../../hooks/useTableColumnSet'
  101. import { useAirportTable } from './useAirportTable'
  102. import { useTableStyle } from '../../hooks/useTableStyle'
  103. import { useTableCellClick } from '../../hooks/useTableCellClick'
  104. import { useTableFilterAndSort } from '@/hooks/useTableFilterAndSort'
  105. import { useCount } from './useCount'
  106. import { HeaderCellSlotProps } from 'element-plus'
  107. import { CommonData } from '~/common'
  108. import { useLoop } from '@/hooks/useLoop'
  109. const props = defineProps({
  110. name: {
  111. type: String,
  112. required: true,
  113. },
  114. })
  115. // onMounted(() => {
  116. // console.log('mounted', 'airport')
  117. // })
  118. // onActivated(() => {
  119. // console.log('activated', 'airport')
  120. // })
  121. // onDeactivated(() => {
  122. // console.log('deactivated', 'airport')
  123. // })
  124. const isDeparture = props.name.includes('Departure')
  125. const formData: CommonData = reactive({})
  126. const formDataChangeHandler = (data: CommonData) => {
  127. Object.assign(formData, data)
  128. }
  129. const countFlag = ref(true)
  130. const { tableColumnFormatter, tableDataFormatter } = useCount(countFlag)
  131. const UTCFlag = ref(true)
  132. const { tableColumns, tableData, getTableData } = useAirportTable(
  133. props.name,
  134. formData
  135. )
  136. useLoop(getTableData, 'airport', [formData])
  137. const { columnChecked } = useTableColumnSet(tableColumns)
  138. const { rowClassV2, cellClassV2 } = useTableStyle(props.name)
  139. const cellPropsGetter = params => ({
  140. class: cellClassV2(params),
  141. })
  142. const tableDataCount = computed(() =>
  143. tableData.value.reduce(
  144. (counts: { [x: string]: number }, current) => {
  145. const preCount = current[isDeparture ? 'preLoad' : 'preUnload']
  146. if (preCount) {
  147. counts.waybillCount += Number(String(preCount).split('/')[0])
  148. counts.goodsCount += Number(String(preCount).split('/')[1])
  149. }
  150. counts.flightCount++
  151. const isFreight = tableColumns.value.some(
  152. column => column.groupName === '地服相关' && current[column.columnName]
  153. )
  154. if (isFreight) {
  155. counts.freightFlightCount++
  156. }
  157. if (current.loadPlaneSure) {
  158. counts.loadCount++
  159. }
  160. if (current.unLoad) {
  161. counts.unloadCount++
  162. }
  163. return counts
  164. },
  165. {
  166. waybillCount: 0,
  167. goodsCount: 0,
  168. flightCount: 0,
  169. freightFlightCount: 0,
  170. loadCount: 0,
  171. unloadCount: 0,
  172. takeOffCount: 0,
  173. }
  174. )
  175. )
  176. const { cellClickHandlerV2 } = useTableCellClick(props.name)
  177. const {
  178. filterOptionMap,
  179. filterValueMap,
  180. tableDataSortRuleMap,
  181. dealedTableData,
  182. } = useTableFilterAndSort(
  183. tableColumns,
  184. tableData,
  185. {},
  186. { planDepartureTime: 'ascending' }
  187. )
  188. const permissionMap = {
  189. DepartureAirport: {
  190. count:
  191. 'number_of_pieces_displayed_in_domestic_departure_terminal_view_button',
  192. UTC: 'turn_on_utc_in_view_of_domestic_departure_terminal_button',
  193. columnSet: 'domestic_departure_terminal_view_column_setting_button',
  194. },
  195. InternationalDepartureAirport: {
  196. count:
  197. 'number_of_pieces_displayed_in_international_departure_terminal_view_button',
  198. UTC: 'international_departure_terminal_view_opens_utc_button',
  199. columnSet: 'international_departure_terminal_view_column_setting_button',
  200. },
  201. ArrivalAirport: {
  202. count:
  203. 'number_of_pieces_displayed_in_domestic_inbound_terminal_view_button',
  204. UTC: 'turn_on_utc_in_view_of_domestic_inbound_terminal_button',
  205. columnSet: 'domestic_inbound_terminal_view_column_setting_button',
  206. },
  207. InternationalArrivalAirport: {
  208. count:
  209. 'number_of_display_pieces_of_international_inbound_terminal_view_button',
  210. UTC: 'the_view_of_international_inbound_terminal_opens_utc_button',
  211. columnSet: 'view_column_setting_of_international_inbound_terminal_button',
  212. },
  213. }
  214. const getPermission = (type?: string) => {
  215. return [permissionMap[props.name][type]]
  216. }
  217. </script>
  218. <style lang="scss" scoped>
  219. @import './index.scss';
  220. </style>