新增二板日历详情数据按涨停时间升序排序

This commit is contained in:
2026-05-13 23:47:06 +08:00
parent 938a5c06da
commit 4e4975ab67
+54 -4
View File
@@ -140,11 +140,18 @@
<el-tabs v-model="activeDetailTab" class="detail-tabs"> <el-tabs v-model="activeDetailTab" class="detail-tabs">
<el-tab-pane :label="`涨停板(${limitStocks.length})`" name="limit"> <el-tab-pane :label="`涨停板(${limitStocks.length})`" name="limit">
<el-table :data="limitStocks" border stripe max-height="520"> <el-table :data="limitStocks" border stripe max-height="520" :default-sort="defaultDetailSort">
<el-table-column prop="name" label="股票简称" min-width="120" sortable /> <el-table-column prop="name" label="股票简称" min-width="120" sortable />
<el-table-column prop="ts_code" label="股票代码" min-width="120" sortable /> <el-table-column prop="ts_code" label="股票代码" min-width="120" sortable />
<el-table-column prop="industry" label="行业" min-width="120" sortable show-overflow-tooltip /> <el-table-column prop="industry" label="行业" min-width="120" sortable show-overflow-tooltip />
<el-table-column prop="first_limit_time" label="首次涨停时间" width="130" align="center" sortable> <el-table-column
prop="first_limit_time"
label="首次涨停时间"
width="130"
align="center"
sortable
:sort-method="sortLimitTimeColumn"
>
<template #default="{ row }"> <template #default="{ row }">
{{ formatLimitTime(row.first_limit_time) }} {{ formatLimitTime(row.first_limit_time) }}
</template> </template>
@@ -176,11 +183,18 @@
</el-table> </el-table>
</el-tab-pane> </el-tab-pane>
<el-tab-pane :label="`炸板(${breakStocks.length})`" name="break"> <el-tab-pane :label="`炸板(${breakStocks.length})`" name="break">
<el-table :data="breakStocks" border stripe max-height="520"> <el-table :data="breakStocks" border stripe max-height="520" :default-sort="defaultDetailSort">
<el-table-column prop="name" label="股票简称" min-width="120" sortable /> <el-table-column prop="name" label="股票简称" min-width="120" sortable />
<el-table-column prop="ts_code" label="股票代码" min-width="120" sortable /> <el-table-column prop="ts_code" label="股票代码" min-width="120" sortable />
<el-table-column prop="industry" label="行业" min-width="120" sortable show-overflow-tooltip /> <el-table-column prop="industry" label="行业" min-width="120" sortable show-overflow-tooltip />
<el-table-column prop="first_limit_time" label="首次涨停时间" width="130" align="center" sortable> <el-table-column
prop="first_limit_time"
label="首次涨停时间"
width="130"
align="center"
sortable
:sort-method="sortLimitTimeColumn"
>
<template #default="{ row }"> <template #default="{ row }">
{{ formatLimitTime(row.first_limit_time) }} {{ formatLimitTime(row.first_limit_time) }}
</template> </template>
@@ -240,6 +254,7 @@ const calendarStats = ref([]);
const detailVisible = ref(false); const detailVisible = ref(false);
const selectedDay = ref(null); const selectedDay = ref(null);
const activeDetailTab = ref("limit"); const activeDetailTab = ref("limit");
const defaultDetailSort = { prop: "first_limit_time", order: "ascending" };
const monthStart = computed(() => const monthStart = computed(() =>
selectedMonth.value selectedMonth.value
@@ -267,10 +282,14 @@ const detailStocks = computed(() =>
Array.isArray(selectedDayStat.value?.stocks) ? selectedDayStat.value.stocks : [], Array.isArray(selectedDayStat.value?.stocks) ? selectedDayStat.value.stocks : [],
); );
const limitStocks = computed(() => const limitStocks = computed(() =>
sortStocksByLimitTime(
detailStocks.value.filter((stock) => stock?.status === "limit"), detailStocks.value.filter((stock) => stock?.status === "limit"),
),
); );
const breakStocks = computed(() => const breakStocks = computed(() =>
sortStocksByLimitTime(
detailStocks.value.filter((stock) => stock?.status === "break"), detailStocks.value.filter((stock) => stock?.status === "break"),
),
); );
const statMap = computed(() => { const statMap = computed(() => {
const map = new Map(); const map = new Map();
@@ -379,6 +398,37 @@ const fetchMonthData = async (withLoading = true) => {
} }
}; };
const sortStocksByLimitTime = (stocks) =>
[...stocks].sort(
(left, right) =>
getLimitTimeSortValue(left?.first_limit_time) -
getLimitTimeSortValue(right?.first_limit_time),
);
const sortLimitTimeColumn = (left, right) =>
getLimitTimeSortValue(left?.first_limit_time) -
getLimitTimeSortValue(right?.first_limit_time);
const getLimitTimeSortValue = (value) => {
if (value === null || value === undefined || value === "") {
return Number.MAX_SAFE_INTEGER;
}
const text = String(value);
const timeMatch = text.match(/(\d{1,2}):(\d{1,2})(?::(\d{1,2}))?/);
if (timeMatch) {
const [, hour, minute, second = "0"] = timeMatch;
return Number(hour) * 3600 + Number(minute) * 60 + Number(second);
}
const digits = text.replace(/\D/g, "");
if (!digits) return Number.MAX_SAFE_INTEGER;
const timeDigits = digits.length > 6 ? digits.slice(-6) : digits;
const number = Number(timeDigits);
return Number.isFinite(number) ? number : Number.MAX_SAFE_INTEGER;
};
const formatRate = (value) => { const formatRate = (value) => {
if (value === null || value === undefined || value === "") return "--"; if (value === null || value === undefined || value === "") return "--";