From fc925c8780fbc6f0c7cfa3c9a77fd800f200cb04 Mon Sep 17 00:00:00 2001 From: zpc Date: Tue, 23 Jul 2024 23:09:22 +0800 Subject: [PATCH] =?UTF-8?q?=20=E6=B7=BB=E5=8A=A0=E8=B4=A7=E5=B8=81?= =?UTF-8?q?=E6=89=A3=E9=99=A4=E6=88=96=E8=80=85=E5=A2=9E=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Category/CategoryBLL.cs | 2 +- .../MemoryVerificationCodeExtension.cs | 4 +- .../Users/UserCurrencyBLL.cs | 138 ++++++++++++++++++ .../HuanMeng.MiaoYu.Code/Users/UserInfoBLL.cs | 20 ++- .../DbSqlServer/Db_MiaoYu/MiaoYuContext.cs | 50 ++++++- .../DbSqlServer/Db_MiaoYu/T_Character.cs | 10 ++ .../Db_MiaoYu/T_Character_Personality.cs | 2 +- .../DbSqlServer/Db_MiaoYu/T_ShoppingMall.cs | 18 +-- .../Db_MiaoYu/T_User_Currency_Log.cs | 47 ++++++ .../Dto/Character/CharacterCache.cs | 8 +- .../EnumModel/UserCurrencyConsumeType.cs | 23 +++ 11 files changed, 297 insertions(+), 25 deletions(-) create mode 100644 src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency_Log.cs create mode 100644 src/0-core/HuanMeng.MiaoYu.Model/EnumModel/UserCurrencyConsumeType.cs diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Category/CategoryBLL.cs b/src/0-core/HuanMeng.MiaoYu.Code/Category/CategoryBLL.cs index 410a6b2..01763b8 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Category/CategoryBLL.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Category/CategoryBLL.cs @@ -111,7 +111,7 @@ namespace HuanMeng.MiaoYu.Code.Category var data = Mapper.Map(x); data.ActionType = RecommendActionTypeEnum.Chat.ToString(); data.ActionId = data.Id.ToString(); - data.ImageUrl = x.IconImage;//data.BgImage; + data.ImageUrl = x.BgImage;//data.BgImage; tuijian.Data.Add(data); xiaoshuo.Data.Add(data); diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserAccount/VerificationCodeManager/MemoryVerificationCodeExtension.cs b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserAccount/VerificationCodeManager/MemoryVerificationCodeExtension.cs index 6516769..85d1911 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserAccount/VerificationCodeManager/MemoryVerificationCodeExtension.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserAccount/VerificationCodeManager/MemoryVerificationCodeExtension.cs @@ -17,10 +17,10 @@ namespace HuanMeng.MiaoYu.Code.Users.UserAccount.VerificationCodeManager /// public static class MemoryVerificationCodeExtension { - // + /// /// 验证码扩展 /// - /// + /// public static void AddMemoryVerificationCode(this IHostApplicationBuilder builder) { //注册一个验证码的服务 diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserCurrencyBLL.cs b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserCurrencyBLL.cs index f7eca5e..a2fbae5 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserCurrencyBLL.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserCurrencyBLL.cs @@ -1,12 +1,20 @@ using HuanMeng.MiaoYu.Code.Base; +using HuanMeng.MiaoYu.Code.DataAccess; +using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; +using HuanMeng.MiaoYu.Model.EnumModel; using HuanMeng.MiaoYu.Model.EnumModel.User; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.Extensions.Logging; + using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static System.Runtime.InteropServices.JavaScript.JSType; + namespace HuanMeng.MiaoYu.Code.Users { /// @@ -45,5 +53,135 @@ namespace HuanMeng.MiaoYu.Code.Users var userCurrency = dao.daoDbMiaoYu.context.T_User_Currency.FirstOrDefault(it => it.UserId == user.Id && it.CurrencyType == (int)userCurrencyType); return userCurrency?.CurrencyMoney ?? 0; } + + /// + /// 扣除或者充值货币 + /// + /// + /// 货币类型 + /// 扣除金额(负数扣除,正数添加) + /// 数据库 + /// + /// + public static bool ConsumeMoney(this T_User user, UserCurrencyType userCurrencyType, decimal money, DAO dao) + { + if (user == null || user.Id == 0) + { + throw new ArgumentNullException("用户不能为空"); + } + int userId = user.Id; + return ConsumeMoney(userId, userCurrencyType, money, dao); + } + /// + /// 扣除或者充值货币 + /// + /// + /// 货币类型 + /// 扣除金额(负数扣除,正数添加) + /// 数据库 + /// + /// + public static bool ConsumeMoney(this T_User_Data user, UserCurrencyType userCurrencyType, decimal money, DAO dao) + { + if (user == null || user.UserId == 0) + { + throw new ArgumentNullException("用户不能为空"); + } + int userId = user.UserId; + return ConsumeMoney(userId, userCurrencyType, money, dao); + + } + + /// + /// 扣除或者充值货币 + /// > + /// 用户Id + /// 货币类型 + /// 扣除金额(负数扣除,正数添加) + /// 数据库 + /// + public static bool ConsumeMoney(int userId, UserCurrencyType userCurrencyType, decimal money, DAO dao) + { + var userCurrency = dao.daoDbMiaoYu.context.T_User_Currency.FirstOrDefault(it => it.UserId == userId && it.CurrencyType == (int)userCurrencyType); + if (userCurrency == null) + { + userCurrency = new T_User_Currency() + { + CreateAt = DateTime.Now, + CurrencyMoney = 0, + CurrencyName = userCurrencyType.ToString(), + CurrencyType = (int)userCurrencyType, + TenantId = dao.daoDbMiaoYu.context.TenantInfo.TenantId, + UpdateAt = DateTime.Now, + UserId = userId + }; + dao.daoDbMiaoYu.context.Add(userCurrency); + dao.daoDbMiaoYu.context.SaveChanges(); + } + var tempCurrencyMoney = userCurrency.CurrencyMoney + money; + if (tempCurrencyMoney < 0) + { + //余额不足 + return false; + } + // 开启事务 + using (IDbContextTransaction transaction = dao.daoDbMiaoYu.context.Database.BeginTransaction()) + { + try + { + userCurrency.CurrencyMoney += money; + if (userCurrency.CurrencyMoney < 0) + { + transaction.Rollback(); + //余额不足 + return false; + } + T_User_Currency_Log? log = null; + UserCurrencyConsumeType userCurrencyConsumeType = UserCurrencyConsumeType.消耗; + if (money >= 0) + { + userCurrencyConsumeType = UserCurrencyConsumeType.充值; + } + + if (userCurrencyType == UserCurrencyType.聊天次数) + { + var mintes = DateTime.Now.AddMinutes(-5); + log = dao.daoDbMiaoYu.context.T_User_Currency_Log.Where(it => it.CreateTime > mintes).OrderByDescending(it => it.CreateTime).FirstOrDefault(); + } + var tempMoney = Math.Abs(money); + //消费 + if (log == null) + { + log = new T_User_Currency_Log() + { + Consume = tempMoney, + ConsumeType = (int)userCurrencyConsumeType, + CreateTime = DateTime.Now, + CurrencyType = (int)userCurrencyType, + TenantId = dao.daoDbMiaoYu.context.TenantInfo.TenantId, + UpdateTime = DateTime.Now, + UserId = userId, + Remarks = "" + }; + dao.daoDbMiaoYu.context.T_User_Currency_Log.Add(log); + } + + log.Remarks += $"于{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}{userCurrencyConsumeType.ToString()}[{tempMoney}]{userCurrencyType.ToString()};"; + if (log.Remarks.Length > 200) + { + log.Remarks = log.Remarks.Substring(log.Remarks.Length - 200); + } + dao.daoDbMiaoYu.context.SaveChanges(); + transaction.Commit(); + } + catch (Exception ex) + { + // 出现异常,回滚事务 + transaction.Rollback(); + return false; + } + } + return true; + } } } diff --git a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserInfoBLL.cs b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserInfoBLL.cs index 46aa883..29b4a9c 100644 --- a/src/0-core/HuanMeng.MiaoYu.Code/Users/UserInfoBLL.cs +++ b/src/0-core/HuanMeng.MiaoYu.Code/Users/UserInfoBLL.cs @@ -1,3 +1,6 @@ +using HuanMeng.MiaoYu.Code.DataAccess; +using HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; + using System; using System.Collections.Generic; using System.Linq; @@ -9,11 +12,9 @@ namespace HuanMeng.MiaoYu.Code.Users /// /// 用户信息 /// - public class UserInfoBLL : MiaoYuBase + public class UserInfoBLL(DAO dao, int userId) { - public UserInfoBLL(IServiceProvider serviceProvider) : base(serviceProvider) - { - } + private T_User? _user; /// /// 用户表 @@ -25,11 +26,11 @@ namespace HuanMeng.MiaoYu.Code.Users if (_user == null) { - if (_UserId == 0) + if (userId == 0) { throw new Exception("未找到用户"); } - _user = Dao.daoDbMiaoYu.context.T_User.FirstOrDefault(it => it.Id == _UserId); + _user = dao.daoDbMiaoYu.context.T_User.FirstOrDefault(it => it.Id == userId); if (_user == null) { throw new Exception("未找到用户"); @@ -38,5 +39,12 @@ namespace HuanMeng.MiaoYu.Code.Users return _user; } } + + + } + + public static class UserInfoExtend + { + } } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs index fd8ce5c..dae14a9 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/MiaoYuContext.cs @@ -128,6 +128,11 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext /// public virtual DbSet T_User_Currency { get; set; } + /// + /// 用户金额记录表 + /// + public virtual DbSet T_User_Currency_Log { get; set; } + /// /// 用户信息表 /// @@ -183,6 +188,12 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext entity.Property(e => e.UpdateTime) .HasComment("更新时间") .HasColumnType("datetime"); + entity.Property(e => e.UserName) + .HasMaxLength(50) + .HasComment("对话名字"); + entity.Property(e => e.UserSex) + .HasMaxLength(10) + .HasComment("对话性别"); entity.Property(e => e.Visibility).HasComment("公开/私密 0公开 1私密"); //添加全局筛选器 if (this.TenantInfo != null) @@ -555,19 +566,21 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext entity.Property(e => e.CreateTime) .HasComment("创建时间") .HasColumnType("datetime"); - entity.Property(e => e.ExchangeCurrencyCount).HasComment("兑换道具所需要的金币数量"); entity.Property(e => e.IsProductDelisting).HasComment("商品是否下架 0否1是"); entity.Property(e => e.LaunchDateTime) .HasComment("商品上架时间") .HasColumnType("datetime"); + entity.Property(e => e.Price) + .HasComment("价格") + .HasColumnType("decimal(10, 2)"); entity.Property(e => e.PropDesc) - .HasMaxLength(1) + .HasMaxLength(255) .HasComment("道具描述"); entity.Property(e => e.PropImgId).HasComment("道具图片配置 图片id"); entity.Property(e => e.PropName) - .HasMaxLength(1) + .HasMaxLength(100) .HasComment("道具名称"); - entity.Property(e => e.PropType).HasComment("道具类型"); + entity.Property(e => e.PropType).HasComment("道具类型,0商城,1商店"); entity.Property(e => e.StockCount).HasComment("库存数量"); entity.Property(e => e.TenantId).HasComment("租户ID"); entity.Property(e => e.UpdateTime) @@ -717,6 +730,35 @@ public partial class MiaoYuContext : MultiTenantDbContext//DbContext } }); + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("PK__T_User_C__3214EC07DBD26048"); + + entity.ToTable(tb => tb.HasComment("用户金额记录表")); + + entity.Property(e => e.Consume) + .HasComment("金额") + .HasColumnType("decimal(10, 2)"); + entity.Property(e => e.ConsumeType).HasComment("消耗类型,0消耗,1增加"); + entity.Property(e => e.CreateTime) + .HasComment("创建时间") + .HasColumnType("datetime"); + entity.Property(e => e.CurrencyType).HasComment("金额类型"); + entity.Property(e => e.Remarks) + .HasMaxLength(200) + .HasComment("备注"); + entity.Property(e => e.TenantId).HasComment("租户"); + entity.Property(e => e.UpdateTime) + .HasComment("修改时间") + .HasColumnType("datetime"); + entity.Property(e => e.UserId).HasComment("用户"); + //添加全局筛选器 + if (this.TenantInfo != null) + { + entity.HasQueryFilter(it => it.TenantId == this.TenantInfo.TenantId); + } + }); + modelBuilder.Entity(entity => { entity.HasKey(e => new { e.Id, e.UserId }).HasName("PK__T_User_D__E36C60C3D959FD89"); diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Character.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Character.cs index e659044..ddd0a31 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Character.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Character.cs @@ -67,4 +67,14 @@ public partial class T_Character: MultiTenantEntity /// 角色头像(是id) /// public int? IconImg { get; set; } + + /// + /// 对话名字 + /// + public string? UserName { get; set; } + + /// + /// 对话性别 + /// + public string? UserSex { get; set; } } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Character_Personality.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Character_Personality.cs index a537a09..b3d7cd0 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Character_Personality.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_Character_Personality.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_ShoppingMall.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_ShoppingMall.cs index f603c6e..688c3bc 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_ShoppingMall.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_ShoppingMall.cs @@ -15,7 +15,7 @@ public partial class T_ShoppingMall: MultiTenantEntity /// /// 道具名称 /// - public string? PropName { get; set; } + public string PropName { get; set; } = null!; /// /// 道具描述 @@ -25,12 +25,7 @@ public partial class T_ShoppingMall: MultiTenantEntity /// /// 道具图片配置 图片id /// - public int? PropImgId { get; set; } - - /// - /// 兑换道具所需要的金币数量 - /// - public int? ExchangeCurrencyCount { get; set; } + public int PropImgId { get; set; } /// /// 商品是否下架 0否1是 @@ -59,7 +54,12 @@ public partial class T_ShoppingMall: MultiTenantEntity public int? StockCount { get; set; } /// - /// 道具类型 + /// 道具类型,0商城,1商店 /// - public int? PropType { get; set; } + public int PropType { get; set; } + + /// + /// 价格 + /// + public decimal Price { get; set; } } diff --git a/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency_Log.cs b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency_Log.cs new file mode 100644 index 0000000..2087caf --- /dev/null +++ b/src/0-core/HuanMeng.MiaoYu.Model/DbSqlServer/Db_MiaoYu/T_User_Currency_Log.cs @@ -0,0 +1,47 @@ +using System; + +namespace HuanMeng.MiaoYu.Model.DbSqlServer.Db_MiaoYu; + +/// +/// 用户金额记录表 +/// +public partial class T_User_Currency_Log: MultiTenantEntity +{ + public int Id { get; set; } + + + /// + /// 用户 + /// + public int UserId { get; set; } + + /// + /// 金额类型 + /// + public int CurrencyType { get; set; } + + /// + /// 金额 + /// + public decimal Consume { get; set; } + + /// + /// 消耗类型,0消耗,1增加 + /// + public int ConsumeType { get; set; } + + /// + /// 备注 + /// + public string? Remarks { get; set; } + + /// + /// 创建时间 + /// + public DateTime CreateTime { get; set; } + + /// + /// 修改时间 + /// + public DateTime UpdateTime { get; set; } +} diff --git a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs index eb46c45..ec89619 100644 --- a/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs +++ b/src/0-core/HuanMeng.MiaoYu.Model/Dto/Character/CharacterCache.cs @@ -121,15 +121,19 @@ namespace HuanMeng.MiaoYu.Model.Dto.Character _system = ModelConfig.SystemTemplate ?? ""; _system = _system .Replace("{assistant}", this.Name) //ai角色名称 - .Replace("{user}", "") //用户角色名称 + .Replace("{user}", this.UserName) //用户角色名称 .Replace("{sex}", this.Gender == 0 ? "男" : "女") //角色 .Replace("{biography}", this.Biography) //提示词 简介 .Replace("{personality}", this.PersonalityStr) //性格 .Replace("{prologue}", this.Prologue) //剧情 .Replace("{genre}", this.TypeStr) //类型,分类 .Replace("{label}", this.LabelStr) //标签 + .Replace("{user_sex}", this.UserSex) ; - + if (_system.Contains("[是一个。]")) + { + _system = _system .Replace("[是一个。]", ""); + } } } return _system; diff --git a/src/0-core/HuanMeng.MiaoYu.Model/EnumModel/UserCurrencyConsumeType.cs b/src/0-core/HuanMeng.MiaoYu.Model/EnumModel/UserCurrencyConsumeType.cs new file mode 100644 index 0000000..6cb9c41 --- /dev/null +++ b/src/0-core/HuanMeng.MiaoYu.Model/EnumModel/UserCurrencyConsumeType.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HuanMeng.MiaoYu.Model.EnumModel +{ + /// + /// 用户消费类型 + /// + public enum UserCurrencyConsumeType + { + /// + /// + /// + 消耗 = 0, + /// + /// + /// + 充值 = 1 + } +}