liuxiaolong
2020-08-14 c2217c8ff10605844779ec8a8c0a91f608d26155
controllers/restriction.go
@@ -2,46 +2,17 @@
import (
   "car-service/extend/code"
   "car-service/extend/util"
   "car-service/models"
   "encoding/json"
   "fmt"
   "github.com/astaxie/beego"
   "net/http"
   "github.com/robfig/cron"
   "strconv"
   "strings"
   "time"
)
type RestrictionController struct {
   beego.Controller
}
func InitRestriction() {
   date := time.Now().Format("2006-01-02")
   var r models.Restriction
   err := r.SelectByDate(date)
   if err == nil {
      //今日已获取过限行信息
      todayRes = &RestrictionResult{
         Date: date,
         Week: r.Week,
         CityName: r.CityName,
         IsXianXing: r.IsXianXing,
      }
      arr := strings.Split(r.WeiHao, ",")
      if len(arr) >0 {
         for _,s := range arr {
            n, e := strconv.Atoi(s)
            if e ==nil {
               todayRes.XxWeiHao = append(todayRes.XxWeiHao,n)
            }
         }
      }
   } else {
      getRestrictionInfo()
   }
}
// @Title 查询限行尾号
@@ -51,10 +22,29 @@
// @router /restriction [get]
func (c *RestrictionController) Restriction() {
   resp := code.Code{}
   if todayRes !=nil {
   var restric models.Restriction
   err := restric.GetOne()
   if err == nil {
      resp.Success= true
      resp.Status= http.StatusOK
      resp.Data= *todayRes
      now := time.Now()
      nowDate := now.Format("2006-01-02")
      week := now.Weekday()
      result := RestrictionResult{}
      result.CityName = "北京"
      result.Date = nowDate
      result.Week = getWeek(week)
      //周六周日,以及法定节假日不限行
      if week == time.Sunday || week == time.Saturday || isHoliday(nowDate, restric.Holidays) {
         result.IsXianXing = 0
         result.XxWeiHao = []int{}
      } else {
         result.IsXianXing = 1
         //获取限行尾号
         result.XxWeiHao = getXianxingWeiHao(now, nowDate, restric.Setting)
      }
      resp.Data= result
   } else {
      resp.Success= false
      resp.Status= http.StatusBadRequest
@@ -64,16 +54,74 @@
   c.ServeJSON()
}
var todayRes *RestrictionResult
func getXianxingWeiHao(nowTime time.Time, nowDate string, setting string) []int {
   var set []models.SetWeiHao
   err := json.Unmarshal([]byte(setting), &set)
   if err != nil {
      fmt.Println("unmarshal xianxing set err:", err)
      return []int{}
   } else {
      list := make([]int, 0)
      for _,d := range set {
         if isBetween(d.StartTime, d.EndTime, nowDate, nowTime) {
            for _,xx := range d.XianXing {
               if xx.Day == int(nowTime.Weekday()) {
                  list = xx.WeiHao
                  break
               }
            }
            break
         }
      }
      return list
   }
}
func Schedule() {
   c := cron.New()
   //每天凌晨5点执行一次,获取当日数据
   c.AddFunc("0 0 1 * * ?", func() {
      todayRes = nil
      getRestrictionInfo()
   })
   c.Start()
func isBetween(st string, et string, nowDate string, nowTime time.Time) bool {
   if st == nowDate || et == nowDate {
      return true
   } else {
      st, e1 := time.Parse(st, "2006-01-02")
      et, e2 := time.Parse(et, "2006-01-02")
      if e1 == nil && e2 == nil && st.Before(nowTime) && et.After(nowTime) {
         return true
      }
      return false
   }
}
func getWeek(week time.Weekday) string {
   s := ""
   switch week {
   case time.Sunday:
      s = "星期日"
   case time.Monday:
      s = "星期一"
   case time.Tuesday:
      s = "星期二"
   case time.Wednesday:
      s = "星期三"
   case time.Thursday:
      s = "星期四"
   case time.Friday:
      s = "星期五"
   case time.Saturday:
      s = "星期六"
   default:
      s = ""
   }
   return  s
}
//判断是否是节假日
func isHoliday(nowDate string, holidays string) bool {
   arr := strings.Split(holidays, ",")
   for _,s := range arr {
      if s == nowDate {
         return true
      }
   }
   return false
}
type RestrictionResult struct {
@@ -84,59 +132,58 @@
   XxWeiHao    []int      `json:"xxWeiHao"`
}
type JuHeResult struct {
   Reason       string                `json:"reason"`
   Result       CityRestriction        `json:"result"`
   ErrorCode    int                `json:"error_code"`
}
//type JuHeResult struct {
//   Reason       string                `json:"reason"`
//   Result       CityRestriction        `json:"result"`
//   ErrorCode    int                `json:"error_code"`
//}
//
//type CityRestriction struct {
//   Date       string          `json:"date"`
//   Week       string          `json:"week"`
//   City       string          `json:"city"`
//   CityName    string          `json:"cityname"`
//   Des       []interface{}   `json:"des"`
//   Fine       string          `json:"fine"`
//   Remarks    string          `json:"remarks"`
//   IsXianXing    int          `json:"isxianxing"`
//   XXWeiHao    []int          `json:"xxweihao"`
//   Holiday    string          `json:"holiday"`
//}
type CityRestriction struct {
   Date       string          `json:"date"`
   Week       string          `json:"week"`
   City       string          `json:"city"`
   CityName    string          `json:"cityname"`
   Des       []interface{}   `json:"des"`
   Fine       string          `json:"fine"`
   Remarks    string          `json:"remarks"`
   IsXianXing    int          `json:"isxianxing"`
   XXWeiHao    []int          `json:"xxweihao"`
   Holiday    string          `json:"holiday"`
}
func getRestrictionInfo() {
   juHeAppKey := beego.AppConfig.String("juheweihaokey")
   url := "http://v.juhe.cn/xianxing/index?key="+ juHeAppKey +"&city=beijing&type=1"
   b, err := util.DoPostRequest(url, util.CONTENT_TYPE_JSON, nil, nil, nil)
   if err != nil {
      fmt.Println("err:", err)
      return
   }
   var result JuHeResult
   err = json.Unmarshal(b, &result)
   if err != nil {
      fmt.Println("unmarshal err:", err)
      return
   }
   if result.ErrorCode == 0 {
      todayRes = &RestrictionResult{
         Date: result.Result.Date,
         Week: result.Result.Week,
         CityName: result.Result.CityName,
         IsXianXing: result.Result.IsXianXing,
         XxWeiHao: result.Result.XXWeiHao,
      }
      rc := models.Restriction{
         Date: result.Result.Date,
         Week: result.Result.Week,
         CityName: result.Result.CityName,
         IsXianXing: result.Result.IsXianXing,
      }
      var arr []string
      for _,n := range result.Result.XXWeiHao {
         arr=append(arr, strconv.Itoa(n))
      }
      rc.WeiHao = strings.Join(arr, ",")
      rc.Insert()
   }
}
//func getRestrictionInfo() {
//   juHeAppKey := beego.AppConfig.String("juheweihaokey")
//   url := "http://v.juhe.cn/xianxing/index?key="+ juHeAppKey +"&city=beijing&type=1"
//   b, err := util.DoPostRequest(url, util.CONTENT_TYPE_JSON, nil, nil, nil)
//   if err != nil {
//      fmt.Println("err:", err)
//      return
//   }
//   var result JuHeResult
//   err = json.Unmarshal(b, &result)
//   if err != nil {
//      fmt.Println("unmarshal err:", err)
//      return
//   }
//   if result.ErrorCode == 0 {
//      todayRes = &RestrictionResult{
//         Date: result.Result.Date,
//         Week: result.Result.Week,
//         CityName: result.Result.CityName,
//         IsXianXing: result.Result.IsXianXing,
//         XxWeiHao: result.Result.XXWeiHao,
//      }
//      rc := models.Restriction{
//         Date: result.Result.Date,
//         Week: result.Result.Week,
//         CityName: result.Result.CityName,
//         IsXianXing: result.Result.IsXianXing,
//      }
//      var arr []string
//      for _,n := range result.Result.XXWeiHao {
//         arr=append(arr, strconv.Itoa(n))
//      }
//      rc.WeiHao = strings.Join(arr, ",")
//      rc.Insert()
//   }
//}