From c6db4d9294240f46f6eb8c2358b11411a18397e9 Mon Sep 17 00:00:00 2001 From: zpc Date: Mon, 2 Dec 2024 07:05:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=91=E6=8E=A7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/PayController.cs | 2 +- .../Game/PlayGameProcessor.cs | 4 +- .../Code/CloudGaming.Code/Mall/OrderBLL.cs | 7 +- .../CloudGaming.Code/Monitor/MonitorExtend.cs | 27 +++++- .../Monitor/MonitorProcessor.cs | 89 ++++++++++++++++++- .../CloudGaming.Code/Payment/PaymentExtend.cs | 2 +- .../Other/AppBasicStatistics.cs | 49 ++++++++++ .../Other/AppMonitorInfo.cs | 43 +-------- .../Db_User/CloudGamingUserContext.cs | 6 +- .../DbSqlServer/Db_User/T_User_IntentOrder.cs | 10 +-- .../DbSqlServer/efcore-gen.md | 2 +- 11 files changed, 179 insertions(+), 62 deletions(-) create mode 100644 src/CloudGaming/Model/CloudGaming.DtoModel/Other/AppBasicStatistics.cs diff --git a/src/CloudGaming/Api/CloudGaming.PayApi/Controllers/PayController.cs b/src/CloudGaming/Api/CloudGaming.PayApi/Controllers/PayController.cs index d56afaf..c5351a5 100644 --- a/src/CloudGaming/Api/CloudGaming.PayApi/Controllers/PayController.cs +++ b/src/CloudGaming/Api/CloudGaming.PayApi/Controllers/PayController.cs @@ -126,7 +126,7 @@ namespace CloudGaming.PayApi.Controllers T_User_OrderItems orderItems = new T_User_OrderItems(); orderItems.PayUrl = context.Request.Path; //orderItems. - await product.OrderRewardsNoWorkAsync(user, pay, orderId, intentOrder.Price, intentOrder.IntentAt, dao, orderItems); + await product.OrderRewardsNoWorkAsync(user, pay, orderId, intentOrder.Price, intentOrder.CreatedAt, dao, orderItems); //intentOrder = await dao.daoDbMiaoYu.context.T_User_IntentOrder.FirstOrDefaultAsync(it => it.OrderId == orderId); intentOrder.Status = (int)OrderState.已完成; await dao.DaoUser.Context.SaveChangesAsync(); diff --git a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameProcessor.cs b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameProcessor.cs index 9cca940..df0ef3a 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameProcessor.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Game/PlayGameProcessor.cs @@ -22,7 +22,7 @@ public class PlayGameProcessor(IServiceProvider serviceProvider) : ThreadProcess var appConfigs = AppConfigurationExtend.AppConfigs.Where(it => it.Key != "default") .Select(it => it.Value) .ToList(); - + // 为每个项目启动一个独立的任务 foreach (var appConfig in appConfigs) { @@ -74,7 +74,7 @@ public class PlayGameProcessor(IServiceProvider serviceProvider) : ThreadProcess var redisServer = appConfig.GetRedisServer(); var keyPattern = $"{PlayGameExtend.GetPlayGameKeyPrefix}:*"; - var keys = await redisServer.ScanKeysAsync(keyPattern, 2000).ConfigureAwait(false); + var keys = await redisServer.ScanKeysAsync(keyPattern, 20000).ConfigureAwait(false); var tasks = keys.Select(async gameKey => { diff --git a/src/CloudGaming/Code/CloudGaming.Code/Mall/OrderBLL.cs b/src/CloudGaming/Code/CloudGaming.Code/Mall/OrderBLL.cs index efb0842..ea2f949 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Mall/OrderBLL.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Mall/OrderBLL.cs @@ -73,6 +73,11 @@ public class OrderBLL : CloudGamingBase (var orderId, var order, var payNotifyUrl) = await payment.CreateOrder(product.Id, product.ProductName, price, product, ip); var t = product.ToIntentOrder(paymentMethod, orderId); t.UserId = _UserId; + if (payNotifyUrl != null && payNotifyUrl.Length > 200) + { + payNotifyUrl = payNotifyUrl.Substring(0, 200); + } + t.Notes = payNotifyUrl; await Dao.DaoUser.Context.AddAsync(t); await Dao.DaoUser.Context.SaveChangesAsync(); intentOrderDto = new IntentOrderDto() @@ -81,7 +86,7 @@ public class OrderBLL : CloudGamingBase Payment = order }; RedisCache.KeyDelete(redisLock); - HttpContextAccessor.HttpContext.Response.Headers.Add("PayNotifyUrl", payNotifyUrl); + //HttpContextAccessor.HttpContext.Response.Headers.Add("PayNotifyUrl", payNotifyUrl); } catch (Exception ex) { diff --git a/src/CloudGaming/Code/CloudGaming.Code/Monitor/MonitorExtend.cs b/src/CloudGaming/Code/CloudGaming.Code/Monitor/MonitorExtend.cs index 29bff36..c33db25 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Monitor/MonitorExtend.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Monitor/MonitorExtend.cs @@ -3,7 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using CloudGaming.Code.DataAccess.MultiTenantUtil; using CloudGaming.DtoModel.Other; - + using Quartz; using System; @@ -12,6 +12,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Runtime.CompilerServices; namespace CloudGaming.Code.Monitor; @@ -25,7 +26,7 @@ public static class MonitorExtend /// public static ConcurrentDictionary AppMonitorConfigs { get; set; } = new ConcurrentDictionary(); - + public static WebApplicationBuilder AddMonitorConfig(this WebApplicationBuilder builder) { // 添加 Quartz 配置 @@ -47,4 +48,26 @@ public static class MonitorExtend return builder; } + /// + /// + /// + /// + /// + public static AppBasicStatistics ToAppBasicStatistics(this AppMonitorInfo appMonitorInfo) + { + return new AppBasicStatistics() + { + CurrentOnlineUsers= appMonitorInfo.CurrentOnlineUsers, + CurrentPlayingUsers = appMonitorInfo.CurrentPlayingUsers, + CurrentQueuedUsers = appMonitorInfo.CurrentQueuedUsers, + TodayIntendedOrders = appMonitorInfo.TodayIntendedOrders, + TodayLoggedInUsers = appMonitorInfo.TodayLoggedInUsers, + TodayPaidOrders= appMonitorInfo.TodayPaidOrders, + TodayRechargeAmount = appMonitorInfo.TodayRechargeAmount, + TodayRegisteredUsers = appMonitorInfo.TodayRegisteredUsers + }; + } + + + } diff --git a/src/CloudGaming/Code/CloudGaming.Code/Monitor/MonitorProcessor.cs b/src/CloudGaming/Code/CloudGaming.Code/Monitor/MonitorProcessor.cs index 53a08fc..af5c609 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Monitor/MonitorProcessor.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Monitor/MonitorProcessor.cs @@ -1,3 +1,8 @@ +using CloudGaming.DtoModel.Other; +using CloudGaming.DtoModel.PlayGame; + +using Newtonsoft.Json; + using Quartz; using System; @@ -10,19 +15,95 @@ namespace CloudGaming.Code.Monitor; /// -/// +/// 定时监控 /// public class MonitorProcessor : IJob { - public MonitorProcessor(IServiceProvider serviceProvider) + private readonly IServiceProvider serviceProvider; + private readonly IServiceScopeFactory scopeFactory; + public MonitorProcessor(IServiceScopeFactory scopeFactory) { - + this.scopeFactory = scopeFactory; } public Task Execute(IJobExecutionContext context) { - Console.WriteLine($"MessageService:"); + if (AppConfigurationExtend.AppConfigs != null && AppConfigurationExtend.AppConfigs.Count > 0) + { + var appConfigs = AppConfigurationExtend.AppConfigs.Where(it => it.Key != "default") + .Select(it => it.Value) + .ToList(); + + // 为每个项目启动一个独立的任务 + foreach (var appConfig in appConfigs) + { + + AppMonitorInfo appMonitorInfo = MonitorExtend.AppMonitorConfigs.GetOrAdd(appConfig.Identifier, new AppMonitorInfo()); + _ = Task.Run(() => ProcessAppConfigLoop(appConfig, appMonitorInfo)); + } + } + //throw new NotImplementedException(); return Task.CompletedTask; } + /// + /// 单个项目的处理循环 + /// + public async Task ProcessAppConfigLoop(AppConfig appConfig, AppMonitorInfo appMonitorInfo) + { + var sw = Stopwatch.StartNew(); + using var scope = scopeFactory.CreateScope(); + var scopedProvider = scope.ServiceProvider; + int day = int.Parse(DateTime.Now.ToString("yyyyMMdd")); + var nowDay = DateOnly.FromDateTime(DateTime.Now); + + + var app = scopedProvider.GetRequiredService(); + appConfig.ToAppConfig(app); + CloudGamingBase cloudGamingBase = new CloudGamingBase(scopedProvider); + + //今日登录人数 + var todayLoggedInUsers = await cloudGamingBase.Dao.DaoExt.Context.T_User_LoginDay_Log.Where(it => it.CreateTimeDay == day).CountAsync(); + //今日注册人数 + var todayRegisteredUsers = await cloudGamingBase.Dao.DaoExt.Context.T_User_LoginDay_Log.Where(it => it.CreateTimeDay == day && it.IsNew).CountAsync(); + //今日意向订单 + var todayIntendedOrders = await cloudGamingBase.Dao.DaoUser.Context.T_User_IntentOrder.Where(it => it.CreatedDay == day).CountAsync(); + //今日支付订单 + var todayPaidOrders = await cloudGamingBase.Dao.DaoUser.Context.T_User_Order.Where(it => it.PaymentDay == nowDay).CountAsync(); + //今日支付金额 + var todayRechargeAmount =await cloudGamingBase.Dao.DaoUser.Context.T_User_Order.Where(it => it.PaymentDay == nowDay).SumAsync(it => (decimal?)it.TotalPrice); + // 查询游戏数据 + var playGameStatusStatistics = appMonitorInfo.PlayGameStatusStatistics(); + //排队数据 + int currentQueuedUsers = 0; + if (playGameStatusStatistics.TryGetValue(PlayGameStatus.排队中, out var _currentQueuedUsers)) + { + currentQueuedUsers += _currentQueuedUsers; + } + //开始游戏 + int currentPlayingUsers = 0; + if (playGameStatusStatistics.TryGetValue(PlayGameStatus.开始游戏, out var _currentPlayingUsers)) + { + currentPlayingUsers += _currentPlayingUsers; + } + if (playGameStatusStatistics.TryGetValue(PlayGameStatus.游戏中, out var _currentPlayingUsers1)) + { + currentPlayingUsers += _currentPlayingUsers1; + } + //appMonitorInfo.CurrentQueuedUsers= + sw.Stop(); + appMonitorInfo.TodayLoggedInUsers = todayLoggedInUsers; + appMonitorInfo.TodayRegisteredUsers = todayRegisteredUsers; + appMonitorInfo.TodayIntendedOrders = todayIntendedOrders; + appMonitorInfo.TodayPaidOrders = todayPaidOrders; + appMonitorInfo.TodayRechargeAmount = todayRechargeAmount ?? 0; + appMonitorInfo.CurrentOnlineUsers = 0; + appMonitorInfo.CurrentQueuedUsers = currentQueuedUsers; + appMonitorInfo.CurrentPlayingUsers = currentPlayingUsers; + + var t = appMonitorInfo.ToAppBasicStatistics(); + Console.WriteLine(JsonConvert.SerializeObject(t)); + Console.WriteLine($"消耗{sw.Elapsed.TotalMilliseconds.ToString("0.###")}"); + + } } \ No newline at end of file diff --git a/src/CloudGaming/Code/CloudGaming.Code/Payment/PaymentExtend.cs b/src/CloudGaming/Code/CloudGaming.Code/Payment/PaymentExtend.cs index 1bb08eb..7602343 100644 --- a/src/CloudGaming/Code/CloudGaming.Code/Payment/PaymentExtend.cs +++ b/src/CloudGaming/Code/CloudGaming.Code/Payment/PaymentExtend.cs @@ -170,7 +170,7 @@ public static class PaymentExtend { Price = productCache.Price, CreatedAt = DateTime.Now, - IntentAt = DateTime.Now, + CreatedDay = int.Parse(DateTime.Now.ToString("yyyyMMdd")), Method = payment, Notes = "", ProductId = productCache.ProductId, diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/Other/AppBasicStatistics.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/Other/AppBasicStatistics.cs new file mode 100644 index 0000000..1d44845 --- /dev/null +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/Other/AppBasicStatistics.cs @@ -0,0 +1,49 @@ +namespace CloudGaming.DtoModel.Other +{ + /// + /// app基础统计 + /// + public class AppBasicStatistics + { + /// + /// 当前在线人数 + /// + public int CurrentOnlineUsers { get; set; } + + /// + /// 当前排队人数 + /// + public int CurrentQueuedUsers { get; set; } + + /// + /// 当前玩游戏人数 + /// + public int CurrentPlayingUsers { get; set; } + + + /// + /// 今日意向订单 + /// + public int TodayIntendedOrders { get; set; } + + /// + /// 今日登录人数 + /// + public int TodayLoggedInUsers { get; set; } + + /// + /// 今日支付订单 + /// + public int TodayPaidOrders { get; set; } + + /// + /// 今日充值金额 + /// + public decimal TodayRechargeAmount { get; set; } + + /// + /// 今日注册人数 + /// + public int TodayRegisteredUsers { get; set; } + } +} \ No newline at end of file diff --git a/src/CloudGaming/Model/CloudGaming.DtoModel/Other/AppMonitorInfo.cs b/src/CloudGaming/Model/CloudGaming.DtoModel/Other/AppMonitorInfo.cs index a1fd2f3..2aa6104 100644 --- a/src/CloudGaming/Model/CloudGaming.DtoModel/Other/AppMonitorInfo.cs +++ b/src/CloudGaming/Model/CloudGaming.DtoModel/Other/AppMonitorInfo.cs @@ -13,7 +13,7 @@ namespace CloudGaming.DtoModel.Other; /// /// app监控数据 /// -public class AppMonitorInfo +public class AppMonitorInfo : AppBasicStatistics { /// /// 用户所有的游戏状态 @@ -28,45 +28,6 @@ public class AppMonitorInfo /// /// 用户游戏状态统计 /// - public Dictionary PlayGameStatusStatistics() => PlayGameUserInfos.GroupBy(it => it.GameStatus).ToDictionary(it => it.Key, it => it.Count()); + public Dictionary PlayGameStatusStatistics() => PlayGameUserInfos == null ? new Dictionary() : PlayGameUserInfos.GroupBy(it => it.GameStatus).ToDictionary(it => it.Key, it => it.Count()); - /// - /// 今日注册人数 - /// - public int TodayRegisteredUsers { get; set; } - - /// - /// 今日登录人数 - /// - public int TodayLoggedInUsers { get; set; } - - /// - /// 当前在线人数 - /// - public int CurrentOnlineUsers { get; set; } - - /// - /// 当前玩游戏人数 - /// - public int CurrentPlayingUsers { get; set; } - - /// - /// 当前排队人数 - /// - public int CurrentQueuedUsers { get; set; } - - /// - /// 今日意向订单 - /// - public int TodayIntendedOrders { get; set; } - - /// - /// 今日支付订单 - /// - public int TodayPaidOrders { get; set; } - - /// - /// 今日充值金额 - /// - public decimal TodayRechargeAmount { 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 7ac49ac..adcd151 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/CloudGamingUserContext.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/CloudGamingUserContext.cs @@ -104,7 +104,7 @@ public partial class CloudGamingUserContext : MultiTenantDbContext//DbContext public virtual DbSet T_User_Token { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { // => optionsBuilder.UseSqlServer("Server=192.168.195.6;Database=CloudGamingUser;User Id=sa;Password=Dbt@com@123;TrustServerCertificate=true;"); + { // => optionsBuilder.UseSqlServer("Server=192.168.195.8;Database=CloudGamingUser;User Id=sa;Password=Dbt@com@123;TrustServerCertificate=true;"); } protected override void OnModelCreating(ModelBuilder modelBuilder) @@ -322,9 +322,7 @@ public partial class CloudGamingUserContext : MultiTenantDbContext//DbContext entity.Property(e => e.CreatedAt) .HasComment("创建时间") .HasColumnType("datetime"); - entity.Property(e => e.IntentAt) - .HasComment("订单创建时间") - .HasColumnType("datetime"); + entity.Property(e => e.CreatedDay).HasComment("创建天"); entity.Property(e => e.Method) .HasMaxLength(10) .HasComment("支付方式") diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_IntentOrder.cs b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_IntentOrder.cs index 5b1ff5d..19a5328 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_IntentOrder.cs +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/Db_User/T_User_IntentOrder.cs @@ -49,11 +49,6 @@ public partial class T_User_IntentOrder: MultiTenantEntity /// public virtual string? Notes { get; set; } - /// - /// 订单创建时间 - /// - public virtual DateTime IntentAt { get; set; } - /// /// 创建时间 /// @@ -73,4 +68,9 @@ public partial class T_User_IntentOrder: MultiTenantEntity /// 订单Id /// public virtual string OrderId { get; set; } = null!; + + /// + /// 创建天 + /// + public virtual int CreatedDay { get; set; } } diff --git a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/efcore-gen.md b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/efcore-gen.md index e76d9fc..ee465f0 100644 --- a/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/efcore-gen.md +++ b/src/CloudGaming/Model/CloudGaming.Model/DbSqlServer/efcore-gen.md @@ -3,7 +3,7 @@ ```sh --user dotnet ef dbcontext scaffold "Server=192.168.1.17;Database=CloudGamingUser;User Id=sa;Password=Dbt@com@123;TrustServerCertificate=true;" Microsoft.EntityFrameworkCore.SqlServer -o DbSqlServer/Db_User/ --use-database-names --no-pluralize --force -dotnet ef dbcontext scaffold "Server=192.168.195.6;Database=CloudGamingUser;User Id=sa;Password=Dbt@com@123;TrustServerCertificate=true;" Microsoft.EntityFrameworkCore.SqlServer -o DbSqlServer/Db_User/ --use-database-names --no-pluralize --force +dotnet ef dbcontext scaffold "Server=192.168.195.8;Database=CloudGamingUser;User Id=sa;Password=Dbt@com@123;TrustServerCertificate=true;" Microsoft.EntityFrameworkCore.SqlServer -o DbSqlServer/Db_User/ --use-database-names --no-pluralize --force --CloudGamingPhone dotnet ef dbcontext scaffold "Server=192.168.1.17;Database=CloudGamingPhone;User Id=sa;Password=Dbt@com@123;TrustServerCertificate=true;" Microsoft.EntityFrameworkCore.SqlServer -o DbSqlServer/Db_Phone/ --use-database-names --no-pluralize --force