zhangzengfei
2024-04-16 f22b69ff61a5795a2e1242091cc35bce0bd8c803
repository/captureRepo.go
@@ -1,15 +1,14 @@
package repository
import (
   "bytes"
   "encoding/base64"
   "encoding/json"
   "net/http"
   "time"
   "gat1400Exchange/config"
   "gat1400Exchange/models"
   "gat1400Exchange/pkg/logger"
   "gat1400Exchange/util"
   "gat1400Exchange/vo"
   uuid "github.com/satori/go.uuid"
@@ -24,7 +23,7 @@
func (c CaptureRepository) FaceForward(faceList []vo.FaceObject) {
   if faceList == nil || len(faceList) == 0 {
      logger.Warn("faceList is nil")
      logger.Warn("FaceList is nil")
      return
   }
@@ -46,18 +45,25 @@
      }
      // 转发图像
      logger.Debug("准备转发,deviceId:%s, image len:%d, server:%s", deviceId, len(faceImageStr), config.ForwardConf.SyncServer)
      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.PackPushData(deviceId, faceId, faceImageStr)
         pd := c.PackPushDataV2(deviceId, faceId, faceImageStr, face.FaceAppearTime)
         if pd == nil {
            return
         }
         rsp, err := c.SendData(pd, config.ForwardConf.SyncServer)
         payload, err := json.Marshal(pd)
         if err != nil {
            logger.Warn("数据转发失败:%s", err.Error())
            logger.Warn("Marshal error, %s", err.Error())
            return
         }
         if !util.SendData(payload, config.ForwardConf.SyncServer) {
            cacheItem, _ := json.Marshal(pd)
            c.CacheData(cacheItem)
            logger.Warn("The data forwarding failed, adding to local cache.")
         } else {
            logger.Debug("数据转发成功,id:%s", rsp)
            logger.Debug("The data forwarding successful. deviceId:%s", deviceId)
         }
      }
   }
@@ -65,38 +71,84 @@
   return
}
func (c CaptureRepository) PackPushData(deviceId, faceId, faceImage string) *vo.PushDataInfo {
func (c CaptureRepository) PackPushDataV2(deviceId, faceId, faceImage, appearTime string) *vo.PushDataInfoV2 {
   var pd = new(vo.PushDataInfoV2)
   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()
   }
   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
   }
   pd.PicMaxImages = append(pd.PicMaxImages, imageBytes)
   pd.PicId = faceId
   pd.PicDate = faceAppearTime.Format("2006-01-02 15:04:05")
   pd.DataSource = "camera"
   pd.CameraFloor = devPos.Pos
   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.Debug("Can't find device in database, device:%s, %s", deviceId, err.Error())
      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())
      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,
      OrgName:         "",
      CameraAddr:      device.Addr + device.Pos,
      CameraName:      device.Name,
      PicMaxUrl:       []string{""},
      PicDate:         time.Now().Format("2006-01-02 15:04:05"),
      LikeDate:        time.Now().Format("2006-01-02 15:04:05"),
      TaskId:          "",
      AnalyServerId:   deviceId,
      AnalyServerName: "",
      AnalyServerIp:   "",
      DataSource:      "camera",
      TargetInfo:      []vo.TargetInfo{{TargetId: faceId}},
      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{
@@ -108,35 +160,13 @@
   return pd
}
func (c CaptureRepository) SendData(pushDataInfo *vo.PushDataInfo, url string) (id string, err error) {
   id = ""
   payload, err := json.Marshal(pushDataInfo)
   if err != nil {
      return id, err
func (c CaptureRepository) CacheData(payload []byte) {
   var cacheItem = models.Cache{
      Data:       string(payload),
      CreateTime: time.Now().Unix(),
      Retry:      0,
   }
   req, err := http.NewRequest("POST", url, bytes.NewBuffer(payload))
   if err != nil {
      return id, err
   }
   client := &http.Client{}
   resp, err := client.Do(req)
   if err != nil {
      return id, err
   }
   defer resp.Body.Close()
   var responseData map[string]interface{}
   err = json.NewDecoder(resp.Body).Decode(&responseData)
   if err != nil {
      return id, err
   }
   id = responseData["data"].(string)
   // 处理响应
   // 这里可以根据实际需求进行处理,例如读取响应内容或检查状态码等
   return id, nil
   models.GetDB().Table(cacheItem.TableName()).Create(&c)
}