Prechádzať zdrojové kódy

Merge branch 'dev_zyh' of United_Software/k_online_ui into dev

Jack Zhou 1 rok pred
rodič
commit
ebbdfa01d4

+ 11 - 3
src/components/ContainerStatus/src/ContainerStatus.vue

@@ -26,8 +26,16 @@ watch(
   }
 )
 
-const formatDate = (date: string) => {
-  return date ? dayjs(date).format('MMM-DD-YYYY HH:mm [(GMT]Z[)]') : '--'
+const formatTimezone = (tiem: string, timezone: string) => {
+  if (!tiem) return '--'
+  const formattedTime = dayjs(tiem).format('MMM-DD-YYYY hh:mm A')
+  let gmtOffset = ''
+  if (timezone && timezone.length > 3) {
+    const timeZoneOffset = dayjs().tz(timezone).format('Z')
+    // 替换 "+07:00" 为 "GMT+7"
+    gmtOffset = `(GMT${timeZoneOffset.slice(0, 3)})`
+  }
+  return `${formattedTime} ${gmtOffset}`
 }
 </script>
 
@@ -51,7 +59,7 @@ const formatDate = (date: string) => {
             <div class="info">
               <div class="left-info">
                 <div class="title">{{ item.title }}</div>
-                <div class="date">{{ formatDate(item.date) }}</div>
+                <div class="date">{{ formatTimezone(item.date, item.timezone) }}</div>
               </div>
               <div class="right-country">{{ item.country }}</div>
             </div>

+ 2 - 11
src/stores/modules/headerSearch.ts

@@ -3,15 +3,13 @@ import { defineStore } from 'pinia'
 interface HeaderSearch {
   searchValue: string
   searchResult?: string
-  isChangeByLogin: boolean
   trackingData?: any
 }
 export const useHeaderSearch = defineStore('headerSearch', {
   state: (): HeaderSearch => ({
     searchValue: JSON.parse(localStorage.getItem('searchData'))?.searchValue || '',
     searchResult: JSON.parse(localStorage.getItem('searchData'))?.searchResult || '',
-    trackingData: JSON.parse(localStorage.getItem('searchData'))?.searchResult || {},
-    isChangeByLogin: Boolean(localStorage.getItem('isChangeByLogin')) || false
+    trackingData: JSON.parse(localStorage.getItem('searchData'))?.searchResult || {}
   }),
   getters: {},
   actions: {
@@ -21,19 +19,12 @@ export const useHeaderSearch = defineStore('headerSearch', {
       this.searchResult = searchData?.searchResult
       this.trackingData = searchData?.trackingData
     },
-    setChangeByLogin(isChangeByLogin: boolean) {
-      localStorage.setItem('isChangeByLogin', JSON.stringify(isChangeByLogin))
-      this.isChangeByLogin = isChangeByLogin
-    },
+
     clearSearchData() {
       localStorage.removeItem('searchData')
       this.searchValue = ''
       this.searchResult = ''
       this.trackingData = ''
-    },
-    clearChangeByLogin() {
-      localStorage.removeItem('isChangeByLogin')
-      this.isChangeByLogin = false
     }
   }
 })

+ 1 - 1
src/utils/table.ts

@@ -53,7 +53,7 @@ export const autoWidth = (tableData: VxeGridProps, grid: VxeGridInstance) => {
   })
   columnsWidth.forEach((item) => {
     const curColumn: any = columns.find((column: any) => column.field === item.field)
-    curColumn.minWidth = item.width
+    curColumn.width = item.width
   })
   // 表格重新刷新列配置
   grid.reloadColumn(columns)

+ 24 - 14
src/views/Booking/src/components/BookingDetail/src/BookingDetail.vue

@@ -1,7 +1,4 @@
 <script setup lang="ts">
-import dayjs from 'dayjs'
-import timezone from 'dayjs/plugin/timezone'
-import utc from 'dayjs/plugin/utc'
 import { VueDraggable } from 'vue-draggable-plus'
 import BasicInformation from './components/BasicInformation.vue'
 import ContainersView from './components/ContainersView.vue'
@@ -10,9 +7,13 @@ import { cloneDeep } from 'lodash'
 import { transportationMode } from '@/components/TransportationMode'
 import { useRoute } from 'vue-router'
 import { useOverflow } from '@/hooks/useOverflow'
+import dayjs from 'dayjs'
+import timezone from 'dayjs/plugin/timezone'
+import utc from 'dayjs/plugin/utc'
 
 dayjs.extend(utc)
 dayjs.extend(timezone)
+
 const route = useRoute()
 
 // 可拖拽模块的列表
@@ -90,16 +91,16 @@ const getData = () => {
 }
 getData()
 
-const formatTime = (time: string) => {
-  return time ? dayjs(time).format('MMM-DD-YYYY hh:mm A') : '--'
-}
 const formatTimezone = (tiem: string, timezone: string) => {
   if (!tiem) return '--'
   const formattedTime = dayjs(tiem).format('MMM-DD-YYYY hh:mm A')
-  const timeZoneOffset = dayjs().tz(timezone).format('Z')
-  // 替换 "+07:00" 为 "GMT+7"
-  const gmtOffset = `GMT${timeZoneOffset.slice(0, 3)}`
-  return `${formattedTime} (${gmtOffset})`
+  let gmtOffset = ''
+  if (timezone && timezone.length > 3) {
+    const timeZoneOffset = dayjs().tz(timezone).format('Z')
+    // 替换 "+07:00" 为 "GMT+7"
+    gmtOffset = `(GMT${timeZoneOffset.slice(0, 3)})`
+  }
+  return `${formattedTime} ${gmtOffset}`
 }
 
 const originRef = ref()
@@ -161,19 +162,28 @@ const { isOverflow: isDestinationOverflow } = useOverflow(destinationRef, allDat
           <div class="title">ETD/ATD</div>
           <div class="content">
             <span
-              >{{ formatTime(allData?.transportInfo?.etd) }}
+              >{{
+                formatTimezone(allData?.transportInfo?.etd, allData?.transportInfo?.etd_timezone)
+              }}
               /
             </span>
             <span style="color: var(--color-neutral-1)">{{
-              formatTime(allData?.transportInfo?.atd)
+              formatTimezone(allData?.transportInfo?.atd, allData?.transportInfo?.atd_timezone)
             }}</span>
           </div>
         </div>
         <div class="item">
           <div class="title">ETA/ATA</div>
           <div class="content">
-            <span>{{ formatTime(allData?.transportInfo?.eta) }} / </span>
-            <span>{{ formatTime(allData?.transportInfo?.ata) }}</span>
+            <span
+              >{{
+                formatTimezone(allData?.transportInfo?.eta, allData?.transportInfo?.eta_timezone)
+              }}
+              /
+            </span>
+            <span>{{
+              formatTimezone(allData?.transportInfo?.ata, allData?.transportInfo?.ata_timezone)
+            }}</span>
           </div>
         </div>
       </div>

+ 56 - 32
src/views/Booking/src/components/BookingTable/src/BookingTable.vue

@@ -82,14 +82,31 @@ const getTableColumns = async () => {
   nextTick(() => {
     tableRef.value && autoWidth(bookingTable.value, tableRef.value)
     tableLoadingColumn.value = false
+    selectedNumber.value = 0
+    selectedTableData.value = []
   })
 }
 
 const pageInfo = ref({ pageNo: 1, pageSize: 100, total: 0 })
 
 const tempSearch = ref()
-// 获取表格数据
 let filterdataobj: any = {}
+// 获得表格数据后赋值
+const assignTableData = (data: any) => {
+  bookingTable.value.data = data.searchData || []
+  pageInfo.value.total = Number(data.rc)
+  tempSearch.value = data.tmp_search
+  // 拥有所有字段的表格
+  setTimeout(() => {
+    allTable.value.columns = handleColumns(data.allColums, 'all')
+    allTable.value.data = data.searchData || []
+    // 为了让导出的表格列宽度自适应
+    nextTick(() => {
+      allTableRef.value && autoWidth(allTable.value, allTableRef.value)
+    })
+  }, 1000)
+}
+// 获取表格数据
 const getTableData = async (isPageChange?: boolean) => {
   const rc = isPageChange ? pageInfo.value.total : -1
   tableLoadingTableData.value = true
@@ -103,24 +120,17 @@ const getTableData = async (isPageChange?: boolean) => {
     })
     .then((res: any) => {
       if (res.code === 200) {
-        bookingTable.value.data = res.data.searchData || []
-        pageInfo.value.total = Number(res.data.rc)
-        tempSearch.value = res.data.tmp_search
-        // 拥有所有字段的表格
-        setTimeout(() => {
-          allTable.value.columns = handleColumns(res.data.allColums, 'all')
-          allTable.value.data = res.data.searchData || []
-          // 为了让导出的表格列宽度自适应
-          nextTick(() => {
-            allTableRef.value && autoWidth(allTable.value, allTableRef.value)
-          })
-        }, 1000)
+        assignTableData(res.data)
       }
     })
-  nextTick(() => {
-    tableRef.value && autoWidth(bookingTable.value, tableRef.value)
-    tableLoadingTableData.value = false
-  })
+    .finally(() => {
+      selectedNumber.value = 0
+      selectedTableData.value = []
+      nextTick(() => {
+        tableRef.value && autoWidth(bookingTable.value, tableRef.value)
+        tableLoadingTableData.value = false
+      })
+    })
 }
 // 查询列表数据
 const searchTableData = (data: any) => {
@@ -136,23 +146,16 @@ const searchTableData = (data: any) => {
     })
     .then((res: any) => {
       if (res.code === 200) {
-        bookingTable.value.data = res.data.searchData || []
-        pageInfo.value.total = Number(res.data.rc)
-        tempSearch.value = res.data.tmp_search
-        // 拥有所有字段的表格
-        setTimeout(() => {
-          allTable.value.columns = handleColumns(res.data.allColums, 'all')
-          allTable.value.data = res.data.searchData || []
-          // 为了让导出的表格列宽度自适应
-          nextTick(() => {
-            allTableRef.value && autoWidth(allTable.value, allTableRef.value)
-          })
-        }, 1000)
+        assignTableData(res.data)
       }
     })
     .finally(() => {
-      tableRef.value && autoWidth(bookingTable.value, tableRef.value)
-      tableLoadingTableData.value = false
+      selectedNumber.value = 0
+      selectedTableData.value = []
+      nextTick(() => {
+        tableRef.value && autoWidth(bookingTable.value, tableRef.value)
+        tableLoadingTableData.value = false
+      })
     })
 }
 
@@ -258,12 +261,21 @@ const handleDownload = () => {
       curSelectedColumns.push(item.title)
     }
   })
