sbyj.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. package models
  2. import (
  3. "fmt"
  4. "mtp2_if/db"
  5. "mtp2_if/mtpcache"
  6. "mtp2_if/pb"
  7. "mtp2_if/rediscli"
  8. "sort"
  9. "time"
  10. "google.golang.org/protobuf/proto"
  11. )
  12. type TouristGoods struct {
  13. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  14. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  15. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  16. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  17. Goodsgroupid int64 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 所属商品组ID
  18. Goodsstatus int64 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市
  19. Currencyid int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  20. Goodunitid int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  21. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  22. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  23. Listingdate time.Time `json:"listingdate" xorm:"'LISTINGDATE'"` // 交易开始日期
  24. Lasttradedate time.Time `json:"lasttradedate" xorm:"'LASTTRADEDATE'"` // 最后交易日期(状态:待退市)
  25. Delistingdate time.Time `json:"delistingdate" xorm:"'DELISTINGDATE'"` // 商品退市时间(状态:退市) -- 已作废
  26. Deliveryflag int64 `json:"deliveryflag" xorm:"'DELIVERYFLAG'"` // 交割标志 - 0:不可交割 1:可交割
  27. Hasquoter int64 `json:"hasquoter" xorm:"'HASQUOTER'"` // 是否有报价商 - 0:无报价商 1:有报价商
  28. Hqprotecttime int64 `json:"hqprotecttime" xorm:"'HQPROTECTTIME'"` // 行情保护时间(秒)
  29. Quoteshowtype int64 `json:"quoteshowtype" xorm:"'QUOTESHOWTYPE'"` // 行情报价类型: 1:成交价 2:买卖中间价 3:含买价 4:含卖价做市模式固定为3:含买价
  30. Quoteshowtypeinterval int64 `json:"quoteshowtypeinterval" xorm:"'QUOTESHOWTYPEINTERVAL'"` // 行情报价间隔时间(秒)(成交价时为0)
  31. Modifystatus int64 `json:"modifystatus" xorm:"'MODIFYSTATUS'"` // 变更状态 - 1:未变更 2:变更中 3:待审核 4:已审核
  32. Goodstradetype int64 `json:"goodstradetype" xorm:"'GOODSTRADETYPE'"` // 商品交易权限类型 - 1:可建可平 3:不可建可平
  33. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  34. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  35. Auditaccountid int64 `json:"auditaccountid" xorm:"'AUDITACCOUNTID'"` // 审核操作员账号
  36. Audittime time.Time `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  37. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  38. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  39. Cancelaccountid int64 `json:"cancelaccountid" xorm:"'CANCELACCOUNTID'"` // 注销操作员账号
  40. Remark string `json:"remark" xorm:"'REMARK'"` // 备注
  41. Canceltime time.Time `json:"canceltime" xorm:"'CANCELTIME'"` // 注销时间
  42. Delistingmode int64 `json:"delistingmode" xorm:"'DELISTINGMODE'"` // 退市方式 - 1:退市平仓 2:退市交收 3:不处理(仅期权\币币兑换)
  43. Forceclosemode int64 `json:"forceclosemode" xorm:"'FORCECLOSEMODE'"` // 定期强平方式 - 1:无 2:每日 3:每周 4:每月[收益权]
  44. Forceclosevalue int64 `json:"forceclosevalue" xorm:"'FORCECLOSEVALUE'"` // 定期强平参数 [收益权]
  45. Cutmode int64 `json:"cutmode" xorm:"'CUTMODE'"` // 斩仓方式 - 1:不斩仓 2:自动斩仓 3:半自动斩仓
  46. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  47. Isbuylimited int64 `json:"isbuylimited" xorm:"'ISBUYLIMITED'"` // 是否限制建仓量 - 0:不限制 1:限制
  48. Innerdealmode int64 `json:"innerdealmode" xorm:"'INNERDEALMODE'"` // 内部成交方式[通道交易] - 1:净头寸 2:开平 3:平今
  49. Outerdealmode int64 `json:"outerdealmode" xorm:"'OUTERDEALMODE'"` // 外部成交方式[通道交易]- 1:净头寸 2:开平 3:平今
  50. Closepricemode int64 `json:"closepricemode" xorm:"'CLOSEPRICEMODE'"` // 强平价格方式 - 1:市价 2:最新价 3:涨跌停(未实现)
  51. Closepriceparam float64 `json:"closepriceparam" xorm:"'CLOSEPRICEPARAM'"` // 强平最新价浮动比例 - 方式为2时使用 (<1)买 上浮 (1+x)*最新价卖 下浮 (1-x)*最新价
  52. Qtydecimalplace int64 `json:"qtydecimalplace" xorm:"'QTYDECIMALPLACE'"` // 成交量小数位
  53. Goodscurrencyid int64 `json:"goodscurrencyid" xorm:"'GOODSCURRENCYID'"` // 合约货币ID
  54. Goodsquotetype int64 `json:"goodsquotetype" xorm:"'GOODSQUOTETYPE'"` // 合约报价类型: 1-直接报价 2-间接报价
  55. Quotegear int64 `json:"quotegear" xorm:"'QUOTEGEAR'"` // 行情档位(1-10)
  56. Outgoodscode string `json:"outgoodscode" xorm:"'OUTGOODSCODE'"` // 商品代码(外部)
  57. Isvisible int32 `json:"isvisible" xorm:"ISVISIBLE"` // 游客是否可见 - 0:不可见 1:可见
  58. Areauserid int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构
  59. Pictureurl string `json:"pictureurl" xorm:"PICTUREURL"` // 商品图片
  60. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  61. }
  62. func GetTouristGoods(tradeModes []int) (goods []TouristGoods, err error) {
  63. goods = make([]TouristGoods, 0)
  64. session := db.GetEngine().Table("GOODS G").
  65. Select("G.*, M.TRADEMODE").
  66. Join("LEFT", "MARKET M", "M.MARKETID = G.MARKETID").
  67. Where("G.GOODSSTATUS in (3, 7)").In("M.TRADEMODE", tradeModes).OrderBy("G.GOODSCODE")
  68. err = session.Find(&goods)
  69. return
  70. }
  71. // TradeHolderDetailEx 交易持仓扩展表
  72. type TradeHolderDetailEx struct {
  73. TradeID uint64 `json:"tradeID"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  74. BuyOrSell uint32 `json:"buyOrSell"` // 方向 - 0:买 1:卖
  75. TradeDate string `json:"tradeDate"` // 交易日(yyyyMMdd)
  76. MarketID uint32 `json:"marketID"` // 市场ID
  77. GoodsID uint32 `json:"goodsID"` // 商品ID
  78. UserID uint32 `json:"userID"` // 用户ID
  79. AccountID uint64 `json:"accountID"` // 账号ID
  80. MatchUserID uint32 `json:"matchUserID"` // 对手用户ID
  81. MatchAccountID uint64 `json:"matchAccountID"` // 对手账号ID
  82. OpenQty uint64 `json:"openQty"` // 建仓数量
  83. TradeAmount float64 `json:"tradeAmount"` // 成交金额
  84. OpenPrice float64 `json:"openPrice"` // 建仓价格
  85. HolderQty uint64 `json:"holderQty"` // 持仓数量
  86. HolderAmount float64 `json:"holderAmount"` // 持仓金额
  87. HolderPrice float64 `json:"holderPrice"` // 持仓价格
  88. FreezeQty uint64 `json:"freezeQty"` // 冻结数量
  89. DeliveryQty uint64 `json:"deliveryQty"` // 交收手数(已交收)
  90. HoldDays uint64 `json:"holdDays"` // 持仓天数
  91. PayedDeposit float64 `json:"payedDeposit"` // 已付定金
  92. RestockDeposit float64 `json:"restockDeposit"` // 补充定金
  93. LateFeeDays uint64 `json:"lateFeeDays"` // 滞纳金起计天数
  94. LateFeeAlgorithm uint32 `json:"lateFeeAlgorithm"` // 滞纳金收取方式 1:比率 2:固定
  95. LateFeeValue float64 `json:"lateFeeValue"` // 滞纳金收取值
  96. CallAteFee float64 `json:"callAteFee"` // 已计滞纳金
  97. PromptDepositRate float64 `json:"promptDepositRate"` // 提示定金率
  98. CutDepositRate float64 `json:"cutDepositRate"` // 斩仓定金率
  99. PromptPrice float64 `json:"promptPrice"` // 提示价格
  100. CutPrice float64 `json:"cutPrice"` // 斩仓价格
  101. ClosePL float64 `json:"closePL"` // 平仓盈亏
  102. FloatPL float64 `json:"floatPL"` // 浮动盈亏
  103. DepositRate float64 `json:"depositRate"` // 订单定金率
  104. RefundableDeposit float64 `json:"refundableDeposit"` // 可退定金
  105. }
  106. // RedisTradeHolderDetailEx redis存储交易持仓扩展表
  107. type RedisTradeHolderDetailEx struct {
  108. THDetailEx TradeHolderDetailEx `json:"tHDetailEx"` // 交易持仓扩展表记录
  109. FloatPL float64 `json:"floatPL"` // 浮动盈亏
  110. DepositRate float64 `json:"depositRate"` // 订单定金率
  111. RefundableDeposit float64 `json:"refundableDeposit"` // 可退定金
  112. GoodsCode string `json:"goodsCode"` // 商品代码
  113. GoodsName string `json:"goodsName"` // 商品名称
  114. GoodsUnitID uint32 `json:"goodsUnitID"` // 单位
  115. AgreeUnit float64 `json:"agreeUnit"` // 合约单位
  116. DecimalPlace uint32 `json:"decimalPlace"` // 小数位位数
  117. QuoteMinUnit uint32 `json:"quoteMinUnit"` // 行情最小变动单位
  118. GoodsUnit string `json:"goodsUnit"` // 单位名称
  119. }
  120. type RedisTradeHolderDetailExArray []RedisTradeHolderDetailEx
  121. func (s RedisTradeHolderDetailExArray) Len() int { return len(s) }
  122. func (s RedisTradeHolderDetailExArray) Less(i, j int) bool {
  123. return s[i].THDetailEx.TradeID > s[j].THDetailEx.TradeID
  124. }
  125. func (s RedisTradeHolderDetailExArray) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
  126. // GetDataEx 从数据库中查询数据
  127. func (r *RedisTradeHolderDetailEx) GetDataEx(userId int, goodsId int) (sData RedisTradeHolderDetailExArray, err error) {
  128. redisCli := rediscli.GetRedisClient()
  129. sData = make([]RedisTradeHolderDetailEx, 0)
  130. key := fmt.Sprintf("TradeHolderDetailEx:%d:*:%d:*", goodsId, userId)
  131. if ret, err := redisCli.Do("keys", key).Result(); err == nil {
  132. datas := ret.([]interface{})
  133. for _, item := range datas {
  134. itemKey := item.(string)
  135. if itemValue, err := redisCli.Get(itemKey).Result(); err == nil {
  136. var data pb.RedisTradeHolderDetailEx
  137. if err = proto.Unmarshal([]byte(itemValue), &data); err == nil {
  138. m := RedisTradeHolderDetailEx{}
  139. m.ParseFromProto(&data)
  140. sData = append(sData, m)
  141. }
  142. }
  143. }
  144. }
  145. // 按 TradeID 倒序排序
  146. sort.Sort(sort.Reverse(RedisTradeHolderDetailExArray(sData)))
  147. return sData, nil
  148. }
  149. func (r *RedisTradeHolderDetailEx) ParseFromProto(p *pb.RedisTradeHolderDetailEx) {
  150. r.FloatPL = p.GetFloatPL()
  151. r.DepositRate = p.GetDepositRate()
  152. r.RefundableDeposit = p.GetRefundableDeposit()
  153. r.GoodsCode = p.GetGoodsCode()
  154. r.GoodsName = p.GetGoodsName()
  155. r.GoodsUnitID = p.GetGoodsUnitID()
  156. r.AgreeUnit = p.GetAgreeUnit()
  157. r.DecimalPlace = p.GetDecimalPlace()
  158. r.QuoteMinUnit = p.GetQuoteMinUnit()
  159. r.THDetailEx = TradeHolderDetailEx{
  160. TradeID: p.GetTHDetailEx().GetTradeID(),
  161. BuyOrSell: p.GetTHDetailEx().GetBuyOrSell(),
  162. TradeDate: p.GetTHDetailEx().GetTradeDate(),
  163. MarketID: p.GetTHDetailEx().GetMarketID(),
  164. GoodsID: p.GetTHDetailEx().GetGoodsID(),
  165. UserID: p.GetTHDetailEx().GetUserID(),
  166. AccountID: p.GetTHDetailEx().GetAccountID(),
  167. MatchUserID: p.GetTHDetailEx().GetMatchUserID(),
  168. MatchAccountID: p.GetTHDetailEx().GetMatchAccountID(),
  169. OpenQty: p.GetTHDetailEx().GetOpenQty(),
  170. TradeAmount: p.GetTHDetailEx().GetTradeAmount(),
  171. OpenPrice: p.GetTHDetailEx().GetOpenPrice(),
  172. HolderQty: p.GetTHDetailEx().GetHolderQty(),
  173. HolderAmount: p.GetTHDetailEx().GetHolderAmount(),
  174. HolderPrice: p.GetTHDetailEx().GetHolderPrice(),
  175. FreezeQty: p.GetTHDetailEx().GetFreezeQty(),
  176. DeliveryQty: p.GetTHDetailEx().GetDeliveryQty(),
  177. HoldDays: p.GetTHDetailEx().GetHoldDays(),
  178. PayedDeposit: p.GetTHDetailEx().GetPayedDeposit(),
  179. RestockDeposit: p.GetTHDetailEx().GetRestockDeposit(),
  180. LateFeeDays: p.GetTHDetailEx().GetLateFeeDays(),
  181. LateFeeAlgorithm: p.GetTHDetailEx().GetLateFeeAlgorithm(),
  182. LateFeeValue: p.GetTHDetailEx().GetLateFeeValue(),
  183. CallAteFee: p.GetTHDetailEx().GetCallAteFee(),
  184. PromptDepositRate: p.GetTHDetailEx().GetPromptDepositRate(),
  185. CutDepositRate: p.GetTHDetailEx().GetCutDepositRate(),
  186. PromptPrice: p.GetTHDetailEx().GetPromptPrice(),
  187. CutPrice: p.GetTHDetailEx().GetCutPrice(),
  188. ClosePL: p.GetTHDetailEx().GetClosePL(),
  189. FloatPL: p.GetTHDetailEx().GetFloatPL(),
  190. DepositRate: p.GetTHDetailEx().GetDepositRate(),
  191. RefundableDeposit: p.GetTHDetailEx().GetRefundableDeposit(),
  192. }
  193. // 单位
  194. r.GoodsUnit = mtpcache.GetEnumDicitemName(int32(r.GoodsUnitID))
  195. }