package models import ( "fmt" "mtp2_if/db" "mtp2_if/mtpcache" "mtp2_if/pb" "mtp2_if/rediscli" "mtp2_if/utils" "sort" "strconv" "time" "google.golang.org/protobuf/proto" ) type TouristGoods struct { Goodsid int64 `json:"goodsid" xorm:"'GOODSID'" binding:"required"` // 商品ID(自增ID SEQ_GOODS) Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 商品代码(内部) Goodsname string `json:"goodsname" xorm:"'GOODSNAME'" binding:"required"` // 商品名称 Marketid int64 `json:"marketid" xorm:"'MARKETID'" binding:"required"` // 所属市场ID Goodsgroupid int64 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 所属商品组ID Goodsstatus int64 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市 Currencyid int64 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID Goodunitid int64 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID Agreeunit float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约单位 Decimalplace int64 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位 Listingdate time.Time `json:"listingdate" xorm:"'LISTINGDATE'"` // 交易开始日期 Lasttradedate time.Time `json:"lasttradedate" xorm:"'LASTTRADEDATE'"` // 最后交易日期(状态:待退市) Delistingdate time.Time `json:"delistingdate" xorm:"'DELISTINGDATE'"` // 商品退市时间(状态:退市) -- 已作废 Deliveryflag int64 `json:"deliveryflag" xorm:"'DELIVERYFLAG'"` // 交割标志 - 0:不可交割 1:可交割 Hasquoter int64 `json:"hasquoter" xorm:"'HASQUOTER'"` // 是否有报价商 - 0:无报价商 1:有报价商 Hqprotecttime int64 `json:"hqprotecttime" xorm:"'HQPROTECTTIME'"` // 行情保护时间(秒) Quoteshowtype int64 `json:"quoteshowtype" xorm:"'QUOTESHOWTYPE'"` // 行情报价类型: 1:成交价 2:买卖中间价 3:含买价 4:含卖价做市模式固定为3:含买价 Quoteshowtypeinterval int64 `json:"quoteshowtypeinterval" xorm:"'QUOTESHOWTYPEINTERVAL'"` // 行情报价间隔时间(秒)(成交价时为0) Modifystatus int64 `json:"modifystatus" xorm:"'MODIFYSTATUS'"` // 变更状态 - 1:未变更 2:变更中 3:待审核 4:已审核 Goodstradetype int64 `json:"goodstradetype" xorm:"'GOODSTRADETYPE'"` // 商品交易权限类型 - 1:可建可平 3:不可建可平 Creatorid int64 `json:"creatorid" xorm:"'CREATORID'"` // 创建人 Createtime time.Time `json:"createtime" xorm:"'CREATETIME'"` // 创建时间 Auditaccountid int64 `json:"auditaccountid" xorm:"'AUDITACCOUNTID'"` // 审核操作员账号 Audittime time.Time `json:"audittime" xorm:"'AUDITTIME'"` // 审核时间 Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间 Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人 Cancelaccountid int64 `json:"cancelaccountid" xorm:"'CANCELACCOUNTID'"` // 注销操作员账号 Remark string `json:"remark" xorm:"'REMARK'"` // 备注 Canceltime time.Time `json:"canceltime" xorm:"'CANCELTIME'"` // 注销时间 Delistingmode int64 `json:"delistingmode" xorm:"'DELISTINGMODE'"` // 退市方式 - 1:退市平仓 2:退市交收 3:不处理(仅期权\币币兑换) Forceclosemode int64 `json:"forceclosemode" xorm:"'FORCECLOSEMODE'"` // 定期强平方式 - 1:无 2:每日 3:每周 4:每月[收益权] Forceclosevalue int64 `json:"forceclosevalue" xorm:"'FORCECLOSEVALUE'"` // 定期强平参数 [收益权] Cutmode int64 `json:"cutmode" xorm:"'CUTMODE'"` // 斩仓方式 - 1:不斩仓 2:自动斩仓 3:半自动斩仓 Quoteminunit int64 `json:"quoteminunit" xorm:"'QUOTEMINUNIT'"` // 行情最小变动单位 [整数,报价小数位一起使用] Isbuylimited int64 `json:"isbuylimited" xorm:"'ISBUYLIMITED'"` // 是否限制建仓量 - 0:不限制 1:限制 Innerdealmode int64 `json:"innerdealmode" xorm:"'INNERDEALMODE'"` // 内部成交方式[通道交易] - 1:净头寸 2:开平 3:平今 Outerdealmode int64 `json:"outerdealmode" xorm:"'OUTERDEALMODE'"` // 外部成交方式[通道交易]- 1:净头寸 2:开平 3:平今 Closepricemode int64 `json:"closepricemode" xorm:"'CLOSEPRICEMODE'"` // 强平价格方式 - 1:市价 2:最新价 3:涨跌停(未实现) Closepriceparam float64 `json:"closepriceparam" xorm:"'CLOSEPRICEPARAM'"` // 强平最新价浮动比例 - 方式为2时使用 (<1)买 上浮 (1+x)*最新价卖 下浮 (1-x)*最新价 Qtydecimalplace int64 `json:"qtydecimalplace" xorm:"'QTYDECIMALPLACE'"` // 成交量小数位 Goodscurrencyid int64 `json:"goodscurrencyid" xorm:"'GOODSCURRENCYID'"` // 合约货币ID Goodsquotetype int64 `json:"goodsquotetype" xorm:"'GOODSQUOTETYPE'"` // 合约报价类型: 1-直接报价 2-间接报价 Quotegear int64 `json:"quotegear" xorm:"'QUOTEGEAR'"` // 行情档位(1-10) Outgoodscode string `json:"outgoodscode" xorm:"'OUTGOODSCODE'"` // 商品代码(外部) Isvisible int32 `json:"isvisible" xorm:"ISVISIBLE"` // 游客是否可见 - 0:不可见 1:可见 Areauserid int64 `json:"areauserid" xorm:"AREAUSERID"` // 所属机构 Pictureurl string `json:"pictureurl" xorm:"PICTUREURL"` // 商品图片 Trademode int32 `json:"trademode" xorm:"'TRADEMODE'"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价 } func GetTouristGoods(tradeModes []int) (goods []TouristGoods, err error) { goods = make([]TouristGoods, 0) session := db.GetEngine().Table("GOODS G"). Select("G.*, M.TRADEMODE"). Join("LEFT", "MARKET M", "M.MARKETID = G.MARKETID"). Where("G.GOODSSTATUS in (3, 7)").In("M.TRADEMODE", tradeModes).OrderBy("G.GOODSCODE") err = session.Find(&goods) return } // TradeHolderDetailEx 交易持仓扩展表 type TradeHolderDetailEx struct { TradeID uint64 `json:"tradeID,string"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx) BuyOrSell uint32 `json:"buyOrSell"` // 方向 - 0:买 1:卖 TradeDate string `json:"tradeDate"` // 交易日(yyyyMMdd) MarketID uint32 `json:"marketID"` // 市场ID GoodsID uint32 `json:"goodsID"` // 商品ID UserID uint32 `json:"userID"` // 用户ID AccountID uint64 `json:"accountID"` // 账号ID MatchUserID uint32 `json:"matchUserID"` // 对手用户ID MatchAccountID uint64 `json:"matchAccountID"` // 对手账号ID OpenQty uint64 `json:"openQty"` // 建仓数量 TradeAmount float64 `json:"tradeAmount"` // 成交金额 OpenPrice float64 `json:"openPrice"` // 建仓价格 HolderQty uint64 `json:"holderQty"` // 持仓数量 HolderAmount float64 `json:"holderAmount"` // 持仓金额 HolderPrice float64 `json:"holderPrice"` // 持仓价格 FreezeQty uint64 `json:"freezeQty"` // 冻结数量 DeliveryQty uint64 `json:"deliveryQty"` // 交收手数(已交收) HoldDays uint64 `json:"holdDays"` // 持仓天数 PayedDeposit float64 `json:"payedDeposit"` // 已付定金 RestockDeposit float64 `json:"restockDeposit"` // 补充定金 LateFeeDays uint64 `json:"lateFeeDays"` // 滞纳金起计天数 LateFeeAlgorithm uint32 `json:"lateFeeAlgorithm"` // 滞纳金收取方式 1:比率 2:固定 LateFeeValue float64 `json:"lateFeeValue"` // 滞纳金收取值 CallAteFee float64 `json:"callAteFee"` // 已计滞纳金 PromptDepositRate float64 `json:"promptDepositRate"` // 提示定金率 CutDepositRate float64 `json:"cutDepositRate"` // 斩仓定金率 PromptPrice float64 `json:"promptPrice"` // 提示价格 CutPrice float64 `json:"cutPrice"` // 斩仓价格 ClosePL float64 `json:"closePL"` // 平仓盈亏 FloatPL float64 `json:"floatPL"` // 浮动盈亏 DepositRate float64 `json:"depositRate"` // 订单定金率 RefundableDeposit float64 `json:"refundableDeposit"` // 可退定金 TradeTime string `json:"tradeTime"` // 交易时间 } // RedisTradeHolderDetailEx redis存储交易持仓扩展表 type RedisTradeHolderDetailEx struct { THDetailEx TradeHolderDetailEx `json:"tHDetailEx"` // 交易持仓扩展表记录 FloatPL float64 `json:"floatPL"` // 浮动盈亏 DepositRate float64 `json:"depositRate"` // 订单定金率 RefundableDeposit float64 `json:"refundableDeposit"` // 可退定金 GoodsCode string `json:"goodsCode"` // 商品代码 GoodsName string `json:"goodsName"` // 商品名称 GoodsUnitID uint32 `json:"goodsUnitID"` // 单位 AgreeUnit float64 `json:"agreeUnit"` // 合约单位 DecimalPlace uint32 `json:"decimalPlace"` // 小数位位数 QuoteMinUnit uint32 `json:"quoteMinUnit"` // 行情最小变动单位 GoodsUnit string `json:"goodsUnit"` // 单位名称 } type RedisTradeHolderDetailExArray []RedisTradeHolderDetailEx func (s RedisTradeHolderDetailExArray) Len() int { return len(s) } func (s RedisTradeHolderDetailExArray) Less(i, j int) bool { return s[i].THDetailEx.TradeID < s[j].THDetailEx.TradeID } func (s RedisTradeHolderDetailExArray) Swap(i, j int) { s[i], s[j] = s[j], s[i] } // GetDataEx 从数据库中查询数据 func (r *RedisTradeHolderDetailEx) GetDataEx(userId int, goodsId int) (sData RedisTradeHolderDetailExArray, err error) { redisCli := rediscli.GetRedisClient() g := strconv.Itoa(goodsId) if goodsId == 0 { g = "*" } sData = make([]RedisTradeHolderDetailEx, 0) // boost::format fmtDuration("TradeHolderDetailEx:%d_%d_%d_%" PRId64 ""); // fmtDuration % detailEx.goodsid() % detailEx.buyorsell()%detailEx.userid()%detailEx.tradeid(); key := fmt.Sprintf("TradeHolderDetailEx:%s_*_%d_*", g, userId) if ret, err := redisCli.Do("keys", key).Result(); err == nil { datas := ret.([]interface{}) for _, item := range datas { itemKey := item.(string) if itemValue, err := redisCli.Get(itemKey).Result(); err == nil { var data pb.RedisTradeHolderDetailEx if err = proto.Unmarshal([]byte(itemValue), &data); err == nil { m := RedisTradeHolderDetailEx{} m.ParseFromProto(&data) sData = append(sData, m) } } } } // 按 TradeID 倒序排序 sort.Sort(sort.Reverse(RedisTradeHolderDetailExArray(sData))) return sData, nil } func (r *RedisTradeHolderDetailEx) ParseFromProto(p *pb.RedisTradeHolderDetailEx) { r.FloatPL = p.GetFloatPL() r.DepositRate = p.GetDepositRate() r.RefundableDeposit = p.GetRefundableDeposit() r.GoodsCode = p.GetGoodsCode() r.GoodsName = p.GetGoodsName() r.GoodsUnitID = p.GetGoodsUnitID() r.AgreeUnit = p.GetAgreeUnit() r.DecimalPlace = p.GetDecimalPlace() r.QuoteMinUnit = p.GetQuoteMinUnit() r.THDetailEx = TradeHolderDetailEx{ TradeID: p.GetTHDetailEx().GetTradeID(), BuyOrSell: p.GetTHDetailEx().GetBuyOrSell(), TradeDate: p.GetTHDetailEx().GetTradeDate(), MarketID: p.GetTHDetailEx().GetMarketID(), GoodsID: p.GetTHDetailEx().GetGoodsID(), UserID: p.GetTHDetailEx().GetUserID(), AccountID: p.GetTHDetailEx().GetAccountID(), MatchUserID: p.GetTHDetailEx().GetMatchUserID(), MatchAccountID: p.GetTHDetailEx().GetMatchAccountID(), OpenQty: p.GetTHDetailEx().GetOpenQty(), TradeAmount: utils.Float64Round(p.GetTHDetailEx().GetTradeAmount(), 2), OpenPrice: utils.Float64Round(p.GetTHDetailEx().GetOpenPrice(), int(p.GetDecimalPlace())), HolderQty: p.GetTHDetailEx().GetHolderQty(), HolderAmount: utils.Float64Round(p.GetTHDetailEx().GetHolderAmount(), 2), HolderPrice: p.GetTHDetailEx().GetHolderPrice(), FreezeQty: p.GetTHDetailEx().GetFreezeQty(), DeliveryQty: p.GetTHDetailEx().GetDeliveryQty(), HoldDays: p.GetTHDetailEx().GetHoldDays(), PayedDeposit: p.GetTHDetailEx().GetPayedDeposit(), RestockDeposit: p.GetTHDetailEx().GetRestockDeposit(), LateFeeDays: p.GetTHDetailEx().GetLateFeeDays(), LateFeeAlgorithm: p.GetTHDetailEx().GetLateFeeAlgorithm(), LateFeeValue: p.GetTHDetailEx().GetLateFeeValue(), CallAteFee: p.GetTHDetailEx().GetCallAteFee(), PromptDepositRate: p.GetTHDetailEx().GetPromptDepositRate(), CutDepositRate: p.GetTHDetailEx().GetCutDepositRate(), PromptPrice: utils.Float64Round(p.GetTHDetailEx().GetPromptPrice(), int(p.GetDecimalPlace())), CutPrice: utils.Float64Round(p.GetTHDetailEx().GetCutPrice(), int(p.GetDecimalPlace())), ClosePL: p.GetTHDetailEx().GetClosePL(), FloatPL: p.GetTHDetailEx().GetFloatPL(), DepositRate: p.GetTHDetailEx().GetDepositRate(), RefundableDeposit: p.GetTHDetailEx().GetRefundableDeposit(), TradeTime: p.GetTHDetailEx().GetTradeTime().GetDateStr(), } // 单位 r.GoodsUnit = mtpcache.GetEnumDicitemName(int32(r.GoodsUnitID)) } type MyTradegoodsdeliveryoffline struct { DELIVERYORDERID string `json:"deliveryorderid" xorm:"DELIVERYORDERID"` // 交收单号(905+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx) USERID int64 `json:"userid" xorm:"USERID" form:"userid" binding:"required"` // 申请用户ID ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账户ID GOODSID int64 `json:"goodsid" xorm:"GOODSID"` // 商品ID MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 交收方向 - 0:买 1:卖 DELIVERYLOT int64 `json:"deliverylot" xorm:"DELIVERYLOT"` // 交收手数 DELIVERYQTY int64 `json:"deliveryqty" xorm:"DELIVERYQTY"` // 交收数量 (手数*合约乘数) DELIVERYINFO string `json:"deliveryinfo" xorm:"DELIVERYINFO"` // 交收信息 MATCHUSERID int64 `json:"matchuserid" xorm:"MATCHUSERID"` // 对手方UserID MATCHACCOUNTID int64 `json:"matchaccountid" xorm:"MATCHACCOUNTID"` // 对手方AccountID REQTIME string `json:"reqtime" xorm:"REQTIME"` // 申请时间 REQTRADEDATE string `json:"reqtradedate" xorm:"REQTRADEDATE"` // 申请交易日 ORDERSTATUS int32 `json:"orderstatus" xorm:"ORDERSTATUS"` // 线下交收单状态 - 1:待处理 2:交收中 3:已完成 4:申请失败 枚举deliveryOrderStatus DELIVERYPRICE float64 `json:"deliveryprice" xorm:"DELIVERYPRICE"` // 交收价格 DELIVERYAMOUNT float64 `json:"deliveryamount" xorm:"DELIVERYAMOUNT"` // 交收货款 CLOSETIME time.Time `json:"closetime" xorm:"CLOSETIME"` // 完成时间 CLOSETRADEDATE string `json:"closetradedate" xorm:"CLOSETRADEDATE"` // 完成交易日 DELIVERYCHARGE float64 `json:"deliverycharge" xorm:"DELIVERYCHARGE"` // 交割手续费 FEEALGORITHM int32 `json:"feealgorithm" xorm:"FEEALGORITHM"` // 手续费收取方式 1:比率 2:固定 MEMBERCHARGEVALUE float64 `json:"memberchargevalue" xorm:"MEMBERCHARGEVALUE"` // 会员手续费设置值 EXCHCHARGEVALUE float64 `json:"exchchargevalue" xorm:"EXCHCHARGEVALUE"` // 交易所手续费设置值 HANDLESTATUS int32 `json:"handlestatus" xorm:"HANDLESTATUS"` // 处理状态 DELIVERYPREMIUM float64 `json:"deliverypremium" xorm:"DELIVERYPREMIUM"` // 交收升贴水(每单位) DELIVERYTOTALAMOUNT float64 `json:"deliverytotalamount" xorm:"DELIVERYTOTALAMOUNT"` // 交收总货款 = 交收货款 + 交收升贴水 * 交收数量 DELIVERYSTATUS int32 `json:"deliverystatus" xorm:"DELIVERYSTATUS" form:"deliverystatus"` // 交收单状态2(52模式使用) - 1:待审核 2:待确认 3:待付款 4:付款中 5:已完成付款 6:处理中 20:交收完成 21:审核拒绝 22:确认过期 23:付款过期 24:财务撤销 -- 枚举deliveryStatus TOCONFIRMTIME time.Time `json:"toconfirmtime" xorm:"TOCONFIRMTIME"` // 确认截止时间(买交收) TOPAYTIME time.Time `json:"topaytime" xorm:"TOPAYTIME"` // 付款截止时间(买交收) PAYEDAMOUNT float64 `json:"payedamount" xorm:"PAYEDAMOUNT"` // 已付货款 FREEZEAMOUNT float64 `json:"freezeamount" xorm:"FREEZEAMOUNT"` // 冻结货款 REALDELIVERYQTY float64 `json:"realdeliveryqty" xorm:"REALDELIVERYQTY"` // 实际交收数量 REALDELIVERYAMOUNT float64 `json:"realdeliveryamount" xorm:"REALDELIVERYAMOUNT"` // 实际交收货款 CLIENTTICKET string `json:"clientticket" xorm:"CLIENTTICKET"` // 客户端流水号 GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 期货合约代码(内部) GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 期货合约名称 AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 期货合约乘数 DECIMALPLACE int32 `json:"decimalplace" xorm:"DECIMALPLACE"` // 报价小数位 GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID Status string `json:"-" form:"status"` // 状态入参 PageEx `xorm:"extends"` // 页码信息 } func (r *MyTradegoodsdeliveryoffline) calc() { } func (r *MyTradegoodsdeliveryoffline) buildSql() string { var sqlId utils.SQLVal = ` SELECT to_char(t.deliveryorderid) DELIVERYORDERID, t.userid, t.accountid, t.goodsid, t.marketid, t.buyorsell, t.deliverylot, t.deliveryqty, t.deliveryinfo, t.matchuserid, t.matchaccountid, to_char(t.reqtime, 'yyyy-MM-dd hh24:mi:ss') REQTIME, t.reqtradedate, t.orderstatus, t.deliveryprice, t.deliveryamount, t.closetime, t.closetradedate, t.deliverycharge, t.feealgorithm, t.memberchargevalue, t.exchchargevalue, t.handlestatus, t.deliverypremium, t.deliverytotalamount, t.deliverystatus, t.toconfirmtime, t.topaytime, t.payedamount, t.freezeamount, t.REALDELIVERYQTY, t.REALDELIVERYAMOUNT, g.goodscode, g.goodsname, g.agreeunit, g.goodunitid, g.decimalplace FROM TRADE_GOODSDELIVERYOFFLINE t LEFT JOIN GOODS g ON g.goodsid = t.goodsid WHERE t.userid = %v ` sqlId.FormatParam(r.USERID) // sqlId.AndEx("t.DELIVERYSTATUS", r.DELIVERYSTATUS, r.DELIVERYSTATUS > 0) sqlId.JoinEx(r.Status != "", fmt.Sprintf(" AND t.DELIVERYSTATUS IN (%v)", r.Status)) sqlId.OrderByDesc("t.deliveryorderid") sqlId.Page(r.Page, r.PageSize) return sqlId.String() } func (r *MyTradegoodsdeliveryoffline) GetDataByPage() (interface{}, error, int, int, int) { sData := make([]MyTradegoodsdeliveryoffline, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) total := 0 for i := range sData { sData[i].calc() total = sData[i].Total } return sData, err, r.Page, r.PageSize, total } // Deliveryofflinedetail 交易合约线下交收明细表 type MyDeliveryofflinedetail struct { DELIVERYDETAILID string `json:"deliverydetailid" xorm:"DELIVERYDETAILID"` // 明细单号(906+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx) DELIVERYORDERID string `json:"deliveryorderid" xorm:"DELIVERYORDERID" form:"deliveryorderid" binding:"required"` // 交收单号(905+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx) TRADEID string `json:"tradeid" xorm:"TRADEID"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx) BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖 USERID int64 `json:"userid" xorm:"USERID" form:"userid" binding:"required"` // 用户ID ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID"` // 账号ID HOLDLOT int64 `json:"holdlot" xorm:"HOLDLOT"` // 持仓手数 HOLDQTY int64 `json:"holdqty" xorm:"HOLDQTY"` // 持仓数量(手数*合约乘数) DELIVERYLOT int64 `json:"deliverylot" xorm:"DELIVERYLOT"` // 申请交收手数 DELIVERYQTY int64 `json:"deliveryqty" xorm:"DELIVERYQTY"` // 申请交收数量 (手数*合约乘数) DELIVERYPRICE float64 `json:"deliveryprice" xorm:"DELIVERYPRICE"` // 交收价格 DELIVERYAMOUNT float64 `json:"deliveryamount" xorm:"DELIVERYAMOUNT"` // 交收货款 CREATETIME time.Time `json:"createtime" xorm:"CREATETIME"` // 创建时间 PageEx `xorm:"extends"` // 页码信息 } func (r *MyDeliveryofflinedetail) calc() { } func (r *MyDeliveryofflinedetail) buildSql() string { var sqlId utils.SQLVal = ` SELECT to_char(t.deliverydetailid) DELIVERYDETAILID, to_char(t.deliveryorderid) DELIVERYORDERID, to_char(t.tradeid) TRADEID, t.buyorsell, t.userid, t.accountid, t.holdlot, t.holdqty, t.deliverylot, t.deliveryqty, t.deliveryprice, t.deliveryamount, t.createtime FROM DELIVERYOFFLINEDETAIL t WHERE t.userid = %v AND t.deliveryorderid = %v ` sqlId.FormatParam(r.USERID, r.DELIVERYORDERID) sqlId.Page(r.Page, r.PageSize) return sqlId.String() } func (r *MyDeliveryofflinedetail) GetDataByPage() (interface{}, error, int, int, int) { sData := make([]MyDeliveryofflinedetail, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) total := 0 for i := range sData { sData[i].calc() total = sData[i].Total } return sData, err, r.Page, r.PageSize, total } // Deliveryofflineoperatelog 交易合约线下交收操作流水表 type MyDeliveryofflineoperatelog struct { OPERATELOGID string `json:"operatelogid" xorm:"OPERATELOGID"` // 明细单号(907+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx) DELIVERYORDERID string `json:"deliveryorderid" xorm:"DELIVERYORDERID" form:"deliveryorderid" binding:"required"` // 交收单ID OPERATETYPE int32 `json:"operatetype" xorm:"OPERATETYPE" form:"operatetype"` // 操作类型 - 1:交收流程 2:付款流水 CURDELIVERYSTATUS int32 `json:"curdeliverystatus" xorm:"CURDELIVERYSTATUS"` // 当前交收状态(OperateType=1时) - 枚举deliveryStatus AFTDELIVERYSTATUS int32 `json:"aftdeliverystatus" xorm:"AFTDELIVERYSTATUS"` // 操作后交收状态(OperateType=1时) - 枚举deliveryStatus OPERATORSRC int32 `json:"operatorsrc" xorm:"OPERATORSRC"` // 操作人来源 - 1:管理端 2:终端 3:系统 OPERATORID int64 `json:"operatorid" xorm:"OPERATORID"` // 操作人ID - systemmanager的autoid 或 loginaccount的loginid OPERATORACCOUNT string `json:"operatoraccount" xorm:"OPERATORACCOUNT"` // 操作人账号 - systemmanager的logincode 或 loginaccount的logincode,无则用loginid OPERATORNAME string `json:"operatorname" xorm:"OPERATORNAME"` // 操作人名称 - systemmanager的username 或 loginaccount的logincode,无则用loginid REMARK string `json:"remark" xorm:"REMARK"` // 操作备注 OPERATETIME string `json:"operatetime" xorm:"OPERATETIME"` // 操作时间 FILENAME string `json:"filename" xorm:"FILENAME"` // 文件名称 FILEADDRESS string `json:"fileaddress" xorm:"FILEADDRESS"` // 文件地址 DELIVERYPAYMODE int32 `json:"deliverypaymode" xorm:"DELIVERYPAYMODE" form:"deliverypaymode"` // 付款方式 - 1:线上支付2:线下支付 - 枚举deliveryPayMode PAYAMOUNT float64 `json:"payamount" xorm:"PAYAMOUNT"` // 付款金额 CONFIRMSTATUS int32 `json:"confirmstatus" xorm:"CONFIRMSTATUS" form:"confirmstatus"` // 确认状态 - 1:未确认 2:已确认 - 枚举confirmStatus CONFIRMID int64 `json:"confirmid" xorm:"CONFIRMID"` // 确认人 CONFIRMTIME time.Time `json:"confirmtime" xorm:"CONFIRMTIME"` // 确认时间 PageEx `xorm:"extends"` // 页码信息 } func (r *MyDeliveryofflineoperatelog) calc() { } func (r *MyDeliveryofflineoperatelog) buildSql() string { var sqlId utils.SQLVal = ` SELECT to_char(t.operatelogid) OPERATELOGID, to_char(t.deliveryorderid) DELIVERYORDERID, t.operatetype, t.curdeliverystatus, t.aftdeliverystatus, t.operatorsrc, t.operatorid, t.operatoraccount, t.operatorname, t.remark, to_char(t.operatetime, 'yyyy-MM-dd hh24:mi:ss') OPERATETIME, t.filename, t.fileaddress, t.deliverypaymode, t.payamount, t.confirmstatus, t.confirmid, t.confirmtime FROM DELIVERYOFFLINEOPERATELOG t WHERE t.deliveryorderid = %v ` sqlId.FormatParam(r.DELIVERYORDERID) sqlId.AndEx("t.operatetype", r.OPERATETYPE, r.OPERATETYPE > 0) sqlId.OrderByDesc("t.operatetime") sqlId.Page(r.Page, r.PageSize) return sqlId.String() } func (r *MyDeliveryofflineoperatelog) GetDataByPage() (interface{}, error, int, int, int) { sData := make([]MyDeliveryofflineoperatelog, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) total := 0 for i := range sData { sData[i].calc() total = sData[i].Total } return sData, err, r.Page, r.PageSize, total } // Tradeholderdetailex 交易持仓扩展表 type Tradeholderdetailex struct { TRADEID string `json:"tradeid" xorm:"TRADEID"` // 成交单号(101+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx) BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖 TRADEDATE string `json:"tradedate" xorm:"TRADEDATE" form:"tradedate"` // 交易日(yyyyMMdd) MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID GOODSID int32 `json:"goodsid" xorm:"GOODSID" form:"goodsid"` // 商品ID USERID int64 `json:"userid" xorm:"USERID"` // 用户ID ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID" form:"accountid" binding:"required"` // 账号ID MATCHUSERID int64 `json:"matchuserid" xorm:"MATCHUSERID"` // 对手用户ID MATCHACCOUNTID int64 `json:"matchaccountid" xorm:"MATCHACCOUNTID"` // 对手账号ID OPENQTY int64 `json:"openqty" xorm:"OPENQTY"` // 建仓数量 TRADEAMOUNT float64 `json:"tradeamount" xorm:"TRADEAMOUNT"` // 成交金额 OPENPRICE float64 `json:"openprice" xorm:"OPENPRICE"` // 建仓价格 HOLDERQTY int64 `json:"holderqty" xorm:"HOLDERQTY" form:"holderqty"` // 持仓数量 HOLDERAMOUNT float64 `json:"holderamount" xorm:"HOLDERAMOUNT"` // 持仓金额 HOLDERPRICE float64 `json:"holderprice" xorm:"HOLDERPRICE"` // 持仓价格 FREEZEQTY int64 `json:"freezeqty" xorm:"FREEZEQTY"` // 冻结数量 DELIVERYQTY int64 `json:"deliveryqty" xorm:"DELIVERYQTY"` // 交收手数(已交收) HOLDDAYS int32 `json:"holddays" xorm:"HOLDDAYS"` // 持仓天数 PAYEDDEPOSIT float64 `json:"payeddeposit" xorm:"PAYEDDEPOSIT"` // 已付定金 RESTOCKDEPOSIT float64 `json:"restockdeposit" xorm:"RESTOCKDEPOSIT"` // 补充定金 LATEFEEDAYS int32 `json:"latefeedays" xorm:"LATEFEEDAYS"` // 滞纳金起计天数 LATEFEEALGORITHM int32 `json:"latefeealgorithm" xorm:"LATEFEEALGORITHM"` // 滞纳金收取方式 1:比率 2:固定 LATEFEEVALUE float64 `json:"latefeevalue" xorm:"LATEFEEVALUE"` // 滞纳金收取值 CALLATEFEE float64 `json:"callatefee" xorm:"CALLATEFEE"` // 已计滞纳金 PROMPTDEPOSITRATE float64 `json:"promptdepositrate" xorm:"PROMPTDEPOSITRATE"` // 提示定金率 CUTDEPOSITRATE float64 `json:"cutdepositrate" xorm:"CUTDEPOSITRATE"` // 斩仓定金率 PROMPTPRICE float64 `json:"promptprice" xorm:"PROMPTPRICE"` // 提示价格 CUTPRICE float64 `json:"cutprice" xorm:"CUTPRICE"` // 斩仓价格 CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 平仓盈亏 FLOATPL float64 `json:"floatpl" xorm:"FLOATPL"` // 浮动盈亏 DEPOSITRATE float64 `json:"depositrate" xorm:"DEPOSITRATE"` // 订单定金率 REFUNDABLEDEPOSIT float64 `json:"refundabledeposit" xorm:"REFUNDABLEDEPOSIT"` // 可退定金 PAYEDLATEFEE float64 `json:"payedlatefee" xorm:"PAYEDLATEFEE"` // 已付滞纳金 TRADETIME string `json:"tradetime" xorm:"TRADETIME"` // 交易时间 HANDLESTATUS int32 `json:"handlestatus" xorm:"HANDLESTATUS"` // 处理状态 GOODSCODE string `json:"goodscode" xorm:"GOODSCODE"` // 期货合约代码(内部) GOODSNAME string `json:"goodsname" xorm:"GOODSNAME"` // 期货合约名称 AGREEUNIT float64 `json:"agreeunit" xorm:"AGREEUNIT"` // 期货合约乘数 DECIMALPLACE int32 `json:"decimalplace" xorm:"DECIMALPLACE"` // 报价小数位 GOODUNITID int32 `json:"goodunitid" xorm:"GOODUNITID"` // 报价单位ID PageEx `xorm:"extends"` // 页码信息 } func (r *Tradeholderdetailex) calc() { if r.TRADEAMOUNT != 0.0 { r.TRADEAMOUNT = utils.Float64Round(r.TRADEAMOUNT, 2) } if r.OPENPRICE != 0.0 { r.OPENPRICE = utils.Float64Round(r.OPENPRICE, int(r.DECIMALPLACE)) } if r.HOLDERAMOUNT != 0.0 { r.HOLDERAMOUNT = utils.Float64Round(r.HOLDERAMOUNT, 2) } if r.PROMPTPRICE != 0.0 { r.PROMPTPRICE = utils.Float64Round(r.PROMPTPRICE, int(r.DECIMALPLACE)) } if r.CUTPRICE != 0.0 { r.CUTPRICE = utils.Float64Round(r.CUTPRICE, int(r.DECIMALPLACE)) } } func (r *Tradeholderdetailex) buildSql() string { var sqlId utils.SQLVal = ` select to_char(t.tradeid) TRADEID, t.buyorsell, t.tradedate, t.marketid, t.goodsid, t.userid, t.accountid, t.matchuserid, t.matchaccountid, t.openqty, t.tradeamount, t.openprice, t.holderqty, t.holderamount, t.holderprice, t.freezeqty, t.deliveryqty, t.holddays, t.payeddeposit, t.restockdeposit, t.latefeedays, t.latefeealgorithm, t.latefeevalue, t.callatefee, t.promptdepositrate, t.cutdepositrate, t.promptprice, t.cutprice, t.closepl, t.floatpl, t.depositrate, t.refundabledeposit, t.payedlatefee, to_char(t.tradetime, 'yyyy-MM-dd hh24:mi:ss') TRADETIME, t.handlestatus, g.goodscode, g.goodsname, g.agreeunit, g.decimalplace, g.goodunitid from trade_holderdetailex t left join goods g on g.goodsid = t.goodsid where 1=1 ` sqlId.And("t.accountid", r.ACCOUNTID) sqlId.AndEx("t.tradedate", r.TRADEDATE, r.TRADEDATE != "") sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0) sqlId.AndEx("t.holderqty", r.HOLDERQTY, r.HOLDERQTY > 0) sqlId.OrderByDesc("t.tradetime") sqlId.Page(r.Page, r.PageSize) return sqlId.String() } func (r *Tradeholderdetailex) GetDataByPage() (interface{}, error, int, int, int) { sData := make([]Tradeholderdetailex, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) total := 0 for i := range sData { sData[i].calc() total = sData[i].Total } return sData, err, r.Page, r.PageSize, total } type TradeCloseDetail struct { CLOSEID int64 `json:"closeid" xorm:"CLOSEID"` // 平仓明细ID(104+Unix秒时间戳(10位)+2位(MarketServiceID)+xxxx) TRADEID int64 `json:"tradeid" xorm:"TRADEID"` // 成交单号 OPENTRADEID int64 `json:"opentradeid" xorm:"OPENTRADEID"` // 关联建仓成交单号 TRADEDATE string `json:"tradedate" xorm:"TRADEDATE"` // 交易日(yyyyMMdd) MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 市场ID GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 商品ID ACCOUNTID int64 `json:"accountid" xorm:"ACCOUNTID" form:"accountid" binding:"required"` // 账号ID BUYORSELL int32 `json:"buyorsell" xorm:"BUYORSELL"` // 方向 - 0:买 1:卖 OPENPRICE float64 `json:"openprice" xorm:"OPENPRICE"` // 建仓价格 HOLDERPRICE float64 `json:"holderprice" xorm:"HOLDERPRICE"` // 持仓价格 CLOSEQTY int64 `json:"closeqty" xorm:"CLOSEQTY"` // 平仓数量 CLOSEPRICE float64 `json:"closeprice" xorm:"CLOSEPRICE"` // 平仓价格 CLOSETIME time.Time `json:"closetime" xorm:"CLOSETIME"` // 平仓时间 TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性 OPTIONTYPE int32 `json:"optiontype" xorm:"OPTIONTYPE"` // 期权类型 - 1:认购(看涨) 2:认沽(看跌) PREMIUM float64 `json:"premium" xorm:"PREMIUM"` // 权利金 - [持仓单的权利金] ISPREEXERCISE int32 `json:"ispreexercise" xorm:"ISPREEXERCISE"` // 是否预申报- 0:否 1:是 PREEXERCISEPRICE float64 `json:"preexerciseprice" xorm:"PREEXERCISEPRICE"` // 预申报价格 ISCONFIRMEXERCISE int32 `json:"isconfirmexercise" xorm:"ISCONFIRMEXERCISE"` // 是否确认行权- 0:否 1:是 OPENTRADEDATE string `json:"opentradedate" xorm:"OPENTRADEDATE"` // 建仓成交单交易日 RELEASECREDIT float64 `json:"releasecredit" xorm:"RELEASECREDIT"` // 释放授信金额 CLOSEPL float64 `json:"closepl" xorm:"CLOSEPL"` // 平仓盈亏 - 按持仓价计算 GOODSFULLNAME string `json:"goodsfullname" xorm:"GOODSFULLNAME"` // 商品名称 OPENNUM string `json:"opennum" xorm:"OPENNUM"` // 开仓数量(带单位) CLOSENUM string `json:"closenum" xorm:"CLOSENUM"` // 平仓数量(带单位) PageEx `xorm:"extends"` // 页码信息 } func (r *TradeCloseDetail) calc() { } func (r *TradeCloseDetail) buildSql() string { var sqlId utils.SQLVal = ` select qt.opentradeid, qt.closeid, qt.accountid, qt.goodsid, qt.buyorsell, qt.openqty, qt.openprice, qt.closeqty, qt.closeprice, qt.closepl, qt.closetime, g.goodscode || '/' || g.goodsname "goodsfullname", qt.openqty * g.agreeunit || ' ' || en.enumdicname "opennum", qt.closeqty * g.agreeunit || ' ' || en.enumdicname "closenum" from (select cd.opentradeid, cd.closeid, cd.accountid, cd.goodsid, hd.buyorsell, hd.openqty, hd.openprice, cd.closeqty, cd.closeprice, cd.closepl, cd.closetime from trade_closedetail cd inner join trade_holderdetailex hd on hd.tradeid = cd.opentradeid and hd.accountid = cd.accountid where cd.accountid = %v union select cd.opentradeid, cd.closeid, cd.accountid, cd.goodsid, hd.buyorsell, hd.openqty, hd.openprice, cd.closeqty, cd.closeprice, cd.closepl, cd.closetime from his_trade_closedetail cd inner join trade_holderdetailex hd on hd.tradeid = cd.opentradeid and hd.accountid = cd.accountid where cd.isvaliddata = 1 and cd.accountid = %v) qt left join goods g on qt.goodsid = g.goodsid left join enumdicitem en on en.enumitemname = g.goodunitid and en.enumdiccode = 'goodsunit' order by qt.closeid desc ` sqlId.FormatParam(r.ACCOUNTID, r.ACCOUNTID) sqlId.Page(r.Page, r.PageSize) return sqlId.String() } func (r *TradeCloseDetail) GetDataByPage() (interface{}, error, int, int, int) { sData := make([]TradeCloseDetail, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) total := 0 for i := range sData { sData[i].calc() total = sData[i].Total } return sData, err, r.Page, r.PageSize, total }