From 4e4975ab6705afc8ec625f33cb7b382b5051b19f Mon Sep 17 00:00:00 2001 From: mianyang <784310601@qq.com> Date: Wed, 13 May 2026 23:47:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=8C=E6=9D=BF=E6=97=A5?= =?UTF-8?q?=E5=8E=86=E8=AF=A6=E6=83=85=E6=95=B0=E6=8D=AE=E6=8C=89=E6=B6=A8?= =?UTF-8?q?=E5=81=9C=E6=97=B6=E9=97=B4=E5=8D=87=E5=BA=8F=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/stock/SecondBoardCalendar.vue | 62 ++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/src/views/stock/SecondBoardCalendar.vue b/src/views/stock/SecondBoardCalendar.vue index d5c17e2..7df0a58 100644 --- a/src/views/stock/SecondBoardCalendar.vue +++ b/src/views/stock/SecondBoardCalendar.vue @@ -140,11 +140,18 @@ - + - + @@ -176,11 +183,18 @@ - + - + @@ -240,6 +254,7 @@ const calendarStats = ref([]); const detailVisible = ref(false); const selectedDay = ref(null); const activeDetailTab = ref("limit"); +const defaultDetailSort = { prop: "first_limit_time", order: "ascending" }; const monthStart = computed(() => selectedMonth.value @@ -267,10 +282,14 @@ const detailStocks = computed(() => Array.isArray(selectedDayStat.value?.stocks) ? selectedDayStat.value.stocks : [], ); const limitStocks = computed(() => - detailStocks.value.filter((stock) => stock?.status === "limit"), + sortStocksByLimitTime( + detailStocks.value.filter((stock) => stock?.status === "limit"), + ), ); const breakStocks = computed(() => - detailStocks.value.filter((stock) => stock?.status === "break"), + sortStocksByLimitTime( + detailStocks.value.filter((stock) => stock?.status === "break"), + ), ); const statMap = computed(() => { 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) => { if (value === null || value === undefined || value === "") return "--";