order.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. package order
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "mtp2_if/db"
  6. "mtp2_if/global/app"
  7. "mtp2_if/global/e"
  8. "mtp2_if/logger"
  9. "mtp2_if/models"
  10. "mtp2_if/utils"
  11. "net/http"
  12. "strconv"
  13. "time"
  14. "github.com/gin-gonic/gin"
  15. )
  16. // QueryTradePositionReq 持仓汇总查询请求参数(合约市场)
  17. type QueryTradePositionReq struct {
  18. AccountID string `form:"accountID" binding:"required"`
  19. TradeMode string `form:"tradeMode"`
  20. }
  21. // QueryTradePositionRsp 持仓汇总查询返回模型(合约市场)
  22. type QueryTradePositionRsp struct {
  23. AccountID uint64 `json:"accountid" xorm:"'ACCOUNTID'"` // 资金账户
  24. BuyOrSell int64 `json:"buyorsell" xorm:"'BUYORSELL'" ` // 方向 - 0:买 1:卖
  25. Goodsid uint32 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品Id
  26. GoodsCode string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码
  27. GoodsName string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
  28. AgreeUnit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  29. CurrencyID int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  30. GoodUnitID int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  31. Goodunit string `json:"goodunit" xorm:"'GOODUNIT'"` // 报价单位
  32. DecimalPlace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  33. MarketID int64 `json:"marketid" xorm:"'MARKETID'"` // 所属市场ID
  34. TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  35. PositionQTY uint64 `json:"positionqty" xorm:"'POSITIONQTY'"` // 期初持仓数量
  36. HolderAmount float64 `json:"holderamount" xorm:"'HOLDERAMOUNT'"` // 期初持仓总金额[商品币种]
  37. CurPositionQTY uint64 `json:"curpositionqty" xorm:"'CURPOSITIONQTY'"` // 当前持仓总数量
  38. CurHolderAmount float64 `json:"curholderamount" xorm:"'CURHOLDERAMOUNT'"` // 当前持仓总金额[商品币种]
  39. FrozenQTY uint64 `json:"frozenqty" xorm:"'FROZENQTY'"` // 持仓冻结数量
  40. OtherFrozenQTY uint64 `json:"otherfrozenqty" xorm:"'OTHERFROZENQTY'"` // 持仓其他冻结数量(交割冻结)
  41. OpenReqQTY uint64 `json:"openreqqty" xorm:"'OPENREQQTY'"` // 开仓申请数量(用于比较最大持仓数量)
  42. OpenTotalQTY uint64 `json:"opentotalqty" xorm:"'OPENTOTALQTY'"` // 开仓总数量
  43. CloseTotalQTY uint64 `json:"closetotalqty" xorm:"'CLOSETOTALQTY'"` // 平仓总数量
  44. TNQTY uint64 `json:"tnqty" xorm:"'TNQTY'"` // T+N冻结总量
  45. TNUsedQTY uint64 `json:"tnusedqty" xorm:"'TNUSEDQTY'"` // T+N使用量(可以使用T+N的冻结数量)
  46. CurTDPosition uint64 `json:"curtdposition" xorm:"'CURTDPOSITION'"` // 期末今日头寸
  47. FreTDPosition uint64 `json:"fretdposition" xorm:"'FRETDPOSITION'"` // 冻结今日头寸
  48. EnableQTY uint64 `json:"enableqty" xorm:"'ENABLEQTY'"` // 可用量
  49. AveragePrice float64 `json:"averageprice" xorm:"AVERAGEPRICE"` // 持仓均价
  50. }
  51. // QueryTradePosition 持仓汇总查询(合约市场)
  52. // @Summary 持仓汇总查询(合约市场)
  53. // @Produce json
  54. // @Security ApiKeyAuth
  55. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  56. // @Param tradeMode query string false "交易模式 - 格式:1,2,3"
  57. // @Success 200 {object} QueryTradePositionRsp
  58. // @Failure 500 {object} app.Response
  59. // @Router /Order/QueryTradePosition [get]
  60. // @Tags 通用单据
  61. // 参考通用查询:SearchTradePositionDetail
  62. func QueryTradePosition(c *gin.Context) {
  63. appG := app.Gin{C: c}
  64. // 获取请求参数
  65. var req QueryTradePositionReq
  66. if err := appG.C.ShouldBindQuery(&req); err != nil {
  67. logger.GetLogger().Errorf("QueryTradePosition failed: %s", err.Error())
  68. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  69. return
  70. }
  71. // 查询数据
  72. type tradePosition struct {
  73. models.Tradeposition `xorm:"extends"`
  74. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码(内部)
  75. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  76. Currencyid int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  77. Goodunitid int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  78. Goodunit string `json:"goodunit" xorm:"'GOODUNIT'"` // 报价单位
  79. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  80. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  81. Marketid uint32 `json:"marketid" xorm:"'MARKETID'"` // 市场ID
  82. Trademode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  83. }
  84. datas := make([]tradePosition, 0)
  85. engine := db.GetEngine()
  86. // ORACLE好像在JOIN里不支持别名功能(在XORM中)
  87. s := engine.Table("TRADEPOSITION").
  88. Join("LEFT", "GOODS", "TRADEPOSITION.GOODSID = GOODS.GOODSID").
  89. Join("LEFT", "MARKET", "GOODS.MARKETID = MARKET.MARKETID").
  90. Join("LEFT", "ENUMDICITEM", "GOODS.GOODUNITID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'goodsunit'").
  91. Select("TRADEPOSITION.*, GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.CURRENCYID, GOODS.GOODUNITID, ENUMDICITEM.ENUMDICNAME as GOODUNIT, GOODS.AGREEUNIT, GOODS.DECIMALPLACE, MARKET.MARKETID, MARKET.TRADEMODE").
  92. Where(fmt.Sprintf(`TRADEPOSITION.ACCOUNTID in (%s)`, req.AccountID))
  93. if len(req.TradeMode) > 0 {
  94. s = s.And(fmt.Sprintf(`MARKET.TRADEMODE in (%s)`, req.TradeMode))
  95. }
  96. if err := s.Find(&datas); err != nil {
  97. // 查询失败
  98. logger.GetLogger().Errorf("QueryTradePosition failed: %s", err.Error())
  99. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  100. return
  101. }
  102. // 构建返回数据
  103. rst := make([]QueryTradePositionRsp, 0)
  104. for _, v := range datas {
  105. // 构建买方向持仓汇总
  106. if v.Buycurpositionqty > 0 {
  107. var tradePosition QueryTradePositionRsp
  108. // 反射数据
  109. // struct -> json
  110. if jsonBytes, err := json.Marshal(v); err == nil {
  111. // json -> struct
  112. json.Unmarshal(jsonBytes, &tradePosition)
  113. tradePosition.BuyOrSell = 0
  114. tradePosition.PositionQTY = v.Buypositionqty
  115. tradePosition.HolderAmount = v.Buyholderamount
  116. tradePosition.CurPositionQTY = v.Buycurpositionqty
  117. tradePosition.CurHolderAmount = v.Buycurholderamount
  118. tradePosition.FrozenQTY = v.Buyfrozenqty
  119. tradePosition.OtherFrozenQTY = v.Buyotherfrozenqty
  120. tradePosition.OpenReqQTY = v.Buyopenreqqty
  121. tradePosition.OpenTotalQTY = v.Buyopentotalqty
  122. tradePosition.CloseTotalQTY = v.Buyclosetotalqty
  123. tradePosition.TNQTY = v.Buytnqty
  124. tradePosition.TNUsedQTY = v.Buytnusedqty
  125. tradePosition.CurTDPosition = v.Buycurtdposition
  126. tradePosition.FreTDPosition = v.Buyfretdposition
  127. tradePosition.EnableQTY = v.Buycurpositionqty - v.Buyfrozenqty - v.Buyotherfrozenqty
  128. // 计算持仓均价
  129. averagePrice := tradePosition.CurHolderAmount / float64(tradePosition.CurPositionQTY) / tradePosition.AgreeUnit
  130. tradePosition.AveragePrice, _ = strconv.ParseFloat(utils.FormatFloat(averagePrice, int(v.Decimalplace)), 64)
  131. rst = append(rst, tradePosition)
  132. }
  133. }
  134. // 构建卖方向持仓汇总
  135. if v.Tradeproperty != 2 && v.Sellcurpositionqty > 0 {
  136. var tradePosition QueryTradePositionRsp
  137. // 反射数据
  138. // struct -> json
  139. if jsonBytes, err := json.Marshal(v); err == nil {
  140. // json -> struct
  141. json.Unmarshal(jsonBytes, &tradePosition)
  142. tradePosition.BuyOrSell = 1
  143. tradePosition.PositionQTY = v.Sellpositionqty
  144. tradePosition.HolderAmount = v.Sellholderamount
  145. tradePosition.CurPositionQTY = v.Sellcurpositionqty
  146. tradePosition.CurHolderAmount = v.Sellcurholderamount
  147. tradePosition.FrozenQTY = v.Sellfrozenqty
  148. tradePosition.OtherFrozenQTY = v.Sellotherfrozenqty
  149. tradePosition.OpenReqQTY = v.Sellopenreqqty
  150. tradePosition.OpenTotalQTY = v.Sellopentotalqty
  151. tradePosition.CloseTotalQTY = v.Sellclosetotalqty
  152. tradePosition.TNQTY = v.Selltnqty
  153. tradePosition.TNUsedQTY = v.Selltnusedqty
  154. tradePosition.CurTDPosition = v.Sellcurtdposition
  155. tradePosition.FreTDPosition = v.Sellfretdposition
  156. tradePosition.EnableQTY = v.Sellcurpositionqty - v.Sellfrozenqty - v.Sellotherfrozenqty
  157. // 计算持仓均价
  158. averagePrice := tradePosition.CurHolderAmount / float64(tradePosition.CurPositionQTY) / tradePosition.AgreeUnit
  159. tradePosition.AveragePrice, _ = strconv.ParseFloat(utils.FormatFloat(averagePrice, int(v.Decimalplace)), 64)
  160. rst = append(rst, tradePosition)
  161. }
  162. }
  163. }
  164. // 查询成功
  165. logger.GetLogger().Infof("QueryTradePosition successed: %v", rst)
  166. appG.Response(http.StatusOK, e.SUCCESS, rst)
  167. }
  168. // QueryTradeOrderDetailReq 委托单查询请求参数(合约市场)
  169. type QueryTradeOrderDetailReq struct {
  170. AccountID string `form:"accountID" binding:"required"`
  171. OrderStatus string `form:"orderStatus"`
  172. TradeMode string `form:"tradeMode"`
  173. OrderID int `form:"orderID"`
  174. }
  175. // QueryTradeOrderDetailRsp 委托单查询返回模型(合约市场)
  176. type QueryTradeOrderDetailRsp struct {
  177. Orderid string `json:"orderid" xorm:"'ORDERID'"` // 委托单号(100+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  178. Tradedate string `json:"tradedate" xorm:"'TRADEDATE'" binding:"required"` // 交易日(yyyyMMdd)
  179. Buildtype int64 `json:"buildtype" xorm:"'BUILDTYPE'" binding:"required"` // 委托单据类型 - 1:建仓 2:平仓 3:先平后建
  180. Preorderid string `json:"preorderid" xorm:"'PREORDERID'"` // 关联预埋单号(止盈止损单时填写)
  181. Cancelorderid string `json:"cancelorderid" xorm:"'CANCELORDERID'"` // 撤单单号(撤单时填写)
  182. Relatedid string `json:"relatedid" xorm:"'RELATEDID'"` // 关联单号(交割单)
  183. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 市场ID
  184. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID
  185. Accountid int64 `json:"accountid" xorm:"'ACCOUNTID'" binding:"required"` // 账户ID[报价币种]
  186. Buyorsell int64 `json:"buyorsell" xorm:"'BUYORSELL'" binding:"required"` // 买卖 - 0:买 1:卖
  187. Pricemode int64 `json:"pricemode" xorm:"'PRICEMODE'" binding:"required"` // 取价方式 - 1:市价 2: 限价
  188. Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
  189. Orderqty int64 `json:"orderqty" xorm:"'ORDERQTY'" binding:"required"` // 委托数量
  190. Tradeqty int64 `json:"tradeqty" xorm:"'TRADEQTY'"` // 成交数量
  191. Cancelqty int64 `json:"cancelqty" xorm:"'CANCELQTY'"` // 撤单数量
  192. Openqty int64 `json:"openqty" xorm:"'OPENQTY'"` // 开仓数量(先建后平操作,需要记录)
  193. Closeqty int64 `json:"closeqty" xorm:"'CLOSEQTY'"` // 平仓数量(先建后平操作 需要记录)
  194. Opentradeqty int64 `json:"opentradeqty" xorm:"'OPENTRADEQTY'"` // 开仓成交数量(先建后平操作,需要记录)
  195. Closetradeqty int64 `json:"closetradeqty" xorm:"'CLOSETRADEQTY'"` // 平仓成交数量(先建后平操作,需要记录)
  196. Freezemargin float64 `json:"freezemargin" xorm:"'FREEZEMARGIN'"` // 冻结保证金(冻结交易金额)
  197. Unfreezemargin float64 `json:"unfreezemargin" xorm:"'UNFREEZEMARGIN'"` // 解冻保证金
  198. Freezecharge float64 `json:"freezecharge" xorm:"'FREEZECHARGE'"` // 冻结手续费
  199. Unfreezecharge float64 `json:"unfreezecharge" xorm:"'UNFREEZECHARGE'"` // 解冻手续费
  200. Openfreezecharge float64 `json:"openfreezecharge" xorm:"'OPENFREEZECHARGE'"` // 开仓冻结手续费(先建后平操作,需要记录)
  201. Closefreezecharge float64 `json:"closefreezecharge" xorm:"'CLOSEFREEZECHARGE'"` // 平仓冻结手续费(先建后平操作,需要记录)
  202. Openunfreezecharge float64 `json:"openunfreezecharge" xorm:"'OPENUNFREEZECHARGE'"` // 开仓解冻手续费(先建后平操作,需要记录)
  203. Closeunfreezecharge float64 `json:"closeunfreezecharge" xorm:"'CLOSEUNFREEZECHARGE'"` // 平仓解冻手续费(先建后平操作,需要记录)
  204. Validtype int64 `json:"validtype" xorm:"'VALIDTYPE'" binding:"required"` // 有效类型 - 1当日有效 2本周有效 3指定日期有效 4一直有效 5指定时间有效
  205. Validtime time.Time `json:"validtime" xorm:"'VALIDTIME'"` // 有效期限
  206. Volumetype int64 `json:"volumetype" xorm:"'VOLUMETYPE'"` // 当时间有效类型为 “立即执行否则取消 IOC” 时,需要此项 - 0:任意量 1:最小量(暂时不支持) 2:全部量
  207. Operatetype int64 `json:"operatetype" xorm:"'OPERATETYPE'" binding:"required"` // 操作类型 - 1:正常下单 2:斩仓 3:转单 4:结算撤单 5:系统卖出(适用于先平后建的卖出) 6:行情源报价 7:(结算)到期强平 8:(结算)协议转让 9:系统对冲单 10:(结算)到期无效 11:交割协议转让 12:交割协议平仓 13:交割成交(所有权) 14:管理端强行平仓 15:管理端协议转让
  208. Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
  209. Orderstatus int64 `json:"orderstatus" xorm:"'ORDERSTATUS'"` // 委托状态 - 1: 委托请求 2:待冻结 3:委托成功 4: 委托失败 5:配对成功 6: 已撤销 7:部分成交 8:已成交 9:部成部撤 10:成交失败 11:已拒绝 12:经过摘牌(先摘后挂专用-先摘后挂已摘过) 13:冻结成功(通道交易专用) 14:通道已撤 15:通道部成部撤 16:成交失败违约(荷兰式竞拍专用)
  210. Listingselecttype int64 `json:"listingselecttype" xorm:"'LISTINGSELECTTYPE'"` // 挂牌点选类型 - 1:挂牌 2:摘牌 3:先摘后挂
  211. Delistingtype int64 `json:"delistingtype" xorm:"'DELISTINGTYPE'"` // 摘牌类型 - 1:价格最优 2:点选成交
  212. Ordersrc int64 `json:"ordersrc" xorm:"'ORDERSRC'"` // 委托来源 - 1:客户端 2:管理端 3:风控服务 4:交割服务 5:交易服务 6:交易日结 7:商品强平 8:管理端商品退市强平 9:交易接口 10:交割服务商被动(受托竞价) 11:预埋触发
  213. Clienttype int64 `json:"clienttype" xorm:"'CLIENTTYPE'"` // 客户端类型 - 0:保留为未填终端类型 1:PC管理端 2:PC交易端 3:手机客户端_安卓 4:网页客户端 5:微信客户端 6:手机客户端_苹果 7:网上开户客户端 8:无效终端编号 9:报价终端(中江)
  214. Operatorid int64 `json:"operatorid" xorm:"'OPERATORID'"` // 登录账号(LoginID)
  215. GoodsCode string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码
  216. GoodsName string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
  217. Marketname string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
  218. TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  219. Enableqty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可用数量 = 委托数量 - 成交数量 - 撤单数量
  220. }
  221. // QueryTradeOrderDetail 委托单查询请求(合约市场)
  222. // @Summary 委托单查询请求(合约市场)
  223. // @Produce json
  224. // @Security ApiKeyAuth
  225. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  226. // @Param tradeMode query string false "交易模式 - 格式:1,2,3"
  227. // @Param orderStatus query string false "委托状态 - 格式:1,2,3"
  228. // @Param orderID query int false "委托单号"
  229. // @Success 200 {object} QueryTradeOrderDetailRsp
  230. // @Failure 500 {object} app.Response
  231. // @Router /Order/QueryTradeOrderDetail [get]
  232. // @Tags 通用单据
  233. // 参考通用查询:SearchTradeOrderDetail
  234. func QueryTradeOrderDetail(c *gin.Context) {
  235. appG := app.Gin{C: c}
  236. // 获取请求参数
  237. var req QueryTradeOrderDetailReq
  238. if err := appG.C.ShouldBindQuery(&req); err != nil {
  239. logger.GetLogger().Errorf("QueryTradeOrderDetail failed: %s", err.Error())
  240. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  241. return
  242. }
  243. datas := make([]QueryTradeOrderDetailRsp, 0)
  244. engine := db.GetEngine()
  245. // 由于uint64类型数据(单号)过长是获取会有问题(可能是oci8组件问题),所以这里将可能会出问题的单号都用to_char来输出
  246. s := engine.Table("TRADE_ORDERDETAIL").
  247. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_ORDERDETAIL.GOODSID").
  248. Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_ORDERDETAIL.MARKETID").
  249. Select(`to_char(TRADE_ORDERDETAIL.ORDERID) as ORDERID, to_char(TRADE_ORDERDETAIL.PREORDERID) as PREORDERID, to_char(TRADE_ORDERDETAIL.CANCELORDERID) as CANCELORDERID, to_char(TRADE_ORDERDETAIL.RELATEDID) as RELATEDID,
  250. TRADE_ORDERDETAIL.*, TRADE_ORDERDETAIL.ORDERQTY - TRADE_ORDERDETAIL.TRADEQTY - TRADE_ORDERDETAIL.CANCELQTY as ENABLEQTY,
  251. GOODS.GOODSCODE, GOODS.GOODSNAME, MARKET.MARKETNAME, MARKET.TRADEMODE`).
  252. Where(fmt.Sprintf(`TRADE_ORDERDETAIL.ORDERSRC != 10 and TRADE_ORDERDETAIL.ACCOUNTID in (%s)`, req.AccountID)).
  253. Desc("TRADE_ORDERDETAIL.ORDERTIME")
  254. if len(req.OrderStatus) > 0 {
  255. s = s.And(fmt.Sprintf(`TRADE_ORDERDETAIL.ORDERSTATUS in (%s)`, req.OrderStatus))
  256. }
  257. if len(req.TradeMode) > 0 {
  258. s = s.And(fmt.Sprintf(`MARKET.TRADEMODE in (%s)`, req.TradeMode))
  259. }
  260. if req.OrderID > 0 {
  261. s = s.And("TRADE_ORDERDETAIL.ORDERID = ?", req.OrderID)
  262. }
  263. if err := s.Find(&datas); err != nil {
  264. // 查询失败
  265. logger.GetLogger().Errorf("QueryTradeOrderDetail failed: %s", err.Error())
  266. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  267. return
  268. }
  269. // 查询成功
  270. logger.GetLogger().Infof("QueryTradeOrderDetail successed: %v", datas)
  271. appG.Response(http.StatusOK, e.SUCCESS, datas)
  272. }
  273. // QueryHisTradeOrderDetailReq 历史委托单查询请求参数(合约市场)
  274. type QueryHisTradeOrderDetailReq struct {
  275. AccountID string `form:"accountID" binding:"required"` // 资金账户 - 格式:1,2,3
  276. OrderStatus string `form:"orderStatus"` // 委托状态 - 格式:1,2,3
  277. TradeMode string `form:"tradeMode"` // 交易模式 - 格式:1,2,3
  278. OrderID int `form:"orderID"` // 委托单号
  279. StartDate string `form:"startDate"` // 开始时间
  280. EndDate string `form:"endDate"` // 结束时间
  281. }
  282. // QueryHisTradeOrderDetailRsp 历史委托单查询返回模型(合约市场)
  283. type QueryHisTradeOrderDetailRsp struct {
  284. models.Histradeorderdetail `xorm:"extends"`
  285. GoodsCode string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码
  286. GoodsName string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
  287. Marketname string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
  288. TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  289. }
  290. // QueryHisTradeOrderDetail 历史委托单查询请求(合约市场)
  291. // @Summary 历史委托单查询请求(合约市场)
  292. // @Produce json
  293. // @Security ApiKeyAuth
  294. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  295. // @Param tradeMode query string false "交易模式 - 格式:1,2,3"
  296. // @Param orderStatus query string false "委托状态 - 格式:1,2,3"
  297. // @Param orderID query int false "委托单号"
  298. // @Param startDate query string false "开始时间 - 闭区间,格式:yyyy-MM-dd"
  299. // @Param endDate query string false "结束时间 - 闭区间,格式:yyyy-MM-dd"
  300. // @Success 200 {object} QueryHisTradeOrderDetailRsp
  301. // @Failure 500 {object} app.Response
  302. // @Router /Order/QueryHisTradeOrderDetail [get]
  303. // @Tags 通用单据
  304. // 参考通用查询:Client_QueryHis_trade_orderdetail
  305. func QueryHisTradeOrderDetail(c *gin.Context) {
  306. appG := app.Gin{C: c}
  307. // 获取请求参数
  308. var req QueryHisTradeOrderDetailReq
  309. if err := appG.C.ShouldBindQuery(&req); err != nil {
  310. logger.GetLogger().Errorf("QueryHisTradeOrderDetail failed: %s", err.Error())
  311. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  312. return
  313. }
  314. datas := make([]QueryHisTradeOrderDetailRsp, 0)
  315. engine := db.GetEngine()
  316. s := engine.Table("HIS_TRADE_ORDERDETAIL").
  317. Join("LEFT", "GOODS", "GOODS.GOODSID = HIS_TRADE_ORDERDETAIL.GOODSID").
  318. Join("LEFT", "MARKET", "MARKET.MARKETID = HIS_TRADE_ORDERDETAIL.MARKETID").
  319. Select(`to_char(HIS_TRADE_ORDERDETAIL.ORDERID) as ORDERID, to_char(HIS_TRADE_ORDERDETAIL.PREORDERID) as PREORDERID, to_char(HIS_TRADE_ORDERDETAIL.CANCELORDERID) as CANCELORDERID, to_char(HIS_TRADE_ORDERDETAIL.RELATEDID) as RELATEDID,
  320. HIS_TRADE_ORDERDETAIL.*,
  321. GOODS.GOODSCODE, GOODS.GOODSNAME, MARKET.MARKETNAME, MARKET.TRADEMODE`).
  322. Where(fmt.Sprintf(`HIS_TRADE_ORDERDETAIL.ORDERSRC != 10 and HIS_TRADE_ORDERDETAIL.ISVALIDDATA = 1 and HIS_TRADE_ORDERDETAIL.ACCOUNTID in (%s)`, req.AccountID)).
  323. Desc("HIS_TRADE_ORDERDETAIL.ORDERTIME")
  324. if len(req.OrderStatus) > 0 {
  325. s = s.And(fmt.Sprintf(`HIS_TRADE_ORDERDETAIL.ORDERSTATUS in (%s)`, req.OrderStatus))
  326. }
  327. if len(req.TradeMode) > 0 {
  328. s = s.And(fmt.Sprintf(`MARKET.TRADEMODE in (%s)`, req.TradeMode))
  329. }
  330. if req.OrderID > 0 {
  331. s = s.And("HIS_TRADE_ORDERDETAIL.ORDERID = ?", req.OrderID)
  332. }
  333. if len(req.StartDate) > 0 {
  334. s = s.And(fmt.Sprintf("to_date(HIS_TRADE_ORDERDETAIL.HISTRADEDATE,'yyyyMMdd') >= to_date('%s','yyyy-MM-dd')", req.StartDate))
  335. }
  336. if len(req.EndDate) > 0 {
  337. s = s.And(fmt.Sprintf("to_date(HIS_TRADE_ORDERDETAIL.HISTRADEDATE,'yyyyMMdd') <= to_date('%s','yyyy-MM-dd')", req.EndDate))
  338. }
  339. if err := s.Find(&datas); err != nil {
  340. // 查询失败
  341. logger.GetLogger().Errorf("QueryHisTradeOrderDetail failed: %s", err.Error())
  342. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  343. return
  344. }
  345. // 查询成功
  346. logger.GetLogger().Infof("QueryHisTradeOrderDetail successed: %v", datas)
  347. appG.Response(http.StatusOK, e.SUCCESS, datas)
  348. }
  349. // QueryTradeDetailReq 成交单查询请求参数
  350. type QueryTradeDetailReq struct {
  351. AccountID string `form:"accountID" binding:"required"`
  352. TradeID int `form:"tradeID"`
  353. OrderID int `form:"orderID"`
  354. TradeMode string `form:"tradeMode"`
  355. BuildType int `form:"buildType"`
  356. TradeType string `form:"tradeType"`
  357. }
  358. // QueryTradeDetailRsp 成交单查询返回模型
  359. type QueryTradeDetailRsp struct {
  360. models.Tradetradedetail `xorm:"extends"`
  361. GoodsCode string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码
  362. GoodsName string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
  363. Marketname string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
  364. TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  365. ListingSelectType uint32 `json:"listingselecttype" xorm:"'LISTINGSELECTTYPE'"` // 关联委托单挂牌点选类型 - 1:挂牌 2:摘牌 3:先摘后挂
  366. Charge float64 `json:"charge" xorm:"CHARGE"` // 手续费
  367. }
  368. // QueryTradeDetail 成交单查询(合约市场)
  369. // @Summary 成交单查询(合约市场)
  370. // @Produce json
  371. // @Security ApiKeyAuth
  372. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  373. // @Param tradeID query int false "成交单号"
  374. // @Param orderID query int false "委托单号"
  375. // @Param tradeMode query string false "交易模式 - 格式:1,2,3"
  376. // @Param buildType query int false "委托单据类型"
  377. // @Param tradeType query string false "成交类别 - 格式:1,2,3"
  378. // @Success 200 {object} QueryTradeDetailRsp
  379. // @Failure 500 {object} app.Response
  380. // @Router /Order/QueryTradeDetail [get]
  381. // @Tags 通用单据
  382. // 参考通用查询:SearchAllTransactionDetailOrder
  383. func QueryTradeDetail(c *gin.Context) {
  384. appG := app.Gin{C: c}
  385. // 获取请求参数
  386. var req QueryTradeDetailReq
  387. if err := appG.C.ShouldBindQuery(&req); err != nil {
  388. logger.GetLogger().Errorf("QueryTradeDetail failed: %s", err.Error())
  389. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  390. return
  391. }
  392. datas := make([]QueryTradeDetailRsp, 0)
  393. engine := db.GetEngine()
  394. s := engine.Table("TRADE_TRADEDETAIL").
  395. Join("LEFT", "GOODS", "GOODS.GOODSID = TRADE_TRADEDETAIL.GOODSID").
  396. Join("LEFT", "MARKET", "MARKET.MARKETID = TRADE_TRADEDETAIL.MARKETID").
  397. Join("LEFT", "TRADE_ORDERDETAIL", "TRADE_ORDERDETAIL.ORDERID = TRADE_TRADEDETAIL.ORDERID").
  398. Select(`to_char(TRADE_TRADEDETAIL.TRADEID) as TRADEID, to_char(TRADE_TRADEDETAIL.ORDERID) as ORDERID,
  399. TRADE_TRADEDETAIL.*, CASE TRADE_TRADEDETAIL.BUILDTYPE WHEN 1 THEN TRADE_TRADEDETAIL.OPENCHARGE ELSE TRADE_TRADEDETAIL.CLOSECHARGE END as CHARGE,
  400. GOODS.GOODSCODE, GOODS.GOODSNAME, MARKET.MARKETNAME, MARKET.TRADEMODE,
  401. TRADE_ORDERDETAIL.LISTINGSELECTTYPE`).
  402. Where(fmt.Sprintf("TRADE_TRADEDETAIL.ACCOUNTID in (%s)", req.AccountID)).
  403. Desc("TRADE_TRADEDETAIL.TRADETIME")
  404. if req.TradeID > 0 {
  405. s = s.And("TRADE_TRADEDETAIL.TRADEID = ?", req.TradeID)
  406. }
  407. if req.OrderID > 0 {
  408. s = s.And("TRADE_TRADEDETAIL.ORDERID = ?", req.OrderID)
  409. }
  410. if len(req.TradeMode) > 0 {
  411. s = s.And(fmt.Sprintf("MARKET.TRADEMODE in (%s)", req.TradeMode))
  412. }
  413. if req.BuildType > 0 {
  414. s = s.And("TRADE_TRADEDETAIL.BUILDTYPE = ?", req.BuildType)
  415. }
  416. if len(req.TradeType) > 0 {
  417. s = s.And(fmt.Sprintf("TRADE_TRADEDETAIL.TRADETYPE in (%s)", req.TradeType))
  418. }
  419. if err := s.Find(&datas); err != nil {
  420. // 查询失败
  421. logger.GetLogger().Errorf("QueryTradeDetail failed: %s", err.Error())
  422. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  423. return
  424. }
  425. // 查询成功
  426. logger.GetLogger().Infof("QueryTradeDetail successed: %v", datas)
  427. appG.Response(http.StatusOK, e.SUCCESS, datas)
  428. }
  429. // QueryHisTradeDetailReq 历史成交单查询请求参数
  430. type QueryHisTradeDetailReq struct {
  431. AccountID string `form:"accountID" binding:"required"`
  432. TradeID int `form:"tradeID"`
  433. OrderID int `form:"orderID"`
  434. TradeMode string `form:"tradeMode"`
  435. BuildType int `form:"buildType"`
  436. TradeType string `form:"tradeType"`
  437. StartDate string `form:"startDate"` // 开始时间
  438. EndDate string `form:"endDate"` // 结束时间
  439. }
  440. // QueryHisTradeDetailRsp 历史成交单查询返回模型
  441. type QueryHisTradeDetailRsp struct {
  442. models.Histradetradedetail `xorm:"extends"`
  443. GoodsCode string `json:"goodscode" xorm:"GOODSCODE"` // 商品代码
  444. GoodsName string `json:"goodsname" xorm:"GOODSNAME"` // 商品名称
  445. Marketname string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
  446. TradeMode uint32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式
  447. ListingSelectType uint32 `json:"listingselecttype" xorm:"'LISTINGSELECTTYPE'"` // 关联委托单挂牌点选类型 - 1:挂牌 2:摘牌 3:先摘后挂
  448. Charge float64 `json:"charge" xorm:"CHARGE"` // 手续费
  449. }
  450. // QueryHisTradeDetail 历史成交单查询(合约市场)
  451. // @Summary 历史成交单查询(合约市场)
  452. // @Produce json
  453. // @Security ApiKeyAuth
  454. // @Param accountID query string true "资金账户 - 格式:1,2,3"
  455. // @Param tradeID query int false "成交单号"
  456. // @Param orderID query int false "委托单号"
  457. // @Param tradeMode query string false "交易模式 - 格式:1,2,3"
  458. // @Param buildType query int false "委托单据类型"
  459. // @Param tradeType query string false "成交类别 - 格式:1,2,3"
  460. // @Param startDate query string false "开始时间 - 闭区间,格式:yyyy-MM-dd"
  461. // @Param endDate query string false "结束时间 - 闭区间,格式:yyyy-MM-dd"
  462. // @Success 200 {object} QueryHisTradeDetailRsp
  463. // @Failure 500 {object} app.Response
  464. // @Router /Order/QueryHisTradeDetail [get]
  465. // @Tags 通用单据
  466. // 参考通用查询:Client_QueryHis_trade_transactiondetail
  467. func QueryHisTradeDetail(c *gin.Context) {
  468. appG := app.Gin{C: c}
  469. // 获取请求参数
  470. var req QueryHisTradeDetailReq
  471. if err := appG.C.ShouldBindQuery(&req); err != nil {
  472. logger.GetLogger().Errorf("QueryHisTradeDetail failed: %s", err.Error())
  473. appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
  474. return
  475. }
  476. datas := make([]QueryHisTradeDetailRsp, 0)
  477. engine := db.GetEngine()
  478. s := engine.Table("HIS_TRADE_TRADEDETAIL").
  479. Join("LEFT", "GOODS", "GOODS.GOODSID = HIS_TRADE_TRADEDETAIL.GOODSID").
  480. Join("LEFT", "MARKET", "MARKET.MARKETID = HIS_TRADE_TRADEDETAIL.MARKETID").
  481. Join("LEFT", "HIS_TRADE_ORDERDETAIL", "HIS_TRADE_ORDERDETAIL.ORDERID = HIS_TRADE_TRADEDETAIL.ORDERID").
  482. Select(`to_char(HIS_TRADE_TRADEDETAIL.TRADEID) as TRADEID, to_char(HIS_TRADE_TRADEDETAIL.ORDERID) as ORDERID,
  483. HIS_TRADE_TRADEDETAIL.*, CASE HIS_TRADE_TRADEDETAIL.BUILDTYPE WHEN 1 THEN HIS_TRADE_TRADEDETAIL.OPENCHARGE ELSE HIS_TRADE_TRADEDETAIL.CLOSECHARGE END as CHARGE,
  484. GOODS.GOODSCODE, GOODS.GOODSNAME, MARKET.MARKETNAME, MARKET.TRADEMODE,
  485. HIS_TRADE_ORDERDETAIL.LISTINGSELECTTYPE`).
  486. Where(fmt.Sprintf("HIS_TRADE_TRADEDETAIL.ISVALIDDATA = 1 and HIS_TRADE_TRADEDETAIL.ACCOUNTID in (%s)", req.AccountID)).
  487. Desc("HIS_TRADE_TRADEDETAIL.TRADETIME")
  488. if req.TradeID > 0 {
  489. s = s.And("HIS_TRADE_TRADEDETAIL.TRADEID = ?", req.TradeID)
  490. }
  491. if req.OrderID > 0 {
  492. s = s.And("HIS_TRADE_TRADEDETAIL.ORDERID = ?", req.OrderID)
  493. }
  494. if len(req.TradeMode) > 0 {
  495. s = s.And(fmt.Sprintf("MARKET.TRADEMODE in (%s)", req.TradeMode))
  496. }
  497. if req.BuildType > 0 {
  498. s = s.And("HIS_TRADE_TRADEDETAIL.BUILDTYPE = ?", req.BuildType)
  499. }
  500. if len(req.TradeType) > 0 {
  501. s = s.And(fmt.Sprintf("HIS_TRADE_TRADEDETAIL.TRADETYPE in (%s)", req.TradeType))
  502. }
  503. if len(req.StartDate) > 0 {
  504. s = s.And(fmt.Sprintf("to_date(HIS_TRADE_TRADEDETAIL.HISTRADEDATE,'yyyyMMdd') >= to_date('%s','yyyy-MM-dd')", req.StartDate))
  505. }
  506. if len(req.EndDate) > 0 {
  507. s = s.And(fmt.Sprintf("to_date(HIS_TRADE_TRADEDETAIL.HISTRADEDATE,'yyyyMMdd') <= to_date('%s','yyyy-MM-dd')", req.EndDate))
  508. }
  509. if err := s.Find(&datas); err != nil {
  510. // 查询失败
  511. logger.GetLogger().Errorf("QueryHisTradeDetail failed: %s", err.Error())
  512. appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
  513. return
  514. }
  515. // 查询成功
  516. logger.GetLogger().Infof("QueryHisTradeDetail successed: %v", datas)
  517. appG.Response(http.StatusOK, e.SUCCESS, datas)
  518. }