order.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package order
  2. import (
  3. "encoding/json"
  4. "mtp2_if/db"
  5. "mtp2_if/global/app"
  6. "mtp2_if/global/e"
  7. "mtp2_if/logger"
  8. "mtp2_if/models"
  9. "net/http"
  10. "github.com/gin-gonic/gin"
  11. )
  12. // QueryTradePositionReq 持仓汇总查询请求参数
  13. type QueryTradePositionReq struct {
  14. AccountID int `form:"accountID" binding:"required"`
  15. TradeMode int `form:"tradeMode"`
  16. }
  17. // QueryTradePositionRsp 持仓汇总查询返回模型
  18. type QueryTradePositionRsp struct {
  19. BuyOrSell int64 `json:"buyorsell" xorm:"'BUYORSELL'" ` // 方向 - 0:买 1:卖
  20. GoodsCode string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码
  21. GoodsName string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
  22. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  23. CurrencyID int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  24. GoodUnitID int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  25. Goodunit string `json:"goodunit" xorm:"'GOODUNIT'"` // 报价单位
  26. DecimalPlace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  27. MarketID int64 `json:"marketid" xorm:"'MARKETID'"` // 所属市场ID
  28. TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  29. PositionQTY uint64 `json:"positionqty" xorm:"'POSITIONQTY'"` // 期初持仓数量
  30. HolderAmount float64 `json:"holderamount" xorm:"'HOLDERAMOUNT'"` // 期初持仓总金额[商品币种]
  31. CurPositionQTY uint64 `json:"curpositionqty" xorm:"'CURPOSITIONQTY'"` // 当前持仓总数量
  32. CurHolderAmount float64 `json:"curholderamount" xorm:"'CURHOLDERAMOUNT'"` // 当前持仓总金额[商品币种]
  33. FrozenQTY uint64 `json:"frozenqty" xorm:"'FROZENQTY'"` // 持仓冻结数量
  34. OtherFrozenQTY uint64 `json:"otherfrozenqty" xorm:"'OTHERFROZENQTY'"` // 持仓其他冻结数量(交割冻结)
  35. OpenReqQTY uint64 `json:"openreqqty" xorm:"'OPENREQQTY'"` // 开仓申请数量(用于比较最大持仓数量)
  36. OpenTotalQTY uint64 `json:"opentotalqty" xorm:"'OPENTOTALQTY'"` // 开仓总数量
  37. CloseTotalQTY uint64 `json:"closetotalqty" xorm:"'CLOSETOTALQTY'"` // 平仓总数量
  38. TNQTY uint64 `json:"tnqty" xorm:"'TNQTY'"` // T+N冻结总量
  39. TNUsedQTY uint64 `json:"tnusedqty" xorm:"'TNUSEDQTY'"` // T+N使用量(可以使用T+N的冻结数量)
  40. CurTDPosition uint64 `json:"curtdposition" xorm:"'CURTDPOSITION'"` // 期末今日头寸
  41. FreTDPosition uint64 `json:"fretdposition" xorm:"'FRETDPOSITION'"` // 冻结今日头寸
  42. EnableQTY uint64 `json:"enableqty" xorm:"'ENABLEQTY'"` // 可用量
  43. }
  44. // QueryTradePosition 持仓汇总查询(合约市场)
  45. // @Summary 持仓汇总查询(合约市场)
  46. // @Produce json
  47. // @Security ApiKeyAuth
  48. // @Param accountID query int true "资金账户"
  49. // @Param tradeMode query int false "交易模式"
  50. // @Success 200 {object} QueryTradePositionRsp
  51. // @Failure 500 {object} app.Response
  52. // @Router /Order/QueryTradePosition [get]
  53. // @Tags 通用单据
  54. func QueryTradePosition(c *gin.Context) {
  55. appG := app.Gin{C: c}
  56. // 获取请求参数
  57. var req QueryTradePositionReq
  58. if err := appG.C.ShouldBindQuery(&req); err != nil {
  59. logger.GetLogger().Errorf("QueryTradePosition failed: %s", err.Error())
  60. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  61. return
  62. }
  63. // 查询数据
  64. type tradePosition struct {
  65. models.Tradeposition `xorm:"extends"`
  66. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码(内部)
  67. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  68. Currencyid int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  69. Goodunitid int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  70. Goodunit string `json:"goodunit" xorm:"'GOODUNIT'"` // 报价单位
  71. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  72. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  73. Marketid uint32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  74. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  75. }
  76. datas := make([]tradePosition, 0)
  77. engine := db.GetEngine()
  78. // ORACLE好像在JOIN里不支持别名功能(在XORM中)
  79. s := engine.Table("TRADEPOSITION").
  80. Join("LEFT", "GOODS", "TRADEPOSITION.GOODSID = GOODS.GOODSID").
  81. Join("LEFT", "MARKET", "GOODS.MARKETID = MARKET.MARKETID").
  82. Join("LEFT", "ENUMDICITEM", "GOODS.GOODUNITID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'goodsunit'").
  83. Select("TRADEPOSITION.*, GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.CURRENCYID, GOODS.GOODUNITID, ENUMDICITEM.ENUMDICNAME as GOODUNIT, GOODS.AGREEUNIT, GOODS.DECIMALPLACE, MARKET.MARKETID, MARKET.TRADEMODE").
  84. Where("TRADEPOSITION.ACCOUNTID = ?", req.AccountID)
  85. if req.TradeMode != 0 {
  86. s = s.And("MARKET.TRADEMODE = ?", req.TradeMode)
  87. }
  88. if err := s.Find(&datas); err != nil {
  89. // 查询失败
  90. logger.GetLogger().Errorf("QueryTradePosition failed: %s", err.Error())
  91. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  92. return
  93. }
  94. // 构建返回数据
  95. rst := make([]QueryTradePositionRsp, 0)
  96. for _, v := range datas {
  97. // 构建买方向持仓汇总
  98. if v.Buycurpositionqty > 0 {
  99. var tradePosition QueryTradePositionRsp
  100. // 反射数据
  101. // struct -> json
  102. if jsonBytes, err := json.Marshal(v); err == nil {
  103. // json -> struct
  104. json.Unmarshal(jsonBytes, &tradePosition)
  105. tradePosition.BuyOrSell = 0
  106. tradePosition.PositionQTY = v.Buypositionqty
  107. tradePosition.HolderAmount = v.Buyholderamount
  108. tradePosition.CurPositionQTY = v.Buycurpositionqty
  109. tradePosition.CurHolderAmount = v.Buycurholderamount
  110. tradePosition.FrozenQTY = v.Buyfrozenqty
  111. tradePosition.OtherFrozenQTY = v.Buyotherfrozenqty
  112. tradePosition.OpenReqQTY = v.Buyopenreqqty
  113. tradePosition.OpenTotalQTY = v.Buyopentotalqty
  114. tradePosition.CloseTotalQTY = v.Buyclosetotalqty
  115. tradePosition.TNQTY = v.Buytnqty
  116. tradePosition.TNUsedQTY = v.Buytnusedqty
  117. tradePosition.CurTDPosition = v.Buycurtdposition
  118. tradePosition.FreTDPosition = v.Buyfretdposition
  119. tradePosition.EnableQTY = v.Buycurpositionqty - v.Buyfrozenqty - v.Buyotherfrozenqty
  120. rst = append(rst, tradePosition)
  121. }
  122. }
  123. // 构建卖方向持仓汇总
  124. if v.Tradeproperty != 2 && v.Sellcurpositionqty > 0 {
  125. var tradePosition QueryTradePositionRsp
  126. // 反射数据
  127. // struct -> json
  128. if jsonBytes, err := json.Marshal(v); err == nil {
  129. // json -> struct
  130. json.Unmarshal(jsonBytes, &tradePosition)
  131. tradePosition.BuyOrSell = 1
  132. tradePosition.PositionQTY = v.Sellpositionqty
  133. tradePosition.HolderAmount = v.Sellholderamount
  134. tradePosition.CurPositionQTY = v.Sellcurpositionqty
  135. tradePosition.CurHolderAmount = v.Sellcurholderamount
  136. tradePosition.FrozenQTY = v.Sellfrozenqty
  137. tradePosition.OtherFrozenQTY = v.Sellotherfrozenqty
  138. tradePosition.OpenReqQTY = v.Sellopenreqqty
  139. tradePosition.OpenTotalQTY = v.Sellopentotalqty
  140. tradePosition.CloseTotalQTY = v.Sellclosetotalqty
  141. tradePosition.TNQTY = v.Selltnqty
  142. tradePosition.TNUsedQTY = v.Selltnusedqty
  143. tradePosition.CurTDPosition = v.Sellcurtdposition
  144. tradePosition.FreTDPosition = v.Sellfretdposition
  145. tradePosition.EnableQTY = v.Sellcurpositionqty - v.Sellfrozenqty - v.Sellotherfrozenqty
  146. rst = append(rst, tradePosition)
  147. }
  148. }
  149. }
  150. // 查询成功
  151. logger.GetLogger().Infof("QueryTradePosition successed: %v", rst)
  152. appG.Response(http.StatusOK, e.SUCCESS, rst)
  153. }