/** * @Author: zou.yingbin * @Create : 2021/10/27 14:20 * @Modify : 2021/10/27 14:20 * @note : 商品信息缓存 */ package mtpcache import ( "mtp2_if/db" "mtp2_if/utils" "strings" "time" "github.com/muesli/cache2go" ) var goodsCache *cache2go.CacheTable var goodsExCache *cache2go.CacheTable func init() { goodsCache = cache2go.Cache("goods") goodsCache.SetDataLoader(func(key interface{}, param ...interface{}) *cache2go.CacheItem { if v, ok := key.(string); ok { m := Goods{GOODSCODE: v} if d, err := m.GetData(); err == nil { if len(d) > 0 { val := d[0] item := cache2go.NewCacheItem(val.Key(), 0, val) return item } } } return nil }) goodsExCache = cache2go.Cache("goodsex") goodsExCache.SetDataLoader(func(key interface{}, param ...interface{}) *cache2go.CacheItem { if v, ok := key.(string); ok { m := Goodsex{GOODSCODE: v} if d, err := m.GetData(); err == nil { if len(d) > 0 { val := d[0] item := cache2go.NewCacheItem(val.Key(), 0, val) return item } } } return nil }) // 延时5秒 加载所有商品 go func() { ticker := time.NewTicker(10 * time.Second) for range ticker.C { loadData() } // time.Sleep(time.Second * 5) // loadData() }() } func loadData() { m := Goods{} d, err := m.GetData() if err == nil { for _, v := range d { goodsCache.Add(v.Key(), 0, v) } } m1 := Goodsex{} if d, err := m1.GetData(); err == nil { for _, v := range d { goodsExCache.Add(v.Key(), 0, v) } } } // Goods 商品信息 type Goods struct { GOODSID int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID(自增ID SEQ_GOODS) GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码(内部) GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称 MARKETID string `json:"marketid" xorm:"'MARKETID'"` // 所属市场ID GOODSGROUPID int32 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 所属商品组ID GOODSSTATUS int32 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市 CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID AGREEUNIT float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约乘数 DECIMALPLACE int32 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位 QTYDECIMALPLACE int32 `json:"qtydecimalplace" xorm:"'QTYDECIMALPLACE'"` // 成交量小数位 GOODSCURRENCYID int32 `json:"goodscurrencyid" xorm:"'GOODSCURRENCYID'"` // 合约货币ID REFGOODSID int64 `json:"refgoodsid" xorm:"'REFGOODSID'"` // 参考商品ID REFGOODSCODE string `json:"refgoodscode" xorm:"'REFGOODSCODE'"` // 参考商品代码 THUMURLS string `json:"thumurls" xorm:"THUMURLS"` // 缩略图片(1:1)(逗号分隔) } func (r *Goods) Key() string { return r.GOODSCODE } func (r *Goods) calc() { } func (r *Goods) buildSql() string { var sqlId utils.SQLVal = ` select t.goodsid, upper(t.goodscode) goodscode, t.goodsname, t.marketid, t.goodsgroupid, t.goodsstatus, t.currencyid, t.goodunitid, t.agreeunit, t.decimalplace, t.qtydecimalplace, t.goodscurrencyid, t.goodsquotetype, t.refgoodsid, t.refgoodscode, t.thumurls from goods t where 1=1 ` sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0) if r.GOODSCODE != "" { // 不区分大小写加载商品 sqlId.JoinFormat(" and upper(t.goodscode) = '%v'", strings.ToUpper(r.GOODSCODE)) } return sqlId.String() } // GetDataEx 获取商品信息 func (r *Goods) GetData() ([]Goods, error) { sData := make([]Goods, 0) e := db.GetEngine() if e == nil { return sData, nil } err := e.SQL(r.buildSql()).Find(&sData) for i := range sData { sData[i].calc() } return sData, err } // GetGoods 获取商品信息 func GetGoods(goodsCode string) (Goods, bool) { // 缓存是用大写的goodscode, 查找也转成大写的来查找 goodsCode2 := strings.ToUpper(goodsCode) item, err := goodsCache.Value(goodsCode2) if err == nil { d := item.Data() if v, ok := d.(Goods); ok { return v, true } else if v2, ok2 := d.(*Goods); ok2 { return *v2, true } } return Goods{}, false } // GetGoodsDecimalplace 获取商品小数位 func GetGoodsDecimalplace(goodsCode string) int { if d, ok := GetGoods(strings.ToUpper(goodsCode)); ok { return int(d.DECIMALPLACE) } if d, ok := GetGoods(goodsCode); ok { return int(d.DECIMALPLACE) } return 0 } type Goodsex struct { GOODSID int32 `json:"goodsid" xorm:"GOODSID"` // 期货合约ID GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码(内部) MARKETID int32 `json:"marketid" xorm:"MARKETID"` // 所属市场ID LATEFEEDAYS int32 `json:"latefeedays" xorm:"LATEFEEDAYS"` // 滞纳金起计天数(52) LATEFEEALGORITHM int32 `json:"latefeealgorithm" xorm:"LATEFEEALGORITHM"` // 滞纳金收取方式 1:比率 2:固定(52) LATEFEEVALUE float64 `json:"latefeevalue" xorm:"LATEFEEVALUE"` // 滞纳金收取值(52) BUYPREMIUM float64 `json:"buypremium" xorm:"BUYPREMIUM"` // 买交收升贴水(52) SELLPREMIUM float64 `json:"sellpremium" xorm:"SELLPREMIUM"` // 卖交收升贴水(52) PROMPTDEPOSITRATE float64 `json:"promptdepositrate" xorm:"PROMPTDEPOSITRATE"` // 提示定金率(52) CUTDEPOSITRATE float64 `json:"cutdepositrate" xorm:"CUTDEPOSITRATE"` // 斩仓定金率(52) ISDEPOSITCHANGED int32 `json:"isdepositchanged" xorm:"ISDEPOSITCHANGED"` // 定金率是否变更 - 0:否 1:是(52) ISTOALL int32 `json:"istoall" xorm:"ISTOALL"` // 是否全部单据生效 - 0:否(仅新单据生效) 1:是(全部单据生效)(52) NEWPROMPTDEPOSITRATE float64 `json:"newpromptdepositrate" xorm:"NEWPROMPTDEPOSITRATE"` // 新提示定金率(52) NEWCUTDEPOSITRATE float64 `json:"newcutdepositrate" xorm:"NEWCUTDEPOSITRATE"` // 新斩仓定金率(52) MINDELIVERYLOT int32 `json:"mindeliverylot" xorm:"MINDELIVERYLOT"` // 最小交收手数(50-线下交收) 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) ADDDEPOSITRATE float64 `json:"adddepositrate" xorm:"ADDDEPOSITRATE"` // 自动追加定金率(52) - 允许时显示 CANAUTOREFUNDDEPOSIT int32 `json:"canautorefunddeposit" xorm:"CANAUTOREFUNDDEPOSIT"` // 是否允许自动退还定金: 0-否 1-是(52) NEWADDDEPOSITRATE float64 `json:"newadddepositrate" xorm:"NEWADDDEPOSITRATE"` // 新自动追加定金率(52) - 允许时显示 DRAUDITFLAG int32 `json:"drauditflag" xorm:"DRAUDITFLAG"` // 定金率修改待审核标识(52) - 0:不需审核 1:待审核 TMPTRANSFERDEPOSITRATIO float64 `json:"tmptransferdepositratio" xorm:"TMPTRANSFERDEPOSITRATIO"` // 临时转让定金比例(49) GOODSNAMETH string `json:"goodsnameth" xorm:"GOODSNAMETH"` // 期货合约名称泰文) GOODSNAMEEN string `json:"goodsnameen" xorm:"GOODSNAMEEN"` // 期货合约名称(英文) GOODSNAMETW string `json:"goodsnametw" xorm:"GOODSNAMETW"` // 期货合约名称(繁体) BUYPRICEMOVEALGORITHM int32 `json:"buypricemovealgorithm" xorm:"BUYPRICEMOVEALGORITHM"` // 买交收升贴水算法 BUYPRICEMOVEVALUE float64 `json:"buypricemovevalue" xorm:"BUYPRICEMOVEVALUE"` // 买交收升贴水值 BUYSHIPPINGFEEALGORITHM int32 `json:"buyshippingfeealgorithm" xorm:"BUYSHIPPINGFEEALGORITHM"` // 买交收运费算法 BUYSHIPPINGFEEVALUE float64 `json:"buyshippingfeevalue" xorm:"BUYSHIPPINGFEEVALUE"` // 买交收运费值 BUYOTHERFEEALGORITHM int32 `json:"buyotherfeealgorithm" xorm:"BUYOTHERFEEALGORITHM"` // 买交收其它费用算法 BUYOTHERFEEVALUE float64 `json:"buyotherfeevalue" xorm:"BUYOTHERFEEVALUE"` // 买交收其它费用值 SELLPRICEMOVEALGORITHM int32 `json:"sellpricemovealgorithm" xorm:"SELLPRICEMOVEALGORITHM"` // 卖交收升贴水算法 SELLPRICEMOVEVALUE float64 `json:"sellpricemovevalue" xorm:"SELLPRICEMOVEVALUE"` // 卖交收升贴水值 SELLSHIPPINGFEEALGORITHM int32 `json:"sellshippingfeealgorithm" xorm:"SELLSHIPPINGFEEALGORITHM"` // 卖交收运费算法 SELLSHIPPINGFEEVALUE float64 `json:"sellshippingfeevalue" xorm:"SELLSHIPPINGFEEVALUE"` // 卖交收运费值 SELLOTHERFEEALGORITHM int32 `json:"sellotherfeealgorithm" xorm:"SELLOTHERFEEALGORITHM"` // 卖交收其它费用算法 SELLOTHERFEEVALUE float64 `json:"sellotherfeevalue" xorm:"SELLOTHERFEEVALUE"` // 卖交收其它费用值 GOODSNAMEVI string `json:"goodsnamevi" xorm:"GOODSNAMEVI"` // 期货合约名称(越南语) } func (r *Goodsex) Key() string { return r.GOODSCODE } func (r *Goodsex) calc() { } func (r *Goodsex) buildSql() string { var sqlId utils.SQLVal = ` select t.goodsid, t.marketid, t.latefeedays, t.latefeealgorithm, t.latefeevalue, t.buypremium, t.sellpremium, t.promptdepositrate, t.cutdepositrate, t.isdepositchanged, t.istoall, t.newpromptdepositrate, t.newcutdepositrate, t.mindeliverylot, t.minspread, t.maxspread, t.goodsorder, t.canautoadddeposit, t.adddepositrate, t.canautorefunddeposit, t.newadddepositrate, t.drauditflag, t.tmptransferdepositratio, t.goodsnameth, t.goodsnameen, t.goodsnametw, t.goodsnamevi, t.buypricemovealgorithm, t.buypricemovevalue, t.buyshippingfeealgorithm, t.buyshippingfeevalue, t.buyotherfeealgorithm, t.buyotherfeevalue, t.sellpricemovealgorithm, t.sellpricemovevalue, t.sellshippingfeealgorithm, t.sellshippingfeevalue, t.sellotherfeealgorithm, t.sellotherfeevalue, g.goodscode from goodsex t inner join goods g on g.goodsid = t.goodsid where 1=1 ` sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0) if r.GOODSCODE != "" { // 不区分大小写加载商品 sqlId.JoinFormat(" and upper(g.goodscode) = '%v'", strings.ToUpper(r.GOODSCODE)) } return sqlId.String() } // GetDataEx 获取商品信息 func (r *Goodsex) GetData() ([]Goodsex, error) { sData := make([]Goodsex, 0) e := db.GetEngine() if e == nil { return sData, nil } err := e.SQL(r.buildSql()).Find(&sData) for i := range sData { sData[i].calc() } return sData, err } func GetGoodsEx(goodsCode string) (Goodsex, bool) { // 缓存是用大写的goodscode, 查找也转成大写的来查找 goodsCode2 := strings.ToUpper(goodsCode) if item, err := goodsExCache.Value(goodsCode2); err == nil { d := item.Data() if v, ok := d.(Goodsex); ok { return v, true } else if v2, ok2 := d.(*Goodsex); ok2 { return *v2, true } } return Goodsex{}, false }