public async Task <GameSubActInfo> GetGameActProgress(DateTime time, long id, string activityId, string subId)
        {
            GameSubActInfo subAct = await RedisOpt.GetHashValueAsync <GameSubActInfo>
                                        (KeyGenTool.GenUserDayKey(time, id, "GameActivity", activityId), subId);

            return(subAct);
        }
        public async Task <List <OneGameActivityInfoVM> > Handle(GameActivityCommand request,
                                                                 CancellationToken cancellationToken)
        {
            //通过配置获取今天所有的打牌活动activeId;
            DateTime tnow = DateTime.Now;
            List <Task <OneGameActivityInfo> > tasks = new List <Task <OneGameActivityInfo> >();

            foreach (var oneActivitty in _activityConfig.AllGameConfigs)
            {
                if (oneActivitty.ActivityType == request.Type)
                {
                    tasks.Add(_redis.GetGameActivity(tnow, request.Id,
                                                     oneActivitty.ActivityId));
                }
            }
            await Task.WhenAll(tasks);

            List <OneGameActivityInfo>   playActivityInfos = tasks.Select(x => x.Result).ToList();
            List <OneGameActivityInfoVM> gameActivityVMs   = new List <OneGameActivityInfoVM>();

            foreach (var one in playActivityInfos)
            {
                var oneConfig = _activityConfig.AllGameConfigs.Find(x => x.ActivityId == one.ActivityId);
                var roomList  = new List <OneRoomActivityInfoVM>();
                foreach (var oneRoom in oneConfig.RoomConfigs)
                {
                    if (!one.CountProgress.TryGetValue(oneRoom.SubId, out var subAct))
                    {
                        subAct = new GameSubActInfo(0, 0);
                    }
                    OneRoomActivityInfoVM oneRoomInfo =
                        new OneRoomActivityInfoVM()
                    {
                        CurCount    = subAct.CurCount,
                        State       = subAct.State,
                        NeedCount   = oneRoom.NeedCount,
                        RewardCoins = oneRoom.RewardCoins,
                        SubId       = oneRoom.SubId,
                        Title       = oneRoom.Title
                    };
                    roomList.Add(oneRoomInfo);
                }
                OneGameActivityInfoVM oneInfo = new OneGameActivityInfoVM(one.ActivityId, oneConfig.Title, roomList);
                gameActivityVMs.Add(oneInfo);
            }

            return(gameActivityVMs);
        }
        public void DealOneRoom(DateTime time, List <long> players, string actId, string subId)
        {
            ParallelLoopResult result = Parallel.ForEach(players, async player =>
            {
                using var locker = _redis.Locker(KeyGenTool.GenUserDayKey(time, player, "GameActivity", actId));

                await locker.LockAsync();
                var oneSub = await _redis.GetGameActProgress(time, player, actId, subId);
                if (oneSub == null)
                {
                    oneSub = new GameSubActInfo(0, 0);
                }
                if (oneSub.State == 1)
                {
                    return;
                }
                ++oneSub.CurCount;
                await _redis.SetGameActProgress(time, player, actId, subId, oneSub);
            });
        }
 public Task SetGameActProgress(DateTime time, long id, string activityId,
                                string subId, GameSubActInfo subAct)
 {
     return(RedisOpt.AddHashValueAsync(KeyGenTool.GenUserDayKey(time, id,
                                                                "GameActivity", activityId), subId, subAct, TimeSpan.FromDays(1)));
 }