public async Task <ResponseMessage> DealSubmit(Models.UserInfo user, [FromBody] DealSubmitRequest dealSubmitRequest) { Logger.Trace($"用户{user?.UserName ?? ""}({user?.Id ?? ""})查询交易列表,请求参数为:\r\n" + (dealSubmitRequest != null ? JsonHelper.ToJson(dealSubmitRequest) : "")); var response = new ResponseMessage(); if (!ModelState.IsValid) { response.Code = ResponseCodeDefines.ArgumentNullError; response.Message = "模型验证失败" + ModelState.GetAllErrors(); Logger.Warn("发起交易模型验证失败:\r\n{0}", response.Message ?? ""); return(response); } var prefixs = new string[] { "DealController" }; var key = $"{user.Id}{dealSubmitRequest.Theme}{dealSubmitRequest.Score}"; try { // 防止重复提交 await _cache.LockSubmit(prefixs, key, "DealSubmit", HttpContext.RequestAborted); response = await _dealManager.DealSubmitAsync(user, dealSubmitRequest, HttpContext.RequestAborted); } catch (Exception e) { response.Code = ResponseCodeDefines.ServiceError; response.Message = e.Message; Logger.Error($"用户{user?.UserName ?? ""}({user?.Id ?? ""})发起交易,报错:{e.Message}\r\n{e.StackTrace}"); } finally { // 成功失败都要移除 await _cache.UnlockSubmit(prefixs, key); } 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); }