925 lines
34 KiB
JavaScript
925 lines
34 KiB
JavaScript
"use strict";
|
||
const common_vendor = require("../../common/vendor.js");
|
||
const request_api = require("../../request/api.js");
|
||
const common_assets = require("../../common/assets.js");
|
||
const echarts = require("../../uni_modules/lime-echart/static/echarts.min.js");
|
||
const _sfc_main = {
|
||
data() {
|
||
return {
|
||
navH: common_vendor.inject("navHeight"),
|
||
contentTop: "",
|
||
currentDate: "",
|
||
// 最终要赋值的日期
|
||
selectedDate: "",
|
||
// 临时存储选中的日期
|
||
allStockData: [],
|
||
filteredData: [],
|
||
conceptStocksList: [],
|
||
alertTypeConfig: {
|
||
"surge": {
|
||
text: "异动",
|
||
color: "#FF7A45",
|
||
// rgb(255, 122, 69)
|
||
filter: "brightness(0) saturate(100%) invert(54%) sepia(60%) saturate(467%) hue-rotate(344deg) brightness(102%) contrast(101%)"
|
||
},
|
||
"shrink_surge_up": {
|
||
text: "缩量急涨",
|
||
color: "#722ED1",
|
||
// rgb(114, 46, 209)
|
||
filter: "brightness(0) saturate(100%) invert(24%) sepia(90%) saturate(2865%) hue-rotate(266deg) brightness(87%) contrast(98%)"
|
||
},
|
||
"volume_surge_up": {
|
||
text: "放量急涨",
|
||
color: "#EB2F96",
|
||
// rgb(235, 47, 150)
|
||
filter: "brightness(0) saturate(100%) invert(34%) sepia(82%) saturate(1970%) hue-rotate(313deg) brightness(91%) contrast(94%)"
|
||
},
|
||
"volume_oscillation": {
|
||
text: "放量震荡",
|
||
color: "#13C2C2",
|
||
// rgb(19, 194, 194)
|
||
filter: "brightness(0) saturate(100%) invert(71%) sepia(62%) saturate(487%) hue-rotate(142deg) brightness(91%) contrast(93%)"
|
||
},
|
||
"surge_up": {
|
||
text: "急涨",
|
||
color: "#FF4D4F",
|
||
// rgb(255, 77, 79)
|
||
filter: "brightness(0) saturate(100%) invert(42%) sepia(93%) saturate(727%) hue-rotate(346deg) brightness(102%) contrast(104%)"
|
||
},
|
||
"surge_down": {
|
||
text: "急跌",
|
||
color: "#52C41A",
|
||
// rgb(82, 196, 26)
|
||
filter: "brightness(0) saturate(100%) invert(68%) sepia(65%) saturate(456%) hue-rotate(71deg) brightness(91%) contrast(86%)"
|
||
},
|
||
"shrink_surge_down": {
|
||
text: "缩量急跌",
|
||
color: "#FF7A45",
|
||
// rgb(255, 122, 69)
|
||
filter: "brightness(0) saturate(100%) invert(54%) sepia(60%) saturate(467%) hue-rotate(344deg) brightness(102%) contrast(101%)"
|
||
}
|
||
},
|
||
topLists: [
|
||
{
|
||
title: "大盘涨跌幅",
|
||
value: "+0.00%",
|
||
color: "#EC3440",
|
||
backIcon: "/static/icon/gegu/gg-top-0.png"
|
||
},
|
||
{
|
||
title: "涨停/跌停",
|
||
value: "+0.00%",
|
||
color: "#070707",
|
||
backIcon: "/static/icon/gegu/gg-top-1.png"
|
||
},
|
||
{
|
||
title: "多空对比",
|
||
value: "0/0",
|
||
color: "#070707",
|
||
backIcon: "/static/icon/gegu/gg-top-2.png"
|
||
},
|
||
{
|
||
title: "今日成交额",
|
||
value: "0万亿",
|
||
color: "#070707",
|
||
backIcon: "/static/icon/gegu/gg-top-3.png"
|
||
},
|
||
{
|
||
title: "A股总市值",
|
||
value: "0万亿",
|
||
color: "#070707",
|
||
backIcon: "/static/icon/gegu/gg-top-4.png"
|
||
},
|
||
{
|
||
title: "连板龙头",
|
||
value: "0只",
|
||
color: "#F59B38",
|
||
backIcon: "/static/icon/gegu/gg-top-5.png"
|
||
}
|
||
],
|
||
topLists2: [
|
||
{
|
||
title: "超大盘股",
|
||
value: "(>1000亿)"
|
||
},
|
||
{
|
||
title: "大盘股",
|
||
value: "(500-1000亿)"
|
||
},
|
||
{
|
||
title: "中盘股",
|
||
value: "(100-500亿)"
|
||
}
|
||
],
|
||
list2Index: 0,
|
||
typeList: [
|
||
{
|
||
title: "缩量急涨",
|
||
backIcon: "/static/icon/gegu/cate-0.png"
|
||
},
|
||
{
|
||
title: "异动",
|
||
backIcon: "/static/icon/gegu/cate-1.png"
|
||
},
|
||
{
|
||
title: "急跌",
|
||
backIcon: "/static/icon/gegu/cate-2.png"
|
||
},
|
||
{
|
||
title: "急涨",
|
||
backIcon: "/static/icon/gegu/cate-3.png"
|
||
},
|
||
{
|
||
title: "放量震荡",
|
||
backIcon: "/static/icon/gegu/cate-4.png"
|
||
}
|
||
],
|
||
marketAlertsList: [],
|
||
formattedAvg: 0,
|
||
upCount: 0,
|
||
downCount: 0,
|
||
limit_up_ratio: 0,
|
||
searchResultTop: "",
|
||
//搜索结果
|
||
contentTop: "",
|
||
keywords: "",
|
||
//搜索关键字
|
||
searchShow: false,
|
||
//是否展示搜索结果
|
||
searchResultList: [],
|
||
//搜索结果
|
||
selectSearchStockInfo: null,
|
||
//选中的搜索股票信息
|
||
isShowTime: false,
|
||
ec: { lazyLoad: true },
|
||
// 延迟加载 ECharts
|
||
chart: null,
|
||
y2MaxText: "",
|
||
// 右侧顶部最大值文本(例:2.36% / -0.89%)
|
||
y2MinText: ""
|
||
// 右侧底部最小值文本(例:-3.12% / 0.56%)
|
||
};
|
||
},
|
||
onLoad(e) {
|
||
this.activeIndex = e.index;
|
||
this.searchResultTop = this.navH + (20 + 70) / 750 * common_vendor.inject("windowWidth");
|
||
this.contentTop = this.navH + (20 + 70 + 25) / 750 * common_vendor.inject("windowWidth");
|
||
this.conceptsDailyTop();
|
||
const now = /* @__PURE__ */ new Date();
|
||
const year = now.getFullYear();
|
||
const month = (now.getMonth() + 1).toString().padStart(2, "0");
|
||
const day = now.getDate().toString().padStart(2, "0");
|
||
this.currentDate = `${year}-${month}-${day}`;
|
||
},
|
||
onShow() {
|
||
this.isShowTime = false;
|
||
this.marketHeatmap();
|
||
this.marketStatistics();
|
||
this.marketHotspotListOverview();
|
||
},
|
||
methods: {
|
||
truncateText(text, length) {
|
||
if (!text)
|
||
return "";
|
||
return text.length > length ? text.substring(0, length) + "..." : text;
|
||
},
|
||
/**
|
||
* 点击搜索
|
||
*/
|
||
clickSearch() {
|
||
if (this.keywords) {
|
||
this.getSearchStockInfoListData();
|
||
} else
|
||
this.selectSearchStockInfo = null;
|
||
},
|
||
/**
|
||
* 点击搜索结果背景
|
||
*/
|
||
clickSearchResultBg() {
|
||
this.searchShow = false;
|
||
},
|
||
/**
|
||
* 点击搜索结果列表项
|
||
*/
|
||
clickSearchResultListItem(item) {
|
||
this.selectSearchStockInfo = item;
|
||
this.searchShow = false;
|
||
this.getStockBasicInfoData();
|
||
},
|
||
/**
|
||
* 根据输入内容获取搜索列表项
|
||
*/
|
||
getSearchStockInfoListData() {
|
||
let param = { q: this.keywords, limit: 10 };
|
||
request_api.searchStockInfo(param).then((res) => {
|
||
this.searchResultList = res.data;
|
||
this.searchShow = this.searchResultList.length > 0;
|
||
}).catch((error) => {
|
||
});
|
||
},
|
||
/**
|
||
* 获取股票基本信息
|
||
*/
|
||
getStockBasicInfoData() {
|
||
let code = this.stockCode;
|
||
if (this.selectSearchStockInfo) {
|
||
code = this.selectSearchStockInfo.stock_code;
|
||
}
|
||
common_vendor.index.navigateTo({
|
||
url: "/pagesStock/stockCenterDetails/stockCenterDetails?code=" + code
|
||
});
|
||
},
|
||
/**
|
||
* 获取股票当前市场价格信息
|
||
*/
|
||
getQuoteDetailsData() {
|
||
let code = this.stockCode;
|
||
if (this.selectSearchStockInfo) {
|
||
code = this.selectSearchStockInfo.stock_code;
|
||
}
|
||
quoteDetailsInfo(code).then((res) => {
|
||
this.quoteDetailsInfo = res.data;
|
||
}).catch((error) => {
|
||
});
|
||
},
|
||
formatAlpha(value) {
|
||
if (value === null || value === void 0 || isNaN(Number(value))) {
|
||
return "0.0";
|
||
}
|
||
return Number(value).toFixed(1);
|
||
},
|
||
handleTypeClick(index) {
|
||
this.list2Index = index;
|
||
this.marketHeatmap(this.currentDate);
|
||
},
|
||
getTableItem(obj) {
|
||
const marketCap = obj.market_cap ? obj.market_cap.toFixed(2) : "0.00";
|
||
const amount = obj.amount ? obj.amount.toFixed(2) : "0.00";
|
||
const changePercent = obj.change_percent ? Number(obj.change_percent) : 0;
|
||
let changePercentStr = "";
|
||
let changeType = "";
|
||
if (changePercent > 0) {
|
||
changePercentStr = `+${changePercent}%`;
|
||
changeType = "positive";
|
||
} else if (changePercent < 0) {
|
||
changePercentStr = `${changePercent}%`;
|
||
changeType = "negative";
|
||
} else {
|
||
changePercentStr = "0%";
|
||
changeType = "zero";
|
||
}
|
||
return [
|
||
[obj.stock_name, obj.stock_code],
|
||
[changePercentStr, "", changeType],
|
||
// 第三个元素存类型标记
|
||
[`${marketCap}亿元`],
|
||
[`${amount}亿元`],
|
||
[obj.industry || "暂无"]
|
||
// 处理行业为空的情况
|
||
];
|
||
},
|
||
// 处理涨停比:转百分比 + 四舍五入(可指定保留小数位数)
|
||
formatLimitUpRatio(value, decimalPlaces = 0) {
|
||
if (!value || isNaN(Number(value))) {
|
||
return "0%";
|
||
}
|
||
const percentValue = Number(value) * 100;
|
||
const result = decimalPlaces === 0 ? Math.round(percentValue) : percentValue.toFixed(decimalPlaces);
|
||
return `${result}%`;
|
||
},
|
||
conceptsDailyTop() {
|
||
request_api.conceptsDailyTop().then((res) => {
|
||
}).catch((error) => {
|
||
});
|
||
},
|
||
marketHeatmap(currentDate) {
|
||
let param = {
|
||
limit: 500
|
||
};
|
||
if (this.isShowTime) {
|
||
if (currentDate && currentDate !== "undefined" && currentDate.trim() !== "") {
|
||
param.date = currentDate;
|
||
}
|
||
}
|
||
request_api.marketHeatmap(param).then((res) => {
|
||
this.topLists[2].value = res.statistics.rising_count + "/" + res.statistics.falling_count;
|
||
this.allStockData = res.data || [];
|
||
const limitUpCount = this.allStockData.filter((s) => {
|
||
const changePercent = Number(s.change_percent);
|
||
return !isNaN(changePercent) && changePercent >= 9.9;
|
||
}).length;
|
||
const limitDownCount = this.allStockData.filter((s) => {
|
||
const changePercent = Number(s.change_percent);
|
||
return !isNaN(changePercent) && changePercent <= -9.9;
|
||
}).length;
|
||
this.topLists[1].value = limitUpCount + "/" + limitDownCount;
|
||
this.topLists[5].value = limitUpCount + "只";
|
||
this.filterStockByMarketCap();
|
||
}).catch((error) => {
|
||
});
|
||
},
|
||
// 根据市值区间筛选数据
|
||
filterStockByMarketCap() {
|
||
const {
|
||
list2Index,
|
||
allStockData
|
||
} = this;
|
||
let filtered = [];
|
||
switch (list2Index) {
|
||
case 0:
|
||
filtered = allStockData.filter((item) => item.market_cap > 1e3);
|
||
break;
|
||
case 1:
|
||
filtered = allStockData.filter((item) => item.market_cap >= 500 && item.market_cap <= 1e3);
|
||
break;
|
||
case 2:
|
||
filtered = allStockData.filter((item) => item.market_cap >= 100 && item.market_cap <= 500);
|
||
break;
|
||
default:
|
||
filtered = allStockData;
|
||
}
|
||
this.filteredData = filtered.slice(0, 10);
|
||
},
|
||
marketStatistics() {
|
||
request_api.marketStatistics().then((res) => {
|
||
this.topLists[3].value = this.formatToTrillion(res.summary.total_amount);
|
||
this.topLists[4].value = this.formatToTrillion(res.summary.total_market_cap);
|
||
}).catch((error) => {
|
||
this.topLists[3].value = "0.0 万亿";
|
||
this.topLists[4].value = "0.0 万亿";
|
||
});
|
||
},
|
||
formatToTrillion(num) {
|
||
if (typeof num !== "number" || isNaN(num)) {
|
||
return "0.0 万亿";
|
||
}
|
||
const trillionValue = (num / 1e4).toFixed(1);
|
||
return `${trillionValue} 万亿`;
|
||
},
|
||
marketHotspotListOverview() {
|
||
let param = {
|
||
date: this.currentDate
|
||
};
|
||
request_api.marketHotspotOverview(param).then((res) => {
|
||
var _a;
|
||
const data = res == null ? void 0 : res.data;
|
||
const alerts = ((_a = res == null ? void 0 : res.data) == null ? void 0 : _a.alerts) || [];
|
||
const changePct = res.data.index.change_pct;
|
||
let numPct = 0;
|
||
if (changePct && !isNaN(Number(changePct))) {
|
||
numPct = Number(changePct);
|
||
}
|
||
const roundedPct = Math.round(numPct * 100) / 100;
|
||
const fixedPct = roundedPct.toFixed(2);
|
||
let formattedPct = "";
|
||
if (roundedPct > 0) {
|
||
formattedPct = `+${fixedPct}%`;
|
||
} else if (roundedPct < 0) {
|
||
formattedPct = `${fixedPct}%`;
|
||
} else {
|
||
formattedPct = "0.00%";
|
||
}
|
||
const color = roundedPct > 0 ? "#EC3440" : roundedPct < 0 ? "#01AB5D" : "#666666";
|
||
this.topLists[0].value = formattedPct;
|
||
this.topLists[0].color = color;
|
||
const processedAlerts = alerts.map((alertItem) => {
|
||
const stocks = alertItem.stocks || [];
|
||
const validStocks = stocks.filter((s) => s.change_pct != null && !isNaN(Number(s.change_pct)));
|
||
const avgChange = validStocks.length > 0 ? validStocks.reduce((sum, s) => sum + Number(s.change_pct), 0) / validStocks.length : 0;
|
||
const upCount = validStocks.filter((s) => Number(s.change_pct) > 0).length;
|
||
const downCount = validStocks.filter((s) => Number(s.change_pct) < 0).length;
|
||
const roundedAvg = Math.round(avgChange * 100) / 100;
|
||
const formattedAvg = roundedAvg > 0 ? `+${roundedAvg.toFixed(2)}` : roundedAvg.toFixed(2);
|
||
return {
|
||
...alertItem,
|
||
alpha: avgChange,
|
||
// 供模板中判断颜色和显示数值
|
||
upCount,
|
||
// 上涨股票数
|
||
downCount,
|
||
// 下跌股票数
|
||
formattedAvg
|
||
// 格式化后的均涨值(带正负号)
|
||
};
|
||
});
|
||
const sortByTimeDesc = (a, b) => {
|
||
const timeToMinutes = (timeStr) => {
|
||
const [hours, minutes] = timeStr.split(":").map(Number);
|
||
return hours * 60 + minutes;
|
||
};
|
||
const minutesA = timeToMinutes(a.time);
|
||
const minutesB = timeToMinutes(b.time);
|
||
return minutesB - minutesA;
|
||
};
|
||
const sortedAlerts = processedAlerts.sort(sortByTimeDesc);
|
||
this.marketAlertsList = sortedAlerts;
|
||
this.initChart(data.index.timeline, processedAlerts);
|
||
}).catch((error) => {
|
||
});
|
||
},
|
||
async initChart(timeline, alerts) {
|
||
if (!timeline || timeline.length === 0)
|
||
return;
|
||
const chart = await this.$refs.chartRef.init(echarts);
|
||
this.chartInstance = chart;
|
||
const xAxisTime = timeline.map((item) => {
|
||
var _a;
|
||
return ((_a = item.time) == null ? void 0 : _a.trim()) || "";
|
||
});
|
||
const yAxisPrice = timeline.map((item) => Number(item.price) || 0);
|
||
const changePctList = timeline.map((item) => Number(item.change_pct)).filter((val) => !isNaN(val) && val !== null && val !== void 0);
|
||
const validPrices = yAxisPrice.filter((val) => val !== 0 && !isNaN(val));
|
||
const priceMin = validPrices.length > 0 ? Math.min(...validPrices) : 0;
|
||
const priceMax = validPrices.length > 0 ? Math.max(...validPrices) : 0;
|
||
const priceRange = priceMax - priceMin;
|
||
const yAxisMin = priceRange > 0 ? priceMin - priceRange * 0.1 : priceMin;
|
||
const yAxisMax = priceRange > 0 ? priceMax + priceRange * 0.25 : priceMax;
|
||
let y2Min = 0, y2Max = 0;
|
||
if (changePctList.length > 0) {
|
||
y2Min = Math.min(...changePctList);
|
||
y2Max = Math.max(...changePctList);
|
||
this.y2MaxText = Number(y2Max).toFixed(2) + "%";
|
||
this.y2MinText = Number(y2Min).toFixed(2) + "%";
|
||
} else {
|
||
this.y2MaxText = "0.00%";
|
||
this.y2MinText = "0.00%";
|
||
}
|
||
const alertObj = {};
|
||
let totalAlert = 0;
|
||
let sameTimeCount = 0;
|
||
let sameScoreCount = 0;
|
||
alerts.forEach((alert) => {
|
||
var _a;
|
||
if (!alert)
|
||
return;
|
||
const alertTime = ((_a = alert.time) == null ? void 0 : _a.trim()) || "";
|
||
const alertScore = Number(alert.importance_score);
|
||
if (alertTime === "" || isNaN(alertScore))
|
||
return;
|
||
const idx = xAxisTime.findIndex((t) => (t == null ? void 0 : t.trim()) === alertTime);
|
||
if (idx === -1)
|
||
return;
|
||
totalAlert++;
|
||
if (!alertObj[alertTime]) {
|
||
alertObj[alertTime] = { ...alert, idx, importance_score: alertScore };
|
||
} else {
|
||
sameTimeCount++;
|
||
const existAlert = alertObj[alertTime];
|
||
if (alertScore > existAlert.importance_score) {
|
||
alertObj[alertTime] = { ...alert, idx, importance_score: alertScore };
|
||
} else if (alertScore === existAlert.importance_score) {
|
||
sameScoreCount++;
|
||
}
|
||
}
|
||
});
|
||
const timeToMinutes = (timeStr) => {
|
||
const [hour, minute] = timeStr.split(":").map(Number);
|
||
return hour * 60 + minute;
|
||
};
|
||
const get10MinGroup = (minutes) => {
|
||
const startMin = Math.floor(minutes / 10) * 10;
|
||
const endMin = startMin + 9;
|
||
const formatTime = (m) => {
|
||
const h = Math.floor(m / 60).toString().padStart(2, "0");
|
||
const mi = (m % 60).toString().padStart(2, "0");
|
||
return `${h}:${mi}`;
|
||
};
|
||
return `${formatTime(startMin)}-${formatTime(endMin)}`;
|
||
};
|
||
const filterBy10MinGroup = (alertObj2) => {
|
||
const alertGroupList = Object.keys(alertObj2).filter((time) => time && time.includes(":")).map((time) => {
|
||
const minutes = timeToMinutes(time);
|
||
return {
|
||
group: get10MinGroup(minutes),
|
||
// 所属10分钟分组
|
||
score: alertObj2[time].importance_score,
|
||
// 告警评分
|
||
data: alertObj2[time]
|
||
// 原始告警数据
|
||
};
|
||
});
|
||
if (alertGroupList.length === 0)
|
||
return {};
|
||
const groupMap = {};
|
||
alertGroupList.forEach((item) => {
|
||
if (!groupMap[item.group]) {
|
||
groupMap[item.group] = [];
|
||
}
|
||
groupMap[item.group].push(item);
|
||
});
|
||
const finalAlertObj = {};
|
||
Object.keys(groupMap).forEach((groupName) => {
|
||
const groupItems = groupMap[groupName];
|
||
const sortedItems = groupItems.sort((a, b) => b.score - a.score);
|
||
const topItem = sortedItems[0];
|
||
finalAlertObj[topItem.data.time] = topItem.data;
|
||
});
|
||
return finalAlertObj;
|
||
};
|
||
const filteredAlertObj = filterBy10MinGroup(alertObj);
|
||
const originalKeyLen = Object.keys(alertObj).length;
|
||
const filteredKeyLen = Object.keys(filteredAlertObj).length;
|
||
const groupDetail = Object.keys(filteredAlertObj).map((time) => {
|
||
const minutes = timeToMinutes(time);
|
||
return { time, group: get10MinGroup(minutes), score: filteredAlertObj[time].importance_score };
|
||
});
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:957", "===== 告警点处理全统计(10分钟分组版)=====");
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:958", "1. 过滤后有效告警总数量:", totalAlert);
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:959", "2. 相同时间的告警去重数量:", sameTimeCount);
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:960", "3. 相同时间且相同评分数量:", sameScoreCount);
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:961", "4. 基础去重后(同时间最高评分)数量:", originalKeyLen);
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:962", "5. 10分钟分组后(每组取最高评分)数量:", filteredKeyLen);
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:963", "6. 分组详情(时间→所属分组→评分):", groupDetail);
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:964", "7. 分组后最终告警详情:", filteredAlertObj);
|
||
const alertPoints = Object.values(filteredAlertObj).map((alert) => {
|
||
const validIdx = !isNaN(alert.idx) && alert.idx >= 0 && alert.idx < xAxisTime.length ? alert.idx : 0;
|
||
const xVal = xAxisTime[validIdx] || "";
|
||
const yVal = !isNaN(yAxisPrice[validIdx]) ? yAxisPrice[validIdx] : 0;
|
||
return {
|
||
name: alert.concept_name || "未知概念",
|
||
// 概念名兜底
|
||
coord: [xVal, yVal],
|
||
// 确保x轴值严格匹配xAxis.data,y轴值有效
|
||
value: yVal,
|
||
itemStyle: { color: "#FF4444" },
|
||
// 告警点红色
|
||
label: {
|
||
formatter() {
|
||
return alert.concept_name;
|
||
},
|
||
show: true,
|
||
position: "top",
|
||
fontSize: 10,
|
||
color: "#FF4444",
|
||
fontWeight: "500",
|
||
distance: 5
|
||
}
|
||
};
|
||
}).filter(Boolean);
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:991", "8. 最终ECharts告警点数据(10分钟分组):", alertPoints);
|
||
const option = {
|
||
grid: { left: "4%", right: "8%", bottom: "8%", top: "10%", containLabel: true },
|
||
xAxis: {
|
||
type: "category",
|
||
boundaryGap: false,
|
||
data: xAxisTime,
|
||
axisLabel: {
|
||
fontSize: 12,
|
||
rotate: 30,
|
||
interval: Math.floor(xAxisTime.length / 6)
|
||
},
|
||
axisTick: {
|
||
alignWithLabel: true,
|
||
interval: Math.floor(xAxisTime.length / 6)
|
||
}
|
||
},
|
||
yAxis: [
|
||
{
|
||
type: "value",
|
||
min: yAxisMin,
|
||
max: yAxisMax,
|
||
nameTextStyle: { fontSize: 12 },
|
||
axisLabel: {
|
||
formatter: (val) => val.toFixed(0),
|
||
fontSize: 12
|
||
},
|
||
splitLine: { lineStyle: { type: "dashed", color: "#EEEEEE" } },
|
||
boundaryGap: [0.05, 0.05]
|
||
// 上下留5%缓冲,避免顶点告警点被裁剪
|
||
}
|
||
],
|
||
dataZoom: [],
|
||
series: [
|
||
{
|
||
name: "上证指数",
|
||
type: "line",
|
||
smooth: true,
|
||
symbol: "circle",
|
||
symbolSize: 5,
|
||
itemStyle: { color: "#0092FF" },
|
||
lineStyle: {
|
||
width: 2,
|
||
color: "#0092FF",
|
||
shadowColor: "rgba(0,146,255,0.5)",
|
||
shadowBlur: 8,
|
||
shadowOffsetY: 3,
|
||
shadowOffsetX: 0
|
||
},
|
||
areaStyle: {
|
||
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
||
{ offset: 0, color: "rgba(0,146,255,0.25)" },
|
||
{ offset: 1, color: "rgba(0,146,255,0)" }
|
||
])
|
||
},
|
||
data: yAxisPrice,
|
||
// 保留所有markPoint显示修复配置(强制显示/层级/样式)
|
||
markPoint: {
|
||
show: true,
|
||
// 强制开启显示(关键!)
|
||
symbol: "circle",
|
||
symbolSize: 5,
|
||
// 比折线大,避免被遮挡
|
||
z: 10,
|
||
// 层级置顶,不被任何元素遮挡
|
||
data: alertPoints,
|
||
itemStyle: {
|
||
color: "#FF4444",
|
||
borderColor: "#fff",
|
||
// 白色描边,更醒目
|
||
borderWidth: 1
|
||
},
|
||
label: {
|
||
show: true,
|
||
position: "top",
|
||
fontSize: 10,
|
||
color: "#FF4444",
|
||
fontWeight: "500",
|
||
distance: 6,
|
||
backgroundColor: "rgba(255,255,255,0.8)",
|
||
// 标签白色背景,防融合
|
||
padding: [2, 4],
|
||
borderRadius: 2,
|
||
borderColor: "#FF4444",
|
||
// 白色描边,更醒目
|
||
borderWidth: 1
|
||
}
|
||
},
|
||
yAxisIndex: 0
|
||
}
|
||
]
|
||
};
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:1082", "7. 分组后最终告警详情:", JSON.stringify(option.series));
|
||
chart.setOption(option, true);
|
||
common_vendor.index.onWindowResize(() => {
|
||
this.chartInstance && this.chartInstance.resize();
|
||
});
|
||
},
|
||
itemDetails(item) {
|
||
common_vendor.index.navigateTo({
|
||
url: "/pagesStock/stockCenterDetails/stockCenterDetails?code=" + item.stock_code
|
||
});
|
||
},
|
||
moreAction() {
|
||
if (this.isShowTime) {
|
||
common_vendor.index.navigateTo({
|
||
url: "/pages/geGuCenter/detail?currentDate=" + this.currentDate
|
||
});
|
||
} else {
|
||
common_vendor.index.navigateTo({
|
||
url: "/pages/geGuCenter/detail"
|
||
});
|
||
}
|
||
},
|
||
allAction(index) {
|
||
if (index == 1) {
|
||
this.$refs["typePopup"].open();
|
||
} else if (index == 2) {
|
||
this.$refs["datePopup"].open();
|
||
}
|
||
},
|
||
closeAction(index) {
|
||
if (index == 1) {
|
||
this.$refs["typePopup"].close();
|
||
} else if (index == 2) {
|
||
this.$refs["datePopup"].close();
|
||
} else if (index == 3) {
|
||
this.$refs["detailPopup"].close();
|
||
}
|
||
},
|
||
handleDateChange(date) {
|
||
this.selectedDate = date;
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:1124", "选中的日期:", date);
|
||
},
|
||
confirmAction(index) {
|
||
if (index == 1) {
|
||
this.$refs["typePopup"].close();
|
||
} else if (index == 2) {
|
||
if (this.selectedDate) {
|
||
this.currentDate = this.selectedDate;
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:1133", "最终确认的日期:", this.currentDate);
|
||
} else {
|
||
const now = /* @__PURE__ */ new Date();
|
||
const year = now.getFullYear();
|
||
const month = (now.getMonth() + 1).toString().padStart(2, "0");
|
||
const day = now.getDate().toString().padStart(2, "0");
|
||
this.currentDate = `${year}-${month}-${day}`;
|
||
}
|
||
this.isShowTime = true;
|
||
this.marketHeatmap(this.currentDate);
|
||
this.marketStatistics();
|
||
this.marketHotspotListOverview();
|
||
this.$refs["datePopup"].close();
|
||
}
|
||
},
|
||
bkydAction(item) {
|
||
this.$refs["detailPopup"].open();
|
||
this.formattedAvg = item.formattedAvg, this.upCount = item.upCount, this.downCount = item.downCount, this.limit_up_ratio = item.limit_up_ratio, this.conceptStocksDetails(item.concept_id);
|
||
},
|
||
conceptStocksDetails(concept_id) {
|
||
common_vendor.index.__f__("log", "at pages/geGuCenter/geGuCenter.vue:1160", "concept_id", concept_id);
|
||
request_api.conceptStocks(concept_id, {}).then((res) => {
|
||
if (res.data && res.data.stocks) {
|
||
let rawData = res.data.stocks;
|
||
this.conceptStocksList = rawData.sort((a, b) => {
|
||
const aValue = a.change_pct === null || a.change_pct === void 0 ? -999 : Number(a.change_pct);
|
||
const bValue = b.change_pct === null || b.change_pct === void 0 ? -999 : Number(b.change_pct);
|
||
return bValue - aValue;
|
||
});
|
||
} else {
|
||
common_vendor.index.__f__("warn", "at pages/geGuCenter/geGuCenter.vue:1179", "接口返回数据格式异常", res);
|
||
}
|
||
}).catch((error) => {
|
||
});
|
||
},
|
||
// 格式化涨跌幅显示(处理正负号、保留两位小数)
|
||
formatChangePct(change_pct) {
|
||
if (typeof change_pct !== "number")
|
||
return "0.00%";
|
||
const symbol = change_pct >= 0 ? "+" : "";
|
||
return `${symbol}${change_pct.toFixed(2)}%`;
|
||
},
|
||
// 获取涨跌幅文字颜色(涨红跌绿,平盘灰色)
|
||
getChangeColor(change_pct) {
|
||
if (typeof change_pct !== "number")
|
||
return "#888888";
|
||
if (change_pct > 0)
|
||
return "#EC3440";
|
||
if (change_pct < 0)
|
||
return "#00B42A";
|
||
return "#888888";
|
||
}
|
||
}
|
||
};
|
||
if (!Array) {
|
||
const _easycom_navBar2 = common_vendor.resolveComponent("navBar");
|
||
const _easycom_l_echart2 = common_vendor.resolveComponent("l-echart");
|
||
const _easycom_uni_popup2 = common_vendor.resolveComponent("uni-popup");
|
||
const _easycom_LCCalendar22 = common_vendor.resolveComponent("LCCalendar2");
|
||
(_easycom_navBar2 + _easycom_l_echart2 + _easycom_uni_popup2 + _easycom_LCCalendar22)();
|
||
}
|
||
const _easycom_navBar = () => "../../components/navBar/navBar.js";
|
||
const _easycom_l_echart = () => "../../uni_modules/lime-echart/components/l-echart/l-echart.js";
|
||
const _easycom_uni_popup = () => "../../uni_modules/uni-popup/components/uni-popup/uni-popup.js";
|
||
const _easycom_LCCalendar2 = () => "../../components/LCCalendar2/LCCalendar2.js";
|
||
if (!Math) {
|
||
(_easycom_navBar + _easycom_l_echart + _easycom_uni_popup + _easycom_LCCalendar2)();
|
||
}
|
||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||
return common_vendor.e({
|
||
a: common_vendor.p({
|
||
leftText: "个股中心",
|
||
hideNavBg: true,
|
||
hideBack: true
|
||
}),
|
||
b: common_assets._imports_0,
|
||
c: common_assets._imports_1,
|
||
d: common_vendor.o([($event) => $data.keywords = $event.detail.value, ($event) => $options.clickSearch()]),
|
||
e: $data.keywords,
|
||
f: common_vendor.s("top:" + $data.navH + "px;"),
|
||
g: $data.searchShow
|
||
}, $data.searchShow ? {
|
||
h: common_vendor.f($data.searchResultList, (item, index, i0) => {
|
||
return {
|
||
a: common_vendor.t(item.stock_code),
|
||
b: common_vendor.t(item.stock_name),
|
||
c: index,
|
||
d: common_vendor.o(($event) => $options.clickSearchResultListItem(item), index)
|
||
};
|
||
}),
|
||
i: common_vendor.s("top:" + $data.searchResultTop + "px;"),
|
||
j: common_vendor.o(($event) => $options.clickSearchResultBg())
|
||
} : {}, {
|
||
k: common_vendor.f($data.topLists, (item, index, i0) => {
|
||
return {
|
||
a: item.backIcon,
|
||
b: common_vendor.t(item.title),
|
||
c: common_vendor.t(item.value),
|
||
d: item.color,
|
||
e: index
|
||
};
|
||
}),
|
||
l: common_vendor.f($data.topLists2, (item, index, i0) => {
|
||
return {
|
||
a: common_vendor.t(item.title),
|
||
b: $data.list2Index == index ? "#BB8520" : "#070707",
|
||
c: $data.list2Index == index ? "#FFFAF1" : "#FFFFFF",
|
||
d: common_vendor.t(item.value),
|
||
e: $data.list2Index == index ? "#BB8520" : "#070707",
|
||
f: common_vendor.o(($event) => $options.handleTypeClick(index), index),
|
||
g: index,
|
||
h: `1rpx solid ${$data.list2Index == index ? "#F2C369" : "#D2D2D2"}`
|
||
};
|
||
}),
|
||
m: common_vendor.f(["股票名称", "涨跌幅", "市值", "成交额", "行业"], (item, index, i0) => {
|
||
return {
|
||
a: common_vendor.t(item),
|
||
b: index
|
||
};
|
||
}),
|
||
n: common_vendor.f($data.filteredData, (obj, j, i0) => {
|
||
return {
|
||
a: common_vendor.f($options.getTableItem(obj), (item, index, i1) => {
|
||
return common_vendor.e({
|
||
a: common_vendor.t(item[0]),
|
||
b: index == 0
|
||
}, index == 0 ? {
|
||
c: common_vendor.t(item[1])
|
||
} : {}, {
|
||
d: index,
|
||
e: index == 0 ? "#222222" : index == 1 ? item[2] === "positive" ? "#EC3440" : "#01AB5D" : "#666666"
|
||
});
|
||
}),
|
||
b: common_vendor.o(($event) => $options.itemDetails(obj)),
|
||
c: j % 2 == 0 ? "#fff" : "#FAFAFC"
|
||
};
|
||
}),
|
||
o: common_assets._imports_2$3,
|
||
p: common_vendor.o((...args) => $options.moreAction && $options.moreAction(...args)),
|
||
q: common_assets._imports_3$7,
|
||
r: common_assets._imports_4$1,
|
||
s: common_vendor.o(($event) => $options.allAction(1)),
|
||
t: common_vendor.t($data.currentDate),
|
||
v: common_assets._imports_4$1,
|
||
w: common_vendor.o(($event) => $options.allAction(2)),
|
||
x: common_vendor.sr("chartRef", "c7f5c964-1"),
|
||
y: common_vendor.t($data.y2MaxText),
|
||
z: common_vendor.t($data.y2MinText),
|
||
A: common_assets._imports_3$7,
|
||
B: common_vendor.f($data.marketAlertsList, (item, index, i0) => {
|
||
var _a, _b, _c, _d;
|
||
return common_vendor.e({
|
||
a: common_vendor.t(item.time),
|
||
b: common_vendor.t($options.truncateText(item.concept_name, 5)),
|
||
c: ((_a = $data.alertTypeConfig[item.alert_type]) == null ? void 0 : _a.filter) || "",
|
||
d: common_vendor.t(((_b = $data.alertTypeConfig[item.alert_type]) == null ? void 0 : _b.text) || "异动"),
|
||
e: ((_c = $data.alertTypeConfig[item.alert_type]) == null ? void 0 : _c.color) || "#FF7A45",
|
||
f: "1rpx solid " + (((_d = $data.alertTypeConfig[item.alert_type]) == null ? void 0 : _d.color) || "#FF7A45"),
|
||
g: common_vendor.t(item.formattedAvg),
|
||
h: Number(item.alpha) > 0 ? "#EC3440" : "#01AB5D",
|
||
i: common_vendor.t(item.upCount),
|
||
j: item.upCount > 0 ? "#EC3440" : "#888888",
|
||
k: common_vendor.t(item.downCount),
|
||
l: item.downCount > 0 ? "#01AB5D" : "#888888",
|
||
m: common_vendor.t(Math.round(item.final_score)),
|
||
n: item && Number(item.limit_up_ratio) > 0 && !isNaN(Number(item.limit_up_ratio))
|
||
}, item && Number(item.limit_up_ratio) > 0 && !isNaN(Number(item.limit_up_ratio)) ? {
|
||
o: common_vendor.t($options.formatLimitUpRatio(item.limit_up_ratio, 0))
|
||
} : {}, {
|
||
p: index,
|
||
q: common_vendor.o(($event) => $options.bkydAction(item), index)
|
||
});
|
||
}),
|
||
C: common_assets._imports_5$3,
|
||
D: common_vendor.s("top:" + $data.contentTop + "px;"),
|
||
E: common_vendor.o(($event) => $options.closeAction(1)),
|
||
F: common_vendor.o(($event) => $options.confirmAction(1)),
|
||
G: common_vendor.f($data.typeList, (item, index, i0) => {
|
||
return {
|
||
a: item.backIcon,
|
||
b: common_vendor.t(item.title),
|
||
c: index
|
||
};
|
||
}),
|
||
H: common_vendor.sr("typePopup", "c7f5c964-2"),
|
||
I: common_vendor.p({
|
||
type: "bottom",
|
||
safeArea: false
|
||
}),
|
||
J: common_vendor.o(($event) => $options.closeAction(2)),
|
||
K: common_vendor.o(($event) => $options.confirmAction(2)),
|
||
L: common_vendor.o($options.handleDateChange),
|
||
M: common_vendor.sr("datePopup", "c7f5c964-3"),
|
||
N: common_vendor.p({
|
||
type: "bottom",
|
||
safeArea: false
|
||
}),
|
||
O: common_assets._imports_6$1,
|
||
P: common_vendor.o(($event) => $options.closeAction(3)),
|
||
Q: common_vendor.t($data.formattedAvg),
|
||
R: Number($data.formattedAvg) > 0 ? "#EC3440" : "#01AB5D",
|
||
S: common_vendor.t($data.upCount),
|
||
T: $data.upCount > 0 ? "#EC3440" : "#888888",
|
||
U: common_vendor.t($data.downCount),
|
||
V: $data.downCount > 0 ? "#01AB5D" : "#888888",
|
||
W: common_vendor.t($options.formatLimitUpRatio($data.limit_up_ratio, 0)),
|
||
X: common_vendor.f($data.conceptStocksList, (item, index, i0) => {
|
||
return {
|
||
a: common_vendor.t(item.name),
|
||
b: common_vendor.t(item.code),
|
||
c: common_vendor.t($options.formatChangePct(item.change_pct)),
|
||
d: $options.getChangeColor(item.change_pct),
|
||
e: index,
|
||
f: index % 2 == 0 ? "#fff" : "#FAFAFC"
|
||
};
|
||
}),
|
||
Y: common_vendor.sr("detailPopup", "c7f5c964-5"),
|
||
Z: common_vendor.p({
|
||
type: "bottom",
|
||
safeArea: false
|
||
})
|
||
});
|
||
}
|
||
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
|
||
wx.createPage(MiniProgramPage);
|
||
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/geGuCenter/geGuCenter.js.map
|