goods.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. // Package models 10.2商品管理
  2. package models
  3. import (
  4. "fmt"
  5. "mtp2_if/db"
  6. "strings"
  7. "time"
  8. )
  9. // Goods 商品表
  10. type Goods struct {
  11. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  12. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  13. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  14. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  15. Goodsgroupid int64 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 所属商品组ID
  16. Goodsstatus int64 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市
  17. Currencyid int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  18. Goodunitid int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  19. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  20. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  21. Listingdate time.Time `json:"listingdate" xorm:"'LISTINGDATE'"` // 交易开始日期
  22. Lasttradedate time.Time `json:"lasttradedate" xorm:"'LASTTRADEDATE'"` // 最后交易日期(状态:待退市)
  23. Delistingdate time.Time `json:"delistingdate" xorm:"'DELISTINGDATE'"` // 商品退市时间(状态:退市) -- 已作废
  24. Deliveryflag int64 `json:"deliveryflag" xorm:"'DELIVERYFLAG'"` // 交割标志 - 0:不可交割 1:可交割
  25. Hasquoter int64 `json:"hasquoter" xorm:"'HASQUOTER'"` // 是否有报价商 - 0:无报价商 1:有报价商
  26. Hqprotecttime int64 `json:"hqprotecttime" xorm:"'HQPROTECTTIME'"` // 行情保护时间(秒)
  27. Quoteshowtype int64 `json:"quoteshowtype" xorm:"'QUOTESHOWTYPE'"` // 行情报价类型: 1:成交价 2:买卖中间价 3:含买价 4:含卖价做市模式固定为3:含买价
  28. Quoteshowtypeinterval int64 `json:"quoteshowtypeinterval" xorm:"'QUOTESHOWTYPEINTERVAL'"` // 行情报价间隔时间(秒)(成交价时为0)
  29. Modifystatus int64 `json:"modifystatus" xorm:"'MODIFYSTATUS'"` // 变更状态 - 1:未变更 2:变更中 3:待审核 4:已审核
  30. Goodstradetype int64 `json:"goodstradetype" xorm:"'GOODSTRADETYPE'"` // 商品交易权限类型 - 1:可建可平 3:不可建可平
  31. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  32. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  33. Auditaccountid int64 `json:"auditaccountid" xorm:"'AUDITACCOUNTID'"` // 审核操作员账号
  34. Audittime time.Time `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  35. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  36. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  37. Cancelaccountid int64 `json:"cancelaccountid" xorm:"'CANCELACCOUNTID'"` // 注销操作员账号
  38. Remark string `json:"remark" xorm:"'REMARK'"` // 备注
  39. Canceltime time.Time `json:"canceltime" xorm:"'CANCELTIME'"` // 注销时间
  40. Delistingmode int64 `json:"delistingmode" xorm:"'DELISTINGMODE'"` // 退市方式 - 1:退市平仓 2:退市交收 3:不处理(仅期权\币币兑换)
  41. Forceclosemode int64 `json:"forceclosemode" xorm:"'FORCECLOSEMODE'"` // 定期强平方式 - 1:无 2:每日 3:每周 4:每月[收益权]
  42. Forceclosevalue int64 `json:"forceclosevalue" xorm:"'FORCECLOSEVALUE'"` // 定期强平参数 [收益权]
  43. Cutmode int64 `json:"cutmode" xorm:"'CUTMODE'"` // 斩仓方式 - 1:不斩仓 2:自动斩仓 3:半自动斩仓
  44. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  45. Isbuylimited int64 `json:"isbuylimited" xorm:"'ISBUYLIMITED'"` // 是否限制建仓量 - 0:不限制 1:限制
  46. Innerdealmode int64 `json:"innerdealmode" xorm:"'INNERDEALMODE'"` // 内部成交方式[通道交易] - 1:净头寸 2:开平 3:平今
  47. Outerdealmode int64 `json:"outerdealmode" xorm:"'OUTERDEALMODE'"` // 外部成交方式[通道交易]- 1:净头寸 2:开平 3:平今
  48. Closepricemode int64 `json:"closepricemode" xorm:"'CLOSEPRICEMODE'"` // 强平价格方式 - 1:市价 2:最新价 3:涨跌停(未实现)
  49. Closepriceparam float64 `json:"closepriceparam" xorm:"'CLOSEPRICEPARAM'"` // 强平最新价浮动比例 - 方式为2时使用 (<1)买 上浮 (1+x)*最新价卖 下浮 (1-x)*最新价
  50. Qtydecimalplace int64 `json:"qtydecimalplace" xorm:"'QTYDECIMALPLACE'"` // 成交量小数位
  51. Goodscurrencyid int64 `json:"goodscurrencyid" xorm:"'GOODSCURRENCYID'"` // 合约货币ID
  52. Goodsquotetype int64 `json:"goodsquotetype" xorm:"'GOODSQUOTETYPE'"` // 合约报价类型: 1-直接报价 2-间接报价
  53. Quotegear int64 `json:"quotegear" xorm:"'QUOTEGEAR'"` // 行情档位(1-10)
  54. Outgoodscode string `json:"outgoodscode" xorm:"'OUTGOODSCODE'"` // 商品代码(外部)
  55. Isvisible int32 `json:"isvisible" xorm:"ISVISIBLE"` // 游客是否可见 - 0:不可见 1:可见
  56. Areauserid int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构
  57. Pictureurl string `json:"pictureurl" xorm:"PICTUREURL"` // 商品图片
  58. }
  59. // TableName is GOODS
  60. func (Goods) TableName() string {
  61. return "GOODS"
  62. }
  63. // GetGoodsByGoodsCode 通过商品代码获取商品信息
  64. // 参数 goodsCode string 商品代码
  65. // 返回值 *Goods 商品信息
  66. // 返回值 error 错误
  67. func GetGoodsByGoodsCode(goodsCode string) (*Goods, error) {
  68. engine := db.GetEngine()
  69. var goods Goods
  70. has, err := engine.Where("GOODSCODE = ?", goodsCode).Get(&goods)
  71. if err != nil {
  72. return nil, err
  73. }
  74. if !has {
  75. // 如果通过GoodsCode找不到,则尝试通过OutGoodsCode来查找
  76. if _, err := engine.Where("OUTGOODSCODE = ?", goodsCode).Get(&goods); err != nil {
  77. return nil, err
  78. }
  79. }
  80. return &goods, nil
  81. }
  82. // GetGoods 获取商品信息
  83. // 参数 goodsID int 商品ID
  84. // 返回值 *Goods 商品信息
  85. // 返回值 error 错误
  86. func GetGoods(goodsID int) (*Goods, error) {
  87. engine := db.GetEngine()
  88. var goods Goods
  89. if _, err := engine.Where("GOODSID = ?", goodsID).Get(&goods); err != nil {
  90. return nil, err
  91. }
  92. return &goods, nil
  93. }
  94. // GoodsInfo 商品信息
  95. type GoodsInfo struct {
  96. Goods `xorm:"extends"`
  97. GoodsUnit string `json:"goodsunit" xorm:"GOODSUNIT"` // 报价单位
  98. }
  99. // GetGoodsesByStatus 获取指定状态的商品信息
  100. // 输入 goodsStatus int 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市
  101. func GetGoodsesByStatus(goodsStatus int) ([]GoodsInfo, error) {
  102. engine := db.GetEngine()
  103. goodsInfos := make([]GoodsInfo, 0)
  104. if err := engine.Table("GOODS").Select("GOODS.*, E1.ENUMDICNAME GOODSUNIT").
  105. Join("LEFT", "ENUMDICITEM E1", "E1.ENUMITEMNAME = GOODS.GOODUNITID and E1.ENUMDICCODE = 'GOODSUNIT'").
  106. Where("GOODSSTATUS = ?", goodsStatus).Find(&goodsInfos); err != nil {
  107. return nil, err
  108. }
  109. return goodsInfos, nil
  110. }
  111. // GoodsIDAndName 商品ID与名称
  112. type GoodsIDAndName struct {
  113. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  114. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  115. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  116. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  117. }
  118. // GetGoodsInfosByTradeModes 获取指定交易模式的商品信息
  119. // 输入 tradeModes string 交易模式列表,格式 1,2,3
  120. func GetGoodsInfosByTradeModes(tradeModes string) ([]GoodsIDAndName, error) {
  121. engine := db.GetEngine()
  122. goodsIDAndNames := make([]GoodsIDAndName, 0)
  123. if err := engine.Table("GOODS").Select("GOODS.*").
  124. Join("LEFT", "MARKET M", "M.MARKETID = GOODS.MARKETID").
  125. Where("GOODS.GOODSSTATUS = 3 and M.TRADEMODE IN (?)", tradeModes).Find(&goodsIDAndNames); err != nil {
  126. return nil, err
  127. }
  128. return goodsIDAndNames, nil
  129. }
  130. // SearchGoods 检索商品信息
  131. type SearchGoods struct {
  132. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  133. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  134. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  135. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  136. Marketname string `json:"marketname" xorm:"'MARKETNAME'"` // 市场名称
  137. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'" binding:"required"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  138. }
  139. // SearchGoodses 检索商品信息的方法
  140. func SearchGoodses(content, tradeModes string) ([]SearchGoods, error) {
  141. engine := db.GetEngine()
  142. searchGoodses := make([]SearchGoods, 0)
  143. session := engine.Table("GOODS G").
  144. Select(`G.*,
  145. M.MARKETNAME, M.TRADEMODE`).
  146. Join("INNER", "MARKET M", "M.MARKETID = G.MARKETID").
  147. Where(fmt.Sprintf("(G.GOODSSTATUS in (2,3)) and (G.GOODSCODE like '%%%s%%' or G.GOODSNAME like '%%%s%%')", content, content))
  148. if len(tradeModes) > 0 {
  149. session = session.And(fmt.Sprintf("M.TRADEMODE in (%s)", tradeModes))
  150. }
  151. if err := session.Find(&searchGoodses); err != nil {
  152. return nil, err
  153. }
  154. return searchGoodses, nil
  155. }
  156. // GetGoodsByLoginID 获取登录账号有权限的商品信息
  157. func GetGoodsByLoginID(loginID int, marketIDs string) ([]Goods, error) {
  158. // 获取此账号相关有权限的市场
  159. markets, err := GetMarketsByLoginID(loginID)
  160. if err != nil {
  161. return nil, err
  162. }
  163. // 构建市场ID列表
  164. ids := make([]int, 0)
  165. reqIDs := fmt.Sprintf(",%s,", marketIDs)
  166. for _, market := range markets {
  167. if len(marketIDs) > 0 {
  168. if !strings.Contains(reqIDs, fmt.Sprintf(",%d,", market.Marketid)) {
  169. continue
  170. }
  171. }
  172. ids = append(ids, int(market.Marketid))
  173. }
  174. // 获取对应商品信息
  175. engine := db.GetEngine()
  176. goodses := make([]Goods, 0)
  177. if err := engine.Table("GOODS G").In("G.MARKETID", ids).Find(&goodses); err != nil {
  178. return nil, err
  179. }
  180. return goodses, nil
  181. }