sbyj.go 43 KB

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