cabinet_time.go 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package service
  2. import (
  3. "dy-admin/internal/pcmserver/bus/model"
  4. "dy-admin/internal/pcmserver/bus/model/request"
  5. "dy-admin/internal/pcmserver/common"
  6. "dy-admin/internal/pcmserver/global"
  7. "dy-admin/internal/pcmserver/pkg/code"
  8. "dy-admin/internal/pcmserver/pkg/crontab"
  9. "dy-admin/internal/pcmserver/utils"
  10. "dy-admin/pkg/rescode"
  11. "fmt"
  12. "sort"
  13. "strconv"
  14. "strings"
  15. )
  16. type CabinetTimeService struct {
  17. }
  18. func (s *CabinetTimeService) initCabinetTimeCronTab() {
  19. var list []model.CabinetTime
  20. err := global.DB.Order("id asc").Find(&list).Error
  21. if err != nil {
  22. panic(err)
  23. }
  24. for _, ct := range list {
  25. err = setCabinetTimeCronTab(ct)
  26. if err != nil {
  27. panic(err)
  28. }
  29. }
  30. }
  31. func (s *CabinetTimeService) CreateCabinetTime(ct model.CabinetTime) (err error) {
  32. actTime, err := utils.ParseTime(ct.ActTimeStr)
  33. if err != nil {
  34. return err
  35. }
  36. ct.ActTime = actTime
  37. repeatSlice := strings.Split(ct.Repeat, ",")
  38. for _, weekStr := range repeatSlice {
  39. week, err := strconv.Atoi(weekStr)
  40. if err != nil {
  41. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrCabinetTimeInvalidCode])
  42. }
  43. if week < 0 || week > 6 {
  44. return rescode.RegisterErrorWithCause(nil, code.ErrCodeMap[code.ErrCabinetTimeInvalidCode])
  45. }
  46. }
  47. tx := global.DB.Begin()
  48. defer func() {
  49. if err != nil {
  50. tx.Rollback()
  51. } else {
  52. tx.Commit()
  53. }
  54. }()
  55. err = tx.Create(&ct).Error
  56. if err != nil {
  57. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  58. }
  59. // 启用定时任务
  60. err = setCabinetTimeCronTab(ct)
  61. if err != nil {
  62. return err
  63. }
  64. return
  65. }
  66. func (s *CabinetTimeService) DeleteCabinetTime(id int) (err error) {
  67. err = global.DB.Delete(&model.CabinetTime{Model: common.Model{ID: id}}).Error
  68. if err != nil {
  69. return
  70. }
  71. // 删除定时任务
  72. err = crontab.GetCron("cabinet_time").RemoveJob(strconv.Itoa(id))
  73. if err != nil {
  74. return
  75. }
  76. return
  77. }
  78. func (s *CabinetTimeService) ChangeUseStatus(id int, status string) (err error) {
  79. var cabinetTime model.CabinetTime
  80. err = global.DB.Where("id = ?", id).First(&cabinetTime).Error
  81. if err != nil {
  82. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  83. }
  84. tx := global.DB.Begin()
  85. defer func() {
  86. if err != nil {
  87. tx.Rollback()
  88. } else {
  89. tx.Commit()
  90. }
  91. }()
  92. err = tx.Where("id = ?", id).Updates(&model.CabinetTime{UseRule: status}).Error
  93. if err != nil {
  94. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  95. }
  96. if status == "启用" && cabinetTime.UseRule == "禁用" {
  97. // 开启定时器
  98. cabinetTime.UseRule = "启用"
  99. err = setCabinetTimeCronTab(cabinetTime)
  100. if err != nil {
  101. return
  102. }
  103. }
  104. if status == "禁用" && cabinetTime.UseRule == "启用" {
  105. err = crontab.GetCron("cabinet_time").RemoveJob(strconv.Itoa(id))
  106. if err != nil {
  107. return
  108. }
  109. }
  110. return
  111. }
  112. func (s *CabinetTimeService) GetCabinetTimeList(info request.CabinetTimeSearch) (list []model.CabinetTime, total int64, err error) {
  113. limit := info.PageSize
  114. offset := info.PageSize * (info.Page - 1)
  115. db := global.DB.Model(&model.CabinetTime{})
  116. err = db.Count(&total).Error
  117. if err != nil {
  118. return
  119. }
  120. if err = db.Order("id asc").Limit(limit).Offset(offset).Where("cabinet_id = ?", info.CabinetID).Find(&list).Error; err != nil {
  121. return list, total, rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrDatabaseCode])
  122. }
  123. return
  124. }
  125. func setCabinetTimeCronTab(ct model.CabinetTime) (err error) {
  126. if ct.UseRule != "启用" {
  127. return nil
  128. }
  129. jobName := strconv.Itoa(ct.ID)
  130. job := &CabinetTimeCronJob{CabinetID: ct.CabinetID, Action: ct.Act}
  131. secondStr := strconv.Itoa(ct.ActTime.Second())
  132. minuteStr := strconv.Itoa(ct.ActTime.Minute())
  133. hourStr := strconv.Itoa(ct.ActTime.Hour())
  134. spec := fmt.Sprintf("%s %s %s %s %s %s", secondStr, minuteStr, hourStr, "*", "*", parseRepeat(ct.Repeat))
  135. err = crontab.GetCron("cabinet_time").AddJobWithParams(jobName, spec, job)
  136. if err != nil {
  137. return rescode.RegisterErrorWithCause(err, code.ErrCodeMap[code.ErrCabinetTimeCornTabCode])
  138. }
  139. return nil
  140. }
  141. type WeekDays []string
  142. func (w WeekDays) Len() int {
  143. return len(w)
  144. }
  145. func (w WeekDays) Swap(i, j int) {
  146. w[i], w[j] = w[j], w[i]
  147. }
  148. func (w WeekDays) Less(i, j int) bool {
  149. return w[i] < w[j]
  150. }
  151. func parseRepeat(repeat string) string {
  152. repeatSlice := strings.Split(repeat, ",")
  153. // 去重
  154. weekdays := removeRepeatByMap(repeatSlice)
  155. // 排序
  156. sort.Sort(weekdays)
  157. res := strings.Join(weekdays, ",")
  158. return res
  159. }
  160. // removeRepeatByMap 切片去重,使用字典方式
  161. func removeRepeatByMap(weekday []string) WeekDays {
  162. res := make([]string, 0)
  163. tmpMap := make(map[string]struct{})
  164. for _, wd := range weekday {
  165. if _, ok := tmpMap[wd]; !ok {
  166. tmpMap[wd] = struct{}{}
  167. res = append(res, wd)
  168. }
  169. }
  170. return res
  171. }