From c7088362326477d4eff72733a64aebae31ae3d2b Mon Sep 17 00:00:00 2001 From: colin Date: Tue, 14 Oct 2025 15:46:16 +0800 Subject: [PATCH] feat(wechat): wecom template approval integration --- .../Approvals/ApprovalTemplateProvider.cs | 80 +++++++ .../Approvals/IApprovalTemplateProvider.cs | 88 ++++++++ .../Approvals/Models/ApprovalApplyData.cs | 28 +++ .../Approvals/Models/ApprovalApplyProcess.cs | 28 +++ .../Models/ApprovalApplyProcessNode.cs | 75 +++++++ .../Work/Approvals/Models/ApprovalApplyer.cs | 18 ++ .../Approvals/Models/ApprovalApproverAttr.cs | 19 ++ .../Work/Approvals/Models/ApprovalComment.cs | 47 ++++ .../Approvals/Models/ApprovalControlData.cs | 65 ++++++ .../Approvals/Models/ApprovalControlValue.cs | 79 +++++++ .../Work/Approvals/Models/ApprovalData.cs | 30 +++ .../Approvals/Models/ApprovalDetailInfo.cs | 96 +++++++++ .../Approvals/Models/ApprovalInfoFilter.cs | 51 +++++ .../Work/Approvals/Models/ApprovalProcess.cs | 19 ++ .../Approvals/Models/ApprovalProcessNode.cs | 40 ++++ .../Models/ApprovalProcessNodeStatus.cs | 54 +++++ .../Models/ApprovalProcessNodeType.cs | 24 +++ .../Models/ApprovalProcessSubNode.cs | 47 ++++ .../Work/Approvals/Models/ApprovalSpRecord.cs | 33 +++ .../Models/ApprovalSpRecordDetail.cs | 47 ++++ .../Models/ApprovalSpRecordStatus.cs | 44 ++++ .../Work/Approvals/Models/ApprovalSpStatus.cs | 44 ++++ .../Work/Approvals/Models/ApprovalSummary.cs | 28 +++ .../Approvals/Models/ApprovalSummaryInfo.cs | 38 ++++ .../Work/Approvals/Models/ApprovalUser.cs | 18 ++ .../Models/AttendanceControlConfig.cs | 55 +++++ .../Models/AttendanceControlValue.cs | 109 ++++++++++ .../Approvals/Models/ContactControlConfig.cs | 75 +++++++ .../Approvals/Models/ContactControlValue.cs | 7 + .../WeChat/Work/Approvals/Models/Control.cs | 27 +++ .../Work/Approvals/Models/ControlConfig.cs | 7 + .../Approvals/Models/ControlConfigFactory.cs | 50 +++++ .../Work/Approvals/Models/ControlData.cs | 202 ++++++++++++++++++ .../Work/Approvals/Models/ControlInfo.cs | 95 ++++++++ .../Approvals/Models/ControlPlaceholder.cs | 37 ++++ .../Work/Approvals/Models/ControlTtile.cs | 37 ++++ .../Work/Approvals/Models/ControlValue.cs | 8 + .../Approvals/Models/DateControlConfig.cs | 38 ++++ .../Work/Approvals/Models/DateControlValue.cs | 65 ++++++ .../Work/Approvals/Models/DateRangeConfig.cs | 43 ++++ .../Models/DateRangeControlConfig.cs | 27 +++ .../Approvals/Models/DateRangeControlValue.cs | 71 ++++++ .../Models/DepartmentControlValue.cs | 66 ++++++ .../Approvals/Models/FileControlConfig.cs | 47 ++++ .../Work/Approvals/Models/FileControlValue.cs | 76 +++++++ .../Approvals/Models/FormulaControlValue.cs | 47 ++++ .../Approvals/Models/LocationControlConfig.cs | 47 ++++ .../Approvals/Models/LocationControlValue.cs | 79 +++++++ .../Approvals/Models/MemberControlValue.cs | 66 ++++++ .../Approvals/Models/MoneyControlValue.cs | 27 +++ .../Approvals/Models/NumberControlValue.cs | 27 +++ .../Models/RelatedApprovalControlConfig.cs | 47 ++++ .../Models/RelatedApprovalControlValue.cs | 48 +++++ .../Approvals/Models/SelectorControlConfig.cs | 122 +++++++++++ .../Approvals/Models/SelectorControlValue.cs | 95 ++++++++ .../Approvals/Models/TableControlConfig.cs | 56 +++++ .../Approvals/Models/TableControlValue.cs | 51 +++++ .../Work/Approvals/Models/TemplateContent.cs | 19 ++ .../Work/Approvals/Models/TemplateName.cs | 35 +++ .../Work/Approvals/Models/TextControlValue.cs | 27 +++ .../Approvals/Models/TextareaControlValue.cs | 27 +++ .../Approvals/Models/TipsControlConfig.cs | 169 +++++++++++++++ .../Approvals/Models/VacationControlValue.cs | 141 ++++++++++++ .../Request/WeChatWorkApplyEventRequest.cs | 94 ++++++++ .../WeChatWorkCreateTemplateRequest.cs | 36 ++++ .../WeChatWorkGetApprovalDetailRequest.cs | 25 +++ .../WeChatWorkGetApprovalInfoRequest.cs | 65 ++++++ .../Request/WeChatWorkGetTemplateRequest.cs | 25 +++ .../WeChatWorkUpdateTemplateRequest.cs | 47 ++++ .../Response/WeChatWorkApplyEventResponse.cs | 21 ++ .../WeChatWorkCreateTemplateResponse.cs | 21 ++ .../WeChatWorkGetApprovalDetailResponse.cs | 22 ++ .../WeChatWorkGetApprovalInfoResponse.cs | 29 +++ .../Response/WeChatWorkTemplateResponse.cs | 40 ++++ .../Json/ControlNewtonsoftJsonConverter.cs | 47 ++++ ...entWeChatWorkRequestExtensions.Approval.cs | 128 +++++++++++ ...entWeChatWorkRequestExtensions.Security.cs | 17 ++ .../ControlSystemTextJsonConverter.cs | 42 ++++ 78 files changed, 4071 insertions(+) create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/ApprovalTemplateProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/IApprovalTemplateProvider.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyData.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyProcess.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyProcessNode.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyer.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApproverAttr.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalComment.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalControlData.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalData.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalDetailInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalInfoFilter.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcess.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNode.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNodeStatus.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNodeType.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessSubNode.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecord.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecordDetail.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecordStatus.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpStatus.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSummary.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSummaryInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalUser.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/AttendanceControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/AttendanceControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ContactControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ContactControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/Control.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlConfigFactory.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlData.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlInfo.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlPlaceholder.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlTtile.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DepartmentControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FileControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FileControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FormulaControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/LocationControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/LocationControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/MemberControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/MoneyControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/NumberControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/RelatedApprovalControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/RelatedApprovalControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/SelectorControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/SelectorControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TableControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TableControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TemplateContent.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TemplateName.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TextControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TextareaControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TipsControlConfig.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/VacationControlValue.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkApplyEventRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkCreateTemplateRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetApprovalDetailRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetTemplateRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkUpdateTemplateRequest.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkApplyEventResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkCreateTemplateResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkGetApprovalDetailResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkGetApprovalInfoResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkTemplateResponse.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Approval.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Security.cs create mode 100644 aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/ApprovalTemplateProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/ApprovalTemplateProvider.cs new file mode 100644 index 000000000..aa7436c10 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/ApprovalTemplateProvider.cs @@ -0,0 +1,80 @@ +using LINGYUN.Abp.WeChat.Work.Approvals.Request; +using LINGYUN.Abp.WeChat.Work.Approvals.Response; +using LINGYUN.Abp.WeChat.Work.Features; +using LINGYUN.Abp.WeChat.Work.Token; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Features; + +namespace LINGYUN.Abp.WeChat.Work.Approvals; + +[RequiresFeature(WeChatWorkFeatureNames.Enable)] +public class ApprovalTemplateProvider : IApprovalTemplateProvider, ISingletonDependency +{ + protected IHttpClientFactory HttpClientFactory { get; } + protected IWeChatWorkTokenProvider WeChatWorkTokenProvider { get; } + + public ApprovalTemplateProvider( + IHttpClientFactory httpClientFactory, + IWeChatWorkTokenProvider weChatWorkTokenProvider) + { + HttpClientFactory = httpClientFactory; + WeChatWorkTokenProvider = weChatWorkTokenProvider; + } + + public async virtual Task ApplyEventAsync(WeChatWorkApplyEventRequest request, CancellationToken cancellationToken = default) + { + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + + using var response = await client.ApplyEventAsync(token.AccessToken, request, cancellationToken); + return await response.DeserializeObjectAsync(); + } + + public async virtual Task CreateTemplateAsync(WeChatWorkCreateTemplateRequest request, CancellationToken cancellationToken = default) + { + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + + using var response = await client.CreateTemplateAsync(token.AccessToken, request, cancellationToken); + return await response.DeserializeObjectAsync(); + } + + public async virtual Task GetApprovalDetailAsync(WeChatWorkGetApprovalDetailRequest request, CancellationToken cancellationToken = default) + { + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + + using var response = await client.GetApprovalDetailAsync(token.AccessToken, request, cancellationToken); + return await response.DeserializeObjectAsync(); + } + + public async virtual Task GetApprovalInfoAsync(WeChatWorkGetApprovalInfoRequest request, CancellationToken cancellationToken = default) + { + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + + using var response = await client.GetApprovalInfoAsync(token.AccessToken, request, cancellationToken); + return await response.DeserializeObjectAsync(); + } + + public async virtual Task GetTemplateAsync(WeChatWorkGetTemplateRequest request, CancellationToken cancellationToken = default) + { + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + + using var response = await client.GetTemplateAsync(token.AccessToken, request, cancellationToken); + return await response.DeserializeObjectAsync(); + } + + public async virtual Task UpdateTemplateAsync(WeChatWorkCreateTemplateRequest request, CancellationToken cancellationToken = default) + { + var token = await WeChatWorkTokenProvider.GetTokenAsync(cancellationToken); + var client = HttpClientFactory.CreateClient(AbpWeChatWorkGlobalConsts.ApiClient); + + using var response = await client.UpdateTemplateAsync(token.AccessToken, request, cancellationToken); + return await response.DeserializeObjectAsync(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/IApprovalTemplateProvider.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/IApprovalTemplateProvider.cs new file mode 100644 index 000000000..38d7c9a3b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/IApprovalTemplateProvider.cs @@ -0,0 +1,88 @@ +using LINGYUN.Abp.WeChat.Work.Approvals.Request; +using LINGYUN.Abp.WeChat.Work.Approvals.Response; +using System.Threading; +using System.Threading.Tasks; + +namespace LINGYUN.Abp.WeChat.Work.Approvals; +// TODO: 自建应用审批未实现: https://developer.work.weixin.qq.com/document/path/90269 +/// +/// 审批模板接口 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/91854 +/// +public interface IApprovalTemplateProvider +{ + /// + /// 创建审批模板 + /// + /// + /// 详情见:https://developer.work.weixin.qq.com/document/path/97437 + /// + /// 创建审批模板请求参数 + /// + /// 创建审批模板响应参数 + Task CreateTemplateAsync( + WeChatWorkCreateTemplateRequest request, + CancellationToken cancellationToken = default); + /// + /// 更新审批模板 + /// + /// + /// 详情见:https://developer.work.weixin.qq.com/document/path/97438 + /// + /// 更新审批模板请求参数 + /// + /// 更新审批模板响应参数 + Task UpdateTemplateAsync( + WeChatWorkCreateTemplateRequest request, + CancellationToken cancellationToken = default); + /// + /// 获取审批模板详情 + /// + /// + /// 详情见:https://developer.work.weixin.qq.com/document/path/91982 + /// + /// 获取审批模板请求参数 + /// + /// 审批模板响应参数 + Task GetTemplateAsync( + WeChatWorkGetTemplateRequest request, + CancellationToken cancellationToken = default); + /// + /// 批量获取审批单号 + /// + /// + /// 详情见:https://developer.work.weixin.qq.com/document/path/91816 + /// + /// 批量获取审批单号请求参数 + /// + /// 批量获取审批单号响应参数 + Task GetApprovalInfoAsync( + WeChatWorkGetApprovalInfoRequest request, + CancellationToken cancellationToken = default); + /// + /// 获取审批申请详情 + /// + /// + /// 详情见:https://developer.work.weixin.qq.com/document/path/91983 + /// + /// 获取审批申请详情请求参数 + /// + /// 获取审批申请详情响应参数 + Task GetApprovalDetailAsync( + WeChatWorkGetApprovalDetailRequest request, + CancellationToken cancellationToken = default); + /// + /// 提交审批申请 + /// + /// + /// 详情见:https://developer.work.weixin.qq.com/document/path/91853 + /// + /// 提交审批申请请求参数 + /// + /// 提交审批申请响应参数 + Task ApplyEventAsync( + WeChatWorkApplyEventRequest request, + CancellationToken cancellationToken = default); +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyData.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyData.cs new file mode 100644 index 000000000..622947202 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyData.cs @@ -0,0 +1,28 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 审批申请数据 +/// +public class ApprovalApplyData +{ + /// + /// 审批申请详情,由多个表单控件及其内容组成,其中包含需要对控件赋值的信息 + /// + [NotNull] + [JsonProperty("contents")] + [JsonPropertyName("contents")] + public List Contents { get; set; } + public ApprovalApplyData() + { + + } + + public ApprovalApplyData(List contents) + { + Contents = contents; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyProcess.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyProcess.cs new file mode 100644 index 000000000..4877fdac9 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyProcess.cs @@ -0,0 +1,28 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 申请流程 +/// +public class ApprovalApplyProcess +{ + /// + /// 流程节点列表 + /// + [NotNull] + [JsonProperty("node_list")] + [JsonPropertyName("node_list")] + public List Nodes { get; set; } + public ApprovalApplyProcess() + { + + } + + public ApprovalApplyProcess(List nodes) + { + Nodes = nodes; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyProcessNode.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyProcessNode.cs new file mode 100644 index 000000000..3bc9b6201 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyProcessNode.cs @@ -0,0 +1,75 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 申请流程节点 +/// +public class ApprovalApplyProcessNode +{ + /// + /// 节点类型 1:审批人 2:抄送人 3:办理人 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public ApprovalProcessNodeType Type { get; set; } + /// + /// 多人审批方式 1-会签;2-或签 3-依次审批 + /// + /// + /// type为1、3时必填 + /// + [NotNull] + [JsonProperty("apv_rel")] + [JsonPropertyName("apv_rel")] + public byte? ApvRel { get; set; } + /// + /// 用户id + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } + public ApprovalApplyProcessNode() + { + + } + + private ApprovalApplyProcessNode(ApprovalProcessNodeType type, string userId, byte? apvRel = null) + { + Type = type; + UserId = userId; + ApvRel = apvRel; + } + /// + /// 审批人节点 + /// + /// 审批人Id + /// 多人审批方式 1-会签;2-或签 3-依次审批 + /// + public static ApprovalApplyProcessNode Approver(string userId, byte apvRel) + { + return new ApprovalApplyProcessNode(ApprovalProcessNodeType.Approver, userId, apvRel); + } + /// + /// 办理人节点 + /// + /// 办理人Id + /// 多人审批方式 1-会签;2-或签 3-依次审批 + /// + public static ApprovalApplyProcessNode Handler(string userId, byte apvRel) + { + return new ApprovalApplyProcessNode(ApprovalProcessNodeType.Handler, userId, apvRel); + } + /// + /// 抄送人节点 + /// + /// 抄送人Id + /// + public static ApprovalApplyProcessNode To(string userId) + { + return new ApprovalApplyProcessNode(ApprovalProcessNodeType.CC, userId); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyer.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyer.cs new file mode 100644 index 000000000..446985def --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApplyer.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 申请人信息 +/// +public class ApprovalApplyer : ApprovalUser +{ + /// + /// 申请人所在部门id + /// + [NotNull] + [JsonProperty("partyid")] + [JsonPropertyName("partyid")] + public int PartyId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApproverAttr.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApproverAttr.cs new file mode 100644 index 000000000..b72a1821c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalApproverAttr.cs @@ -0,0 +1,19 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 节点审批方式 +/// +public enum ApprovalApproverAttr : byte +{ + /// + /// 或签 + /// + [Description("或签")] + OrSign = 1, + /// + /// 会签 + /// + [Description("会签")] + CoSign = 2, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalComment.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalComment.cs new file mode 100644 index 000000000..cebab51ca --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalComment.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 审批申请备注信息 +/// +public class ApprovalComment +{ + /// + /// 备注人信息 + /// + [CanBeNull] + [JsonProperty("commentUserInfo")] + [JsonPropertyName("commentUserInfo")] + public ApprovalUser CommentUserInfo { get; set; } + /// + /// 审批申请提交时间,Unix时间戳 + /// + [NotNull] + [JsonProperty("commenttime")] + [JsonPropertyName("commenttime")] + public long CommentTime { get; set; } + /// + /// 备注文本内容 + /// + [NotNull] + [JsonProperty("commentcontent")] + [JsonPropertyName("commentcontent")] + public string CommentContent { get; set; } + /// + /// 备注id + /// + [NotNull] + [JsonProperty("commentid")] + [JsonPropertyName("commentid")] + public string CommentId { get; set; } + /// + /// 备注附件id,可能有多个,微盘文件无法获取 + /// + [CanBeNull] + [JsonProperty("media_id")] + [JsonPropertyName("media_id")] + public List MediaId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalControlData.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalControlData.cs new file mode 100644 index 000000000..c98e6d9bb --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalControlData.cs @@ -0,0 +1,65 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 审批申请单控件数据 +/// +public class ApprovalControlData +{ + /// + /// 控件类型 + /// + /// + /// Text-文本
+ /// Textarea-多行文本
+ /// Number-数字
+ /// Money-金额
+ /// Date-日期/日期+时间
+ /// Selector-单选/多选
+ /// Contact-成员/部门
+ /// Tips-说明文字
+ /// File-附件
+ /// Table-明细
+ /// Location-位置
+ /// RelatedApproval-关联审批单
+ /// Formula-公式
+ /// DateRange-时长 + ///
+ [NotNull] + [JsonProperty("control")] + [JsonPropertyName("control")] + public string Control { get; set; } + /// + /// 控件id:控件的唯一id,可通过“获取审批模板详情”接口获取 + /// + [NotNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public string Id { get; set; } + /// + /// 控件值 ,需在此为申请人在各个控件中填写内容不同控件有不同的赋值参数 + /// + /// + /// 模板配置的控件属性为必填时,对应value值需要有值。 + /// + [NotNull] + [JsonProperty("value")] + [JsonPropertyName("value")] + public ApprovalControlValue Value { get; set; } + /// + /// 控件隐藏标识,为1表示控件被隐藏 + /// + [CanBeNull] + [JsonProperty("display")] + [JsonPropertyName("display")] + public int? Display { get; set; } + /// + /// 控件必输标识,为1表示控件必输 + /// + [CanBeNull] + [JsonProperty("require")] + [JsonPropertyName("require")] + public int? Require { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalControlValue.cs new file mode 100644 index 000000000..d5b325a08 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalControlValue.cs @@ -0,0 +1,79 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 审批申请单数据 +/// +public class ApprovalControlValue +{ + /// + /// 文本内容,即申请人在此控件填写的文本内容 + /// + [CanBeNull] + [JsonProperty("text")] + [JsonPropertyName("text")] + public string Text { get; set; } + /// + /// 数字内容,即申请人在此控件填写的数字内容 + /// + [CanBeNull] + [JsonProperty("new_number")] + [JsonPropertyName("new_number")] + public decimal? NewNumber { get; set; } + /// + /// 金额内容,即申请人在此控件填写的金额内容 + /// + [CanBeNull] + [JsonProperty("new_money")] + [JsonPropertyName("new_money")] + public decimal? NewMoney { get; set; } + /// + /// 所选成员内容,即申请人在此控件选择的成员,多选模式下可以有多个 + /// + [NotNull] + [JsonProperty("members")] + [JsonPropertyName("members")] + public List Members { get; set; } + /// + /// 所选部门内容,即申请人在此控件选择的部门,多选模式下可能有多个 + /// + [NotNull] + [JsonProperty("departments")] + [JsonPropertyName("departments")] + public List Departments { get; set; } + /// + /// 附件列表 + /// + [NotNull] + [JsonProperty("files")] + [JsonPropertyName("files")] + public List Files { get; set; } + /// + /// 明细内容,一个明细控件可能包含多个子明细 + /// + [NotNull] + [JsonProperty("children")] + [JsonPropertyName("children")] + public List Children { get; set; } + /// + /// 关联审批单 + /// + [NotNull] + [JsonProperty("related_approval")] + [JsonPropertyName("related_approval")] + public List RelatedApproval { get; set; } +} + +public class ApprovalDataChildrenValue +{ + /// + /// 明细内容,一个明细控件可能包含多个子明细 + /// + [NotNull] + [JsonProperty("list")] + [JsonPropertyName("list")] + public List List { get; set; } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalData.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalData.cs new file mode 100644 index 000000000..baf466a4d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalData.cs @@ -0,0 +1,30 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; + +/// +/// 审批申请单数据 +/// +public class ApprovalData +{ + /// + /// 审批申请详情,由多个表单控件及其内容组成,其中包含需要对控件赋值的信息 + /// + [NotNull] + [JsonProperty("contents")] + [JsonPropertyName("contents")] + public List Contents { get; set; } + public ApprovalData() + { + + } + + public ApprovalData(List contents) + { + Contents = contents; + } +} + diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalDetailInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalDetailInfo.cs new file mode 100644 index 000000000..71c747dd3 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalDetailInfo.cs @@ -0,0 +1,96 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 审批申请详情 +/// +public class ApprovalDetailInfo +{ + /// + /// 审批编号 + /// + [NotNull] + [JsonProperty("sp_no")] + [JsonPropertyName("sp_no")] + public string SpNo { get; set; } + /// + /// 审批申请类型名称(审批模板名称) + /// + [NotNull] + [JsonProperty("sp_name")] + [JsonPropertyName("sp_name")] + public string SpName { get; set; } + /// + /// 申请单状态 + /// + [NotNull] + [JsonProperty("sp_status")] + [JsonPropertyName("sp_status")] + public ApprovalSpStatus SpStatus { get; set; } + /// + /// 审批模板id。可在“获取审批申请详情”、“审批状态变化回调通知”中获得,也可在审批模板的模板编辑页面链接中获得。 + /// + [NotNull] + [JsonProperty("template_id")] + [JsonPropertyName("template_id")] + public string TemplateId { get; set; } + /// + /// 审批申请提交时间,Unix时间戳 + /// + [NotNull] + [JsonProperty("apply_time")] + [JsonPropertyName("apply_time")] + public long ApplyTime { get; set; } + /// + /// 申请人信息 + /// + [CanBeNull] + [JsonProperty("applyer")] + [JsonPropertyName("applyer")] + public ApprovalApplyer Applyer { get; set; } + /// + /// 批量申请人信息(和applyer字段互斥) + /// + [CanBeNull] + [JsonProperty("batch_applyer")] + [JsonPropertyName("batch_applyer")] + public List BatchApplyer { get; set; } + /// + /// 审批流程信息,可能有多个审批节点 + /// + [NotNull] + [JsonProperty("sp_record")] + [JsonPropertyName("sp_record")] + public List SpRecord { get; set; } + /// + /// 抄送信息,可能有多个抄送节点 + /// + [CanBeNull] + [JsonProperty("notifyer")] + [JsonPropertyName("notifyer")] + public List Notifyer { get; set; } + /// + /// 审批申请数据 + /// + [NotNull] + [JsonProperty("apply_data")] + [JsonPropertyName("apply_data")] + public ApprovalData ApplyData { get; set; } + /// + /// 审批申请备注信息,可能有多个备注节点 + /// + [NotNull] + [JsonProperty("comments")] + [JsonPropertyName("comments")] + public List Comments { get; set; } + /// + /// 审批流程列表 + /// + [NotNull] + [JsonProperty("process_list")] + [JsonPropertyName("process_list")] + public ApprovalProcess Process { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalInfoFilter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalInfoFilter.cs new file mode 100644 index 000000000..47d6be320 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalInfoFilter.cs @@ -0,0 +1,51 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 筛选条件 +/// +public class ApprovalInfoFilter +{ + /// + /// 筛选类型 + /// + /// + /// 包括如下值:
+ /// template_id - 模板类型/模板id;
+ /// creator - 申请人;
+ /// department - 审批单提单者所在部门;
+ /// sp_status - 审批状态;
+ /// record_type - 审批单类型属性;
+ ///
+ /// 注意:
+ /// 1、仅“部门”支持同时配置多个筛选条件。
+ /// 2、不同类型的筛选条件之间为“与”的关系,同类型筛选条件之间为“或”的关系
+ /// 3、record_type筛选类型仅支持2021/05/31以后新提交的审批单,历史单不支持表单类型属性过滤
+ ///
+ [NotNull] + [JsonProperty("key")] + [JsonPropertyName("key")] + public string Key { get; set; } + /// + /// 筛选值 + /// + /// + /// 对应值:
+ /// template_id-模板id;
+ /// creator-申请人userid;
+ /// department-所在部门id;
+ /// sp_status-审批单状态(1-审批中;2-已通过;3-已驳回;4-已撤销;6-通过后撤销;7-已删除;10-已支付);
+ /// record_type-审批单类型属性(1-请假;2-打卡补卡;3-出差;4-外出;5-加班; 6- 调班;7-会议室预定;8-退款审批;9-红包报销审批)
+ ///
+ [NotNull] + [JsonProperty("value")] + [JsonPropertyName("value")] + public string Value { get; set; } + public ApprovalInfoFilter(string key, string value) + { + Key = key; + Value = value; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcess.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcess.cs new file mode 100644 index 000000000..3c4554e23 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcess.cs @@ -0,0 +1,19 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 流程 +/// +public class ApprovalProcess +{ + /// + /// 流程节点 + /// + [NotNull] + [JsonProperty("node_list")] + [JsonPropertyName("node_list")] + public List Nodes { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNode.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNode.cs new file mode 100644 index 000000000..9135ed3a5 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNode.cs @@ -0,0 +1,40 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 流程节点 +/// +public class ApprovalProcessNode +{ + /// + /// 节点类型 1:审批人 2:抄送人 3:办理人 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public ApprovalProcessNodeType Type { get; set; } + /// + /// 节点状态 1-审批中;2-同意;3-驳回;4-转审;11-退回给指定审批人;12-加签;13-同意并加签;14-办理;15-转交 + /// + [NotNull] + [JsonProperty("sp_status")] + [JsonPropertyName("sp_status")] + public ApprovalProcessNodeStatus Status { get; set; } + /// + /// 多人审批方式 1-会签;2-或签 3-依次审批 + /// + [CanBeNull] + [JsonProperty("apv_rel")] + [JsonPropertyName("apv_rel")] + public byte? ApvRel { get; set; } + /// + /// 子节点列表 + /// + [CanBeNull] + [JsonProperty("sub_node_list")] + [JsonPropertyName("sub_node_list")] + public List SubNodes { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNodeStatus.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNodeStatus.cs new file mode 100644 index 000000000..dee8610f9 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNodeStatus.cs @@ -0,0 +1,54 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 节点状态 +/// +public enum ApprovalProcessNodeStatus : byte +{ + /// + /// 审批中 + /// + [Description("审批中")] + UnderApproval = 1, + /// + /// 同意 + /// + [Description("同意")] + Agree = 2, + /// + /// 驳回 + /// + [Description("驳回")] + Rejection = 3, + /// + /// 转审 + /// + [Description("转审")] + TransferForReview = 4, + /// + /// 退回给指定审批人 + /// + [Description("退回给指定审批人")] + ReturnToApprover = 11, + /// + /// 加签 + /// + [Description("加签")] + Additional = 12, + /// + /// 同意并加签 + /// + [Description("同意并加签")] + AgreeAndSign = 13, + /// + /// 办理 + /// + [Description("办理")] + Processing = 14, + /// + /// 转交 + /// + [Description("转交")] + Transfer = 15, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNodeType.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNodeType.cs new file mode 100644 index 000000000..c1bfa0a0e --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessNodeType.cs @@ -0,0 +1,24 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 节点类型 +/// +public enum ApprovalProcessNodeType : byte +{ + /// + /// 审批人 + /// + [Description("审批人")] + Approver = 1, + /// + /// 抄送人 + /// + [Description("抄送人")] + CC = 2, + /// + /// 办理人 + /// + [Description("办理人")] + Handler = 3, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessSubNode.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessSubNode.cs new file mode 100644 index 000000000..f4734e9ad --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalProcessSubNode.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 子节点 +/// +public class ApprovalProcessSubNode +{ + /// + /// 处理人信息 + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } + /// + /// 审批/办理意见 + /// + [NotNull] + [JsonProperty("speech")] + [JsonPropertyName("speech")] + public string Speech { get; set; } + /// + /// 子节点状态 1-审批中;2-同意;3-驳回;4-转审;11-退回给指定审批人;12-加签;13-同意并加签;14-办理;15-转交 + /// + [NotNull] + [JsonProperty("sp_yj")] + [JsonPropertyName("sp_yj")] + public ApprovalProcessNodeStatus Status { get; set; } + /// + /// 操作时间 + /// + [NotNull] + [JsonProperty("sptime")] + [JsonPropertyName("sptime")] + public long SpTime { get; set; } + /// + /// 附件,微盘文件无法获取 + /// + [CanBeNull] + [JsonProperty("media_ids")] + [JsonPropertyName("media_ids")] + public List MediaIds { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecord.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecord.cs new file mode 100644 index 000000000..83ce480a2 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecord.cs @@ -0,0 +1,33 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 审批流程信息 +/// +public class ApprovalSpRecord +{ + /// + /// 审批节点状态 + /// + [NotNull] + [JsonProperty("sp_status")] + [JsonPropertyName("sp_status")] + public ApprovalSpRecordStatus SpStatus { get; set; } + /// + /// 节点审批方式 + /// + [NotNull] + [JsonProperty("approverattr")] + [JsonPropertyName("approverattr")] + public ApprovalApproverAttr ApproverAttr { get; set; } + /// + /// 审批节点详情,一个审批节点有多个审批人 + /// + [NotNull] + [JsonProperty("details")] + [JsonPropertyName("details")] + public List Details { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecordDetail.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecordDetail.cs new file mode 100644 index 000000000..ee2c44e17 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecordDetail.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 审批节点详情 +/// +public class ApprovalSpRecordDetail +{ + /// + /// 分支审批人 + /// + [NotNull] + [JsonProperty("approver")] + [JsonPropertyName("approver")] + public ApprovalUser Approver { get; set; } + /// + /// 审批意见 + /// + [NotNull] + [JsonProperty("speech")] + [JsonPropertyName("speech")] + public string Speech { get; set; } + /// + /// 分支审批人审批状态 + /// + [NotNull] + [JsonProperty("sp_status")] + [JsonPropertyName("sp_status")] + public ApprovalSpRecordStatus SpStatus { get; set; } + /// + /// 节点分支审批人审批操作时间戳,0表示未操作 + /// + [NotNull] + [JsonProperty("sptime")] + [JsonPropertyName("sptime")] + public long SpTime { get; set; } + /// + /// 节点分支审批人审批意见附件,微盘文件无法获取 + /// + [CanBeNull] + [JsonProperty("media_id")] + [JsonPropertyName("media_id")] + public List MediaId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecordStatus.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecordStatus.cs new file mode 100644 index 000000000..2b0ab36c9 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpRecordStatus.cs @@ -0,0 +1,44 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 审批节点状态 +/// +public enum ApprovalSpRecordStatus : byte +{ + /// + /// 审批中 + /// + [Description("审批中")] + UnderApproval = 1, + /// + /// 已同意 + /// + [Description("已同意")] + Passed = 2, + /// + /// 已驳回 + /// + [Description("已驳回")] + Rejected = 3, + /// + /// 已转审 + /// + [Description("已转审")] + Transferred = 4, + /// + /// 已退回 + /// + [Description("已退回")] + Returned = 11, + /// + /// 已加签 + /// + [Description("已加签")] + Signed = 12, + /// + /// 已同意并加签 + /// + [Description("已同意并加签")] + AgreedAndSigned = 13, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpStatus.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpStatus.cs new file mode 100644 index 000000000..fb7b02f8e --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSpStatus.cs @@ -0,0 +1,44 @@ +using System.ComponentModel; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 申请单状态 +/// +public enum ApprovalSpStatus : byte +{ + /// + /// 审批中 + /// + [Description("审批中")] + UnderApproval = 1, + /// + /// 已通过 + /// + [Description("已通过")] + Passed = 2, + /// + /// 已驳回 + /// + [Description("已驳回")] + Rejected = 3, + /// + /// 已撤销 + /// + [Description("已撤销")] + Revoked = 4, + /// + /// 通过后撤销 + /// + [Description("通过后撤销")] + RevokeAfterApproval = 6, + /// + /// 已删除 + /// + [Description("已删除")] + Deleted = 7, + /// + /// 已支付 + /// + [Description("已支付")] + Paid = 10, +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSummary.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSummary.cs new file mode 100644 index 000000000..56eaef46d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSummary.cs @@ -0,0 +1,28 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 摘要信息 +/// +public class ApprovalSummary +{ + /// + /// 摘要行信息,用于定义某一行摘要显示的内容 + /// + [NotNull] + [JsonProperty("summary_info")] + [JsonPropertyName("summary_info")] + public List SummaryInfo { get; set; } + public ApprovalSummary() + { + + } + + public ApprovalSummary(List summaryInfo) + { + SummaryInfo = summaryInfo; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSummaryInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSummaryInfo.cs new file mode 100644 index 000000000..4f31ad09e --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalSummaryInfo.cs @@ -0,0 +1,38 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 摘要信息 +/// +public class ApprovalSummaryInfo +{ + /// + /// 摘要行显示文字,用于记录列表和消息通知的显示,不要超过20个字符 + /// + [NotNull] + [StringLength(20)] + [JsonProperty("text")] + [JsonPropertyName("text")] + public string Text { get; set; } + /// + /// 摘要行显示语言,中文:zh_CN(注意不是zh-CN),英文:en。 + /// + [NotNull] + [StringLength(30)] + [JsonProperty("lang")] + [JsonPropertyName("lang")] + public string Lang { get; set; } + public ApprovalSummaryInfo() + { + + } + + public ApprovalSummaryInfo(string text, string lang = "zh_CN") + { + Text = text; + Lang = lang; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalUser.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalUser.cs new file mode 100644 index 000000000..e7e97c6c0 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ApprovalUser.cs @@ -0,0 +1,18 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 审批节点关联人员 +/// +public class ApprovalUser +{ + /// + /// 人员Id + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/AttendanceControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/AttendanceControlConfig.cs new file mode 100644 index 000000000..3c8997b90 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/AttendanceControlConfig.cs @@ -0,0 +1,55 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 假勤组件-出差/外出/加班组件配置 +/// +public class AttendanceControlConfig : ControlConfig +{ + /// + /// 假勤组件-出差/外出/加班组件 + /// + [NotNull] + [JsonProperty("attendance")] + [JsonPropertyName("attendance")] + public AttendanceConfig Attendance { get; set; } + public AttendanceControlConfig() + { + + } + + public AttendanceControlConfig(AttendanceConfig attendance) + { + Attendance = attendance; + } +} + +public class AttendanceConfig +{ + /// + /// 假勤组件类型:3-出差;4-外出;5-加班 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public byte Type { get; set; } + /// + /// 假勤组件时间选择范围 + /// + [NotNull] + [JsonProperty("date_range")] + [JsonPropertyName("date_range")] + public DateRangeConfig DateRange { get; set; } + public AttendanceConfig() + { + + } + + public AttendanceConfig(byte type, DateRangeConfig dateRange) + { + Type = type; + DateRange = dateRange; + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/AttendanceControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/AttendanceControlValue.cs new file mode 100644 index 000000000..656c13f98 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/AttendanceControlValue.cs @@ -0,0 +1,109 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 假勤组件-出差/外出/加班组件值 +/// +public class AttendanceControlValue : ControlValue +{ + /// + /// 时长 + /// + [NotNull] + [JsonProperty("attendance")] + [JsonPropertyName("attendance")] + public AttendanceValue Attendance { get; set; } + public AttendanceControlValue() + { + + } + + public AttendanceControlValue(AttendanceValue attendance) + { + Attendance = attendance; + } +} + +public class AttendanceValue +{ + /// + /// 假勤组件时间选择范围 + /// + [NotNull] + [JsonProperty("date_range")] + [JsonPropertyName("date_range")] + public DateRangeValue DateRange { get; set; } + /// + /// 假勤组件类型:1-请假;3-出差;4-外出;5-加班 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public byte Type { get; set; } + /// + /// 非必填。时长分片信息 + /// + [CanBeNull] + [JsonProperty("slice_info")] + [JsonPropertyName("slice_info")] + public AttendanceSliceInfo SliceInfo { get; set; } +} + +public class AttendanceSliceInfo +{ + /// + /// 假勤组件类型:1-请假;3-出差;4-外出;5-加班 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public byte Type { get; set; } + /// + /// 某一天的分片 + /// + [NotNull] + [JsonProperty("day_items")] + [JsonPropertyName("day_items")] + public List DayItems { get; set; } + public AttendanceSliceInfo() + { + + } + + public AttendanceSliceInfo(byte type, List dayItems) + { + Type = type; + DayItems = dayItems; + } +} + +public class AttendanceSliceDayItem +{ + /// + /// 当天零点时间戳 (当天的东八区的零点时间戳) + /// + [NotNull] + [JsonProperty("daytime")] + [JsonPropertyName("daytime")] + public long Daytime { get; set; } + /// + /// 某一天的时长,秒数,可以为0,(type为halfday时:加班:需为8640整倍数,其他:需为43200的整倍数,type为hour时需为360的整倍数) + /// + [NotNull] + [JsonProperty("duration")] + [JsonPropertyName("duration")] + public long Duration { get; set; } + public AttendanceSliceDayItem() + { + + } + + public AttendanceSliceDayItem(long daytime, long duration) + { + Daytime = daytime; + Duration = duration; + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ContactControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ContactControlConfig.cs new file mode 100644 index 000000000..2c9ca393b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ContactControlConfig.cs @@ -0,0 +1,75 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 成员控件配置 +/// +public class ContactControlConfig : ControlConfig +{ + /// + /// 成员、部门控件 + /// + [NotNull] + [JsonProperty("contact")] + [JsonPropertyName("contact")] + public ContactConfig Contact { get; set; } + public ContactControlConfig() + { + + } + + public ContactControlConfig(ContactConfig contact) + { + Contact = contact; + } +} + +public class ContactConfig +{ + /// + /// single-单选、multi-多选 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public string Type { get; set; } + /// + /// user-成员、department-部门 + /// + [NotNull] + [JsonProperty("mode")] + [JsonPropertyName("mode")] + public string Mode { get; set; } + public ContactConfig() + { + + } + + private ContactConfig(string type, string mode) + { + Type = type; + Mode = mode; + } + + public static ContactConfig SingleUser() + { + return new ContactConfig("single", "user"); + } + + public static ContactConfig SingleDepartment() + { + return new ContactConfig("single", "department"); + } + + public static ContactConfig MultipleUser() + { + return new ContactConfig("multi", "user"); + } + + public static ContactConfig MultipleDepartment() + { + return new ContactConfig("multi", "department"); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ContactControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ContactControlValue.cs new file mode 100644 index 000000000..27121ce3e --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ContactControlValue.cs @@ -0,0 +1,7 @@ +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 成员/部门控件值 +/// +public abstract class ContactControlValue : ControlValue +{ +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/Control.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/Control.cs new file mode 100644 index 000000000..9df1dd23e --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/Control.cs @@ -0,0 +1,27 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 模板控件 +/// +[Newtonsoft.Json.JsonConverter(typeof(ControlNewtonsoftJsonConverter))] +[System.Text.Json.Serialization.JsonConverter(typeof(ControlSystemTextJsonConverter))] +public class Control +{ + /// + /// 控件属性 + /// + [NotNull] + [JsonProperty("property")] + [JsonPropertyName("property")] + public ControlInfo Property { get; set; } + /// + /// 控件配置 + /// + [CanBeNull] + [JsonProperty("config")] + [JsonPropertyName("config")] + public ControlConfig Config { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlConfig.cs new file mode 100644 index 000000000..83b0f6825 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlConfig.cs @@ -0,0 +1,7 @@ +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 控件配置 +/// +public abstract class ControlConfig +{ +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlConfigFactory.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlConfigFactory.cs new file mode 100644 index 000000000..b97d2ff2e --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlConfigFactory.cs @@ -0,0 +1,50 @@ +using Newtonsoft.Json.Linq; +using System.Text.Json; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +internal static class ControlConfigFactory +{ + /// + /// 根据控件类型创建配置(System.Text.Json) + /// + public static ControlConfig CreateConfig(string controlType, JsonElement configElement) + { + return controlType switch + { + "Attendance" => JsonSerializer.Deserialize(configElement.GetRawText()), + "Contact" => JsonSerializer.Deserialize(configElement.GetRawText()), + "Date" => JsonSerializer.Deserialize(configElement.GetRawText()), + "DateRange" => JsonSerializer.Deserialize(configElement.GetRawText()), + "File" => JsonSerializer.Deserialize(configElement.GetRawText()), + "Location" => JsonSerializer.Deserialize(configElement.GetRawText()), + "RelatedApproval" => JsonSerializer.Deserialize(configElement.GetRawText()), + "Selector" => JsonSerializer.Deserialize(configElement.GetRawText()), + "Table" => JsonSerializer.Deserialize(configElement.GetRawText()), + "Tips" => JsonSerializer.Deserialize(configElement.GetRawText()), + // 添加其他控件类型... + _ => null + }; + } + + /// + /// 根据控件类型创建配置(Newtonsoft.Json) + /// + public static ControlConfig CreateConfig(string controlType, JToken configToken) + { + return controlType switch + { + "Attendance" => configToken.ToObject(), + "Contact" => configToken.ToObject(), + "Date" => configToken.ToObject(), + "DateRange" => configToken.ToObject(), + "File" => configToken.ToObject(), + "Location" => configToken.ToObject(), + "RelatedApproval" => configToken.ToObject(), + "Selector" => configToken.ToObject(), + "Table" => configToken.ToObject(), + "Tips" => configToken.ToObject(), + // 添加其他控件类型... + _ => null + }; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlData.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlData.cs new file mode 100644 index 000000000..2863784ae --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlData.cs @@ -0,0 +1,202 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 审批申请详情 +/// +public class ControlData +{ + /// + /// 控件类型 + /// + /// + /// Text-文本
+ /// Textarea-多行文本
+ /// Number-数字
+ /// Money-金额
+ /// Date-日期/日期+时间
+ /// Selector-单选/多选
+ /// Contact-成员/部门
+ /// Tips-说明文字
+ /// File-附件
+ /// Table-明细
+ /// Location-位置
+ /// RelatedApproval-关联审批单
+ /// Formula-公式
+ /// DateRange-时长 + ///
+ [NotNull] + [JsonProperty("control")] + [JsonPropertyName("control")] + public string Control { get; set; } + /// + /// 控件id:控件的唯一id,可通过“获取审批模板详情”接口获取 + /// + [NotNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public string Id { get; set; } + /// + /// 控件值 ,需在此为申请人在各个控件中填写内容不同控件有不同的赋值参数 + /// + /// + /// 模板配置的控件属性为必填时,对应value值需要有值。 + /// + [NotNull] + [JsonProperty("value")] + [JsonPropertyName("value")] + public ControlValue Value { get; set; } + public ControlData() + { + + } + + private ControlData(string id, string control, ControlValue value) + { + Id = id; + Control = control; + Value = value; + } + + /// + /// 创建一个Text控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData Text(string id, TextControlValue value) + { + return new ControlData(id, "Text", value); + } + /// + /// 创建一个Textarea控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData Textarea(string id, TextareaControlValue value) + { + return new ControlData(id, "Textarea", value); + } + /// + /// 创建一个Number控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData Number(string id, NumberControlValue value) + { + return new ControlData(id, "Number", value); + } + /// + /// 创建一个Money控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData Money(string id, MoneyControlValue value) + { + return new ControlData(id, "Money", value); + } + /// + /// 创建一个Date控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData Date(string id, DateControlValue value) + { + return new ControlData(id, "Date", value); + } + /// + /// 创建一个Selector控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData Selector(string id, SelectorControlValue value) + { + return new ControlData(id, "Selector", value); + } + /// + /// 创建一个Contact控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData Contact(string id, ContactControlValue value) + { + return new ControlData(id, "Contact", value); + } + /// + /// 创建一个Tips控件 + /// + /// 控件Id + /// + public static ControlData Tips(string id) + { + return new ControlData(id, "Tips", null); + } + /// + /// 创建一个File控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData File(string id, FileControlValue value) + { + return new ControlData(id, "File", value); + } + /// + /// 创建一个Table控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData Table(string id, TableControlValue value) + { + return new ControlData(id, "Table", value); + } + /// + /// 创建一个Location控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData Location(string id, LocationControlValue value) + { + return new ControlData(id, "Location", value); + } + /// + /// 创建一个RelatedApproval控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData RelatedApproval(string id, RelatedApprovalControlValue value) + { + return new ControlData(id, "RelatedApproval", value); + } + /// + /// 创建一个Formula控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData Formula(string id, FormulaControlValue value) + { + return new ControlData(id, "Formula", value); + } + /// + /// 创建一个DateRange控件 + /// + /// 控件Id + /// 控件值 + /// + public static ControlData DateRange(string id, DateRangeControlValue value) + { + return new ControlData(id, "DateRange", value); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlInfo.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlInfo.cs new file mode 100644 index 000000000..425289a13 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlInfo.cs @@ -0,0 +1,95 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 模板控件属性 +/// +public class ControlInfo +{ + /// + /// 控件id。1-模版内控件id必须唯一;2-控件id格式:control-数字,如"Text-01" + /// + [NotNull] + [JsonProperty("id")] + [JsonPropertyName("id")] + public string Id { get; set; } + /// + /// 控件类型 + /// + /// + /// Text-文本
+ /// Textarea-多行文本
+ /// Number-数字
+ /// Money-金额
+ /// Date-日期/日期+时间
+ /// Selector-单选/多选
+ /// Contact-成员/部门
+ /// Tips-说明文字
+ /// File-附件
+ /// Table-明细
+ /// Location-位置
+ /// RelatedApproval-关联审批单
+ /// DateRange-时长
+ /// PhoneNumber-电话号码
+ /// Vacation-假期
+ /// Attendance-外出/出差/加班
+ /// BankAccount-收款账户
+ /// 以上为目前可支持的控件类型 + ///
+ [NotNull] + [JsonProperty("control")] + [JsonPropertyName("control")] + public string Control { get; set; } + /// + /// 控件名称 + /// + [NotNull] + [JsonProperty("title")] + [JsonPropertyName("title")] + public List Title { get; set; } + /// + /// 控件说明,假勤组件(Vacation、Attendance)暂不支持设置 + /// + [CanBeNull] + [JsonProperty("placeholder")] + [JsonPropertyName("placeholder")] + public List Placeholder { get; set; } + /// + /// 控件是否必填。0-非必填;1-必填;默认为0;假勤组件(Vacation、Attendance)不支持设置非必填 + /// + [CanBeNull] + [JsonProperty("require")] + [JsonPropertyName("require")] + public byte Require { get; set; } + /// + /// 控件是否可打印。0-可打印;1-不可打印;默认为0;假勤组件(Vacation、Attendance)不支持设置不可打印 + /// + [CanBeNull] + [JsonProperty("un_print")] + [JsonPropertyName("un_print")] + public byte UnPrint { get; set; } + /// + /// un_replace + /// + [CanBeNull] + [JsonProperty("un_replace")] + [JsonPropertyName("un_replace")] + public byte UnReplace { get; set; } + /// + /// inner_id + /// + [CanBeNull] + [JsonProperty("inner_id")] + [JsonPropertyName("inner_id")] + public string InnerId { get; set; } + /// + /// 控件是否隐藏 + /// + [CanBeNull] + [JsonProperty("display")] + [JsonPropertyName("display")] + public byte Display { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlPlaceholder.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlPlaceholder.cs new file mode 100644 index 000000000..114fa2e93 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlPlaceholder.cs @@ -0,0 +1,37 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 控件说明 +/// +public class ControlPlaceholder +{ + /// + /// 控件说明。需满足以下条件:长度不得超过80个字符。 + /// + [NotNull] + [StringLength(80)] + [JsonProperty("text")] + [JsonPropertyName("text")] + public string Text { get; set; } + /// + /// 显示语言,中文:zh_CN(注意不是zh-CN);若text填写,则该项为必填 + /// + [NotNull] + [JsonProperty("lang")] + [JsonPropertyName("lang")] + public string Lang { get; set; } + public ControlPlaceholder() + { + + } + + public ControlPlaceholder(string text, string lang = "zh_CN") + { + Text = text; + Lang = lang; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlTtile.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlTtile.cs new file mode 100644 index 000000000..7496de8e2 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlTtile.cs @@ -0,0 +1,37 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 控件名称 +/// +public class ControlTtile +{ + /// + /// 控件名称。需满足以下条件:1-控件名称不得和现有控件名称重复;2-长度不得超过40个字符。3-Attendance-外出/出差/加班控件title固定为外出/出差/加班,暂不支持自定义 + /// + [NotNull] + [StringLength(40)] + [JsonProperty("text")] + [JsonPropertyName("text")] + public string Text { get; set; } + /// + /// 显示语言,中文:zh_CN(注意不是zh-CN) + /// + [NotNull] + [JsonProperty("lang")] + [JsonPropertyName("lang")] + public string Lang { get; set; } + public ControlTtile() + { + + } + + public ControlTtile(string text, string lang = "zh_CN") + { + Text = text; + Lang = lang; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlValue.cs new file mode 100644 index 000000000..832a206a7 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/ControlValue.cs @@ -0,0 +1,8 @@ +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 控件值 +/// +public abstract class ControlValue +{ + +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateControlConfig.cs new file mode 100644 index 000000000..7593456ba --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateControlConfig.cs @@ -0,0 +1,38 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 日期/日期+时间控件配置 +/// +public class DateControlConfig : ControlConfig +{ + /// + /// 日期/日期+时间内容 + /// + [NotNull] + [JsonProperty("date")] + [JsonPropertyName("date")] + public DateConfig Date { get; set; } + public DateControlConfig() + { + + } + + public DateControlConfig(DateConfig date) + { + Date = date; + } +} + +public class DateConfig +{ + /// + /// 时间展示类型:day-日期;hour-日期+时间 ,和对应模板控件属性一致 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public string Type { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateControlValue.cs new file mode 100644 index 000000000..143ac3a60 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateControlValue.cs @@ -0,0 +1,65 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 日期/日期+时间控件值 +/// +public class DateControlValue : ControlValue +{ + /// + /// 金额内容,在此填写金额控件的输入值 + /// + [NotNull] + [JsonProperty("date")] + [JsonPropertyName("date")] + public DateValue Date { get; set; } + public DateControlValue() + { + + } + + public DateControlValue(DateValue date) + { + Date = date; + } +} + +public class DateValue +{ + /// + /// 时间展示类型:day-日期;hour-日期+时间 ,和对应模板控件属性一致 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public string Type { get; set; } + /// + /// 时间戳-字符串类型,在此填写日期/日期+时间控件的选择值,以此为准 + /// + [NotNull] + [JsonProperty("s_timestamp")] + [JsonPropertyName("s_timestamp")] + public string Timestamp { get; set; } + public DateValue() + { + + } + + private DateValue(string type, string timestamp) + { + Type = type; + Timestamp = timestamp; + } + + public static DateValue Day(string timestamp) + { + return new DateValue("day", timestamp); + } + + public static DateValue Hour(string timestamp) + { + return new DateValue("hour", timestamp); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeConfig.cs new file mode 100644 index 000000000..6be00ef61 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeConfig.cs @@ -0,0 +1,43 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 时长配置 +/// +public class DateRangeConfig +{ + /// + /// 时间展示类型:halfday-日期;hour-日期+时间 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public string Type { get; set; } + /// + /// 0-自然日;1-工作日 + /// + [NotNull] + [JsonProperty("official_holiday")] + [JsonPropertyName("official_holiday")] + public byte OfficialHoliday { get; set; } + /// + /// 一天的时长(单位为秒),必须大于0小于等于86400 + /// + [NotNull] + [JsonProperty("perday_duration")] + [JsonPropertyName("perday_duration")] + public int PerdayDuration { get; set; } + public DateRangeConfig() + { + + } + + public DateRangeConfig(string type, byte officialHoliday, int perdayDuration) + { + Type = type; + OfficialHoliday = officialHoliday; + PerdayDuration = perdayDuration; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeControlConfig.cs new file mode 100644 index 000000000..318c9ccd8 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeControlConfig.cs @@ -0,0 +1,27 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 时长组件配置 +/// +public class DateRangeControlConfig : ControlConfig +{ + /// + /// 时长组件 + /// + [NotNull] + [JsonProperty("date_range")] + [JsonPropertyName("date_range")] + public DateRangeConfig DateRange { get; set; } + public DateRangeControlConfig() + { + + } + + public DateRangeControlConfig(DateRangeConfig dateRange) + { + DateRange = dateRange; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeControlValue.cs new file mode 100644 index 000000000..3816a71e3 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DateRangeControlValue.cs @@ -0,0 +1,71 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 时长控件值 +/// +public class DateRangeControlValue : ControlValue +{ + /// + /// 时长 + /// + [NotNull] + [JsonProperty("date_range")] + [JsonPropertyName("date_range")] + public DateRangeValue DateRange { get; set; } + public DateRangeControlValue() + { + + } + + public DateRangeControlValue(DateRangeValue dateRange) + { + DateRange = dateRange; + } +} + +public class DateRangeValue +{ + /// + /// 时长粒度:halfday:按天 hour:按小时 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public string Type { get; set; } + /// + /// 开始时间,unix时间戳。当type 为halfday时,取值只能为固定两个时间点 上午:当天00:00:00点时间戳 下午:当天12:00:00时间戳 + /// + [NotNull] + [JsonProperty("new_begin")] + [JsonPropertyName("new_begin")] + public long NewBegin { get; set; } + /// + /// 结束时间,unix时间戳。 当type 为halfday时,取值只能为固定两个时间点 上午:当天00:00:00点时间戳 下午:当天12:00:00时间戳 + /// + [NotNull] + [JsonProperty("new_end")] + [JsonPropertyName("new_end")] + public long NewEnd { get; set; } + /// + /// 时长范围, 单位秒 + /// + [NotNull] + [JsonProperty("new_duration")] + [JsonPropertyName("new_duration")] + public long NewDuration { get; set; } + public DateRangeValue() + { + + } + + public DateRangeValue(string type, long newBegin, long newEnd, long newDuration) + { + Type = type; + NewBegin = newBegin; + NewEnd = newEnd; + NewDuration = newDuration; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DepartmentControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DepartmentControlValue.cs new file mode 100644 index 000000000..268d0150d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/DepartmentControlValue.cs @@ -0,0 +1,66 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 部门控件值 +/// +public class DepartmentControlValue : ContactControlValue +{ + /// + /// 所选部门内容,即申请人在此控件选择的部门,多选模式下可能有多个 + /// + [NotNull] + [JsonProperty("departments")] + [JsonPropertyName("departments")] + public List Departments { get; set; } + public DepartmentControlValue() + { + + } + + private DepartmentControlValue(List departments) + { + Departments = departments; + } + + public static DepartmentControlValue Single(DepartmentValue department) + { + return new DepartmentControlValue(new List { department }); + } + + public static DepartmentControlValue Multiple(List departments) + { + return new DepartmentControlValue(departments); + } +} + +public class DepartmentValue +{ + /// + /// 所选部门id + /// + [NotNull] + [JsonProperty("openapi_id")] + [JsonPropertyName("openapi_id")] + public string DepartmentId { get; set; } + /// + /// 所选部门名 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string Name { get; set; } + public DepartmentValue() + { + + } + + public DepartmentValue(string departmentId, string name) + { + DepartmentId = departmentId; + Name = name; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FileControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FileControlConfig.cs new file mode 100644 index 000000000..bd6d082e4 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FileControlConfig.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 附件控件配置 +/// +public class FileControlConfig : ControlConfig +{ + /// + /// 附件控件 + /// + [NotNull] + [JsonProperty("file")] + [JsonPropertyName("file")] + public FileConfig File { get; set; } + public FileControlConfig() + { + + } + + public FileControlConfig(FileConfig file) + { + File = file; + } +} + +public class FileConfig +{ + /// + /// 是否只允许拍照,1--是, 0--否 + /// + [NotNull] + [JsonProperty("is_only_photo")] + [JsonPropertyName("is_only_photo")] + public byte IsOnlyPhoto { get; set; } + public FileConfig() + { + + } + + public FileConfig(byte isOnlyPhoto) + { + IsOnlyPhoto = isOnlyPhoto; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FileControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FileControlValue.cs new file mode 100644 index 000000000..ad5a31b95 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FileControlValue.cs @@ -0,0 +1,76 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 附件控件值 +/// +public class FileControlValue : ControlValue +{ + /// + /// 附件列表 + /// + [NotNull] + [JsonProperty("files")] + [JsonPropertyName("files")] + public List Files { get; set; } + public FileControlValue() + { + + } + + public FileControlValue(List files) + { + Files = files; + } +} + +public class FileValue +{ + /// + /// 文件id,该id为临时素材上传接口返回的的media_id,注:提单后将作为单据内容转换为长期文件存储;目前一个审批申请单,全局仅支持上传6个附件,否则将失败。 + /// + [NotNull] + [JsonProperty("file_id")] + [JsonPropertyName("file_id")] + public string FileId { get; set; } + /// + /// 文件名称,类型为string,如果没有可以填空字符串。 + /// + [CanBeNull] + [JsonProperty("file_name")] + [JsonPropertyName("file_name")] + public string FileName { get; set; } + /// + /// 文件大小,类型为number,如果没有可以填空字符串。 + /// + [CanBeNull] + [JsonProperty("file_size")] + [JsonPropertyName("file_size")] + public long? FileSize { get; set; } + /// + /// 文件类型,类型为string,如果没有可以填空字符串。 + /// + [CanBeNull] + [JsonProperty("file_type")] + [JsonPropertyName("file_type")] + public string FileType { get; set; } + /// + /// 文件地址,类型为string,如果没有可以填空字符串。 + /// + [CanBeNull] + [JsonProperty("file_url")] + [JsonPropertyName("file_url")] + public string FileUrl { get; set; } + public FileValue() + { + + } + + public FileValue(string fileId) + { + FileId = fileId; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FormulaControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FormulaControlValue.cs new file mode 100644 index 000000000..ca1be35eb --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/FormulaControlValue.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 公式控件值 +/// +public class FormulaControlValue : ControlValue +{ + /// + /// 公式 + /// + [NotNull] + [JsonProperty("formula")] + [JsonPropertyName("formula")] + public FormulaValue Formula { get; set; } + public FormulaControlValue() + { + + } + + public FormulaControlValue(FormulaValue formula) + { + Formula = formula; + } +} + +public class FormulaValue +{ + /// + /// 公式的值,提交表单时无需填写,后台自动计算 + /// + [NotNull] + [JsonProperty("value")] + [JsonPropertyName("value")] + public string Value { get; set; } + public FormulaValue() + { + + } + + public FormulaValue(string value) + { + Value = value; + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/LocationControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/LocationControlConfig.cs new file mode 100644 index 000000000..f1a0243d6 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/LocationControlConfig.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 位置控件配置 +/// +public class LocationControlConfig : ControlConfig +{ + /// + /// 位置控件 + /// + [NotNull] + [JsonProperty("location")] + [JsonPropertyName("location")] + public LocationConfig Location { get; set; } + public LocationControlConfig() + { + + } + + public LocationControlConfig(LocationConfig location) + { + Location = location; + } +} + +public class LocationConfig +{ + /// + /// 距离,目前支持100、200、300 + /// + [NotNull] + [JsonProperty("distance")] + [JsonPropertyName("distance")] + public int Distance { get; set; } + public LocationConfig() + { + + } + + public LocationConfig(int distance) + { + Distance = distance; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/LocationControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/LocationControlValue.cs new file mode 100644 index 000000000..9d8b18358 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/LocationControlValue.cs @@ -0,0 +1,79 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 位置控件值 +/// +public class LocationControlValue : ControlValue +{ + /// + /// 位置 + /// + [NotNull] + [JsonProperty("location")] + [JsonPropertyName("location")] + public LocationValue Location { get; set; } + public LocationControlValue() + { + + } + + public LocationControlValue(LocationValue location) + { + Location = location; + } +} + +public class LocationValue +{ + /// + /// 纬度,精确到6位小数 + /// + [NotNull] + [JsonProperty("latitude")] + [JsonPropertyName("latitude")] + public decimal Latitude { get; set; } + /// + /// 经度,精确到6位小数 + /// + [NotNull] + [JsonProperty("longitude")] + [JsonPropertyName("longitude")] + public decimal Longitude { get; set; } + /// + /// 地点标题 + /// + [NotNull] + [JsonProperty("title")] + [JsonPropertyName("title")] + public string Title { get; set; } + /// + /// 地点详情地址 + /// + [NotNull] + [JsonProperty("address")] + [JsonPropertyName("address")] + public string Address { get; set; } + /// + /// 选择地点的时间 + /// + [NotNull] + [JsonProperty("time")] + [JsonPropertyName("time")] + public long Time { get; set; } + public LocationValue() + { + + } + + public LocationValue(decimal latitude, decimal longitude, string title, string address, long time) + { + Latitude = latitude; + Longitude = longitude; + Title = title; + Address = address; + Time = time; + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/MemberControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/MemberControlValue.cs new file mode 100644 index 000000000..f87d7be49 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/MemberControlValue.cs @@ -0,0 +1,66 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 成员控件值 +/// +public class MemberControlValue : ContactControlValue +{ + /// + /// 所选成员内容,即申请人在此控件选择的成员,多选模式下可以有多个 + /// + [NotNull] + [JsonProperty("members")] + [JsonPropertyName("members")] + public List Members { get; set; } + public MemberControlValue() + { + + } + + private MemberControlValue(List members) + { + Members = members; + } + + public static MemberControlValue Single(MemberValue member) + { + return new MemberControlValue(new List { member }); + } + + public static MemberControlValue Multiple(List members) + { + return new MemberControlValue(members); + } +} + +public class MemberValue +{ + /// + /// 所选成员的userid + /// + [NotNull] + [JsonProperty("userid")] + [JsonPropertyName("userid")] + public string UserId { get; set; } + /// + /// 成员名 + /// + [NotNull] + [JsonProperty("name")] + [JsonPropertyName("name")] + public string Name { get; set; } + public MemberValue() + { + + } + + public MemberValue(string userId, string name) + { + UserId = userId; + Name = name; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/MoneyControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/MoneyControlValue.cs new file mode 100644 index 000000000..57861c4db --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/MoneyControlValue.cs @@ -0,0 +1,27 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 金额控件值 +/// +public class MoneyControlValue : ControlValue +{ + /// + /// 金额内容,在此填写金额控件的输入值 + /// + [NotNull] + [JsonProperty("new_money")] + [JsonPropertyName("new_money")] + public string NewMoney { get; set; } + public MoneyControlValue() + { + + } + + public MoneyControlValue(decimal newMoney) + { + NewMoney = newMoney.ToString(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/NumberControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/NumberControlValue.cs new file mode 100644 index 000000000..41cb7e5d2 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/NumberControlValue.cs @@ -0,0 +1,27 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 数字控件值 +/// +public class NumberControlValue : ControlValue +{ + /// + /// 数字内容,在此填写数字控件的输入值 + /// + [NotNull] + [JsonProperty("new_number")] + [JsonPropertyName("new_number")] + public string NewMumber { get; set; } + public NumberControlValue() + { + + } + + public NumberControlValue(decimal newMumber) + { + NewMumber = newMumber.ToString(); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/RelatedApprovalControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/RelatedApprovalControlConfig.cs new file mode 100644 index 000000000..4dcd885e4 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/RelatedApprovalControlConfig.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 关联审批单控件配置 +/// +public class RelatedApprovalControlConfig : ControlConfig +{ + /// + /// 关联审批单控件 + /// + [NotNull] + [JsonProperty("related_approval")] + [JsonPropertyName("related_approval")] + public RelatedApprovalConfig RelatedApproval { get; set; } + public RelatedApprovalControlConfig() + { + + } + + public RelatedApprovalControlConfig(RelatedApprovalConfig relatedApproval) + { + RelatedApproval = relatedApproval; + } +} + +public class RelatedApprovalConfig +{ + /// + /// 关联审批单的template_id ,不填时表示可以关联所有模版,该template_id可通过获取审批模版接口获取 + /// + [NotNull] + [JsonProperty("template_id")] + [JsonPropertyName("template_id")] + public string TemplateId { get; set; } + public RelatedApprovalConfig() + { + + } + + public RelatedApprovalConfig(string templateId) + { + TemplateId = templateId; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/RelatedApprovalControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/RelatedApprovalControlValue.cs new file mode 100644 index 000000000..750060c67 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/RelatedApprovalControlValue.cs @@ -0,0 +1,48 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 关联审批单控件值 +/// +public class RelatedApprovalControlValue : ControlValue +{ + /// + /// 关联审批单 + /// + [NotNull] + [JsonProperty("related_approval")] + [JsonPropertyName("related_approval")] + public RelatedApprovalValue RelatedApproval { get; set; } + public RelatedApprovalControlValue() + { + + } + + public RelatedApprovalControlValue(RelatedApprovalValue relatedApproval) + { + RelatedApproval = relatedApproval; + } +} + + +public class RelatedApprovalValue +{ + /// + /// 关联审批单的审批单号 + /// + [NotNull] + [JsonProperty("sp_no")] + [JsonPropertyName("sp_no")] + public string SpNo { get; set; } + public RelatedApprovalValue() + { + + } + + public RelatedApprovalValue(string spNo) + { + SpNo = spNo; + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/SelectorControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/SelectorControlConfig.cs new file mode 100644 index 000000000..c4e695e4c --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/SelectorControlConfig.cs @@ -0,0 +1,122 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 选择控件配置 +/// +public class SelectorControlConfig : ControlConfig +{ + /// + /// 选择控件内容,即申请人在此控件选择的选项内容 + /// + [NotNull] + [JsonProperty("selector")] + [JsonPropertyName("selector")] + public SelectorConfig Selector { get; set; } + public SelectorControlConfig() + { + + } + + public SelectorControlConfig(SelectorConfig selector) + { + Selector = selector; + } +} + +public class SelectorConfig +{ + /// + /// 选择方式:single-单选;multi-多选 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public string Type { get; set; } + /// + /// 多选选项,多选属性的选择控件允许输入多个 + /// + [NotNull] + [JsonProperty("options")] + [JsonPropertyName("options")] + public List Options { get; set; } + public SelectorConfig() + { + + } + + private SelectorConfig(string type, List options) + { + Type = type; + Options = options; + } + + public static SelectorConfig Single(List options) + { + return new SelectorConfig("single", options); + } + + public static SelectorConfig Multiple(List options) + { + return new SelectorConfig("multi", options); + } +} + +public class SelectorOption +{ + /// + /// 时间展示类型:day-日期;hour-日期+时间 ,和对应模板控件属性一致 + /// + [NotNull] + [JsonProperty("key")] + [JsonPropertyName("key")] + public string Key { get; set; } + /// + /// 选项说明 + /// + [NotNull] + [JsonProperty("value")] + [JsonPropertyName("value")] + public List Value { get; set; } + public SelectorOption() + { + + } + + public SelectorOption(string key, List value) + { + Key = key; + Value = value; + } +} + +public class SelectorOptionValue +{ + /// + /// 名称 + /// + [NotNull] + [JsonProperty("text")] + [JsonPropertyName("text")] + public string Text { get; set; } + /// + /// 显示语言 + /// + [NotNull] + [JsonProperty("lang")] + [JsonPropertyName("lang")] + public string Lang { get; set; } + public SelectorOptionValue() + { + + } + + public SelectorOptionValue(string text, string lang = "zh_CN") + { + Text = text; + Lang = lang; + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/SelectorControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/SelectorControlValue.cs new file mode 100644 index 000000000..15a616c97 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/SelectorControlValue.cs @@ -0,0 +1,95 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 单选/多选控件值 +/// +public class SelectorControlValue : ControlValue +{ + /// + /// 单选/多选内容 + /// + [NotNull] + [JsonProperty("selector")] + [JsonPropertyName("selector")] + public SelectorValue Selector { get; set; } + public SelectorControlValue() + { + + } + + public SelectorControlValue(SelectorValue selector) + { + Selector = selector; + } +} + +public class SelectorValue +{ + /// + /// 选择方式:single-单选;multi-多选 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public string Type { get; set; } + /// + /// 多选选项,多选属性的选择控件允许输入多个 + /// + [NotNull] + [JsonProperty("options")] + [JsonPropertyName("options")] + public List Options { get; set; } + public SelectorValue() + { + + } + + private SelectorValue(string type, List options) + { + Type = type; + Options = options; + } + /// + /// 创建一个单选选项 + /// + /// + /// + public static SelectorValue Single(SelectorValueOption option) + { + return new SelectorValue("single", new List { option }); + } + + /// + /// 创建一个多选选项 + /// + /// + /// + public static SelectorValue Multiple(List options) + { + return new SelectorValue("multi", options); + } +} + +public class SelectorValueOption +{ + /// + /// 选项key,可通过“获取审批模板详情”接口获得 + /// + [NotNull] + [JsonProperty("key")] + [JsonPropertyName("key")] + public string Key { get; set; } + public SelectorValueOption() + { + + } + + public SelectorValueOption(string key) + { + Key = key; + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TableControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TableControlConfig.cs new file mode 100644 index 000000000..2b6d4aebe --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TableControlConfig.cs @@ -0,0 +1,56 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 明细控件配置 +/// +public class TableControlConfig : ControlConfig +{ + /// + /// 明细控件 + /// + [NotNull] + [JsonProperty("table")] + [JsonPropertyName("table")] + public TableConfig Table { get; set; } + public TableControlConfig() + { + + } + + public TableControlConfig(TableConfig table) + { + Table = table; + } +} + +public class TableConfig +{ + /// + /// 打印格式;0-合并成一行打印,1-拆分成多行打印 + /// + [NotNull] + [JsonProperty("print_format")] + [JsonPropertyName("print_format")] + public byte PrintFormat { get; set; } + /// + /// 明细内容,一个明细控件可能包含多个子控件,每个子控件的属性和控件相同 + /// + [NotNull] + [JsonProperty("children")] + [JsonPropertyName("children")] + public List Children { get; set; } + public TableConfig() + { + + } + + public TableConfig(byte printFormat, List children) + { + PrintFormat = printFormat; + Children = children; + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TableControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TableControlValue.cs new file mode 100644 index 000000000..8dac8ea13 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TableControlValue.cs @@ -0,0 +1,51 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 明细控件值 +/// +public class TableControlValue : ControlValue +{ + /// + /// 明细内容,一个明细控件可能包含多个子明细 + /// + [NotNull] + [JsonProperty("children")] + [JsonPropertyName("children")] + public List Children { get; set; } + public TableControlValue() + { + + } + + public TableControlValue(List children) + { + Children = children; + } +} + +public class TableValue +{ + /// + /// 子明细列表,在此填写子明细的所有子控件的值,子控件的数据结构同一般控件。 + /// + /// + /// 注意:不能为空数组,至少需要包含一个子明细,子明细中必须包括模板中设置的全部子控件,如果子明细为空,则需要将所有子控件的值设为空 + /// + [NotNull] + [JsonProperty("list")] + [JsonPropertyName("list")] + public List List { get; set; } + public TableValue() + { + + } + + public TableValue(List list) + { + List = list; + } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TemplateContent.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TemplateContent.cs new file mode 100644 index 000000000..7bd41bad7 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TemplateContent.cs @@ -0,0 +1,19 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 模版控件定义 +/// +public class TemplateContent +{ + /// + /// 控件数组,模版中可以设置多个控件类型,排列顺序和管理端展示的相同 + /// + [NotNull] + [JsonProperty("controls")] + [JsonPropertyName("controls")] + public List Controls { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TemplateName.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TemplateName.cs new file mode 100644 index 000000000..fc81a46bb --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TemplateName.cs @@ -0,0 +1,35 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 模版名称定义 +/// +public class TemplateName +{ + /// + /// 模板名称 + /// + [NotNull] + [JsonProperty("text")] + [JsonPropertyName("text")] + public string Text { get; set; } + /// + /// 多语言名称 + /// + [NotNull] + [JsonProperty("lang")] + [JsonPropertyName("lang")] + public string Lang { get; set; } + public TemplateName() + { + + } + + public TemplateName(string text, string lang = "zh_CN") + { + Text = text; + Lang = lang; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TextControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TextControlValue.cs new file mode 100644 index 000000000..7d79b16ca --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TextControlValue.cs @@ -0,0 +1,27 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 文本控件值 +/// +public class TextControlValue : ControlValue +{ + /// + /// 文本内容,在此填写文本/多行文本控件的输入值。文本控件Text内容不支持包含换行符。 + /// + [NotNull] + [JsonProperty("text")] + [JsonPropertyName("text")] + public string Text { get; set; } + public TextControlValue() + { + + } + + public TextControlValue(string text) + { + Text = text; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TextareaControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TextareaControlValue.cs new file mode 100644 index 000000000..bece9895a --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TextareaControlValue.cs @@ -0,0 +1,27 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 多行文本控件值 +/// +public class TextareaControlValue : ControlValue +{ + /// + /// 文本内容,在此填写文本/多行文本控件的输入值。文本控件Text内容不支持包含换行符。 + /// + [NotNull] + [JsonProperty("text")] + [JsonPropertyName("text")] + public string Text { get; set; } + public TextareaControlValue() + { + + } + + public TextareaControlValue(string text) + { + Text = text; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TipsControlConfig.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TipsControlConfig.cs new file mode 100644 index 000000000..d88aa0cab --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/TipsControlConfig.cs @@ -0,0 +1,169 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 说明文字控件配置 +/// +public class TipsControlConfig : ControlConfig +{ + /// + /// 说明文字控件 + /// + [NotNull] + [JsonProperty("tips")] + [JsonPropertyName("tips")] + public TipsConfig Tips { get; set; } + public TipsControlConfig() + { + + } + + public TipsControlConfig(TipsConfig tips) + { + Tips = tips; + } +} + +public class TipsConfig +{ + /// + /// 说明文字数组,元素为不同语言的富文本说明文字 + /// + [NotNull] + [JsonProperty("tips_content")] + [JsonPropertyName("tips_content")] + public List TipsContents { get; set; } + public TipsConfig() + { + + } + + public TipsConfig(List tipsContents) + { + TipsContents = tipsContents; + } +} + +public class TipsContent +{ + /// + /// 某个语言的富文本说明 + /// + [NotNull] + [JsonProperty("text")] + [JsonPropertyName("text")] + public TipsContentText Text { get; set; } + /// + /// 多语言名称 + /// + [NotNull] + [JsonProperty("lang")] + [JsonPropertyName("lang")] + public string Lang { get; set; } + public TipsContent() + { + + } + + public TipsContent(TipsContentText text, string lang = "zh_CN") + { + Text = text; + Lang = lang; + } +} + +public class TipsContentText +{ + /// + /// 说明文字分段 + /// + [NotNull] + [JsonProperty("sub_text")] + [JsonPropertyName("sub_text")] + public List SubText { get; set; } + public TipsContentText() + { + + } + + public TipsContentText(List subText) + { + SubText = subText; + } +} + +public class TipsContentSubText +{ + /// + /// 文本类型 1:纯文本 2:链接,每个说明文字中只支持包含一个链接 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public byte Type { get; set; } + /// + /// 内容 + /// + [NotNull] + [JsonProperty("content")] + [JsonPropertyName("content")] + public SubTextContent Content { get; set; } + public TipsContentSubText() + { + + } + + private TipsContentSubText(byte type, SubTextContent content) + { + Type = type; + Content = content; + } + + public static TipsContentSubText Text(TipsContentPlainText content) + { + return new TipsContentSubText(1, content); + } + + public static TipsContentSubText Link(TipsContentLinkText content) + { + return new TipsContentSubText(2, content); + } +} + +public abstract class SubTextContent +{ +} + +public class TipsContentPlainText : SubTextContent +{ + /// + /// 纯文本文字 + /// + [NotNull] + [JsonProperty("content")] + [JsonPropertyName("content")] + public string Content { get; set; } +} + +public class TipsContentLinkText : SubTextContent +{ + /// + /// 链接标题 + /// + [NotNull] + [JsonProperty("title")] + [JsonPropertyName("title")] + public string Title { get; set; } + /// + /// 链接url,不能超过600个字符 + /// + [NotNull] + [StringLength(600)] + [JsonProperty("url")] + [JsonPropertyName("url")] + public string Url { get; set; } +} \ No newline at end of file diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/VacationControlValue.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/VacationControlValue.cs new file mode 100644 index 000000000..17ccc373d --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Models/VacationControlValue.cs @@ -0,0 +1,141 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Models; +/// +/// 假勤组件-请假组件值 +/// +public class VacationControlValue : ControlValue +{ + /// + /// 请假内容,即申请人在此组件内选择的请假信息 + /// + [NotNull] + [JsonProperty("vacation")] + [JsonPropertyName("vacation")] + public VacationValue Vacation { get; set; } + public VacationControlValue() + { + + } + + public VacationControlValue(VacationValue vacation) + { + Vacation = vacation; + } +} + +public class VacationValue +{ + /// + /// 请假类型,所选选项与假期管理关联,为假期管理中的假期类型 + /// + [NotNull] + [JsonProperty("selector")] + [JsonPropertyName("selector")] + public VacationSelector Selector { get; set; } + /// + /// 假勤组件 + /// + [NotNull] + [JsonProperty("attendance")] + [JsonPropertyName("attendance")] + public AttendanceValue Attendance { get; set; } + public VacationValue() + { + + } + + public VacationValue(VacationSelector selector, AttendanceValue attendance) + { + Selector = selector; + Attendance = attendance; + } +} + +public class VacationSelector +{ + /// + /// 选择方式:single-单选;multi-多选,在假勤控件中固定为单选 + /// + [NotNull] + [JsonProperty("type")] + [JsonPropertyName("type")] + public string Type { get; set; } + /// + /// 用户所选选项 + /// + [NotNull] + [JsonProperty("options")] + [JsonPropertyName("options")] + public List Options { get; set; } + public VacationSelector() + { + + } + + public VacationSelector(List options) + { + Type = "single"; + Options = options; + } +} + +public class VacationSelectorOption +{ + /// + /// 选项key,选项的唯一id,可通过“获取审批模板详情”接口获得vacation_list中item的id值 + /// + [NotNull] + [JsonProperty("key")] + [JsonPropertyName("key")] + public string Key { get; set; } + /// + /// 选项值,若配置了多语言则会包含中英文的选项值 + /// + [NotNull] + [JsonProperty("value")] + [JsonPropertyName("value")] + public VacationSelectorOptionValue Value { get; set; } + public VacationSelectorOption() + { + + } + + public VacationSelectorOption(string key, VacationSelectorOptionValue value) + { + Key = key; + Value = value; + } +} + +public class VacationSelectorOptionValue +{ + /// + /// 选项值 + /// + [NotNull] + [JsonProperty("text")] + [JsonPropertyName("text")] + public string Text { get; set; } + /// + /// 多语言名称 + /// + [NotNull] + [JsonProperty("lang")] + [JsonPropertyName("lang")] + public string Lang { get; set; } + public VacationSelectorOptionValue() + { + + } + + public VacationSelectorOptionValue(string text, string lang = "zh_CN") + { + Text = text; + Lang = lang; + } +} + diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkApplyEventRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkApplyEventRequest.cs new file mode 100644 index 000000000..cc3f921e2 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkApplyEventRequest.cs @@ -0,0 +1,94 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +/// +/// 提交审批申请请求参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/91853 +/// +public class WeChatWorkApplyEventRequest +{ + /// + /// 流程 + /// + /// + /// use_template_approver = 0 时必填 + /// + [CanBeNull] + [JsonProperty("process")] + [JsonPropertyName("process")] + public ApprovalApplyProcess Process { get; set; } + /// + /// 摘要信息,用于显示在审批通知卡片、审批列表的摘要信息,最多3行 + /// + [NotNull] + [JsonProperty("summary_list")] + [JsonPropertyName("summary_list")] + public List Summaries { get; set; } + /// + /// 审批申请数据,可定义审批申请中各个控件的值,其中必填项必须有值,选填项可为空,数据结构同“获取审批申请详情”接口返回值中同名参数“apply_data” + /// + [NotNull] + [JsonProperty("apply_data")] + [JsonPropertyName("apply_data")] + public ApprovalApplyData ApplyData { get; set; } + /// + /// 模板id。可在“获取审批申请详情”、“审批状态变化回调通知”中获得,也可在审批模板的模板编辑页面链接中获得。暂不支持通过接口提交[打卡补卡][调班]模板审批单。 + /// + [NotNull] + [JsonProperty("template_id")] + [JsonPropertyName("template_id")] + public string TemplateId { get; set; } + /// + /// 申请人userid,此审批申请将以此员工身份提交,申请人需在应用可见范围内 + /// + [NotNull] + [JsonProperty("creator_userid")] + [JsonPropertyName("creator_userid")] + public string CreatorUserId { get; set; } + /// + /// 审批人模式 + /// + /// + /// 0-通过接口指定审批人、抄送人(此时process参数必填);
+ /// 1-使用此模板在管理后台设置的审批流程(需要保证审批流程中没有“申请人自选”节点),支持条件审批。默认为0 + ///
+ [NotNull] + [JsonProperty("use_template_approver")] + [JsonPropertyName("use_template_approver")] + public byte UseTemplateApprover + { + get { + if (Process == null) + { + return 1; + } + return 0; + } + } + /// + /// 提单者提单部门id,不填默认为主部门 + /// + [CanBeNull] + [JsonProperty("choose_department")] + [JsonPropertyName("choose_department")] + public byte? ChooseDepartment { get; set; } + public WeChatWorkApplyEventRequest( + string templateId, + string creatorUserid, + ApprovalApplyData applyData, + ApprovalApplyProcess process = null, + byte? chooseDepartment = null) + { + TemplateId = templateId; + ApplyData = applyData; + CreatorUserId = creatorUserid; + ChooseDepartment = chooseDepartment; + Process = process; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkCreateTemplateRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkCreateTemplateRequest.cs new file mode 100644 index 000000000..6ae74ccd6 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkCreateTemplateRequest.cs @@ -0,0 +1,36 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +/// +/// 创建审批模板请求参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/97437 +/// +public class WeChatWorkCreateTemplateRequest +{ + /// + /// 模版名称数组 + /// + [NotNull] + [JsonProperty("template_name")] + [JsonPropertyName("template_name")] + public List TemplateName { get; set; } + /// + /// 审批模版控件设置,由多个表单控件及其内容组成,其中包含需要对控件赋值的信息 + /// + [NotNull] + [JsonProperty("template_content")] + [JsonPropertyName("template_content")] + public TemplateContent TemplateContent { get; set; } + + public WeChatWorkCreateTemplateRequest(List templateName, TemplateContent templateContent) + { + TemplateName = templateName; + TemplateContent = templateContent; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetApprovalDetailRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetApprovalDetailRequest.cs new file mode 100644 index 000000000..ae02b9035 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetApprovalDetailRequest.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +/// +/// 获取审批申请详情请求参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/91983 +/// +public class WeChatWorkGetApprovalDetailRequest +{ + /// + /// 审批单编号 + /// + [NotNull] + [JsonProperty("sp_no")] + [JsonPropertyName("sp_no")] + public string SpNo { get; set; } + public WeChatWorkGetApprovalDetailRequest(string spNo) + { + SpNo = spNo; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs new file mode 100644 index 000000000..fde25a87f --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetApprovalInfoRequest.cs @@ -0,0 +1,65 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Volo.Abp; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +/// +/// 批量获取审批单号请求参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/91816 +/// +public class WeChatWorkGetApprovalInfoRequest +{ + /// + /// 审批单提交的时间范围,开始时间,UNix时间戳 + /// + [NotNull] + [JsonProperty("starttime")] + [JsonPropertyName("starttime")] + public long StartTime { get; set; } + /// + /// 审批单提交的时间范围,结束时间,Unix时间戳 + /// + [NotNull] + [JsonProperty("endtime")] + [JsonPropertyName("endtime")] + public long EndTime { get; set; } + /// + /// 分页查询游标,默认为空串,后续使用返回的new_next_cursor进行分页拉取 + /// + [CanBeNull] + [JsonProperty("new_cursor")] + [JsonPropertyName("new_cursor")] + public string NewCursor { get; set; } = ""; + /// + /// 一次请求拉取审批单数量,默认值为100,上限值为100。 + /// 若accesstoken为自建应用,仅允许获取在应用可见范围内申请人提交的表单,返回的sp_no_list个数可能和size不一致,开发者需用next_cursor判断表单记录是否拉取完 + /// + [NotNull] + [JsonProperty("size")] + [JsonPropertyName("size")] + public int Size { get; set; } + /// + /// 筛选条件,可对批量拉取的审批申请设置约束条件,支持设置多个条件 + /// + [CanBeNull] + [JsonProperty("filters")] + [JsonPropertyName("filters")] + public List Filters { get; set; } + public WeChatWorkGetApprovalInfoRequest( + long sartTime, + long endTime, + int size = 100, + List filters = null) + { + StartTime = sartTime; + EndTime = endTime; + Size = Check.Range(size, nameof(size), 1, 100); + + Filters = filters; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetTemplateRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetTemplateRequest.cs new file mode 100644 index 000000000..03bd3b25b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkGetTemplateRequest.cs @@ -0,0 +1,25 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +/// +/// 获取审批模板请求参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/91982 +/// +public class WeChatWorkGetTemplateRequest +{ + /// + /// 模版id + /// + [NotNull] + [JsonProperty("template_id")] + [JsonPropertyName("template_id")] + public string TemplateId { get; set; } + public WeChatWorkGetTemplateRequest(string templateId) + { + TemplateId = templateId; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkUpdateTemplateRequest.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkUpdateTemplateRequest.cs new file mode 100644 index 000000000..307e55f9b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Request/WeChatWorkUpdateTemplateRequest.cs @@ -0,0 +1,47 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Request; +/// +/// 更新审批模板请求参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/97438 +/// +public class WeChatWorkUpdateTemplateRequest +{ + /// + /// 模版id + /// + [NotNull] + [JsonProperty("template_id")] + [JsonPropertyName("template_id")] + public string TemplateId { get; set; } + /// + /// 模版名称数组 + /// + [NotNull] + [JsonProperty("template_name")] + [JsonPropertyName("template_name")] + public List TemplateName { get; set; } + /// + /// 审批模版控件设置,由多个表单控件及其内容组成,其中包含需要对控件赋值的信息 + /// + [NotNull] + [JsonProperty("template_content")] + [JsonPropertyName("template_content")] + public TemplateContent TemplateContent { get; set; } + + public WeChatWorkUpdateTemplateRequest( + string templateId, + List templateName, + TemplateContent templateContent) + { + TemplateId = templateId; + TemplateName = templateName; + TemplateContent = templateContent; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkApplyEventResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkApplyEventResponse.cs new file mode 100644 index 000000000..d62fea7d2 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkApplyEventResponse.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Response; +/// +/// 提交审批申请响应参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/91853 +/// +public class WeChatWorkApplyEventResponse : WeChatWorkResponse +{ + /// + /// 表单提交成功后,返回的表单编号 + /// + [NotNull] + [JsonProperty("sp_no")] + [JsonPropertyName("sp_no")] + public string SpNo { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkCreateTemplateResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkCreateTemplateResponse.cs new file mode 100644 index 000000000..a44492a58 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkCreateTemplateResponse.cs @@ -0,0 +1,21 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Response; +/// +/// 创建审批模板响应参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/97437 +/// +public class WeChatWorkCreateTemplateResponse : WeChatWorkResponse +{ + /// + /// 模版创建成功后返回的模版id + /// + [NotNull] + [JsonProperty("template_id")] + [JsonPropertyName("template_id")] + public string TemplateId { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkGetApprovalDetailResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkGetApprovalDetailResponse.cs new file mode 100644 index 000000000..81189f650 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkGetApprovalDetailResponse.cs @@ -0,0 +1,22 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using Newtonsoft.Json; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Response; +/// +/// 获取审批申请详情响应参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/91983 +/// +public class WeChatWorkGetApprovalDetailResponse : WeChatWorkResponse +{ + /// + /// 审批申请详情 + /// + [NotNull] + [JsonProperty("info")] + [JsonPropertyName("info")] + public ApprovalDetailInfo Info { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkGetApprovalInfoResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkGetApprovalInfoResponse.cs new file mode 100644 index 000000000..4b9015c58 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkGetApprovalInfoResponse.cs @@ -0,0 +1,29 @@ +using JetBrains.Annotations; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Response; +/// +/// 批量获取审批单号响应参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/91816 +/// +public class WeChatWorkGetApprovalInfoResponse : WeChatWorkResponse +{ + /// + /// 审批单号列表,包含满足条件的审批申请 + /// + [NotNull] + [JsonProperty("sp_no_list")] + [JsonPropertyName("sp_no_list")] + public List SpNos { get; set; } + /// + /// 后续请求查询的游标,当返回结果没有该字段时表示审批单已经拉取完 + /// + [CanBeNull] + [JsonProperty("new_next_cursor")] + [JsonPropertyName("new_next_cursor")] + public string NewNextCursor { get; set; } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkTemplateResponse.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkTemplateResponse.cs new file mode 100644 index 000000000..8700db44f --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/LINGYUN/Abp/WeChat/Work/Approvals/Response/WeChatWorkTemplateResponse.cs @@ -0,0 +1,40 @@ +using JetBrains.Annotations; +using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using Newtonsoft.Json; +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace LINGYUN.Abp.WeChat.Work.Approvals.Response; +/// +/// 审批模板响应参数 +/// +/// +/// 详情见: https://developer.work.weixin.qq.com/document/path/91982 +/// +public class WeChatWorkTemplateResponse : WeChatWorkResponse +{ + /// + /// 模版名称数组 + /// + [NotNull] + [JsonProperty("template_names")] + [JsonPropertyName("template_names")] + public List TemplateNames { get; set; } + /// + /// 审批模版控件设置,由多个表单控件及其内容组成,其中包含需要对控件赋值的信息 + /// + [NotNull] + [JsonProperty("template_content")] + [JsonPropertyName("template_content")] + public TemplateContent TemplateContent { get; set; } + public WeChatWorkTemplateResponse() + { + + } + + public WeChatWorkTemplateResponse(List templateNames, TemplateContent templateContent) + { + TemplateNames = templateNames; + TemplateContent = templateContent; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs new file mode 100644 index 000000000..ba9bc173b --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/Newtonsoft/Json/ControlNewtonsoftJsonConverter.cs @@ -0,0 +1,47 @@ +using LINGYUN.Abp.WeChat.Work.Approvals.Models; +using Newtonsoft.Json.Linq; +using System; + +namespace Newtonsoft.Json; +internal class ControlNewtonsoftJsonConverter : JsonConverter +{ + public override bool CanWrite => true; + + public override void WriteJson(JsonWriter writer, Control value, JsonSerializer serializer) + { + writer.WriteStartObject(); + + if (value.Property != null) + { + writer.WritePropertyName("property"); + serializer.Serialize(writer, value.Property); + } + + if (value.Config != null) + { + writer.WritePropertyName("config"); + serializer.Serialize(writer, value.Config, value.Config.GetType()); + } + + writer.WriteEndObject(); + } + + public override Control ReadJson(JsonReader reader, Type objectType, Control existingValue, bool hasExistingValue, JsonSerializer serializer) + { + var jObject = JObject.Load(reader); + + var control = new Control(); + + if (jObject.TryGetValue("property", out var propertyToken)) + { + control.Property = propertyToken.ToObject(serializer); + } + // 根据 Control 类型动态反序列化 Config + if (jObject.TryGetValue("config", out var configToken) && configToken.Type != JTokenType.Null) + { + control.Config = ControlConfigFactory.CreateConfig(control.Property.Control, configToken); + } + + return control; + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Approval.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Approval.cs new file mode 100644 index 000000000..afed091c8 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Approval.cs @@ -0,0 +1,128 @@ +using LINGYUN.Abp.WeChat.Work.Approvals.Request; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace System.Net.Http; +internal static partial class HttpClientWeChatWorkRequestExtensions +{ + public async static Task ApplyEventAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkApplyEventRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/applyevent"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + return await client.SendAsync(httpRequest, cancellationToken); + } + + public async static Task CreateTemplateAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkCreateTemplateRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/approval/create_template"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + return await client.SendAsync(httpRequest, cancellationToken); + } + + public async static Task GetApprovalDetailAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetApprovalDetailRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/getapprovaldetail"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + return await client.SendAsync(httpRequest, cancellationToken); + } + + public async static Task GetApprovalInfoAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetApprovalInfoRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/getapprovalinfo"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + return await client.SendAsync(httpRequest, cancellationToken); + } + + public async static Task GetTemplateAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkGetTemplateRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/gettemplatedetail"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + return await client.SendAsync(httpRequest, cancellationToken); + } + + public async static Task UpdateTemplateAsync( + this HttpMessageInvoker client, + string accessToken, + WeChatWorkCreateTemplateRequest request, + CancellationToken cancellationToken = default) + { + var urlBuilder = new StringBuilder(); + urlBuilder.Append("/cgi-bin/oa/approval/update_template"); + urlBuilder.AppendFormat("?access_token={0}", accessToken); + + var httpRequest = new HttpRequestMessage( + HttpMethod.Post, + urlBuilder.ToString()) + { + Content = new StringContent(request.SerializeToJson()) + }; + + return await client.SendAsync(httpRequest, cancellationToken); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Security.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Security.cs new file mode 100644 index 000000000..44d84925e --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Net/Http/HttpClientWeChatWorkRequestExtensions.Security.cs @@ -0,0 +1,17 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace System.Net.Http; +internal static partial class HttpClientWeChatWorkRequestExtensions +{ + public async static Task GetServerDomainIpAsync( + this HttpMessageInvoker client, + string accessToken, + CancellationToken cancellationToken = default) + { + var httpRequest = new HttpRequestMessage(HttpMethod.Get, + $"/cgi-bin/security/get_server_domain_ip?access_token={accessToken}"); ; + + return await client.SendAsync(httpRequest, cancellationToken); + } +} diff --git a/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs new file mode 100644 index 000000000..344250745 --- /dev/null +++ b/aspnet-core/framework/wechat/LINGYUN.Abp.WeChat.Work/System/Text/Json/Serialization/ControlSystemTextJsonConverter.cs @@ -0,0 +1,42 @@ +using LINGYUN.Abp.WeChat.Work.Approvals.Models; + +namespace System.Text.Json.Serialization; +internal class ControlSystemTextJsonConverter : JsonConverter +{ + public override Control Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) + { + using var doc = JsonDocument.ParseValue(ref reader); + var root = doc.RootElement; + + var control = new Control(); + + // 反序列化基本字段 + if (root.TryGetProperty("property", out var propertyElement)) + { + control.Property = JsonSerializer.Deserialize(propertyElement.GetRawText(), options); + } + // 根据 Control 类型动态反序列化 Config + if (root.TryGetProperty("config", out var configElement) && configElement.ValueKind != JsonValueKind.Null) + { + control.Config = ControlConfigFactory.CreateConfig(control.Property.Control, configElement); + } + + return control; + } + + public override void Write(Utf8JsonWriter writer, Control value, JsonSerializerOptions options) + { + writer.WriteStartObject(); + + writer.WritePropertyName("property"); + JsonSerializer.Serialize(writer, value.Property, options); + + if (value.Config != null) + { + writer.WritePropertyName("config"); + JsonSerializer.Serialize(writer, value.Config, value.Config.GetType(), options); + } + + writer.WriteEndObject(); + } +}