enumdicitem.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/1/13 9:15
  4. * @Modify : 2021/1/13 9:15
  5. */
  6. package mtpcache
  7. import (
  8. "mtp2_if/db"
  9. "mtp2_if/logger"
  10. "mtp2_if/utils"
  11. "sync"
  12. "time"
  13. )
  14. var (
  15. vDicCurrency = enumdicitem{data: map[int32]string{}, nType: 2}
  16. vDic = enumdicitem{data: map[int32]string{}, nType: 1}
  17. )
  18. // IGetEnumdicName 获取字典名称接口
  19. type IGetEnumdicName interface {
  20. get(int32) string
  21. load()
  22. }
  23. // 商品单位名称缓存
  24. type enumdicitem struct {
  25. mtx sync.RWMutex //锁
  26. data map[int32]string //数据[enumitemname]enumdicname
  27. last time.Time
  28. nType int32 // 1-单位名称 2-币种名称
  29. }
  30. type enumData struct {
  31. ENUMITEMNAME int32 `json:"enumitemname" xorm:"'enumitemname'"` //ID
  32. ENUMDICNAME string `json:"enumdicname" xorm:"'enumdicname'"` //名称
  33. }
  34. func (r *enumdicitem) buildSql() string {
  35. var sqlId utils.SQLVal = "select t.enumitemname, t.enumdicname" +
  36. " from enumdicitem t" +
  37. " where t.enumitemstatus = 1"
  38. sqlId.AndEx("t.enumdiccode", "goodsunit", r.nType == 1)
  39. sqlId.AndEx("t.enumdiccode", "currency", r.nType == 2)
  40. return sqlId.String()
  41. }
  42. func init() {
  43. go func() {
  44. time.Sleep(time.Second * 1)
  45. vDicCurrency.load()
  46. vDic.load()
  47. }()
  48. }
  49. // 加载数据
  50. func (r *enumdicitem) load() {
  51. now := time.Now()
  52. // 间隔3秒以上才重新加载
  53. if d := now.Sub(r.last); d.Seconds() < 3 {
  54. return
  55. }
  56. r.mtx.Lock()
  57. defer r.mtx.Unlock()
  58. e := db.GetEngine()
  59. if e == nil {
  60. return
  61. }
  62. sData := make([]enumData, 0)
  63. s := e.SQL(r.buildSql())
  64. if err := s.Find(&sData); err != nil {
  65. logger.GetLogger().Errorf("cache load enumdicitem, %v", err)
  66. } else {
  67. r.data = make(map[int32]string)
  68. for i := range sData {
  69. r.data[sData[i].ENUMITEMNAME] = sData[i].ENUMDICNAME
  70. }
  71. r.last = time.Now()
  72. }
  73. }
  74. func (r *enumdicitem) get(id int32) string {
  75. r.mtx.RLock()
  76. defer r.mtx.RUnlock()
  77. if r.data == nil {
  78. return ""
  79. }
  80. if v, ok := r.data[id]; ok {
  81. return v
  82. }
  83. return ""
  84. }
  85. // getDicEnumName 获取字典名称
  86. func getDicEnumName(obj IGetEnumdicName, id int32) string {
  87. if id <= 0 {
  88. return ""
  89. }
  90. if v := obj.get(id); v != "" {
  91. return v
  92. } else {
  93. obj.load()
  94. }
  95. return obj.get(id)
  96. }
  97. // GetEnumDicitemName 获取商品单位枚举名称
  98. func GetEnumDicitemName(id int32) string {
  99. return getDicEnumName(&vDic, id)
  100. }
  101. // GetCurrencyName 获取币种名称
  102. func GetCurrencyName(id int32) string {
  103. return getDicEnumName(&vDicCurrency, id)
  104. }