Forráskód Böngészése

海康威视api接口,楼控接口

huangyan 3 hete
szülő
commit
5f6bd7ef07

BIN
cmd/server/city_chips


+ 8 - 0
config/local.yml

@@ -53,6 +53,14 @@ hikvision:
     eventLogs: "/artemis/api/scpms/v2/eventLogs/searches" #入侵报警事件日志查询
     regionsRoot: "/artemis/api/resource/v1/regions/root" #获取区域树接口
     regionsSubRegions: "/artemis/api/resource/v2/regions/subRegions" #根据区域编号获取下一级区域列表v2
+    vqdList: "/artemis/api/nms/v1/vqd/list" #根据监控点列表查询视频质量诊断结果
+    getCameraOnline: "/artemis/api/nms/v1/online/camera/get" #获取监控点在线状态
+    recordList: "/artemis/api/nms/v1/record/list" #根据监控点列表查询录像完整性结果
+    visitingRecords: "/artemis/api/visitor/v2/visiting/records" #查询访客来访记录v2
+    visitorTypeInfo: "/artemis/api/visitor/v1/visitorTypeInfo" #查询访客类型
+    appointmentRecords: "/artemis/api/visitor/v2/appointment/records" #查询访客预约记录v2
+    visitorTypeList: "/artemis/api/v1/visitorData/visitorTypeList" #查询全部访客类型
+    turnoverSearch: "/artemis/api/visitor/v1/event/turnover/search" #查询访客出入事件
 
 #会议系统
 conference:

+ 44 - 0
internal/handler/accesscontrol.go

@@ -146,3 +146,47 @@ func (h *AccessControlHandler) GetParkingLotInfo(ctx *gin.Context) {
 		}
 	}
 }
+
+// GetDriveway 获取车位
+func (h *AccessControlHandler) GetDriveway(ctx *gin.Context) {
+	// 设置响应头
+	ctx.Header("Content-Type", "text/event-stream")
+	ctx.Header("Cache-Control", "no-cache")
+	ctx.Header("Connection", "keep-alive")
+	// 监听客户端断开连接
+	conn := true
+	notify := ctx.Writer.CloseNotify()
+	type Response struct {
+		RequestId string `protobuf:"bytes,1,opt,name=requestId,proto3" json:"requestId,omitempty"`
+		Code      int32  `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"`
+		Msg       string `protobuf:"bytes,3,opt,name=msg,proto3" json:"msg,omitempty"`
+		Data      any    `json:"data"`
+	}
+	stationNo := ctx.Query("id")
+	if len(stationNo) == 0 {
+		resp.HandleError(ctx, 1201, "缺少必要参数", nil)
+		return
+	}
+	var response Response
+	for conn {
+		select {
+		case <-notify:
+			conn = false
+			fmt.Println("断开连接")
+			return
+		default:
+			// 模拟数据
+			data := make(map[string]any)
+			response.Code = 200
+			response.RequestId = stationNo
+			response.Msg = "success"
+			data["state"] = rand.Intn(2) // // 1开  0关  2故障
+			data["车位编号"] = model.GetRandomItem(model.Locations)
+			response.Data = data
+			res, _ := json.Marshal(&response)
+			fmt.Fprintf(ctx.Writer, "data: %s\n\n", string(res))
+			ctx.Writer.Flush()
+			time.Sleep(10 * time.Second)
+		}
+	}
+}

+ 8 - 2
internal/handler/hikvision.go

@@ -58,7 +58,13 @@ func (h *HikvisionHandler) GetMonitor(ctx *gin.Context) {
 		monitor = append(monitor, m2)
 		monitornms = append(monitornms, nms)
 	}