-  downloadDialogRef.value.openDialog(props.tagsData, curSelectedColumns)
+  downloadDialogRef.value.openDialog(
+    props.tagsData,
+    curSelectedColumns,
+    selectedNumber.value || pageInfo.value.total
+  )
 }
 
 const exportLoading = ref(false)
 // 获取导出表格数据
 const getExportTableData = (status: number) => {
+  // 如果有选中表格行数据,那么只到处选中的数据
+  if (selectedNumber.value > 0) {
+    exportTable(status)
+    return
+  }
   exportLoading.value = true
   const buildColumnString = (columns: any[]): string => {
     return columns
@@ -312,8 +324,17 @@ const exportTable = (status: number) => {
       // 排除复选框列
       return column.field && index !== -1
     }
+
     exportConfig.columns = bookingTable.value.columns
   }
+  if (selectedNumber.value > 0) {
+    exportConfig.dataFilterMethod = ({ row }: any) => {
+      const index = selectedTableData.value.findIndex(
+        (item: any) => item._X_ROW_KEY === row._X_ROW_KEY
+      )
+      return index !== -1
+    }
+  }
   allTableRef.value?.exportData(exportConfig)
 }
 
@@ -367,12 +388,15 @@ const handleLinkClick = (row: any, column: any) => {
 }
 
 const selectedNumber = ref(0)
