From cef151886a077305a95172e1611ad4c2fc66d74f Mon Sep 17 00:00:00 2001 From: zhaoxinyu <89237069@qq.com> Date: Thu, 18 Apr 2024 15:48:16 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E6=95=B0=E6=8D=AE=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Incoming/InjectionMoldingRequestReader.cs | 59 +++++----- .../BasedataHttpApiHostModule.cs | 25 +++-- .../BasedataApplicationModule.cs | 7 ++ .../Boms/BomAppService.cs | 7 +- .../Caches/CacheAppService.cs | 106 ++++++++++++++++++ .../Boms/BomManager.cs | 11 +- .../Caches/Cache.cs | 47 ++------ 7 files changed, 182 insertions(+), 80 deletions(-) create mode 100644 be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Caches/CacheAppService.cs diff --git a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent/Incoming/InjectionMoldingRequestReader.cs b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent/Incoming/InjectionMoldingRequestReader.cs index bc27da7ad..537f6ec81 100644 --- a/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent/Incoming/InjectionMoldingRequestReader.cs +++ b/be/DataExchange/Fawtyg/Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent/Incoming/InjectionMoldingRequestReader.cs @@ -19,16 +19,13 @@ using Win_in.Sfs.Wms.Store.Application.Contracts; using System.Text.Json.Serialization; using System.IdentityModel.Tokens.Jwt; using Volo.Abp; - namespace Win_in.Sfs.Wms.DataExchange.Fawtyg.InjectionMoldingTaskAgent.Incoming; - public class InjectionMoldingRequestReader : IReader { private readonly IInjectionIssueRequestAppService _injectionRequest; private readonly IItemBasicAppService _itemService; private readonly ILocationAppService _locService; - private readonly ILogger _logger; private readonly IOptions _options; private readonly IHttpClientFactory _httpClientFactory; @@ -53,15 +50,6 @@ public class InjectionMoldingRequestReader : IReader _locService = locService; } - - - - - - - - - /// /// 读取注塑叫料任务 /// @@ -127,7 +115,6 @@ public class InjectionMoldingRequestReader : IReader _logger.LogInformation(error); } return new List(); - } // 创建新的注塑请求并将数据写入数据库 await _injectionRequest.CreateAsync(input).ConfigureAwait(false); @@ -194,27 +181,37 @@ public class InjectionMoldingRequestReader : IReader /// public async Task ReaderCameraApi() { - // 从配置中获取远程摄像头的地址、用户名、密码和令牌 - var address = _options.Value.AutoRemote.IpAddress; - var username = _options.Value.AutoRemote.UserName; - var password = _options.Value.AutoRemote.Password; - var token = _options.Value.AutoRemote.Token; - - // 创建一个HttpClient实例 - var client = _httpClientFactory.CreateClient(); - - // 将用户名和密码转换为Base64编码的凭据,并设置请求的身份验证信息 - var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")); - client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", credentials); - - // 发送GET请求到远程摄像头地址并等待响应 - var response = await client.GetAsync(address).ConfigureAwait(false); + try + { + + // 从配置中获取远程摄像头的地址、用户名、密码和令牌 + var address = _options.Value.AutoRemote.IpAddress; + var username = _options.Value.AutoRemote.UserName; + var password = _options.Value.AutoRemote.Password; + var token = _options.Value.AutoRemote.Token; + + // 创建一个HttpClient实例 + var client = _httpClientFactory.CreateClient(); + + // 将用户名和密码转换为Base64编码的凭据,并设置请求的身份验证信息 + var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{username}:{password}")); + client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", credentials); - // 如果请求成功,则返回响应内容,否则返回错误信息 - if (response.IsSuccessStatusCode) + + // 发送GET请求到远程摄像头地址并等待响应 + var response = await client.GetAsync(address).ConfigureAwait(false); + + // 如果请求成功,则返回响应内容,否则返回错误信息 + if (response.IsSuccessStatusCode) + { + return await response.Content.ReadAsStringAsync().ConfigureAwait(false); + } + } + catch (HttpRequestException ex) { - return await response.Content.ReadAsStringAsync().ConfigureAwait(false); + _logger.LogInformation("远程摄像头连接失败:" + ex.Message); + } return "Error occurred"; diff --git a/be/Hosts/Basedata.Host/Win_in.Sfs.Basedata.HttpApi.Host/BasedataHttpApiHostModule.cs b/be/Hosts/Basedata.Host/Win_in.Sfs.Basedata.HttpApi.Host/BasedataHttpApiHostModule.cs index 3f5af902b..5b973deba 100644 --- a/be/Hosts/Basedata.Host/Win_in.Sfs.Basedata.HttpApi.Host/BasedataHttpApiHostModule.cs +++ b/be/Hosts/Basedata.Host/Win_in.Sfs.Basedata.HttpApi.Host/BasedataHttpApiHostModule.cs @@ -20,6 +20,7 @@ using Volo.Abp.Modularity; using Volo.Abp.PermissionManagement.EntityFrameworkCore; using Volo.Abp.SettingManagement.EntityFrameworkCore; using Volo.Abp.Swashbuckle; +using Volo.Abp.Threading; using Volo.Abp.Timing; using Volo.Abp.Users; using Win_in.Sfs.Basedata.Application; @@ -67,19 +68,14 @@ public class BasedataHttpApiHostModule : ModuleBase { public override void ConfigureServices(ServiceConfigurationContext context) { - //base.ConfigureServices(context); - //ConfigureAuditing(); - //// - //ConfigureBlobStoring(); - //Configure(options => - //{ - // options.Kind = DateTimeKind.Local; - //}); + base.ConfigureServices(context); ConfigureAuditing(); // ConfigureBlobStoring(); + + } public override void PostConfigureServices(ServiceConfigurationContext context) @@ -120,7 +116,20 @@ public class BasedataHttpApiHostModule : ModuleBase public override void OnApplicationInitialization(ApplicationInitializationContext context) { + + CreateDatabase(context); base.OnApplicationInitialization(context); + + AsyncHelper.RunSync(async () => + { + using (var scope = context.ServiceProvider.CreateScope()) + { + await scope.ServiceProvider + .GetRequiredService().StartAsync().ConfigureAwait(false); + + } + }); + } } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationModule.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationModule.cs index f41b7119e..769302ef0 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationModule.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/BasedataApplicationModule.cs @@ -3,6 +3,7 @@ using Volo.Abp.Application; using Volo.Abp.AutoMapper; using Volo.Abp.Modularity; using Win_in.Sfs.Basedata.Application.Contracts; + using Win_in.Sfs.Basedata.Domain; using Win_in.Sfs.Shared.Application; @@ -19,10 +20,16 @@ public class BasedataApplicationModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { + context.Services.AddAutoMapperObjectMapper(); Configure(options => { options.AddMaps(validate: true); }); + + + + + } } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Boms/BomAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Boms/BomAppService.cs index 41e51c39a..cf42f2408 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Boms/BomAppService.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Boms/BomAppService.cs @@ -22,21 +22,26 @@ public class BomAppService : SfsBaseDataAppServiceBase, IBomAppService { + //private readonly CacheService _cacheService; + private new readonly IBomRepository _repository; private readonly IBomManager _bomManager; - List _bomList=new List(); + public BomAppService(IBomRepository repository , IBomManager bomManager , IDistributedCache cache + //, CacheService cacheService ) : base(repository, cache) { _repository = repository; _bomManager = bomManager; + //_cacheService = cacheService; base.CreatePolicyName = BomPermissions.Create; base.UpdatePolicyName = BomPermissions.Update; base.DeletePolicyName = BomPermissions.Delete; + //_cacheService.StartAsync().ConfigureAwait(false); } diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Caches/CacheAppService.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Caches/CacheAppService.cs new file mode 100644 index 000000000..c93b41744 --- /dev/null +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Application/Caches/CacheAppService.cs @@ -0,0 +1,106 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.Application.Services; +using Volo.Abp.Caching; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; +using Win_in.Sfs.Basedata.Application.Contracts; +using Win_in.Sfs.Basedata.Domain; +using Win_in.Sfs.Basedata.Domain.Caches; +using Win_in.Sfs.Basedata.Domain.Shared; + +namespace Win_in.Sfs.Basedata.Application; + +public class CycleOptions +{ + /// + /// Boms缓存生命周期(秒) + /// + public int BomsCycle { get; set; } + +} +/// +/// 提供缓存服务的类 +/// +public class CacheService:ISingletonDependency +{ + private readonly IServiceProvider _serviceProvider; + private readonly IOptions _options; + public CacheService(IServiceProvider serviceProvider, IOptions options) + { + _serviceProvider = serviceProvider; + _options = options; + } + + /// + /// 生命周期操作 + /// + private async Task BomsCycle() + { + using var serviceScope = _serviceProvider.CreateScope(); + var repository = serviceScope.ServiceProvider.GetRequiredService(); + var reassigner = new Reassigner(DateTime.Now, new TimeSpan(0, 0, _options.Value.BomsCycle==0?600: _options.Value.BomsCycle)); + await reassigner.RunAsync(async () => + { + Cache.Boms.Clear(); + Cache.Boms = await repository.GetListAsync().ConfigureAwait(false); + + }).ConfigureAwait(false); + } + + /// + /// 异步开始生命周期操作 + /// + public async Task StartAsync() + { + await BomsCycle().ConfigureAwait(false); + } + + /// + /// 异步重置BOM(Bill of Materials)生命周期操作 + /// + public async Task ResetAsync() + { + await BomsCycle().ConfigureAwait(false); + } +} + + +public class Reassigner +{ + private readonly TimeSpan _interval; + private DateTime _lasttime; + public Reassigner(DateTime lasttime, TimeSpan interval) + { + _lasttime = lasttime; + _interval = interval; + } + + public async Task RunAsync(Action p_action) + { + while (true) + { + // 获取当前时间 + var currentTime = DateTime.Now; + // 计算上次重新赋值到现在的时间间隔 + var elapsed = currentTime - _lasttime; + // 检查时间间隔是否满足条件 + if (elapsed >= _interval) + { + p_action(); + // 重新赋值 + //_value = await GetValueAsync(); + // 更新最后更新时间 + _lasttime = currentTime; + } + + // 等待下一刻钟 + await Task.Delay(_interval).ConfigureAwait(false); + } + } + +} diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Boms/BomManager.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Boms/BomManager.cs index 692ce3ef0..bd83d5143 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Boms/BomManager.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Boms/BomManager.cs @@ -10,7 +10,8 @@ using Volo.Abp; using Volo.Abp.Domain.Repositories; using Volo.Abp.Domain.Services; using Win_in.Sfs.Basedata.Boms; -using Win_in.Sfs.Basedata.Caches; + +using Win_in.Sfs.Basedata.Domain.Caches; using Win_in.Sfs.Basedata.Domain.Shared; using Win_in.Sfs.Shared.Domain; using Win_in.Sfs.Shared.Domain.Shared; @@ -22,6 +23,7 @@ public class BomManager : DomainService, IBomManager private readonly IBomRepository _repository; private readonly IItemBasicRepository _itemBasicRepository; + public BomManager(IBomRepository repository, IItemBasicRepository itemBasicRepository) { _repository = repository; @@ -143,6 +145,13 @@ public class BomManager : DomainService, IBomManager return await _repository.GetListAsync(p => p.Product == product).ConfigureAwait(false); } + public virtual async Task> GetListAsync() + { + return await _repository.GetListAsync().ConfigureAwait(false); + } + + + public virtual async Task> GetListWithPhantomItemAsync(string productItemCode, string mfgOp, DateTime validTime, bool onlyFromProductionPlan) { var where = BuildExpression(productItemCode, mfgOp, validTime, onlyFromProductionPlan); diff --git a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Caches/Cache.cs b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Caches/Cache.cs index 4beb6e0d7..9a44f6986 100644 --- a/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Caches/Cache.cs +++ b/be/Modules/BaseData/src/Win_in.Sfs.Basedata.Domain/Caches/Cache.cs @@ -1,59 +1,28 @@ using System; using System.Collections.Generic; +using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Repositories; using Win_in.Sfs.Basedata.Domain; -namespace Win_in.Sfs.Basedata.Caches; +namespace Win_in.Sfs.Basedata.Domain.Caches; public static class Cache { + public static List Boms = new List(); - public static async void BomsLifeCycle(int lifetime) + public static void Clear() { - var reassigner = new Reassigner(DateTime.Now,new TimeSpan(0,5,0)); - await reassigner.RunAsync(() => { - Boms.Clear(); - }).ConfigureAwait(false); + Boms.Clear(); } } -public class Reassigner -{ - private readonly TimeSpan _interval; - private DateTime _lasttime; - public Reassigner(DateTime lasttime, TimeSpan interval) - { - _lasttime = lasttime; - _interval = interval; - } - public async Task RunAsync(Action p_action) - { - while (true) - { - // 获取当前时间 - var currentTime = DateTime.Now; - // 计算上次重新赋值到现在的时间间隔 - var elapsed = currentTime - _lasttime; - // 检查时间间隔是否满足条件 - if (elapsed >= _interval) - { - p_action(); - // 重新赋值 - //_value = await GetValueAsync(); - // 更新最后更新时间 - _lasttime = currentTime; - } - - // 等待下一刻钟 - await Task.Delay(_interval); - } - } - -}