intelligent_monitoring_backend/Code/backend/internal/api/camera.go

195 lines
5.1 KiB
Go
Raw Normal View History

2024-10-24 23:11:29 +08:00
package api
import (
"fmt"
"github.com/gin-gonic/gin"
"go_backend/internal/dbs"
"go_backend/internal/model"
2024-11-07 22:12:34 +08:00
"gorm.io/gorm"
"strconv"
2024-10-24 23:11:29 +08:00
)
type CameraVO struct {
ID int32 `json:"id"`
CameraID string `json:"camera_id"`
DisplayName string `json:"display_name"`
ParentCategoryID []int `json:"parent_category_id"`
ViewPriority int32 `json:"view_priority"`
Status string `json:"status"`
Type string `json:"type"`
IPAddress string `json:"ip_address"`
IsDeleted bool `json:"is_deleted"`
2024-10-25 13:26:27 +08:00
CreateTime string `json:"create_time"`
DeletedTime string `json:"deleted_time"`
UpdateTime string `json:"update_time"`
2024-10-24 23:11:29 +08:00
ChildVO []*CameraVO `json:"child"`
}
2024-11-07 22:12:34 +08:00
func GetAllCamerasIncludeFolder(router *gin.RouterGroup) {
2024-10-24 23:11:29 +08:00
router.GET("/camerasList", func(c *gin.Context) {
db := dbs.GetGormDB()
2024-11-07 22:12:34 +08:00
cameraVOList, _ := getCameraListMethod(false, db)
Success(c, cameraVOList)
})
}
2024-10-24 23:11:29 +08:00
2024-11-07 22:12:34 +08:00
func GetAllCameras(router *gin.RouterGroup) {
router.GET("/camerasOnly", func(c *gin.Context) {
db := dbs.GetGormDB()
_, cameraList := getCameraListMethod(true, db)
cameraVOList := make([]*CameraVO, 0)
for _, camera := range cameraList {
// 查看缓存Map中有无对应address有的话直接读取
var address string
cameraId, _ := strconv.Atoi(camera.CameraID)
if _, exists := Camera2AddressMap[cameraId]; exists {
address = Camera2AddressMap[cameraId]
} else {
address = mergeAddress(*camera, db)
Camera2AddressMap[cameraId] = address
}
vo := transVO(*camera)
vo.DisplayName = address
cameraVOList = append(cameraVOList, &vo)
2024-10-24 23:11:29 +08:00
}
2024-11-07 22:12:34 +08:00
Success(c, cameraVOList)
})
}
2024-10-24 23:11:29 +08:00
2024-11-07 22:12:34 +08:00
func getCameraListMethod(isCameraOnly bool, db *gorm.DB) ([]*CameraVO, []*model.Camera) {
cameras := make([]model.Camera, 0)
db.Find(&cameras)
cameraMap := make(map[int][]model.Camera)
2024-10-24 23:11:29 +08:00
2024-11-07 22:12:34 +08:00
for _, camera := range cameras {
cameraMap[int(camera.ViewPriority)] = append(cameraMap[(int(camera.ViewPriority))], camera)
}
2024-10-24 23:11:29 +08:00
2024-11-07 22:12:34 +08:00
cameraList := make([]*model.Camera, 0)
cameraVOList := make([]*CameraVO, 0)
level := 0
cameraRecord := make(map[int]*CameraVO)
for priority, cameraArray := range cameraMap {
if priority == 0 {
for _, camera := range cameraArray {
vo := transVO(camera)
if isCameraOnly {
if camera.Type == "camera" {
cameraList = append(cameraList, &camera)
}
} else {
2024-10-24 23:11:29 +08:00
cameraVOList = append(cameraVOList, &vo)
}
2024-11-07 22:12:34 +08:00
cameraRecord[int(camera.ID)] = &vo
2024-10-24 23:11:29 +08:00
}
2024-11-07 22:12:34 +08:00
level += 1
continue
}
if priority == level {
tempRecord := make(map[int]*CameraVO)
2024-10-24 23:11:29 +08:00
2024-11-07 22:12:34 +08:00
for _, camera := range cameraArray {
vo := transVO(camera)
parentId := vo.ParentCategoryID[len(vo.ParentCategoryID)-1]
if pointer, exists := cameraRecord[parentId]; exists {
if isCameraOnly {
if camera.Type == "camera" {
cameraList = append(cameraList, &camera)
2024-10-24 23:11:29 +08:00
}
}
2024-11-07 22:12:34 +08:00
pointer.ChildVO = append(pointer.ChildVO, &vo)
newParent := make([]int, 0)
for _, id := range pointer.ParentCategoryID {
newParent = append(newParent, id)
}
newParent = append(newParent, parentId)
vo.ParentCategoryID = newParent
tempRecord[int(vo.ID)] = &vo
2024-10-24 23:11:29 +08:00
}
}
2024-11-07 22:12:34 +08:00
cameraRecord = tempRecord
level += 1
2024-10-24 23:11:29 +08:00
}
2024-11-07 22:12:34 +08:00
}
return cameraVOList, cameraList
2024-10-24 23:11:29 +08:00
}
type Node struct {
ParentID int `json:"parent_id"`
DisplayName string `json:"display_name"`
Ip string `json:"ip"`
}
func CreateNode(router *gin.RouterGroup) {
router.POST("/camera/addNode", func(c *gin.Context) {
var req Node
err := c.ShouldBindJSON(&req)
if err != nil {
fmt.Println("ctx.ShouldBindJSON err: ", err)
c.JSON(400, gin.H{"error": err.Error()})
return
}
newNode := model.Camera{
ParentCategoryID: int32(req.ParentID),
DisplayName: req.DisplayName,
IPAddress: req.Ip,
}
db := dbs.GetGormDB()
2024-10-25 13:26:27 +08:00
db.Create(&newNode)
Success(c, "success")
2024-10-24 23:11:29 +08:00
})
}
type ModifyNodeData struct {
Id int `json:"id"`
DisplayName string `json:"display_name"`
Ip string `json:"ip"`
}
func ModifyNode(router *gin.RouterGroup) {
router.POST("/camera/modify", func(c *gin.Context) {
var req ModifyNodeData
err := c.ShouldBindJSON(&req)
if err != nil {
fmt.Println("ctx.ShouldBindJSON err: ", err)
c.JSON(400, gin.H{"error": err.Error()})
return
}
node := model.Camera{
ID: int32(req.Id),
IPAddress: req.Ip,
}
if req.DisplayName != "" {
node.DisplayName = req.DisplayName
}
db := dbs.GetGormDB()
result := db.Updates(&node)
Success(c, result)
})
}
func transVO(camera model.Camera) CameraVO {
vo := CameraVO{
ID: camera.ID,
CameraID: camera.CameraID,
DisplayName: camera.DisplayName,
ParentCategoryID: make([]int, 1),
ViewPriority: camera.ViewPriority,
Status: camera.Status,
Type: camera.Type,
IPAddress: camera.IPAddress,
IsDeleted: camera.IsDeleted,
CreateTime: camera.CreateTime,
DeletedTime: camera.DeletedTime,
UpdateTime: camera.UpdateTime,
ChildVO: make([]*CameraVO, 0),
}
vo.ParentCategoryID[0] = int(camera.ParentCategoryID)
return vo
}