Ejemplo n.º 1
0
        /// <summary>
        /// 赛季奖品管理-更新赛季奖品的说明
        /// </summary>
        /// <param name="user"></param>
        /// <param name="request"></param>
        /// <param name="requestAborted"></param>
        /// <returns></returns>
        public async Task <ResponseMessage> MemoUpdateAsync(UserInfo user, PeriodGiftMemoRequest request, CancellationToken requestAborted)
        {
            var response       = new ResponseMessage();
            var periodGiftInfo = await _giftStore.GetPeriodGifts().Where(w => w.PeriodId == request.PeriodId).FirstOrDefaultAsync();

            if (periodGiftInfo == null)
            {
                periodGiftInfo = new PeriodGift
                {
                    Id       = Guid.NewGuid().ToString(),
                    Enabled  = request.Enabled,
                    PeriodId = request.PeriodId,
                    Score    = request.Score,
                    Memo     = request.Memo
                };
                await _giftStore.AddPeriodGift(periodGiftInfo, requestAborted);
            }
            else
            {
                periodGiftInfo.Enabled  = request.Enabled;
                periodGiftInfo.PeriodId = request.PeriodId;
                periodGiftInfo.Score    = request.Score;
                periodGiftInfo.Memo     = request.Memo;
                await _giftStore.UpdatePeriodGift(periodGiftInfo, requestAborted);
            }
            // 触发赛季信息变化
            await _sendClientMessageManager.SendInfos(new List <Dto.Common.SendClientType>()
            {
                Dto.Common.SendClientType.Season
            });

            return(response);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 自由交易-发起交易
        /// </summary>
        /// <param name="user"></param>
        /// <param name="dealSubmitRequest"></param>
        /// <param name="requestAborted"></param>
        /// <returns></returns>
        public async Task <ResponseMessage> DealSubmitAsync(UserInfo user, DealSubmitRequest dealSubmitRequest, CancellationToken requestAborted)
        {
            var response   = new ResponseMessage();
            var periodInfo = await _iDealStore.GetScorePeriods().Where(w => !w.IsDelete && w.Id == dealSubmitRequest.PeriodId).FirstOrDefaultAsync();

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

            var dealUserScoreInfo = await _iDealStore.GetScoreInfos().Where(w => !w.IsDelete && w.PeriodId == dealSubmitRequest.PeriodId && w.UserId == dealSubmitRequest.DealUserId).FirstOrDefaultAsync();

            if (submitUserScoreInfo == null || dealUserScoreInfo == null)
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "没有找到对应的积分信息";
                return(response);
            }
            if (submitUserScoreInfo.ConsumableScore < dealSubmitRequest.Score)
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "交易K币数不能大于自己的可消费K币数";
                return(response);
            }
            var userInfodGet = await _iDealStore.GetUserInfos().Where(w => w.Id == dealSubmitRequest.DealUserId).FirstOrDefaultAsync();

            if (userInfodGet == null)
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "交易对象用户不存在";
                return(response);
            }
            if (userInfodGet.Id == user.Id)
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "兄die,还是不要自己跟自己玩了吧,把积分交易给别人吧。";
                return(response);
            }

            var nowTime    = DateTime.Now;
            var dealNumber = Guid.NewGuid().ToString();                  //支出收入两条记录同一个编号

            dealSubmitRequest.Score = Math.Abs(dealSubmitRequest.Score); //防止反向交易
            #region 当前用户的支出信息
            var scoreDetailedOut = new ScoreDetailed
            {
                Id         = Guid.NewGuid().ToString(),
                PeriodId   = dealSubmitRequest.PeriodId,
                DealNumber = dealNumber,
                DealType   = 1,
                UserId     = user.Id,
                DealUserId = dealSubmitRequest.DealUserId,
                Theme      = dealSubmitRequest.Theme,
                Memo       = dealSubmitRequest.Memo,
                Score      = dealSubmitRequest.Score,
                ScoreId    = submitUserScoreInfo.Id,
                CreateTime = nowTime,
                CreateUser = user.Id,
                IsDelete   = false,
            };
            //submitUserScoreInfo.Score = submitUserScoreInfo.Score - dealSubmitRequest.Score;//等级积分减少
            submitUserScoreInfo.ConsumableScore = submitUserScoreInfo.ConsumableScore - dealSubmitRequest.Score;//消费积分减少
            #endregion

            #region 交易对象的收入信息
            var scoreDetailedGet = new ScoreDetailed
            {
                Id         = Guid.NewGuid().ToString(),
                PeriodId   = dealSubmitRequest.PeriodId,
                DealNumber = dealNumber,
                DealType   = 2,
                UserId     = dealSubmitRequest.DealUserId,
                DealUserId = user.Id,
                Theme      = dealSubmitRequest.Theme,
                Memo       = dealSubmitRequest.Memo,
                Score      = dealSubmitRequest.Score,
                ScoreId    = dealUserScoreInfo.Id,
                CreateTime = nowTime,
                CreateUser = user.Id,
                IsDelete   = false,
            };
            //dealUserScoreInfo.Score = dealUserScoreInfo.Score + dealSubmitRequest.Score;//等级积分增加
            dealUserScoreInfo.ConsumableScore = dealUserScoreInfo.ConsumableScore + dealSubmitRequest.Score;//消费积分增加
            #endregion

            var dynamicContent = string.Empty;

            //事务保存
            using (var trans = await _transaction.BeginTransaction())
            {
                try
                {
                    await _iDealStore.CreateScoreDetailedList(new List <ScoreDetailed> {
                        scoreDetailedOut, scoreDetailedGet
                    }, requestAborted);

                    await _iDealStore.UpdateScoreInfoList(new List <ScoreInfo> {
                        submitUserScoreInfo, dealUserScoreInfo
                    }, requestAborted);

                    //添加支出动态
                    await _dynamicHelper.AddDynamicContent(
                        DynamicType.DealExpenditure,
                        dealSubmitRequest.PeriodId,
                        scoreDetailedOut.Id,
                        user.UserName,
                        user.GroupName,
                        userInfodGet.UserName,
                        userInfodGet.GroupName,
                        user.Id,
                        dealSubmitRequest.Theme,
                        dealSubmitRequest.Score,
                        null,
                        null
                        );

                    //添加收入动态
                    dynamicContent = await _dynamicHelper.AddDynamicContent(
                        DynamicType.DealIncome,
                        dealSubmitRequest.PeriodId,
                        scoreDetailedOut.Id,
                        user.UserName,
                        user.GroupName,
                        userInfodGet.UserName,
                        userInfodGet.GroupName,
                        userInfodGet.Id,
                        dealSubmitRequest.Theme,
                        dealSubmitRequest.Score,
                        null,
                        null
                        );

                    trans.Commit();
                }
                catch (Exception e)
                {
                    trans.Rollback();
                    throw new Exception("保存事务失败", e);
                }
            }
            // 触发个人信息,动态变化
            await _sendClientMessageManager.SendInfos(new List <Dto.Common.SendClientType>()
            {
                Dto.Common.SendClientType.Dynamic,
                Dto.Common.SendClientType.User
            });

            #region K币交易发送提醒

            _hellperEmail.SendEmpPush($"您在《{periodInfo.Caption}》收到了K币,快去看看吧!",
                                      $"尊敬的勇士您好:{dynamicContent}赶紧去看看吧。",
                                      new List <string> {
                userInfodGet.UserId
            });

            #endregion

            return(response);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 完结任务
        /// </summary>
        /// <param name="user"></param>
        /// <param name="taskId"></param>
        /// <returns></returns>
        public async Task <ResponseMessage> OverTaskAsync(UserInfo user, string taskId)
        {
            var response = new ResponseMessage();
            var taskInfo = await _iTaskStore.GetTaskInfos().Where(w => !w.IsDelete && w.Id == taskId).FirstOrDefaultAsync();

            if (taskInfo == null)
            {
                response.Code    = ResponseCodeDefines.NotFound;
                response.Message = "未找到相关任务";
                return(response);
            }
            var periodInfo = await _iTaskStore.GetScorePeriods().Where(w => !w.IsDelete && w.Id == taskInfo.PeriodId).FirstOrDefaultAsync();

            if (periodInfo == null || periodInfo.State != 1)
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "只有进行中的赛季才能操作";
                return(response);
            }
            if (taskInfo.CreateUser != user.Id)
            {
                response.Code    = ResponseCodeDefines.NotAllow;
                response.Message = "不能操作其他人创建的任务";
                return(response);
            }

            //印象标签
            var userLabelList = new List <UserLabel>();
            var labelList     = new List <string>();

            if (!string.IsNullOrWhiteSpace(taskInfo.Labels))
            {
                //标签处理,现在只是去重做存储
                labelList = taskInfo.Labels.Replace(",", ",").Split(",").Where(w => !string.IsNullOrWhiteSpace(w)).Distinct().ToList();//请求的标签
                if (labelList.Where(w => w.Length > 12).Count() > 0)
                {
                    response.Code    = ResponseCodeDefines.NotAllow;
                    response.Message = "标签必须小于6个字";
                    return(response);
                }
            }
            //分配积分
            var taskUserList = await _iTaskStore.GetTaskUsers().Where(w => w.TaskId == taskId).Select(s => s.UserId).ToListAsync();

            var taskUserInfoList = await _iUserStore.GetUserInfos().Where(w => !w.IsDelete && taskUserList.Contains(w.Id)).ToListAsync();

            //平均每人分多少分
            int userScore = 0;

            //事务保存
            using (var trans = await _transaction.BeginTransaction())
            {
                try
                {
                    //查询拿到事务里面防止并发
                    var scoreInfoList = await _iTaskStore.GetScoreInfos().Where(w => !w.IsDelete && w.PeriodId == taskInfo.PeriodId && taskUserList.Contains(w.UserId)).ToListAsync();

                    if (!scoreInfoList.Any())
                    {
                        response.Code    = ResponseCodeDefines.NotFound;
                        response.Message = "未找到相关完成人";
                        return(response);
                    }
                    userScore = taskInfo.Score / scoreInfoList.Count;
                    var scoreDetailedList = new List <ScoreDetailed>();
                    foreach (var scoreInfo in scoreInfoList)
                    {
                        scoreInfo.Score           = scoreInfo.Score + userScore;
                        scoreInfo.ConsumableScore = scoreInfo.ConsumableScore + userScore;
                        //积分明细
                        scoreDetailedList.Add(new ScoreDetailed
                        {
                            Id         = Guid.NewGuid().ToString(),
                            PeriodId   = scoreInfo.PeriodId,
                            DealType   = 3,
                            UserId     = taskInfo.CreateUser,
                            TaskId     = taskInfo.Id,
                            DealUserId = user.Id,
                            Theme      = taskInfo.TaskName,
                            Memo       = taskInfo.TaskTntro,
                            Score      = userScore,
                            ScoreId    = scoreInfo.Id,
                            CreateTime = DateTime.Now,
                            CreateUser = user.Id,
                            IsDelete   = false,
                            Labels     = taskInfo.Labels
                        });
                        //印象标签
                        foreach (var lable in labelList)
                        {
                            userLabelList.Add(new UserLabel
                            {
                                Id     = Guid.NewGuid().ToString(),
                                UserId = scoreInfo.UserId,
                                Label  = lable,
                            });
                        }
                        //添加收入动态
                        await _dynamicHelper.AddDynamicContent(
                            DynamicType.TaskIncome,
                            taskInfo.PeriodId,
                            scoreInfo.Id,
                            null,
                            null,
                            taskUserInfoList.FirstOrDefault(fi => fi.Id == scoreInfo.UserId)?.UserName,
                            taskUserInfoList.FirstOrDefault(fi => fi.Id == scoreInfo.UserId)?.GroupName,
                            scoreInfo.UserId,
                            taskInfo.TaskName,
                            userScore,
                            null,
                            null
                            );
                    }
                    //更新任务
                    taskInfo.TaskState = 3;
                    await _iTaskStore.UpdateTaskInfoAsync(taskInfo);

                    //更新积分信息
                    await _iTaskStore.UpdateScoreInfoList(scoreInfoList);

                    //添加积分明细
                    if (scoreDetailedList != null && scoreDetailedList.Count != 0)
                    {
                        await _iTaskStore.CreateScoreDetailedList(scoreDetailedList);
                    }
                    //添加用户标签
                    if (userLabelList != null && userLabelList.Count != 0)
                    {
                        await _iTaskStore.CreateUserLabelList(userLabelList);
                    }
                    trans.Commit();
                }
                catch (Exception e)
                {
                    trans.Rollback();
                    throw new Exception("保存事务失败", e);
                }

                #region 任务完结发送提醒
                var usersIds = taskUserInfoList.Where(w => !string.IsNullOrWhiteSpace(w.UserId)).Select(s => s.UserId).ToList();
                if (usersIds.Any())
                {
                    _hellperEmail.SendEmpPush($"您在{periodInfo.Caption}中有任务已完结,快去看看吧!",
                                              $"尊敬的勇士您好:您在《{periodInfo.Caption}》中完成了任务《{taskInfo.TaskName}》获得了{userScore}K币,赶紧去看看吧。",
                                              usersIds);
                }
                #endregion
            }

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

            return(response);
        }
