|
|
@@ -0,0 +1,197 @@
|
|
|
+package trade
|
|
|
+
|
|
|
+import (
|
|
|
+ "mtp2_if/db"
|
|
|
+ "mtp2_if/global/app"
|
|
|
+ "mtp2_if/global/e"
|
|
|
+ "mtp2_if/logger"
|
|
|
+ "net/http"
|
|
|
+ "sort"
|
|
|
+ "time"
|
|
|
+
|
|
|
+ "github.com/gin-gonic/gin"
|
|
|
+)
|
|
|
+
|
|
|
+// QueryRecieptOrderReq 点选挂牌委托单据查询参数
|
|
|
+type QueryRecieptOrderReq struct {
|
|
|
+ app.PageInfo
|
|
|
+ GoodsID int `form:"goodsID" binding:"required"` // 商品ID,必填
|
|
|
+ BuyOrSell int `form:"buyorsell"` // 方向
|
|
|
+ AccountName string `form:"accountName"` // 所属账户名称
|
|
|
+ MarketID int `form:"marketID"` // 市场ID
|
|
|
+}
|
|
|
+
|
|
|
+// QueryRecieptOrderRsp 点选挂牌委托单据查询返回模型
|
|
|
+type QueryRecieptOrderRsp struct {
|
|
|
+ Goodsid int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID
|
|
|
+ Goodscode string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码
|
|
|
+ Goodsname string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
|
|
|
+ Buyorsell uint32 `json:"buyorsell" xorm:"'BUYORSELL'"` // 方向 - 0:买 1:卖
|
|
|
+ Orderid string `json:"orderid" xorm:"'ORDERID'"` // 委托单号
|
|
|
+ Tradedate string `json:"tradedate" xorm:"'TRADEDATE'"` // 交易日(yyyyMMdd)
|
|
|
+ Orderprice float64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格
|
|
|
+ EnableQty int64 `json:"enableqty" xorm:"ENABLEQTY"` // 可摘数量
|
|
|
+ AccountName string `json:"accountName" xorm:"ACCOUNTNAME"` // 所属账号名称(已脱敏)
|
|
|
+ AccountID int64 `json:"accountid" xorm:"ACCOUNTID"` // 资金账号
|
|
|
+ Ordertime time.Time `json:"ordertime" xorm:"'ORDERTIME'" binding:"required"` // 委托时间
|
|
|
+}
|
|
|
+
|
|
|
+// QueryRecieptOrder 点选挂牌委托单据查询(保证金摘牌大厅)
|
|
|
+// @Summary 点选挂牌委托单据查询(保证金摘牌大厅)
|
|
|
+// @Description 说明:pagesize参数赋值不为0时表示需要分页;page参数从0开始计算
|
|
|
+// @Produce json
|
|
|
+// @Security ApiKeyAuth
|
|
|
+// @Param page query int false "页码"
|
|
|
+// @Param pagesize query int false "每页条数"
|
|
|
+// @Param goodsID query int true "商品ID"
|
|
|
+// @Param accountName query string false "所属账户名称"
|
|
|
+// @Param marketID query int false "市场ID"
|
|
|
+// @Param buyorsell query int true "方向 - 0:买 1:卖"
|
|
|
+// @Success 200 {object} QueryRecieptOrderRsp
|
|
|
+// @Failure 500 {object} app.Response
|
|
|
+// @Router /Trade/QueryRecieptOrder [get]
|
|
|
+// @Tags 通用交易
|
|
|
+// 参考通用查询:Client_SZDZ3_SearchRecieptOrder
|
|
|
+func QueryRecieptOrder(c *gin.Context) {
|
|
|
+ appG := app.Gin{C: c}
|
|
|
+
|
|
|
+ // 获取请求参数
|
|
|
+ var req QueryRecieptOrderReq
|
|
|
+ if err := appG.C.ShouldBindQuery(&req); err != nil {
|
|
|
+ logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
|
|
|
+ appG.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ datas := make([]QueryRecieptOrderRsp, 0)
|
|
|
+ engine := db.GetEngine()
|
|
|
+
|
|
|
+ // 投资者挂牌委托单
|
|
|
+ s := engine.Table("TRADE_ORDERDETAIL").
|
|
|
+ Join("INNER", "GOODS", "TRADE_ORDERDETAIL.GOODSID = GOODS.GOODSID").
|
|
|
+ Join("LEFT", "TAACCOUNT", "TAACCOUNT.ACCOUNTID = TRADE_ORDERDETAIL.ACCOUNTID").
|
|
|
+ Join("LEFT", "USERACCOUNT", "USERACCOUNT.USERID = TAACCOUNT.RELATEDUSERID").
|
|
|
+ Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME,
|
|
|
+ TRADE_ORDERDETAIL.BUYORSELL, to_char(TRADE_ORDERDETAIL.ORDERID) as ORDERID, TRADE_ORDERDETAIL.TRADEDATE, TRADE_ORDERDETAIL.ORDERPRICE,
|
|
|
+ TRADE_ORDERDETAIL.ORDERQTY - TRADE_ORDERDETAIL.TRADEQTY - TRADE_ORDERDETAIL.CANCELQTY as ENABLEQTY,
|
|
|
+ (case when USERACCOUNT.ISANONYMOUS = 0 then to_char(USERACCOUNT.ACCOUNTNAME) else '*****' end) ACCOUNTNAME`).
|
|
|
+ Where("TRADE_ORDERDETAIL.ORDERSTATUS in (3,7,12) and GOODS.GOODSID = ?", req.GoodsID)
|
|
|
+ if len(req.AccountName) > 0 {
|
|
|
+ s = s.And("USERACCOUNT.ACCOUNTNAME = ?", req.AccountName)
|
|
|
+ }
|
|
|
+ if req.MarketID > 0 {
|
|
|
+ s = s.And("TRADE_ORDERDETAIL.MARKETID = ?", req.MarketID)
|
|
|
+ }
|
|
|
+ if req.BuyOrSell > -1 {
|
|
|
+ s = s.And("TRADE_ORDERDETAIL.BUYORSELL = ?", req.BuyOrSell)
|
|
|
+ }
|
|
|
+ // 判断是否要分页
|
|
|
+ // 这样分页会报错
|
|
|
+ // if req.Size > 0 {
|
|
|
+ // s = s.Limit(req.Size, req.Page*req.Size)
|
|
|
+ // }
|
|
|
+ d1 := make([]QueryRecieptOrderRsp, 0)
|
|
|
+ if err := s.Find(&d1); err != nil {
|
|
|
+ // 查询失败
|
|
|
+ logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
|
|
|
+ appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ datas = append(datas, d1...)
|
|
|
+
|
|
|
+ // 报价商挂牌委托
|
|
|
+ s = engine.Table("TRADE_QUOTEDETAILNEW").
|
|
|
+ Join("INNER", "GOODS", "TRADE_QUOTEDETAILNEW.GOODSID = GOODS.GOODSID").
|
|
|
+ Join("INNER", "QUOTER", "QUOTER.QUOTERID = TRADE_QUOTEDETAILNEW.QUOTERID").
|
|
|
+ Join("INNER", "AREAROLE", "AREAROLE.USERID = QUOTER.DEFAULTMAKERID and AREAROLE.ROLETYPE = 8").
|
|
|
+ Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME,
|
|
|
+ TRADE_QUOTEDETAILNEW.BUYORSELL, to_char(TRADE_QUOTEDETAILNEW.ORDERID) as ORDERID, TRADE_QUOTEDETAILNEW.TRADEDATE, TRADE_QUOTEDETAILNEW.PRICE as ORDERPRICE,
|
|
|
+ TRADE_QUOTEDETAILNEW.CURQTY as ENABLEQTY,
|
|
|
+ substr(QUOTER.QUOTERNAME,0,1)||'****' as ACCOUNTNAME`).
|
|
|
+ Where("(TRADE_QUOTEDETAILNEW.CURQTY > 0 or TRADE_QUOTEDETAILNEW.PRICE > 0) and TRADE_QUOTEDETAILNEW.ISVALID != 1 and TRADE_QUOTEDETAILNEW.FREEZESTATUS != 3")
|
|
|
+ d2 := make([]QueryRecieptOrderRsp, 0)
|
|
|
+ if err := s.Find(&d2); err != nil {
|
|
|
+ // 查询失败
|
|
|
+ logger.GetLogger().Errorf("QueryRecieptOrder failed: %s", err.Error())
|
|
|
+ appG.Response(http.StatusBadRequest, e.ERROR_QUERY_FAIL, nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ datas = append(datas, d2...)
|
|
|
+
|
|
|
+ // 过滤相关账号下非买一卖一的单据(如买一卖一有多张单则都要显示)
|
|
|
+ if req.BuyOrSell == 0 {
|
|
|
+ // 买,先按价格倒序排列
|
|
|
+ sort.Slice(datas, func(i int, j int) bool {
|
|
|
+ if datas[i].Orderprice == datas[j].Orderprice {
|
|
|
+ return datas[i].Ordertime.Before(datas[j].Ordertime)
|
|
|
+ }
|
|
|
+ return datas[i].Orderprice > datas[j].Orderprice
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ // 卖,先按价格顺序排列
|
|
|
+ sort.Slice(datas, func(i int, j int) bool {
|
|
|
+ if datas[i].Orderprice == datas[j].Orderprice {
|
|
|
+ return datas[i].Ordertime.Before(datas[j].Ordertime)
|
|
|
+ }
|
|
|
+ return datas[i].Orderprice < datas[j].Orderprice
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // tmpDatas := make([]QueryRecieptOrderRsp, 0)
|
|
|
+ // for _, v := range datas {
|
|
|
+ // needAdd := true
|
|
|
+ // for _, t := range tmpDatas {
|
|
|
+ // if req.BuyOrSell == 0 {
|
|
|
+ // // 买
|
|
|
+ // if t.AccountID == v.AccountID && t.Buyorsell == v.Buyorsell && t.Orderprice > v.Orderprice {
|
|
|
+ // needAdd = false
|
|
|
+ // }
|
|
|
+ // } else {
|
|
|
+ // // 卖
|
|
|
+ // if t.AccountID == v.AccountID && t.Buyorsell == v.Buyorsell && t.Orderprice < v.Orderprice {
|
|
|
+ // needAdd = false
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // if needAdd {
|
|
|
+ // tmpDatas = append(tmpDatas, v)
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // datas = tmpDatas
|
|
|
+
|
|
|
+ total := len(datas)
|
|
|
+ // FIXME: - 排序 & 分页
|
|
|
+ // 排序
|
|
|
+ sort.Slice(datas, func(i int, j int) bool {
|
|
|
+ return datas[i].Tradedate > datas[j].Tradedate
|
|
|
+ })
|
|
|
+ // 分页
|
|
|
+ if req.PageSize > 0 {
|
|
|
+ // 开始上标
|
|
|
+ start := req.Page * req.PageSize
|
|
|
+ // 结束下标
|
|
|
+ // a := []int{1,2,3,4,5}
|
|
|
+ // a[2:4] -> [3 4]
|
|
|
+ end := start + req.PageSize
|
|
|
+
|
|
|
+ if start <= len(datas) {
|
|
|
+ // 判断结束下标是否越界
|
|
|
+ if end > len(datas) {
|
|
|
+ end = len(datas)
|
|
|
+ }
|
|
|
+ datas = datas[start:end]
|
|
|
+ } else {
|
|
|
+ datas = make([]QueryRecieptOrderRsp, 0)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 查询成功返回
|
|
|
+ logger.GetLogger().Debugln("QueryRecieptOrder successed: %v", datas)
|
|
|
+ if req.PageSize > 0 {
|
|
|
+ // 分页
|
|
|
+ appG.ResponseByPage(http.StatusOK, e.SUCCESS, datas, app.PageInfo{Page: req.Page, PageSize: req.PageSize, Total: total})
|
|
|
+ } else {
|
|
|
+ // 不分页
|
|
|
+ appG.Response(http.StatusOK, e.SUCCESS, datas)
|
|
|
+ }
|
|
|
+}
|