Browse Source

feat: 提交累计更新

pull/909/head
colin 2 years ago
parent
commit
55764d064d
  1. 8
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchAuditLogManager.cs
  2. 8
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchEntityChangeStore.cs
  3. 8
      aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchSecurityLogManager.cs
  4. 2
      aspnet-core/framework/authentication/LINGYUN.Abp.Authentication.WeChat/Microsoft/AspNetCore/Authentication/WeChat/Official/WeChatOfficialOAuthOptions.cs
  5. 10
      aspnet-core/framework/logging/LINGYUN.Abp.Logging.Serilog.Elasticsearch/LINGYUN/Abp/AuditLogging/Serilog/Elasticsearch/SerilogElasticsearchLoggingManager.cs
  6. 4
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Common/FodyWeavers.xml
  7. 3
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/FodyWeavers.xml
  8. 30
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/FodyWeavers.xsd
  9. 39
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/AbpWeChatWorkCommonModule.cs
  10. 179
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Handlers/WeChatWorkEventEventHandler.cs
  11. 53
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Handlers/WeChatWorkMessageEventHandler.cs
  12. 195
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ApprovalStatusChangeEvent.cs
  13. 15
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CloseInActiveAgentEvent.cs
  14. 6
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CustomMenuPushEvent.cs
  15. 61
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/GeoLocationSelectPushEevent.cs
  16. 38
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/MemberExtendAttribute.cs
  17. 4
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/MenuClickJumpLinkPushEvent.cs
  18. 15
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ReOpenInActiveAgentEevent.cs
  19. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ScanCodePushEvent.cs
  20. 6
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ScanCodeWaitMsgPushEvent.cs
  21. 20
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ShareAgentChangeEvent.cs
  22. 20
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ShareChainChangeEvent.cs
  23. 41
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/TemplateCardMenuPushEvent.cs
  24. 80
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/TemplateCardPushEvent.cs
  25. 5
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UserChangeEvent.cs
  26. 7
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/WeChatWorkEventMessage.cs
  27. 29
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/WeChatWorkEventResolveContributor.cs
  28. 25
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/WeChatWorkMessageResolveContributor.cs
  29. 19
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/WeChatWorkMessageResolveContributorBase.cs
  30. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN.Abp.WeChat.Work.csproj
  31. 4
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/AbpWeChatWorkModule.cs
  32. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/IWeChatWorkMessageSender.cs
  33. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/MarkdownMessage.cs
  34. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/MediaMessage.cs
  35. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/MiniProgramMessage.cs
  36. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/MpNewMessage.cs
  37. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/NewMessage.cs
  38. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/TextCardMessage.cs
  39. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/TextMessage.cs
  40. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/VideoMessage.cs
  41. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatFileMessage.cs
  42. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatImageMessage.cs
  43. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatMarkdownMessage.cs
  44. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatMpNewMessage.cs
  45. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatNewMessage.cs
  46. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatTextCardMessage.cs
  47. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatTextMessage.cs
  48. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatVideoMessage.cs
  49. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatVoiceMessage.cs
  50. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkFileMessage.cs
  51. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkImageMessage.cs
  52. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkMarkdownMessage.cs
  53. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkMiniProgramMessage.cs
  54. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkMpNewMessage.cs
  55. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkNewMessage.cs
  56. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkTextCardMessage.cs
  57. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkTextMessage.cs
  58. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkVideoMessage.cs
  59. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkVoiceMessage.cs
  60. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Request/WeChatWorkMessageReCallRequest.cs
  61. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Request/WeChatWorkMessageRequest.cs
  62. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Response/WeChatWorkMessageResponse.cs
  63. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCard.cs
  64. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardAction.cs
  65. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardActionMenu.cs
  66. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardCardAction.cs
  67. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardEmphasisContent.cs
  68. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardHorizontalContent.cs
  69. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardJump.cs
  70. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardMainTitle.cs
  71. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardQuoteArea.cs
  72. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardSource.cs
  73. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TextTemplateCard.cs
  74. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/WeChatWorkTemplateCardMessage.cs
  75. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/WeChatWorkMessageManager.cs
  76. 4
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/WeChatWorkMessageSender.cs
  77. 2
      aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Message.cs
  78. 3
      aspnet-core/modules/openIddict/LINGYUN.Abp.OpenIddict.WeChat/LINGYUN/Abp/OpenIddict/WeChat/WeChatTokenExtensionGrant.cs
  79. 2
      aspnet-core/modules/openIddict/LINGYUN.Abp.OpenIddict.WeChat/Microsoft/Extensions/DependencyInjection/WeChatOpenIddictServerBuilderExtensions.cs
  80. 10
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.WeChat.MiniProgram/LINGYUN/Abp/Notifications/WeChat/MiniProgram/WeChatMiniProgramNotificationPublishProvider.cs
  81. 4
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.WeChat.Work/LINGYUN/Abp/Notifications/WeChat/Work/WeChatWorkNotificationPublishProvider.cs

8
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchAuditLogManager.cs

