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