trade_analysis.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. package trade_analysis
  2. import (
  3. "eta/eta_api/controllers"
  4. "eta/eta_api/models"
  5. tradeAnalysisModel "eta/eta_api/models/data_manage/trade_analysis"
  6. "eta/eta_api/services/data/trade_analysis"
  7. "eta/eta_api/utils"
  8. "fmt"
  9. "strings"
  10. )
  11. // TradeAnalysisController 供应分析
  12. type TradeAnalysisController struct {
  13. controllers.BaseAuthController
  14. }
  15. // GetClassifyName
  16. // @Title 获取交易所合约列表
  17. // @Description 获取交易所合约列表
  18. // @Param request body saModel.SaCompareSaveReq true "type json string"
  19. // @Success 200 {object} trade_analysis.TradeClassifyNameListSort
  20. // @router /classify [get]
  21. func (c *TradeAnalysisController) GetClassifyName() {
  22. br := new(models.BaseResponse).Init()
  23. defer func() {
  24. if br.ErrMsg == "" {
  25. br.IsSendEmail = false
  26. }
  27. c.Data["json"] = br
  28. c.ServeJSON()
  29. }()
  30. //userinfo := userService.GetInfoByClaims(c)
  31. list, err, errMsg := trade_analysis.GetClassifyName(c.Lang)
  32. fmt.Println(err)
  33. fmt.Println(errMsg)
  34. fmt.Println(list)
  35. if err != nil {
  36. br.Msg = errMsg
  37. br.ErrMsg = "获取失败, ErrMsg: " + err.Error()
  38. return
  39. }
  40. br.Data = list
  41. br.Ret = 200
  42. br.Success = true
  43. br.Msg = "获取成功"
  44. }
  45. // GetPositionTop
  46. // @Title 获取合约榜单详情
  47. // @Description 获取合约榜单详情
  48. // @Param Exchange query string false "交易所"
  49. // @Param ClassifyName query string false "分类名称"
  50. // @Param ClassifyType query string false "具体合约名称"
  51. // @Param DataTime query string false "请求日期,如果为空,则返回最新的榜单日期"
  52. // @Success 200 {object} trade_analysis.GetPositionTopResp
  53. // @Success 200 Ret=200 操作成功
  54. // @router /top [get]
  55. func (c *TradeAnalysisController) GetPositionTop() {
  56. br := new(models.BaseResponse).Init()
  57. defer func() {
  58. if br.ErrMsg == "" {
  59. br.IsSendEmail = false
  60. }
  61. c.Data["json"] = br
  62. c.ServeJSON()
  63. }()
  64. req := tradeAnalysisModel.GetPositionTopReq{
  65. Exchange: c.GetString("Exchange"),
  66. ClassifyName: c.GetString("ClassifyName"),
  67. ClassifyType: c.GetString("ClassifyType"),
  68. DataTime: c.GetString("DataTime"),
  69. }
  70. if req.ClassifyName == "" {
  71. br.Msg = "请输入分类名称"
  72. br.IsSendEmail = false
  73. return
  74. }
  75. if req.ClassifyType == "" {
  76. br.Msg = "请输入合约名称"
  77. br.IsSendEmail = false
  78. return
  79. }
  80. list, err, errMsg := trade_analysis.GetPositionTopDetail(req)
  81. if err != nil {
  82. br.Msg = errMsg
  83. br.ErrMsg = err.Error()
  84. return
  85. }
  86. br.Data = list
  87. br.Ret = 200
  88. br.Success = true
  89. return
  90. }
  91. // GetTradeExchangeList
  92. // @Title 获取交易所列表
  93. // @Description 获取交易所列表
  94. // @Param IsTotal query bool false "是否显示全部"
  95. // @Success 200 {object} data_manage.BaseFromTradeExchangeItem
  96. // @router /exchange_list [get]
  97. func (this *TradeAnalysisController) GetTradeExchangeList() {
  98. br := new(models.BaseResponse).Init()
  99. defer func() {
  100. if br.ErrMsg == "" {
  101. br.IsSendEmail = false
  102. }
  103. this.Data["json"] = br
  104. this.ServeJSON()
  105. }()
  106. sysUser := this.SysUser
  107. if sysUser == nil {
  108. br.Msg = "请登录"
  109. br.ErrMsg = "请登录,SysUser Is Empty"
  110. br.Ret = 408
  111. return
  112. }
  113. isTotal, _ := this.GetBool("IsTotal", false)
  114. var cond string
  115. var pars []interface{}
  116. exchangeOb := new(tradeAnalysisModel.BaseFromTradeExchange)
  117. if !isTotal {
  118. cond += fmt.Sprintf(` AND %s = ?`, exchangeOb.Cols().AnalysisState)
  119. pars = append(pars, 1)
  120. }
  121. list, e := exchangeOb.GetItemsByCondition(cond, pars, []string{}, "")
  122. if e != nil {
  123. br.Msg = "获取失败"
  124. br.ErrMsg = fmt.Sprintf("获取交易所列表失败, %v", e)
  125. return
  126. }
  127. resp := make([]*tradeAnalysisModel.BaseFromTradeExchangeItem, 0)
  128. for _, v := range list {
  129. resp = append(resp, v.Format2Item())
  130. }
  131. br.Data = resp
  132. br.Msg = "获取成功"
  133. br.Ret = 200
  134. br.Success = true
  135. }
  136. // GetTradeClassifyList
  137. // @Title 获取品种列表
  138. // @Description 获取品种列表
  139. // @Param Exchange query string false "交易所标识"
  140. // @Param ClassifyName query string false "品种名称"
  141. // @Success 200 {object} tradeAnalysisModel.BaseFromTradeClassifyItem
  142. // @router /classify_list [get]
  143. func (this *TradeAnalysisController) GetTradeClassifyList() {
  144. br := new(models.BaseResponse).Init()
  145. defer func() {
  146. if br.ErrMsg == "" {
  147. br.IsSendEmail = false
  148. }
  149. this.Data["json"] = br
  150. this.ServeJSON()
  151. }()
  152. sysUser := this.SysUser
  153. if sysUser == nil {
  154. br.Msg = "请登录"
  155. br.ErrMsg = "请登录,SysUser Is Empty"
  156. br.Ret = 408
  157. return
  158. }
  159. exchange := this.GetString("Exchange")
  160. exchange = strings.TrimSpace(exchange)
  161. classifyName := this.GetString("ClassifyName")
  162. classifyName = strings.TrimSpace(classifyName)
  163. // 交易所名称
  164. exchangeName := make(map[string]string)
  165. {
  166. var cond string
  167. var pars []interface{}
  168. exchangeOb := new(tradeAnalysisModel.BaseFromTradeExchange)
  169. if exchange != "" {
  170. cond += fmt.Sprintf(` AND %s = ?`, exchangeOb.Cols().Exchange)
  171. pars = append(pars, exchange)
  172. item, e := exchangeOb.GetItemByCondition(cond, pars, "")
  173. if e != nil {
  174. br.Msg = "获取失败"
  175. br.ErrMsg = fmt.Sprintf("获取交易所信息失败, %v", e)
  176. return
  177. }
  178. exchangeName[item.Exchange] = item.ExchangeName
  179. } else {
  180. list, e := exchangeOb.GetItemsByCondition(cond, pars, []string{}, "")
  181. if e != nil {
  182. br.Msg = "获取失败"
  183. br.ErrMsg = fmt.Sprintf("获取交易所列表失败, %v", e)
  184. return
  185. }
  186. for _, v := range list {
  187. exchangeName[v.Exchange] = v.ExchangeName
  188. }
  189. }
  190. }
  191. // 搜索品种
  192. var cond string
  193. var pars []interface{}
  194. classifyOb := new(tradeAnalysisModel.BaseFromTradeClassify)
  195. if exchange != "" {
  196. cond += fmt.Sprintf(` AND %s = ?`, classifyOb.Cols().Exchange)
  197. pars = append(pars, exchange)
  198. }
  199. if classifyName != "" {
  200. cond += fmt.Sprintf(` AND %s LIKE ?`, classifyOb.Cols().ClassifyName)
  201. pars = append(pars, fmt.Sprint("%", classifyName, "%"))
  202. }
  203. fields := []string{classifyOb.Cols().ClassifyName, classifyOb.Cols().Exchange}
  204. list, e := classifyOb.GetClassifyItemsByCondition(cond, pars, fields, "id ASC")
  205. if e != nil {
  206. br.Msg = "获取失败"
  207. br.ErrMsg = fmt.Sprintf("获取品种列表失败, %v", e)
  208. return
  209. }
  210. resp := make([]*tradeAnalysisModel.BaseFromTradeClassifyItem, 0)
  211. classifyExist := make(map[string]bool)
  212. for _, v := range list {
  213. // 郑商所
  214. if v.Exchange == tradeAnalysisModel.TradeExchangeZhengzhou {
  215. name := trade_analysis.GetZhengzhouClassifyName(v.ClassifyName)
  216. if classifyExist[name] {
  217. continue
  218. }
  219. classifyExist[name] = true
  220. resp = append(resp, &tradeAnalysisModel.BaseFromTradeClassifyItem{
  221. ClassifyName: name,
  222. Exchange: v.Exchange,
  223. ExchangeName: exchangeName[v.Exchange],
  224. })
  225. continue
  226. }
  227. resp = append(resp, &tradeAnalysisModel.BaseFromTradeClassifyItem{
  228. ClassifyName: v.ClassifyName,
  229. Exchange: v.Exchange,
  230. ExchangeName: exchangeName[v.Exchange],
  231. })
  232. }
  233. br.Data = resp
  234. br.Msg = "获取成功"
  235. br.Ret = 200
  236. br.Success = true
  237. }
  238. // GetTradeContractList
  239. // @Title 获取合约列表
  240. // @Description 获取合约列表
  241. // @Param Exchange query string false "交易所标识"
  242. // @Param ClassifyName query string false "品种名称"
  243. // @Param ContractName query string false "合约名称"
  244. // @Param ExceptTop query bool false "排除TOP20: true-不包含; false-包含(默认)"
  245. // @Success 200 {object} tradeAnalysisModel.BaseFromTradeContractItem
  246. // @router /contract_list [get]
  247. func (this *TradeAnalysisController) GetTradeContractList() {
  248. br := new(models.BaseResponse).Init()
  249. defer func() {
  250. if br.ErrMsg == "" {
  251. br.IsSendEmail = false
  252. }
  253. this.Data["json"] = br
  254. this.ServeJSON()
  255. }()
  256. sysUser := this.SysUser
  257. if sysUser == nil {
  258. br.Msg = "请登录"
  259. br.ErrMsg = "请登录,SysUser Is Empty"
  260. br.Ret = 408
  261. return
  262. }
  263. exchange := this.GetString("Exchange")
  264. exchange = strings.TrimSpace(exchange)
  265. classifyName := this.GetString("ClassifyName")
  266. classifyName = strings.TrimSpace(classifyName)
  267. contractName := this.GetString("ContractName")
  268. contractName = strings.TrimSpace(contractName)
  269. exceptTop, _ := this.GetBool("ExceptTop")
  270. // 交易所名称
  271. exchangeName := make(map[string]string)
  272. {
  273. var cond string
  274. var pars []interface{}
  275. exchangeOb := new(tradeAnalysisModel.BaseFromTradeExchange)
  276. if exchange != "" {
  277. cond += fmt.Sprintf(` AND %s = ?`, exchangeOb.Cols().Exchange)
  278. pars = append(pars, exchange)
  279. item, e := exchangeOb.GetItemByCondition(cond, pars, "")
  280. if e != nil {
  281. br.Msg = "获取失败"
  282. br.ErrMsg = fmt.Sprintf("获取交易所信息失败, %v", e)
  283. return
  284. }
  285. exchangeName[item.Exchange] = item.ExchangeName
  286. } else {
  287. list, e := exchangeOb.GetItemsByCondition(cond, pars, []string{}, "")
  288. if e != nil {
  289. br.Msg = "获取失败"
  290. br.ErrMsg = fmt.Sprintf("获取交易所列表失败, %v", e)
  291. return
  292. }
  293. for _, v := range list {
  294. exchangeName[v.Exchange] = v.ExchangeName
  295. }
  296. }
  297. }
  298. // 搜索合约
  299. var cond string
  300. var pars []interface{}
  301. classifyOb := new(tradeAnalysisModel.BaseFromTradeClassify)
  302. if exchange != "" {
  303. cond += fmt.Sprintf(` AND %s = ?`, classifyOb.Cols().Exchange)
  304. pars = append(pars, exchange)
  305. }
  306. // 郑商所品种名称在列表中过滤
  307. if classifyName != "" {
  308. cond += fmt.Sprintf(` AND ((%s = ? AND %s <> ?) OR %s = ?)`, classifyOb.Cols().ClassifyName, classifyOb.Cols().Exchange, classifyOb.Cols().Exchange)
  309. pars = append(pars, classifyName, tradeAnalysisModel.TradeExchangeZhengzhou, tradeAnalysisModel.TradeExchangeZhengzhou)
  310. }
  311. if contractName != "" {
  312. cond += fmt.Sprintf(` AND %s LIKE ?`, classifyOb.Cols().ClassifyType)
  313. pars = append(pars, fmt.Sprint("%", contractName, "%"))
  314. }
  315. list, e := classifyOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC, %s DESC", classifyOb.Cols().Exchange, classifyOb.Cols().LatestDate))
  316. if e != nil {
  317. br.Msg = "获取失败"
  318. br.ErrMsg = fmt.Sprintf("获取合约列表失败, %v", e)
  319. return
  320. }
  321. resp := make([]*tradeAnalysisModel.BaseFromTradeContractItem, 0)
  322. if !exceptTop && contractName == "" {
  323. resp = append(resp, &tradeAnalysisModel.BaseFromTradeContractItem{
  324. ClassifyType: tradeAnalysisModel.TradeFuturesCompanyTop20,
  325. })
  326. }
  327. for _, v := range list {
  328. // 郑商所
  329. classifyType := v.ClassifyType
  330. if classifyName != "" && v.Exchange == tradeAnalysisModel.TradeExchangeZhengzhou {
  331. name := trade_analysis.GetZhengzhouClassifyName(v.ClassifyName)
  332. if classifyName != name {
  333. continue
  334. }
  335. classifyType = v.ClassifyName
  336. }
  337. resp = append(resp, &tradeAnalysisModel.BaseFromTradeContractItem{
  338. ClassifyName: v.ClassifyName,
  339. ClassifyType: classifyType,
  340. Exchange: v.Exchange,
  341. ExchangeName: exchangeName[v.Exchange],
  342. LatestDate: v.LatestDate.Format(utils.FormatDate),
  343. CreateTime: v.CreateTime.Format(utils.FormatDateTime),
  344. })
  345. }
  346. br.Data = resp
  347. br.Msg = "获取成功"
  348. br.Ret = 200
  349. br.Success = true
  350. }
  351. // GetTradeFuturesCompanyList
  352. // @Title 获取期货公司列表
  353. // @Description 获取期货公司列表
  354. // @Param CompanyName query string false "公司名称"
  355. // @Success 200 {object} tradeAnalysisModel.BaseFromTradeContractItem
  356. // @router /company_list [get]
  357. func (this *TradeAnalysisController) GetTradeFuturesCompanyList() {
  358. br := new(models.BaseResponse).Init()
  359. defer func() {
  360. if br.ErrMsg == "" {
  361. br.IsSendEmail = false
  362. }
  363. this.Data["json"] = br
  364. this.ServeJSON()
  365. }()
  366. sysUser := this.SysUser
  367. if sysUser == nil {
  368. br.Msg = "请登录"
  369. br.ErrMsg = "请登录,SysUser Is Empty"
  370. br.Ret = 408
  371. return
  372. }
  373. companyName := this.GetString("CompanyName")
  374. companyName = strings.TrimSpace(companyName)
  375. var cond string
  376. var pars []interface{}
  377. companyOb := new(tradeAnalysisModel.TradeFuturesCompany)
  378. if companyName != "" {
  379. cond += fmt.Sprintf(` AND %s LIKE ?`, companyOb.Cols().CompanyName)
  380. pars = append(pars, fmt.Sprint("%", companyName, "%"))
  381. }
  382. list, e := companyOb.GetItemsByCondition(cond, pars, []string{}, fmt.Sprintf("%s ASC", companyOb.Cols().Sort))
  383. if e != nil {
  384. br.Msg = "获取失败"
  385. br.ErrMsg = fmt.Sprintf("获取期货公司列表失败, %v", e)
  386. return
  387. }
  388. resp := make([]*tradeAnalysisModel.TradeFuturesCompanyItem, 0)
  389. for _, v := range list {
  390. resp = append(resp, &tradeAnalysisModel.TradeFuturesCompanyItem{
  391. CompanyId: v.TradeFuturesCompanyId,
  392. CompanyName: v.CompanyName,
  393. Sort: v.Sort,
  394. })
  395. }
  396. br.Data = resp
  397. br.Msg = "获取成功"
  398. br.Ret = 200
  399. br.Success = true
  400. }
  401. // GetTradeExchangeClassifyTree
  402. // @Title 获取交易所-品种树
  403. // @Description 获取交易所-品种树
  404. // @Param IsTotal query bool false "是否显示全部交易所"
  405. // @Success 200 {object} data_manage.BaseFromTradeExchangeItem
  406. // @router /exchange_classify/tree [get]
  407. func (this *TradeAnalysisController) GetTradeExchangeClassifyTree() {
  408. br := new(models.BaseResponse).Init()
  409. defer func() {
  410. if br.ErrMsg == "" {
  411. br.IsSendEmail = false
  412. }
  413. this.Data["json"] = br
  414. this.ServeJSON()
  415. }()
  416. sysUser := this.SysUser
  417. if sysUser == nil {
  418. br.Msg = "请登录"
  419. br.ErrMsg = "请登录,SysUser Is Empty"
  420. br.Ret = 408
  421. return
  422. }
  423. isTotal, _ := this.GetBool("IsTotal", false)
  424. // 交易所
  425. var cond string
  426. var pars []interface{}
  427. exchangeOb := new(tradeAnalysisModel.BaseFromTradeExchange)
  428. if !isTotal {
  429. cond += fmt.Sprintf(` AND %s = ?`, exchangeOb.Cols().AnalysisState)
  430. pars = append(pars, 1)
  431. }
  432. exchanges, e := exchangeOb.GetItemsByCondition(cond, pars, []string{}, "")
  433. if e != nil {
  434. br.Msg = "获取失败"
  435. br.ErrMsg = fmt.Sprintf("获取交易所列表失败, %v", e)
  436. return
  437. }
  438. // 品种
  439. classifyOb := new(tradeAnalysisModel.BaseFromTradeClassify)
  440. fields := []string{classifyOb.Cols().ClassifyName, classifyOb.Cols().Exchange}
  441. classifies, e := classifyOb.GetClassifyItemsByCondition(``, make([]interface{}, 0), fields, "id ASC")
  442. if e != nil {
  443. br.Msg = "获取失败"
  444. br.ErrMsg = fmt.Sprintf("获取品种列表失败, %v", e)
  445. return
  446. }
  447. exchangeClassify := make(map[string][]*tradeAnalysisModel.BaseFromTradeClassify, 0)
  448. for _, v := range classifies {
  449. if exchangeClassify[v.Exchange] == nil {
  450. exchangeClassify[v.Exchange] = make([]*tradeAnalysisModel.BaseFromTradeClassify, 0)
  451. }
  452. exchangeClassify[v.Exchange] = append(exchangeClassify[v.Exchange], v)
  453. }
  454. // 构建树
  455. resp := make([]*tradeAnalysisModel.TradeExchangeClassifyNode, 0)
  456. classifyExist := make(map[string]bool)
  457. for _, v := range exchanges {
  458. t := new(tradeAnalysisModel.TradeExchangeClassifyNode)
  459. t.UniqueFlag = v.Exchange
  460. t.NodeType = 1
  461. t.NodeName = v.ExchangeName
  462. t.NodeValue = v.Exchange
  463. t.Children = make([]*tradeAnalysisModel.TradeExchangeClassifyNode, 0)
  464. for _, c := range exchangeClassify[v.Exchange] {
  465. // 郑商所
  466. classifyName := c.ClassifyName
  467. if v.Exchange == tradeAnalysisModel.TradeExchangeZhengzhou {
  468. classifyName = trade_analysis.GetZhengzhouClassifyName(c.ClassifyName)
  469. if classifyExist[classifyName] {
  470. continue
  471. }
  472. classifyExist[classifyName] = true
  473. }
  474. tc := new(tradeAnalysisModel.TradeExchangeClassifyNode)
  475. tc.UniqueFlag = fmt.Sprintf("%s-%s", v.Exchange, classifyName)
  476. tc.ParentFlag = v.Exchange
  477. tc.NodeType = 2
  478. tc.NodeName = classifyName
  479. tc.NodeValue = classifyName
  480. t.Children = append(t.Children, tc)
  481. }
  482. resp = append(resp, t)
  483. }
  484. br.Data = resp
  485. br.Msg = "获取成功"
  486. br.Ret = 200
  487. br.Success = true
  488. }