trade.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package trade
  2. import (
  3. "mtp2_if/db"
  4. "mtp2_if/global/app"
  5. "mtp2_if/global/e"
  6. "mtp2_if/logger"
  7. "net/http"
  8. "sort"
  9. "time"
  10. "github.com/gin-gonic/gin"
  11. )
  12. // QueryRecieptOrderReq 点选挂牌委托单据查询参数
  13. type QueryRecieptOrderReq struct {
  14. app.PageInfo
  15. GoodsID int `form:"goodsID" binding:"required"` // 商品ID,必填
  16. BuyOrSell int `form:"buyorsell"` // 方向
  17. AccountName string `form:"accountName"` // 所属账户名称
  18. MarketID int `form:"marketID"` // 市场ID
  19. }
  20. // QueryRecieptOrderRsp 点选挂牌委托单据查询返回模型
  21. type QueryRecieptOrderRsp struct {
  22. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
  23. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
  24. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  25. Buyorsell uint32 `json:"buyorsell" xorm:"'BUYORSELL'"` // 方向 - 0:买 1:卖
  26. Orderid string `json:"orderid" xorm:"'ORDERID'"` // 委托单号
  27. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
  28. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  29. EnableQty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可摘数量
  30. AccountName string `json:"accountName" xorm:"ACCOUNTNAME"` // 所属账号名称(已脱敏)
  31. AccountID int64 `json:"accountid" xorm:"ACCOUNTID"` // 资金账号
  32. Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
  33. }
  34. // QueryRecieptOrder 点选挂牌委托单据查询(保证金摘牌大厅)
  35. // @Summary 点选挂牌委托单据查询(保证金摘牌大厅)
  36. // @Description 说明:pagesize参数赋值不为0时表示需要分页;page参数从0开始计算
  37. // @Produce json
  38. // @Security ApiKeyAuth
  39. // @Param page query int false "页码"
  40. // @Param pagesize query int false "每页条数"
  41. // @Param goodsID query int true "商品ID"
  42. // @Param accountName query string false "所属账户名称"
  43. // @Param marketID query int false "市场ID"
  44. // @Param buyorsell query int true "方向 - 0:买 1:卖"
  45. // @Success 200 {object} QueryRecieptOrderRsp
  46. // @Failure 500 {object} app.Response
  47. // @Router /Trade/QueryRecieptOrder [get]
  48. // @Tags 通用交易
  49. // 参考通用查询:Client_SZDZ3_SearchRecieptOrder
  50. func QueryRecieptOrder(c *gin.Context) {
  51. appG := app.Gin{C: c}
  52. // 获取请求参数
  53. var req QueryRecieptOrderReq
  54. if err := appG.C.ShouldBindQuery(&req); err != nil {
  55. logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
  56. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  57. return
  58. }
  59. datas := make([]QueryRecieptOrderRsp, 0)
  60. engine := db.GetEngine()
  61. // 投资者挂牌委托单
  62. s := engine.Table("TRADE_ORDERDETAIL").
  63. Join("INNER", "GOODS", "TRADE_ORDERDETAIL.GOODSID = GOODS.GOODSID").
  64. Join("LEFT", "TAACCOUNT", "TAACCOUNT.ACCOUNTID = TRADE_ORDERDETAIL.ACCOUNTID").
  65. Join("LEFT", "USERACCOUNT", "USERACCOUNT.USERID = TAACCOUNT.RELATEDUSERID").
  66. Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME,
  67. TRADE_ORDERDETAIL.BUYORSELL, to_char(TRADE_ORDERDETAIL.ORDERID) as ORDERID, TRADE_ORDERDETAIL.TRADEDATE, TRADE_ORDERDETAIL.ORDERPRICE,
  68. TRADE_ORDERDETAIL.ORDERQTY - TRADE_ORDERDETAIL.TRADEQTY - TRADE_ORDERDETAIL.CANCELQTY as ENABLEQTY,
  69. (case when USERACCOUNT.ISANONYMOUS = 0 then to_char(USERACCOUNT.ACCOUNTNAME) else '*****' end) ACCOUNTNAME`).
  70. Where("TRADE_ORDERDETAIL.ORDERSTATUS in (3,7,12) and GOODS.GOODSID = ?", req.GoodsID)
  71. if len(req.AccountName) > 0 {
  72. s = s.And("USERACCOUNT.ACCOUNTNAME = ?", req.AccountName)
  73. }
  74. if req.MarketID > 0 {
  75. s = s.And("TRADE_ORDERDETAIL.MARKETID = ?", req.MarketID)
  76. }
  77. if req.BuyOrSell > -1 {
  78. s = s.And("TRADE_ORDERDETAIL.BUYORSELL = ?", req.BuyOrSell)
  79. }
  80. // 判断是否要分页
  81. // 这样分页会报错
  82. // if req.Size > 0 {
  83. // s = s.Limit(req.Size, req.Page*req.Size)
  84. // }
  85. d1 := make([]QueryRecieptOrderRsp, 0)
  86. if err := s.Find(&d1); err != nil {
  87. // 查询失败
  88. logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
  89. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  90. return
  91. }
  92. datas = append(datas, d1...)
  93. // 报价商挂牌委托
  94. s = engine.Table("TRADE_QUOTEDETAILNEW").
  95. Join("INNER", "GOODS", "TRADE_QUOTEDETAILNEW.GOODSID = GOODS.GOODSID").
  96. Join("INNER", "QUOTER", "QUOTER.QUOTERID = TRADE_QUOTEDETAILNEW.QUOTERID").
  97. Join("INNER", "AREAROLE", "AREAROLE.USERID = QUOTER.DEFAULTMAKERID and AREAROLE.ROLETYPE = 8").
  98. Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME,
  99. TRADE_QUOTEDETAILNEW.BUYORSELL, to_char(TRADE_QUOTEDETAILNEW.ORDERID) as ORDERID, TRADE_QUOTEDETAILNEW.TRADEDATE, TRADE_QUOTEDETAILNEW.PRICE as ORDERPRICE,
  100. TRADE_QUOTEDETAILNEW.CURQTY as ENABLEQTY,
  101. substr(QUOTER.QUOTERNAME,0,1)||'****' as ACCOUNTNAME`).
  102. Where("(TRADE_QUOTEDETAILNEW.CURQTY > 0 or TRADE_QUOTEDETAILNEW.PRICE > 0) and TRADE_QUOTEDETAILNEW.ISVALID != 1 and TRADE_QUOTEDETAILNEW.FREEZESTATUS != 3")
  103. d2 := make([]QueryRecieptOrderRsp, 0)
  104. if err := s.Find(&d2); err != nil {
  105. // 查询失败
  106. logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
  107. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  108. return
  109. }
  110. datas = append(datas, d2...)
  111. // 过滤相关账号下非买一卖一的单据(如买一卖一有多张单则都要显示)
  112. if req.BuyOrSell == 0 {
  113. // 买,先按价格倒序排列
  114. sort.Slice(datas, func(i int, j int) bool {
  115. if datas[i].Orderprice == datas[j].Orderprice {
  116. return datas[i].Ordertime.Before(datas[j].Ordertime)
  117. }
  118. return datas[i].Orderprice > datas[j].Orderprice
  119. })
  120. } else {
  121. // 卖,先按价格顺序排列
  122. sort.Slice(datas, func(i int, j int) bool {
  123. if datas[i].Orderprice == datas[j].Orderprice {
  124. return datas[i].Ordertime.Before(datas[j].Ordertime)
  125. }
  126. return datas[i].Orderprice < datas[j].Orderprice
  127. })
  128. }
  129. // tmpDatas := make([]QueryRecieptOrderRsp, 0)
  130. // for _, v := range datas {
  131. // needAdd := true
  132. // for _, t := range tmpDatas {
  133. // if req.BuyOrSell == 0 {
  134. // // 买
  135. // if t.AccountID == v.AccountID && t.Buyorsell == v.Buyorsell && t.Orderprice > v.Orderprice {
  136. // needAdd = false
  137. // }
  138. // } else {
  139. // // 卖
  140. // if t.AccountID == v.AccountID && t.Buyorsell == v.Buyorsell && t.Orderprice < v.Orderprice {
  141. // needAdd = false
  142. // }
  143. // }
  144. // }
  145. // if needAdd {
  146. // tmpDatas = append(tmpDatas, v)
  147. // }
  148. // }
  149. // datas = tmpDatas
  150. total := len(datas)
  151. // FIXME: - 排序 & 分页
  152. // 排序
  153. sort.Slice(datas, func(i int, j int) bool {
  154. return datas[i].Tradedate > datas[j].Tradedate
  155. })
  156. // 分页
  157. if req.PageSize > 0 {
  158. // 开始上标
  159. start := req.Page * req.PageSize
  160. // 结束下标
  161. // a := []int{1,2,3,4,5}
  162. // a[2:4] -> [3 4]
  163. end := start + req.PageSize
  164. if start <= len(datas) {
  165. // 判断结束下标是否越界
  166. if end > len(datas) {
  167. end = len(datas)
  168. }
  169. datas = datas[start:end]
  170. } else {
  171. datas = make([]QueryRecieptOrderRsp, 0)
  172. }
  173. }
  174. // 查询成功返回
  175. logger.GetLogger().Debugln("QueryRecieptOrder successed: %v", datas)
  176. if req.PageSize > 0 {
  177. // 分页
  178. appG.ResponseByPage(http.StatusOK, e.SUCCESS, datas, app.PageInfo{Page: req.Page, PageSize: req.PageSize, Total: total})
  179. } else {
  180. // 不分页
  181. appG.Response(http.StatusOK, e.SUCCESS, datas)
  182. }
  183. }