From d0e62121bc0a0aeaa7cb557970c14662b5501110 Mon Sep 17 00:00:00 2001 From: liguoyang Date: Fri, 7 Mar 2025 17:14:58 +0800 Subject: [PATCH] =?UTF-8?q?refactor=20=E6=94=B9=E7=94=A8basic=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dlhis.Jinko.Face.sln | 7 -- Src/Dlhis.Basic.Api/Dlhis.Basic.Api.csproj | 4 - .../IDingTalkApi.cs | 6 +- .../Requests/JinkoSendWorkMessageRequest.cs | 2 +- .../Common/Message/IJinkoApiService.cs | 6 ++ .../Common/Message/JinkoApiService.cs | 99 +++++++++++++++++++ .../Common/Message/JinkoOaResponse.cs | 22 +++++ .../Message/JinkoSendWorkMessageRequest.cs | 14 +++ .../Common/Message/MessagesController.cs | 23 +++++ Src/Dlhis.Basic/Common/Packs/MessagePack.cs | 50 ++++++++++ Src/Dlhis.Basic/Dlhis.Basic.csproj | 2 - .../Implements/GainfoUpdateService.cs | 9 +- .../Dlhis.Message.Api.csproj | 13 --- .../Implements/DeviceUploadLogService.cs | 6 +- .../Dlhis.ScheduledTask.csproj | 1 - .../Properties/launchSettings.json | 1 - 16 files changed, 225 insertions(+), 40 deletions(-) rename Src/{Dlhis.Message.Api => Dlhis.Basic.Api}/IDingTalkApi.cs (75%) rename Src/{Dlhis.Message.Api => Dlhis.Basic.Api}/Requests/JinkoSendWorkMessageRequest.cs (86%) create mode 100644 Src/Dlhis.Basic/Common/Message/IJinkoApiService.cs create mode 100644 Src/Dlhis.Basic/Common/Message/JinkoApiService.cs create mode 100644 Src/Dlhis.Basic/Common/Message/JinkoOaResponse.cs create mode 100644 Src/Dlhis.Basic/Common/Message/JinkoSendWorkMessageRequest.cs create mode 100644 Src/Dlhis.Basic/Common/Message/MessagesController.cs create mode 100644 Src/Dlhis.Basic/Common/Packs/MessagePack.cs delete mode 100644 Src/Dlhis.Message.Api/Dlhis.Message.Api.csproj diff --git a/Dlhis.Jinko.Face.sln b/Dlhis.Jinko.Face.sln index 54d1e6b7..0cf2b39a 100644 --- a/Dlhis.Jinko.Face.sln +++ b/Dlhis.Jinko.Face.sln @@ -51,8 +51,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dlhis.Constants", "Src\Dlhi EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dlhis.Canteen.Api", "Src\Dlhis.Canteen.Api\Dlhis.Canteen.Api.csproj", "{7934BE46-9409-4D28-8B35-82A0F900DD01}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dlhis.Message.Api", "Src\Dlhis.Message.Api\Dlhis.Message.Api.csproj", "{78B80FBD-E7B0-4352-B7FD-B6DCE2D48AEE}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -131,10 +129,6 @@ Global {7934BE46-9409-4D28-8B35-82A0F900DD01}.Debug|Any CPU.Build.0 = Debug|Any CPU {7934BE46-9409-4D28-8B35-82A0F900DD01}.Release|Any CPU.ActiveCfg = Release|Any CPU {7934BE46-9409-4D28-8B35-82A0F900DD01}.Release|Any CPU.Build.0 = Release|Any CPU - {78B80FBD-E7B0-4352-B7FD-B6DCE2D48AEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {78B80FBD-E7B0-4352-B7FD-B6DCE2D48AEE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {78B80FBD-E7B0-4352-B7FD-B6DCE2D48AEE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {78B80FBD-E7B0-4352-B7FD-B6DCE2D48AEE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -153,7 +147,6 @@ Global {841B7B43-5394-413F-9D68-A07EBDD6D4CD} = {4EBCE46B-CE3A-4A47-9432-82A1854CA58A} {E673CA04-3567-4E03-9A86-994F50291ACC} = {4EBCE46B-CE3A-4A47-9432-82A1854CA58A} {7934BE46-9409-4D28-8B35-82A0F900DD01} = {3D8A98C1-83C9-4375-AEAB-4F72AFAF365B} - {78B80FBD-E7B0-4352-B7FD-B6DCE2D48AEE} = {65E76F97-E78A-4C95-B788-4091236B1A79} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7439494A-E2FD-4FEA-8ABF-74AE57A4A5A0} diff --git a/Src/Dlhis.Basic.Api/Dlhis.Basic.Api.csproj b/Src/Dlhis.Basic.Api/Dlhis.Basic.Api.csproj index 2ddebbf0..b41f2841 100644 --- a/Src/Dlhis.Basic.Api/Dlhis.Basic.Api.csproj +++ b/Src/Dlhis.Basic.Api/Dlhis.Basic.Api.csproj @@ -10,8 +10,4 @@ - - - - diff --git a/Src/Dlhis.Message.Api/IDingTalkApi.cs b/Src/Dlhis.Basic.Api/IDingTalkApi.cs similarity index 75% rename from Src/Dlhis.Message.Api/IDingTalkApi.cs rename to Src/Dlhis.Basic.Api/IDingTalkApi.cs index 7b7c7f17..23f0da6c 100644 --- a/Src/Dlhis.Message.Api/IDingTalkApi.cs +++ b/Src/Dlhis.Basic.Api/IDingTalkApi.cs @@ -1,11 +1,11 @@ -using Dlhis.Message.Api.Requests; +using Dlhis.Basic.Api.Requests; using Kurisu.RemoteCall.Attributes; -namespace Dlhis.Message.Api; +namespace Dlhis.Basic.Api; [RequestLog] [RequestResultHandler] -[EnableRemoteClient(Name = "message-service", BaseUrl = "${InternalRequest:MessageRequestUrl}")] +[EnableRemoteClient(Name = "message-service", BaseUrl = "${InternalRequest:BasicRequestUrl}")] public interface IDingTalkApi { [Post("/api/messages/dingtalk/workmessage")] diff --git a/Src/Dlhis.Message.Api/Requests/JinkoSendWorkMessageRequest.cs b/Src/Dlhis.Basic.Api/Requests/JinkoSendWorkMessageRequest.cs similarity index 86% rename from Src/Dlhis.Message.Api/Requests/JinkoSendWorkMessageRequest.cs rename to Src/Dlhis.Basic.Api/Requests/JinkoSendWorkMessageRequest.cs index 794621a5..e5d27f8a 100644 --- a/Src/Dlhis.Message.Api/Requests/JinkoSendWorkMessageRequest.cs +++ b/Src/Dlhis.Basic.Api/Requests/JinkoSendWorkMessageRequest.cs @@ -1,4 +1,4 @@ -namespace Dlhis.Message.Api.Requests; +namespace Dlhis.Basic.Api.Requests; public class JinkoSendWorkMessageRequest { diff --git a/Src/Dlhis.Basic/Common/Message/IJinkoApiService.cs b/Src/Dlhis.Basic/Common/Message/IJinkoApiService.cs new file mode 100644 index 00000000..7b1f9485 --- /dev/null +++ b/Src/Dlhis.Basic/Common/Message/IJinkoApiService.cs @@ -0,0 +1,6 @@ +namespace Dlhis.Basic.Common.Message; + +public interface IJinkoApiService : ISingletonDependency +{ + Task SendWorkMessageAsync(JinkoSendWorkMessageRequest request); +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Common/Message/JinkoApiService.cs b/Src/Dlhis.Basic/Common/Message/JinkoApiService.cs new file mode 100644 index 00000000..3780ad21 --- /dev/null +++ b/Src/Dlhis.Basic/Common/Message/JinkoApiService.cs @@ -0,0 +1,99 @@ +using System.Text; +using Kurisu.AspNetCore.Utils.Extensions; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace Dlhis.Basic.Common.Message; + +public class JinkoApiService : IJinkoApiService +{ + private readonly IHttpClientFactory _httpClientFactory; + + public JinkoApiService(IHttpClientFactory httpClientFactory) + { + _httpClientFactory = httpClientFactory; + } + + public async Task GetTokenAsync() + { + var token = string.Empty; + if (string.IsNullOrEmpty(token)) + { + var httpClient = _httpClientFactory.CreateClient("jinko.httpclient"); + + var form = new FormUrlEncodedContent(new Dictionary + { + { "appkey", "dingumelppews6rah7x9" }, + { "appsecret", "nsWfJTVjYesHVzrLiP-t1TQqMQvC1L_kZNfXfnIyzcXK4pCTfKprkjZcxAbsDR_l" } + }); + + //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(JinkoSendWorkMessageRequest request) + { + request.Content.IsEmpty().ThrowIfTrue("发送内容不能为空"); + var token = await GetTokenAsync(); + + var users = await GetJinkoOaInfoByWorkCodes(request.WorkCodes); + var userStringIds = string.Join(",", users.Select(x => x.Id)); + (userStringIds.Length > 100).ThrowIfTrue("超出消息接受人数,length > 100"); + + var body = new + { + agent_id = "2768073678", + userid_list = userStringIds, + 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(); + + //_logger.LogInformation("请求参数:{Request} \r\n 钉钉请求参数:{DingTalkRequest} \r\n 钉钉响应:{DingTalkResponse}", JsonConvert.SerializeObject(request), body, jsonResponse); + + var jObj = JObject.Parse(jsonResponse); + (jObj.Value("errcode") == "0").ThrowIfFalse(jObj.Value("errmsg")); + } + + + 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; + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Common/Message/JinkoOaResponse.cs b/Src/Dlhis.Basic/Common/Message/JinkoOaResponse.cs new file mode 100644 index 00000000..301c100f --- /dev/null +++ b/Src/Dlhis.Basic/Common/Message/JinkoOaResponse.cs @@ -0,0 +1,22 @@ +namespace Dlhis.Basic.Common.Message +{ + public class JinkoOaResponse + { + public int Code { get; set; } + public string Message { get; set; } + public T Result { get; set; } + } + + public class JinkoData + { + public T Data { get; set; } + } + + + public class JinkoOaInfo + { + public int Id { get; set; } + public string Email { get; set; } + public string Lastname { get; set; } + } +} diff --git a/Src/Dlhis.Basic/Common/Message/JinkoSendWorkMessageRequest.cs b/Src/Dlhis.Basic/Common/Message/JinkoSendWorkMessageRequest.cs new file mode 100644 index 00000000..5353e28a --- /dev/null +++ b/Src/Dlhis.Basic/Common/Message/JinkoSendWorkMessageRequest.cs @@ -0,0 +1,14 @@ +namespace Dlhis.Basic.Common.Message; + +public class JinkoSendWorkMessageRequest +{ + /// + /// 发送内容 + /// + public string Content { get; set; } + + /// + /// 工号 + /// + public List WorkCodes { get; set; } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Common/Message/MessagesController.cs b/Src/Dlhis.Basic/Common/Message/MessagesController.cs new file mode 100644 index 00000000..ffb95678 --- /dev/null +++ b/Src/Dlhis.Basic/Common/Message/MessagesController.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Mvc; + +namespace Dlhis.Basic.Common.Message; + + +[Route("api/[controller]")] +[ApiController] +public class MessagesController : ControllerBase +{ + private readonly IJinkoApiService _jinkoApiService; + + public MessagesController(IJinkoApiService jinkoApiService) + { + _jinkoApiService = jinkoApiService; + } + + + [HttpPost("dingtalk/workmessage")] + public async Task SendWorkMessageAsync(JinkoSendWorkMessageRequest request) + { + await _jinkoApiService.SendWorkMessageAsync(request); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Common/Packs/MessagePack.cs b/Src/Dlhis.Basic/Common/Packs/MessagePack.cs new file mode 100644 index 00000000..cadf7074 --- /dev/null +++ b/Src/Dlhis.Basic/Common/Packs/MessagePack.cs @@ -0,0 +1,50 @@ +using Kurisu.AspNetCore.Startup; + +namespace Dlhis.Basic.Common.Packs; + +public class MessagePack : BaseAppPack +{ + public override void ConfigureServices(IServiceCollection services) + { + services.AddHttpClient("jinko.oa", (_, _) => { }) + .ConfigurePrimaryHttpMessageHandler(() => + { + var handler = new HttpClientHandler + { + ClientCertificateOptions = ClientCertificateOption.Manual, + ServerCertificateCustomValidationCallback = (_, _, _, _) => true + }; + + return handler; + }); + + services.AddHttpClient("jinko.httpclient", (sp, httpClient) => + { + // "BaseUrl": "https://oapi.dingtalk.com", + // "AgentId": "2768073678", + // "AppId": "dingumelppews6rah7x9", + // "AppSecret": "nsWfJTVjYesHVzrLiP-t1TQqMQvC1L_kZNfXfnIyzcXK4pCTfKprkjZcxAbsDR_l", + + httpClient.BaseAddress = new Uri("https://oapi.dingtalk.com"); + httpClient.Timeout = TimeSpan.FromSeconds(30); + }) + // .SetHandlerLifetime(TimeSpan.FromMinutes(5)) + // .addd((res) => + // { + // return HttpPolicyExtensions + // .HandleTransientHttpError() + // .OrResult(msg => msg.StatusCode != HttpStatusCode.OK) + // .WaitAndRetryAsync(6, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); + // }) + .ConfigurePrimaryHttpMessageHandler(() => + { + var handler = new HttpClientHandler + { + ClientCertificateOptions = ClientCertificateOption.Manual, + ServerCertificateCustomValidationCallback = (_, _, _, _) => true + }; + + return handler; + }); + } +} \ No newline at end of file diff --git a/Src/Dlhis.Basic/Dlhis.Basic.csproj b/Src/Dlhis.Basic/Dlhis.Basic.csproj index 2878e80d..111e5c03 100644 --- a/Src/Dlhis.Basic/Dlhis.Basic.csproj +++ b/Src/Dlhis.Basic/Dlhis.Basic.csproj @@ -31,12 +31,10 @@ - - diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs index d42a9cf8..7a129f97 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoUpdateService.cs @@ -1,12 +1,11 @@ -using Dlhis.Basic.Organization.Comparers; +using Dlhis.Basic.Common.Message; +using Dlhis.Basic.Organization.Comparers; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Basic.Enums; using Dlhis.Entity.Device.Enums; using Dlhis.Entity.Sys.Entities; using Dlhis.Entity.Sys.Enums; using Dlhis.Jip.Api.Dto; -using Dlhis.Message.Api; -using Dlhis.Message.Api.Requests; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils.Extensions; @@ -18,14 +17,14 @@ public class GainfoUpdateService : IGainfoUpdateService private readonly ILogger _logger; private readonly IJinkoSapService _jinkoSapService; private readonly IGainfoPermissionService _gainfoPermissionService; - private readonly IDingTalkApi _dingTalkApi; + private readonly IJinkoApiService _dingTalkApi; private readonly IIdentityUserSyncService _identityUserSyncService; public GainfoUpdateService(IDbContext dbContext, ILogger logger, IJinkoSapService jinkoSapService, IGainfoPermissionService gainfoPermissionService, - IDingTalkApi dingTalkApi, + IJinkoApiService dingTalkApi, IIdentityUserSyncService identityUserSyncService) { _dbContext = dbContext; diff --git a/Src/Dlhis.Message.Api/Dlhis.Message.Api.csproj b/Src/Dlhis.Message.Api/Dlhis.Message.Api.csproj deleted file mode 100644 index 4100a696..00000000 --- a/Src/Dlhis.Message.Api/Dlhis.Message.Api.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net6.0 - enable - enable - - - - - - - diff --git a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs index 39c9c5ef..7701d6a1 100644 --- a/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs +++ b/Src/Dlhis.ScheduledTask/DeviceUploadLog/Services/Implements/DeviceUploadLogService.cs @@ -1,12 +1,12 @@ -using Dlhis.Constants; +using Dlhis.Basic.Api; +using Dlhis.Basic.Api.Requests; +using Dlhis.Constants; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Basic.Enums; using Dlhis.Entity.Device.Entities; using Dlhis.Entity.Device.Enums; using Dlhis.Jip.Api; using Dlhis.Jip.Api.Requests; -using Dlhis.Message.Api; -using Dlhis.Message.Api.Requests; using Dlhis.ScheduledTask.DeviceUploadLog.Request; using Dlhis.ScheduledTask.DeviceUploadLog.Response; using Kurisu.AspNetCore.Authentication.Abstractions; diff --git a/Src/Dlhis.ScheduledTask/Dlhis.ScheduledTask.csproj b/Src/Dlhis.ScheduledTask/Dlhis.ScheduledTask.csproj index c49399a6..43855326 100644 --- a/Src/Dlhis.ScheduledTask/Dlhis.ScheduledTask.csproj +++ b/Src/Dlhis.ScheduledTask/Dlhis.ScheduledTask.csproj @@ -32,7 +32,6 @@ - diff --git a/Src/Dlhis.ScheduledTask/Properties/launchSettings.json b/Src/Dlhis.ScheduledTask/Properties/launchSettings.json index 685ccdf7..519808b2 100644 --- a/Src/Dlhis.ScheduledTask/Properties/launchSettings.json +++ b/Src/Dlhis.ScheduledTask/Properties/launchSettings.json @@ -2,7 +2,6 @@ "profiles": { "Dlhis.ScheduledTask": { "commandName": "Project", - "launchBrowser": false, "launchUrl": "swagger/index.html", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development"