division.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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 * 2)
  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. divisions := make([]Division, 0)
  53. if err := engine.Find(&divisions); err == nil {
  54. r.data = map[int64]Division{}
  55. for i := range divisions {
  56. r.data[divisions[i].Autoid] = divisions[i]
  57. }
  58. }
  59. }
  60. // Name 获取行政区名称
  61. func (r *DivisionMgr) Name(Id int64) string {
  62. r.mtx.RLock()
  63. defer r.mtx.RUnlock()
  64. if d, ok := r.data[Id]; ok {
  65. return d.Divisionname
  66. }
  67. return ""
  68. }
  69. // 获取行政区名称
  70. func GetDivisionName(Id int32) string {
  71. if Id <= 0 {
  72. return ""
  73. }
  74. if strName := vDivisionMgr.Name(int64(Id)); strName != "" {
  75. return strName
  76. }
  77. vDivisionMgr.load()
  78. return vDivisionMgr.Name(int64(Id))
  79. }