From ac96a27072a25dc8d2b8d44bfb8c3be2154405ff Mon Sep 17 00:00:00 2001 From: sulu Date: Sat, 10 Aug 2024 23:43:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AutoDispathingWork/ApplicationDbContext.cs | 46 +++++ AutoDispathingWork/AutoDispathingWork.csproj | 10 +- AutoDispathingWork/CloseWorker.cs | 11 +- .../Controllers/UserController.cs | 88 +++++---- AutoDispathingWork/Dispathing.db | Bin 131072 -> 131072 bytes AutoDispathingWork/Domains/LogInfo.cs | 13 +- AutoDispathingWork/Domains/Polygon.cs | 3 +- AutoDispathingWork/Domains/SmsSendRecord.cs | 38 ++++ .../Dto/Configuration/ClientOptions.cs | 3 +- .../Dto/QueryResponse/UserResp.cs | 1 + .../20240810135019_initDb.Designer.cs | 145 ++++++++++++++ .../Migrations/20240810135019_initDb.cs | 89 +++++++++ .../20240810152436_dbv2.Designer.cs | 182 ++++++++++++++++++ .../Migrations/20240810152436_dbv2.cs | 46 +++++ .../ApplicationDbContextModelSnapshot.cs | 179 +++++++++++++++++ AutoDispathingWork/Program.cs | 17 ++ .../Services/SettingServices.cs | 32 ++- AutoDispathingWork/Services/SmsService.cs | 12 ++ AutoDispathingWork/Services/SpiderServices.cs | 71 ++++--- .../Utils/StaticServiceProvider.cs | 11 +- AutoDispathingWork/Worker.cs | 16 +- AutoDispathingWork/appsettings.json | 3 + 22 files changed, 909 insertions(+), 107 deletions(-) create mode 100644 AutoDispathingWork/ApplicationDbContext.cs create mode 100644 AutoDispathingWork/Domains/SmsSendRecord.cs create mode 100644 AutoDispathingWork/Migrations/20240810135019_initDb.Designer.cs create mode 100644 AutoDispathingWork/Migrations/20240810135019_initDb.cs create mode 100644 AutoDispathingWork/Migrations/20240810152436_dbv2.Designer.cs create mode 100644 AutoDispathingWork/Migrations/20240810152436_dbv2.cs create mode 100644 AutoDispathingWork/Migrations/ApplicationDbContextModelSnapshot.cs create mode 100644 AutoDispathingWork/Services/SmsService.cs diff --git a/AutoDispathingWork/ApplicationDbContext.cs b/AutoDispathingWork/ApplicationDbContext.cs new file mode 100644 index 0000000..ebfd47f --- /dev/null +++ b/AutoDispathingWork/ApplicationDbContext.cs @@ -0,0 +1,46 @@ +using Microsoft.EntityFrameworkCore; +using WorkerService1.Domains; +using WorkerService1.Dto.Configuration; + +namespace WorkerService1; + +public class ApplicationDbContext : DbContext +{ + public ApplicationDbContext(DbContextOptions options) + : base(options) + { + } + private static readonly ILoggerFactory _loggerFactory = new LoggerFactory(); + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseLoggerFactory(_loggerFactory); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + var clientEntry = modelBuilder.Entity(); + clientEntry.HasKey(x => x.Id); + + var logEntry = modelBuilder.Entity(); + logEntry.HasKey(x => x.Id); + logEntry.HasIndex(x => x.CreateTime); + + var polygonEntry = modelBuilder.Entity(); + polygonEntry.HasKey(x => x.PolygonId); + polygonEntry.Property(x => x.Points).HasColumnType("jsonb"); + polygonEntry.Property(x => x.RangeCameras).HasColumnType("jsonb"); + + + var smsSendRecordEntry = modelBuilder.Entity(); + smsSendRecordEntry.HasKey(x => x.Id); + smsSendRecordEntry.HasIndex(x => x.SendTime); + } + + public DbSet SmsSendRecords { get; set; } + public DbSet ClientOptions { get; set; } + + public DbSet LogInfos { get; set; } + + public DbSet Polygons { get; set; } +} \ No newline at end of file diff --git a/AutoDispathingWork/AutoDispathingWork.csproj b/AutoDispathingWork/AutoDispathingWork.csproj index 34f94d2..fab1160 100644 --- a/AutoDispathingWork/AutoDispathingWork.csproj +++ b/AutoDispathingWork/AutoDispathingWork.csproj @@ -11,9 +11,15 @@ - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + - + + diff --git a/AutoDispathingWork/CloseWorker.cs b/AutoDispathingWork/CloseWorker.cs index 2f19287..d264d65 100644 --- a/AutoDispathingWork/CloseWorker.cs +++ b/AutoDispathingWork/CloseWorker.cs @@ -1,3 +1,4 @@ +using AutoDispathingWork.Utils; using Microsoft.Extensions.Options; using WorkerService1.Domains; using WorkerService1.Dto.Configuration; @@ -8,22 +9,17 @@ namespace WorkerService1; public class CloseWorker : BackgroundService { private readonly ILogger _logger; - private readonly SpiderServices _spiderServices; - private readonly IServiceProvider _serviceProvider; - - public CloseWorker(ILogger logger, SpiderServices spiderServices, IServiceProvider serviceProvider) + public CloseWorker(ILogger logger) { _logger = logger; - _spiderServices = spiderServices; - _serviceProvider = serviceProvider; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { - using var scope = _serviceProvider.CreateScope(); + using var scope = StaticServiceProvider.Current.CreateScope(); var settingServices = scope.ServiceProvider.GetRequiredService(); var options = settingServices.GetClientOptions(); if (_logger.IsEnabled(LogLevel.Information)) @@ -49,6 +45,7 @@ public class CloseWorker : BackgroundService private async Task Handle() { + var _spiderServices = StaticServiceProvider.Current.GetRequiredService(); var listRes = await _spiderServices.GetTaskList(3); if (listRes.IsSuccess) { diff --git a/AutoDispathingWork/Controllers/UserController.cs b/AutoDispathingWork/Controllers/UserController.cs index f68bc90..2abd3d0 100644 --- a/AutoDispathingWork/Controllers/UserController.cs +++ b/AutoDispathingWork/Controllers/UserController.cs @@ -1,6 +1,7 @@ using AutoDispathingWork.Utils; using LiteDB; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using WorkerService1.Domains; using WorkerService1.Dto; using WorkerService1.Dto.Configuration; @@ -30,10 +31,10 @@ public class UserController : ControllerBase [HttpGet("/api/Polygon/Pages")] public async Task>> GetPolygon([FromQuery] PageRequest request, - [FromServices] LiteDatabase db, [FromServices] SpiderServices spiderServices) + [FromServices] ApplicationDbContext db, [FromServices] SpiderServices spiderServices) { - var polygon = db.GetCollection(); - var result = polygon.FindAll().ToList(); + var polygon = db.Polygons; + var result = await polygon.ToListAsync(); var cameras = await spiderServices.GetCameras(); var cameraLocation = cameras.Result?.Records.Select(x => (x.name, Location: new Points(x.lon, x.lat))) .ToList(); @@ -56,37 +57,39 @@ public class UserController : ControllerBase [HttpPost("/api/Polygon")] - public SpiderResponse CreateOrUpdatePolygon([FromBody] Polygon request, [FromServices] LiteDatabase db) + public async Task> CreateOrUpdatePolygon([FromBody] Polygon request, + [FromServices] ApplicationDbContext db) { - var polygon = db.GetCollection(); + var polygon = db.Polygons; if (request.PolygonId == null) { request.PolygonId = Guid.NewGuid(); - var result = polygon.Insert(request); - return new SpiderResponse() + var result = await polygon.AddAsync(request); + await db.SaveChangesAsync(); + return new SpiderResponse { IsSuccess = true, Code = SpiderResponseCode.Success, Message = "保存成功", Result = true }; } - else + + var old = await polygon.FirstOrDefaultAsync(x => x.PolygonId == request.PolygonId); + old.Points = request.Points; + old.Name = request.Name; + polygon.Update(old); + await db.SaveChangesAsync(); + return new SpiderResponse { - var old = polygon.FindOne(x => x.PolygonId == request.PolygonId); - old.Points = request.Points; - old.Name = request.Name; - polygon.Update(old); - return new SpiderResponse() - { - IsSuccess = true, Code = SpiderResponseCode.Success, Message = "更新成功", Result = true - }; - } + IsSuccess = true, Code = SpiderResponseCode.Success, Message = "更新成功", Result = true + }; } [HttpDelete("/api/Polygon/{polygonId}")] - public SpiderResponse DeletePolygon([FromRoute] Guid polygonId, [FromServices] LiteDatabase db) + public async Task> DeletePolygon([FromRoute] Guid polygonId, + [FromServices] ApplicationDbContext db) { - var polygon = db.GetCollection(); - var result = polygon.FindById(polygonId); + var polygon = db.Polygons; + var result = await polygon.FirstOrDefaultAsync(x => x.PolygonId == polygonId); if (result == null) { return new SpiderResponse() @@ -95,7 +98,8 @@ public class UserController : ControllerBase }; } - polygon.Delete(polygonId); + polygon.Remove(result); + await db.SaveChangesAsync(); return new SpiderResponse() { IsSuccess = true, Code = SpiderResponseCode.Success, Message = "删除区域信息成功", Result = true @@ -103,10 +107,11 @@ public class UserController : ControllerBase } [HttpGet("/api/Polygon/{polygonId}")] - public SpiderResponse GetPolygon([FromRoute] Guid polygonId, [FromServices] LiteDatabase db) + public async Task> GetPolygon([FromRoute] Guid polygonId, + [FromServices] ApplicationDbContext db) { - var polygon = db.GetCollection(); - var result = polygon.FindById(polygonId); + var polygon = db.Polygons; + var result = await polygon.FirstOrDefaultAsync(x => x.PolygonId == polygonId); if (result == null) { return new SpiderResponse() @@ -123,11 +128,11 @@ public class UserController : ControllerBase [HttpPut("/api/Polygon/{polygonId}/UserId/{userId}")] - public async Task> BindPolygonUserId([FromRoute] Guid polygonId, [FromRoute] string userId, - [FromServices] LiteDatabase db, [FromServices] SpiderServices spiderServices) + public async Task> BindPolygonUserId([FromRoute] Guid polygonId, [FromRoute] string userId + , [FromServices] ApplicationDbContext db, [FromServices] SpiderServices spiderServices) { - var polygon = db.GetCollection(); - var result = polygon.FindOne(x => x.PolygonId == polygonId); + var polygon = db.Polygons; + var result = await polygon.FirstOrDefaultAsync(x => x.PolygonId == polygonId); if (result == null) { @@ -149,9 +154,11 @@ public class UserController : ControllerBase if (currentUser != null) { result.UserName = currentUser.UserRealName; + result.PhoneNumber = currentUser.UserPhoneNumber; } polygon.Update(result); + await db.SaveChangesAsync(); return new SpiderResponse() { IsSuccess = true, Code = SpiderResponseCode.Success, Message = "更新区域信息成功", Result = true @@ -159,13 +166,13 @@ public class UserController : ControllerBase } [HttpGet("/api/Polygon/others")] - public SpiderResponse>>> GetAllPoints([FromQuery] Guid? polygonId, - [FromServices] LiteDatabase db) + public async Task>>>> GetAllPoints([FromQuery] Guid? polygonId + , [FromServices] ApplicationDbContext db) { - var polygon = db.GetCollection(); + var polygon = db.Polygons; if (polygonId.HasValue) { - var result = polygon.Find(x => x.PolygonId != polygonId).ToList(); + var result = await polygon.Where(x => x.PolygonId != polygonId).ToListAsync(); var points = result.Select(x => x.Points).ToList(); return new SpiderResponse>>>() { @@ -174,7 +181,7 @@ public class UserController : ControllerBase } else { - var result = polygon.FindAll().ToList(); + var result = await polygon.ToListAsync(); var points = result.Select(x => x.Points).ToList(); return new SpiderResponse>>>() { @@ -185,10 +192,10 @@ public class UserController : ControllerBase [HttpGet("/api/Polygon/{polygonId}/InRangeCameras")] public async IAsyncEnumerable IsRangeInPolygon([FromRoute] Guid polygonId, - [FromServices] LiteDatabase db, [FromServices] SpiderServices spiderServices) + [FromServices] ApplicationDbContext db, [FromServices] SpiderServices spiderServices) { - var polygon = db.GetCollection(); - var result = polygon.FindOne(x => x.PolygonId == polygonId); + var polygon = db.Polygons; + var result = await polygon.FirstOrDefaultAsync(x => x.PolygonId == polygonId); if (result != null) { var cameras = await spiderServices.GetCameras(); @@ -243,13 +250,14 @@ public class UserController : ControllerBase } [HttpGet("/api/Log")] - public SpiderResponse> GetLog([FromQuery] PageRequest request, [FromServices] LiteDatabase db) + public SpiderResponse> GetLog([FromQuery] PageRequest request, + [FromServices] ApplicationDbContext db) { - var collection = db.GetCollection(); - var logs = collection.Query() + var collection = db.LogInfos; + var logs = collection .OrderByDescending(x => x.CreateTime) .Skip((request.Page - 1) * request.PageSize) - .Limit(request.PageSize) + .Take(request.PageSize) .ToList(); var total = collection.Count(); return new SpiderResponse>() diff --git a/AutoDispathingWork/Dispathing.db b/AutoDispathingWork/Dispathing.db index 9a308d2ac593d20d4545d13ba72632732853f506..60ea3d3881dd17d4742264a0f98aeb5277834965 100644 GIT binary patch delta 430 zcmZo@;Am*z*ig~H#KF4pBftD4#_~xEB-ogl85oqAC(A8RpKQH=3k&|bIcK3iBO}M; zJ&WW#Ss8%fKM0V{;!4|g?P|cK`^?NC>!xh{cu|HibMn{y%I-x#7fb?Th`BjH7JGbV z3InogCdYzI_r#La^2AC8F`&wfl9B=|eSJd%Lp@_tJrfH(LkqLbaR;U|O6cN{oy>Dc zRni8Br2gc;2lQn^i*guDaHyC(`H+Ex1un^3hm0f*a7gM;o_SDB7G$<1P8G)ws%-8$ SoGrsx)cp7U_P_TTnH2zzHIh#N delta 347 zcmZo@;Am*z*ig~H#KyYuBftD4#_~xEB-oBKF)%!5nk=_KeQG)5*U1SEMw@dM`ZF>z zP2RIej+ZMn^3?s~2gLYpglb!D{KzZIs5|-Ver308W(J0CAZGXv0;xb2dwgaJ1F~u+ z$AV1v#FEtV#7YKHpvsJrk^(DzeM2KdJrg~1Q#~USgU#^=rZbA`V3(ZCcSu#-8i(Bd zL*kP~4oXUg7UeJ)<4`mGkb$^44!Qe>jKuYE%85^QI4mM=fn9!c&fy6%6C2nWvz!0k L-~RVLBeMbk9Jgyr diff --git a/AutoDispathingWork/Domains/LogInfo.cs b/AutoDispathingWork/Domains/LogInfo.cs index 1ded581..b512fe5 100644 --- a/AutoDispathingWork/Domains/LogInfo.cs +++ b/AutoDispathingWork/Domains/LogInfo.cs @@ -32,9 +32,9 @@ public static class LogInfoExtensions { var logger = StaticServiceProvider.GetLogger(from); logger.LogInformation(message); - var db = StaticServiceProvider.GetLogDb(); + var log = new LogInfo("Info", message, from); - db.Insert(log); + StaticServiceProvider.AddLog(log); return log; } @@ -42,9 +42,8 @@ public static class LogInfoExtensions { var logger = StaticServiceProvider.GetLogger(from); logger.LogError(message); - var db = StaticServiceProvider.GetLogDb(); var log = new LogInfo("Error", message, from); - db.Insert(log); + StaticServiceProvider.AddLog(log); return log; } @@ -52,9 +51,8 @@ public static class LogInfoExtensions { var logger = StaticServiceProvider.GetLogger(from); logger.LogWarning(message); - var db = StaticServiceProvider.GetLogDb(); var log = new LogInfo("Warning", message, from); - db.Insert(log); + StaticServiceProvider.AddLog(log); return log; } @@ -62,9 +60,8 @@ public static class LogInfoExtensions { var logger = StaticServiceProvider.GetLogger(from); logger.LogDebug(message); - var db = StaticServiceProvider.GetLogDb(); var log = new LogInfo("Debug", message, from); - db.Insert(log); + StaticServiceProvider.AddLog(log); return log; } } \ No newline at end of file diff --git a/AutoDispathingWork/Domains/Polygon.cs b/AutoDispathingWork/Domains/Polygon.cs index 153d92a..395cdab 100644 --- a/AutoDispathingWork/Domains/Polygon.cs +++ b/AutoDispathingWork/Domains/Polygon.cs @@ -5,7 +5,8 @@ public class Polygon public Guid? PolygonId { get; set; } public string Name { get; set; } public string? UserId { get; set; } - public string? UserName { get; set; } + public string? UserName { get; set; } + public string? PhoneNumber { get; set; } public List>? Points { get; set; } public List? RangeCameras { get; set; } = new List(); diff --git a/AutoDispathingWork/Domains/SmsSendRecord.cs b/AutoDispathingWork/Domains/SmsSendRecord.cs new file mode 100644 index 0000000..327e999 --- /dev/null +++ b/AutoDispathingWork/Domains/SmsSendRecord.cs @@ -0,0 +1,38 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace WorkerService1.Domains; + +public class SmsSendRecord +{ + /// + /// 自增主键 + /// + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + /// + /// 业务id + /// + public string RefrenceId { get; set; } + /// + /// 手机号 + /// + public string PhoneNumber { get; set; } + /// + /// 短信内容 + /// + public string Content { get; set; } + /// + /// 发送时间 + /// + public DateTime SendTime { get; set; } + /// + /// 是否成功 + /// + public bool IsSuccess { get; set; } + /// + /// 错误信息 + /// + public string ErrorMessage { get; set; } +} \ No newline at end of file diff --git a/AutoDispathingWork/Dto/Configuration/ClientOptions.cs b/AutoDispathingWork/Dto/Configuration/ClientOptions.cs index 5be1b2c..005394f 100644 --- a/AutoDispathingWork/Dto/Configuration/ClientOptions.cs +++ b/AutoDispathingWork/Dto/Configuration/ClientOptions.cs @@ -4,7 +4,8 @@ namespace WorkerService1.Dto.Configuration; public class ClientOptions { - public string ApiGateway { get; set; } = "http://121.4.75.240/"; + public Guid Id { get; set; } = Guid.NewGuid(); + public string ApiGateway { get; set; } = "http://101.35.48.186/"; [JsonPropertyName("username")] public string UserName { get; set; } = "ganquanjiedao"; [JsonPropertyName("password")] diff --git a/AutoDispathingWork/Dto/QueryResponse/UserResp.cs b/AutoDispathingWork/Dto/QueryResponse/UserResp.cs index a2e5be0..81924d1 100644 --- a/AutoDispathingWork/Dto/QueryResponse/UserResp.cs +++ b/AutoDispathingWork/Dto/QueryResponse/UserResp.cs @@ -27,4 +27,5 @@ public class UserRecord [JsonPropertyName("id")] public string Id { get; set; } [JsonPropertyName("userName")] public string UserName { get; set; } [JsonPropertyName("userRealName")] public string UserRealName { get; set; } + [JsonPropertyName("phoneNo")] public string UserPhoneNumber { get; set; } } \ No newline at end of file diff --git a/AutoDispathingWork/Migrations/20240810135019_initDb.Designer.cs b/AutoDispathingWork/Migrations/20240810135019_initDb.Designer.cs new file mode 100644 index 0000000..5c6b164 --- /dev/null +++ b/AutoDispathingWork/Migrations/20240810135019_initDb.Designer.cs @@ -0,0 +1,145 @@ +// +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using WorkerService1; +using WorkerService1.Domains; + +#nullable disable + +namespace AutoDispathingWork.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20240810135019_initDb")] + partial class initDb + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("WorkerService1.Domains.LogInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("From") + .IsRequired() + .HasColumnType("text"); + + b.Property("Level") + .IsRequired() + .HasColumnType("text"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CreateTime"); + + b.ToTable("LogInfos"); + }); + + modelBuilder.Entity("WorkerService1.Domains.Polygon", b => + { + b.Property("PolygonId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property>>("Points") + .HasColumnType("jsonb"); + + b.Property>("RangeCameras") + .HasColumnType("jsonb"); + + b.Property("UserId") + .HasColumnType("text"); + + b.Property("UserName") + .HasColumnType("text"); + + b.HasKey("PolygonId"); + + b.ToTable("Polygons"); + }); + + modelBuilder.Entity("WorkerService1.Dto.Configuration.ClientOptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApiGateway") + .IsRequired() + .HasColumnType("text"); + + b.Property("CloseFileApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("CloseFileRunning") + .HasColumnType("boolean"); + + b.Property("Delay") + .HasColumnType("integer"); + + b.Property("DiposeOrder") + .IsRequired() + .HasColumnType("text"); + + b.Property("DispatchingRunning") + .HasColumnType("boolean"); + + b.Property("GetCamerasApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("GetTaskApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("GetUserApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("LoginApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text") + .HasAnnotation("Relational:JsonPropertyName", "password"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("text") + .HasAnnotation("Relational:JsonPropertyName", "username"); + + b.HasKey("Id"); + + b.ToTable("ClientOptions"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AutoDispathingWork/Migrations/20240810135019_initDb.cs b/AutoDispathingWork/Migrations/20240810135019_initDb.cs new file mode 100644 index 0000000..0fbcb8d --- /dev/null +++ b/AutoDispathingWork/Migrations/20240810135019_initDb.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; +using WorkerService1.Domains; + +#nullable disable + +namespace AutoDispathingWork.Migrations +{ + /// + public partial class initDb : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "ClientOptions", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + ApiGateway = table.Column(type: "text", nullable: false), + UserName = table.Column(type: "text", nullable: false), + Password = table.Column(type: "text", nullable: false), + Delay = table.Column(type: "integer", nullable: false), + DispatchingRunning = table.Column(type: "boolean", nullable: false), + CloseFileRunning = table.Column(type: "boolean", nullable: false), + LoginApi = table.Column(type: "text", nullable: false), + GetTaskApi = table.Column(type: "text", nullable: false), + GetUserApi = table.Column(type: "text", nullable: false), + DiposeOrder = table.Column(type: "text", nullable: false), + CloseFileApi = table.Column(type: "text", nullable: false), + GetCamerasApi = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ClientOptions", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "LogInfos", + columns: table => new + { + Id = table.Column(type: "uuid", nullable: false), + Message = table.Column(type: "text", nullable: false), + From = table.Column(type: "text", nullable: false), + Level = table.Column(type: "text", nullable: false), + CreateTime = table.Column(type: "timestamp with time zone", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_LogInfos", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Polygons", + columns: table => new + { + PolygonId = table.Column(type: "uuid", nullable: false), + Name = table.Column(type: "text", nullable: false), + UserId = table.Column(type: "text", nullable: true), + UserName = table.Column(type: "text", nullable: true), + Points = table.Column>>(type: "jsonb", nullable: true), + RangeCameras = table.Column>(type: "jsonb", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Polygons", x => x.PolygonId); + }); + + migrationBuilder.CreateIndex( + name: "IX_LogInfos_CreateTime", + table: "LogInfos", + column: "CreateTime"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ClientOptions"); + + migrationBuilder.DropTable( + name: "LogInfos"); + + migrationBuilder.DropTable( + name: "Polygons"); + } + } +} diff --git a/AutoDispathingWork/Migrations/20240810152436_dbv2.Designer.cs b/AutoDispathingWork/Migrations/20240810152436_dbv2.Designer.cs new file mode 100644 index 0000000..5b2a0bc --- /dev/null +++ b/AutoDispathingWork/Migrations/20240810152436_dbv2.Designer.cs @@ -0,0 +1,182 @@ +// +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using WorkerService1; +using WorkerService1.Domains; + +#nullable disable + +namespace AutoDispathingWork.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20240810152436_dbv2")] + partial class dbv2 + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("WorkerService1.Domains.LogInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("From") + .IsRequired() + .HasColumnType("text"); + + b.Property("Level") + .IsRequired() + .HasColumnType("text"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CreateTime"); + + b.ToTable("LogInfos"); + }); + + modelBuilder.Entity("WorkerService1.Domains.Polygon", b => + { + b.Property("PolygonId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property>>("Points") + .HasColumnType("jsonb"); + + b.Property>("RangeCameras") + .HasColumnType("jsonb"); + + b.Property("UserId") + .HasColumnType("text"); + + b.Property("UserName") + .HasColumnType("text"); + + b.HasKey("PolygonId"); + + b.ToTable("Polygons"); + }); + + modelBuilder.Entity("WorkerService1.Domains.SmsSendRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("ErrorMessage") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsSuccess") + .HasColumnType("boolean"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("RefrenceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("SendTime") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("SendTime"); + + b.ToTable("SmsSendRecords"); + }); + + modelBuilder.Entity("WorkerService1.Dto.Configuration.ClientOptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApiGateway") + .IsRequired() + .HasColumnType("text"); + + b.Property("CloseFileApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("CloseFileRunning") + .HasColumnType("boolean"); + + b.Property("Delay") + .HasColumnType("integer"); + + b.Property("DiposeOrder") + .IsRequired() + .HasColumnType("text"); + + b.Property("DispatchingRunning") + .HasColumnType("boolean"); + + b.Property("GetCamerasApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("GetTaskApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("GetUserApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("LoginApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text") + .HasAnnotation("Relational:JsonPropertyName", "password"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("text") + .HasAnnotation("Relational:JsonPropertyName", "username"); + + b.HasKey("Id"); + + b.ToTable("ClientOptions"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AutoDispathingWork/Migrations/20240810152436_dbv2.cs b/AutoDispathingWork/Migrations/20240810152436_dbv2.cs new file mode 100644 index 0000000..2763b03 --- /dev/null +++ b/AutoDispathingWork/Migrations/20240810152436_dbv2.cs @@ -0,0 +1,46 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace AutoDispathingWork.Migrations +{ + /// + public partial class dbv2 : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "SmsSendRecords", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + RefrenceId = table.Column(type: "text", nullable: false), + PhoneNumber = table.Column(type: "text", nullable: false), + Content = table.Column(type: "text", nullable: false), + SendTime = table.Column(type: "timestamp with time zone", nullable: false), + IsSuccess = table.Column(type: "boolean", nullable: false), + ErrorMessage = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SmsSendRecords", x => x.Id); + }); + + migrationBuilder.CreateIndex( + name: "IX_SmsSendRecords_SendTime", + table: "SmsSendRecords", + column: "SendTime"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "SmsSendRecords"); + } + } +} diff --git a/AutoDispathingWork/Migrations/ApplicationDbContextModelSnapshot.cs b/AutoDispathingWork/Migrations/ApplicationDbContextModelSnapshot.cs new file mode 100644 index 0000000..e55bf80 --- /dev/null +++ b/AutoDispathingWork/Migrations/ApplicationDbContextModelSnapshot.cs @@ -0,0 +1,179 @@ +// +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using WorkerService1; +using WorkerService1.Domains; + +#nullable disable + +namespace AutoDispathingWork.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + partial class ApplicationDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.7") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("WorkerService1.Domains.LogInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("CreateTime") + .HasColumnType("timestamp with time zone"); + + b.Property("From") + .IsRequired() + .HasColumnType("text"); + + b.Property("Level") + .IsRequired() + .HasColumnType("text"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CreateTime"); + + b.ToTable("LogInfos"); + }); + + modelBuilder.Entity("WorkerService1.Domains.Polygon", b => + { + b.Property("PolygonId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property>>("Points") + .HasColumnType("jsonb"); + + b.Property>("RangeCameras") + .HasColumnType("jsonb"); + + b.Property("UserId") + .HasColumnType("text"); + + b.Property("UserName") + .HasColumnType("text"); + + b.HasKey("PolygonId"); + + b.ToTable("Polygons"); + }); + + modelBuilder.Entity("WorkerService1.Domains.SmsSendRecord", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Content") + .IsRequired() + .HasColumnType("text"); + + b.Property("ErrorMessage") + .IsRequired() + .HasColumnType("text"); + + b.Property("IsSuccess") + .HasColumnType("boolean"); + + b.Property("PhoneNumber") + .IsRequired() + .HasColumnType("text"); + + b.Property("RefrenceId") + .IsRequired() + .HasColumnType("text"); + + b.Property("SendTime") + .HasColumnType("timestamp with time zone"); + + b.HasKey("Id"); + + b.HasIndex("SendTime"); + + b.ToTable("SmsSendRecords"); + }); + + modelBuilder.Entity("WorkerService1.Dto.Configuration.ClientOptions", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid"); + + b.Property("ApiGateway") + .IsRequired() + .HasColumnType("text"); + + b.Property("CloseFileApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("CloseFileRunning") + .HasColumnType("boolean"); + + b.Property("Delay") + .HasColumnType("integer"); + + b.Property("DiposeOrder") + .IsRequired() + .HasColumnType("text"); + + b.Property("DispatchingRunning") + .HasColumnType("boolean"); + + b.Property("GetCamerasApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("GetTaskApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("GetUserApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("LoginApi") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text") + .HasAnnotation("Relational:JsonPropertyName", "password"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("text") + .HasAnnotation("Relational:JsonPropertyName", "username"); + + b.HasKey("Id"); + + b.ToTable("ClientOptions"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/AutoDispathingWork/Program.cs b/AutoDispathingWork/Program.cs index 725a879..9702286 100644 --- a/AutoDispathingWork/Program.cs +++ b/AutoDispathingWork/Program.cs @@ -1,7 +1,10 @@ using AutoDispathingWork.Utils; using LiteDB; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.FileProviders; using Microsoft.OpenApi.Models; +using Npgsql; using WorkerService1; using WorkerService1.Dto.Configuration; using WorkerService1.Services; @@ -26,6 +29,20 @@ builder.Services.AddCors(x => .AllowAnyHeader(); }); }); +var connectionString = builder.Configuration.GetConnectionString("DefaultConnection"); +builder.Services.AddDbContext(x => + { + var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString); + // 启用动态 JSON 序列化 + dataSourceBuilder.EnableDynamicJson(); + var dataSource = dataSourceBuilder.Build(); + x.UseNpgsql(dataSource) + .UseLoggerFactory(new LoggerFactory()) + .LogTo(Console.WriteLine, LogLevel.Information); + x.ConfigureWarnings(warnings => warnings.Ignore(CoreEventId.ManyServiceProvidersCreatedWarning)); + + } +); builder.Services.AddSwaggerGen(); builder.Services.AddSingleton(x => new LiteDatabase(builder.Configuration["Database:ConnectionString"])); diff --git a/AutoDispathingWork/Services/SettingServices.cs b/AutoDispathingWork/Services/SettingServices.cs index 7ea9029..6eb67b4 100644 --- a/AutoDispathingWork/Services/SettingServices.cs +++ b/AutoDispathingWork/Services/SettingServices.cs @@ -1,4 +1,5 @@ -using LiteDB; +using AutoDispathingWork.Utils; +using LiteDB; using Microsoft.Extensions.Options; using WorkerService1.Dto.Configuration; @@ -7,23 +8,25 @@ namespace WorkerService1.Services; public class SettingServices { private readonly IOptionsMonitor _optionsMonitor; - private readonly LiteDatabase _db; - public SettingServices(IOptionsMonitor optionsMonitor, LiteDatabase db) + + + public SettingServices(IOptionsMonitor optionsMonitor) { _optionsMonitor = optionsMonitor; - _db = db; } public void Reset() { SettingClientOptions(_optionsMonitor.CurrentValue); } - + public ClientOptions GetClientOptions() { - var clientOptions = _db.GetCollection(); - var dbOptions = clientOptions.FindAll().FirstOrDefault(); + using var scope = StaticServiceProvider.Current.CreateScope(); + var _db = scope.ServiceProvider.GetService(); + var clientOptions = _db.ClientOptions; + var dbOptions = clientOptions.FirstOrDefault(); if (dbOptions != null) { return dbOptions; @@ -34,9 +37,18 @@ public class SettingServices public ClientOptions SettingClientOptions(ClientOptions options) { - var clientOptions = _db.GetCollection(); - clientOptions.DeleteAll(); - clientOptions.Insert(options); + using var scope = StaticServiceProvider.Current.CreateScope(); + var _db = scope.ServiceProvider.GetService(); + var clientOptions = _db.ClientOptions; + var dbOptions = clientOptions.FirstOrDefault(); + if (dbOptions != null) + { + clientOptions.Remove(dbOptions); + _db.SaveChanges(); + } + + clientOptions.Add(options); + _db.SaveChanges(); return options; } } \ No newline at end of file diff --git a/AutoDispathingWork/Services/SmsService.cs b/AutoDispathingWork/Services/SmsService.cs new file mode 100644 index 0000000..50c387b --- /dev/null +++ b/AutoDispathingWork/Services/SmsService.cs @@ -0,0 +1,12 @@ +namespace WorkerService1.Services; + +public class SmsService +{ + public Task SendSmsAsync(string phoneNumber, string message,string refrenceId) + { + //发送短信逻辑 + + Console.WriteLine($"Sending SMS to {phoneNumber} with message {message} and refrenceId {refrenceId}"); + return Task.CompletedTask; + } +} \ No newline at end of file diff --git a/AutoDispathingWork/Services/SpiderServices.cs b/AutoDispathingWork/Services/SpiderServices.cs index 402b418..8a66359 100644 --- a/AutoDispathingWork/Services/SpiderServices.cs +++ b/AutoDispathingWork/Services/SpiderServices.cs @@ -2,6 +2,7 @@ using System.Text; using AutoDispathingWork.Utils; using LiteDB; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Options; using WorkerService1.Domains; @@ -33,26 +34,25 @@ public class SpiderServices _serviceProvider = serviceProvider; } - private IOptionsMonitor OptionsMonitor => _serviceProvider.CreateScope().ServiceProvider - .GetRequiredService>(); - private ClientOptions GetClientOptions => _serviceProvider.CreateScope().ServiceProvider - .GetRequiredService() - .GetClientOptions(); + // private ClientOptions GetClientOptions => _serviceProvider.CreateScope().ServiceProvider + // .GetRequiredService() + // .GetClientOptions(); - private LiteDatabase GetLiteDatabase => _serviceProvider - .GetRequiredService(); public async Task> Login() { + using var scope = _serviceProvider.CreateScope(); using var client = _httpClientFactory.CreateClient(); - var loginApi = GetClientOptions.LoginUrl; + var getClientOptions = scope.ServiceProvider.GetService()? + .GetClientOptions(); + var loginApi = getClientOptions.LoginUrl; var json = $@" - {{""userName"":""{GetClientOptions.UserName}"",""userPwd"":""{GetClientOptions.Password}"",""type"":""account"",""clientAppId"":""megcity-web""}} + {{""userName"":""{getClientOptions.UserName}"",""userPwd"":""{getClientOptions.Password}"",""type"":""account"",""clientAppId"":""megcity-web""}} "; client.DefaultRequestHeaders.Add("Module-Alias", "pending-forward"); client.DefaultRequestHeaders.Add("Module-Source", "megcity-web"); - client.DefaultRequestHeaders.Add("Origin", "http://121.4.75.240"); + client.DefaultRequestHeaders.Add("Origin", _optionsMonitor.CurrentValue.ApiGateway); var response = await client.PostAsync(loginApi, new StringContent(json, Encoding.UTF8, "application/json")); var respJsonStr = await response.Content.ReadAsStringAsync(); _logger.LogInformation("登录返回: {tokenRes}", respJsonStr); @@ -91,10 +91,11 @@ public class SpiderServices entry.AbsoluteExpiration = DateTimeOffset.Now; return null; } + entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(loginRes.Result?.ExpireTime / 1000 ?? 0); return loginRes.Result?.Token; }); - if(string.IsNullOrWhiteSpace(token)) _memoryCache.Remove(nameof(GetToken)); + if (string.IsNullOrWhiteSpace(token)) _memoryCache.Remove(nameof(GetToken)); return token; } @@ -135,7 +136,10 @@ public class SpiderServices // {"state":[3],"pageNo":1,"pageSize":50,"sortType":[40,10],"handleStartTime":1697293650750,"handleEndTime":1699885650750} // {"state":[1],"pageNo":1,"pageSize":50,"sortType":[20,10],"createStartTime":1697290618034,"createEndTime":1699882618034} // {\"state\":[1],\"pageNo\":1,\"pageSize\":50,\"sortType\":[20,10],\"createStartTime\":1697204639551,\"createEndTime\":1697204639551} - var taskPath = GetClientOptions.GetTaskUrl; + using var scope = _serviceProvider.CreateScope(); + var getClientOptions = scope.ServiceProvider.GetService()? + .GetClientOptions(); + var taskPath = getClientOptions.GetTaskUrl; var response = await client.PostAsync(taskPath, new StringContent(JsonSerializer.Serialize(body), Encoding.UTF8, "application/json")); var respJsonStr = await response.Content.ReadAsStringAsync(); @@ -178,7 +182,10 @@ public class SpiderServices client.DefaultRequestHeaders.Add("module-alias", "pending-forward"); client.DefaultRequestHeaders.Add("module-source", "megcity-web"); var request = query ?? new UserQuery(); - var userPath = GetClientOptions.GetUserUrl; + using var scope = _serviceProvider.CreateScope(); + var getClientOptions = scope.ServiceProvider.GetService()? + .GetClientOptions(); + var userPath = getClientOptions.GetUserUrl; var response = await client.PostAsync(userPath, new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json")); var respJsonStr = await response.Content.ReadAsStringAsync(); @@ -221,7 +228,7 @@ public class SpiderServices client.DefaultRequestHeaders.Add("module-alias", "pending-forward"); client.DefaultRequestHeaders.Add("module-source", "megcity-web"); - var (handlerId, userRealName) = await GetUserIdByCamera(cameraName); + var (handlerId,phone, userRealName) = await GetUserIdByCamera(cameraName); if (string.IsNullOrWhiteSpace(handlerId)) { return new SpiderResponse() @@ -240,7 +247,10 @@ public class SpiderServices HandlerId = handlerId, TypeCode = typeCode }; - var dispatchPath = string.Format(GetClientOptions.DiposeOrderUrl, caseNumber); + using var scope = _serviceProvider.CreateScope(); + var getClientOptions = scope.ServiceProvider.GetService()? + .GetClientOptions(); + var dispatchPath = string.Format(getClientOptions.DiposeOrderUrl, caseNumber); var response = await client.PostAsync(dispatchPath, new StringContent(JsonSerializer.Serialize(request), Encoding.UTF8, "application/json")); @@ -253,6 +263,8 @@ public class SpiderServices if (spiderRes?.code == 0) { var msg = $"成功分发任务,任务编号:{caseNumber},任务地址:{cameraName},任务类型:{typeCode},处理人:{userRealName}"; + var smsService = scope.ServiceProvider.GetService(); + await smsService.SendSmsAsync(phoneNumber:phone, $"{userRealName}您好,您有一条新案件,请及时处置,谢谢。",caseNumber); _logger.LogInformation(msg); return new SpiderResponse() @@ -290,7 +302,10 @@ public class SpiderServices //Region为请求文件接口需要的参数,根据调用接口参数而定 form.Add(new StringContent(caseNumber), "caseNumber"); form.Add(new StringContent(suggestion), "suggestion"); - var closeFile = GetClientOptions.CloseFileUrl; + using var scope = _serviceProvider.CreateScope(); + var getClientOptions = scope.ServiceProvider.GetService()? + .GetClientOptions(); + var closeFile = getClientOptions.CloseFileUrl; var response = await client.PostAsync(closeFile, form); var respJsonStr = await response.Content.ReadAsStringAsync(); @@ -302,7 +317,8 @@ public class SpiderServices if (spiderRes?.code == 0) { _logger.LogInformation("成功结案"); - + _serviceProvider.GetService()? + .SendSmsAsync("13700000000", "您有一条案件已经结案", caseNumber); return new SpiderResponse() { IsSuccess = true, @@ -335,7 +351,10 @@ public class SpiderServices var request = $@" {{""managementIds"":[""6e9232ef-7b84-11e8-86b1-6c92bf4e6960""],""name"":""{name}"" ,""action"":""all"",""pageNo"":1,""pageSize"":200}} "; - var getCamersPath = GetClientOptions.GetCamerasUrl; + using var scope = _serviceProvider.CreateScope(); + var getClientOptions = scope.ServiceProvider.GetService()? + .GetClientOptions(); + var getCamersPath = getClientOptions.GetCamerasUrl; var response = await client.PostAsync(getCamersPath, new StringContent(request, Encoding.UTF8, "application/json")); var respJsonStr = await response.Content.ReadAsStringAsync(); @@ -373,23 +392,25 @@ public class SpiderServices }; } - public async Task<(string userId, string userRealName )> GetUserIdByCamera(string cameraAddress) + public async Task<(string userId,string phone, string userRealName )> GetUserIdByCamera(string cameraAddress) { + using var scope = _serviceProvider.CreateScope(); var camerasResp = await GetCameras(cameraAddress); var camera = camerasResp.Result?.Records.FirstOrDefault(); - if (camera == null) return (string.Empty, string.Empty); + if (camera == null) return (string.Empty,string.Empty, string.Empty); var location = new Points(camera.lon, camera.lat); - var db = _serviceProvider.GetRequiredService(); - var polygonDb = db.GetCollection(); - var polygons = polygonDb.FindAll(); + var db = scope.ServiceProvider.GetService() + .Polygons; + var polygonDb = db; + var polygons = await polygonDb.ToListAsync(); foreach (var polygon in polygons) { if (location.IsPointInsidePolygon(polygon)) { - return (polygon.UserId, polygon.UserName); + return (polygon.UserId, polygon.PhoneNumber, polygon.UserName); } } - return (string.Empty, string.Empty); + return (string.Empty, string.Empty,string.Empty); } } \ No newline at end of file diff --git a/AutoDispathingWork/Utils/StaticServiceProvider.cs b/AutoDispathingWork/Utils/StaticServiceProvider.cs index 7b90306..3a8334f 100644 --- a/AutoDispathingWork/Utils/StaticServiceProvider.cs +++ b/AutoDispathingWork/Utils/StaticServiceProvider.cs @@ -1,4 +1,6 @@ using LiteDB; +using Microsoft.EntityFrameworkCore; +using WorkerService1; using WorkerService1.Domains; namespace AutoDispathingWork.Utils; @@ -10,7 +12,7 @@ public class StaticServiceProvider Current = serviceProvider; } - private static IServiceProvider Current { get; set; } + public static IServiceProvider Current { get; set; } public static T GetRequiredService() { @@ -22,9 +24,12 @@ public class StaticServiceProvider return Current.GetService(); } - public static ILiteCollection GetLogDb() + public static void AddLog(LogInfo log) { - return Current.GetRequiredService().GetCollection(); + using var scope = Current.CreateScope(); + var dbContext = scope.ServiceProvider.GetRequiredService(); + dbContext.LogInfos.Add(log); + dbContext.SaveChanges(); } public static ILogger GetLogger(string methodName) diff --git a/AutoDispathingWork/Worker.cs b/AutoDispathingWork/Worker.cs index 65b5fc6..93ba8e8 100644 --- a/AutoDispathingWork/Worker.cs +++ b/AutoDispathingWork/Worker.cs @@ -1,6 +1,5 @@ -using Microsoft.Extensions.Options; +using AutoDispathingWork.Utils; using WorkerService1.Domains; -using WorkerService1.Dto.Configuration; using WorkerService1.Services; namespace WorkerService1; @@ -8,21 +7,17 @@ namespace WorkerService1; public class Worker : BackgroundService { private readonly ILogger _logger; - private readonly SpiderServices _spiderServices; - private readonly IServiceProvider _serviceProvider; - public Worker(ILogger logger, IServiceProvider serviceProvider, SpiderServices spiderServices) + public Worker(ILogger logger) { _logger = logger; - _serviceProvider = serviceProvider; - _spiderServices = spiderServices; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { - using var scope = _serviceProvider.CreateScope(); + using var scope = StaticServiceProvider.Current.CreateScope(); var settingServices = scope.ServiceProvider.GetRequiredService(); var options = settingServices.GetClientOptions(); if (_logger.IsEnabled(LogLevel.Information)) @@ -46,12 +41,13 @@ public class Worker : BackgroundService } } - private async Task Handle() + private static async Task Handle() { + var _spiderServices = StaticServiceProvider.Current.GetRequiredService(); var listRes = await _spiderServices.GetTaskList(1); if (listRes.IsSuccess) { - var needDispose = listRes.Result?.records.Where(x => x.disposalStatus == 1); + var needDispose = listRes.Result?.records.Where(x => x.disposalStatus == 1).ToList(); //轮询列表,看有没有符合状态的进行处理 if (needDispose?.Any() ?? false) { diff --git a/AutoDispathingWork/appsettings.json b/AutoDispathingWork/appsettings.json index 12c6ea4..8a64537 100644 --- a/AutoDispathingWork/appsettings.json +++ b/AutoDispathingWork/appsettings.json @@ -1,4 +1,7 @@ { + "ConnectionStrings": { + "DefaultConnection": "Host=101.35.48.186;Port=15432;Database=AutoDispathingWork;Username=postgres;Password=sl52788542;" + }, "Logging": { "LogLevel": { "Default": "Information",