feat(db): add datetime column dual-caret sort on inventory and weighing lists.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
wuzilongandCursor committed 2026-09-08 22:36:55 +08:00
1 parent 7579c36fc6
commit 100b0880f0
11 files changed
+42746 -40718

No files matched your search

+35 -4
View File
@@ -612,6 +612,7 @@
import { usePersistedListColumns } from '@/composables/usePersistedListColumns'
import { useListTableViewportHeight } from '@/composables/useListTableViewportHeight'
import { useServerColumnFilters } from '@/composables/useServerColumnFilters'
import { useColumnSort } from '@/composables/useColumnSort'
import type {
ColumnFilterState,
DatetimeColumnFilterState
@@ -688,6 +689,29 @@
onChange: () => handleSearch()
})
const {
sortField,
sortOrder,
setSort,
clearSort,
isSortActive,
toQueryParams: toSortQueryParams,
watchVisibleColumns: watchSortVisibleColumns
} = useColumnSort({
onChange: () => {
currentPage.value = 1
applySortAndPage()
}
})
provide('crmColumnSort', {
setSort,
clearSort,
isSortActive,
sortField,
sortOrder
})
function enumOptionsFor(prop: string) {
const def = dbInventoryColumnFilterDefs.find((d) => d.prop === prop)
return (def?.enumOptions || []).map((o) => ({ ...o, count: 0 }))
@@ -701,6 +725,7 @@
return props
})
watchVisibleColumns(visibleFilterProps)
watchSortVisibleColumns(visibleFilterProps)
const isDefaultTodayDateFilter = () => {
const s = filters.date as DatetimeColumnFilterState | undefined
@@ -864,10 +889,16 @@
}
const applySortAndPage = () => {
const field = sortField.value || 'date'
const order = sortOrder.value || 'desc'
const list = [...allRecords.value].sort((a, b) => {
const av = a.date || ''
const bv = b.date || ''
return bv.localeCompare(av, 'zh-CN')
const av = String((a as any)[field] || '')
const bv = String((b as any)[field] || '')
if (!av && !bv) return 0
if (!av) return order === 'asc' ? -1 : 1
if (!bv) return order === 'asc' ? 1 : -1
const cmp = av.localeCompare(bv, 'zh-CN')
return order === 'asc' ? cmp : -cmp
})
total.value = list.length
const start = (currentPage.value - 1) * pageSize.value
@@ -876,7 +907,7 @@
}
const buildListQueryParams = (): Record<string, any> => {
const params: Record<string, any> = { ...toQueryParams() }
const params: Record<string, any> = { ...toQueryParams(), ...toSortQueryParams() }
const keyword = searchKeyword.value.trim()
if (keyword) params.q = keyword
return params
+45 -5
View File
@@ -653,6 +653,7 @@
import { usePersistedListColumns } from '@/composables/usePersistedListColumns'
import { useListTableViewportHeight } from '@/composables/useListTableViewportHeight'
import { useServerColumnFilters } from '@/composables/useServerColumnFilters'
import { useColumnSort } from '@/composables/useColumnSort'
import type { DatetimeColumnFilterState } from '@/composables/useClientColumnFilters'
import DbCrmProductSelect from '@/components/business/db/DbCrmProductSelect.vue'
import DbRelatedViewDialog from '@/components/business/db/DbRelatedViewDialog.vue'
@@ -920,6 +921,44 @@
(row.createdAt ? row.createdAt.split(' ')[0] : '') ||
''
const {
sortField,
sortOrder,
setSort,
clearSort,
isSortActive,
toQueryParams: toSortQueryParams,
watchVisibleColumns: watchSortVisibleColumns
} = useColumnSort({
onChange: () => {
currentPage.value = 1
allData.value = sortWeighingRows(allData.value)
}
})
provide('crmColumnSort', {
setSort,
clearSort,
isSortActive,
sortField,
sortOrder
})
watchSortVisibleColumns(visibleFilterProps)
function sortWeighingRows(rows: WeighingRecord[]) {
const order = sortOrder.value || 'desc'
return [...rows].sort((a, b) => {
const av = getRecordDate(a)
const bv = getRecordDate(b)
if (!av && !bv) return 0
if (!av) return order === 'asc' ? -1 : 1
if (!bv) return order === 'asc' ? 1 : -1
const cmp = av.localeCompare(bv)
return order === 'asc' ? cmp : -cmp
})
}
function getWeighingStatCellValue(row: WeighingRecord, prop: string): unknown {
if (prop === 'inventoryDate') return getRecordDate(row)
if (prop === 'currentQuantity' || prop === 'netWeight') {
@@ -935,7 +974,7 @@
}
const buildListQueryParams = (): Record<string, any> => {
const params: Record<string, any> = { ...toQueryParams() }
const params: Record<string, any> = { ...toQueryParams(), ...toSortQueryParams() }
const keyword = searchKeyword.value.trim()
if (keyword) params.q = keyword
@@ -1010,9 +1049,7 @@
try {
const records = await weighingApi.list(buildListQueryParams())
allData.value = records
.slice()
.sort((a, b) => getRecordDate(b).localeCompare(getRecordDate(a)))
allData.value = sortWeighingRows(records)
total.value = allData.value.length
const maxPage = Math.ceil(total.value / pageSize.value) || 1
@@ -1304,6 +1341,10 @@
const query = { ...route.query }
try {
// 先清空上一张地磅单残留(毛/皮/净重、备注等),再填出入库带入字段
resetFormData()
editingRecord.value = null
const inventory = await inventoryApi.get(inboundOutboundId)
formData.vehicleNo = (query.vehicleNo as string) || inventory.vehicleNo
@@ -1346,7 +1387,6 @@
}
}
editingRecord.value = null
modalOpen.value = true
clearInventoryRouteQuery()
} catch (error) {