package utils import ( "encoding/json" "errors" "fmt" "github.com/fonchain_enterprise/fonchain-main/pkg/cache" "github.com/fonchain_enterprise/fonchain-main/pkg/config" "github.com/fonchain_enterprise/fonchain-main/pkg/model/vo/turnstile" "github.com/go-redis/redis" "github.com/google/uuid" "time" ) func IssueTheCardPunchData(info turnstile.TurnStile, deviceNum string, uuid uuid.UUID) (err error, msg turnstile.WebsocketDeviceRes) { turnRes := &turnstile.WebsocketDeviceRes{} modifyUserIdIfNeeded(&info) str, err := json.Marshal(info) if err != nil { return errors.New("请求参数错误"), *turnRes } err = PushToRedis(deviceNum, str) if err != nil { return errors.New("推送数据到 Redis 失败"), *turnRes } //监听10秒 dataChannel := make(chan string) go func() { time.Sleep(10 * time.Second) dataChannel <- "data" }() for { //var turnRes *turnstile.WebsocketDeviceRes select { case data := <-dataChannel: fmt.Println("Received data:", data) return errors.New("连接打卡机超时"), *turnRes default: } var redisClient *redis.Client if config.IsOut == true { redisClient = GetNewRedisClient() } else { redisClient = cache.RedisClient } deviceRes, err := redisClient.Get(cache.GetPushResInfo(uuid.String())).Result() fmt.Println("设备返回数据====:", deviceRes) if deviceRes == "" || err != nil { time.Sleep(100 * time.Millisecond) continue } if err = json.Unmarshal([]byte(deviceRes), &turnRes); err != nil { return err, *turnRes } if turnRes.Data.Code != 0 { return errors.New(turnRes.Data.Msg), *turnRes } redisClient.Del(cache.GetPushResInfo(deviceNum)) break } return nil, *turnRes } // 如果满足条件则修改 user_id func modifyUserIdIfNeeded(info *turnstile.TurnStile) { if config.IsOut == true && config.Env == "prod" { // 修改 UserId 字段 if info.Data.UserId != "" { info.Data.UserId += "out" fmt.Println("user_id 已修改为:", info.Data.UserId) } // 修改 UserIds 字段 for i := range info.Data.UserIds { info.Data.UserIds[i] += "out" fmt.Println("user_ids 已修改为:", info.Data.UserIds[i]) } } } func PushToRedis(deviceNum string, str []byte) error { var redisClient *redis.Client if config.IsOut == true && config.Env == "prod" { redisClient = GetNewRedisClient() } else { redisClient = cache.RedisClient } return redisClient.RPush(cache.GetTurnstileSendListKey(deviceNum), string(str)).Err() } // 获取新的 Redis 客户端 func GetNewRedisClient() *redis.Client { return redis.NewClient(&redis.Options{ Addr: "r-bp1mjimyh1ejg1mxclpd.redis.rds.aliyuncs.com:6379", // 替换为实际的地址和端口 Password: "fonchain_opv:kP6tW4tS3qB2dW4aE6uI5cX2", // Redis密码 DB: 15, // Redis数据库 }) }