Ver Fonte

修改“查询二级市场(挂牌点选)商品对应的挂牌委托单信息”接口

zhou.xiaoning há 5 anos atrás
pai
commit
e7636d26da
5 ficheiros alterados com 178 adições e 72 exclusões
  1. 36 36
      controllers/hsby/hsby.go
  2. 14 2
      docs/docs.go
  3. 14 2
      docs/swagger.json
  4. 10 2
      docs/swagger.yaml
  5. 104 30
      models/hsby.go

+ 36 - 36
controllers/hsby/hsby.go

@@ -131,8 +131,10 @@ func QueryHsbyListingGoodsDetail(c *gin.Context) {
 
 // QueryHsbyGoodsOrderDetailsReq 查询二级市场(挂牌点选)商品对应的挂牌委托单信息请求参数
 type QueryHsbyGoodsOrderDetailsReq struct {
-	GoodsID int `form:"goodsID" binding:"required"`
-	Number  int `form:"number"`
+	GoodsID   int     `form:"goodsID" binding:"required"`
+	BuyOrSell int     `form:"buyOrSell"`
+	Price     float64 `form:"price"`
+	Speed     int     `form:"speed"`
 }
 
 // QueryHsbyGoodsOrderDetails 查询二级市场(挂牌点选)商品对应的挂牌委托单信息
@@ -141,7 +143,9 @@ type QueryHsbyGoodsOrderDetailsReq struct {
 // @Produce json
 // @Security ApiKeyAuth
 // @Param goodsID query int true "商品ID"
-// @Param Number query int false "档位,不传则默认为3档"
+// @Param buyOrSell query int false "委托单方向。0:买 1:卖。不传则默认为买"
+// @Param price query number false " 参考价格。买方向委托单则价格大于等于(站在摘牌人的角度);卖方向委托单则价格小于等于"
+// @Param speed query int false "档位,不传则默认为3档"
 // @Success 200 {object} models.HsbyGoodsOrderDetail
 // @Failure 500 {object} app.Response
 // @Router /HSBY/QueryHsbyGoodsOrderDetails [get]
@@ -158,7 +162,7 @@ func QueryHsbyGoodsOrderDetails(c *gin.Context) {
 	}
 
 	// 获取数据
-	sellOrderDetails, buyOrderDetails, err := models.GetHsbyGoodsOrderDetails(req.GoodsID)
+	orderDetails, err := models.GetHsbyGoodsOrderDetails(req.GoodsID, req.BuyOrSell, req.Price)
 	if err != nil {
 		// 查询失败
 		logger.GetLogger().Errorf("QueryHsbyGoodsOrderDetails failed: %s", err.Error())
@@ -167,47 +171,43 @@ func QueryHsbyGoodsOrderDetails(c *gin.Context) {
 	}
 
 	// 按时间和价格排序
-	sort.Slice(sellOrderDetails, func(i int, j int) bool {
-		// 委托价格一样则按时间顺序排
-		if sellOrderDetails[i].Orderprice == sellOrderDetails[j].Orderprice {
-			return sellOrderDetails[i].Ordertime.Before(sellOrderDetails[j].Ordertime)
-		}
+	if req.BuyOrSell == 0 {
+		// 买方向
+		sort.Slice(orderDetails, func(i int, j int) bool {
+			// 委托价格一样则按时间顺序排
+			if orderDetails[i].Orderprice == orderDetails[j].Orderprice {
+				return orderDetails[i].Ordertime.Before(orderDetails[j].Ordertime)
+			}
 
-		return sellOrderDetails[i].Orderprice < sellOrderDetails[j].Orderprice
-	})
-	sort.Slice(buyOrderDetails, func(i int, j int) bool {
-		// 委托价格一样则按时间顺序排
-		if buyOrderDetails[i].Orderprice == buyOrderDetails[j].Orderprice {
-			return buyOrderDetails[i].Ordertime.Before(buyOrderDetails[j].Ordertime)
-		}
+			// 站在摘牌者的角度,买方向的委托单价格高的在前面
+			return orderDetails[i].Orderprice > orderDetails[j].Orderprice
+		})
+	} else {
+		// 卖方向
+		sort.Slice(orderDetails, func(i int, j int) bool {
+			// 委托价格一样则按时间顺序排
+			if orderDetails[i].Orderprice == orderDetails[j].Orderprice {
+				return orderDetails[i].Ordertime.Before(orderDetails[j].Ordertime)
+			}
 
-		return buyOrderDetails[i].Orderprice > buyOrderDetails[j].Orderprice
-	})
+			return orderDetails[i].Orderprice < orderDetails[j].Orderprice
+		})
+	}
 
 	// 取N档,默认3档
-	if req.Number == 0 {
-		req.Number = 3
+	if req.Speed == 0 {
+		req.Speed = 3
 	}
 	// 判断结束下标是否越界
-	sellEnd := req.Number
-	if req.Number > len(sellOrderDetails) {
-		sellEnd = len(sellOrderDetails)
+	end := req.Speed
+	if req.Speed > len(orderDetails) {
+		end = len(orderDetails)
 	}
-	sellOrderDetails = sellOrderDetails[0:sellEnd]
-	buyEnd := req.Number
-	if req.Number > len(buyOrderDetails) {
-		buyEnd = len(buyOrderDetails)
-	}
-	buyOrderDetails = buyOrderDetails[0:buyEnd]
-
-	// 结果集
-	rst := make(map[string]interface{})
-	rst["sellOrderDetails"] = sellOrderDetails
-	rst["buyOrderDetails"] = buyOrderDetails
+	orderDetails = orderDetails[0:end]
 
 	// 查询成功返回
-	logger.GetLogger().Debugln("QueryHsbyGoodsOrderDetails successed: %v", rst)
-	appG.Response(http.StatusOK, e.SUCCESS, rst)
+	logger.GetLogger().Debugln("QueryHsbyGoodsOrderDetails successed: %v", orderDetails)
+	appG.Response(http.StatusOK, e.SUCCESS, orderDetails)
 }
 
 // QueryHsbyMyBuyOrderDetailsReq 查询“我的订单”信息请求参数

+ 14 - 2
docs/docs.go

@@ -781,8 +781,20 @@ var doc = `{
                     },
                     {
                         "type": "integer",
+                        "description": "委托单方向。0:买 1:卖。不传则默认为买",
+                        "name": "buyOrSell",
+                        "in": "query"
+                    },
+                    {
+                        "type": "number",
+                        "description": " 参考价格。买方向委托单则价格大于等于(站在摘牌人的角度);卖方向委托单则价格小于等于",
+                        "name": "price",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
                         "description": "档位,不传则默认为3档",
-                        "name": "Number",
+                        "name": "speed",
                         "in": "query"
                     }
                 ],
@@ -3887,7 +3899,7 @@ var doc = `{
                     "type": "string"
                 },
                 "goodsstatus": {
-                    "description": "商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市",
+                    "description": "商品状态- 2:未上市 3:上市",
                     "type": "integer"
                 },
                 "marketid": {

+ 14 - 2
docs/swagger.json

@@ -765,8 +765,20 @@
                     },
                     {
                         "type": "integer",
+                        "description": "委托单方向。0:买 1:卖。不传则默认为买",
+                        "name": "buyOrSell",
+                        "in": "query"
+                    },
+                    {
+                        "type": "number",
+                        "description": " 参考价格。买方向委托单则价格大于等于(站在摘牌人的角度);卖方向委托单则价格小于等于",
+                        "name": "price",
+                        "in": "query"
+                    },
+                    {
+                        "type": "integer",
                         "description": "档位,不传则默认为3档",
-                        "name": "Number",
+                        "name": "speed",
                         "in": "query"
                     }
                 ],
@@ -3871,7 +3883,7 @@
                     "type": "string"
                 },
                 "goodsstatus": {
-                    "description": "商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市",
+                    "description": "商品状态- 2:未上市 3:上市",
                     "type": "integer"
                 },
                 "marketid": {

+ 10 - 2
docs/swagger.yaml

@@ -1400,7 +1400,7 @@ definitions:
         description: 商品名称
         type: string
       goodsstatus:
-        description: 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市
+        description: 商品状态- 2:未上市 3:上市
         type: integer
       marketid:
         description: 所属市场ID
@@ -3712,9 +3712,17 @@ paths:
         name: goodsID
         required: true
         type: integer
+      - description: 委托单方向。0:买 1:卖。不传则默认为买
+        in: query
+        name: buyOrSell
+        type: integer
+      - description: ' 参考价格。买方向委托单则价格大于等于(站在摘牌人的角度);卖方向委托单则价格小于等于'
+        in: query
+        name: price
+        type: number
       - description: 档位,不传则默认为3档
         in: query
-        name: Number
+        name: speed
         type: integer
       produces:
       - application/json

+ 104 - 30
models/hsby.go

@@ -220,40 +220,45 @@ type HsbyGoodsOrderDetail struct {
 }
 
 // GetHsbyGoodsOrderDetails 获取二级市场(挂牌点选)商品对应的挂牌委托单信息
-// 参数 goodsID int 商品ID
-// 返回 []HsbyGoodsOrderDetail 转让(卖出)挂牌委托单
-// 返回 []HsbyGoodsOrderDetail 求购(买入)挂牌委托单
-// 返回 error error
-func GetHsbyGoodsOrderDetails(goodsID int) ([]HsbyGoodsOrderDetail, []HsbyGoodsOrderDetail, error) {
+// 输入 goodsID int 商品ID
+// 输入 buyOrSell int 委托单方向,0:买 1:卖
+// 输入 price float64 参考价格。买方向委托单则价格大于等于(站在摘牌人的角度);卖方向委托单则价格小于等于
+// 输出 []HsbyGoodsOrderDetail 商品对应的挂牌委托单信息
+// 输出 error error
+func GetHsbyGoodsOrderDetails(goodsID, buyOrSell int, price float64) ([]HsbyGoodsOrderDetail, error) {
 	engine := db.GetEngine()
 
 	// 获取与目标商品相关的挂牌委托单信息(ListingSelectType = 1 or 3; OrderStatus =3 or 7)
 	hsbyGoodsOrderDetails := make([]HsbyGoodsOrderDetail, 0)
-	if err := engine.Table("TRADE_ORDERDETAIL").
+	session := engine.Table("TRADE_ORDERDETAIL").
 		Select(`TRADE_ORDERDETAIL.ORDERID, TRADE_ORDERDETAIL.BUYORSELL, TRADE_ORDERDETAIL.ORDERTIME, TRADE_ORDERDETAIL.ORDERPRICE, (TRADE_ORDERDETAIL.ORDERQTY - TRADE_ORDERDETAIL.TRADEQTY - TRADE_ORDERDETAIL.CANCELQTY) ENABLEQTY,
-				substr(USERINFO.CUSTOMERNAME,0,1)||'****' as CUSTOMERNAME`).
+			substr(USERINFO.CUSTOMERNAME,0,1)||'****' as CUSTOMERNAME`).
 		Join("LEFT", "TAACCOUNT", "TAACCOUNT.ACCOUNTID = TRADE_ORDERDETAIL.ACCOUNTID").
 		Join("LEFT", "USERINFO", "USERINFO.USERID = TAACCOUNT.RELATEDUSERID").
 		Where("(TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 1 or TRADE_ORDERDETAIL.LISTINGSELECTTYPE = 3) and (TRADE_ORDERDETAIL.ORDERSTATUS = 3 or TRADE_ORDERDETAIL.ORDERSTATUS = 7)").
-		And("TRADE_ORDERDETAIL.GOODSID = ?", goodsID).Find(&hsbyGoodsOrderDetails); err != nil {
-		return nil, nil, err
+		And("TRADE_ORDERDETAIL.GOODSID = ?", goodsID).
+		And("TRADE_ORDERDETAIL.BUYORSELL = ?", buyOrSell)
+	if price > 0 {
+		if buyOrSell == 0 {
+			// 买方向委托单则价格大于等于(站在摘牌人的角度)
+			session = session.And("TRADE_ORDERDETAIL.ORDERPRICE >= ?", price)
+		} else {
+			// 卖方向委托单则价格小于等于
+			session = session.And("TRADE_ORDERDETAIL.ORDERPRICE <= ?", price)
+		}
 	}
-
-	sellOrderDetails := make([]HsbyGoodsOrderDetail, 0)
-	buyOrderDetails := make([]HsbyGoodsOrderDetail, 0)
-	if len(hsbyGoodsOrderDetails) == 0 {
-		// 无数据
-		return sellOrderDetails, buyOrderDetails, nil
+	if err := session.Find(&hsbyGoodsOrderDetails); err != nil {
+		return nil, err
 	}
 
 	// 获取商品货币符号和报价单位
 	goods, err := GetGoods(goodsID)
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	currencyEnums, err := GetEnumDicItem("currency", int(goods.Currencyid))
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	currencysign := ""
 	if len(currencyEnums) > 0 {
@@ -261,7 +266,7 @@ func GetHsbyGoodsOrderDetails(goodsID int) ([]HsbyGoodsOrderDetail, []HsbyGoodsO
 	}
 	goodsUnitEnums, err := GetEnumDicItem("goodsunit", int(goods.Goodunitid))
 	if err != nil {
-		return nil, nil, err
+		return nil, err
 	}
 	goodsUnit := ""
 	if len(goodsUnitEnums) > 0 {
@@ -274,17 +279,9 @@ func GetHsbyGoodsOrderDetails(goodsID int) ([]HsbyGoodsOrderDetail, []HsbyGoodsO
 		// 设置货币符号和报价单位
 		orderDetail.Currencysign = currencysign
 		orderDetail.Goodunit = goodsUnit
-
-		// 分解转让(卖)和求购(买)单
-		if orderDetail.Buyorsell == 1 {
-			sellOrderDetails = append(sellOrderDetails, *orderDetail)
-		}
-		if orderDetail.Buyorsell == 0 {
-			buyOrderDetails = append(buyOrderDetails, *orderDetail)
-		}
 	}
 
-	return sellOrderDetails, buyOrderDetails, nil
+	return hsbyGoodsOrderDetails, nil
 }
 
 // HybsMyBuyOrderDetail 我的订单(一二级市场的买方向委托单)
@@ -440,7 +437,7 @@ func GetHsbyMyGoods(accountIDs string) ([]HsbyMyGoods, error) {
 				HSBY_GOODSEX.PICURLS, 
 				ENUMDICITEM.PARAM2 CURRENCYSIGN`).
 		Join("LEFT", "GOODS", "GOODS.GOODSID = TRADEPOSITION.GOODSID").
-		Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
+		Join("INNER", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
 		Join("LEFT", "ENUMDICITEM", "GOODS.CURRENCYID = ENUMDICITEM.ENUMITEMNAME and ENUMDICITEM.ENUMDICCODE = 'currency'").
 		Where(fmt.Sprintf("TRADEPOSITION.ACCOUNTID in (%s)", accountIDs)).Find(&hsbyMyGoodses); err != nil {
 		return nil, err
@@ -464,7 +461,7 @@ type HsbyPreGoods struct {
 	Goodsname    string `json:"goodsname"  xorm:"'GOODSNAME'" binding:"required"` // 商品名称
 	Decimalplace int64  `json:"decimalplace"  xorm:"'DECIMALPLACE'"`              // 报价小数位
 	Marketid     int64  `json:"marketid"  xorm:"'MARKETID'" binding:"required"`   // 所属市场ID
-	Goodsstatus  int64  `json:"goodsstatus"  xorm:"'GOODSSTATUS'"`                // 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市
+	Goodsstatus  int64  `json:"goodsstatus"  xorm:"'GOODSSTATUS'"`                // 商品状态- 2:未上市 3:上市
 
 	Relatedgoodsid int64     `json:"relatedgoodsid"  xorm:"'RELATEDGOODSID'"` // 关联交易合约ID
 	Presaleqty     int64     `json:"presaleqty"  xorm:"'PRESALEQTY'"`         // 预售数量
@@ -496,7 +493,7 @@ func GetHsbyPreGoodses(marketIDs string, descProvinceID, descCityID int) ([]Hsby
 				CPTRADE_PRESALEGOODSEX.STARTTIME, CPTRADE_PRESALEGOODSEX.ENDTIME, CPTRADE_PRESALEGOODSEX.REFPRICE, 
 				ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN, 
 				HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS`).
-		Join("LEFT", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = GOODS.GOODSID").
+		Join("INNER", "CPTRADE_PRESALEGOODSEX", "CPTRADE_PRESALEGOODSEX.GOODSID = GOODS.GOODSID").
 		Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
 		Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = CPTRADE_PRESALEGOODSEX.RELATEDGOODSID").
 		Where(fmt.Sprintf("GOODS.GOODSSTATUS in (2,3) and GOODS.MARKETID in (%s)", marketIDs)) // 一级市场获取 2:未上市 3:上市 状态的商品
@@ -512,3 +509,80 @@ func GetHsbyPreGoodses(marketIDs string, descProvinceID, descCityID int) ([]Hsby
 
 	return preGoodses, nil
 }
+
+// HsbyPreGoodsDetail 一级市场(产能预售)商品信息详情
+type HsbyPreGoodsDetail struct {
+	Goodsid      int64  `json:"goodsid"  xorm:"'GOODSID'" binding:"required"`     // 商品ID(自增ID SEQ_GOODS)
+	Goodscode    string `json:"goodscode"  xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
+	Goodsname    string `json:"goodsname"  xorm:"'GOODSNAME'" binding:"required"` // 商品名称
+	Decimalplace int64  `json:"decimalplace"  xorm:"'DECIMALPLACE'"`              // 报价小数位
+	Marketid     int64  `json:"marketid"  xorm:"'MARKETID'" binding:"required"`   // 所属市场ID
+	Goodsstatus  int64  `json:"goodsstatus"  xorm:"'GOODSSTATUS'"`                // 商品状态- 2:未上市 3:上市
+
+	Relatedgoodsid int64     `json:"relatedgoodsid"  xorm:"'RELATEDGOODSID'"` // 关联交易合约ID
+	Presaleqty     int64     `json:"presaleqty"  xorm:"'PRESALEQTY'"`         // 预售数量
+	Starttime      time.Time `json:"starttime"  xorm:"'STARTTIME'"`           // 预售开始时间
+	Endtime        time.Time `json:"endtime"  xorm:"'ENDTIME'"`               // 预售结束时间
+	Refprice       float64   `json:"refprice"  xorm:"'REFPRICE'"`             // 参考价格[一口价]
+
+	Videourls      string `json:"videourls"  xorm:"'VIDEOURLS'"`           // 介绍视频[多张用逗号分隔]
+	Picurls        string `json:"picurls"  xorm:"'PICURLS'"`               // 介绍图片[多张用逗号分隔]
+	Descprovinceid int64  `json:"descprovinceid"  xorm:"'DESCPROVINCEID'"` // 目的地(省)ID
+	Desccityid     int64  `json:"desccityid"  xorm:"'DESCCITYID'"`         // 目的地(市)ID
+	Goodsdesc      string `json:"goodsdesc"  xorm:"'GOODSDESC'"`           // 商品详情
+
+	Currency     string `json:"currency" xorm:"'CURRENCY'"`         // 货币
+	Currencysign string `json:"currencysign" xorm:"'CURRENCYSIGN'"` // 货币符号
+
+	Vendorname  string `json:"vendorname"  xorm:"'VENDORNAME'"`   // 供应商名称
+	Vendorphone string `json:"vendorphone"  xorm:"'VENDORPHONE'"` // 供应商客服电话
+	Vendorattr  string `json:"vendorattr"  xorm:"'VENDORATTR'"`   // 供应商附件(多张,逗号分隔)
+}
+
+// GetHsbyPreGoodsDetail 获取一级市场(产能预售)商品信息详情
+// 参数 goodsID int 目标商品ID
+// 返回 *HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情,查询无结果返回nil
+// 返回 error error
+func GetHsbyPreGoodsDetail(goodsID int) (*HsbyListingGoodsDetail, error) {
+	engine := db.GetEngine()
+
+	details := make([]HsbyListingGoodsDetail, 0)
+	// 获取挂牌商品信息,以及扩展表信息
+	// FIXME: - 这里使用Get方法,会造成SQL语句的嵌套出错,后期再研究
+	session := engine.Table("GOODS").
+		Select(`GOODS.GOODSID, GOODS.GOODSCODE, GOODS.GOODSNAME, GOODS.DECIMALPLACE, GOODS.MARKETID,
+				HSBY_GOODSEX.HOTINDEX, HSBY_GOODSEX.VIDEOURLS, HSBY_GOODSEX.PICURLS, HSBY_GOODSEX.DESCPROVINCEID, HSBY_GOODSEX.Desccityid, HSBY_GOODSEX.Goodsdesc,
+				ENUMDICITEM.ENUMDICNAME CURRENCY, ENUMDICITEM.PARAM2 CURRENCYSIGN, 
+				HSBY_SUPPLIERINFO.VENDORNAME, HSBY_SUPPLIERINFO.VENDORPHONE, HSBY_SUPPLIERINFO.VENDORATTR`).
+		Join("LEFT", "HSBY_GOODSEX", "HSBY_GOODSEX.GOODSID = GOODS.GOODSID").
+		Join("LEFT", "ENUMDICITEM", "ENUMDICITEM.ENUMITEMNAME = GOODS.CURRENCYID and ENUMDICITEM.ENUMDICCODE = 'currency'").
+		Join("LEFT", "HSBY_SUPPLIERINFO", "HSBY_SUPPLIERINFO.VENDORID = HSBY_GOODSEX.VENDORID").
+		Where("GOODS.GOODSID = ?", goodsID)
+	if err := session.Find(&details); err != nil {
+		return nil, err
+	}
+	// 无目标商品
+	if len(details) == 0 {
+		return nil, nil
+	}
+	hsbyListingGoodsDetail := details[0]
+
+	// 获取商品现价和涨跌停价
+	quoteDays, err := GetQuoteDays(hsbyListingGoodsDetail.Goodscode)
+	if err != nil {
+		return nil, err
+	}
+	if len(quoteDays) > 0 {
+		if quoteDays[0].Last != 0 {
+			hsbyListingGoodsDetail.Last = utils.IntToFloat64(int(quoteDays[0].Last), int(hsbyListingGoodsDetail.Decimalplace))
+		}
+		if quoteDays[0].Limitup != 0 {
+			hsbyListingGoodsDetail.Limitup = utils.IntToFloat64(int(quoteDays[0].Limitup), int(hsbyListingGoodsDetail.Decimalplace))
+		}
+		if quoteDays[0].Limitdown != 0 {
+			hsbyListingGoodsDetail.Limitdown = utils.IntToFloat64(int(quoteDays[0].Limitdown), int(hsbyListingGoodsDetail.Decimalplace))
+		}
+	}
+
+	return &hsbyListingGoodsDetail, nil
+}