From 9358e5ec2d2b65fec4ef9a1be7d1a1e1e2cf9d2d Mon Sep 17 00:00:00 2001
From: liuxiaolong <liuxiaolong@aiotlink.com>
Date: 星期一, 10 八月 2020 16:31:34 +0800
Subject: [PATCH] new push schedule
---
conf/app.conf | 3
service/msgPush.go | 358 +++++++++++++++++++++++++++++++++++++++
models/car.go | 4
controllers/user.go | 5
extend/util/httpUtil.go | 35 +++
service/carService.go | 20 +-
service/userService.go | 10 +
controllers/car.go | 52 +++++
8 files changed, 464 insertions(+), 23 deletions(-)
diff --git a/conf/app.conf b/conf/app.conf
index 8536dda..adad79f 100644
--- a/conf/app.conf
+++ b/conf/app.conf
@@ -7,8 +7,6 @@
sqlconn =
gendoc = true
downdoc = true
-latestVersion = 1.0.1
-latestUrl = http://www.baidu.com
juheweihaokey = 8c0efc4439080ef6c6aa2c29688c9550
pushAppId = WfOtCAmf0w6jS3B59V0mb5
pushAppKey = hVBAHDe85F9ZviAUYknxb4
@@ -20,3 +18,4 @@
hikUrl = https://172.16.35.49:443
hikAppKey = 26577698
hikAppSecret = ZHhxujl06e0e5jsJLaiB
+pushLowerLimit = 5
diff --git a/controllers/car.go b/controllers/car.go
index 2329ce3..4d4141b 100644
--- a/controllers/car.go
+++ b/controllers/car.go
@@ -17,11 +17,17 @@
}
//瀹炴椂璁$畻鍓╀綑杞︿綅鏁伴噺锛岃揪鍒版潯浠跺氨鎺ㄩ��
+//瑕佹眰锛�
+//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:
@@ -29,13 +35,14 @@
if flag {
left := hikSta.Left
if !initCacheM {
- models.SetSpaceNo(hikSta.TotalPermPlace)
+ models.SetSpaceNo(hikSta.TotalPlace)
initCacheM = true
}
- if left <=5 && left != prePushLeft {
+
+ 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.Push("鑲茶嫳鏅烘収鍋滆溅", message)
+ b, e := service.PushByAlias("鑲茶嫳鏅烘収鍋滆溅", message)
prePushLeft = left
@@ -44,11 +51,47 @@
}
updateSpaceLeft(left)
}
+ //鍒ゆ柇褰撳墠鏄惁鍦�22:00-22:30涔嬮棿
+ now := time.Now()
+ if now.Hour() == 21 && now.Minute()>=0 || now.Minute() <=29{
+ 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() == 29 {
+ 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
@@ -70,9 +113,6 @@
// @Failure 403 {string} json ""
// @router /statistic [get]
func (c *CarController) Statistic() {
- //sv := service.NewCarService()
- //hikStc := sv.Statistic()
- //left := hikStc.Left
left := getSpaceLeft()
sta := models.CarStatistic{
Left: left,
diff --git a/controllers/user.go b/controllers/user.go
index 2025f12..29b3f0c 100644
--- a/controllers/user.go
+++ b/controllers/user.go
@@ -63,15 +63,16 @@
func (u *UserController) Login() {
phoneNum := u.GetString("phoneNum")
cod := u.GetString("code")
+ cid := u.GetString("cid") //unipush clientid
resp := code.Code{}
fmt.Println("phoneNum:", phoneNum, "code:", cod)
- if phoneNum == "" || cod == "" {
+ if phoneNum == "" || cod == ""{
resp.Success= false
resp.Status= http.StatusBadRequest
resp.Data= "鍙傛暟鏈夎"
} else {
var sv service.UserService
- b, info, e := sv.Login(phoneNum, cod)
+ b, info, e := sv.Login(phoneNum, cod, cid)
if b {
resp.Success= true
diff --git a/extend/util/httpUtil.go b/extend/util/httpUtil.go
index 303612b..621755e 100644
--- a/extend/util/httpUtil.go
+++ b/extend/util/httpUtil.go
@@ -79,4 +79,39 @@
return resultBytes, err
}
return resultBytes, nil
+}
+
+//鏋勯�燿elete璇锋眰
+func DoDeleteRequest(url string, contentType string, body map[string]interface{}, headers map[string]string) ([]byte, error) {
+ var resultBytes []byte
+ var bodyJson []byte
+ if body != nil {
+ var err error
+ bodyJson, err = json.Marshal(body)
+ if err != nil {
+ return resultBytes, err
+ }
+ }
+ request, err := http.NewRequest("DELETE", url, bytes.NewBuffer(bodyJson))
+ if err != nil {
+ return resultBytes, err
+ }
+ request.Header.Set("Content-type", contentType)
+ // add headers
+ if headers != nil {
+ for key, val := range headers {
+ request.Header.Add(key, val)
+ }
+ }
+ client := &http.Client{}
+ resp, err := client.Do(request)
+ if err != nil {
+ return resultBytes, err
+ }
+ defer resp.Body.Close()
+ resultBytes, err = ioutil.ReadAll(resp.Body)
+ if err != nil {
+ return resultBytes, err
+ }
+ return resultBytes, nil
}
\ No newline at end of file
diff --git a/models/car.go b/models/car.go
index 1e7eca2..14db294 100644
--- a/models/car.go
+++ b/models/car.go
@@ -25,8 +25,8 @@
}
type CarStatistic struct {
- TotalPermPlace int `json:"totalPermPlace"`
- Left int `json:"left"`
+ TotalPlace int `json:"totalPlace"`
+ Left int `json:"left"`
}
type PosInfo struct {
diff --git a/service/carService.go b/service/carService.go
index 4727b3e..318e706 100644
--- a/service/carService.go
+++ b/service/carService.go
@@ -25,14 +25,14 @@
func (sv *CarService) Statistic() (*models.CarStatistic, bool) {
m := models.CarStatistic{
- TotalPermPlace: 0,
- Left: 0,
+ TotalPlace: 0,
+ Left: 0,
}
remainList := sv.getRemainSpaceNum("")
if remainList != nil {
for _,r:=range remainList {
- m.TotalPermPlace += r.TotalPermPlace
+ m.TotalPlace += r.TotalPlace
m.Left += r.LeftPlace
}
return &m, true
@@ -145,11 +145,13 @@
func (sv *CarService) FindSpaceNo(userId string) models.PosResult {
resultList := make(models.PosResult,0)
var myPlateNosMap = make(map[string]string)
- vehicles := sv.GetVehicleListByPerson(userId)
- if vehicles != nil {
- for _,veh := range vehicles {
- myPlateNosMap[veh.PlateNo] = veh.PlateNo
- //myPlateNos = append(myPlateNos, veh.PlateNo)
+ if userId !="" {
+ vehicles := sv.GetVehicleListByPerson(userId)
+ if vehicles != nil {
+ for _,veh := range vehicles {
+ myPlateNosMap[veh.PlateNo] = veh.PlateNo
+ //myPlateNos = append(myPlateNos, veh.PlateNo)
+ }
}
}
@@ -347,7 +349,7 @@
url := "/artemis/api/resource/v2/vehicle/advance/vehicleList"
reqBody := map[string]interface{} {
"pageNo": 1,
- "pageSize": 100,
+ "pageSize": 1000,
"personIds": personId,
}
pageResult := sv.getHikPageResult(url, reqBody)
diff --git a/service/msgPush.go b/service/msgPush.go
index 844ae2e..f13e9a2 100644
--- a/service/msgPush.go
+++ b/service/msgPush.go
@@ -2,6 +2,7 @@
import (
"car-service/extend/util"
+ "car-service/models"
"encoding/json"
"errors"
"fmt"
@@ -45,6 +46,94 @@
}()
}
+//瑙g粦鎵�鏈変笌璇ュ埆鍚嶇粦瀹氱殑cid
+//func UnbindAlias(alias string) (bool, error) {
+// appId := beego.AppConfig.String("pushAppId")
+// baseUrl := beego.AppConfig.String("pushBaseUrl") + appId
+// retryTimes := 0
+//ReTry:
+// token := getCacheToken()
+// if token == "" {
+// return false, errors.New("token is nil")
+// }
+// url := baseUrl + "/user/alias/"+alias
+// header := map[string]string {
+// "token": token,
+// }
+// b,err := util.DoDeleteRequest(url, util.CONTENT_TYPE_UTF8_JSON, nil, header)
+// if err !=nil {
+// fmt.Println("DoDelete err:", err)
+// return false, err
+// }
+// var result PushResult
+// err = json.Unmarshal(b, &result)
+// if err != nil {
+// fmt.Println("unmarshal err:", err)
+// return false, err
+// }
+// if result.Code == 0 { //瑙g粦鎴愬姛
+// return true, nil
+// } else if result.Code == 10001 { //token杩囨湡
+// if retryTimes <=3 {
+// newToken, err := RefreshToken()
+// if err == nil {
+// updateToken(newToken)
+// retryTimes++
+// goto ReTry
+// }
+// }
+// }
+// return false, errors.New(result.Msg)
+//}
+
+//涓�涓埆鍚嶆渶澶氬厑璁哥粦瀹�10涓猚id
+func BindAlias(cid, alias string) (bool, error) {
+ appId := beego.AppConfig.String("pushAppId")
+ baseUrl := beego.AppConfig.String("pushBaseUrl") + appId
+ retryTimes := 0
+ReTry:
+ token := getCacheToken()
+ if token == "" {
+ return false, errors.New("token is nil")
+ }
+ url := baseUrl+"/user/alias"
+ caArr := make([]map[string]string, 0)
+ caArr = append(caArr, map[string]string{
+ "cid": cid,
+ "alias": alias,
+ })
+ reqBody := map[string]interface{} {
+ "data_list":caArr,
+ }
+ header := map[string]string {
+ "token": token,
+ }
+ b, err := util.DoPostRequest(url, util.CONTENT_TYPE_UTF8_JSON, reqBody, nil, header)
+ if err !=nil {
+ fmt.Println("DoPost err:", err)
+ return false, err
+ }
+ var result PushResult
+ err = json.Unmarshal(b, &result)
+ if err != nil {
+ fmt.Println("unmarshal err:", err)
+ return false, err
+ }
+ if result.Code == 0 { //缁戝畾鎴愬姛
+ return true, nil
+ } else if result.Code == 10001 { //token杩囨湡
+ if retryTimes <=3 {
+ newToken, err := RefreshToken()
+ if err == nil {
+ updateToken(newToken)
+ retryTimes++
+ goto ReTry
+ }
+ }
+ }
+ return false, errors.New(result.Msg)
+}
+
type PushResult struct {
Code int `json:"code"`
Msg string `json:"msg"`
@@ -56,7 +145,274 @@
Token string `json:"token"`
}
-func Push(title string, msg string) (bool,error) {
+type CreatePushMsgResult struct {
+ TaskId string `json:"taskid"`
+}
+
+func createPushMsg(title string, msg string) (bool,string, error) {
+ appId := beego.AppConfig.String("pushAppId")
+ baseUrl := beego.AppConfig.String("pushBaseUrl") + appId
+ retryTimes := 0
+ReTry:
+ token := getCacheToken()
+ if token == "" {
+ return false, "", errors.New("token is nil")
+ }
+ url := baseUrl+"/push/list/message"
+ intent := "intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;component=uni.UNIEDF0B5C/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title="+title+";S.content="+msg+";S.payload=test;end"
+ reqBody := map[string]interface{} {
+ "request_id": time.Now().Format("20060102150405") + util.GenValidateCode(6),
+ "settings":map[string]int {
+ "ttl": 8 * 3600 * 1000,
+ },
+ "push_message": map[string]map[string]string {
+ "notification": {
+ "title": title,
+ "body": msg,
+ "click_type": "intent",
+ "intent": intent,
+ },
+ },
+ "push_channel": map[string]map[string]map[string]map[string]string {
+ "android": {
+ "ups": {
+ "notification": {
+ "title": title,
+ "body": msg,
+ "click_type": "intent",
+ "intent": intent,
+ },
+ },
+ },
+ },
+ }
+ header := map[string]string {
+ "token": token,
+ }
+ b, err := util.DoPostRequest(url, util.CONTENT_TYPE_UTF8_JSON, reqBody, nil, header)
+ if err !=nil {
+ fmt.Println("DoPost err:", err)
+ return false, "",err
+ }
+ var result PushResult
+ err = json.Unmarshal(b, &result)
+ if err != nil {
+ fmt.Println("unmarshal err:", err)
+ return false, "",err
+ }
+ if result.Code == 0 {
+ rb,uErr := json.Marshal(result.Data)
+ if uErr == nil {
+ var tResult CreatePushMsgResult
+ if uErr =json.Unmarshal(rb, &tResult); uErr ==nil {
+ return true, tResult.TaskId, nil
+ } else {
+ return false, "", uErr
+ }
+ } else {
+ return false, "", uErr
+ }
+ } else if result.Code == 10001 { //token杩囨湡
+ if retryTimes <=3 {
+ newToken, err := RefreshToken()
+ if err == nil {
+ updateToken(newToken)
+ retryTimes++
+ goto ReTry
+ }
+ }
+ }
+ return false, "", errors.New(result.Msg)
+}
+
+//瀵瑰凡娉ㄥ唽鐨勭敤鎴疯繘琛屾秷鎭帹閫併�傝皟鐢ㄦ鎺ュ彛鍓嶉渶璋冪敤鍒涘缓娑堟伅鎺ュ彛璁剧疆娑堟伅鍐呭
+func PushByAlias(title string, msg string) (bool, error) {
+ var aliasArr []string
+
+ pushUserM := make(map[string]string)
+ var userE models.User
+ allUsers, _ := userE.GetAllUsers()
+ if allUsers != nil {
+ for _,u := range allUsers {
+ pushUserM[u.Id] = u.PhoneNum
+ }
+ }
+ if len(pushUserM) == 0 {
+ return true,nil
+ }
+ carPersonM := make(map[string]string)
+ var csv CarService
+ carPersons := csv.GetVehicleListByPerson("")
+ if carPersons != nil {
+ for _, cp := range carPersons {
+ carPersonM[cp.PlateNo] = cp.PersonId
+ }
+ }
+ spaceNos := csv.FindSpaceNo("")
+ for _,sn := range spaceNos {
+ if sn.State == 1 && sn.PlateNo != "" { //宸茬粡鎶婅溅鍋滃埌鍋滆溅鍦虹殑杞︿富锛屼笉鍐嶆帹閫佹秷鎭�
+ if _,ok := carPersonM[sn.PlateNo];ok {
+ delete(carPersonM, sn.PlateNo)
+ }
+ }
+ }
+ for _,personId := range carPersonM {
+ if phoneNum,ok := pushUserM[personId]; ok { //姝や汉宸叉敞鍐屽埌绯荤粺,骞朵笖杞︿笉鍦ㄥ仠杞﹀簱鍐�
+ aliasArr = append(aliasArr, phoneNum)
+ }
+ }
+ if len(aliasArr) == 0 {
+ fmt.Println("娌℃湁鎺ㄩ�佺洰鏍�,aliasArr is empty")
+ return true, nil
+ }
+
+ cResult, taskId, ce := createPushMsg(title, msg)
+ if !cResult {
+ fmt.Println("createPushMsg taskId:", taskId, "err:", ce)
+ return false, errors.New("鍒涘缓鎺ㄩ�佸墠缃秷鎭け璐�")
+ }
+
+ appId := beego.AppConfig.String("pushAppId")
+ baseUrl := beego.AppConfig.String("pushBaseUrl") + appId
+ retryTimes := 0
+ReTry:
+ token := getCacheToken()
+ if token == "" {
+ return false, errors.New("token is nil")
+ }
+ url := baseUrl+"/push/list/alias"
+ reqBody := map[string]interface{} {
+ "audience":map[string]interface{}{
+ "alias": aliasArr,
+ },
+ "taskid": taskId,
+ "is_async": true,
+ }
+ header := map[string]string {
+ "token": token,
+ }
+ b, err := util.DoPostRequest(url, util.CONTENT_TYPE_UTF8_JSON, reqBody, nil, header)
+ if err !=nil {
+ fmt.Println("DoPost err:", err)
+ return false, err
+ }
+ var result PushResult
+ err = json.Unmarshal(b, &result)
+ if err != nil {
+ fmt.Println("unmarshal err:", err)
+ return false, err
+ }
+ if result.Code == 0 {
+ return true, nil
+ } else if result.Code == 10001 { //token杩囨湡
+ if retryTimes <=3 {
+ newToken, err := RefreshToken()
+ if err == nil {
+ updateToken(newToken)
+ retryTimes++
+ goto ReTry
+ }
+ }
+ } else {
+ fmt.Println("鎺ㄩ�佺粨鏋�:", result)
+ }
+
+ return false, errors.New("鎺ㄩ�佸け璐�")
+}
+
+func NightPush(title string, msg string) (bool, error) {
+ var aliasArr []string
+
+ pushUserM := make(map[string]string)
+ var userE models.User
+ allUsers, _ := userE.GetAllUsers()
+ if allUsers != nil {
+ for _,u := range allUsers {
+ pushUserM[u.Id] = u.PhoneNum
+ }
+ }
+ if len(pushUserM) == 0 {
+ return true,nil
+ }
+ carPersonM := make(map[string]string)
+ var csv CarService
+ carPersons := csv.GetVehicleListByPerson("")
+ if carPersons != nil {
+ for _, cp := range carPersons {
+ carPersonM[cp.PlateNo] = cp.PersonId
+ }
+ }
+ spaceNos := csv.FindSpaceNo("")
+ for _,sn := range spaceNos {
+ if sn.State == 1 && sn.PlateNo != "" { //宸茬粡鎶婅溅鍋滃埌鍋滆溅鍦虹殑杞︿富锛屼笉鍐嶆帹閫佹秷鎭�
+ if personId,ok := carPersonM[sn.PlateNo];ok {
+ if phoneNum,ok := pushUserM[personId]; ok { //姝や汉宸叉敞鍐屽埌绯荤粺,骞朵笖杞︿笉鍦ㄥ仠杞﹀簱鍐�
+ aliasArr = append(aliasArr, phoneNum)
+ }
+ }
+ }
+ }
+
+ if len(aliasArr) == 0 {
+ fmt.Println("娌℃湁鎺ㄩ�佺洰鏍�,aliasArr is empty")
+ return true, nil
+ }
+
+ cResult, taskId, ce := createPushMsg(title, msg)
+ if !cResult {
+ fmt.Println("createPushMsg taskId:", taskId, "err:", ce)
+ return false, errors.New("鍒涘缓鎺ㄩ�佸墠缃秷鎭け璐�")
+ }
+
+ appId := beego.AppConfig.String("pushAppId")
+ baseUrl := beego.AppConfig.String("pushBaseUrl") + appId
+ retryTimes := 0
+ReTry:
+ token := getCacheToken()
+ if token == "" {
+ return false, errors.New("token is nil")
+ }
+ url := baseUrl+"/push/list/alias"
+ reqBody := map[string]interface{} {
+ "audience":map[string]interface{}{
+ "alias": aliasArr,
+ },
+ "taskid": taskId,
+ "is_async": true,
+ }
+ header := map[string]string {
+ "token": token,
+ }
+ b, err := util.DoPostRequest(url, util.CONTENT_TYPE_UTF8_JSON, reqBody, nil, header)
+ if err !=nil {
+ fmt.Println("DoPost err:", err)
+ return false, err
+ }
+ var result PushResult
+ err = json.Unmarshal(b, &result)
+ if err != nil {
+ fmt.Println("unmarshal err:", err)
+ return false, err
+ }
+ if result.Code == 0 {
+ return true, nil
+ } else if result.Code == 10001 { //token杩囨湡
+ if retryTimes <=3 {
+ newToken, err := RefreshToken()
+ if err == nil {
+ updateToken(newToken)
+ retryTimes++
+ goto ReTry
+ }
+ }
+ } else {
+ fmt.Println("鎺ㄩ�佺粨鏋�:", result)
+ }
+
+ return false, errors.New("鎺ㄩ�佸け璐�")
+}
+
+func PushAll(title string, msg string) (bool,error) {
appId := beego.AppConfig.String("pushAppId")
baseUrl := beego.AppConfig.String("pushBaseUrl") + appId
retryTimes := 0
diff --git a/service/userService.go b/service/userService.go
index 731ee51..2caaeaf 100644
--- a/service/userService.go
+++ b/service/userService.go
@@ -16,7 +16,7 @@
}
-func (sv *UserService) Login(phoneNum, code string) (bool,*vo.UserInfo,error) {
+func (sv *UserService) Login(phoneNum, code, cid string) (bool,*vo.UserInfo,error) {
if verifyCode(phoneNum, code) {
carSv := NewCarService()
@@ -54,6 +54,10 @@
plateNos = append(plateNos, up.PlateNo)
}
}
+ //瀹㈡埛绔痗id缁戝畾鍒悕
+ if cid != "" {
+ go BindAlias(cid, phoneNum)
+ }
return true, &vo.UserInfo{
UserId: u.Id,
PhoneNum: phoneNum,
@@ -72,6 +76,10 @@
plateNos = append(plateNos, up.PlateNo)
}
}
+ //瀹㈡埛绔痗id缁戝畾鍒悕
+ if cid != "" {
+ go BindAlias(cid, phoneNum)
+ }
return true, &vo.UserInfo{
UserId: tmpUser.Id,
PhoneNum: phoneNum,
--
Gitblit v1.8.0