jobs.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package jobs
  2. import (
  3. sysModel "cold-delivery/app/admin/model"
  4. "cold-delivery/common/global"
  5. "cold-delivery/common/nats/nats_server"
  6. "cold-delivery/db"
  7. "errors"
  8. "fmt"
  9. "github.com/gin-gonic/gin"
  10. log "gogs.baozhida.cn/zoie/OAuth-core/logger"
  11. "sort"
  12. "time"
  13. )
  14. // 需要将定义的struct 添加到字典中;
  15. // 字典 key 可以配置到 自动任务 调用目标 中;
  16. func InitJob() {
  17. jobList = map[string]JobsExec{
  18. //"ExamplesOne": ExamplesOne{},
  19. "CountIceRaftRecordFreezeDuration": CountIceRaftRecordFreezeDuration{},
  20. "UpdateCoolerBoxMonitorStatus": UpdateCoolerBoxMonitorStatus{},
  21. "CountIceRaftRecordForColdNow": CountIceRaftRecordForColdNow{},
  22. "CountCoolerBoxForColdNow": CountCoolerBoxForColdNow{},
  23. // ...
  24. }
  25. }
  26. // 新添加的job 必须按照以下格式定义,并实现Exec函数
  27. type ExamplesOne struct {
  28. }
  29. func (t ExamplesOne) Exec(arg interface{}) error {
  30. str := time.Now().Format(timeFormat) + " [INFO] JobCore ExamplesOne exec success"
  31. // TODO: 这里需要注意 Examples 传入参数是 string 所以 arg.(string);请根据对应的类型进行转化;
  32. switch arg.(type) {
  33. case string:
  34. if arg.(string) != "" {
  35. fmt.Println("string", arg.(string))
  36. fmt.Println(str, arg.(string))
  37. } else {
  38. fmt.Println("arg is nil")
  39. fmt.Println(str, "arg is nil")
  40. }
  41. break
  42. }
  43. return nil
  44. }
  45. // CountIceRaftRecordFreezeDuration 统计冰排冷冻时长
  46. type CountIceRaftRecordFreezeDuration struct {
  47. }
  48. // UpdateCoolerBoxMonitorStatus 更新保温箱监控状态
  49. type UpdateCoolerBoxMonitorStatus struct {
  50. }
  51. // CountIceRaftRecordForColdNow 统计冰排释冷时长
  52. type CountIceRaftRecordForColdNow struct {
  53. }
  54. // CountCoolerBoxForColdNow 统计保温箱遇冷时长
  55. type CountCoolerBoxForColdNow struct {
  56. }
  57. // Exec 统计冰排冷冻时长
  58. func (t CountIceRaftRecordFreezeDuration) Exec(arg interface{}) error {
  59. iceRaftRecordList := make([]sysModel.IceRaftRecord, 0)
  60. // GetOrm 获取orm连接
  61. orm, _ := db.GetOrm(&gin.Context{})
  62. err := orm.Where("status = ? or status = ? ", sysModel.IceRaftRecordStatusFreezing, sysModel.IceRaftRecordStatusWaitUse).
  63. Find(&iceRaftRecordList).Error
  64. if err != nil {
  65. log.Errorf("db error: %s", err)
  66. return global.GetFailedErr
  67. }
  68. //冰排统计时长
  69. for _, record := range iceRaftRecordList {
  70. sort.Slice(record.FreezeClaim, func(i, j int) bool {
  71. return record.FreezeClaim[i] < record.FreezeClaim[j]
  72. })
  73. inTime := record.InStorageTime.Local()
  74. //if inTime.Add(time.Hour * time.Duration(record.FreezeClaim)).After(time.Now()) {
  75. if inTime.Add(time.Duration(record.FreezeClaim[0] * float64(time.Hour))).After(time.Now()) {
  76. // 未达到冷冻时长 不修改状态 只修改时间
  77. record.FreezeDuration = float64(int(time.Now().Sub(inTime).Minutes()))
  78. } else {
  79. record.FreezeDuration = float64(int(time.Now().Sub(inTime).Minutes()))
  80. record.Status = sysModel.IceRaftRecordStatusWaitUse
  81. }
  82. if err := orm.Save(&record).Error; err != nil {
  83. log.Errorf("db error: %s", err)
  84. return global.UpdateFailedErr
  85. }
  86. }
  87. return nil
  88. }
  89. // Exec 更新保温箱监控状态
  90. func (t UpdateCoolerBoxMonitorStatus) Exec(arg interface{}) error {
  91. // GetOrm 获取orm连接
  92. orm, _ := db.GetOrm(&gin.Context{})
  93. var coolerBox []sysModel.CoolerBox
  94. err := orm.Model(&sysModel.CoolerBox{}).Find(&coolerBox).Error
  95. if err != nil {
  96. log.Errorf("获取保温箱状态失败: %s", err)
  97. return global.GetFailedErr
  98. }
  99. for i, _ := range coolerBox {
  100. data, _ := nats_server.Read_Device_ByT_sn(coolerBox[i].Sn)
  101. if len(data.T_sn) != 0 {
  102. //只查询设备在线并且处于监控状态下的设备
  103. if data.T_monitor != coolerBox[i].MonitorStatus {
  104. err := orm.Model(&sysModel.CoolerBox{}).Where("id = ?", coolerBox[i].Id).Update("monitor_status", data.T_monitor).Error
  105. if err != nil {
  106. log.Errorf("更新保温箱监控状态失败: %s", err)
  107. return global.UpdateFailedErr
  108. }
  109. }
  110. } else {
  111. if coolerBox[i].MonitorStatus != 4 {
  112. err := orm.Model(&sysModel.CoolerBox{}).Where("id = ?", coolerBox[i].Id).Update("monitor_status", 4).Error
  113. if err != nil {
  114. log.Errorf("更新保温箱监控状态失败: %s", err)
  115. return global.UpdateFailedErr
  116. }
  117. }
  118. }
  119. }
  120. return nil
  121. }
  122. // Exec 统计冰排释冷时长
  123. func (t CountIceRaftRecordForColdNow) Exec(arg interface{}) error {
  124. // GetOrm 获取orm连接
  125. orm, _ := db.GetOrm(&gin.Context{})
  126. var iceRaftRecordList []sysModel.IceRaftRecord
  127. err := orm.Where("status = ?", sysModel.IceRaftRecordReleasedInTheCold).
  128. Or("status = ?", sysModel.IceRaftRecordReleasedInTheColdEnd).
  129. Find(&iceRaftRecordList).Error
  130. if err != nil {
  131. log.Errorf("db 查询冰排记录失败: %s", err)
  132. return errors.New("查询冰排记录失败")
  133. }
  134. //冰排释冷时长
  135. for _, record := range iceRaftRecordList {
  136. inTime := record.StartIceColdTime.Local()
  137. var iceRaft sysModel.IceRaft
  138. err = orm.Where("id = ?", record.IceRaftId).First(&iceRaft).Error
  139. if err != nil {
  140. log.Errorf("冰排不存在: %s", err)
  141. //return errors.New("查询冰排失败")
  142. }
  143. if inTime.Add(time.Duration(iceRaft.ForColdTime * float64(time.Hour))).After(time.Now()) {
  144. // 未达到冷冻时长 不修改状态 只修改时间
  145. record.ForColdTimeActual = time.Now().Sub(inTime).Minutes()
  146. } else {
  147. record.ForColdTimeActual = time.Now().Sub(inTime).Minutes()
  148. record.Status = sysModel.IceRaftRecordReleasedInTheColdEnd
  149. }
  150. if err = orm.Save(&record).Error; err != nil {
  151. log.Errorf("更新冰排释冷时间失败: %s", err)
  152. fmt.Println("===================================更新冰排释冷时间失败===================================", err)
  153. return global.UpdateFailedErr
  154. }
  155. }
  156. return nil
  157. }
  158. // Exec 统计保温箱遇冷时长
  159. func (t CountCoolerBoxForColdNow) Exec(arg interface{}) error {
  160. CoolerBoxListRecord := make([]sysModel.CoolerBoxRecord, 0)
  161. // GetOrm 获取orm连接
  162. orm, _ := db.GetOrm(&gin.Context{})
  163. err := orm.Where("status = ?", 1).
  164. Find(&CoolerBoxListRecord).Error
  165. if err != nil {
  166. log.Errorf("db error: %s", err)
  167. return global.GetFailedErr
  168. }
  169. //冰排释冷时长
  170. for _, record := range CoolerBoxListRecord {
  171. inTime := record.CoolerBoxStarTime.String()
  172. if len(inTime) != 0 {
  173. var coolerBox sysModel.CoolerBox
  174. var sprintf string
  175. err := orm.Where("id = ?", record.CoolerBoxId).First(&coolerBox).Error
  176. if err != nil {
  177. log.Errorf("db error: %s", err)
  178. return global.GetFailedErr
  179. }
  180. if (coolerBox.UseStatus == 1 || coolerBox.UseStatus == 3) && len(record.CoolerUserTime.String()) == 0 {
  181. sub := time.Now().Sub(record.CoolerBoxStarTime.Local())
  182. hours := int(sub.Hours())
  183. minutes := int(sub.Minutes()) % 60
  184. sprintf = fmt.Sprintf("%dh%dm\n", hours, minutes)
  185. if record.CoolerBoxStarTime.Local().Add(time.Duration(coolerBox.ForColdCoolerTime * float64(time.Hour))).After(time.Now()) {
  186. // 未达到冷冻时长 不修改状态 只修改时间
  187. record.ForColdDuration = sprintf
  188. } else {
  189. record.ForColdDuration = sprintf
  190. coolerBox.UseStatus = 3 //遇冷结束
  191. }
  192. err = orm.Save(&coolerBox).Error
  193. err = orm.Save(&record).Error
  194. if err := orm.Save(&record).Error; err != nil {
  195. log.Errorf("db error: %s", err)
  196. return global.UpdateFailedErr
  197. }
  198. }
  199. }
  200. }
  201. return nil
  202. }