middlegoods.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/1/18 15:25
  4. * @Modify : 2021/1/18 15:25
  5. */
  6. package mtpcache
  7. import (
  8. "fmt"
  9. "mtp2_if/db"
  10. "mtp2_if/logger"
  11. "sync"
  12. "time"
  13. )
  14. var vGoodMgr middleGoodsMgr
  15. // 套保商品缓存
  16. type middleGoodsMgr struct {
  17. mtx sync.RWMutex
  18. data map[uint32]MiddleGoods
  19. last time.Time
  20. }
  21. // 套保品种
  22. type MiddleGoods struct {
  23. MIDDLEGOODSID uint32 `json:"middlegoodsid" xorm:"'MIDDLEGOODSID'"` // 套保品种ID(SEQ_ERMS_MIDDLEGOODS)
  24. MIDDLEGOODSNAME string `json:"middlegoodsname" xorm:"'MIDDLEGOODSNAME'"` // 套保品种名称
  25. MIDDLEGOODSCODE string `json:"middlegoodscode" xorm:"'MIDDLEGOODSCODE'"` // 套保品种代码
  26. GOODSUNITID int32 `json:"goodsunitid" xorm:"'GOODSUNITID'"` // 单位ID
  27. RELATEDGOODSID int32 `json:"relatedgoodsid" xorm:"'RELATEDGOODSID'"` // 关联交易商品ID
  28. EVALUATERATIO float64 `json:"evaluateratio" xorm:"'EVALUATERATIO'"` // 估价系数
  29. QTYDECIMALPLACE int32 `json:"qtydecimalplace" xorm:"'QTYDECIMALPLACE'"` // 数量小数位
  30. RELATEDGOODSTYPE int32 `json:"relatedgoodstype" xorm:"'RELATEDGOODSTYPE'"` // 关联商品类型 - 1:期货合约 2:现货品种
  31. NEEDHEDGERATIO float64 `json:"needhedgeratio" xorm:"'NEEDHEDGERATIO'"` // 套保比率
  32. AREAUSERID uint32 `json:"areauserid" xorm:"'AREAUSERID'"` // 机构用户ID
  33. GOODSGROUPID int32 `json:"goodsgroupid" xorm:"'GOODSGROUPID'"` // 关联期货品种ID
  34. ISVALID int32 `json:"isvalid" xorm:"'ISVALID'"` // 状态 0-无效(停用) 1-有效(正常)
  35. MODIFYTIME string `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  36. }
  37. func (r *middleGoodsMgr) isNeedLoad() bool {
  38. now := time.Now()
  39. // 间隔3秒以上重新加载
  40. if d := now.Sub(r.last); d.Seconds() >= 3 {
  41. return true
  42. }
  43. return false
  44. }
  45. // 加载数据
  46. func (r *middleGoodsMgr) load() {
  47. r.mtx.Lock()
  48. defer r.mtx.Unlock()
  49. e := db.GetEngine()
  50. if e == nil {
  51. return
  52. }
  53. sqlId := "select MIDDLEGOODSID," +
  54. " MIDDLEGOODSNAME," +
  55. " MIDDLEGOODSCODE," +
  56. " GOODSUNITID," +
  57. " RELATEDGOODSID," +
  58. " EVALUATERATIO," +
  59. " QTYDECIMALPLACE," +
  60. " RELATEDGOODSTYPE," +
  61. " NEEDHEDGERATIO," +
  62. " AREAUSERID," +
  63. " GOODSGROUPID," +
  64. " MODIFYTIME," +
  65. " ISVALID" +
  66. " from erms_middlegoods t"
  67. sData := make([]MiddleGoods, 0)
  68. s := e.SQL(sqlId)
  69. if err := s.Find(&sData); err == nil {
  70. r.data = make(map[uint32]MiddleGoods)
  71. for i := range sData {
  72. r.data[sData[i].MIDDLEGOODSID] = sData[i]
  73. }
  74. r.last = time.Now()
  75. } else {
  76. logger.GetLogger().Errorf("load middlegoods fail, %v", err)
  77. }
  78. }
  79. func (r *middleGoodsMgr) get(middleGoodsId uint32) (MiddleGoods, error) {
  80. r.mtx.RLock()
  81. defer r.mtx.RUnlock()
  82. if r.data == nil {
  83. return MiddleGoods{}, fmt.Errorf("not found")
  84. }
  85. if v, ok := r.data[middleGoodsId]; ok {
  86. return v, nil
  87. }
  88. return MiddleGoods{}, fmt.Errorf("not found")
  89. }
  90. func (r *middleGoodsMgr) getByUserID(userId uint32) ([]MiddleGoods, error) {
  91. r.mtx.RLock()
  92. defer r.mtx.RUnlock()
  93. ret := make([]MiddleGoods, 0)
  94. for _, v := range r.data {
  95. if v.AREAUSERID == userId {
  96. ret = append(ret, v)
  97. }
  98. }
  99. return ret, nil
  100. }
  101. // 获取套保商品
  102. func GetMiddleGoods(middlGoodsId uint32) (MiddleGoods, error) {
  103. if v, err := vGoodMgr.get(middlGoodsId); err != nil {
  104. vGoodMgr.load()
  105. } else {
  106. return v, nil
  107. }
  108. return vGoodMgr.get(middlGoodsId)
  109. }
  110. // 获取指定用户套保商品
  111. func GetMiddleGoodsByUserID(userId uint32) ([]MiddleGoods, error) {
  112. if vGoodMgr.isNeedLoad() {
  113. vGoodMgr.load()
  114. }
  115. return vGoodMgr.getByUserID(userId)
  116. }
  117. // 从数据库中获取套保商品
  118. func GetMiddleGoodsFromDB(userId uint32) ([]MiddleGoods, error) {
  119. vGoodMgr.load()
  120. return vGoodMgr.getByUserID(userId)
  121. }