在沃尔玛充值卡账户模块中新增了分组统计接口,支持获取各分组的账户统计信息,包括总数、正常状态和异常状态的账户数量及金额。同时,优化了相关数据模型和服务逻辑,提升了系统的统计能力和数据处理效率。这些改进有助于增强用户对账户状态的监控和管理。 feat(card_info_walmart): 更新分组统计功能和数据模型 在沃尔玛充值卡账户模块中,增强了分组统计功能,支持按日期、类别和创建用户ID进行统计。同时,优化了相关数据模型,确保统计结果的准确性和完整性。这些改进提升了系统的统计能力和用户对账户状态的管理效率。 feat(card_info_walmart): 更新分组统计功能以支持数据库配置 在沃尔玛充值卡账户模块中,更新了分组统计功能,新增了数据库配置的支持,确保在不同数据库环境下的正确操作。这些改进提升了系统的灵活性和稳定性。 feat(card_info_walmart): 更新分组统计功能以支持数据库配置 在沃尔玛充值卡账户模块中,修改了分组统计功能,新增了数据库配置支持,确保在不同数据库环境下的正确操作。这些改进提升了系统的灵活性和稳定性。 feat(card_info_walmart): 新增订单导出功能 在沃尔玛充值卡账户模块中,新增了订单导出接口,支持将订单信息导出为Excel文件。此功能包括订单的详细信息,如卡号、卡密、商户订单号等,提升了用户对订单数据的管理和分析能力。 feat(card_info_walmart): 增强订单导出功能的错误处理 在沃尔玛充值卡账户模块中,优化了订单导出功能,新增了错误处理逻辑以确保在获取订单列表失败时能够正确返回错误信息。同时,添加了数据缓冲到本地的注释,提升了代码的可读性和维护性。 feat(card_info_walmart): 新增账户分组导出功能 在沃尔玛充值卡账户模块中,新增了账户分组导出接口,支持将账户分组信息导出为Excel文件。此功能包括上传人昵称、分组名称、正常账户数量等详细信息,提升了用户对账户数据的管理和分析能力。同时,更新了分组统计功能以支持用户权限验证,确保数据安全性。 fix(card_info_walmart): 修正创建用户ID字段名称 在沃尔玛充值卡账户模块中,修正了分组统计功能中创建用户ID字段的名称,从`created_user_id`更改为`create_user_id`,确保SQL查询的正确性。这一改动提升了数据查询的准确性。 feat(card_info_walmart): 更新账户分组和订单导出功能 在沃尔玛充值卡账户模块中,新增了账户分组实体的删除状态字段,并在分组统计和订单导出功能中优化了分页逻辑,确保在当前页和每页大小为零时的处理。同时,增强了对已删除账户的统计,提升了数据的准确性和完整性。这些改进有助于用户更好地管理和分析账户数据。 feat(card_info_walmart): 增强账户分组导出功能 在沃尔玛充值卡账户模块中,更新了账户分组导出功能,新增了已删除账户数量的统计,并将导出文件保存到本地。此改进提升了数据导出的完整性和用户体验,同时优化了导出逻辑,确保用户能够方便地下载所需数据。 feat(card_info_walmart): 更新账户信息模型和导出功能 在沃尔玛充值卡账户模块中,新增了账户分组名称、创建时间、更新时间和删除时间字段,增强了账户信息的完整性。同时,更新了账户导出功能,支持在导出文件中显示分组信息和删除状态,提升了用户对账户数据的管理和分析能力。 feat(card_info_walmart): 增强账户信息模型,新增时间戳字段 在沃尔玛充值卡账户模块中,更新了账户信息模型,新增了创建时间、更新时间和删除时间字段,以提升账户信息的完整性。同时,优化了获取账户摘要的逻辑,确保在处理账户信息时能够正确返回相关时间戳数据。这些改进有助于用户更好地管理和分析账户数据。 feat(card_info_walmart): 优化账户信息和摘要获取逻辑 在沃尔玛充值卡账户模块中,更新了账户信息模型,将`AccountInfo`字段改为指针类型,以提高内存效率。同时,优化了获取账户摘要的逻辑,确保在处理账户信息时能够正确返回相关数据。这些改进提升了代码的可读性和性能。 feat(card_info_walmart): 更新账户信息和导出功能 在沃尔玛充值卡账户模块中,优化了账户信息导出功能,新增了分组ID和账户ID字段,以提升导出数据的完整性。同时,更新了相关逻辑以支持根据分组ID进行查询,增强了数据处理的灵活性和准确性。这些改进有助于用户更好地管理和分析账户数据。 feat(card_info_walmart): 优化分组统计逻辑和测试用例 在沃尔玛充值卡账户模块中,优化了分组统计功能,使用了更高效的集合操作以获取唯一的分组ID。同时,更新了相关测试用例,简化了参数传递,提升了代码的可读性和测试的准确性。这些改进有助于提高数据处理的性能和测试的可靠性。 feat(sysUser): 更新获取所有用户接口的描述和逻辑 在用户管理模块中,修改了获取所有用户的请求描述,将“商户”更改为“用户”,以提高接口的准确性。同时,增强了获取用户列表的逻辑,添加了权限验证,确保用户信息的安全性,并在返回数据时过滤掉当前用户的信息。这些改进提升了接口的可用性和安全性。 feat(card_info_walmart): 新增用户ID字段并更新相关逻辑 在沃尔玛充值卡账户模块中,新增了多个请求和响应结构中的用户ID字段,以提升用户信息的管理能力。同时,更新了相关逻辑以支持用户ID的传递,确保在处理账户和分组信息时能够正确识别用户。这些改进增强了系统的灵活性和数据处理的准确性。 feat(card_info_walmart): 新增用户ID字段并更新相关逻辑 在沃尔玛充值卡账户模块中,新增了`UserId`字段到分组统计请求结构体,并在相关逻辑中更新以支持用户ID的传递。这些改进确保在处理分组统计时能够正确识别用户信息,提升了系统的灵活性和数据处理的准确性。
128 lines
3.7 KiB
Go
128 lines
3.7 KiB
Go
package cache
|
|
|
|
import (
|
|
"context"
|
|
"reflect"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
|
"github.com/gogf/gf/v2/os/glog"
|
|
|
|
"github.com/duke-git/lancet/v2/slice"
|
|
"github.com/gogf/gf/v2/net/gtrace"
|
|
"github.com/gogf/gf/v2/os/gcache"
|
|
"github.com/gogf/gf/v2/util/gconv"
|
|
"github.com/gogf/gf/v2/util/guid"
|
|
"go.opentelemetry.io/otel/trace"
|
|
)
|
|
|
|
type Cache struct {
|
|
*gcache.Cache
|
|
}
|
|
|
|
type TraceContext struct {
|
|
TraceID string
|
|
SpanID string
|
|
ParentID string
|
|
Attributes map[string]string
|
|
}
|
|
|
|
type PrefixEnum string
|
|
|
|
const (
|
|
PrefixRedeemType PrefixEnum = "redeem_type"
|
|
PrefixRedeemWithPaymentType PrefixEnum = "redeem_with_payment_type"
|
|
PrefixRedeemAppleAccountLimitedType PrefixEnum = "redeem_apple_account_limited_type"
|
|
PrefixAccountLimiterType PrefixEnum = "account_limiter_type"
|
|
PrefixJDAccountQueryCache PrefixEnum = "jd_account_query_cache"
|
|
PrefixJDAccountQueryBalanceWithCookie PrefixEnum = "jd_account_query_cache_with_cookie"
|
|
PrefixWalmartAccountQueryCache PrefixEnum = "walmart_account_query_cache"
|
|
PrefixWalmartAccountQueryBalanceWithCookie PrefixEnum = "walmart_account_query_cache_with_cookie"
|
|
PrefixAppleMachineAccount PrefixEnum = "MachineCurrentAccountId"
|
|
PrefixAppleDuplicatedOrder PrefixEnum = "apple_duplicated_order"
|
|
PrefixTrace PrefixEnum = "trace"
|
|
)
|
|
|
|
func (e PrefixEnum) Key(key interface{}) string {
|
|
return gconv.String(e) + ":" + gconv.String(key)
|
|
}
|
|
|
|
func NewCache() *Cache {
|
|
if cache == nil {
|
|
once.Do(func() {
|
|
cache = &Cache{
|
|
Cache: gcache.New(),
|
|
}
|
|
// cache.SetAdapter(gcache.NewAdapterMemory())
|
|
cache.SetAdapter(gcache.NewAdapterRedis(g.Redis()))
|
|
})
|
|
}
|
|
return cache
|
|
}
|
|
|
|
// Incr 设置计数器缓存
|
|
func (i *Cache) Incr(ctx context.Context, key string, duration time.Duration) (err error) {
|
|
result, err := i.Get(ctx, key)
|
|
if result == nil || result.IsNil() {
|
|
_ = i.Set(ctx, key, 1, duration)
|
|
return
|
|
}
|
|
_, _, err = i.Update(ctx, key, result.Int()+1)
|
|
return
|
|
}
|
|
|
|
// Decr 递减缓存
|
|
func (i *Cache) Decr(ctx context.Context, key string, duration time.Duration) (err error) {
|
|
result, err := i.Get(ctx, key)
|
|
if result == nil || result.IsNil() {
|
|
_ = i.Set(ctx, key, 0, duration)
|
|
return
|
|
}
|
|
_, _, err = i.Update(ctx, key, result.Int()-1)
|
|
return
|
|
}
|
|
|
|
// GetPrefixKeyNum 获取指定以键为开头的键值对个数
|
|
func (i *Cache) GetPrefixKeyNum(ctx context.Context, key interface{}) (count int) {
|
|
keys, _ := i.Keys(ctx)
|
|
count = slice.CountBy(keys, func(index int, item interface{}) bool {
|
|
return strings.HasPrefix(item.(string), key.(string))
|
|
})
|
|
return
|
|
}
|
|
|
|
// SaveTrace 存储追踪信息到Redis中
|
|
// SaveTraceToRedis 保存追踪信息到Redis
|
|
func (i *Cache) SaveTrace(ctx context.Context, key string) error {
|
|
spanCtx := trace.SpanContextFromContext(ctx)
|
|
if spanCtx.IsValid() {
|
|
return i.Set(ctx, PrefixTrace.Key(key), spanCtx, time.Minute*10)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// GetTrace 获取追踪信息(恢复追踪能力)
|
|
func (i *Cache) GetTrace(ctx context.Context, key string) context.Context {
|
|
value, err := i.Get(ctx, PrefixTrace.Key(key))
|
|
if err != nil || value == nil || value.IsNil() || reflect.TypeOf(value.Interface()) != reflect.TypeOf(trace.SpanContext{}) {
|
|
return ctx
|
|
}
|
|
spanCtx, ok := value.Interface().(trace.SpanContext)
|
|
if !ok {
|
|
glog.Error(ctx, "获取追踪信息失败,类型错误")
|
|
return ctx
|
|
}
|
|
return trace.ContextWithRemoteSpanContext(ctx, spanCtx)
|
|
}
|
|
|
|
// GetTraceID 获取追踪的唯一id
|
|
func (i *Cache) GetTraceID(ctx context.Context) string {
|
|
return gtrace.GetSpanID(ctx) + "-" + guid.S()
|
|
}
|
|
|
|
// DeleteTrace 删除追踪信息
|
|
func (i *Cache) DeleteTrace(ctx context.Context, key string) {
|
|
_, _ = i.Remove(ctx, PrefixTrace.Key(key))
|
|
}
|