|
|
@@ -8,7 +8,9 @@ import (
|
|
|
"mtp2_if/global/e"
|
|
|
"mtp2_if/logger"
|
|
|
"mtp2_if/models"
|
|
|
+ "mtp2_if/utils"
|
|
|
"net/http"
|
|
|
+ "strconv"
|
|
|
"time"
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
@@ -47,6 +49,7 @@ type QueryTradePositionRsp struct {
|
|
|
CurTDPosition uint64 `json:"curtdposition" xorm:"'CURTDPOSITION'"` // 期末今日头寸
|
|
|
FreTDPosition uint64 `json:"fretdposition" xorm:"'FRETDPOSITION'"` // 冻结今日头寸
|
|
|
EnableQTY uint64 `json:"enableqty" xorm:"'ENABLEQTY'"` // 可用量
|
|
|
+ AveragePrice float64 `json:"averageprice" xorm:"AVERAGEPRICE"` // 持仓均价
|
|
|
}
|
|
|
|
|
|
// QueryTradePosition 持仓汇总查询(合约市场)
|
|
|
@@ -128,7 +131,9 @@ func QueryTradePosition(c *gin.Context) {
|
|
|
tradePosition.CurTDPosition = v.Buycurtdposition
|
|
|
tradePosition.FreTDPosition = v.Buyfretdposition
|
|
|
tradePosition.EnableQTY = v.Buycurpositionqty - v.Buyfrozenqty - v.Buyotherfrozenqty
|
|
|
-
|
|
|
+ // 计算持仓均价
|
|
|
+ averagePrice := tradePosition.CurHolderAmount / float64(tradePosition.CurPositionQTY) / tradePosition.AgreeUnit
|
|
|
+ tradePosition.AveragePrice, _ = strconv.ParseFloat(utils.FormatFloat(averagePrice, int(v.Decimalplace)), 64)
|
|
|
rst = append(rst, tradePosition)
|
|
|
}
|
|
|
}
|
|
|
@@ -156,6 +161,9 @@ func QueryTradePosition(c *gin.Context) {
|
|
|
tradePosition.CurTDPosition = v.Sellcurtdposition
|
|
|
tradePosition.FreTDPosition = v.Sellfretdposition
|
|
|
tradePosition.EnableQTY = v.Sellcurpositionqty - v.Sellfrozenqty - v.Sellotherfrozenqty
|
|
|
+ // 计算持仓均价
|
|
|
+ averagePrice := tradePosition.CurHolderAmount / float64(tradePosition.CurPositionQTY) / tradePosition.AgreeUnit
|
|
|
+ tradePosition.AveragePrice, _ = strconv.ParseFloat(utils.FormatFloat(averagePrice, int(v.Decimalplace)), 64)
|
|
|
|
|
|
rst = append(rst, tradePosition)
|
|
|
}
|
|
|
@@ -216,15 +224,13 @@ type QueryTradeOrderDetailRsp struct {
|
|
|
Ordersrc int64 `json:"ordersrc" xorm:"'ORDERSRC'"` // 委托来源 - 1:客户端 2:管理端 3:风控服务 4:交割服务 5:交易服务 6:交易日结 7:商品强平 8:管理端商品退市强平 9:交易接口 10:交割服务商被动(受托竞价) 11:预埋触发
|
|
|
Clienttype int64 `json:"clienttype" xorm:"'CLIENTTYPE'"` // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江)
|
|
|
Operatorid int64 `json:"operatorid" xorm:"'OPERATORID'"` // 登录账号(LoginID)
|
|
|
-
|
|
|
// 关联字段
|
|
|
GoodsCode string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码
|
|
|
GoodsName string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
|
|
|
Marketname string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
|
|
|
TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
|
|
|
-
|
|
|
// 计算字段
|
|
|
- Enableqty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可用数量, 委托数量 - 成交数量 - 撤单数量
|
|
|
+ Enableqty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可用数量 = 委托数量 - 成交数量 - 撤单数量
|
|
|
}
|
|
|
|
|
|
// QueryTradeOrderDetail 委托单查询请求(合约市场)
|
|
|
@@ -280,3 +286,88 @@ func QueryTradeOrderDetail(c *gin.Context) {
|
|
|
logger.GetLogger().Infof("QueryTradeOrderDetail successed: %v", datas)
|
|
|
appG.Response(http.StatusOK, e.SUCCESS, datas)
|
|
|
}
|
|
|
+
|
|
|
+// QueryTradeDetailReq 成交单查询请求参数
|
|
|
+type QueryTradeDetailReq struct {
|
|
|
+ AccountID string `form:"accountID" binding:"required"`
|
|
|
+ TradeID int `form:"tradeID"`
|
|
|
+ OrderID int `form:"orderID"`
|
|
|
+ TradeMode string `form:"tradeMode"`
|
|
|
+ BuildType int `form:"buildType"`
|
|
|
+ TradeType string `form:"tradeType"`
|
|
|
+}
|
|
|
+
|
|
|
+// QueryTradeDetailRsp 成交单查询返回模型
|
|
|
+type QueryTradeDetailRsp struct {
|
|
|
+ // 成交单字段
|
|
|
+ models.Tradetradedetail `xorm:"extends"`
|
|
|
+ // 关联字段
|
|
|
+ GoodsCode string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码
|
|
|
+ GoodsName string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
|
|
|
+ Marketname string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
|
|
|
+ TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
|
|
|
+ // 计算字段
|
|
|
+ Charge float64 `json:"charge" xorm:"CHARGE"` // 手续费
|
|
|
+}
|
|
|
+
|
|
|
+// QueryTradeDetail 成交单查询(合约市场)
|
|
|
+// @Summary 成交单查询(合约市场)
|
|
|
+// @Produce json
|
|
|
+// @Security ApiKeyAuth
|
|
|
+// @Param accountID query string true "资金账户 - 格式:1,2,3"
|
|
|
+// @Param tradeID query int false "成交单号"
|
|
|
+// @Param orderID query int false "委托单号"
|
|
|
+// @Param tradeMode query string false "交易模式 - 格式:1,2,3"
|
|
|
+// @Param buildType query int false "委托单据类型"
|
|
|
+// @Param tradeType query string false "成交类别 - 格式:1,2,3"
|
|
|
+// @Success 200 {object} QueryTradeDetailRsp
|
|
|
+// @Failure 500 {object} app.Response
|
|
|
+// @Router /Order/QueryTradeDetail [get]
|
|
|
+// @Tags 通用单据
|
|
|
+// 参考通用查询:SearchAllTransactionDetailOrder
|
|
|
+func QueryTradeDetail(c *gin.Context) {
|
|
|
+ appG := app.Gin{C: c}
|
|
|
+
|
|
|
+ // 获取请求参数
|
|
|
+ var req QueryTradeDetailReq
|
|
|
+ if err := appG.C.ShouldBindQuery(&req); err != nil {
|
|
|
+ logger.GetLogger().Errorf("QueryTradeDetail failed: %s", err.Error())
|
|
|
+ appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ datas := make([]QueryTradeDetailRsp, 0)
|
|
|
+ engine := db.GetEngine()
|
|
|
+ s := engine.Table("TRADE_TRADEDETAIL").
|
|
|
+ Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_TRADEDETAIL.GOODSID").
|
|
|
+ Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_TRADEDETAIL.MARKETID").
|
|
|
+ Select(`TRADE_TRADEDETAIL.*, CASE TRADE_TRADEDETAIL.BUILDTYPE WHEN 1 THEN TRADE_TRADEDETAIL.OPENCHARGE ELSE TRADE_TRADEDETAIL.CLOSECHARGE END as CHARGE,
|
|
|
+ GOODS.GOODSCODE, GOODS.GOODSNAME, MARKET.MARKETNAME, MARKET.TRADEMODE`).
|
|
|
+ Where(fmt.Sprintf("TRADE_TRADEDETAIL.ACCOUNTID in (%s)", req.AccountID)).
|
|
|
+ Desc("TRADE_TRADEDETAIL.TRADETIME")
|
|
|
+ if req.TradeID > 0 {
|
|
|
+ s = s.And("TRADE_TRADEDETAIL.TRADEID = ?", req.TradeID)
|
|
|
+ }
|
|
|
+ if req.OrderID > 0 {
|
|
|
+ s = s.And("TRADE_TRADEDETAIL.ORDERID = ?", req.OrderID)
|
|
|
+ }
|
|
|
+ if len(req.TradeMode) > 0 {
|
|
|
+ s = s.And(fmt.Sprintf("MARKET.TRADEMODE in (%s)", req.TradeMode))
|
|
|
+ }
|
|
|
+ if req.BuildType > 0 {
|
|
|
+ s = s.And("TRADE_TRADEDETAIL.BUILDTYPE = ?", req.BuildType)
|
|
|
+ }
|
|
|
+ if len(req.TradeType) > 0 {
|
|
|
+ s = s.And(fmt.Sprintf("TRADE_TRADEDETAIL.TRADETYPE in (%s)", req.TradeType))
|
|
|
+ }
|
|
|
+ if err := s.Find(&datas); err != nil {
|
|
|
+ // 查询失败
|
|
|
+ logger.GetLogger().Errorf("QueryTradeDetail failed: %s", err.Error())
|
|
|
+ appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询成功
|
|
|
+ logger.GetLogger().Infof("QueryTradeDetail successed: %v", datas)
|
|
|
+ appG.Response(http.StatusOK, e.SUCCESS, datas)
|
|
|
+}
|