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