195 lines
5.1 KiB
Go
195 lines
5.1 KiB
Go
package api
|
||
|
||
import (
|
||
"fmt"
|
||
"github.com/gin-gonic/gin"
|
||
"go_backend/internal/dbs"
|
||
"go_backend/internal/model"
|
||
"gorm.io/gorm"
|
||
"strconv"
|
||
)
|
||
|
||
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"`
|
||
CreateTime string `json:"create_time"`
|
||
DeletedTime string `json:"deleted_time"`
|
||
UpdateTime string `json:"update_time"`
|
||
ChildVO []*CameraVO `json:"child"`
|
||
}
|
||
|
||
func GetAllCamerasIncludeFolder(router *gin.RouterGroup) {
|
||
router.GET("/camerasList", func(c *gin.Context) {
|
||
db := dbs.GetGormDB()
|
||
cameraVOList, _ := getCameraListMethod(false, db)
|
||
Success(c, cameraVOList)
|
||
})
|
||
}
|
||
|
||
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)
|
||
}
|
||
Success(c, cameraVOList)
|
||
})
|
||
}
|
||
|
||
func getCameraListMethod(isCameraOnly bool, db *gorm.DB) ([]*CameraVO, []*model.Camera) {
|
||
cameras := make([]model.Camera, 0)
|
||
db.Find(&cameras)
|
||
|
||
cameraMap := make(map[int][]model.Camera)
|
||
|
||
for _, camera := range cameras {
|
||
cameraMap[int(camera.ViewPriority)] = append(cameraMap[(int(camera.ViewPriority))], camera)
|
||
}
|
||
|
||
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 {
|
||
cameraVOList = append(cameraVOList, &vo)
|
||
}
|
||
cameraRecord[int(camera.ID)] = &vo
|
||
}
|
||
level += 1
|
||
continue
|
||
}
|
||
|
||
if priority == level {
|
||
tempRecord := make(map[int]*CameraVO)
|
||
|
||
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)
|
||
}
|
||
}
|
||
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
|
||
}
|
||
}
|
||
cameraRecord = tempRecord
|
||
level += 1
|
||
}
|
||
}
|
||
return cameraVOList, cameraList
|
||
}
|
||
|
||
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()
|
||
db.Create(&newNode)
|
||
Success(c, "success")
|
||
})
|
||
}
|
||
|
||
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
|
||
}
|