middlegoods.go 3.3 KB

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