trade_analysis.go 7.2 KB

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