123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- package services
- import (
- "encoding/json"
- "eta/eta_crawler/models"
- "eta/eta_crawler/services/alarm_msg"
- "eta/eta_crawler/utils"
- "fmt"
- "github.com/mozillazg/go-pinyin"
- "github.com/rdlucklib/rdluck_tools/http"
- "strings"
- "time"
- )
- type JSONData struct {
- OCursor []OCursor `json:"o_cursor"`
- OCode interface{} `json:"o_code"`
- OMsg string `json:"o_msg"`
- ReportDate string `json:"report_date"`
- UpdateDate string `json:"update_date"`
- }
- type OCursor struct {
- Instrumentid string `json:"INSTRUMENTID"`
- Participantid3 string `json:"PARTICIPANTID3"`
- Participantid2 string `json:"PARTICIPANTID2"`
- Participantid1 string `json:"PARTICIPANTID1"`
- Participantabbr3 string `json:"PARTICIPANTABBR3"`
- Participantabbr2 string `json:"PARTICIPANTABBR2"`
- Rank int `json:"RANK"`
- Participantabbr1 string `json:"PARTICIPANTABBR1"`
- BuyIn interface{} `json:"CJ2"`
- Deal interface{} `json:"CJ1"`
- Change1 interface{} `json:"CJ1_CHG"`
- Change3 interface{} `json:"CJ3_CHG"`
- Productname string `json:"Productname"`
- Productsortno interface{} `json:"PRODUCTSORTNO"`
- SoldOut interface{} `json:"CJ3"`
- Change2 interface{} `json:"CJ2_CHG"`
- }
- var ineIndexCode string
- var ineIndexCodeMap = make(map[string]string)
- func IneIndexCodeGenerator(shortName, indexName, Instrumentid, suffix string) string {
- if shortName == "" {
- return ""
- }
- strResult := ""
- if shortName != "top20" {
- //取公司全拼
- a := pinyin.NewArgs()
- rows := pinyin.LazyPinyin(shortName, a)
- for i := 0; i < len(rows); i++ {
- strResult += rows[i]
- }
- } else {
- strResult = "top20"
- }
- ineIndexCode, _ := ineIndexCodeMap[indexName]
- if ineIndexCode == "" {
- ineIndexCode = strResult + Instrumentid + suffix
- ineIndexCode = strings.Replace(ineIndexCode, " ", "", -1)
- ineIndexCodeMap[indexName] = ineIndexCode
- err := models.AddBaseFromTradeMapping(indexName, ineIndexCode, "INE")
- if err != nil {
- fmt.Println("add Code err:", err)
- }
- }
- return strings.Replace(ineIndexCode, " ", "", -1)
- }
- // SyncRankingFromIne 上海能源交易中心持单排名
- func SyncRankingFromIne() {
- var err error
- defer func() {
- if err != nil {
- msg := "失败提醒" + "SyncRankingFromIne ErrMsg:" + err.Error()
- go alarm_msg.SendAlarmMsg(msg, 3)
- }
- }()
- n := utils.GetRandInt(10, 120)
- time.Sleep(time.Duration(n) * time.Second)
- allCode, err := models.GetIndexCodeFromMapping("Ine")
- if err != nil {
- fmt.Println("select Code err:", err)
- }
- for _, item := range allCode {
- ineIndexCodeMap[item.IndexName] = item.IndexCode
- }
- //获取新的指标信息
- for i := 10; i >= 0; i-- {
- var message JSONData
- var item = new(models.BaseFromTradeIneIndex)
- zzUrl := "http://www.ine.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)
- }
- if body == nil {
- return
- }
- err = json.Unmarshal(body, &message)
- if err != nil {
- fmt.Println("Unmarshal Err:", err)
- continue
- }
- var position = message.OCursor
- var tradeDate = message.ReportDate
- existIndexMap := make(map[string]*models.BaseFromTradeIneIndex)
- //获取所有指标信息
- allIndex, err := models.GetBaseFromTradeIneIndexAll(dateStr)
- if err != nil {
- fmt.Println("select err:", err)
- }
- 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.Participantabbr1 != "" {
- //成交量
- item.Rank = p.Rank
- item.DealShortName = p.Participantabbr1
- item.BuyShortName = p.Participantabbr2
- item.SoldShortName = p.Participantabbr3
- item.DealName = strings.Replace(fmt.Sprintf("%s", p.Participantabbr1+"_"+p.Instrumentid+"_成交量(手)"), " ", "", -1)
- item.BuyName = strings.Replace(fmt.Sprintf("%s", p.Participantabbr2+"_"+p.Instrumentid+"_持买单量(手)"), " ", "", -1)
- item.SoldName = strings.Replace(fmt.Sprintf("%s", p.Participantabbr3+"_"+p.Instrumentid+"_持卖单量(手)"), " ", "", -1)
- item.DealCode = IneIndexCodeGenerator(item.DealShortName, item.DealName, p.Instrumentid, "deal")
- item.BuyCode = IneIndexCodeGenerator(item.BuyShortName, item.BuyName, p.Instrumentid, "buy")
- item.SoldCode = IneIndexCodeGenerator(item.SoldShortName, item.SoldName, p.Instrumentid, "sold")
- item.ClassifyName = strings.Replace(p.Productname, " ", "", -1)
- item.ClassifyType = strings.Replace(p.Instrumentid, " ", "", -1)
- item.Frequency = "日度"
- item.CreateTime = time.Now()
- item.ModifyTime = time.Now()
- item.DataTime = tradeDate
- if deal, ok := p.Deal.(float64); ok {
- item.DealValue = int(deal)
- }
- if change1, ok := p.Change1.(float64); ok {
- item.DealChange = int(change1)
- }
- if buyIn, ok := p.BuyIn.(float64); ok {
- item.BuyValue = int(buyIn)
- }
- if change2, ok := p.Change2.(float64); ok {
- item.BuyChange = int(change2)
- }
- if soldOut, ok := p.SoldOut.(float64); ok {
- item.SoldValue = int(soldOut)
- }
- if change3, ok := p.Change3.(float64); ok {
- item.SoldChange = int(change3)
- }
- itemVerifyCode = item.BuyValue + item.DealValue + item.SoldValue
- if existIndex, ok := existIndexMap[item.DealName+item.BuyName+item.SoldName]; !ok {
- newID, err := models.AddBaseFromTradeIneIndex(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.ModifyBaseFromTradeIneIndex(item.DealValue, item.BuyValue, item.SoldValue, existIndex.BaseFromTradeIneIndexId)
- if err != nil {
- fmt.Println("data update err:", err)
- }
- }
- } else if p.Rank == 999 {
- //Top 20
- item.Rank = p.Rank
- item.DealShortName = p.Participantabbr1
- item.BuyShortName = p.Participantabbr2
- item.SoldShortName = p.Participantabbr3
- item.DealName = strings.Replace(fmt.Sprintf("%s", "top20_"+p.Instrumentid+"_成交量(手)"), " ", "", -1)
- item.BuyName = strings.Replace(fmt.Sprintf("%s", "top20_"+p.Instrumentid+"_持买单量(手)"), " ", "", -1)
- item.SoldName = strings.Replace(fmt.Sprintf("%s", "top20_"+p.Instrumentid+"_持卖单量(手)"), " ", "", -1)
- item.DealCode = IneIndexCodeGenerator("top20", item.DealName, p.Instrumentid, "deal")
- item.BuyCode = IneIndexCodeGenerator("top20", item.BuyName, p.Instrumentid, "buy")
- item.SoldCode = IneIndexCodeGenerator("top20", item.SoldName, p.Instrumentid, "sold")
- item.ClassifyName = strings.Replace(p.Productname, " ", "", -1)
- item.ClassifyType = strings.Replace(p.Instrumentid, " ", "", -1)
- item.Frequency = "日度"
- item.CreateTime = time.Now()
- item.ModifyTime = time.Now()
- item.DataTime = tradeDate
- if deal, ok := p.Deal.(float64); ok {
- item.DealValue = int(deal)
- }
- if change1, ok := p.Change1.(float64); ok {
- item.DealChange = int(change1)
- }
- if buyIn, ok := p.BuyIn.(float64); ok {
- item.BuyValue = int(buyIn)
- }
- if change2, ok := p.Change2.(float64); ok {
- item.BuyChange = int(change2)
- }
- if soldOut, ok := p.SoldOut.(float64); ok {
- item.SoldValue = int(soldOut)
- }
- if change3, ok := p.Change3.(float64); ok {
- item.SoldChange = int(change3)
- }
- itemVerifyCode = item.BuyValue + item.DealValue + item.SoldValue
- if existIndex, ok := existIndexMap[item.DealName+item.BuyName+item.SoldName]; !ok {
- newID, err := models.AddBaseFromTradeIneIndex(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.ModifyBaseFromTradeIneIndex(item.DealValue, item.BuyValue, item.SoldValue, existIndex.BaseFromTradeIneIndexId)
- if err != nil {
- fmt.Println("data update err:", err)
- }
- }
- }
- }
- }
- fmt.Println("end")
- }
|