From f64dd9f191dff341b4eb430d7bacc44a3db9a279 Mon Sep 17 00:00:00 2001 From: liuxiaolong <liuxiaolong@aiotlink.com> Date: 星期五, 04 三月 2022 10:12:45 +0800 Subject: [PATCH] fix nil --- service/carService.go | 471 ++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 389 insertions(+), 82 deletions(-) diff --git a/service/carService.go b/service/carService.go index b813db6..7bd48e5 100644 --- a/service/carService.go +++ b/service/carService.go @@ -7,7 +7,9 @@ "encoding/json" "fmt" "github.com/astaxie/beego" + "sort" "strconv" + "strings" ) type CarService struct { hikUtil *reqUtil.HikHttpUtil @@ -16,8 +18,8 @@ func NewCarService() *CarService { return &CarService{ hikUtil: &reqUtil.HikHttpUtil{ - AppKey: hikAppKey, - AppSecret: hikAppSecret, + AppKey: beego.AppConfig.String("hikAppKey"), + AppSecret: beego.AppConfig.String("hikAppSecret"), ReqHost: beego.AppConfig.String("hikUrl"), }, } @@ -25,25 +27,27 @@ func (sv *CarService) Statistic() (*models.CarStatistic, bool) { m := models.CarStatistic{ - TotalPermPlace: 0, - Left: 0, + TotalPlace: 0, + Left: 0, } - parkList := sv.getHikParkList() //鍏堟煡鏈夊嚑涓仠杞﹀満 - flag := false - if parkList != nil { - flag = true - for _,p := range parkList { - remainList := sv.getRemainSpaceNum(p.ParkIndexCode) - if remainList != nil { - for _,r := range remainList { - m.Left += r.LeftPlace - m.TotalPermPlace += r.LeftPermPlace - } + //20201117 淇敼缁熻鏂瑰紡锛屾寜鐓� 鍓╀綑杞︿綅鏁�=杞︿綅鎬绘暟-杞﹀簱鍐呭疄闄呭仠杞︽暟锛堥〉闈笂鏄剧ず鐨勶紝涓嶅惈vip杞﹁締鍗犱綅锛� + spaceInfo := sv.FindSpaceNo("") + if spaceInfo != nil { + m.TotalPlace = len(spaceInfo) + usedCount := 0 + for _,si := range spaceInfo { + if si.State == 1 { + usedCount++ } } + m.Left = m.TotalPlace-usedCount + if m.Left < 0 { + m.Left = 0 + } + return &m, true + } else { + return &m, false } - - return &m, flag } type ParkInfo struct { @@ -53,11 +57,6 @@ CreateTime string `json:"createTime"` UpdateTime string `json:"updateTime"` } - -var ( - hikAppKey = "27107808" - hikAppSecret = "BEQiCoBTYcJX2d4KzbVK" -) //鑾峰彇娴峰悍鍋滆溅搴撳垪琛� @@ -94,12 +93,12 @@ ParkSysCode string `json:"parkSyscode"` //鍋滆溅搴撳敮涓�鏍囪瘑鐮� ParkName string `json:"parkName"` //鍋滆溅搴撳悕绉� ParentParkSyscode string `json:"parentParkSyscode"` //鐖跺仠杞﹀簱鍞竴鏍囪瘑 - TotalPlace int `json:"totalPlace"` //鍋滆溅搴撹溅浣嶆�绘暟 - TotalPermPlace int `json:"totalPermPlace"` //鍋滆溅搴撳浐瀹氳溅浣嶆�绘暟 - TotalReservePlace int `json:"totalReservePlace"` //鍋滆溅浣嶉绾﹁溅浣嶆�绘暟 - LeftPlace int `json:"leftPlace"` //鍋滆溅搴撹溅浣嶅墿浣欐暟 - LeftPermPlace int `json:"leftPermPlace"` //鍋滆溅搴撳浐瀹氳溅浣嶅墿浣欐暟 - LeftReservePlace int `json:"leftReservePlace"` //鍋滆溅搴撻绾﹁溅浣嶅墿浣欐暟 + TotalPlace int `json:"totalPlace"` //鍋滆溅搴撹溅浣嶆�绘暟 + TotalPermPlace int `json:"totalPermPlace"` //鍋滆溅搴撳浐瀹氳溅浣嶆�绘暟 + TotalReservePlace int `json:"totalReservePlace"` //鍋滆溅浣嶉绾﹁溅浣嶆�绘暟 + LeftPlace int `json:"leftPlace"` //鍋滆溅搴撹溅浣嶅墿浣欐暟 + LeftPermPlace int `json:"leftPermPlace"` //鍋滆溅搴撳浐瀹氳溅浣嶅墿浣欐暟 + LeftReservePlace int `json:"leftReservePlace"` //鍋滆溅搴撻绾﹁溅浣嶅墿浣欐暟 } func (sv *CarService) getRemainSpaceNum(parkIndexCode string) []RemainSpaceResult { @@ -147,67 +146,282 @@ PlateNoPicUri string `json:"plateNoPicUri"` AswSyscode string `json:"aswSyscode"` PlateNos string `json:"plateNos"` + PlateNo string `json:"plateNo"` AlarmPlateNos string `json:"alarmPlateNos"` SpaceType string `json:"spaceType"` +} + +func (sv *CarService) FindHikSpaceInfo(userId string) []SpaceNo { + url := "/artemis/api/pms/v1/parkingSpace/spaceNo" + + reqBody := map[string]interface{} { + "pageNo": 1, + "pageSize": 1000, + } + pageResult := sv.getHikPageResult(url, reqBody) + if pageResult != nil { + rb, err := json.Marshal(pageResult.List) + if err != nil { + fmt.Println("marshal pageResult.List err:", err) + return nil + } + var spaceList []SpaceNo + err = json.Unmarshal(rb, &spaceList) + if err != nil { + fmt.Println("unmarshal spaceNos err:", err) + return nil + } else { + curLoginManagerPhone := "" + personMap := sv.GetHikPersonMap() + if userId != "" { + if mm,ok := personMap[userId];ok { + curLoginManagerPhone = mm.PhoneNo + } + } + isSuper := false + if curLoginManagerPhone != "" { + superPhoneArr := strings.Split(beego.AppConfig.String("superManagerPhones"), ",") + if superPhoneArr != nil { + for _,sp := range superPhoneArr { + if sp == curLoginManagerPhone { //鏄秴绾х鐞嗗憳 + isSuper = true + break + } + } + } + } + + vipPlateNoArr := getVipPlateNoArr() + + var resultArr []SpaceNo + for _,si := range spaceList { + if si.State == 1 &&si.PlateNo != "" && si.PlateNo != "鏃犺溅鐗�" { //鏈夎溅 + if isSuper { + resultArr = append(resultArr, si) + } else { + if isSpaceShow(vipPlateNoArr, si.PlateNo) { + resultArr = append(resultArr, si) + } + } + } + } + return resultArr + } + } + return nil +} + + +type SpaceUser struct { + SpaceNo string `json:"spaceNo"` + PlateNo string `json:"plateNo"` + Username string `json:"username"` + PhoneNum string `json:"phoneNum"` + CarType string `json:"carType"` +} + +type SpaceUserArr []SpaceUser +func (arr SpaceUserArr) Len()int { + return len(arr) +} +func (arr SpaceUserArr) Swap(i,j int) { + arr[i],arr[j] = arr[j],arr[i] +} +func (arr SpaceUserArr) Less(i,j int) bool { + sn1,_ := strconv.Atoi(arr[i].SpaceNo) + sn2,_ := strconv.Atoi(arr[j].SpaceNo) + return sn1 < sn2 +} + +func (sv *CarService) FindHikSpaceUser(userId string) SpaceUserArr { + resultList := make(SpaceUserArr, 0) + url := "/artemis/api/pms/v1/parkingSpace/spaceNo" + reqBody := map[string]interface{} { + "pageNo": 1, + "pageSize": 1000, + } + pageResult := sv.getHikPageResult(url, reqBody) + if pageResult != nil { + rb, err := json.Marshal(pageResult.List) + if err != nil { + fmt.Println("marshal pageResult.List err:", err) + } else { + var spaceList []SpaceNo + err = json.Unmarshal(rb, &spaceList) + if err != nil { + fmt.Println("unmarshal spaceNos err:", err) + } else { + if len(spaceList) > 0 { //褰撳墠鏈夊仠鐣欒溅 + personMap := sv.GetHikPersonMap() + vehicleMap := sv.GetHikVehicleMap() + curLoginManagerPhone := "" + if userId != "" { + if mm,ok := personMap[userId];ok { + curLoginManagerPhone = mm.PhoneNo + } + } + isSuper := false + if curLoginManagerPhone != "" { + superPhoneArr := strings.Split(beego.AppConfig.String("superManagerPhones"), ",") + if superPhoneArr != nil { + for _,sp := range superPhoneArr { + if sp == curLoginManagerPhone { //鏄秴绾х鐞嗗憳 + isSuper = true + break + } + } + } + } + + vipPlateNoArr := getVipPlateNoArr() + + for _,sp := range spaceList { + if sp.State == 1 && sp.PlateNo != "" && sp.PlateNo != "鏃犺溅鐗�"{ + su := SpaceUser{ + SpaceNo: sp.SpaceNo, + PlateNo: sp.PlateNo, + } + if sp.PlateNo != "" { + r := []rune(sp.PlateNo) + ncStr := string(r[1:]) //鎶婄涓�浣嶆眽瀛楀墧闄ゆ帀 + newK := strings.ReplaceAll(ncStr, "D", "*") + newK = strings.ReplaceAll(newK, "0", "*") + personId := "" + if v,exist := vehicleMap[newK]; exist { + personId = v.PersonId + } + + if personId != "" { + su.CarType = "澶囨杞�" + if person, in := personMap[personId]; in { + su.Username = person.PersonName + su.PhoneNum = person.PhoneNo + } + } else { + su.CarType = "涓存椂杞�" + } + } else { + su.PlateNo = "鏃犺溅鐗�" + } + + if isSuper { + resultList = append(resultList, su) + } else { + if isSpaceShow(vipPlateNoArr, su.PlateNo) { + resultList = append(resultList, su) + } + } + + } + } + } + } + } + } + + sort.Sort(resultList) + return resultList +} + +func getVipPlateNoArr() []string { + 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) + } + } + } + } + return vipPlateNoArr +} + +//鐧藉ぉ鍜屽鏅氱鐞嗗憳閮界湅涓嶅埌vip杞﹁締 +func isSpaceShow(vipPlateNoArr []string, spacePto string) bool { + if vipPlateNoArr != nil && len(vipPlateNoArr) >0 { + targetPto := preDealPlateNo(spacePto) + if isVipCar(targetPto, vipPlateNoArr) { //鏄痸ip杞﹁締 + return false + } + } + + return true } 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 { + if veh.PlateNo != ""{ + r := []rune(veh.PlateNo) + ncStr := string(r[1:]) //鎶婄涓�浣嶆眽瀛楀墧闄ゆ帀 + myPlateNosMap[ncStr] = ncStr + } + //myPlateNosMap[veh.PlateNo] = veh.PlateNo + } } } - //bindCars := strings.Join(myPlateNos, ",") - //鍏堟煡杞﹀簱鍞竴鏍囪瘑 - //parkList := sv.getHikParkList() //鍏堟煡鏈夊嚑涓仠杞﹀満 - //if parkList != nil { - url := "/artemis/api/pms/v1/parkingSpace/spaceNo" - //for _,p := range parkList { - reqBody := map[string]interface{} { - //"parkSyscode": p.ParkIndexCode,//鍋滆溅搴撳敮涓�鏍囪瘑 - //"state": 1, //杞︿綅鐘舵�侊紝0锛氱┖闂诧紝1锛氬仠杞� - //"bindCars": bindCars, - "pageNo": 1, - "pageSize": 1000, + + url := "/artemis/api/pms/v1/parkingSpace/spaceNo" + + reqBody := map[string]interface{} { + //"parkSyscode": p.ParkIndexCode,//鍋滆溅搴撳敮涓�鏍囪瘑 + //"state": 1, //杞︿綅鐘舵�侊紝0锛氱┖闂诧紝1锛氬仠杞� + //"bindCars": bindCars, + "pageNo": 1, + "pageSize": 1000, + } + pageResult := sv.getHikPageResult(url, reqBody) + //fmt.Println("findSpaceNo pageResult:", pageResult) + if pageResult != nil { + rb, err := json.Marshal(pageResult.List) + if err != nil { + fmt.Println("marshal pageResult.List err:",err) + return nil + } + var spaceList []SpaceNo + err = json.Unmarshal(rb, &spaceList) + if err != nil { + fmt.Println("unmarshal spaceNos err:",err) + return nil + } + vipPlateNoArr := getVipPlateNoArr() + for _,s := range spaceList { + pi := models.PosInfo { + SpaceNo: s.SpaceNo, + PosNo: "", + State: s.State, } - pageResult := sv.getHikPageResult(url, reqBody) - fmt.Println("findSpaceNo pageResult:", pageResult) - if pageResult != nil { - rb, err := json.Marshal(pageResult.List) - if err != nil { - fmt.Println("marshal pageResult.List err:",err) - return nil - } - var spaceList []SpaceNo - err = json.Unmarshal(rb, &spaceList) - if err != nil { - fmt.Println("unmarshal spaceNos err:",err) - return nil - } - for _,s := range spaceList { - isMine := false - if _,exist := myPlateNosMap[s.PlateNos]; exist { - isMine = true - } - pi := models.PosInfo { - SpaceNo: s.SpaceNo, - PosNo: "", - State: s.State, - PlateNo: s.PlateNos, - IsMine: isMine, - } - if v,ok := models.SpaceNo2Pos[s.SpaceNo];ok { - pi.PosNo = v - } - resultList = append(resultList, pi) - } + if s.PlateNo != "" { + pi.PlateNo = s.PlateNo + } else if s.PlateNos != "" { + pi.PlateNo = s.PlateNos } - //} - //} + if pi.PlateNo == "鏃犺溅鐗�" { + pi.State = 0 + pi.PlateNo = "" + resultList = append(resultList, pi) + } else { + pi.IsMine = isMyPlateNo(myPlateNosMap, pi.PlateNo) + if v,ok := models.SpaceNo2Pos[s.SpaceNo];ok { + pi.PosNo = v + } + if isSpaceShow(vipPlateNoArr, pi.PlateNo) { + resultList = append(resultList, pi) + } else { + pi.State = 0 + pi.PlateNo = "" + resultList = append(resultList, pi) + } + } + } + } if len(resultList) == 0 { for i:=1;i<91;i++ { pi := models.PosInfo { @@ -222,6 +436,35 @@ } return resultList +} + +//鍒ゆ柇鏄笉鏄嚜宸辩殑杞︾墝鍙� +//1.鐩墠鏈夎璇嗗埆鐨勯棶棰橈紝浼氭妸D璇嗗埆鎴�0,D鍜�0涓嶅垎 +//2.姹夊瓧璇瘑鍒殑鍑犵巼姣旇緝楂� +func isMyPlateNo(plateNoM map[string]string, targetPlateNo string) bool { + if targetPlateNo != "" && plateNoM != nil { + r := []rune(targetPlateNo) + nctPlateNo := string(r[1:]) + + if _,exist := plateNoM[nctPlateNo];exist { + return true + } else { + match := false + for k,_ := range plateNoM { + newK := strings.ReplaceAll(k, "D", "*") + newK = strings.ReplaceAll(newK, "0", "*") + + tt := strings.ReplaceAll(nctPlateNo,"D", "*") + tt = strings.ReplaceAll(tt,"0", "*") + if newK == tt { + match = true + break + } + } + return match + } + } + return false } func (sv *CarService) BindCarSpace() bool { @@ -256,6 +499,37 @@ PicUri string `json:"picUri"` ServerIndexCode string `json:"serverIndexCode"` PersonId string `json:"personId"` +} + +//浠ヤ汉鍛榠d涓簁ey +func (sv *CarService) GetHikPersonMap() map[string]HikPerson { + m := make(map[string]HikPerson) + personList := sv.GetHikPersonList() + if personList != nil { + for _,p := range personList { + m[p.PersonId] = p + } + } + return m +} + +//浠ヨ溅鐗屽彿涓篕ey +func (sv *CarService) GetHikVehicleMap() map[string] HikVehicle { + m := make(map[string]HikVehicle) + carPersons := sv.GetVehicleListByPerson("") + if carPersons != nil { + for _,veh := range carPersons { + if veh.PlateNo != "" { + r := []rune(veh.PlateNo) + ncStr := string(r[1:]) //鎶婄涓�浣嶆眽瀛楀墧闄ゆ帀 + newK := strings.ReplaceAll(ncStr, "D", "*") + newK = strings.ReplaceAll(newK, "0", "*") + m[newK] = veh + } + } + } + + return m } func (sv *CarService) GetHikPersonList() []HikPerson { @@ -310,10 +584,38 @@ return list } +func SyncHikPerson() int { + syncCount := 0 + sv := NewCarService() + hikPersons := sv.GetHikPersonList() + if hikPersons != nil && len(hikPersons) >0 { + var u models.User + idMap := u.GetAllMap() + hikPM := make(map[string]string) + for _,hp := range hikPersons { + hikPM[hp.PersonId] = hp.PhoneNo + if sp,ok := idMap[hp.PersonId];ok { + if sp.PhoneNum != hp.PhoneNo { + u.UpdatePhoneNum(hp.PhoneNo, hp.PersonId) + syncCount++ + } + } + } + for k,_ := range idMap { + if _,in := hikPM[k];!in { + u.Delete(k) + syncCount++ + } + } + + } + return syncCount +} + func (sv *CarService) getHikPageResult(url string, reqBody map[string]interface{}) *vo.HikPageResult { fmt.Println(url, reqBody) result := sv.hikUtil.Post(url, reqBody) - if result.Code == reqUtil.HikResult_Success { + if result != nil && result.Code == reqUtil.HikResult_Success { b, err := json.Marshal(result.Data) if err == nil { var pageResult vo.HikPageResult @@ -357,11 +659,14 @@ url := "/artemis/api/resource/v2/vehicle/advance/vehicleList" reqBody := map[string]interface{} { "pageNo": 1, - "pageSize": 100, - "personIds": personId, + "pageSize": 1000, + } + if personId != "" { + reqBody["personIds"] = personId } pageResult := sv.getHikPageResult(url, reqBody) if pageResult ==nil { + fmt.Println("GetVehicleListByPerson pageResult is nil") return nil } @@ -370,6 +675,8 @@ var list []HikVehicle if err = json.Unmarshal(b, &list);err == nil { return list + } else { + fmt.Println("unmarshal err:", err) } } @@ -425,4 +732,4 @@ } return nil -} \ No newline at end of file +} -- Gitblit v1.8.0