trade_analysis.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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. sort.Sort(trade_analysis.TradeClassifyNameListItemItemSort(l))
  93. tmpItems := trade_analysis.TradeClassifyNameListItem{
  94. ClassifyName: n,
  95. Items: l,
  96. }
  97. tmp.Items = append(tmp.Items, tmpItems)
  98. tmp.Num ++
  99. }
  100. }
  101. sort.Sort(trade_analysis.TradeClassifyNameListItemSort(tmp.Items))
  102. list = append(list, tmp)
  103. i ++
  104. }
  105. if len(list) > 0 {
  106. sort.Sort(list)
  107. }
  108. return
  109. }
  110. func getZhengzhouClassifyName(code string) (name string) {
  111. if strings.HasPrefix(code,"PTA") {
  112. name = "PTA"
  113. return
  114. }
  115. if strings.HasPrefix(code,"TA") {
  116. name = "PTA"
  117. return
  118. }
  119. if strings.HasPrefix(code,"ZC") {
  120. name="动力煤"
  121. return
  122. }
  123. if strings.HasPrefix(code,"WH") {
  124. name="强麦"
  125. return
  126. }
  127. if strings.HasPrefix(code,"UR") {
  128. name="尿素"
  129. return
  130. }
  131. if strings.HasPrefix(code,"SR") {
  132. name="白糖"
  133. return
  134. }
  135. if strings.HasPrefix(code,"SM") {
  136. name="锰硅"
  137. return
  138. }
  139. if strings.HasPrefix(code,"SF") {
  140. name="硅铁"
  141. return
  142. }
  143. if strings.HasPrefix(code,"SA") {
  144. name="纯碱"
  145. return
  146. }
  147. if strings.HasPrefix(code,"RS") {
  148. name="油菜籽"
  149. return
  150. }
  151. if strings.HasPrefix(code,"RM") {
  152. name="菜籽粕"
  153. return
  154. }
  155. if strings.HasPrefix(code,"RI") {
  156. name="早籼稻"
  157. return
  158. }
  159. if strings.HasPrefix(code,"PM") {
  160. name="普麦"
  161. return
  162. }
  163. if strings.HasPrefix(code,"PK") {
  164. name="花生"
  165. return
  166. }
  167. if strings.HasPrefix(code,"PF") {
  168. name="涤纶短纤"
  169. return
  170. }
  171. if strings.HasPrefix(code,"OI") {
  172. name="菜油"
  173. return
  174. }
  175. if strings.HasPrefix(code,"MA") {
  176. name="甲醇"
  177. return
  178. }
  179. if strings.HasPrefix(code,"LR") {
  180. name="晚籼稻"
  181. return
  182. }
  183. if strings.HasPrefix(code,"JR") {
  184. name="粳稻"
  185. return
  186. }
  187. if strings.HasPrefix(code,"FG") {
  188. name="玻璃"
  189. return
  190. }
  191. if strings.HasPrefix(code,"CY") {
  192. name="棉纱"
  193. return
  194. }
  195. if strings.HasPrefix(code,"CJ") {
  196. name="红枣"
  197. return
  198. }
  199. if strings.HasPrefix(code,"CF") {
  200. name="棉花"
  201. return
  202. }
  203. if strings.HasPrefix(code,"AP") {
  204. name="苹果"
  205. return
  206. }
  207. return
  208. }
  209. func GetPositionTopDetail(req trade_analysis.GetPositionTopReq) (ret trade_analysis.GetPositionTopResp, err error, errMsg string) {
  210. //定义交易所
  211. exchanges := map[string]string{
  212. "郑商所":"zhengzhou",
  213. "大商所":"dalian",
  214. "上期所":"shanghai",
  215. "中金所":"cffex",
  216. "上期能源":"ine",
  217. }
  218. exchange, ok := exchanges[req.Exchange]
  219. if !ok {
  220. errMsg = "请输入正确的交易所名称"
  221. err = fmt.Errorf(errMsg)
  222. return
  223. }
  224. dataTimeStr := req.DataTime
  225. var dataTime time.Time
  226. //查询最新的时间
  227. if dataTimeStr == "" {
  228. lastItem , tmpErr := trade_analysis.GetTradeTopLastDataTime(exchange, req.ClassifyName, req.ClassifyType)
  229. if tmpErr != nil {
  230. errMsg = "查询最新的榜单信息失败"
  231. err = tmpErr
  232. return
  233. }
  234. dataTime = lastItem.DataTime
  235. }else{
  236. dataTime, err = time.ParseInLocation(utils.FormatDate, dataTimeStr, time.Local)
  237. if err != nil {
  238. errMsg = "请输入正确的时间格式"
  239. return
  240. }
  241. }
  242. //遇到周末则跳过当天
  243. weekStr := dataTime.Weekday().String()
  244. if weekStr == "Sunday" || weekStr == "Saturday" {
  245. /*errMsg = "日期不正确"
  246. err = fmt.Errorf(errMsg)*/
  247. return
  248. }
  249. dataTimeStr = dataTime.Format(utils.FormatDate)
  250. classifyName := req.ClassifyName
  251. classifyType := req.ClassifyType
  252. if exchange == "zhengzhou" {
  253. classifyName = classifyType
  254. var typeItem *trade_analysis.TradeClassifyName
  255. typeItem, err = trade_analysis.GetZhengzhouClassifyTypeByClassifyName(classifyName)
  256. if err != nil {
  257. if err == utils.ErrNoRow {
  258. errMsg = "该合约不存在"
  259. return
  260. }
  261. errMsg = "查询类型信息出错"
  262. return
  263. }
  264. classifyType = typeItem.ClassifyType
  265. }
  266. //查询当日榜单列表
  267. dataList, tmpErr := trade_analysis.GetTradePositionTop(exchange, classifyName, classifyType, dataTimeStr)
  268. if tmpErr != nil {
  269. errMsg = "查询榜单列表失败"
  270. err = tmpErr
  271. return
  272. }
  273. if len(dataList) <= 0 {
  274. return
  275. }
  276. totalMap := make(map[int]int)
  277. totalChangeMap := make(map[int]int)
  278. totalTmpMap := make(map[int]int)
  279. totalChangeTmpMap := make(map[int]int)
  280. detailList := make(map[int][]trade_analysis.GetPositionTopListItem)
  281. //统计汇总数据
  282. for _, v := range dataList {
  283. if t, ok1 := totalMap[v.DealType]; ok1 {
  284. totalMap[v.DealType] = t+v.DealValue
  285. }else{
  286. totalMap[v.DealType] = v.DealValue
  287. }
  288. if t, ok1 := totalChangeMap[v.DealType]; ok1 {
  289. totalChangeMap[v.DealType] = t+v.DealChange
  290. }else{
  291. totalChangeMap[v.DealType] = v.DealChange
  292. }
  293. }
  294. _, okTmp1 := totalMap[1]
  295. _, okTmp2 := totalMap[2]
  296. _, okTmp3 := totalMap[3]
  297. _, okTmp4 := totalMap[4]
  298. if !okTmp1 || !okTmp2 || (!okTmp3 && !okTmp4) {
  299. errMsg = "榜单数据缺失"
  300. err = fmt.Errorf(errMsg)
  301. return
  302. }
  303. for k, v := range dataList {
  304. k++
  305. if t, ok1 := totalTmpMap[v.DealType]; ok1 {
  306. totalTmpMap[v.DealType] = t+v.DealValue
  307. }else{
  308. totalTmpMap[v.DealType] = v.DealValue
  309. }
  310. if t, ok1 := totalChangeTmpMap[v.DealType]; ok1 {
  311. totalChangeTmpMap[v.DealType] = t+v.DealChange
  312. }else{
  313. totalChangeTmpMap[v.DealType] = v.DealChange
  314. }
  315. tmp := trade_analysis.GetPositionTopListItem{
  316. DealShortName: v.DealShortName,
  317. DealValue: v.DealValue,
  318. DealChange: v.DealChange,
  319. Rank: v.Rank,
  320. BeforeAllValue: totalTmpMap[v.DealType],
  321. BeforeAllChange: totalChangeTmpMap[v.DealType],
  322. }
  323. //统计占比
  324. rate := fmt.Sprintf("%.2f", float64(tmp.DealValue)/float64(totalMap[v.DealType])) // 保留2位小数
  325. beforeAllRate := fmt.Sprintf("%.2f", float64(tmp.BeforeAllValue)/float64(totalMap[v.DealType])) // 保留2位小数
  326. tmp.Rate = rate
  327. tmp.BeforeAllRate = beforeAllRate
  328. if tmp.DealShortName == "-"{
  329. continue
  330. }
  331. detailList[v.DealType] = append(detailList[v.DealType], tmp)
  332. }
  333. ret.BuyList.TotalDealValue = totalMap[1]
  334. ret.BuyList.TotalDealChange = totalChangeMap[1]
  335. ret.BuyList.List = detailList[1]
  336. ret.SoldList.TotalDealValue = totalMap[2]
  337. ret.SoldList.TotalDealChange = totalChangeMap[2]
  338. ret.SoldList.List = detailList[2]
  339. ret.CleanBuyList.TotalDealValue = totalMap[3]
  340. ret.CleanBuyList.TotalDealChange = totalChangeMap[3]
  341. ret.CleanBuyList.List = detailList[3]
  342. ret.CleanSoldList.TotalDealValue = totalMap[4]
  343. ret.CleanSoldList.TotalDealChange = totalChangeMap[4]
  344. ret.CleanSoldList.List = detailList[4]
  345. ret.DataTime = dataTimeStr
  346. return
  347. }