From 35874406b3905ef91368440420ccb8c0cfc5fa58 Mon Sep 17 00:00:00 2001 From: yanweidong Date: Tue, 3 Feb 2026 22:38:24 +0800 Subject: [PATCH] fix bug --- cmd/cli/main.go | 10 ++---- internal/logic/strategy/{rule => }/ai.go | 41 ++++++++++-------------- internal/logic/strategy/boot.go | 27 ++++++++++++++++ internal/logic/strategy/data.go | 7 +++- 4 files changed, 53 insertions(+), 32 deletions(-) rename internal/logic/strategy/{rule => }/ai.go (70%) diff --git a/cmd/cli/main.go b/cmd/cli/main.go index 68b26b9..2700962 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -37,15 +37,16 @@ func main() { // 过滤无需AI分析 if model.StScore > 0 && model.IndustryScore > 0 && model.GtPrice > 0 && model.GtAmount > 0 && model.GtRoe > 0 && model.ScoreRsi > 0 { - stratRule.RunAi(code) + model.AiScore = 0 // 待分析 } else { model.AiScore = -2 model.AddDesc("无需AI分析") } } - model.Save() } + + strategy.BootAiStart("selector", models.GetYmd()) } func ai() { @@ -53,11 +54,6 @@ func ai() { config.New(ServiceKey) impl.NewImpl() - code := "601899.SH" - model := models.NewStratModel("selector", code) - stratRule := rule.NewRule(model) - stratRule.RunAi(code) - } func main3() { diff --git a/internal/logic/strategy/rule/ai.go b/internal/logic/strategy/ai.go similarity index 70% rename from internal/logic/strategy/rule/ai.go rename to internal/logic/strategy/ai.go index befcd5a..f864d59 100644 --- a/internal/logic/strategy/rule/ai.go +++ b/internal/logic/strategy/ai.go @@ -1,8 +1,9 @@ -package rule +package strategy import ( "context" "encoding/json" + "errors" "fmt" "os" "strings" @@ -17,19 +18,15 @@ var ( MarkdataPath = "./markdata/" ) -func (r *RuleFactory) RunAi(code string) { +func AiAnalysis(code string) (map[string]any, error) { mdPath := MarkdataPath + code + ".md" if !utils.PathExists(mdPath) { - r.Model.AiScore = -1 - r.Model.AddDesc(fmt.Sprintf("%s markdown 文件未找友", mdPath)) - return + return nil, errors.New(fmt.Sprintf("%s markdown 文件未找友", mdPath)) } content, err := os.ReadFile(mdPath) if err != nil { - r.Model.AiScore = -1 - r.Model.AddDesc(fmt.Sprintf("%s markdown 读取错误,%v", mdPath, err)) - return + return nil, errors.New(fmt.Sprintf("%s markdown 读取错误,%v", mdPath, err)) } client, _ := deepseek.NewClient(config.Spec.DeepSeekApiKey) @@ -51,9 +48,7 @@ func (r *RuleFactory) RunAi(code string) { chatResp, err := client.CallChatCompletionsChat(context.Background(), chatReq) if err != nil { - r.Model.AiScore = -1 - r.Model.AddDesc(fmt.Sprintf("处理失败: %v", err)) - return + return nil, errors.New(fmt.Sprintf("处理失败: %v", err)) } // 输出JSON格式的结果 @@ -63,21 +58,19 @@ func (r *RuleFactory) RunAi(code string) { var result map[string]any err = json.Unmarshal([]byte(jsonBodys), &result) if err != nil { - r.Model.AiScore = -1 - r.Model.AddDesc(fmt.Sprintf("Unmarshal: %v", err)) - return + return nil, errors.New(fmt.Sprintf("Unmarshal: %v", err)) } - r.Model.AiSummary = result["summary"].(string) - r.Model.AiSummary2025 = result["summary_2025"].(string) - r.Model.AiSummaryBase = result["summary_base"].(string) - r.Model.AiSummaryTech = result["summary_tech"].(string) - r.Model.AiScore = int(result["score"].(float64)) - r.Model.AiSupportLevel = result["support_level"].(float64) - r.Model.AiResisLevel = result["resis_level"].(float64) - r.Model.AiAction = result["action"].(string) - r.Model.AiRisk = result["risk"].(string) + // r.Model.AiSummary = result["summary"].(string) + // r.Model.AiSummary2025 = result["summary_2025"].(string) + // r.Model.AiSummaryBase = result["summary_base"].(string) + // r.Model.AiSummaryTech = result["summary_tech"].(string) + // r.Model.AiScore = int(result["score"].(float64)) + // r.Model.AiSupportLevel = result["support_level"].(float64) + // r.Model.AiResisLevel = result["resis_level"].(float64) + // r.Model.AiAction = result["action"].(string) + // r.Model.AiRisk = result["risk"].(string) - return + return result, nil } diff --git a/internal/logic/strategy/boot.go b/internal/logic/strategy/boot.go index c1b7455..41295a4 100644 --- a/internal/logic/strategy/boot.go +++ b/internal/logic/strategy/boot.go @@ -1,5 +1,32 @@ package strategy +import ( + "log" + + "git.apinb.com/quant/gostock/internal/impl" + "git.apinb.com/quant/gostock/internal/models" +) + func Boot() { InitCacheByAll() } + +func BootAiStart(key string, ymd int) { + var datas []models.StratModel + err := impl.DBService.Where("strat_key=? and ymd=? and ai_score=0", key, ymd).Find(&datas).Error + if err != nil { + panic(err) + } + for _, row := range datas { + go BootAiTask(row.ID, row.Code) + } +} + +func BootAiTask(id uint, code string) { + result, err := AiAnalysis(code) + if err != nil { + log.Println("ERROR BootAiTask", err.Error()) + return + } + impl.DBService.Model(&models.StratModel{}).Where("id=?", id).Updates(result) +} diff --git a/internal/logic/strategy/data.go b/internal/logic/strategy/data.go index 72ce3ba..12836ae 100644 --- a/internal/logic/strategy/data.go +++ b/internal/logic/strategy/data.go @@ -34,7 +34,12 @@ func GetFullData(code string) *StockData { } func GetStocks() (stocks []string) { - impl.DBService.Model(&models.StockBasic{}).Group("ts_code").Pluck("ts_code", &stocks) + impl.DBService.Model(&models.StockBasic{}).Pluck("ts_code", &stocks) + return +} + +func GetStocksByCond(key string, val int) (stocks []string) { + impl.DBService.Model(&models.StockBasic{}).Where(key+"=?", val).Pluck("ts_code", &stocks) return }