Beispiel #1
0
        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);
        }
Beispiel #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);
        }