From f22b69ff61a5795a2e1242091cc35bce0bd8c803 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期二, 16 四月 2024 14:41:47 +0800
Subject: [PATCH] 修复更新操作

---
 repository/captureRepo.go |  136 ++++++++++++++++++++++++++++-----------------
 1 files changed, 84 insertions(+), 52 deletions(-)

diff --git a/repository/captureRepo.go b/repository/captureRepo.go
index d9452fd..3654d8c 100644
--- a/repository/captureRepo.go
+++ b/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
 	}
 
@@ -35,6 +34,7 @@
 		}
 
 		var deviceId = face.DeviceID
+		var faceId = face.FaceID
 		var faceImageStr string
 
 		// 鑾峰彇澶у浘, 鐩墠娴峰悍鐨勫皬鍥惧垎杈ㄧ巼澶綆
@@ -45,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, 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)
 			}
 		}
 	}
@@ -64,37 +71,84 @@
 	return
 }
 
-func (c CaptureRepository) PackPushData(deviceId, 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",
+		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{
@@ -106,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)
 
 }

--
Gitblit v1.8.0