using System.Net.Http.Headers; using System.Reflection; using System.Text; using Dlhis.Middle.Entities; using Dlhis.Middle.Response; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.UnifyResultAndValidation; using Kurisu.AspNetCore.Utils.Extensions; using Microsoft.AspNetCore.WebUtilities; using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json; using SqlSugar; namespace Dlhis.Middle.Services.Implements; public class DataDownloadService : IDataDownloadService { private readonly IHttpClientFactory _httpClientFactory; private readonly IMemoryCache _memoryCache; private readonly IDbContext _dbContext; private readonly string _hostName; public DataDownloadService(IHttpClientFactory httpClientFactory, IMemoryCache memoryCache, IConfiguration configuration, IDbContext dbContext) { _httpClientFactory = httpClientFactory; _memoryCache = memoryCache; _dbContext = dbContext; _hostName = configuration.GetSection("HostName").Value; } public async Task InitAsync(string factory) { var factories = factory.Split(','); await TruncateAsync(); foreach (var item in factories) { if (!await _dbContext.Queryable().AnyAsync()) { await DownloadAsync(item); } await DownloadAsync(item); await DownloadAsync(item); await DownloadAsync(item); await DownloadAsync(item); await DownloadAsync(item); await DownloadAsync(item); if (!await _dbContext.Queryable().Where(x => x.Factory == item).AnyAsync()) { await DownloadAsync(item); } if (!await _dbContext.Queryable().AnyAsync()) { foreach (var currentItem in factories) { await DownloadAsync(currentItem); } } } } public async Task DownloadAsync(string factory) where T : class, new() { var token = await AuthAsync(); var httpClient = _httpClientFactory.CreateClient("face"); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); var url = $"https://{_hostName}/api/common/SysData/download"; var requestUrl = QueryHelpers.AddQueryString(url, new Dictionary { ["factory"] = factory, ["tableName"] = typeof(T).GetCustomAttribute()!.TableName }); var response = await httpClient.GetStringAsync(requestUrl); var pack = response.ToObject>>(); await _dbContext.InsertAsync(pack.Data); } /// public async Task TruncateAsync() { await _dbContext.Client.Deleteable().ExecuteCommandAsync(); await _dbContext.Client.Deleteable().ExecuteCommandAsync(); await _dbContext.Client.Deleteable().ExecuteCommandAsync(); await _dbContext.Client.Deleteable().ExecuteCommandAsync(); await _dbContext.Client.Deleteable().ExecuteCommandAsync(); await _dbContext.Client.Deleteable().ExecuteCommandAsync(); await _dbContext.Client.Deleteable().ExecuteCommandAsync(); //await _dbContext.Client.Deleteable().ExecuteCommandAsync(); //await _dbContext.Client.Deleteable().ExecuteCommandAsync(); } /// public async Task DownloadGainfosAsync(string factory) { await _dbContext.Client.Ado.BeginTranAsync(); try { await _dbContext.Client.Deleteable().ExecuteCommandAsync(); await _dbContext.Client.Deleteable().ExecuteCommandAsync(); await DownloadAsync(factory); await DownloadAsync(factory); await DownloadAsync(factory); await DownloadAsync(factory); await DownloadAsync(factory); await DownloadAsync(factory); await DownloadAsync(factory); await DownloadAsync(factory); await _dbContext.Client.Ado.CommitTranAsync(); } catch (Exception) { await _dbContext.Client.Ado.RollbackTranAsync(); } } private async Task AuthAsync() { var httpClient = _httpClientFactory.CreateClient("face"); if (_memoryCache.TryGetValue("token", out string token)) return token; var tokenResponse = await httpClient.PostAsync($"https://{_hostName}/api/User/OAuth2/clientgrant", new StringContent(JsonConvert.SerializeObject(new { ClientId = "e509c2aaa98e300c", ClientSecret = "6184d8979fc48105" }), Encoding.UTF8, "application/json")); var tokenJson = await tokenResponse.Content.ReadAsStringAsync(); var tokenInfo = JsonConvert.DeserializeObject>(tokenJson); token = tokenInfo.Data.AccessToken; _memoryCache.Set("token", token, TimeSpan.FromSeconds(tokenInfo.Data.Expires)); return token; } }