123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 |
- <template>
- <div class="airport-view">
- <div class="airport-header">
- <AirportForm :name="name" @form-data-change="formDataChangeHandler" />
- <div class="airport-count">
- <CountBox
- :count-number="tableDataCount.flightCount"
- :length="4"
- label="今日计划航班数"
- />
- <CountBox
- :count-number="
- isDeparture ? finishedCount : tableDataCount.tallyCount
- "
- :length="4"
- label="已完成航班数"
- />
- <CountBox
- :count-number="weightCount"
- label="已转载重量KG"
- :length="8"
- />
- </div>
- <div class="airport-settings">
- <div v-permission="getPermission('count')">
- <CommonSwitch v-model:flag="countFlag" label="显示件数" />
- </div>
- <!-- <div v-permission="getPermission('UTC')">
- <CommonSwitch v-model:flag="UTCFlag" label="开启UTC" />
- </div> -->
- <div v-permission="getPermission('columnSet')">
- <ColumnSet
- :table-columns="tableColumns"
- @checked-submit="columnChecked"
- />
- </div>
- </div>
- </div>
- <div class="airport-table">
- <SimpleTable
- ref="tableRef"
- :columns="tableColumns"
- :data="tableData"
- row-key="rowKey"
- 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>
- 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 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 { useFormatter } from './useFormatter'
- import { CommonData } from '~/common'
- import { useLoop } from '@/hooks/useLoop'
- import { useTableSettingsStore } from '@/store/tableSettings'
- import { useFlightState } from './useFlightState'
- import { Query } from '@/api/webApi'
- import { ElMessage } from 'element-plus'
- const props = defineProps({
- name: {
- type: String,
- required: true,
- },
- })
- const isDeparture = props.name.includes('Departure')
- const formData: CommonData = reactive({})
- const formDataChangeHandler = (data: CommonData) => {
- Object.assign(formData, data)
- }
- const { tableColumns, tableData, getTableData } = useAirportTable(
- props.name,
- formData
- )
- const finishedCount = ref(0)
- const weightCount = ref(0)
- const getWeightCount = async () => {
- try {
- const { startDate, endDate } = formData
- const dataContent = [startDate, endDate]
- const {
- code,
- returnData: { listValues },
- message,
- } = await Query({
- id:
- DATACONTENT_ID[
- `${
- props.name.slice(0, 1).toLowerCase() + props.name.slice(1)
- }WeightCount`
- ],
- dataContent,
- })
- if (Number(code) !== 0) {
- throw new Error(message || '失败')
- }
- if (!listValues.length) {
- ElMessage.info('未查询到重量信息')
- weightCount.value = 0
- return
- }
- weightCount.value = listValues[0].weight
- } catch (error) {
- console.error(error)
- }
- }
- const { getWarningRules } = useFlightState(props.name, tableData, finishedCount)
- useLoop(
- [
- getWeightCount,
- getTableData,
- // getWarningRules,
- ],
- 'airport',
- [formData]
- )
- const countFlag = ref(false)
- const { tableColumnFormatter, tableDataFormatter } = useFormatter(countFlag)
- // const UTCFlag = ref(true)
- /* 离港视图默认的排序方式:
- * 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 { rowClass, cellClass } = useTableStyle(props.name)
- const rowClassName = params => {
- const { row, rowIndex } = params
- const classes: string[] = []
- 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 `${rowClass(params)} ${classes.join(' ')}`
- }
- const tableDataCount = computed(() =>
- tableData.value.reduce(
- (counts: { [x: string]: number }, current) => {
- // const preCount = current[isDeparture ? 'preLoad' : 'preUnload']
- // if (preCount) {
- // counts.waybillCount += Number(String(preCount).split('/')[0])
- // counts.goodsCount += Number(String(preCount).split('/')[1])
- // }
- if (typeof current['allNumber'] === 'number') {
- counts.flightCount = current['allNumber']
- }
- if (current['depotJoinTime'] || current['depotJoinTime_IN']) {
- counts.depotFlightCount++
- }
- const isFreight = tableColumns.value.some(
- column => column.groupName === '地服相关' && current[column.columnName]
- )
- if (isFreight) {
- counts.freightFlightCount++
- }
- if (current['loadPlaneSureTime']) {
- counts.loadCount++
- }
- if (current['unLoadTime']) {
- counts.unloadCount++
- }
- if (current['tallyTime_in']) {
- counts.tallyCount++
- }
- return counts
- },
- {
- // waybillCount: 0,
- // goodsCount: 0,
- flightCount: 0,
- depotFlightCount: 0,
- freightFlightCount: 0,
- loadCount: 0,
- unloadCount: 0,
- tallyCount: 0,
- }
- )
- )
- const { cellClickHandler } = useTableCellClick(props.name)
- const route = useRoute()
- const { savedTableFilterValueMap } = useTableSettingsStore()
- const defaultFilterValueMap = savedTableFilterValueMap[route.path]
- const flightStateFilter = computed<{} | { [x: string]: string[] }>(() => {
- switch (formData.flightState) {
- case 'hasTakenOff':
- return { hasTakenOff: ['Y'] }
- case 'hasNotTakenOff':
- return { hasTakenOff: ['N'] }
- case 'hasLanded':
- return { hasLanded: ['Y'] }
- case 'hasNotLanded':
- return { hasLanded: ['N'] }
- case 'canceled':
- return { flightState: ['CAN'] }
- case 'groundService':
- return { groundService: ['Y'] }
- default:
- return {}
- }
- })
- const cacheKeys = ['IATACode']
- const permissionMap = {
- DepartureAirport: {
- count:
- 'number_of_pieces_displayed_in_domestic_departure_terminal_view_button',
- UTC: 'turn_on_utc_in_view_of_domestic_departure_terminal_button',
- columnSet: 'domestic_departure_terminal_view_column_setting_button',
- },
- InternationalDepartureAirport: {
- count:
- 'number_of_pieces_displayed_in_international_departure_terminal_view_button',
- UTC: 'international_departure_terminal_view_opens_utc_button',
- columnSet: 'international_departure_terminal_view_column_setting_button',
- },
- ArrivalAirport: {
- count:
- 'number_of_pieces_displayed_in_domestic_inbound_terminal_view_button',
- UTC: 'turn_on_utc_in_view_of_domestic_inbound_terminal_button',
- columnSet: 'domestic_inbound_terminal_view_column_setting_button',
- },
- InternationalArrivalAirport: {
- count:
- 'number_of_display_pieces_of_international_inbound_terminal_view_button',
- UTC: 'the_view_of_international_inbound_terminal_opens_utc_button',
- columnSet: 'view_column_setting_of_international_inbound_terminal_button',
- },
- }
- 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],
- ([startDate, endDate], [preStartDate, preEndDate]) => {
- if (startDate !== preStartDate || endDate !== preEndDate) {
- hasSetTableScroll.value = false
- }
- }
- )
- watch(tableData, async () => {
- await nextTick()
- if (hasSetTableScroll.value || !finishedCount.value) {
- return
- }
- if (tableRef.value?.table) {
- tableRef.value?.table?.setScrollTop((finishedCount.value - 1) * 50)
- }
- hasSetTableScroll.value = true
- })
- </script>
- <style lang="scss" scoped>
- @import './index.scss';
- </style>
|