From 5f31d07ff92d87dd1016e9279df84d8f3641feb5 Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期日, 25 八月 2024 22:26:29 +0800 Subject: [PATCH] 添加系统校时功能 --- controller/captureCtl.go | 200 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 198 insertions(+), 2 deletions(-) diff --git a/controller/captureCtl.go b/controller/captureCtl.go index fc4cd79..79efc0f 100644 --- a/controller/captureCtl.go +++ b/controller/captureCtl.go @@ -1,11 +1,20 @@ package controller import ( + "encoding/base64" + "fmt" + "math/rand" "net/http" + "path" + "strconv" "time" + "gat1400Exchange/config" + "gat1400Exchange/pkg" "gat1400Exchange/pkg/logger" "gat1400Exchange/repository" + "gat1400Exchange/service" + "gat1400Exchange/util" "gat1400Exchange/vo" "github.com/gin-gonic/gin" @@ -37,10 +46,45 @@ } face := req.FaceListObject.FaceObject[0] + logger.Debug("Receive new face message, ip:%s, device id:%s faceId:%s, LeftTopX:%d, appearTime:%s", c.RemoteIP(), face.DeviceID, face.FaceID, face.LeftTopX, face.FaceAppearTime) - logger.Debug("鎺ユ敹鍒颁汉鑴告暟鎹�, faceId:%s, LeftTopX:%d", face.FaceID, face.LeftTopX) + if config.ClientConf.UploadType == "url" { + for idx, img := range face.SubImageList.SubImageInfoObject { + if img.Type != "14" { + continue + } - a.Repository.FaceForward(req.FaceListObject.FaceObject) + imageBytes, err := base64.StdEncoding.DecodeString(img.Data) + if err != nil { + logger.Warn("Decode Small Image Base64 String failure, %s", err.Error()) + c.AbortWithStatus(http.StatusBadRequest) + return + } + + today := time.Now().Format("2006-01-02") + imagePath := path.Join(config.LogConf.Path, "gat1400_face_images", today, img.ImageID+".jpeg") + err = util.WriteToFile(imagePath, imageBytes) + if err == nil { + face.SubImageList.SubImageInfoObject[idx].Data = "" + face.SubImageList.SubImageInfoObject[idx].StoragePath = config.ImageConf.ImageUriPrefix + "/" + today + "/" + img.ImageID + ".jpeg" + } + } + } + + // 濡傛灉寮�鍚簡涓嬬骇, 韬唤搴旇鏄秷鎭唬鐞�, 涓嶅啀杞彂鍒版湇鍔″櫒 + if config.ClientConf.Enable && config.ServeConf.Role == "agent" { + go a.Repository.VIIDFaceMsgForward(&req) + } else if config.ServeConf.Role == "cascade" { + go service.AddFaceNotification(&face) + } + + if config.ForwardConf.SyncServer != "" { + go a.Repository.FaceForward(req.FaceListObject.FaceObject) + } + + if config.ForwardConf.RecordServer != "" { + go a.Repository.PubRecordMessage(face.DeviceID, face.FaceID) + } rspMsg := vo.ResponseStatus{ RequestURL: c.FullPath(), @@ -52,3 +96,155 @@ 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 videoLabel message, Id:%s Ip:%s ", videoLabel.VideoLabelID, c.RemoteIP()) + + // 杞汉鍛樻秷鎭� + var person vo.PersonObject + person.PersonID = videoLabel.VideoLabelID[0:41] + "01" + videoLabel.VideoLabelID[43:48] + person.InfoKind = "1" + person.DeviceID = videoLabel.IVADeviceID + person.SourceID = videoLabel.VideoImageID + person.LocationMarkTime = videoLabel.BehaviorAnalysisObject.BehaviorBeginTime + person.PersonAppearTime = videoLabel.BehaviorAnalysisObject.BehaviorBeginTime + person.PersonDisAppearTime = videoLabel.BehaviorAnalysisObject.BehaviorEndTime + person.IsDriver = 2 + person.IsCriminalInvolved = 2 + + 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] + } + + person.SubImageList.SubImageInfoObject = append( + person.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 + } + + imageId := bgImage.ImageID[37:41] + imageNumber, err := strconv.Atoi(imageId) + if err != nil { + imageNumber = rand.Intn(90000) + 10000 + } else { + imageNumber++ + } + var subImageInfo = vo.SubImageInfoObject{ + ImageID: fmt.Sprintf("%s%d", bgImage.ImageID[0:37], imageNumber), + 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), + } + person.SubImageList.SubImageInfoObject = append( + person.SubImageList.SubImageInfoObject, + subImageInfo, + ) + } + + // 濡傛灉寮�鍚簡涓嬬骇, 韬唤搴旇鏄秷鎭唬鐞�, 涓嶅啀杞彂鍒版湇鍔″櫒 + if config.ClientConf.Enable && config.ServeConf.Role == "agent" { + var personList vo.RequestPersonList + personList.PersonListObject.PersonObject = append(personList.PersonListObject.PersonObject, person) + go a.Repository.VIIDPersonMsgForward(&personList) + } else if config.ServeConf.Role == "cascade" { + go service.AddPersonNotification(&person) + } + + if config.ForwardConf.SyncServer != "" { + go a.Repository.PersonForward([]vo.PersonObject{person}) + } + + 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}) +} + +func (a CaptureController) Persons(c *gin.Context) { + var req vo.RequestPersonList + if err := c.BindJSON(&req); err != nil { + c.AbortWithStatus(http.StatusBadRequest) + return + } + + if len(req.PersonListObject.PersonObject) == 0 { + c.AbortWithStatus(http.StatusBadRequest) + return + } + + person := req.PersonListObject.PersonObject[0] + logger.Debug("Receive new person message, ip:%s, device Id:%s personId:%s, appearTime:%s", c.RemoteIP(), person.DeviceID, person.PersonID, person.PersonAppearTime) + + // 濡傛灉寮�鍚簡涓嬬骇, 韬唤搴旇鏄秷鎭唬鐞�, 涓嶅啀杞彂鍒版湇鍔″櫒 + if config.ClientConf.Enable && config.ServeConf.Role == "agent" { + go a.Repository.VIIDPersonMsgForward(&req) + } else if config.ServeConf.Role == "cascade" { + go service.AddPersonNotification(&person) + } + + if config.ForwardConf.SyncServer != "" { + go a.Repository.PersonForward(req.PersonListObject.PersonObject) + } + + rspMsg := vo.ResponseStatus{ + RequestURL: c.FullPath(), + StatusCode: vo.StatusSuccess, + StatusString: vo.StatusString[vo.StatusSuccess], + Id: person.PersonID, + LocalTime: time.Now().Format("20060102150405"), + } + + c.JSON(http.StatusOK, gin.H{"ResponseStatusObject": rspMsg}) +} -- Gitblit v1.8.0