//go:build linux // +build linux package main import ( "context" "github.com/coocood/freecache" "github.com/duke-git/lancet/v2/convertor" "github.com/duke-git/lancet/v2/mathutil" "github.com/wailsapp/wails/v2/pkg/runtime" "go-stock/backend/data" "go-stock/backend/logger" ) // App struct type App struct { ctx context.Context cache *freecache.Cache } // NewApp creates a new App application struct func NewApp() *App { cacheSize := 512 * 1024 cache := freecache.NewCache(cacheSize) return &App{ cache: cache, } } // startup is called at application startup func (a *App) startup(ctx context.Context) { // Perform your setup here a.ctx = ctx } // domReady is called after front-end resources have been loaded func (a *App) domReady(ctx context.Context) { // Add your action here //ticker := time.NewTicker(time.Second) //defer ticker.Stop() ////定时更新数据 //go func() { // for range ticker.C { // runtime.WindowSetTitle(ctx, "go-stock "+time.Now().Format("2006-01-02 15:04:05")) // } //}() } // beforeClose is called when the application is about to quit, // either by clicking the window close button or calling runtime.Quit. // Returning true will cause the application to continue, false will continue shutdown as normal. func (a *App) beforeClose(ctx context.Context) (prevent bool) { dialog, err := runtime.MessageDialog(ctx, runtime.MessageDialogOptions{ Type: runtime.QuestionDialog, Title: "go-stock", Message: "确定关闭吗?", Buttons: []string{"确定"}, Icon: icon, CancelButton: "取消", }) if err != nil { return false } logger.SugaredLogger.Debugf("dialog:%s", dialog) if dialog == "No" { return true } return false } // shutdown is called at application termination func (a *App) shutdown(ctx context.Context) { // Perform your teardown here } // Greet returns a greeting for the given name func (a *App) Greet(name string) *data.StockInfo { stockDatas, _ := data.NewStockDataApi().GetStockCodeRealTimeData(name) stockData := (*stockDatas)[0] return &stockData } func (a *App) Follow(stockCode string) string { return data.NewStockDataApi().Follow(stockCode) } func (a *App) UnFollow(stockCode string) string { return data.NewStockDataApi().UnFollow(stockCode) } func (a *App) GetFollowList() []data.FollowedStock { return data.NewStockDataApi().GetFollowList() } func (a *App) GetStockList(key string) []data.StockBasic { return data.NewStockDataApi().GetStockList(key) } func (a *App) SetCostPriceAndVolume(stockCode string, price float64, volume int64) string { return data.NewStockDataApi().SetCostPriceAndVolume(price, volume, stockCode) } func (a *App) SetAlarmChangePercent(val, alarmPrice float64, stockCode string) string { return data.NewStockDataApi().SetAlarmChangePercent(val, alarmPrice, stockCode) } func (a *App) SendDingDingMessage(message string, stockCode string) string { ttl, _ := a.cache.TTL([]byte(stockCode)) logger.SugaredLogger.Infof("stockCode %s ttl:%d", stockCode, ttl) if ttl > 0 { return "" } err := a.cache.Set([]byte(stockCode), []byte("1"), 60*5) if err != nil { logger.SugaredLogger.Errorf("set cache error:%s", err.Error()) return "" } return data.NewDingDingAPI().SendDingDingMessage(message) } func (a *App) SetStockSort(sort int64, stockCode string) { data.NewStockDataApi().SetStockSort(sort, stockCode) } // SendDingDingMessageByType msgType 报警类型: 1 涨跌报警;2 股价报警 3 成本价报警 func (a *App) SendDingDingMessageByType(message string, stockCode string, msgType int) string { ttl, _ := a.cache.TTL([]byte(stockCode)) logger.SugaredLogger.Infof("stockCode %s ttl:%d", stockCode, ttl) if ttl > 0 { return "" } err := a.cache.Set([]byte(stockCode), []byte("1"), getMsgTypeTTL(msgType)) if err != nil { logger.SugaredLogger.Errorf("set cache error:%s", err.Error()) return "" } return data.NewDingDingAPI().SendDingDingMessage(message) } func GenNotificationMsg(stockInfo *data.StockInfo) string { Price, err := convertor.ToFloat(stockInfo.Price) if err != nil { Price = 0 } PreClose, err := convertor.ToFloat(stockInfo.PreClose) if err != nil { PreClose = 0 } var RF float64 if PreClose > 0 { RF = mathutil.RoundToFloat(((Price-PreClose)/PreClose)*100, 2) } return "[" + stockInfo.Name + "] " + stockInfo.Price + " " + convertor.ToString(RF) + "% " + stockInfo.Date + " " + stockInfo.Time } // msgType : 1 涨跌报警(5分钟);2 股价报警(30分钟) 3 成本价报警(30分钟) func getMsgTypeTTL(msgType int) int { switch msgType { case 1: return 60 * 5 case 2: return 60 * 30 case 3: return 60 * 30 default: return 60 * 5 } } func getMsgTypeName(msgType int) string { switch msgType { case 1: return "涨跌报警" case 2: return "股价报警" case 3: return "成本价报警" default: return "未知类型" } } func (a *App) UpdateConfig(settings *data.Settings) string { return data.NewSettingsApi(settings).UpdateConfig() } func (a *App) GetConfig() *data.Settings { return data.NewSettingsApi(&data.Settings{}).GetConfig() }