package service import ( "city_chips/internal/model" "city_chips/internal/repository" "encoding/json" "errors" "strings" "github.com/spf13/viper" "github.com/zxbit2011/hikvisionOpenAPIGo" ) type HikvisionService interface { Hikvision(url string, body map[string]string, timeout int) (hikvisionOpenAPIGo.Result, error) DeviceResource(Device string) (error, model.DeviceResource) GetRegionsRoot() (error, model.RegionsRoot) GetRegionsSubRegions(pageNo, pageSize string) (error, model.RegionsSubRegions) GetVqdByIndexCodes(pageNo, pageSize string, indexCodes []string) (error, model.VqdList) GetCameraOnline(regionId, includeSubNode, status, pageNo, pageSize string, indexCodes []string) (error, model.CameraOnline) GetRecordList(beginTime, endTime, pageNo, pageSize string, indexCodes []string) (error, model.RecordList) GetCamerasList(pageNo, pageSize string) (error, model.Cameras) GetVisitingRecords(receptionistId, receptionistName, visitorName, pageNo, pageSize string) (error, model.VisitingRecords) GetVisitorTypeInfo(pageNo, pageSize string) (error, model.VisitorTypeInfo) GetAppointmentRecords(receptionistId, visitorName, phoneNo, pageNo, pageSize string) (error, model.VisitorTypeInfo) GetVisitorTypeList() (error, model.VisitorTypeList) GetTurnoverSearch(pageNo, pageSize string) (error, model.TurnoverSearch) } func NewHikvisionService(service *Service, hikvisionRepository repository.HikvisionRepository, conf *viper.Viper) HikvisionService { return &hikvisionService{ Service: service, hikvisionRepository: hikvisionRepository, conf: conf, } } type hikvisionService struct { *Service hikvisionRepository repository.HikvisionRepository conf *viper.Viper } // Hikvision 海康威视对接 func (s *hikvisionService) Hikvision(url string, body map[string]string, timeout int) (hikvisionOpenAPIGo.Result, error) { config := hikvisionOpenAPIGo.HKConfig{ Ip: s.conf.GetString("hikvision.Ip"), Port: s.conf.GetInt("hikvision.Port"), AppKey: s.conf.GetString("hikvision.AppKey"), Secret: s.conf.GetString("hikvision.Secret"), IsHttps: s.conf.GetBool("hikvision.IsHttps"), } result, err := config.HttpPost(url, body, timeout) return result, err } // DeviceResource 根据设备类型获取设备资源 func (s *hikvisionService) DeviceResource(Device string) (error, model.DeviceResource) { var deviceResource model.DeviceResource m := make(map[string]string) m["pageNo"] = "1" m["pageSize"] = s.conf.GetString("hikvision.pageSize") m["resourceType"] = Device hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.deviceResource"), m, 15) if err != nil { return errors.New("获取设备资源失败"), deviceResource } if hikvision.Code != "0" { return errors.New("获取设备资源失败"), deviceResource } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), deviceResource } err = json.Unmarshal(marshalString, &deviceResource) if err != nil { return errors.New("json反序列化失败"), deviceResource } return nil, deviceResource } // GetRegionsRoot 获取根目录资源信息 func (s *hikvisionService) GetRegionsRoot() (error, model.RegionsRoot) { var regionsRoot model.RegionsRoot hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.regionsRoot"), nil, 15) if err != nil { return errors.New("获取根目录资源失败"), regionsRoot } if hikvision.Code != "0" { return errors.New("获取根目录资源失败"), regionsRoot } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), regionsRoot } err = json.Unmarshal(marshalString, ®ionsRoot) if err != nil { return errors.New("json反序列化失败"), regionsRoot } return nil, regionsRoot } // GetRegionsSubRegions 获取子目录资源信息 func (s *hikvisionService) GetRegionsSubRegions(pageNo, pageSize string) (error, model.RegionsSubRegions) { var regionsSubRegions model.RegionsSubRegions m := make(map[string]string) if pageNo != "" { m["pageNo"] = pageNo } else { m["pageNo"] = "1" } if pageSize != "" { m["pageSize"] = pageSize } else { m["pageSize"] = s.conf.GetString("hikvision.pageSize") } m["parentIndexCode"] = "0" m["resourceType"] = "0" m["cascadeFlag"] = "0" hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.regionsSubRegions"), m, 15) if err != nil { return errors.New("获取子目录资源信息失败"), regionsSubRegions } if hikvision.Code != "0" { return errors.New("获取子目录资源信息失败"), regionsSubRegions } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), regionsSubRegions } err = json.Unmarshal(marshalString, ®ionsSubRegions) if err != nil { return errors.New("json反序列化失败"), regionsSubRegions } return nil, regionsSubRegions } // GetVqdByIndexCodes 根据监控点列表查询视频质量诊断结果 func (s *hikvisionService) GetVqdByIndexCodes(pageNo, pageSize string, indexCodes []string) (error, model.VqdList) { var vqdlist model.VqdList // 获取门禁状态 m := make(map[string]string) if pageNo != "" { m["pageNo"] = pageNo } else { m["pageNo"] = "1" } if pageSize != "" { m["pageSize"] = pageSize } else { m["pageSize"] = s.conf.GetString("hikvision.pageSize") } m["indexCodes"] = strings.Join(indexCodes, ",") hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.vqdList"), m, 15) if err != nil { return errors.New("获取视频质量诊断信息失败"), vqdlist } if hikvision.Code != "0" { return errors.New("获取视频质量诊断失败"), vqdlist } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), vqdlist } err = json.Unmarshal(marshalString, &vqdlist) if err != nil { return errors.New("json反序列化失败"), vqdlist } return nil, vqdlist } // GetCameraOnline 获取监控点在线状态 // // regionId string false 区域编号,可从查询区域列表v2接口获取返回参数indexCode // includeSubNode string false 是否包含下级,1包含,0不包含(若regionId为空,则该参数不起作用) // indexCodes string[] false 监控点编码集,最大500,查询监控点列表接口获取返回参数cameraIndexCode // status string false 状态,1-在线,0-离线,-1-未检测 func (s *hikvisionService) GetCameraOnline(regionId, includeSubNode, status, pageNo, pageSize string, indexCodes []string) (error, model.CameraOnline) { var cameraOnline model.CameraOnline // 获取门禁状态 m := make(map[string]string) if pageNo != "" { m["pageNo"] = pageNo } else { m["pageNo"] = "1" } if pageSize != "" { m["pageSize"] = pageSize } else { m["pageSize"] = s.conf.GetString("hikvision.pageSize") } if regionId != "" { m["regionId"] = regionId } if includeSubNode != "" { m["includeSubNode"] = includeSubNode } if status != "" { m["status"] = status } if len(indexCodes) > 0 { m["indexCodes"] = strings.Join(indexCodes, ",") } hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.getCameraOnline"), m, 15) if err != nil { return errors.New("获取监控点在线状态信息失败"), cameraOnline } if hikvision.Code != "0" { return errors.New("获取监控点在线状态失败"), cameraOnline } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), cameraOnline } err = json.Unmarshal(marshalString, &cameraOnline) if err != nil { return errors.New("json反序列化失败"), cameraOnline } return nil, cameraOnline } // GetRecordList 根据监控点列表查询录像完整性结果 // pageNo integer true 当前页码,0 < pageNo // pageSize integer true 分页大小,0 0 { m["indexCodes"] = strings.Join(indexCodes, ",") } hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.recordList"), m, 15) if err != nil { return errors.New("获取监控点列表查询录像完整性失败"), recordList } if hikvision.Code != "0" { return errors.New("获取监控点列表查询录像完整性失败"), recordList } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), recordList } err = json.Unmarshal(marshalString, &recordList) if err != nil { return errors.New("json反序列化失败"), recordList } return nil, recordList } // GetCamerasList 分页获取监控点资源 func (s *hikvisionService) GetCamerasList(pageNo, pageSize string) (error, model.Cameras) { var cameras model.Cameras // 获取门禁状态 m := make(map[string]string) if pageNo != "" { m["pageNo"] = pageNo } else { m["pageNo"] = "1" } if pageSize != "" { m["pageSize"] = pageSize } else { m["pageSize"] = s.conf.GetString("hikvision.pageSize") } hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.cameras"), m, 15) if err != nil { return errors.New("获取监控点列表查询录像完整性失败"), cameras } if hikvision.Code != "0" { return errors.New("获取监控点列表查询录像完整性失败"), cameras } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), cameras } err = json.Unmarshal(marshalString, &cameras) if err != nil { return errors.New("json反序列化失败"), cameras } return nil, cameras } // GetVisitingRecords 查询访客来访记录v2 // receptionistId 被访人唯一标识 // receptionistName 被访人姓名 // visitorName 访客名称 func (s *hikvisionService) GetVisitingRecords(receptionistId, receptionistName, visitorName, pageNo, pageSize string) (error, model.VisitingRecords) { var visitingRecords model.VisitingRecords // 获取门禁状态 m := make(map[string]string) if pageNo != "" { m["pageNo"] = pageNo } else { m["pageNo"] = "1" } if pageSize != "" { m["pageSize"] = pageSize } else { m["pageSize"] = s.conf.GetString("hikvision.pageSize") } if receptionistId != "" { m["receptionistId"] = receptionistId } if receptionistName != "" { m["receptionistName"] = receptionistName } if visitorName != "" { m["visitorName"] = visitorName } hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.visitingRecords"), m, 15) if err != nil { return errors.New("获取查询访客来访记录失败"), visitingRecords } if hikvision.Code != "0" { return errors.New("获取查询访客来访记录失败"), visitingRecords } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), visitingRecords } err = json.Unmarshal(marshalString, &visitingRecords) if err != nil { return errors.New("json反序列化失败"), visitingRecords } return nil, visitingRecords } // GetVisitorTypeInfo 查询访客类型 func (s *hikvisionService) GetVisitorTypeInfo(pageNo, pageSize string) (error, model.VisitorTypeInfo) { var visitorTypeInfo model.VisitorTypeInfo // 获取门禁状态 m := make(map[string]string) if pageNo != "" { m["pageNo"] = pageNo } else { m["pageNo"] = "1" } if pageSize != "" { m["pageSize"] = pageSize } else { m["pageSize"] = s.conf.GetString("hikvision.pageSize") } hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.visitorTypeInfo"), m, 15) if err != nil { return errors.New("获取查询访客类型失败"), visitorTypeInfo } if hikvision.Code != "0" { return errors.New("获取查询访客类型失败"), visitorTypeInfo } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), visitorTypeInfo } err = json.Unmarshal(marshalString, &visitorTypeInfo) if err != nil { return errors.New("json反序列化失败"), visitorTypeInfo } return nil, visitorTypeInfo } // GetAppointmentRecords 查询预约记录v2 // receptionistId 被访人唯一标识 // visitorName 访客名称 // phoneNo 手机号码 func (s *hikvisionService) GetAppointmentRecords(receptionistId, visitorName, phoneNo, pageNo, pageSize string) (error, model.VisitorTypeInfo) { var visitorTypeInfo model.VisitorTypeInfo // 获取门禁状态 m := make(map[string]string) if pageNo != "" { m["pageNo"] = pageNo } else { m["pageNo"] = "1" } if pageSize != "" { m["pageSize"] = pageSize } else { m["pageSize"] = s.conf.GetString("hikvision.pageSize") } if receptionistId != "" { m["receptionistId"] = receptionistId } if visitorName != "" { m["visitorName"] = visitorName } if phoneNo != "" { m["phoneNo"] = phoneNo } hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.visitorTypeInfo"), m, 15) if err != nil { return errors.New("获取查询预约记录失败"), visitorTypeInfo } if hikvision.Code != "0" { return errors.New("获取查询预约记录失败"), visitorTypeInfo } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), visitorTypeInfo } err = json.Unmarshal(marshalString, &visitorTypeInfo) if err != nil { return errors.New("json反序列化失败"), visitorTypeInfo } return nil, visitorTypeInfo } // GetVisitorTypeList 查询全部访客类型 func (s *hikvisionService) GetVisitorTypeList() (error, model.VisitorTypeList) { var visitorTypeList model.VisitorTypeList // 获取门禁状态 hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.visitorTypeInfo"), nil, 15) if err != nil { return errors.New("获取访客类型失败"), visitorTypeList } if hikvision.Code != "0" { return errors.New("获取访客类型失败"), visitorTypeList } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), visitorTypeList } err = json.Unmarshal(marshalString, &visitorTypeList) if err != nil { return errors.New("json反序列化失败"), visitorTypeList } return nil, visitorTypeList } // GetTurnoverSearch 查询访客出入事件 func (s *hikvisionService) GetTurnoverSearch(pageNo, pageSize string) (error, model.TurnoverSearch) { var turnoverSearch model.TurnoverSearch m := make(map[string]string) if pageNo != "" { m["pageNo"] = pageNo } else { m["pageNo"] = "1" } if pageSize != "" { m["pageSize"] = pageSize } else { m["pageSize"] = s.conf.GetString("hikvision.pageSize") } // 获取门禁状态 hikvision, err := s.Hikvision(s.conf.GetString("hikvision.api.turnoverSearch"), m, 15) if err != nil { return errors.New("获取访客出入事件失败"), turnoverSearch } if hikvision.Code != "0" { return errors.New("获取访客出入事件失败"), turnoverSearch } marshalString, err := json.Marshal(hikvision) if err != nil { return errors.New("json序列化失败"), turnoverSearch } err = json.Unmarshal(marshalString, &turnoverSearch) if err != nil { return errors.New("json反序列化失败"), turnoverSearch } return nil, turnoverSearch }