sbyj.go 40 KB

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