public async Task <WrappedResponse <MoneyInfo> > Handle(AddMoneyCommand request, CancellationToken cancellationToken) { using var locker = _moneyRedisRep.Locker(KeyGenTool.GenUserKey(request.Id, MoneyInfo.ClassName)); await locker.LockAsync(); Log.Debug($"AddMoneyCommand add begin:{request.AddCoins},{request.AddCarry} {request.AggregateId}"); var moneyInfo = await _moneyRedisRep.GetMoneyInfo(request.Id); if (moneyInfo == null) { moneyInfo = await _moneyRep.FindAndAdd(request.Id, new MoneyInfo(request.Id, 0, 0, 0, 0, 0)); } if (request.AddCoins < 0 && System.Math.Abs(request.AddCoins) > moneyInfo.CurCoins) { Log.Debug($"AddMoneyCommand add end:{request.AddCoins},{request.AddCarry} {request.AggregateId}--1"); return(new WrappedResponse <MoneyInfo> (ResponseStatus.NoEnoughMoney, null, null)); } if (request.AddCarry < 0 && System.Math.Abs(request.AddCarry) > moneyInfo.Carry) { Log.Debug($"AddMoneyCommand add end:{request.AddCoins},{request.AddCarry} {request.AggregateId}--2"); return(new WrappedResponse <MoneyInfo> (ResponseStatus.NoEnoughMoney, null, null)); } moneyInfo.AddCoins(request.AddCoins); moneyInfo.AddCarry(request.AddCarry); moneyInfo.UpdateMaxCoins(); long coinsChangedCount = request.AddCoins + request.AddCarry; var moneyevent = new MoneyChangedMqEvent (moneyInfo.Id, moneyInfo.CurCoins, moneyInfo.CurDiamonds, moneyInfo.MaxCoins, moneyInfo.MaxDiamonds, coinsChangedCount, 0, request.Reason); _ = _busCtl.Publish(moneyevent); // _busCtl.PublishServerReqExt(moneyInfo.Id, moneyevent); await Task.WhenAll(_moneyRedisRep.SetMoneyInfo(moneyInfo), _moneyRep.ReplaceAsync(moneyInfo)); Log.Debug($"AddMoneyCommand add end:{request.AddCoins},{request.AddCarry} {request.AggregateId} curCoins:{moneyInfo.CurCoins} curCarry:{moneyInfo.Carry}--3"); return(new WrappedResponse <MoneyInfo>(ResponseStatus.Success, null, new MoneyInfo(request.Id, moneyInfo.CurCoins, moneyInfo.CurDiamonds, moneyInfo.MaxCoins, moneyInfo.MaxDiamonds, moneyInfo.Carry))); }
public async Task <BodyResponse <MoneyMqResponse> > Handle(BuyInCommand request, CancellationToken cancellationToken) { using (var locker = _redis.Locker(KeyGenHelper.GenUserKey(request.Id, MoneyInfo.ClassName))) { await locker.LockAsync(); var moneyInfo = await _redis.GetMoney(request.Id); if (moneyInfo == null) { moneyInfo = await _moneyRepository.FindAndAdd(request.Id, new MoneyInfo(request.Id, 0, 0, 0, 0, 0)); } if (moneyInfo.CurCoins + moneyInfo.Carry < request.MinBuy) { return(new BodyResponse <MoneyMqResponse> (StatusCodeDefines.NoEnoughMoney, null, null)); } long realBuy = 0; if (moneyInfo.CurCoins + moneyInfo.Carry >= request.MaxBuy) { realBuy = request.MaxBuy; } else { realBuy = moneyInfo.CurCoins + moneyInfo.Carry; } long left = moneyInfo.Carry - realBuy; if (left < 0) { moneyInfo.AddCoins(left); moneyInfo.AddCarry(realBuy); } var moneyevent = new MoneyChangedMqEvent (moneyInfo.Id, moneyInfo.CurCoins, moneyInfo.CurDiamonds, moneyInfo.MaxCoins, moneyInfo.MaxDiamonds, 0, 0); _busCtl.PublishExt(moneyevent); await Task.WhenAll(_redis.SetMoney(request.Id, moneyInfo), _moneyRepository.ReplaceAsync(moneyInfo)); return(new BodyResponse <MoneyMqResponse>(StatusCodeDefines.Success, null, new MoneyMqResponse(request.Id, moneyInfo.CurCoins, moneyInfo.CurDiamonds, moneyInfo.MaxCoins, moneyInfo.MaxDiamonds, moneyInfo.Carry))); } }