@ -11,6 +11,7 @@ using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Auditing;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Timing;
namespace LINGYUN.Abp.AuditLogging.Elasticsearch
{
@ -22,16 +23,19 @@ namespace LINGYUN.Abp.AuditLogging.Elasticsearch
private readonly IIndexNameNormalizer _indexNameNormalizer;
private readonly IElasticsearchClientFactory _clientFactory;
private readonly IAuditLogInfoToAuditLogConverter _converter;
private readonly IClock _clock;
public ILogger<ElasticsearchAuditLogManager> Logger { protected get; set; }
public ElasticsearchAuditLogManager(
IClock clock,
IIndexNameNormalizer indexNameNormalizer,
IOptions<AbpElasticsearchOptions> elasticsearchOptions,
IElasticsearchClientFactory clientFactory,
IOptions<AbpAuditingOptions> auditingOptions,
IAuditLogInfoToAuditLogConverter converter)
{
_clock = clock;
_converter = converter;
_clientFactory = clientFactory;
_auditingOptions = auditingOptions.Value;
@ -249,11 +253,11 @@ namespace LINGYUN.Abp.AuditLogging.Elasticsearch
if (startTime.HasValue)
{
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(AuditLog.ExecutionTime))).GreaterThanOrEquals(startTime)));
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(AuditLog.ExecutionTime))).GreaterThanOrEquals(_clock.Normalize(startTime.Value))));
}
if (endTime.HasValue)
{
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(AuditLog.ExecutionTime))).LessThanOrEquals(endTime)));
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(AuditLog.ExecutionTime))).LessThanOrEquals(_clock.Normalize(endTime.Value))));
}
if (!httpMethod.IsNullOrWhiteSpace())
{

8
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchEntityChangeStore.cs

@ -10,6 +10,7 @@ using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Auditing;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Timing;
namespace LINGYUN.Abp.AuditLogging.Elasticsearch;
@ -19,14 +20,17 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
private readonly AbpElasticsearchOptions _elasticsearchOptions;
private readonly IIndexNameNormalizer _indexNameNormalizer;
private readonly IElasticsearchClientFactory _clientFactory;
private readonly IClock _clock;
public ILogger<ElasticsearchEntityChangeStore> Logger { protected get; set; }
public ElasticsearchEntityChangeStore(
IClock clock,
IIndexNameNormalizer indexNameNormalizer,
IElasticsearchClientFactory clientFactory,
IOptions<AbpElasticsearchOptions> elasticsearchOptions)
{
_clock = clock;
_clientFactory = clientFactory;
_indexNameNormalizer = indexNameNormalizer;
_elasticsearchOptions = elasticsearchOptions.Value;
@ -323,11 +327,11 @@ public class ElasticsearchEntityChangeStore : IEntityChangeStore, ITransientDepe
}
if (startTime.HasValue)
{
querys.Add(entity => entity.DateRange(q => q.Field(GetField(nameof(EntityChange.ChangeTime))).GreaterThanOrEquals(startTime)));
querys.Add(entity => entity.DateRange(q => q.Field(GetField(nameof(EntityChange.ChangeTime))).GreaterThanOrEquals(_clock.Normalize(startTime.Value))));
}
if (endTime.HasValue)
{
querys.Add(entity => entity.DateRange(q => q.Field(GetField(nameof(EntityChange.ChangeTime))).LessThanOrEquals(endTime)));
querys.Add(entity => entity.DateRange(q => q.Field(GetField(nameof(EntityChange.ChangeTime))).LessThanOrEquals(_clock.Normalize(endTime.Value))));
}
if (changeType.HasValue)
{

8
aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.Elasticsearch/LINGYUN/Abp/AuditLogging/Elasticsearch/ElasticsearchSecurityLogManager.cs

@ -11,6 +11,7 @@ using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
using Volo.Abp.SecurityLog;
using Volo.Abp.Timing;
namespace LINGYUN.Abp.AuditLogging.Elasticsearch
{
@ -22,16 +23,19 @@ namespace LINGYUN.Abp.AuditLogging.Elasticsearch
private readonly IIndexNameNormalizer _indexNameNormalizer;
private readonly IGuidGenerator _guidGenerator;
private readonly IElasticsearchClientFactory _clientFactory;
private readonly IClock _clock;
public ILogger<ElasticsearchSecurityLogManager> Logger { protected get; set; }
public ElasticsearchSecurityLogManager(
IClock clock,
IGuidGenerator guidGenerator,
IIndexNameNormalizer indexNameNormalizer,
IOptions<AbpSecurityLogOptions> securityLogOptions,
IOptions<AbpElasticsearchOptions> elasticsearchOptions,
IElasticsearchClientFactory clientFactory)
{
_clock = clock;
_guidGenerator = guidGenerator;
_clientFactory = clientFactory;
_indexNameNormalizer = indexNameNormalizer;
@ -192,11 +196,11 @@ namespace LINGYUN.Abp.AuditLogging.Elasticsearch
if (startTime.HasValue)
{
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(SecurityLog.CreationTime))).GreaterThanOrEquals(startTime)));
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(SecurityLog.CreationTime))).GreaterThanOrEquals(_clock.Normalize(startTime.Value))));
}
if (endTime.HasValue)
{
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(SecurityLog.CreationTime))).LessThanOrEquals(endTime)));
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(SecurityLog.CreationTime))).LessThanOrEquals(_clock.Normalize(endTime.Value))));
}
if (!applicationName.IsNullOrWhiteSpace())
{

2
aspnet-core/framework/authentication/LINGYUN.Abp.Authentication.WeChat/Microsoft/AspNetCore/Authentication/WeChat/Official/WeChatOfficialOAuthOptions.cs

@ -1,5 +1,5 @@
using LINGYUN.Abp.Authentication.WeChat;
using LINGYUN.Abp.WeChat.Security.Claims;
using LINGYUN.Abp.WeChat.Common.Security.Claims;
using Microsoft.AspNetCore.Authentication.OAuth;
using Microsoft.AspNetCore.Http;
using System.Security.Claims;

10
aspnet-core/framework/logging/LINGYUN.Abp.Logging.Serilog.Elasticsearch/LINGYUN/Abp/AuditLogging/Serilog/Elasticsearch/SerilogElasticsearchLoggingManager.cs

@ -14,14 +14,16 @@ using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.ObjectMapping;
using Volo.Abp.Timing;
namespace LINGYUN.Abp.Logging.Serilog.Elasticsearch
{
[Dependency(ReplaceServices = true)]
public class SerilogElasticsearchLoggingManager : ILoggingManager, ISingletonDependency
{
private static readonly Regex IndexFormatRegex = new Regex(@"^(.*)(?:\{0\:.+\})(.*)$");
private readonly static Regex IndexFormatRegex = new Regex(@"^(.*)(?:\{0\:.+\})(.*)$");
private readonly IClock _clock;
private readonly IObjectMapper _objectMapper;
private readonly ICurrentTenant _currentTenant;
private readonly AbpLoggingSerilogElasticsearchOptions _options;
@ -30,11 +32,13 @@ namespace LINGYUN.Abp.Logging.Serilog.Elasticsearch
public ILogger<SerilogElasticsearchLoggingManager> Logger { protected get; set; }
public SerilogElasticsearchLoggingManager(
IClock clock,
IObjectMapper objectMapper,
ICurrentTenant currentTenant,
IOptions<AbpLoggingSerilogElasticsearchOptions> options,
IElasticsearchClientFactory clientFactory)
{
_clock = clock;
_objectMapper = objectMapper;
_currentTenant = currentTenant;
_clientFactory = clientFactory;
@ -281,11 +285,11 @@ namespace LINGYUN.Abp.Logging.Serilog.Elasticsearch
}
if (startTime.HasValue)
{
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(SerilogInfo.TimeStamp))).GreaterThanOrEquals(startTime)));
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(SerilogInfo.TimeStamp))).GreaterThanOrEquals(_clock.Normalize(startTime.Value))));
}
if (endTime.HasValue)
{
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(SerilogInfo.TimeStamp))).LessThanOrEquals(endTime)));
querys.Add((log) => log.DateRange((q) => q.Field(GetField(nameof(SerilogInfo.TimeStamp))).LessThanOrEquals(_clock.Normalize(endTime.Value))));
}
if (level.HasValue)
{

4
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Common/FodyWeavers.xml

@ -1,3 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait />
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait ContinueOnCapturedContext="false" />
</Weavers>

3
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/FodyWeavers.xml

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait ContinueOnCapturedContext="false" />
</Weavers>

30
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/FodyWeavers.xsd

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- This file was generated by Fody. Manual changes to this file will be lost when your project is rebuilt. -->
<xs:element name="Weavers">
<xs:complexType>
<xs:all>
<xs:element name="ConfigureAwait" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:attribute name="ContinueOnCapturedContext" type="xs:boolean" />
</xs:complexType>
</xs:element>
</xs:all>
<xs:attribute name="VerifyAssembly" type="xs:boolean">
<xs:annotation>
<xs:documentation>'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="VerifyIgnoreCodes" type="xs:string">
<xs:annotation>
<xs:documentation>A comma-separated list of error codes that can be safely ignored in assembly verification.</xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute name="GenerateXsd" type="xs:boolean">
<xs:annotation>
<xs:documentation>'false' to turn off automatic generation of the XML Schema file.</xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>

39
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/AbpWeChatWorkCommonModule.cs

@ -2,8 +2,7 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using LINGYUN.Abp.WeChat.Work.Common.Messages;
using LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.WeChat.Work.Common;
@ -16,10 +15,10 @@ public class AbpWeChatWorkCommonModule : AbpModule
{
Configure<AbpWeChatWorkMessageResolveOptions>(options =>
{
options.MapEvent("click", context => context.GetWeChatMessage<CustomMenuEvent>());
options.MapEvent("view", context => context.GetWeChatMessage<MenuClickJumpLinkEvent>());
options.MapEvent("click", context => context.GetWeChatMessage<CustomMenuPushEvent>());
options.MapEvent("view", context => context.GetWeChatMessage<MenuClickJumpLinkPushEvent>());
options.MapEvent("scancode_push", context => context.GetWeChatMessage<ScanCodePushEvent>());
options.MapEvent("scancode_waitmsg", context => context.GetWeChatMessage<ScanCodeWaitMsgEvent>());
options.MapEvent("scancode_waitmsg", context => context.GetWeChatMessage<ScanCodeWaitMsgPushEvent>());
options.MapEvent("pic_sysphoto", context => context.GetWeChatMessage<PictureSystemPushEvent>());
options.MapEvent("pic_photo_or_album", context => context.GetWeChatMessage<PictureAlbumPushEvent>());
options.MapEvent("pic_weixin", context => context.GetWeChatMessage<PictureWeixinPushEvent>());
@ -27,20 +26,28 @@ public class AbpWeChatWorkCommonModule : AbpModule
options.MapEvent("unsubscribe", context => context.GetWeChatMessage<UserUnSubscribeEvent>());
options.MapEvent("enter_agent", context => context.GetWeChatMessage<EnterAgentEvent>());
options.MapEvent("LOCATION", context => context.GetWeChatMessage<ReportingGeoLocationEvent>());
options.MapEvent("location_select", context => context.GetWeChatMessage<GeoLocationSelectPushEevent>());
options.MapEvent("batch_job_result", context => context.GetWeChatMessage<BatchJobResultEvent>());
options.MapEvent("open_approval_change", context => context.GetWeChatMessage<ApprovalStatusChangeEvent>());
options.MapEvent("share_agent_change", context => context.GetWeChatMessage<ShareAgentChangeEvent>());
options.MapEvent("share_chain_change", context => context.GetWeChatMessage<ShareChainChangeEvent>());
options.MapEvent("template_card_event", context => context.GetWeChatMessage<TemplateCardPushEvent>());
options.MapEvent("template_card_menu_event", context => context.GetWeChatMessage<TemplateCardMenuPushEvent>());
options.MapEvent("close_inactive_agent", context => context.GetWeChatMessage<CloseInActiveAgentEvent>());
options.MapEvent("reopen_inactive_agent", context => context.GetWeChatMessage<ReOpenInActiveAgentEevent>());
options.MapEvent("change_contact", context =>
{
static UserChangeEvent CreateUserChangeEvent<TEvent>(string originXml) where TEvent : UserChangeEvent
{
var events = new XmlDeserializationEvents();
return originXml.DeserializeWeChatMessage<TEvent>(events);
}
//static UserChangeEvent CreateUserChangeEvent<TEvent>(string originXml) where TEvent : UserChangeEvent
//{
// var events = new XmlDeserializationEvents();
// return originXml.DeserializeWeChatMessage<TEvent>(events);
//}
var changeType = context.GetMessageData("ChangeType");
return changeType switch
{
"create_user" => CreateUserChangeEvent<CreateUserEvent>(context.Origin),
"update_user" => CreateUserChangeEvent<UpdateUserEvent>(context.Origin),
"create_user" => context.GetWeChatMessage<CreateUserEvent>(),
"update_user" => context.GetWeChatMessage<UpdateUserEvent>(),
"delete_user" => context.GetWeChatMessage<DeleteUserEvent>(),
"create_party" => context.GetWeChatMessage<CreateDepartmentEvent>(),
"update_party" => context.GetWeChatMessage<UpdateDepartmentEvent>(),
@ -58,5 +65,13 @@ public class AbpWeChatWorkCommonModule : AbpModule
options.MapMessage("location", context => context.GetWeChatMessage<GeoLocationMessage>());
options.MapMessage("link", context => context.GetWeChatMessage<LinkMessage>());
});
Configure<AbpWeChatMessageResolveOptions>(options =>
{
// 事件处理器
options.MessageResolvers.AddIfNotContains(new WeChatWorkEventResolveContributor());
// 消息处理器
options.MessageResolvers.AddIfNotContains(new WeChatWorkMessageResolveContributor());
});
}
}

179
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Handlers/WeChatWorkEventEventHandler.cs

@ -0,0 +1,179 @@
using LINGYUN.Abp.WeChat.Common.Messages.Handlers;
using LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Handlers;
public class WeChatWorkEventEventHandler :
IDistributedEventHandler<WeChatWorkEventMessageEto<CustomMenuPushEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<MenuClickJumpLinkPushEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<ScanCodePushEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<ScanCodeWaitMsgPushEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<PictureSystemPushEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<PictureAlbumPushEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<PictureWeixinPushEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<UserSubscribeEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<UserUnSubscribeEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<EnterAgentEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<ReportingGeoLocationEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<GeoLocationSelectPushEevent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<BatchJobResultEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<ApprovalStatusChangeEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<ShareAgentChangeEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<ShareChainChangeEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<TemplateCardPushEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<TemplateCardMenuPushEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<CloseInActiveAgentEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<ReOpenInActiveAgentEevent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<CreateUserEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<UpdateUserEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<DeleteUserEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<CreateDepartmentEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<UpdateDepartmentEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<DeleteDepartmentEvent>>,
IDistributedEventHandler<WeChatWorkEventMessageEto<UserTagChangeEvent>>,
ITransientDependency
{
private readonly IMessageHandler _messageHandler;
public WeChatWorkEventEventHandler(IMessageHandler messageHandler)
{
_messageHandler = messageHandler;
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<UserSubscribeEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<UserUnSubscribeEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<ReportingGeoLocationEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<CustomMenuPushEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<MenuClickJumpLinkPushEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<ScanCodePushEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<ScanCodeWaitMsgPushEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<PictureSystemPushEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<PictureAlbumPushEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<PictureWeixinPushEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<EnterAgentEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<GeoLocationSelectPushEevent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<BatchJobResultEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<ApprovalStatusChangeEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<ShareAgentChangeEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<ShareChainChangeEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<TemplateCardPushEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<TemplateCardMenuPushEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<CloseInActiveAgentEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<ReOpenInActiveAgentEevent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<CreateUserEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<UpdateUserEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<DeleteUserEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<CreateDepartmentEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<UpdateDepartmentEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<DeleteDepartmentEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
public async virtual Task HandleEventAsync(WeChatWorkEventMessageEto<UserTagChangeEvent> eventData)
{
await _messageHandler.HandleEventAsync(eventData.Event);
}
}

53
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Handlers/WeChatWorkMessageEventHandler.cs

@ -0,0 +1,53 @@
using LINGYUN.Abp.WeChat.Common.Messages.Handlers;
using LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.EventBus.Distributed;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Handlers;
public class WeChatWorkMessageEventHandler :
IDistributedEventHandler<WeChatWorkGeneralMessageEto<TextMessage>>,
IDistributedEventHandler<WeChatWorkGeneralMessageEto<LinkMessage>>,
IDistributedEventHandler<WeChatWorkGeneralMessageEto<VoiceMessage>>,
IDistributedEventHandler<WeChatWorkGeneralMessageEto<VideoMessage>>,
IDistributedEventHandler<WeChatWorkGeneralMessageEto<PictureMessage>>,
IDistributedEventHandler<WeChatWorkGeneralMessageEto<GeoLocationMessage>>,
ITransientDependency
{
private readonly IMessageHandler _messageHandler;
public WeChatWorkMessageEventHandler(IMessageHandler messageHandler)
{
_messageHandler = messageHandler;
}
public async virtual Task HandleEventAsync(WeChatWorkGeneralMessageEto<TextMessage> eventData)
{
await _messageHandler.HandleMessageAsync(eventData.Message);
}
public async virtual Task HandleEventAsync(WeChatWorkGeneralMessageEto<LinkMessage> eventData)
{
await _messageHandler.HandleMessageAsync(eventData.Message);
}
public async virtual Task HandleEventAsync(WeChatWorkGeneralMessageEto<VoiceMessage> eventData)
{
await _messageHandler.HandleMessageAsync(eventData.Message);
}
public async virtual Task HandleEventAsync(WeChatWorkGeneralMessageEto<VideoMessage> eventData)
{
await _messageHandler.HandleMessageAsync(eventData.Message);
}
public async virtual Task HandleEventAsync(WeChatWorkGeneralMessageEto<PictureMessage> eventData)
{
await _messageHandler.HandleMessageAsync(eventData.Message);
}
public async virtual Task HandleEventAsync(WeChatWorkGeneralMessageEto<GeoLocationMessage> eventData)
{
await _messageHandler.HandleMessageAsync(eventData.Message);
}
}

195
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ApprovalStatusChangeEvent.cs

@ -0,0 +1,195 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using System.Collections.Generic;
using System.Xml.Serialization;
using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 审批状态通知事件
/// </summary>
[EventName("open_approval_change")]
public class ApprovalStatusChangeEvent : WeChatWorkEventMessage
{
/// <summary>
/// 事件KEY值
/// </summary>
[XmlElement("EventKey")]
public string EventKey { get; set; }
/// <summary>
/// 审批信息
/// </summary>
[XmlElement("ApprovalInfo")]
public ApprovalInfo ApprovalInfo { get; set; }
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<ApprovalStatusChangeEvent>(this);
}
}
public class ApprovalInfo
{
/// <summary>
/// 审批单编号,由开发者在发起申请时自定义
/// </summary>
[XmlElement("ThirdNo")]
public string ThirdNo { get; set; }
/// <summary>
/// 审批模板名称
/// </summary>
[XmlElement("OpenSpName")]
public string OpenSpName { get; set; }
/// <summary>
/// 审批模板id
/// </summary>
[XmlElement("OpenTemplateId")]
public string OpenTemplateId { get; set; }
/// <summary>
/// 申请单当前审批状态:
/// 1-审批中;
/// 2-已通过;
/// 3-已驳回;
/// 4-已取消
/// </summary>
[XmlElement("OpenSpStatus")]
public byte OpenSpStatus { get; set; }
/// <summary>
/// 提交申请时间
/// </summary>
[XmlElement("ApplyTime")]
public int ApplyTime { get; set; }
/// <summary>
/// 提交者姓名
/// </summary>
[XmlElement("ApplyUserName")]
public string ApplyUserName { get; set; }
/// <summary>
/// 提交者userid
/// </summary>
[XmlElement("ApplyUserId")]
public string ApplyUserId { get; set; }
/// <summary>
/// 提交者所在部门
/// </summary>
[XmlElement("ApplyUserParty")]
public string ApplyUserParty { get; set; }
/// <summary>
/// 提交者头像
/// </summary>
[XmlElement("ApplyUserImage")]
public string ApplyUserImage { get; set; }
/// <summary>
/// 审批流程信息
/// </summary>
[XmlElement("ApprovalNodes")]
public List<ApprovalNode> ApprovalNodes { get; set; }
/// <summary>
/// 抄送信息,可能有多个抄送人
/// </summary>
[XmlElement("NotifyNodes")]
public List<NotifyNode> NotifyNodes { get; set; }
/// <summary>
/// 当前审批节点:0-第一个审批节点;1-第二个审批节点…以此类推
/// </summary>
[XmlElement("approverstep")]
public int ApproverStep { get; set; }
}
/// <summary>
/// 审批流程信息,可以有多个审批节点
/// </summary>
[XmlRoot("ApprovalNode")]
public class ApprovalNode
{
/// <summary>
/// 节点审批操作状态:
/// 1-审批中;
/// 2-已同意;
/// 3-已驳回;
/// 4-已转审
/// </summary>
[XmlElement("NodeStatus")]
public byte NodeStatus { get; set; }
/// <summary>
/// 审批节点属性:
/// 1-或签;
/// 2-会签
/// </summary>
[XmlElement("NodeAttr")]
public byte NodeAttr { get; set; }
/// <summary>
/// 审批节点类型:
/// 1-固定成员;
/// 2-标签;
/// 3-上级
/// </summary>
[XmlElement("NodeType")]
public byte NodeType { get; set; }
/// <summary>
/// 审批节点信息,当节点为标签或上级时,一个节点可能有多个分支
/// </summary>
[XmlElement("Items")]
public List<ApprovalNodeItem> Items { get; set; }
}
/// <summary>
/// 审批节点分支,当节点为标签或上级时,一个节点可能有多个分支
/// </summary>
[XmlRoot("Item")]
public class ApprovalNodeItem
{
/// <summary>
/// 分支审批人姓名
/// </summary>
[XmlElement("ItemName")]
public string ItemName { get; set; }
/// <summary>
/// 分支审批人userid
/// </summary>
[XmlElement("ItemUserId")]
public string ItemUserId { get; set; }
/// <summary>
/// 分支审批人头像
/// </summary>
[XmlElement("ItemImage")]
public string ItemImage { get; set; }
/// <summary>
/// 分支审批审批操作状态:
/// 1-审批中;
/// 2-已同意;
/// 3-已驳回;
/// 4-已转审
/// </summary>
[XmlElement("ItemStatus")]
public byte ItemStatus { get; set; }
/// <summary>
/// 分支审批人审批意见
/// </summary>
[XmlElement("ItemSpeech")]
public string ItemSpeech { get; set; }
/// <summary>
/// 分支审批人审批意见
/// </summary>
[XmlElement("ItemOpTime")]
public int ItemOpTime { get; set; }
}
/// <summary>
/// 抄送人信息
/// </summary>
[XmlRoot("NotifyNode")]
public class NotifyNode
{
/// <summary>
/// 抄送人姓名
/// </summary>
[XmlElement("ItemName")]
public string ItemName { get; set; }
/// <summary>
/// 抄送人userid
/// </summary>
[XmlElement("ItemUserId")]
public string ItemUserId { get; set; }
/// <summary>
/// 抄送人头像
/// </summary>
[XmlElement("ItemImage")]
public string ItemImage { get; set; }
}

15
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CloseInActiveAgentEvent.cs

@ -0,0 +1,15 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 长期未使用应用临时停用事件
/// </summary>
[EventName("close_inactive_agent")]
public class CloseInActiveAgentEvent : WeChatWorkEventMessage
{
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<CloseInActiveAgentEvent>(this);
}
}

6
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CustomMenuEvent.cs → aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/CustomMenuPushEvent.cs

@ -4,10 +4,10 @@ using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 自定义菜单事件
/// 点击菜单拉取消息的事件推送
/// </summary>
[EventName("custom_menu")]
public class CustomMenuEvent : WeChatWorkEventMessage
public class CustomMenuPushEvent : WeChatWorkEventMessage
{
/// <summary>
/// 事件KEY值
@ -17,6 +17,6 @@ public class CustomMenuEvent : WeChatWorkEventMessage
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<CustomMenuEvent>(this);
return new WeChatWorkEventMessageEto<CustomMenuPushEvent>(this);
}
}

61
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/GeoLocationSelectPushEevent.cs

@ -0,0 +1,61 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using System.Xml.Serialization;
using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 弹出地理位置选择器的事件推送
/// </summary>
[EventName("location_select")]
public class GeoLocationSelectPushEevent : WeChatWorkEventMessage
{
/// <summary>
/// 事件KEY值
/// </summary>
[XmlElement("EventKey")]
public string EventKey { get; set; }
/// <summary>
/// 发送的位置信息
/// </summary>
[XmlElement("SendLocationInfo")]
public LocationInfo SendLocationInfo { get; set; }
/// <summary>
/// app类型,在企业微信固定返回wxwork,在微信不返回该字段
/// </summary>
[XmlElement("AppType")]
public string AppType { get; set; }
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<GeoLocationSelectPushEevent>(this);
}
}
public class LocationInfo
{
/// <summary>
/// 地理位置纬度
/// </summary>
[XmlElement("Location_X")]
public double Latitude { get; set; }
/// <summary>
/// 地理位置经度
/// </summary>
[XmlElement("Location_Y")]
public double Longitude { get; set; }
/// <summary>
/// 地图缩放大小
/// </summary>
[XmlElement("Scale")]
public double Scale { get; set; }
/// <summary>
/// 地理位置信息
/// </summary>
[XmlElement("Label")]
public string Label { get; set; }
/// <summary>
/// POI的名字,可能为空
/// </summary>
[XmlElement("Poiname")]
public string PoiName { get; set; }
}

