From f58d6c7e121dc6a16f6b1e12e5beba1e6ce1b992 Mon Sep 17 00:00:00 2001 From: liuxiaolong <liuxiaolong@aiotlink.com> Date: 星期二, 08 九月 2020 15:11:05 +0800 Subject: [PATCH] Push2Manager add isTest --- service/msgPush.go | 510 +++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 370 insertions(+), 140 deletions(-) diff --git a/service/msgPush.go b/service/msgPush.go index f13e9a2..da1455a 100644 --- a/service/msgPush.go +++ b/service/msgPush.go @@ -7,6 +7,7 @@ "errors" "fmt" "github.com/astaxie/beego" + "strings" "sync" "time" ) @@ -46,45 +47,65 @@ }() } -//瑙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) -//} +//鎵归噺瑙g粦鍒悕 +func UnbindAlias(cid string) (bool, error) { + var uc models.UserClient + ucList := uc.GetByCid(cid) + if ucList ==nil { + return true,errors.New("ucList is nil") + } + var aliasArr []string + for _,als := range ucList { + aliasArr = append(aliasArr, als.PhoneNum) + } + 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" + header := map[string]string { + "token": token, + } + caArr := make([]map[string]string, 0) + for _,as := range aliasArr { + caArr = append(caArr, map[string]string{ + "cid": cid, + "alias": as, + }) + } + + reqBody := map[string]interface{}{ + "data_list": caArr, + } + b,err := util.DoDeleteRequest(url, util.CONTENT_TYPE_UTF8_JSON, reqBody, 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) { @@ -160,6 +181,28 @@ } 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" + androidPush := map[string]map[string]map[string]string { + "ups": { + "notification": { + "title": title, + "body": msg, + "big_text": msg, + "click_type": "intent", + "intent": intent, + }, + }, + } + iosPush := map[string]interface{}{ + "type":"notify", + "payload": "鑲茶嫳涓鍋滆溅", + "aps":map[string]interface{}{ + "alert":map[string]string{ + "title": title, + "body": msg, + }, + "content-available":0, + }, + } reqBody := map[string]interface{} { "request_id": time.Now().Format("20060102150405") + util.GenValidateCode(6), "settings":map[string]int { @@ -173,17 +216,9 @@ "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, - }, - }, - }, + "push_channel": map[string]interface{} { + "android": androidPush, + "ios":iosPush, }, } header := map[string]string { @@ -226,7 +261,7 @@ } //瀵瑰凡娉ㄥ唽鐨勭敤鎴疯繘琛屾秷鎭帹閫併�傝皟鐢ㄦ鎺ュ彛鍓嶉渶璋冪敤鍒涘缓娑堟伅鎺ュ彛璁剧疆娑堟伅鍐呭 -func PushByAlias(title string, msg string) (bool, error) { +func PushByAlias(title string, msg string, isTest bool) (bool, error, []string) { var aliasArr []string pushUserM := make(map[string]string) @@ -238,40 +273,111 @@ } } if len(pushUserM) == 0 { - return true,nil + return false,errors.New("len(pushUserM) == 0"),aliasArr } - carPersonM := make(map[string]string) - var csv CarService + carPersonM := make(map[string]string) //浠ヨ溅鐗屽彿涓簁ey锛寁alue鏄痟ik鐨刾ersonId + csv := NewCarService() 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) + ncPlateNo := preDealPlateNo(cp.PlateNo) //鍘绘帀姹夊瓧锛孌鍜�0鏇挎崲鎴�* + if ncPlateNo != "" { + carPersonM[ncPlateNo] = cp.PersonId } } } - for _,personId := range carPersonM { - if phoneNum,ok := pushUserM[personId]; ok { //姝や汉宸叉敞鍐屽埌绯荤粺,骞朵笖杞︿笉鍦ㄥ仠杞﹀簱鍐� - aliasArr = append(aliasArr, phoneNum) + delPersonIdM := make(map[string]string) + spaceNos := csv.FindSpaceNo("") + for _,sn := range spaceNos { + if sn.State == 1 && sn.PlateNo != "" { //宸茬粡鎶婅溅鍋滃埌鍋滆溅鍦虹殑杞︿富锛屼笉鍐嶆帹閫佹秷鎭� + realPlateNo := preDealPlateNo(sn.PlateNo) + if realPlateNo != "" { + if pId,ok := carPersonM[realPlateNo];ok { + delPersonIdM[pId] = pId + delete(carPersonM, realPlateNo) + } + } } } - if len(aliasArr) == 0 { - fmt.Println("娌℃湁鎺ㄩ�佺洰鏍�,aliasArr is empty") - return true, nil + var uc models.UserClient + for _,personId := range carPersonM { + if phoneNum,ok := pushUserM[personId]; ok { //姝や汉宸叉敞鍐屽埌绯荤粺,骞朵笖杞︿笉鍦ㄥ仠杞﹀簱鍐� + if _,in := delPersonIdM[personId];!in { + if uc.Exist(phoneNum) { + aliasArr = append(aliasArr, phoneNum) + } + } + } + } + lenAS := len(aliasArr) + if lenAS == 0 { + return false, errors.New("娌℃湁鎺ㄩ�佺洰鏍囷紝aliasArr is empty"),aliasArr + } + if isTest { + //鍙粰鍐呴儴鎵嬫満鍙锋帹 + testPhones := beego.AppConfig.String("testPushPhones") + if testPhones == "" { + return false, errors.New("test push aliasArr is empty"),aliasArr + } + aliasArr = strings.Split(testPhones, ",") } cResult, taskId, ce := createPushMsg(title, msg) + fmt.Println("createPushMsg taskId:", taskId, "cResult:",cResult, "err:", ce) if !cResult { - fmt.Println("createPushMsg taskId:", taskId, "err:", ce) - return false, errors.New("鍒涘缓鎺ㄩ�佸墠缃秷鎭け璐�") + return false, errors.New("鍒涘缓鎺ㄩ�佸墠缃秷鎭け璐�"),aliasArr } + //alias 鍗曟鎺ㄩ�侀暱搴︿笂闄愭槸200 + pushTime := 1 + if lenAS > 200 { + pushTime = lenAS / 200 + if lenAS % 200 >0 { + pushTime++ + } + } + + isSuccess := false + for i:=0;i<pushTime;i++ { + var curAliasArr []string + start := i*200 + end := (i+1)*200 -1 + if i<pushTime-1 { + curAliasArr = aliasArr[start:end] + } else { + //鍙栧墿浣欐墍鏈� + curAliasArr = aliasArr[start:] + } + if len(curAliasArr) >0 { + flag, e := doPush(taskId, curAliasArr) + if e != nil { + fmt.Println("doPush err:", e) + } + if flag { + isSuccess = true + } + } + } + if isSuccess { + return true, nil,aliasArr + } + + return false, errors.New("鎺ㄩ�佸け璐�"),aliasArr +} + +//棰勫鐞嗚溅鐗屽彿锛屽幓闄ら涓眽瀛楋紝浠ュ強蹇界暐D鍜�0 +func preDealPlateNo(pn string) string { + if pn != "" { + r := []rune(pn) + ncStr := string(r[1:]) + newPlateNo := strings.ReplaceAll(ncStr, "D", "*") + newPlateNo = strings.ReplaceAll(newPlateNo, "0", "*") + return newPlateNo + } + return "" +} + +func doPush(taskId string, aliasArr []string) (bool,error) { appId := beego.AppConfig.String("pushAppId") baseUrl := beego.AppConfig.String("pushBaseUrl") + appId retryTimes := 0 @@ -286,7 +392,7 @@ "alias": aliasArr, }, "taskid": taskId, - "is_async": true, + "is_async": false, } header := map[string]string { "token": token, @@ -316,12 +422,12 @@ } else { fmt.Println("鎺ㄩ�佺粨鏋�:", result) } - return false, errors.New("鎺ㄩ�佸け璐�") } -func NightPush(title string, msg string) (bool, error) { +func NightPush(title string, msg string) (bool, error, []string, []string) { var aliasArr []string + var carOwners []string pushUserM := make(map[string]string) var userE models.User @@ -332,22 +438,59 @@ } } if len(pushUserM) == 0 { - return true,nil + return false, errors.New("len(pushUserM) == 0"), aliasArr, carOwners } carPersonM := make(map[string]string) - var csv CarService + csv := NewCarService() carPersons := csv.GetVehicleListByPerson("") if carPersons != nil { for _, cp := range carPersons { - carPersonM[cp.PlateNo] = cp.PersonId + cnPlateNo := preDealPlateNo(cp.PlateNo) + if cnPlateNo != "" { + carPersonM[cnPlateNo] = cp.PersonId + } } } + //澶滈棿鏌愪簺棰嗗鐨勮溅鍙互鍋滃湪杞﹀簱鍐� + var vipPlateNoArr []string + vipArr := strings.Split(beego.AppConfig.String("nightVipPlateNos"), ",") + if vipArr != nil && len(vipArr) >0 { + for _,po := range vipArr { + if po != "" { + cnPo := preDealPlateNo(po) + if cnPo != "" { + vipPlateNoArr = append(vipPlateNoArr, cnPo) + } + } + } + } + + hikPersonMap := csv.GetHikPersonMap() + spaceNos := csv.FindSpaceNo("") + var uc models.UserClient 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 sn.State == 1 { //杞﹀皻鍦ㄥ仠杞﹀満鐨勮溅鐗� + inCnPlateNo := preDealPlateNo(sn.PlateNo) + if inCnPlateNo != "" { + if !isVipCar(inCnPlateNo, vipPlateNoArr) { + if personId,ok := carPersonM[inCnPlateNo];ok { + if phoneNum,ok := pushUserM[personId]; ok { + if uc.Exist(phoneNum) { + aliasArr = append(aliasArr, phoneNum) + } + } + + if v,ex := hikPersonMap[personId]; ex { + carOwners = append(carOwners, sn.PlateNo+"("+v.PersonName+")") + } + } else { //鎵句笉鍒拌溅涓伙紝鍗宠涓轰复鏃惰溅锛屽皢杞︾墝浣滀负杞︿富濮撳悕鎺ㄩ�� + if sn.PlateNo == "鏃犺溅鐗�" { + carOwners = append(carOwners, sn.PlateNo) + } else { + carOwners = append(carOwners, sn.PlateNo+"()") + } + } } } } @@ -355,63 +498,134 @@ if len(aliasArr) == 0 { fmt.Println("娌℃湁鎺ㄩ�佺洰鏍�,aliasArr is empty") - return true, nil + return false, errors.New("娌℃湁鎺ㄩ�佺洰鏍�,aliasArr is empty"), aliasArr, carOwners } cResult, taskId, ce := createPushMsg(title, msg) if !cResult { fmt.Println("createPushMsg taskId:", taskId, "err:", ce) - return false, errors.New("鍒涘缓鎺ㄩ�佸墠缃秷鎭け璐�") + return false, errors.New("鍒涘缓鎺ㄩ�佸墠缃秷鎭け璐�"), aliasArr, carOwners } - 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("鎺ㄩ�佸け璐�") + b,e := doPush(taskId, aliasArr) + return b,e, aliasArr, carOwners } + +//姝ゆ柟娉曞仛娴嬭瘯浣跨敤 +//鑾峰彇鍋滅暀鍦ㄨ溅搴撳唴杞︿富鐨勫鍚嶏紝鎵句笉鍒板鍚嶈繑鍥炶繖鐗� +func GetLeftCarOwners() []string { + var carOwners []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 + } + } + + carPersonM := make(map[string]string) + csv := NewCarService() + carPersons := csv.GetVehicleListByPerson("") + if carPersons != nil { + for _, cp := range carPersons { + cnPlateNo := preDealPlateNo(cp.PlateNo) + if cnPlateNo != "" { + carPersonM[cnPlateNo] = cp.PersonId + } + } + } + //澶滈棿鏌愪簺棰嗗鐨勮溅鍙互鍋滃湪杞﹀簱鍐� + var vipPlateNoArr []string + vipArr := strings.Split(beego.AppConfig.String("nightVipPlateNos"), ",") + if vipArr != nil && len(vipArr) >0 { + for _,po := range vipArr { + if po != "" { + cnPo := preDealPlateNo(po) + if cnPo != "" { + vipPlateNoArr = append(vipPlateNoArr, cnPo) + } + } + } + } + + hikPersonMap := csv.GetHikPersonMap() + + spaceNos := csv.FindSpaceNo("") + for _,sn := range spaceNos { + if sn.State == 1 { //杞﹀皻鍦ㄥ仠杞﹀満鐨勮溅鐗� + inCnPlateNo := preDealPlateNo(sn.PlateNo) + if inCnPlateNo != "" { + if !isVipCar(inCnPlateNo, vipPlateNoArr) { + if personId,ok := carPersonM[inCnPlateNo];ok { + + if v,ex := hikPersonMap[personId]; ex { + carOwners = append(carOwners, sn.PlateNo+"("+v.PersonName+")") + } + } else { //鎵句笉鍒拌溅涓伙紝鍗宠涓轰复鏃惰溅锛屽皢杞︾墝浣滀负杞︿富濮撳悕鎺ㄩ�� + if sn.PlateNo == "鏃犺溅鐗�" { + carOwners = append(carOwners, sn.PlateNo) + } else { + carOwners = append(carOwners, sn.PlateNo+"()") + } + } + } + } + } + } + + return carOwners +} + +//vip杞︿富锛屼笉鎺ユ敹璇风寮�鐨勯�氱煡锛屼篃涓嶉�氱煡绠$悊鍛樿繖涓溅杩樺湪杞﹀簱鍐� +func isVipCar(targetPlateNo string, vipPlateNoArr []string) bool { + b := false + if vipPlateNoArr != nil { + for _,v := range vipPlateNoArr { + if targetPlateNo == v { + b = true + break + } + } + } + return b +} + +//濡傛灉澶滈棿鏈夌粰杞﹀簱鍐呯殑杞︿富鎺ㄩ�佲�滆灏藉揩椹剁鈥濈殑娑堟伅锛屽垯鍛婄煡绠$悊鍛� 鏈夊摢浜涜溅灏氬仠鍦ㄨ溅搴撳唴 +func Push2Manager(title string, msg string, isTest bool) (bool, error, []string) { + if len(msg) > 256 { + fmt.Println("澶滈棿鍋滅暀杞﹀お澶氾紝message:", msg) + + r := []rune(msg) + msg = string(r[:125])+"..." + } + managers := "" + if isTest { + managers = beego.AppConfig.String("testPushPhones") + } else { + managers = beego.AppConfig.String("nightManagerPhones") + } + if managers == "" { + return false, errors.New("澶滈棿鎺ㄩ�佺鐞嗗憳鎵嬫満鍙锋湭閰嶇疆"), []string{} + } + managerArr := strings.Split(managers, ",") + if len(managerArr) == 0 { + fmt.Println("娌℃湁鎺ㄩ�佺洰鏍�,managerArr is empty") + return false, errors.New("绠$悊鍛樻墜鏈哄彿鏈厤缃�"), managerArr + } + + cResult, taskId, ce := createPushMsg(title, msg) + if !cResult { + fmt.Println("createPushMsg taskId:", taskId, "err:", ce) + return false, errors.New("鍒涘缓鎺ㄩ�佸墠缃秷鎭け璐�"), managerArr + } + + b,e := doPush(taskId, managerArr) + return b,e, managerArr +} + +/* func PushAll(title string, msg string) (bool,error) { appId := beego.AppConfig.String("pushAppId") baseUrl := beego.AppConfig.String("pushBaseUrl") + appId @@ -423,6 +637,30 @@ } url := baseUrl+"/push/all" 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" + androidPush := map[string]map[string]map[string]string { + "ups": { + "notification": { + "title": title, + "body": msg, + "click_type": "intent", + "intent": intent, + }, + }, + } + iosPush := map[string]interface{}{ + "type":"notify", + "payload":"鑲茶嫳涓鍋滆溅", + "aps":map[string]interface{}{ + "alert":map[string]string{ + "title": title, + "body": msg, + }, + "content-available":0, + //"sound":"com.gexin.ios.silence", + //"category":"ACTIONABLE", + }, + "auto_badge":"+1", + } reqBody := map[string]interface{} { "request_id": time.Now().Format("20060102150405") + util.GenValidateCode(6), "settings":map[string]int { @@ -437,17 +675,9 @@ "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, - }, - }, - }, + "push_channel": map[string]interface{} { + "android": androidPush, + "ios": iosPush, }, } header := map[string]string { @@ -480,7 +710,7 @@ } return false, errors.New("鎺ㄩ�佸け璐�") -} +}*/ func RefreshToken() (*TokenResult,error) { appId := beego.AppConfig.String("pushAppId") -- Gitblit v1.8.0