From 6ae711d0d5517215a36d314a52309424e7bc2665 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@smartai.com>
Date: 星期二, 28 五月 2024 16:47:04 +0800
Subject: [PATCH] 添加楼层信息到人脸id

---
 pkg/floor.go                |   82 +++++++++++++++++++++++++++++++++++++++++
 pkg/snowflake/randString.go |   26 +++++++++++++
 repository/captureRepo.go   |    9 ++++
 repository/subscribeRepo.go |    2 
 4 files changed, 117 insertions(+), 2 deletions(-)

diff --git a/pkg/floor.go b/pkg/floor.go
new file mode 100644
index 0000000..30629ee
--- /dev/null
+++ b/pkg/floor.go
@@ -0,0 +1,82 @@
+package pkg
+
+import (
+	"fmt"
+	"strconv"
+	"strings"
+
+	"gat1400Exchange/pkg/snowflake"
+)
+
+// 鐢熸垚涓�涓寘鍚ゼ灞傜殑浜鸿劯id,瑙f瀽妤煎眰
+// 鏂癷d鐨勮鍒�, 20浣嶈澶囩紪鐮� +02 +14浣嶆椂闂� + 5555 + 3浣嶆ゼ灞�(绗竴浣�0琛ㄧず姝�,1琛ㄧず璐�) + 5浣嶉殢鏈烘暟
+func GenerateFaceIdContainFloor(srcId, floorStr string) string {
+	floorNum, _ := parseFloor(floorStr)
+	newId := srcId[0:36] + "5555" + floorNum + snowflake.CreateRandomNumber(5)
+
+	return newId
+}
+
+func ParseFloorFromId(srcId string) (string, error) {
+	if len(srcId) != 48 {
+		return "", fmt.Errorf("invalid id %s", srcId)
+	}
+
+	if srcId[36:40] != "5555" {
+		return "", fmt.Errorf("invalid flag %s", srcId[36:40])
+	}
+
+	return restoreFloor(srcId[40:43])
+}
+
+// parseFloor parses the floor string and returns a three-character string
+func parseFloor(floor string) (string, error) {
+	var sign string
+	var number string
+
+	// Check if the floor is negative
+	if strings.HasPrefix(floor, "-") {
+		sign = "1"
+		number = floor[1 : len(floor)-1]
+	} else {
+		sign = "0"
+		number = floor[:len(floor)-1]
+	}
+
+	// Convert the number to an integer to validate and ensure it is a valid number
+	if _, err := strconv.Atoi(number); err != nil {
+		return "", err
+	}
+
+	// Format the number to be two digits
+	formattedNumber := fmt.Sprintf("%02s", number)
+
+	return sign + formattedNumber, nil
+}
+
+// restoreFloor restores the three-character string back to the original floor string
+func restoreFloor(encoded string) (string, error) {
+	if len(encoded) != 3 {
+		return "", fmt.Errorf("encoded string must be 3 characters long")
+	}
+
+	sign := encoded[0]
+	number := encoded[1:]
+
+	// Convert the number back to integer to remove any leading zeros
+	parsedNumber, err := strconv.Atoi(number)
+	if err != nil {
+		return "", err
+	}
+
+	var restoredFloor string
+	if sign == '1' {
+		restoredFloor = fmt.Sprintf("-%dF", parsedNumber)
+	} else if sign == '0' {
+		restoredFloor = fmt.Sprintf("%dF", parsedNumber)
+	} else {
+		return "", fmt.Errorf("invalid sign character in encoded string")
+	}
+
+	return restoredFloor, nil
+}
diff --git a/pkg/snowflake/randString.go b/pkg/snowflake/randString.go
new file mode 100644
index 0000000..5e77337
--- /dev/null
+++ b/pkg/snowflake/randString.go
@@ -0,0 +1,26 @@
+package snowflake
+
+import (
+	"bytes"
+	"crypto/rand"
+	"fmt"
+	"math/big"
+	rand2 "math/rand"
+)
+
+func CreateRandomNumber(len int) string {
+	var numbers = []byte{1, 2, 3, 4, 5, 7, 8, 9}
+	var container string
+	length := bytes.NewReader(numbers).Len()
+
+	for i := 1; i <= len; i++ {
+		random, err := rand.Int(rand.Reader, big.NewInt(int64(length)))
+		if err != nil {
+			container += fmt.Sprintf("%d", rand2.Int())
+		} else {
+			container += fmt.Sprintf("%d", numbers[random.Int64()])
+		}
+
+	}
+	return container
+}
diff --git a/repository/captureRepo.go b/repository/captureRepo.go
index 541578e..57f5e23 100644
--- a/repository/captureRepo.go
+++ b/repository/captureRepo.go
@@ -3,6 +3,7 @@
 import (
 	"encoding/base64"
 	"encoding/json"
+	"gat1400Exchange/pkg"
 	"time"
 
 	"gat1400Exchange/client"
@@ -94,6 +95,11 @@
 			if face.OtherFeature != "" {
 				pd.CameraFloor = face.OtherFeature
 			}
+
+			// 灏濊瘯浠巉aceId鎻愬彇妤煎眰
+			if pd.CameraFloor == "" {
+				pd.CameraFloor, _ = pkg.ParseFloorFromId(face.FaceID)
+			}
 			//logger.Debug("device %s, CameraFloor:%s", deviceId, pd.CameraFloor)
 
 			payload, err := json.Marshal(pd)
@@ -174,8 +180,9 @@
 		devPos.Pos = "1F"
 	}
 
-	for idx, _ := range msg.FaceListObject.FaceObject {
+	for idx, face := range msg.FaceListObject.FaceObject {
 		msg.FaceListObject.FaceObject[idx].OtherFeature = devPos.Pos
+		msg.FaceListObject.FaceObject[idx].FaceID = pkg.GenerateFaceIdContainFloor(face.FaceID, devPos.Pos)
 	}
 
 	b, _ := json.Marshal(msg)
diff --git a/repository/subscribeRepo.go b/repository/subscribeRepo.go
index 4ecc1f7..7652195 100644
--- a/repository/subscribeRepo.go
+++ b/repository/subscribeRepo.go
@@ -163,7 +163,7 @@
 	sub.Status = subscribe.SubscribeStatus
 	sub.Ext = *subscribe
 
-	service.UpdateTaskProcs(subscribe.SubscribeID, vo.Msg_Type_Update_Subscribe, nil)
+	service.UpdateTaskProcs(subscribe.SubscribeID, vo.Msg_Type_Update_Subscribe, &sub)
 
 	return sub.Save()
 }

--
Gitblit v1.8.0