trade_analysis.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. package trade_analysis
  2. import (
  3. "fmt"
  4. "hongze/hongze_yb/models/tables/trade_analysis"
  5. "hongze/hongze_yb/utils"
  6. "strings"
  7. "sync"
  8. "time"
  9. )
  10. func GetClassifyName() (list []trade_analysis.TradeClassifyNameList, err error, errMsg string) {
  11. //定义交易所
  12. exchanges := map[string]string{
  13. "zhengzhou": "郑商所",
  14. "dalian": "大商所",
  15. "shanghai": "上期所",
  16. "cffex": "中金所",
  17. "ine": "上期能源",
  18. }
  19. //查询每个交易所的最新更新时间
  20. //查询每个交易所下的classifyNameList
  21. list = make([]trade_analysis.TradeClassifyNameList, 0)
  22. classifyExchangeMap := make(map[string][]trade_analysis.TradeClassifyName)
  23. timeMap := make(map[string]string)
  24. i := 0
  25. var wg sync.WaitGroup
  26. for k, _ := range exchanges {
  27. wg.Add(1)
  28. go func(k string,classifyExchangeMap map[string][]trade_analysis.TradeClassifyName) {
  29. defer wg.Done()
  30. nameList, tmpErr := trade_analysis.GetExchangeClassify(k)
  31. if tmpErr != nil {
  32. err = tmpErr
  33. return
  34. }
  35. for _, n := range nameList {
  36. classifyExchangeMap[k] = append(classifyExchangeMap[k], n)
  37. }
  38. dataTimeItem, tmpErr := trade_analysis.GetExchangeLastTime(k)
  39. if tmpErr != nil {
  40. err = tmpErr
  41. errMsg = "查询交易所最新更新时间失败"
  42. return
  43. }
  44. timeMap[k] = dataTimeItem.CreateTime.Format(utils.FormatDateTime)
  45. }(k, classifyExchangeMap)
  46. }
  47. wg.Wait()
  48. for k, v := range exchanges {
  49. tmp := trade_analysis.TradeClassifyNameList{
  50. Exchange: v,
  51. Items: nil,
  52. }
  53. nameList, ok := classifyExchangeMap[k]
  54. if !ok {
  55. err = fmt.Errorf( "查询交易所分类信息失败")
  56. errMsg = "查询交易所分类信息失败"
  57. return
  58. }
  59. tmp.DataTime, ok = timeMap[k]
  60. if !ok {
  61. err = fmt.Errorf( "查询交易所最新更新时间失败")
  62. errMsg = "查询交易所最新更新时间失败"
  63. return
  64. }
  65. classifyMap := make(map[string][]trade_analysis.TradeClassifyNameListItemItem)
  66. if len(nameList) > 0 {
  67. if k == "zhengzhou" {
  68. for j, item := range nameList {
  69. classifyName := getZhengzhouClassifyName(item.ClassifyName)
  70. tmpItemItem := trade_analysis.TradeClassifyNameListItemItem{
  71. ClassifyType: item.ClassifyName,
  72. Sort: j+1000*i,
  73. }
  74. classifyMap[classifyName] = append(classifyMap[classifyName], tmpItemItem)
  75. }
  76. }else{
  77. for j, item := range nameList {
  78. tmpItemItem := trade_analysis.TradeClassifyNameListItemItem{
  79. ClassifyType: item.ClassifyType,
  80. Sort: j+1000*i,
  81. }
  82. classifyMap[item.ClassifyName] = append(classifyMap[item.ClassifyName], tmpItemItem)
  83. }
  84. }
  85. for n, l := range classifyMap {
  86. tmpItems := trade_analysis.TradeClassifyNameListItem{
  87. ClassifyName: n,
  88. Items: l,
  89. }
  90. tmp.Items = append(tmp.Items, tmpItems)
  91. tmp.Num ++
  92. }
  93. }
  94. list = append(list, tmp)
  95. i ++
  96. }
  97. return
  98. }
  99. func getZhengzhouClassifyName(code string) (name string) {
  100. if strings.HasPrefix(code,"TA") {
  101. name = "PTA"
  102. return
  103. }
  104. if strings.HasPrefix(code,"ZC") {
  105. name="动力煤"
  106. return
  107. }
  108. if strings.HasPrefix(code,"WH") {
  109. name="强麦"
  110. return
  111. }
  112. if strings.HasPrefix(code,"UR") {
  113. name="尿素"
  114. return
  115. }
  116. if strings.HasPrefix(code,"SR") {
  117. name="白糖"
  118. return
  119. }
  120. if strings.HasPrefix(code,"SM") {
  121. name="锰硅"
  122. return
  123. }
  124. if strings.HasPrefix(code,"SF") {
  125. name="硅铁"
  126. return
  127. }
  128. if strings.HasPrefix(code,"SA") {
  129. name="纯碱"
  130. return
  131. }
  132. if strings.HasPrefix(code,"RS") {
  133. name="油菜籽"
  134. return
  135. }
  136. if strings.HasPrefix(code,"RM") {
  137. name="菜籽粕"
  138. return
  139. }
  140. if strings.HasPrefix(code,"RI") {
  141. name="早籼稻"
  142. return
  143. }
  144. if strings.HasPrefix(code,"PM") {
  145. name="普麦"
  146. return
  147. }
  148. if strings.HasPrefix(code,"PK") {
  149. name="花生"
  150. return
  151. }
  152. if strings.HasPrefix(code,"PF") {
  153. name="涤纶短纤"
  154. return
  155. }
  156. if strings.HasPrefix(code,"OI") {
  157. name="菜油"
  158. return
  159. }
  160. if strings.HasPrefix(code,"MA") {
  161. name="甲醇"
  162. return
  163. }
  164. if strings.HasPrefix(code,"LR") {
  165. name="晚籼稻"
  166. return
  167. }
  168. if strings.HasPrefix(code,"JR") {
  169. name="粳稻"
  170. return
  171. }
  172. if strings.HasPrefix(code,"FG") {
  173. name="玻璃"
  174. return
  175. }
  176. if strings.HasPrefix(code,"CY") {
  177. name="棉纱"
  178. return
  179. }
  180. if strings.HasPrefix(code,"CJ") {
  181. name="红枣"
  182. return
  183. }
  184. if strings.HasPrefix(code,"CF") {
  185. name="棉花"
  186. return
  187. }
  188. if strings.HasPrefix(code,"AP") {
  189. name="苹果"
  190. return
  191. }
  192. return
  193. }
  194. func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analysis.GetPositionTopResp, err error, errMsg string) {
  195. //定义交易所
  196. exchanges := map[string]string{
  197. "郑商所":"zhengzhou",
  198. "大商所":"dalian",
  199. "上期所":"shanghai",
  200. "中金所":"cffex",
  201. "上期能源":"ine",
  202. }
  203. exchange, ok := exchanges[req.Exchange]
  204. if !ok {
  205. errMsg = "请输入正确的交易所名称"
  206. err = fmt.Errorf(errMsg)
  207. return
  208. }
  209. dataTimeStr := req.DataTime
  210. var dataTime time.Time
  211. //查询最新的时间
  212. if dataTimeStr == "" {
  213. lastItem , tmpErr := trade_analysis.GetTradeTopLastDataTime(exchange, req.ClassifyName, req.ClassifyType)
  214. if tmpErr != nil {
  215. errMsg = "查询最新的榜单信息失败"
  216. err = tmpErr
  217. return
  218. }
  219. dataTime = lastItem.DataTime
  220. }else{
  221. dataTime, err = time.ParseInLocation(utils.FormatDate, dataTimeStr, time.Local)
  222. if err != nil {
  223. errMsg = "请输入正确的时间格式"
  224. return
  225. }
  226. }
  227. //遇到周末则跳过当天
  228. weekStr := dataTime.Weekday().String()
  229. if weekStr == "Sunday" || weekStr == "Saturday" {
  230. /*errMsg = "日期不正确"
  231. err = fmt.Errorf(errMsg)*/
  232. return
  233. }
  234. dataTimeStr = dataTime.Format(utils.FormatDate)
  235. //查询当日榜单列表
  236. dataList, tmpErr := trade_analysis.GetTradePositionTop(exchange, req.ClassifyName, req.ClassifyType, dataTimeStr)
  237. if tmpErr != nil {
  238. errMsg = "查询榜单列表失败"
  239. err = tmpErr
  240. return
  241. }
  242. if len(dataList) <= 0 {
  243. return
  244. }
  245. totalMap := make(map[int]int)
  246. totalChangeMap := make(map[int]int)
  247. totalTmpMap := make(map[int]int)
  248. totalChangeTmpMap := make(map[int]int)
  249. detailList := make(map[int][]trade_analysis.GetPositionTopListItem)
  250. //统计汇总数据
  251. for _, v := range dataList {
  252. if t, ok1 := totalMap[v.DealType]; ok1 {
  253. totalMap[v.DealType] = t+v.DealValue
  254. }else{
  255. totalMap[v.DealType] = v.DealValue
  256. }
  257. if t, ok1 := totalChangeMap[v.DealType]; ok1 {
  258. totalChangeMap[v.DealType] = t+v.DealChange
  259. }else{
  260. totalChangeMap[v.DealType] = v.DealChange
  261. }
  262. }
  263. _, okTmp1 := totalMap[1]
  264. _, okTmp2 := totalMap[2]
  265. _, okTmp3 := totalMap[3]
  266. _, okTmp4 := totalMap[4]
  267. if !okTmp1 || !okTmp2 || !okTmp3 || !okTmp4 {
  268. errMsg = "榜单数据缺失"
  269. err = fmt.Errorf(errMsg)
  270. return
  271. }
  272. for k, v := range dataList {
  273. k++
  274. if t, ok1 := totalTmpMap[v.DealType]; ok1 {
  275. totalTmpMap[v.DealType] = t+v.DealValue
  276. }else{
  277. totalTmpMap[v.DealType] = v.DealValue
  278. }
  279. if t, ok1 := totalChangeTmpMap[v.DealType]; ok1 {
  280. totalChangeTmpMap[v.DealType] = t+v.DealChange
  281. }else{
  282. totalChangeTmpMap[v.DealType] = v.DealChange
  283. }
  284. tmp := trade_analysis.GetPositionTopListItem{
  285. DealShortName: v.DealShortName,
  286. DealValue: v.DealValue,
  287. DealChange: v.DealChange,
  288. Rank: v.Rank,
  289. BeforeAllValue: totalTmpMap[v.DealType],
  290. BeforeAllChange: totalChangeTmpMap[v.DealType],
  291. }
  292. //统计占比
  293. rate := fmt.Sprintf("%.2f", float64(tmp.DealValue)/float64(totalMap[v.DealType])) // 保留2位小数
  294. beforeAllRate := fmt.Sprintf("%.2f", float64(tmp.BeforeAllValue)/float64(totalMap[v.DealType])) // 保留2位小数
  295. tmp.Rate = rate
  296. tmp.BeforeAllRate = beforeAllRate
  297. detailList[v.DealType] = append(detailList[v.DealType], tmp)
  298. }
  299. ret.BuyList.TotalDealValue = totalMap[1]
  300. ret.BuyList.TotalDealChange = totalChangeMap[1]
  301. ret.BuyList.List = detailList[1]
  302. ret.SoldList.TotalDealValue = totalMap[2]
  303. ret.SoldList.TotalDealChange = totalChangeMap[2]
  304. ret.SoldList.List = detailList[2]
  305. ret.CleanBuyList.TotalDealValue = totalMap[3]
  306. ret.CleanBuyList.TotalDealChange = totalChangeMap[3]
  307. ret.CleanBuyList.List = detailList[3]
  308. ret.CleanSoldList.TotalDealValue = totalMap[4]
  309. ret.CleanSoldList.TotalDealChange = totalChangeMap[4]
  310. ret.CleanSoldList.List = detailList[4]
  311. ret.DataTime = dataTimeStr
  312. return
  313. }