package pkg
|
|
import (
|
"fmt"
|
"strconv"
|
"strings"
|
)
|
|
// 生成一个包含楼层的人脸id,解析楼层
|
// 使用48位源id, 其中前41位是imageid, 不可以修改 41-43位填 06 代表图像, +99 + 3位楼层(第一位0表示正,1表示负)
|
func GenerateFaceIdContainFloor(srcId, floorStr string) string {
|
floorNum, _ := parseFloor(floorStr)
|
newId := srcId[0:43] + "99" + floorNum
|
//newId := srcId[0:43] + "99" + floorNum + snowflake.CreateRandomNumber(1)
|
|
return newId
|
}
|
|
func ParseFloorFromId(srcId string) (string, error) {
|
if len(srcId) != 48 {
|
return "", fmt.Errorf("invalid id %s", srcId)
|
}
|
|
if srcId[43:45] != "99" {
|
return "", fmt.Errorf("invalid flag %s", srcId[43:45])
|
}
|
|
return restoreFloor(srcId[45:48])
|
}
|
|
// 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
|
}
|