38
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/MemberExtendAttribute.cs

@ -1,29 +1,47 @@
using System.Xml.Serialization;
using System.Collections.Generic;
using System.Xml.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
[XmlRoot("Item")]
public class MemberExtendAttribute
{
/// <summary>
/// 扩展属性类型: 0-本文 1-网页
/// 扩展属性
/// </summary>
[XmlElement("Item")]
public List<MemberExtend> Items { get;set; }
}
public class MemberExtend
{
/// <summary>
/// 扩展属性类型: 0-文本 1-网页
/// </summary>
[XmlElement("Type")]
public byte Type { get; set; }
/// <summary>
/// 扩展属性类型: 0-本文 1-网页
/// 扩展属性名称
/// </summary>
public MemberExtend Extend { get; set; }
}
public abstract class MemberExtend
{
[XmlElement("Name")]
public string Name { get; set; }
/// <summary>
/// 文本属性内容
/// </summary>
[XmlElement("Text", IsNullable = true)]
public MemberTextExtend Text { get; set; }
/// <summary>
/// Web属性内容
/// </summary>
[XmlElement("Web", IsNullable = true)]
public MemberWebExtend Web { get; set; }
}
/// <summary>
/// 文本属性类型,扩展属性类型为0时填写
/// </summary>
[XmlRoot("Text")]
public class MemberTextExtend : MemberExtend
public class MemberTextExtend
{
/// <summary>
/// 文本属性内容
@ -35,7 +53,7 @@ public class MemberTextExtend : MemberExtend
/// 网页类型属性,扩展属性类型为1时填写
/// </summary>
[XmlRoot("Web")]
public class MemberWebExtend : MemberExtend
public class MemberWebExtend
{
/// <summary>
/// 网页的展示标题

4
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/MenuClickJumpLinkEvent.cs → aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/MenuClickJumpLinkPushEvent.cs

@ -7,7 +7,7 @@ namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// 点击菜单跳转链接时的事件推送
/// </summary>
[EventName("menu_click_jump_link")]
public class MenuClickJumpLinkEvent : WeChatWorkEventMessage
public class MenuClickJumpLinkPushEvent : WeChatWorkEventMessage
{
/// <summary>
/// 事件KEY值
@ -16,6 +16,6 @@ public class MenuClickJumpLinkEvent : WeChatWorkEventMessage
public string EventKey { get; set; }
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<MenuClickJumpLinkEvent>(this);
return new WeChatWorkEventMessageEto<MenuClickJumpLinkPushEvent>(this);
}
}

15
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ReOpenInActiveAgentEevent.cs

@ -0,0 +1,15 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 长期未使用应用重新启用事件
/// </summary>
[EventName("reopen_inactive_agent")]
public class ReOpenInActiveAgentEevent : WeChatWorkEventMessage
{
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<ReOpenInActiveAgentEevent>(this);
}
}

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ScanCodePushEvent.cs

