|
@@ -0,0 +1,289 @@
|
|
|
+package trade_analysis
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "hongze/hongze_yb/models/tables/trade_analysis"
|
|
|
+ "hongze/hongze_yb/utils"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+func GetClassifyName() (list []trade_analysis.TradeClassifyNameList, err error, errMsg string) {
|
|
|
+ //定义交易所
|
|
|
+ exchanges := map[string]string{
|
|
|
+ "zhengzhou": "郑商所",
|
|
|
+ "dalian": "大商所",
|
|
|
+ "shanghai": "上期所",
|
|
|
+ "cffex": "中金所",
|
|
|
+ "ine": "上期能源",
|
|
|
+ }
|
|
|
+ //查询每个交易所下的classifyNameList
|
|
|
+ list = make([]trade_analysis.TradeClassifyNameList, 0)
|
|
|
+ i := 0
|
|
|
+ for k, v := range exchanges {
|
|
|
+ tmp := trade_analysis.TradeClassifyNameList{
|
|
|
+ Exchange: v,
|
|
|
+ Items: nil,
|
|
|
+ }
|
|
|
+ nameList, tmpErr := trade_analysis.GetExchangeClassify(k)
|
|
|
+ if tmpErr != nil {
|
|
|
+ err = tmpErr
|
|
|
+ errMsg = "查询交易所分类信息失败"
|
|
|
+ return
|
|
|
+ }
|
|
|
+ classifyMap := make(map[string][]trade_analysis.TradeClassifyNameListItemItem)
|
|
|
+ if len(nameList) > 0 {
|
|
|
+ if k == "zhengzhou" {
|
|
|
+ for j, item := range nameList {
|
|
|
+ classifyName := getZhengzhouClassifyName(item.ClassifyName)
|
|
|
+ tmpItemItem := trade_analysis.TradeClassifyNameListItemItem{
|
|
|
+ ClassifyType: item.ClassifyName,
|
|
|
+ Sort: j+1000*i,
|
|
|
+ }
|
|
|
+ classifyMap[classifyName] = append(classifyMap[classifyName], tmpItemItem)
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ for j, item := range nameList {
|
|
|
+ tmpItemItem := trade_analysis.TradeClassifyNameListItemItem{
|
|
|
+ ClassifyType: item.ClassifyType,
|
|
|
+ Sort: j+1000*i,
|
|
|
+ }
|
|
|
+ classifyMap[item.ClassifyName] = append(classifyMap[item.ClassifyName], tmpItemItem)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for n, l := range classifyMap {
|
|
|
+ tmpItems := trade_analysis.TradeClassifyNameListItem{
|
|
|
+ ClassifyName: n,
|
|
|
+ Items: l,
|
|
|
+ }
|
|
|
+ tmp.Items = append(tmp.Items, tmpItems)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ list = append(list, tmp)
|
|
|
+ i ++
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func getZhengzhouClassifyName(code string) (name string) {
|
|
|
+ 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
|
|
|
+ //查询最新的时间
|
|
|
+ if dataTimeStr == "" {
|
|
|
+ lastItem , tmpErr := trade_analysis.GetTradeTopLastDataTime(exchange, req.ClassifyName, req.ClassifyType)
|
|
|
+ if tmpErr != nil {
|
|
|
+ errMsg = "查询最新的榜单信息失败"
|
|
|
+ err = tmpErr
|
|
|
+ return
|
|
|
+ }
|
|
|
+ dataTimeStr = lastItem.DataTime
|
|
|
+ }
|
|
|
+ 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)
|
|
|
+ //查询当日榜单列表
|
|
|
+ dataList, tmpErr := trade_analysis.GetTradePositionTop(exchange, req.ClassifyName, req.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: k,
|
|
|
+ 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
|
|
|
+ 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
|
|
|
+}
|