| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304 |
- /**
- * @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() {
- time.Sleep(time.Second * 5)
- loadData()
- }()
- }
- func loadData() {
- m := Goods{}
- if d, err := m.GetData(); 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)
- if item, err := goodsCache.Value(goodsCode2); 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"` // 卖交收其它费用值
- }
- 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.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
- }
|