trade_analysis.go 9.0 KB

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