middlegoods.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. }
  36. func (r *middleGoodsMgr) isNeedLoad() bool {
  37. now := time.Now()
  38. // 间隔3秒以上重新加载
  39. if d := now.Sub(r.last); d.Seconds() >= 3 {
  40. return true
  41. }
  42. return false
  43. }
  44. // 加载数据
  45. func (r *middleGoodsMgr) load() {
  46. r.mtx.Lock()
  47. defer r.mtx.Unlock()
  48. e := db.GetEngine()
  49. if e == nil {
  50. return
  51. }
  52. sqlId := "select MIDDLEGOODSID," +
  53. " MIDDLEGOODSNAME," +
  54. " MIDDLEGOODSCODE," +
  55. " GOODSUNITID," +
  56. " RELATEDGOODSID," +
  57. " EVALUATERATIO," +
  58. " QTYDECIMALPLACE," +
  59. " RELATEDGOODSTYPE," +
  60. " NEEDHEDGERATIO," +
  61. " AREAUSERID," +
  62. " GOODSGROUPID" +
  63. " ISVALID" +
  64. " from erms_middlegoods t"
  65. sData := make([]MiddleGoods, 0)
  66. s := e.SQL(sqlId)
  67. if err := s.Find(&sData); err == nil {
  68. r.data = make(map[uint32]MiddleGoods)
  69. for i := range sData {
  70. r.data[sData[i].MIDDLEGOODSID] = sData[i]
  71. }
  72. r.last = time.Now()
  73. } else {
  74. logger.GetLogger().Errorf("load middlegoods fail, %v", err)
  75. }
  76. }
  77. func (r *middleGoodsMgr) get(middleGoodsId uint32) (MiddleGoods, error) {
  78. r.mtx.RLock()
  79. defer r.mtx.RUnlock()
  80. if r.data == nil {
  81. return MiddleGoods{}, fmt.Errorf("not found")
  82. }
  83. if v, ok := r.data[middleGoodsId]; ok {
  84. return v, nil
  85. }
  86. return MiddleGoods{}, fmt.Errorf("not found")
  87. }
  88. func (r *middleGoodsMgr) getByUserID(userId uint32) ([]MiddleGoods, error) {
  89. r.mtx.RLock()
  90. defer r.mtx.RUnlock()
  91. ret := make([]MiddleGoods, 0)
  92. for _, v := range r.data {
  93. if v.AREAUSERID == userId{
  94. ret = append(ret, v)
  95. }
  96. }
  97. return ret, nil
  98. }
  99. // 获取套保商品
  100. func GetMiddleGoods(middlGoodsId uint32) (MiddleGoods, error) {
  101. if v, err := vGoodMgr.get(middlGoodsId); err != nil {
  102. vGoodMgr.load()
  103. } else {
  104. return v, nil
  105. }
  106. return vGoodMgr.get(middlGoodsId)
  107. }
  108. // 获取指定用户套保商品
  109. func GetMiddleGoodsByUserID(userId uint32) ([]MiddleGoods, error) {
  110. if vGoodMgr.isNeedLoad(){
  111. vGoodMgr.load()
  112. }
  113. return vGoodMgr.getByUserID(userId)
  114. }
  115. // 从数据库中获取套保商品
  116. func GetMiddleGoodsFromDB(userId uint32)([]MiddleGoods, error) {
  117. vGoodMgr.load()
  118. return vGoodMgr.getByUserID(userId)
  119. }