package trade_analysis import ( "fmt" "hongze/hongze_yb/models/tables/trade_analysis" "hongze/hongze_yb/utils" "sort" "strings" "sync" "time" ) func GetClassifyName() (list trade_analysis.TradeClassifyNameListSort, err error, errMsg string) { //定义交易所 exchanges := map[string]string{ "zhengzhou": "郑商所", "dalian": "大商所", "shanghai": "上期所", "cffex": "中金所", "ine": "上期能源", } exchangesSortMap := map[string]int{ "zhengzhou": 1, "dalian": 2, "shanghai": 3, "cffex": 4, "ine": 5, } //查询每个交易所的最新更新时间 //查询每个交易所下的classifyNameList classifyExchangeMap := make(map[string][]trade_analysis.TradeClassifyName) timeMap := make(map[string]string) i := 0 var wg sync.WaitGroup for k, _ := range exchanges { wg.Add(1) go func(k string,classifyExchangeMap map[string][]trade_analysis.TradeClassifyName) { defer wg.Done() nameList, tmpErr := trade_analysis.GetExchangeClassify(k) if tmpErr != nil { err = tmpErr return } for _, n := range nameList { classifyExchangeMap[k] = append(classifyExchangeMap[k], n) } dataTimeItem, tmpErr := trade_analysis.GetExchangeLastTime(k) if tmpErr != nil { err = tmpErr errMsg = "查询交易所最新更新时间失败" return } timeMap[k] = dataTimeItem.CreateTime.Format(utils.FormatDateTime) }(k, classifyExchangeMap) } wg.Wait() for k, v := range exchanges { tmp := trade_analysis.TradeClassifyNameList{ Exchange: v, Items: nil, Sort: exchangesSortMap[k], } nameList, ok := classifyExchangeMap[k] if !ok { err = fmt.Errorf( "查询交易所分类信息失败") errMsg = "查询交易所分类信息失败" return } tmp.DataTime, ok = timeMap[k] if !ok { err = fmt.Errorf( "查询交易所最新更新时间失败") errMsg = "查询交易所最新更新时间失败" return } classifyMap := make(map[string][]trade_analysis.TradeClassifyNameListItemItem) if len(nameList) > 0 { if k == "zhengzhou" { for _, item := range nameList { classifyName := getZhengzhouClassifyName(item.ClassifyName) tmpItemItem := trade_analysis.TradeClassifyNameListItemItem{ ClassifyType: item.ClassifyName, } classifyMap[classifyName] = append(classifyMap[classifyName], tmpItemItem) } }else{ for _, item := range nameList { tmpItemItem := trade_analysis.TradeClassifyNameListItemItem{ ClassifyType: item.ClassifyType, } classifyMap[item.ClassifyName] = append(classifyMap[item.ClassifyName], tmpItemItem) } } for n, l := range classifyMap { sort.Sort(trade_analysis.TradeClassifyNameListItemItemSort(l)) tmpItems := trade_analysis.TradeClassifyNameListItem{ ClassifyName: n, Items: l, } tmp.Items = append(tmp.Items, tmpItems) tmp.Num ++ } } sort.Sort(trade_analysis.TradeClassifyNameListItemSort(tmp.Items)) list = append(list, tmp) i ++ } if len(list) > 0 { sort.Sort(list) } return } func getZhengzhouClassifyName(code string) (name string) { if strings.HasPrefix(code,"PTA") { name = "PTA" return } if strings.HasPrefix(code,"TA") { name = "PTA" return } if strings.HasPrefix(code,"ZC") { name="动力煤" return } if strings.HasPrefix(code,"WH") { name="强麦" return } if strings.HasPrefix(code,"UR") { name="尿素" return } if strings.HasPrefix(code,"SR") { name="白糖" return } if strings.HasPrefix(code,"SM") { name="锰硅" return } if strings.HasPrefix(code,"SF") { name="硅铁" return } if strings.HasPrefix(code,"SA") { name="纯碱" return } if strings.HasPrefix(code,"RS") { name="油菜籽" return } if strings.HasPrefix(code,"RM") { name="菜籽粕" return } if strings.HasPrefix(code,"RI") { name="早籼稻" return } if strings.HasPrefix(code,"PM") { name="普麦" return } if strings.HasPrefix(code,"PK") { name="花生" return } if strings.HasPrefix(code,"PF") { name="涤纶短纤" return } if strings.HasPrefix(code,"OI") { name="菜油" return } if strings.HasPrefix(code,"MA") { name="甲醇" return } if strings.HasPrefix(code,"LR") { name="晚籼稻" return } if strings.HasPrefix(code,"JR") { name="粳稻" return } if strings.HasPrefix(code,"FG") { name="玻璃" return } if strings.HasPrefix(code,"CY") { name="棉纱" return } if strings.HasPrefix(code,"CJ") { name="红枣" return } if strings.HasPrefix(code,"CF") { name="棉花" return } if strings.HasPrefix(code,"AP") { name="苹果" return } return } func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analysis.GetPositionTopResp, err error, errMsg string) { //定义交易所 exchanges := map[string]string{ "郑商所":"zhengzhou", "大商所":"dalian", "上期所":"shanghai", "中金所":"cffex", "上期能源":"ine", } exchange, ok := exchanges[req.Exchange] if !ok { errMsg = "请输入正确的交易所名称" err = fmt.Errorf(errMsg) return } dataTimeStr := req.DataTime var dataTime time.Time //查询最新的时间 if dataTimeStr == "" { lastItem , tmpErr := trade_analysis.GetTradeTopLastDataTime(exchange, req.ClassifyName, req.ClassifyType) if tmpErr != nil { errMsg = "查询最新的榜单信息失败" err = tmpErr return } dataTime = lastItem.DataTime }else{ dataTime, err = time.ParseInLocation(utils.FormatDate, dataTimeStr, time.Local) if err != nil { errMsg = "请输入正确的时间格式" return } } //遇到周末则跳过当天 weekStr := dataTime.Weekday().String() if weekStr == "Sunday" || weekStr == "Saturday" { /*errMsg = "日期不正确" err = fmt.Errorf(errMsg)*/ return } dataTimeStr = dataTime.Format(utils.FormatDate) classifyName := req.ClassifyName classifyType := req.ClassifyType if exchange == "zhengzhou" { classifyName = classifyType var typeItem *trade_analysis.TradeClassifyName typeItem, err = trade_analysis.GetZhengzhouClassifyTypeByClassifyName(classifyName) if err != nil { if err == utils.ErrNoRow { errMsg = "该合约不存在" return } errMsg = "查询类型信息出错" return } classifyType = typeItem.ClassifyType } //查询当日榜单列表 dataList, tmpErr := trade_analysis.GetTradePositionTop(exchange, classifyName, classifyType, dataTimeStr) if tmpErr != nil { errMsg = "查询榜单列表失败" err = tmpErr return } if len(dataList) <= 0 { return } totalMap := make(map[int]int) totalChangeMap := make(map[int]int) totalTmpMap := make(map[int]int) totalChangeTmpMap := make(map[int]int) detailList := make(map[int][]trade_analysis.GetPositionTopListItem) //统计汇总数据 for _, v := range dataList { if t, ok1 := totalMap[v.DealType]; ok1 { totalMap[v.DealType] = t+v.DealValue }else{ totalMap[v.DealType] = v.DealValue } if t, ok1 := totalChangeMap[v.DealType]; ok1 { totalChangeMap[v.DealType] = t+v.DealChange }else{ totalChangeMap[v.DealType] = v.DealChange } } _, okTmp1 := totalMap[1] _, okTmp2 := totalMap[2] _, okTmp3 := totalMap[3] _, okTmp4 := totalMap[4] if !okTmp1 || !okTmp2 || (!okTmp3 && !okTmp4) { errMsg = "榜单数据缺失" err = fmt.Errorf(errMsg) return } for k, v := range dataList { k++ if t, ok1 := totalTmpMap[v.DealType]; ok1 { totalTmpMap[v.DealType] = t+v.DealValue }else{ totalTmpMap[v.DealType] = v.DealValue } if t, ok1 := totalChangeTmpMap[v.DealType]; ok1 { totalChangeTmpMap[v.DealType] = t+v.DealChange }else{ totalChangeTmpMap[v.DealType] = v.DealChange } tmp := trade_analysis.GetPositionTopListItem{ DealShortName: v.DealShortName, DealValue: v.DealValue, DealChange: v.DealChange, Rank: v.Rank, BeforeAllValue: totalTmpMap[v.DealType], BeforeAllChange: totalChangeTmpMap[v.DealType], } //统计占比 rate := fmt.Sprintf("%.2f", float64(tmp.DealValue)/float64(totalMap[v.DealType])) // 保留2位小数 beforeAllRate := fmt.Sprintf("%.2f", float64(tmp.BeforeAllValue)/float64(totalMap[v.DealType])) // 保留2位小数 tmp.Rate = rate tmp.BeforeAllRate = beforeAllRate if tmp.DealShortName == "-"{ continue } detailList[v.DealType] = append(detailList[v.DealType], tmp) } ret.BuyList.TotalDealValue = totalMap[1] ret.BuyList.TotalDealChange = totalChangeMap[1] ret.BuyList.List = detailList[1] ret.SoldList.TotalDealValue = totalMap[2] ret.SoldList.TotalDealChange = totalChangeMap[2] ret.SoldList.List = detailList[2] ret.CleanBuyList.TotalDealValue = totalMap[3] ret.CleanBuyList.TotalDealChange = totalChangeMap[3] ret.CleanBuyList.List = detailList[3] ret.CleanSoldList.TotalDealValue = totalMap[4] ret.CleanSoldList.TotalDealChange = totalChangeMap[4] ret.CleanSoldList.List = detailList[4] ret.DataTime = dataTimeStr return }