|
@@ -3,15 +3,6 @@
|
|
|
<div class="airport-header">
|
|
|
<AirportForm :name="name" @form-data-change="formDataChangeHandler" />
|
|
|
<div class="airport-count">
|
|
|
- <!-- <CountBox
|
|
|
- :count-number="tableDataCount.waybillCount"
|
|
|
- :label="isDeparture ? '预计装载总运单数' : '预计卸载总运单数'"
|
|
|
- />
|
|
|
- <CountBox
|
|
|
- v-show="countFlag"
|
|
|
- :count-number="tableDataCount.goodsCount"
|
|
|
- :label="isDeparture ? '预计装载总件数' : '预计卸载总件数'"
|
|
|
- /> -->
|
|
|
<CountBox
|
|
|
:count-number="tableDataCount.flightCount"
|
|
|
label="今日计划航班数"
|
|
@@ -43,55 +34,39 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="airport-table">
|
|
|
- <el-auto-resizer>
|
|
|
- <template #default="{ height, width }">
|
|
|
- <el-table-v2
|
|
|
- ref="tableRef"
|
|
|
- :style="{ visibility }"
|
|
|
- :columns="customRendererColumns"
|
|
|
- :data="dealedTableData"
|
|
|
- row-key="rowKey"
|
|
|
- :width="width"
|
|
|
- :height="height"
|
|
|
- :fixed="isDeparture"
|
|
|
- :footer-height="60"
|
|
|
- :row-class="rowClass"
|
|
|
- :cell-props="cellPropsGetter"
|
|
|
- :row-event-handlers="rowEventHandlers"
|
|
|
- :h-scrollbar-size="15"
|
|
|
- :v-scrollbar-size="15"
|
|
|
- scrollbar-always-on
|
|
|
- @scroll="tableScrollHandler"
|
|
|
- >
|
|
|
- <template #footer>
|
|
|
- <div class="table-footer">
|
|
|
- <!-- <span class="table-footer-count"
|
|
|
- >今日航班总数:{{ tableDataCount.flightCount }}</span
|
|
|
- > -->
|
|
|
- <span class="table-footer-count"
|
|
|
- >货运航班总数:{{ tableDataCount.freightFlightCount }}</span
|
|
|
- >
|
|
|
- <span class="table-footer-count"
|
|
|
- >货站交接总数:{{ tableDataCount.depotFlightCount }}</span
|
|
|
- >
|
|
|
- <span v-if="isDeparture" class="table-footer-count"
|
|
|
- >已装机总数:{{ tableDataCount.loadCount }}</span
|
|
|
- >
|
|
|
- <span v-else class="table-footer-count"
|
|
|
- >已卸机总数:{{ tableDataCount.unloadCount }}</span
|
|
|
- >
|
|
|
- <!-- <span v-if="isDeparture" class="table-footer-count"
|
|
|
- >已起飞总数:{{ finishedCount }}</span
|
|
|
- >
|
|
|
- <span v-else class="table-footer-count"
|
|
|
- >已降落总数:{{ finishedCount }}</span
|
|
|
- > -->
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-table-v2>
|
|
|
- </template>
|
|
|
- </el-auto-resizer>
|
|
|
+ <SimpleTable
|
|
|
+ ref="tableRef"
|
|
|
+ :columns="tableColumns"
|
|
|
+ :data="tableData"
|
|
|
+ sequence
|
|
|
+ highlight-current-row
|
|
|
+ scrollbar-always-on
|
|
|
+ :stripe="false"
|
|
|
+ show-summary
|
|
|
+ :cache-keys="cacheKeys"
|
|
|
+ :filter-sort-options="filterSortOptions"
|
|
|
+ :label-formatter="tableColumnFormatter"
|
|
|
+ :row-class-name="rowClassName"
|
|
|
+ :cell-class-name="cellClass"
|
|
|
+ :column-props="{ formatter: tableDataFormatter }"
|
|
|
+ @sort-rule-change="sortRuleChangeHandler"
|
|
|
+ @cell-click="cellClickHandler"
|
|
|
+ />
|
|
|
</div>
|
|
|
+ <!-- <div class="table-footer">
|
|
|
+ <span class="table-footer-count"
|
|
|
+ >货运航班总数:{{ tableDataCount.freightFlightCount }}</span
|
|
|
+ >
|
|
|
+ <span class="table-footer-count"
|
|
|
+ >货站交接总数:{{ tableDataCount.depotFlightCount }}</span
|
|
|
+ >
|
|
|
+ <span v-if="isDeparture" class="table-footer-count"
|
|
|
+ >已装机总数:{{ tableDataCount.loadCount }}</span
|
|
|
+ >
|
|
|
+ <span v-else class="table-footer-count"
|
|
|
+ >已卸机总数:{{ tableDataCount.unloadCount }}</span
|
|
|
+ >
|
|
|
+ </div> -->
|
|
|
</div>
|
|
|
</template>
|
|
|
<script lang="tsx" setup>
|
|
@@ -99,21 +74,13 @@ import AirportForm from './AirportForm.vue'
|
|
|
import ColumnSet from '@/components/ColumnSet/index.vue'
|
|
|
import CountBox from '../../components/CountBox/index.vue'
|
|
|
import CommonSwitch from '../../components/CommonSwitch/index.vue'
|
|
|
-import TableHeaderCell from '@/components/TableHeaderCell/index.vue'
|
|
|
+import SimpleTable from '@/components/SimpleTable/index.vue'
|
|
|
import { useTableColumnSet } from '@/hooks/useTableColumnSet'
|
|
|
import { useAirportTable } from './useAirportTable'
|
|
|
import { useTableStyle } from '../../hooks/useTableStyle'
|
|
|
import { useTableCellClick } from '../../hooks/useTableCellClick'
|
|
|
-import { useTableFilterAndSort } from '@/hooks/useTableFilterAndSort'
|
|
|
import { useFormatter } from './useFormatter'
|
|
|
-import { ElTableV2, RowEventHandlers, TableV2Instance } from 'element-plus'
|
|
|
import { CommonData } from '~/common'
|
|
|
-import type {
|
|
|
- HeaderRenderProps,
|
|
|
- CellRenderProps,
|
|
|
- RowClassGetter,
|
|
|
- ScrollParams,
|
|
|
-} from '../../type'
|
|
|
import { useLoop } from '@/hooks/useLoop'
|
|
|
import { useTableSettingsStore } from '@/store/tableSettings'
|
|
|
import { useFlightState } from './useFlightState'
|
|
@@ -139,11 +106,7 @@ const { tableColumns, tableData, getTableData } = useAirportTable(
|
|
|
|
|
|
const finishedCount = ref(0)
|
|
|
|
|
|
-const { warningRules, getWarningRules } = useFlightState(
|
|
|
- props.name,
|
|
|
- tableData,
|
|
|
- finishedCount
|
|
|
-)
|
|
|
+const { getWarningRules } = useFlightState(props.name, tableData, finishedCount)
|
|
|
|
|
|
useLoop(
|
|
|
[
|
|
@@ -157,91 +120,92 @@ useLoop(
|
|
|
const countFlag = ref(false)
|
|
|
const { tableColumnFormatter, tableDataFormatter } = useFormatter(countFlag)
|
|
|
|
|
|
-const UTCFlag = ref(true)
|
|
|
+// const UTCFlag = ref(true)
|
|
|
|
|
|
-const customRendererColumns = computed(() => [
|
|
|
- {
|
|
|
- key: 'rowNO',
|
|
|
- width: 33,
|
|
|
- title: '序号',
|
|
|
- cellRenderer: ({ rowIndex }: CellRenderProps) => (
|
|
|
- <div class="el-table-v2__cell-text">{rowIndex + 1}</div>
|
|
|
- ),
|
|
|
- align: 'center',
|
|
|
- fixed: isDeparture,
|
|
|
- },
|
|
|
- ...tableColumns.value.map(column => ({
|
|
|
- ...column,
|
|
|
- headerCellRenderer: ({ column }: HeaderRenderProps) => (
|
|
|
- <TableHeaderCell
|
|
|
- v-model:filterValues={filterValueMap[column.columnName]}
|
|
|
- v-model:sortRule={sortRuleMap[column.columnName]}
|
|
|
- label={tableColumnFormatter(column.columnLabel)}
|
|
|
- desc={column.columnDescribe}
|
|
|
- showDesc={Boolean(column.columnDescribe)}
|
|
|
- filterOptions={filterOptionMap[column.columnName]}
|
|
|
- sortable={Boolean(column.needSort)}
|
|
|
- filterStyle="arrow"
|
|
|
- onUpdate:sortRule={() => sortChangeHandler(column.columnName)}
|
|
|
- />
|
|
|
- ),
|
|
|
- cellRenderer: (cell: CellRenderProps) => (
|
|
|
- <>
|
|
|
- <div
|
|
|
- class="el-table-v2__cell-text"
|
|
|
- onClick={() => cellClickHandlerV2(cell)}
|
|
|
- >
|
|
|
- {tableDataFormatter(cell)}
|
|
|
- </div>
|
|
|
- {
|
|
|
- cell.column.columnName === 'flightNO' &&
|
|
|
- (
|
|
|
- cell.rowData.flightState === 'DLY' && <div class="flight-state-delay">延误</div> ||
|
|
|
- cell.rowData.flightState === 'CAN' && <div class="flight-state-cancel">取消</div>
|
|
|
- )
|
|
|
+/* 离港视图默认的排序方式:
|
|
|
+ * 1.已起飞排在前
|
|
|
+ * 2.未起飞中已装机在前
|
|
|
+ * 3.已起飞和未起飞分类中各自按照预计起飞时间排序
|
|
|
+ */
|
|
|
+const defaultSortFunction = (a: CommonData, b: CommonData) => {
|
|
|
+ const departureTimeCompare = (a: CommonData, b: CommonData) => {
|
|
|
+ if (a.planDepartureTime) {
|
|
|
+ if (b.planDepartureTime) {
|
|
|
+ if (a.planDepartureTime > b.planDepartureTime) {
|
|
|
+ return 1
|
|
|
+ } else if (a.planDepartureTime < b.planDepartureTime) {
|
|
|
+ return -1
|
|
|
+ } else {
|
|
|
+ return 0
|
|
|
}
|
|
|
- </>
|
|
|
- ),
|
|
|
- })),
|
|
|
-])
|
|
|
+ } else {
|
|
|
+ return -1
|
|
|
+ }
|
|
|
+ } else if (b.planDepartureTime) {
|
|
|
+ return 1
|
|
|
+ } else {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (a.hasTakenOff === 'Y') {
|
|
|
+ if (b.hasTakenOff === 'Y') {
|
|
|
+ return departureTimeCompare(a, b)
|
|
|
+ } else {
|
|
|
+ return -1
|
|
|
+ }
|
|
|
+ } else if (b.hasTakenOff === 'Y') {
|
|
|
+ return 1
|
|
|
+ } else {
|
|
|
+ if (a.loadPlaneSureTime) {
|
|
|
+ if (b.loadPlaneSureTime) {
|
|
|
+ return departureTimeCompare(a, b)
|
|
|
+ } else {
|
|
|
+ return -1
|
|
|
+ }
|
|
|
+ } else if (b.loadPlaneSureTime) {
|
|
|
+ return 1
|
|
|
+ } else {
|
|
|
+ return departureTimeCompare(a, b)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const filterSortOptions = computed(() => ({
|
|
|
+ defaultFilterValueMap,
|
|
|
+ extraFilterValueMap: flightStateFilter,
|
|
|
+ defaultSortRuleMap: isDeparture
|
|
|
+ ? undefined
|
|
|
+ : {
|
|
|
+ planLandingTime: 'ascending',
|
|
|
+ },
|
|
|
+ defaultSortFunction: isDeparture ? defaultSortFunction : undefined,
|
|
|
+}))
|
|
|
+
|
|
|
+const sortRuleMap = ref({})
|
|
|
+const sortRuleChangeHandler = map => {
|
|
|
+ sortRuleMap.value = map
|
|
|
+}
|
|
|
|
|
|
const { columnChecked } = useTableColumnSet(tableColumns)
|
|
|
-const { rowClassV2, cellClassV2 } = useTableStyle(props.name)
|
|
|
-const cellPropsGetter = params => ({
|
|
|
- class: cellClassV2(params),
|
|
|
-})
|
|
|
+const { rowClass, cellClass } = useTableStyle(props.name)
|
|
|
|
|
|
-const rowClass: RowClassGetter = params => {
|
|
|
- const { rowData, rowIndex } = params
|
|
|
+const rowClassName = params => {
|
|
|
+ const { row, rowIndex } = params
|
|
|
const classes: string[] = []
|
|
|
- if (rowData.hasTakenOff === 'Y' || rowData.hasLanded === 'Y') {
|
|
|
- classes.push('bg-gray')
|
|
|
- if (
|
|
|
- ['planDepartureTime', 'planLandingTime'].some(
|
|
|
- key => sortRuleMap[key] === 'ascending'
|
|
|
- ) &&
|
|
|
- finishedCount.value < tableData.value.length &&
|
|
|
- rowIndex === finishedCount.value - 1
|
|
|
- ) {
|
|
|
- classes.push('underline-red')
|
|
|
- }
|
|
|
- } else if (rowData.loadPlaneSureTime) {
|
|
|
- classes.push('bg-light')
|
|
|
- }
|
|
|
- if (selectedRowKey.value && rowData.rowKey === selectedRowKey.value) {
|
|
|
- classes.push('is-selected')
|
|
|
+ if (
|
|
|
+ (row.hasTakenOff === 'Y' || row.hasLanded === 'Y') &&
|
|
|
+ (['planDepartureTime', 'planLandingTime'].some(
|
|
|
+ key => sortRuleMap.value[key] === 'ascending'
|
|
|
+ ) ||
|
|
|
+ Object.keys(sortRuleMap.value).length === 0) &&
|
|
|
+ finishedCount.value < tableData.value.length &&
|
|
|
+ rowIndex === finishedCount.value - 1
|
|
|
+ ) {
|
|
|
+ classes.push('underline-red')
|
|
|
}
|
|
|
|
|
|
- return `${rowClassV2(params)} ${classes.join(' ')}`
|
|
|
-}
|
|
|
-const selectedRowKey = ref('')
|
|
|
-watch(formData, () => {
|
|
|
- selectedRowKey.value = ''
|
|
|
-})
|
|
|
-const rowEventHandlers: RowEventHandlers = {
|
|
|
- onClick: params => {
|
|
|
- selectedRowKey.value = params.rowKey as string
|
|
|
- },
|
|
|
+ return `${rowClass(params)} ${classes.join(' ')}`
|
|
|
}
|
|
|
|
|
|
const tableDataCount = computed(() =>
|
|
@@ -289,13 +253,10 @@ const tableDataCount = computed(() =>
|
|
|
)
|
|
|
)
|
|
|
|
|
|
-const { cellClickHandlerV2 } = useTableCellClick(props.name)
|
|
|
+const { cellClickHandler } = useTableCellClick(props.name)
|
|
|
|
|
|
const route = useRoute()
|
|
|
-const {
|
|
|
- savedTableFilterValueMap,
|
|
|
- saveTableFilterValues,
|
|
|
-} = useTableSettingsStore()
|
|
|
+const { savedTableFilterValueMap } = useTableSettingsStore()
|
|
|
const defaultFilterValueMap = savedTableFilterValueMap[route.path]
|
|
|
const flightStateFilter = computed<{} | { [x: string]: string[] }>(() => {
|
|
|
switch (formData.flightState) {
|
|
@@ -314,79 +275,7 @@ const flightStateFilter = computed<{} | { [x: string]: string[] }>(() => {
|
|
|
}
|
|
|
})
|
|
|
|
|
|
-/* 离港视图默认的排序方式:
|
|
|
- * 1.已起飞排在前
|
|
|
- * 2.未起飞中已装机在前
|
|
|
- * 3.已起飞和未起飞分类中各自按照预计起飞时间排序
|
|
|
- */
|
|
|
-const defaultSortFunction = (a: CommonData, b: CommonData) => {
|
|
|
- const departureTimeCompare = (a: CommonData, b: CommonData) => {
|
|
|
- if (a.planDepartureTime) {
|
|
|
- if (b.planDepartureTime) {
|
|
|
- if (a.planDepartureTime > b.planDepartureTime) {
|
|
|
- return 1
|
|
|
- } else if (a.planDepartureTime < b.planDepartureTime) {
|
|
|
- return -1
|
|
|
- } else {
|
|
|
- return 0
|
|
|
- }
|
|
|
- } else {
|
|
|
- return -1
|
|
|
- }
|
|
|
- } else if (b.planDepartureTime) {
|
|
|
- return 1
|
|
|
- } else {
|
|
|
- return 0
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (a.hasTakenOff === 'Y') {
|
|
|
- if (b.hasTakenOff === 'Y') {
|
|
|
- return departureTimeCompare(a, b)
|
|
|
- } else {
|
|
|
- return -1
|
|
|
- }
|
|
|
- } else if (b.hasTakenOff === 'Y') {
|
|
|
- return 1
|
|
|
- } else {
|
|
|
- if (a.loadPlaneSureTime) {
|
|
|
- if (b.loadPlaneSureTime) {
|
|
|
- return departureTimeCompare(a, b)
|
|
|
- } else {
|
|
|
- return -1
|
|
|
- }
|
|
|
- } else if (b.loadPlaneSureTime) {
|
|
|
- return 1
|
|
|
- } else {
|
|
|
- return departureTimeCompare(a, b)
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-const {
|
|
|
- filterOptionMap,
|
|
|
- filterValueMap,
|
|
|
- sortRuleMap,
|
|
|
- sortChangeHandler,
|
|
|
- dealedTableData,
|
|
|
-} = useTableFilterAndSort(tableColumns, tableData, {
|
|
|
- defaultFilterValueMap,
|
|
|
- extraFilterValueMap: flightStateFilter,
|
|
|
- defaultSortRuleMap: isDeparture
|
|
|
- ? undefined
|
|
|
- : {
|
|
|
- planLandingTime: 'ascending',
|
|
|
- },
|
|
|
- defaultSortFunction: isDeparture ? defaultSortFunction : undefined,
|
|
|
-})
|
|
|
-const columnsShouldCache = ['IATACode']
|
|
|
-watch(filterValueMap, map => {
|
|
|
- const values: { [x: string]: string[] } = {}
|
|
|
- columnsShouldCache.forEach(columnName => {
|
|
|
- values[columnName] = map[columnName]
|
|
|
- })
|
|
|
- saveTableFilterValues(values)
|
|
|
-})
|
|
|
+const cacheKeys = ['IATACode']
|
|
|
|
|
|
const permissionMap = {
|
|
|
DepartureAirport: {
|
|
@@ -418,6 +307,7 @@ const getPermission = (type?: string) => {
|
|
|
return [permissionMap[props.name][type]]
|
|
|
}
|
|
|
|
|
|
+const tableRef = ref<InstanceType<typeof SimpleTable> | null>(null)
|
|
|
const hasSetTableScroll = ref(false)
|
|
|
watch(
|
|
|
[() => formData.startDate, () => formData.endDate],
|
|
@@ -432,36 +322,10 @@ watch(tableData, async () => {
|
|
|
if (hasSetTableScroll.value || !finishedCount.value) {
|
|
|
return
|
|
|
}
|
|
|
- tableRef.value?.scrollToRow(finishedCount.value - 1, 'start')
|
|
|
- hasSetTableScroll.value = true
|
|
|
-})
|
|
|
-
|
|
|
-// 因为使用了keepalive,需要记录下滚动位置,返回时先滚动到初始位置,再滚动到记录的位置,不然表格会变成空白
|
|
|
-const tableRef = ref<TableV2Instance | null>(null)
|
|
|
-const visibility = ref<'visible' | 'hidden'>('visible')
|
|
|
-const scrollPosition = reactive({
|
|
|
- x: 0,
|
|
|
- y: 0,
|
|
|
-})
|
|
|
-const tableScrollHandler = ({ scrollLeft, scrollTop }: ScrollParams) => {
|
|
|
- scrollPosition.x = scrollLeft
|
|
|
- scrollPosition.y = scrollTop
|
|
|
-}
|
|
|
-onActivated(() => {
|
|
|
- const { x, y } = scrollPosition
|
|
|
- if (x > 0 || y > 0) {
|
|
|
- visibility.value = 'hidden'
|
|
|
- tableRef.value?.scrollTo({ scrollLeft: 0, scrollTop: 0 })
|
|
|
- // 不加延迟的话横向滚动会出错
|
|
|
- // 等待滚动完成再显示,一定要使用visibility,使用v-show或者说display: none一样会变空白
|
|
|
- setTimeout(() => {
|
|
|
- tableRef.value?.scrollTo({
|
|
|
- scrollLeft: x,
|
|
|
- scrollTop: y,
|
|
|
- })
|
|
|
- visibility.value = 'visible'
|
|
|
- }, 0)
|
|
|
+ if (tableRef.value?.table) {
|
|
|
+ tableRef.value?.table?.setScrollTop((finishedCount.value - 1) * 50)
|
|
|
}
|
|
|
+ hasSetTableScroll.value = true
|
|
|
})
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|