From 188765185ac2992de680e1892ee34080c579a886 Mon Sep 17 00:00:00 2001 From: no99 <17663930442@163.com> Date: Wed, 29 Oct 2025 10:17:40 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E9=94=80=E6=AF=81?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E7=A7=BB=E9=99=A4=E7=9B=91=E5=90=AC=E5=99=A8?= =?UTF-8?q?=EF=BC=8C=E6=96=AD=E5=BC=80=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/marketSituation/marketCondition.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pages/marketSituation/marketCondition.vue b/pages/marketSituation/marketCondition.vue index e1f6696..f83db6a 100644 --- a/pages/marketSituation/marketCondition.vue +++ b/pages/marketSituation/marketCondition.vue @@ -1789,7 +1789,8 @@ onLoad((options) => { // 保存定时器,用于页面卸载时清理 onUnmounted(() => { - // disconnect(); + removeTcpListeners(); + disconnect(); if (timer) { console.log("卸载定时器"); clearInterval(timer); From f46711c992f62fbbc102868bb260c7ddf131f65c Mon Sep 17 00:00:00 2001 From: hongxilin <17663930442@163.com> Date: Wed, 29 Oct 2025 15:24:16 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=8E=A5k=E7=BA=BF=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=EF=BC=8C=E5=8A=A0=E5=A4=9A=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/marketSituation/marketCondition.vue | 360 ++++++++++++++++++++---------- static/language/en.js | 33 +-- static/language/ms.js | 7 +- static/language/th.js | 7 +- static/language/vi.js | 7 +- static/language/zh_CN.js | 33 +-- static/language/zh_HK.js | 33 +-- 7 files changed, 317 insertions(+), 163 deletions(-) diff --git a/pages/marketSituation/marketCondition.vue b/pages/marketSituation/marketCondition.vue index f83db6a..58c1b51 100644 --- a/pages/marketSituation/marketCondition.vue +++ b/pages/marketSituation/marketCondition.vue @@ -145,7 +145,7 @@ - + - + - - {{ item }} - K线图开发中... @@ -240,21 +237,6 @@ import tcpConnection, { TCPConnection, TCP_CONFIG } from "@/api/tcpConnection.js // TCP相关响应式变量 const tcpConnected = ref(false); -const tcpMessages = ref([]); -const tcpStockData = ref({ - count: 0, - data: {}, - stock_count: 0, - timestamp: "", - type: "", -}); -const currentStockInfo = ref({ - stock_name: "未知股票", - current_price: "0.00", - change: "0.00%", - change_value: 0, - change_percent: 0, -}); const connectionListener = ref(null); const messageListener = ref(null); @@ -465,11 +447,54 @@ const confirmStockColor = (price, lastDayStockClosePrice) => { // 股票K线类型方法 const selectKlineTab = (tabId) => { klineTab.value = tabId; - - if (klineTab.value == 1) { - sendTcpMessage("init_real_time"); + if (klineTab.value) { + sendTcpMessage("stop_real_time"); + } + switch (klineTab.value) { + case 1: + sendTcpMessage("init_real_time"); + break; + case 2: + sendTcpMessage("daily_data"); + break; + case 3: + sendTcpMessage("weekly_data"); + break; + case 4: + sendTcpMessage("monthly_data"); + break; + case 5: + sendTcpMessage("daily_one_minutes_data"); + break; + case 6: + sendTcpMessage("daily_five_minutes_data"); + break; + case 7: + sendTcpMessage("daily_fifteen_minutes_data"); + break; + case 8: + sendTcpMessage("daily_thirty_minutes_data"); + break; + case 9: + sendTcpMessage("daily_sixty_minutes_data"); + break; + case 10: + uni.showToast({ + title: "暂无季K数据", + icon: "none", + duration: 2000, + }); + break; + case 11: + uni.showToast({ + title: "暂无年K数据", + icon: "none", + duration: 2000, + }); + break; + default: + break; } - initCanvas(); // startAddDataTimer(); }; @@ -1246,6 +1271,7 @@ const touchMove = (e) => { } } } else { + return; if (klineTab.value === 2) { // if(currentY) if (currentX < touchState.startX) { @@ -1413,10 +1439,6 @@ const initTcpListeners = () => { timestamp: new Date().toLocaleTimeString(), direction: "received", }; - console.log("0000"); - tcpMessages.value.push(messageObj); - // console.log('收到TCP消息:', messageObj) - console.log("home开始调用parseStockData", messageObj); // 解析股票数据 parseStockData(message); @@ -1469,6 +1491,7 @@ const sendTcpMessage = (command) => { command: "stock_list", }; break; + // 日线数据 case "daily_data": messageData = { command: "daily_data", @@ -1477,38 +1500,53 @@ const sendTcpMessage = (command) => { end_date: "20251023", }; break; + // 周线数据 case "weekly_data": messageData = { command: "weekly_data", stock_code: "000001.SZ", - start_date: "20251001", - end_date: "20251023", + start_date: "2024912", + end_date: "20251029", }; break; + // 周线数据 + case "monthly_data": + messageData = { + command: "monthly_data", + stock_code: "000001.SZ", + start_date: "2024912", + end_date: "20251029", + }; + break; + // 1分钟线数据 case "daily_one_minutes_data": messageData = { command: "daily_one_minutes_data", stock_code: "000001.SZ", }; break; + // 5分钟线数据 case "daily_five_minutes_data": messageData = { command: "daily_five_minutes_data", stock_code: "000001.SZ", }; break; + // 15分钟线数据 case "daily_fifteen_minutes_data": messageData = { command: "daily_fifteen_minutes_data", stock_code: "000001.SZ", }; break; + // 30分钟线数据 case "daily_thirty_minutes_data": messageData = { command: "daily_thirty_minutes_data", stock_code: "000001.SZ", }; break; + // 60分钟线数据 case "daily_sixty_minutes_data": messageData = { command: "daily_sixty_minutes_data", @@ -1531,7 +1569,7 @@ const sendTcpMessage = (command) => { uni.showToast({ title: "命令不存在", icon: "none", - duration: 1500, + duration: 1000, }); return; } else { @@ -1543,7 +1581,7 @@ const sendTcpMessage = (command) => { uni.showToast({ title: "消息发送成功", icon: "success", - duration: 1500, + duration: 1000, }); } } catch (error) { @@ -1551,34 +1589,66 @@ const sendTcpMessage = (command) => { uni.showToast({ title: "消息发送失败", icon: "none", - duration: 1500, + duration: 1000, }); } } }; -// 清空消息记录 -const clearTcpMessages = () => { - tcpMessages.value = []; - uni.showToast({ - title: "消息记录已清空", - icon: "success", - duration: 1500, - }); -}; - // 获取TCP连接状态 const getTcpStatus = () => { const status = tcpConnection.getConnectionStatus(); uni.showModal({ title: "TCP连接状态", - content: `当前状态: ${status ? "已连接" : "未连接"}\n消息数量: ${tcpMessages.value.length}`, + content: `当前状态: ${status ? "已连接" : "未连接"}`, showCancel: false, }); }; -let isMorePacket = false; +let isMorePacket = { + init_real_time: false, + daily_data: false, + weekly_data: false, + monthly_data: false, + daily_one_minutes_data: false, + daily_five_minutes_data: false, + daily_fifteen_minutes_data: false, + daily_thirty_minutes_data: false, + daily_sixty_minutes_data: false, +}; let receivedMessage; +const findJsonPacket = (message, command) => { + let jsonStartIndex = 0; + let jsonEndIndex = message.indexOf(command); + let jsonStartCount = 0; + let jsonEndCount = 0; + + for (let i = 0; i < message.length - 1; ++i) { + if (message[i] == "{") { + jsonStartCount++; + if (jsonStartCount == 2) { + jsonStartIndex = i; + break; + } + } + } + + for (let i = message.indexOf(command); i >= 0; --i) { + if (message[i] == "}" || i == jsonStartIndex) { + jsonEndCount++; + if (jsonEndCount == 1) { + jsonEndIndex = i; + break; + } + } + } + + // 检查JSON字符串是否有效 + if (jsonStartIndex >= jsonEndIndex) { + return { error: true }; + } + return { json: JSON.parse(message.substring(jsonStartIndex, jsonEndIndex + 1)) }; +}; // 解析TCP股票数据 const parseStockData = (message) => { try { @@ -1592,105 +1662,153 @@ const parseStockData = (message) => { console.log("服务器命令列表,不予处理"); return; } - if ((typeof message === "string" && message.includes("init_real_data_start")) || isMorePacket) { + if ((typeof message === "string" && message.includes("init_real_data_start")) || isMorePacket.init_real_time) { if (typeof message === "string" && message.includes("init_real_data_start")) { console.log("开始接受分包数据"); receivedMessage = ""; } else { console.log("接收分包数据过程中"); } - isMorePacket = true; + isMorePacket.init_real_time = true; receivedMessage += message; // 如果当前消息包含},说明收到JSON字符串结尾,结束接收,开始解析 if (receivedMessage.includes("init_real_data_complete")) { console.log("接受分包数据结束"); - isMorePacket = false; + isMorePacket.init_real_time = false; console.log("展示数据", receivedMessage); - // 获取JSON字符串的开头和结尾的坐标 - let jsonStartIndex = 0; - let jsonEndIndex = receivedMessage.indexOf("init_real_data_complete"); - let jsonStartCount = 0; - let jsonEndCount = 0; - for (let i = 0; i < receivedMessage.length - 1; ++i) { - if (receivedMessage[i] == "{") { - jsonStartCount++; - if (jsonStartCount == 2) { - jsonStartIndex = i; - break; - } + + const result = findJsonPacket(receivedMessage, "init_real_data_complete"); + if (result.error) { + throw new Error("解析JSON字符串失败"); + } else { + parsedMessage = result.json; + console.log("JSON解析成功,解析后类型:", typeof parsedMessage, parsedMessage); + if (parsedMessage.type === "daily_data") { + timeData.value = parsedMessage.data; + stockInformation.value.lastDayStockClosePrice = parsedMessage.pre_close; + console.log("lastDayStockClosePrice", stockInformation.value.lastDayStockClosePrice); + drawChart(); + sendTcpMessage("stop_real_time"); + sendTcpMessage("real_time"); } } + } + } else if ((typeof message === "string" && message.includes("daily_data_start")) || isMorePacket.daily_data) { + if (typeof message === "string" && message.includes("daily_data_start")) { + console.log("开始接受分包数据"); + receivedMessage = ""; + } else { + console.log("接收分包数据过程中"); + } + isMorePacket.daily_data = true; + receivedMessage += message; + // 如果当前消息包含},说明收到JSON字符串结尾,结束接收,开始解析 + if (receivedMessage.includes("daily_data_complete")) { + console.log("接受分包数据结束"); + isMorePacket.daily_data = false; - for (let i = receivedMessage.indexOf("init_real_data_complete"); i >= 0; --i) { - if (receivedMessage[i] == "}" || i == jsonStartIndex) { - jsonEndCount++; - if (jsonEndCount == 1) { - jsonEndIndex = i; - break; - } + console.log("展示数据", receivedMessage); + + const result = findJsonPacket(receivedMessage, "daily_data_complete"); + if (result.error) { + throw new Error("解析JSON字符串失败"); + } else { + parsedMessage = result.json; + console.log("JSON解析成功,解析后类型:", typeof parsedMessage, parsedMessage); + if (parsedMessage.type === "daily_data") { + klineData.value = parsedMessage.data.map((item) => ({ + open: item.ask_open, + close: item.ask_close, + high: item.ask_high, + low: item.ask_low, + volume: item.tick_qty, + date: item.trade_date ? `${item.trade_date.slice(0, 4)}-${item.trade_date.slice(4, 6)}-${item.trade_date.slice(6, 8)}` : item.trade_date, + })); + stockInformation.value.lastDayStockClosePrice = klineData.value[klineData.value.length - 2].close; + touchState.offset = canvasWidth.value / klineData.value.length / 2; + console.log("lastDayStockClosePrice", stockInformation.value.lastDayStockClosePrice); + drawChart(); } } - // 检查JSON字符串是否有效 - if (jsonStartIndex >= jsonEndIndex) { - throw new Error("JSON字符串格式错误"); - } + } + } else if ((typeof message === "string" && message.includes("weekly_data_start")) || isMorePacket.weekly_data) { + if (typeof message === "string" && message.includes("weekly_data_start")) { + console.log("开始接受分包数据"); + receivedMessage = ""; + } else { + console.log("接收分包数据过程中"); + } + isMorePacket.weekly_data = true; + receivedMessage += message; + // 如果当前消息包含},说明收到JSON字符串结尾,结束接收,开始解析 + if (receivedMessage.includes("weekly_data_complete")) { + console.log("接受分包数据结束"); + isMorePacket.weekly_data = false; - console.log("检测到JSON字符串,开始解析"); - parsedMessage = JSON.parse(receivedMessage.substring(jsonStartIndex, jsonEndIndex + 1)); - console.log("JSON解析成功,解析后类型:", typeof parsedMessage, parsedMessage); - if (parsedMessage.type === "daily_data") { - timeData.value = parsedMessage.data; - stockInformation.value.lastDayStockClosePrice = parsedMessage.pre_close; - console.log("lastDayStockClosePrice", stockInformation.value.lastDayStockClosePrice); - drawChart(); + console.log("展示数据", receivedMessage); + + const result = findJsonPacket(receivedMessage, "weekly_data_complete"); + if (result.error) { + throw new Error("解析JSON字符串失败"); + } else { + parsedMessage = result.json; + console.log("JSON解析成功,解析后类型:", typeof parsedMessage, parsedMessage); + if (parsedMessage.type === "weekly_data") { + klineData.value = parsedMessage.data.map((item) => ({ + open: item.bid_open, + close: item.bid_close, + high: item.bid_high, + low: item.bid_low, + volume: item.vol, + amount: item.amount, + date: item.trade_date ? `${item.trade_date.slice(0, 4)}-${item.trade_date.slice(4, 6)}-${item.trade_date.slice(6, 8)}` : item.trade_date, + })); + stockInformation.value.lastDayStockClosePrice = klineData.value[klineData.value.length - 2].close; + touchState.offset = canvasWidth.value / klineData.value.length / 2; + console.log("lastDayStockClosePrice", stockInformation.value.lastDayStockClosePrice); + drawChart(); + } } } - // 通过了JSON解析判断,说明返回的数据是需要的正确数据,进行股票实时数据检查 - console.log("开始处理解析后的数据"); - - // 检查是否是股票数据(支持batch_data_chunk和batch_realtime_data两种类型) - if ((parsedMessage.type === "batch_data_chunk" || parsedMessage.type === "batch_realtime_data") && parsedMessage.data) { - console.log("开始更新TCP股票数据存储"); - // 更新TCP股票数据存储 - tcpStockData.value = { - count: parsedMessage.count || 0, - data: parsedMessage.data || {}, - stock_count: parsedMessage.stock_count || 0, - timestamp: parsedMessage.timestamp || "", - type: parsedMessage.type || "", - }; + } else if ((typeof message === "string" && message.includes("daily_one_minutes_data_start")) || isMorePacket.daily_one_minutes_data) { + if (typeof message === "string" && message.includes("daily_one_minutes_data_start")) { + console.log("开始接受分包数据"); + receivedMessage = ""; + } else { + console.log("接收分包数据过程中"); + } + isMorePacket.daily_one_minutes_data = true; + receivedMessage += message; + // 如果当前消息包含},说明收到JSON字符串结尾,结束接收,开始解析 + if (receivedMessage.includes("daily_one_minutes_data_complete")) { + console.log("接受分包数据结束"); + isMorePacket.daily_one_minutes_data = false; - // 获取第一个股票的数据用于显示 - const stockCodes = Object.keys(parsedMessage.data); - if (stockCodes.length > 0) { - const firstStockCode = stockCodes[0]; - - // 检查数据结构 - if (parsedMessage.data[firstStockCode] && Array.isArray(parsedMessage.data[firstStockCode]) && parsedMessage.data[firstStockCode].length > 0) { - const stockData = parsedMessage.data[firstStockCode][0]; // 取第一条数据 - - if (stockData && stockData.current_price !== undefined && stockData.pre_close !== undefined) { - // 计算涨跌幅 - const changeValue = stockData.current_price - stockData.pre_close; - const changePercent = ((changeValue / stockData.pre_close) * 100).toFixed(2); - const changeSign = changeValue >= 0 ? "+" : ""; - - // 更新当前显示的股票信息 - currentStockInfo.value = { - stock_name: stockData.stock_name || "未知股票", - current_price: stockData.current_price ? stockData.current_price.toFixed(2) : "0.00", - change: `${changeSign}${changePercent}%`, - change_value: changeValue, - change_percent: parseFloat(changePercent), - }; - - console.log("股票数据更新成功:", currentStockInfo.value); - } + console.log("展示数据", receivedMessage); + + const result = findJsonPacket(receivedMessage, "daily_one_minutes_data_complete"); + if (result.error) { + throw new Error("解析JSON字符串失败"); + } else { + parsedMessage = result.json; + console.log("JSON解析成功,解析后类型:", typeof parsedMessage, parsedMessage); + if (parsedMessage.type === "daily_one_minutes_data") { + // klineData.value = parsedMessage.data.map((item) => ({ + // open: item.open, + // close: item.close, + // high: item.high, + // low: item.low, + // volume: item.volume, + // amount: item.amount, + // date: item.time, + // })); + stockInformation.value.lastDayStockClosePrice = klineData.value[klineData.value.length - 2].close; + touchState.offset = canvasWidth.value / klineData.value.length / 2; + console.log("lastDayStockClosePrice", stockInformation.value.lastDayStockClosePrice); + drawChart(); } } - } else { - console.log("不是batch_data_chunk或batch_realtime_data类型的消息,跳过处理"); } } else { // 没有通过JSON解析判断,说明不是需要的数据 diff --git a/static/language/en.js b/static/language/en.js index 4165665..3fb3b04 100644 --- a/static/language/en.js +++ b/static/language/en.js @@ -1,14 +1,21 @@ +/** @format */ + export default { - language: { - "name": "Simplified Chinese" - }, - components: { - footerBar: { - homepage: '首页', - marketSituation: '行情', - deepMate: 'DeepMate', - deepExploration: '深度探索', - member: '我的', - }, - } -} \ No newline at end of file + language: { + name: "Simplified Chinese", + }, + components: { + footerBar: { + homepage: "首页", + marketSituation: "行情", + deepMate: "DeepMate", + deepExploration: "深度探索", + member: "我的", + }, + }, + marketSituation: { + globalIndex: "全球指数", + globalIndexMore:'查看更多', + warn:'全球指数为试运行,免费开放,有诸多不足请见谅' + }, +}; diff --git a/static/language/ms.js b/static/language/ms.js index 511083a..1b5488f 100644 --- a/static/language/ms.js +++ b/static/language/ms.js @@ -10,5 +10,10 @@ export default { deepExploration: '深度探索', member: '我的', }, - } + }, + marketSituation: { + globalIndex: "全球指数", + globalIndexMore:'查看更多', + warn:'全球指数为试运行,免费开放,有诸多不足请见谅' + }, } \ No newline at end of file diff --git a/static/language/th.js b/static/language/th.js index 4a6ad2e..5b3179b 100644 --- a/static/language/th.js +++ b/static/language/th.js @@ -10,5 +10,10 @@ export default { deepExploration: '深度探索', member: '我的', }, - } + }, + marketSituation: { + globalIndex: "全球指数", + globalIndexMore:'查看更多', + warn:'全球指数为试运行,免费开放,有诸多不足请见谅' + }, } diff --git a/static/language/vi.js b/static/language/vi.js index cc829a2..862aa11 100644 --- a/static/language/vi.js +++ b/static/language/vi.js @@ -10,5 +10,10 @@ export default { deepExploration: '深度探索', member: '我的', }, - } + }, + marketSituation: { + globalIndex: "全球指数", + globalIndexMore:'查看更多', + warn:'全球指数为试运行,免费开放,有诸多不足请见谅' + }, } \ No newline at end of file diff --git a/static/language/zh_CN.js b/static/language/zh_CN.js index 1569257..b939954 100644 --- a/static/language/zh_CN.js +++ b/static/language/zh_CN.js @@ -1,15 +1,22 @@ +/** @format */ + // 中文简体 export default { - language: { - name: '中文简体' - }, - components: { - footerBar:{ - homepage: '首页', - marketSituation: '行情', - deepMate: 'DeepMate', - deepExploration: '深度探索', - member: '我的', - }, - }, -} + language: { + name: "中文简体", + }, + components: { + footerBar: { + homepage: "首页", + marketSituation: "行情", + deepMate: "DeepMate", + deepExploration: "深度探索", + member: "我的", + }, + }, + marketSituation: { + globalIndex: "全球指数", + globalIndexMore:'查看更多', + warn:'全球指数为试运行,免费开放,有诸多不足请见谅' + }, +}; diff --git a/static/language/zh_HK.js b/static/language/zh_HK.js index 14c440f..76d90f9 100644 --- a/static/language/zh_HK.js +++ b/static/language/zh_HK.js @@ -1,15 +1,22 @@ +/** @format */ + // 中文繁体 export default { - language: { - name: "中文繁体" - }, - components: { - footerBar: { - homepage: '首页', - marketSituation: '行情', - deepMate: 'DeepMate', - deepExploration: '深度探索', - member: '我的', - }, - }, -} \ No newline at end of file + language: { + name: "中文繁体", + }, + components: { + footerBar: { + homepage: "首页", + marketSituation: "行情", + deepMate: "DeepMate", + deepExploration: "深度探索", + member: "我的", + }, + }, + marketSituation: { + globalIndex: "全球指数", + globalIndexMore:'查看更多', + warn:'全球指数为试运行,免费开放,有诸多不足请见谅' + }, +}; From 91b162dd01581b91234c626acd6edc3a1bf594c9 Mon Sep 17 00:00:00 2001 From: hongxilin <17663930442@163.com> Date: Wed, 29 Oct 2025 16:13:59 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E5=88=86=E6=97=B6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/marketSituation/marketCondition.vue | 87 +++++++++++++++++++++++++++++-- 1 file changed, 84 insertions(+), 3 deletions(-) diff --git a/pages/marketSituation/marketCondition.vue b/pages/marketSituation/marketCondition.vue index 58c1b51..412e141 100644 --- a/pages/marketSituation/marketCondition.vue +++ b/pages/marketSituation/marketCondition.vue @@ -963,6 +963,7 @@ const drawChart = () => { return; } const data = klineTab.value == 1 ? timeData.value : klineData.value; + console.log("data", data); chartRange.value = []; // 清除画布 // HCharts.setCanvasColor(ctx.value, width, height, CANVAS_BACKGROUND_COLOR); @@ -1632,7 +1633,6 @@ const findJsonPacket = (message, command) => { } } } - for (let i = message.indexOf(command); i >= 0; --i) { if (message[i] == "}" || i == jsonStartIndex) { jsonEndCount++; @@ -1647,8 +1647,45 @@ const findJsonPacket = (message, command) => { if (jsonStartIndex >= jsonEndIndex) { return { error: true }; } + return { json: JSON.parse(message.substring(jsonStartIndex, jsonEndIndex + 1)) }; }; + +// 根据timeData中最后一个时间生成下一个时间 +const generateNextTime = () => { + if (timeData.value.length === 0) { + return "09:30"; // 如果没有数据,返回开盘时间 + } + + const lastTime = timeData.value[timeData.value.length - 1].time; + if (!lastTime) { + return "09:30"; + } + + // 解析时间字符串,格式为 "HH:MM" + const [hours, minutes] = lastTime.split(":").map(Number); + + // 计算下一分钟 + let nextMinutes = minutes + 1; + let nextHours = hours; + + // 处理分钟进位 + if (nextMinutes >= 60) { + nextMinutes = 0; + nextHours += 1; + } + + // 处理小时进位(24小时制) + if (nextHours >= 24) { + nextHours = 0; + } + + // 格式化为 "HH:MM" 格式 + const formattedHours = nextHours.toString().padStart(2, "0"); + const formattedMinutes = nextMinutes.toString().padStart(2, "0"); + + return `${formattedHours}:${formattedMinutes}`; +}; // 解析TCP股票数据 const parseStockData = (message) => { try { @@ -1662,7 +1699,49 @@ const parseStockData = (message) => { console.log("服务器命令列表,不予处理"); return; } - if ((typeof message === "string" && message.includes("init_real_data_start")) || isMorePacket.init_real_time) { + if (message.includes("real_time")) { + let startIndex = 0; + let endIndex = message.length; + for (let i = 0; i < message.length - 1; ++i) { + if (message[i] == "{") { + startIndex = i; + break; + } + } + for (let i = message.length - 1; i >= 0; --i) { + if (message[i] == "}") { + endIndex = i; + break; + } + } + parsedMessage = JSON.parse(message.substring(startIndex, endIndex + 1)); + console.log("实时数据解析", parsedMessage); + // 处理实时数据 + timeData.value.push({ + time: generateNextTime(), + price: parsedMessage.current_price, + volume: parsedMessage.volume, + amount: parsedMessage.amount, + }); + // 实时更新股票信息 + stockInformation.value.currentPrice = parsedMessage.current_price; + stockInformation.value.openPrice = parsedMessage.open_price; + stockInformation.value.closePrice = parsedMessage.close_price; + stockInformation.value.highPrice = parsedMessage.high_price; + stockInformation.value.lowPrice = parsedMessage.low_price; + stockInformation.value.volume = parsedMessage.volume; + stockInformation.value.amount = parsedMessage.amount; + stockInformation.value.turnoverRatio = parsedMessage.turnover_ratio; + stockInformation.value.marketValue = parsedMessage.total_market_value; + stockInformation.value.currentValue = stockInformation.value.currentPrice - stockInformation.value.lastDayStockClosePrice; + stockInformation.value.currentRatio = ((stockInformation.value.currentPrice - stockInformation.value.lastDayStockClosePrice) / stockInformation.value.lastDayStockClosePrice) * 100; + console.log("重绘画面"); + drawChart(); + if (timeData.value.length >= 240) { + sendTcpMessage("stop_real_time"); + } + return; + } else if ((typeof message === "string" && message.includes("init_real_data_start")) || isMorePacket.init_real_time) { if (typeof message === "string" && message.includes("init_real_data_start")) { console.log("开始接受分包数据"); receivedMessage = ""; @@ -1948,7 +2027,9 @@ onMounted(async () => { console.warn("没有时间数据,跳过股票信息计算"); } await nextTick(); - initCanvas(); + setTimeout(() => { + initCanvas(); + }, 100); console.log("所有初始化步骤完成"); } catch (error) { console.error("初始化过程中出现错误:", error);