@ -3,7 +3,7 @@ using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 自定义菜单事件
/// 扫码推事件的事件推送
/// </summary>
[EventName("scancode_push")]
public class ScanCodePushEvent : ScanCodeEvent

6
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ScanCodeWaitMsgEvent.cs → aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ScanCodeWaitMsgPushEvent.cs

@ -3,13 +3,13 @@ using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 自定义菜单事件
/// 扫码推事件且弹出“消息接收中”提示框的事件推送
/// </summary>
[EventName("scancode_waitmsg")]
public class ScanCodeWaitMsgEvent : ScanCodeEvent
public class ScanCodeWaitMsgPushEvent : ScanCodeEvent
{
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<ScanCodeWaitMsgEvent>(this);
return new WeChatWorkEventMessageEto<ScanCodeWaitMsgPushEvent>(this);
}
}

20
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ShareAgentChangeEvent.cs

@ -0,0 +1,20 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 企业互联共享应用事件
/// </summary>
/// <remarks>
/// 本事件触发时机为:
/// 1. 上级企业把自建应用共享给下级企业使用
/// 2. 上级企业把下级企业从共享应用中移除
/// </remarks>
[EventName("share_agent_change")]
public class ShareAgentChangeEvent : WeChatWorkEventMessage
{
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<ShareAgentChangeEvent>(this);
}
}

