sbyj.go 51 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  1. package models
  2. import (
  3. "fmt"
  4. "mtp2_if/db"
  5. "mtp2_if/mtpcache"
  6. "mtp2_if/pb"
  7. "mtp2_if/rediscli"
  8. "mtp2_if/utils"
  9. "sort"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "google.golang.org/protobuf/proto"
  14. )
  15. type TouristGoods struct {
  16. Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS)
  17. Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部)
  18. Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称
  19. Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID
  20. Goodsgroupid int64 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 所属商品组ID
  21. Goodsstatus int64 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市
  22. Currencyid int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  23. Goodunitid int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  24. Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位
  25. Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  26. Listingdate time.Time `json:"listingdate" xorm:"'LISTINGDATE'"` // 交易开始日期
  27. Lasttradedate time.Time `json:"lasttradedate" xorm:"'LASTTRADEDATE'"` // 最后交易日期(状态:待退市)
  28. Delistingdate time.Time `json:"delistingdate" xorm:"'DELISTINGDATE'"` // 商品退市时间(状态:退市) -- 已作废
  29. Deliveryflag int64 `json:"deliveryflag" xorm:"'DELIVERYFLAG'"` // 交割标志 - 0:不可交割 1:可交割
  30. Hasquoter int64 `json:"hasquoter" xorm:"'HASQUOTER'"` // 是否有报价商 - 0:无报价商 1:有报价商
  31. Hqprotecttime int64 `json:"hqprotecttime" xorm:"'HQPROTECTTIME'"` // 行情保护时间(秒)
  32. Quoteshowtype int64 `json:"quoteshowtype" xorm:"'QUOTESHOWTYPE'"` // 行情报价类型: 1:成交价 2:买卖中间价 3:含买价 4:含卖价做市模式固定为3:含买价
  33. Quoteshowtypeinterval int64 `json:"quoteshowtypeinterval" xorm:"'QUOTESHOWTYPEINTERVAL'"` // 行情报价间隔时间(秒)(成交价时为0)
  34. Modifystatus int64 `json:"modifystatus" xorm:"'MODIFYSTATUS'"` // 变更状态 - 1:未变更 2:变更中 3:待审核 4:已审核
  35. Goodstradetype int64 `json:"goodstradetype" xorm:"'GOODSTRADETYPE'"` // 商品交易权限类型 - 1:可建可平 3:不可建可平
  36. Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人
  37. Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间
  38. Auditaccountid int64 `json:"auditaccountid" xorm:"'AUDITACCOUNTID'"` // 审核操作员账号
  39. Audittime time.Time `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间
  40. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  41. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  42. Cancelaccountid int64 `json:"cancelaccountid" xorm:"'CANCELACCOUNTID'"` // 注销操作员账号
  43. Remark string `json:"remark" xorm:"'REMARK'"` // 备注
  44. Canceltime time.Time `json:"canceltime" xorm:"'CANCELTIME'"` // 注销时间
  45. Delistingmode int64 `json:"delistingmode" xorm:"'DELISTINGMODE'"` // 退市方式 - 1:退市平仓 2:退市交收 3:不处理(仅期权\币币兑换)
  46. Forceclosemode int64 `json:"forceclosemode" xorm:"'FORCECLOSEMODE'"` // 定期强平方式 - 1:无 2:每日 3:每周 4:每月[收益权]
  47. Forceclosevalue int64 `json:"forceclosevalue" xorm:"'FORCECLOSEVALUE'"` // 定期强平参数 [收益权]
  48. Cutmode int64 `json:"cutmode" xorm:"'CUTMODE'"` // 斩仓方式 - 1:不斩仓 2:自动斩仓 3:半自动斩仓
  49. Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用]
  50. Isbuylimited int64 `json:"isbuylimited" xorm:"'ISBUYLIMITED'"` // 是否限制建仓量 - 0:不限制 1:限制
  51. Innerdealmode int64 `json:"innerdealmode" xorm:"'INNERDEALMODE'"` // 内部成交方式[通道交易] - 1:净头寸 2:开平 3:平今
  52. Outerdealmode int64 `json:"outerdealmode" xorm:"'OUTERDEALMODE'"` // 外部成交方式[通道交易]- 1:净头寸 2:开平 3:平今
  53. Closepricemode int64 `json:"closepricemode" xorm:"'CLOSEPRICEMODE'"` // 强平价格方式 - 1:市价 2:最新价 3:涨跌停(未实现)
  54. Closepriceparam float64 `json:"closepriceparam" xorm:"'CLOSEPRICEPARAM'"` // 强平最新价浮动比例 - 方式为2时使用 (<1)买 上浮 (1+x)*最新价卖 下浮 (1-x)*最新价
  55. Qtydecimalplace int64 `json:"qtydecimalplace" xorm:"'QTYDECIMALPLACE'"` // 成交量小数位
  56. Goodscurrencyid int64 `json:"goodscurrencyid" xorm:"'GOODSCURRENCYID'"` // 合约货币ID
  57. Goodsquotetype int64 `json:"goodsquotetype" xorm:"'GOODSQUOTETYPE'"` // 合约报价类型: 1-直接报价 2-间接报价
  58. Quotegear int64 `json:"quotegear" xorm:"'QUOTEGEAR'"` // 行情档位(1-10)
  59. Outgoodscode string `json:"outgoodscode" xorm:"'OUTGOODSCODE'"` // 商品代码(外部)
  60. Isvisible int32 `json:"isvisible" xorm:"ISVISIBLE"` // 游客是否可见 - 0:不可见 1:可见
  61. Areauserid int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构
  62. Pictureurl string `json:"pictureurl" xorm:"PICTUREURL"` // 商品图片
  63. THUMURLS string `json:"thumurls" xorm:"THUMURLS"` // 缩略图片(1:1)(逗号分隔)
  64. GOODSGROUPNAME string `json:"goodsgroupname" xorm:"'GOODSGROUPNAME'"` // 所属商品组名称
  65. RISKCONTROLMODE int32 `json:"riskcontrolmode" xorm:"RISKCONTROLMODE"` // 风控方式(52、10模式) 1:按单风控 2:按账户风控
  66. Trademode int32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价
  67. GOODSORDER string `json:"goodsorder" xorm:"GOODSORDER"` // 商品显示顺序(99)
  68. }
  69. func GetTouristGoods(tradeModes []int, marketIds []int) (goods []TouristGoods, err error) {
  70. goods = make([]TouristGoods, 0)
  71. session := db.GetEngine().Table("GOODS G").
  72. Select("G.*, M.TRADEMODE, E.GOODSORDER, GG.GOODSGROUPNAME, M.RISKCONTROLMODE").
  73. Join("LEFT", "MARKET M", "M.MARKETID = G.MARKETID").
  74. Join("LEFT", "GOODSEX E", "E.GOODSID = G.GOODSID").
  75. Join("LEFT", "GOODSGROUP GG", "GG.GOODSGROUPID = G.GOODSGROUPID").
  76. Where("G.GOODSSTATUS in (3, 7)").In("M.TRADEMODE", tradeModes)
  77. if len(marketIds) > 0 {
  78. session = session.In("M.MARKETID", marketIds)
  79. }
  80. session = session.OrderBy("G.GOODSCODE")
  81. err = session.Find(&goods)
  82. return
  83. }
  84. // TradeHolderDetailEx 交易持仓扩展表
  85. type TradeHolderDetailEx struct {
  86. TradeID uint64 `json:"tradeID,string"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  87. BuyOrSell uint32 `json:"buyOrSell"` // 方向 - 0:买 1:卖
  88. TradeDate string `json:"tradeDate"` // 交易日(yyyyMMdd)
  89. MarketID uint32 `json:"marketID"` // 市场ID
  90. GoodsID uint32 `json:"goodsID"` // 商品ID
  91. UserID uint32 `json:"userID"` // 用户ID
  92. AccountID uint64 `json:"accountID"` // 账号ID
  93. MatchUserID uint32 `json:"matchUserID"` // 对手用户ID
  94. MatchAccountID uint64 `json:"matchAccountID"` // 对手账号ID
  95. OpenQty uint64 `json:"openQty"` // 建仓数量
  96. TradeAmount float64 `json:"tradeAmount"` // 成交金额
  97. OpenPrice float64 `json:"openPrice"` // 建仓价格
  98. HolderQty uint64 `json:"holderQty"` // 持仓数量
  99. HolderAmount float64 `json:"holderAmount"` // 持仓金额
  100. HolderPrice float64 `json:"holderPrice"` // 持仓价格
  101. FreezeQty uint64 `json:"freezeQty"` // 冻结数量
  102. DeliveryQty uint64 `json:"deliveryQty"` // 交收手数(已交收)
  103. HoldDays uint64 `json:"holdDays"` // 持仓天数
  104. PayedDeposit float64 `json:"payedDeposit"` // 已付定金
  105. RestockDeposit float64 `json:"restockDeposit"` // 补充定金
  106. LateFeeDays uint64 `json:"lateFeeDays"` // 滞纳金起计天数
  107. LateFeeAlgorithm uint32 `json:"lateFeeAlgorithm"` // 滞纳金收取方式 1:比率 2:固定
  108. LateFeeValue float64 `json:"lateFeeValue"` // 滞纳金收取值
  109. CallAteFee float64 `json:"callAteFee"` // 已计滞纳金
  110. PromptDepositRate float64 `json:"promptDepositRate"` // 提示定金率
  111. CutDepositRate float64 `json:"cutDepositRate"` // 斩仓定金率
  112. PromptPrice float64 `json:"promptPrice"` // 提示价格
  113. CutPrice float64 `json:"cutPrice"` // 斩仓价格
  114. ClosePL float64 `json:"closePL"` // 平仓盈亏
  115. FloatPL float64 `json:"floatPL"` // 浮动盈亏
  116. DepositRate float64 `json:"depositRate"` // 订单定金率
  117. RefundableDeposit float64 `json:"refundableDeposit"` // 可退定金
  118. TradeTime string `json:"tradeTime"` // 交易时间
  119. OriPayedDeposit float64 `json:"oripayeddeposit"` // 初始已付定金
  120. OriRestockDeposit float64 `json:"orirestockdeposit"` // 累计补充定金
  121. CanAutoAddDeposit uint64 `json:"canautoadddeposit"` // 是否允许自动追加定金: 0-否 1-是(52)
  122. AddDepositRate float64 `json:"adddepositrate"` // 自动追加定金率(52) - 允许时显示
  123. CanAutoRefundDeposit uint64 `json:"canautorefunddeposit"` // 是否允许自动退还定金: 0-否 1-是(52)
  124. ClosedDays int32 `json:"closeddays"` // 剩余平仓天数(52) -1为不强平
  125. }
  126. // RedisTradeHolderDetailEx redis存储交易持仓扩展表
  127. type RedisTradeHolderDetailEx struct {
  128. THDetailEx TradeHolderDetailEx `json:"tHDetailEx"` // 交易持仓扩展表记录
  129. FloatPL float64 `json:"floatPL"` // 浮动盈亏
  130. DepositRate float64 `json:"depositRate"` // 订单定金率
  131. RefundableDeposit float64 `json:"refundableDeposit"` // 可退定金
  132. GoodsCode string `json:"goodsCode"` // 商品代码
  133. GoodsName string `json:"goodsName"` // 商品名称
  134. GoodsUnitID uint32 `json:"goodsUnitID"` // 单位
  135. AgreeUnit float64 `json:"agreeUnit"` // 合约单位
  136. DecimalPlace uint32 `json:"decimalPlace"` // 小数位位数
  137. QuoteMinUnit uint32 `json:"quoteMinUnit"` // 行情最小变动单位
  138. GoodsUnit string `json:"goodsUnit"` // 单位名称
  139. THUMURLS string `json:"thumurls"` // 缩略图片(1:1)(逗号分隔)
  140. GOODSNAMETH string `json:"goodsnameth"` // 期货合约名称泰文)
  141. GOODSNAMEEN string `json:"goodsnameen"` // 期货合约名称(英文)
  142. GOODSNAMETW string `json:"goodsnametw"` // 期货合约名称(繁体)
  143. }
  144. type RedisTradeHolderDetailExArray []RedisTradeHolderDetailEx
  145. func (s RedisTradeHolderDetailExArray) Len() int { return len(s) }
  146. func (s RedisTradeHolderDetailExArray) Less(i, j int) bool {
  147. return s[i].THDetailEx.TradeID < s[j].THDetailEx.TradeID
  148. }
  149. func (s RedisTradeHolderDetailExArray) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
  150. // GetDataEx 从数据库中查询数据
  151. func (r *RedisTradeHolderDetailEx) GetDataEx(userId int, goodsId int) (sData RedisTradeHolderDetailExArray, err error) {
  152. redisCli := rediscli.GetRedisClient()
  153. g := strconv.Itoa(goodsId)
  154. if goodsId == 0 {
  155. g = "*"
  156. }
  157. sData = make([]RedisTradeHolderDetailEx, 0)
  158. // boost::format fmtDuration("TradeHolderDetailEx:%d_%d_%d_%" PRId64 "");
  159. // fmtDuration % detailEx.goodsid() % detailEx.buyorsell()%detailEx.userid()%detailEx.tradeid();
  160. key := fmt.Sprintf("TradeHolderDetailEx:%s_*_%d_*", g, userId)
  161. if ret, err := redisCli.Do("keys", key).Result(); err == nil {
  162. datas := ret.([]interface{})
  163. for _, item := range datas {
  164. itemKey := item.(string)
  165. if itemValue, err := redisCli.Get(itemKey).Result(); err == nil {
  166. var data pb.RedisTradeHolderDetailEx
  167. if err = proto.Unmarshal([]byte(itemValue), &data); err == nil {
  168. m := RedisTradeHolderDetailEx{}
  169. m.ParseFromProto(&data)
  170. // 处理失真问题
  171. m.THDetailEx.RefundableDeposit = utils.Float64Round(m.THDetailEx.RefundableDeposit, 2)
  172. m.THDetailEx.RestockDeposit = utils.Float64Round(m.THDetailEx.RestockDeposit, 2)
  173. m.THDetailEx.OriPayedDeposit = utils.Float64Round(m.THDetailEx.OriPayedDeposit, 2)
  174. m.THDetailEx.OriRestockDeposit = utils.Float64Round(m.THDetailEx.OriRestockDeposit, 2)
  175. m.THDetailEx.AddDepositRate = utils.Float64Round(m.THDetailEx.AddDepositRate, 4)
  176. sData = append(sData, m)
  177. }
  178. }
  179. }
  180. }
  181. // 按 TradeID 倒序排序
  182. sort.Sort(sort.Reverse(RedisTradeHolderDetailExArray(sData)))
  183. return sData, nil
  184. }
  185. func (r *RedisTradeHolderDetailEx) ParseFromProto(p *pb.RedisTradeHolderDetailEx) {
  186. r.FloatPL = p.GetFloatPL()
  187. r.DepositRate = p.GetDepositRate()
  188. r.RefundableDeposit = p.GetRefundableDeposit()
  189. r.GoodsCode = p.GetGoodsCode()
  190. r.GoodsName = p.GetGoodsName()
  191. r.GoodsUnitID = p.GetGoodsUnitID()
  192. r.AgreeUnit = p.GetAgreeUnit()
  193. r.DecimalPlace = p.GetDecimalPlace()
  194. r.QuoteMinUnit = p.GetQuoteMinUnit()
  195. r.THDetailEx = TradeHolderDetailEx{
  196. TradeID: p.GetTHDetailEx().GetTradeID(),
  197. BuyOrSell: p.GetTHDetailEx().GetBuyOrSell(),
  198. TradeDate: p.GetTHDetailEx().GetTradeDate(),
  199. MarketID: p.GetTHDetailEx().GetMarketID(),
  200. GoodsID: p.GetTHDetailEx().GetGoodsID(),
  201. UserID: p.GetTHDetailEx().GetUserID(),
  202. AccountID: p.GetTHDetailEx().GetAccountID(),
  203. MatchUserID: p.GetTHDetailEx().GetMatchUserID(),
  204. MatchAccountID: p.GetTHDetailEx().GetMatchAccountID(),
  205. OpenQty: p.GetTHDetailEx().GetOpenQty(),
  206. TradeAmount: utils.Float64Round(p.GetTHDetailEx().GetTradeAmount(), 2),
  207. OpenPrice: utils.Float64Round(p.GetTHDetailEx().GetOpenPrice(), int(p.GetDecimalPlace())),
  208. HolderQty: p.GetTHDetailEx().GetHolderQty(),
  209. HolderAmount: utils.Float64Round(p.GetTHDetailEx().GetHolderAmount(), 2),
  210. HolderPrice: p.GetTHDetailEx().GetHolderPrice(),
  211. FreezeQty: p.GetTHDetailEx().GetFreezeQty(),
  212. DeliveryQty: p.GetTHDetailEx().GetDeliveryQty(),
  213. HoldDays: p.GetTHDetailEx().GetHoldDays(),
  214. PayedDeposit: p.GetTHDetailEx().GetPayedDeposit(),
  215. RestockDeposit: p.GetTHDetailEx().GetRestockDeposit(),
  216. LateFeeDays: p.GetTHDetailEx().GetLateFeeDays(),
  217. LateFeeAlgorithm: p.GetTHDetailEx().GetLateFeeAlgorithm(),
  218. LateFeeValue: p.GetTHDetailEx().GetLateFeeValue(),
  219. CallAteFee: p.GetTHDetailEx().GetCallAteFee(),
  220. PromptDepositRate: p.GetTHDetailEx().GetPromptDepositRate(),
  221. CutDepositRate: p.GetTHDetailEx().GetCutDepositRate(),
  222. PromptPrice: utils.Float64Round(p.GetTHDetailEx().GetPromptPrice(), int(p.GetDecimalPlace())),
  223. CutPrice: utils.Float64Round(p.GetTHDetailEx().GetCutPrice(), int(p.GetDecimalPlace())),
  224. ClosePL: p.GetTHDetailEx().GetClosePL(),
  225. FloatPL: p.GetTHDetailEx().GetFloatPL(),
  226. DepositRate: p.GetTHDetailEx().GetDepositRate(),
  227. RefundableDeposit: p.GetTHDetailEx().GetRefundableDeposit(),
  228. TradeTime: p.GetTHDetailEx().GetTradeTime(),
  229. OriPayedDeposit: p.GetTHDetailEx().GetOriPayedDeposit(),
  230. OriRestockDeposit: p.GetTHDetailEx().GetOriReStockDeposit(),
  231. CanAutoAddDeposit: p.GetTHDetailEx().GetCanAutoAddDeposit(),
  232. AddDepositRate: p.GetTHDetailEx().GetAddDepositRate(),
  233. CanAutoRefundDeposit: p.GetTHDetailEx().GetCanAutoRefundDeposit(),
  234. ClosedDays: p.GetTHDetailEx().GetClosedDays(),
  235. }
  236. // 单位
  237. r.GoodsUnit = mtpcache.GetEnumDicitemName(int32(r.GoodsUnitID))
  238. r.THDetailEx.TradeTime = strings.Replace(r.THDetailEx.TradeTime, "\n\u0013", "", -1)
  239. // 获取对应的商品信息
  240. if goods, bFind := mtpcache.GetGoods(r.GoodsCode); bFind {
  241. r.THUMURLS = goods.THUMURLS
  242. }
  243. // 获取对应的商品扩展信息
  244. if goodsex, bFind := mtpcache.GetGoodsEx(r.GoodsCode); bFind {
  245. r.GOODSNAMETH = goodsex.GOODSNAMETH
  246. r.GOODSNAMEEN = goodsex.GOODSNAMEEN
  247. r.GOODSNAMETW = goodsex.GOODSNAMETW
  248. }
  249. }
  250. type MyTradegoodsdeliveryoffline struct {
  251. DELIVERYORDERID string `json:"deliveryorderid" xorm:"DELIVERYORDERID"` // 交收单号(905+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  252. USERID int64 `json:"userid" xorm:"USERID" form:"userid" binding:"required"` // 申请用户ID
  253. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账户ID
  254. GOODSID int64 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  255. MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID
  256. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 交收方向 - 0:买 1:卖
  257. DELIVERYLOT int64 `json:"deliverylot" xorm:"DELIVERYLOT"` // 交收手数
  258. DELIVERYQTY int64 `json:"deliveryqty" xorm:"DELIVERYQTY"` // 交收数量 (手数*合约乘数)
  259. DELIVERYINFO string `json:"deliveryinfo" xorm:"DELIVERYINFO"` // 交收信息
  260. MATCHUSERID int64 `json:"matchuserid" xorm:"MATCHUSERID"` // 对手方UserID
  261. MATCHACCOUNTID int64 `json:"matchaccountid" xorm:"MATCHACCOUNTID"` // 对手方AccountID
  262. REQTIME string `json:"reqtime" xorm:"REQTIME"` // 申请时间
  263. REQTRADEDATE string `json:"reqtradedate" xorm:"REQTRADEDATE"` // 申请交易日
  264. ORDERSTATUS int32 `json:"orderstatus" xorm:"ORDERSTATUS"` // 线下交收单状态 - 1:待处理 2:交收中 3:已完成 4:申请失败 枚举deliveryOrderStatus
  265. DELIVERYPRICE float64 `json:"deliveryprice" xorm:"DELIVERYPRICE"` // 交收价格
  266. DELIVERYAMOUNT float64 `json:"deliveryamount" xorm:"DELIVERYAMOUNT"` // 交收货款
  267. CLOSETIME time.Time `json:"closetime" xorm:"CLOSETIME"` // 完成时间
  268. CLOSETRADEDATE string `json:"closetradedate" xorm:"CLOSETRADEDATE"` // 完成交易日
  269. DELIVERYCHARGE float64 `json:"deliverycharge" xorm:"DELIVERYCHARGE"` // 交割手续费
  270. FEEALGORITHM int32 `json:"feealgorithm" xorm:"FEEALGORITHM"` // 手续费收取方式 1:比率 2:固定
  271. MEMBERCHARGEVALUE float64 `json:"memberchargevalue" xorm:"MEMBERCHARGEVALUE"` // 会员手续费设置值
  272. EXCHCHARGEVALUE float64 `json:"exchchargevalue" xorm:"EXCHCHARGEVALUE"` // 交易所手续费设置值
  273. HANDLESTATUS int32 `json:"handlestatus" xorm:"HANDLESTATUS"` // 处理状态
  274. DELIVERYPREMIUM float64 `json:"deliverypremium" xorm:"DELIVERYPREMIUM"` // 交收升贴水(每单位)
  275. DELIVERYTOTALAMOUNT float64 `json:"deliverytotalamount" xorm:"DELIVERYTOTALAMOUNT"` // 交收总货款 = 交收货款 + 交收升贴水 * 交收数量
  276. DELIVERYSTATUS int32 `json:"deliverystatus" xorm:"DELIVERYSTATUS" form:"deliverystatus"` // 交收单状态2(52模式使用) - 1:待审核 2:待确认 3:待付款 4:付款中 5:已完成付款 6:处理中 20:交收完成 21:审核拒绝 22:确认过期 23:付款过期 24:财务撤销 -- 枚举deliveryStatus
  277. TOCONFIRMTIME time.Time `json:"toconfirmtime" xorm:"TOCONFIRMTIME"` // 确认截止时间(买交收)
  278. TOPAYTIME time.Time `json:"topaytime" xorm:"TOPAYTIME"` // 付款截止时间(买交收)
  279. PAYEDAMOUNT float64 `json:"payedamount" xorm:"PAYEDAMOUNT"` // 已付货款
  280. FREEZEAMOUNT float64 `json:"freezeamount" xorm:"FREEZEAMOUNT"` // 冻结货款
  281. REALDELIVERYQTY float64 `json:"realdeliveryqty" xorm:"REALDELIVERYQTY"` // 实际交收数量
  282. REALDELIVERYAMOUNT float64 `json:"realdeliveryamount" xorm:"REALDELIVERYAMOUNT"` // 实际交收货款
  283. CLIENTTICKET string `json:"clientticket" xorm:"CLIENTTICKET"` // 客户端流水号
  284. GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 期货合约代码(内部)
  285. GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 期货合约名称
  286. AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 期货合约乘数
  287. DECIMALPLACE int32 `json:"decimalplace" xorm:"DECIMALPLACE"` // 报价小数位
  288. GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID
  289. Status string `json:"-" form:"status"` // 状态入参
  290. PageEx `xorm:"extends"` // 页码信息
  291. }
  292. func (r *MyTradegoodsdeliveryoffline) calc() {
  293. }
  294. func (r *MyTradegoodsdeliveryoffline) buildSql() string {
  295. var sqlId utils.SQLVal = `
  296. SELECT
  297. to_char(t.deliveryorderid) DELIVERYORDERID,
  298. t.userid,
  299. t.accountid,
  300. t.goodsid,
  301. t.marketid,
  302. t.buyorsell,
  303. t.deliverylot,
  304. t.deliveryqty,
  305. t.deliveryinfo,
  306. t.matchuserid,
  307. t.matchaccountid,
  308. to_char(t.reqtime, 'yyyy-MM-dd hh24:mi:ss') REQTIME,
  309. t.reqtradedate,
  310. t.orderstatus,
  311. t.deliveryprice,
  312. t.deliveryamount,
  313. t.closetime,
  314. t.closetradedate,
  315. t.deliverycharge,
  316. t.feealgorithm,
  317. t.memberchargevalue,
  318. t.exchchargevalue,
  319. t.handlestatus,
  320. t.deliverypremium,
  321. t.deliverytotalamount,
  322. t.deliverystatus,
  323. t.toconfirmtime,
  324. t.topaytime,
  325. t.payedamount,
  326. t.freezeamount,
  327. t.REALDELIVERYQTY,
  328. t.REALDELIVERYAMOUNT,
  329. g.goodscode,
  330. g.goodsname,
  331. g.agreeunit,
  332. g.goodunitid,
  333. g.decimalplace
  334. FROM TRADE_GOODSDELIVERYOFFLINE t
  335. LEFT JOIN GOODS g ON g.goodsid = t.goodsid
  336. WHERE t.userid = %v
  337. `
  338. sqlId.FormatParam(r.USERID)
  339. // sqlId.AndEx("t.DELIVERYSTATUS", r.DELIVERYSTATUS, r.DELIVERYSTATUS > 0)
  340. sqlId.JoinEx(r.Status != "", fmt.Sprintf(" AND t.DELIVERYSTATUS IN (%v)", r.Status))
  341. sqlId.OrderByDesc("t.deliveryorderid")
  342. sqlId.Page(r.Page, r.PageSize)
  343. return sqlId.String()
  344. }
  345. func (r *MyTradegoodsdeliveryoffline) GetDataByPage() (interface{}, error, int, int, int) {
  346. sData := make([]MyTradegoodsdeliveryoffline, 0)
  347. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  348. total := 0
  349. for i := range sData {
  350. sData[i].calc()
  351. total = sData[i].Total
  352. }
  353. return sData, err, r.Page, r.PageSize, total
  354. }
  355. // Deliveryofflinedetail 交易合约线下交收明细表
  356. type MyDeliveryofflinedetail struct {
  357. DELIVERYDETAILID string `json:"deliverydetailid" xorm:"DELIVERYDETAILID"` // 明细单号(906+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  358. DELIVERYORDERID string `json:"deliveryorderid" xorm:"DELIVERYORDERID" form:"deliveryorderid" binding:"required"` // 交收单号(905+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  359. TRADEID string `json:"tradeid" xorm:"TRADEID"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  360. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖
  361. USERID int64 `json:"userid" xorm:"USERID" form:"userid" binding:"required"` // 用户ID
  362. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账号ID
  363. HOLDLOT int64 `json:"holdlot" xorm:"HOLDLOT"` // 持仓手数
  364. HOLDQTY int64 `json:"holdqty" xorm:"HOLDQTY"` // 持仓数量(手数*合约乘数)
  365. DELIVERYLOT int64 `json:"deliverylot" xorm:"DELIVERYLOT"` // 申请交收手数
  366. DELIVERYQTY int64 `json:"deliveryqty" xorm:"DELIVERYQTY"` // 申请交收数量 (手数*合约乘数)
  367. DELIVERYPRICE float64 `json:"deliveryprice" xorm:"DELIVERYPRICE"` // 交收价格
  368. DELIVERYAMOUNT float64 `json:"deliveryamount" xorm:"DELIVERYAMOUNT"` // 交收货款
  369. CREATETIME time.Time `json:"createtime" xorm:"CREATETIME"` // 创建时间
  370. PageEx `xorm:"extends"` // 页码信息
  371. }
  372. func (r *MyDeliveryofflinedetail) calc() {
  373. }
  374. func (r *MyDeliveryofflinedetail) buildSql() string {
  375. var sqlId utils.SQLVal = `
  376. SELECT
  377. to_char(t.deliverydetailid) DELIVERYDETAILID,
  378. to_char(t.deliveryorderid) DELIVERYORDERID,
  379. to_char(t.tradeid) TRADEID,
  380. t.buyorsell,
  381. t.userid,
  382. t.accountid,
  383. t.holdlot,
  384. t.holdqty,
  385. t.deliverylot,
  386. t.deliveryqty,
  387. t.deliveryprice,
  388. t.deliveryamount,
  389. t.createtime
  390. FROM DELIVERYOFFLINEDETAIL t
  391. WHERE t.userid = %v AND t.deliveryorderid = %v
  392. `
  393. sqlId.FormatParam(r.USERID, r.DELIVERYORDERID)
  394. sqlId.Page(r.Page, r.PageSize)
  395. return sqlId.String()
  396. }
  397. func (r *MyDeliveryofflinedetail) GetDataByPage() (interface{}, error, int, int, int) {
  398. sData := make([]MyDeliveryofflinedetail, 0)
  399. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  400. total := 0
  401. for i := range sData {
  402. sData[i].calc()
  403. total = sData[i].Total
  404. }
  405. return sData, err, r.Page, r.PageSize, total
  406. }
  407. // Deliveryofflineoperatelog 交易合约线下交收操作流水表
  408. type MyDeliveryofflineoperatelog struct {
  409. OPERATELOGID string `json:"operatelogid" xorm:"OPERATELOGID"` // 明细单号(907+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  410. DELIVERYORDERID string `json:"deliveryorderid" xorm:"DELIVERYORDERID" form:"deliveryorderid" binding:"required"` // 交收单ID
  411. OPERATETYPE int32 `json:"operatetype" xorm:"OPERATETYPE" form:"operatetype"` // 操作类型 - 1:交收流程 2:付款流水
  412. CURDELIVERYSTATUS int32 `json:"curdeliverystatus" xorm:"CURDELIVERYSTATUS"` // 当前交收状态(OperateType=1时) - 枚举deliveryStatus
  413. AFTDELIVERYSTATUS int32 `json:"aftdeliverystatus" xorm:"AFTDELIVERYSTATUS"` // 操作后交收状态(OperateType=1时) - 枚举deliveryStatus
  414. OPERATORSRC int32 `json:"operatorsrc" xorm:"OPERATORSRC"` // 操作人来源 - 1:管理端 2:终端 3:系统
  415. OPERATORID int64 `json:"operatorid" xorm:"OPERATORID"` // 操作人ID - systemmanager的autoid 或 loginaccount的loginid
  416. OPERATORACCOUNT string `json:"operatoraccount" xorm:"OPERATORACCOUNT"` // 操作人账号 - systemmanager的logincode 或 loginaccount的logincode,无则用loginid
  417. OPERATORNAME string `json:"operatorname" xorm:"OPERATORNAME"` // 操作人名称 - systemmanager的username 或 loginaccount的logincode,无则用loginid
  418. REMARK string `json:"remark" xorm:"REMARK"` // 操作备注
  419. OPERATETIME string `json:"operatetime" xorm:"OPERATETIME"` // 操作时间
  420. FILENAME string `json:"filename" xorm:"FILENAME"` // 文件名称
  421. FILEADDRESS string `json:"fileaddress" xorm:"FILEADDRESS"` // 文件地址
  422. DELIVERYPAYMODE int32 `json:"deliverypaymode" xorm:"DELIVERYPAYMODE" form:"deliverypaymode"` // 付款方式 - 1:线上支付2:线下支付 - 枚举deliveryPayMode
  423. PAYAMOUNT float64 `json:"payamount" xorm:"PAYAMOUNT"` // 付款金额
  424. CONFIRMSTATUS int32 `json:"confirmstatus" xorm:"CONFIRMSTATUS" form:"confirmstatus"` // 确认状态 - 1:未确认 2:已确认 - 枚举confirmStatus
  425. CONFIRMID int64 `json:"confirmid" xorm:"CONFIRMID"` // 确认人
  426. CONFIRMTIME time.Time `json:"confirmtime" xorm:"CONFIRMTIME"` // 确认时间
  427. PageEx `xorm:"extends"` // 页码信息
  428. }
  429. func (r *MyDeliveryofflineoperatelog) calc() {
  430. }
  431. func (r *MyDeliveryofflineoperatelog) buildSql() string {
  432. var sqlId utils.SQLVal = `
  433. SELECT
  434. to_char(t.operatelogid) OPERATELOGID,
  435. to_char(t.deliveryorderid) DELIVERYORDERID,
  436. t.operatetype,
  437. t.curdeliverystatus,
  438. t.aftdeliverystatus,
  439. t.operatorsrc,
  440. t.operatorid,
  441. t.operatoraccount,
  442. t.operatorname,
  443. t.remark,
  444. to_char(t.operatetime, 'yyyy-MM-dd hh24:mi:ss') OPERATETIME,
  445. t.filename,
  446. t.fileaddress,
  447. t.deliverypaymode,
  448. t.payamount,
  449. t.confirmstatus,
  450. t.confirmid,
  451. t.confirmtime
  452. FROM DELIVERYOFFLINEOPERATELOG t
  453. WHERE t.deliveryorderid = %v
  454. `
  455. sqlId.FormatParam(r.DELIVERYORDERID)
  456. sqlId.AndEx("t.operatetype", r.OPERATETYPE, r.OPERATETYPE > 0)
  457. sqlId.OrderByDesc("t.operatetime")
  458. sqlId.Page(r.Page, r.PageSize)
  459. return sqlId.String()
  460. }
  461. func (r *MyDeliveryofflineoperatelog) GetDataByPage() (interface{}, error, int, int, int) {
  462. sData := make([]MyDeliveryofflineoperatelog, 0)
  463. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  464. total := 0
  465. for i := range sData {
  466. sData[i].calc()
  467. total = sData[i].Total
  468. }
  469. return sData, err, r.Page, r.PageSize, total
  470. }
  471. // Tradeholderdetailex 交易持仓扩展表
  472. type Tradeholderdetailex struct {
  473. TRADEID string `json:"tradeid" xorm:"TRADEID"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  474. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖
  475. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE" form:"tradedate"` // 交易日(yyyyMMdd)
  476. MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID
  477. GOODSID int32 `json:"goodsid" xorm:"GOODSID" form:"goodsid"` // 商品ID
  478. USERID int64 `json:"userid" xorm:"USERID"` // 用户ID
  479. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID" form:"accountid" binding:"required"` // 账号ID
  480. MATCHUSERID int64 `json:"matchuserid" xorm:"MATCHUSERID"` // 对手用户ID
  481. MATCHACCOUNTID int64 `json:"matchaccountid" xorm:"MATCHACCOUNTID"` // 对手账号ID
  482. OPENQTY int64 `json:"openqty" xorm:"OPENQTY"` // 建仓数量
  483. TRADEAMOUNT float64 `json:"tradeamount" xorm:"TRADEAMOUNT"` // 成交金额
  484. OPENPRICE float64 `json:"openprice" xorm:"OPENPRICE"` // 建仓价格
  485. HOLDERQTY int64 `json:"holderqty" xorm:"HOLDERQTY" form:"holderqty"` // 持仓数量
  486. HOLDERAMOUNT float64 `json:"holderamount" xorm:"HOLDERAMOUNT"` // 持仓金额
  487. HOLDERPRICE float64 `json:"holderprice" xorm:"HOLDERPRICE"` // 持仓价格
  488. FREEZEQTY int64 `json:"freezeqty" xorm:"FREEZEQTY"` // 冻结数量
  489. DELIVERYQTY int64 `json:"deliveryqty" xorm:"DELIVERYQTY"` // 交收手数(已交收)
  490. HOLDDAYS int32 `json:"holddays" xorm:"HOLDDAYS"` // 持仓天数
  491. PAYEDDEPOSIT float64 `json:"payeddeposit" xorm:"PAYEDDEPOSIT"` // 已付定金
  492. RESTOCKDEPOSIT float64 `json:"restockdeposit" xorm:"RESTOCKDEPOSIT"` // 补充定金
  493. LATEFEEDAYS int32 `json:"latefeedays" xorm:"LATEFEEDAYS"` // 滞纳金起计天数
  494. LATEFEEALGORITHM int32 `json:"latefeealgorithm" xorm:"LATEFEEALGORITHM"` // 滞纳金收取方式 1:比率 2:固定
  495. LATEFEEVALUE float64 `json:"latefeevalue" xorm:"LATEFEEVALUE"` // 滞纳金收取值
  496. CALLATEFEE float64 `json:"callatefee" xorm:"CALLATEFEE"` // 已计滞纳金
  497. PROMPTDEPOSITRATE float64 `json:"promptdepositrate" xorm:"PROMPTDEPOSITRATE"` // 提示定金率
  498. CUTDEPOSITRATE float64 `json:"cutdepositrate" xorm:"CUTDEPOSITRATE"` // 斩仓定金率
  499. PROMPTPRICE float64 `json:"promptprice" xorm:"PROMPTPRICE"` // 提示价格
  500. CUTPRICE float64 `json:"cutprice" xorm:"CUTPRICE"` // 斩仓价格
  501. CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 平仓盈亏
  502. FLOATPL float64 `json:"floatpl" xorm:"FLOATPL"` // 浮动盈亏
  503. DEPOSITRATE float64 `json:"depositrate" xorm:"DEPOSITRATE"` // 订单定金率
  504. REFUNDABLEDEPOSIT float64 `json:"refundabledeposit" xorm:"REFUNDABLEDEPOSIT"` // 可退定金
  505. PAYEDLATEFEE float64 `json:"payedlatefee" xorm:"PAYEDLATEFEE"` // 已付滞纳金
  506. TRADETIME string `json:"tradetime" xorm:"TRADETIME"` // 交易时间
  507. HANDLESTATUS int32 `json:"handlestatus" xorm:"HANDLESTATUS"` // 处理状态
  508. ORIPAYEDDEPOSIT float64 `json:"oripayeddeposit" xorm:"ORIPAYEDDEPOSIT"` // 初始已付定金
  509. ORIRESTOCKDEPOSIT float64 `json:"orirestockdeposit" xorm:"ORIRESTOCKDEPOSIT"` // 累计补充定金
  510. CANAUTOADDDEPOSIT uint64 `json:"canautoadddeposit" xorm:"CANAUTOADDDEPOSIT"` // 是否允许自动追加定金: 0-否 1-是(52)
  511. ADDDEPOSITRATE float64 `json:"adddepositrate" xorm:"ADDDEPOSITRATE"` // 自动追加定金率(52) - 允许时显示
  512. CANAUTOREFUNDDEPOSIT uint64 `json:"canautorefunddeposit" xorm:"CANAUTOREFUNDDEPOSIT"` // 是否允许自动退还定金: 0-否 1-是(52)
  513. GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 期货合约代码(内部)
  514. GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 期货合约名称
  515. AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 期货合约乘数
  516. DECIMALPLACE int32 `json:"decimalplace" xorm:"DECIMALPLACE"` // 报价小数位
  517. GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID
  518. THUMURLS string `json:"thumurls" xorm:"THUMURLS"` // 缩略图片(1:1)(逗号分隔)
  519. GOODSNAMETH string `json:"goodsnameth" xorm:"GOODSNAMETH"` // 期货合约名称泰文)
  520. GOODSNAMEEN string `json:"goodsnameen" xorm:"GOODSNAMEEN"` // 期货合约名称(英文)
  521. GOODSNAMETW string `json:"goodsnametw" xorm:"GOODSNAMETW"` // 期货合约名称(繁体)
  522. MarketIds string `form:"marketids"` // 过滤市场ID列表,格式 1,2,3
  523. TradeModes string `form:"trademodes"` // 过滤交易模式列表,格式 10,53
  524. PageEx `xorm:"extends"` // 页码信息
  525. }
  526. func (r *Tradeholderdetailex) calc() {
  527. if r.TRADEAMOUNT != 0.0 {
  528. r.TRADEAMOUNT = utils.Float64Round(r.TRADEAMOUNT, 2)
  529. }
  530. if r.OPENPRICE != 0.0 {
  531. r.OPENPRICE = utils.Float64Round(r.OPENPRICE, int(r.DECIMALPLACE))
  532. }
  533. if r.HOLDERAMOUNT != 0.0 {
  534. r.HOLDERAMOUNT = utils.Float64Round(r.HOLDERAMOUNT, 2)
  535. }
  536. if r.PROMPTPRICE != 0.0 {
  537. r.PROMPTPRICE = utils.Float64Round(r.PROMPTPRICE, int(r.DECIMALPLACE))
  538. }
  539. if r.CUTPRICE != 0.0 {
  540. r.CUTPRICE = utils.Float64Round(r.CUTPRICE, int(r.DECIMALPLACE))
  541. }
  542. }
  543. func (r *Tradeholderdetailex) buildSql() string {
  544. var sqlId utils.SQLVal = `
  545. select
  546. to_char(t.tradeid) TRADEID,
  547. t.buyorsell,
  548. t.tradedate,
  549. t.marketid,
  550. t.goodsid,
  551. t.userid,
  552. t.accountid,
  553. t.matchuserid,
  554. t.matchaccountid,
  555. t.openqty,
  556. t.tradeamount,
  557. t.openprice,
  558. t.holderqty,
  559. t.holderamount,
  560. t.holderprice,
  561. t.freezeqty,
  562. t.deliveryqty,
  563. t.holddays,
  564. t.payeddeposit,
  565. t.restockdeposit,
  566. t.latefeedays,
  567. t.latefeealgorithm,
  568. t.latefeevalue,
  569. t.callatefee,
  570. t.promptdepositrate,
  571. t.cutdepositrate,
  572. t.promptprice,
  573. t.cutprice,
  574. t.closepl,
  575. t.floatpl,
  576. t.depositrate,
  577. t.refundabledeposit,
  578. t.payedlatefee,
  579. to_char(t.tradetime, 'yyyy-MM-dd hh24:mi:ss') TRADETIME,
  580. t.handlestatus,
  581. t.oripayeddeposit,
  582. t.orirestockdeposit,
  583. t.canautoadddeposit,
  584. t.adddepositrate,
  585. t.canautorefunddeposit,
  586. g.goodscode,
  587. g.goodsname,
  588. g.agreeunit,
  589. g.decimalplace,
  590. g.goodunitid,
  591. g.thumurls,
  592. ge.goodsnameth,
  593. ge.goodsnameen,
  594. ge.goodsnametw
  595. from trade_holderdetailex t
  596. left join goods g on g.goodsid = t.goodsid
  597. left join goodsex ge on t.goodsid = ge.goodsid
  598. left join market m on t.marketid = m.marketid
  599. where 1=1
  600. `
  601. sqlId.And("t.accountid", r.ACCOUNTID)
  602. sqlId.AndEx("t.tradedate", r.TRADEDATE, r.TRADEDATE != "")
  603. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  604. sqlId.AndEx("t.holderqty", r.HOLDERQTY, r.HOLDERQTY > 0)
  605. if r.MarketIds != "" {
  606. sqlId.JoinFormat(" and t.marketid in (%s)", r.MarketIds)
  607. }
  608. if r.TradeModes != "" {
  609. sqlId.JoinFormat(" and m.trademode in (%s)", r.TradeModes)
  610. }
  611. sqlId.OrderByDesc("t.tradetime")
  612. sqlId.Page(r.Page, r.PageSize)
  613. return sqlId.String()
  614. }
  615. func (r *Tradeholderdetailex) GetDataByPage() (interface{}, error, int, int, int) {
  616. sData := make([]Tradeholderdetailex, 0)
  617. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  618. total := 0
  619. for i := range sData {
  620. sData[i].calc()
  621. total = sData[i].Total
  622. }
  623. return sData, err, r.Page, r.PageSize, total
  624. }
  625. type TradeCloseDetail struct {
  626. CLOSEID string `json:"closeid" xorm:"CLOSEID"` // 平仓明细ID(104+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  627. TRADEID int64 `json:"tradeid" xorm:"TRADEID"` // 成交单号
  628. OPENTRADEID string `json:"opentradeid" xorm:"OPENTRADEID"` // 关联建仓成交单号
  629. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  630. MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID
  631. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  632. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID" form:"accountid" binding:"required"` // 账号ID
  633. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖
  634. OPENPRICE float64 `json:"openprice" xorm:"OPENPRICE"` // 建仓价格
  635. HOLDERPRICE float64 `json:"holderprice" xorm:"HOLDERPRICE"` // 持仓价格
  636. CLOSEQTY int64 `json:"closeqty" xorm:"CLOSEQTY"` // 平仓数量
  637. CLOSEPRICE float64 `json:"closeprice" xorm:"CLOSEPRICE"` // 平仓价格
  638. CLOSETIME time.Time `json:"closetime" xorm:"CLOSETIME"` // 平仓时间
  639. TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性
  640. OPTIONTYPE int32 `json:"optiontype" xorm:"OPTIONTYPE"` // 期权类型 - 1:认购(看涨) 2:认沽(看跌)
  641. PREMIUM float64 `json:"premium" xorm:"PREMIUM"` // 权利金 - [持仓单的权利金]
  642. ISPREEXERCISE int32 `json:"ispreexercise" xorm:"ISPREEXERCISE"` // 是否预申报- 0:否 1:是
  643. PREEXERCISEPRICE float64 `json:"preexerciseprice" xorm:"PREEXERCISEPRICE"` // 预申报价格
  644. ISCONFIRMEXERCISE int32 `json:"isconfirmexercise" xorm:"ISCONFIRMEXERCISE"` // 是否确认行权- 0:否 1:是
  645. OPENTRADEDATE string `json:"opentradedate" xorm:"OPENTRADEDATE"` // 建仓成交单交易日
  646. RELEASECREDIT float64 `json:"releasecredit" xorm:"RELEASECREDIT"` // 释放授信金额
  647. CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 平仓盈亏 - 按持仓价计算
  648. GOODSFULLNAME string `json:"goodsfullname" xorm:"GOODSFULLNAME"` // 商品名称
  649. OPENNUM string `json:"opennum" xorm:"OPENNUM"` // 开仓数量(带单位)
  650. CLOSENUM string `json:"closenum" xorm:"CLOSENUM"` // 平仓数量(带单位)
  651. REPAYEDDEPOSIT float64 `json:"repayeddeposit" xorm:"REPAYEDDEPOSIT"` // 已付定金
  652. RERESTOCKDEPOSIT float64 `json:"rerestockdeposit" xorm:"RERESTOCKDEPOSIT"` // 补充定金
  653. RECALLATEFEE float64 `json:"recallatefee" xorm:"RECALLATEFEE"` // 滞纳金
  654. PageEx `xorm:"extends"` // 页码信息
  655. }
  656. func (r *TradeCloseDetail) calc() {
  657. }
  658. func (r *TradeCloseDetail) buildSql() string {
  659. var sqlId utils.SQLVal = `
  660. select to_char(qt.opentradeid) OPENTRADEID,
  661. to_char(qt.closeid) CLOSEID,
  662. qt.accountid,
  663. qt.goodsid,
  664. qt.buyorsell,
  665. qt.openqty,
  666. qt.openprice,
  667. qt.closeqty,
  668. qt.closeprice,
  669. qt.closepl,
  670. qt.closetime,
  671. g.goodscode || '/' || g.goodsname "goodsfullname",
  672. qt.openqty * g.agreeunit || ' ' || en.enumdicname "opennum",
  673. qt.closeqty * g.agreeunit || ' ' || en.enumdicname "closenum",
  674. qt.repayeddeposit,
  675. qt.rerestockdeposit,
  676. qt.recallatefee
  677. from (select cd.opentradeid,
  678. cd.closeid,
  679. cd.accountid,
  680. cd.goodsid,
  681. hd.buyorsell,
  682. hd.openqty,
  683. hd.openprice,
  684. cd.closeqty,
  685. cd.closeprice,
  686. cd.closepl,
  687. cd.closetime,
  688. cdex.repayeddeposit,
  689. cdex.rerestockdeposit,
  690. cdex.recallatefee
  691. from trade_closedetail cd
  692. inner join trade_holderdetailex hd
  693. on hd.tradeid = cd.opentradeid
  694. and hd.accountid = cd.accountid
  695. left join trade_closedetailex cdex on cd.closeid = cdex.closeid
  696. where cd.accountid = %v
  697. union
  698. select cd.opentradeid,
  699. cd.closeid,
  700. cd.accountid,
  701. cd.goodsid,
  702. hd.buyorsell,
  703. hd.openqty,
  704. hd.openprice,
  705. cd.closeqty,
  706. cd.closeprice,
  707. cd.closepl,
  708. cd.closetime,
  709. cdex.repayeddeposit,
  710. cdex.rerestockdeposit,
  711. cdex.recallatefee
  712. from his_trade_closedetail cd
  713. inner join trade_holderdetailex hd
  714. on hd.tradeid = cd.opentradeid
  715. and hd.accountid = cd.accountid
  716. left join trade_closedetailex cdex on cd.closeid = cdex.closeid
  717. where cd.isvaliddata = 1
  718. and cd.accountid = %v) qt
  719. left join goods g
  720. on qt.goodsid = g.goodsid
  721. left join enumdicitem en
  722. on en.enumitemname = g.goodunitid
  723. and en.enumdiccode = 'goodsunit'
  724. order by qt.closeid desc
  725. `
  726. sqlId.FormatParam(r.ACCOUNTID, r.ACCOUNTID)
  727. sqlId.Page(r.Page, r.PageSize)
  728. return sqlId.String()
  729. }
  730. func (r *TradeCloseDetail) GetDataByPage() (interface{}, error, int, int, int) {
  731. sData := make([]TradeCloseDetail, 0)
  732. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  733. total := 0
  734. for i := range sData {
  735. sData[i].calc()
  736. total = sData[i].Total
  737. }
  738. return sData, err, r.Page, r.PageSize, total
  739. }
  740. type MemberPayInfo struct {
  741. USERID int64 `json:"userid" xorm:"USERID" form:"userid" binding:"required"` // 用户ID
  742. PAYMODEL int32 `json:"paymodel" xorm:"PAYMODEL"` // 支付方式 - 1:银行卡 2:微信 3:支付宝
  743. PAYINFO string `json:"payinfo" xorm:"PAYINFO"` // 支付信息
  744. PAYQRCODE string `json:"payqrcode" xorm:"PAYQRCODE"` // 支付二维码(图片地址)
  745. }
  746. func (r *MemberPayInfo) calc() {}
  747. func (r *MemberPayInfo) buildSql() string {
  748. // 使用枚举的param1字段用于排序
  749. var sqlId utils.SQLVal = `
  750. select t.userid,
  751. t.paymodel,
  752. t.payinfo,
  753. t.payqrcode
  754. from userpayinfo t
  755. inner join useraccount ua on t.userid = ua.memberuserid
  756. left join enumdicitem en on en.enumdiccode='paymodel' and en.enumitemname = t.paymodel
  757. where ua.userid = %v
  758. order by en.param1, t.paymodel desc
  759. `
  760. sqlId.FormatParam(r.USERID)
  761. return sqlId.String()
  762. }
  763. func (r *MemberPayInfo) GetDataEx() (interface{}, error) {
  764. sData := make([]MemberPayInfo, 0)
  765. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  766. for i := range sData {
  767. sData[i].calc()
  768. }
  769. return sData, err
  770. }
  771. type UserTradeSetting struct {
  772. USERID int64 `json:"userid" xorm:"USERID" form:"userid" binding:"required"` // 用户ID
  773. GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  774. GOODSTRADETYPE string `json:"goodstradetype" xorm:"GOODSTRADETYPE"` // 商品交易权限类型(3) - 1:可建可平 2:可建不可平 3:不可建可平 4:不可建不可平
  775. CLOSEDDAYS string `json:"closeddays" xorm:"CLOSEDDAYS"` // 最大持仓天数(3) -1为不限
  776. }
  777. func (r *UserTradeSetting) calc() {}
  778. func (r *UserTradeSetting) buildSql() string {
  779. var sqlId utils.SQLVal = `
  780. select t.grouptype,
  781. t.userid,
  782. t.goodsid,
  783. t.accountid,
  784. t.goodstradetype,
  785. t.closeddays
  786. from userauditconfig t
  787. where t.grouptype = 3 and t.userid = %v
  788. `
  789. sqlId.FormatParam(r.USERID)
  790. return sqlId.String()
  791. }
  792. func (r *UserTradeSetting) GetDataEx() (interface{}, error) {
  793. sData := make([]UserTradeSetting, 0)
  794. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  795. for i := range sData {
  796. sData[i].calc()
  797. }
  798. return sData, err
  799. }
  800. type UserGoodsInventoryRsp struct {
  801. USERID int64 `json:"userid" xorm:"USERID"` // 用户ID
  802. GOODSID int64 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  803. CURQTY float64 `json:"curqty" xorm:"CURQTY"` // 期末库存量
  804. UPDATETIME time.Time `json:"updatetime" xorm:"UPDATETIME"` // 更新时间
  805. GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 期货合约代码(内部)
  806. GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 期货合约名称
  807. GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID
  808. Goodunit string `json:"goodunit" xorm:"'GOODUNIT'"` // 报价单位
  809. }
  810. func FindUserGoodsInventory(userId int) (datas []UserGoodsInventoryRsp, err error) {
  811. datas = make([]UserGoodsInventoryRsp, 0)
  812. err = db.GetEngine().
  813. Table("GOODS G").
  814. Join("INNER", "MARKET M", "M.MARKETID = G.MARKETID AND M.MARKETID = 52101").
  815. Join("LEFT", "USERGOODSINVENTORY T", "G.GOODSID = T.GOODSID AND T.USERID = ?", userId).
  816. Join("LEFT", "ENUMDICITEM E", "G.GOODUNITID = E.ENUMITEMNAME AND E.ENUMDICCODE = 'goodsunit'").
  817. Select(`T.USERID, T.CURQTY, T.UPDATETIME,
  818. G.GOODSID, G.GOODSCODE, G.GOODSNAME, G.GOODUNITID,
  819. E.ENUMDICNAME GOODUNIT`).Find(&datas)
  820. return
  821. }
  822. type UsergoodsinventorylogRsp struct {
  823. APPLYID int64 `json:"applyid" xorm:"APPLYID"` // 申请ID(SEQ_USERGOODSINVENTORYLOG)
  824. INOUTTYPE int32 `json:"inouttype" xorm:"INOUTTYPE"` // 申请类型 - 1:入库 2:出库 (enum:inouttype)
  825. USERID int64 `json:"userid" xorm:"USERID"` // 申请人ID
  826. GOODSID int64 `json:"goodsid" xorm:"GOODSID"` // 商品ID
  827. QTY float64 `json:"qty" xorm:"QTY"` // 数量
  828. INREALQTY float64 `json:"inrealqty" xorm:"INREALQTY"` // 实际数量
  829. INOUTMODEL int32 `json:"inoutmodel" xorm:"INOUTMODEL"` // 出入库方式 - 1:邮寄 3:自提 4:配送(enum:appointmentModelOut)
  830. REMARK string `json:"remark" xorm:"REMARK"` // 备注
  831. APPLYSTATUS int32 `json:"applystatus" xorm:"APPLYSTATUS"` // 申请状态(enum:inoutapplystatus) - 1:待审核 2:审核通过 3:审核拒绝 4:处理失败
  832. APPLYTIME time.Time `json:"applytime" xorm:"APPLYTIME"` // 申请时间
  833. AUDITID int64 `json:"auditid" xorm:"AUDITID"` // 审核人
  834. AUDITTIME time.Time `json:"audittime" xorm:"AUDITTIME"` // 审核时间
  835. AUDITREMARK string `json:"auditremark" xorm:"AUDITREMARK"` // 审核备注
  836. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd)
  837. CLIENTTICKET string `json:"clientticket" xorm:"CLIENTTICKET"` // 客户端流水号
  838. GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 期货合约代码(内部)
  839. GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 期货合约名称
  840. GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID
  841. Goodunit string `json:"goodunit" xorm:"'GOODUNIT'"` // 报价单位
  842. }
  843. func FindUserGoodsInventoryLog(userId int, goodsId int) (datas []UsergoodsinventorylogRsp, err error) {
  844. datas = make([]UsergoodsinventorylogRsp, 0)
  845. session := db.GetEngine().
  846. Table("USERGOODSINVENTORYLOG T").
  847. Join("LEFT", "GOODS G", "G.GOODSID = T.GOODSID").
  848. Join("LEFT", "ENUMDICITEM E", "G.GOODUNITID = E.ENUMITEMNAME AND E.ENUMDICCODE = 'goodsunit'").
  849. Select(`T.*,
  850. G.GOODSCODE, G.GOODSNAME, G.GOODUNITID,
  851. E.ENUMDICNAME GOODUNIT`).
  852. Where("T.USERID = ?", userId)
  853. if goodsId != 0 {
  854. session = session.And("T.GOODSID = ?", goodsId)
  855. }
  856. err = session.OrderBy("T.ApplyTime DESC").Find(&datas)
  857. return
  858. }