/** * @Author: zou.yingbin * @Create : 2021/9/7 16:01 * @Modify : 2021/9/7 16:01 * @note : 天津麦顿 */ package models import ( "fmt" "mtp2_if/db" "mtp2_if/pb" "mtp2_if/utils" "github.com/golang/protobuf/proto" ) // TjmdQuoteGoods 掉期报价列表 type TjmdQuoteGoods struct { GOODSID int64 `json:"goodsid" xorm:"'GOODSID'" form:"goodsid"` // 合约id GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 合约代码 GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 合约名称 REFGOODSID int64 `json:"refgoodsid" xorm:"'REFGOODSID'"` // 标的合约id REFGOODSCODE string `json:"refgoodscode" xorm:"'REFGOODSCODE'"` // 标的合约代码 REFGOODSNAME string `json:"refgoodsname" xorm:"'REFGOODSNAME'"` // 标的合约名称 SELLQTY float64 `json:"sellqty" xorm:"'SELLQTY'"` // 卖量(暂不做, 无值, 保留字段) BUYQTY float64 `json:"buyqty" xorm:"'BUYQTY'"` // 买量(暂不做, 无值, 保留字段) GOODSGROUPID int64 `json:"goodsgroupid" xorm:"'GOODSGROUPID'" form:"goodsgroupid"` // 商品组ID(自增ID) GOODSGROUPNAME string `json:"goodsgroupname" xorm:"'GOODSGROUPNAME'"` // 商品组名称 UserType int32 `json:"-" form:"usertype"` // 用户类型 FtMarketIds string `json:"-" form:"marketids"` // 市场id, 格式 1,2,3 DECIMALPLACE int32 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位 } func (r *TjmdQuoteGoods) calc() { } func (r *TjmdQuoteGoods) buildSql() string { var sqlId utils.SQLVal = ` select g1.goodsid, g1.goodscode, g1.goodsname, g1.decimalplace, g2.goodsid refgoodsid, g2.goodscode refgoodscode, g2.goodsname refgoodsname, gp.goodsgroupid, gp.goodsgroupname, gp.outergroupcode goodsgroupcode, gp.marketid from goods g1 left join goods g2 on g1.refgoodsid = g2.goodsid left join goodsgroup gp on g1.goodsgroupid = gp.goodsgroupid where 1=1 and g1.goodsstatus = 3 ` sqlId.JoinEx(r.FtMarketIds != "", fmt.Sprintf(" and gp.marketid in(%v)", r.FtMarketIds)) sqlId.Join(" order by g1.goodscode") return sqlId.String() } // GetDataEx 获取掉期报价列表 func (r *TjmdQuoteGoods) GetDataEx() (interface{}, error) { sData := make([]TjmdQuoteGoods, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) for i := range sData { sData[i].calc() } return sData, err } // TjmdTradeOrderDetail 掉期商品买卖大厅 type TjmdTradeOrderDetail struct { ORDERID string `json:"orderid" xorm:"'ORDERID'"` // 委托单号 GOODSID int32 `json:"goodsid" xorm:"'GOODSID'" form:"goodsid"` // 商品id BUYORSELL int32 `json:"buyorsell" xorm:"'BUYORSELL'" form:"buyorsell"` // 买卖方向 0-买 1-卖 ORDERPRICE SFLOAT64 `json:"orderprice" xorm:"'ORDERPRICE'"` // 委托价格 ORDERQTY int64 `json:"orderqty" xorm:"'ORDERQTY'"` // 委托数量 USERID int64 `json:"userid" xorm:"'USERID'" form:"userid"` // 用户id USERNAME string `json:"username" xorm:"'USERNAME'"` // 用户名称(已脱敏) PRICEMODE int32 `json:"pricemode" xorm:"'PRICEMODE'"` // 取价方式 - 1:市价 2: 限价 3:浮动价 MARKETMAXSUB float64 `json:"marketmaxsub" xorm:"'MARKETMAXSUB'"` // 市价最大偏移范围 [浮动价 - 点差] PageEx `xorm:"extends"` USERTYPE int32 `json:"-" form:"usertype"` // 用户类型 FtMarketIds string `json:"-" form:"marketids"` // 市场id, 格式 1,2,3 MEMBERUSERID int `json:"memberuserid" form:"memberuserid" xorm:"MEMBERUSERID"` // 所属会员ID } func (r *TjmdTradeOrderDetail) calc() { r.USERNAME = EncryptByStar(r.USERNAME) } func (r *TjmdTradeOrderDetail) buildSql() string { var sqlId utils.SQLVal = ` select to_char(t.orderid) orderid, t.buyorsell, t.goodsid, t.orderprice, t.orderqty - t.tradeqty orderqty, u.userid, u.accountname username, t.orderstatus, t.pricemode, t.marketmaxsub, g.marketid, u.memberuserid from trade_orderdetail t left join taaccount ta on t.accountid = ta.accountid left join useraccount u on ta.relateduserid = u.userid left join goods g on t.goodsid=g.goodsid where 1 = 1 and t.orderstatus in (3, 7) and (u.usertype = decode(%v,2,5,2) or u.userid = %v) ` // 投资者只能看到会员的单, 会员只能看到投资者的单, decode(%v,2,5,-1); or u.userid=r.userid 则为自己的挂单可见 sqlId.FormatParam(r.USERTYPE, r.USERID) sqlId.And("t.GOODSID", r.GOODSID) sqlId.And("t.BUYORSELL", r.BUYORSELL) sqlId.JoinEx(r.FtMarketIds != "", fmt.Sprintf(" and g.marketid in(%v)", r.FtMarketIds)) sqlId.Join(" order by ") if r.MEMBERUSERID != 0 { sqlId.JoinFormat(" (CASE WHEN u.memberuserid = %v THEN 1 ELSE 2 END), u.memberuserid, ", r.MEMBERUSERID) } if r.BUYORSELL == 0 { sqlId.Join(" t.orderprice desc, t.ordertime desc") } else { sqlId.Join(" t.orderprice, t.ordertime desc") } sqlId.Page(r.Page, r.PageSize) return sqlId.String() } // GetDataByPage 获取买卖大厅 func (r *TjmdTradeOrderDetail) GetDataByPage() (interface{}, error, int, int, int) { sData := make([]TjmdTradeOrderDetail, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) for i := range sData { sData[i].calc() } if len(sData) > 0 { r.Total = sData[0].Total } return sData, err, r.Page, r.PageSize, r.Total } // TjmdTransferApply 协议转让申请 type TjmdTransferApply struct { APPLYID int64 `json:"applyid" xorm:"'APPLYID'"` // 申请ID(自增ID SEQ_TRADE_HOLDTRANSFERAPPLY) MARKETID int32 `json:"marketid" xorm:"MARKETID" form:"marketid"` // 市场ID INACCOUNTID int64 `json:"-" xorm:"INACCOUNTID" form:"inaccountid"` // 转入方资金ID(确认方) --对方申请 OUTACCOUNTID int64 `json:"-" xorm:"OUTACCOUNTID" form:"outaccountid"` // 转出方资金ID(申请方) --我的申请 GOODSID int32 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码 GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称 QTYDECIMALPLACE int `json:"-" xorm:"'QTYDECIMALPLACE'"` // 成交量小数位 BUYORSELL int32 `json:"buyorsell" xorm:"'BUYORSELL'"` // 买卖 - 0:买 1:卖 TRANSFERPRICE float64 `json:"transferprice" xorm:"'TRANSFERPRICE'"` // 转让价格(协议价格) QTY SFLOAT64 `json:"qty" xorm:"'QTY'"` // 转让数量(数量) TRANSFERAMOUNT float64 `json:"transferamount" xorm:"'TRANSFERAMOUNT'"` // 转让总金额(金额) APPLYSTATUS int32 `json:"applystatus" xorm:"'APPLYSTATUS'"` // 状态 - 0:未提交 1:待审核 2:审核中 3:审核通过 4:审核拒绝 5:审核失败 6:已撤销 TRADEID string `json:"tradeid" xorm:"'TRADEID'"` // 成交单号(关联持仓) APPLYTIME string `json:"applytime" xorm:"'APPLYTIME'"` // 申请时间(时间) AUDITREMARK string `json:"auditremark" xorm:"'AUDITREMARK'"` // 审核备注(拒绝原因?) ApplyType int32 `json:"-" form:"applytype"` // 类型 1-我的申请 2-对方申请 FtMarketIds string `json:"-" form:"marketids"` // 市场 格式 1,2,3 FtAccountIds string `json:"-" form:"accountids"` // 资金账号 格式 1,2,3 BEGINDATE string `json:"begindate" form:"begindate"` // 开始交易日(yyyymmdd) ENDDATE string `json:"enddate" form:"enddate"` // 结束交易日(yyyymmdd) } func (r *TjmdTransferApply) calc() { if r.QTYDECIMALPLACE != 0 { r.QTY.Power10(r.QTYDECIMALPLACE * -1) } } func (r *TjmdTransferApply) buildSql() string { var sqlId utils.SQLVal = ` select t.applyid, t.marketid, t.goodsid, g.goodscode, g.goodsname, g.qtydecimalplace, t.buyorsell, t.transferprice, t.qty, t.transferamount, t.applystatus, to_char(t.tradeid) tradeid, to_char(t.applytime,'yyyy-mm-dd hh24:mi:ss') applytime, t.auditremark from trade_holdtransferapply t left join goods g on t.goodsid = g.goodsid where 1=1 ` // 格式 yyyymmdd if len(r.BEGINDATE) > 0 { sqlId.JoinFormat(" and t.TRADEDATE >= '%v'", r.BEGINDATE) } if len(r.ENDDATE) > 0 { sqlId.JoinFormat(" and t.TRADEDATE <= '%v'", r.ENDDATE) } sqlId.JoinEx(r.FtMarketIds != "", fmt.Sprintf(" and t.marketid in(%v)", r.FtMarketIds)) if r.ApplyType == 1 { sqlId.JoinEx(r.FtAccountIds != "", fmt.Sprintf(" and t.outaccountid in(%v)", r.FtAccountIds)) } else if r.ApplyType == 2 { sqlId.JoinEx(r.FtAccountIds != "", fmt.Sprintf(" and t.inaccountid in(%v)", r.FtAccountIds)) } return sqlId.String() } // GetDataEx 获取协议转让申请 func (r *TjmdTransferApply) GetDataEx() (interface{}, error) { sData := make([]TjmdTransferApply, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) for i := range sData { sData[i].calc() } return sData, err } // TjmdTodayAccountMargin 账户保证金配置 type TjmdTodayAccountMargin struct { ACCOUNTID int64 `json:"accountid" xorm:"'ACCOUNTID'" form:"accountid"` // 账号ID GOODSID int32 `json:"goodsid" xorm:"'GOODSID'" form:"goodsid"` // 商品ID INFOCONTENT string `json:"-" xorm:"'INFOCONTENT'"` // 保证金信息(存储配置的Protobuffer串) MARKETID int32 `json:"marketid" xorm:"'MARKETID'" form:"marketid"` // 市场ID INFOC pb.GoodsMarginCfgStruct `json:"infoc"` // 配置参数 } func (r *TjmdTodayAccountMargin) calc() { if len(r.INFOCONTENT) > 0 { _ = proto.Unmarshal([]byte(r.INFOCONTENT), &r.INFOC) } } func (r *TjmdTodayAccountMargin) buildSql() string { var sqlId utils.SQLVal = ` select t.accountid, t.goodsid, t.infocontent, t.createdate, t.marketid from today_accountmargin t where 1 = 1 ` if r.ACCOUNTID > 0 { sqlId.JoinFormat(" and t.ACCOUNTID in(0, %v)", r.ACCOUNTID) } sqlId.AndEx("t.GOODSID", r.GOODSID, r.GOODSID > 0) sqlId.AndEx("t.MARKETID", r.MARKETID, r.MARKETID > 0) sqlId.Join(" order by t.accountid desc") sqlId.Page(1, 1) // 只取一条 return sqlId.String() } // GetDataEx 获取账户保证金配置 func (r *TjmdTodayAccountMargin) GetDataEx() (interface{}, error) { sData := make([]TjmdTodayAccountMargin, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) for i := range sData { sData[i].calc() } return sData, err } // TjmdMarketSection 市场板块 type TjmdMarketSection struct { MARKETSECTIONID int64 `json:"marketsectionid" xorm:"'MARKETSECTIONID'"` // 市场版块ID(SEQ_MARKETSECTION) MARKETSECTIONNAME string `json:"marketsectionname" xorm:"'MARKETSECTIONNAME'"` // 市场版块名称 ORDERINDEX int32 `json:"orderindex" xorm:"'ORDERINDEX'"` // 排序 REMARK string `json:"remark" xorm:"'REMARK'"` // 备注 PICTUREURL string `json:"pictureurl" xorm:"'PICTUREURL'"` // 图片url, 规格(90*90) MLIST []TjmdMarketSectionConfig `json:"mlist"` // 市场列表(板块下面有多少个市场) } func (r *TjmdMarketSection) calc() { r.MLIST = make([]TjmdMarketSectionConfig, 0) } func (r *TjmdMarketSection) addMarketList(lst []TjmdMarketSectionConfig) { for i := range lst { if lst[i].MARKETSECTIONID == r.MARKETSECTIONID { r.MLIST = append(r.MLIST, lst[i]) } } } func (r *TjmdMarketSection) buildSql() string { var sqlId utils.SQLVal = ` SELECT t.MARKETSECTIONID, t.MARKETSECTIONNAME, t.ORDERINDEX, t.REMARK, t.PICTUREURL FROM MARKETSECTION t WHERE t.isvalid = 1 order by t.orderindex ` return sqlId.String() } // GetDataEx 获取市场板块 func (r *TjmdMarketSection) GetDataEx() (interface{}, error) { sData := make([]TjmdMarketSection, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) for i := range sData { sData[i].calc() } // 获取版块详细配置 if len(sData) > 0 { m := TjmdMarketSectionConfig{} if d, err := m.GetDataEx(); err == nil { lst := d.([]TjmdMarketSectionConfig) for i := range sData { sData[i].addMarketList(lst) } } } return sData, err } // TjmdMarketSectionConfig 市场板块设置 type TjmdMarketSectionConfig struct { MARKETSECTIONID int64 `json:"marketsectionid" xorm:"'MARKETSECTIONID'"` // 市场版块ID(SEQ_MARKETSECTION) ORDERINDEX int32 `json:"orderindex" xorm:"'ORDERINDEX'"` // 排序 NOWRQUOTAFLAG int32 `json:"nowrquotaflag" xorm:"'NOWRQUOTAFLAG'"` // 是否校验无仓单额度(仓单贸易) 0:否 1:是 LISTINGMODE int32 `json:"listingmode" xorm:"'LISTINGMODE'"` // 挂牌方式 1:一口价 2:浮动价 3:贸易圈 4:协议指定 MARKETID int32 `json:"marketid" xorm:"MARKETID" form:"marketid"` // 市场ID正常5位,前三位固定:两位表示交易模式, 一位表示交易属性(1:收益权,2:所有权) 其它特殊市场:0-系统 1-交割服务 2-账户服务3-履约服务 4-仓单服务 5-积分服务 6-银行服务 MARKETNAME string `json:"marketname" xorm:"MARKETNAME"` // 市场名称 EXCHAREAID int32 `json:"exchareaid" xorm:"EXCHAREAID" form:"exchareaid"` // 所属交易所,可以没有 MARKETTYPE int32 `json:"markettype" xorm:"MARKETTYPE"` // 市场类型- 1:非交易服务 2:交易服务 TRADEMODE int32 `json:"trademode" xorm:"TRADEMODE"` // 交易模式 - 10:做市 13:竞价 15:通道交易 16:挂牌点选 17:仓单贸易 18:期权 19:竞拍-降价式 20:竞拍-竞价式 21:竞拍-大宗式 22:受托竞价 TRADEPROPERTY int32 `json:"tradeproperty" xorm:"TRADEPROPERTY"` // 交易属性 - 1:收益权(可做空) 2:所有权(不可做空) 3:期权 4:现货 5:参考行情 6:通道交易 7:币交易 8:场外期权 OPENMETHOD int32 `json:"openmethod" xorm:"OPENMETHOD"` // 开盘模式 - 0 自动 1手动 RECKONPRICEALGORITHM int32 `json:"reckonpricealgorithm" xorm:"RECKONPRICEALGORITHM"` // 结算价算法: 1:最后多少笔成交价加权平均 2:最后多少秒成交价加权平均 3:全天加权平均 4:最后一口价 5.买一价 6.卖一价 7.买一卖一均价 8.外部结算价 RECKONPRICEPARAM int32 `json:"reckonpriceparam" xorm:"RECKONPRICEPARAM"` // 结算价参数 MARKETSTATUS int32 `json:"marketstatus" xorm:"MARKETSTATUS"` // 生效状态(ValidStatus枚举): 1:待生效 2:正常 3:注销 MARKETSERVICEID int32 `json:"marketserviceid" xorm:"MARKETSERVICEID" form:"marketserviceid"` // 市场服务ID MARGINFORMULA int32 `json:"marginformula" xorm:"MARGINFORMULA"` // 持仓保证金公式 - 1:双边收 2:净头寸收 3:大小边差异收 4:大边收 5:卖持仓收(仅期权) PERFORMANCETEMPID int64 `json:"performancetempid" xorm:"PERFORMANCETEMPID" form:"performancetempid"` // 履约计划模板ID - 作废 CLEARINTERVAL int32 `json:"clearinterval" xorm:"CLEARINTERVAL"` // 待开市间隔(交易市场开盘前多久发市场待开市信号(单位分钟)) MATCHERMODE int32 `json:"matchermode" xorm:"MATCHERMODE"` // 指定对手模式[仓单贸易模式专用] - 1:任意对手 - 作废 RECKONORDER int32 `json:"reckonorder" xorm:"RECKONORDER"` // 结算顺序 CANPREEXERCISE int32 `json:"canpreexercise" xorm:"CANPREEXERCISE"` // [期权]是否可预申报- 0:否 1:是 CANGOODSEXERCISE int32 `json:"cangoodsexercise" xorm:"CANGOODSEXERCISE"` // [期权]是否可现货行权- 0:否 1:是 GOODSTYPE int32 `json:"goodstype" xorm:"GOODSTYPE"` // 商品类型 - 1:交易商品 2:仓单商品 ROLEPRIORITYTYPE int32 `json:"roleprioritytype" xorm:"ROLEPRIORITYTYPE"` // 角色优先类型 - 1:无 2:报价商优先 3:非报价商优先 [16:挂牌点选] ISRECORDSOURCE int32 `json:"isrecordsource" xorm:"ISRECORDSOURCE"` // 是否记录成交源 - 0:不记录 1:记录 [所有权] MARGINFORMULA2 int32 `json:"marginformula2" xorm:"MARGINFORMULA2"` // 持仓保证金公式(仅受托竞价) - 1:双边收 2:净头寸收 3:大小边差异收 4:大边收 5:卖持仓收(仅期权) HASWR int32 `json:"haswr" xorm:"HASWR"` // [竞拍]是否需要仓单 - 0:不需要 1:需要-作废 PREMIUMQUOTEMODE int32 `json:"premiumquotemode" xorm:"PREMIUMQUOTEMODE"` // 权利金报价方式 - 1:自动 2:手动 CANGOODSEXERCISETYPE int32 `json:"cangoodsexercisetype" xorm:"CANGOODSEXERCISETYPE"` // 可现货行权期权类型 - 1:认购 2认沽 3:认购认沽 [CanGoodsExercise = 1时可设置] CANACCEPTQUOTE int32 `json:"canacceptquote" xorm:"CANACCEPTQUOTE"` // 确认行权是否接收行情 - 0:不接受 1:接受 [可确认权的挂牌期权市场可配置] CANMUTISTAGE int32 `json:"canmutistage" xorm:"CANMUTISTAGE"` // 是否可多段运行 – 0:不可 1:可 [挂牌期权] ISDEDUCTMARGIN int32 `json:"isdeductmargin" xorm:"ISDEDUCTMARGIN"` // 竞拍违约是否扣除保证金[竞拍-降价式] - 0:不扣 1:扣除 CANMANUALQUOTESTRIKE int32 `json:"canmanualquotestrike" xorm:"CANMANUALQUOTESTRIKE"` // 是否可手动报行权价- 0:否 1:是 [期权] TRADETYPE int32 `json:"tradetype" xorm:"TRADETYPE"` // 下单方式[通道交易] - 1:直接转单 2:净头寸下单 PENDINGFLAG int32 `json:"pendingflag" xorm:"PENDINGFLAG"` // 待开市时间标识[通道交易-对冲] - 0:当日 1:上日 PENDINGTIME string `json:"pendingtime" xorm:"PENDINGTIME"` // 待开市时间[通道交易-对冲](HH:mm) RECKONTIME string `json:"reckontime" xorm:"RECKONTIME"` // 结算时间[通道交易-对冲](HH:mm) HASTRADECREDIT int32 `json:"hastradecredit" xorm:"HASTRADECREDIT"` // 是否交易授信[做市收益权] - 0:不授信 1:授信 CONTRACTTMP string `json:"contracttmp" xorm:"CONTRACTTMP"` // 合同模板[荷兰式][竞价式][仓单贸易] HASREBATE int32 `json:"hasrebate" xorm:"HASREBATE"` // 是否返利[竞价式] 0:不返,1:返利 -- 根据系统参数088显示或隐藏 REBATERATIO float64 `json:"rebateratio" xorm:"REBATERATIO"` // 返利比率[竞价式] OTCUSERID int64 `json:"otcuserid" xorm:"OTCUSERID" form:"otcuserid"` // 场外期权做市商[场外期权] OUTERSYNCTIME string `json:"outersynctime" xorm:"OUTERSYNCTIME"` // 外部同步时间点(h24:mi:ss)[场外期权] AUCTIONWRTYPE int32 `json:"auctionwrtype" xorm:"AUCTIONWRTYPE"` // 仓单类型(现货交易) - 1:无仓单 2:有仓单 3;有无仓单均可 ISRELEASEMARGIN int32 `json:"isreleasemargin" xorm:"ISRELEASEMARGIN"` // 成交参与保证金是否释放[竞价式] - 0:不释放 1释放 SELLLISTINGAUDITFLAG int32 `json:"selllistingauditflag" xorm:"SELLLISTINGAUDITFLAG"` // 卖挂牌是否需要审核(仓单贸易) - 0:不需要 1:需要 TRADEMARKETTYPE int32 `json:"trademarkettype" xorm:"TRADEMARKETTYPE"` // 交易市场类型 - 1:合约市场 2:外部市场 3:仓单市场 PAYLATERFLAG int32 `json:"paylaterflag" xorm:"PAYLATERFLAG"` // 是否支持后付 - 0:不支持 1;支持 - [挂牌点选 所有权、预售挂牌支持] ISUPDATERECKONPRICE int32 `json:"isupdatereckonprice" xorm:"ISUPDATERECKONPRICE"` // 输入结算价标识 - 0:系统生成 1:手工输入(自动) 2:手工输入(手动) UPDATERECKONPRICEINTERVAL int32 `json:"updatereckonpriceinterval" xorm:"UPDATERECKONPRICEINTERVAL"` // 输入结算价时长(分钟) [1:手工输入(自动)] FINANCEMARKETID int32 `json:"financemarketid" xorm:"FINANCEMARKETID" form:"financemarketid"` // 融资回购市场ID [仓单贸易] } func (r *TjmdMarketSectionConfig) calc() { } func (r *TjmdMarketSectionConfig) buildSql() string { var sqlId utils.SQLVal = ` select t.marketsectionid, t.orderindex, m.*, c.nowrquotaflag, c.listingmode from marketsectionconfig t inner join market m on t.marketid = m.marketid left join markettradeconfig c on t.marketid = c.marketid where 1 = 1 order by t.orderindex ` return sqlId.String() } // GetDataEx 获取市场板块设置 func (r *TjmdMarketSectionConfig) GetDataEx() (interface{}, error) { sData := make([]TjmdMarketSectionConfig, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) for i := range sData { sData[i].calc() } return sData, err } // TjmdHolderDetailTradeInfo 掉期商品订单详情(交易确认书) type TjmdHolderDetailTradeInfo struct { TRADEID string `json:"tradeid" xorm:"'TRADEID'" form:"tradeid"` // 成交编号 TRADEDATE string `json:"tradedate" xorm:"'TRADEDATE'"` // 成交日期 GOODSID int `json:"goodsid" xorm:"'GOODSID'"` // 商品ID GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码 GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称(交易标的) LISTINGDATE string `json:"listingdate" xorm:"'LISTINGDATE'"` // 开始交易日 LASTTRADEDATE string `json:"lasttradedate" xorm:"'LASTTRADEDATE'"` // 最后交易日 DELISTINGDATE string `json:"delistingdate" xorm:"'DELISTINGDATE'"` // 最后结算日 AGREEUNIT float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约乘数 OPENQTY int64 `json:"openqty" xorm:"'OPENQTY'"` // 交易数量 OPENPRICE float64 `json:"openprice" xorm:"'OPENPRICE'"` // 成交价 TRADEAMOUNT float64 `json:"tradeamount" xorm:"'TRADEAMOUNT'"` // 初始名义价值 EXPIREDATE string `json:"expiredate" xorm:"'EXPIREDATE'"` // 到期结算价定价日 BUYACCOUNTID string `json:"buyaccountid" xorm:"'BUYACCOUNTID'"` // 买方账户 SELLACCOUNTID string `json:"sellaccountid" xorm:"'SELLACCOUNTID'"` // 卖方账户 BUYUSERNAME string `json:"buyusername" xorm:"'BUYUSERNAME'"` // 买方 SELLUSERNAME string `json:"sellusername" xorm:"'SELLUSERNAME'"` // 卖方 EXPRIEPRICE string `json:"exprieprice" xorm:"'EXPRIEPRICE'"` // 到期清算价格 } func (r *TjmdHolderDetailTradeInfo) calc() { // #3568 固定为 到期收盘价 r.EXPRIEPRICE = "到期收盘价" if len(r.TRADEDATE) == 8 { // 20220408 插入分隔符'-' 变成 2022-04-08 r.TRADEDATE = r.TRADEDATE[:4] + "-" + r.TRADEDATE[4:6] + "-" + r.TRADEDATE[6:] } } func (r *TjmdHolderDetailTradeInfo) buildSql() string { var sqlId utils.SQLVal = ` select to_char(a.tradeid) tradeid, a.tradedate, a.goodsid, g.goodscode, g.goodsname, to_char(g.listingdate, 'yyyy-mm-dd') listingdate, to_char(g.lasttradedate, 'yyyy-mm-dd') lasttradedate, to_char(g.delistingdate, 'yyyy-mm-dd') delistingdate, g.agreeunit, a.openqty, a.openprice, a.tradeamount, a.expiredate, to_char(a.accountid) buyaccountid, to_char(b.accountid) sellaccountid, u1.accountname buyusername, u2.accountname sellusername from trade_holderdetail a left join trade_holderdetail b on a.tradeid = b.tradeid and b.buyorsell = 1 left join goods g on a.goodsid = g.goodsid left join taaccount ta1 on a.accountid = ta1.accountid left join useraccount u1 on ta1.relateduserid = u1.userid left join taaccount ta2 on b.accountid = ta2.accountid left join useraccount u2 on ta2.relateduserid = u2.userid where a.buyorsell = 0 and a.tradeid = %v ` sqlId.FormatParam(r.TRADEID) return sqlId.String() } // GetDataEx 获取掉期商品订单详情(交易确认书) func (r *TjmdHolderDetailTradeInfo) GetDataEx() (interface{}, error) { sData := make([]TjmdHolderDetailTradeInfo, 0) err := db.GetEngine().SQL(r.buildSql()).Find(&sData) for i := range sData { sData[i].calc() } return sData, err }