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 }