コード例 #1
0
        /// <summary>
        /// 派发K币-提交
        /// </summary>
        /// <param name="user"></param>
        /// <param name="allocateSubmitRequest"></param>
        /// <param name="requestAborted"></param>
        /// <param name="isEgg">是否彩蛋,默认不是,主要控制邮件发送</param>
        /// <returns></returns>
        public async Task <ResponseMessage> AllocateSubmitAsync(UserInfo user, AllocateSubmitRequest allocateSubmitRequest, CancellationToken requestAborted, bool isEgg = false)
        {
            var response = new ResponseMessage();

            var periodInfo = await _iAllocateStore.GetScorePeriods().Where(w => !w.IsDelete && w.Id == allocateSubmitRequest.PeriodId).FirstOrDefaultAsync();

            if (periodInfo == null || periodInfo.State != 1)
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "只有进行中的赛季才能操作";
                return(response);
            }
            var scoreInfo = await _iAllocateStore.GetScoreInfos().Where(w => !w.IsDelete && w.PeriodId == allocateSubmitRequest.PeriodId && w.UserId == allocateSubmitRequest.AllocateUserId).FirstOrDefaultAsync();

            if (scoreInfo == null)
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "没有找到派发对象的积分信息";
                return(response);
            }

            var allocateUserInfo = await _iAllocateStore.GetUserInfos().Where(w => w.Id == allocateSubmitRequest.AllocateUserId).FirstOrDefaultAsync();

            if (allocateUserInfo == null)
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "派发对象用户不存在";
                return(response);
            }

            #region 派发对象的收入信息
            var scoreDetailed = new ScoreDetailed
            {
                Id         = Guid.NewGuid().ToString(),
                PeriodId   = allocateSubmitRequest.PeriodId,
                DealType   = 4,
                UserId     = user.Id,//派发人的ID
                DealUserId = allocateSubmitRequest.AllocateUserId,
                Theme      = allocateSubmitRequest.Theme,
                Memo       = allocateSubmitRequest.Memo,
                Score      = allocateSubmitRequest.Score ?? 1,
                ScoreId    = scoreInfo.Id,
                CreateTime = DateTime.Now,
                CreateUser = user.Id,
                IsDelete   = false,
                Labels     = allocateSubmitRequest.Labels
            };
            scoreInfo.Score           = scoreInfo.Score + allocateSubmitRequest.Score ?? 0;
            scoreInfo.ConsumableScore = scoreInfo.ConsumableScore + allocateSubmitRequest.Score ?? 0;
            #endregion

            #region 派发对象的印象标签
            var userLabelList = new List <UserLabel>();
            if (!string.IsNullOrWhiteSpace(allocateSubmitRequest.Labels))
            {
                //标签处理,现在只是去重做存储
                var labelList = allocateSubmitRequest.Labels.Replace(",", ",").Split(",").Where(w => !string.IsNullOrWhiteSpace(w)).Select(s => s.ToLower()).Distinct().ToList();//请求的标签
                if (labelList.Where(w => w.Length > 12).Count() > 0)
                {
                    response.Code    = ResponseCodeDefines.NotAllow;
                    response.Message = "单个标签必须小于6个字";
                    return(response);
                }
                foreach (var lable in labelList)
                {
                    userLabelList.Add(new UserLabel
                    {
                        Id     = Guid.NewGuid().ToString(),
                        UserId = allocateUserInfo.Id,
                        Label  = lable,
                    });
                }
            }
            #endregion
            //事务保存
            using (var trans = await _transaction.BeginTransaction())
            {
                try
                {
                    await _iAllocateStore.CreateScoreDetailed(scoreDetailed, requestAborted);

                    await _iAllocateStore.UpdateScoreInfo(scoreInfo, requestAborted);

                    if (userLabelList != null && userLabelList.Count != 0)
                    {
                        await _iAllocateStore.CreateUserLabelList(userLabelList, requestAborted);
                    }

                    //添加派发动态
                    await _dynamicHelper.AddDynamicContent(
                        DynamicType.DistributeIncome,
                        allocateSubmitRequest.PeriodId,
                        scoreDetailed.Id,
                        null,
                        null,
                        allocateUserInfo.UserName,
                        allocateUserInfo.GroupName,
                        allocateUserInfo.Id,
                        allocateSubmitRequest.Theme,
                        allocateSubmitRequest.Score ?? 1,
                        null,
                        null
                        );

                    trans.Commit();
                }
                catch (Exception e)
                {
                    trans.Rollback();
                    throw new Exception("保存事务失败", e);
                }
            }
            #region 派发积分发送提醒

            if (isEgg)
            {
                //一个彩蛋一个用户只会提醒一次
                var isSend = await _iAllocateStore.GetScoreDetaileds().AnyAsync(w => !w.IsDelete && w.Memo == allocateSubmitRequest.Memo && w.DealUserId == allocateSubmitRequest.AllocateUserId);

                if (isSend)
                {
                    return(response);
                }
            }
            _hellperEmail.SendEmpPush("您收到了新的积分,快去看看吧!",
                                      $"尊敬的勇士您好:您在《{periodInfo.Caption}》因为《{allocateSubmitRequest.Theme}》获得了{allocateSubmitRequest.Score ?? 1}K币,赶紧去看看吧。",
                                      new List <string> {
                allocateUserInfo.UserId
            });

            #endregion

            // 触发排行榜,个人信息,动态变化
            await _sendClientMessageManager.SendInfos(new List <Dto.Common.SendClientType>()
            {
                Dto.Common.SendClientType.Rank,
                Dto.Common.SendClientType.Dynamic,
                Dto.Common.SendClientType.User
            });

            return(response);
        }
