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