From d6831b733a4a97f2271c544c92ce33701634a97b Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期五, 29 三月 2024 13:55:17 +0800
Subject: [PATCH] 修复楼层匹配

---
 models/device.go          |   16 +++++++++++++++-
 repository/captureRepo.go |   16 +++++++++++++---
 models/positions.go       |   16 ++++++++++++++++
 models/db.go              |    2 +-
 4 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/models/db.go b/models/db.go
index 287e8b4..b0f9506 100644
--- a/models/db.go
+++ b/models/db.go
@@ -20,7 +20,7 @@
 		logger.Debug("db open error ", err)
 		return err
 	}
-	_ = db.AutoMigrate(Device{})
+	_ = db.AutoMigrate(&Device{}, &Positions{})
 
 	// 娣诲姞榛樿鏁版嵁
 	InitData()
diff --git a/models/device.go b/models/device.go
index 473ff0f..854ae65 100644
--- a/models/device.go
+++ b/models/device.go
@@ -1,6 +1,9 @@
 package models
 
-import "gorm.io/gorm"
+import (
+	"gorm.io/gorm"
+	"time"
+)
 
 type Device struct {
 	Id         string `gorm:"column:id;primary_key;" json:"id"`
@@ -37,6 +40,7 @@
 		if err == gorm.ErrRecordNotFound {
 			// 璁板綍涓嶅瓨鍦紝鍒涘缓鏂拌褰�
 			db.Create(&d)
+
 		} else {
 			// 鍏朵粬閿欒锛屼綘鍙互杩涜閫傚綋鐨勫鐞�
 			return err
@@ -53,5 +57,15 @@
 		db.Save(&existingDevice)
 	}
 
+	// 璁板綍浣嶇疆鐨勫巻鍙�, 缁欎汉鑴告姄鎷嶅尮閰嶆ゼ灞�
+	if existingDevice.Pos != "" {
+		var pos = Positions{
+			DeviceId:   d.Id,
+			Pos:        d.Pos,
+			CreateTime: time.Now().Unix(),
+		}
+
+		db.Create(&pos)
+	}
 	return nil
 }
diff --git a/models/positions.go b/models/positions.go
new file mode 100644
index 0000000..db9a27a
--- /dev/null
+++ b/models/positions.go
@@ -0,0 +1,16 @@
+package models
+
+type Positions struct {
+	Id         uint   `gorm:"column:id;primary_key;auto_increment;unique;not null;"`
+	DeviceId   string `gorm:"column:device_id;" json:"device_id"`
+	Pos        string `gorm:"column:pos" json:"pos"`
+	CreateTime int64  `gorm:"column:create_time;autoCreateTime;"`
+}
+
+func (d *Positions) TableName() string {
+	return "positions"
+}
+
+func (d *Positions) FindDevicePosition(devId string, timestamp int64) error {
+	return db.Table(d.TableName()).Where(&d, "device_id = ? AND create_time < ?", devId, timestamp).Order("create_time desc").First(&d).Error
+}
diff --git a/repository/captureRepo.go b/repository/captureRepo.go
index 76a963d..1928a33 100644
--- a/repository/captureRepo.go
+++ b/repository/captureRepo.go
@@ -48,7 +48,7 @@
 		// 杞彂鍥惧儚
 		logger.Debug("鍑嗗杞彂,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.PackPushData(deviceId, faceId, faceImageStr, face.FaceAppearTime)
 			if pd == nil {
 				return
 			}
@@ -65,7 +65,7 @@
 	return
 }
 
-func (c CaptureRepository) PackPushData(deviceId, faceId, faceImage string) *vo.PushDataInfo {
+func (c CaptureRepository) PackPushData(deviceId, faceId, faceImage, appearTime string) *vo.PushDataInfo {
 	var pd = new(vo.PushDataInfo)
 	var device models.Device
 
@@ -73,6 +73,16 @@
 		logger.Warn("Can't find device in database, device:%s, %s", deviceId, err.Error())
 		return pd
 	}
+
+	// 鍖归厤妤煎眰
+	aTime, err := time.ParseInLocation("20060102150405", appearTime, time.Local)
+	if err != nil {
+		logger.Warn("Parse face appear time error,%s", err.Error())
+		aTime = time.Now()
+	}
+
+	var devPos models.Positions
+	_ := devPos.FindDevicePosition(deviceId, aTime.Unix())
 
 	imageBytes, err := base64.StdEncoding.DecodeString(faceImage)
 	if err != nil {
@@ -85,7 +95,7 @@
 	tr := vo.TaskResultInfo{
 		Id:            uuid.NewV4().String(),
 		CameraId:      deviceId,
-		CameraAddr:    device.Addr + device.Pos,
+		CameraAddr:    device.Addr + devPos.Pos,
 		CameraName:    device.Name,
 		PicMaxUrl:     []string{""},
 		PicDate:       time.Now().Format("2006-01-02 15:04:05"),

--
Gitblit v1.8.0