using System.Text; using Dlhis.Basic.Common.ApiLog.Services; using Dlhis.Basic.Common.Message.Requests; using Dlhis.Basic.Common.Message.Responses; using Dlhis.Entity.Common.Enums; using Kurisu.AspNetCore.Utils.Extensions; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Dlhis.Basic.Common.Message.Services.Implements; public class JinkoApiService : IJinkoApiService { private readonly IHttpClientFactory _httpClientFactory; private readonly IServiceProvider _serviceProvider; private const string _agentId = "2984453842"; private const string _appKey = "dingppvj6wvtgbagwpsw"; private const string _appSecret = "k9mxYwilZgQiuhV_RVYRueoIAWHCQWrUdhbj6DAmiEiqMzSQE4igt0kAj97rmLaS"; public JinkoApiService(IHttpClientFactory httpClientFactory, IServiceProvider serviceProvider) { _httpClientFactory = httpClientFactory; _serviceProvider = serviceProvider; } private async Task GetTokenAsync() { var token = string.Empty; if (!token.IsEmpty()) { return token; } var httpClient = _httpClientFactory.CreateClient("jinko.httpclient"); var form = new FormUrlEncodedContent(new Dictionary { { "appkey", _appKey }, { "appsecret", _appSecret } }); //eg: appkey=dingumelppews6rah7x9&appsecret=nsWfJTVjYesHVzrLiP-t1TQqMQvC1L_kZNfXfnIyzcXK4pCTfKprkjZcxAbsDR_l var response = await httpClient.GetStringAsync($"/gettoken?{await form.ReadAsStringAsync()}"); var jObj = JObject.Parse(response); (jObj.Value("errcode") == "0").ThrowIfFalse(jObj.Value("errmsg")); token = jObj.Value("access_token"); return token; } public async Task SendWorkMessageAsync(DingTalkWorkMessageRequest request) { request.Content.IsEmpty().ThrowIfTrue("发送内容不能为空"); var token = await GetTokenAsync(); var users = await GetJinkoOaInfoByWorkCodes(request.WorkCodes); var userIds = users.Select(x => x.Id).Join(","); (userIds.Length > 100).ThrowIfTrue("超出消息接受人数,length > 100"); var body = new { agent_id = _agentId, userid_list = userIds, msg = new { msgtype = "text", text = new { content = request.Content } } }.ToJson(); var httpClient = _httpClientFactory.CreateClient("jinko.httpclient"); var url = $"/topapi/message/corpconversation/asyncsend_v2?access_token={token}"; var content = new StringContent(body, Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync(url, content); var jsonResponse = await response.Content.ReadAsStringAsync(); var jObject = JObject.Parse(jsonResponse); (jObject.Value("errcode") == "0").ThrowIfFalse(jObject.Value("errmsg")); using var scope = _serviceProvider.CreateScope(); var ol = scope.ServiceProvider.GetService(); await ol.LogAsync(OperateLogType.WorkGrid, $"dingtalk消息推送:{request.ToJson()}"); } private async Task> GetJinkoOaInfoByWorkCodes(List codes) { var httpClient = _httpClientFactory.CreateClient("jinko.oa"); var body = new { token = "TTMlaplWIEjmJHiVShWybekyyNnJXDHD", type = "workCode", workCode = string.Join(",", codes) }.ToJson(); var content = new StringContent(body, Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync("http://oa.jinkosolar.com/api/commonRequestService/getUserByWorkCode/v2", content); var responseJson = await response.Content.ReadAsStringAsync(); var oaInfo = JsonConvert.DeserializeObject>>>(responseJson); (oaInfo.Code == 200).ThrowIfFalse(oaInfo.Message); return oaInfo.Result.Data; } }