using System.Net.Http.Headers; using System.Text; using Dlhis.ScheduledTask.SyncSapInfo.Dto; using Dlhis.ScheduledTask.SyncSapInfo.Response; using Dlhis.Sys.Api; using Newtonsoft.Json; namespace Dlhis.ScheduledTask.SyncSapInfo.Services.Implements; public class JinkoSapService : IJinkoSapService { private readonly ILogger _logger; private readonly IHttpClientFactory _httpClientFactory; private readonly ITenantApi _tenantApi; public JinkoSapService(IHttpClientFactory httpClientFactory, ILogger logger, ITenantApi tenantApi) { _logger = logger; _httpClientFactory = httpClientFactory; _tenantApi = tenantApi; } 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 tenantResult = await _tenantApi.GetTenantsInternalAsync(); var tenants = tenantResult.Data; List persons = new(); foreach (var item in tenants) { try { var body = new { T_WERKS = new { item = new List { new { WERKS = item.Code } } }, 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); } } catch (Exception ex) { _logger.LogError(ex, "获取人事范围{werk}失败:" + ex.Message, item); } } return new SapPersonResponse() { Person = new SapPerson { Items = persons }, }; } }