package controllers import ( "car-service/extend/code" "car-service/models" "car-service/service" "fmt" "github.com/astaxie/beego" "github.com/satori/go.uuid" "net/http" "sort" "strings" "sync" "time" ) type CarController struct { beego.Controller } //实时计算剩余车位数量,达到条件就推送 //要求: //1.停车数量小于等于5个推送,5个以下的数量变化都推送,推送给已注册手机号的用户,未注册的不推 //2.满足上一条,如果此车辆已经进入学校停车场了,就不再给这个车牌对应的手机号推送空余车位消息 //3.晚上10点到10点半,每间隔10分钟,给停车场内的车辆推送消息:请尽快驶出停车场 func ComputeSpaceLeftRealTime() { ticker := time.NewTicker(3 * time.Second) prePushLeft, _ := beego.AppConfig.Int("initPushLeft") //初始剩余数量,上线后不能每次启动都推送消息 sv := service.NewCarService() initCacheM := false lowerLimit,_ := beego.AppConfig.Int("pushLowerLimit") //[0,5] nightPushTimes := 0 for { select { case <-ticker.C: 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) }() } 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 var cLock sync.RWMutex func updateSpaceLeft(num int) { cLock.Lock() defer cLock.Unlock() cacheSpaceLeft = num } func getSpaceLeft() int { cLock.Lock() defer cLock.Unlock() return cacheSpaceLeft } // @Title 统计剩余车位 // @Description 统计剩余车位 // @Success 200 {object} models.CarStatistic // @Failure 403 {string} json "" // @router /statistic [get] func (c *CarController) Statistic() { left := getSpaceLeft() sta := models.CarStatistic{ Left: left, } resp := code.Code{ Success: true, Status: http.StatusOK, Data: sta, } c.Data["json"] = resp c.ServeJSON() } // @Title 根据车牌号查找车位信息 // @Description 根据车牌号查找车位信息 // @Success 200 {object} models.CarPos // @Failure 403 {string} json "" // @router /carPos [get] func (c *CarController) findCar() { } // @Title 车位占用情况 // @Description 车位占用情况 // @Success 200 {object} models.PosResult // @Failure 403 {string} json "" // @router /spaceNo [get] func (c *CarController) SpaceNo() { userId := c.GetString("userId") sv := service.NewCarService() spaceNos := sv.FindSpaceNo(userId) sort.Sort(spaceNos) resp := code.Code{ Success: true, Status: http.StatusOK, Data: spaceNos, } c.Data["json"] = resp c.ServeJSON() } func (c *CarController) 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() { sv := service.NewCarService() spaceInfo := sv.FindHikSpaceInfo() c.Data["json"] = code.Code{ Success: true, Status: http.StatusOK, Data: spaceInfo, } c.ServeJSON() } // @router /spaceUser [get] func (c *CarController) SpaceUser() { sv := service.NewCarService() spaceUser := sv.FindHikSpaceUser() 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() }