liuxiaolong
2020-08-17 bae4af47f77a195a12a0437584d667465e826e12
service/carService.go
@@ -3,6 +3,7 @@
import (
   reqUtil "car-service/extend/util"
   "car-service/models"
   "car-service/vo"
   "encoding/json"
   "fmt"
   "github.com/astaxie/beego"
@@ -15,32 +16,29 @@
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"),
      },
   }
}
func (sv *CarService) Statistic() *models.CarStatistic {
func (sv *CarService) Statistic() (*models.CarStatistic, bool) {
   m := models.CarStatistic{
      Left: 0,
   }
   parkList := sv.getHikParkList() //先查有几个停车场
   fmt.Println("parkList:", parkList)
   if parkList != nil {
      for _,p := range parkList {
         remainList := sv.getRemainSpaceNum(p.ParkIndexCode)
         fmt.Println("remainList:", remainList)
         if remainList != nil {
            for _,r := range remainList {
               m.Left += r.LeftPlace
            }
         }
      }
      TotalPlace: 0,
      Left:       0,
   }
   return &m
   remainList := sv.getRemainSpaceNum("")
   if remainList != nil {
      for _,r:=range remainList {
         m.TotalPlace += r.TotalPlace
         m.Left += r.LeftPlace
      }
      return &m, true
   } else {
      return &m, false
   }
}
type ParkInfo struct {
@@ -50,11 +48,6 @@
   CreateTime             string          `json:"createTime"`
   UpdateTime             string          `json:"updateTime"`
}
var (
   hikAppKey = "27107808"
   hikAppSecret = "BEQiCoBTYcJX2d4KzbVK"
)
//获取海康停车库列表
@@ -91,12 +84,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 {
@@ -125,7 +118,6 @@
      }
      return remainList
   }
   fmt.Println("result:", result)
   return nil
}
@@ -145,74 +137,88 @@
   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) FindSpaceNo() models.PosResult {
func (sv *CarService) FindSpaceNo(userId string) models.PosResult {
   resultList := make(models.PosResult,0)
   for k,_ := range models.SpaceNo2Pos {
      st := 0
      i, _ := strconv.Atoi(k)
      if i >= 50 && i <=60 {
         st = 1
   var myPlateNosMap = make(map[string]string)
   if userId !="" {
      vehicles := sv.GetVehicleListByPerson(userId)
      if vehicles != nil {
         for _,veh := range vehicles {
            myPlateNosMap[veh.PlateNo] = veh.PlateNo
            //myPlateNos = append(myPlateNos, veh.PlateNo)
         }
      }
      resultList = append(resultList, models.PosInfo {
         SpaceNo: k,
         PosNo: "",
         State: st,
         PlateNo: "",
      })
   }
   //先查车库唯一标识
   //parkList := sv.getHikParkList() //先查有几个停车场
   //fmt.Println("parkList:", parkList)
   //if parkList != nil {
   //   url := "/api/pms/v1/parkingSpace/spaceNo"
   //   for _,p := range parkList {
   //      reqBody := map[string]interface{} {
   //         "parkSyscode": p.ParkIndexCode,//停车库唯一标识
   //         "spaceNos": "",  //车位号,多个用逗号隔开
   //         "state": 1, //车位状态,0:空闲,1:停车
   //         "bindCars": "", //绑定的车辆车牌号,多个用逗号隔开
   //         "pageNo": 1,
   //         "pageSize": 1000,
   //      }
   //      result := sv.hikUtil.Post(url, reqBody)
   //      if result.Code == reqUtil.HikResult_Success {
   //         rb, err := json.Marshal(result.Data)
   //         if err != nil {
   //            fmt.Println("hik find spaceNo 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 {
   //            pi := models.PosInfo {
   //               SpaceNo: s.SpaceNo,
   //               PosNo: "",
   //               State: s.State,
   //               PlateNo: s.PlateNos,
   //            }
   //            if v,ok := models.SpaceNo2Pos[s.SpaceNo];ok {
   //               pi.PosNo = v
   //            }
   //            resultList = append(resultList, pi)
   //         }
   //      }
   //   }
   //}
   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
      }
      for _,s := range spaceList {
         pi := models.PosInfo {
            SpaceNo: s.SpaceNo,
            PosNo: "",
            State: s.State,
         }
         if s.PlateNo != "" {
            pi.PlateNo = s.PlateNo
         } else if s.PlateNos != "" {
            pi.PlateNo = s.PlateNos
         }
         isMine := false
         if _,exist := myPlateNosMap[pi.PlateNo]; exist {
            isMine = true
         }
         pi.IsMine = isMine
         if v,ok := models.SpaceNo2Pos[s.SpaceNo];ok {
            pi.PosNo = v
         }
         resultList = append(resultList, pi)
      }
   }
   if len(resultList) == 0 {
      for i:=1;i<91;i++ {
         pi := models.PosInfo {
            SpaceNo: strconv.Itoa(i),
            PosNo: "",
            State: 1,
            PlateNo: "",
            IsMine: false,
         }
         resultList = append(resultList, pi)
      }
   }
   return resultList
}
func (sv *CarService) BindCarSpace() bool {
   url := "/api/pms/v1/parking_space/car_bind/add"
   url := "/artemis/api/pms/v1/parking_space/car_bind/add"
   reqBody := map[string]interface{} {
      "spaceNos": "", //绑定的车位集
      "floorSyscode": "",//楼层唯一标识码
@@ -220,4 +226,229 @@
   }
   fmt.Println(url, reqBody)
   return true
}
type HikPerson struct {
   PersonId                    string              `json:"personId"`
   PersonName                  string              `json:"personName"`
   Gender                      int                 `json:"gender"`
   PhoneNo                     string              `json:"phoneNo"`
   JobNo                       string              `json:"jobNo"`
   OrgIndexCode                string              `json:"orgIndexCode"`
   CertificateType             string              `json:"certificateCode"`
   CertificateNo               string              `json:"certificateNo"`
   CreateTime                  string              `json:"createTime"`
   UpdateTime                  string              `json:"updateTime"`
   OrgPath                     string              `json:"orgPath"`
   OrgPathName                 string              `json:"orgPathName"`
   PersonPhone                 []HikPersonPhoto    `json:"personPhoto"`
}
type HikPersonPhoto struct {
   PersonPhotoIndexCode          string             `json:"personPhotoIndexCode"`
   PicUri                      string             `json:"picUri"`
   ServerIndexCode             string             `json:"serverIndexCode"`
   PersonId                   string             `json:"personId"`
}
func (sv *CarService) GetHikPersonList() []HikPerson {
   url := "/artemis/api/resource/v2/person/personList"
   pageSize := 1000
   reqBody := map[string]interface{} {
      "pageNo": 1,
      "pageSize": pageSize,
   }
   pageResult := sv.getHikPageResult(url, reqBody)
   if pageResult == nil {
      return nil
   }
   b,err := json.Marshal(pageResult.List)
   if err != nil {
      fmt.Println("marshal pageResult.List err:", err)
      return nil
   }
   var list []HikPerson
   if err = json.Unmarshal(b, &list);err != nil {
      fmt.Println("unmarshal err:", err)
      return nil
   }
   if pageResult.Total > pageSize {
      times := pageResult.Total / pageSize
      if pageResult.Total % pageSize > 0 {
         times++
      }
      for i:=1;i<times;i++ {
         tpr := sv.getHikPageResult(url, map[string]interface{}{
            "pageNo": i+1,
            "pageSize": pageSize,
         })
         if tpr != nil {
            tb,e := json.Marshal(tpr.List)
            if e != nil {
               fmt.Println("marshal tpr.List err:", e)
               continue
            }
            var tprList []HikPerson
            if e = json.Unmarshal(tb, &tprList);e ==nil {
               list = append(list, tprList...)
            } else {
               fmt.Println("unmarshal tprList err:", e)
            }
         } else {
            fmt.Println("total:", pageResult.Total, "tpr is nil")
         }
      }
   }
   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 {
      b, err := json.Marshal(result.Data)
      if err == nil {
         var pageResult vo.HikPageResult
         if err = json.Unmarshal(b, &pageResult); err == nil {
            return &pageResult
         } else {
            fmt.Println("unmarshal pageResult err:", err)
         }
      } else {
         fmt.Println("marshal result.Data err:", err)
      }
   } else {
      fmt.Println("result:", result)
   }
   return nil
}
type HikVehicle struct {
   VehicleId             string          `json:"vehicleId"`
   PlateNo             string          `json:"plateNo"`
   PersonId             string          `json:"personId"`
   RegionIndexCode       string          `json:"regionIndexCode"`
   PlateType             int          `json:"plateType"`
   PlateColor             int          `json:"plateColor"`
   VehicleType          int          `json:"vehicleType"`
   VehicleColor          int          `json:"vehicleColor"`
   Description          string          `json:"description"`
   CreateTime             string          `json:"createTime"`
   UpdateTime             string          `json:"updateTime"`
   RegionName             string          `json:"regionName"`
   RegionPath             string          `json:"regionPath"`
   RegionPathName          string          `json:"regionPathName"`
   IsBandPerson          int          `json:"isBandPerson"`
   PersonName             string          `json:"personName"`
   OrgPath             string          `json:"orgPath"`
   OrgPathName          string          `json:"orgPathName"`
}
//获取指定人员的车辆车牌信息
func (sv *CarService) GetVehicleListByPerson(personId string) []HikVehicle {
   url := "/artemis/api/resource/v2/vehicle/advance/vehicleList"
   reqBody := map[string]interface{} {
      "pageNo": 1,
      "pageSize": 1000,
   }
   if personId != "" {
      reqBody["personIds"] = personId
   }
   pageResult := sv.getHikPageResult(url, reqBody)
   if pageResult ==nil {
      fmt.Println("GetVehicleListByPerson pageResult is nil")
      return nil
   }
   b, err := json.Marshal(pageResult.List)
   if err == nil {
      var list []HikVehicle
      if err = json.Unmarshal(b, &list);err == nil {
         return list
      } else {
         fmt.Println("unmarshal err:", err)
      }
   }
   return nil
}
//过车记录
type CrossRecord struct {
   CrossRecordSyscode          string        `json:"crossRecordSyscode"`
   parkSyscode                 string        `json:"parkSyscode"`
   ParkName                    string        `json:"parkName"`
   EntranceSyscode             string        `json:"entranceSyscode"`
   EntranceName                string        `json:"entranceName"`
   RoadwaySyscode              string        `json:"roadwaySyscode"`
   RoadwayName                 string        `json:"roadwayName"`
   VehicleOut                  int           `json:"vehicleOut"`
   ReleaseMode                 int           `json:"releaseMode"`
   ReleaseResult               int           `json:"releaseResult"`
   ReleaseWay                  int           `json:"releaseWay"`
   ReleaseReason               int           `json:"releaseReason"`
   PlateNo                     string        `json:"plateNo"`
   CardNo                      string        `json:"cardNo"`
   //VehicleColor              int             `json:"vehicleColor"`
   //VehicleType               int             `json:"vehicleType"`
   //PlateColor                int             `json:"plateColor"`
   //PlateType                 int             `json:"plateType"`
   //CarCategory               string          `json:"carCategory"`
   //CarCategoryName           string          `json:"carCategoryName"`
   VehiclePicUri               string        `json:"vehiclePicUri"`
   PlateNoPicUri               string        `json:"plateNoPicUri"`
   FacePicUri                  string        `json:"facePicUri"`
   AswSyscode                  string        `json:"aswSyscode"`
   CrossTime                   string        `json:"crossTime"`
   CreateTime                  string        `json:"createTime"`
}
func (sv *CarService) CrossRecords() []CrossRecord {
   url := "/artemis/api/pms/v1/crossRecords/page"
   reqBody := map[string]interface{} {
      "pageNo": 1,
      "pageSize": 100,
   }
   pageResult := sv.getHikPageResult(url, reqBody)
   if pageResult ==nil {
      return nil
   }
   b, err := json.Marshal(pageResult.List)
   if err == nil {
      var list []CrossRecord
      if err = json.Unmarshal(b, &list);err == nil {
         return list
      }
   }
   return nil
}