package services import ( "encoding/json" "fmt" "hongze/hongze_data_crawler/models" "hongze/hongze_data_crawler/utils" "rdluck_tools/http" "strconv" "strings" "time" ) type Position []struct { ContractCode string `json:"INSTRUMENTID"` ProductSortNo int `json:"PRODUCTSORTNO"` Rank int `json:"RANK"` ParticipantID1 string `json:"PARTICIPANTID1"` ParticipantName1 string `json:"PARTICIPANTABBR1"` Deal int `json:"CJ1"` Change1 int `json:"CJ1_CHG"` ParticipantID2 string `json:"PARTICIPANTID2"` ParticipantName2 string `json:"PARTICIPANTABBR2"` BuyIn int `json:"CJ2"` Change2 int `json:"CJ2_CHG"` ParticipantID3 string `json:"PARTICIPANTID3"` ParticipantName3 string `json:"PARTICIPANTABBR3"` SoldOut int `json:"CJ3"` Change3 int `json:"CJ3_CHG"` ProductName string `json:"PRODUCTNAME"` } type Message struct { Position Position `json:"o_cursor"` Length string `json:"showlength"` Code int `json:"o_code"` Msg string `json:"o_msg"` ReportDate string `json:"report_date"` UpdateDate string `json:"update_date"` PrintDate string `json:"print_date"` } var indexCode string var indexCodeMap = make(map[string]string) func shIndexCodeGenerator(indexName string) string { indexCode,_ := indexCodeMap[indexName] if indexCode == "" { indexCode = fmt.Sprintf("SH%s", time.Now().Format(utils.FormatDateTimeUnSpace)+strconv.Itoa(utils.GetRandInt(1, 100))) indexCodeMap[indexName] = indexCode err := models.AddBaseFromTradeMapping(indexName, indexCode, "SH") if err != nil { fmt.Println("add Code err:", err) } } return indexCode } // SyncRankingFromShangHai 上海商品交易所持单排名 func SyncRankingFromShangHai() { //获取新的指标信息 for i := 180; i > 0; i-- { var message Message var item = new(models.BaseFromTradeShanghaiIndex) zzUrl := "http://www.shfe.com.cn/data/dailydata/kx/pm%s.dat" date := time.Now().AddDate(0, 0, -i) dateStr := date.Format(utils.FormatDateUnSpace) zzUrl = fmt.Sprintf(zzUrl, dateStr) fmt.Println(zzUrl) body, err := http.Get(zzUrl) if err != nil { fmt.Println("err:", err) } err = json.Unmarshal(body, &message) var position = message.Position var tradeDate = message.ReportDate //获取所有指标信息 allIndex, err := models.GetBaseFromTradeShangHaiIndexAll(dateStr) if err != nil { return } existIndexMap := make(map[string]*models.BaseFromTradeShanghaiIndex) for _, v := range allIndex { indexKey := v.DealName + v.BuyName + v.SoldName + v.DataTime existIndexMap[indexKey] = v } var itemVerifyCode int //处理指标 for _, p := range position { if p.Rank > 0 && p.Rank <40 && p.ParticipantName1 != "" { //成交量 item.Rank = p.Rank item.DealShortName = p.ParticipantName1 item.BuyShortName = p.ParticipantName2 item.SoldShortName = p.ParticipantName3 item.DealName = strings.Replace(fmt.Sprintf("%s", p.ParticipantName1+"_成交量"+"_"+p.ProductName+"_"+p.ContractCode), " ", "", -1) item.BuyName = strings.Replace(fmt.Sprintf("%s", p.ParticipantName2+"_持买单量"+"_"+p.ProductName+"_"+p.ContractCode), " ", "", -1) item.SoldName = strings.Replace(fmt.Sprintf("%s", p.ParticipantName3+"_持卖单量"+"_"+p.ProductName+"_"+p.ContractCode), " ", "", -1) item.DealCode = shIndexCodeGenerator(item.DealName) item.BuyCode = shIndexCodeGenerator(item.BuyName) item.SoldCode = shIndexCodeGenerator(item.SoldCode) item.DealValue = p.Deal item.DealChange = p.Change1 item.BuyValue = p.BuyIn item.BuyChange = p.Change2 item.SoldValue = p.SoldOut item.SoldChange = p.Change3 item.ClassifyName = strings.Replace(p.ProductName, " ", "", -1) item.ClassifyType = strings.Replace(p.ContractCode, " ", "", -1) item.Frequency = "日度" item.CreateTime = time.Now() item.ModifyTime = time.Now() item.DataTime = tradeDate itemVerifyCode = item.BuyValue + item.DealValue + item.SoldValue if existIndex, ok := existIndexMap[item.DealName + item.BuyName + item.SoldName + item.DataTime]; !ok { newID, err := models.AddBaseFromTradeShangHaiIndex(item) if err != nil { fmt.Println("insert error:", err) } fmt.Println("insert new indexID:", newID) } else if existIndex != nil && itemVerifyCode != (existIndex.DealValue+existIndex.BuyValue+existIndex.SoldValue) { //更新 err := models.ModifyBaseFromTradeShangHaiIndex(item.DealValue, item.BuyValue, item.SoldValue, existIndex.BaseFromTradeShangHaiIndexId) if err != nil { fmt.Println("data update err:", err) } } } } } fmt.Println("end") }