Ejemplo n.º 4
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);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 添加称号
        /// </summary>
        /// <param name="user"></param>
        /// <param name="titleRequest"></param>
        /// <param name="requestAborted"></param>
        /// <returns></returns>
        public async Task <ResponseMessage> AddTitleAsync(UserInfo user, TitleAddRequest titleRequest, CancellationToken requestAborted)
        {
            var response = new ResponseMessage();

            if (!user.IsAdmin)
            {
                response.Code    = ResponseCodeDefines.NotAllow;
                response.Message = "权限不足";
                return(response);
            }
            if (titleRequest.StartScore >= titleRequest.EndScore)
            {
                response.Code    = ResponseCodeDefines.NotFound;
                response.Message = "开始值不能大于或等于结束值";
                return(response);
            }

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

            if (periodInfo == null || periodInfo.State != 1)
            {
                response.Code    = ResponseCodeDefines.ModelStateInvalid;
                response.Message = "只有进行中的赛季才能操作";
                return(response);
            }
            var titles = await _iTitleStore.GetScoreTitles().Where(w => w.PeriodId == titleRequest.PeriodId && !w.IsDelete).ToListAsync();

            if (titles != null && titles.Count != 0)
            {
                if (titleRequest.EndScore <= titles.Max(w => w.EndScore) && (titleRequest.EndScore + 1) != titles.Min(w => w.StartScore))
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "开始值和结束值不能重复,且必须保持连续";
                    return(response);
                }
                if (titleRequest.StartScore >= titles.Min(w => w.StartScore) && (titleRequest.StartScore - 1) != titles.Max(w => w.EndScore))
                {
                    response.Code    = ResponseCodeDefines.ModelStateInvalid;
                    response.Message = "开始值和结束值不能重复,且必须保持连续";
                    return(response);
                }
            }
            //需要保存的数据
            var title = new RankTitle
            {
                Id         = Guid.NewGuid().ToString(),
                PeriodId   = titleRequest.PeriodId,
                Title      = titleRequest.Title,
                StartScore = titleRequest.StartScore,
                EndScore   = titleRequest.EndScore,
                Icon       = titleRequest.Icon?.Replace(_config["FileUrl"], ""),
                Card       = titleRequest.Card?.Replace(_config["FileUrl"], ""),
                CreateTime = DateTime.Now,
                CreateUser = user.Id,
                UpdateTime = DateTime.Now,
                UpdateUser = user.Id,
                IsDelete   = false,
                FontColor  = titleRequest.FontColor,
            };
            //保存
            await _iTitleStore.AddTitleAsync(title, requestAborted);

            // 触发赛季和排行榜
            await _sendClientMessageHelper.SendInfos(new List <Dto.Common.SendClientType>() { Dto.Common.SendClientType.Season, Dto.Common.SendClientType.Rank });

            return(response);
        }