コード例 #2
0
ファイル: GiftManager.cs プロジェクト: LYD2015/PointsGame
        /// <summary>
        /// 抽奖/兑奖
        /// </summary>
        /// <param name="user"></param>
        /// <param name="request"></param>
        /// <param name="requestAborted"></param>
        /// <returns></returns>
        public async Task <ResponseMessage <GiftInfo> > ConsumableScoreAsync(UserInfo user, ConsumableScoreRequest request, CancellationToken requestAborted)
        {
            var response   = new ResponseMessage <GiftInfo>();
            var periodGift = await _giftStore.GetPeriodGifts().Where(w => w.PeriodId == request.PeriodId).FirstOrDefaultAsync();

            if (periodGift == null || periodGift.Enabled == false)
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "当前赛季奖品暂未开放";
                return(response);
            }
            //抽奖
            if (request.ConsumableType == 1)
            {
                var giftInfoList = await _giftStore.GetGiftInfos().Where(w => !w.IsDelete && w.PeriodId == request.PeriodId).ToListAsync();

                if (!giftInfoList.Any())
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "没有奖品可供抽取";
                    return(response);
                }
                var scoreInfo = await _allocateStore.GetScoreInfos().Where(w => !w.IsDelete && w.PeriodId == request.PeriodId && w.UserId == user.Id).FirstOrDefaultAsync();

                if (scoreInfo == null)
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "未查询到您的积分信息";
                    return(response);
                }
                if (scoreInfo.ConsumableScore < periodGift.Score)
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "您的可消费K币不足,赶紧去赚点K币吧";
                    return(response);
                }

                //总几率
                var sumOdds = giftInfoList.Sum(s => s.Odds);
                if (sumOdds > 1000)
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "奖品设置异常,请联系管理员。";
                    return(response);
                }
                var giftList = giftInfoList.Where(w => w.Number != 0).ToList();//排除抽完的奖品
                if (!giftList.Any())
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "所有奖品已被抽取/兑换完,请等待新奖品上架吧。";
                    return(response);
                }

                //将奖品ID和中奖率放在数组中,并从小到大排序
                var prizeList = giftList.Select(s => new { Prize = s.Id, Change = s.Odds }).OrderBy(o => o.Change).ToList();
                //将中奖率累加,放到字典里
                var prizeDictionary = new Dictionary <string, int>();
                for (var i = 0; i < giftList.Count; i++)
                {
                    var allChange = 0;
                    for (var j = 0; j <= i; j++)
                    {
                        allChange += prizeList[j].Change;
                    }
                    prizeDictionary.Add(prizeList[i].Prize, allChange);
                }
                //产生一个1-1000的随机数
                var rd       = new Random();
                var rdChange = rd.Next(1, 1001);
                //找第一个大于随机值的奖项,如果中途有奖品抽完了,找不到到大于随机值的奖项,就直接取几率最大
                var giftResult_Id = prizeDictionary.FirstOrDefault(j => j.Value >= rdChange).Key ?? prizeDictionary.LastOrDefault().Key;
                var giftInfo      = giftInfoList.FirstOrDefault(fi => fi.Id == giftResult_Id);

                if (giftInfo.Number > 0)
                {
                    giftInfo.Number -= 1;
                }

                //事务保存
                using (var trans = await _transaction.BeginTransaction())
                {
                    try
                    {
                        //事务里面重新查一次
                        scoreInfo = await _allocateStore.GetScoreInfos().Where(w => !w.IsDelete && w.PeriodId == request.PeriodId && w.UserId == user.Id).FirstOrDefaultAsync();

                        if (scoreInfo == null)
                        {
                            response.Code    = ResponseCodeDefines.ModelStateInvalid;
                            response.Message = "未查询到您的积分信息";
                            return(response);
                        }
                        scoreInfo.ConsumableScore = scoreInfo.ConsumableScore - periodGift.Score;
                        await _allocateStore.UpdateScoreInfo(scoreInfo, requestAborted);

                        await _giftStore.UpdateGift(giftInfo, requestAborted);

                        //添加抽奖动态
                        await _dynamicHelper.AddDynamicContent(
                            DynamicType.RandomGift,
                            request.PeriodId,
                            giftInfo.Id,
                            null,
                            null,
                            user.UserName,
                            user.GroupName,
                            user.Id,
                            giftInfo.Name,
                            periodGift.Score,
                            null,
                            null
                            );

                        trans.Commit();
                    }
                    catch (Exception e)
                    {
                        trans.Rollback();
                        throw new Exception("保存事务失败", e);
                    }
                }
                response.Extension = giftInfo;
            }
            //兑奖
            else if (request.ConsumableType == 2)
            {
                var scoreInfo = await _allocateStore.GetScoreInfos().Where(w => !w.IsDelete && w.PeriodId == request.PeriodId && w.UserId == user.Id).FirstOrDefaultAsync();

                if (scoreInfo == null)
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "未查询到您的积分信息";
                    return(response);
                }
                var giftInfo = await _giftStore.GetGiftInfos().Where(w => !w.IsDelete && w.PeriodId == request.PeriodId && w.Number != 0 && w.Id == request.GiftId).FirstOrDefaultAsync();

                if (giftInfo == null)
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "兑换奖品不存在";
                    return(response);
                }
                if (!giftInfo.IsGet)
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = $"兑换奖品{giftInfo.Name}不运行直接兑换";
                    return(response);
                }
                if (scoreInfo.ConsumableScore < giftInfo.GetScore)
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "您的可消费K币不足,赶紧去赚点K币吧";
                    return(response);
                }
                if (giftInfo.Number == 0)
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "奖品数量不足不能直接兑换";
                    return(response);
                }
                if (giftInfo.Number > 0)
                {
                    giftInfo.Number -= 1;
                }

                //事务保存
                using (var trans = await _transaction.BeginTransaction())
                {
                    try
                    {
                        //事务里面重新查一次
                        scoreInfo = await _allocateStore.GetScoreInfos().Where(w => !w.IsDelete && w.PeriodId == request.PeriodId && w.UserId == user.Id).FirstOrDefaultAsync();

                        if (scoreInfo == null)
                        {
                            response.Code    = ResponseCodeDefines.ModelStateInvalid;
                            response.Message = "未查询到您的积分信息";
                            trans.Rollback();
                            return(response);
                        }
                        scoreInfo.ConsumableScore = scoreInfo.ConsumableScore - giftInfo.GetScore;
                        await _allocateStore.UpdateScoreInfo(scoreInfo, requestAborted);

                        await _giftStore.UpdateGift(giftInfo, requestAborted);

                        //添加直接兑换动态
                        await _dynamicHelper.AddDynamicContent(
                            DynamicType.GetGift,
                            request.PeriodId,
                            giftInfo.Id,
                            null,
                            null,
                            user.UserName,
                            user.GroupName,
                            user.Id,
                            giftInfo.Name,
                            periodGift.Score,
                            null,
                            null
                            );

                        trans.Commit();
                    }
                    catch (Exception e)
                    {
                        trans.Rollback();
                        throw new Exception("保存事务失败", e);
                    }
                }
                response.Extension = giftInfo;
            }
            else
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "ConsumableType参数错误";
                return(response);
            }

            // 触发个人信息变化
            await _sendClientMessageManager.SendInfos(new List <Dto.Common.SendClientType>()
            {
                Dto.Common.SendClientType.User,
                Dto.Common.SendClientType.Dynamic
            });

            return(response);
        }