|
@@ -30,7 +30,8 @@ const order_date = ref('');
|
|
const sortOrder = ref('');
|
|
const sortOrder = ref('');
|
|
const salesOrder = ref(null);
|
|
const salesOrder = ref(null);
|
|
const salesField = ref(null);
|
|
const salesField = ref(null);
|
|
-const tableKey = ref(Math.random());
|
|
|
|
|
|
+const sortStatus = ref(true);
|
|
|
|
+
|
|
const gridOptions = reactive({
|
|
const gridOptions = reactive({
|
|
border: 'inner',
|
|
border: 'inner',
|
|
height: 900,
|
|
height: 900,
|
|
@@ -58,6 +59,10 @@ const gridOptions = reactive({
|
|
},
|
|
},
|
|
sortConfig: {
|
|
sortConfig: {
|
|
remote: true,
|
|
remote: true,
|
|
|
|
+ defaultSort: {
|
|
|
|
+ field: salesField,
|
|
|
|
+ order: salesOrder,
|
|
|
|
+ }
|
|
},
|
|
},
|
|
toolbarConfig: {
|
|
toolbarConfig: {
|
|
custom: true,
|
|
custom: true,
|
|
@@ -106,12 +111,16 @@ const gridEvents = {
|
|
const saveSortState = () => {
|
|
const saveSortState = () => {
|
|
localStorage.setItem('sortField', order_date.value);
|
|
localStorage.setItem('sortField', order_date.value);
|
|
localStorage.setItem('sortOrder', sortOrder.value);
|
|
localStorage.setItem('sortOrder', sortOrder.value);
|
|
|
|
+ localStorage.setItem('salesOrder', salesOrder.value);
|
|
|
|
+ localStorage.setItem('salesField', salesField.value);
|
|
};
|
|
};
|
|
|
|
|
|
// 读取排序状态并应用
|
|
// 读取排序状态并应用
|
|
const loadSortState = () => {
|
|
const loadSortState = () => {
|
|
order_date.value = localStorage.getItem('sortField') || '';
|
|
order_date.value = localStorage.getItem('sortField') || '';
|
|
sortOrder.value = localStorage.getItem('sortOrder') || '';
|
|
sortOrder.value = localStorage.getItem('sortOrder') || '';
|
|
|
|
+ gridOptions.sortConfig.defaultSort.order = localStorage.getItem('salesOrder') || '';
|
|
|
|
+ gridOptions.sortConfig.defaultSort.field = localStorage.getItem('salesField') || '';
|
|
};
|
|
};
|
|
|
|
|
|
async function fetchData(taskIds, apiFunc, startDate, endDate, dataColumns, dateTypeKey) {
|
|
async function fetchData(taskIds, apiFunc, startDate, endDate, dataColumns, dateTypeKey) {
|
|
@@ -129,71 +138,72 @@ async function fetchData(taskIds, apiFunc, startDate, endDate, dataColumns, date
|
|
});
|
|
});
|
|
gridOptions[dateType.value].data = resp.data;
|
|
gridOptions[dateType.value].data = resp.data;
|
|
gridOptions.pagerConfig.total = resp.total;
|
|
gridOptions.pagerConfig.total = resp.total;
|
|
|
|
+ if (sortStatus.value) {
|
|
|
|
+ if (resp.data.length > 0) {
|
|
|
|
+ const allColumns = new Set();
|
|
|
|
+ const salesColumns = [];
|
|
|
|
+ const otherColumns = [];
|
|
|
|
+ //清空列名
|
|
|
|
+ dataColumns.value = dataColumns.value.filter(column => !/\d{2}-\d{2}/.test(column.field) && !column.field.includes('余额币种') && !column.field.includes('退货率'));
|
|
|
|
|
|
- if (resp.data.length > 0) {
|
|
|
|
- const allColumns = new Set();
|
|
|
|
- const salesColumns = [];
|
|
|
|
- const otherColumns = [];
|
|
|
|
- //清空列名
|
|
|
|
- dataColumns.value = dataColumns.value.filter(column => !/\d{2}-\d{2}/.test(column.field) && !column.field.includes('余额币种') && !column.field.includes('退货率'));
|
|
|
|
|
|
+ resp.data.forEach(row => {
|
|
|
|
+ for (const key in row) {
|
|
|
|
+ if (/\d{2}-\d{2}/.test(key) || key.includes('余额币种') || key.includes('退货率')) {
|
|
|
|
+ allColumns.add(key);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
|
|
- resp.data.forEach(row => {
|
|
|
|
- for (const key in row) {
|
|
|
|
- if (/\d{2}-\d{2}/.test(key) || key.includes('余额币种') || key.includes('退货率')) {
|
|
|
|
- allColumns.add(key);
|
|
|
|
|
|
+ //"的销售额"字段可以排序
|
|
|
|
+ allColumns.forEach(key => {
|
|
|
|
+ let isSortable = false;
|
|
|
|
+ if (key.includes('的销售额') && !key.includes('增长率')) {
|
|
|
|
+ isSortable = true;
|
|
}
|
|
}
|
|
- }
|
|
|
|
- });
|
|
|
|
|
|
+ const column = {
|
|
|
|
+ field: key,
|
|
|
|
+ title: key,
|
|
|
|
+ minWidth: key.includes('~') ? 95 : /\d{4}-\d{2}-\d{2}的/.test(key) ? 93 : key.includes('截止') ? 90 : 79,
|
|
|
|
+ align: 'center',
|
|
|
|
+ formatter: formatEmptyCell,
|
|
|
|
+ sortable: isSortable,
|
|
|
|
+ };
|
|
|
|
+ if (key.includes('的销售额') && !key.includes('增长率')) {
|
|
|
|
+ salesColumns.push(column);
|
|
|
|
+ } else {
|
|
|
|
+ otherColumns.push(column);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
|
|
- //"的销售额"字段可以排序
|
|
|
|
- allColumns.forEach(key => {
|
|
|
|
- let isSortable = false;
|
|
|
|
- if (key.includes('的销售额') && !key.includes('增长率')) {
|
|
|
|
- isSortable = true;
|
|
|
|
|
|
+ // 对 salesColumns 按日期排序
|
|
|
|
+ if (dateType.value == 'day') {
|
|
|
|
+ salesColumns.sort((a, b) => {
|
|
|
|
+ const dateA = a.field.match(/\d{4}-\d{2}-\d{2}/)[0];
|
|
|
|
+ const dateB = b.field.match(/\d{4}-\d{2}-\d{2}/)[0];
|
|
|
|
+ return new Date(dateA) - new Date(dateB);
|
|
|
|
+ });
|
|
|
|
+ } else if (dateType.value == 'week') {
|
|
|
|
+ salesColumns.sort((a, b) => {
|
|
|
|
+ const dateA = a.field.match(/\d{4}-\d{2}-\d{2}~\d{4}-\d{2}-\d{2}/)[0].split('~')[0];
|
|
|
|
+ const dateB = b.field.match(/\d{4}-\d{2}-\d{2}~\d{4}-\d{2}-\d{2}/)[0].split('~')[0];
|
|
|
|
+ console.log(dateA, dateB);
|
|
|
|
+ return new Date(dateA) - new Date(dateB);
|
|
|
|
+ });
|
|
|
|
+ } else if (dateType.value == 'month') {
|
|
|
|
+ salesColumns.sort((a, b) => {
|
|
|
|
+ const dateA = a.field.match(/\d{4}-\d{2}/)[0];
|
|
|
|
+ const dateB = b.field.match(/\d{4}-\d{2}/)[0];
|
|
|
|
+ return new Date(dateA) - new Date(dateB);
|
|
|
|
+ });
|
|
}
|
|
}
|
|
- const column = {
|
|
|
|
- field: key,
|
|
|
|
- title: key,
|
|
|
|
- minWidth: key.includes('~') ? 95 : /\d{4}-\d{2}-\d{2}的/.test(key) ? 93 : key.includes('截止') ? 90 : 79,
|
|
|
|
- align: 'center',
|
|
|
|
- formatter: formatEmptyCell,
|
|
|
|
- sortable: isSortable,
|
|
|
|
- };
|
|
|
|
- if (key.includes('的销售额') && !key.includes('增长率')) {
|
|
|
|
- salesColumns.push(column);
|
|
|
|
|
|
+ const dynamicColumns = [...salesColumns, ...otherColumns];
|
|
|
|
+
|
|
|
|
+ if (dateType.value === dateTypeKey) {
|
|
|
|
+ dataColumns.value = [...dataColumns.value, ...dynamicColumns];
|
|
} else {
|
|
} else {
|
|
- otherColumns.push(column);
|
|
|
|
|
|
+ dataColumns.value = [];
|
|
|
|
+ gridOptions.pagerConfig.total = 0;
|
|
}
|
|
}
|
|
- });
|
|
|
|
-
|
|
|
|
- // 对 salesColumns 按日期排序
|
|
|
|
- if (dateType.value == 'day') {
|
|
|
|
- salesColumns.sort((a, b) => {
|
|
|
|
- const dateA = a.field.match(/\d{4}-\d{2}-\d{2}/)[0];
|
|
|
|
- const dateB = b.field.match(/\d{4}-\d{2}-\d{2}/)[0];
|
|
|
|
- return new Date(dateA) - new Date(dateB);
|
|
|
|
- });
|
|
|
|
- } else if (dateType.value == 'week') {
|
|
|
|
- salesColumns.sort((a, b) => {
|
|
|
|
- const dateA = a.field.match(/\d{4}-\d{2}-\d{2}~\d{4}-\d{2}-\d{2}/)[0].split('~')[0];
|
|
|
|
- const dateB = b.field.match(/\d{4}-\d{2}-\d{2}~\d{4}-\d{2}-\d{2}/)[0].split('~')[0];
|
|
|
|
- console.log(dateA, dateB);
|
|
|
|
- return new Date(dateA) - new Date(dateB);
|
|
|
|
- });
|
|
|
|
- } else if (dateType.value == 'month') {
|
|
|
|
- salesColumns.sort((a, b) => {
|
|
|
|
- const dateA = a.field.match(/\d{4}-\d{2}/)[0];
|
|
|
|
- const dateB = b.field.match(/\d{4}-\d{2}/)[0];
|
|
|
|
- return new Date(dateA) - new Date(dateB);
|
|
|
|
- });
|
|
|
|
- }
|
|
|
|
- const dynamicColumns = [...salesColumns, ...otherColumns];
|
|
|
|
-
|
|
|
|
- if (dateType.value === dateTypeKey) {
|
|
|
|
- dataColumns.value = [...dataColumns.value, ...dynamicColumns];
|
|
|
|
- } else {
|
|
|
|
- dataColumns.value = [];
|
|
|
|
- gridOptions.pagerConfig.total = 0;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
saveSortState();
|
|
saveSortState();
|
|
@@ -230,14 +240,13 @@ function fetchCurrentData(taskIds, resetPage = false) {
|
|
}
|
|
}
|
|
|
|
|
|
function handleSortChange({ field, order }) {
|
|
function handleSortChange({ field, order }) {
|
|
- //salesOrder.value = order;
|
|
|
|
- //salesField.value = field;
|
|
|
|
|
|
+ salesOrder.value = order;
|
|
|
|
+ salesField.value = field;
|
|
sortOrder.value = order === 'asc' ? 'smallfirst' : 'bigfirst';
|
|
sortOrder.value = order === 'asc' ? 'smallfirst' : 'bigfirst';
|
|
- const sortField = field;
|
|
|
|
- if (sortField) {
|
|
|
|
- const match = sortField.match(/(\d{4}-\d{2}-\d{2})的销售额/);
|
|
|
|
- const matchRange = sortField.match(/(\d{4}-\d{2}-\d{2})~(\d{4}-\d{2}-\d{2})的销售额/);
|
|
|
|
- const matchMonth = sortField.match(/(\d{4}-\d{2})的销售额/);
|
|
|
|
|
|
+ if (field) {
|
|
|
|
+ const match = field.match(/(\d{4}-\d{2}-\d{2})的销售额/);
|
|
|
|
+ const matchRange = field.match(/(\d{4}-\d{2}-\d{2})~(\d{4}-\d{2}-\d{2})的销售额/);
|
|
|
|
+ const matchMonth = field.match(/(\d{4}-\d{2})的销售额/);
|
|
if (matchRange) {
|
|
if (matchRange) {
|
|
order_date.value = matchRange[1];
|
|
order_date.value = matchRange[1];
|
|
} else if (match) {
|
|
} else if (match) {
|
|
@@ -247,8 +256,10 @@ function handleSortChange({ field, order }) {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
saveSortState(); // 保存排序状态
|
|
saveSortState(); // 保存排序状态
|
|
|
|
+ gridOptions.sortConfig.defaultSort.order = order;
|
|
|
|
+ gridOptions.sortConfig.defaultSort.field = field;
|
|
|
|
+ sortStatus.value = false;
|
|
fetchCurrentData(props.taskIds, true);
|
|
fetchCurrentData(props.taskIds, true);
|
|
- tableKey.value = Math.random();
|
|
|
|
}
|
|
}
|
|
|
|
|
|
const handleImport = () => {
|
|
const handleImport = () => {
|
|
@@ -310,13 +321,13 @@ watch([() => props.taskIds, currentDate], ([newTaskIds, newCurrentDate]) => {
|
|
});
|
|
});
|
|
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
- loadSortState();
|
|
|
|
|
|
+ //loadSortState();
|
|
});
|
|
});
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<template>
|
|
<template>
|
|
<div>
|
|
<div>
|
|
- <vxe-grid :key="tableKey" :cell-style="cellStyle" :header-cell-style="headerCellStyle" :sort-config="sortConfig"
|
|
|
|
|
|
+ <vxe-grid :cell-style="cellStyle" :header-cell-style="headerCellStyle"
|
|
stripe
|
|
stripe
|
|
v-bind="currentGridOptions" v-on="gridEvents" @sort-change="handleSortChange">
|
|
v-bind="currentGridOptions" v-on="gridEvents" @sort-change="handleSortChange">
|
|
<template #toolbar_buttons>
|
|
<template #toolbar_buttons>
|
|
@@ -326,10 +337,10 @@ onMounted(() => {
|
|
<div class="font-semibold">{{ row.platformNumber }}</div>
|
|
<div class="font-semibold">{{ row.platformNumber }}</div>
|
|
</template>
|
|
</template>
|
|
<template #platformName_default="{ row }">
|
|
<template #platformName_default="{ row }">
|
|
- <div class="font-semibold" style="color: #0097f8">{{ row.platformName }}</div>
|
|
|
|
|
|
+ <div class="font-semibold" style="color: #164285">{{ row.platformName }}</div>
|
|
</template>
|
|
</template>
|
|
<template #brandName_default="{ row }">
|
|
<template #brandName_default="{ row }">
|
|
- <el-tag effect="plain" round type="success">{{ row.brandName }}</el-tag>
|
|
|
|
|
|
+ {{ row.brandName }}
|
|
</template>
|
|
</template>
|
|
</vxe-grid>
|
|
</vxe-grid>
|
|
</div>
|
|
</div>
|