sbyj.go 40 KB

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