-	m["MonitorCount"] = rand.Intn(1000)       //摄像头总数
+	//err, resource := h.hikvisionService.DeviceResource("camera")
+	//if err != nil {
+	//	resp.HandleError(ctx, 1201, "查询监控点数量失败", nil)
+	//	return
+	//}
+	//m["MonitorCount"] = resource.Data.Total   //监控点总数
+	m["MonitorCount"] = rand.Intn(1000)       //监控点总数
 	m["DeviceOnline"] = rand.Intn(1000)       //设备在线
 	m["DeviceOffline"] = rand.Intn(1000)      //设备离线
 	m["StorageCapacity"] = rand.Intn(1000)    //存储容量
@@ -179,7 +185,7 @@ func (h *HikvisionHandler) GetVisitor(ctx *gin.Context) {
 	resp.HandleSuccess(ctx, m)
 }
 
-// 客流统计
+// GetPassenger 客流统计
 func (h *HikvisionHandler) GetPassenger(ctx *gin.Context) {
 	m := make(map[string]any)
 	Type1 := make(map[string]any)

+ 1 - 1
internal/handler/illuminating.go

@@ -105,7 +105,7 @@ func (h *IlluminatingHandler) GetLightingstatus(ctx *gin.Context) {
 			response.Code = 200
 			response.RequestId = strconv.Itoa(rand.Intn(1000))
 			response.Msg = "success"
-			data["name"] = "设备一"
+			data["设备名称"] = model.GetRandomItem(model.IlluminatingDeviceNames)
 			data["state"] = rand.Intn(2) // 1开  0关  2故障
 			response.Data = data
 			res, _ := json.Marshal(&response)

+ 20 - 3
internal/handler/intelligentbuildingcontrol.go

@@ -50,7 +50,12 @@ func (h *IntelligentBuildingControlHandler) GetIntelligentBuildingControl(ctx *g
 		alarm := generateAlarm()
 		device = append(device, alarm)
 	}
-	m["DeviceCount"] = rand.Intn(100) //设备总数
+	count, err := h.intelligentBuildingControlService.DeviceCount()
+	if err != nil {
+		resp.HandleError(ctx, 1201, "查询设备总数失败", nil)
+		return
+	}
+	m["DeviceCount"] = count          //设备总数
 	m["StopState"] = rand.Intn(100)   //停止状态
 	m["RunState"] = rand.Intn(100)    //运行状态
 	m["FaultState"] = rand.Intn(1000) //故障状态
@@ -58,7 +63,7 @@ func (h *IntelligentBuildingControlHandler) GetIntelligentBuildingControl(ctx *g
 	resp.HandleSuccess(ctx, m)
 }
 
-// 获取点位数据
+// GetPoint 获取点位数据
 func (h *IntelligentBuildingControlHandler) GetPoint(ctx *gin.Context) {
 	pointName := ctx.PostForm("pointName")
 	deviceType := ctx.PostForm("deviceType")
@@ -95,7 +100,7 @@ func (h *IntelligentBuildingControlHandler) GetPoint(ctx *gin.Context) {
 	resp.HandleSuccess(ctx, points)
 }
 
-// 获取点位类型
+// GetPointType 获取点位类型
 func (h *IntelligentBuildingControlHandler) GetPointType(ctx *gin.Context) {
 	points, err := h.intelligentBuildingControlService.GetPointType()
 	if err != nil {
@@ -104,3 +109,15 @@ func (h *IntelligentBuildingControlHandler) GetPointType(ctx *gin.Context) {
 	}
 	resp.HandleSuccess(ctx, points)
 }
+func (h *IntelligentBuildingControlHandler) GetDeviceType(ctx *gin.Context) {
+	points, err := h.intelligentBuildingControlService.GetPointType()
+	if err != nil {
+		resp.HandleError(ctx, 1201, "查询设备类型失败", nil)
+		return
+	}
+	m := make(map[string]string)
+	for _, v := range points {
+		m[v] = model.DeviceType[v]
+	}
+	resp.HandleSuccess(ctx, m)
+}

+ 259 - 0
internal/model/hikvision.go

@@ -215,6 +215,265 @@ type RegionsSubRegions struct {
 	} `json:"data"`
 }
 
+// VqdList 获取视频质量检测结果
+type VqdList struct {
+	Code string `json:"code"`
+	Msg  string `json:"msg"`
+	Data struct {
+		Total     int `json:"total"`
+		PageNo    int `json:"pageNo"`
+		PageSize  int `json:"pageSize"`
+		TotalPage int `json:"totalPage"`
+		List      []struct {
+			ScChromaResult   int    `json:"scChromaResult"`
+			ScSnowResult     int    `json:"scSnowResult"`
+			ScDarkResult     int    `json:"scDarkResult"`
+			InspectDate      string `json:"inspectDate"`
+			IndexCode        string `json:"indexCode"`
+			ScLumaResult     int    `json:"scLumaResult"`
+			ScFreezeResult   int    `json:"scFreezeResult"`
+			ScShakeResult    int    `json:"scShakeResult"`
+			Resolution       int    `json:"resolution"`
+			ScContrastResult int    `json:"scContrastResult"`
+			ScStreakResult   int    `json:"scStreakResult"`
+			PicUrl           string `json:"picUrl"`
+			ScFrameResult    int    `json:"scFrameResult"`
+			ScCoverResult    int    `json:"scCoverResult"`
+			ScSignalResult   int    `json:"scSignalResult"`
+			ScMonoResult     int    `json:"scMonoResult"`
+			InspectResult    int    `json:"inspectResult"`
+			ScBlurResult     int    `json:"scBlurResult"`
+			ScSceneResult    int    `json:"scSceneResult"`
+			ScFlashResult    int    `json:"scFlashResult"`
+		} `json:"list"`
+	} `json:"data"`
+}
+
+// CameraOnline 获取监控点在线状态
+type CameraOnline struct {
+	Code string `json:"code"`
+	Msg  string `json:"msg"`
+	Data struct {
+		PageNo    int `json:"pageNo"`
+		PageSize  int `json:"pageSize"`
+		TotalPage int `json:"totalPage"`
+		Total     int `json:"total"`
+		List      []struct {
+			DeviceType      string      `json:"deviceType"`
+			DeviceIndexCode interface{} `json:"deviceIndexCode"`
+			RegionIndexCode string      `json:"regionIndexCode"`
+			CollectTime     time.Time   `json:"collectTime"`
+			RegionName      string      `json:"regionName"`
+			IndexCode       string      `json:"indexCode"`
+			Cn              string      `json:"cn"`
+			TreatyType      string      `json:"treatyType"`
+			Manufacturer    string      `json:"manufacturer"`
+			Ip              interface{} `json:"ip"`
+			Port            interface{} `json:"port"`
+			Online          int         `json:"online"`
+		} `json:"list"`
+	} `json:"data"`
+}
+
+type RecordList struct {
+	Code string `json:"code"`
+	Msg  string `json:"msg"`
+	Data struct {
+		Total    int `json:"total"`
+		PageNo   int `json:"pageNo"`
+		PageSize int `json:"pageSize"`
+		List     []struct {
+			IndexCode             string `json:"indexCode"`
+			Date                  string `json:"date"`
+			CollectTime           int64  `json:"collectTime"`
+			InspectionDate        string `json:"inspectionDate"`
+			Result                int    `json:"result"`
+			VideoClipstimeSegment []struct {
+				From int `json:"from"`
+				To   int `json:"to"`
+				Type int `json:"type"`
+			} `json:"videoClipstimeSegment"`
+			IntactDuration int `json:"intactDuration"`
+			PlanDuration   int `json:"planDuration"`
+		} `json:"list"`
+	} `json:"data"`
+}
+
+// Cameras CamerasList 获取摄像机列表
+type Cameras struct {
+	Code string `json:"code"`
+	Msg  string `json:"msg"`
+	Data struct {
+		Total    int `json:"total"`
+		PageNo   int `json:"pageNo"`
+		PageSize int `json:"pageSize"`
+		List     []struct {
+			Altitude                  string `json:"altitude"`
+			CameraIndexCode           string `json:"cameraIndexCode"`
+			CameraName                string `json:"cameraName"`
+			CameraType                int    `json:"cameraType"`
+			CameraTypeName            string `json:"cameraTypeName"`
+			CapabilitySet             string `json:"capabilitySet"`
+			CapabilitySetName         string `json:"capabilitySetName"`
+			IntelligentSet            string `json:"intelligentSet"`
+			IntelligentSetName        string `json:"intelligentSetName"`
+			ChannelNo                 string `json:"channelNo"`
+			ChannelType               string `json:"channelType"`
+			ChannelTypeName           string `json:"channelTypeName"`
+			CreateTime                string `json:"createTime"`
+			EncodeDevIndexCode        string `json:"encodeDevIndexCode"`
+			EncodeDevResourceType     string `json:"encodeDevResourceType"`
+			EncodeDevResourceTypeName string `json:"encodeDevResourceTypeName"`
+			GbIndexCode               string `json:"gbIndexCode"`
+			InstallLocation           string `json:"installLocation"`
+			KeyBoardCode              string `json:"keyBoardCode"`
+			Latitude                  string `json:"latitude"`
+			Longitude                 string `json:"longitude"`
+			Pixel                     int    `json:"pixel"`
+			Ptz                       int    `json:"ptz"`
+			PtzController             int    `json:"ptzController"`
+			PtzControllerName         string `json:"ptzControllerName"`
+			PtzName                   string `json:"ptzName"`
+			RecordLocation            string `json:"recordLocation"`
+			RecordLocationName        string `json:"recordLocationName"`
+			RegionIndexCode           string `json:"regionIndexCode"`
+			Status                    int    `json:"status"`
+			StatusName                string `json:"statusName"`
+			TransType                 int    `json:"transType"`
+			TransTypeName             string `json:"transTypeName"`
+			TreatyType                string `json:"treatyType"`
+			TreatyTypeName            string `json:"treatyTypeName"`
+			Viewshed                  string `json:"viewshed"`
+			UpdateTime                string `json:"updateTime"`
+		} `json:"list"`
+	} `json:"data"`
+}
+
+// VisitingRecords VisitingRecordsList 获取来访记录
+type VisitingRecords struct {
+	Code string `json:"code"`
+	Msg  string `json:"msg"`
+	Data struct {
+		Total    int `json:"total"`
+		PageNo   int `json:"pageNo"`
+		PageSize int `json:"pageSize"`
+		List     []struct {
+			VisitorName         string    `json:"visitorName"`
+			Gender              int       `json:"gender"`
+			CertificateType     int       `json:"certificateType"`
+			CertificateNo       string    `json:"certificateNo"`
+			PhoneNo             string    `json:"phoneNo"`
+			PlateNo             string    `json:"plateNo"`
+			PicUri              string    `json:"picUri"`
+			SvrIndexCode        string    `json:"svrIndexCode"`
+			VisitorStatus       int       `json:"visitorStatus"`
+			VerificationCode    string    `json:"verificationCode"`
+			VisiorGroupId       string    `json:"visiorGroupId"`
+			VisiorGroupName     string    `json:"visiorGroupName"`
+			ReceptionistId      string    `json:"receptionistId"`
+			ReceptionistName    string    `json:"receptionistName"`
+			ReceptionistCode    string    `json:"receptionistCode"`
+			VisitPurpose        string    `json:"visitPurpose"`
+			VisitStartTime      time.Time `json:"visitStartTime"`
+			VisitEndTime        time.Time `json:"visitEndTime"`
+			QRCode              string    `json:"QRCode"`
+			CertAddr            string    `json:"certAddr"`
+			CertIssuer          string    `json:"certIssuer"`
+			Birthplace          string    `json:"birthplace"`
+			VisitorWorkUnit     string    `json:"visitorWorkUnit"`
+			OrderId             string    `json:"orderId"`
+			VisitorAddress      string    `json:"visitorAddress"`
+			PersonNum           int       `json:"personNum"`
+			PlannedStartTime    time.Time `json:"plannedStartTime"`
+			PlannedEndTime      time.Time `json:"plannedEndTime"`
+			DesignatedResources []struct {
+				ParamKey    string   `json:"paramKey"`
+				ParamValues []string `json:"paramValues"`
+			} `json:"designatedResources"`
+			CardNo              string    `json:"cardNo"`
+			PrivilegeGroupNames []string  `json:"privilegeGroupNames"`
+			HealthCode          string    `json:"healthCode"`
+			ParkId              string    `json:"parkId"`
+			UpdateTime          time.Time `json:"updateTime"`
+			VisitorTemperature  string    `json:"visitorTemperature"`
+			VisitorInfoId       string    `json:"visitorInfoId"`
+		} `json:"list"`
+	} `json:"data"`
+}
+
+// VisitorTypeInfo VisitorTypeInfoList 获取来访类型信息
+type VisitorTypeInfo struct {
+	Code string `json:"code"`
+	Msg  string `json:"msg"`
+	Data struct {
+		Total    int `json:"total"`
+		PageNo   int `json:"pageNo"`
+		PageSize int `json:"pageSize"`
+		List     []struct {
+			VisitorTypeId   string `json:"visitorTypeId"`
+			VisitorTypeName string `json:"visitorTypeName"`
+			CreateTime      string `json:"createTime"`
+			Status          int    `json:"status"`
+			ParkId          string `json:"parkId"`
+			RemitRegister   string `json:"remitRegister"`
+		} `json:"list"`
+	} `json:"data"`
+}
+type VisitorTypeList struct {
+	Code string `json:"code"`
+	Msg  string `json:"msg"`
+	Data []struct {
+		ParkId          string `json:"parkId"`
+		RemitRegister   string `json:"remitRegister"`
+		VisitorTypeId   string `json:"visitorTypeId"`
+		VisitorTypeName string `json:"visitorTypeName"`
+	} `json:"data"`
+}
+
+// TurnoverSearch TurnoverSearchList 查询访客出入事件
+type TurnoverSearch struct {
+	Code string `json:"code"`
+	Msg  string `json:"msg"`
+	Data struct {
+		FirstPage       bool `json:"firstPage"`
+		HasNextPage     bool `json:"hasNextPage"`
+		HasPreviousPage bool `json:"hasPreviousPage"`
+		LastPage        bool `json:"lastPage"`
+		Page            int  `json:"page"`
+		PageSize        int  `json:"pageSize"`
+		Rows            []struct {
+			OrderId           string    `json:"orderId"`
+			VisitorName       string    `json:"visitorName"`
+			VisitorSex        int       `json:"visitorSex"`
+			VisitorGroupId    string    `json:"visitorGroupId"`
+			BeVisitPersonId   string    `json:"beVisitPersonId"`
+			BeVisitPersonName string    `json:"beVisitPersonName"`
+			CardNum           string    `json:"cardNum"`
+			CardType          int       `json:"cardType"`
+			DeviceIndexCode   string    `json:"deviceIndexCode"`
+			DeviceType        int       `json:"deviceType"`
+			DeviceDesc        string    `json:"deviceDesc"`
+			EventName         string    `json:"eventName"`
+			EventId           string    `json:"eventId"`
+			PhoneNum          string    `json:"phoneNum"`
+			CarNumber         string    `json:"carNumber"`
+			IdentityId        int       `json:"identityId"`
+			IdentityNum       string    `json:"identityNum"`
+			VisitorPhotoUri   string    `json:"visitorPhotoUri"`
+			IdentityPhotoUri  string    `json:"identityPhotoUri"`
+			VisitorSvrCode    string    `json:"visitorSvrCode"`
+			IdentitySvrCode   string    `json:"identitySvrCode"`
+			EventTime         time.Time `json:"eventTime"`
+			VisitStartTime    time.Time `json:"visitStartTime"`
+			VisitEndTime      time.Time `json:"visitEndTime"`
+			VisitRegisterTime time.Time `json:"visitRegisterTime"`
+			VisitRealEndTime  time.Time `json:"visitRealEndTime"`
+		} `json:"rows"`
+		Total     int `json:"total"`
+		TotalPage int `json:"totalPage"`
+	} `json:"data"`
+}
+
 var ResourceType = map[string]string{
 	"region":                "区域",
 	"acsDevice":             "门禁控制器",

+ 8 - 0
internal/model/intelligentbuildingcontrol.go

@@ -22,6 +22,14 @@ type Point struct {
 	PointName  string `json:"point_name" gorm:"column:point_name;type:varchar(100);comment:点位名称"`
 }
 
+// DeviceType 设备类型对应表
+var DeviceType = map[string]string{
+	"JSK": "集水坑",
+	"AHU": "空调机组",
+	"PAU": "新风机组",
+	"EAF": "送排风机",
+}
+
 func (p *Point) TableName() string {
 	return "point"
 }

+ 21 - 1
internal/repository/intelligentbuildingcontrol.go

@@ -10,6 +10,8 @@ type IntelligentBuildingControlRepository interface {
 	GetIntelligentBuildingControl(ctx context.Context, id int64) (*model.IntelligentBuildingControl, error)
 	GetPoint(conds map[string]any) (*[]model.Point, error)
 	GetPointType() ([]string, error)
+	DeviceType() ([]string, error)
+	DeviceCount() (int64, error)
 }
 
 func NewIntelligentBuildingControlRepository(
@@ -24,7 +26,25 @@ type intelligentBuildingControlRepository struct {
 	*Repository
 }
 
+func (r *intelligentBuildingControlRepository) DeviceCount() (int64, error) {
+	//TODO implement me
+	var count int64
+	err := r.db.Model(&model.Point{}).Count(&count).Error
+	if err != nil {
+		return 0, err
+	}
+	return count, nil
+}
+
 // GetPointType implements IntelligentBuildingControlRepository.
+func (r *intelligentBuildingControlRepository) DeviceType() ([]string, error) {
+	var names []string
+	err := r.db.Model(&model.Point{}).Select("device_type").Group("device_type").Find(&names).Error
+	if err != nil {
+		return nil, err
+	}
+	return names, nil
+}
 func (r *intelligentBuildingControlRepository) GetPointType() ([]string, error) {
 	var names []string
 	err := r.db.Model(&model.Point{}).Select("point_name").Group("point_name").Find(&names).Error
@@ -41,7 +61,7 @@ func (r *intelligentBuildingControlRepository) GetIntelligentBuildingControl(ctx
 	return &intelligentBuildingControl, nil
 }
 
-// 根据点位数据获取点位信息
+// GetPoint 根据点位数据获取点位信息
 func (r *intelligentBuildingControlRepository) GetPoint(conds map[string]any) (*[]model.Point, error) {
 	var points []model.Point
 	points, err := helper.QueryByConditions[model.Point](r.db, conds)

+ 1 - 0
internal/server/http.go

@@ -35,6 +35,7 @@ func NewServerHTTP(
 	{
 		Access.GET("/count", accessHandler.GetAccessControl)
 		Access.GET("/getParkingLotInfo", accessHandler.GetParkingLotInfo)
+		Access.GET("/getDriveway", accessHandler.GetDriveway)
 	}
 	//海康威视
 	Hikvision := r.Group("/Hikvision")

+ 367 - 4
internal/service/hikvision.go

@@ -5,6 +5,7 @@ import (
 	"city_chips/internal/repository"
 	"encoding/json"
 	"errors"
+	"strings"
 
 	"github.com/spf13/viper"
 	"github.com/zxbit2011/hikvisionOpenAPIGo"
@@ -12,6 +13,18 @@ import (
 
 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 {
@@ -67,7 +80,7 @@ func (s *hikvisionService) DeviceResource(Device string) (error, model.DeviceRes
 }
 
 // GetRegionsRoot 获取根目录资源信息
-func (s *hikvisionService) GetRegionsRoot(Device string) (error, model.RegionsRoot) {
+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 {
@@ -88,11 +101,19 @@ func (s *hikvisionService) GetRegionsRoot(Device string) (error, model.RegionsRo
 }
 
 // GetRegionsSubRegions 获取子目录资源信息
-func (s *hikvisionService) GetRegionsSubRegions(Device string) (error, model.RegionsSubRegions) {
+func (s *hikvisionService) GetRegionsSubRegions(pageNo, pageSize string) (error, model.RegionsSubRegions) {
 	var regionsSubRegions model.RegionsSubRegions
 	m := make(map[string]string)
-	m["pageNo"] = "1"
-	m["pageSize"] = s.conf.GetString("hikvision.pageSize")
+	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"
@@ -114,3 +135,345 @@ func (s *hikvisionService) GetRegionsSubRegions(Device string) (error, model.Reg
 	}
 	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<pageSize≤1000
+// beginTime		string	true	录像开始日期,IOS8601格式
+// endTime		string	true	录像结束日期,IOS8601格式
+// indexCodes		string[]	true	监控点编号集,
+// 查询监控点列表接口获取返回参数cameraIndexCode
+func (s *hikvisionService) GetRecordList(beginTime, endTime, pageNo, pageSize string, indexCodes []string) (error, model.RecordList) {
+	var recordList model.RecordList
+	// 获取门禁状态
+	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["beginTime"] = beginTime
+	m["endTime"] = endTime
+	if len(indexCodes) > 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
+}

+ 24 - 2
internal/service/intelligentbuildingcontrol.go

@@ -10,6 +10,8 @@ type IntelligentBuildingControlService interface {
 	GetIntelligentBuildingControl(ctx context.Context, id int64) (*model.IntelligentBuildingControl, error)
 	GetPoint(conds map[string]any) (*[]model.Point, error)
 	GetPointType() ([]string, error)
+	DeviceType() ([]string, error)
+	DeviceCount() (int64, error)
 }
 
 func NewIntelligentBuildingControlService(
@@ -27,7 +29,27 @@ type intelligentBuildingControlService struct {
 	intelligentBuildingControlRepository repository.IntelligentBuildingControlRepository
 }
 
-// GetPointType implements IntelligentBuildingControlService.
+// DeviceCount 获取设备总数
+func (s *intelligentBuildingControlService) DeviceCount() (int64, error) {
+	//TODO implement me
+	count, err := s.intelligentBuildingControlRepository.DeviceCount()
+	if err != nil {
+		return 0, err
+	}
+	return count, nil
+}
+
+// DeviceType 获取设备类型
+func (s *intelligentBuildingControlService) DeviceType() ([]string, error) {
+	//TODO implement me
+	poions, err := s.intelligentBuildingControlRepository.DeviceType()
+	if err != nil {
+		return nil, err
+	}
+	return poions, nil
+}
+
+// GetPointType 获取点位类型
 func (s *intelligentBuildingControlService) GetPointType() ([]string, error) {
 	poions, err := s.intelligentBuildingControlRepository.GetPointType()
 	if err != nil {
@@ -36,7 +58,7 @@ func (s *intelligentBuildingControlService) GetPointType() ([]string, error) {
 	return poions, nil
 }
 
-// GetPoint implements IntelligentBuildingControlService.
+// GetPoint 获取点位列表
 func (s *intelligentBuildingControlService) GetPoint(conds map[string]any) (*[]model.Point, error) {
 	points, err := s.intelligentBuildingControlRepository.GetPoint(conds)
 	if err != nil {