diff --git a/src/CloudGaming/Api/CloudGaming.Api/Controllers/AccountController.cs b/src/CloudGaming/Api/CloudGaming.Api/Controllers/AccountController.cs index e7d5621..c54c225 100644 --- a/src/CloudGaming/Api/CloudGaming.Api/Controllers/AccountController.cs +++ b/src/CloudGaming/Api/CloudGaming.Api/Controllers/AccountController.cs @@ -8,6 +8,7 @@ using CloudGaming.Code.MiddlewareExtend; using CloudGaming.DtoModel.Account; using CloudGaming.DtoModel.Account.Login; using CloudGaming.DtoModel.Account.User; +using CloudGaming.DtoModel.Account.UserDiamondConsume; using CloudGaming.GameModel.Db.Db_Ext; using HuanMeng.DotNetCore.AttributeExtend; @@ -80,4 +81,29 @@ public class AccountController : CloudGamingControllerBase AccountBLL account = new AccountBLL(ServiceProvider); return await account.RealAuthentication(authenticationRequest.UserName, authenticationRequest.IdCard, authenticationRequest.DeviceNumber); } + + /// + /// 资产收入、支出 + /// + /// 0支出,收入 + /// + [HttpGet] + [Authorize] + public async Task> GetUserDiamondConsumeList([FromQuery] int consumeType) + { + AccountBLL account = new AccountBLL(ServiceProvider); + return await account.GetUserDiamondConsumeList(consumeType); + } + + /// + /// 修改用户昵称 + /// + /// + /// + [HttpPost] + public async Task> UpdateUserNickName([FromBody] AccountNickNameRequest accountNickNameRequest) + { + AccountBLL account = new AccountBLL(ServiceProvider); + return await account.UpdateUserNickName(accountNickNameRequest.NickName); + } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Account/AccountBLL.cs b/src/CloudGaming/Code/CloudGaming.Code/Account/AccountBLL.cs index 47f1212..b9a564d 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Account/AccountBLL.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Account/AccountBLL.cs @@ -6,6 +6,7 @@ using CloudGaming.Code.Sms; using CloudGaming.DtoModel.Account; using CloudGaming.DtoModel.Account.Login; using CloudGaming.DtoModel.Account.User; +using CloudGaming.DtoModel.Account.UserDiamondConsume; using HuanMeng.DotNetCore.JwtInfrastructure; using HuanMeng.DotNetCore.Redis; @@ -529,7 +530,7 @@ namespace CloudGaming.Code.Account UserId = _UserId, Ip = HttpContextAccessor.HttpContext.GetClientIpAddress() }; - await this.GetConsumeMoney(UserCurrencyType.钻石).ConsumeMoneyAsync(10); + await this.UserConsumeDiamondMoneyAsync(10, "实名认证赠送"); await Dao.DaoUser.Context.T_User_LimitActionLog.AddAsync(limitActionLog); await Dao.DaoUser.Context.SaveChangesAsync(); return "奖励已经发送,钻石*10"; @@ -602,5 +603,67 @@ namespace CloudGaming.Code.Account #endregion + /// + /// 资产收入、支出 + /// + /// 0支出,收入 + /// + public async Task> GetUserDiamondConsumeList(int ConsumeType) + { + if (_UserId == 0) + { + return new List(); + } + List userDiamondConsumeDtos = new List(); + var list = await Dao.DaoUser.Context.T_User_DiamondList.Where(it => it.UserId == _UserId && it.CurrencyType == (int)UserCurrencyType.钻石 && it.ConsumeType == ConsumeType).OrderByDescending(it => it.UpdateAt).Take(200).ToListAsync(); + list?.ForEach(it => + { + UserDiamondConsumeDto userDiamondConsumeDto = new UserDiamondConsumeDto() + { + Title = it.Title, + + }; + if (ConsumeType == (int)UserCurrencyConsumeType.收入) + { + userDiamondConsumeDto.ConsumeDetails = $"+ {it.Consume.ToString("0.##")}{((UserCurrencyType)it.CurrencyType).ToString()}"; + userDiamondConsumeDto.DatePrompt = $"{it.CreateAt.ToString("yyyy-MM-dd HH:mm:ss")}"; + } + else + { + userDiamondConsumeDto.ConsumeDetails = $"- {it.Consume.ToString("0.##")}{((UserCurrencyType)it.CurrencyType).ToString()}"; + userDiamondConsumeDto.DatePrompt = $"{it.CreateAt.ToString("yyyy-MM-dd HH:mm:00")} 至 {it.UpdateAt.ToString("yyyy-MM-dd HH:mm:00")}"; + } + userDiamondConsumeDtos.Add(userDiamondConsumeDto); + }); + return userDiamondConsumeDtos; + } + + + /// + /// 修改用户昵称 + /// + /// + /// + /// + public async Task> UpdateUserNickName(string nickName) + { + + var user = await Dao.DaoUser.Context.T_User.FirstOrDefaultAsync(it => it.Id == _UserId); + if (user == null) + { + throw new Exception("用户不存在"); + } + user.NickName = nickName; + var userPhone = await Dao.DaoUser.Context.T_User_Phone_Account.FirstOrDefaultAsync(it => it.UserId == _UserId); + if (userPhone != null) + { + userPhone.NikeName = nickName; + } + await Dao.DaoUser.Context.SaveChangesAsync(); + this.UserInfo.NickName = nickName; + await this.SaveUserInfoCacheChangesAsync(); + return new BaseResponse(ResonseCode.Success, "", true); + } + } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs b/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs index 5d3e4b2..09b70ac 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Account/AccountExtend.cs @@ -1,3 +1,5 @@ +using Bogus.DataSets; + using CloudGaming.Code.Account.Contract; using CloudGaming.Code.Account.Login; using CloudGaming.Code.Account.UserCurrency; @@ -222,18 +224,148 @@ namespace CloudGaming.Code.Account } /// - /// + /// 扣除当前用户钻石 /// /// /// /// - public static IUserConsumeMoney GetConsumeMoney(this CloudGamingBase cloudGamingBase, UserCurrencyType userCurrencyType) + public static IUserConsumeMoney GetCurrentUserConsumeMoney(this CloudGamingBase cloudGamingBase, UserCurrencyType userCurrencyType, T_User_Currency currency = null) { if (UserCurrencyType.钻石 == userCurrencyType) { - return new DiamondConsumeMoney(cloudGamingBase); + return new DiamondConsumeMoney(cloudGamingBase.Dao, cloudGamingBase._UserId, userCurrencyType, currency); } - return new DiamondConsumeMoney(cloudGamingBase); + return new DiamondConsumeMoney(cloudGamingBase.Dao, cloudGamingBase._UserId, userCurrencyType, currency); + } + + /// + /// 扣除当前用户钻石 + /// + /// + /// + /// + public static IUserConsumeMoney GetCurrentUserConsumeMoney(this UserInfoCache userInfo, CloudGamingBase cloudGamingBase, UserCurrencyType userCurrencyType, T_User_Currency currency = null) + { + if (UserCurrencyType.钻石 == userCurrencyType) + { + return new DiamondConsumeMoney(cloudGamingBase.Dao, userInfo.UserId, userCurrencyType, currency); + } + return new DiamondConsumeMoney(cloudGamingBase.Dao, cloudGamingBase._UserId, userCurrencyType, currency); + } + + /// + /// 扣除当前用户钻石 + /// + /// + /// + /// + /// + public static async Task UserConsumeDiamondMoneyAsync(this CloudGamingBase cloudGamingBase, decimal money, Action? userDoamondAction = null) + { + T_User_Currency currency = new T_User_Currency(); + var userConsumeMoney = new DiamondConsumeMoney(cloudGamingBase.Dao, cloudGamingBase.UserInfo.UserId, UserCurrencyType.钻石, currency); + try + { + var isSuccess = await userConsumeMoney.ConsumeMoneyAsync(money); + if (!isSuccess) + { + return false; + } + cloudGamingBase.UserInfo.Diamond = (int)currency.CurrencyMoney; + await cloudGamingBase.SaveUserInfoCacheChangesAsync(); + UserCurrencyConsumeType consumeType = money >= 0 ? UserCurrencyConsumeType.收入 : UserCurrencyConsumeType.消耗; + T_User_DiamondList userDiamondList = new T_User_DiamondList() + { + CreateAt = DateTime.Now, + Consume = money, + ConsumeType = (int)consumeType, + CurrencyType = (int)UserCurrencyType.钻石, + OrderCode = "", + Title = "", + UpdateAt = DateTime.Now, + UserId = cloudGamingBase.UserInfo.UserId + }; + if (userDoamondAction != null) + { + userDoamondAction(userDiamondList); + } + await cloudGamingBase.Dao.DaoUser.Context.AddAsync(userDiamondList); + await cloudGamingBase.Dao.DaoUser.Context.SaveChangesAsync(); + } + catch (Exception ex) + { + + return false; + } + return true; + } + + /// + /// + /// + /// + /// 金额 + /// 资产支出标题 + /// 订单号 + /// + + public static async Task UserConsumeDiamondMoneyAsync(this CloudGamingBase cloudGamingBase, decimal money, string title = "", string orderId = "") + { + + return await UserConsumeDiamondMoneyAsync(cloudGamingBase, money, it => { it.Title = title; it.OrderCode = orderId; }); + } + + /// + /// 扣除当前用户钻石 + /// + /// + /// + /// + public static async Task UserConsumeMoneyAsync(this CloudGamingBase cloudGamingBase, int userId, decimal money) + { + bool isSuccess = await UserConsumeDiamondMoneyAsync(userId, money, cloudGamingBase); + if (isSuccess) + { + await cloudGamingBase.SaveUserInfoCacheChangesAsync(); + } + return isSuccess; + } + + + /// + /// 扣除当前用户钻石 + /// + /// + /// + /// + public static async Task UserConsumeDiamondMoneyAsync(int userId, decimal money, CloudGamingBase cloudGamingBase) + { + T_User_Currency currency = new T_User_Currency(); + var userConsumeMoney = new DiamondConsumeMoney(cloudGamingBase.Dao, userId, UserCurrencyType.钻石, currency); + try + { + var isSuccess = await userConsumeMoney.ConsumeMoneyAsync(money); + + if (!isSuccess) + { + return false; + } + //清除缓存 + string key = GetUserInfoRedisKey(userId); + var userInfo = await cloudGamingBase.RedisCache.StringGetAsync(key); + if (userInfo != null) + { + userInfo.Diamond = (int)currency.CurrencyMoney; + await cloudGamingBase.RedisCache.StringSetAsync(key, userInfo, TimeSpan.FromMinutes(30)); + } + } + catch (Exception ex) + { + + return false; + } + return true; + } } } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/DiamondConsumeMoney.cs b/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/DiamondConsumeMoney.cs index 4c2a385..a6325a8 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/DiamondConsumeMoney.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Account/UserCurrency/DiamondConsumeMoney.cs @@ -1,4 +1,6 @@ using CloudGaming.Code.Account.Contract; +using CloudGaming.Code.DataAccess; +using CloudGaming.DtoModel.Account.User; using System; using System.Collections.Generic; @@ -9,13 +11,72 @@ using System.Threading.Tasks; namespace CloudGaming.Code.Account.UserCurrency { /// - /// + /// 扣除或者充值用户钻石 /// - public class DiamondConsumeMoney(CloudGamingBase cloudGamingBase) : IUserConsumeMoney + /// + /// + /// + /// + public class DiamondConsumeMoney(DAO dao, int userId, UserCurrencyType userCurrencyType, T_User_Currency userCurrency = null) : IUserConsumeMoney { - public Task ConsumeMoneyAsync(decimal money) + /// + /// 用户余额扣除 + /// + /// + /// + /// + + public async Task ConsumeMoneyAsync(decimal money) { - throw new NotImplementedException(); + + var currency = await dao.DaoUser.Context.T_User_Currency.Where(it => it.CurrencyType == (int)userCurrencyType && it.UserId == userId).FirstOrDefaultAsync(); + if (currency == null) + { + currency = new T_User_Currency() + { + CreateAt = DateTime.Now, + CurrencyMoney = 0, + CurrencyName = userCurrencyType.ToString(), + CurrencyType = (int)userCurrencyType, + UserId = userId, + UpdateAt = DateTime.Now, + }; + await dao.DaoUser.Context.T_User_Currency.AddAsync(currency); + await dao.DaoUser.Context.SaveChangesAsync(); + } + currency.CurrencyMoney += money; + if (currency.CurrencyMoney < 0) + { + throw new Exception("余额不足"); + } + UserCurrencyConsumeType consumeType = money >= 0 ? UserCurrencyConsumeType.收入 : UserCurrencyConsumeType.消耗; + var currency_Log = new T_User_Currency_Log() + { + Consume = money, + ConsumeType = (int)consumeType, + CreateAt = DateTime.Now, + CurrencyType = (int)userCurrencyType, + Remarks = $"于{DateTime.Now:yyyy-MM-dd HH:mm:ss}{consumeType}[{Math.Abs(money)}]{userCurrencyType};", + UpdateAt = DateTime.Now, + UserId = userId, + }; + await dao.DaoUser.Context.T_User_Currency_Log.AddAsync(currency_Log); + await dao.DaoUser.Context.SaveChangesAsync(); + if (userCurrency != null) + { + userCurrency.CurrencyMoney = currency.CurrencyMoney; + userCurrency.UpdateAt = currency.UpdateAt; + userCurrency.Id = currency.Id; + userCurrency.CurrencyName = currency.CurrencyName; + userCurrency.CreateAt = currency.CreateAt; + userCurrency.CurrencyType = currency.CurrencyType; + } + else + { + userCurrency = currency; + } + return true; + } } } diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/Account/User/AccountNickNameRequest.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/Account/User/AccountNickNameRequest.cs new file mode 100644 index 0000000..c60875e --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/Account/User/AccountNickNameRequest.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.Account.User +{ + /// + /// + /// + public class AccountNickNameRequest + { + /// + /// + /// + public string NickName { get; set; } + } +} diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/Account/User/UserCurrencyConsumeType.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/Account/User/UserCurrencyConsumeType.cs new file mode 100644 index 0000000..79845e1 --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/Account/User/UserCurrencyConsumeType.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.Account.User; + +/// +/// 用户消费类型 +/// +public enum UserCurrencyConsumeType +{ + /// + /// + /// + 消耗 = 0, + /// + /// + /// + 收入 = 1 +} diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/Account/UserDiamondConsume/UserDiamondConsumeDto.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/Account/UserDiamondConsume/UserDiamondConsumeDto.cs new file mode 100644 index 0000000..adcc35e --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/Account/UserDiamondConsume/UserDiamondConsumeDto.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CloudGaming.DtoModel.Account.UserDiamondConsume +{ + /// + /// + /// + public class UserDiamondConsumeDto + { + /// + /// 标题 + /// + public string Title { get; set; } = null!; + + /// + /// 详情 + /// + public string ConsumeDetails { get; set; } + + /// + /// 创建时间,资产 + /// + public string DatePrompt { get; set; } + + } +} diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/CloudGamingUserContext.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/CloudGamingUserContext.cs index b3a314b..58f5671 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/CloudGamingUserContext.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/CloudGamingUserContext.cs @@ -58,6 +58,11 @@ public partial class CloudGamingUserContext : MultiTenantDbContext//DbContext /// public virtual DbSet T_User_Data { get; set; } + /// + /// 资产收入、支出表 + /// + public virtual DbSet T_User_DiamondList { get; set; } + /// /// 意向订单表 /// @@ -190,26 +195,11 @@ public partial class CloudGamingUserContext : MultiTenantDbContext//DbContext .HasComment("创建时间") .HasColumnType("datetime"); entity.Property(e => e.CurrencyType).HasComment("金额类型"); - entity.Property(e => e.ExpiresAt) - .HasComment("消耗的结束时间") - .HasColumnType("datetime"); - entity.Property(e => e.GameId) - .HasMaxLength(200) - .HasComment("消耗的游戏Id"); - entity.Property(e => e.IsShow).HasComment("是否显示给用户"); - entity.Property(e => e.OrderId) - .HasMaxLength(64) - .HasComment("订单号") - .UseCollation("Chinese_PRC_CI_AS"); entity.Property(e => e.Remarks) - .HasMaxLength(200) + .HasMaxLength(255) .HasComment("备注") .UseCollation("Chinese_PRC_CI_AS"); entity.Property(e => e.TenantId).HasComment("租户"); - entity.Property(e => e.Title) - .HasMaxLength(200) - .HasComment("标题") - .UseCollation("Chinese_PRC_CI_AS"); entity.Property(e => e.UpdateAt) .HasComment("修改时间") .HasColumnType("datetime"); @@ -254,6 +244,41 @@ public partial class CloudGamingUserContext : MultiTenantDbContext//DbContext } }); + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("PK__T_User_D__3214EC07EF4BDC87"); + + entity.ToTable(tb => tb.HasComment("资产收入、支出表")); + + entity.Property(e => e.Id).ValueGeneratedNever(); + entity.Property(e => e.Consume) + .HasComment("金额变化") + .HasColumnType("decimal(18, 0)"); + entity.Property(e => e.ConsumeType).HasComment("收入还是支出"); + entity.Property(e => e.CreateAt) + .HasComment("创建时间") + .HasColumnType("datetime"); + entity.Property(e => e.CurrencyType).HasComment("货币类型"); + entity.Property(e => e.Extend) + .HasMaxLength(255) + .HasComment("扩展字段"); + entity.Property(e => e.OrderCode) + .HasMaxLength(64) + .HasComment("订单编号"); + entity.Property(e => e.Title) + .HasMaxLength(255) + .HasComment("标题"); + entity.Property(e => e.UpdateAt) + .HasComment("结束时间") + .HasColumnType("datetime"); + entity.Property(e => e.UserId).HasComment("用户Id"); + //添加全局筛选器 + if (this.TenantInfo != null) + { + entity.HasQueryFilter(it => it.TenantId == this.TenantInfo.TenantId); + } + }); + modelBuilder.Entity(entity => { entity.HasKey(e => e.Id).HasName("PK__T_User_I__3214EC07D27A8CE9"); diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_Currency_Log.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_Currency_Log.cs index 69cb102..2e4fd7e 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_Currency_Log.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_Currency_Log.cs @@ -21,11 +21,6 @@ public partial class T_User_Currency_Log: MultiTenantEntity /// public virtual int UserId { get; set; } - /// - /// 标题 - /// - public virtual string? Title { get; set; } - /// /// 金额类型 /// @@ -55,24 +50,4 @@ public partial class T_User_Currency_Log: MultiTenantEntity /// 修改时间 /// public virtual DateTime UpdateAt { get; set; } - - /// - /// 订单号 - /// - public virtual string? OrderId { get; set; } - - /// - /// 是否显示给用户 - /// - public virtual bool IsShow { get; set; } - - /// - /// 消耗的结束时间 - /// - public virtual DateTime? ExpiresAt { get; set; } - - /// - /// 消耗的游戏Id - /// - public virtual string? GameId { get; set; } } diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_DiamondList.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_DiamondList.cs new file mode 100644 index 0000000..c5ef16d --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_DiamondList.cs @@ -0,0 +1,58 @@ +using System; + +namespace CloudGaming.Model.DbSqlServer.Db_User; + +/// +/// 资产收入、支出表 +/// +public partial class T_User_DiamondList: MultiTenantEntity +{ + public T_User_DiamondList() { } + + public virtual int Id { get; set; } + + /// + /// 用户Id + /// + public virtual int UserId { get; set; } + + /// + /// 标题 + /// + public virtual string Title { get; set; } = null!; + + /// + /// 收入还是支出 + /// + public virtual int ConsumeType { get; set; } + + /// + /// 订单编号 + /// + public virtual string? OrderCode { get; set; } + + /// + /// 金额变化 + /// + public virtual decimal Consume { get; set; } + + /// + /// 货币类型 + /// + public virtual int CurrencyType { get; set; } + + /// + /// 创建时间 + /// + public virtual DateTime CreateAt { get; set; } + + /// + /// 结束时间 + /// + public virtual DateTime UpdateAt { get; set; } + + /// + /// 扩展字段 + /// + public virtual string? Extend { get; set; } +}