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, _ := BuildFloorString("0", floorStr)
|
newId := srcId[0:43] + "99" + floorNum
|
//newId := srcId[0:43] + "99" + floorNum + snowflake.CreateRandomNumber(1)
|
|
return newId
|
}
|
|
func ParseFloorFromId(srcId string) (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])
|
}
|
|
// BuildFloorString parses the floor string and returns a string
|
func BuildFloorString(direction, floor string) (string, error) {
|
var dire string
|
var sign string
|
var number string
|
|
switch direction {
|
case "in":
|
dire = "1"
|
case "out":
|
dire = "2"
|
default:
|
dire = "0"
|
}
|
|
// 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 dire + sign + formattedNumber, nil
|
}
|
|
// RestoreFloor restores the three-character string back to the original floor string
|
func RestoreFloor(encoded string) (string, string, error) {
|
var direction, sign uint8
|
var floorNumber, floorStr, directionStr string
|
|
// 3位是旧的格式, 为了兼容, 暂时保留
|
if len(encoded) == 3 {
|
sign = encoded[0]
|
floorNumber = encoded[1:]
|
} else if len(encoded) == 4 {
|
direction = encoded[0]
|
sign = encoded[1]
|
floorNumber = encoded[2:]
|
} else {
|
return "", "", fmt.Errorf("encoded string must be 3 characters long")
|
}
|
|
// Convert the number back to integer to remove any leading zeros
|
parsedNumber, err := strconv.Atoi(floorNumber)
|
if err != nil {
|
return "", "", err
|
}
|
|
if sign == '1' {
|
floorStr = fmt.Sprintf("-%dF", parsedNumber)
|
} else if sign == '0' {
|
floorStr = fmt.Sprintf("%dF", parsedNumber)
|
} else {
|
return "", "", fmt.Errorf("invalid sign character in encoded string")
|
}
|
|
if direction == '1' {
|
directionStr = "in"
|
} else if direction == '2' {
|
directionStr = "out"
|
}
|
|
return directionStr, floorStr, nil
|
}
|
|
func CheckDirection(str1, str2 string) string {
|
// 去掉字符串最后一个字符 'F'
|
numStr1 := strings.TrimSuffix(str1, "F")
|
numStr2 := strings.TrimSuffix(str2, "F")
|
|
// 转换为 int 类型
|
num1, err1 := strconv.Atoi(numStr1)
|
num2, err2 := strconv.Atoi(numStr2)
|
|
// 检查转换是否成功
|
if err1 != nil || err2 != nil {
|
return ""
|
}
|
|
// 比较两个整数的大小
|
if num1 > num2 {
|
return "out"
|
} else {
|
return "in"
|
}
|
}
|