132 lines
2.7 KiB
Go
132 lines
2.7 KiB
Go
package baishun
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// defaultIfBlank 在字符串为空时返回默认值。
|
|
func defaultIfBlank(value, fallback string) string {
|
|
if strings.TrimSpace(value) != "" {
|
|
return value
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
// pickFirstInt 从字符串中取第一个整数,失败时返回默认值。
|
|
func pickFirstInt(raw string, fallback int) int {
|
|
raw = strings.TrimSpace(raw)
|
|
if raw == "" {
|
|
return fallback
|
|
}
|
|
var list []int
|
|
if strings.HasPrefix(raw, "[") {
|
|
if json.Unmarshal([]byte(raw), &list) == nil && len(list) > 0 {
|
|
return list[len(list)-1]
|
|
}
|
|
}
|
|
if parsed, err := strconv.Atoi(raw); err == nil && parsed > 0 {
|
|
return parsed
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
// receiptTypeFromDiff 根据金额正负映射钱包收支类型。
|
|
func receiptTypeFromDiff(diff int64) string {
|
|
if diff >= 0 {
|
|
return "INCOME"
|
|
}
|
|
return "EXPENDITURE"
|
|
}
|
|
|
|
// abs64 返回 int64 的绝对值。
|
|
func abs64(value int64) int64 {
|
|
if value < 0 {
|
|
return -value
|
|
}
|
|
return value
|
|
}
|
|
|
|
// isBizMessageTooLongError 判断是否是业务描述超长错误。
|
|
func isBizMessageTooLongError(err error) bool {
|
|
if err == nil {
|
|
return false
|
|
}
|
|
message := strings.ToLower(err.Error())
|
|
return strings.Contains(message, "data too long") && strings.Contains(message, "biz_message")
|
|
}
|
|
|
|
// truncateRunes 按 rune 长度截断字符串。
|
|
func truncateRunes(value string, limit int) string {
|
|
if limit <= 0 || value == "" {
|
|
return ""
|
|
}
|
|
runes := []rune(value)
|
|
if len(runes) <= limit {
|
|
return value
|
|
}
|
|
return string(runes[:limit])
|
|
}
|
|
|
|
// parseInt64Default 解析字符串整数,失败时返回 0。
|
|
func parseInt64Default(value string) int64 {
|
|
parsed, _ := strconv.ParseInt(strings.TrimSpace(value), 10, 64)
|
|
return parsed
|
|
}
|
|
|
|
// sanitizeRoomID 规范化房间 ID。
|
|
func sanitizeRoomID(roomID string) string {
|
|
roomID = strings.ReplaceAll(strings.TrimSpace(roomID), " ", "_")
|
|
if roomID == "" {
|
|
return "room"
|
|
}
|
|
return roomID
|
|
}
|
|
|
|
// intPtr 返回 int 指针。
|
|
func intPtr(value int) *int {
|
|
return &value
|
|
}
|
|
|
|
// derefInt 安全解引用 int 指针。
|
|
func derefInt(value *int) int {
|
|
if value == nil {
|
|
return 0
|
|
}
|
|
return *value
|
|
}
|
|
|
|
// derefTime 安全解引用时间指针。
|
|
func derefTime(value *time.Time) time.Time {
|
|
if value == nil {
|
|
return time.Unix(0, 0)
|
|
}
|
|
return *value
|
|
}
|
|
|
|
// stringPtr 返回 string 指针。
|
|
func stringPtr(value string) *string {
|
|
if strings.TrimSpace(value) == "" {
|
|
return nil
|
|
}
|
|
return &value
|
|
}
|
|
|
|
// toString 宽松地把任意值转换成字符串。
|
|
func toString(value any) string {
|
|
if value == nil {
|
|
return ""
|
|
}
|
|
switch typed := value.(type) {
|
|
case string:
|
|
return typed
|
|
case json.Number:
|
|
return typed.String()
|
|
default:
|
|
return fmt.Sprint(typed)
|
|
}
|
|
}
|