From 7eb122e20a75ed800cc96b1565522951286e4081 Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期一, 03 六月 2024 20:33:33 +0800 Subject: [PATCH] 添加persons 接口 --- repository/captureRepo.go | 305 +++++++++++++++++++++++++++++++++++++------------- 1 files changed, 224 insertions(+), 81 deletions(-) diff --git a/repository/captureRepo.go b/repository/captureRepo.go index 3654d8c..8572735 100644 --- a/repository/captureRepo.go +++ b/repository/captureRepo.go @@ -3,15 +3,15 @@ import ( "encoding/base64" "encoding/json" + "gat1400Exchange/pkg" "time" + "gat1400Exchange/client" "gat1400Exchange/config" "gat1400Exchange/models" "gat1400Exchange/pkg/logger" "gat1400Exchange/util" "gat1400Exchange/vo" - - uuid "github.com/satori/go.uuid" ) type CaptureRepository struct { @@ -22,6 +22,8 @@ } func (c CaptureRepository) FaceForward(faceList []vo.FaceObject) { + var err error + if faceList == nil || len(faceList) == 0 { logger.Warn("FaceList is nil") return @@ -32,25 +34,73 @@ logger.Warn("SubImageInfoObject is nil") continue } - var deviceId = face.DeviceID var faceId = face.FaceID - var faceImageStr string + var bgImageStr, imageType string + var bgImageBytes, faceImageBytes []byte = nil, nil // 鑾峰彇澶у浘, 鐩墠娴峰悍鐨勫皬鍥惧垎杈ㄧ巼澶綆 for _, image := range face.SubImageList.SubImageInfoObject { - if len(image.Data) > len(faceImageStr) { - faceImageStr = image.Data + if image.Type != "14" { + continue + } + + if len(image.Data) > 0 { + if len(image.Data) > len(bgImageStr) { + bgImageStr = image.Data + } + } else if image.StoragePath != "" { + imgData, err := util.ImageDownload(image.StoragePath, nil) + if err != nil { + logger.Warn("Image download failure, %s", err.Error()) + } else { + bgImageBytes = imgData + bgImageStr = "///" + } + } + } + + if bgImageBytes == nil { + bgImageBytes, err = base64.StdEncoding.DecodeString(bgImageStr) + if err != nil { + logger.Warn("Decode Image Base64 String failure, %s", err.Error()) + continue + } + } + + // 鍒ゆ柇鍥剧墖绫诲瀷鏄惁涓哄満鏅浘, 鏍规嵁浜鸿劯鍧愭爣鍒囧皬鍥�. + if imageType == "14" && config.ForwardConf.CutFaceImage { + faceRect := &vo.Rect{ + Left: face.LeftTopX, + Top: face.LeftTopY, + Right: face.RightBtmX, + Bottom: face.RightBtmY, + } + + faceImageBytes, err = util.SubCutImg(bgImageBytes, faceRect, 90) + if err != nil { + logger.Warn("Cut face image failure, %s", err.Error()) } } // 杞彂鍥惧儚 - logger.Debug("Prepare forward image, deviceId:%s, image len:%d, server:%s", deviceId, len(faceImageStr), config.ForwardConf.SyncServer) - if deviceId != "" && faceImageStr != "" && config.ForwardConf.SyncServer != "" { - pd := c.PackPushDataV2(deviceId, faceId, faceImageStr, face.FaceAppearTime) + logger.Debug("Prepare forward image, deviceId:%s, image len:%d, server:%s", deviceId, len(bgImageBytes), config.ForwardConf.SyncServer) + if deviceId != "" && bgImageStr != "" && config.ForwardConf.SyncServer != "" { + pd := c.PackPushDataV2(deviceId, faceId, face.FaceAppearTime, bgImageBytes, faceImageBytes) if pd == nil { return } + + // 澶勭悊姊帶濉啓鐨勬ゼ灞備俊鎭� 鏆傛椂浣跨敤oherFeature瀛楁 + if face.OtherFeature != "" { + pd.CameraFloor = face.OtherFeature + } + + // 灏濊瘯浠巉aceId鎻愬彇妤煎眰 + if pd.CameraFloor == "" && config.ClientConf.AddFloorToFaceId { + pd.CameraFloor, _ = pkg.ParseFloorFromId(face.FaceID) + } + //logger.Debug("device %s, CameraFloor:%s", deviceId, pd.CameraFloor) payload, err := json.Marshal(pd) if err != nil { @@ -60,7 +110,7 @@ if !util.SendData(payload, config.ForwardConf.SyncServer) { cacheItem, _ := json.Marshal(pd) - c.CacheData(cacheItem) + c.CacheData(cacheItem, "basic") logger.Warn("The data forwarding failed, adding to local cache.") } else { logger.Debug("The data forwarding successful. deviceId:%s", deviceId) @@ -71,102 +121,195 @@ return } -func (c CaptureRepository) PackPushDataV2(deviceId, faceId, faceImage, appearTime string) *vo.PushDataInfoV2 { - var pd = new(vo.PushDataInfoV2) - var device models.Device +func (c CaptureRepository) PersonForward(personList []vo.PersonObject) { + var err error - if err := device.FindById(deviceId); err != nil { - logger.Warn("Can't find device in database, device:%s, %s", deviceId, err.Error()) - return pd + if personList == nil || len(personList) == 0 { + logger.Warn("FaceList is nil") + return } - // 鍖归厤妤煎眰 + for _, v := range personList { + if v.SubImageList.SubImageInfoObject == nil { + logger.Warn("SubImageInfoObject is nil") + continue + } + var deviceId = v.DeviceID + var targetId = v.PersonID + var bgImageStr string + var bgImageBytes, faceImageBytes []byte = nil, nil + + // 鑾峰彇澶у浘, 鐩墠娴峰悍鐨勫皬鍥惧垎杈ㄧ巼澶綆 + for _, image := range v.SubImageList.SubImageInfoObject { + if image.Type != "14" { + continue + } + + if len(image.Data) > 0 { + if len(image.Data) > len(bgImageStr) { + bgImageStr = image.Data + } + } else if image.StoragePath != "" { + imgData, err := util.ImageDownload(image.StoragePath, nil) + if err != nil { + logger.Warn("Image download failure, %s", err.Error()) + } else { + bgImageBytes = imgData + bgImageStr = "///" + } + } + } + + if bgImageBytes == nil { + bgImageBytes, err = base64.StdEncoding.DecodeString(bgImageStr) + if err != nil { + logger.Warn("Decode Image Base64 String failure, %s", err.Error()) + continue + } + } + + // 杞彂鍥惧儚 + logger.Debug("Prepare forward person image, deviceId:%s, image len:%d, server:%s", deviceId, len(bgImageBytes), config.ForwardConf.SyncServer) + if deviceId != "" && bgImageStr != "" && config.ForwardConf.SyncServer != "" { + pd := c.PackPushDataV2(deviceId, targetId, v.PersonAppearTime, bgImageBytes, faceImageBytes) + if pd == nil { + return + } + + // 澶勭悊姊帶濉啓鐨勬ゼ灞備俊鎭� 鏆傛椂浣跨敤oherFeature瀛楁 + if v.BehaviorDescription != "" { + pd.CameraFloor = v.BehaviorDescription + } + + // 灏濊瘯浠巉aceId鎻愬彇妤煎眰 + if pd.CameraFloor == "" && config.ClientConf.AddFloorToFaceId { + pd.CameraFloor, _ = pkg.ParseFloorFromId(v.PersonID) + } + //logger.Debug("device %s, CameraFloor:%s", deviceId, pd.CameraFloor) + + payload, err := json.Marshal(pd) + if err != nil { + logger.Warn("Marshal error, %s", err.Error()) + return + } + + if !util.SendData(payload, config.ForwardConf.SyncServer) { + cacheItem, _ := json.Marshal(pd) + c.CacheData(cacheItem, "basic") + logger.Warn("The data forwarding failed, adding to local cache.") + } else { + logger.Debug("The data forwarding successful. deviceId:%s", deviceId) + } + } + } + + return +} + +func (c CaptureRepository) PackPushDataV2(deviceId, faceId, appearTime string, bgImgBytes, faceImgBytes []byte) *vo.PushDataInfoV2 { + var pd = new(vo.PushDataInfoV2) + var floor string + faceAppearTime, err := time.ParseInLocation("20060102150405", appearTime, time.Local) if err != nil { logger.Warn("Parse face appear time error, %s", err.Error()) faceAppearTime = time.Now() } - var devPos models.Positions - _ = devPos.FindDevicePosition(deviceId, faceAppearTime.Unix()+5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 + if config.ServeConf.Role == "server" { + // 鍖归厤妤煎眰 + var devPos models.Positions + _ = devPos.FindDevicePosition(deviceId, faceAppearTime.Unix()+5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 - imageBytes, err := base64.StdEncoding.DecodeString(faceImage) - if err != nil { - logger.Warn("Decode Image Base64 String failure, %s", err.Error()) - return pd + floor = devPos.Pos } - pd.PicMaxImages = append(pd.PicMaxImages, imageBytes) + pd.PicMaxImages = append(pd.PicMaxImages, bgImgBytes) + + if faceImgBytes != nil { + pd.PicSmImages = append(pd.PicSmImages, faceImgBytes) + } + pd.PicId = faceId pd.PicDate = faceAppearTime.Format("2006-01-02 15:04:05") pd.DataSource = "camera" - pd.CameraFloor = devPos.Pos + pd.CameraFloor = floor pd.CameraId = deviceId return pd } -func (c CaptureRepository) PackPushData(deviceId, faceId, faceImage, appearTime string) *vo.PushDataInfo { - var pd = new(vo.PushDataInfo) - var device models.Device - - if err := device.FindById(deviceId); err != nil { - logger.Warn("Can't find device in database, device:%s, %s", deviceId, err.Error()) - return pd - } - - // 鍖归厤妤煎眰 - faceAppearTime, err := time.ParseInLocation("20060102150405", appearTime, time.Local) - if err != nil { - logger.Warn("Parse face appear time error, %s", err.Error()) - faceAppearTime = time.Now() - } - - // 鐢垫鍋滄鐨勬椂闂� - devStopTime := time.Now().Format("2006-01-02 15:04:05") - var devPos models.Positions - _ = devPos.FindDevicePosition(deviceId, faceAppearTime.Unix()+5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 - if devPos.TimeString != "" { - devStopTime = devPos.TimeString - } - - imageBytes, err := base64.StdEncoding.DecodeString(faceImage) - if err != nil { - logger.Warn("Decode Image Base64 String failure, %s", err.Error()) - return pd - } - - pd.PicMaxImages = append(pd.PicMaxImages, imageBytes) - - tr := vo.TaskResultInfo{ - Id: uuid.NewV4().String(), - CameraId: deviceId, - CameraAddr: device.Addr + devPos.Pos, - CameraName: device.Name, - PicMaxUrl: []string{""}, - PicDate: faceAppearTime.Format("2006-01-02 15:04:05"), - LikeDate: devStopTime, - AnalyServerId: deviceId, - DataSource: "camera", - TargetInfo: []vo.TargetInfo{{TargetId: faceId}}, - } - - pd.SourceData = vo.ESInfo{ - TaskResultInfo: tr, - Version: "3.3", - UpdateTime: time.Now().Format("2006-01-02 15:04:05"), - } - - return pd -} - -func (c CaptureRepository) CacheData(payload []byte) { +func (c CaptureRepository) CacheData(payload []byte, msgType string) { var cacheItem = models.Cache{ + Type: msgType, Data: string(payload), CreateTime: time.Now().Unix(), Retry: 0, } - models.GetDB().Table(cacheItem.TableName()).Create(&c) + cacheItem.Save() +} +func (c CaptureRepository) VIIDFaceMsgForward(msg *vo.RequestFaceList) { + faceInfo := msg.FaceListObject.FaceObject[0] + // 鍖归厤妤煎眰 + faceAppearTime, err := time.ParseInLocation("20060102150405", faceInfo.FaceAppearTime, time.Local) + if err != nil { + logger.Warn("Parse face appear time error, %s", err.Error()) + faceAppearTime = time.Now() + } + + var devPos models.Positions + _ = devPos.FindPositionByTime(faceAppearTime.Unix() + 5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 + if devPos.Pos == "" { + devPos.Pos = "1F" + } + + for idx, face := range msg.FaceListObject.FaceObject { + msg.FaceListObject.FaceObject[idx].OtherFeature = devPos.Pos + if config.ClientConf.AddFloorToFaceId { + msg.FaceListObject.FaceObject[idx].FaceID = pkg.GenerateFaceIdContainFloor(face.FaceID, devPos.Pos) + } + } + + b, _ := json.Marshal(msg) + if client.FaceCapture(b) != vo.StatusSuccess { + cacheItem, _ := json.Marshal(msg) + c.CacheData(cacheItem, "1400-face") + logger.Warn("The data forwarding failed, adding to local cache.") + } + + return +} + +func (c CaptureRepository) VIIDPersonMsgForward(msg *vo.RequestPersonList) { + person := msg.PersonListObject.PersonObject[0] + // 鍖归厤妤煎眰 + appearTime, err := time.ParseInLocation("20060102150405", person.PersonAppearTime, time.Local) + if err != nil { + logger.Warn("Parse face appear time error, %s", err.Error()) + appearTime = time.Now() + } + + var devPos models.Positions + _ = devPos.FindPositionByTime(appearTime.Unix() + 5) // 鍔�5绉掔數姊叧闂ㄧ殑鏃堕棿 + if devPos.Pos == "" { + devPos.Pos = "1F" + } + + for idx, v := range msg.PersonListObject.PersonObject { + msg.PersonListObject.PersonObject[idx].BehaviorDescription = devPos.Pos + if config.ClientConf.AddFloorToFaceId { + msg.PersonListObject.PersonObject[idx].PersonID = pkg.GenerateFaceIdContainFloor(v.PersonID, devPos.Pos) + } + } + + b, _ := json.Marshal(msg) + if client.PersonCapture(b) != vo.StatusSuccess { + cacheItem, _ := json.Marshal(msg) + c.CacheData(cacheItem, "1400-person") + logger.Warn("The data forwarding failed, adding to local cache.") + } + + return } -- Gitblit v1.8.0