goods.go 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/10/27 14:20
  4. * @Modify : 2021/10/27 14:20
  5. * @note : 商品信息缓存
  6. */
  7. package mtpcache
  8. import (
  9. "github.com/muesli/cache2go"
  10. "mtp2_if/db"
  11. "mtp2_if/utils"
  12. "strings"
  13. "time"
  14. )
  15. var goodsCache *cache2go.CacheTable
  16. func init() {
  17. goodsCache = cache2go.Cache("goods")
  18. goodsCache.SetDataLoader(func(key interface{}, param ...interface{}) *cache2go.CacheItem {
  19. if v, ok := key.(string); ok {
  20. m := Goods{GOODSCODE: v}
  21. if d, err := m.GetData(); err == nil {
  22. if len(d) > 0 {
  23. val := d[0]
  24. item := cache2go.NewCacheItem(val.Key(), 0, val)
  25. return item
  26. }
  27. }
  28. }
  29. return nil
  30. })
  31. // 延时5秒 加载所有商品
  32. go func() {
  33. time.Sleep(time.Second * 5)
  34. loadData()
  35. }()
  36. }
  37. func loadData() {
  38. m := Goods{}
  39. if d, err := m.GetData(); err == nil {
  40. for _, v := range d {
  41. goodsCache.Add(v.Key(), 0, v)
  42. }
  43. }
  44. }
  45. // Goods 商品信息
  46. type Goods struct {
  47. GOODSID int64 `json:"goodsid" xorm:"'GOODSID'"` // 商品ID(自增ID SEQ_GOODS)
  48. GOODSCODE string `json:"goodscode" xorm:"'GOODSCODE'"` // 商品代码(内部)
  49. GOODSNAME string `json:"goodsname" xorm:"'GOODSNAME'"` // 商品名称
  50. MARKETID string `json:"marketid" xorm:"'MARKETID'"` // 所属市场ID
  51. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 所属商品组ID
  52. GOODSSTATUS int32 `json:"goodsstatus" xorm:"'GOODSSTATUS'"` // 商品状态- 1:待审核 2:未上市 3:上市 4:已注销 5:审核拒绝 6:退市 7:待退市
  53. CURRENCYID int32 `json:"currencyid" xorm:"'CURRENCYID'"` // 报价货币ID
  54. GOODUNITID int32 `json:"goodunitid" xorm:"'GOODUNITID'"` // 报价单位ID
  55. AGREEUNIT float64 `json:"agreeunit" xorm:"'AGREEUNIT'"` // 合约乘数
  56. DECIMALPLACE int32 `json:"decimalplace" xorm:"'DECIMALPLACE'"` // 报价小数位
  57. QTYDECIMALPLACE int32 `json:"qtydecimalplace" xorm:"'QTYDECIMALPLACE'"` // 成交量小数位
  58. GOODSCURRENCYID int32 `json:"goodscurrencyid" xorm:"'GOODSCURRENCYID'"` // 合约货币ID
  59. REFGOODSID int64 `json:"refgoodsid" xorm:"'REFGOODSID'"` // 参考商品ID
  60. REFGOODSCODE string `json:"refgoodscode" xorm:"'REFGOODSCODE'"` // 参考商品代码
  61. }
  62. func (r *Goods) Key() string {
  63. return r.GOODSCODE
  64. }
  65. func (r *Goods) calc() {
  66. }
  67. func (r *Goods) buildSql() string {
  68. var sqlId utils.SQLVal = `
  69. select t.goodsid,
  70. upper(t.goodscode) goodscode,
  71. t.goodsname,
  72. t.marketid,
  73. t.goodsgroupid,
  74. t.goodsstatus,
  75. t.currencyid,
  76. t.goodunitid,
  77. t.agreeunit,
  78. t.decimalplace,
  79. t.qtydecimalplace,
  80. t.goodscurrencyid,
  81. t.goodsquotetype,
  82. t.refgoodsid,
  83. t.refgoodscode
  84. from goods t
  85. where 1=1
  86. `
  87. sqlId.AndEx("t.goodsid", r.GOODSID, r.GOODSID > 0)
  88. if r.GOODSCODE != "" {
  89. // 不区分大小写加载商品
  90. sqlId.JoinFormat(" and upper(t.goodscode) = '%v'", strings.ToUpper(r.GOODSCODE))
  91. }
  92. return sqlId.String()
  93. }
  94. // GetDataEx 获取商品信息
  95. func (r *Goods) GetData() ([]Goods, error) {
  96. sData := make([]Goods, 0)
  97. e := db.GetEngine()
  98. if e == nil {
  99. return sData, nil
  100. }
  101. err := e.SQL(r.buildSql()).Find(&sData)
  102. for i := range sData {
  103. sData[i].calc()
  104. }
  105. return sData, err
  106. }
  107. // GetGoods 获取商品信息
  108. func GetGoods(goodsCode string) (Goods, bool) {
  109. // 缓存是用大写的goodscode, 查找也转成大写的来查找
  110. goodsCode2 := strings.ToUpper(goodsCode)
  111. if item, err := goodsCache.Value(goodsCode2); err == nil {
  112. d := item.Data()
  113. if v, ok := d.(Goods); ok {
  114. return v, true
  115. } else if v2, ok2 := d.(*Goods); ok2 {
  116. return *v2, true
  117. }
  118. }
  119. return Goods{}, false
  120. }
  121. // GetGoodsDecimalplace 获取商品小数位
  122. func GetGoodsDecimalplace(goodsCode string) int {
  123. if d, ok := GetGoods(strings.ToUpper(goodsCode)); ok {
  124. return int(d.DECIMALPLACE)
  125. }
  126. if d, ok := GetGoods(goodsCode); ok {
  127. return int(d.DECIMALPLACE)
  128. }
  129. return 0
  130. }