consume.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package controllers
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. "goiot-cronapi/common"
  6. "goiot-cronapi/global/orm"
  7. "goiot-cronapi/pkg/logger"
  8. "goiot-cronapi/services"
  9. "math"
  10. )
  11. // MaxCountOnce 定义每次计算多少条数据
  12. const MaxCountOnce = 100
  13. // Consume 每天23:00计算一次所有耗材的消耗率
  14. func Consume(c *gin.Context) {
  15. // 先查询出总共有多少条记录
  16. var totalCount int64
  17. sql := `SELECT COUNT(id) FROM btk_consumables_management WHERE LENGTH(box_id) > 0 AND utilization_rate > 0 AND consumption_cycle > 0 AND is_delete = 0`
  18. orm.Eloquent.Raw(sql).Count(&totalCount)
  19. pageCount := int(math.Ceil(float64(totalCount) / float64(MaxCountOnce)))
  20. logger.Info(fmt.Sprintf("查询到有%d条记录, 每页处理%d条, 共需处理%d次", totalCount, MaxCountOnce, pageCount))
  21. // 获取每个盒子对应的运行总时长
  22. timeMap := services.GetBoxRunTime(orm.Eloquent)
  23. // 开始同步消耗率
  24. for page := 0; page < pageCount; page++ {
  25. datas := services.GetConsumeDatas(orm.Eloquent, page, MaxCountOnce)
  26. if err := services.UpdateConsumeRate(orm.Eloquent, datas, timeMap); err != nil {
  27. logger.Info(fmt.Sprintf("第%d页数据同步失败, 已回滚!!!", page+1))
  28. continue
  29. }
  30. if err := services.SaveMessage(orm.Eloquent, datas); err != nil {
  31. logger.Info(fmt.Sprintf("第%d页数据同步失败, 已回滚!!!", page+1))
  32. continue
  33. }
  34. logger.Info(fmt.Sprintf("第%d页数据同步成功", page+1))
  35. }
  36. logger.Info("同步完成...")
  37. common.ReturnSuccess(c, nil)
  38. }