package services import ( "encoding/json" "fmt" "github.com/mozillazg/go-pinyin" "hongze/hongze_data_crawler/models" "hongze/hongze_data_crawler/utils" "rdluck_tools/http" "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(shortName, indexName, contractCode, suffix string) string { if shortName == "" { indexCode = "" return indexCode } //取公司前两个字的全拼 a := pinyin.NewArgs() rows := pinyin.Pinyin(shortName, a) strResult := "" for i := 0; i < len(rows[:2]); i++ { if len(rows[i]) != 0 { strResult += rows[i][0] } } indexCode, _ := indexCodeMap[indexName] if indexCode == "" { indexCode = strResult + contractCode + suffix indexCodeMap[indexName] = indexCode err := models.AddBaseFromTradeMapping(indexName, indexCode, "SH") if err != nil { fmt.Println("add Code err:", err) } } return strings.Replace(indexCode, " ", "", -1) } // SyncRankingFromShangHai 上海商品交易所持单排名 func SyncRankingFromShangHai() { n := utils.GetRandInt(10, 120) time.Sleep(time.Duration(n) * time.Second) allCode, err := models.GetIndexCodeFromMapping("Z") if err != nil { fmt.Println("select Code err:", err) } for _, item := range allCode { indexCodeMap[item.IndexName] = item.IndexCode } //获取新的指标信息 for i := 2; 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 existIndexMap[indexKey] = v } var itemVerifyCode int //处理指标 for _, p := range position { if p.Rank > 0 && p.Rank < 40 && p.ParticipantName1 != "" { if strings.Replace(p.ProductName, " ", "", -1) != "20号胶" && strings.Replace(p.ProductName, " ", "", -1) != "低硫燃料油" { //成交量 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.ContractCode+"_成交量"), " ", "", -1) item.BuyName = strings.Replace(fmt.Sprintf("%s", p.ParticipantName2+"_"+p.ContractCode+"_持买单量"), " ", "", -1) item.SoldName = strings.Replace(fmt.Sprintf("%s", p.ParticipantName3+"_"+p.ContractCode+"_持卖单量"), " ", "", -1) item.DealCode = shIndexCodeGenerator(item.DealShortName, item.DealName, p.ContractCode, "deal") item.BuyCode = shIndexCodeGenerator(item.BuyShortName, item.BuyName, p.ContractCode, "buy") item.SoldCode = shIndexCodeGenerator(item.SoldShortName, item.SoldName, p.ContractCode, "sold") 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]; !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") }