20
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/ShareChainChangeEvent.cs

@ -0,0 +1,20 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 上下游共享应用事件
/// </summary>
/// <remarks>
/// 本事件触发时机为:
/// 1. 上游企业把自建应用共享给下游企业使用
/// 2. 上游企业把下游企业从共享应用中移除
/// </remarks>
[EventName("share_chain_change")]
public class ShareChainChangeEvent : WeChatWorkEventMessage
{
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<ShareChainChangeEvent>(this);
}
}

41
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/TemplateCardMenuPushEvent.cs

@ -0,0 +1,41 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using System.Xml.Serialization;
using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 通用模板卡片右上角菜单事件推送
/// </summary>
[EventName("template_card_menu_event")]
public class TemplateCardMenuPushEvent : WeChatWorkEventMessage
{
/// <summary>
/// 与发送模板卡片消息时指定的task_id相同
/// </summary>
[XmlElement("TaskId")]
public string TaskId { get; set; }
/// <summary>
/// 通用模板卡片的类型,
/// 类型有
/// "text_notice",
/// "news_notice",
/// "button_interaction"
/// 三种
/// </summary>
[XmlElement("CardType")]
public string CardType { get; set; }
/// <summary>
/// 用于调用更新卡片接口的ResponseCode
/// </summary>
[XmlElement("ResponseCode")]
public string ResponseCode { get; set; }
/// <summary>
/// 与发送模板卡片右上角菜单的按钮key值相同
/// </summary>
[XmlElement("EventKey")]
public string EventKey { get; set; }
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<TemplateCardMenuPushEvent>(this);
}
}

