division.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/6/3 15:14
  4. * @Modify : 2021/6/3 15:14
  5. */
  6. package mtpcache
  7. import (
  8. "mtp2_if/db"
  9. "sync"
  10. "time"
  11. )
  12. var vDivisionMgr DivisionMgr
  13. // DivisionMgr 行政区域缓存
  14. type DivisionMgr struct {
  15. mtx sync.RWMutex
  16. data map[int64]Division
  17. last time.Time
  18. }
  19. // Division 行政区域表
  20. type Division struct {
  21. Autoid int64 `json:"autoid" xorm:"'AUTOID'" binding:"required"` // 自增ID
  22. Divisioncode string `json:"divisioncode" xorm:"'DIVISIONCODE'" binding:"required"` // 行政代码
  23. Shortcode string `json:"shortcode" xorm:"'SHORTCODE'"` // 地区简码
  24. Parentcode string `json:"parentcode" xorm:"'PARENTCODE'"` // 上级行政代码
  25. Divisionlevel string `json:"divisionlevel" xorm:"'DIVISIONLEVEL'"` // 行政级别
  26. Divisionname string `json:"divisionname" xorm:"'DIVISIONNAME'"` // 行政名称
  27. Pathname string `json:"pathname" xorm:"'PATHNAME'"` // 路径名称
  28. Separablename string `json:"separablename" xorm:"'SEPARABLENAME'"` // 可拆分的全称
  29. Postcode string `json:"postcode" xorm:"'POSTCODE'"` // 邮政编码
  30. Modifytime time.Time `json:"modifytime" xorm:"'MODIFYTIME'"` // 修改时间
  31. Modifierid int64 `json:"modifierid" xorm:"'MODIFIERID'"` // 修改人
  32. }
  33. // TableName is DIVISION
  34. func (Division) TableName() string {
  35. return "DIVISION"
  36. }
  37. func init() {
  38. go func() {
  39. time.Sleep(time.Second * 5)
  40. vDivisionMgr.load()
  41. }()
  42. }
  43. func (r *DivisionMgr) load() {
  44. now := time.Now()
  45. // 间隔3秒以上才重新加载
  46. if d := now.Sub(r.last); d.Seconds() < 3 {
  47. return
  48. }
  49. r.mtx.Lock()
  50. defer r.mtx.Unlock()
  51. engine := db.GetEngine()
  52. if engine == nil {
  53. return
  54. }
  55. divisions := make([]Division, 0)
  56. if err := engine.Find(&divisions); err == nil {
  57. r.data = map[int64]Division{}
  58. for i := range divisions {
  59. r.data[divisions[i].Autoid] = divisions[i]
  60. }
  61. }
  62. }
  63. // Name 获取行政区名称
  64. func (r *DivisionMgr) Name(Id int64) string {
  65. r.mtx.RLock()
  66. defer r.mtx.RUnlock()
  67. if d, ok := r.data[Id]; ok {
  68. return d.Divisionname
  69. }
  70. return ""
  71. }
  72. // 获取行政区名称
  73. func GetDivisionName(Id int32) string {
  74. if Id <= 0 {
  75. return ""
  76. }
  77. if strName := vDivisionMgr.Name(int64(Id)); strName != "" {
  78. return strName
  79. }
  80. vDivisionMgr.load()
  81. return vDivisionMgr.Name(int64(Id))
  82. }