diff --git a/backend/data/stock_data_api.go b/backend/data/stock_data_api.go index 850febb..a4eafe9 100644 --- a/backend/data/stock_data_api.go +++ b/backend/data/stock_data_api.go @@ -9,6 +9,7 @@ import ( "encoding/json" "fmt" "github.com/duke-git/lancet/v2/convertor" + "github.com/duke-git/lancet/v2/slice" "github.com/duke-git/lancet/v2/strutil" "github.com/go-resty/resty/v2" "go-stock/backend/db" @@ -162,15 +163,63 @@ func NewStockDataApi() *StockDataApi { client: resty.New(), } } + +// GetIndexBasic 获取指数信息 +func (receiver StockDataApi) GetIndexBasic() { + res := &TushareStockBasicResponse{} + fields := "ts_code,name,market,publisher,category,base_date,base_point,list_date,fullname,index_type,weight_rule,desc" + resp, err := receiver.client.R(). + SetHeader("content-type", "application/json"). + SetBody(&TushareRequest{ + ApiName: "index_basic", + Token: TushareToken, + Params: nil, + Fields: fields}). + SetResult(res). + Post(tushare_api_url) + if err != nil { + logger.SugaredLogger.Error(err.Error()) + return + } + if res.Code != 0 { + logger.SugaredLogger.Error(res.Msg) + return + } + ioutil.WriteFile("index_basic.json", resp.Body(), 0666) + + for _, item := range res.Data.Items { + data := map[string]any{} + for _, field := range strings.Split(fields, ",") { + logger.SugaredLogger.Infof("field: %s", field) + idx := slice.IndexOf(res.Data.Fields, field) + if idx == -1 { + continue + } + data[field] = item[idx] + } + index := &IndexBasic{} + jsonData, _ := json.Marshal(data) + err := json.Unmarshal(jsonData, index) + if err != nil { + continue + } + db.Dao.Model(&IndexBasic{}).FirstOrCreate(index, &IndexBasic{TsCode: index.TsCode}).Updates(index) + } + +} + +// map转换为结构体 + func (receiver StockDataApi) GetStockBaseInfo() { res := &TushareStockBasicResponse{} + fields := "ts_code,symbol,name,area,industry,cnspell,market,list_date,act_name,act_ent_type,fullname,exchange,list_status,curr_type,enname,delist_date,is_hs" resp, err := receiver.client.R(). SetHeader("content-type", "application/json"). SetBody(&TushareRequest{ ApiName: "stock_basic", Token: TushareToken, Params: nil, - Fields: "*", + Fields: fields, }). SetResult(res). Post(tushare_api_url) @@ -187,25 +236,21 @@ func (receiver StockDataApi) GetStockBaseInfo() { return } for _, item := range res.Data.Items { - ID, _ := convertor.ToInt(item[6]) stock := &StockBasic{} - stock.Exchange = convertor.ToString(item[0]) - stock.IsHs = convertor.ToString(item[1]) - stock.Name = convertor.ToString(item[2]) - stock.Industry = convertor.ToString(item[3]) - stock.ListStatus = convertor.ToString(item[4]) - stock.ActName = convertor.ToString(item[5]) - stock.ID = uint(ID) - stock.CurrType = convertor.ToString(item[7]) - stock.Area = convertor.ToString(item[8]) - stock.ListDate = convertor.ToString(item[9]) - stock.DelistDate = convertor.ToString(item[10]) - stock.ActEntType = convertor.ToString(item[11]) - stock.TsCode = convertor.ToString(item[12]) - stock.Symbol = convertor.ToString(item[13]) - stock.Cnspell = convertor.ToString(item[14]) - stock.Fullname = convertor.ToString(item[20]) - stock.Ename = convertor.ToString(item[21]) + data := map[string]any{} + for _, field := range strings.Split(fields, ",") { + logger.SugaredLogger.Infof("field: %s", field) + idx := slice.IndexOf(res.Data.Fields, field) + if idx == -1 { + continue + } + data[field] = item[idx] + } + jsonData, _ := json.Marshal(data) + err := json.Unmarshal(jsonData, stock) + if err != nil { + continue + } db.Dao.Model(&StockBasic{}).FirstOrCreate(stock, &StockBasic{TsCode: stock.TsCode}).Updates(stock) } @@ -372,3 +417,24 @@ func ParseFullSingleStockData(data string) (*StockInfo, error) { return stockInfo, nil } + +type IndexBasic struct { + gorm.Model + TsCode string `json:"ts_code" gorm:"index"` + Symbol string `json:"symbol" gorm:"index"` + Name string `json:"name" gorm:"index"` + FullName string `json:"fullname"` + IndexType string `json:"index_type"` + IndexCategory string `json:"category"` + Market string `json:"market"` + ListDate string `json:"list_date"` + BaseDate string `json:"base_date"` + BasePoint float64 `json:"base_point"` + Publisher string `json:"publisher"` + WeightRule string `json:"weight_rule"` + DESC string `json:"desc"` +} + +func (IndexBasic) TableName() string { + return "tushare_index_basic" +} diff --git a/backend/data/stock_data_api_test.go b/backend/data/stock_data_api_test.go index 7e88a64..6d5ca87 100644 --- a/backend/data/stock_data_api_test.go +++ b/backend/data/stock_data_api_test.go @@ -77,3 +77,9 @@ func TestFollowedList(t *testing.T) { t.Log(stockDataApi.GetFollowList()) } + +func TestStockDataApi_GetIndexBasic(t *testing.T) { + db.Init("../../data/stock.db") + stockDataApi := NewStockDataApi() + stockDataApi.GetIndexBasic() +} diff --git a/main.go b/main.go index 3e5e2fe..bee1234 100644 --- a/main.go +++ b/main.go @@ -35,11 +35,13 @@ func main() { db.Dao.AutoMigrate(&data.StockInfo{}) db.Dao.AutoMigrate(&data.StockBasic{}) db.Dao.AutoMigrate(&data.FollowedStock{}) + db.Dao.AutoMigrate(&data.IndexBasic{}) if stocksBin != nil && len(stocksBin) > 0 { go initStockData() } go data.NewStockDataApi().GetStockBaseInfo() + go data.NewStockDataApi().GetIndexBasic() // Create an instance of the app structure app := NewApp()