80
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/TemplateCardPushEvent.cs

@ -0,0 +1,80 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using System.Collections.Generic;
using System.Xml.Serialization;
using Volo.Abp.EventBus;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
/// 模板卡片事件推送
/// </summary>
[EventName("template_card_event")]
public class TemplateCardPushEvent : WeChatWorkEventMessage
{
/// <summary>
/// 与发送模板卡片消息时指定的task_id相同
/// </summary>
[XmlElement("TaskId")]
public string TaskId { get; set; }
/// <summary>
/// 通用模板卡片的类型,类型有
/// "text_notice",
/// "news_notice",
/// "button_interaction",
/// "vote_interaction",
/// "multiple_interaction"
/// 五种
/// </summary>
[XmlElement("CardType")]
public string CardType { get; set; }
/// <summary>
/// 用于调用更新卡片接口的ResponseCode,72小时内有效,且只能使用一次
/// </summary>
[XmlElement("ResponseCode")]
public string ResponseCode { get; set; }
/// <summary>
/// 与发送模板卡片消息时指定的按钮btn:key值相同
/// </summary>
[XmlElement("EventKey")]
public string EventKey { get; set; }
/// <summary>
/// 事件KEY值
/// </summary>
[XmlElement("SelectedItems")]
public TemplateCardQuestionInfo QuestionInfo { get; set; }
public override WeChatMessageEto ToEto()
{
return new WeChatWorkEventMessageEto<TemplateCardPushEvent>(this);
}
}
public class TemplateCardQuestionInfo
{
/// <summary>
/// 事件KEY值
/// </summary>
[XmlElement("SelectedItem")]
public List<TemplateCardQuestion> Items { get; set; }
}
public class TemplateCardQuestion
{
/// <summary>
/// 问题的key值
/// </summary>
[XmlElement("QuestionKey")]
public string QuestionKey { get; set; }
/// <summary>
/// 问题的key值
/// </summary>
[XmlArray("OptionIds")]
public List<TemplateCardQuestionOption> OptionIds { get; set; }
}
public class TemplateCardQuestionOption
{
/// <summary>
/// 问题的key值
/// </summary>
[XmlElement("OpitonId")]
public List<string> Items { get; set; }
}

5
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/Models/UserChangeEvent.cs

