Bläddra i källkod

1、查询一级市场(产能预售)商品信息详情接口增加最大购买参数返回;
2、解决区域查询无效的问题。

zhou.xiaoning 5 år sedan
förälder
incheckning
eb3230fd33
7 ändrade filer med 128 tillägg och 58 borttagningar
  1. 8 6
      controllers/hsby/hsby.go
  2. 15 4
      docs/docs.go
  3. 15 4
      docs/swagger.json
  4. 12 4
      docs/swagger.yaml
  5. 50 6
      models/cpTrade.go
  6. 0 14
      models/goods.go
  7. 28 20
      models/hsby.go

+ 8 - 6
controllers/hsby/hsby.go

@@ -27,8 +27,8 @@ type QueryHsbyTopGoodsesReq struct {
 // @Param page query int false "页码"
 // @Param pagesize query int false "每页条数"
 // @Param marketIDs query string true "市场ID列表,格式:1,2,3"
-// @Param DescProvinceID query int false "目的地(省)ID"
-// @Param DescCityID query int false "目的地(市)ID"
+// @Param descProvinceID query int false "目的地(省)ID"
+// @Param descCityID query int false "目的地(市)ID"
 // @Success 200 {object} models.HsbyTopGoods
 // @Failure 500 {object} app.Response
 // @Router /HSBY/QueryHsbyTopGoodses [get]
@@ -314,8 +314,8 @@ type QueryHsbyPreGoodsesReq struct {
 // @Param page query int false "页码"
 // @Param pagesize query int false "每页条数"
 // @Param marketIDs query string true "市场ID列表,格式:1,2,3"
-// @Param DescProvinceID query int false "目的地(省)ID"
-// @Param DescCityID query int false "目的地(市)ID"
+// @Param descProvinceID query int false "目的地(省)ID"
+// @Param descCityID query int false "目的地(市)ID"
 // @Success 200 {object} models.HsbyPreGoods
 // @Failure 500 {object} app.Response
 // @Router /HSBY/QueryHsbyPreGoodses [get]
@@ -390,7 +390,8 @@ func QueryHsbyPreGoodses(c *gin.Context) {
 
 // QueryHsbyPreGoodsDetailReq 查询一级市场(产能预售)商品信息详情请求参数
 type QueryHsbyPreGoodsDetailReq struct {
-	GoodsID int `form:"goodsID" binding:"required"`
+	GoodsID   int `form:"goodsID" binding:"required"`
+	AccountID int `form:"accountID" binding:"required"`
 }
 
 // QueryHsbyPreGoodsDetail 查询一级市场(产能预售)商品信息详情
@@ -398,6 +399,7 @@ type QueryHsbyPreGoodsDetailReq struct {
 // @Produce json
 // @Security ApiKeyAuth
 // @Param goodsID query int true "商品ID"
+// @Param accountID query int true "资金账户,主要用于获取预售商品购买上限"
 // @Success 200 {object} models.HsbyPreGoodsDetail
 // @Failure 500 {object} app.Response
 // @Router /HSBY/QueryHsbyPreGoodsDetail [get]
@@ -414,7 +416,7 @@ func QueryHsbyPreGoodsDetail(c *gin.Context) {
 	}
 
 	// 获取数据
-	goodsInfo, err := models.GetHsbyPreGoodsDetail(req.GoodsID)
+	goodsInfo, err := models.GetHsbyPreGoodsDetail(req.GoodsID, req.AccountID)
 	if err != nil {
 		// 查询失败
 		logger.GetLogger().Errorf("QueryHsbyPreGoodsDetail failed: %s", err.Error())

+ 15 - 4
docs/docs.go

@@ -1095,6 +1095,13 @@ var doc = `{
                         "name": "goodsID",
                         "in": "query",
                         "required": true
+                    },
+                    {
+                        "type": "integer",
+                        "description": "资金账户,主要用于获取预售商品购买上限",
+                        "name": "accountID",
+                        "in": "query",
+                        "required": true
                     }
                 ],
                 "responses": {
@@ -1151,13 +1158,13 @@ var doc = `{
                     {
                         "type": "integer",
                         "description": "目的地(省)ID",
-                        "name": "DescProvinceID",
+                        "name": "descProvinceID",
                         "in": "query"
                     },
                     {
                         "type": "integer",
                         "description": "目的地(市)ID",
-                        "name": "DescCityID",
+                        "name": "descCityID",
                         "in": "query"
                     }
                 ],
@@ -1273,13 +1280,13 @@ var doc = `{
                     {
                         "type": "integer",
                         "description": "目的地(省)ID",
-                        "name": "DescProvinceID",
+                        "name": "descProvinceID",
                         "in": "query"
                     },
                     {
                         "type": "integer",
                         "description": "目的地(市)ID",
-                        "name": "DescCityID",
+                        "name": "descCityID",
                         "in": "query"
                     }
                 ],
@@ -4862,6 +4869,10 @@ var doc = `{
                     "description": "合约单位",
                     "type": "number"
                 },
+                "buymaxqty": {
+                    "description": "购买上限 [71] - 0为不限",
+                    "type": "integer"
+                },
                 "currency": {
                     "description": "货币",
                     "type": "string"

+ 15 - 4
docs/swagger.json

@@ -1079,6 +1079,13 @@
                         "name": "goodsID",
                         "in": "query",
                         "required": true
+                    },
+                    {
+                        "type": "integer",
+                        "description": "资金账户,主要用于获取预售商品购买上限",
+                        "name": "accountID",
+                        "in": "query",
+                        "required": true
                     }
                 ],
                 "responses": {
@@ -1135,13 +1142,13 @@
                     {
                         "type": "integer",
                         "description": "目的地(省)ID",
-                        "name": "DescProvinceID",
+                        "name": "descProvinceID",
                         "in": "query"
                     },
                     {
                         "type": "integer",
                         "description": "目的地(市)ID",
-                        "name": "DescCityID",
+                        "name": "descCityID",
                         "in": "query"
                     }
                 ],
@@ -1257,13 +1264,13 @@
                     {
                         "type": "integer",
                         "description": "目的地(省)ID",
-                        "name": "DescProvinceID",
+                        "name": "descProvinceID",
                         "in": "query"
                     },
                     {
                         "type": "integer",
                         "description": "目的地(市)ID",
-                        "name": "DescCityID",
+                        "name": "descCityID",
                         "in": "query"
                     }
                 ],
@@ -4846,6 +4853,10 @@
                     "description": "合约单位",
                     "type": "number"
                 },
+                "buymaxqty": {
+                    "description": "购买上限 [71] - 0为不限",
+                    "type": "integer"
+                },
                 "currency": {
                     "description": "货币",
                     "type": "string"

+ 12 - 4
docs/swagger.yaml

@@ -1645,6 +1645,9 @@ definitions:
       agreeunit:
         description: 合约单位
         type: number
+      buymaxqty:
+        description: 购买上限 [71] - 0为不限
+        type: integer
       currency:
         description: 货币
         type: string
@@ -4389,6 +4392,11 @@ paths:
         name: goodsID
         required: true
         type: integer
+      - description: 资金账户,主要用于获取预售商品购买上限
+        in: query
+        name: accountID
+        required: true
+        type: integer
       produces:
       - application/json
       responses:
@@ -4424,11 +4432,11 @@ paths:
         type: string
       - description: 目的地(省)ID
         in: query
-        name: DescProvinceID
+        name: descProvinceID
         type: integer
       - description: 目的地(市)ID
         in: query
-        name: DescCityID
+        name: descCityID
         type: integer
       produces:
       - application/json
@@ -4502,11 +4510,11 @@ paths:
         type: string
       - description: 目的地(省)ID
         in: query
-        name: DescProvinceID
+        name: descProvinceID
         type: integer
       - description: 目的地(市)ID
         in: query
-        name: DescCityID
+        name: descCityID
         type: integer
       produces:
       - application/json

+ 50 - 6
models/cpTrade.go

@@ -1,7 +1,10 @@
 // Package models 40.6.3仓单优化_产能预售
 package models
 
-import "time"
+import (
+	"mtp2_if/db"
+	"time"
+)
 
 // Cptradepresalegoodsex 产能预售商品扩展表
 type Cptradepresalegoodsex struct {
@@ -14,22 +17,63 @@ type Cptradepresalegoodsex struct {
 	Starttime       time.Time `json:"starttime"  xorm:"'STARTTIME'"`                // 预售开始时间
 	Endtime         time.Time `json:"endtime"  xorm:"'ENDTIME'"`                    // 预售结束时间
 	Attachmenturl   string    `json:"attachmenturl"  xorm:"'ATTACHMENTURL'"`        // 附件地址
-	Presalemode     int64     `json:"presalemode"  xorm:"'PRESALEMODE'"`            // 预售模式 - 1:一口价 2:大宗式竞拍
-	Marketid        int64     `json:"marketid"  xorm:"'MARKETID'"`                  // 预售市场ID - 根据预售模式选择市场
+	Presalemode     int32     `json:"presalemode"  xorm:"'PRESALEMODE'"`            // 预售模式 - 1:一口价 2:大宗式竞拍
+	Marketid        int32     `json:"marketid"  xorm:"'MARKETID'"`                  // 预售市场ID - 根据预售模式选择市场
 	Refprice        float64   `json:"refprice"  xorm:"'REFPRICE'"`                  // 参考价格[一口价]
 	Startprice      float64   `json:"startprice"  xorm:"'STARTPRICE'"`              // 起拍价[大宗式竞拍]
 	Floorprice      float64   `json:"floorprice"  xorm:"'FLOORPRICE'"`              // 底价[大宗式竞拍]
 	Createtime      time.Time `json:"createtime"  xorm:"'CREATETIME'"`              // 创建时间
 	Tradedate       string    `json:"tradedate"  xorm:"'TRADEDATE'"`                // 交易日(yyyyMMdd)
 	Relatedmarketid int64     `json:"relatedmarketid"  xorm:"'RELATEDMARKETID'"`    // 关联交易合约市场ID
-	Presaledqty     int64     `json:"presaledqty"  xorm:"'PRESALEDQTY'"`            // 已预售量(预售结束时更新)
-	Sellstatus      int64     `json:"sellstatus"  xorm:"'SELLSTATUS'"`              // 卖方处理状态 - 1:卖方头寸未处理 2:卖方头寸已处理
-	Presaledamount  float64   `json:"presaledamount"  xorm:"'PRESALEDAMOUNT'"`      // 已预售总金额(预售结束时更新)
+	Presaledqty     int64     `json:"presaledqty"  xorm:"'PRESALEDQTY'"`            // 已预售量(预售结束时更新) 71-委托时更新
+	Presaledamount  float64   `json:"presaledamount"  xorm:"'PRESALEDAMOUNT'"`      // 已预售总金额(预售结束时更新)71-委托时更新
+	Sellstatus      int32     `json:"sellstatus"  xorm:"'SELLSTATUS'"`              // 卖方处理状态 - 1:卖方头寸未处理 2:卖方头寸已处理
 	Goodsdetail     string    `json:"goodsdetail"  xorm:"'GOODSDETAIL'"`            // 详情[大宗]
 	Tradeprice      float64   `json:"tradeprice"  xorm:"'TRADEPRICE'"`              // 成交价[大宗]
+	Buymaxqty       int64     `json:"buymaxqty"  xorm:"'BUYMAXQTY'"`                // 购买上限 [71] - 0为不限
 }
 
 // TableName is CPTRADE_PRESALEGOODSEX
 func (Cptradepresalegoodsex) TableName() string {
 	return "CPTRADE_PRESALEGOODSEX"
 }
+
+// Cptradebuylimitedconfig 产能预售商品购买限制表
+type Cptradebuylimitedconfig struct {
+	Goodsid    int64     `json:"goodsid"  xorm:"'GOODSID'" binding:"required"`     // 商品ID
+	Accountid  int64     `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"` // 账户ID
+	Buymaxqty  int64     `json:"buymaxqty"  xorm:"'BUYMAXQTY'"`                    // 限制上限
+	Creatorid  int64     `json:"creatorid"  xorm:"'CREATORID'"`                    // 创建人
+	Createtime time.Time `json:"createtime"  xorm:"'CREATETIME'"`                  // 创建时间
+}
+
+// TableName is CPTRADE_BUYLIMITEDCONFIG
+func (Cptradebuylimitedconfig) TableName() string {
+	return "CPTRADE_BUYLIMITEDCONFIG"
+}
+
+// GetCPTradeBuyLimit 获取目标预售商品购买限制
+func GetCPTradeBuyLimit(goodsID, accountID int) (int, error) {
+	engine := db.GetEngine()
+
+	// 先尝试从“产能预售商品购买限制表”中获取定制化信息
+	var cptradebuylimitedconfig Cptradebuylimitedconfig
+	has, err := engine.Where("GOODSID = ?", goodsID).And("ACCOUNTID = ?", accountID).Get(&cptradebuylimitedconfig)
+	if err != nil {
+		return 0, err
+	}
+	if has {
+		return int(cptradebuylimitedconfig.Buymaxqty), nil
+	}
+
+	// 没有定制化信息则从“产能预售商品扩展表”获取
+	var cptradepresalegoodsex Cptradepresalegoodsex
+	if has, err = engine.Where("GOODSID = ?", goodsID).Get(&cptradepresalegoodsex); err != nil {
+		return 0, err
+	}
+	if has {
+		return int(cptradepresalegoodsex.Buymaxqty), nil
+	}
+
+	return 0, nil
+}

+ 0 - 14
models/goods.go

@@ -60,20 +60,6 @@ func (Goods) TableName() string {
 	return "GOODS"
 }
 
-// Cptradebuylimitedconfig 产能预售商品购买限制表
-type Cptradebuylimitedconfig struct {
-	Goodsid    int64     `json:"goodsid"  xorm:"'GOODSID'" binding:"required"`     // 商品ID
-	Accountid  int64     `json:"accountid"  xorm:"'ACCOUNTID'" binding:"required"` // 账户ID
-	Buymaxqty  int64     `json:"buymaxqty"  xorm:"'BUYMAXQTY'"`                    // 限制上限
-	Creatorid  int64     `json:"creatorid"  xorm:"'CREATORID'"`                    // 创建人
-	Createtime time.Time `json:"createtime"  xorm:"'CREATETIME'"`                  // 创建时间
-}
-
-// TableName is CPTRADE_BUYLIMITEDCONFIG
-func (Cptradebuylimitedconfig) TableName() string {
-	return "CPTRADE_BUYLIMITEDCONFIG"
-}
-
 // GetGoodsByGoodsCode 通过商品代码获取商品信息
 // 参数 goodsCode string 商品代码
 // 返回值 *Goods 商品信息

+ 28 - 20
models/hsby.go

@@ -69,8 +69,7 @@ type HsbyTopGoods struct {
 
 	Trademode int32 `json:"trademode"  xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
 
-	Last    float64 `json:"last" xorm:"-"`    // 现价
-	LotSize float64 `json:"lotsize" xorm:"-"` // 最小变动单位
+	Last float64 `json:"last" xorm:"-"` // 现价
 }
 
 // GetHsbyTopGoodses 获取热门商品列表
@@ -127,8 +126,8 @@ func GetHsbyTopGoodses(marketIDs string, descProvinceID, descCityID int) ([]Hsby
 		topGoods := &topGoodses[i]
 		// FIXME: - 这里应该使用 Duck Typing,后期再处理
 		// 计算最小变动单位
-		lotSize := float64(topGoods.Quoteminunit) * math.Pow(0.1, float64(topGoods.Decimalplace))
-		topGoods.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(topGoods.Decimalplace)), 64)
+		// lotSize := float64(topGoods.Quoteminunit) * math.Pow(0.1, float64(topGoods.Decimalplace))
+		// topGoods.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(topGoods.Decimalplace)), 64)
 
 		for _, q := range quoteDays {
 			if g.Goodscode == q.Goodscode {
@@ -177,7 +176,6 @@ type HsbyListingGoodsDetail struct {
 	Last      float64 `json:"last" xorm:"-"`      // 现价
 	Limitup   float64 `json:"limitup" xorm:"-"`   // 涨停价
 	Limitdown float64 `json:"limitdown" xorm:"-"` // 跌停价
-	LotSize   float64 `json:"lotsize" xorm:"-"`   // 最小变动单位
 }
 
 // GetHsbyListingGoodsDetail 获取二级市场(挂牌点选)商品信息详情
@@ -233,8 +231,8 @@ func GetHsbyListingGoodsDetail(goodsID int) (*HsbyListingGoodsDetail, error) {
 
 	// FIXME: - 这里应该使用 Duck Typing,后期再处理
 	// 计算最小变动单位
-	lotSize := float64(hsbyListingGoodsDetail.Quoteminunit) * math.Pow(0.1, float64(hsbyListingGoodsDetail.Decimalplace))
-	hsbyListingGoodsDetail.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(hsbyListingGoodsDetail.Decimalplace)), 64)
+	// lotSize := float64(hsbyListingGoodsDetail.Quoteminunit) * math.Pow(0.1, float64(hsbyListingGoodsDetail.Decimalplace))
+	// hsbyListingGoodsDetail.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(hsbyListingGoodsDetail.Decimalplace)), 64)
 
 	return &hsbyListingGoodsDetail, nil
 }
@@ -546,8 +544,6 @@ type HsbyPreGoods struct {
 	Picurls   string `json:"picurls"  xorm:"'PICURLS'"`     // 介绍图片[多张用逗号分隔]
 
 	Trademode int32 `json:"trademode"  xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
-
-	LotSize float64 `json:"lotsize" xorm:"-"` // 最小变动单位
 }
 
 // GetHsbyPreGoodses 获取“新品上市”商品列表(一级市场产能预售)
@@ -584,14 +580,14 @@ func GetHsbyPreGoodses(marketIDs string, descProvinceID, descCityID int) ([]Hsby
 		return nil, err
 	}
 
-	for i := range preGoodses {
-		preGoods := &preGoodses[i]
+	// for i := range preGoodses {
+	// 	preGoods := &preGoodses[i]
 
-		// FIXME: - 这里应该使用 Duck Typing,后期再处理
-		// 计算最小变动单位
-		lotSize := float64(preGoods.Quoteminunit) * math.Pow(0.1, float64(preGoods.Decimalplace))
-		preGoods.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(preGoods.Decimalplace)), 64)
-	}
+	// 	// FIXME: - 这里应该使用 Duck Typing,后期再处理
+	// 	// 计算最小变动单位
+	// 	lotSize := float64(preGoods.Quoteminunit) * math.Pow(0.1, float64(preGoods.Decimalplace))
+	// 	preGoods.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(preGoods.Decimalplace)), 64)
+	// }
 
 	return preGoodses, nil
 }
@@ -633,14 +629,16 @@ type HsbyPreGoodsDetail struct {
 
 	Customername string `json:"customername" xorm:"'CUSTOMERNAME'"` // 发行单位
 
-	LotSize float64 `json:"lotsize" xorm:"-"` // 最小变动单位
+	StepValue float64 `json:"stepValue" xorm:"-"`    // 价格最小变动单位
+	LotSize   int     `json:"lotsize" xorm:"-"`      // 手数最小变动单位
+	Buymaxqty int     `json:"buymaxqty"  xorm:"'-'"` // 购买上限 [71] - 0为不限
 }
 
 // GetHsbyPreGoodsDetail 获取一级市场(产能预售)商品信息详情
 // 参数 goodsID int 目标商品ID
 // 返回 *HsbyListingGoodsDetail 二级市场(挂牌点选)商品信息详情,查询无结果返回nil
 // 返回 error error
-func GetHsbyPreGoodsDetail(goodsID int) (*HsbyPreGoodsDetail, error) {
+func GetHsbyPreGoodsDetail(goodsID, accountID int) (*HsbyPreGoodsDetail, error) {
 	engine := db.GetEngine()
 
 	details := make([]HsbyPreGoodsDetail, 0)
@@ -675,9 +673,19 @@ func GetHsbyPreGoodsDetail(goodsID int) (*HsbyPreGoodsDetail, error) {
 	preGoodsDetail := details[0]
 
 	// FIXME: - 这里应该使用 Duck Typing,后期再处理
-	// 计算最小变动单位
+	// 计算价格最小变动单位
 	lotSize := float64(preGoodsDetail.Quoteminunit) * math.Pow(0.1, float64(preGoodsDetail.Decimalplace))
-	preGoodsDetail.LotSize, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(preGoodsDetail.Decimalplace)), 64)
+	preGoodsDetail.StepValue, _ = strconv.ParseFloat(utils.FormatFloat(lotSize, int(preGoodsDetail.Decimalplace)), 64)
+
+	// 计算手数最小变动单位,一级市场固定为1
+	preGoodsDetail.LotSize = 1
+
+	// 获取购买上限
+	buyMaxQty, err := GetCPTradeBuyLimit(goodsID, accountID)
+	if err != nil {
+		return nil, err
+	}
+	preGoodsDetail.Buymaxqty = buyMaxQty
 
 	return &preGoodsDetail, nil
 }