using System.Net.Http.Headers; using System.Text; using Dlhis.Entity.Basic.Entity; using Dlhis.ScheduledTask.Common.Dto; using Dlhis.ScheduledTask.Common.Response; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils.Extensions; using Newtonsoft.Json; namespace Dlhis.ScheduledTask.Common.Services.Implements; public class JinkoSapService : IJinkoSapService { private readonly IDbContext _dbContext; private readonly IHttpClientFactory _httpClientFactory; public JinkoSapService(IHttpClientFactory httpClientFactory, IDbContext dbContext) { _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); const string credentials = $"{"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() { const 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() { const 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 GetPersonsByWerkAsync(string werk) { const string apiUrl = "/RESTAdapter/Rest/EHR_PERSONNEL/"; var werkInfo = await _dbContext.Queryable() .Where(x => x.Enable) .Where(x => x.Werk == werk) .SingleAsync(); var body = new { I_ALLINFO = "X", T_WERKS = new { item = new List { new { WERKS = werkInfo.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); List persons = new(); List jobInfos = new(); List departmentInfos = new(); 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); } return new SapPersonResponse() { Person = new SapPerson { Items = persons }, JobStatusInfo = new SapPerson { Items = jobInfos, }, DepartmentInfo = new SapPerson { Items = departmentInfos } }; } public async Task GetPersonsByCodeAsync(string code) { const string apiUrl = "/RESTAdapter/Rest/EHR_PERSONNEL/"; var body = new { I_ALLINFO = "X", T_WERKS = Array.Empty(), T_PERSON = Array.Empty(), T_PNO = new { item = new List { new { ZWORKCODE = code } } }, }; 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); List persons = new(); List jobInfos = new(); List departmentInfos = new(); 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); } return new SapPersonResponse() { Person = new SapPerson { Items = persons }, JobStatusInfo = new SapPerson { Items = jobInfos, }, DepartmentInfo = new SapPerson { Items = departmentInfos } }; } public async Task GetTravelInfosAsync(DateTime begin, DateTime end) { const string apiUrl = "/JIP/HCM/HCM_TRAVELINFO"; var beginDay = begin.ToString("yyyyMMdd"); var endDay = end.ToString("yyyyMMdd"); var obj = new { IV_BEGDA = beginDay, IV_ENDDA = endDay }; var body = obj.ToJson(); 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(); return JsonConvert.DeserializeObject(jsonResponse); } }