weekdate.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 * 5)
  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'), 'yyyymmdd') begindate," +
  40. " to_char(trunc(to_date('%v', 'yyyymmdd'), 'IW') + 6, 'yyyymmdd') 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'), 'yyyymmdd') begindate," +
  50. " to_char(trunc(to_date(to_char(sysdate, 'yyyymmdd'), 'yyyymmdd'), 'IW') + 6, 'yyyymmdd') 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 := make([]WeekDate, 0)
  58. e := db.GetEngine()
  59. if e == nil {
  60. return
  61. }
  62. if err := e.SQL(sqlId).Find(&sData); err == nil {
  63. if r.data == nil {
  64. r.data = map[string]WeekDate{}
  65. }
  66. for i := range sData {
  67. r.data[sData[i].CurDate] = sData[i]
  68. }
  69. }
  70. }
  71. // WeekIW 获取yyyyiw
  72. func (r *WeekDateMgr) WeekIW(curDate string) string {
  73. r.mtx.RLock()
  74. defer r.mtx.RUnlock()
  75. if d, ok := r.data[curDate]; ok {
  76. return d.WeekIW
  77. }
  78. return ""
  79. }
  80. // Get 获取周信息
  81. func (r *WeekDateMgr) Get(curDate string) (WeekDate, bool) {
  82. r.mtx.RLock()
  83. defer r.mtx.RUnlock()
  84. if d, ok := r.data[curDate]; ok {
  85. return d, true
  86. }
  87. return WeekDate{}, false
  88. }
  89. // GetWeekInfo 获取周信息 curData(yyyymmdd)
  90. func GetWeekInfo(curDate string) (WeekDate, bool) {
  91. if d, ok := vWeekMgr.Get(curDate); ok {
  92. return d, ok
  93. } else {
  94. vWeekMgr.load(curDate)
  95. }
  96. return vWeekMgr.Get(curDate)
  97. }
  98. // GetWeekIW 获取yyyyiw
  99. func GetWeekIW(curDate string) string {
  100. if d := vWeekMgr.WeekIW(curDate); d != "" {
  101. return d
  102. } else {
  103. vWeekMgr.load(curDate)
  104. }
  105. return vWeekMgr.WeekIW(curDate)
  106. }