/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }