weekdate.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /**
  2. * @Author: zou.yingbin
  3. * @Create : 2021/5/24 14:42
  4. * @Modify : 2021/5/24 14:42
  5. */
  6. package mtpcache
  7. import (
  8. "fmt"
  9. "mtp2_if/db"
  10. "sync"
  11. "time"
  12. )
  13. var vWeekMgr WeekDateMgr
  14. // WeekDate 周日期信息
  15. type WeekDate struct {
  16. CurDate string `json:"curdate" xorm:"'CurDate'"` // 当前日期(yyyymmdd)
  17. BeginDate string `json:"begindate" xorm:"'BeginDate'"` // 周开始日期(yyyy-mm-dd)
  18. EndDate string `json:"enddate" xorm:"'EndDate'"` // 周结束日期(yyyy-mm-dd)
  19. Week int32 `json:"week" xorm:"'Week'"` // 第几周
  20. WeekIW string `json:"weekiw" xorm:"'WeekIW'"` // 周日期iw(yyyyiw)
  21. }
  22. // WeekDateMgr 周日期缓存
  23. type WeekDateMgr struct {
  24. mtx sync.RWMutex
  25. data map[string]WeekDate
  26. }
  27. func init() {
  28. go func() {
  29. time.Sleep(time.Second)
  30. vWeekMgr.load("")
  31. }()
  32. }
  33. func (r *WeekDateMgr) load(curDate string) {
  34. var sqlId string
  35. if len(curDate) > 0 {
  36. // 查指定日期信息
  37. sqlId = "select" +
  38. " '%v' curdate," +
  39. " to_char(trunc(to_date('%v', 'yyyymmdd'), 'IW'), 'yyyy-mm-dd') begindate," +
  40. " to_char(trunc(to_date('%v', 'yyyymmdd'), 'IW') + 6, 'yyyy-mm-dd') enddate," +
  41. " to_char(to_date('%v', 'yyyymmdd'), 'yyyyiw') weekiw," +
  42. " to_char(to_date('%v', 'yyyymmdd'), 'iw') week" +
  43. " from dual t"
  44. sqlId = fmt.Sprintf(sqlId, curDate, curDate, curDate, curDate, curDate)
  45. } else {
  46. // 查当前日期信息
  47. sqlId = "select" +
  48. " to_char(sysdate, 'yyyymmdd') curdate," +
  49. " to_char(trunc(to_date(to_char(sysdate, 'yyyymmdd'), 'yyyymmdd'), 'IW'), 'yyyy-mm-dd') begindate," +
  50. " to_char(trunc(to_date(to_char(sysdate, 'yyyymmdd'), 'yyyymmdd'), 'IW') + 6, 'yyyy-mm-dd') enddate," +
  51. " to_char(sysdate, 'yyyyiw') weekiw," +
  52. " to_char(sysdate, 'iw') week" +
  53. " from dual t"
  54. }
  55. r.mtx.Lock()
  56. defer r.mtx.Unlock()
  57. sData := []WeekDate{}
  58. if err := db.GetEngine().SQL(sqlId).Find(&sData); err == nil {
  59. if r.data == nil {
  60. r.data = map[string]WeekDate{}
  61. }
  62. for i := range sData {
  63. r.data[sData[i].CurDate] = sData[i]
  64. }
  65. }
  66. }
  67. // WeekIW 获取yyyyiw
  68. func (r *WeekDateMgr) WeekIW(curDate string) string {
  69. r.mtx.RLock()
  70. defer r.mtx.RUnlock()
  71. if d, ok := r.data[curDate]; ok {
  72. return d.WeekIW
  73. }
  74. return ""
  75. }
  76. // Get 获取周信息
  77. func (r *WeekDateMgr) Get(curDate string) (WeekDate, bool) {
  78. r.mtx.RLock()
  79. defer r.mtx.RUnlock()
  80. if d, ok := r.data[curDate]; ok {
  81. return d, true
  82. }
  83. return WeekDate{}, false
  84. }
  85. // GetWeekInfo 获取周信息
  86. func GetWeekInfo(curDate string) (WeekDate, bool) {
  87. if d, ok := vWeekMgr.Get(curDate); ok {
  88. return d, ok
  89. } else {
  90. vWeekMgr.load(curDate)
  91. }
  92. return vWeekMgr.Get(curDate)
  93. }
  94. // GetWeekIW 获取yyyyiw
  95. func GetWeekIW(curDate string) string {
  96. if d := vWeekMgr.WeekIW(curDate); d != "" {
  97. return d
  98. } else {
  99. vWeekMgr.load(curDate)
  100. }
  101. return vWeekMgr.WeekIW(curDate)
  102. }