package controllers import ( "car-service/extend/code" "car-service/models" "car-service/service" "fmt" "github.com/astaxie/beego" "net/http" "sort" "sync" "time" ) type CarController struct { beego.Controller } //实时计算剩余车位数量,达到条件就推送 //要求: //1.停车数量小于等于5个推送,5个以下的数量变化都推送,推送给已注册手机号的用户,未注册的不推 //2.满足上一条,如果此车辆已经进入学校停车场了,就不再给这个车牌对应的手机号推送空余车位消息 //3.晚上10点到10点半,每间隔10分钟,给停车场内的车辆推送消息:请尽快驶出停车场 func ComputeSpaceLeftRealTime() { ticker := time.NewTicker(3 * time.Second) prePushLeft := 0 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() { message := fmt.Sprintf("%s 剩余车位:%d个", time.Now().Format("2006-01-02 15:04:05"), left) b, e := service.PushByAlias("育英中学停车", message) 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++ } } else if now.Minute() == 10 { if nightPushTimes == 1 { go nightPush() nightPushTimes++ } } else if now.Minute() == 20 { if nightPushTimes == 2{ go nightPush() nightPushTimes++ } } else if now.Minute() == 30 { if nightPushTimes == 3{ go nightPush() nightPushTimes++ } } } else { nightPushTimes = 0 } default: time.Sleep(500 * time.Millisecond) } } } func nightPush(){ message := fmt.Sprintf("%s 请尽快驶出停车场", time.Now().Format("2006-01-02 15:04:05")) b, e := service.NightPush("育英中学停车", message) fmt.Println("b:", b,"e:",e, "message:", message) } 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 := service.PushByAlias("育英中学停车", message) 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 /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() }