using System.Net.Http.Headers; using System.Text; using Dlhis.Entity.Basic.Entity; using Dlhis.ScheduledTask.SyncSapInfo.Dto; using Dlhis.ScheduledTask.SyncSapInfo.Response; using Kurisu.SqlSugar.Services; using Newtonsoft.Json; namespace Dlhis.ScheduledTask.SyncSapInfo.Services.Implements; public class JinkoSapService : IJinkoSapService { private readonly ILogger _logger; private readonly IDbContext _dbContext; private readonly IHttpClientFactory _httpClientFactory; public JinkoSapService(IHttpClientFactory httpClientFactory, ILogger logger, IDbContext dbContext) { _logger = logger; _dbContext = dbContext; _httpClientFactory = httpClientFactory; } private HttpClient GetHttpClient() { var httpClient = _httpClientFactory.CreateClient("jinko:sap"); httpClient.BaseAddress = new Uri("http://sappipap01.jinkosolar.cn:50100"); httpClient.Timeout = TimeSpan.FromMinutes(10); var credentials = string.Format("{0}:{1}", "EHS_USER", "y3R1hd2h*RICAC"); var headerValue = Convert.ToBase64String(Encoding.UTF8.GetBytes(credentials)); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", headerValue); return httpClient; } public async Task GetSapOrganizationsAsync() { string apiUrl = "/RESTAdapter/Rest/EHR_ORGANIZATION/"; var response = await GetHttpClient().PostAsync(apiUrl, new StringContent("{}", Encoding.UTF8, "application/json")); response.EnsureSuccessStatusCode(); string responseJson = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject(responseJson); return result; } public async Task GetPositionsAsync() { string apiUrl = "/RESTAdapter/Rest/EHR_POSITION/"; var response = await GetHttpClient().PostAsync(apiUrl, new StringContent("{}", Encoding.UTF8, "application/json")); response.EnsureSuccessStatusCode(); string responseJson = await response.Content.ReadAsStringAsync(); var result = JsonConvert.DeserializeObject(responseJson); return result; } public async Task GetPersonsAsync() { var apiUrl = "/RESTAdapter/Rest/EHR_PERSONNEL/"; var werks = await _dbContext.Queryable().Where(x => x.Enable).ToListAsync(); List persons = new(); List jobInfos = new(); List departmentInfos = new(); foreach (var item in werks) { try { var body = new { T_WERKS = new { item = new List { new { WERKS = item.Werk } } }, T_PERSON = Array.Empty(), T_PNO = Array.Empty(), }; var content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); var response = await GetHttpClient().PostAsync(apiUrl, content); response.EnsureSuccessStatusCode(); var jsonResponse = await response.Content.ReadAsStringAsync(); var personResp = JsonConvert.DeserializeObject(jsonResponse); if (personResp?.Person?.Items?.Any() == true) { persons.AddRange(personResp.Person.Items); } if (personResp?.JobStatusInfo?.Items?.Any() == true) { jobInfos.AddRange(personResp.JobStatusInfo.Items); } if (personResp?.DepartmentInfo?.Items?.Any() == true) { departmentInfos.AddRange(personResp.DepartmentInfo.Items); } } catch (Exception ex) { _logger.LogError(ex, "获取人事范围{werk}失败:{message}", ex.Message, item.Werk); } } return new SapPersonResponse() { Person = new SapPerson { Items = persons }, JobStatusInfo = new SapPerson { Items = jobInfos, }, DepartmentInfo = new SapPerson { Items = departmentInfos } }; } }