@ -1,5 +1,4 @@
using System.Collections.Generic;
using System.Xml.Serialization;
using System.Xml.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages.Models;
/// <summary>
@ -144,5 +143,5 @@ public abstract class UserChangeEvent : WeChatWorkEventMessage
/// 上游共享的应用不返回该字段
/// </summary>
[XmlArray("ExtAttr")]
public List<MemberExtendAttribute> Extend { get; set; }
public MemberExtendAttribute ExtendAttribute { get; set; }
}

7
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/WeChatWorkEventMessage.cs

@ -5,13 +5,8 @@ namespace LINGYUN.Abp.WeChat.Work.Common.Messages;
/// <summary>
/// 企业微信事件消息
/// </summary>
public abstract class WeChatWorkEventMessage : WeChatMessage
public abstract class WeChatWorkEventMessage : WeChatEventMessage
{
/// <summary>
/// 事件类型
/// </summary>
[XmlElement("Event")]
public string Event { get; set; }
/// <summary>
/// 企业应用的id,整型。可在应用的设置页面查看
/// </summary>

29
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/WeChatWorkEventResolveContributor.cs

@ -0,0 +1,29 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System;
using System.Threading.Tasks;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages;
/// <summary>
/// 微信公众号事件处理器
/// </summary>
public class WeChatWorkEventResolveContributor : WeChatWorkMessageResolveContributorBase
{
public override string Name => "WeChat.Work.Event";
protected override Task ResolveWeComMessageAsync(IMessageResolveContext context)
{
var options = context.ServiceProvider.GetRequiredService<IOptions<AbpWeChatWorkMessageResolveOptions>>().Value;
var messageType = context.GetMessageData("MsgType");
var eventName = context.GetMessageData("Event");
if ("event".Equals(messageType, StringComparison.InvariantCultureIgnoreCase) &&
!eventName.IsNullOrWhiteSpace() &&
options.EventMaps.TryGetValue(eventName, out var eventFactory))
{
context.Message = eventFactory(context);
context.Handled = true;
}
return Task.CompletedTask;
}
}

25
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/WeChatWorkMessageResolveContributor.cs

@ -0,0 +1,25 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Threading.Tasks;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages;
/// <summary>
/// 微信公众号消息处理器
/// </summary>
public class WeChatWorkMessageResolveContributor : WeChatWorkMessageResolveContributorBase
{
public override string Name => "WeChat.Work.Message";
protected override Task ResolveWeComMessageAsync(IMessageResolveContext context)
{
var options = context.ServiceProvider.GetRequiredService<IOptions<AbpWeChatWorkMessageResolveOptions>>().Value;
var messageType = context.GetMessageData("MsgType");
if (options.MessageMaps.TryGetValue(messageType, out var messageFactory))
{
context.Message = messageFactory(context);
context.Handled = true;
}
return Task.CompletedTask;
}
}

19
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work.Common/LINGYUN/Abp/WeChat/Work/Common/Messages/WeChatWorkMessageResolveContributorBase.cs

@ -0,0 +1,19 @@
using LINGYUN.Abp.WeChat.Common.Messages;
using System.Threading.Tasks;
namespace LINGYUN.Abp.WeChat.Work.Common.Messages;
public abstract class WeChatWorkMessageResolveContributorBase : MessageResolveContributorBase
{
public override Task ResolveAsync(IMessageResolveContext context)
{
// 企业微信消息需要企业标识字段
if (context.HasMessageKey("AgentID"))
{
return ResolveWeComMessageAsync(context);
}
return Task.CompletedTask;
}
protected abstract Task ResolveWeComMessageAsync(IMessageResolveContext context);
}

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN.Abp.WeChat.Work.csproj

@ -23,7 +23,7 @@
<ItemGroup>
<ProjectReference Include="..\..\common\LINGYUN.Abp.Features.LimitValidation\LINGYUN.Abp.Features.LimitValidation.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.WeChat.Common\LINGYUN.Abp.WeChat.Common.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.WeChat.Work.Common\LINGYUN.Abp.WeChat.Work.Common.csproj" />
</ItemGroup>
</Project>

4
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/AbpWeChatWorkModule.cs

@ -1,6 +1,6 @@
using LINGYUN.Abp.Features.LimitValidation;
using LINGYUN.Abp.WeChat.Common;
using LINGYUN.Abp.WeChat.Common.Localization;
using LINGYUN.Abp.WeChat.Work.Common;
using LINGYUN.Abp.WeChat.Work.Localization;
using Microsoft.Extensions.DependencyInjection;
using System;
@ -19,7 +19,7 @@ namespace LINGYUN.Abp.WeChat.Work;
typeof(AbpExceptionHandlingModule),
typeof(AbpFeaturesLimitValidationModule),
typeof(AbpSettingsModule),
typeof(AbpWeChatCommonModule))]
typeof(AbpWeChatWorkCommonModule))]
public class AbpWeChatWorkModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/IWeChatWorkMessageSender.cs

@ -1,4 +1,4 @@
using LINGYUN.Abp.WeChat.Work.Message.Response;
using LINGYUN.Abp.WeChat.Work.Messages.Response;
using System.Threading;
using System.Threading.Tasks;

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/MarkdownMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// markdown消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/MediaMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 媒体文件消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/MiniProgramMessage.cs

@ -3,7 +3,7 @@ using Newtonsoft.Json;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 小程序通知消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/MpNewMessage.cs

@ -3,7 +3,7 @@ using Newtonsoft.Json;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 图文消息(mp)载体
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/NewMessage.cs

@ -3,7 +3,7 @@ using Newtonsoft.Json;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 图文消息载体
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/TextCardMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 文本卡片消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/TextMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 文本消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/VideoMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 视频消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatFileMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信群聊文件消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatImageMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信群聊图片消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatMarkdownMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信群聊markdown消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatMpNewMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信群聊文本图文消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatNewMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信群聊文本图文消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatTextCardMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信群聊文本卡片消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatTextMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信群聊文本消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatVideoMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信群聊语言消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkAppChatVoiceMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信群聊语言消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkFileMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信文件消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkImageMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信图片消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkMarkdownMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信markdown消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkMiniProgramMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信小程序通知消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkMpNewMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信文本图文消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkNewMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信文本图文消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkTextCardMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信文本卡片消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkTextMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信文本消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkVideoMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信语言消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Models/WeChatWorkVoiceMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Models;
namespace LINGYUN.Abp.WeChat.Work.Messages.Models;
/// <summary>
/// 企业微信语言消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Request/WeChatWorkMessageReCallRequest.cs

@ -1,7 +1,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Request;
namespace LINGYUN.Abp.WeChat.Work.Messages.Request;
/// <summary>
/// 撤回消息请求载体
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Request/WeChatWorkMessageRequest.cs

