package models // 企业风管期货商品相关 import ( "fmt" "mtp2_if/db" "mtp2_if/mtpcache" "time" ) // Goodssortbypreposition 合约昨持仓排序表 - 同一品种内按昨持仓量倒排序 // 行情服务清盘前生成此表,供交易服务风控规则使用;生成前先删除此表数据; type Goodssortbypreposition struct { Tradedate string `json:"tradedate" xorm:"'TRADEDATE'" binding:"required"` // 交易日 Goodscode string `json:"goodscode" xorm:"'GOODSCODE'" binding:"required"` // 合约代码 - 易盛接口:合约代码=品种代码+合约代码 Goodsgroupcode string `json:"goodsgroupcode" xorm:"'GOODSGROUPCODE'"` // 品种代码 Sortindex int64 `json:"sortindex" xorm:"'SORTINDEX'"` // 排序 Prepositionqty int64 `json:"prepositionqty" xorm:"'PREPOSITIONQTY'"` // 昨持仓量 Updatetime time.Time `json:"updatetime" xorm:"'UPDATETIME'"` // 更新时间 } // TableName is GOODSSORTBYPREPOSITION func (Goodssortbypreposition) TableName() string { return "GOODSSORTBYPREPOSITION" } type ErmcpGoods 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"` // 商品图片 Marketmarginalgorithm int64 `json:"marketmarginalgorithm" xorm:"MARKETMARGINALGORITHM"` // 保证金计算方式 Marketmarginvalue float64 `json:"marketmarginvalue" xorm:"MARKETMARGINVALUE"` // 即市保证金值 Mindeliverylot int64 `json:"mindeliverylot" xorm:"MINDELIVERYLOT"` // 最小交收手数(50模式) PROVIDERUSERID int64 `json:"provideruserid" xorm:"PROVIDERUSERID"` // 发售方用户ID(49)\供货商(50) PROVIDERACCOUNTID int64 `json:"provideraccountid" xorm:"PROVIDERACCOUNTID"` // 发售方资金账户ID(49)\供货商资金账户ID(50) Relatedgoodsid int32 `json:"relatedgoodsid" xorm:"REFGOODSID"` // 关联参考商品ID 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:场外期权 ENUMDICNAME string `json:"enumdicname"` // 单位名称 MINSPREAD float64 `json:"minspread" xorm:"MINSPREAD"` // 点差下限(46) MAXSPREAD float64 `json:"maxspread" xorm:"MAXSPREAD"` // 点差上限(46) GOODSORDER string `json:"goodsorder" xorm:"GOODSORDER"` // 商品显示顺序(99) CANAUTOADDDEPOSIT int32 `json:"canautoadddeposit" xorm:"CANAUTOADDDEPOSIT"` // 是否允许自动追加定金: 0-否 1-是(52) CANAUTOREFUNDDEPOSIT int32 `json:"canautorefunddeposit" xorm:"CANAUTOREFUNDDEPOSIT"` // 是否允许自动退还定金: 0-否 1-是(52) } // GetErmcpGoodses 企业风管专用获取商品信息的方法 func GetErmcpGoodses(userid int64, lastUpdateTime string, loginID int64) ([]ErmcpGoods, error) { engine := db.GetEngine() // 对比数据库与终端的更新时间戳 if len(lastUpdateTime) > 0 { goods := make([]Goods, 0) engine.Table("GOODS G").Where(fmt.Sprintf("G.MODIFYTIME > to_date('%s','yyyy-MM-dd hh24:mi:ss')", lastUpdateTime)).Find(&goods) if len(goods) == 0 { return make([]ErmcpGoods, 0), nil } } // 获取此账号相关有权限的市场 ids := make([]int, 0) if loginID != 0 { markets, err := GetMarketsByLoginID(int(loginID)) if err != nil { return make([]ErmcpGoods, 0), err } // 构建市场ID列表 for _, market := range markets { ids = append(ids, int(market.Marketid)) } } goodses := make([]ErmcpGoods, 0) session := engine.Table("GOODS G"). Select(` G.*, M.TRADEMODE, M.TRADEPROPERTY, GM.MARGINALGORITHM MARKETMARGINALGORITHM, GM.MARKETMARGINVALUE, nvl(EX.MINDELIVERYLOT, 1) MINDELIVERYLOT, EX.MINSPREAD, EX.MAXSPREAD, EX.GOODSORDER, EX.CANAUTOADDDEPOSIT, Ex.CANAUTOREFUNDDEPOSIT `). Join("LEFT", "MARKET M", "M.MARKETID = G.MARKETID"). Join("LEFT", "GOODSMARGINCONFIG GM", "GM.GOODSID = G.GOODSID AND GM.ISDEFAULT = 1"). Join("LEFT", "GOODSEX EX", "EX.GOODSID = G.GOODSID"). Where("G.GOODSSTATUS in (3)") if loginID != 0 { session = session.In("G.MARKETID", ids) } session = session.OrderBy("G.GOODSCODE") if err := session.Find(&goodses); err != nil { return nil, err } // 错误 #3068 //【企业风管-WebPC】期货市场商品应根据已设置的套保品种来显示,未设置套保品种的商品都不要显示出来 if userid > 0 && len(goodses) > 0 { areaUserId := mtpcache.GetAreaUserId(userid, 0) sqlId := ` select t.goodsgroupid from goodsgroup t where t.groupcategroyid in ( select g.groupcategroyid from erms_middlegoods t left join goodsgroup g on t.goodsgroupid = g.goodsgroupid where t.areauserid = %v and t.isvalid = 1) ` sqlId = fmt.Sprintf(sqlId, areaUserId) type GoodsGroupId struct { GoodsGroupId int64 `json:"goodsgroupid" xorm:"'GoodsGroupId'"` } sGroupId := make([]GoodsGroupId, 0) err := engine.SQL(sqlId).Find(&sGroupId) if err != nil { return nil, err } fIn := func(goodsgroupid int64) bool { for i := range sGroupId { if sGroupId[i].GoodsGroupId == goodsgroupid { return true } } return false } sGoods := make([]ErmcpGoods, 0) for _, v := range goodses { if fIn(v.Goodsgroupid) { sGoods = append(sGoods, v) } } goodses = sGoods[:] } for i := range goodses { goodses[i].ENUMDICNAME = mtpcache.GetEnumDicitemName(int32(goodses[i].Goodunitid)) } return goodses, nil } // GetGoodsLastUpdateTime 获取商品表最后更新(Update)时间 func GetGoodsLastUpdateTime() (*time.Time, error) { engine := db.GetEngine() var lastUpdateTimes time.Time sql := `SELECT VERSIONS_STARTTIME LASTUPDATETIME FROM GOODS VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE WHERE VERSIONS_STARTTIME IS NOT NULL and VERSIONS_OPERATION = 'U' order by LASTUPDATETIME desc` has, err := engine.SQL(sql).Get(&lastUpdateTimes) if err != nil { return nil, err } if !has { return nil, nil } return &lastUpdateTimes, nil } // GetGoodsSortByPrePositions 获取查询主力+次主力商品 func GetGoodsSortByPrePositions(sortIndex string) ([]Goodssortbypreposition, error) { rst := make([]Goodssortbypreposition, 0) session := db.GetEngine().Table("GOODSSORTBYPREPOSITION T") if len(sortIndex) > 0 { session = session.Where(fmt.Sprintf("T.SORTINDEX in (%s)", sortIndex)) } session = session.Asc("T.SORTINDEX") if err := session.Find(&rst); err != nil { return nil, err } return rst, nil }