From ce91b2e532d89daba475d0ef4408ab897d7eea93 Mon Sep 17 00:00:00 2001 From: ArvinLovegood Date: Sat, 1 Mar 2025 12:42:00 +0800 Subject: [PATCH] =?UTF-8?q?refactor(frontend):=E9=87=8D=E6=9E=84=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=85=B3=E6=B3=A8=E5=88=97=E8=A1=A8=E5=92=8C=E7=BE=8E?= =?UTF-8?q?=E8=82=A1=E8=82=A1=E7=A5=A8=E4=BB=B7=E6=A0=BC=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (当前美股功能处于 测试阶段,可能不稳定。) - 修改 GetFollowList 接口返回类型为 any - 优化关注列表中美国股票代码处理逻辑 - 增加股票价格更新时的盘前盘后信息 - 调整股票数据解析和处理逻辑 --- app.go | 23 ++++++++----- backend/data/stock_data_api.go | 36 ++++++++++++++++--- frontend/src/components/stock.vue | 11 ++++-- frontend/wailsjs/go/main/App.d.ts | 2 +- frontend/wailsjs/go/models.ts | 57 +++---------------------------- 5 files changed, 59 insertions(+), 70 deletions(-) diff --git a/app.go b/app.go index 7dee559..9379e98 100644 --- a/app.go +++ b/app.go @@ -279,15 +279,16 @@ func MonitorStockPrices(a *App) { if strutil.HasPrefixAny(stockInfo.Code, []string{"hk", "HK"}) && (!IsHKTradingTime(time.Now())) { continue } - if strutil.HasPrefixAny(stockInfo.Code, []string{"us", "US", "gb_"}) && (!IsUSTradingTime(time.Now())) { - continue - } + //if strutil.HasPrefixAny(stockInfo.Code, []string{"us", "US", "gb_"}) && (!IsUSTradingTime(time.Now())) { + // continue + //} - total += stockInfo.ProfitAmountToday - price, _ := convertor.ToFloat(stockInfo.Price) - if stockInfo.PrePrice != price { - go runtime.EventsEmit(a.ctx, "stock_price", stockInfo) - } + //total += stockInfo.ProfitAmountToday + //price, _ := convertor.ToFloat(stockInfo.Price) + //if stockInfo.PrePrice != price { + logger.SugaredLogger.Infof("-----------------------股票代码: %s, 股票名称: %s, 股票价格: %s,盘前盘后:%s", stockInfo.Code, stockInfo.Name, stockInfo.Price, stockInfo.BA) + go runtime.EventsEmit(a.ctx, "stock_price", stockInfo) + //} } if total != 0 { title := "go-stock " + time.Now().Format(time.DateTime) + fmt.Sprintf(" %.2f¥", total) @@ -307,6 +308,10 @@ func GetStockInfos(follows ...data.FollowedStock) *[]data.StockInfo { stockData, _ := data.NewStockDataApi().GetStockCodeRealTimeData(stockCodes...) for _, info := range *stockData { v, ok := slice.FindBy(follows, func(idx int, follow data.FollowedStock) bool { + if strutil.HasPrefixAny(follow.StockCode, []string{"US", "us"}) { + return strings.ToLower(strings.Replace(follow.StockCode, "us", "gb_", 1)) == info.Code + } + return follow.StockCode == info.Code }) if ok { @@ -453,7 +458,7 @@ func (a *App) UnFollow(stockCode string) string { return data.NewStockDataApi().UnFollow(stockCode) } -func (a *App) GetFollowList() []data.FollowedStock { +func (a *App) GetFollowList() *[]data.FollowedStock { return data.NewStockDataApi().GetFollowList() } diff --git a/backend/data/stock_data_api.go b/backend/data/stock_data_api.go index 3845758..104a507 100644 --- a/backend/data/stock_data_api.go +++ b/backend/data/stock_data_api.go @@ -73,6 +73,8 @@ type StockInfo struct { A4V string `json:"卖四申报"` A5P string `json:"卖五报价"` A5V string `json:"卖五申报"` + Market string `json:"市场"` + BA string `json:"盘前盘后"` //以下是字段值需二次计算 ChangePercent float64 `json:"changePercent"` //涨跌幅 @@ -315,6 +317,7 @@ func (receiver StockDataApi) GetStockCodeRealTimeData(StockCodes ...string) (*[] for _, data := range dataStr { //logger.SugaredLogger.Info(data) stockData, err := ParseFullSingleStockData(data) + logger.SugaredLogger.Infof("GetStockCodeRealTimeData %v", stockData) if err != nil { logger.SugaredLogger.Error(err.Error()) continue @@ -360,11 +363,21 @@ func (receiver StockDataApi) Follow(stockCode string) string { } func (receiver StockDataApi) UnFollow(stockCode string) string { + if strutil.HasPrefixAny(stockCode, []string{"gb_"}) { + stockCode = strings.ToUpper(stockCode) + stockCode = strings.Replace(stockCode, "gb_", "us", 1) + stockCode = strings.Replace(stockCode, "GB_", "us", 1) + } db.Dao.Model(&FollowedStock{}).Where("stock_code = ?", stockCode).Delete(&FollowedStock{}) return "取消关注成功" } func (receiver StockDataApi) SetCostPriceAndVolume(price float64, volume int64, stockCode string) string { + if strutil.HasPrefixAny(stockCode, []string{"gb_"}) { + stockCode = strings.ToUpper(stockCode) + stockCode = strings.Replace(stockCode, "gb_", "us", 1) + stockCode = strings.Replace(stockCode, "GB_", "us", 1) + } err := db.Dao.Model(&FollowedStock{}).Where("stock_code = ?", stockCode).Update("cost_price", price).Update("volume", volume).Error if err != nil { logger.SugaredLogger.Error(err.Error()) @@ -374,6 +387,11 @@ func (receiver StockDataApi) SetCostPriceAndVolume(price float64, volume int64, } func (receiver StockDataApi) SetAlarmChangePercent(val, alarmPrice float64, stockCode string) string { + if strutil.HasPrefixAny(stockCode, []string{"gb_"}) { + stockCode = strings.ToUpper(stockCode) + stockCode = strings.Replace(stockCode, "gb_", "us", 1) + stockCode = strings.Replace(stockCode, "GB_", "us", 1) + } err := db.Dao.Model(&FollowedStock{}).Where("stock_code = ?", stockCode).Updates(&map[string]any{ "alarm_change_percent": val, "alarm_price": alarmPrice, @@ -386,11 +404,16 @@ func (receiver StockDataApi) SetAlarmChangePercent(val, alarmPrice float64, stoc } func (receiver StockDataApi) SetStockSort(sort int64, stockCode string) { + if strutil.HasPrefixAny(stockCode, []string{"gb_"}) { + stockCode = strings.ToUpper(stockCode) + stockCode = strings.Replace(stockCode, "gb_", "us", 1) + stockCode = strings.Replace(stockCode, "GB_", "us", 1) + } db.Dao.Model(&FollowedStock{}).Where("stock_code = ?", stockCode).Update("sort", sort) } -func (receiver StockDataApi) GetFollowList() []FollowedStock { - var result []FollowedStock +func (receiver StockDataApi) GetFollowList() *[]FollowedStock { + var result *[]FollowedStock db.Dao.Model(&FollowedStock{}).Order("sort asc,time desc").Find(&result) return result } @@ -427,7 +450,7 @@ func (receiver StockDataApi) GetStockList(key string) []StockBasic { } for _, item := range result4 { result = append(result, StockBasic{ - TsCode: item.Code, + TsCode: strings.ToLower(strings.Replace(item.Code, "us", "gb_", 1)), Name: item.Name, Fullname: item.Name, Market: "US", @@ -469,9 +492,11 @@ func ParseFullSingleStockData(data string) (*StockInfo, error) { if err != nil { return nil, err } + logger.SugaredLogger.Infof("股票数据解析完成marshal: %s", marshal) stockInfo := &StockInfo{} err = json.Unmarshal(marshal, &stockInfo) if err != nil { + logger.SugaredLogger.Errorf("json.Unmarshal error:%s", err.Error()) return nil, err } //logger.SugaredLogger.Infof("股票数据解析完成stockInfo: %+v", stockInfo) @@ -509,7 +534,7 @@ func ParseUSStockData(datas []string) (map[string]string, error) { 0.00, 18 12190000000, 19 71, 20 - 170.2000, 21 盘后 + 170.2000, 21 盘前盘后盘 -0.01, 22 -0.01, 23 Feb 27 07:59PM EST, 24 @@ -532,9 +557,10 @@ func ParseUSStockData(datas []string) (map[string]string, error) { result["今日最高价"] = parts[6] result["今日最低价"] = parts[7] result["当前价格"] = parts[1] + result["盘前盘后"] = parts[21] result["日期"] = strutil.SplitAndTrim(parts[3], " ", "")[0] result["时间"] = strutil.SplitAndTrim(parts[3], " ", "")[1] - //logger.SugaredLogger.Infof("美股股票数据解析完成: %v", result) + logger.SugaredLogger.Infof("美股股票数据解析完成: %v", result) return result, nil } diff --git a/frontend/src/components/stock.vue b/frontend/src/components/stock.vue index f31fc4d..84e7ca6 100644 --- a/frontend/src/components/stock.vue +++ b/frontend/src/components/stock.vue @@ -122,7 +122,11 @@ onBeforeMount(()=>{ GetFollowList().then(result => { followList.value = result for (const followedStock of result) { + if(followedStock.StockCode.startsWith("us")){ + followedStock.StockCode="gb_"+ followedStock.StockCode.replace("us", "").toLowerCase() + } if (!stocks.value.includes(followedStock.StockCode)) { + console.log("followList",followedStock.StockCode) stocks.value.push(followedStock.StockCode) } } @@ -192,7 +196,6 @@ EventsOn("showSearch",(data)=>{ }) EventsOn("stock_price",(data)=>{ - //console.log("stock_price",data['股票代码']) updateData(data) }) @@ -390,6 +393,8 @@ function getStockList(value){ } async function updateData(result) { + console.log("stock_price",result['日期'],result['时间'],result['股票代码'],result['股票名称'],result['当前价格'],result['盘前盘后']) + if(result["当前价格"]<=0){ result["当前价格"]=result["卖一报价"] } @@ -474,7 +479,7 @@ function setStock(code,name){ //console.log("res:",res) formModel.value.name=name formModel.value.code=code - formModel.value.volume=res[0].Volume + formModel.value.volume=res[0].Volume?res[0].Volume:0 formModel.value.costPrice=res[0].CostPrice formModel.value.alarm=res[0].AlarmChangePercent formModel.value.alarmPrice=res[0].AlarmPrice @@ -759,6 +764,7 @@ AI赋能股票分析:自选股行情获取,成本盈亏展示,涨跌报警 + ({{result['盘前盘后']}}) % @@ -783,6 +789,7 @@ AI赋能股票分析:自选股行情获取,成本盈亏展示,涨跌报警