using System.IdentityModel.Tokens.Jwt; using System.Net.Http.Headers; using System.Security.Claims; using System.Text; using Dlhis.ScheduledTask.Common.Request; using Dlhis.ScheduledTask.Common.Response; using Kurisu.AspNetCore.Utils.Extensions; using Microsoft.IdentityModel.Tokens; using Newtonsoft.Json.Linq; namespace Dlhis.ScheduledTask.Common.Services.Implements; public class JinkoJIPService : IJinkoJIPService { private readonly IHttpClientFactory _httpClientFactory; private readonly ILogger _logger; private readonly IConfiguration _configuration; public JinkoJIPService(IHttpClientFactory httpClientFactory, ILogger logger, IConfiguration configuration) { _httpClientFactory = httpClientFactory; _logger = logger; _configuration = configuration; } private HttpClient GetHttpClient() { var httpClient = _httpClientFactory.CreateClient(); httpClient.BaseAddress = new Uri(_configuration.GetSection("JinkoOptions:Jip:BaseUrl").Value); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", IssueToken()); return httpClient; } public async Task UploadAttendancesAsync(List requests) { var requestUrl = "/JIP/HCM/HCM_SWIPE_DATA_SAVE"; var body = new { T_DATA = requests, }; var json = body.ToJson(); //_logger.LogInformation("上传考勤记录请求:{json}", json); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await GetHttpClient().PostAsync(requestUrl, content); var responseJson = await response.Content.ReadAsStringAsync(); _logger.LogInformation("上传考勤记录响应:{json}", responseJson); try { return responseJson.ToObject(); } catch (Exception) { return new UploadAttendanceResponse { OLX = "99", OMS = "接口响应数据异常,无法反序列化" }; } } public async Task SyncMealSupplementRecordsAsync(List requests) { var requestUrl = "/JIP/DHR/DHR_DL_CALLBACK"; var json = requests.ToJson(Kurisu.AspNetCore.Utils.Extensions.JsonExtensions.DefaultSetting); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await GetHttpClient().PostAsync(requestUrl, content); var responseJson = await response.Content.ReadAsStringAsync(); _logger.LogInformation("餐补状态同步响应:{json}", responseJson); var jobj = JObject.Parse(responseJson); if (jobj.TryGetValue("exp", out var exp)) { true.ThrowIfTrue(exp.Value()); } if (jobj.TryGetValue("message", out var message) && !jobj.ContainsKey("code")) { true.ThrowIfTrue(message.Value()); } (jobj.GetValue("code").Value() != 200).ThrowIfTrue(jobj.GetValue("message").Value()); return responseJson; } public async Task GetTravelInfosByDepartmentsAsync(DateTime begin, DateTime end, List departmentNos) { const string apiUrl = "/JIP/HCM/HCM_TRAVELINFO"; var beginDay = begin.ToString("yyyyMMdd"); var endDay = end.ToString("yyyyMMdd"); var d = departmentNos.Select(x => new { IV_ORGID = x }); //IV_GONGH IV_ORGID //IT_2002GH var obj = new { IV_BEGDA = beginDay, IV_ENDDA = endDay, IT_2002OR = d }; var body = obj.ToJson(); var content = new StringContent(body, Encoding.UTF8, "application/json"); var response = await GetHttpClient().PostAsync(apiUrl, content); response.EnsureSuccessStatusCode(); var jsonResponse = await response.Content.ReadAsStringAsync(); return jsonResponse.ToObject(); } public async Task GetTravelInfosByUserCodeAsync(DateTime begin, DateTime end, string userCode) { const string apiUrl = "/JIP/HCM/HCM_TRAVELINFO"; var beginDay = begin.ToString("yyyyMMdd"); var endDay = end.ToString("yyyyMMdd"); //IV_GONGH IV_ORGID //IT_2002GH var obj = new { IV_BEGDA = beginDay, IV_ENDDA = endDay, IT_2002GH = new List { new { IV_GONGH = userCode } } }; var body = obj.ToJson(); var content = new StringContent(body, Encoding.UTF8, "application/json"); var response = await GetHttpClient().PostAsync(apiUrl, content); response.EnsureSuccessStatusCode(); var jsonResponse = await response.Content.ReadAsStringAsync(); return jsonResponse.ToObject(); } public async Task SyncFaceToSapAsync(string userCode, string base64) { const string apiUrl = "/JIP/HCM/HCM_I_PHOTO"; var obj = new { I_WORKCODE = userCode, I_PHOTO_STR = base64 }; var body = obj.ToJson(); var content = new StringContent(body, Encoding.UTF8, "application/json"); var response = await GetHttpClient().PostAsync(apiUrl, content); response.EnsureSuccessStatusCode(); var jsonResponse = await response.Content.ReadAsStringAsync(); return jsonResponse.ToObject(); } public string IssueToken() { var jwtKey = _configuration.GetSection("JinkoOptions:Jip:Key").Value; var jwtSecret = _configuration.GetSection("JinkoOptions:Jip:Secret").Value; const int min = 5; var now = DateTime.Now.AddMinutes(-min); var expires = DateTime.Now.AddMinutes(min); var claims = new List { new(JwtRegisteredClaimNames.Nbf, $"{new DateTimeOffset(now).ToUnixTimeSeconds()}"), new(JwtRegisteredClaimNames.Exp, $"{new DateTimeOffset(expires).ToUnixTimeSeconds()}"), new(JwtRegisteredClaimNames.Iss, jwtKey), }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecret)); var descriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims), Issuer = jwtKey, IssuedAt = now, NotBefore = now, Expires = expires, SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256) }; var jwtHandler = new JwtSecurityTokenHandler(); var securityToken = jwtHandler.CreateToken(descriptor); return jwtHandler.WriteToken(securityToken); } }