sbyj.go 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  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. GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 期货合约代码(内部)
  238. GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 期货合约名称
  239. AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 期货合约乘数
  240. DECIMALPLACE int32 `json:"decimalplace" xorm:"DECIMALPLACE"` // 报价小数位
  241. GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID
  242. Status string `json:"--" form:"status"` // 状态入参
  243. PageEx `xorm:"extends"` // 页码信息
  244. }
  245. func (r *MyTradegoodsdeliveryoffline) calc() {
  246. }
  247. func (r *MyTradegoodsdeliveryoffline) buildSql() string {
  248. var sqlId utils.SQLVal = `
  249. SELECT
  250. to_char(t.deliveryorderid) DELIVERYORDERID,
  251. t.userid,
  252. t.accountid,
  253. t.goodsid,
  254. t.marketid,
  255. t.buyorsell,
  256. t.deliverylot,
  257. t.deliveryqty,
  258. t.deliveryinfo,
  259. t.matchuserid,
  260. t.matchaccountid,
  261. to_char(t.reqtime, 'yyyy-MM-dd hh24:mi:ss') REQTIME,
  262. t.reqtradedate,
  263. t.orderstatus,
  264. t.deliveryprice,
  265. t.deliveryamount,
  266. t.closetime,
  267. t.closetradedate,
  268. t.deliverycharge,
  269. t.feealgorithm,
  270. t.memberchargevalue,
  271. t.exchchargevalue,
  272. t.handlestatus,
  273. t.deliverypremium,
  274. t.deliverytotalamount,
  275. t.deliverystatus,
  276. t.toconfirmtime,
  277. t.topaytime,
  278. t.payedamount,
  279. t.freezeamount,
  280. g.goodscode,
  281. g.goodsname,
  282. g.agreeunit,
  283. g.goodunitid,
  284. g.decimalplace
  285. FROM TRADE_GOODSDELIVERYOFFLINE t
  286. LEFT JOIN GOODS g ON g.goodsid = t.goodsid
  287. WHERE t.userid = %v
  288. `
  289. sqlId.FormatParam(r.USERID)
  290. // sqlId.AndEx("t.DELIVERYSTATUS", r.DELIVERYSTATUS, r.DELIVERYSTATUS > 0)
  291. sqlId.JoinEx(r.Status != "", fmt.Sprintf(" AND t.DELIVERYSTATUS IN (%v)", r.Status))
  292. sqlId.OrderByDesc("t.deliveryorderid")
  293. sqlId.Page(r.Page, r.PageSize)
  294. return sqlId.String()
  295. }
  296. func (r *MyTradegoodsdeliveryoffline) GetDataByPage() (interface{}, error, int, int, int) {
  297. sData := make([]MyTradegoodsdeliveryoffline, 0)
  298. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  299. total := 0
  300. for i := range sData {
  301. sData[i].calc()
  302. total = sData[i].Total
  303. }
  304. return sData, err, r.Page, r.PageSize, total
  305. }
  306. // Deliveryofflinedetail 交易合约线下交收明细表
  307. type MyDeliveryofflinedetail struct {
  308. DELIVERYDETAILID string `json:"deliverydetailid" xorm:"DELIVERYDETAILID"` // 明细单号(906+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  309. DELIVERYORDERID string `json:"deliveryorderid" xorm:"DELIVERYORDERID" form:"deliveryorderid" binding:"required"` // 交收单号(905+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  310. TRADEID string `json:"tradeid" xorm:"TRADEID"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  311. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖
  312. USERID int64 `json:"userid" xorm:"USERID" form:"userid" binding:"required"` // 用户ID
  313. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账号ID
  314. HOLDLOT int64 `json:"holdlot" xorm:"HOLDLOT"` // 持仓手数
  315. HOLDQTY int64 `json:"holdqty" xorm:"HOLDQTY"` // 持仓数量(手数*合约乘数)
  316. DELIVERYLOT int64 `json:"deliverylot" xorm:"DELIVERYLOT"` // 申请交收手数
  317. DELIVERYQTY int64 `json:"deliveryqty" xorm:"DELIVERYQTY"` // 申请交收数量 (手数*合约乘数)
  318. DELIVERYPRICE float64 `json:"deliveryprice" xorm:"DELIVERYPRICE"` // 交收价格
  319. DELIVERYAMOUNT float64 `json:"deliveryamount" xorm:"DELIVERYAMOUNT"` // 交收货款
  320. CREATETIME time.Time `json:"createtime" xorm:"CREATETIME"` // 创建时间
  321. PageEx `xorm:"extends"` // 页码信息
  322. }
  323. func (r *MyDeliveryofflinedetail) calc() {
  324. }
  325. func (r *MyDeliveryofflinedetail) buildSql() string {
  326. var sqlId utils.SQLVal = `
  327. SELECT
  328. to_char(t.deliverydetailid) DELIVERYDETAILID,
  329. to_char(t.deliveryorderid) DELIVERYORDERID,
  330. to_char(t.tradeid) TRADEID,
  331. t.buyorsell,
  332. t.userid,
  333. t.accountid,
  334. t.holdlot,
  335. t.holdqty,
  336. t.deliverylot,
  337. t.deliveryqty,
  338. t.deliveryprice,
  339. t.deliveryamount,
  340. t.createtime
  341. FROM DELIVERYOFFLINEDETAIL t
  342. WHERE t.userid = %v AND t.deliveryorderid = %v
  343. `
  344. sqlId.FormatParam(r.USERID, r.DELIVERYORDERID)
  345. sqlId.Page(r.Page, r.PageSize)
  346. return sqlId.String()
  347. }
  348. func (r *MyDeliveryofflinedetail) GetDataByPage() (interface{}, error, int, int, int) {
  349. sData := make([]MyDeliveryofflinedetail, 0)
  350. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  351. total := 0
  352. for i := range sData {
  353. sData[i].calc()
  354. total = sData[i].Total
  355. }
  356. return sData, err, r.Page, r.PageSize, total
  357. }
  358. // Deliveryofflineoperatelog 交易合约线下交收操作流水表
  359. type MyDeliveryofflineoperatelog struct {
  360. OPERATELOGID string `json:"operatelogid" xorm:"OPERATELOGID"` // 明细单号(907+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  361. DELIVERYORDERID string `json:"deliveryorderid" xorm:"DELIVERYORDERID" form:"deliveryorderid" binding:"required"` // 交收单ID
  362. OPERATETYPE int32 `json:"operatetype" xorm:"OPERATETYPE" form:"operatetype"` // 操作类型 - 1:交收流程 2:付款流水
  363. CURDELIVERYSTATUS int32 `json:"curdeliverystatus" xorm:"CURDELIVERYSTATUS"` // 当前交收状态(OperateType=1时) - 枚举deliveryStatus
  364. AFTDELIVERYSTATUS int32 `json:"aftdeliverystatus" xorm:"AFTDELIVERYSTATUS"` // 操作后交收状态(OperateType=1时) - 枚举deliveryStatus
  365. OPERATORSRC int32 `json:"operatorsrc" xorm:"OPERATORSRC"` // 操作人来源 - 1:管理端 2:终端 3:系统
  366. OPERATORID int64 `json:"operatorid" xorm:"OPERATORID"` // 操作人ID - systemmanager的autoid 或 loginaccount的loginid
  367. OPERATORACCOUNT string `json:"operatoraccount" xorm:"OPERATORACCOUNT"` // 操作人账号 - systemmanager的logincode 或 loginaccount的logincode,无则用loginid
  368. OPERATORNAME string `json:"operatorname" xorm:"OPERATORNAME"` // 操作人名称 - systemmanager的username 或 loginaccount的logincode,无则用loginid
  369. REMARK string `json:"remark" xorm:"REMARK"` // 操作备注
  370. OPERATETIME string `json:"operatetime" xorm:"OPERATETIME"` // 操作时间
  371. FILENAME string `json:"filename" xorm:"FILENAME"` // 文件名称
  372. FILEADDRESS string `json:"fileaddress" xorm:"FILEADDRESS"` // 文件地址
  373. DELIVERYPAYMODE int32 `json:"deliverypaymode" xorm:"DELIVERYPAYMODE" form:"deliverypaymode"` // 付款方式 - 1:线上支付2:线下支付 - 枚举deliveryPayMode
  374. PAYAMOUNT float64 `json:"payamount" xorm:"PAYAMOUNT"` // 付款金额
  375. CONFIRMSTATUS int32 `json:"confirmstatus" xorm:"CONFIRMSTATUS" form:"confirmstatus"` // 确认状态 - 1:未确认 2:已确认 - 枚举confirmStatus
  376. CONFIRMID int64 `json:"confirmid" xorm:"CONFIRMID"` // 确认人
  377. CONFIRMTIME time.Time `json:"confirmtime" xorm:"CONFIRMTIME"` // 确认时间
  378. PageEx `xorm:"extends"` // 页码信息
  379. }
  380. func (r *MyDeliveryofflineoperatelog) calc() {
  381. }
  382. func (r *MyDeliveryofflineoperatelog) buildSql() string {
  383. var sqlId utils.SQLVal = `
  384. SELECT
  385. to_char(t.operatelogid) OPERATELOGID,
  386. to_char(t.deliveryorderid) DELIVERYORDERID,
  387. t.operatetype,
  388. t.curdeliverystatus,
  389. t.aftdeliverystatus,
  390. t.operatorsrc,
  391. t.operatorid,
  392. t.operatoraccount,
  393. t.operatorname,
  394. t.remark,
  395. to_char(t.operatetime, 'yyyy-MM-dd hh24:mi:ss') OPERATETIME,
  396. t.filename,
  397. t.fileaddress,
  398. t.deliverypaymode,
  399. t.payamount,
  400. t.confirmstatus,
  401. t.confirmid,
  402. t.confirmtime
  403. FROM DELIVERYOFFLINEOPERATELOG t
  404. WHERE t.deliveryorderid = %v
  405. `
  406. sqlId.FormatParam(r.DELIVERYORDERID)
  407. sqlId.AndEx("t.operatetype", r.OPERATETYPE, r.OPERATETYPE > 0)
  408. sqlId.OrderByDesc("t.operatetime")
  409. sqlId.Page(r.Page, r.PageSize)
  410. return sqlId.String()
  411. }
  412. func (r *MyDeliveryofflineoperatelog) GetDataByPage() (interface{}, error, int, int, int) {
  413. sData := make([]MyDeliveryofflineoperatelog, 0)
  414. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  415. total := 0
  416. for i := range sData {
  417. sData[i].calc()
  418. total = sData[i].Total
  419. }
  420. return sData, err, r.Page, r.PageSize, total
  421. }
  422. // Tradeholderdetailex 交易持仓扩展表
  423. type Tradeholderdetailex struct {
  424. TRADEID string `json:"tradeid" xorm:"TRADEID"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx)
  425. BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖
  426. TRADEDATE string `json:"tradedate" xorm:"TRADEDATE" form:"tradedate"` // 交易日(yyyyMMdd)
  427. MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID
  428. GOODSID int32 `json:"goodsid" xorm:"GOODSID" form:"goodsid"` // 商品ID
  429. USERID int64 `json:"userid" xorm:"USERID"` // 用户ID
  430. ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID" form:"accountid" binding:"required"` // 账号ID
  431. MATCHUSERID int64 `json:"matchuserid" xorm:"MATCHUSERID"` // 对手用户ID
  432. MATCHACCOUNTID int64 `json:"matchaccountid" xorm:"MATCHACCOUNTID"` // 对手账号ID
  433. OPENQTY int64 `json:"openqty" xorm:"OPENQTY"` // 建仓数量
  434. TRADEAMOUNT float64 `json:"tradeamount" xorm:"TRADEAMOUNT"` // 成交金额
  435. OPENPRICE float64 `json:"openprice" xorm:"OPENPRICE"` // 建仓价格
  436. HOLDERQTY int64 `json:"holderqty" xorm:"HOLDERQTY"` // 持仓数量
  437. HOLDERAMOUNT float64 `json:"holderamount" xorm:"HOLDERAMOUNT"` // 持仓金额
  438. HOLDERPRICE float64 `json:"holderprice" xorm:"HOLDERPRICE"` // 持仓价格
  439. FREEZEQTY int64 `json:"freezeqty" xorm:"FREEZEQTY"` // 冻结数量
  440. DELIVERYQTY int64 `json:"deliveryqty" xorm:"DELIVERYQTY"` // 交收手数(已交收)
  441. HOLDDAYS int32 `json:"holddays" xorm:"HOLDDAYS"` // 持仓天数
  442. PAYEDDEPOSIT float64 `json:"payeddeposit" xorm:"PAYEDDEPOSIT"` // 已付定金
  443. RESTOCKDEPOSIT float64 `json:"restockdeposit" xorm:"RESTOCKDEPOSIT"` // 补充定金
  444. LATEFEEDAYS int32 `json:"latefeedays" xorm:"LATEFEEDAYS"` // 滞纳金起计天数
  445. LATEFEEALGORITHM int32 `json:"latefeealgorithm" xorm:"LATEFEEALGORITHM"` // 滞纳金收取方式 1:比率 2:固定
  446. LATEFEEVALUE float64 `json:"latefeevalue" xorm:"LATEFEEVALUE"` // 滞纳金收取值
  447. CALLATEFEE float64 `json:"callatefee" xorm:"CALLATEFEE"` // 已计滞纳金
  448. PROMPTDEPOSITRATE float64 `json:"promptdepositrate" xorm:"PROMPTDEPOSITRATE"` // 提示定金率
  449. CUTDEPOSITRATE float64 `json:"cutdepositrate" xorm:"CUTDEPOSITRATE"` // 斩仓定金率
  450. PROMPTPRICE float64 `json:"promptprice" xorm:"PROMPTPRICE"` // 提示价格
  451. CUTPRICE float64 `json:"cutprice" xorm:"CUTPRICE"` // 斩仓价格
  452. CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 平仓盈亏
  453. FLOATPL float64 `json:"floatpl" xorm:"FLOATPL"` // 浮动盈亏
  454. DEPOSITRATE float64 `json:"depositrate" xorm:"DEPOSITRATE"` // 订单定金率
  455. REFUNDABLEDEPOSIT float64 `json:"refundabledeposit" xorm:"REFUNDABLEDEPOSIT"` // 可退定金
  456. PAYEDLATEFEE float64 `json:"payedlatefee" xorm:"PAYEDLATEFEE"` // 已付滞纳金
  457. TRADETIME string `json:"tradetime" xorm:"TRADETIME"` // 交易时间
  458. HANDLESTATUS int32 `json:"handlestatus" xorm:"HANDLESTATUS"` // 处理状态
  459. GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 期货合约代码(内部)
  460. GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 期货合约名称
  461. AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 期货合约乘数
  462. DECIMALPLACE int32 `json:"decimalplace" xorm:"DECIMALPLACE"` // 报价小数位
  463. GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID
  464. PageEx `xorm:"extends"` // 页码信息
  465. }
  466. func (r *Tradeholderdetailex) calc() {
  467. if r.TRADEAMOUNT != 0.0 {
  468. r.TRADEAMOUNT = utils.Float64Round(r.TRADEAMOUNT, 2)
  469. }
  470. if r.OPENPRICE != 0.0 {
  471. r.OPENPRICE = utils.Float64Round(r.OPENPRICE, int(r.DECIMALPLACE))
  472. }
  473. if r.HOLDERAMOUNT != 0.0 {
  474. r.HOLDERAMOUNT = utils.Float64Round(r.HOLDERAMOUNT, 2)
  475. }
  476. if r.PROMPTPRICE != 0.0 {
  477. r.PROMPTPRICE = utils.Float64Round(r.PROMPTPRICE, int(r.DECIMALPLACE))
  478. }
  479. if r.CUTPRICE != 0.0 {
  480. r.CUTPRICE = utils.Float64Round(r.CUTPRICE, int(r.DECIMALPLACE))
  481. }
  482. }
  483. func (r *Tradeholderdetailex) buildSql() string {
  484. var sqlId utils.SQLVal = `
  485. select
  486. to_char(t.tradeid) TRADEID,
  487. t.buyorsell,
  488. t.tradedate,
  489. t.marketid,
  490. t.goodsid,
  491. t.userid,
  492. t.accountid,
  493. t.matchuserid,
  494. t.matchaccountid,
  495. t.openqty,
  496. t.tradeamount,
  497. t.openprice,
  498. t.holderqty,
  499. t.holderamount,
  500. t.holderprice,
  501. t.freezeqty,
  502. t.deliveryqty,
  503. t.holddays,
  504. t.payeddeposit,
  505. t.restockdeposit,
  506. t.latefeedays,
  507. t.latefeealgorithm,
  508. t.latefeevalue,
  509. t.callatefee,
  510. t.promptdepositrate,
  511. t.cutdepositrate,
  512. t.promptprice,
  513. t.cutprice,
  514. t.closepl,
  515. t.floatpl,
  516. t.depositrate,
  517. t.refundabledeposit,
  518. t.payedlatefee,
  519. to_char(t.tradetime, 'yyyy-MM-dd hh24:mi:ss') TRADETIME,
  520. t.handlestatus,
  521. g.goodscode,
  522. g.goodsname,
  523. g.agreeunit,
  524. g.decimalplace,
  525. g.goodunitid
  526. from trade_holderdetailex t
  527. left join goods g on g.goodsid = t.goodsid
  528. where 1=1
  529. `
  530. sqlId.And("t.accountid", r.ACCOUNTID)
  531. sqlId.AndEx("t.tradedate", r.TRADEDATE, r.TRADEDATE != "")
  532. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  533. sqlId.OrderByDesc("t.tradetime")
  534. sqlId.Page(r.Page, r.PageSize)
  535. return sqlId.String()
  536. }
  537. func (r *Tradeholderdetailex) GetDataByPage() (interface{}, error, int, int, int) {
  538. sData := make([]Tradeholderdetailex, 0)
  539. err := db.GetEngine().SQL(r.buildSql()).Find(&sData)
  540. total := 0
  541. for i := range sData {
  542. sData[i].calc()
  543. total = sData[i].Total
  544. }
  545. return sData, err, r.Page, r.PageSize, total
  546. }