|
|
@@ -0,0 +1,164 @@
|
|
|
+package order
|
|
|
+
|
|
|
+import (
|
|
|
+ "encoding/json"
|
|
|
+ "mtp2_if/db"
|
|
|
+ "mtp2_if/global/app"
|
|
|
+ "mtp2_if/global/e"
|
|
|
+ "mtp2_if/logger"
|
|
|
+ "mtp2_if/models"
|
|
|
+ "net/http"
|
|
|
+
|
|
|
+ "github.com/gin-gonic/gin"
|
|
|
+)
|
|
|
+
|
|
|
+// QueryTradePositionReq 持仓汇总查询请求参数
|
|
|
+type QueryTradePositionReq struct {
|
|
|
+ AccountID int `form:"accountID" binding:"required"`
|
|
|
+ TradeMode int `form:"tradeMode"`
|
|
|
+}
|
|
|
+
|
|
|
+// QueryTradePositionRsp 持仓汇总查询返回模型
|
|
|
+type QueryTradePositionRsp struct {
|
|
|
+ BuyOrSell int64 `json:"buyorsell" xorm:"'BUYORSELL'" ` // 方向 - 0:买 1:卖
|
|
|
+ GoodsCode string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码
|
|
|
+ GoodsName string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
|
|
|
+ Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
|
|
|
+ CurrencyID int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
|
|
|
+ GoodUnitID int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
|
|
|
+ Goodunit string `json:"goodunit" xorm:"'GOODUNIT'"` // 报价单位
|
|
|
+ DecimalPlace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
|
|
|
+ MarketID int64 `json:"marketid" xorm:"'MARKETID'"` // 所属市场ID
|
|
|
+ TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
|
|
|
+ PositionQTY uint64 `json:"positionqty" xorm:"'POSITIONQTY'"` // 期初持仓数量
|
|
|
+ HolderAmount float64 `json:"holderamount" xorm:"'HOLDERAMOUNT'"` // 期初持仓总金额[商品币种]
|
|
|
+ CurPositionQTY uint64 `json:"curpositionqty" xorm:"'CURPOSITIONQTY'"` // 当前持仓总数量
|
|
|
+ CurHolderAmount float64 `json:"curholderamount" xorm:"'CURHOLDERAMOUNT'"` // 当前持仓总金额[商品币种]
|
|
|
+ FrozenQTY uint64 `json:"frozenqty" xorm:"'FROZENQTY'"` // 持仓冻结数量
|
|
|
+ OtherFrozenQTY uint64 `json:"otherfrozenqty" xorm:"'OTHERFROZENQTY'"` // 持仓其他冻结数量(交割冻结)
|
|
|
+ OpenReqQTY uint64 `json:"openreqqty" xorm:"'OPENREQQTY'"` // 开仓申请数量(用于比较最大持仓数量)
|
|
|
+ OpenTotalQTY uint64 `json:"opentotalqty" xorm:"'OPENTOTALQTY'"` // 开仓总数量
|
|
|
+ CloseTotalQTY uint64 `json:"closetotalqty" xorm:"'CLOSETOTALQTY'"` // 平仓总数量
|
|
|
+ TNQTY uint64 `json:"tnqty" xorm:"'TNQTY'"` // T+N冻结总量
|
|
|
+ TNUsedQTY uint64 `json:"tnusedqty" xorm:"'TNUSEDQTY'"` // T+N使用量(可以使用T+N的冻结数量)
|
|
|
+ CurTDPosition uint64 `json:"curtdposition" xorm:"'CURTDPOSITION'"` // 期末今日头寸
|
|
|
+ FreTDPosition uint64 `json:"fretdposition" xorm:"'FRETDPOSITION'"` // 冻结今日头寸
|
|
|
+ EnableQTY uint64 `json:"enableqty" xorm:"'ENABLEQTY'"` // 可用量
|
|
|
+}
|
|
|
+
|
|
|
+// QueryTradePosition 持仓汇总查询(合约市场)
|
|
|
+// @Summary 持仓汇总查询(合约市场)
|
|
|
+// @Produce json
|
|
|
+// @Security ApiKeyAuth
|
|
|
+// @Param accountID query int true "资金账户"
|
|
|
+// @Param tradeMode query int false "交易模式"
|
|
|
+// @Success 200 {object} QueryTradePositionRsp
|
|
|
+// @Failure 500 {object} app.Response
|
|
|
+// @Router /Order/QueryTradePosition [get]
|
|
|
+// @Tags 通用单据
|
|
|
+func QueryTradePosition(c *gin.Context) {
|
|
|
+ appG := app.Gin{C: c}
|
|
|
+
|
|
|
+ // 获取请求参数
|
|
|
+ var req QueryTradePositionReq
|
|
|
+ if err := appG.C.ShouldBindQuery(&req); err != nil {
|
|
|
+ logger.GetLogger().Errorf("QueryTradePosition failed: %s", err.Error())
|
|
|
+ appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询数据
|
|
|
+ type tradePosition struct {
|
|
|
+ models.Tradeposition `xorm:"extends"`
|
|
|
+ Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码(内部)
|
|
|
+ Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
|
|
|
+ Currencyid int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
|
|
|
+ Goodunitid int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
|
|
|
+ Goodunit string `json:"goodunit" xorm:"'GOODUNIT'"` // 报价单位
|
|
|
+ Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
|
|
|
+ Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
|
|
|
+ Marketid uint32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
|
|
|
+ Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
|
|
|
+ }
|
|
|
+ datas := make([]tradePosition, 0)
|
|
|
+ engine := db.GetEngine()
|
|
|
+ // ORACLE好像在JOIN里不支持别名功能(在XORM中)
|
|
|
+ s := engine.Table("TRADEPOSITION").
|
|
|
+ Join("LEFT", "GOODS", "TRADEPOSITION.GOODSID = GOODS.GOODSID").
|
|
|
+ Join("LEFT", "MARKET", "GOODS.MARKETID = MARKET.MARKETID").
|
|
|
+ Join("LEFT", "ENUMDICITEM", "GOODS.GOODUNITID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'goodsunit'").
|
|
|
+ Select("TRADEPOSITION.*, GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.CURRENCYID, GOODS.GOODUNITID, ENUMDICITEM.ENUMDICNAME as GOODUNIT, GOODS.AGREEUNIT, GOODS.DECIMALPLACE, MARKET.MARKETID, MARKET.TRADEMODE").
|
|
|
+ Where("TRADEPOSITION.ACCOUNTID = ?", req.AccountID)
|
|
|
+ if req.TradeMode != 0 {
|
|
|
+ s = s.And("MARKET.TRADEMODE = ?", req.TradeMode)
|
|
|
+ }
|
|
|
+ if err := s.Find(&datas); err != nil {
|
|
|
+ // 查询失败
|
|
|
+ logger.GetLogger().Errorf("QueryTradePosition failed: %s", err.Error())
|
|
|
+ appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 构建返回数据
|
|
|
+ rst := make([]QueryTradePositionRsp, 0)
|
|
|
+ for _, v := range datas {
|
|
|
+ // 构建买方向持仓汇总
|
|
|
+ if v.Buycurpositionqty > 0 {
|
|
|
+ var tradePosition QueryTradePositionRsp
|
|
|
+ // 反射数据
|
|
|
+ // struct -> json
|
|
|
+ if jsonBytes, err := json.Marshal(v); err == nil {
|
|
|
+ // json -> struct
|
|
|
+ json.Unmarshal(jsonBytes, &tradePosition)
|
|
|
+ tradePosition.BuyOrSell = 0
|
|
|
+ tradePosition.PositionQTY = v.Buypositionqty
|
|
|
+ tradePosition.HolderAmount = v.Buyholderamount
|
|
|
+ tradePosition.CurPositionQTY = v.Buycurpositionqty
|
|
|
+ tradePosition.CurHolderAmount = v.Buycurholderamount
|
|
|
+ tradePosition.FrozenQTY = v.Buyfrozenqty
|
|
|
+ tradePosition.OtherFrozenQTY = v.Buyotherfrozenqty
|
|
|
+ tradePosition.OpenReqQTY = v.Buyopenreqqty
|
|
|
+ tradePosition.OpenTotalQTY = v.Buyopentotalqty
|
|
|
+ tradePosition.CloseTotalQTY = v.Buyclosetotalqty
|
|
|
+ tradePosition.TNQTY = v.Buytnqty
|
|
|
+ tradePosition.TNUsedQTY = v.Buytnusedqty
|
|
|
+ tradePosition.CurTDPosition = v.Buycurtdposition
|
|
|
+ tradePosition.FreTDPosition = v.Buyfretdposition
|
|
|
+ tradePosition.EnableQTY = v.Buycurpositionqty - v.Buyfrozenqty - v.Buyotherfrozenqty
|
|
|
+
|
|
|
+ rst = append(rst, tradePosition)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建卖方向持仓汇总
|
|
|
+ if v.Tradeproperty != 2 && v.Sellcurpositionqty > 0 {
|
|
|
+ var tradePosition QueryTradePositionRsp
|
|
|
+ // 反射数据
|
|
|
+ // struct -> json
|
|
|
+ if jsonBytes, err := json.Marshal(v); err == nil {
|
|
|
+ // json -> struct
|
|
|
+ json.Unmarshal(jsonBytes, &tradePosition)
|
|
|
+ tradePosition.BuyOrSell = 1
|
|
|
+ tradePosition.PositionQTY = v.Sellpositionqty
|
|
|
+ tradePosition.HolderAmount = v.Sellholderamount
|
|
|
+ tradePosition.CurPositionQTY = v.Sellcurpositionqty
|
|
|
+ tradePosition.CurHolderAmount = v.Sellcurholderamount
|
|
|
+ tradePosition.FrozenQTY = v.Sellfrozenqty
|
|
|
+ tradePosition.OtherFrozenQTY = v.Sellotherfrozenqty
|
|
|
+ tradePosition.OpenReqQTY = v.Sellopenreqqty
|
|
|
+ tradePosition.OpenTotalQTY = v.Sellopentotalqty
|
|
|
+ tradePosition.CloseTotalQTY = v.Sellclosetotalqty
|
|
|
+ tradePosition.TNQTY = v.Selltnqty
|
|
|
+ tradePosition.TNUsedQTY = v.Selltnusedqty
|
|
|
+ tradePosition.CurTDPosition = v.Sellcurtdposition
|
|
|
+ tradePosition.FreTDPosition = v.Sellfretdposition
|
|
|
+ tradePosition.EnableQTY = v.Sellcurpositionqty - v.Sellfrozenqty - v.Sellotherfrozenqty
|
|
|
+
|
|
|
+ rst = append(rst, tradePosition)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询成功
|
|
|
+ logger.GetLogger().Infof("QueryTradePosition successed: %v", rst)
|
|
|
+ appG.Response(http.StatusOK, e.SUCCESS, rst)
|
|
|
+}
|