trade_analysis.go 8.5 KB

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