liuxiaolong
2020-10-10 bf4ca3fdb8c0f0c1f99a4a871ad39436cefc6ab6
controllers/car.go
@@ -6,8 +6,10 @@
   "car-service/service"
   "fmt"
   "github.com/astaxie/beego"
   "github.com/satori/go.uuid"
   "net/http"
   "sort"
   "strings"
   "sync"
   "time"
)
@@ -17,33 +19,128 @@
}
//实时计算剩余车位数量,达到条件就推送
//要求:
//1.停车数量小于等于5个推送,5个以下的数量变化都推送,推送给已注册手机号的用户,未注册的不推
//2.满足上一条,如果此车辆已经进入学校停车场了,就不再给这个车牌对应的手机号推送空余车位消息
//3.晚上10点到10点半,每间隔10分钟,给停车场内的车辆推送消息:请尽快驶出停车场
func ComputeSpaceLeftRealTime() {
   ticker := time.NewTicker(3 * time.Second)
   prePushLeft := 0
   prePushLeft, _ := beego.AppConfig.Int("initPushLeft") //初始剩余数量,上线后不能每次启动都推送消息
   sv := service.NewCarService()
   initCacheM := false
   lowerLimit,_ := beego.AppConfig.Int("pushLowerLimit") //[0,5]
   nightPushTimes := 0
   for {
      select {
         case <-ticker.C:
            m := time.Now().Minute()
            i := m % 10
            left := 80
            if i == 0 { //整数分钟
               left = m / 10
            }
            if left <=10 && left != prePushLeft {
               go func() {
                  message := fmt.Sprintf("当前剩余车位:%d个", left)
                  b, e := service.Push("育英智慧停车", message)
                  if b {
            hikSta, flag := sv.Statistic()
            if flag {
               left := hikSta.Left
               if !initCacheM {
                  models.SetSpaceNo(hikSta.TotalPlace)
                  initCacheM = true
               }
               if left <=lowerLimit && left != prePushLeft {
                  go func() {
                     t := time.Now().Format("2006-01-02 15:04:05")
                     message := fmt.Sprintf("%s 剩余车位:%d个", t, left)
                     b, e, aliasArr := service.PushByAlias("剩余车位提醒", message, false)
                     //记录推送日志
                     logE := models.Log{
                        Id: uuid.NewV4().String(),
                        CreateTime: t,
                        Result: b,
                        Phones: strings.Join(aliasArr, ","),
                     }
                     if e != nil {
                        logE.Content = e.Error()
                     } else {
                        logE.Content = message
                     }
                     logE.Insert()
                     prePushLeft = left
                  }
                  fmt.Println("b:", b,"e:",e, "message:", message)
               }()
                     fmt.Println("b:", b,"e:",e, "message:", message)
                  }()
               }
               updateSpaceLeft(left)
            }
            updateSpaceLeft(left)
            //判断当前是否在22:00-22:30之间
            now := time.Now()
            if now.Hour() == 22 && now.Minute()>=0 && now.Minute() <=30{
               if now.Minute() == 0 {
                  if nightPushTimes ==0 {
                     go nightPush(nightPushTimes)
                     nightPushTimes++
                  }
               } else if now.Minute() == 10 {
                  if nightPushTimes == 1 {
                     go nightPush(nightPushTimes)
                     nightPushTimes++
                  }
               } else if now.Minute() == 20 {
                  if nightPushTimes == 2{
                     go nightPush(nightPushTimes)
                     nightPushTimes++
                  }
               } else if now.Minute() == 30 {
                  if nightPushTimes == 3{
                     go nightPush(nightPushTimes)
                     nightPushTimes++
                  }
               }
            } else {
               nightPushTimes = 0
            }
      default:
         time.Sleep(500 * time.Millisecond)
      }
   }
}
func nightPush(curTimes int){
   message := fmt.Sprintf("%s 请尽快驶出停车场", time.Now().Format("2006-01-02 15:04:05"))
   b, e, aliasArr,carOwnNames := service.NightPush("温馨提示", message)
   //记录推送日志
   logE := models.Log{
      Id: uuid.NewV4().String(),
      CreateTime: time.Now().Format("2006-01-02 15:04:05"),
      Result: b,
      Phones: strings.Join(aliasArr, ","),
   }
   if e != nil {
      logE.Content = e.Error()
   } else {
      logE.Content = message
   }
   logE.Insert()
   fmt.Println("b:", b,"e:",e, "message:", message)
   if curTimes == 3 { //只给管理员推送一次这个消息
      //将具体的车主信息推送给管理员
      if carOwnNames != nil && len(carOwnNames) >0 {
         //获取车主姓名
         managerMsg := strings.Join(carOwnNames, ",")
         mb,me, managerArr := service.Push2Manager(fmt.Sprintf("%s 未驶离车辆", time.Now().Format("2006-01-02 15:04:05")), managerMsg, false)
         mLogE := models.Log{
            Id: uuid.NewV4().String(),
            CreateTime: time.Now().Format("2006-01-02 15:04:05"),
            Result: mb,
            Phones: strings.Join(managerArr, ","),
         }
         if me != nil {
            mLogE.Content = me.Error()
         } else {
            mLogE.Content = managerMsg
         }
         mLogE.Insert()
         fmt.Println("mb:", mb, "me:", me, "message:", managerMsg)
      }
   }
}
var cacheSpaceLeft int
@@ -65,8 +162,6 @@
// @Failure 403 {string} json ""
// @router /statistic [get]
func (c *CarController) Statistic() {
   //sv := service.NewCarService()
   //sta := sv.Statistic()
   left := getSpaceLeft()
   sta := models.CarStatistic{
      Left: left,
@@ -95,8 +190,9 @@
// @Failure 403 {string} json ""
// @router /spaceNo [get]
func (c *CarController) SpaceNo() {
   userId := c.GetString("userId")
   sv := service.NewCarService()
   spaceNos := sv.FindSpaceNo()
   spaceNos := sv.FindSpaceNo(userId)
   sort.Sort(spaceNos)
   resp := code.Code{
      Success: true,
@@ -107,11 +203,156 @@
   c.ServeJSON()
}
func (c *CarController) BindCarSpace() {
   sv := service.NewCarService()
   if sv.BindCarSpace() {
   c.ServeJSON()
}
// @router /testPush [get]
func (c *CarController) TestPush() {
   left := getSpaceLeft()
   message := fmt.Sprintf("%s 剩余车位:%d个", time.Now().Format("2006-01-02 15:04:05"), left)
   b, e, aliasArr := service.PushByAlias("剩余车位提醒", message, true)
   //记录推送日志
   logE := models.Log{
      Id: uuid.NewV4().String(),
      CreateTime: time.Now().Format("2006-01-02 15:04:05"),
      Result: b,
      Phones: strings.Join(aliasArr, ","),
   }
   if e != nil {
      logE.Content = e.Error()
   } else {
      logE.Content = message
   }
   logE.Insert()
   fmt.Println("b:", b,"e:",e, "message:", message)
   resp := code.Code{}
   if b {
      resp.Success = true
      resp.Status = http.StatusOK
      resp.Data = "推送成功"
   } else {
      resp.Success = false
      resp.Status = http.StatusInternalServerError
      resp.Data = e.Error()
   }
   c.Data["json"] = resp
   c.ServeJSON()
}
// @router /testNightPush [get]
func (c *CarController) TestNightPush() {
   carOwnNames := service.GetLeftCarOwners()
   //将具体的车主信息推送给管理员
   if carOwnNames != nil && len(carOwnNames) >0 {
      //获取车主姓名
      managerMsg := strings.Join(carOwnNames, ",")
      mb,me, managerArr := service.Push2Manager(fmt.Sprintf("%s 未驶离车辆", time.Now().Format("2006-01-02 15:04:05")), managerMsg, true)
      mLogE := models.Log{
         Id: uuid.NewV4().String(),
         CreateTime: time.Now().Format("2006-01-02 15:04:05"),
         Result: mb,
         Phones: strings.Join(managerArr, ","),
      }
      if me != nil {
         mLogE.Content = me.Error()
      } else {
         mLogE.Content = managerMsg
      }
      mLogE.Insert()
      fmt.Println("mb:", mb, "me:", me, "message:", managerMsg)
      c.Data["json"] = code.Code{
         Success: true,
         Status: http.StatusOK,
         Message: "推送完成",
         Data: managerMsg,
      }
   } else {
      c.Data["json"] = code.Code{
         Success: true,
         Status: http.StatusOK,
         Message: "无需推送,当前停留车辆信息为空",
      }
   }
   c.ServeJSON()
}
// @router /spaceInfo [get]
func (c *CarController) SpaceInfo() {
   userId := c.GetString("userId")
   sv := service.NewCarService()
   spaceInfo := sv.FindHikSpaceInfo(userId)
   c.Data["json"] = code.Code{
      Success: true,
      Status: http.StatusOK,
      Data: spaceInfo,
   }
   c.ServeJSON()
}
// @router /spaceUser [get]
func (c *CarController) SpaceUser() {
   userId := c.GetString("userId")
   sv := service.NewCarService()
   spaceUser := sv.FindHikSpaceUser(userId)
   c.Data["json"] = code.Code{
      Success: true,
      Status: http.StatusOK,
      Data: spaceUser,
   }
   c.ServeJSON()
}
// @router /pushLog [get]
func (c *CarController) PushLog() {
   st := c.GetString("startTime")
   et := c.GetString("endTime")
   if st == "" {
      st = time.Now().Format("2006-01-02")
   }
   if et == "" {
      et = time.Now().AddDate(0,0,1).Format("2006-01-02")
   }
   curPage, err := c.GetInt("curPage")
   if err != nil {
      curPage = 1
   }
   pageSize, err := c.GetInt("pageSize")
   if err != nil {
      pageSize = 20
   }
   var l models.Log
   total, logs := l.Find(curPage, pageSize, st, et)
   var rl []models.Log
   for _,le := range logs {
      rl = append(rl, *le)
   }
   resp := code.Code{
      Success: true,
      Status:  http.StatusOK,
      Data:    map[string]interface{}{
         "total": total,
         "list": rl,
      },
   }
   c.Data["json"] = resp
   c.ServeJSON()
}
// @router /crossRecord [get]
func (c *CarController) CrossRecord() {
   sv := service.NewCarService()
   records := sv.CrossRecords()
   resp := code.Code{
      Success: true,
      Status:  http.StatusOK,
      Data:    records,
   }
   c.Data["json"] = resp
   c.ServeJSON()
}