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:
1 parent
7579c36fc6
commit
100b0880f0
11 files changed
+42746
-40718
No files matched your search
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user