@ -1,4 +1,4 @@
namespace LINGYUN.Abp.WeChat.Work.Message.Request;
namespace LINGYUN.Abp.WeChat.Work.Messages.Request;
public class WeChatWorkMessageRequest<TMessage>
{
public string AccessToken { get; set; }

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Response/WeChatWorkMessageResponse.cs

@ -1,7 +1,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Response;
namespace LINGYUN.Abp.WeChat.Work.Messages.Response;
/// <summary>
/// 企业微信发送消息响应
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCard.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
public abstract class TemplateCard
{

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardAction.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 卡片操作按钮
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardActionMenu.cs

@ -3,7 +3,7 @@ using Newtonsoft.Json;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 卡片右上角更多操作按钮
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardCardAction.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 整体卡片的点击跳转事件
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardEmphasisContent.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 关键数据样式
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardHorizontalContent.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 二级标题+文本
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardJump.cs

@ -5,7 +5,7 @@ using System.Collections.Generic;
using System.Text;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 跳转指引样式
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardMainTitle.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 卡票标题
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardQuoteArea.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 引用文献样式
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TemplateCardSource.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 来源文字颜色
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/TextTemplateCard.cs

@ -3,7 +3,7 @@ using Newtonsoft.Json;
using System.Collections.Generic;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 文本模板卡片消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/Templates/WeChatWorkTemplateCardMessage.cs

@ -2,7 +2,7 @@
using Newtonsoft.Json;
using System.Text.Json.Serialization;
namespace LINGYUN.Abp.WeChat.Work.Message.Templates;
namespace LINGYUN.Abp.WeChat.Work.Messages.Templates;
/// <summary>
/// 企业微信模板卡片消息
/// </summary>

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/WeChatWorkMessageManager.cs

@ -1,4 +1,4 @@
using LINGYUN.Abp.WeChat.Work.Message.Request;
using LINGYUN.Abp.WeChat.Work.Messages.Request;
using LINGYUN.Abp.WeChat.Work.Token;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;

4
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Messages/WeChatWorkMessageSender.cs

@ -1,7 +1,7 @@
using LINGYUN.Abp.Features.LimitValidation;
using LINGYUN.Abp.WeChat.Work.Features;
using LINGYUN.Abp.WeChat.Work.Message.Request;
using LINGYUN.Abp.WeChat.Work.Message.Response;
using LINGYUN.Abp.WeChat.Work.Messages.Request;
using LINGYUN.Abp.WeChat.Work.Messages.Response;
using LINGYUN.Abp.WeChat.Work.Token;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;

2
aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Message.cs

@ -1,5 +1,5 @@
using LINGYUN.Abp.WeChat.Work.Messages;
using LINGYUN.Abp.WeChat.Work.Message.Request;
using LINGYUN.Abp.WeChat.Work.Messages.Request;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

3
aspnet-core/modules/openIddict/LINGYUN.Abp.OpenIddict.WeChat/LINGYUN/Abp/OpenIddict/WeChat/WeChatTokenExtensionGrant.cs

@ -1,6 +1,7 @@
using LINGYUN.Abp.WeChat;
using LINGYUN.Abp.WeChat.Common;
using LINGYUN.Abp.WeChat.Common.Security.Claims;
using LINGYUN.Abp.WeChat.OpenId;
using LINGYUN.Abp.WeChat.Security.Claims;
using LINGYUN.Abp.WeChat.Settings;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;

2
aspnet-core/modules/openIddict/LINGYUN.Abp.OpenIddict.WeChat/Microsoft/Extensions/DependencyInjection/WeChatOpenIddictServerBuilderExtensions.cs

@ -1,5 +1,5 @@
using LINGYUN.Abp.OpenIddict.WeChat;
using LINGYUN.Abp.WeChat.Security.Claims;
using LINGYUN.Abp.WeChat.Common.Security.Claims;
namespace Microsoft.Extensions.DependencyInjection;

10
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.WeChat.MiniProgram/LINGYUN/Abp/Notifications/WeChat/MiniProgram/WeChatMiniProgramNotificationPublishProvider.cs

@ -1,6 +1,6 @@
using LINGYUN.Abp.WeChat.MiniProgram.Features;
using LINGYUN.Abp.WeChat.Common.Security.Claims;
using LINGYUN.Abp.WeChat.MiniProgram.Features;
using LINGYUN.Abp.WeChat.MiniProgram.Messages;
using LINGYUN.Abp.WeChat.Security.Claims;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
@ -44,7 +44,7 @@ namespace LINGYUN.Abp.Notifications.WeChat.MiniProgram
return true;
}
protected override async Task PublishAsync(NotificationInfo notification, IEnumerable<UserIdentifier> identifiers, CancellationToken cancellationToken = default)
protected async override Task PublishAsync(NotificationInfo notification, IEnumerable<UserIdentifier> identifiers, CancellationToken cancellationToken = default)
{
// step1 默认微信openid绑定的就是username,
// 如果不是,需要自行处理openid获取逻辑
@ -80,7 +80,7 @@ namespace LINGYUN.Abp.Notifications.WeChat.MiniProgram
Logger.LogDebug($"Get wechat weapp language: {weAppLang ?? null}");
// TODO: 如果微信端发布通知,请组装好 openid 字段在通知数据内容里面
string openId = GetOrDefault(notification.Data, AbpWeChatClaimTypes.OpenId, "");
var openId = GetOrDefault(notification.Data, AbpWeChatClaimTypes.OpenId, "");
if (openId.IsNullOrWhiteSpace())
{
@ -110,7 +110,7 @@ namespace LINGYUN.Abp.Notifications.WeChat.MiniProgram
protected string GetOrDefault(NotificationData data, string key, string defaultValue)
{
if (data.ExtraProperties.TryGetValue(key, out object value))
if (data.ExtraProperties.TryGetValue(key, out var value))
{
// 取得了数据就删除对应键值
// data.Properties.Remove(key);

4
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.WeChat.Work/LINGYUN/Abp/Notifications/WeChat/Work/WeChatWorkNotificationPublishProvider.cs

@ -1,8 +1,8 @@
using LINGYUN.Abp.RealTime.Localization;
using LINGYUN.Abp.WeChat.Work;
using LINGYUN.Abp.WeChat.Work.Authorize;
using LINGYUN.Abp.WeChat.Work.Message;
using LINGYUN.Abp.WeChat.Work.Message.Models;
using LINGYUN.Abp.WeChat.Work.Messages;
using LINGYUN.Abp.WeChat.Work.Messages.Models;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Options;
using System;

Loading…
Cancel
Save