+const selectedTableData = ref([])
 // 复选框选中事件
 const handleCheckboxChange = ({ records }: any) => {
   selectedNumber.value = records.length
+  selectedTableData.value = records
 }
 const handleCheckAllChange = ({ records }: any) => {
   selectedNumber.value = records.length
+  selectedTableData.value = records
 }
 defineExpose({
   searchTableData,

+ 4 - 3
src/views/Booking/src/components/BookingTable/src/components/DownloadDialog.vue

@@ -1,8 +1,9 @@
 <script setup lang="ts">
 const dialogVisible = ref(false)
 
-const openDialog = (tagsData: string[], selectedColumns: string[]) => {
+const openDialog = (tagsData: string[], selectedColumns: string[], slectedDataNumber: number) => {
   listData.value = tagsData
+  selectedDataNumber.value = slectedDataNumber
   columns.value = selectedColumns
   dialogVisible.value = true
 }
@@ -10,7 +11,7 @@ const openDialog = (tagsData: string[], selectedColumns: string[]) => {
 const isShowSelectColumn = ref(false)
 
 const downloadFilter = ref(1)
-
+const selectedDataNumber = ref(0)
 const listData = ref()
 
 const columns = ref()
@@ -38,7 +39,7 @@ defineExpose({
         <div class="select-data">
           <div style="display: inline-block">
             Select data on your booking list:<span style="color: var(--color-theme)">{{
-              listData.length || 0
+              selectedDataNumber
             }}</span>
           </div>
         </div>

+ 8 - 23
src/views/Layout/src/components/Header/HeaderView.vue

@@ -68,34 +68,19 @@ const handleSearch = () => {
           } else {
             isJumpPageBySearch.value = true
           }
-          if (searchData.length === 1) {
-            router.push({
-              name: 'Tracking Detail',
-              query: {
-                a: res.data.searchData[0].__serial_no,
-                _schemas: res.data.searchData[0].__schemas
-              }
-            })
-          } else if (searchData.length !== 1) {
-            headerSearch.setChangeByLogin(true)
-            headerSearch.setSearchData({
-              searchValue: searchValue.value,
-              searchResult: '',
-              trackingData: res.data
-            })
-            // localStorage.setItem('TrackingData', JSON.stringify(res.data))
-            router.push({
-              name: 'Tracking'
-            })
-          }
+          headerSearch.setSearchData({
+            searchValue: searchValue.value,
+            searchResult: '',
+            trackingData: res.data
+          })
+          router.push({
+            name: 'Tracking'
+          })
         }
       })
   }
 }
 onBeforeRouteUpdate((to, from, next) => {
-  // if (to.name === 'Tracking') {
-  //   headerSearch.setChangeByLogin(false)
-  // }
   if (isJumpPageBySearch.value) {
     isJumpPageBySearch.value = false
   } else {

+ 1 - 0
src/views/Tracking/src/components/PublicTracking/src/PublicTrackingSearch.vue

@@ -94,6 +94,7 @@ const confirmVerify = () => {
         class="public-tracking-search-input"
         v-model="inputVModel"
         @focus="searchResult = ''"
+        @keyup.enter="handleSearchNo"
         placeholder="Search a reference number to see shipment details"
       >
         <template #append>

+ 14 - 14
src/views/Tracking/src/components/PublicTracking/src/components/BasicInformation.vue

@@ -76,52 +76,52 @@ const convertData = (data: any) => {
       top: [
         {
           label: 'MAWB/MBL No.',
-          content: data.basicInfo['MAWB/MBL No.']
+          content: data.basicInfo['MAWB/MBL No.'] || '--'
         },
         {
           label: 'HAWB/HBL No.',
-          content: data.basicInfo['HAWB/HBOL']
+          content: data.basicInfo['HAWB/HBOL'] || '--'
         },
         {
           label: 'Booking No.',
-          content: data.basicInfo.Carrier_Booking_No
+          content: data.basicInfo.Carrier_Booking_No || '--'
         },
         {
           label: 'PO No.',
-          content: data.basicInfo.PO_NO
+          content: data.basicInfo.PO_NO || '--'
         }
       ]
     },
     businessPartners: [
       {
         title: 'Origin Agent',
-        company: data.businessPartners.origin.company,
-        address: data.businessPartners.origin.address,
-        phone: data.businessPartners.origin.phone
+        company: data.businessPartners.origin.company || '--',
+        address: data.businessPartners.origin.address || '--',
+        phone: data.businessPartners.origin.phone || '--'
       },
       {
         title: 'Destination Agent',
-        company: data.businessPartners.destination.company,
-        address: data.businessPartners.destination.address,
-        phone: data.businessPartners.destination.phone
+        company: data.businessPartners.destination.company || '--',
+        address: data.businessPartners.destination.address || '--',
+        phone: data.businessPartners.destination.phone || '--'
       }
     ],
     packing: [
       {
         label: 'Quantity / Unit',
-        content: data.packing['Quantity/Unit']
+        content: data.packing['Quantity/Unit'] || '--'
       },
       {
         label: 'G. Weight',
-        content: data.packing['G. Weight']
+        content: data.packing['G. Weight'] || '--'
       },
       {
         label: 'Ch. Weight',
-        content: data.packing['Ch. Weight']
+        content: data.packing['Ch. Weight'] || '--'
       },
       {
         label: 'Volume',
-        content: data.packing.Volume
+        content: data.packing.Volume || '--'
       }
     ]
   }

+ 10 - 7
src/views/Tracking/src/components/PublicTracking/src/components/MilestonesTable.vue

@@ -47,10 +47,13 @@ const handleColumns = (columns: any) => {
         formatter: ({ cellValue, row }: any) => {
           if (!cellValue) return '--'
           const formattedTime = dayjs(cellValue).format('MMM-DD-YYYY hh:mm A')
-          const timeZoneOffset = dayjs().tz(row.timezone).format('Z')
-          // 替换 "+07:00" 为 "GMT+7"
-          const gmtOffset = `GMT${timeZoneOffset.slice(0, 3)}`
-          return `${formattedTime} (${gmtOffset})`
+          let gmtOffset = ''
+          if (row.timezone && row.timezone.length > 3) {
+            const timeZoneOffset = dayjs().tz(row.timezone).format('Z')
+            // 替换 "+07:00" 为 "GMT+7"
+            gmtOffset = `(GMT${timeZoneOffset.slice(0, 3)})`
+          }
+          return `${formattedTime} ${gmtOffset}`
         }
       }
     }
@@ -65,9 +68,9 @@ watch(
     if (milestones && milestones.Milestones_column) {
       tableData.value.columns = handleColumns(milestones.Milestones_column)
       tableData.value.data = milestones.Milestones_data
-      nextTick(() => {
-        tableRef.value && autoWidth(tableData.value, tableRef.value)
-      })
+      // nextTick(() => {
+      //   tableRef.value && autoWidth(tableData.value, tableRef.value)
+      // })
     }
   },
   {

+ 30 - 6
src/views/Tracking/src/components/PublicTracking/src/components/PublicTrackingDetail.vue

@@ -4,8 +4,12 @@ import MilestonesTable from './MilestonesTable.vue'
 import { transportationMode } from '@/components/TransportationMode'
 import { useRoute } from 'vue-router'
 import dayjs from 'dayjs'
+import timezone from 'dayjs/plugin/timezone'
+import utc from 'dayjs/plugin/utc'
 import { useOverflow } from '@/hooks/useOverflow'
 
+dayjs.extend(utc)
+dayjs.extend(timezone)
 const route = useRoute()
 
 const allData: any = ref({
@@ -64,8 +68,16 @@ if (Object.keys(sharedData).length === 0) {
   allData.value = sharedData
 }
 
-const formatTime = (time: string) => {
-  return time ? dayjs(time).format('MMM-DD-YYYY hh:mm A') : '--'
+const formatTimezone = (tiem: string, timezone: string) => {
+  if (!tiem) return '--'
+  const formattedTime = dayjs(tiem).format('MMM-DD-YYYY hh:mm A')
+  let gmtOffset = ''
+  if (timezone && timezone.length > 3) {
+    const timeZoneOffset = dayjs().tz(timezone).format('Z')
+    // 替换 "+07:00" 为 "GMT+7"
+    gmtOffset = `(GMT${timeZoneOffset.slice(0, 3)})`
+  }
+  return `${formattedTime} ${gmtOffset}`
 }
 
 const originRef = ref()
@@ -124,17 +136,29 @@ const { isOverflow: isDestinationOverflow } = useOverflow(destinationRef, allDat
         <div class="item">
           <div class="title">ETD/ATD</div>
           <div class="content">
-            <span>{{ formatTime(allData?.transportInfo?.etd) }} / </span>
+            <span
+              >{{
+                formatTimezone(allData?.transportInfo?.etd, allData?.transportInfo?.etd_timezone)
+              }}
+              /
+            </span>
             <span style="color: var(--color-neutral-1)">{{
-              formatTime(allData?.transportInfo?.atd)
+              formatTimezone(allData?.transportInfo?.atd, allData?.transportInfo?.atd_timezone)
             }}</span>
           </div>
         </div>
         <div class="item">
           <div class="title">ETA/ATA</div>
           <div class="content">
-            <span>{{ formatTime(allData?.transportInfo?.eta) }} / </span>
-            <span>{{ formatTime(allData?.transportInfo?.ata) }}</span>
+            <span
+              >{{
+                formatTimezone(allData?.transportInfo?.eta, allData?.transportInfo?.eta_timezone)
+              }}
+              /
+            </span>
+            <span>{{
+              formatTimezone(allData?.transportInfo?.ata, allData?.transportInfo?.ata_timezone)
+            }}</span>
           </div>
         </div>
       </div>

+ 31 - 6
src/views/Tracking/src/components/TrackingDetail/src/TrackingDetail.vue

@@ -1,5 +1,7 @@
 <script setup lang="ts">
 import dayjs from 'dayjs'
+import timezone from 'dayjs/plugin/timezone'
+import utc from 'dayjs/plugin/utc'
 import { VueDraggable } from 'vue-draggable-plus'
 import BasicInformation from './components/BasicInformation.vue'
 import ContainersView from './components/ContainersView.vue'
@@ -15,6 +17,9 @@ import { transportationMode } from '@/components/TransportationMode'
 import { useRoute } from 'vue-router'
 import { useOverflow } from '@/hooks/useOverflow'
 
+dayjs.extend(utc)
+dayjs.extend(timezone)
+
 const route = useRoute()
 
 // 可拖拽模块的列表
@@ -105,8 +110,16 @@ const getData = () => {
 }
 getData()
 
-const formatTime = (time: string) => {
-  return time ? dayjs(time).format('MMM-DD-YYYY hh:mm A') : '--'
+const formatTimezone = (tiem: string, timezone: string) => {
+  if (!tiem) return '--'
+  const formattedTime = dayjs(tiem).format('MMM-DD-YYYY hh:mm A')
+  let gmtOffset = ''
+  if (timezone && timezone.length > 3) {
+    const timeZoneOffset = dayjs().tz(timezone).format('Z')
+    // 替换 "+07:00" 为 "GMT+7"
+    gmtOffset = `(GMT${timeZoneOffset.slice(0, 3)})`
+  }
+  return `${formattedTime} ${gmtOffset}`
 }
 
 const originRef = ref()
@@ -181,17 +194,29 @@ const { isOverflow: isDestinationOverflow } = useOverflow(destinationRef, allDat
         <div class="item">
           <div class="title">ETD/ATD</div>
           <div class="content">
-            <span>{{ formatTime(allData?.transportInfo?.etd) }} / </span>
+            <span
+              >{{
+                formatTimezone(allData?.transportInfo?.etd, allData?.transportInfo?.etd_timezone)
+              }}
+              /
+            </span>
             <span style="color: var(--color-neutral-1)">{{
-              formatTime(allData?.transportInfo?.atd)
+              formatTimezone(allData?.transportInfo?.atd, allData?.transportInfo?.atd_timezone)
             }}</span>
           </div>
         </div>
         <div class="item">
           <div class="title">ETA/ATA</div>
           <div class="content">
-            <span>{{ formatTime(allData?.transportInfo?.eta) }} / </span>
-            <span>{{ formatTime(allData?.transportInfo?.ata) }}</span>
+            <span
+              >{{
+                formatTimezone(allData?.transportInfo?.eta, allData?.transportInfo?.eta_timezone)
+              }}
+              /
+            </span>
+            <span>{{
+              formatTimezone(allData?.transportInfo?.ata, allData?.transportInfo?.ata_timezone)
+            }}</span>
           </div>
         </div>
       </div>

+ 3 - 4
src/views/Tracking/src/components/TrackingDetail/src/components/AttachmentView.vue

@@ -1,5 +1,4 @@
 <script setup lang="ts">
-import dayjs from 'dayjs'
 import { type VxeGridInstance, type VxeGridProps } from 'vxe-table'
 import { autoWidth } from '@/utils/table'
 import { useRowClickStyle } from '@/hooks/rowClickStyle'
@@ -59,9 +58,9 @@ watch(
         }
       ]
       tableData.value.data = attachment.document_data
-      nextTick(() => {
-        tableRef.value && autoWidth(tableData.value, tableRef.value)
-      })
+      // nextTick(() => {
+      //   tableRef.value && autoWidth(tableData.value, tableRef.value)
+      // })
     }
   },
   {

+ 10 - 7
src/views/Tracking/src/components/TrackingDetail/src/components/MilestonesTable.vue

@@ -49,10 +49,13 @@ const handleColumns = (columns: any) => {
         formatter: ({ row, cellValue }: any) => {
           if (!cellValue) return '--'
           const formattedTime = dayjs(cellValue).format('MMM-DD-YYYY hh:mm A')
-          const timeZoneOffset = dayjs().tz(row.timezone).format('Z')
-          // 替换 "+07:00" 为 "GMT+7"
-          const gmtOffset = `GMT${timeZoneOffset.slice(0, 3)}`
-          return `${formattedTime} (${gmtOffset})`
+          let gmtOffset = ''
+          if (row.timezone && row.timezone.length > 3) {
+            const timeZoneOffset = dayjs().tz(row.timezone).format('Z')
+            // 替换 "+07:00" 为 "GMT+7"
+            gmtOffset = `(GMT${timeZoneOffset.slice(0, 3)})`
+          }
+          return `${formattedTime} ${gmtOffset}`
         }
       }
     }
@@ -67,9 +70,9 @@ watch(
     if (milestones && milestones.Milestones_column) {
       tableData.value.columns = handleColumns(milestones.Milestones_column)
       tableData.value.data = milestones.Milestones_data
-      nextTick(() => {
-        tableRef.value && autoWidth(tableData.value, tableRef.value)
-      })
+      // nextTick(() => {
+      //   tableRef.value && autoWidth(tableData.value, tableRef.value)
+      // })
     }
   },
   {

+ 78 - 113
src/views/Tracking/src/components/TrackingTable/src/TrackingTable.vue

@@ -64,7 +64,7 @@ const handleColumns = (columns: any, status?: string) => {
 }
 
 // 获取表格列
-const getTableColumns = async (isInit: boolean) => {
+const getTableColumns = async () => {
   tableLoadingColumn.value = true
   await $api.getTrackingTableColumns().then((res: any) => {
     if (res.code === 200) {
@@ -85,7 +85,9 @@ const getTableColumns = async (isInit: boolean) => {
     }
   })
   nextTick(() => {
-    !isInit && (tableLoadingColumn.value = false)
+    tableLoadingColumn.value = false
+    selectedNumber.value = 0
+    selectedTableData.value = []
   })
 }
 
@@ -93,46 +95,51 @@ const pageInfo = ref({ pageNo: 1, pageSize: 100, total: 0 })
 const TagsList = ref()
 const tempSearch = ref('')
 
-// 获取表格数据
+// 获得表格数据后赋值
+const assignTableData = (data: any) => {
+  trackingTable.value.data = data.searchData || []
+  pageInfo.value.total = Number(data.rc)
+  TagsList.value = data.tagsList
+  tempSearch.value = data.tmp_search
+
+  if (data.canEdiVgm && trackingTable.value.columns.length > 0) {
+    const index = trackingTable.value.columns.findIndex((item: any) => item.title === 'Action')
+    if (index === -1) {
+      trackingTable.value.columns.push({
+        title: 'Action',
+        fixed: 'right',
+        width: 80,
+        slots: { default: 'action' }
+      })
+    }
+  }
+  // 拥有所有字段的表格
+  setTimeout(() => {
+    allTable.value.columns = handleColumns(data.allColums, 'all')
+    allTable.value.data = data.searchData
+    nextTick(() => {
+      allTableRef.value && autoWidth(allTable.value, allTableRef.value)
+    })
+  }, 1000)
+}
+
 let filterdataobj: any = {}
 const getSharedTableData = () => {
   const trackingData = JSON.parse(localStorage.getItem('searchData'))?.trackingData
   if (trackingData) {
-    trackingTable.value.data = trackingData.searchData || []
-    pageInfo.value.total = Number(trackingData.rc)
     pageInfo.value.pageSize = Number(trackingData.ps)
-    TagsList.value = trackingData.tagsList
-    tempSearch.value = trackingData.tmp_search
-
-    if (trackingData.canEdiVgm && trackingTable.value.columns.length > 0) {
-      const index = trackingTable.value.columns.findIndex((item: any) => item.title === 'Action')
-      if (index === -1) {
-        trackingTable.value.columns.push({
-          title: 'Action',
-          fixed: 'right',
-          width: 80,
-          slots: { default: 'action' }
-        })
-      }
-    }
+    assignTableData(trackingData)
+    selectedNumber.value = 0
+    selectedTableData.value = []
     nextTick(() => {
       tableRef.value && autoWidth(trackingTable.value, tableRef.value)
     })
-
-    // 拥有所有字段的表格
-    setTimeout(() => {
-      allTable.value.columns = handleColumns(trackingData.allColums, 'all')
-
-      allTable.value.data = trackingData.searchData || []
-      nextTick(() => {
-        allTableRef.value && autoWidth(allTable.value, allTableRef.value)
-      })
-    }, 1000)
     return true
   }
   return false
 }
 
+// 获取表格数据
 const getTableData = async (isPageChange?: boolean) => {
   const rc = isPageChange ? pageInfo.value.total : -1
   tableLoadingTableData.value = true
@@ -142,35 +149,16 @@ const getTableData = async (isPageChange?: boolean) => {
     sessionStorage.getItem('clickParams') != '{}'
   ) {
     const data = JSON.parse(sessionStorage.getItem('clickParams') as string) || {}
-    trackingTable.value.data = data.searchData || []
-    pageInfo.value.total = Number(data.rc)
-    TagsList.value = data.tagsList
-
-    tempSearch.value = data.tmp_search
-
-    if (data.canEdiVgm && trackingTable.value.columns.length > 0) {
-      const index = trackingTable.value.columns.findIndex((item: any) => item.title === 'Action')
-      if (index === -1) {
-        trackingTable.value.columns.push({
-          title: 'Action',
-          fixed: 'right',
-          width: 80,
-          slots: { default: 'action' }
-        })
-      }
-    }
-
-    // 拥有所有字段的表格
-    setTimeout(() => {
-      allTable.value.columns = handleColumns(data.allColums, 'all')
-      allTable.value.data = data.searchData
-      nextTick(() => {
-        allTableRef.value && autoWidth(allTable.value, allTableRef.value)
-      })
-    }, 1000)
+    assignTableData(data)
     setTimeout(() => {
       sessionStorage.removeItem('clickParams')
     }, 5000)
+    nextTick(() => {
+      tableRef.value && autoWidth(trackingTable.value, tableRef.value)
+      tableLoadingTableData.value = false
+      selectedNumber.value = 0
+      selectedTableData.value = []
+    })
   } else {
     await $api
       .getTrackingTableData({
@@ -182,39 +170,18 @@ const getTableData = async (isPageChange?: boolean) => {
       })
       .then((res: any) => {
         if (res.code === 200) {
-          trackingTable.value.data = res.data.searchData || []
-          pageInfo.value.total = Number(res.data.rc)
-          tempSearch.value = res.data.tmp_search
-
-          if (res.data.canEdiVgm && trackingTable.value.columns.length > 0) {
-            const index = trackingTable.value.columns.findIndex(
-              (item: any) => item.title === 'Action'
-            )
-            if (index === -1) {
-              trackingTable.value.columns.push({
-                title: 'Action',
-                fixed: 'right',
-                width: 80,
-                slots: { default: 'action' }
-              })
-            }
-          }
-
-          // 拥有所有字段的表格
-          setTimeout(() => {
-            allTable.value.columns = handleColumns(res.data.allColums, 'all')
-            allTable.value.data = res.data.searchData || []
-            nextTick(() => {
-              allTableRef.value && autoWidth(allTable.value, allTableRef.value)
-            })
-          }, 1000)
+          assignTableData(res.data)
         }
       })
+      .finally(() => {
+        nextTick(() => {
+          tableRef.value && autoWidth(trackingTable.value, tableRef.value)
+          tableLoadingTableData.value = false
+        })
+        selectedNumber.value = 0
+        selectedTableData.value = []
+      })
   }
-  nextTick(() => {
-    tableRef.value && autoWidth(trackingTable.value, tableRef.value)
-    tableLoadingTableData.value = false
-  })
 }
 
 // 查询列表数据
@@ -231,42 +198,20 @@ const searchTableData = (data: any) => {
     })
     .then((res: any) => {
       if (res.code === 200) {
-        trackingTable.value.data = res.data.searchData
-        pageInfo.value.total = Number(res.data.rc)
-        tempSearch.value = res.data.tmp_search
-
-        if (res.data.canEdiVgm && trackingTable.value.columns.length > 0) {
-          const index = trackingTable.value.columns.findIndex(
-            (item: any) => item.title === 'Action'
-          )
-          if (index === -1) {
-            trackingTable.value.columns.push({
-              title: 'Action',
-              fixed: 'right',
-              width: 80,
-              slots: { default: 'action' }
-            })
-          }
-        }
-        // 拥有所有字段的表格
-        setTimeout(() => {
-          allTable.value.columns = handleColumns(res.data.allColums, 'all')
-          allTable.value.data = res.data.searchData
-          nextTick(() => {
-            allTableRef.value && autoWidth(allTable.value, allTableRef.value)
-          })
-        }, 1000)
+        assignTableData(res.data)
       }
     })
     .finally(() => {
       tableRef.value && autoWidth(trackingTable.value, tableRef.value)
       tableLoadingTableData.value = false
+      selectedNumber.value = 0
+      selectedTableData.value = []
     })
 }
 
 onMounted(() => {
   tableLoadingColumn.value = true
-  Promise.all([getTableColumns(true)]).finally(() => {
+  Promise.all([getTableColumns()]).finally(() => {
     tableLoadingColumn.value = false
     nextTick(() => {
       tableRef.value && autoWidth(trackingTable.value, tableRef.value)
@@ -370,12 +315,21 @@ const handleDownload = () => {
       curSelectedColumns.push(item.title)
     }
   })
-  downloadDialogRef.value.openDialog(props.tagsData, curSelectedColumns)
+  downloadDialogRef.value.openDialog(
+    props.tagsData,
+    curSelectedColumns,
+    selectedNumber.value || pageInfo.value.total
+  )
 }
 
 const exportLoading = ref(false)
 // 获取导出表格数据
 const getExportTableData = (status: number) => {
+  // 如果有选中表格行数据,那么只到处选中的数据
+  if (selectedNumber.value > 0) {
+    exportTable(status)
+    return
+  }
   exportLoading.value = true
   const buildColumnString = (columns: any[]): string => {
     return columns
@@ -428,6 +382,14 @@ const exportTable = (status: number) => {
     }
     exportConfig.columns = trackingTable.value.columns
   }
+  if (selectedNumber.value > 0) {
+    exportConfig.dataFilterMethod = ({ row }: any) => {
+      const index = selectedTableData.value.findIndex(
+        (item: any) => item._X_ROW_KEY === row._X_ROW_KEY
+      )
+      return index !== -1
+    }
+  }
   allTableRef.value?.exportData(exportConfig)
 }
 
@@ -453,7 +415,7 @@ const handleCustomizeColumns = () => {
 
 // 定制表格
 const customizeColumns = async () => {
-  await getTableColumns(false)
+  await getTableColumns()
   nextTick(() => {
     tableRef.value && autoWidth(trackingTable.value, tableRef.value)
   })
@@ -482,12 +444,15 @@ const handleLinkClick = (row: any, column: any) => {
 }
 
 const selectedNumber = ref(0)
+const selectedTableData = ref([])
 // 复选框选中事件
 const handleCheckboxChange = ({ records }: any) => {
   selectedNumber.value = records.length
+  selectedTableData.value = records
 }
 const handleCheckAllChange = ({ records }: any) => {
   selectedNumber.value = records.length
+  selectedTableData.value = records
 }
 
 // VGM

+ 4 - 2
src/views/Tracking/src/components/TrackingTable/src/components/DownloadDialog.vue

@@ -1,8 +1,9 @@
 <script setup lang="ts">
 const dialogVisible = ref(false)
 
-const openDialog = (tagsData: string[], selectedColumns: string[]) => {
+const openDialog = (tagsData: string[], selectedColumns: string[], slectedDataNumber: number) => {
   listData.value = tagsData
+  selectedDataNumber.value = slectedDataNumber
   columns.value = selectedColumns
   dialogVisible.value = true
 }
@@ -10,6 +11,7 @@ const openDialog = (tagsData: string[], selectedColumns: string[]) => {
 const isShowSelectColumn = ref(false)
 
 const downloadFilter = ref(1)
+const selectedDataNumber = ref(0)
 
 const listData = ref()
 
@@ -37,7 +39,7 @@ defineExpose({
         <div class="select-data">
           <div style="display: inline-block">
             Select data on your shipment list:<span style="color: var(--color-theme)">{{
-              listData.length || 0
+              selectedDataNumber
             }}</span>
           </div>
         </div>