package controller import ( "encoding/base64" "gat1400Exchange/config" "gat1400Exchange/pkg" "gat1400Exchange/service" "net/http" "time" "gat1400Exchange/pkg/logger" "gat1400Exchange/repository" "gat1400Exchange/vo" "github.com/gin-gonic/gin" ) type CaptureController struct { Repository repository.CaptureRepository } // 构造函数 func NewCaptureController() CaptureController { svr := repository.NewCaptureRepository() controller := CaptureController{Repository: svr} return controller } // 批量提交人脸 func (a CaptureController) Faces(c *gin.Context) { var req vo.RequestFaceList if err := c.BindJSON(&req); err != nil { c.AbortWithStatus(http.StatusBadRequest) return } if len(req.FaceListObject.FaceObject) == 0 { c.AbortWithStatus(http.StatusBadRequest) return } face := req.FaceListObject.FaceObject[0] logger.Debug("Receive new message, Id:%s Ip:%s faceId:%s, LeftTopX:%d, appearTime:%s", c.RemoteIP(), face.DeviceID, face.FaceID, face.LeftTopX, face.FaceAppearTime) // 如果开启了下级, 身份应该是消息代理, 不再转发到服务器 if config.ClientConf.Enable && config.ServeConf.Role == "agent" { go a.Repository.VIIDMsgForward(&req) } else if config.ServeConf.Role == "cascade" { go service.AddFaceNotification(&face) } if config.ForwardConf.SyncServer != "" { go a.Repository.FaceForward(req.FaceListObject.FaceObject) } rspMsg := vo.ResponseStatus{ RequestURL: c.FullPath(), StatusCode: vo.StatusSuccess, StatusString: vo.StatusString[vo.StatusSuccess], Id: face.FaceID, LocalTime: time.Now().Format("20060102150405"), } c.JSON(http.StatusOK, gin.H{"ResponseStatusObject": rspMsg}) } func (a CaptureController) VideoLabels(c *gin.Context) { var req vo.RequestVideoLabelList if err := c.BindJSON(&req); err != nil { c.AbortWithStatus(http.StatusBadRequest) return } if len(req.VideoLabelListObject.VideoLabelObject) == 0 { c.AbortWithStatus(http.StatusBadRequest) return } videoLabel := req.VideoLabelListObject.VideoLabelObject[0] logger.Debug("Receive new message, Id:%s Ip:%s ", videoLabel.VideoLabelID, c.RemoteIP()) // 转人脸消息 var face vo.FaceObject face.FaceID = videoLabel.VideoLabelID face.InfoKind = 1 face.SourceID = videoLabel.VideoImageID face.DeviceID = videoLabel.IVADeviceID face.LocationMarkTime = videoLabel.CreateTimeAbs face.FaceAppearTime = videoLabel.BehaviorAnalysisObject.BehaviorBeginTime face.FaceDisAppearTime = videoLabel.BehaviorAnalysisObject.BehaviorEndTime var hasTargetImage bool var bgImageWith, bgImageHeight int var bgImage *vo.SubImageInfoObject for idx, img := range videoLabel.SubImageList.SubImageInfoObject { videoLabel.SubImageList.SubImageInfoObject[idx].EventSort = 10 // 判断是否有小图, 如果没有切一张 if img.Type == "14" { bgImageWith, bgImageHeight = img.Width, img.Height } else { hasTargetImage = true bgImage = &videoLabel.SubImageList.SubImageInfoObject[idx] } face.SubImageList.SubImageInfoObject = append( face.SubImageList.SubImageInfoObject, videoLabel.SubImageList.SubImageInfoObject[idx], ) } if !hasTargetImage && bgImage != nil { imgData, err := base64.StdEncoding.DecodeString(bgImage.Data) if err != nil { c.AbortWithStatus(http.StatusBadRequest) return } var subRect pkg.Rect subRect.Left = bgImageWith / 3 subRect.Top = bgImageHeight / 3 subRect.Right = subRect.Left * 2 subRect.Bottom = subRect.Top * 2 subImage, err := pkg.SubCutImage(imgData, &subRect, 0) if err != nil { c.AbortWithStatus(http.StatusBadRequest) return } var subImageInfo = vo.SubImageInfoObject{ ImageID: bgImage.ImageID + "1", EventSort: 10, DeviceID: bgImage.DeviceID, StoragePath: "", Type: "11", FileFormat: "Jpeg", ShotTime: bgImage.ShotTime, Width: subRect.Right - subRect.Left, Height: subRect.Top - subRect.Bottom, Data: base64.StdEncoding.EncodeToString(subImage), } face.SubImageList.SubImageInfoObject = append( face.SubImageList.SubImageInfoObject, subImageInfo, ) } // 如果开启了下级, 身份应该是消息代理, 不再转发到服务器 if config.ClientConf.Enable && config.ServeConf.Role == "agent" { var faceObjList vo.RequestFaceList faceObjList.FaceListObject.FaceObject = append(faceObjList.FaceListObject.FaceObject, face) go a.Repository.VIIDMsgForward(&faceObjList) } else if config.ServeConf.Role == "cascade" { go service.AddFaceNotification(&face) } if config.ForwardConf.SyncServer != "" { go a.Repository.FaceForward([]vo.FaceObject{face}) } rspMsg := vo.ResponseStatus{ RequestURL: c.FullPath(), StatusCode: vo.StatusSuccess, StatusString: vo.StatusString[vo.StatusSuccess], Id: videoLabel.VideoLabelID, LocalTime: time.Now().Format("20060102150405"), } c.JSON(http.StatusOK, gin.H{"ResponseStatusObject": rspMsg}) }